From 2fc66dc530c407dad94a005d2dc50bbd4e6484a6 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Wed, 19 Nov 2025 23:09:56 +0100 Subject: [PATCH 001/144] Cleanup constants and helpers --- .../Text/Json/JsonConstants.cs | 81 ------------------- .../Fusion.Execution/Text/Json/JsonHelpers.cs | 22 ----- .../src/Json/HotChocolate.Text.Json.csproj | 4 - 3 files changed, 107 deletions(-) diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs index 7fd0b4379d4..71dafe31735 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs @@ -13,48 +13,22 @@ internal static class JsonConstants public const byte LineFeed = (byte)'\n'; public const byte Tab = (byte)'\t'; public const byte Comma = (byte)','; - public const byte KeyValueSeparator = (byte)':'; public const byte Quote = (byte)'"'; public const byte BackSlash = (byte)'\\'; public const byte Slash = (byte)'/'; public const byte BackSpace = (byte)'\b'; public const byte FormFeed = (byte)'\f'; - public const byte Asterisk = (byte)'*'; public const byte Colon = (byte)':'; - public const byte Period = (byte)'.'; - public const byte Plus = (byte)'+'; - public const byte Hyphen = (byte)'-'; - public const byte UtcOffsetToken = (byte)'Z'; - public const byte TimePrefix = (byte)'T'; - public const byte NewLineLineFeed = (byte)'\n'; - // \u2028 and \u2029 are considered respectively line and paragraph separators - // UTF-8 representation for them is E2, 80, A8/A9 - public const byte StartingByteOfNonStandardSeparator = 0xE2; - public static ReadOnlySpan Data => "data"u8; public static ReadOnlySpan Errors => "errors"u8; public static ReadOnlySpan Extensions => "extensions"u8; - public static ReadOnlySpan Utf8Bom => [0xEF, 0xBB, 0xBF]; public static ReadOnlySpan TrueValue => "true"u8; public static ReadOnlySpan FalseValue => "false"u8; public static ReadOnlySpan NullValue => "null"u8; - public static ReadOnlySpan NaNValue => "NaN"u8; - public static ReadOnlySpan PositiveInfinityValue => "Infinity"u8; - public static ReadOnlySpan NegativeInfinityValue => "-Infinity"u8; - public const int MaximumFloatingPointConstantLength = 9; - - // Used to search for the end of a number - public static ReadOnlySpan Delimiters => ",}] \n\r\t/"u8; - - // Explicitly skipping ReverseSolidus since that is handled separately - public static ReadOnlySpan EscapableChars => "\"nrt/ubf"u8; - - public const int RemoveFlagsBitMask = 0x7FFFFFFF; - // In the worst case, an ASCII character represented as a single utf-8 byte could expand 6x when escaped. // For example: '+' becomes '\u0043' // Escaping surrogate pairs (represented by 3 or 4 utf-8 bytes) would expand to 12 bytes (which is still <= 6x). @@ -66,65 +40,10 @@ internal static class JsonConstants // All other UTF-16 characters can be represented by either 1 or 2 UTF-8 bytes. public const int MaxExpansionFactorWhileTranscoding = 3; - // When transcoding from UTF8 -> UTF16, the byte count threshold where we rent from the array pool before performing a normal alloc. - public const long ArrayPoolMaxSizeBeforeUsingNormalAlloc = -#if NET - 1024 * 1024 * 1024; // ArrayPool limit increased in .NET 6 -#else - 1024 * 1024; -#endif - - // The maximum number of characters allowed when writing raw UTF-16 JSON. This is the maximum length that we can guarantee can - // be safely transcoded to UTF-8 and fit within an integer-length span, given the max expansion factor of a single character (3). - public const int MaxUtf16RawValueLength = int.MaxValue / MaxExpansionFactorWhileTranscoding; - - public const int MaxEscapedTokenSize = 1_000_000_000; // Max size for already escaped value. - public const int MaxUnescapedTokenSize = MaxEscapedTokenSize / MaxExpansionFactorWhileEscaping; // 166_666_666 bytes - public const int MaxCharacterTokenSize = MaxEscapedTokenSize / MaxExpansionFactorWhileEscaping; // 166_666_666 characters - - public const int MaximumFormatBooleanLength = 5; - public const int MaximumFormatInt64Length = 20; // 19 + sign (i.e. -9223372036854775808) - public const int MaximumFormatUInt32Length = 10; // i.e. 4294967295 - public const int MaximumFormatUInt64Length = 20; // i.e. 18446744073709551615 - public const int MaximumFormatDoubleLength = 128; // default (i.e. 'G'), using 128 (rather than say 32) to be future-proof. - public const int MaximumFormatSingleLength = 128; // default (i.e. 'G'), using 128 (rather than say 32) to be future-proof. - public const int MaximumFormatDecimalLength = 31; // default (i.e. 'G') - public const int MaximumFormatGuidLength = 36; // default (i.e. 'D'), 8 + 4 + 4 + 4 + 12 + 4 for the hyphens (e.g. 094ffa0a-0442-494d-b452-04003fa755cc) - public const int MaximumEscapedGuidLength = MaxExpansionFactorWhileEscaping * MaximumFormatGuidLength; - public const int MaximumFormatDateTimeLength = 27; // StandardFormat 'O', e.g. 2017-06-12T05:30:45.7680000 - public const int MaximumFormatDateTimeOffsetLength = 33; // StandardFormat 'O', e.g. 2017-06-12T05:30:45.7680000-07:00 - public const int MaxDateTimeUtcOffsetHours = 14; // The UTC offset portion of a TimeSpan or DateTime can be no more than 14 hours and no less than -14 hours. - public const int DateTimeNumFractionDigits = 7; // TimeSpan and DateTime formats allow exactly up to many digits for specifying the fraction after the seconds. - public const int MaxDateTimeFraction = 9_999_999; // The largest fraction expressible by TimeSpan and DateTime formats - public const int DateTimeParseNumFractionDigits = 16; // The maximum number of fraction digits the Json DateTime parser allows - public const int MaximumDateTimeOffsetParseLength = MaximumFormatDateTimeOffsetLength - + (DateTimeParseNumFractionDigits - DateTimeNumFractionDigits); // Like StandardFormat 'O' for DateTimeOffset, but allowing 9 additional (up to 16) fraction digits. - public const int MinimumDateTimeParseLength = 10; // YYYY-MM-DD - public const int MaximumEscapedDateTimeOffsetParseLength = MaxExpansionFactorWhileEscaping * MaximumDateTimeOffsetParseLength; - - public const int MaximumLiteralLength = 5; // Must be able to fit null, true, & false. - - // Encoding Helpers - public const char HighSurrogateStart = '\ud800'; - public const char HighSurrogateEnd = '\udbff'; - public const char LowSurrogateStart = '\udc00'; - public const char LowSurrogateEnd = '\udfff'; - public const int UnicodePlane01StartValue = 0x10000; public const int HighSurrogateStartValue = 0xD800; public const int HighSurrogateEndValue = 0xDBFF; public const int LowSurrogateStartValue = 0xDC00; public const int LowSurrogateEndValue = 0xDFFF; public const int BitShiftBy10 = 0x400; - - // The maximum number of parameters a constructor can have where it can be considered - // for a path on deserialization where we don't box the constructor arguments. - public const int UnboxedParameterCountThreshold = 4; - - // Two space characters is the default indentation. - public const char DefaultIndentCharacter = ' '; - public const char TabIndentCharacter = '\t'; - public const int DefaultIndentSize = 2; - public const int MinimumIndentSize = 0; - public const int MaximumIndentSize = 127; // If this value is changed, the impact on the options masking used in the JsonWriterOptions struct must be checked carefully. } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs index 6de1d7c5347..f8d9b5a8b12 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs @@ -4,13 +4,6 @@ namespace HotChocolate.Fusion.Text.Json; internal static class JsonHelpers { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsValidDateTimeOffsetParseLength(int length) - => IsInRangeInclusive( - length, - JsonConstants.MinimumDateTimeParseLength, - JsonConstants.MaximumEscapedDateTimeOffsetParseLength); - /// /// Returns if is between /// and , inclusive. @@ -18,19 +11,4 @@ public static bool IsValidDateTimeOffsetParseLength(int length) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsInRangeInclusive(uint value, uint lowerBound, uint upperBound) => (value - lowerBound) <= (upperBound - lowerBound); - - /// - /// Returns if is between - /// and , inclusive. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsInRangeInclusive(int value, int lowerBound, int upperBound) - => (uint)(value - lowerBound) <= (uint)(upperBound - lowerBound); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsValidUnescapedDateTimeOffsetParseLength(int length) - => IsInRangeInclusive( - length, - JsonConstants.MinimumDateTimeParseLength, - JsonConstants.MaximumDateTimeOffsetParseLength); } diff --git a/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj b/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj index c66c31fec8c..3366abcbd96 100644 --- a/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj +++ b/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj @@ -6,8 +6,4 @@ preview - - - - From e133a9b8436dadf123e94858cf8d1c285a25f750 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 20 Nov 2025 08:54:55 +0100 Subject: [PATCH 002/144] Copied metadb to the core --- .../Core/src/Types/HotChocolate.Types.csproj | 38 +++++ .../src/Types/Text/Json/ElementTokenType.cs | 21 +++ .../Types/Text/Json/ResultDocument.DbRow.cs | 157 ++++++++++++++++++ .../Json/CompositeResultDocument.DbRow.cs | 52 ++++-- .../Text/Json/JsonConstants.cs | 4 + .../Fusion.Execution/Text/Json/JsonHelpers.cs | 4 + 6 files changed, 260 insertions(+), 16 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/ElementTokenType.cs create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index c97a2503d2a..efa4a1d2e5a 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -67,6 +67,40 @@ + + + + Text\Json\JsonConstants.cs + + + + Text\Json\JsonHelpers.cs + + + + Text\Json\JsonConstants.cs + + + + Text\Json\JsonConstants.cs + + + + Text\Json\JsonConstants.cs + + + + Text\Json\JsonConstants.cs + + + + Text\Json\JsonConstants.cs + + + + Text\Json\JsonConstants.cs + + @@ -152,4 +186,8 @@ + + + + diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ElementTokenType.cs b/src/HotChocolate/Core/src/Types/Text/Json/ElementTokenType.cs new file mode 100644 index 00000000000..095f8521b55 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/ElementTokenType.cs @@ -0,0 +1,21 @@ +namespace HotChocolate.Text.Json; + +internal enum ElementTokenType : byte +{ + None = 0, + StartObject = 1, + EndObject = 2, + StartArray = 3, + EndArray = 4, + PropertyName = 5, + // Retained for compatibility, we do not actually need this. + Comment = 6, + String = 7, + Number = 8, + True = 9, + False = 10, + Null = 11, + // A reference in case a property or array element point + // to an array or an object + Reference = 12 +} diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs new file mode 100644 index 00000000000..701c7734e40 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs @@ -0,0 +1,157 @@ +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace HotChocolate.Text.Json; + +public sealed partial class ResultDocument +{ + [StructLayout(LayoutKind.Sequential)] + internal readonly struct DbRow + { + public const int Size = 20; + public const int UnknownSize = -1; + + // 27 bits for location + 2 bits OpRefType + 3 reserved bits + private readonly int _locationAndOpRefType; + + // Sign bit for HasComplexChildren + 31 bits for size/length + private readonly int _sizeOrLengthUnion; + + // 4 bits TokenType + 27 bits NumberOfRows + 1 reserved bit + private readonly int _numberOfRowsTypeAndReserved; + + // 15 bits SourceDocumentId + 17 bits (high 17 bits of ParentRow) + private readonly int _sourceAndParentHigh; + + // 15 bits OperationReferenceId + 6 bits Flags + 11 bits (low bits of ParentRow) + private readonly int _selectionSetFlagsAndParentLow; + + public DbRow( + ElementTokenType tokenType, + int location, + int sizeOrLength = 0, + int sourceDocumentId = 0, + int parentRow = 0, + int operationReferenceId = 0, + OperationReferenceType operationReferenceType = OperationReferenceType.None, + int numberOfRows = 0, + ElementFlags flags = ElementFlags.None) + { + Debug.Assert((byte)tokenType < 16); + Debug.Assert(location is >= 0 and <= 0x07FFFFFF); // 27 bits + Debug.Assert(sizeOrLength >= UnknownSize); + Debug.Assert(sourceDocumentId is >= 0 and <= 0x7FFF); // 15 bits + Debug.Assert(parentRow is >= 0 and <= 0x0FFFFFFF); // 28 bits + Debug.Assert(operationReferenceId is >= 0 and <= 0x7FFF); // 15 bits + Debug.Assert(numberOfRows is >= 0 and <= 0x07FFFFFF); // 27 bits + Debug.Assert((byte)flags <= 63); // 6 bits (0x3F) + Debug.Assert((byte)operationReferenceType <= 3); // 2 bits + Debug.Assert(Unsafe.SizeOf() == Size); + + _locationAndOpRefType = location | ((int)operationReferenceType << 27); + _sizeOrLengthUnion = sizeOrLength; + _numberOfRowsTypeAndReserved = ((int)tokenType << 28) | (numberOfRows & 0x07FFFFFF); + _sourceAndParentHigh = sourceDocumentId | ((parentRow >> 11) << 15); + _selectionSetFlagsAndParentLow = operationReferenceId | ((int)flags << 15) | ((parentRow & 0x7FF) << 21); + } + + /// + /// Element token type (includes Reference for composition). + /// + /// + /// 4 bits = possible values + /// + public ElementTokenType TokenType => (ElementTokenType)(unchecked((uint)_numberOfRowsTypeAndReserved) >> 28); + + /// + /// Operation reference type indicating the type of GraphQL operation element. + /// + /// + /// 2 bits = 4 possible values + /// + public OperationReferenceType OperationReferenceType + => (OperationReferenceType)((_locationAndOpRefType >> 27) & 0x03); + + /// + /// Byte offset in source data OR metaDb row index for references. + /// + /// + /// 2 bits = 4 possible values + /// + public int Location => _locationAndOpRefType & 0x07FFFFFF; + + /// + /// Length of data in JSON payload, number of elements if array or number of properties in an object. + /// + /// + /// 27 bits = 134M limit + /// + public int SizeOrLength => _sizeOrLengthUnion & int.MaxValue; + + /// + /// String/PropertyName: Unescaping required. + /// + public bool HasComplexChildren => _sizeOrLengthUnion < 0; + + /// + /// Specifies if a size for the item has ben set. + /// + public bool IsUnknownSize => _sizeOrLengthUnion == UnknownSize; + + /// + /// Number of metadb rows this element spans. + /// + /// + /// 27 bits = 134M rows + /// + public int NumberOfRows => _numberOfRowsTypeAndReserved & 0x07FFFFFF; + + /// + /// Index of parent element in metadb for navigation and null propagation. + /// + /// + /// 28 bits = 268M rows + /// + public int ParentRow + => ((int)((uint)_sourceAndParentHigh >> 15) << 11) | ((_selectionSetFlagsAndParentLow >> 21) & 0x7FF); + + /// + /// Reference to GraphQL selection set or selection metadata. + /// 15 bits = 32K selections + /// + public int OperationReferenceId => _selectionSetFlagsAndParentLow & 0x7FFF; + + /// + /// Element metadata flags. + /// + /// + /// 6 bits = 64 combinations + /// + public ElementFlags Flags => (ElementFlags)((_selectionSetFlagsAndParentLow >> 15) & 0x3F); + + /// + /// True for primitive JSON values (strings, numbers, booleans, null). + /// + public bool IsSimpleValue => TokenType is >= ElementTokenType.PropertyName and <= ElementTokenType.Null; + } + + internal enum OperationReferenceType : byte + { + None = 0, + SelectionSet = 1, + Selection = 2 + } + + [Flags] + internal enum ElementFlags : byte + { + None = 0, + Invalidated = 1, + SourceResult = 2, + IsNullable = 4, + IsRoot = 8, + IsInternal = 16, + IsExcluded = 32 + } +} diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.DbRow.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.DbRow.cs index 08fdf7eeff7..42785ef9614 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.DbRow.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.DbRow.cs @@ -57,67 +57,87 @@ public DbRow( } /// - /// Byte offset in source data OR metaDb row index for references. - /// 27 bits = 134M limit (increased from 26 bits / 67M limit) + /// Element token type (includes Reference for composition). /// - public int Location => _locationAndOpRefType & 0x07FFFFFF; + /// + /// 4 bits = possible values + /// + public ElementTokenType TokenType => (ElementTokenType)(unchecked((uint)_numberOfRowsTypeAndReserved) >> 28); /// /// Operation reference type indicating the type of GraphQL operation element. - /// 2 bits = 4 possible values /// + /// + /// 2 bits = 4 possible values + /// public OperationReferenceType OperationReferenceType => (OperationReferenceType)((_locationAndOpRefType >> 27) & 0x03); + /// + /// Byte offset in source data OR metaDb row index for references + /// + /// + /// 27 bits = 134M limit + /// + public int Location => _locationAndOpRefType & 0x07FFFFFF; + /// /// Length of data in JSON payload, number of elements if array or number of properties in an object. - /// 31 bits = 2GB limit /// + /// + /// 31 bits = 2GB limit + /// public int SizeOrLength => _sizeOrLengthUnion & int.MaxValue; /// /// String/PropertyName: Unescaping required. - /// Array: Contains complex children. /// public bool HasComplexChildren => _sizeOrLengthUnion < 0; - public bool IsUnknownSize => _sizeOrLengthUnion == UnknownSize; - /// - /// Element token type (includes Reference for composition). - /// 4 bits = 16 types + /// Specifies if a size for the item has ben set. /// - public ElementTokenType TokenType => (ElementTokenType)(unchecked((uint)_numberOfRowsTypeAndReserved) >> 28); + public bool IsUnknownSize => _sizeOrLengthUnion == UnknownSize; /// /// Number of metadb rows this element spans. - /// 27 bits = 134M rows /// + /// + /// 27 bits = 134M rows + /// public int NumberOfRows => _numberOfRowsTypeAndReserved & 0x07FFFFFF; /// /// Which source JSON document contains the data. - /// 15 bits = 32K documents /// + /// + /// 15 bits = 32K documents + /// public int SourceDocumentId => _sourceAndParentHigh & 0x7FFF; /// /// Index of parent element in metadb for navigation and null propagation. - /// 28 bits = 268M rows (reconstructed from high+low bits) /// + /// + /// 28 bits = 268M rows + /// public int ParentRow => ((int)((uint)_sourceAndParentHigh >> 15) << 11) | ((_selectionSetFlagsAndParentLow >> 21) & 0x7FF); /// /// Reference to GraphQL selection set or selection metadata. - /// 15 bits = 32K selections /// + /// + /// 15 bits = 32K selections + /// public int OperationReferenceId => _selectionSetFlagsAndParentLow & 0x7FFF; /// /// Element metadata flags. - /// 6 bits = 64 combinations /// + /// + /// 6 bits = 64 combinations + /// public ElementFlags Flags => (ElementFlags)((_selectionSetFlagsAndParentLow >> 15) & 0x3F); /// diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs index 71dafe31735..108aa42d801 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs @@ -1,4 +1,8 @@ +#if Fusion namespace HotChocolate.Fusion.Text.Json; +#else +namespace HotChocolate.Text.Json; +#endif internal static class JsonConstants { diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs index f8d9b5a8b12..e824b996bab 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs @@ -1,6 +1,10 @@ using System.Runtime.CompilerServices; +#if Fusion namespace HotChocolate.Fusion.Text.Json; +#else +namespace HotChocolate.Text.Json; +#endif internal static class JsonHelpers { From baac8d853206507d02d9985e9e3b2e1288ee60e2 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 20 Nov 2025 09:17:13 +0100 Subject: [PATCH 003/144] Added metabd --- .../Core/src/Types/HotChocolate.Types.csproj | 6 +- .../Json/CompositeResultDocument.MetaDb.cs | 383 ++++++++++++++++++ .../Types/Text/Json/ResultDocument.Cursor.cs | 171 ++++++++ .../Text/Json/JsonConstants.cs | 2 +- .../Fusion.Execution/Text/Json/JsonHelpers.cs | 2 +- .../Text/Json/MetaDbEventSource.cs | 6 + 6 files changed, 565 insertions(+), 5 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/CompositeResultDocument.MetaDb.cs create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.Cursor.cs diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index efa4a1d2e5a..ebf81309726 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -67,7 +67,7 @@ - + Text\Json\JsonConstants.cs @@ -77,8 +77,8 @@ Text\Json\JsonHelpers.cs - - Text\Json\JsonConstants.cs + + Text\Json\MetaDbEventSource.cs diff --git a/src/HotChocolate/Core/src/Types/Text/Json/CompositeResultDocument.MetaDb.cs b/src/HotChocolate/Core/src/Types/Text/Json/CompositeResultDocument.MetaDb.cs new file mode 100644 index 00000000000..5f6561ac0ec --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/CompositeResultDocument.MetaDb.cs @@ -0,0 +1,383 @@ +using System.Buffers; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using static HotChocolate.Text.Json.MetaDbEventSource; + +namespace HotChocolate.Text.Json; + +public sealed partial class ResultDocument +{ + internal struct MetaDb : IDisposable + { + private const int TokenTypeOffset = 8; + private static readonly ArrayPool s_arrayPool = ArrayPool.Shared; + + private byte[][] _chunks; + private Cursor _next; + private bool _disposed; + + internal static MetaDb CreateForEstimatedRows(int estimatedRows) + { + var chunksNeeded = Math.Max(4, (estimatedRows / Cursor.RowsPerChunk) + 1); + var chunks = s_arrayPool.Rent(chunksNeeded); + var log = Log; + + log.MetaDbCreated(2, estimatedRows, 1); + + // Rent the first chunk now to avoid branching on first append + chunks[0] = MetaDbMemory.Rent(); + log.ChunkAllocated(2, 0); + + for (var i = 1; i < chunks.Length; i++) + { + chunks[i] = []; + } + + return new MetaDb + { + _chunks = chunks, + _next = Cursor.Zero + }; + } + + public Cursor NextCursor => _next; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal Cursor Append( + ElementTokenType tokenType, + int location = 0, + int sizeOrLength = 0, + int sourceDocumentId = 0, + int parentRow = 0, + int operationReferenceId = 0, + OperationReferenceType operationReferenceType = OperationReferenceType.None, + int numberOfRows = 0, + ElementFlags flags = ElementFlags.None) + { + var log = Log; + var next = _next; + var chunkIndex = next.Chunk; + var byteOffset = next.ByteOffset; + + var chunks = _chunks.AsSpan(); + var chunksLength = chunks.Length; + + if (byteOffset + DbRow.Size > Cursor.ChunkBytes) + { + chunkIndex++; + byteOffset = 0; + next = Cursor.FromByteOffset(chunkIndex, byteOffset); + } + + // make sure we have enough space for the chunk referenced by the chunkIndex. + if (chunkIndex >= chunksLength) + { + // if we do not have enough space we will double the size we have for + // chunks of memory. + var nextChunksLength = chunksLength * 2; + var newChunks = s_arrayPool.Rent(nextChunksLength); + log.ChunksExpanded(2, chunksLength, nextChunksLength); + + // copy chunks to new buffer + Array.Copy(_chunks, newChunks, chunksLength); + + for (var i = chunksLength; i < nextChunksLength; i++) + { + newChunks[i] = []; + } + + // clear and return old chunks buffer + chunks.Clear(); + s_arrayPool.Return(_chunks); + + // assign new chunks buffer + _chunks = newChunks; + chunks = newChunks.AsSpan(); + } + + var chunk = chunks[chunkIndex]; + + // if the chunk is empty we did not yet rent any memory for it + if (chunk.Length == 0) + { + chunk = chunks[chunkIndex] = MetaDbMemory.Rent(); + log.ChunkAllocated(2, chunkIndex); + } + + var row = new DbRow( + tokenType, + location, + sizeOrLength, + sourceDocumentId, + parentRow, + operationReferenceId, + operationReferenceType, + numberOfRows, + flags); + + ref var dest = ref MemoryMarshal.GetArrayDataReference(chunk); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref dest, byteOffset), row); + + // Advance write head by one row + _next = next + 1; + return next; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void Replace( + Cursor cursor, + ElementTokenType tokenType, + int location = 0, + int sizeOrLength = 0, + int sourceDocumentId = 0, + int parentRow = 0, + int operationReferenceId = 0, + OperationReferenceType operationReferenceType = OperationReferenceType.None, + int numberOfRows = 0, + ElementFlags flags = ElementFlags.None) + { + AssertValidCursor(cursor); + + var row = new DbRow( + tokenType, + location, + sizeOrLength, + sourceDocumentId, + parentRow, + operationReferenceId, + operationReferenceType, + numberOfRows, + flags); + + var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset); + + MemoryMarshal.Write(span, in row); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal DbRow Get(Cursor cursor) + { + AssertValidCursor(cursor); + + var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset); + + return MemoryMarshal.Read(span); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal (Cursor, ElementTokenType) GetStartCursor(Cursor cursor) + { + AssertValidCursor(cursor); + + var chunks = _chunks.AsSpan(); + var span = chunks[cursor.Chunk].AsSpan(cursor.ByteOffset); + var union = MemoryMarshal.Read(span[TokenTypeOffset..]); + var tokenType = (ElementTokenType)(union >> 28); + + if (tokenType is ElementTokenType.Reference) + { + var index = MemoryMarshal.Read(span) & 0x07FFFFFF; + cursor = Cursor.FromIndex(index); + span = chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + TokenTypeOffset); + union = MemoryMarshal.Read(span); + tokenType = (ElementTokenType)(union >> 28); + } + + return (cursor, tokenType); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal int GetLocation(Cursor cursor) + { + AssertValidCursor(cursor); + + var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset); + + var locationAndOpRefType = MemoryMarshal.Read(span); + return locationAndOpRefType & 0x07FFFFFF; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal Cursor GetLocationCursor(Cursor cursor) + { + AssertValidCursor(cursor); + + var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset); + + var locationAndOpRefType = MemoryMarshal.Read(span); + return Cursor.FromIndex(locationAndOpRefType & 0x07FFFFFF); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal int GetParent(Cursor cursor) + { + AssertValidCursor(cursor); + + var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset); + + var sourceAndParentHigh = MemoryMarshal.Read(span[12..]); + var selectionSetFlagsAndParentLow = MemoryMarshal.Read(span[16..]); + + return (sourceAndParentHigh >>> 15 << 11) + | ((selectionSetFlagsAndParentLow >> 21) & 0x7FF); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal Cursor GetParentCursor(Cursor cursor) + { + AssertValidCursor(cursor); + + var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset); + + var sourceAndParentHigh = MemoryMarshal.Read(span[12..]); + var selectionSetFlagsAndParentLow = MemoryMarshal.Read(span[16..]); + + var index = (sourceAndParentHigh >>> 15 << 11) + | ((selectionSetFlagsAndParentLow >> 21) & 0x7FF); + + return Cursor.FromIndex(index); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal int GetNumberOfRows(Cursor cursor) + { + AssertValidCursor(cursor); + + var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + TokenTypeOffset); + + var value = MemoryMarshal.Read(span); + return value & 0x0FFFFFFF; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal ElementFlags GetFlags(Cursor cursor) + { + AssertValidCursor(cursor); + + var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 16); + + var selectionSetFlagsAndParentLow = MemoryMarshal.Read(span); + return (ElementFlags)((selectionSetFlagsAndParentLow >> 15) & 0x3F); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void SetFlags(Cursor cursor, ElementFlags flags) + { + AssertValidCursor(cursor); + Debug.Assert((byte)flags <= 63, "Flags value exceeds 6-bit limit"); + + var fieldSpan = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 16); + var currentValue = MemoryMarshal.Read(fieldSpan); + + var clearedValue = currentValue & 0xFFE07FFF; // ~(0x3F << 15) + var newValue = (int)(clearedValue | (uint)((int)flags << 15)); + + MemoryMarshal.Write(fieldSpan, newValue); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal int GetSizeOrLength(Cursor cursor) + { + AssertValidCursor(cursor); + + var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 4); + var value = MemoryMarshal.Read(span); + + return value & int.MaxValue; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void SetSizeOrLength(Cursor cursor, int sizeOrLength) + { + AssertValidCursor(cursor); + Debug.Assert(sizeOrLength >= 0 && sizeOrLength <= int.MaxValue, "SizeOrLength value exceeds 31-bit limit"); + + var fieldSpan = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 4); + var currentValue = MemoryMarshal.Read(fieldSpan); + + // Keep only the sign bit (HasComplexChildren) + var clearedValue = currentValue & unchecked((int)0x80000000); + var newValue = clearedValue | (sizeOrLength & int.MaxValue); + + MemoryMarshal.Write(fieldSpan, newValue); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void SetNumberOfRows(Cursor cursor, int numberOfRows) + { + AssertValidCursor(cursor); + Debug.Assert(numberOfRows >= 0 && numberOfRows <= 0x0FFFFFFF, "NumberOfRows value exceeds 28-bit limit"); + + var fieldSpan = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + TokenTypeOffset); + var currentValue = MemoryMarshal.Read(fieldSpan); + + // Keep only the top 4 bits (token type) + var clearedValue = currentValue & unchecked((int)0xF0000000); + var newValue = clearedValue | (numberOfRows & 0x0FFFFFFF); + + MemoryMarshal.Write(fieldSpan, newValue); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal ElementTokenType GetElementTokenType(Cursor cursor, bool resolveReferences = true) + { + AssertValidCursor(cursor); + + var union = MemoryMarshal.Read(_chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + TokenTypeOffset)); + var tokenType = (ElementTokenType)(union >> 28); + + if (resolveReferences && tokenType == ElementTokenType.Reference) + { + var idx = GetLocation(cursor); + var resolved = Cursor.FromIndex(idx); + union = MemoryMarshal.Read(_chunks[resolved.Chunk].AsSpan(resolved.ByteOffset + TokenTypeOffset)); + tokenType = (ElementTokenType)(union >> 28); + } + + return tokenType; + } + + [Conditional("DEBUG")] + private void AssertValidCursor(Cursor cursor) + { + Debug.Assert(cursor.Chunk >= 0, "Negative chunk"); + Debug.Assert(cursor.Chunk < _chunks.Length, "Chunk index out of bounds"); + Debug.Assert(_chunks[cursor.Chunk].Length > 0, "Accessing unallocated chunk"); + + var maxExclusive = _next.Chunk * Cursor.RowsPerChunk + _next.Row; + var absoluteIndex = (cursor.Chunk * Cursor.RowsPerChunk) + cursor.Row; + + Debug.Assert(absoluteIndex >= 0 && absoluteIndex < maxExclusive, + $"Cursor points to row {absoluteIndex}, but only {maxExclusive} rows are valid."); + Debug.Assert(cursor.ByteOffset + DbRow.Size <= MetaDbMemory.BufferSize, "Cursor byte offset out of bounds"); + } + + public void Dispose() + { + if (!_disposed) + { + var cursor = _next; + var chunksLength = cursor.Chunk + 1; + var chunks = _chunks.AsSpan(0, chunksLength); + Log.MetaDbDisposed(2, chunksLength, cursor.Row); + + foreach (var chunk in chunks) + { + if (chunk.Length == 0) + { + break; + } + + MetaDbMemory.Return(chunk); + } + + chunks.Clear(); + s_arrayPool.Return(_chunks); + + _chunks = []; + _disposed = true; + } + } + } +} diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.Cursor.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.Cursor.cs new file mode 100644 index 00000000000..4e8ee11677b --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.Cursor.cs @@ -0,0 +1,171 @@ +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace HotChocolate.Text.Json; + +public sealed partial class ResultDocument +{ + /// + /// Comparable MetaDb cursor (chunk, row) + /// + [StructLayout(LayoutKind.Sequential, Size = 4)] + internal readonly struct Cursor : IEquatable, IComparable + { + public const int ChunkBytes = 1 << 17; + public const int RowsPerChunk = ChunkBytes / DbRow.Size; + public const int MaxChunks = 4096; + + private const int RowBits = 14; + private const int ChunkBits = 12; + private const int ChunkShift = RowBits; + + private const uint RowMask = (1u << RowBits) - 1u; + private const uint ChunkMask = (1u << ChunkBits) - 1u; + + private readonly uint _value; + + public static readonly Cursor Zero = From(0, 0); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private Cursor(uint value) => _value = value; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Cursor From(int chunkIndex, int rowWithinChunk) + { + Debug.Assert((uint)chunkIndex < MaxChunks); + Debug.Assert((uint)rowWithinChunk < RowsPerChunk); + return new Cursor(((uint)chunkIndex << ChunkShift) | (uint)rowWithinChunk); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Cursor FromIndex(int rowIndex) + { + Debug.Assert(rowIndex >= 0); + var chunk = rowIndex / RowsPerChunk; + var row = rowIndex - (chunk * RowsPerChunk); + return From(chunk, row); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Cursor FromByteOffset(int chunkIndex, int byteOffset) + { + Debug.Assert(byteOffset % DbRow.Size == 0, "byteOffset must be row-aligned."); + return From(chunkIndex, byteOffset / DbRow.Size); + } + + public uint Value => _value; + + public int Chunk + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => (int)((_value >> ChunkShift) & ChunkMask); + } + + public int Row + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => (int)(_value & RowMask); + } + + public int ByteOffset + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => Row * DbRow.Size; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Cursor AddRows(int delta) + { + if (delta == 0) + { + return this; + } + + var row = Row + delta; + var chunk = Chunk; + + if (row >= RowsPerChunk) + { + var carry = row / RowsPerChunk; + row -= carry * RowsPerChunk; + chunk += carry; + } + else if (row < 0) + { + var borrow = (-row + RowsPerChunk - 1) / RowsPerChunk; + row += borrow * RowsPerChunk; + chunk -= borrow; + } + + if (chunk < 0) + { + Debug.Fail("Cursor underflow"); + chunk = 0; + row = 0; + } + else if (chunk >= MaxChunks) + { + Debug.Fail("Cursor overflow"); + chunk = MaxChunks - 1; + row = RowsPerChunk - 1; + } + + return From(chunk, row); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Cursor WithChunk(int chunk) => From(chunk, Row); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Cursor WithRow(int row) => From(Chunk, row); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int ToIndex() => (Chunk * RowsPerChunk) + Row; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int ToTotalBytes() => (Chunk * ChunkBytes) + ByteOffset; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(Cursor other) => _value == other._value; + + public override bool Equals(object? obj) => obj is Cursor c && Equals(c); + + public override int GetHashCode() => (int)_value; + + public override string ToString() => $"chunk={Chunk}, row={Row} (0x{_value:X8})"; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int CompareTo(Cursor other) => _value.CompareTo(other._value); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(Cursor a, Cursor b) => a._value == b._value; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(Cursor a, Cursor b) => a._value != b._value; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator <(Cursor a, Cursor b) => a._value < b._value; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator >(Cursor a, Cursor b) => a._value > b._value; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator <=(Cursor a, Cursor b) => a._value <= b._value; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator >=(Cursor a, Cursor b) => a._value >= b._value; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Cursor operator +(Cursor x, int delta) => x.AddRows(delta); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Cursor operator -(Cursor x, int delta) => x.AddRows(-delta); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Cursor operator ++(Cursor x) => x.AddRows(1); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Cursor operator --(Cursor x) => x.AddRows(-1); + } +} diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs index 108aa42d801..9201cc9fc5d 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs @@ -1,4 +1,4 @@ -#if Fusion +#if FUSION namespace HotChocolate.Fusion.Text.Json; #else namespace HotChocolate.Text.Json; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs index e824b996bab..4a281fc2966 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonHelpers.cs @@ -1,6 +1,6 @@ using System.Runtime.CompilerServices; -#if Fusion +#if FUSION namespace HotChocolate.Fusion.Text.Json; #else namespace HotChocolate.Text.Json; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/MetaDbEventSource.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/MetaDbEventSource.cs index 8135fd7c4f7..9394f2d213d 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/MetaDbEventSource.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/MetaDbEventSource.cs @@ -1,8 +1,14 @@ using System.Diagnostics.Tracing; +#if FUSION namespace HotChocolate.Fusion.Text.Json; [EventSource(Name = "HotChocolate-Fusion-MetaDb")] +#else +namespace HotChocolate.Text.Json; + +[EventSource(Name = "HotChocolate-MetaDb")] +#endif internal sealed class MetaDbEventSource : EventSource { public static readonly MetaDbEventSource Log = new(); From 269436beda8f2b6bd2191fcdb743975ba409f7e1 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Wed, 26 Nov 2025 19:47:43 +0100 Subject: [PATCH 004/144] Merge Types Fetching and Execution --- src/All.slnx | 2 - .../CookieCrumble.HotChocolate.csproj | 1 - .../HotChocolate.Adapters.Mcp.csproj | 1 - .../src/Transport.Http/GraphQLHttpResponse.cs | 8 +- .../JsonLines/JsonLinesReader.cs | 3 +- .../src/Transport.Http/Sse/SseEventParser.cs | 2 +- .../src/Transport.Http/Sse/SseReader.cs | 7 +- .../src/Caching/HotChocolate.Caching.csproj | 1 - src/HotChocolate/Core/HotChocolate.Core.slnx | 2 - .../HotChocolate.Authorization.csproj | 2 +- .../Core/src/Core/HotChocolate.Core.csproj | 2 - .../HotChocolate.Execution.Projections.csproj | 2 +- .../Execution/HotChocolate.Execution.csproj | 247 -------- .../src/Fetching/HotChocolate.Fetching.csproj | 40 -- .../HotChocolate.Types.Errors.csproj | 2 +- .../Types.Json/HotChocolate.Types.Json.csproj | 1 - .../HotChocolate.Types.Mutations.csproj | 2 +- ...HotChocolate.Types.OffsetPagination.csproj | 1 - .../HotChocolate.Types.Queries.csproj | 2 +- .../Execution/Caching/DefaultDocumentCache.cs | 0 .../Caching/DefaultPreparedOperationCache.cs | 0 .../Caching/IPreparedOperationCache.cs | 0 .../Configuration/ConfigurationContext.cs | 0 .../ConfigureRequestExecutorSetup.cs | 0 .../DefaultRequestExecutorBuilder.cs | 0 .../IConfigureRequestExecutorSetup.cs | 0 .../Execution/Configuration/ITypeModule.cs | 0 ...OnConfigureRequestExecutorOptionsAction.cs | 0 .../OnConfigureSchemaBuilderAction.cs | 0 .../OnConfigureSchemaServices.cs | 0 .../OnRequestExecutorCreatedAction.cs | 0 .../OnRequestExecutorEvictedAction.cs | 0 .../Configuration/RequestExecutorSetup.cs | 0 .../RootServiceProviderAccessor.cs | 0 .../DefaultRequestContextAccessor.cs | 0 .../Execution/DefaultRequestExecutor.cs | 0 .../DeferredWorkStateOwnerFactory.cs | 0 .../DependencyInjection/Factories/IFactory.cs | 0 .../Factories/OperationContextFactory.cs | 0 .../Factories/OperationContextOwnerFactory.cs | 0 .../Factories/PooledServiceFactory.cs | 0 ...ternalSchemaServiceCollectionExtensions.cs | 0 .../InternalServiceCollectionExtensions.cs | 0 ...RequestExecutorBuilderExtensions.Caches.cs | 0 ...uestExecutorBuilderExtensions.Composite.cs | 0 ...estExecutorBuilderExtensions.DataLoader.cs | 0 ...stExecutorBuilderExtensions.ErrorFilter.cs | 0 ...equestExecutorBuilderExtensions.Hashing.cs | 0 ...tExecutorBuilderExtensions.IdSerializer.cs | 0 ...stExecutorBuilderExtensions.InputParser.cs | 0 ...ecutorBuilderExtensions.Instrumentation.cs | 0 ...uestExecutorBuilderExtensions.Optimizer.cs | 0 ...questExecutorBuilderExtensions.Services.cs | 0 ...cutorBuilderExtensions.TransactionScope.cs | 0 ...xecutorBuilderExtensions.TypeConversion.cs | 0 ...ExecutorBuilderExtensions.TypeDiscovery.cs | 0 ...estExecutorBuilderExtensions.UseRequest.cs | 0 ...estExecutorBuilderExtensions.Validation.cs | 0 .../RequestExecutorBuilderExtensions.cs | 0 ...uestExecutorServiceCollectionExtensions.cs | 0 ...equestExecutorServiceProviderExtensions.cs | 0 ...estExecutorBuilderExtensions.Convention.cs | 0 ...questExecutorBuilderExtensions.Document.cs | 0 ...estExecutorBuilderExtensions.Middleware.cs | 0 ...RequestExecutorBuilderExtensions.Paging.cs | 0 ...aRequestExecutorBuilderExtensions.Relay.cs | 0 ...uestExecutorBuilderExtensions.Resolvers.cs | 0 ...ecutorBuilderExtensions.TypeInterceptor.cs | 0 ...stExecutorBuilderExtensions.TypeModules.cs | 0 ...aRequestExecutorBuilderExtensions.Types.cs | 0 .../SchemaRequestExecutorBuilderExtensions.cs | 0 .../src/{ => Types}/Execution/ErrorHelper.cs | 0 .../Errors/FuncErrorFilterWrapper.cs | 0 ...xecutionObjectFieldDescriptorExtensions.cs | 0 .../ExecutionRequestExecutorExtensions.cs | 0 .../Extensions/ExecutionResultExtensions.cs | 0 .../Extensions/ExecutionSchemaExtensions.cs | 0 ...colateExecutionRequestContextExtensions.cs | 0 .../Extensions/OperationContextExtensions.cs | 0 .../Execution/IRequestContextAccessor.cs | 0 .../Execution/IRequestContextEnricher.cs | 0 .../AggregateExecutionDiagnosticEvents.cs | 0 .../ExecutionDiagnosticEventListener.cs | 0 .../IExecutionDiagnosticEventListener.cs | 0 .../IExecutionDiagnosticEvents.cs | 0 .../NoopExecutionDiagnosticEvents.cs | 0 .../Internal/ArgumentCoercionHelper.cs | 0 .../Internal/MiddlewareContextMarshal.cs | 0 .../Execution/Internal/SchemaFileExporter.cs | 0 .../{ => Types}/Execution/NeedsFormatting.cs | 0 .../Options/IErrorHandlerOptionsAccessor.cs | 0 .../IPersistedOperationOptionsAccessor.cs | 0 .../IRequestExecutorOptionsAccessor.cs | 0 .../Options/IRequestTimeoutOptionsAccessor.cs | 0 .../Options/NodeIdSerializerOptions.cs | 0 .../Options/RequestExecutorOptions.cs | 0 .../Execution/Options/RequestParserOptions.cs | 0 .../Execution/Options/ResultBufferOptions.cs | 0 .../Execution/Options/TracingPreference.cs | 0 .../Pipeline/OperationCacheMiddleware.cs | 0 .../Pipeline/OperationExecutionMiddleware.cs | 0 .../Execution/Pipeline/OperationInfo.cs | 0 .../Pipeline/OperationResolverMiddleware.cs | 0 .../OperationVariableCoercionMiddleware.cs | 0 .../Execution/Pipeline/PipelineTools.cs | 0 .../Execution/Pipeline/Pipelines.md | 0 .../Pipeline/RequestClassMiddlewareFactory.cs | 0 .../Execution/Pipeline/TimeoutMiddleware.cs | 0 .../Processing/ArgumentNonNullValidator.cs | 0 .../Processing/AsyncManualResetEvent.cs | 0 .../Execution/Processing/DefaultActivator.cs | 0 .../Processing/DefaultTransactionScope.cs | 0 .../DefaultTransactionScopeHandler.cs | 0 .../Processing/DeferredExecutionTask.cs | 0 .../Processing/DeferredExecutionTaskResult.cs | 0 .../Execution/Processing/DeferredFragment.cs | 0 .../Execution/Processing/DeferredStream.cs | 0 .../Processing/DeferredWorkScheduler.cs | 0 .../Execution/Processing/DeferredWorkState.cs | 0 .../Processing/DeferredWorkStateOwner.cs | 0 .../Processing/EmptySelectionCollection.cs | 0 .../Execution/Processing/Fragment.cs | 0 .../Processing/IOperationCompilerOptimizer.cs | 0 .../Processing/IOperationOptimizer.cs | 0 .../Processing/ISelectionSetOptimizer.cs | 0 .../Execution/Processing/ISubscription.cs | 0 .../Execution/Processing/ITaskStatistics.cs | 0 .../Execution/Processing/ITransactionScope.cs | 0 .../Processing/ITransactionScopeHandler.cs | 0 .../Execution/Processing/IncludeCondition.cs | 0 .../Processing/MiddlewareContext.Arguments.cs | 0 .../Processing/MiddlewareContext.Global.cs | 0 .../Processing/MiddlewareContext.Pooling.cs | 0 .../Processing/MiddlewareContext.Pure.cs | 0 .../Processing/MiddlewareContext.Selection.cs | 0 .../Processing/MiddlewareContext.State.cs | 0 .../Processing/NoOpTransactionScope.cs | 0 .../Processing/NoOpTransactionScopeHandler.cs | 0 .../Processing/NoopBatchDispatcher.cs | 0 .../Execution/Processing/Operation.cs | 0 .../OperationCompiler.ArgumentValues.cs | 0 .../OperationCompiler.BacklogItem.cs | 0 .../OperationCompiler.CompilerContext.cs | 0 .../OperationCompiler.Optimizers.cs | 0 .../OperationCompiler.SelectionSetInfo.cs | 0 .../Execution/Processing/OperationCompiler.cs | 0 .../Processing/OperationCompilerMetrics.cs | 0 .../OperationCompilerOptimizerHelper.cs | 0 .../Processing/OperationCompilerOptimizers.cs | 0 .../Processing/OperationCompilerPool.cs | 0 .../Processing/OperationContext.Execution.cs | 0 .../OperationContext.IExecutionTaskContext.cs | 0 .../Processing/OperationContext.Operation.cs | 0 .../Processing/OperationContext.Pooling.cs | 0 .../Processing/OperationContext.Services.cs | 0 .../Processing/OperationContext.Utilities.cs | 0 .../Execution/Processing/OperationContext.cs | 0 .../Processing/OperationContextOwner.cs | 0 .../Processing/OperationOptimizerContext.cs | 0 .../Execution/Processing/OperationPrinter.cs | 0 .../Processing/OperationResolverHelper.cs | 0 .../Execution/Processing/PathHelper.cs | 0 .../Execution/Processing/QueryExecutor.cs | 0 .../Execution/Processing/Result/ListResult.cs | 0 .../Processing/Result/ListResultPool.cs | 0 .../Processing/Result/ObjectFieldResult.cs | 0 .../Processing/Result/ObjectResult.cs | 0 .../Result/ObjectResultExtensions.cs | 0 .../Processing/Result/ObjectResultPool.cs | 0 .../Processing/Result/ResultBucket.cs | 0 .../Result/ResultBuilder.NonNullHandling.cs | 0 .../Result/ResultBuilder.ObjectResult.cs | 0 .../Result/ResultBuilder.Pooling.cs | 0 .../Processing/Result/ResultBuilder.cs | 0 .../Execution/Processing/Result/ResultData.cs | 0 .../Processing/Result/ResultMemoryOwner.cs | 0 .../Execution/Processing/Result/ResultPool.cs | 0 .../Processing/Result/ResultPoolDefaults.cs | 0 .../Execution/Processing/RootValueResolver.cs | 0 .../Execution/Processing/Selection.cs | 0 .../Processing/SelectionCollection.cs | 0 .../Processing/SelectionIncludeCondition.cs | 0 .../Processing/SelectionInclusionKind.cs | 0 .../Execution/Processing/SelectionPath.cs | 0 .../Execution/Processing/SelectionSet.cs | 0 .../SelectionSetOptimizerContext.cs | 0 .../Execution/Processing/SelectionVariants.cs | 0 .../SubscriptionExecutor.Subscription.cs | 0 .../Processing/SubscriptionExecutor.cs | 0 .../Processing/Tasks/ExecutionTaskPool.cs | 0 .../Tasks/ExecutionTaskPoolPolicy.cs | 0 .../Tasks/ResolverTask.CompleteValue.cs | 0 .../Processing/Tasks/ResolverTask.Execute.cs | 0 .../Processing/Tasks/ResolverTask.Pooling.cs | 0 .../Processing/Tasks/ResolverTask.cs | 0 .../Processing/Tasks/ResolverTaskFactory.cs | 0 .../Tasks/ResolverTaskPoolPolicy.cs | 0 .../Processing/Tasks/StreamHelper.cs | 0 .../Processing/ValueCompletion.Leaf.cs | 0 .../Processing/ValueCompletion.List.cs | 0 .../Processing/ValueCompletion.Object.cs | 0 .../Execution/Processing/ValueCompletion.cs | 0 .../Processing/ValueCompletionContext.cs | 0 .../Processing/VariableCoercionHelper.cs | 0 .../Execution/Processing/VariableRewriter.cs | 0 .../Processing/VariableValueCollection.cs | 0 .../Processing/VariableValueOrLiteral.cs | 0 .../Execution/Processing/WorkQueue.cs | 0 .../Processing/WorkScheduler.Execute.cs | 0 .../Processing/WorkScheduler.Pooling.cs | 0 .../Execution/Processing/WorkScheduler.cs | 0 .../RequestExecutorManager.Events.cs | 0 .../Execution/RequestExecutorManager.Hooks.cs | 0 .../RequestExecutorManager.Warmup.cs | 0 .../Execution/RequestExecutorManager.cs | 0 .../Requirements/FieldRequirementsMetadata.cs | 0 .../Execution/Requirements/PropertyNode.cs | 0 .../Requirements/PropertyTreeBuilder.cs | 0 .../RequirementsTypeInterceptor.cs | 0 .../Execution/Requirements/TypeContainer.cs | 0 .../Execution/Requirements/TypeNode.cs | 0 .../src/{ => Types}/Execution/SchemaName.cs | 0 .../src/{ => Types}/Execution/ThrowHelper.cs | 0 .../src/{ => Types}/Execution/Timestamp.cs | 0 .../Fetching/AdHocBatchDataLoader.cs | 0 .../Fetching/AdHocCacheDataLoader.cs | 0 .../Fetching/AdHocGroupedDataLoader.cs | 0 .../Fetching/AsyncAutoResetEvent.cs | 0 .../Attributes/UseDataLoaderAttribute.cs | 0 .../Fetching/BatchDispatchEventArgs.cs | 0 .../Fetching/BatchDispatchEventType.cs | 0 .../BatchDispatcher.ExecutorSession.cs | 0 .../BatchDispatcher.IBatchScheduler.cs | 0 .../{ => Types}/Fetching/BatchDispatcher.cs | 0 .../Fetching/BatchDispatcherOptions.cs | 0 .../Fetching/BatchDispatcherResult.cs | 0 .../Fetching/DataLoaderDefaults.cs | 0 .../DataLoaderParameterExpressionBuilder.cs | 0 .../DataLoaderRootFieldTypeInterceptor.cs | 0 .../Fetching/DataLoaderScopeHolder.cs | 0 .../Fetching/ExecutionDataLoaderScope.cs | 0 .../ExecutionDataLoaderScopeFactory.cs | 0 .../DataLoaderResolverContextExtensions.cs | 0 .../DataLoaderServiceProviderExtensions.cs | 0 .../Extensions/GetDataLoaderAttribute.cs | 0 .../ObjectFieldDataLoaderExtensions.cs | 0 .../src/{ => Types}/Fetching/FetchBatch.cs | 0 .../src/{ => Types}/Fetching/FetchCache.cs | 0 .../src/{ => Types}/Fetching/FetchGroup.cs | 0 .../{ => Types}/Fetching/IBatchDispatcher.cs | 0 .../Fetching/IDataLoaderScopeFactory.cs | 0 .../Fetching/RegisterDataLoaderException.cs | 0 .../Fetching/SkipDataLoaderCacheAttribute.cs | 0 .../Fetching/Utilities/ThrowHelper.cs | 0 .../Core/src/Types/HotChocolate.Types.csproj | 58 +- .../Internal/IParameterExpressionBuilder.cs | 2 +- .../Properties/FetchingResources.Designer.cs | 30 +- .../Properties/FetchingResources.resx | 0 .../Properties/Resources.Designer.cs | 0 .../Properties/Resources.resx | 0 ...ent.MetaDb.cs => ResultDocument.MetaDb.cs} | 11 +- .../src/Types/Text/Json/ResultDocument.cs | 598 ++++++++++++++++++ .../HotChocolate.Execution.Tests.csproj | 2 +- .../HotChocolate.Fetching.Tests.csproj | 1 - .../HotChocolate.Types.NodaTime.Tests.csproj | 1 - .../HotChocolate.Types.Scalars.Tests.csproj | 1 - .../HotChocolate.CostAnalysis.csproj | 1 - .../Data/src/Data/HotChocolate.Data.csproj | 2 +- .../HotChocolate.Diagnostics.csproj | 2 +- .../HotChocolate.Fusion.Execution.csproj | 1 - .../Json/CompositeResultDocument.DbRow.cs | 2 +- .../Json/CompositeResultDocument.MetaDb.cs | 11 +- .../Fusion.Execution/Text/Json/JsonMemory.cs | 54 -- .../Text/Json/MetaDbMemory.cs | 17 - .../Text/Json/SourceResultDocument.MetaDb.cs | 9 +- .../Text/Json/SourceResultDocument.Parse.cs | 5 +- .../Text/Json/SourceResultDocument.cs | 3 +- .../Text/Json/SourceResultDocumentBuilder.cs | 6 +- .../src/Data/HotChocolate.Data.MongoDb.csproj | 2 +- .../Types/HotChocolate.Types.MongoDb.csproj | 1 - .../Types/HotChocolate.Types.Spatial.csproj | 1 - .../Utilities.Buffers}/FixedSizeArrayPool.cs | 19 +- .../FixedSizeArrayPoolEventSource.cs | 4 +- .../FixedSizeArrayPoolKinds.cs | 6 + .../HotChocolate.Utilities.Buffers.csproj | 5 + .../src/Utilities.Buffers/JsonMemory.cs | 102 +++ .../JsonMemoryEventSource.cs | 47 ++ .../src/Utilities.Buffers/JsonMemoryKind.cs | 7 + .../Properties/BuffersResources.Designer.cs | 6 + .../Properties/BuffersResources.resx | 3 + 290 files changed, 889 insertions(+), 459 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Execution/HotChocolate.Execution.csproj delete mode 100644 src/HotChocolate/Core/src/Fetching/HotChocolate.Fetching.csproj rename src/HotChocolate/Core/src/{ => Types}/Execution/Caching/DefaultDocumentCache.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Caching/DefaultPreparedOperationCache.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Caching/IPreparedOperationCache.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/ConfigurationContext.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/ConfigureRequestExecutorSetup.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/DefaultRequestExecutorBuilder.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/IConfigureRequestExecutorSetup.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/ITypeModule.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/OnConfigureRequestExecutorOptionsAction.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/OnConfigureSchemaBuilderAction.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/OnConfigureSchemaServices.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/OnRequestExecutorCreatedAction.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/OnRequestExecutorEvictedAction.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/RequestExecutorSetup.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Configuration/RootServiceProviderAccessor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DefaultRequestContextAccessor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DefaultRequestExecutor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/Factories/DeferredWorkStateOwnerFactory.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/Factories/IFactory.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/Factories/OperationContextFactory.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/Factories/OperationContextOwnerFactory.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/Factories/PooledServiceFactory.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/InternalSchemaServiceCollectionExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Caches.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Composite.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.DataLoader.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.ErrorFilter.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Hashing.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.IdSerializer.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.InputParser.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Instrumentation.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Optimizer.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Services.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TransactionScope.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeConversion.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeDiscovery.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.UseRequest.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Validation.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorBuilderExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/RequestExecutorServiceProviderExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Convention.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Document.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Middleware.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Paging.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Relay.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Resolvers.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.TypeInterceptor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.TypeModules.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Types.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/ErrorHelper.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Errors/FuncErrorFilterWrapper.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Extensions/ExecutionObjectFieldDescriptorExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Extensions/ExecutionRequestExecutorExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Extensions/ExecutionResultExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Extensions/ExecutionSchemaExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Extensions/HotChocolateExecutionRequestContextExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Extensions/OperationContextExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/IRequestContextAccessor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/IRequestContextEnricher.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Instrumentation/AggregateExecutionDiagnosticEvents.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Instrumentation/ExecutionDiagnosticEventListener.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Instrumentation/IExecutionDiagnosticEventListener.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Instrumentation/IExecutionDiagnosticEvents.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Instrumentation/NoopExecutionDiagnosticEvents.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Internal/ArgumentCoercionHelper.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Internal/MiddlewareContextMarshal.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Internal/SchemaFileExporter.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/NeedsFormatting.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Options/IErrorHandlerOptionsAccessor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Options/IPersistedOperationOptionsAccessor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Options/IRequestExecutorOptionsAccessor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Options/IRequestTimeoutOptionsAccessor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Options/NodeIdSerializerOptions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Options/RequestExecutorOptions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Options/RequestParserOptions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Options/ResultBufferOptions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Options/TracingPreference.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Pipeline/OperationCacheMiddleware.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Pipeline/OperationExecutionMiddleware.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Pipeline/OperationInfo.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Pipeline/OperationResolverMiddleware.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Pipeline/OperationVariableCoercionMiddleware.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Pipeline/PipelineTools.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Pipeline/Pipelines.md (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Pipeline/RequestClassMiddlewareFactory.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Pipeline/TimeoutMiddleware.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/ArgumentNonNullValidator.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/AsyncManualResetEvent.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/DefaultActivator.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/DefaultTransactionScope.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/DefaultTransactionScopeHandler.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/DeferredExecutionTask.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/DeferredExecutionTaskResult.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/DeferredFragment.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/DeferredStream.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/DeferredWorkScheduler.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/DeferredWorkState.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/DeferredWorkStateOwner.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/EmptySelectionCollection.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Fragment.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/IOperationCompilerOptimizer.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/IOperationOptimizer.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/ISelectionSetOptimizer.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/ISubscription.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/ITaskStatistics.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/ITransactionScope.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/ITransactionScopeHandler.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/IncludeCondition.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/MiddlewareContext.Arguments.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/MiddlewareContext.Global.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/MiddlewareContext.Pooling.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/MiddlewareContext.Pure.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/MiddlewareContext.Selection.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/MiddlewareContext.State.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/NoOpTransactionScope.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/NoOpTransactionScopeHandler.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/NoopBatchDispatcher.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Operation.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationCompiler.ArgumentValues.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationCompiler.BacklogItem.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationCompiler.CompilerContext.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationCompiler.Optimizers.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationCompiler.SelectionSetInfo.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationCompiler.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationCompilerMetrics.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationCompilerOptimizerHelper.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationCompilerOptimizers.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationCompilerPool.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationContext.Execution.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationContext.IExecutionTaskContext.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationContext.Operation.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationContext.Pooling.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationContext.Services.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationContext.Utilities.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationContext.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationContextOwner.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationOptimizerContext.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationPrinter.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/OperationResolverHelper.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/PathHelper.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/QueryExecutor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ListResult.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ListResultPool.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ObjectFieldResult.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ObjectResult.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ObjectResultExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ObjectResultPool.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ResultBucket.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ResultBuilder.ObjectResult.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ResultBuilder.Pooling.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ResultBuilder.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ResultData.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ResultMemoryOwner.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ResultPool.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Result/ResultPoolDefaults.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/RootValueResolver.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Selection.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/SelectionCollection.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/SelectionIncludeCondition.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/SelectionInclusionKind.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/SelectionPath.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/SelectionSet.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/SelectionSetOptimizerContext.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/SelectionVariants.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/SubscriptionExecutor.Subscription.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/SubscriptionExecutor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Tasks/ExecutionTaskPool.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Tasks/ExecutionTaskPoolPolicy.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Tasks/ResolverTask.Execute.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Tasks/ResolverTask.Pooling.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Tasks/ResolverTask.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Tasks/ResolverTaskFactory.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Tasks/ResolverTaskPoolPolicy.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/Tasks/StreamHelper.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/ValueCompletion.Leaf.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/ValueCompletion.List.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/ValueCompletion.Object.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/ValueCompletion.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/ValueCompletionContext.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/VariableCoercionHelper.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/VariableRewriter.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/VariableValueCollection.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/VariableValueOrLiteral.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/WorkQueue.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/WorkScheduler.Execute.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/WorkScheduler.Pooling.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Processing/WorkScheduler.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/RequestExecutorManager.Events.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/RequestExecutorManager.Hooks.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/RequestExecutorManager.Warmup.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/RequestExecutorManager.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Requirements/FieldRequirementsMetadata.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Requirements/PropertyNode.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Requirements/PropertyTreeBuilder.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Requirements/RequirementsTypeInterceptor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Requirements/TypeContainer.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Requirements/TypeNode.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/SchemaName.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/ThrowHelper.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Execution/Timestamp.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/AdHocBatchDataLoader.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/AdHocCacheDataLoader.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/AdHocGroupedDataLoader.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/AsyncAutoResetEvent.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/Attributes/UseDataLoaderAttribute.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/BatchDispatchEventArgs.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/BatchDispatchEventType.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/BatchDispatcher.ExecutorSession.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/BatchDispatcher.IBatchScheduler.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/BatchDispatcher.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/BatchDispatcherOptions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/BatchDispatcherResult.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/DataLoaderDefaults.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/DataLoaderParameterExpressionBuilder.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/DataLoaderRootFieldTypeInterceptor.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/DataLoaderScopeHolder.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/ExecutionDataLoaderScope.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/ExecutionDataLoaderScopeFactory.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/Extensions/DataLoaderResolverContextExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/Extensions/DataLoaderServiceProviderExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/Extensions/GetDataLoaderAttribute.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/Extensions/ObjectFieldDataLoaderExtensions.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/FetchBatch.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/FetchCache.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/FetchGroup.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/IBatchDispatcher.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/IDataLoaderScopeFactory.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/RegisterDataLoaderException.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/SkipDataLoaderCacheAttribute.cs (100%) rename src/HotChocolate/Core/src/{ => Types}/Fetching/Utilities/ThrowHelper.cs (100%) rename src/HotChocolate/Core/src/{Fetching => Types}/Properties/FetchingResources.Designer.cs (96%) rename src/HotChocolate/Core/src/{Fetching => Types}/Properties/FetchingResources.resx (100%) rename src/HotChocolate/Core/src/{Execution => Types}/Properties/Resources.Designer.cs (100%) rename src/HotChocolate/Core/src/{Execution => Types}/Properties/Resources.resx (100%) rename src/HotChocolate/Core/src/Types/Text/Json/{CompositeResultDocument.MetaDb.cs => ResultDocument.MetaDb.cs} (96%) create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs delete mode 100644 src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonMemory.cs delete mode 100644 src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/MetaDbMemory.cs rename src/HotChocolate/{Fusion-vnext/src/Fusion.Execution/Buffers => Utilities/src/Utilities.Buffers}/FixedSizeArrayPool.cs (90%) rename src/HotChocolate/{Fusion-vnext/src/Fusion.Execution/Buffers => Utilities/src/Utilities.Buffers}/FixedSizeArrayPoolEventSource.cs (95%) create mode 100644 src/HotChocolate/Utilities/src/Utilities.Buffers/FixedSizeArrayPoolKinds.cs create mode 100644 src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemory.cs create mode 100644 src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemoryEventSource.cs create mode 100644 src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemoryKind.cs diff --git a/src/All.slnx b/src/All.slnx index 5620c0e8200..d6a71a909b4 100644 --- a/src/All.slnx +++ b/src/All.slnx @@ -90,9 +90,7 @@ - - diff --git a/src/CookieCrumble/src/CookieCrumble.HotChocolate/CookieCrumble.HotChocolate.csproj b/src/CookieCrumble/src/CookieCrumble.HotChocolate/CookieCrumble.HotChocolate.csproj index d177e47f486..a674bb77188 100644 --- a/src/CookieCrumble/src/CookieCrumble.HotChocolate/CookieCrumble.HotChocolate.csproj +++ b/src/CookieCrumble/src/CookieCrumble.HotChocolate/CookieCrumble.HotChocolate.csproj @@ -10,7 +10,6 @@ - diff --git a/src/HotChocolate/Adapters/src/Adapters.Mcp/HotChocolate.Adapters.Mcp.csproj b/src/HotChocolate/Adapters/src/Adapters.Mcp/HotChocolate.Adapters.Mcp.csproj index 119b51ea708..6d167c021a3 100644 --- a/src/HotChocolate/Adapters/src/Adapters.Mcp/HotChocolate.Adapters.Mcp.csproj +++ b/src/HotChocolate/Adapters/src/Adapters.Mcp/HotChocolate.Adapters.Mcp.csproj @@ -6,7 +6,6 @@ - diff --git a/src/HotChocolate/AspNetCore/src/Transport.Http/GraphQLHttpResponse.cs b/src/HotChocolate/AspNetCore/src/Transport.Http/GraphQLHttpResponse.cs index 4c57bac7179..2281101d5b2 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Http/GraphQLHttpResponse.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Http/GraphQLHttpResponse.cs @@ -1,3 +1,5 @@ + +using HotChocolate.Buffers; #if FUSION using System.Buffers; using System.Net; @@ -160,7 +162,7 @@ private async ValueTask ReadAsResultInternalAsync(string? charS #if FUSION // we try and read the first chunk into a single chunk. var reader = PipeReader.Create(stream, s_options); - var currentChunk = JsonMemory.Rent(); + var currentChunk = JsonMemory.Rent(JsonMemoryKind.Json); var currentChunkPosition = 0; var chunkIndex = 0; var chunks = ArrayPool.Shared.Rent(64); @@ -215,7 +217,7 @@ private async ValueTask ReadAsResultInternalAsync(string? charS } chunks[chunkIndex++] = currentChunk; - currentChunk = JsonMemory.Rent(); + currentChunk = JsonMemory.Rent(JsonMemoryKind.Json); currentChunkPosition = 0; } } @@ -253,7 +255,7 @@ private async ValueTask ReadAsResultInternalAsync(string? charS } chunks[chunkIndex++] = currentChunk; - currentChunk = JsonMemory.Rent(); + currentChunk = JsonMemory.Rent(JsonMemoryKind.Json); currentChunkPosition = 0; } } diff --git a/src/HotChocolate/AspNetCore/src/Transport.Http/JsonLines/JsonLinesReader.cs b/src/HotChocolate/AspNetCore/src/Transport.Http/JsonLines/JsonLinesReader.cs index b8bfef41735..f9896ac4442 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Http/JsonLines/JsonLinesReader.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Http/JsonLines/JsonLinesReader.cs @@ -2,6 +2,7 @@ using System.Buffers; using System.IO.Pipelines; using System.Runtime.CompilerServices; +using HotChocolate.Buffers; using HotChocolate.Fusion.Text.Json; #else using System.Buffers; @@ -103,7 +104,7 @@ private static SourceResultDocument ParseDocument(ReadOnlySequence lineBuf // Ceiling division to make sure we end up with the right amount of chunks. var chunksNeeded = (requiredSize + JsonMemory.BufferSize - 1) / JsonMemory.BufferSize; - var chunks = JsonMemory.RentRange(chunksNeeded); + var chunks = JsonMemory.RentRange(JsonMemoryKind.Json, chunksNeeded); var chunkIndex = 0; var chunkPosition = 0; diff --git a/src/HotChocolate/AspNetCore/src/Transport.Http/Sse/SseEventParser.cs b/src/HotChocolate/AspNetCore/src/Transport.Http/Sse/SseEventParser.cs index 47d0ba8e6a3..2866a300500 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Http/Sse/SseEventParser.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Http/Sse/SseEventParser.cs @@ -2,7 +2,7 @@ using System.Buffers; using System.Diagnostics; using System.Runtime.CompilerServices; -using HotChocolate.Fusion.Text.Json; +using HotChocolate.Buffers; #else using System.Runtime.CompilerServices; diff --git a/src/HotChocolate/AspNetCore/src/Transport.Http/Sse/SseReader.cs b/src/HotChocolate/AspNetCore/src/Transport.Http/Sse/SseReader.cs index f7de7d41d38..3348a1e1100 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Http/Sse/SseReader.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Http/Sse/SseReader.cs @@ -2,6 +2,7 @@ using System.Buffers; using System.IO.Pipelines; using System.Runtime.CompilerServices; +using HotChocolate.Buffers; using HotChocolate.Fusion.Text.Json; #else using System.Buffers; @@ -107,7 +108,7 @@ public async IAsyncEnumerator GetAsyncEnumerator( case SseEventType.Complete: reader.AdvanceTo(buffer.GetPosition(1, position.Value)); #if FUSION - JsonMemory.Return(eventBuffers); + JsonMemory.Return(JsonMemoryKind.Json, eventBuffers); eventBuffers.Clear(); #endif yield break; @@ -162,7 +163,7 @@ public async IAsyncEnumerator GetAsyncEnumerator( await reader.CompleteAsync().ConfigureAwait(false); #if FUSION // we return whatever is in here. - JsonMemory.Return(eventBuffers); + JsonMemory.Return(JsonMemoryKind.Json, eventBuffers); #endif } } @@ -232,7 +233,7 @@ private static void WriteBytesToChunks(List chunks, ref int currentPosit if (chunks.Count == 0 || currentPosition >= JsonMemory.BufferSize) { currentPosition = 0; - chunks.Add(JsonMemory.Rent()); + chunks.Add(JsonMemory.Rent(JsonMemoryKind.Json)); } var currentChunk = chunks[^1]; diff --git a/src/HotChocolate/Caching/src/Caching/HotChocolate.Caching.csproj b/src/HotChocolate/Caching/src/Caching/HotChocolate.Caching.csproj index 19568782fb1..76d0623f5d7 100644 --- a/src/HotChocolate/Caching/src/Caching/HotChocolate.Caching.csproj +++ b/src/HotChocolate/Caching/src/Caching/HotChocolate.Caching.csproj @@ -18,7 +18,6 @@ - diff --git a/src/HotChocolate/Core/HotChocolate.Core.slnx b/src/HotChocolate/Core/HotChocolate.Core.slnx index 874b0c44d4f..2f8095bec3b 100644 --- a/src/HotChocolate/Core/HotChocolate.Core.slnx +++ b/src/HotChocolate/Core/HotChocolate.Core.slnx @@ -7,9 +7,7 @@ - - diff --git a/src/HotChocolate/Core/src/Authorization/HotChocolate.Authorization.csproj b/src/HotChocolate/Core/src/Authorization/HotChocolate.Authorization.csproj index 36369fa8d90..c4fea1db81e 100644 --- a/src/HotChocolate/Core/src/Authorization/HotChocolate.Authorization.csproj +++ b/src/HotChocolate/Core/src/Authorization/HotChocolate.Authorization.csproj @@ -14,7 +14,7 @@ - + diff --git a/src/HotChocolate/Core/src/Core/HotChocolate.Core.csproj b/src/HotChocolate/Core/src/Core/HotChocolate.Core.csproj index 8c5f1883691..21d8f857b7b 100644 --- a/src/HotChocolate/Core/src/Core/HotChocolate.Core.csproj +++ b/src/HotChocolate/Core/src/Core/HotChocolate.Core.csproj @@ -18,8 +18,6 @@ - - diff --git a/src/HotChocolate/Core/src/Execution.Projections/HotChocolate.Execution.Projections.csproj b/src/HotChocolate/Core/src/Execution.Projections/HotChocolate.Execution.Projections.csproj index 74997ec1546..8e5a544034f 100644 --- a/src/HotChocolate/Core/src/Execution.Projections/HotChocolate.Execution.Projections.csproj +++ b/src/HotChocolate/Core/src/Execution.Projections/HotChocolate.Execution.Projections.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/HotChocolate/Core/src/Execution/HotChocolate.Execution.csproj b/src/HotChocolate/Core/src/Execution/HotChocolate.Execution.csproj deleted file mode 100644 index a30275088fc..00000000000 --- a/src/HotChocolate/Core/src/Execution/HotChocolate.Execution.csproj +++ /dev/null @@ -1,247 +0,0 @@ - - - - true - - - - HotChocolate.Execution - HotChocolate.Execution - HotChocolate.Execution - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - OperationCompiler.cs - - - OperationCompiler.cs - - - OperationCompiler.cs - - - OperationCompiler.cs - - - OperationContext.cs - - - OperationContext.cs - - - OperationCompiler.cs - - - MiddlewareContext.Global.cs - - - MiddlewareContext.Global.cs - - - MiddlewareContext.Global.cs - - - MiddlewareContext.Global.cs - - - MiddlewareContext.Global.cs - - - ResolverTask.cs - - - WorkScheduler.cs - - - WorkScheduler.cs - - - SchemaRequestExecutorBuilderExtensions.cs - - - SchemaRequestExecutorBuilderExtensions.cs - - - SchemaRequestExecutorBuilderExtensions.cs - - - SchemaRequestExecutorBuilderExtensions.cs - - - SchemaRequestExecutorBuilderExtensions.cs - - - SchemaRequestExecutorBuilderExtensions.cs - - - SchemaRequestExecutorBuilderExtensions.cs - - - SchemaRequestExecutorBuilderExtensions.cs - - - SchemaRequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - ValueCompletion.cs - - - ValueCompletion.cs - - - ValueCompletion.cs - - - ResultBuilder.cs - - - ResultBuilder.cs - - - ResultBuilder.cs - - - ResolverTask.cs - - - ResolverTask.cs - - - OperationContext.cs - - - OperationContext.cs - - - OperationContext.cs - - - OperationContext.cs - - - JsonResultFormatter.cs - - - SubscriptionExecutor.cs - - - RequestExecutorResolver.cs - - - ValueCompletion.cs - - - BatchExecutor.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorManager.cs - - - RequestExecutorManager.cs - - - RequestExecutorManager.cs - - - RequestExecutorBuilderExtensions.cs - - - RequestExecutorBuilderExtensions.cs - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - diff --git a/src/HotChocolate/Core/src/Fetching/HotChocolate.Fetching.csproj b/src/HotChocolate/Core/src/Fetching/HotChocolate.Fetching.csproj deleted file mode 100644 index 27229d59adc..00000000000 --- a/src/HotChocolate/Core/src/Fetching/HotChocolate.Fetching.csproj +++ /dev/null @@ -1,40 +0,0 @@ - - - - HotChocolate.Fetching - HotChocolate.Fetching - HotChocolate.Fetching - HC8001;$(NoWarn) - - - - - - - - - - - - - - ResXFileCodeGenerator - FetchingResources.Designer.cs - - - - - - True - True - FetchingResources.resx - - - BatchDispatcher.cs - - - BatchDispatcher.cs - - - - diff --git a/src/HotChocolate/Core/src/Types.Errors/HotChocolate.Types.Errors.csproj b/src/HotChocolate/Core/src/Types.Errors/HotChocolate.Types.Errors.csproj index 04de55ffd98..4bdc4169e1f 100644 --- a/src/HotChocolate/Core/src/Types.Errors/HotChocolate.Types.Errors.csproj +++ b/src/HotChocolate/Core/src/Types.Errors/HotChocolate.Types.Errors.csproj @@ -28,7 +28,7 @@ - + diff --git a/src/HotChocolate/Core/src/Types.Json/HotChocolate.Types.Json.csproj b/src/HotChocolate/Core/src/Types.Json/HotChocolate.Types.Json.csproj index a2ff17d8626..cafc753595e 100644 --- a/src/HotChocolate/Core/src/Types.Json/HotChocolate.Types.Json.csproj +++ b/src/HotChocolate/Core/src/Types.Json/HotChocolate.Types.Json.csproj @@ -13,7 +13,6 @@ - diff --git a/src/HotChocolate/Core/src/Types.Mutations/HotChocolate.Types.Mutations.csproj b/src/HotChocolate/Core/src/Types.Mutations/HotChocolate.Types.Mutations.csproj index 8faf45d5e11..bb59ec657e4 100644 --- a/src/HotChocolate/Core/src/Types.Mutations/HotChocolate.Types.Mutations.csproj +++ b/src/HotChocolate/Core/src/Types.Mutations/HotChocolate.Types.Mutations.csproj @@ -24,7 +24,7 @@ - + diff --git a/src/HotChocolate/Core/src/Types.OffsetPagination/HotChocolate.Types.OffsetPagination.csproj b/src/HotChocolate/Core/src/Types.OffsetPagination/HotChocolate.Types.OffsetPagination.csproj index 3561ed6ead9..489e7d6cf91 100644 --- a/src/HotChocolate/Core/src/Types.OffsetPagination/HotChocolate.Types.OffsetPagination.csproj +++ b/src/HotChocolate/Core/src/Types.OffsetPagination/HotChocolate.Types.OffsetPagination.csproj @@ -13,7 +13,6 @@ - diff --git a/src/HotChocolate/Core/src/Types.Queries/HotChocolate.Types.Queries.csproj b/src/HotChocolate/Core/src/Types.Queries/HotChocolate.Types.Queries.csproj index 1a42342fada..2ec4deeeec7 100644 --- a/src/HotChocolate/Core/src/Types.Queries/HotChocolate.Types.Queries.csproj +++ b/src/HotChocolate/Core/src/Types.Queries/HotChocolate.Types.Queries.csproj @@ -25,7 +25,7 @@ - + diff --git a/src/HotChocolate/Core/src/Execution/Caching/DefaultDocumentCache.cs b/src/HotChocolate/Core/src/Types/Execution/Caching/DefaultDocumentCache.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Caching/DefaultDocumentCache.cs rename to src/HotChocolate/Core/src/Types/Execution/Caching/DefaultDocumentCache.cs diff --git a/src/HotChocolate/Core/src/Execution/Caching/DefaultPreparedOperationCache.cs b/src/HotChocolate/Core/src/Types/Execution/Caching/DefaultPreparedOperationCache.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Caching/DefaultPreparedOperationCache.cs rename to src/HotChocolate/Core/src/Types/Execution/Caching/DefaultPreparedOperationCache.cs diff --git a/src/HotChocolate/Core/src/Execution/Caching/IPreparedOperationCache.cs b/src/HotChocolate/Core/src/Types/Execution/Caching/IPreparedOperationCache.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Caching/IPreparedOperationCache.cs rename to src/HotChocolate/Core/src/Types/Execution/Caching/IPreparedOperationCache.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/ConfigurationContext.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/ConfigurationContext.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/ConfigurationContext.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/ConfigurationContext.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/ConfigureRequestExecutorSetup.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/ConfigureRequestExecutorSetup.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/ConfigureRequestExecutorSetup.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/ConfigureRequestExecutorSetup.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/DefaultRequestExecutorBuilder.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/DefaultRequestExecutorBuilder.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/DefaultRequestExecutorBuilder.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/DefaultRequestExecutorBuilder.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/IConfigureRequestExecutorSetup.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/IConfigureRequestExecutorSetup.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/IConfigureRequestExecutorSetup.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/IConfigureRequestExecutorSetup.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/ITypeModule.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/ITypeModule.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/ITypeModule.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/ITypeModule.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/OnConfigureRequestExecutorOptionsAction.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/OnConfigureRequestExecutorOptionsAction.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/OnConfigureRequestExecutorOptionsAction.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/OnConfigureRequestExecutorOptionsAction.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/OnConfigureSchemaBuilderAction.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/OnConfigureSchemaBuilderAction.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/OnConfigureSchemaBuilderAction.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/OnConfigureSchemaBuilderAction.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/OnConfigureSchemaServices.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/OnConfigureSchemaServices.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/OnConfigureSchemaServices.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/OnConfigureSchemaServices.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/OnRequestExecutorCreatedAction.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/OnRequestExecutorCreatedAction.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/OnRequestExecutorCreatedAction.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/OnRequestExecutorCreatedAction.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/OnRequestExecutorEvictedAction.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/OnRequestExecutorEvictedAction.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/OnRequestExecutorEvictedAction.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/OnRequestExecutorEvictedAction.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/RequestExecutorSetup.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/RequestExecutorSetup.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/RequestExecutorSetup.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/RequestExecutorSetup.cs diff --git a/src/HotChocolate/Core/src/Execution/Configuration/RootServiceProviderAccessor.cs b/src/HotChocolate/Core/src/Types/Execution/Configuration/RootServiceProviderAccessor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Configuration/RootServiceProviderAccessor.cs rename to src/HotChocolate/Core/src/Types/Execution/Configuration/RootServiceProviderAccessor.cs diff --git a/src/HotChocolate/Core/src/Execution/DefaultRequestContextAccessor.cs b/src/HotChocolate/Core/src/Types/Execution/DefaultRequestContextAccessor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DefaultRequestContextAccessor.cs rename to src/HotChocolate/Core/src/Types/Execution/DefaultRequestContextAccessor.cs diff --git a/src/HotChocolate/Core/src/Execution/DefaultRequestExecutor.cs b/src/HotChocolate/Core/src/Types/Execution/DefaultRequestExecutor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DefaultRequestExecutor.cs rename to src/HotChocolate/Core/src/Types/Execution/DefaultRequestExecutor.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/Factories/DeferredWorkStateOwnerFactory.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/DeferredWorkStateOwnerFactory.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/Factories/DeferredWorkStateOwnerFactory.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/DeferredWorkStateOwnerFactory.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/Factories/IFactory.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/IFactory.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/Factories/IFactory.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/IFactory.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/Factories/OperationContextFactory.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/OperationContextFactory.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/Factories/OperationContextFactory.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/OperationContextFactory.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/Factories/OperationContextOwnerFactory.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/OperationContextOwnerFactory.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/Factories/OperationContextOwnerFactory.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/OperationContextOwnerFactory.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/Factories/PooledServiceFactory.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/PooledServiceFactory.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/Factories/PooledServiceFactory.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/PooledServiceFactory.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/InternalSchemaServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalSchemaServiceCollectionExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/InternalSchemaServiceCollectionExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalSchemaServiceCollectionExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Caches.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Caches.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Caches.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Caches.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Composite.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Composite.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Composite.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Composite.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.DataLoader.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.DataLoader.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.DataLoader.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.DataLoader.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.ErrorFilter.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.ErrorFilter.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.ErrorFilter.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.ErrorFilter.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Hashing.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Hashing.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Hashing.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Hashing.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.IdSerializer.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.IdSerializer.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.IdSerializer.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.IdSerializer.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.InputParser.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.InputParser.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.InputParser.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.InputParser.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Instrumentation.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Instrumentation.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Instrumentation.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Instrumentation.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Optimizer.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Optimizer.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Optimizer.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Optimizer.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Services.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Services.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Services.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Services.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TransactionScope.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TransactionScope.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TransactionScope.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TransactionScope.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeConversion.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeConversion.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeConversion.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeConversion.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeDiscovery.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeDiscovery.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeDiscovery.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeDiscovery.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.UseRequest.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.UseRequest.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.UseRequest.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.UseRequest.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Validation.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Validation.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Validation.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.Validation.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorBuilderExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorServiceProviderExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceProviderExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorServiceProviderExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceProviderExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Convention.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Convention.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Convention.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Convention.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Document.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Document.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Document.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Document.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Middleware.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Middleware.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Middleware.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Middleware.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Paging.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Paging.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Paging.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Paging.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Relay.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Relay.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Relay.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Relay.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Resolvers.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Resolvers.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Resolvers.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Resolvers.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.TypeInterceptor.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.TypeInterceptor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.TypeInterceptor.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.TypeInterceptor.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.TypeModules.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.TypeModules.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.TypeModules.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.TypeModules.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Types.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Types.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Types.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Types.cs diff --git a/src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/ErrorHelper.cs b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/ErrorHelper.cs rename to src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs diff --git a/src/HotChocolate/Core/src/Execution/Errors/FuncErrorFilterWrapper.cs b/src/HotChocolate/Core/src/Types/Execution/Errors/FuncErrorFilterWrapper.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Errors/FuncErrorFilterWrapper.cs rename to src/HotChocolate/Core/src/Types/Execution/Errors/FuncErrorFilterWrapper.cs diff --git a/src/HotChocolate/Core/src/Execution/Extensions/ExecutionObjectFieldDescriptorExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionObjectFieldDescriptorExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Extensions/ExecutionObjectFieldDescriptorExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionObjectFieldDescriptorExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/Extensions/ExecutionRequestExecutorExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionRequestExecutorExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Extensions/ExecutionRequestExecutorExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionRequestExecutorExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/Extensions/ExecutionResultExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionResultExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Extensions/ExecutionResultExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionResultExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/Extensions/ExecutionSchemaExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionSchemaExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Extensions/ExecutionSchemaExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionSchemaExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/Extensions/HotChocolateExecutionRequestContextExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/HotChocolateExecutionRequestContextExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Extensions/HotChocolateExecutionRequestContextExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/Extensions/HotChocolateExecutionRequestContextExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/Extensions/OperationContextExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Extensions/OperationContextExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/IRequestContextAccessor.cs b/src/HotChocolate/Core/src/Types/Execution/IRequestContextAccessor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/IRequestContextAccessor.cs rename to src/HotChocolate/Core/src/Types/Execution/IRequestContextAccessor.cs diff --git a/src/HotChocolate/Core/src/Execution/IRequestContextEnricher.cs b/src/HotChocolate/Core/src/Types/Execution/IRequestContextEnricher.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/IRequestContextEnricher.cs rename to src/HotChocolate/Core/src/Types/Execution/IRequestContextEnricher.cs diff --git a/src/HotChocolate/Core/src/Execution/Instrumentation/AggregateExecutionDiagnosticEvents.cs b/src/HotChocolate/Core/src/Types/Execution/Instrumentation/AggregateExecutionDiagnosticEvents.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Instrumentation/AggregateExecutionDiagnosticEvents.cs rename to src/HotChocolate/Core/src/Types/Execution/Instrumentation/AggregateExecutionDiagnosticEvents.cs diff --git a/src/HotChocolate/Core/src/Execution/Instrumentation/ExecutionDiagnosticEventListener.cs b/src/HotChocolate/Core/src/Types/Execution/Instrumentation/ExecutionDiagnosticEventListener.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Instrumentation/ExecutionDiagnosticEventListener.cs rename to src/HotChocolate/Core/src/Types/Execution/Instrumentation/ExecutionDiagnosticEventListener.cs diff --git a/src/HotChocolate/Core/src/Execution/Instrumentation/IExecutionDiagnosticEventListener.cs b/src/HotChocolate/Core/src/Types/Execution/Instrumentation/IExecutionDiagnosticEventListener.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Instrumentation/IExecutionDiagnosticEventListener.cs rename to src/HotChocolate/Core/src/Types/Execution/Instrumentation/IExecutionDiagnosticEventListener.cs diff --git a/src/HotChocolate/Core/src/Execution/Instrumentation/IExecutionDiagnosticEvents.cs b/src/HotChocolate/Core/src/Types/Execution/Instrumentation/IExecutionDiagnosticEvents.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Instrumentation/IExecutionDiagnosticEvents.cs rename to src/HotChocolate/Core/src/Types/Execution/Instrumentation/IExecutionDiagnosticEvents.cs diff --git a/src/HotChocolate/Core/src/Execution/Instrumentation/NoopExecutionDiagnosticEvents.cs b/src/HotChocolate/Core/src/Types/Execution/Instrumentation/NoopExecutionDiagnosticEvents.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Instrumentation/NoopExecutionDiagnosticEvents.cs rename to src/HotChocolate/Core/src/Types/Execution/Instrumentation/NoopExecutionDiagnosticEvents.cs diff --git a/src/HotChocolate/Core/src/Execution/Internal/ArgumentCoercionHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Internal/ArgumentCoercionHelper.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Internal/ArgumentCoercionHelper.cs rename to src/HotChocolate/Core/src/Types/Execution/Internal/ArgumentCoercionHelper.cs diff --git a/src/HotChocolate/Core/src/Execution/Internal/MiddlewareContextMarshal.cs b/src/HotChocolate/Core/src/Types/Execution/Internal/MiddlewareContextMarshal.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Internal/MiddlewareContextMarshal.cs rename to src/HotChocolate/Core/src/Types/Execution/Internal/MiddlewareContextMarshal.cs diff --git a/src/HotChocolate/Core/src/Execution/Internal/SchemaFileExporter.cs b/src/HotChocolate/Core/src/Types/Execution/Internal/SchemaFileExporter.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Internal/SchemaFileExporter.cs rename to src/HotChocolate/Core/src/Types/Execution/Internal/SchemaFileExporter.cs diff --git a/src/HotChocolate/Core/src/Execution/NeedsFormatting.cs b/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/NeedsFormatting.cs rename to src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs diff --git a/src/HotChocolate/Core/src/Execution/Options/IErrorHandlerOptionsAccessor.cs b/src/HotChocolate/Core/src/Types/Execution/Options/IErrorHandlerOptionsAccessor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Options/IErrorHandlerOptionsAccessor.cs rename to src/HotChocolate/Core/src/Types/Execution/Options/IErrorHandlerOptionsAccessor.cs diff --git a/src/HotChocolate/Core/src/Execution/Options/IPersistedOperationOptionsAccessor.cs b/src/HotChocolate/Core/src/Types/Execution/Options/IPersistedOperationOptionsAccessor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Options/IPersistedOperationOptionsAccessor.cs rename to src/HotChocolate/Core/src/Types/Execution/Options/IPersistedOperationOptionsAccessor.cs diff --git a/src/HotChocolate/Core/src/Execution/Options/IRequestExecutorOptionsAccessor.cs b/src/HotChocolate/Core/src/Types/Execution/Options/IRequestExecutorOptionsAccessor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Options/IRequestExecutorOptionsAccessor.cs rename to src/HotChocolate/Core/src/Types/Execution/Options/IRequestExecutorOptionsAccessor.cs diff --git a/src/HotChocolate/Core/src/Execution/Options/IRequestTimeoutOptionsAccessor.cs b/src/HotChocolate/Core/src/Types/Execution/Options/IRequestTimeoutOptionsAccessor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Options/IRequestTimeoutOptionsAccessor.cs rename to src/HotChocolate/Core/src/Types/Execution/Options/IRequestTimeoutOptionsAccessor.cs diff --git a/src/HotChocolate/Core/src/Execution/Options/NodeIdSerializerOptions.cs b/src/HotChocolate/Core/src/Types/Execution/Options/NodeIdSerializerOptions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Options/NodeIdSerializerOptions.cs rename to src/HotChocolate/Core/src/Types/Execution/Options/NodeIdSerializerOptions.cs diff --git a/src/HotChocolate/Core/src/Execution/Options/RequestExecutorOptions.cs b/src/HotChocolate/Core/src/Types/Execution/Options/RequestExecutorOptions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Options/RequestExecutorOptions.cs rename to src/HotChocolate/Core/src/Types/Execution/Options/RequestExecutorOptions.cs diff --git a/src/HotChocolate/Core/src/Execution/Options/RequestParserOptions.cs b/src/HotChocolate/Core/src/Types/Execution/Options/RequestParserOptions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Options/RequestParserOptions.cs rename to src/HotChocolate/Core/src/Types/Execution/Options/RequestParserOptions.cs diff --git a/src/HotChocolate/Core/src/Execution/Options/ResultBufferOptions.cs b/src/HotChocolate/Core/src/Types/Execution/Options/ResultBufferOptions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Options/ResultBufferOptions.cs rename to src/HotChocolate/Core/src/Types/Execution/Options/ResultBufferOptions.cs diff --git a/src/HotChocolate/Core/src/Execution/Options/TracingPreference.cs b/src/HotChocolate/Core/src/Types/Execution/Options/TracingPreference.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Options/TracingPreference.cs rename to src/HotChocolate/Core/src/Types/Execution/Options/TracingPreference.cs diff --git a/src/HotChocolate/Core/src/Execution/Pipeline/OperationCacheMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationCacheMiddleware.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Pipeline/OperationCacheMiddleware.cs rename to src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationCacheMiddleware.cs diff --git a/src/HotChocolate/Core/src/Execution/Pipeline/OperationExecutionMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Pipeline/OperationExecutionMiddleware.cs rename to src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs diff --git a/src/HotChocolate/Core/src/Execution/Pipeline/OperationInfo.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationInfo.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Pipeline/OperationInfo.cs rename to src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationInfo.cs diff --git a/src/HotChocolate/Core/src/Execution/Pipeline/OperationResolverMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Pipeline/OperationResolverMiddleware.cs rename to src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs diff --git a/src/HotChocolate/Core/src/Execution/Pipeline/OperationVariableCoercionMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationVariableCoercionMiddleware.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Pipeline/OperationVariableCoercionMiddleware.cs rename to src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationVariableCoercionMiddleware.cs diff --git a/src/HotChocolate/Core/src/Execution/Pipeline/PipelineTools.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Pipeline/PipelineTools.cs rename to src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs diff --git a/src/HotChocolate/Core/src/Execution/Pipeline/Pipelines.md b/src/HotChocolate/Core/src/Types/Execution/Pipeline/Pipelines.md similarity index 100% rename from src/HotChocolate/Core/src/Execution/Pipeline/Pipelines.md rename to src/HotChocolate/Core/src/Types/Execution/Pipeline/Pipelines.md diff --git a/src/HotChocolate/Core/src/Execution/Pipeline/RequestClassMiddlewareFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/RequestClassMiddlewareFactory.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Pipeline/RequestClassMiddlewareFactory.cs rename to src/HotChocolate/Core/src/Types/Execution/Pipeline/RequestClassMiddlewareFactory.cs diff --git a/src/HotChocolate/Core/src/Execution/Pipeline/TimeoutMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/TimeoutMiddleware.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Pipeline/TimeoutMiddleware.cs rename to src/HotChocolate/Core/src/Types/Execution/Pipeline/TimeoutMiddleware.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/ArgumentNonNullValidator.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ArgumentNonNullValidator.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/ArgumentNonNullValidator.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/ArgumentNonNullValidator.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/AsyncManualResetEvent.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/AsyncManualResetEvent.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/AsyncManualResetEvent.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/AsyncManualResetEvent.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/DefaultActivator.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DefaultActivator.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/DefaultActivator.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/DefaultActivator.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/DefaultTransactionScope.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DefaultTransactionScope.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/DefaultTransactionScope.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/DefaultTransactionScope.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/DefaultTransactionScopeHandler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DefaultTransactionScopeHandler.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/DefaultTransactionScopeHandler.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/DefaultTransactionScopeHandler.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/DeferredExecutionTask.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTask.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/DeferredExecutionTask.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTask.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/DeferredExecutionTaskResult.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTaskResult.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/DeferredExecutionTaskResult.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTaskResult.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/DeferredFragment.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredFragment.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/DeferredFragment.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/DeferredFragment.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/DeferredStream.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredStream.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/DeferredStream.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/DeferredStream.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/DeferredWorkScheduler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkScheduler.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/DeferredWorkScheduler.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkScheduler.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/DeferredWorkState.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkState.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/DeferredWorkState.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkState.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/DeferredWorkStateOwner.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkStateOwner.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/DeferredWorkStateOwner.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkStateOwner.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/EmptySelectionCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/EmptySelectionCollection.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/EmptySelectionCollection.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/EmptySelectionCollection.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Fragment.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Fragment.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Fragment.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Fragment.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/IOperationCompilerOptimizer.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/IOperationCompilerOptimizer.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/IOperationCompilerOptimizer.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/IOperationCompilerOptimizer.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/IOperationOptimizer.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/IOperationOptimizer.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/IOperationOptimizer.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/IOperationOptimizer.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/ISelectionSetOptimizer.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionSetOptimizer.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/ISelectionSetOptimizer.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionSetOptimizer.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/ISubscription.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ISubscription.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/ISubscription.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/ISubscription.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/ITaskStatistics.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ITaskStatistics.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/ITaskStatistics.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/ITaskStatistics.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/ITransactionScope.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ITransactionScope.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/ITransactionScope.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/ITransactionScope.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/ITransactionScopeHandler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ITransactionScopeHandler.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/ITransactionScopeHandler.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/ITransactionScopeHandler.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/IncludeCondition.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/IncludeCondition.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/IncludeCondition.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/IncludeCondition.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.Arguments.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.Arguments.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.Global.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.Global.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.Pooling.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.Pure.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.Pure.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.Selection.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.State.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/MiddlewareContext.State.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/NoOpTransactionScope.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/NoOpTransactionScope.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/NoOpTransactionScope.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/NoOpTransactionScope.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/NoOpTransactionScopeHandler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/NoOpTransactionScopeHandler.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/NoOpTransactionScopeHandler.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/NoOpTransactionScopeHandler.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/NoopBatchDispatcher.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/NoopBatchDispatcher.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/NoopBatchDispatcher.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/NoopBatchDispatcher.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Operation.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.ArgumentValues.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.ArgumentValues.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.ArgumentValues.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.ArgumentValues.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.BacklogItem.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.BacklogItem.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.BacklogItem.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.BacklogItem.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.CompilerContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompilerContext.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.CompilerContext.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompilerContext.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.Optimizers.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.Optimizers.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.Optimizers.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.Optimizers.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.SelectionSetInfo.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.SelectionSetInfo.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.SelectionSetInfo.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.SelectionSetInfo.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationCompiler.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationCompilerMetrics.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerMetrics.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationCompilerMetrics.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerMetrics.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationCompilerOptimizerHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizerHelper.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationCompilerOptimizerHelper.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizerHelper.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationCompilerOptimizers.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizers.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationCompilerOptimizers.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizers.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationCompilerPool.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerPool.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationCompilerPool.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerPool.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationContext.Execution.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationContext.Execution.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationContext.IExecutionTaskContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.IExecutionTaskContext.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationContext.IExecutionTaskContext.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.IExecutionTaskContext.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationContext.Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationContext.Operation.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationContext.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationContext.Pooling.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationContext.Services.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Services.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationContext.Services.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Services.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationContext.Utilities.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Utilities.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationContext.Utilities.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Utilities.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationContext.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationContextOwner.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContextOwner.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationContextOwner.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationContextOwner.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationOptimizerContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationOptimizerContext.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationOptimizerContext.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationOptimizerContext.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationPrinter.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationPrinter.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationPrinter.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationPrinter.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/OperationResolverHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResolverHelper.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/OperationResolverHelper.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/OperationResolverHelper.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/PathHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/PathHelper.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/PathHelper.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/PathHelper.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/QueryExecutor.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/QueryExecutor.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ListResult.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResult.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ListResult.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResult.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ListResultPool.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResultPool.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ListResultPool.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResultPool.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ObjectFieldResult.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectFieldResult.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ObjectFieldResult.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectFieldResult.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ObjectResult.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResult.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ObjectResult.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResult.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ObjectResultExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ObjectResultExtensions.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultExtensions.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ObjectResultPool.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultPool.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ObjectResultPool.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultPool.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ResultBucket.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBucket.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ResultBucket.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBucket.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ResultBuilder.ObjectResult.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.ObjectResult.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ResultBuilder.ObjectResult.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.ObjectResult.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ResultBuilder.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.Pooling.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ResultBuilder.Pooling.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.Pooling.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ResultBuilder.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ResultBuilder.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ResultData.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultData.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ResultData.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultData.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ResultMemoryOwner.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultMemoryOwner.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ResultMemoryOwner.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultMemoryOwner.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ResultPool.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPool.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ResultPool.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPool.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Result/ResultPoolDefaults.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPoolDefaults.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Result/ResultPoolDefaults.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPoolDefaults.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/RootValueResolver.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/RootValueResolver.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/RootValueResolver.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/RootValueResolver.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Selection.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/SelectionCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionCollection.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/SelectionCollection.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/SelectionCollection.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/SelectionIncludeCondition.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionIncludeCondition.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/SelectionIncludeCondition.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/SelectionIncludeCondition.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/SelectionInclusionKind.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionInclusionKind.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/SelectionInclusionKind.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/SelectionInclusionKind.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/SelectionPath.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionPath.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/SelectionPath.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/SelectionPath.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/SelectionSet.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/SelectionSet.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/SelectionSetOptimizerContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/SelectionSetOptimizerContext.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/SelectionVariants.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionVariants.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/SelectionVariants.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/SelectionVariants.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/SubscriptionExecutor.Subscription.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.Subscription.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/SubscriptionExecutor.Subscription.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.Subscription.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/SubscriptionExecutor.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/SubscriptionExecutor.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Tasks/ExecutionTaskPool.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ExecutionTaskPool.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Tasks/ExecutionTaskPool.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ExecutionTaskPool.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Tasks/ExecutionTaskPoolPolicy.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ExecutionTaskPoolPolicy.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Tasks/ExecutionTaskPoolPolicy.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ExecutionTaskPoolPolicy.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTask.Execute.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTask.Execute.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTask.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTask.Pooling.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTask.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTask.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTaskFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTaskFactory.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTaskPoolPolicy.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskPoolPolicy.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Tasks/ResolverTaskPoolPolicy.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskPoolPolicy.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/Tasks/StreamHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/StreamHelper.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/Tasks/StreamHelper.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/StreamHelper.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/ValueCompletion.Leaf.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/ValueCompletion.Leaf.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/ValueCompletion.List.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/ValueCompletion.List.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/ValueCompletion.Object.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/ValueCompletion.Object.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/ValueCompletion.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/ValueCompletion.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/ValueCompletionContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletionContext.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/ValueCompletionContext.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletionContext.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/VariableCoercionHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/VariableCoercionHelper.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/VariableRewriter.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableRewriter.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/VariableRewriter.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/VariableRewriter.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/VariableValueCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueCollection.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/VariableValueCollection.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueCollection.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/VariableValueOrLiteral.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueOrLiteral.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/VariableValueOrLiteral.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueOrLiteral.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/WorkQueue.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/WorkQueue.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/WorkQueue.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/WorkQueue.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/WorkScheduler.Execute.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Execute.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/WorkScheduler.Execute.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Execute.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/WorkScheduler.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Pooling.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/WorkScheduler.Pooling.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Pooling.cs diff --git a/src/HotChocolate/Core/src/Execution/Processing/WorkScheduler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Processing/WorkScheduler.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.cs diff --git a/src/HotChocolate/Core/src/Execution/RequestExecutorManager.Events.cs b/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.Events.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/RequestExecutorManager.Events.cs rename to src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.Events.cs diff --git a/src/HotChocolate/Core/src/Execution/RequestExecutorManager.Hooks.cs b/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.Hooks.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/RequestExecutorManager.Hooks.cs rename to src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.Hooks.cs diff --git a/src/HotChocolate/Core/src/Execution/RequestExecutorManager.Warmup.cs b/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.Warmup.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/RequestExecutorManager.Warmup.cs rename to src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.Warmup.cs diff --git a/src/HotChocolate/Core/src/Execution/RequestExecutorManager.cs b/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/RequestExecutorManager.cs rename to src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs diff --git a/src/HotChocolate/Core/src/Execution/Requirements/FieldRequirementsMetadata.cs b/src/HotChocolate/Core/src/Types/Execution/Requirements/FieldRequirementsMetadata.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Requirements/FieldRequirementsMetadata.cs rename to src/HotChocolate/Core/src/Types/Execution/Requirements/FieldRequirementsMetadata.cs diff --git a/src/HotChocolate/Core/src/Execution/Requirements/PropertyNode.cs b/src/HotChocolate/Core/src/Types/Execution/Requirements/PropertyNode.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Requirements/PropertyNode.cs rename to src/HotChocolate/Core/src/Types/Execution/Requirements/PropertyNode.cs diff --git a/src/HotChocolate/Core/src/Execution/Requirements/PropertyTreeBuilder.cs b/src/HotChocolate/Core/src/Types/Execution/Requirements/PropertyTreeBuilder.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Requirements/PropertyTreeBuilder.cs rename to src/HotChocolate/Core/src/Types/Execution/Requirements/PropertyTreeBuilder.cs diff --git a/src/HotChocolate/Core/src/Execution/Requirements/RequirementsTypeInterceptor.cs b/src/HotChocolate/Core/src/Types/Execution/Requirements/RequirementsTypeInterceptor.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Requirements/RequirementsTypeInterceptor.cs rename to src/HotChocolate/Core/src/Types/Execution/Requirements/RequirementsTypeInterceptor.cs diff --git a/src/HotChocolate/Core/src/Execution/Requirements/TypeContainer.cs b/src/HotChocolate/Core/src/Types/Execution/Requirements/TypeContainer.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Requirements/TypeContainer.cs rename to src/HotChocolate/Core/src/Types/Execution/Requirements/TypeContainer.cs diff --git a/src/HotChocolate/Core/src/Execution/Requirements/TypeNode.cs b/src/HotChocolate/Core/src/Types/Execution/Requirements/TypeNode.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Requirements/TypeNode.cs rename to src/HotChocolate/Core/src/Types/Execution/Requirements/TypeNode.cs diff --git a/src/HotChocolate/Core/src/Execution/SchemaName.cs b/src/HotChocolate/Core/src/Types/Execution/SchemaName.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/SchemaName.cs rename to src/HotChocolate/Core/src/Types/Execution/SchemaName.cs diff --git a/src/HotChocolate/Core/src/Execution/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/ThrowHelper.cs rename to src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs diff --git a/src/HotChocolate/Core/src/Execution/Timestamp.cs b/src/HotChocolate/Core/src/Types/Execution/Timestamp.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Timestamp.cs rename to src/HotChocolate/Core/src/Types/Execution/Timestamp.cs diff --git a/src/HotChocolate/Core/src/Fetching/AdHocBatchDataLoader.cs b/src/HotChocolate/Core/src/Types/Fetching/AdHocBatchDataLoader.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/AdHocBatchDataLoader.cs rename to src/HotChocolate/Core/src/Types/Fetching/AdHocBatchDataLoader.cs diff --git a/src/HotChocolate/Core/src/Fetching/AdHocCacheDataLoader.cs b/src/HotChocolate/Core/src/Types/Fetching/AdHocCacheDataLoader.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/AdHocCacheDataLoader.cs rename to src/HotChocolate/Core/src/Types/Fetching/AdHocCacheDataLoader.cs diff --git a/src/HotChocolate/Core/src/Fetching/AdHocGroupedDataLoader.cs b/src/HotChocolate/Core/src/Types/Fetching/AdHocGroupedDataLoader.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/AdHocGroupedDataLoader.cs rename to src/HotChocolate/Core/src/Types/Fetching/AdHocGroupedDataLoader.cs diff --git a/src/HotChocolate/Core/src/Fetching/AsyncAutoResetEvent.cs b/src/HotChocolate/Core/src/Types/Fetching/AsyncAutoResetEvent.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/AsyncAutoResetEvent.cs rename to src/HotChocolate/Core/src/Types/Fetching/AsyncAutoResetEvent.cs diff --git a/src/HotChocolate/Core/src/Fetching/Attributes/UseDataLoaderAttribute.cs b/src/HotChocolate/Core/src/Types/Fetching/Attributes/UseDataLoaderAttribute.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/Attributes/UseDataLoaderAttribute.cs rename to src/HotChocolate/Core/src/Types/Fetching/Attributes/UseDataLoaderAttribute.cs diff --git a/src/HotChocolate/Core/src/Fetching/BatchDispatchEventArgs.cs b/src/HotChocolate/Core/src/Types/Fetching/BatchDispatchEventArgs.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/BatchDispatchEventArgs.cs rename to src/HotChocolate/Core/src/Types/Fetching/BatchDispatchEventArgs.cs diff --git a/src/HotChocolate/Core/src/Fetching/BatchDispatchEventType.cs b/src/HotChocolate/Core/src/Types/Fetching/BatchDispatchEventType.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/BatchDispatchEventType.cs rename to src/HotChocolate/Core/src/Types/Fetching/BatchDispatchEventType.cs diff --git a/src/HotChocolate/Core/src/Fetching/BatchDispatcher.ExecutorSession.cs b/src/HotChocolate/Core/src/Types/Fetching/BatchDispatcher.ExecutorSession.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/BatchDispatcher.ExecutorSession.cs rename to src/HotChocolate/Core/src/Types/Fetching/BatchDispatcher.ExecutorSession.cs diff --git a/src/HotChocolate/Core/src/Fetching/BatchDispatcher.IBatchScheduler.cs b/src/HotChocolate/Core/src/Types/Fetching/BatchDispatcher.IBatchScheduler.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/BatchDispatcher.IBatchScheduler.cs rename to src/HotChocolate/Core/src/Types/Fetching/BatchDispatcher.IBatchScheduler.cs diff --git a/src/HotChocolate/Core/src/Fetching/BatchDispatcher.cs b/src/HotChocolate/Core/src/Types/Fetching/BatchDispatcher.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/BatchDispatcher.cs rename to src/HotChocolate/Core/src/Types/Fetching/BatchDispatcher.cs diff --git a/src/HotChocolate/Core/src/Fetching/BatchDispatcherOptions.cs b/src/HotChocolate/Core/src/Types/Fetching/BatchDispatcherOptions.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/BatchDispatcherOptions.cs rename to src/HotChocolate/Core/src/Types/Fetching/BatchDispatcherOptions.cs diff --git a/src/HotChocolate/Core/src/Fetching/BatchDispatcherResult.cs b/src/HotChocolate/Core/src/Types/Fetching/BatchDispatcherResult.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/BatchDispatcherResult.cs rename to src/HotChocolate/Core/src/Types/Fetching/BatchDispatcherResult.cs diff --git a/src/HotChocolate/Core/src/Fetching/DataLoaderDefaults.cs b/src/HotChocolate/Core/src/Types/Fetching/DataLoaderDefaults.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/DataLoaderDefaults.cs rename to src/HotChocolate/Core/src/Types/Fetching/DataLoaderDefaults.cs diff --git a/src/HotChocolate/Core/src/Fetching/DataLoaderParameterExpressionBuilder.cs b/src/HotChocolate/Core/src/Types/Fetching/DataLoaderParameterExpressionBuilder.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/DataLoaderParameterExpressionBuilder.cs rename to src/HotChocolate/Core/src/Types/Fetching/DataLoaderParameterExpressionBuilder.cs diff --git a/src/HotChocolate/Core/src/Fetching/DataLoaderRootFieldTypeInterceptor.cs b/src/HotChocolate/Core/src/Types/Fetching/DataLoaderRootFieldTypeInterceptor.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/DataLoaderRootFieldTypeInterceptor.cs rename to src/HotChocolate/Core/src/Types/Fetching/DataLoaderRootFieldTypeInterceptor.cs diff --git a/src/HotChocolate/Core/src/Fetching/DataLoaderScopeHolder.cs b/src/HotChocolate/Core/src/Types/Fetching/DataLoaderScopeHolder.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/DataLoaderScopeHolder.cs rename to src/HotChocolate/Core/src/Types/Fetching/DataLoaderScopeHolder.cs diff --git a/src/HotChocolate/Core/src/Fetching/ExecutionDataLoaderScope.cs b/src/HotChocolate/Core/src/Types/Fetching/ExecutionDataLoaderScope.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/ExecutionDataLoaderScope.cs rename to src/HotChocolate/Core/src/Types/Fetching/ExecutionDataLoaderScope.cs diff --git a/src/HotChocolate/Core/src/Fetching/ExecutionDataLoaderScopeFactory.cs b/src/HotChocolate/Core/src/Types/Fetching/ExecutionDataLoaderScopeFactory.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/ExecutionDataLoaderScopeFactory.cs rename to src/HotChocolate/Core/src/Types/Fetching/ExecutionDataLoaderScopeFactory.cs diff --git a/src/HotChocolate/Core/src/Fetching/Extensions/DataLoaderResolverContextExtensions.cs b/src/HotChocolate/Core/src/Types/Fetching/Extensions/DataLoaderResolverContextExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/Extensions/DataLoaderResolverContextExtensions.cs rename to src/HotChocolate/Core/src/Types/Fetching/Extensions/DataLoaderResolverContextExtensions.cs diff --git a/src/HotChocolate/Core/src/Fetching/Extensions/DataLoaderServiceProviderExtensions.cs b/src/HotChocolate/Core/src/Types/Fetching/Extensions/DataLoaderServiceProviderExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/Extensions/DataLoaderServiceProviderExtensions.cs rename to src/HotChocolate/Core/src/Types/Fetching/Extensions/DataLoaderServiceProviderExtensions.cs diff --git a/src/HotChocolate/Core/src/Fetching/Extensions/GetDataLoaderAttribute.cs b/src/HotChocolate/Core/src/Types/Fetching/Extensions/GetDataLoaderAttribute.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/Extensions/GetDataLoaderAttribute.cs rename to src/HotChocolate/Core/src/Types/Fetching/Extensions/GetDataLoaderAttribute.cs diff --git a/src/HotChocolate/Core/src/Fetching/Extensions/ObjectFieldDataLoaderExtensions.cs b/src/HotChocolate/Core/src/Types/Fetching/Extensions/ObjectFieldDataLoaderExtensions.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/Extensions/ObjectFieldDataLoaderExtensions.cs rename to src/HotChocolate/Core/src/Types/Fetching/Extensions/ObjectFieldDataLoaderExtensions.cs diff --git a/src/HotChocolate/Core/src/Fetching/FetchBatch.cs b/src/HotChocolate/Core/src/Types/Fetching/FetchBatch.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/FetchBatch.cs rename to src/HotChocolate/Core/src/Types/Fetching/FetchBatch.cs diff --git a/src/HotChocolate/Core/src/Fetching/FetchCache.cs b/src/HotChocolate/Core/src/Types/Fetching/FetchCache.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/FetchCache.cs rename to src/HotChocolate/Core/src/Types/Fetching/FetchCache.cs diff --git a/src/HotChocolate/Core/src/Fetching/FetchGroup.cs b/src/HotChocolate/Core/src/Types/Fetching/FetchGroup.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/FetchGroup.cs rename to src/HotChocolate/Core/src/Types/Fetching/FetchGroup.cs diff --git a/src/HotChocolate/Core/src/Fetching/IBatchDispatcher.cs b/src/HotChocolate/Core/src/Types/Fetching/IBatchDispatcher.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/IBatchDispatcher.cs rename to src/HotChocolate/Core/src/Types/Fetching/IBatchDispatcher.cs diff --git a/src/HotChocolate/Core/src/Fetching/IDataLoaderScopeFactory.cs b/src/HotChocolate/Core/src/Types/Fetching/IDataLoaderScopeFactory.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/IDataLoaderScopeFactory.cs rename to src/HotChocolate/Core/src/Types/Fetching/IDataLoaderScopeFactory.cs diff --git a/src/HotChocolate/Core/src/Fetching/RegisterDataLoaderException.cs b/src/HotChocolate/Core/src/Types/Fetching/RegisterDataLoaderException.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/RegisterDataLoaderException.cs rename to src/HotChocolate/Core/src/Types/Fetching/RegisterDataLoaderException.cs diff --git a/src/HotChocolate/Core/src/Fetching/SkipDataLoaderCacheAttribute.cs b/src/HotChocolate/Core/src/Types/Fetching/SkipDataLoaderCacheAttribute.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/SkipDataLoaderCacheAttribute.cs rename to src/HotChocolate/Core/src/Types/Fetching/SkipDataLoaderCacheAttribute.cs diff --git a/src/HotChocolate/Core/src/Fetching/Utilities/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Fetching/Utilities/ThrowHelper.cs similarity index 100% rename from src/HotChocolate/Core/src/Fetching/Utilities/ThrowHelper.cs rename to src/HotChocolate/Core/src/Types/Fetching/Utilities/ThrowHelper.cs diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index ebf81309726..bf2bed99fa2 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -34,7 +34,6 @@ - @@ -54,13 +53,26 @@ + + + + + + + + + + + + + @@ -81,24 +93,16 @@ Text\Json\MetaDbEventSource.cs - - Text\Json\JsonConstants.cs - - - - Text\Json\JsonConstants.cs - - - - Text\Json\JsonConstants.cs + + ResultDocument.cs - - Text\Json\JsonConstants.cs + + ResultDocument.cs - - Text\Json\JsonConstants.cs + + ResultDocument.cs @@ -169,25 +173,33 @@ DescriptorContext.cs - - True - True - TypeResources.resx - InterfaceType.cs + + True + True + TypeResources.resx + + ResXFileCodeGenerator TypeResources.Designer.cs - - - + + True + True + Resources.resx + + + + ResXFileCodeGenerator + Resources.Designer.cs + diff --git a/src/HotChocolate/Core/src/Types/Internal/IParameterExpressionBuilder.cs b/src/HotChocolate/Core/src/Types/Internal/IParameterExpressionBuilder.cs index 432f3ce243b..8c0e873c448 100644 --- a/src/HotChocolate/Core/src/Types/Internal/IParameterExpressionBuilder.cs +++ b/src/HotChocolate/Core/src/Types/Internal/IParameterExpressionBuilder.cs @@ -4,7 +4,7 @@ namespace HotChocolate.Internal; /// -/// This interface represents an expression builder to resolver resolver parameter values. +/// This interface represents an expression builder to resolver parameter values. /// public interface IParameterExpressionBuilder { diff --git a/src/HotChocolate/Core/src/Fetching/Properties/FetchingResources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/FetchingResources.Designer.cs similarity index 96% rename from src/HotChocolate/Core/src/Fetching/Properties/FetchingResources.Designer.cs rename to src/HotChocolate/Core/src/Types/Properties/FetchingResources.Designer.cs index ce30a8ad324..83d091f7900 100644 --- a/src/HotChocolate/Core/src/Fetching/Properties/FetchingResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types/Properties/FetchingResources.Designer.cs @@ -9,21 +9,21 @@ namespace HotChocolate.Fetching.Properties { using System; - - + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class FetchingResources { - + private static System.Resources.ResourceManager resourceMan; - + private static System.Globalization.CultureInfo resourceCulture; - + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal FetchingResources() { } - + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] internal static System.Resources.ResourceManager ResourceManager { get { @@ -34,7 +34,7 @@ internal static System.Resources.ResourceManager ResourceManager { return resourceMan; } } - + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] internal static System.Globalization.CultureInfo Culture { get { @@ -44,49 +44,49 @@ internal static System.Globalization.CultureInfo Culture { resourceCulture = value; } } - + internal static string DataLoaderRegistry_KeyNullOrEmpty { get { return ResourceManager.GetString("DataLoaderRegistry_KeyNullOrEmpty", resourceCulture); } } - + internal static string DefaultDataLoaderRegistry_GetOrRegister { get { return ResourceManager.GetString("DefaultDataLoaderRegistry_GetOrRegister", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_CreateDataLoader_AbstractType { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_CreateDataLoader_AbstractType", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_CreateDataLoader_UnableToCreate { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_CreateDataLoader_UnableToCreate", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_RegistryIsNull { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_RegistryIsNull", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_UnableToRegister { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_UnableToRegister", resourceCulture); } } - + internal static string ThrowHelper_DataLoader_InvalidType { get { return ResourceManager.GetString("ThrowHelper_DataLoader_InvalidType", resourceCulture); } } - + internal static string BatchDispatcherResult_NoExceptions { get { return ResourceManager.GetString("BatchDispatcherResult_NoExceptions", resourceCulture); diff --git a/src/HotChocolate/Core/src/Fetching/Properties/FetchingResources.resx b/src/HotChocolate/Core/src/Types/Properties/FetchingResources.resx similarity index 100% rename from src/HotChocolate/Core/src/Fetching/Properties/FetchingResources.resx rename to src/HotChocolate/Core/src/Types/Properties/FetchingResources.resx diff --git a/src/HotChocolate/Core/src/Execution/Properties/Resources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/Resources.Designer.cs similarity index 100% rename from src/HotChocolate/Core/src/Execution/Properties/Resources.Designer.cs rename to src/HotChocolate/Core/src/Types/Properties/Resources.Designer.cs diff --git a/src/HotChocolate/Core/src/Execution/Properties/Resources.resx b/src/HotChocolate/Core/src/Types/Properties/Resources.resx similarity index 100% rename from src/HotChocolate/Core/src/Execution/Properties/Resources.resx rename to src/HotChocolate/Core/src/Types/Properties/Resources.resx diff --git a/src/HotChocolate/Core/src/Types/Text/Json/CompositeResultDocument.MetaDb.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.MetaDb.cs similarity index 96% rename from src/HotChocolate/Core/src/Types/Text/Json/CompositeResultDocument.MetaDb.cs rename to src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.MetaDb.cs index 5f6561ac0ec..46af3d2c6b3 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/CompositeResultDocument.MetaDb.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.MetaDb.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using HotChocolate.Buffers; using static HotChocolate.Text.Json.MetaDbEventSource; namespace HotChocolate.Text.Json; @@ -26,7 +27,7 @@ internal static MetaDb CreateForEstimatedRows(int estimatedRows) log.MetaDbCreated(2, estimatedRows, 1); // Rent the first chunk now to avoid branching on first append - chunks[0] = MetaDbMemory.Rent(); + chunks[0] = JsonMemory.Rent(JsonMemoryKind.Metadata); log.ChunkAllocated(2, 0); for (var i = 1; i < chunks.Length; i++) @@ -101,7 +102,7 @@ internal Cursor Append( // if the chunk is empty we did not yet rent any memory for it if (chunk.Length == 0) { - chunk = chunks[chunkIndex] = MetaDbMemory.Rent(); + chunk = chunks[chunkIndex] = JsonMemory.Rent(JsonMemoryKind.Metadata); log.ChunkAllocated(2, chunkIndex); } @@ -291,7 +292,7 @@ internal int GetSizeOrLength(Cursor cursor) internal void SetSizeOrLength(Cursor cursor, int sizeOrLength) { AssertValidCursor(cursor); - Debug.Assert(sizeOrLength >= 0 && sizeOrLength <= int.MaxValue, "SizeOrLength value exceeds 31-bit limit"); + Debug.Assert(sizeOrLength >= 0, "SizeOrLength value exceeds 31-bit limit"); var fieldSpan = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 4); var currentValue = MemoryMarshal.Read(fieldSpan); @@ -350,7 +351,7 @@ private void AssertValidCursor(Cursor cursor) Debug.Assert(absoluteIndex >= 0 && absoluteIndex < maxExclusive, $"Cursor points to row {absoluteIndex}, but only {maxExclusive} rows are valid."); - Debug.Assert(cursor.ByteOffset + DbRow.Size <= MetaDbMemory.BufferSize, "Cursor byte offset out of bounds"); + Debug.Assert(cursor.ByteOffset + DbRow.Size <= JsonMemory.BufferSize, "Cursor byte offset out of bounds"); } public void Dispose() @@ -369,7 +370,7 @@ public void Dispose() break; } - MetaDbMemory.Return(chunk); + JsonMemory.Return(JsonMemoryKind.Metadata, chunk); } chunks.Clear(); diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs new file mode 100644 index 00000000000..ab09873c494 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -0,0 +1,598 @@ +using System.Buffers; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Text; +using HotChocolate.Execution.Processing; +using HotChocolate.Types; + +namespace HotChocolate.Text.Json; + +public sealed partial class ResultDocument : IDisposable +{ + private static readonly Encoding s_utf8Encoding = Encoding.UTF8; + private readonly IOperation _operation; + private readonly ulong _includeFlags; + private List? _errors; + private Dictionary? _extensions; + internal MetaDb _metaDb; + private bool _disposed; + + public ResultDocument(IOperation operation, ulong includeFlags) + { + _metaDb = MetaDb.CreateForEstimatedRows(Cursor.RowsPerChunk * 8); + _operation = operation; + _includeFlags = includeFlags; + + Data = CreateObject(Cursor.Zero, operation.RootSelectionSet); + } + + public CompositeResultElement Data { get; } + + public List? Errors + { + get => _errors; + internal set => _errors = value; + } + + public Dictionary? Extensions + { + get => _extensions; + internal set => _extensions = value; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal ElementTokenType GetElementTokenType(Cursor cursor) + => _metaDb.GetElementTokenType(cursor); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal IOperation GetOperation() + => _operation; + + internal ISelectionSet? GetSelectionSet(Cursor cursor) + { + var row = _metaDb.Get(cursor); + + if (row.OperationReferenceType is not OperationReferenceType.SelectionSet) + { + return null; + } + + return _operation.GetSelectionSetById(row.OperationReferenceId); + } + + internal ISelection? GetSelection(Cursor cursor) + { + if (cursor == Cursor.Zero) + { + return null; + } + + // If the cursor points at a value, step back to the PropertyName row. + var row = _metaDb.Get(cursor); + + if (row.TokenType is not ElementTokenType.PropertyName) + { + cursor = cursor.AddRows(-1); + row = _metaDb.Get(cursor); + + if (row.TokenType is not ElementTokenType.PropertyName) + { + return null; + } + } + + if (row.OperationReferenceType is not OperationReferenceType.Selection) + { + return null; + } + + return _operation.GetSelectionById(row.OperationReferenceId); + } + + internal CompositeResultElement GetArrayIndexElement(Cursor current, int arrayIndex) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var (start, tokenType) = _metaDb.GetStartCursor(current); + + CheckExpectedType(ElementTokenType.StartArray, tokenType); + + var len = _metaDb.GetNumberOfRows(start); + + if ((uint)arrayIndex >= (uint)len) + { + throw new IndexOutOfRangeException(); + } + + // first element is at +1 after StartArray + return new CompositeResultElement(this, start.AddRows(arrayIndex + 1)); + } + + internal int GetArrayLength(Cursor current) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + (current, var tokenType) = _metaDb.GetStartCursor(current); + + CheckExpectedType(ElementTokenType.StartArray, tokenType); + + return _metaDb.GetSizeOrLength(current); + } + + internal int GetPropertyCount(Cursor current) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + (current, var tokenType) = _metaDb.GetStartCursor(current); + + CheckExpectedType(ElementTokenType.StartObject, tokenType); + + return _metaDb.GetSizeOrLength(current); + } + + internal Path CreatePath(Cursor current) + { + // Stop at root via IsRoot flag. + if ((_metaDb.GetFlags(current) & ElementFlags.IsRoot) == ElementFlags.IsRoot) + { + return Path.Root; + } + + Span chain = stackalloc Cursor[64]; + var c = current; + var written = 0; + + do + { + chain[written++] = c; + + var parentIndex = _metaDb.GetParent(c); + if (parentIndex <= 0) + { + break; + } + + c = Cursor.FromIndex(parentIndex); + + if (written >= 64) + { + throw new InvalidOperationException("The path is to deep."); + } + } while (true); + + var path = Path.Root; + var parentTokenType = ElementTokenType.StartObject; + + chain = chain[..written]; + + for (var i = chain.Length - 1; i >= 0; i--) + { + c = chain[i]; + var tokenType = _metaDb.GetElementTokenType(c, resolveReferences: false); + + if (tokenType == ElementTokenType.PropertyName) + { + path = path.Append(GetSelection(c)!.ResponseName); + i--; // skip over the actual value + } + else if (chain.Length - 1 > i) + { + var parentCursor = chain[i + 1]; + + if (parentTokenType is ElementTokenType.StartArray) + { + // arrayIndex = abs(child) - (abs(parent) + 1) + var absChild = c.Chunk * Cursor.RowsPerChunk + c.Row; + var absParent = parentCursor.Chunk * Cursor.RowsPerChunk + parentCursor.Row; + var arrayIndex = absChild - (absParent + 1); + path = path.Append(arrayIndex); + } + } + + parentTokenType = tokenType; + } + + return path; + } + + internal CompositeResultElement GetParent(Cursor current) + { + // The null cursor represents the data object, which is the utmost root. + // If we have reached that we simply return an undefined element + if (current == Cursor.Zero) + { + return default; + } + + var parent = _metaDb.GetParentCursor(current); + + // if the parent element is a property name then we must get the parent of that, + // as property name and value represent the same element. + if (_metaDb.GetElementTokenType(parent) is ElementTokenType.PropertyName) + { + parent = _metaDb.GetParentCursor(parent); + } + + // if we have not yet reached the root and the element type of the parent is an object or an array + // then we need to get still the parent of this row as we want to get the logical parent + // which is the value level of the property or the element in an array. + if (parent != Cursor.Zero + && _metaDb.GetElementTokenType(parent) is ElementTokenType.StartObject or ElementTokenType.StartArray) + { + parent = _metaDb.GetParentCursor(parent); + + // in this case the parent must be a reference, otherwise we would have + // found an inconsistency in the database. + Debug.Assert(_metaDb.GetElementTokenType(parent, resolveReferences: false) == ElementTokenType.Reference); + } + + return new CompositeResultElement(this, parent); + } + + internal bool IsInvalidated(Cursor current) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var tokenType = _metaDb.GetElementTokenType(current, resolveReferences: false); + + if (tokenType is ElementTokenType.StartObject) + { + var flags = _metaDb.GetFlags(current); + return (flags & ElementFlags.Invalidated) == ElementFlags.Invalidated; + } + + if (tokenType is ElementTokenType.Reference) + { + current = _metaDb.GetLocationCursor(current); + tokenType = _metaDb.GetElementTokenType(current); + + if (tokenType is ElementTokenType.StartObject) + { + var flags = _metaDb.GetFlags(current); + return (flags & ElementFlags.Invalidated) == ElementFlags.Invalidated; + } + } + + return false; + } + + internal bool IsNullOrInvalidated(Cursor current) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var tokenType = _metaDb.GetElementTokenType(current); + + if (tokenType is ElementTokenType.Null) + { + return true; + } + + if (tokenType is ElementTokenType.StartObject) + { + var flags = _metaDb.GetFlags(current); + return (flags & ElementFlags.Invalidated) == ElementFlags.Invalidated; + } + + if (tokenType is ElementTokenType.Reference) + { + current = _metaDb.GetLocationCursor(current); + tokenType = _metaDb.GetElementTokenType(current); + + if (tokenType is ElementTokenType.StartObject) + { + var flags = _metaDb.GetFlags(current); + return (flags & ElementFlags.Invalidated) == ElementFlags.Invalidated; + } + } + + return false; + } + + internal bool IsInternalProperty(Cursor current) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + // The flag sits on the property row (one before value) + var propertyCursor = current.AddRows(-1); + var flags = _metaDb.GetFlags(propertyCursor); + return (flags & ElementFlags.IsInternal) == ElementFlags.IsInternal; + } + + internal void Invalidate(Cursor current) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var tokenType = _metaDb.GetElementTokenType(current, resolveReferences: false); + + if (tokenType is ElementTokenType.None) + { + return; + } + + if (tokenType is ElementTokenType.StartArray) + { + return; + } + + if (tokenType is ElementTokenType.StartObject) + { + var flags = _metaDb.GetFlags(current); + _metaDb.SetFlags(current, flags | ElementFlags.Invalidated); + return; + } + + if (tokenType is ElementTokenType.Reference) + { + current = _metaDb.GetLocationCursor(current); + tokenType = _metaDb.GetElementTokenType(current); + + if (tokenType is ElementTokenType.StartObject) + { + var flags = _metaDb.GetFlags(current); + _metaDb.SetFlags(current, flags | ElementFlags.Invalidated); + } + + return; + } + + Debug.Fail("Only objects can be invalidated."); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteRawValueTo(IBufferWriter writer, DbRow row, int indentLevel, bool indented) + { + if ((row.Flags & ElementFlags.SourceResult) == ElementFlags.SourceResult) + { + var document = _sources[row.SourceDocumentId]; + + if (row.TokenType is ElementTokenType.StartObject or ElementTokenType.StartArray) + { + // Reconstruct the source cursor from stored Location (Chunk) and SizeOrLength (Row) + var sourceCursor = SourceResultDocument.Cursor.From(row.Location, row.SizeOrLength); + var formatter = new SourceResultDocument.RawJsonFormatter(document, writer, indentLevel, indented); + formatter.WriteValue(sourceCursor); + return; + } + + // For simple values, write directly using location and size + document.WriteRawValueTo(writer, row.Location, row.SizeOrLength); + return; + } + + throw new NotSupportedException(); + } + + private ReadOnlySpan ReadRawValue(DbRow row) + { + if (row.TokenType == ElementTokenType.Null) + { + return JsonConstants.NullValue; + } + + if (row.TokenType == ElementTokenType.True) + { + return JsonConstants.TrueValue; + } + + if (row.TokenType == ElementTokenType.False) + { + return JsonConstants.FalseValue; + } + + if (row.TokenType == ElementTokenType.PropertyName) + { + return _operation.GetSelectionById(row.OperationReferenceId).Utf8ResponseName; + } + + if ((row.Flags & ElementFlags.SourceResult) == ElementFlags.SourceResult) + { + var document = _sources[row.SourceDocumentId]; + return document.ReadRawValue(row.Location, row.SizeOrLength); + } + + throw new NotSupportedException(); + } + + internal CompositeResultElement CreateObject(Cursor parent, ISelectionSet selectionSet) + { + var startObjectCursor = WriteStartObject(parent, selectionSet.Id); + + var selectionCount = 0; + foreach (var selection in selectionSet.Selections) + { + WriteEmptyProperty(startObjectCursor, selection); + selectionCount++; + } + + WriteEndObject(startObjectCursor, selectionCount); + + return new CompositeResultElement(this, startObjectCursor); + } + + internal CompositeResultElement CreateArray(Cursor parent, int length) + { + var cursor = WriteStartArray(parent, length); + + for (var i = 0; i < length; i++) + { + WriteEmptyValue(cursor); + } + + WriteEndArray(); + + return new CompositeResultElement(this, cursor); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void AssignCompositeValue(CompositeResultElement target, CompositeResultElement value) + { + _metaDb.Replace( + cursor: target.Cursor, + tokenType: ElementTokenType.Reference, + location: value.Cursor.ToIndex(), + parentRow: _metaDb.GetParent(target.Cursor)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void AssignSourceValue(CompositeResultElement target, SourceResultElement source) + { + var value = source.GetValuePointer(); + var parent = source._parent; + + if (parent.Id == -1) + { + Debug.Assert(!_sources.Contains(parent), "The source document is marked as unbound but is already registered."); + parent.Id = _sources.Count; + _sources.Add(parent); + } + + Debug.Assert(_sources.Contains(parent), "Expected the source document of the source element to be registered."); + + var tokenType = source.TokenType.ToElementTokenType(); + + if (tokenType is ElementTokenType.StartObject or ElementTokenType.StartArray) + { + var sourceCursor = source._cursor; + + _metaDb.Replace( + cursor: target.Cursor, + tokenType: source.TokenType.ToElementTokenType(), + location: sourceCursor.Chunk, + sizeOrLength: sourceCursor.Row, + sourceDocumentId: parent.Id, + parentRow: _metaDb.GetParent(target.Cursor), + flags: ElementFlags.SourceResult); + return; + } + + _metaDb.Replace( + cursor: target.Cursor, + tokenType: source.TokenType.ToElementTokenType(), + location: value.Location, + sizeOrLength: value.Size, + sourceDocumentId: parent.Id, + parentRow: _metaDb.GetParent(target.Cursor), + flags: ElementFlags.SourceResult); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void AssignNullValue(CompositeResultElement target) + { + _metaDb.Replace( + cursor: target.Cursor, + tokenType: ElementTokenType.Null, + parentRow: _metaDb.GetParent(target.Cursor)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private Cursor WriteStartObject(Cursor parent, int selectionSetId = 0) + { + var flags = ElementFlags.None; + var parentRow = ToIndex(parent); + + if (parentRow < 0) + { + parentRow = 0; + flags = ElementFlags.IsRoot; + } + + return _metaDb.Append( + ElementTokenType.StartObject, + parentRow: parentRow, + operationReferenceId: selectionSetId, + operationReferenceType: OperationReferenceType.SelectionSet, + flags: flags); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteEndObject(Cursor startObjectCursor, int length) + { + _metaDb.Append(ElementTokenType.EndObject); + + _metaDb.SetNumberOfRows(startObjectCursor, (length * 2) + 1); + _metaDb.SetSizeOrLength(startObjectCursor, length); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private Cursor WriteStartArray(Cursor parent, int length = 0) + { + var flags = ElementFlags.None; + var parentRow = ToIndex(parent); + + if (parentRow < 0) + { + parentRow = 0; + flags = ElementFlags.IsRoot; + } + + return _metaDb.Append( + ElementTokenType.StartArray, + sizeOrLength: length, + parentRow: parentRow, + numberOfRows: length + 1, + flags: flags); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteEndArray() => _metaDb.Append(ElementTokenType.EndArray); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteEmptyProperty(Cursor parent, ISelection selection) + { + var flags = ElementFlags.None; + + if (selection.IsInternal) + { + flags = ElementFlags.IsInternal; + } + + if (!selection.IsIncluded(_includeFlags)) + { + flags |= ElementFlags.IsExcluded; + } + + if (selection.Type.Kind is not TypeKind.NonNull) + { + flags |= ElementFlags.IsNullable; + } + + var prop = _metaDb.Append( + ElementTokenType.PropertyName, + parentRow: ToIndex(parent), + operationReferenceId: selection.Id, + operationReferenceType: OperationReferenceType.Selection, + flags: flags); + + _metaDb.Append( + ElementTokenType.None, + parentRow: ToIndex(prop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteEmptyValue(Cursor parent) + { + _metaDb.Append( + ElementTokenType.None, + parentRow: ToIndex(parent)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static int ToIndex(Cursor c) => (c.Chunk * Cursor.RowsPerChunk) + c.Row; + + private static void CheckExpectedType(ElementTokenType expected, ElementTokenType actual) + { + if (expected != actual) + { + throw new ArgumentOutOfRangeException($"Expected {expected} but found {actual}."); + } + } + + public void Dispose() + { + if (!_disposed) + { + _metaDb.Dispose(); + _disposed = true; + } + } +} diff --git a/src/HotChocolate/Core/test/Execution.Tests/HotChocolate.Execution.Tests.csproj b/src/HotChocolate/Core/test/Execution.Tests/HotChocolate.Execution.Tests.csproj index 17b7c9c5d0d..0f46058c97a 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/HotChocolate.Execution.Tests.csproj +++ b/src/HotChocolate/Core/test/Execution.Tests/HotChocolate.Execution.Tests.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/HotChocolate/Core/test/Fetching.Tests/HotChocolate.Fetching.Tests.csproj b/src/HotChocolate/Core/test/Fetching.Tests/HotChocolate.Fetching.Tests.csproj index cd72005885c..e7cb45365b6 100644 --- a/src/HotChocolate/Core/test/Fetching.Tests/HotChocolate.Fetching.Tests.csproj +++ b/src/HotChocolate/Core/test/Fetching.Tests/HotChocolate.Fetching.Tests.csproj @@ -8,7 +8,6 @@ - diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/HotChocolate.Types.NodaTime.Tests.csproj b/src/HotChocolate/Core/test/Types.NodaTime.Tests/HotChocolate.Types.NodaTime.Tests.csproj index d7cdb3cafe4..f773538a6ff 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/HotChocolate.Types.NodaTime.Tests.csproj +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/HotChocolate.Types.NodaTime.Tests.csproj @@ -6,7 +6,6 @@ - diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/HotChocolate.Types.Scalars.Tests.csproj b/src/HotChocolate/Core/test/Types.Scalars.Tests/HotChocolate.Types.Scalars.Tests.csproj index b314284c42c..2d157d98a23 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/HotChocolate.Types.Scalars.Tests.csproj +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/HotChocolate.Types.Scalars.Tests.csproj @@ -6,7 +6,6 @@ - diff --git a/src/HotChocolate/CostAnalysis/src/CostAnalysis/HotChocolate.CostAnalysis.csproj b/src/HotChocolate/CostAnalysis/src/CostAnalysis/HotChocolate.CostAnalysis.csproj index c3bd3025c3f..a6baf2a2152 100644 --- a/src/HotChocolate/CostAnalysis/src/CostAnalysis/HotChocolate.CostAnalysis.csproj +++ b/src/HotChocolate/CostAnalysis/src/CostAnalysis/HotChocolate.CostAnalysis.csproj @@ -6,7 +6,6 @@ - diff --git a/src/HotChocolate/Data/src/Data/HotChocolate.Data.csproj b/src/HotChocolate/Data/src/Data/HotChocolate.Data.csproj index c6d4fbb16bf..f5f21fbc643 100644 --- a/src/HotChocolate/Data/src/Data/HotChocolate.Data.csproj +++ b/src/HotChocolate/Data/src/Data/HotChocolate.Data.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/HotChocolate.Diagnostics.csproj b/src/HotChocolate/Diagnostics/src/Diagnostics/HotChocolate.Diagnostics.csproj index 886bfa3e70d..49885604251 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/HotChocolate.Diagnostics.csproj +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/HotChocolate.Diagnostics.csproj @@ -16,7 +16,7 @@ - + diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/HotChocolate.Fusion.Execution.csproj b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/HotChocolate.Fusion.Execution.csproj index 1ff85c15c78..784fba4a269 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/HotChocolate.Fusion.Execution.csproj +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/HotChocolate.Fusion.Execution.csproj @@ -90,7 +90,6 @@ Transport\Http\Sse\SseReader.cs - SourceResultElement.cs diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.DbRow.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.DbRow.cs index 42785ef9614..0a84bde497f 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.DbRow.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.DbRow.cs @@ -15,7 +15,7 @@ internal readonly struct DbRow // 27 bits for location + 2 bits OpRefType + 3 reserved bits private readonly int _locationAndOpRefType; - // Sign bit for HasComplexChildren + 31 bits for size/length + // A Sign bit for HasComplexChildren + 31 bits for size/length private readonly int _sizeOrLengthUnion; // 4 bits TokenType + 27 bits NumberOfRows + 1 reserved bit diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.MetaDb.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.MetaDb.cs index 5d2d0d0d9c8..bda078eb5bf 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.MetaDb.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.MetaDb.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using HotChocolate.Buffers; using static HotChocolate.Fusion.Text.Json.MetaDbEventSource; namespace HotChocolate.Fusion.Text.Json; @@ -26,7 +27,7 @@ internal static MetaDb CreateForEstimatedRows(int estimatedRows) log.MetaDbCreated(2, estimatedRows, 1); // Rent the first chunk now to avoid branching on first append - chunks[0] = MetaDbMemory.Rent(); + chunks[0] = JsonMemory.Rent(JsonMemoryKind.Metadata); log.ChunkAllocated(2, 0); for (var i = 1; i < chunks.Length; i++) @@ -101,7 +102,7 @@ internal Cursor Append( // if the chunk is empty we did not yet rent any memory for it if (chunk.Length == 0) { - chunk = chunks[chunkIndex] = MetaDbMemory.Rent(); + chunk = chunks[chunkIndex] = JsonMemory.Rent(JsonMemoryKind.Metadata); log.ChunkAllocated(2, chunkIndex); } @@ -291,7 +292,7 @@ internal int GetSizeOrLength(Cursor cursor) internal void SetSizeOrLength(Cursor cursor, int sizeOrLength) { AssertValidCursor(cursor); - Debug.Assert(sizeOrLength >= 0 && sizeOrLength <= int.MaxValue, "SizeOrLength value exceeds 31-bit limit"); + Debug.Assert(sizeOrLength >= 0, "SizeOrLength value exceeds 31-bit limit"); var fieldSpan = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 4); var currentValue = MemoryMarshal.Read(fieldSpan); @@ -350,7 +351,7 @@ private void AssertValidCursor(Cursor cursor) Debug.Assert(absoluteIndex >= 0 && absoluteIndex < maxExclusive, $"Cursor points to row {absoluteIndex}, but only {maxExclusive} rows are valid."); - Debug.Assert(cursor.ByteOffset + DbRow.Size <= MetaDbMemory.BufferSize, "Cursor byte offset out of bounds"); + Debug.Assert(cursor.ByteOffset + DbRow.Size <= JsonMemory.BufferSize, "Cursor byte offset out of bounds"); } public void Dispose() @@ -369,7 +370,7 @@ public void Dispose() break; } - MetaDbMemory.Return(chunk); + JsonMemory.Return(JsonMemoryKind.Metadata, chunk); } chunks.Clear(); diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonMemory.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonMemory.cs deleted file mode 100644 index e11f24de5ff..00000000000 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonMemory.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Buffers; -using System.Runtime.InteropServices; -using HotChocolate.Fusion.Buffers; - -namespace HotChocolate.Fusion.Text.Json; - -/// -/// Manages the memory for storing JSON data. -/// -public static class JsonMemory -{ - public const int BufferSize = 1 << 17; - - private static readonly FixedSizeArrayPool s_pool = new(1, BufferSize, 128 * 6, preAllocate: true); - private static readonly ArrayPool s_chunkPool = ArrayPool.Shared; - - public static byte[] Rent() - => s_pool.Rent(); - - public static byte[][] RentRange(int requiredChunks) - { - var chunks = s_chunkPool.Rent(requiredChunks); - - for (var i = 0; i < requiredChunks; i++) - { - chunks[i] = s_pool.Rent(); - } - - return chunks; - } - - public static void Return(byte[] chunk) - => s_pool.Return(chunk); - - public static void Return(List chunks) - { - ArgumentNullException.ThrowIfNull(chunks); - - foreach (var chunk in CollectionsMarshal.AsSpan(chunks)) - { - s_pool.Return(chunk); - } - } - - public static void Return(byte[][] chunks, int usedChunks) - { - ArgumentNullException.ThrowIfNull(chunks); - - foreach (var chunk in chunks.AsSpan(0, usedChunks)) - { - s_pool.Return(chunk); - } - } -} diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/MetaDbMemory.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/MetaDbMemory.cs deleted file mode 100644 index 20c4232e4dd..00000000000 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/MetaDbMemory.cs +++ /dev/null @@ -1,17 +0,0 @@ -using HotChocolate.Fusion.Buffers; - -namespace HotChocolate.Fusion.Text.Json; - -public static class MetaDbMemory -{ - public const int BufferSize = 1 << 17; - public const int RowsPerChunk = 6552; - - private static readonly FixedSizeArrayPool s_pool = new(2, BufferSize, 128 * 6, preAllocate: true); - - public static byte[] Rent() - => s_pool.Rent(); - - public static void Return(byte[] chunk) - => s_pool.Return(chunk); -} diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.MetaDb.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.MetaDb.cs index 0e5b4815f52..08fc5aadc6e 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.MetaDb.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.MetaDb.cs @@ -3,6 +3,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text.Json; +using HotChocolate.Buffers; using static HotChocolate.Fusion.Text.Json.MetaDbEventSource; namespace HotChocolate.Fusion.Text.Json; @@ -23,7 +24,7 @@ internal struct MetaDb : IDisposable static MetaDb() { Debug.Assert( - MetaDbMemory.BufferSize >= Cursor.ChunkBytes, + JsonMemory.BufferSize >= Cursor.ChunkBytes, "MetaDb.BufferSize must match Cursor.ChunkBytes for index math to align."); } @@ -36,7 +37,7 @@ internal static MetaDb CreateForEstimatedRows(int estimatedRows) log.MetaDbCreated(1, estimatedRows, 1); // Rent the first chunk now to avoid branching on first append - chunks[0] = MetaDbMemory.Rent(); + chunks[0] = JsonMemory.Rent(JsonMemoryKind.Metadata); log.ChunkAllocated(1, 0); for (var i = 1; i < chunks.Length; i++) @@ -101,7 +102,7 @@ internal Cursor Append( // if the chunk is empty we did not yet rent any memory for it if (chunk.Length == 0) { - chunk = chunks[chunkIndex] = MetaDbMemory.Rent(); + chunk = chunks[chunkIndex] = JsonMemory.Rent(JsonMemoryKind.Metadata); log.ChunkAllocated(1, chunkIndex); } @@ -215,7 +216,7 @@ public void Dispose() break; } - MetaDbMemory.Return(chunk); + JsonMemory.Return(JsonMemoryKind.Metadata, chunk); } chunks.Clear(); diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Parse.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Parse.cs index f7af9525d73..6c3fbf84af7 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Parse.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Parse.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Runtime.CompilerServices; using System.Text.Json; +using HotChocolate.Buffers; namespace HotChocolate.Fusion.Text.Json; @@ -62,7 +63,7 @@ internal static SourceResultDocument ParseSingleSegment( { foreach (var chunk in dataChunksSpan) { - JsonMemory.Return(chunk); + JsonMemory.Return(JsonMemoryKind.Json, chunk); } dataChunksSpan.Clear(); @@ -121,7 +122,7 @@ internal static SourceResultDocument ParseMultipleSegments( { foreach (var chunk in dataChunksSpan) { - JsonMemory.Return(chunk); + JsonMemory.Return(JsonMemoryKind.Json, chunk); } dataChunksSpan.Clear(); diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs index 31bce68fb06..b51dc541331 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs @@ -2,6 +2,7 @@ using System.Runtime.CompilerServices; using System.Text; using System.Text.Json; +using HotChocolate.Buffers; namespace HotChocolate.Fusion.Text.Json; @@ -228,7 +229,7 @@ public void Dispose() { if (_pooledMemory) { - JsonMemory.Return(_dataChunks, _usedChunks); + JsonMemory.Return(JsonMemoryKind.Json, _dataChunks, _usedChunks); if (_dataChunks.Length > 1) { diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocumentBuilder.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocumentBuilder.cs index 2c5c1b28a13..57a69863033 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocumentBuilder.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocumentBuilder.cs @@ -116,7 +116,7 @@ public SourceResultDocument Build() } // Rent the first chunk - chunks[0] = JsonMemory.Rent(); + chunks[0] = JsonMemory.Rent(JsonMemoryKind.Json); var currentChunkIndex = 0; var currentChunkOffset = 0; @@ -132,7 +132,7 @@ public SourceResultDocument Build() } catch { - JsonMemory.Return(chunks, currentChunkIndex + 1); + JsonMemory.Return(JsonMemoryKind.Json, chunks, currentChunkIndex + 1); ArrayPool.Shared.Return(chunks); throw; } @@ -334,7 +334,7 @@ private static void EnsureChunkCapacity( { Debug.Fail("foo"); - chunks[currentChunkIndex] = JsonMemory.Rent(); + chunks[currentChunkIndex] = JsonMemory.Rent(JsonMemoryKind.Json); } } diff --git a/src/HotChocolate/MongoDb/src/Data/HotChocolate.Data.MongoDb.csproj b/src/HotChocolate/MongoDb/src/Data/HotChocolate.Data.MongoDb.csproj index 35ad9d7e70c..5a8c1cfd60f 100644 --- a/src/HotChocolate/MongoDb/src/Data/HotChocolate.Data.MongoDb.csproj +++ b/src/HotChocolate/MongoDb/src/Data/HotChocolate.Data.MongoDb.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/HotChocolate/MongoDb/src/Types/HotChocolate.Types.MongoDb.csproj b/src/HotChocolate/MongoDb/src/Types/HotChocolate.Types.MongoDb.csproj index def8e832c74..3be34f6d613 100644 --- a/src/HotChocolate/MongoDb/src/Types/HotChocolate.Types.MongoDb.csproj +++ b/src/HotChocolate/MongoDb/src/Types/HotChocolate.Types.MongoDb.csproj @@ -9,7 +9,6 @@ - diff --git a/src/HotChocolate/Spatial/src/Types/HotChocolate.Types.Spatial.csproj b/src/HotChocolate/Spatial/src/Types/HotChocolate.Types.Spatial.csproj index 505cf7f2374..52a2228e685 100644 --- a/src/HotChocolate/Spatial/src/Types/HotChocolate.Types.Spatial.csproj +++ b/src/HotChocolate/Spatial/src/Types/HotChocolate.Types.Spatial.csproj @@ -12,7 +12,6 @@ - diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Buffers/FixedSizeArrayPool.cs b/src/HotChocolate/Utilities/src/Utilities.Buffers/FixedSizeArrayPool.cs similarity index 90% rename from src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Buffers/FixedSizeArrayPool.cs rename to src/HotChocolate/Utilities/src/Utilities.Buffers/FixedSizeArrayPool.cs index 46b3c20f5a1..a8e4df61cba 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Buffers/FixedSizeArrayPool.cs +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/FixedSizeArrayPool.cs @@ -1,8 +1,8 @@ using System.Diagnostics; -using static HotChocolate.Fusion.Buffers.FixedSizeArrayPoolEventSource; -using static HotChocolate.Fusion.Properties.FusionExecutionResources; +using static HotChocolate.Buffers.FixedSizeArrayPoolEventSource; +using static HotChocolate.Buffers.Properties.BuffersResources; -namespace HotChocolate.Fusion.Buffers; +namespace HotChocolate.Buffers; internal sealed class FixedSizeArrayPool { @@ -45,7 +45,14 @@ public byte[] Rent() public void Return(byte[] array) { +#if NET8_0_OR_GREATER ArgumentNullException.ThrowIfNull(array); +#else + if(array is null) + { + throw new ArgumentNullException(nameof(array)); + } +#endif if (array.Length != _arraySize) { @@ -149,7 +156,11 @@ internal Bucket(int poolId, int bufferLength, int numberOfBuffers, bool preAlloc internal bool Return(byte[] array) { - Debug.Assert(array.Length == _bufferLength); + // if the returned array has not the expected size we will reject it without throwing an error. + if (array.Length != _bufferLength) + { + return false; + } var returned = false; var lockTaken = false; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Buffers/FixedSizeArrayPoolEventSource.cs b/src/HotChocolate/Utilities/src/Utilities.Buffers/FixedSizeArrayPoolEventSource.cs similarity index 95% rename from src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Buffers/FixedSizeArrayPoolEventSource.cs rename to src/HotChocolate/Utilities/src/Utilities.Buffers/FixedSizeArrayPoolEventSource.cs index 0f550556dd3..d219a9e4e2b 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Buffers/FixedSizeArrayPoolEventSource.cs +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/FixedSizeArrayPoolEventSource.cs @@ -1,8 +1,8 @@ using System.Diagnostics.Tracing; -namespace HotChocolate.Fusion.Buffers; +namespace HotChocolate.Buffers; -[EventSource(Name = "HotChocolate-Fusion-FixedSizeArrayPool")] +[EventSource(Name = "HotChocolate-Buffers-FixedSizeArrayPool")] internal sealed class FixedSizeArrayPoolEventSource : EventSource { public static readonly FixedSizeArrayPoolEventSource Log = new(); diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/FixedSizeArrayPoolKinds.cs b/src/HotChocolate/Utilities/src/Utilities.Buffers/FixedSizeArrayPoolKinds.cs new file mode 100644 index 00000000000..2f28bf87fb9 --- /dev/null +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/FixedSizeArrayPoolKinds.cs @@ -0,0 +1,6 @@ +namespace HotChocolate.Buffers; + +internal static class FixedSizeArrayPoolKinds +{ + public const int JsonMemory = 1; +} diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj b/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj index c8dbaec6ad7..d6931ad087f 100644 --- a/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj @@ -16,6 +16,11 @@ true + + + + + diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemory.cs b/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemory.cs new file mode 100644 index 00000000000..9b21a6fd4d5 --- /dev/null +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemory.cs @@ -0,0 +1,102 @@ +using System.Buffers; +#if NET8_0_OR_GREATER +using System.Runtime.InteropServices; +#endif +using static HotChocolate.Buffers.JsonMemoryEventSource; + +namespace HotChocolate.Buffers; + +/// +/// Manages the memory for storing JSON data. +/// +internal static class JsonMemory +{ + public const int BufferSize = 1 << 17; + + private static FixedSizeArrayPool s_pool = new(FixedSizeArrayPoolKinds.JsonMemory, BufferSize, 128); + private static readonly ArrayPool s_chunkPool = ArrayPool.Shared; + + public static void Reconfigure(Func factory) + { +#if NET8_0_OR_GREATER + ArgumentNullException.ThrowIfNull(factory); +#else + if(factory is null) + { + throw new ArgumentNullException(nameof(factory)); + } +#endif + + s_pool = factory() ?? throw new InvalidOperationException("The factory must create a valid pool."); + Log.ReconfiguredPool(); + } + + public static byte[] Rent(JsonMemoryKind kind) + { + var buffer = s_pool.Rent(); + Log.BufferRented(kind, bufferCount: 1); + return buffer; + } + + public static byte[][] RentRange(JsonMemoryKind kind, int requiredChunks) + { + var chunks = s_chunkPool.Rent(requiredChunks); + + for (var i = 0; i < requiredChunks; i++) + { + chunks[i] = s_pool.Rent(); + } + + Log.BufferReturned(kind, requiredChunks); + return chunks; + } + + public static void Return(JsonMemoryKind kind, byte[] chunk) + { + s_pool.Return(chunk); + Log.BufferReturned(kind, 1); + } + + public static void Return(JsonMemoryKind kind, byte[][] chunks, int usedChunks) + { +#if NET8_0_OR_GREATER + ArgumentNullException.ThrowIfNull(chunks); +#else + if (chunks is null) + { + throw new ArgumentNullException(nameof(chunks)); + } +#endif + + foreach (var chunk in chunks.AsSpan(0, usedChunks)) + { + s_pool.Return(chunk); + } + + Log.BufferReturned(kind, usedChunks); + } + + public static void Return(JsonMemoryKind kind, List chunks) + { +#if NET8_0_OR_GREATER + ArgumentNullException.ThrowIfNull(chunks); + + foreach (var chunk in CollectionsMarshal.AsSpan(chunks)) + { + s_pool.Return(chunk); + } +#else + if (chunks is null) + { + throw new ArgumentNullException(nameof(chunks)); + } + + foreach (var chunk in chunks) + { + s_pool.Return(chunk); + } +#endif + + Log.BufferReturned(kind, chunks.Count); + } +} diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemoryEventSource.cs b/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemoryEventSource.cs new file mode 100644 index 00000000000..58799402b72 --- /dev/null +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemoryEventSource.cs @@ -0,0 +1,47 @@ +using System.Diagnostics.Tracing; + +namespace HotChocolate.Buffers; + +[EventSource(Name = "HotChocolate-Buffers-JsonMemory")] +internal sealed class JsonMemoryEventSource : EventSource +{ + public static readonly JsonMemoryEventSource Log = new(); + + private JsonMemoryEventSource() { } + + [Event( + eventId: 1, + Level = EventLevel.Informational, + Message = "Pool reconfigured.")] + public void ReconfiguredPool() + { + if (IsEnabled(EventLevel.Verbose, EventKeywords.None)) + { + WriteEvent(1); + } + } + + [Event( + eventId: 2, + Level = EventLevel.Verbose, + Message = "Buffer rented (Kind={0}, BufferCount={1})")] + public void BufferRented(JsonMemoryKind kind, int bufferCount) + { + if (IsEnabled(EventLevel.Verbose, EventKeywords.None)) + { + WriteEvent(2, kind, bufferCount); + } + } + + [Event( + eventId: 3, + Level = EventLevel.Verbose, + Message = "Buffer returned (Kind={0}, BufferCount={1})")] + public void BufferReturned(JsonMemoryKind kind, int bufferCount) + { + if (IsEnabled(EventLevel.Verbose, EventKeywords.None)) + { + WriteEvent(3, kind, bufferCount); + } + } +} diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemoryKind.cs b/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemoryKind.cs new file mode 100644 index 00000000000..d4016d2f620 --- /dev/null +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonMemoryKind.cs @@ -0,0 +1,7 @@ +namespace HotChocolate.Buffers; + +internal enum JsonMemoryKind +{ + Metadata = 1, + Json = 2 +} diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/Properties/BuffersResources.Designer.cs b/src/HotChocolate/Utilities/src/Utilities.Buffers/Properties/BuffersResources.Designer.cs index 6388029e0e7..a02fc93a0b6 100644 --- a/src/HotChocolate/Utilities/src/Utilities.Buffers/Properties/BuffersResources.Designer.cs +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/Properties/BuffersResources.Designer.cs @@ -50,5 +50,11 @@ internal static string ArrayWriter_Advance_BufferOverflow { return ResourceManager.GetString("ArrayWriter_Advance_BufferOverflow", resourceCulture); } } + + internal static string FixedSizeArrayPool_Return_InvalidArraySize { + get { + return ResourceManager.GetString("FixedSizeArrayPool_Return_InvalidArraySize", resourceCulture); + } + } } } diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/Properties/BuffersResources.resx b/src/HotChocolate/Utilities/src/Utilities.Buffers/Properties/BuffersResources.resx index 5449972ccdc..05fdeb25e4c 100644 --- a/src/HotChocolate/Utilities/src/Utilities.Buffers/Properties/BuffersResources.resx +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/Properties/BuffersResources.resx @@ -21,4 +21,7 @@ Cannot advance past the end of the buffer. + + Buffer size {0} does not match expected chunk size {1} + From 2505534f880a8b0ef58361e463836ab21469c980 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Wed, 26 Nov 2025 19:53:44 +0100 Subject: [PATCH 005/144] Deprectaion notice --- .../hotchocolate/v16/migrating/migrate-from-15-to-16.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md index 68d903f035e..ef350da0e9d 100644 --- a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md +++ b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md @@ -278,6 +278,12 @@ If you need the old behavior, use can still use the non-generic `ID`-attribute a Previously the `TryConfigure` or `OnConfigure` methods carried a non-nullable parameter of the member the descriptor attribute was annotated to. With the new source generator we moved away from pure reflection based APIs. This means that when you use the source generator +## Merged Assemblies HotChocolate.Types, HotChocolate.Execution, HotChocolate.Fetching + +With Hot Chocolate 16 we introduced a lot more abstractions, meaning we pulled out abstractions of the type system or the execution into separate libraries. But at the same time we simplified the implementation of the type system and the execution by moving the implementations of HotChocolate.Execution and HotChocolate.Fetching into HotChocolate.Types. This allowed us to simplify the implementation and make it more efficient. + +So, if you were referencing HotChocolate.Execution or HotChocolate.Fetching directly make sure to remove references to these libraries and replace them with HotChocolate.Types. + # Deprecations Things that will continue to function this release, but we encourage you to move away from. From a7a87ca0815e5ae81a25cb40d15b003e3184c324 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 27 Nov 2025 10:25:25 +0100 Subject: [PATCH 006/144] wip --- src/All.slnx | 1 - src/HotChocolate/Core/HotChocolate.Core.slnx | 1 - .../src/Types.Shared/WellKnownDirectives.cs | 13 - .../Core/src/Types.Shared/WellKnownTypes.cs | 20 - .../Processing/IOptionalSelection.cs | 2 +- .../Types/Execution/Processing/Operation.cs | 10 + .../Core/src/Types/HotChocolate.Types.csproj | 44 +- .../Properties/TextJsonResources.Designer.cs | 90 +++ .../Types/Properties/TextJsonResources.resx | 42 ++ .../Core/src/Types/SchemaBuilder.Setup.cs | 1 - .../Core/src/Types/SchemaPrinter.cs | 1 - .../Text/Json/CompositeResultProperty.cs | 123 +++ .../Types/Text/Json/ResultDocument.Text.cs | 205 +++++ .../Json/ResultDocument.TryGetProperty.cs | 251 ++++++ .../Text/Json/ResultDocument.TryGetValue.cs | 226 ++++++ .../Types/Text/Json/ResultDocument.WriteTo.cs | 313 ++++++++ .../src/Types/Text/Json/ResultDocument.cs | 60 +- .../Json/ResultElement.ArrayEnumerator.cs | 100 +++ .../Json/ResultElement.ObjectEnumerator.cs | 127 ++++ .../Core/src/Types/Text/Json/ResultElement.cs | 713 ++++++++++++++++++ .../Text/Json/JsonReaderHelper.cs | 7 + .../Fusion.Execution/Text/Json/ThrowHelper.cs | 7 + .../src/Primitives/Types}/BuiltInTypes.cs | 42 +- .../Types/IntrospectionTypeNames.cs | 15 + ...otChocolate.Utilities.Introspection.csproj | 2 +- .../IntrospectionClient.cs | 1 + .../IntrospectionFormatter.cs | 6 +- 27 files changed, 2325 insertions(+), 98 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Types.Shared/WellKnownDirectives.cs delete mode 100644 src/HotChocolate/Core/src/Types.Shared/WellKnownTypes.cs create mode 100644 src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs create mode 100644 src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/CompositeResultProperty.cs create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.Text.cs create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetProperty.cs create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetValue.cs create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ArrayEnumerator.cs create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ObjectEnumerator.cs create mode 100644 src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs rename src/HotChocolate/{Core/src/Types.Shared => Primitives/src/Primitives/Types}/BuiltInTypes.cs (60%) create mode 100644 src/HotChocolate/Primitives/src/Primitives/Types/IntrospectionTypeNames.cs diff --git a/src/All.slnx b/src/All.slnx index d6a71a909b4..a0dedb768b2 100644 --- a/src/All.slnx +++ b/src/All.slnx @@ -110,7 +110,6 @@ - diff --git a/src/HotChocolate/Core/HotChocolate.Core.slnx b/src/HotChocolate/Core/HotChocolate.Core.slnx index 2f8095bec3b..64c576bc86a 100644 --- a/src/HotChocolate/Core/HotChocolate.Core.slnx +++ b/src/HotChocolate/Core/HotChocolate.Core.slnx @@ -27,7 +27,6 @@ - diff --git a/src/HotChocolate/Core/src/Types.Shared/WellKnownDirectives.cs b/src/HotChocolate/Core/src/Types.Shared/WellKnownDirectives.cs deleted file mode 100644 index 62a1fecea18..00000000000 --- a/src/HotChocolate/Core/src/Types.Shared/WellKnownDirectives.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace HotChocolate.Utilities.Introspection; - -internal static class WellKnownDirectives -{ - public const string Skip = "skip"; - public const string Include = "include"; - public const string Defer = "defer"; - public const string Stream = "stream"; - public const string Deprecated = "deprecated"; - public const string SpecifiedBy = "specifiedBy"; - public const string DeprecationReasonArgument = "reason"; - public const string OneOf = "oneOf"; -} diff --git a/src/HotChocolate/Core/src/Types.Shared/WellKnownTypes.cs b/src/HotChocolate/Core/src/Types.Shared/WellKnownTypes.cs deleted file mode 100644 index 3749d2bfa4f..00000000000 --- a/src/HotChocolate/Core/src/Types.Shared/WellKnownTypes.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace HotChocolate.Utilities.Introspection; - -internal static class WellKnownTypes -{ -#pragma warning disable IDE1006, InconsistentNaming - public const string __Directive = "__Directive"; - public const string __DirectiveLocation = "__DirectiveLocation"; - public const string __EnumValue = "__EnumValue"; - public const string __Field = "__Field"; - public const string __InputValue = "__InputValue"; - public const string __Schema = "__Schema"; - public const string __Type = "__Type"; - public const string __TypeKind = "__TypeKind"; -#pragma warning restore IDE1006, InconsistentNaming - public const string String = "String"; - public const string Boolean = "Boolean"; - public const string Float = "Float"; - public const string ID = "ID"; - public const string Int = "Int"; -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/IOptionalSelection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/IOptionalSelection.cs index 8345292c0d3..fb6839101d4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/IOptionalSelection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/IOptionalSelection.cs @@ -27,5 +27,5 @@ public interface IOptionalSelection /// /// True, if this selection shall be included into the request execution. /// - bool IsIncluded(long includeFlags, bool allowInternals = false); + bool IsIncluded(ulong includeFlags, bool allowInternals = false); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs index df2bf92e50e..0c2e3384b3f 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs @@ -200,6 +200,16 @@ internal void Seal( } } + public SelectionSet GetSelectionSetById(int selectionSetId) + { + + } + + public Selection GetSelectionById(int selectionSetId) + { + + } + public IEnumerator GetEnumerator() { foreach (var selectionVariant in _selectionVariants) diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index bf2bed99fa2..ae9e6fe3046 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -77,7 +77,6 @@ - @@ -89,10 +88,18 @@ Text\Json\JsonHelpers.cs + + Text\Json\JsonReaderHelper.cs + + Text\Json\MetaDbEventSource.cs + + Text\Json\ThrowHelper.cs + + ResultDocument.cs @@ -104,6 +111,36 @@ ResultDocument.cs + + + ResultDocument.cs + + + + ResultDocument.cs + + + + ResultDocument.cs + + + + ResultDocument.cs + + + + ResultElement.cs + + + + ResultElement.cs + + + + True + True + TextJsonResources.resx + @@ -200,6 +237,11 @@ ResXFileCodeGenerator Resources.Designer.cs + + + ResXFileCodeGenerator + TextJsonResources.Designer.cs + diff --git a/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs new file mode 100644 index 00000000000..47f922f9119 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs @@ -0,0 +1,90 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace HotChocolate.Properties { + using System; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class TextJsonResources { + + private static System.Resources.ResourceManager resourceMan; + + private static System.Globalization.CultureInfo resourceCulture; + + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal TextJsonResources() { + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager { + get { + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("HotChocolate.Properties.TextJsonResources", typeof(TextJsonResources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static string CompositeResultElement_GetBoolean_JsonElementHasWrongType { + get { + return ResourceManager.GetString("CompositeResultElement_GetBoolean_JsonElementHasWrongType", resourceCulture); + } + } + + internal static string SourceResultElement_GetBoolean_JsonElementHasWrongType { + get { + return ResourceManager.GetString("SourceResultElement_GetBoolean_JsonElementHasWrongType", resourceCulture); + } + } + + internal static string Rethrowable { + get { + return ResourceManager.GetString("Rethrowable", resourceCulture); + } + } + + internal static string JsonReaderHelper_TranscodeHelper_CannotTranscodeInvalidUtf8 { + get { + return ResourceManager.GetString("JsonReaderHelper_TranscodeHelper_CannotTranscodeInvalidUtf8", resourceCulture); + } + } + + internal static string ThrowHelper_ReadInvalidUTF16 { + get { + return ResourceManager.GetString("ThrowHelper_ReadInvalidUTF16", resourceCulture); + } + } + + internal static string ThrowHelper_ReadIncompleteUTF16 { + get { + return ResourceManager.GetString("ThrowHelper_ReadIncompleteUTF16", resourceCulture); + } + } + + internal static string FixedSizeArrayPool_Return_InvalidArraySize { + get { + return ResourceManager.GetString("FixedSizeArrayPool_Return_InvalidArraySize", resourceCulture); + } + } + } +} diff --git a/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx new file mode 100644 index 00000000000..9375281edf6 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx @@ -0,0 +1,42 @@ + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The requested operation requires an element of type '{0}', but the target element has type '{1}'. + + + The requested operation requires an element of type '{0}', but the target element has type '{1}'. + + + HotChocolate.Text.Json.Rethrowable + + + Cannot transcode invalid UTF-8 JSON text to UTF-16 string. + + + Cannot read invalid UTF-16 JSON text as string. Invalid surrogate value: '{0}'. + + + Cannot read incomplete UTF-16 JSON text as string with missing low surrogate. + + + Buffer size {0} does not match expected chunk size {1} + + diff --git a/src/HotChocolate/Core/src/Types/SchemaBuilder.Setup.cs b/src/HotChocolate/Core/src/Types/SchemaBuilder.Setup.cs index c274967f213..de9f72c32a7 100644 --- a/src/HotChocolate/Core/src/Types/SchemaBuilder.Setup.cs +++ b/src/HotChocolate/Core/src/Types/SchemaBuilder.Setup.cs @@ -12,7 +12,6 @@ using HotChocolate.Types.Pagination; using HotChocolate.Types.Relay; using HotChocolate.Utilities; -using HotChocolate.Utilities.Introspection; using Microsoft.Extensions.DependencyInjection.Extensions; namespace HotChocolate; diff --git a/src/HotChocolate/Core/src/Types/SchemaPrinter.cs b/src/HotChocolate/Core/src/Types/SchemaPrinter.cs index c0e50daa958..4e4449efb4d 100644 --- a/src/HotChocolate/Core/src/Types/SchemaPrinter.cs +++ b/src/HotChocolate/Core/src/Types/SchemaPrinter.cs @@ -4,7 +4,6 @@ using HotChocolate.Language.Utilities; using HotChocolate.Types; using HotChocolate.Utilities; -using HotChocolate.Utilities.Introspection; namespace HotChocolate; diff --git a/src/HotChocolate/Core/src/Types/Text/Json/CompositeResultProperty.cs b/src/HotChocolate/Core/src/Types/Text/Json/CompositeResultProperty.cs new file mode 100644 index 00000000000..d34e5576f8c --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/CompositeResultProperty.cs @@ -0,0 +1,123 @@ +using System.Diagnostics; +using System.Text.Json; +using HotChocolate.Fusion.Execution.Nodes; + +namespace HotChocolate.Fusion.Text.Json; + +/// +/// Represents a single property for a JSON object. +/// +[DebuggerDisplay("{DebuggerDisplay,nq}")] +public readonly struct CompositeResultProperty +{ + internal CompositeResultProperty(CompositeResultElement value) + { + Value = value; + } + + /// + /// The value of this property. + /// + public CompositeResultElement Value { get; } + + /// + /// The name of this property. + /// This allocates a new string instance for each call. + /// + public string Name => Value.GetPropertyName(); + + public Selection? Selection => Value.Selection; + + public Selection GetRequiredSelection() => Value.AssertSelection(); + + /// + /// Compares to the name of this property. + /// + /// The text to compare against. + /// + /// if the name of this property matches , + /// otherwise. + /// + /// + /// This value's is not . + /// + /// + /// This method is functionally equal to doing an ordinal comparison of and + /// , but can avoid creating the string instance. + /// + public bool NameEquals(string? text) + { + return NameEquals(text.AsSpan()); + } + + /// + /// Compares the text represented by to the name of this property. + /// + /// The UTF-8 encoded text to compare against. + /// + /// if the name of this property has the same UTF-8 encoding as + /// , otherwise. + /// + /// + /// This value's is not . + /// + /// + /// This method is functionally equal to doing an ordinal comparison of and + /// , but can avoid creating the string instance. + /// + public bool NameEquals(ReadOnlySpan utf8Text) + { + return Value.TextEqualsHelper(utf8Text, isPropertyName: true, shouldUnescape: true); + } + + /// + /// Compares to the name of this property. + /// + /// The text to compare against. + /// + /// if the name of this property matches , + /// otherwise. + /// + /// + /// This value's is not . + /// + /// + /// This method is functionally equal to doing an ordinal comparison of and + /// , but can avoid creating the string instance. + /// + public bool NameEquals(ReadOnlySpan text) + { + return Value.TextEqualsHelper(text, isPropertyName: true); + } + + internal bool EscapedNameEquals(ReadOnlySpan utf8Text) + { + return Value.TextEqualsHelper(utf8Text, isPropertyName: true, shouldUnescape: false); + } + + internal ReadOnlySpan NameSpan => Value.GetPropertyNameRaw(); + + /// + /// Provides a representation of the property for + /// debugging purposes. + /// + /// + /// A string containing the un-interpreted value of the property, beginning + /// at the declaring open-quote and ending at the last character that is part of + /// the value. + /// + public override string ToString() + { + return Value.GetPropertyRawText(); + } + + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private string DebuggerDisplay + => Value.ValueKind == JsonValueKind.Undefined ? "" : $"\"{ToString()}\""; + + public void Deconstruct(out Selection selection, out CompositeResultElement value) + { + selection = GetRequiredSelection(); + value = Value; + } +} diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.Text.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.Text.cs new file mode 100644 index 00000000000..510e4dc3d01 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.Text.cs @@ -0,0 +1,205 @@ +using System.Buffers; +using System.Diagnostics; +using System.Text.Unicode; + +namespace HotChocolate.Text.Json; + +public sealed partial class ResultDocument +{ + internal string? GetString(Cursor cursor, ElementTokenType expectedType) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + var tokenType = row.TokenType; + + if (tokenType == ElementTokenType.Null) + { + return null; + } + + CheckExpectedType(expectedType, tokenType); + + var segment = ReadRawValue(row); + + if (tokenType is ElementTokenType.String) + { + segment = segment[1..^1]; + } + + return row.HasComplexChildren + ? JsonReaderHelper.GetUnescapedString(segment) + : JsonReaderHelper.TranscodeHelper(segment); + } + + internal string GetRequiredString(Cursor cursor, ElementTokenType expectedType) + { + var value = GetString(cursor, expectedType); + + if (value is null) + { + throw new InvalidOperationException("The element value is null."); + } + + return value; + } + + internal string GetNameOfPropertyValue(Cursor valueCursor) + { + // The property name is one row before the property value + return GetString(valueCursor + (-1), ElementTokenType.PropertyName)!; + } + + internal ReadOnlySpan GetPropertyNameRaw(Cursor valueCursor) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + // The property name is stored one row before the value + var nameCursor = valueCursor + (-1); + var row = _metaDb.Get(nameCursor); + Debug.Assert(row.TokenType is ElementTokenType.PropertyName); + + return ReadRawValue(row); + } + + internal string GetRawValueAsString(Cursor cursor) + { + var segment = GetRawValue(cursor, includeQuotes: true); + return JsonReaderHelper.TranscodeHelper(segment); + } + + internal ReadOnlySpan GetRawValue(Cursor cursor, bool includeQuotes) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + + if (row.IsSimpleValue) + { + if (!includeQuotes && row.TokenType == ElementTokenType.String) + { + // Skip opening/closing quotes + return ReadRawValue(row)[1..^1]; + } + + return ReadRawValue(row); + } + + // TODO: this is more complex with the new design, we gonna tackle this later. + // var endCursor = GetEndCursor(cursor, includeEndElement: false); + // var start = row.Location; + // var endRow = _metaDb.Get(endCursor); + // return _utf8Json.Slice(start, endRow.Location - start + endRow.SizeOrLength); + throw new NotImplementedException(); + } + + internal string GetPropertyRawValueAsString(Cursor valueCursor) + { + var segment = GetPropertyRawValue(valueCursor); + return JsonReaderHelper.TranscodeHelper(segment); + } + + private ReadOnlySpan GetPropertyRawValue(Cursor valueCursor) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + // The property name is stored one row before the value + Debug.Assert(_metaDb.GetElementTokenType(valueCursor - 1) == ElementTokenType.PropertyName); + + var row = _metaDb.Get(valueCursor); + + if (row.IsSimpleValue) + { + return ReadRawValue(row); + } + + // var endCursor = GetEndCursor(valueCursor, includeEndElement: false); + // var endRow = _metaDb.Get(endCursor); + // return _utf8Json.Slice(start, end - start); + throw new NotSupportedException("Properties are expected to be simple values."); + } + + internal bool TextEquals(Cursor cursor, ReadOnlySpan otherText, bool isPropertyName) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + byte[]? otherUtf8TextArray = null; + + var length = checked(otherText.Length * JsonConstants.MaxExpansionFactorWhileTranscoding); + var otherUtf8Text = length <= JsonConstants.StackallocByteThreshold + ? stackalloc byte[JsonConstants.StackallocByteThreshold] + : (otherUtf8TextArray = ArrayPool.Shared.Rent(length)); + + var status = Utf8.FromUtf16( + otherText, otherUtf8Text, out var charsRead, out var written, + replaceInvalidSequences: false, isFinalBlock: true); + + Debug.Assert(status is OperationStatus.Done or + OperationStatus.DestinationTooSmall or + OperationStatus.InvalidData); + Debug.Assert(charsRead == otherText.Length || status is not OperationStatus.Done); + + bool result; + if (status == OperationStatus.InvalidData) + { + result = false; + } + else + { + Debug.Assert(status == OperationStatus.Done); + result = TextEquals(cursor, otherUtf8Text[..written], isPropertyName, shouldUnescape: true); + } + + if (otherUtf8TextArray != null) + { + otherUtf8Text[..written].Clear(); + ArrayPool.Shared.Return(otherUtf8TextArray); + } + + return result; + } + + internal bool TextEquals(Cursor cursor, ReadOnlySpan otherUtf8Text, bool isPropertyName, bool shouldUnescape) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var matchCursor = isPropertyName ? cursor + (-1) : cursor; + var row = _metaDb.Get(matchCursor); + + CheckExpectedType( + isPropertyName ? ElementTokenType.PropertyName : ElementTokenType.String, + row.TokenType); + + var segment = ReadRawValue(row); + + if (!isPropertyName) + { + segment = segment[1..^1]; + } + + if (otherUtf8Text.Length > segment.Length || (!shouldUnescape && otherUtf8Text.Length != segment.Length)) + { + return false; + } + + if (row.HasComplexChildren && shouldUnescape) + { + if (otherUtf8Text.Length < segment.Length / JsonConstants.MaxExpansionFactorWhileEscaping) + { + return false; + } + + var idx = segment.IndexOf(JsonConstants.BackSlash); + Debug.Assert(idx != -1); + + if (!otherUtf8Text.StartsWith(segment[..idx])) + { + return false; + } + + return JsonReaderHelper.UnescapeAndCompare(segment[idx..], otherUtf8Text[idx..]); + } + + return segment.SequenceEqual(otherUtf8Text); + } +} diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetProperty.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetProperty.cs new file mode 100644 index 00000000000..9fc7679a472 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetProperty.cs @@ -0,0 +1,251 @@ +using System.Buffers; +using System.Diagnostics; + +namespace HotChocolate.Text.Json; + +public sealed partial class ResultDocument +{ + internal bool TryGetNamedPropertyValue( + Cursor startCursor, + string propertyName, + out CompositeResultElement value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + (startCursor, var tokenType) = _metaDb.GetStartCursor(startCursor); + CheckExpectedType(ElementTokenType.StartObject, tokenType); + + var numberOfRows = _metaDb.GetNumberOfRows(startCursor); + + // Only one row means it was EndObject. + if (numberOfRows == 1) + { + value = default; + return false; + } + + var row = _metaDb.Get(startCursor); + if (row.OperationReferenceType is OperationReferenceType.SelectionSet) + { + var selectionSet = _operation.GetSelectionSetById(row.OperationReferenceId); + if (selectionSet.TryGetSelection(propertyName, out var selection)) + { + var propertyIndex = selection.Id - selectionSet.Id - 1; + var propertyRowIndex = (propertyIndex * 2) + 1; + var propertyCursor = startCursor + propertyRowIndex; + Debug.Assert(_metaDb.GetElementTokenType(propertyCursor) is ElementTokenType.PropertyName); + Debug.Assert(_metaDb.Get(propertyCursor).OperationReferenceId == selection.Id); + value = new CompositeResultElement(this, propertyCursor + 1); + return true; + } + } + + var maxBytes = s_utf8Encoding.GetMaxByteCount(propertyName.Length); + var endCursor = startCursor + (numberOfRows - 1); + + if (maxBytes < JsonConstants.StackallocByteThreshold) + { + Span utf8Name = stackalloc byte[JsonConstants.StackallocByteThreshold]; + var len = s_utf8Encoding.GetBytes(propertyName, utf8Name); + utf8Name = utf8Name[..len]; + + return TryGetNamedPropertyValue( + startCursor + 1, + endCursor, + utf8Name, + out value); + } + + // Unescaping the property name will make the string shorter (or the same) + // So the first viable candidate is one whose length in bytes matches, or + // exceeds, our length in chars. + // + // The maximal escaping seems to be 6 -> 1 ("\u0030" => "0"), but just transcode + // and switch once one viable long property is found. + + var minBytes = propertyName.Length; + var candidate = endCursor; + + while (candidate > startCursor) + { + var passed = candidate; + + row = _metaDb.Get(candidate); + Debug.Assert(row.TokenType != ElementTokenType.PropertyName); + + candidate--; + row = _metaDb.Get(candidate); + Debug.Assert(row.TokenType == ElementTokenType.PropertyName); + + if (row.SizeOrLength >= minBytes) + { + var tmpUtf8 = ArrayPool.Shared.Rent(maxBytes); + Span utf8Name = default; + + try + { + var len = s_utf8Encoding.GetBytes(propertyName, tmpUtf8); + utf8Name = tmpUtf8.AsSpan(0, len); + + return TryGetNamedPropertyValue( + startCursor, + passed + 1, + utf8Name, + out value); + } + finally + { + // While property names aren't usually a secret, they also usually + // aren't long enough to end up in the rented buffer transcode path. + // + // On the basis that this is user data, go ahead and clear it. + utf8Name.Clear(); + ArrayPool.Shared.Return(tmpUtf8); + } + } + + // Move to the previous value + candidate--; + } + + // None of the property names were within the range that the UTF-8 encoding would have been. + value = default; + return false; + } + + internal bool TryGetNamedPropertyValue( + Cursor startCursor, + ReadOnlySpan propertyName, + out CompositeResultElement value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + (startCursor, var tokenType) = _metaDb.GetStartCursor(startCursor); + CheckExpectedType(ElementTokenType.StartObject, tokenType); + + var numberOfRows = _metaDb.GetNumberOfRows(startCursor); + + // Only one row means it was EndObject. + if (numberOfRows == 1) + { + value = default; + return false; + } + + var row = _metaDb.Get(startCursor); + if (row.OperationReferenceType is OperationReferenceType.SelectionSet) + { + var selectionSet = _operation.GetSelectionSetById(row.OperationReferenceId); + if (selectionSet.TryGetSelection(propertyName, out var selection)) + { + var propertyIndex = selection.Id - selectionSet.Id - 1; + var propertyRowIndex = (propertyIndex * 2) + 1; + var propertyCursor = startCursor + propertyRowIndex; + Debug.Assert(_metaDb.GetElementTokenType(propertyCursor) is ElementTokenType.PropertyName); + Debug.Assert(_metaDb.Get(propertyCursor).OperationReferenceId == selection.Id); + value = new CompositeResultElement(this, propertyCursor + 1); + return true; + } + } + + var endCursor = startCursor + (numberOfRows - 1); + + return TryGetNamedPropertyValue( + startCursor + 1, + endCursor, + propertyName, + out value); + } + + private bool TryGetNamedPropertyValue( + Cursor startCursor, + Cursor endCursor, + ReadOnlySpan propertyName, + out CompositeResultElement value) + { + Span utf8UnescapedStack = stackalloc byte[JsonConstants.StackallocByteThreshold]; + var cursor = endCursor; + + while (cursor > startCursor) + { + var row = _metaDb.Get(cursor); + Debug.Assert(row.TokenType != ElementTokenType.PropertyName); + cursor--; + + row = _metaDb.Get(cursor); + Debug.Assert(row.TokenType == ElementTokenType.PropertyName); + var currentPropertyName = ReadRawValue(row); + + if (row.HasComplexChildren) + { + // An escaped property name will be longer than an unescaped candidate, so only unescape + // when the lengths are compatible. + if (currentPropertyName.Length > propertyName.Length) + { + var idx = currentPropertyName.IndexOf(JsonConstants.BackSlash); + Debug.Assert(idx >= 0); + + // If everything up to where the property name has a backslash matches, keep going. + if (propertyName.Length > idx + && currentPropertyName[..idx].SequenceEqual(propertyName[..idx])) + { + var remaining = currentPropertyName.Length - idx; + var written = 0; + byte[]? rented = null; + + try + { + var utf8Unescaped = remaining <= utf8UnescapedStack.Length + ? utf8UnescapedStack + : (rented = ArrayPool.Shared.Rent(remaining)); + + // Only unescape the part we haven't processed. + JsonReaderHelper.Unescape(currentPropertyName[idx..], utf8Unescaped, 0, out written); + + // If the unescaped remainder matches the input remainder, it's a match. + if (utf8Unescaped[..written].SequenceEqual(propertyName[idx..])) + { + // If the property name is a match, the answer is the next element. + value = new CompositeResultElement(this, cursor + 1); + return true; + } + } + finally + { + if (rented != null) + { + rented.AsSpan(0, written).Clear(); + ArrayPool.Shared.Return(rented); + } + } + } + } + } + else if (currentPropertyName.SequenceEqual(propertyName)) + { + // If the property name is a match, the answer is the next element. + value = new CompositeResultElement(this, cursor + 1); + return true; + } + + // Move to the previous value + cursor--; + } + + value = default; + return false; + } + + internal Cursor GetStartCursor(Cursor cursor) + { + ObjectDisposedException.ThrowIf(_disposed, this); + (cursor, _) = _metaDb.GetStartCursor(cursor); + return cursor; + } + + internal Cursor GetEndCursor(Cursor cursor) + { + ObjectDisposedException.ThrowIf(_disposed, this); + return cursor + _metaDb.GetNumberOfRows(cursor); + } +} diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetValue.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetValue.cs new file mode 100644 index 00000000000..2794eb02500 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetValue.cs @@ -0,0 +1,226 @@ +using System.Buffers.Text; + +namespace HotChocolate.Text.Json; + +public sealed partial class ResultDocument +{ + internal bool TryGetValue(Cursor cursor, out sbyte value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + CheckExpectedType(ElementTokenType.Number, row.TokenType); + + var rawValue = ReadRawValue(row); + + if (Utf8Parser.TryParse(rawValue, out sbyte tmp, out var consumed) + && consumed == rawValue.Length) + { + value = tmp; + return true; + } + + value = 0; + return false; + } + + internal bool TryGetValue(Cursor cursor, out byte value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + CheckExpectedType(ElementTokenType.Number, row.TokenType); + + var rawValue = ReadRawValue(row); + + if (Utf8Parser.TryParse(rawValue, out byte tmp, out var consumed) + && consumed == rawValue.Length) + { + value = tmp; + return true; + } + + value = 0; + return false; + } + + internal bool TryGetValue(Cursor cursor, out short value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + CheckExpectedType(ElementTokenType.Number, row.TokenType); + + var rawValue = ReadRawValue(row); + + if (Utf8Parser.TryParse(rawValue, out short tmp, out var consumed) + && consumed == rawValue.Length) + { + value = tmp; + return true; + } + + value = 0; + return false; + } + + internal bool TryGetValue(Cursor cursor, out ushort value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + CheckExpectedType(ElementTokenType.Number, row.TokenType); + + var rawValue = ReadRawValue(row); + + if (Utf8Parser.TryParse(rawValue, out ushort tmp, out var consumed) + && consumed == rawValue.Length) + { + value = tmp; + return true; + } + + value = 0; + return false; + } + + internal bool TryGetValue(Cursor cursor, out int value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + CheckExpectedType(ElementTokenType.Number, row.TokenType); + + var rawValue = ReadRawValue(row); + + if (Utf8Parser.TryParse(rawValue, out int tmp, out var consumed) + && consumed == rawValue.Length) + { + value = tmp; + return true; + } + + value = 0; + return false; + } + + internal bool TryGetValue(Cursor cursor, out uint value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + CheckExpectedType(ElementTokenType.Number, row.TokenType); + + var rawValue = ReadRawValue(row); + + if (Utf8Parser.TryParse(rawValue, out uint tmp, out var consumed) + && consumed == rawValue.Length) + { + value = tmp; + return true; + } + + value = 0; + return false; + } + + internal bool TryGetValue(Cursor cursor, out long value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + CheckExpectedType(ElementTokenType.Number, row.TokenType); + + var rawValue = ReadRawValue(row); + + if (Utf8Parser.TryParse(rawValue, out long tmp, out var consumed) + && consumed == rawValue.Length) + { + value = tmp; + return true; + } + + value = 0; + return false; + } + + internal bool TryGetValue(Cursor cursor, out ulong value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + CheckExpectedType(ElementTokenType.Number, row.TokenType); + + var rawValue = ReadRawValue(row); + + if (Utf8Parser.TryParse(rawValue, out ulong tmp, out var consumed) + && consumed == rawValue.Length) + { + value = tmp; + return true; + } + + value = 0; + return false; + } + + internal bool TryGetValue(Cursor cursor, out double value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + CheckExpectedType(ElementTokenType.Number, row.TokenType); + + var rawValue = ReadRawValue(row); + + if (Utf8Parser.TryParse(rawValue, out double tmp, out var bytesConsumed) + && rawValue.Length == bytesConsumed) + { + value = tmp; + return true; + } + + value = 0; + return false; + } + + internal bool TryGetValue(Cursor cursor, out float value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + CheckExpectedType(ElementTokenType.Number, row.TokenType); + + var rawValue = ReadRawValue(row); + + if (Utf8Parser.TryParse(rawValue, out float tmp, out var bytesConsumed) + && rawValue.Length == bytesConsumed) + { + value = tmp; + return true; + } + + value = 0; + return false; + } + + internal bool TryGetValue(Cursor cursor, out decimal value) + { + ObjectDisposedException.ThrowIf(_disposed, this); + + var row = _metaDb.Get(cursor); + CheckExpectedType(ElementTokenType.Number, row.TokenType); + + var rawValue = ReadRawValue(row); + + if (Utf8Parser.TryParse(rawValue, out decimal tmp, out var bytesConsumed) + && rawValue.Length == bytesConsumed) + { + value = tmp; + return true; + } + + value = 0; + return false; + } +} diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs new file mode 100644 index 00000000000..c5c86bd324a --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -0,0 +1,313 @@ +using System.Buffers; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Text.Json; +using HotChocolate.Execution; + +namespace HotChocolate.Text.Json; + +public sealed partial class ResultDocument : IRawJsonFormatter +{ + public void WriteTo(IBufferWriter writer, bool indented = false) + { + var formatter = new RawJsonFormatter(this, writer, indented); + formatter.Write(); + } + + internal ref struct RawJsonFormatter(ResultDocument document, IBufferWriter writer, bool indented) + { + private int _indentLevel = 0; + + public void Write() + { + WriteByte(JsonConstants.OpenBrace); + + if (indented) + { + WriteNewLine(); + _indentLevel++; + } + + if (document._errors?.Count > 0) + { + if (indented) + { + WriteIndent(); + } + + WriteByte(JsonConstants.Quote); + writer.Write(JsonConstants.Errors); + WriteByte(JsonConstants.Quote); + WriteByte(JsonConstants.Colon); + + if (indented) + { + WriteByte(JsonConstants.Space); + } + + var options = new JsonWriterOptions { Indented = indented }; + using var jsonWriter = new Utf8JsonWriter(writer, options); + JsonValueFormatter.WriteErrors( + jsonWriter, + document._errors, + new JsonSerializerOptions(JsonSerializerDefaults.Web), + default); + jsonWriter.Flush(); + + WriteByte(JsonConstants.Comma); + } + + // Write "data": + var root = Cursor.Zero; + var row = document._metaDb.Get(root); + + if (indented) + { + WriteIndent(); + } + + WriteByte(JsonConstants.Quote); + writer.Write(JsonConstants.Data); + WriteByte(JsonConstants.Quote); + WriteByte(JsonConstants.Colon); + + if (indented) + { + WriteByte(JsonConstants.Space); + } + + if (row.TokenType is ElementTokenType.Null + || (ElementFlags.Invalidated & row.Flags) == ElementFlags.Invalidated) + { + writer.Write(JsonConstants.NullValue); + } + else + { + WriteObject(root, row); + } + + if (document.Extensions?.Count > 0) + { + WriteByte(JsonConstants.Comma); + + if (indented) + { + WriteIndent(); + } + + WriteByte(JsonConstants.Quote); + writer.Write(JsonConstants.Extensions); + WriteByte(JsonConstants.Quote); + WriteByte(JsonConstants.Colon); + + if (indented) + { + WriteByte(JsonConstants.Space); + } + + var options = new JsonWriterOptions { Indented = indented }; + using var jsonWriter = new Utf8JsonWriter(writer, options); + JsonValueFormatter.WriteDictionary( + jsonWriter, + document.Extensions, + new JsonSerializerOptions(JsonSerializerDefaults.Web), + default); + jsonWriter.Flush(); + } + + if (indented) + { + _indentLevel--; + WriteNewLine(); + WriteIndent(); + } + + WriteByte(JsonConstants.CloseBrace); + } + + public void WriteValue(Cursor cursor, DbRow row) + { + var tokenType = row.TokenType; + + // Inline reference resolution + if (tokenType is ElementTokenType.Reference) + { + cursor = document._metaDb.GetLocationCursor(cursor); + row = document._metaDb.Get(cursor); + tokenType = row.TokenType; + } + + Debug.Assert(tokenType is not ElementTokenType.Reference); + Debug.Assert(tokenType is not ElementTokenType.EndObject); + Debug.Assert(tokenType is not ElementTokenType.EndArray); + + switch (tokenType) + { + case ElementTokenType.StartObject + when (ElementFlags.SourceResult & row.Flags) != ElementFlags.SourceResult: + WriteObject(cursor, row); + break; + + case ElementTokenType.StartArray + when (ElementFlags.SourceResult & row.Flags) != ElementFlags.SourceResult: + WriteArray(cursor, row); + break; + + case ElementTokenType.None: + case ElementTokenType.Null: + writer.Write(JsonConstants.NullValue); + break; + + case ElementTokenType.True: + writer.Write(JsonConstants.TrueValue); + break; + + case ElementTokenType.False: + writer.Write(JsonConstants.FalseValue); + break; + + default: + document.WriteRawValueTo(writer, row, _indentLevel, indented); + break; + } + } + + private void WriteObject(Cursor start, DbRow startRow) + { + Debug.Assert(startRow.TokenType is ElementTokenType.StartObject); + + var current = start + 1; + var end = start + startRow.NumberOfRows; + + WriteByte(JsonConstants.OpenBrace); + + if (indented && current < end) + { + _indentLevel++; + } + + var first = true; + while (current < end) + { + var row = document._metaDb.Get(current); + Debug.Assert(row.TokenType is ElementTokenType.PropertyName); + + if ((ElementFlags.IsInternal & row.Flags) == ElementFlags.IsInternal + || (ElementFlags.IsExcluded & row.Flags) == ElementFlags.IsExcluded) + { + // skip name+value + current += 2; + continue; + } + + if (!first) + { + WriteByte(JsonConstants.Comma); + } + first = false; + + if (indented) + { + WriteNewLine(); + WriteIndent(); + } + + // property name (quoted) + WriteByte(JsonConstants.Quote); + writer.Write(document.ReadRawValue(row)); + WriteByte(JsonConstants.Quote); + WriteByte(JsonConstants.Colon); + + if (indented) + { + WriteByte(JsonConstants.Space); + } + + // property value + current++; + row = document._metaDb.Get(current); + WriteValue(current, row); + + // next property (move past value) + current++; + } + + if (indented && !first) + { + _indentLevel--; + WriteNewLine(); + WriteIndent(); + } + + WriteByte(JsonConstants.CloseBrace); + } + + private void WriteArray(Cursor start, DbRow startRow) + { + Debug.Assert(startRow.TokenType is ElementTokenType.StartArray); + + var current = start + 1; + var end = start + startRow.NumberOfRows; + + WriteByte(JsonConstants.OpenBracket); + + if (indented && current < end) + { + _indentLevel++; + } + + var first = true; + while (current < end) + { + if (!first) + { + WriteByte(JsonConstants.Comma); + } + first = false; + + if (indented) + { + WriteNewLine(); + WriteIndent(); + } + + var row = document._metaDb.Get(current); + WriteValue(current, row); + + current++; + } + + if (indented && end > start + 1) + { + _indentLevel--; + WriteNewLine(); + WriteIndent(); + } + + WriteByte(JsonConstants.CloseBracket); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private readonly void WriteNewLine() => WriteByte(JsonConstants.NewLineLineFeed); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private readonly void WriteIndent() + { + var indentSize = _indentLevel * 2; + if (indentSize > 0) + { + var span = writer.GetSpan(indentSize); + span[..indentSize].Fill(JsonConstants.Space); + writer.Advance(indentSize); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private readonly void WriteByte(byte value) + { + var span = writer.GetSpan(1); + span[0] = value; + writer.Advance(1); + } + } +} diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index ab09873c494..c34fedfd4ca 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -10,14 +10,13 @@ namespace HotChocolate.Text.Json; public sealed partial class ResultDocument : IDisposable { private static readonly Encoding s_utf8Encoding = Encoding.UTF8; - private readonly IOperation _operation; + private readonly Operation _operation; private readonly ulong _includeFlags; private List? _errors; - private Dictionary? _extensions; internal MetaDb _metaDb; private bool _disposed; - public ResultDocument(IOperation operation, ulong includeFlags) + internal ResultDocument(Operation operation, ulong includeFlags) { _metaDb = MetaDb.CreateForEstimatedRows(Cursor.RowsPerChunk * 8); _operation = operation; @@ -26,41 +25,35 @@ public ResultDocument(IOperation operation, ulong includeFlags) Data = CreateObject(Cursor.Zero, operation.RootSelectionSet); } - public CompositeResultElement Data { get; } + public ResultElement Data { get; } + // we need extra methods to add stuff public List? Errors { get => _errors; internal set => _errors = value; } - public Dictionary? Extensions - { - get => _extensions; - internal set => _extensions = value; - } + public Dictionary? Extensions { get; set; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ElementTokenType GetElementTokenType(Cursor cursor) => _metaDb.GetElementTokenType(cursor); [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal IOperation GetOperation() + internal Operation GetOperation() => _operation; - internal ISelectionSet? GetSelectionSet(Cursor cursor) + internal SelectionSet? GetSelectionSet(Cursor cursor) { var row = _metaDb.Get(cursor); - if (row.OperationReferenceType is not OperationReferenceType.SelectionSet) - { - return null; - } - - return _operation.GetSelectionSetById(row.OperationReferenceId); + return row.OperationReferenceType is OperationReferenceType.SelectionSet + ? _operation.GetSelectionSetById(row.OperationReferenceId) + : null; } - internal ISelection? GetSelection(Cursor cursor) + internal Selection? GetSelection(Cursor cursor) { if (cursor == Cursor.Zero) { @@ -81,15 +74,12 @@ internal IOperation GetOperation() } } - if (row.OperationReferenceType is not OperationReferenceType.Selection) - { - return null; - } - - return _operation.GetSelectionById(row.OperationReferenceId); + return row.OperationReferenceType is OperationReferenceType.Selection + ? _operation.GetSelectionById(row.OperationReferenceId) + : null; } - internal CompositeResultElement GetArrayIndexElement(Cursor current, int arrayIndex) + internal ResultElement GetArrayIndexElement(Cursor current, int arrayIndex) { ObjectDisposedException.ThrowIf(_disposed, this); @@ -105,7 +95,7 @@ internal CompositeResultElement GetArrayIndexElement(Cursor current, int arrayIn } // first element is at +1 after StartArray - return new CompositeResultElement(this, start.AddRows(arrayIndex + 1)); + return new ResultElement(this, start.AddRows(arrayIndex + 1)); } internal int GetArrayLength(Cursor current) @@ -195,7 +185,7 @@ internal Path CreatePath(Cursor current) return path; } - internal CompositeResultElement GetParent(Cursor current) + internal ResultElement GetParent(Cursor current) { // The null cursor represents the data object, which is the utmost root. // If we have reached that we simply return an undefined element @@ -226,7 +216,7 @@ internal CompositeResultElement GetParent(Cursor current) Debug.Assert(_metaDb.GetElementTokenType(parent, resolveReferences: false) == ElementTokenType.Reference); } - return new CompositeResultElement(this, parent); + return new ResultElement(this, parent); } internal bool IsInvalidated(Cursor current) @@ -393,7 +383,7 @@ private ReadOnlySpan ReadRawValue(DbRow row) throw new NotSupportedException(); } - internal CompositeResultElement CreateObject(Cursor parent, ISelectionSet selectionSet) + internal ResultElement CreateObject(Cursor parent, ISelectionSet selectionSet) { var startObjectCursor = WriteStartObject(parent, selectionSet.Id); @@ -406,10 +396,10 @@ internal CompositeResultElement CreateObject(Cursor parent, ISelectionSet select WriteEndObject(startObjectCursor, selectionCount); - return new CompositeResultElement(this, startObjectCursor); + return new ResultElement(this, startObjectCursor); } - internal CompositeResultElement CreateArray(Cursor parent, int length) + internal ResultElement CreateArray(Cursor parent, int length) { var cursor = WriteStartArray(parent, length); @@ -420,11 +410,11 @@ internal CompositeResultElement CreateArray(Cursor parent, int length) WriteEndArray(); - return new CompositeResultElement(this, cursor); + return new ResultElement(this, cursor); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal void AssignCompositeValue(CompositeResultElement target, CompositeResultElement value) + internal void AssignCompositeValue(ResultElement target, ResultElement value) { _metaDb.Replace( cursor: target.Cursor, @@ -434,7 +424,7 @@ internal void AssignCompositeValue(CompositeResultElement target, CompositeResul } [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal void AssignSourceValue(CompositeResultElement target, SourceResultElement source) + internal void AssignSourceValue(ResultElement target, ResultElement source) { var value = source.GetValuePointer(); var parent = source._parent; @@ -476,7 +466,7 @@ internal void AssignSourceValue(CompositeResultElement target, SourceResultEleme } [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal void AssignNullValue(CompositeResultElement target) + internal void AssignNullValue(ResultElement target) { _metaDb.Replace( cursor: target.Cursor, diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ArrayEnumerator.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ArrayEnumerator.cs new file mode 100644 index 00000000000..b7a04e9ec98 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ArrayEnumerator.cs @@ -0,0 +1,100 @@ +using System.Collections; +using System.Diagnostics; + +namespace HotChocolate.Text.Json; + +public readonly partial struct ResultElement +{ + /// + /// An enumerable and enumerator for the contents of a JSON array. + /// + [DebuggerDisplay("{Current,nq}")] + public struct ArrayEnumerator : IEnumerable, IEnumerator + { + private readonly ResultDocument _document; + private readonly ResultDocument.Cursor _start; + private readonly ResultDocument.Cursor _end; + private ResultDocument.Cursor _cursor; + + internal ArrayEnumerator(ResultElement target) + { + _document = target._parent; + (_start, var tokenType) = _document._metaDb.GetStartCursor(target._cursor); + Debug.Assert(tokenType is ElementTokenType.StartArray); + _end = _start + _document._metaDb.GetNumberOfRows(_start); + _cursor = _start; + } + + /// + public ResultElement Current + { + get + { + var cursor = _cursor; + if (cursor == _start || cursor >= _end) + { + return default; + } + + return new ResultElement(_document, cursor); + } + } + + /// + object IEnumerator.Current => Current; + + /// + /// Returns an enumerator that iterates through the array. + /// + public ArrayEnumerator GetEnumerator() + { + var enumerator = this; + enumerator._cursor = enumerator._start; + return enumerator; + } + + /// + IEnumerator IEnumerable.GetEnumerator() + => GetEnumerator(); + + /// + IEnumerator IEnumerable.GetEnumerator() + => GetEnumerator(); + + /// + public bool MoveNext() + { + var start = _start; + var end = _end; + + if (_cursor == start) + { + var first = start + 1; + if (first < end) + { + _cursor = first; + return true; + } + + _cursor = end; + return false; + } + + var next = _cursor + 1; + if (next < end) + { + _cursor = next; + return true; + } + + _cursor = end; + return false; + } + + /// + public void Reset() => _cursor = _start; + + /// + public void Dispose() => _cursor = _end; + } +} diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ObjectEnumerator.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ObjectEnumerator.cs new file mode 100644 index 00000000000..58d8d5d163b --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ObjectEnumerator.cs @@ -0,0 +1,127 @@ +using System.Collections; +using System.Diagnostics; +using static HotChocolate.Fusion.Text.Json.CompositeResultDocument; + +namespace HotChocolate.Text.Json; + +public readonly partial struct ResultElement +{ + /// + /// An enumerable and enumerator for the properties of a JSON object. + /// + [DebuggerDisplay("{Current,nq}")] + public struct ObjectEnumerator : IEnumerable, IEnumerator + { + private readonly CompositeResultDocument _document; + private readonly Cursor _start; + private readonly Cursor _end; + private Cursor _cursor; + + internal ObjectEnumerator(CompositeResultElement target) + { + _document = target._parent; + (_start, var tokenType) = _document._metaDb.GetStartCursor(target._cursor); + Debug.Assert(tokenType is ElementTokenType.StartObject); + _end = _start + _document._metaDb.GetNumberOfRows(_start); + _cursor = _start; + } + + /// + public CompositeResultProperty Current + { + get + { + if (_cursor == _start || _cursor >= _end) + { + return default; + } + + return new CompositeResultProperty(new CompositeResultElement(_document, _cursor + 1)); + } + } + + /// + /// Returns an enumerator that iterates the properties of an object. + /// + /// + /// An value that can be used to iterate + /// through the object. + /// + /// + /// The enumerator will enumerate the properties in the order they are + /// declared, and when an object has multiple definitions of a single + /// property they will all individually be returned (each in the order + /// they appear in the content). + /// + public ObjectEnumerator GetEnumerator() + { + var enumerator = this; + enumerator._cursor = enumerator._start; + return enumerator; + } + + /// + IEnumerator IEnumerable.GetEnumerator() + => GetEnumerator(); + + /// + IEnumerator IEnumerable.GetEnumerator() + => GetEnumerator(); + + /// + public void Dispose() + { + _cursor = _end; + } + + /// + public void Reset() + { + _cursor = _start; + } + + /// + object IEnumerator.Current => Current; + + /// + public bool MoveNext() + { + while (MoveNextInternal()) + { + var flags = _document._metaDb.GetFlags(_cursor); + if ((ElementFlags.IsExcluded & flags) is not ElementFlags.IsExcluded) + { + return true; + } + } + + return false; + } + + private bool MoveNextInternal() + { + if (_cursor == _start) + { + var first = _start + 1; + if (first < _end) + { + _cursor = first; + return true; + } + + _cursor = _end; + return false; + } + + var next = _cursor += 2; + if (next < _end) + { + _cursor = next; + return true; + } + + _cursor = _end; + return false; + } + } +} diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs new file mode 100644 index 00000000000..94b91ddb9bf --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -0,0 +1,713 @@ +using System.Buffers; +using System.Diagnostics; +using System.Text.Json; +using HotChocolate.Execution; +using HotChocolate.Execution.Processing; +using HotChocolate.Types; +using static HotChocolate.Properties.TextJsonResources; + +#pragma warning disable CS1574, CS1584, CS1581, CS1580 + +namespace HotChocolate.Text.Json; + +public readonly partial struct ResultElement : IRawJsonFormatter +{ + private readonly ResultDocument _parent; + private readonly ResultDocument.Cursor _cursor; + + internal ResultElement(ResultDocument parent, ResultDocument.Cursor cursor) + { + // parent is usually not null, but the Current property + // on the enumerators (when initialized as `default`) can + // get here with a null. + _parent = parent; + _cursor = cursor; + } + + public void WriteTo(IBufferWriter writer, bool indented = false) + { + var formatter = new ResultDocument.RawJsonFormatter(_parent, writer, indented); + + var row = _parent._metaDb.Get(_cursor); + formatter.WriteValue(_cursor, row); + } + + /// + /// Gets the internal meta-db cursor. + /// + internal ResultDocument.Cursor Cursor => _cursor; + + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private ElementTokenType TokenType => _parent?.GetElementTokenType(_cursor) ?? ElementTokenType.None; + + /// + /// The that the value is. + /// + /// + /// The parent has been disposed. + /// + public JsonValueKind ValueKind => TokenType.ToValueKind(); + + /// + /// Get the value at a specified index when the current value is a + /// . + /// + /// + /// This value's is not . + /// + /// + /// is not in the range [0, ()). + /// + /// + /// The parent has been disposed. + /// + public ResultElement this[int index] + { + get + { + CheckValidInstance(); + + return _parent.GetArrayIndexElement(_cursor, index); + } + } + + public IOperation Operation + { + get + { + CheckValidInstance(); + + return _parent.GetOperation(); + } + } + + public ISelectionSet? SelectionSet + { + get + { + CheckValidInstance(); + + return _parent.GetSelectionSet(_cursor); + } + } + + public ISelection? Selection + { + get + { + CheckValidInstance(); + + if (_cursor == ResultDocument.Cursor.Zero) + { + return null; + } + + // note: the selection is stored on the property not on the value. + return _parent.GetSelection(_cursor - 1); + } + } + + public IType? Type + { + get + { + if (_cursor == ResultDocument.Cursor.Zero) + { + return null; + } + + var selection = Selection; + + if (selection is not null) + { + return selection.Type; + } + + var type = Parent.Type; + + if (type?.IsListType() == true) + { + return type.ElementType(); + } + + return null; + } + } + + public bool IsInvalidated + { + get + { + CheckValidInstance(); + + return _parent.IsInvalidated(_cursor); + } + } + + public bool IsNullOrInvalidated + { + get + { + if (_parent is null) + { + return true; + } + + return _parent.IsNullOrInvalidated(_cursor); + } + } + + public Path Path + { + get + { + CheckValidInstance(); + + return _parent.CreatePath(_cursor); + } + } + + public ResultElement Parent + { + get + { + CheckValidInstance(); + + return _parent.GetParent(_cursor); + } + } + + public bool IsNullable + { + get + { + CheckValidInstance(); + + if (_cursor == ResultDocument.Cursor.Zero) + { + return false; + } + + return Type?.IsNullableType() ?? true; + } + } + + public bool IsInternal + { + get + { + CheckValidInstance(); + + return _parent.IsInternalProperty(_cursor); + } + } + + public ISelectionSet AssertSelectionSet() + { + var selectionSet = SelectionSet; + + if (selectionSet is null) + { + throw new InvalidOperationException("The selection set is null.") { Source = Rethrowable }; + } + + return selectionSet; + } + + public ISelection AssertSelection() + { + var selection = Selection; + + if (selection is null) + { + throw new InvalidOperationException("The selection set is null.") { Source = Rethrowable }; + } + + return selection; + } + + public IType AssertType() + { + var type = Type; + + if (type is null) + { + throw new InvalidOperationException("The type is null.") { Source = Rethrowable }; + } + + return type; + } + + public void Invalidate() + { + CheckValidInstance(); + + _parent.Invalidate(_cursor); + } + + /// + /// Get the number of values contained within the current array value. + /// + public int GetArrayLength() + { + CheckValidInstance(); + + return _parent.GetArrayLength(_cursor); + } + + /// + /// Get the number of properties contained within the current object value. + /// + public int GetPropertyCount() + { + CheckValidInstance(); + + return _parent.GetPropertyCount(_cursor); + } + + public ResultElement GetProperty(string propertyName) + { + ArgumentNullException.ThrowIfNull(propertyName); + + if (TryGetProperty(propertyName, out var property)) + { + return property; + } + + throw new KeyNotFoundException(); + } + + public ResultElement GetProperty(ReadOnlySpan utf8PropertyName) + { + if (TryGetProperty(utf8PropertyName, out var property)) + { + return property; + } + + throw new KeyNotFoundException(); + } + + public bool TryGetProperty(string propertyName, out ResultElement value) + { + ArgumentNullException.ThrowIfNull(propertyName); + + return _parent.TryGetNamedPropertyValue(_cursor, propertyName, out value); + } + + public bool TryGetProperty(ReadOnlySpan utf8PropertyName, out ResultElement value) + { + CheckValidInstance(); + + return _parent.TryGetNamedPropertyValue(_cursor, utf8PropertyName, out value); + } + + public bool GetBoolean() + { + var type = TokenType; + + return type switch + { + ElementTokenType.True => true, + ElementTokenType.False => false, + _ => ThrowJsonElementWrongTypeException(type) + }; + + static bool ThrowJsonElementWrongTypeException(ElementTokenType actualType) + { + throw new InvalidOperationException(string.Format( + ResultElement_GetBoolean_JsonElementHasWrongType, + nameof(Boolean), + actualType.ToValueKind())) + { + Source = Rethrowable + }; + } + } + + public string? GetString() + { + CheckValidInstance(); + + return _parent.GetString(_cursor, ElementTokenType.String); + } + + public string AssertString() + { + CheckValidInstance(); + + return _parent.GetRequiredString(_cursor, ElementTokenType.String); + } + + public bool TryGetSByte(out sbyte value) + { + CheckValidInstance(); + + return _parent.TryGetValue(_cursor, out value); + } + + public sbyte GetSByte() => TryGetSByte(out var value) ? value : throw new FormatException(); + + public bool TryGetByte(out byte value) + { + CheckValidInstance(); + + return _parent.TryGetValue(_cursor, out value); + } + + public byte GetByte() + { + if (TryGetByte(out var value)) + { + return value; + } + + throw new FormatException(); + } + + public bool TryGetInt16(out short value) + { + CheckValidInstance(); + + return _parent.TryGetValue(_cursor, out value); + } + + public short GetInt16() + { + if (TryGetInt16(out var value)) + { + return value; + } + + throw new FormatException(); + } + + public bool TryGetUInt16(out ushort value) + { + CheckValidInstance(); + + return _parent.TryGetValue(_cursor, out value); + } + + public ushort GetUInt16() + { + if (TryGetUInt16(out var value)) + { + return value; + } + + throw new FormatException(); + } + + public bool TryGetInt32(out int value) + { + CheckValidInstance(); + + return _parent.TryGetValue(_cursor, out value); + } + + public int GetInt32() + { + if (!TryGetInt32(out var value)) + { + ThrowHelper.FormatException(); + } + + return value; + } + + public bool TryGetUInt32(out uint value) + { + CheckValidInstance(); + + return _parent.TryGetValue(_cursor, out value); + } + + public uint GetUInt32() + { + if (!TryGetUInt32(out var value)) + { + ThrowHelper.FormatException(); + } + + return value; + } + + public bool TryGetInt64(out long value) + { + CheckValidInstance(); + + return _parent.TryGetValue(_cursor, out value); + } + + public long GetInt64() + { + if (!TryGetInt64(out var value)) + { + ThrowHelper.FormatException(); + } + + return value; + } + + public bool TryGetUInt64(out ulong value) + { + CheckValidInstance(); + + return _parent.TryGetValue(_cursor, out value); + } + + public ulong GetUInt64() + { + if (!TryGetUInt64(out var value)) + { + ThrowHelper.FormatException(); + } + + return value; + } + + public bool TryGetDouble(out double value) + { + CheckValidInstance(); + + return _parent.TryGetValue(_cursor, out value); + } + + public double GetDouble() + { + if (!TryGetDouble(out var value)) + { + ThrowHelper.FormatException(); + } + + return value; + } + + public bool TryGetSingle(out float value) + { + CheckValidInstance(); + + return _parent.TryGetValue(_cursor, out value); + } + + public float GetSingle() + { + if (!TryGetSingle(out var value)) + { + ThrowHelper.FormatException(); + } + + return value; + } + + public bool TryGetDecimal(out decimal value) + { + CheckValidInstance(); + + return _parent.TryGetValue(_cursor, out value); + } + + public decimal GetDecimal() + { + if (!TryGetDecimal(out var value)) + { + ThrowHelper.FormatException(); + } + + return value; + } + + internal string GetPropertyName() + { + CheckValidInstance(); + + return _parent.GetNameOfPropertyValue(_cursor); + } + + internal ReadOnlySpan GetPropertyNameRaw() + { + CheckValidInstance(); + + return _parent.GetPropertyNameRaw(_cursor); + } + + public string GetRawText() + { + CheckValidInstance(); + + return _parent.GetRawValueAsString(_cursor); + } + + internal ReadOnlySpan GetRawValue(bool includeQuotes = true) + { + CheckValidInstance(); + + return _parent.GetRawValue(_cursor, includeQuotes: true); + } + + public bool ValueEquals(string? text) + { + if (TokenType == ElementTokenType.Null) + { + return text == null; + } + + return TextEqualsHelper(text.AsSpan(), isPropertyName: false); + } + + public bool ValueEquals(ReadOnlySpan utf8Text) + { + if (TokenType == ElementTokenType.Null) + { +#pragma warning disable CA2265 + return utf8Text[..0] == default; +#pragma warning restore CA2265 + } + + return TextEqualsHelper(utf8Text, isPropertyName: false, shouldUnescape: true); + } + + public bool ValueEquals(ReadOnlySpan text) + { + if (TokenType == ElementTokenType.Null) + { +#pragma warning disable CA2265 + return text[..0] == default; +#pragma warning restore CA2265 + } + + return TextEqualsHelper(text, isPropertyName: false); + } + + internal bool TextEqualsHelper(ReadOnlySpan utf8Text, bool isPropertyName, bool shouldUnescape) + { + CheckValidInstance(); + + return _parent.TextEquals(_cursor, utf8Text, isPropertyName, shouldUnescape); + } + + internal bool TextEqualsHelper(ReadOnlySpan text, bool isPropertyName) + { + CheckValidInstance(); + + return _parent.TextEquals(_cursor, text, isPropertyName); + } + + internal string GetPropertyRawText() + { + CheckValidInstance(); + + return _parent.GetPropertyRawValueAsString(_cursor); + } + + public ArrayEnumerator EnumerateArray() + { + CheckValidInstance(); + + var tokenType = TokenType; + + if (tokenType != ElementTokenType.StartArray) + { + throw new InvalidOperationException(string.Format( + "The requested operation requires an element of type '{0}', but the target element has type '{1}'.", + ElementTokenType.StartArray, + tokenType)) + { + Source = Rethrowable + }; + } + + return new ArrayEnumerator(this); + } + + public ObjectEnumerator EnumerateObject() + { + CheckValidInstance(); + + var tokenType = TokenType; + + if (tokenType is not ElementTokenType.StartObject) + { + throw new InvalidOperationException(string.Format( + "The requested operation requires an element of type '{0}', but the target element has type '{1}'.", + ElementTokenType.StartObject, + tokenType)); + } + + return new ObjectEnumerator(this); + } + + internal void SetObjectValue(SelectionSet selectionSet) + { + CheckValidInstance(); + + ArgumentNullException.ThrowIfNull(selectionSet); + + var obj = _parent.CreateObject(_cursor, selectionSet: selectionSet); + _parent.AssignCompositeValue(this, obj); + } + + internal void SetArrayValue(int length) + { + CheckValidInstance(); + + ArgumentOutOfRangeException.ThrowIfNegative(length); + + var arr = _parent.CreateArray(_cursor, length); + _parent.AssignCompositeValue(this, arr); + } + + internal void SetLeafValue(SourceResultElement source) + { + CheckValidInstance(); + + _parent.AssignSourceValue(this, source); + } + + internal void SetNullValue() + { + CheckValidInstance(); + + _parent.AssignNullValue(this); + } + + public override string ToString() + { + switch (TokenType) + { + case ElementTokenType.None: + case ElementTokenType.Null: + return string.Empty; + + case ElementTokenType.True: + return bool.TrueString; + + case ElementTokenType.False: + return bool.FalseString; + + case ElementTokenType.Number: + case ElementTokenType.StartArray: + case ElementTokenType.StartObject: + Debug.Assert(_parent != null); + return _parent.GetRawValueAsString(_cursor); + + case ElementTokenType.String: + return GetString()!; + + case ElementTokenType.Comment: + case ElementTokenType.EndArray: + case ElementTokenType.EndObject: + default: + Debug.Fail($"No handler for {nameof(JsonTokenType)}.{TokenType}"); + return string.Empty; + } + } + + private void CheckValidInstance() + { + if (_parent == null) + { + throw new InvalidOperationException(); + } + } +} diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs index 8f3d1a55222..100366d0af1 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs @@ -4,9 +4,16 @@ using System.Runtime.CompilerServices; using System.Text; using System.Text.Json; + +#if FUSION using static HotChocolate.Fusion.Properties.FusionExecutionResources; namespace HotChocolate.Fusion.Text.Json; +#else +using static HotChocolate.Properties.TypeResources; + +namespace HotChocolate.Text.Json; +#endif internal static class JsonReaderHelper { diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/ThrowHelper.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/ThrowHelper.cs index 992c9511d9d..5461a82bcee 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/ThrowHelper.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/ThrowHelper.cs @@ -1,7 +1,14 @@ using System.Diagnostics.CodeAnalysis; + +#if FUSION using static HotChocolate.Fusion.Properties.FusionExecutionResources; namespace HotChocolate.Fusion.Text.Json; +#else +using static HotChocolate.Properties.TextJsonResources; + +namespace HotChocolate.Text.Json; +#endif internal static class ThrowHelper { diff --git a/src/HotChocolate/Core/src/Types.Shared/BuiltInTypes.cs b/src/HotChocolate/Primitives/src/Primitives/Types/BuiltInTypes.cs similarity index 60% rename from src/HotChocolate/Core/src/Types.Shared/BuiltInTypes.cs rename to src/HotChocolate/Primitives/src/Primitives/Types/BuiltInTypes.cs index ba792c03e00..16d5e401aca 100644 --- a/src/HotChocolate/Core/src/Types.Shared/BuiltInTypes.cs +++ b/src/HotChocolate/Primitives/src/Primitives/Types/BuiltInTypes.cs @@ -1,35 +1,35 @@ using HotChocolate.Language; -namespace HotChocolate.Utilities.Introspection; +namespace HotChocolate.Types; public static class BuiltInTypes { private static readonly HashSet s_typeNames = [ - WellKnownTypes.__Directive, - WellKnownTypes.__DirectiveLocation, - WellKnownTypes.__EnumValue, - WellKnownTypes.__Field, - WellKnownTypes.__InputValue, - WellKnownTypes.__Schema, - WellKnownTypes.__Type, - WellKnownTypes.__TypeKind, - WellKnownTypes.String, - WellKnownTypes.Boolean, - WellKnownTypes.Float, - WellKnownTypes.ID, - WellKnownTypes.Int + IntrospectionTypeNames.__Directive, + IntrospectionTypeNames.__DirectiveLocation, + IntrospectionTypeNames.__EnumValue, + IntrospectionTypeNames.__Field, + IntrospectionTypeNames.__InputValue, + IntrospectionTypeNames.__Schema, + IntrospectionTypeNames.__Type, + IntrospectionTypeNames.__TypeKind, + SpecScalarNames.String.Name, + SpecScalarNames.Boolean.Name, + SpecScalarNames.Float.Name, + SpecScalarNames.ID.Name, + SpecScalarNames.Int.Name ]; private static readonly HashSet s_directiveNames = [ - WellKnownDirectives.Skip, - WellKnownDirectives.Include, - WellKnownDirectives.Deprecated, - WellKnownDirectives.Defer, - WellKnownDirectives.Stream, - WellKnownDirectives.SpecifiedBy, - WellKnownDirectives.OneOf + DirectiveNames.Skip.Name, + DirectiveNames.Include.Name, + DirectiveNames.Deprecated.Name, + DirectiveNames.Defer.Name, + DirectiveNames.Stream.Name, + DirectiveNames.SpecifiedBy.Name, + DirectiveNames.OneOf.Name ]; public static bool IsBuiltInType(string name) diff --git a/src/HotChocolate/Primitives/src/Primitives/Types/IntrospectionTypeNames.cs b/src/HotChocolate/Primitives/src/Primitives/Types/IntrospectionTypeNames.cs new file mode 100644 index 00000000000..9057e806224 --- /dev/null +++ b/src/HotChocolate/Primitives/src/Primitives/Types/IntrospectionTypeNames.cs @@ -0,0 +1,15 @@ +namespace HotChocolate.Types; + +public static class IntrospectionTypeNames +{ + // ReSharper disable InconsistentNaming + public const string __Directive = nameof(__Directive); + public const string __DirectiveLocation = nameof(__DirectiveLocation); + public const string __EnumValue = nameof(__EnumValue); + public const string __Field = nameof(__Field); + public const string __InputValue = nameof(__InputValue); + public const string __Schema = nameof(__Schema); + public const string __Type = nameof(__Type); + public const string __TypeKind = nameof(__TypeKind); + // ReSharper restore InconsistentNaming +} diff --git a/src/HotChocolate/Utilities/src/Utilities.Introspection/HotChocolate.Utilities.Introspection.csproj b/src/HotChocolate/Utilities/src/Utilities.Introspection/HotChocolate.Utilities.Introspection.csproj index a014d417a25..bef5c3c11aa 100644 --- a/src/HotChocolate/Utilities/src/Utilities.Introspection/HotChocolate.Utilities.Introspection.csproj +++ b/src/HotChocolate/Utilities/src/Utilities.Introspection/HotChocolate.Utilities.Introspection.csproj @@ -24,8 +24,8 @@ - + diff --git a/src/HotChocolate/Utilities/src/Utilities.Introspection/IntrospectionClient.cs b/src/HotChocolate/Utilities/src/Utilities.Introspection/IntrospectionClient.cs index afe9cdbf646..b223c7cf5be 100644 --- a/src/HotChocolate/Utilities/src/Utilities.Introspection/IntrospectionClient.cs +++ b/src/HotChocolate/Utilities/src/Utilities.Introspection/IntrospectionClient.cs @@ -2,6 +2,7 @@ using System.Text.Json; using HotChocolate.Language; using HotChocolate.Transport.Http; +using HotChocolate.Types; using static HotChocolate.Utilities.Introspection.CapabilityInspector; using static HotChocolate.Utilities.Introspection.IntrospectionQueryHelper; diff --git a/src/HotChocolate/Utilities/src/Utilities.Introspection/IntrospectionFormatter.cs b/src/HotChocolate/Utilities/src/Utilities.Introspection/IntrospectionFormatter.cs index 16443d7a052..0748992eabd 100644 --- a/src/HotChocolate/Utilities/src/Utilities.Introspection/IntrospectionFormatter.cs +++ b/src/HotChocolate/Utilities/src/Utilities.Introspection/IntrospectionFormatter.cs @@ -1,5 +1,7 @@ using HotChocolate.Language; +using HotChocolate.Types; using HotChocolate.Utilities.Introspection.Properties; +using DirectiveLocation = HotChocolate.Language.DirectiveLocation; namespace HotChocolate.Utilities.Introspection; @@ -333,10 +335,10 @@ private static IReadOnlyList CreateDeprecatedDirective( { new DirectiveNode ( - WellKnownDirectives.Deprecated, + DirectiveNames.Deprecated.Name, new ArgumentNode ( - WellKnownDirectives.DeprecationReasonArgument, + DirectiveNames.Deprecated.Arguments.Reason, new StringValueNode(deprecationReason) ) ) From 3fd40c3ba40fe33fba16a012b74da788cf58187b Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 27 Nov 2025 15:30:50 +0100 Subject: [PATCH 007/144] wip --- .../Types/Execution/Processing/Fragment.cs | 10 +- .../Types/Execution/Processing/ISelection.cs | 5 + .../Types/Execution/Processing/Selection.cs | 17 +- .../Properties/TextJsonResources.Designer.cs | 16 +- .../Types/Properties/TextJsonResources.resx | 12 +- .../Types/Text/Json/ResultDocument.DbRow.cs | 63 +-- .../Types/Text/Json/ResultDocument.MetaDb.cs | 53 +- .../Json/ResultDocument.TryGetProperty.cs | 14 +- .../Types/Text/Json/ResultDocument.WriteTo.cs | 2 +- .../src/Types/Text/Json/ResultDocument.cs | 360 +++++++++--- .../Json/ResultElement.ObjectEnumerator.cs | 14 +- .../Core/src/Types/Text/Json/ResultElement.cs | 526 +++++++++++++++++- ...iteResultProperty.cs => ResultProperty.cs} | 18 +- .../Text/Json/CompositeResultElement.cs | 302 +++++++++- .../Text/Json/CompositeResultProperty.cs | 4 +- 15 files changed, 1193 insertions(+), 223 deletions(-) rename src/HotChocolate/Core/src/Types/Text/Json/{CompositeResultProperty.cs => ResultProperty.cs} (89%) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Fragment.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Fragment.cs index 713b9cb28df..3e3d2a1c42c 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Fragment.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Fragment.cs @@ -5,8 +5,8 @@ namespace HotChocolate.Execution.Processing; internal sealed class Fragment : IFragment { - private readonly long _includeCondition; - private readonly long _deferIfCondition; + private readonly ulong _includeCondition; + private readonly ulong _deferIfCondition; public Fragment( int id, @@ -14,8 +14,8 @@ public Fragment( ISyntaxNode syntaxNode, IReadOnlyList directives, ISelectionSet selectionSet, - long includeCondition, - long deferIfCondition, + ulong includeCondition, + ulong deferIfCondition, bool isInternal = false) { Id = id; @@ -45,7 +45,7 @@ public Fragment( public string? GetLabel(IVariableValueCollection variables) => Directives.GetDeferDirective(variables)?.Label; - public bool IsIncluded(long includeFlags, bool allowInternals = false) + public bool IsIncluded(ulong includeFlags, bool allowInternals = false) => (includeFlags & _includeCondition) == _includeCondition && (_deferIfCondition is 0 || (includeFlags & _deferIfCondition) != _deferIfCondition) && (!IsInternal || allowInternals); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs index d4880429f14..f6979a4a84f 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs @@ -19,6 +19,11 @@ public interface ISelection : IOptionalSelection /// string ResponseName { get; } + /// + /// Gets the UTF-8 encoded name this field will have in the response map. + /// + byte[] Utf8ResponseName { get; } + /// /// Gets the field that was selected. /// diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index 309faace72b..1ed864d2455 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Text; using HotChocolate.Execution.Properties; using HotChocolate.Language; using HotChocolate.Resolvers; @@ -12,7 +13,7 @@ namespace HotChocolate.Execution.Processing; public class Selection : ISelection { private static readonly ArgumentMap s_emptyArguments = ArgumentMap.Empty; - private long[] _includeConditions; + private ulong[] _includeConditions; private long _streamIfCondition; private Flags _flags; private FieldNode _syntaxNode; @@ -26,7 +27,7 @@ public Selection( FieldNode syntaxNode, string responseName, ArgumentMap? arguments = null, - long[]? includeConditions = null, + ulong[]? includeConditions = null, bool isInternal = false, bool isParallelExecutable = true, FieldDelegate? resolverPipeline = null, @@ -121,6 +122,10 @@ protected Selection(Selection selection) /// public string ResponseName { get; } + /// + public byte[] Utf8ResponseName => _utf8ResponseName ??= Encoding.UTF8.GetBytes(ResponseName); + private byte[]? _utf8ResponseName; + /// public FieldDelegate? ResolverPipeline { get; private set; } @@ -147,9 +152,9 @@ public bool HasStreamDirective(long includeFlags) public bool IsConditional => _includeConditions.Length > 0 || (_flags & Flags.Internal) == Flags.Internal; - internal ReadOnlySpan IncludeConditions => _includeConditions; + internal ReadOnlySpan IncludeConditions => _includeConditions; - public bool IsIncluded(long includeFlags, bool allowInternals = false) + public bool IsIncluded(ulong includeFlags, bool allowInternals = false) { // in most case we do not have any include condition, // so we can take the easy way out here if we do not have any flags. @@ -190,7 +195,7 @@ public bool IsIncluded(long includeFlags, bool allowInternals = false) public override string ToString() => _syntaxNode.ToString(); - internal void AddSelection(FieldNode selectionSyntax, long includeCondition = 0) + internal void AddSelection(FieldNode selectionSyntax, ulong includeCondition = 0) { if ((_flags & Flags.Sealed) == Flags.Sealed) { @@ -412,7 +417,7 @@ public Sealed( FieldNode syntaxNode, string responseName, ArgumentMap? arguments = null, - long[]? includeConditions = null, + ulong[]? includeConditions = null, bool isInternal = false, bool isParallelExecutable = true, FieldDelegate? resolverPipeline = null, diff --git a/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs index 47f922f9119..872b64ad013 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs @@ -45,21 +45,21 @@ internal static System.Globalization.CultureInfo Culture { } } - internal static string CompositeResultElement_GetBoolean_JsonElementHasWrongType { + internal static string ResultElement_GetBoolean_JsonElementHasWrongType { get { - return ResourceManager.GetString("CompositeResultElement_GetBoolean_JsonElementHasWrongType", resourceCulture); + return ResourceManager.GetString("ResultElement_GetBoolean_JsonElementHasWrongType", resourceCulture); } } - internal static string SourceResultElement_GetBoolean_JsonElementHasWrongType { + internal static string Rethrowable { get { - return ResourceManager.GetString("SourceResultElement_GetBoolean_JsonElementHasWrongType", resourceCulture); + return ResourceManager.GetString("Rethrowable", resourceCulture); } } - internal static string Rethrowable { + internal static string ResultElement_SetObjectValue_NotObjectType { get { - return ResourceManager.GetString("Rethrowable", resourceCulture); + return ResourceManager.GetString("ResultElement_SetObjectValue_NotObjectType", resourceCulture); } } @@ -81,9 +81,9 @@ internal static string ThrowHelper_ReadIncompleteUTF16 { } } - internal static string FixedSizeArrayPool_Return_InvalidArraySize { + internal static string ResultElement_SetArrayValue_NotListType { get { - return ResourceManager.GetString("FixedSizeArrayPool_Return_InvalidArraySize", resourceCulture); + return ResourceManager.GetString("ResultElement_SetArrayValue_NotListType", resourceCulture); } } } diff --git a/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx index 9375281edf6..e98294406cd 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx +++ b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx @@ -18,15 +18,15 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - The requested operation requires an element of type '{0}', but the target element has type '{1}'. - - + The requested operation requires an element of type '{0}', but the target element has type '{1}'. HotChocolate.Text.Json.Rethrowable + + The element is not a composite type. + Cannot transcode invalid UTF-8 JSON text to UTF-16 string. @@ -36,7 +36,7 @@ Cannot read incomplete UTF-16 JSON text as string with missing low surrogate. - - Buffer size {0} does not match expected chunk size {1} + + The location type `{0}` is not a list. diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs index 701c7734e40..5e613d3f224 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs @@ -15,23 +15,22 @@ internal readonly struct DbRow // 27 bits for location + 2 bits OpRefType + 3 reserved bits private readonly int _locationAndOpRefType; - // Sign bit for HasComplexChildren + 31 bits for size/length + // 27 bits for size/length + sign bit for HasComplexChildren + 4 reserved bits private readonly int _sizeOrLengthUnion; - // 4 bits TokenType + 27 bits NumberOfRows + 1 reserved bit - private readonly int _numberOfRowsTypeAndReserved; + // 27 bits NumberOfRows + 1 reserved bit + 4 bits TokenType + private readonly int _tokenTypeAndNumberOfRows; - // 15 bits SourceDocumentId + 17 bits (high 17 bits of ParentRow) - private readonly int _sourceAndParentHigh; + // 27 bits ParentRow + 5 reserved bits + private readonly int _parentRow; - // 15 bits OperationReferenceId + 6 bits Flags + 11 bits (low bits of ParentRow) - private readonly int _selectionSetFlagsAndParentLow; + // 15 bits OperationReferenceId + 8 bits Flags + 9 reserved bits + private readonly int _opRefIdAndFlags; public DbRow( ElementTokenType tokenType, int location, int sizeOrLength = 0, - int sourceDocumentId = 0, int parentRow = 0, int operationReferenceId = 0, OperationReferenceType operationReferenceType = OperationReferenceType.None, @@ -40,20 +39,19 @@ public DbRow( { Debug.Assert((byte)tokenType < 16); Debug.Assert(location is >= 0 and <= 0x07FFFFFF); // 27 bits - Debug.Assert(sizeOrLength >= UnknownSize); - Debug.Assert(sourceDocumentId is >= 0 and <= 0x7FFF); // 15 bits - Debug.Assert(parentRow is >= 0 and <= 0x0FFFFFFF); // 28 bits + Debug.Assert(sizeOrLength == UnknownSize || sizeOrLength is >= 0 and <= 0x07FFFFFF); // 27 bits + Debug.Assert(parentRow is >= 0 and <= 0x07FFFFFF); // 27 bits Debug.Assert(operationReferenceId is >= 0 and <= 0x7FFF); // 15 bits Debug.Assert(numberOfRows is >= 0 and <= 0x07FFFFFF); // 27 bits - Debug.Assert((byte)flags <= 63); // 6 bits (0x3F) + Debug.Assert((byte)flags <= 255); // 8 bits (0xFF) Debug.Assert((byte)operationReferenceType <= 3); // 2 bits Debug.Assert(Unsafe.SizeOf() == Size); _locationAndOpRefType = location | ((int)operationReferenceType << 27); _sizeOrLengthUnion = sizeOrLength; - _numberOfRowsTypeAndReserved = ((int)tokenType << 28) | (numberOfRows & 0x07FFFFFF); - _sourceAndParentHigh = sourceDocumentId | ((parentRow >> 11) << 15); - _selectionSetFlagsAndParentLow = operationReferenceId | ((int)flags << 15) | ((parentRow & 0x7FF) << 21); + _tokenTypeAndNumberOfRows = ((int)tokenType << 28) | (numberOfRows & 0x07FFFFFF); + _parentRow = parentRow; + _opRefIdAndFlags = operationReferenceId | ((int)flags << 15); } /// @@ -62,7 +60,7 @@ public DbRow( /// /// 4 bits = possible values /// - public ElementTokenType TokenType => (ElementTokenType)(unchecked((uint)_numberOfRowsTypeAndReserved) >> 28); + public ElementTokenType TokenType => (ElementTokenType)(unchecked((uint)_tokenTypeAndNumberOfRows) >> 28); /// /// Operation reference type indicating the type of GraphQL operation element. @@ -77,7 +75,7 @@ public OperationReferenceType OperationReferenceType /// Byte offset in source data OR metaDb row index for references. /// /// - /// 2 bits = 4 possible values + /// 27 bits = 134M limit /// public int Location => _locationAndOpRefType & 0x07FFFFFF; @@ -87,7 +85,7 @@ public OperationReferenceType OperationReferenceType /// /// 27 bits = 134M limit /// - public int SizeOrLength => _sizeOrLengthUnion & int.MaxValue; + public int SizeOrLength => _sizeOrLengthUnion & 0x07FFFFFF; /// /// String/PropertyName: Unescaping required. @@ -105,30 +103,32 @@ public OperationReferenceType OperationReferenceType /// /// 27 bits = 134M rows /// - public int NumberOfRows => _numberOfRowsTypeAndReserved & 0x07FFFFFF; + public int NumberOfRows => _tokenTypeAndNumberOfRows & 0x07FFFFFF; /// /// Index of parent element in metadb for navigation and null propagation. /// /// - /// 28 bits = 268M rows + /// 27 bits = 134M rows /// - public int ParentRow - => ((int)((uint)_sourceAndParentHigh >> 15) << 11) | ((_selectionSetFlagsAndParentLow >> 21) & 0x7FF); + public int ParentRow => _parentRow & 0x07FFFFFF; /// /// Reference to GraphQL selection set or selection metadata. /// 15 bits = 32K selections /// - public int OperationReferenceId => _selectionSetFlagsAndParentLow & 0x7FFF; + /// + /// 15 bits = 32K selections + /// + public int OperationReferenceId => _opRefIdAndFlags & 0x7FFF; /// /// Element metadata flags. /// /// - /// 6 bits = 64 combinations + /// 8 bits = 256 combinations /// - public ElementFlags Flags => (ElementFlags)((_selectionSetFlagsAndParentLow >> 15) & 0x3F); + public ElementFlags Flags => (ElementFlags)((_opRefIdAndFlags >> 15) & 0xFF); /// /// True for primitive JSON values (strings, numbers, booleans, null). @@ -147,11 +147,12 @@ internal enum OperationReferenceType : byte internal enum ElementFlags : byte { None = 0, - Invalidated = 1, - SourceResult = 2, - IsNullable = 4, - IsRoot = 8, - IsInternal = 16, - IsExcluded = 32 + IsRoot = 1, + IsObject = 2, + IsList = 4, + IsInternal = 8, + IsExcluded = 16, + IsNullable = 32, + IsInvalidated = 64 } } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.MetaDb.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.MetaDb.cs index 46af3d2c6b3..af81d3cc647 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.MetaDb.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.MetaDb.cs @@ -49,7 +49,6 @@ internal Cursor Append( ElementTokenType tokenType, int location = 0, int sizeOrLength = 0, - int sourceDocumentId = 0, int parentRow = 0, int operationReferenceId = 0, OperationReferenceType operationReferenceType = OperationReferenceType.None, @@ -110,7 +109,6 @@ internal Cursor Append( tokenType, location, sizeOrLength, - sourceDocumentId, parentRow, operationReferenceId, operationReferenceType, @@ -131,7 +129,6 @@ internal void Replace( ElementTokenType tokenType, int location = 0, int sizeOrLength = 0, - int sourceDocumentId = 0, int parentRow = 0, int operationReferenceId = 0, OperationReferenceType operationReferenceType = OperationReferenceType.None, @@ -144,7 +141,6 @@ internal void Replace( tokenType, location, sizeOrLength, - sourceDocumentId, parentRow, operationReferenceId, operationReferenceType, @@ -215,13 +211,8 @@ internal int GetParent(Cursor cursor) { AssertValidCursor(cursor); - var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset); - - var sourceAndParentHigh = MemoryMarshal.Read(span[12..]); - var selectionSetFlagsAndParentLow = MemoryMarshal.Read(span[16..]); - - return (sourceAndParentHigh >>> 15 << 11) - | ((selectionSetFlagsAndParentLow >> 21) & 0x7FF); + var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 12); + return MemoryMarshal.Read(span) & 0x07FFFFFF; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -229,14 +220,8 @@ internal Cursor GetParentCursor(Cursor cursor) { AssertValidCursor(cursor); - var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset); - - var sourceAndParentHigh = MemoryMarshal.Read(span[12..]); - var selectionSetFlagsAndParentLow = MemoryMarshal.Read(span[16..]); - - var index = (sourceAndParentHigh >>> 15 << 11) - | ((selectionSetFlagsAndParentLow >> 21) & 0x7FF); - + var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 12); + var index = MemoryMarshal.Read(span) & 0x07FFFFFF; return Cursor.FromIndex(index); } @@ -248,7 +233,7 @@ internal int GetNumberOfRows(Cursor cursor) var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + TokenTypeOffset); var value = MemoryMarshal.Read(span); - return value & 0x0FFFFFFF; + return value & 0x07FFFFFF; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -258,21 +243,21 @@ internal ElementFlags GetFlags(Cursor cursor) var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 16); - var selectionSetFlagsAndParentLow = MemoryMarshal.Read(span); - return (ElementFlags)((selectionSetFlagsAndParentLow >> 15) & 0x3F); + var value = MemoryMarshal.Read(span); + return (ElementFlags)((value >> 15) & 0xFF); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void SetFlags(Cursor cursor, ElementFlags flags) { AssertValidCursor(cursor); - Debug.Assert((byte)flags <= 63, "Flags value exceeds 6-bit limit"); + Debug.Assert((byte)flags <= 255, "Flags value exceeds 8-bit limit"); var fieldSpan = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 16); var currentValue = MemoryMarshal.Read(fieldSpan); - var clearedValue = currentValue & 0xFFE07FFF; // ~(0x3F << 15) - var newValue = (int)(clearedValue | (uint)((int)flags << 15)); + var clearedValue = currentValue & unchecked((int)0xFF807FFF); // ~(0xFF << 15) + var newValue = clearedValue | ((int)flags << 15); MemoryMarshal.Write(fieldSpan, newValue); } @@ -285,21 +270,21 @@ internal int GetSizeOrLength(Cursor cursor) var span = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 4); var value = MemoryMarshal.Read(span); - return value & int.MaxValue; + return value & 0x07FFFFFF; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void SetSizeOrLength(Cursor cursor, int sizeOrLength) { AssertValidCursor(cursor); - Debug.Assert(sizeOrLength >= 0, "SizeOrLength value exceeds 31-bit limit"); + Debug.Assert(sizeOrLength >= 0 && sizeOrLength <= 0x07FFFFFF, "SizeOrLength value exceeds 27-bit limit"); var fieldSpan = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + 4); var currentValue = MemoryMarshal.Read(fieldSpan); - // Keep only the sign bit (HasComplexChildren) - var clearedValue = currentValue & unchecked((int)0x80000000); - var newValue = clearedValue | (sizeOrLength & int.MaxValue); + // Keep only the sign bit (HasComplexChildren) + 4 reserved bits + var clearedValue = currentValue & unchecked((int)0xF8000000); + var newValue = clearedValue | (sizeOrLength & 0x07FFFFFF); MemoryMarshal.Write(fieldSpan, newValue); } @@ -308,14 +293,14 @@ internal void SetSizeOrLength(Cursor cursor, int sizeOrLength) internal void SetNumberOfRows(Cursor cursor, int numberOfRows) { AssertValidCursor(cursor); - Debug.Assert(numberOfRows >= 0 && numberOfRows <= 0x0FFFFFFF, "NumberOfRows value exceeds 28-bit limit"); + Debug.Assert(numberOfRows >= 0 && numberOfRows <= 0x07FFFFFF, "NumberOfRows value exceeds 27-bit limit"); var fieldSpan = _chunks[cursor.Chunk].AsSpan(cursor.ByteOffset + TokenTypeOffset); var currentValue = MemoryMarshal.Read(fieldSpan); - // Keep only the top 4 bits (token type) - var clearedValue = currentValue & unchecked((int)0xF0000000); - var newValue = clearedValue | (numberOfRows & 0x0FFFFFFF); + // Keep only the top 5 bits (4 bits token type + 1 reserved) + var clearedValue = currentValue & unchecked((int)0xF8000000); + var newValue = clearedValue | (numberOfRows & 0x07FFFFFF); MemoryMarshal.Write(fieldSpan, newValue); } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetProperty.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetProperty.cs index 9fc7679a472..01b41ac815e 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetProperty.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.TryGetProperty.cs @@ -8,7 +8,7 @@ public sealed partial class ResultDocument internal bool TryGetNamedPropertyValue( Cursor startCursor, string propertyName, - out CompositeResultElement value) + out ResultElement value) { ObjectDisposedException.ThrowIf(_disposed, this); @@ -35,7 +35,7 @@ internal bool TryGetNamedPropertyValue( var propertyCursor = startCursor + propertyRowIndex; Debug.Assert(_metaDb.GetElementTokenType(propertyCursor) is ElementTokenType.PropertyName); Debug.Assert(_metaDb.Get(propertyCursor).OperationReferenceId == selection.Id); - value = new CompositeResultElement(this, propertyCursor + 1); + value = new ResultElement(this, propertyCursor + 1); return true; } } @@ -116,7 +116,7 @@ internal bool TryGetNamedPropertyValue( internal bool TryGetNamedPropertyValue( Cursor startCursor, ReadOnlySpan propertyName, - out CompositeResultElement value) + out ResultElement value) { ObjectDisposedException.ThrowIf(_disposed, this); @@ -143,7 +143,7 @@ internal bool TryGetNamedPropertyValue( var propertyCursor = startCursor + propertyRowIndex; Debug.Assert(_metaDb.GetElementTokenType(propertyCursor) is ElementTokenType.PropertyName); Debug.Assert(_metaDb.Get(propertyCursor).OperationReferenceId == selection.Id); - value = new CompositeResultElement(this, propertyCursor + 1); + value = new ResultElement(this, propertyCursor + 1); return true; } } @@ -161,7 +161,7 @@ private bool TryGetNamedPropertyValue( Cursor startCursor, Cursor endCursor, ReadOnlySpan propertyName, - out CompositeResultElement value) + out ResultElement value) { Span utf8UnescapedStack = stackalloc byte[JsonConstants.StackallocByteThreshold]; var cursor = endCursor; @@ -206,7 +206,7 @@ private bool TryGetNamedPropertyValue( if (utf8Unescaped[..written].SequenceEqual(propertyName[idx..])) { // If the property name is a match, the answer is the next element. - value = new CompositeResultElement(this, cursor + 1); + value = new ResultElement(this, cursor + 1); return true; } } @@ -224,7 +224,7 @@ private bool TryGetNamedPropertyValue( else if (currentPropertyName.SequenceEqual(propertyName)) { // If the property name is a match, the answer is the next element. - value = new CompositeResultElement(this, cursor + 1); + value = new ResultElement(this, cursor + 1); return true; } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index c5c86bd324a..869b8c26d26 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -77,7 +77,7 @@ public void Write() } if (row.TokenType is ElementTokenType.Null - || (ElementFlags.Invalidated & row.Flags) == ElementFlags.Invalidated) + || (ElementFlags.IsInvalidated & row.Flags) == ElementFlags.IsInvalidated) { writer.Write(JsonConstants.NullValue); } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index c34fedfd4ca..780e99ee305 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Runtime.CompilerServices; using System.Text; +using HotChocolate.Buffers; using HotChocolate.Execution.Processing; using HotChocolate.Types; @@ -12,13 +13,17 @@ public sealed partial class ResultDocument : IDisposable private static readonly Encoding s_utf8Encoding = Encoding.UTF8; private readonly Operation _operation; private readonly ulong _includeFlags; - private List? _errors; internal MetaDb _metaDb; + private int _nextDataIndex; + private int _rentedDataSize; + private readonly List _data = []; + private readonly object _dataChunkLock = new(); + private List? _errors; private bool _disposed; internal ResultDocument(Operation operation, ulong includeFlags) { - _metaDb = MetaDb.CreateForEstimatedRows(Cursor.RowsPerChunk * 8); + _metaDb = MetaDb.CreateForEstimatedRows(Cursor.RowsPerChunk); _operation = operation; _includeFlags = includeFlags; @@ -228,7 +233,7 @@ internal bool IsInvalidated(Cursor current) if (tokenType is ElementTokenType.StartObject) { var flags = _metaDb.GetFlags(current); - return (flags & ElementFlags.Invalidated) == ElementFlags.Invalidated; + return (flags & ElementFlags.IsInvalidated) == ElementFlags.IsInvalidated; } if (tokenType is ElementTokenType.Reference) @@ -239,7 +244,7 @@ internal bool IsInvalidated(Cursor current) if (tokenType is ElementTokenType.StartObject) { var flags = _metaDb.GetFlags(current); - return (flags & ElementFlags.Invalidated) == ElementFlags.Invalidated; + return (flags & ElementFlags.IsInvalidated) == ElementFlags.IsInvalidated; } } @@ -260,7 +265,7 @@ internal bool IsNullOrInvalidated(Cursor current) if (tokenType is ElementTokenType.StartObject) { var flags = _metaDb.GetFlags(current); - return (flags & ElementFlags.Invalidated) == ElementFlags.Invalidated; + return (flags & ElementFlags.IsInvalidated) == ElementFlags.IsInvalidated; } if (tokenType is ElementTokenType.Reference) @@ -271,7 +276,7 @@ internal bool IsNullOrInvalidated(Cursor current) if (tokenType is ElementTokenType.StartObject) { var flags = _metaDb.GetFlags(current); - return (flags & ElementFlags.Invalidated) == ElementFlags.Invalidated; + return (flags & ElementFlags.IsInvalidated) == ElementFlags.IsInvalidated; } } @@ -307,7 +312,7 @@ internal void Invalidate(Cursor current) if (tokenType is ElementTokenType.StartObject) { var flags = _metaDb.GetFlags(current); - _metaDb.SetFlags(current, flags | ElementFlags.Invalidated); + _metaDb.SetFlags(current, flags | ElementFlags.IsInvalidated); return; } @@ -319,7 +324,7 @@ internal void Invalidate(Cursor current) if (tokenType is ElementTokenType.StartObject) { var flags = _metaDb.GetFlags(current); - _metaDb.SetFlags(current, flags | ElementFlags.Invalidated); + _metaDb.SetFlags(current, flags | ElementFlags.IsInvalidated); } return; @@ -329,58 +334,117 @@ internal void Invalidate(Cursor current) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void WriteRawValueTo(IBufferWriter writer, DbRow row, int indentLevel, bool indented) + private void WriteRawValueTo(IBufferWriter writer, DbRow row) { - if ((row.Flags & ElementFlags.SourceResult) == ElementFlags.SourceResult) + switch (row.TokenType) { - var document = _sources[row.SourceDocumentId]; + case ElementTokenType.Null: + WriteToBuffer(writer, JsonConstants.NullValue); + return; - if (row.TokenType is ElementTokenType.StartObject or ElementTokenType.StartArray) - { - // Reconstruct the source cursor from stored Location (Chunk) and SizeOrLength (Row) - var sourceCursor = SourceResultDocument.Cursor.From(row.Location, row.SizeOrLength); - var formatter = new SourceResultDocument.RawJsonFormatter(document, writer, indentLevel, indented); - formatter.WriteValue(sourceCursor); + case ElementTokenType.True: + WriteToBuffer(writer, JsonConstants.TrueValue); return; - } - // For simple values, write directly using location and size - document.WriteRawValueTo(writer, row.Location, row.SizeOrLength); - return; + case ElementTokenType.False: + WriteToBuffer(writer, JsonConstants.FalseValue); + return; + + case ElementTokenType.PropertyName: + WriteToBuffer(writer, _operation.GetSelectionById(row.OperationReferenceId).Utf8ResponseName); + return; + + case ElementTokenType.String: + case ElementTokenType.Number: + WriteLocalDataTo(writer, row.Location, row.SizeOrLength); + return; + + default: + throw new NotSupportedException(); } + } - throw new NotSupportedException(); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void WriteToBuffer(IBufferWriter writer, ReadOnlySpan data) + { + var span = writer.GetSpan(data.Length); + data.CopyTo(span); + writer.Advance(data.Length); } - private ReadOnlySpan ReadRawValue(DbRow row) + /// + /// Writes local data to the buffer, handling chunk boundaries. + /// + private void WriteLocalDataTo(IBufferWriter writer, int location, int size) { - if (row.TokenType == ElementTokenType.Null) - { - return JsonConstants.NullValue; - } + var remaining = size; + var currentPos = location; - if (row.TokenType == ElementTokenType.True) + while (remaining > 0) { - return JsonConstants.TrueValue; - } + var chunkIndex = currentPos / JsonMemory.BufferSize; + var offset = currentPos % JsonMemory.BufferSize; + var availableInChunk = JsonMemory.BufferSize - offset; + var toWrite = Math.Min(remaining, availableInChunk); - if (row.TokenType == ElementTokenType.False) - { - return JsonConstants.FalseValue; + var source = _data[chunkIndex].AsSpan(offset, toWrite); + var dest = writer.GetSpan(toWrite); + source.CopyTo(dest); + writer.Advance(toWrite); + + currentPos += toWrite; + remaining -= toWrite; } + } - if (row.TokenType == ElementTokenType.PropertyName) + private ReadOnlySpan ReadRawValue(DbRow row) + { + switch (row.TokenType) { - return _operation.GetSelectionById(row.OperationReferenceId).Utf8ResponseName; + case ElementTokenType.Null: + return JsonConstants.NullValue; + + case ElementTokenType.True: + return JsonConstants.TrueValue; + + case ElementTokenType.False: + return JsonConstants.FalseValue; + + case ElementTokenType.PropertyName: + return _operation.GetSelectionById(row.OperationReferenceId).Utf8ResponseName; + + case ElementTokenType.String: + case ElementTokenType.Number: + return ReadLocalData(row.Location, row.SizeOrLength); + + default: + throw new NotSupportedException(); } + } + + /// + /// Reads local data from the data chunks. + /// + /// + /// This method only supports data that fits within a single chunk. + /// Data that spans chunk boundaries should use instead. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private ReadOnlySpan ReadLocalData(int location, int size) + { + var chunkIndex = location / JsonMemory.BufferSize; + var offset = location % JsonMemory.BufferSize; - if ((row.Flags & ElementFlags.SourceResult) == ElementFlags.SourceResult) + // Fast path: data fits in a single chunk + if (offset + size <= JsonMemory.BufferSize) { - var document = _sources[row.SourceDocumentId]; - return document.ReadRawValue(row.Location, row.SizeOrLength); + return _data[chunkIndex].AsSpan(offset, size); } - throw new NotSupportedException(); + // Data spans chunk boundaries - this should be rare for typical JSON values + throw new NotSupportedException( + "Reading data that spans chunk boundaries as a span is not supported. " + + "Use WriteLocalDataTo for writing to an IBufferWriter instead."); } internal ResultElement CreateObject(Cursor parent, ISelectionSet selectionSet) @@ -399,6 +463,20 @@ internal ResultElement CreateObject(Cursor parent, ISelectionSet selectionSet) return new ResultElement(this, startObjectCursor); } + internal ResultElement CreateObject(Cursor parent, int propertyCount) + { + var startObjectCursor = WriteStartObject(parent, isSelectionSet: false); + + for (var i = 0; i < propertyCount; i++) + { + WriteEmptyProperty(startObjectCursor); + } + + WriteEndObject(startObjectCursor, propertyCount); + + return new ResultElement(this, startObjectCursor); + } + internal ResultElement CreateArray(Cursor parent, int length) { var cursor = WriteStartArray(parent, length); @@ -414,7 +492,7 @@ internal ResultElement CreateArray(Cursor parent, int length) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal void AssignCompositeValue(ResultElement target, ResultElement value) + internal void AssignObjectOrArray(ResultElement target, ResultElement value) { _metaDb.Replace( cursor: target.Cursor, @@ -424,45 +502,48 @@ internal void AssignCompositeValue(ResultElement target, ResultElement value) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal void AssignSourceValue(ResultElement target, ResultElement source) + internal void AssignStringValue(ResultElement target, ReadOnlySpan value) { - var value = source.GetValuePointer(); - var parent = source._parent; - - if (parent.Id == -1) - { - Debug.Assert(!_sources.Contains(parent), "The source document is marked as unbound but is already registered."); - parent.Id = _sources.Count; - _sources.Add(parent); - } + var totalSize = value.Length + 2; + var position = ClaimDataSpace(totalSize); + WriteData(position, value, withQuotes: true); - Debug.Assert(_sources.Contains(parent), "Expected the source document of the source element to be registered."); + _metaDb.Replace( + cursor: target.Cursor, + tokenType: ElementTokenType.String, + location: position, + sizeOrLength: totalSize, + parentRow: _metaDb.GetParent(target.Cursor)); + } - var tokenType = source.TokenType.ToElementTokenType(); + internal void AssignPropertyName(ResultElement target, ReadOnlySpan propertyName) + { + var totalSize = propertyName.Length + 2; + var position = ClaimDataSpace(totalSize); + WriteData(position, propertyName, withQuotes: true); + } - if (tokenType is ElementTokenType.StartObject or ElementTokenType.StartArray) - { - var sourceCursor = source._cursor; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void AssignNumberValue(ResultElement target, ReadOnlySpan value) + { + var position = ClaimDataSpace(value.Length); + WriteData(position, value); - _metaDb.Replace( - cursor: target.Cursor, - tokenType: source.TokenType.ToElementTokenType(), - location: sourceCursor.Chunk, - sizeOrLength: sourceCursor.Row, - sourceDocumentId: parent.Id, - parentRow: _metaDb.GetParent(target.Cursor), - flags: ElementFlags.SourceResult); - return; - } + _metaDb.Replace( + cursor: target.Cursor, + tokenType: ElementTokenType.Number, + location: position, + sizeOrLength: value.Length, + parentRow: _metaDb.GetParent(target.Cursor)); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void AssignBooleanValue(ResultElement target, bool value) + { _metaDb.Replace( cursor: target.Cursor, - tokenType: source.TokenType.ToElementTokenType(), - location: value.Location, - sizeOrLength: value.Size, - sourceDocumentId: parent.Id, - parentRow: _metaDb.GetParent(target.Cursor), - flags: ElementFlags.SourceResult); + tokenType: value ? ElementTokenType.True : ElementTokenType.False, + parentRow: _metaDb.GetParent(target.Cursor)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -475,7 +556,110 @@ internal void AssignNullValue(ResultElement target) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private Cursor WriteStartObject(Cursor parent, int selectionSetId = 0) + private int ClaimDataSpace(int size) + { + // Atomically claim space + var endPosition = Interlocked.Add(ref _nextDataIndex, size); + var startPosition = endPosition - size; + + // Fast path: we check if we already have enough rented memory + // if so we can directly return and write the data without locking. + if (endPosition <= Volatile.Read(ref _rentedDataSize)) + { + return startPosition; + } + + // Slow path: we need to rent more chunks so in this case + // we will need to do a proper synchronization. + EnsureDataCapacity(endPosition); + return startPosition; + } + + private void EnsureDataCapacity(int requiredSize) + { + lock (_dataChunkLock) + { + // Double-check after acquiring lock + var currentSize = _rentedDataSize; + if (requiredSize <= currentSize) + { + return; + } + + // Rent chunks until we have enough + while (currentSize < requiredSize) + { + _data.Add(JsonMemory.Rent(JsonMemoryKind.Json)); + currentSize += JsonMemory.BufferSize; + } + + // Publish new size (volatile write) + Volatile.Write(ref _rentedDataSize, currentSize); + } + } + + /// + /// Writes data to the data chunks, handling chunk boundaries. + /// + /// The position to start writing at. + /// The data to write. + /// If true, wraps the data with JSON quotes. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteData(int position, ReadOnlySpan data, bool withQuotes = false) + { + if (withQuotes) + { + WriteByte(position, JsonConstants.Quote); + WriteDataCore(position + 1, data); + WriteByte(position + 1 + data.Length, JsonConstants.Quote); + } + else + { + WriteDataCore(position, data); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteByte(int position, byte value) + { + var chunkIndex = position / JsonMemory.BufferSize; + var offset = position % JsonMemory.BufferSize; + _data[chunkIndex][offset] = value; + } + + private void WriteDataCore(int position, ReadOnlySpan data) + { + var chunkIndex = position / JsonMemory.BufferSize; + var offset = position % JsonMemory.BufferSize; + var availableInChunk = JsonMemory.BufferSize - offset; + + // Fast path: we can write all the data into single chunk + if (data.Length <= availableInChunk) + { + data.CopyTo(_data[chunkIndex].AsSpan(offset, data.Length)); + return; + } + + // Slow path: data spans multiple chunks so we need to loop + var remaining = data; + var currentPos = position; + + while (remaining.Length > 0) + { + chunkIndex = currentPos / JsonMemory.BufferSize; + offset = currentPos % JsonMemory.BufferSize; + availableInChunk = JsonMemory.BufferSize - offset; + var toWrite = Math.Min(remaining.Length, availableInChunk); + + remaining[..toWrite].CopyTo(_data[chunkIndex].AsSpan(offset, toWrite)); + + currentPos += toWrite; + remaining = remaining[toWrite..]; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private Cursor WriteStartObject(Cursor parent, int selectionSetId = 0, bool isSelectionSet = true) { var flags = ElementFlags.None; var parentRow = ToIndex(parent); @@ -490,7 +674,9 @@ private Cursor WriteStartObject(Cursor parent, int selectionSetId = 0) ElementTokenType.StartObject, parentRow: parentRow, operationReferenceId: selectionSetId, - operationReferenceType: OperationReferenceType.SelectionSet, + operationReferenceType: isSelectionSet + ? OperationReferenceType.SelectionSet + : OperationReferenceType.None, flags: flags); } @@ -546,6 +732,16 @@ private void WriteEmptyProperty(Cursor parent, ISelection selection) flags |= ElementFlags.IsNullable; } + if (selection.Type.IsListType()) + { + flags |= ElementFlags.IsList; + } + + if (selection.Type.IsCompositeType()) + { + flags |= ElementFlags.IsObject; + } + var prop = _metaDb.Append( ElementTokenType.PropertyName, parentRow: ToIndex(parent), @@ -558,6 +754,18 @@ private void WriteEmptyProperty(Cursor parent, ISelection selection) parentRow: ToIndex(prop)); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteEmptyProperty(Cursor parent) + { + var prop = _metaDb.Append( + ElementTokenType.PropertyName, + parentRow: ToIndex(parent)); + + _metaDb.Append( + ElementTokenType.None, + parentRow: ToIndex(prop)); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] private void WriteEmptyValue(Cursor parent) { @@ -582,6 +790,12 @@ public void Dispose() if (!_disposed) { _metaDb.Dispose(); + + if (_data.Count > 0) + { + JsonMemory.Return(JsonMemoryKind.Json, _data); + } + _disposed = true; } } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ObjectEnumerator.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ObjectEnumerator.cs index 58d8d5d163b..90725204ee3 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ObjectEnumerator.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.ObjectEnumerator.cs @@ -1,6 +1,6 @@ using System.Collections; using System.Diagnostics; -using static HotChocolate.Fusion.Text.Json.CompositeResultDocument; +using static HotChocolate.Text.Json.ResultDocument; namespace HotChocolate.Text.Json; @@ -10,14 +10,14 @@ public readonly partial struct ResultElement /// An enumerable and enumerator for the properties of a JSON object. /// [DebuggerDisplay("{Current,nq}")] - public struct ObjectEnumerator : IEnumerable, IEnumerator + public struct ObjectEnumerator : IEnumerable, IEnumerator { - private readonly CompositeResultDocument _document; + private readonly ResultDocument _document; private readonly Cursor _start; private readonly Cursor _end; private Cursor _cursor; - internal ObjectEnumerator(CompositeResultElement target) + internal ObjectEnumerator(ResultElement target) { _document = target._parent; (_start, var tokenType) = _document._metaDb.GetStartCursor(target._cursor); @@ -27,7 +27,7 @@ internal ObjectEnumerator(CompositeResultElement target) } /// - public CompositeResultProperty Current + public ResultProperty Current { get { @@ -36,7 +36,7 @@ public CompositeResultProperty Current return default; } - return new CompositeResultProperty(new CompositeResultElement(_document, _cursor + 1)); + return new ResultProperty(new ResultElement(_document, _cursor + 1)); } } @@ -65,7 +65,7 @@ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); /// - IEnumerator IEnumerable.GetEnumerator() + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); /// diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index 94b91ddb9bf..5b363b8bb8a 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -1,5 +1,7 @@ using System.Buffers; +using System.Buffers.Text; using System.Diagnostics; +using System.Text; using System.Text.Json; using HotChocolate.Execution; using HotChocolate.Execution.Processing; @@ -24,10 +26,16 @@ internal ResultElement(ResultDocument parent, ResultDocument.Cursor cursor) _cursor = cursor; } + /// + /// Writes this element as JSON to the specified buffer writer. + /// + /// The buffer writer to write to. + /// + /// true to write indented JSON; otherwise, false. + /// public void WriteTo(IBufferWriter writer, bool indented = false) { var formatter = new ResultDocument.RawJsonFormatter(_parent, writer, indented); - var row = _parent._metaDb.Get(_cursor); formatter.WriteValue(_cursor, row); } @@ -41,25 +49,19 @@ public void WriteTo(IBufferWriter writer, bool indented = false) private ElementTokenType TokenType => _parent?.GetElementTokenType(_cursor) ?? ElementTokenType.None; /// - /// The that the value is. + /// Gets the of this element. /// - /// - /// The parent has been disposed. - /// public JsonValueKind ValueKind => TokenType.ToValueKind(); /// - /// Get the value at a specified index when the current value is a - /// . + /// Gets the element at the specified index when the current element is an array. /// + /// The zero-based index of the element to get. /// - /// This value's is not . + /// This element's is not . /// /// - /// is not in the range [0, ()). - /// - /// - /// The parent has been disposed. + /// is not in the range [0, ()). /// public ResultElement this[int index] { @@ -71,6 +73,9 @@ public ResultElement this[int index] } } + /// + /// Gets the operation this element belongs to. + /// public IOperation Operation { get @@ -81,6 +86,10 @@ public IOperation Operation } } + /// + /// Gets the if this element represents the data of a selection set; + /// otherwise, null. + /// public ISelectionSet? SelectionSet { get @@ -91,6 +100,10 @@ public ISelectionSet? SelectionSet } } + /// + /// Gets the if this element represents the data of a field selection; + /// otherwise, null. + /// public ISelection? Selection { get @@ -107,6 +120,10 @@ public ISelection? Selection } } + /// + /// Gets the if this element represents the data of a field selection; + /// otherwise, null. + /// public IType? Type { get @@ -134,6 +151,9 @@ public IType? Type } } + /// + /// Gets a value indicating whether this element has been invalidated during null propagation. + /// public bool IsInvalidated { get @@ -144,6 +164,9 @@ public bool IsInvalidated } } + /// + /// Gets a value indicating whether this element is either null or was invalidated during null propagation. + /// public bool IsNullOrInvalidated { get @@ -157,6 +180,9 @@ public bool IsNullOrInvalidated } } + /// + /// Gets the path to this element within the result document. + /// public Path Path { get @@ -167,6 +193,9 @@ public Path Path } } + /// + /// Gets the parent element that contains this element. + /// public ResultElement Parent { get @@ -177,6 +206,9 @@ public ResultElement Parent } } + /// + /// Gets a value indicating whether this element is nullable according to the GraphQL type system. + /// public bool IsNullable { get @@ -192,6 +224,10 @@ public bool IsNullable } } + /// + /// Gets a value indicating whether this element represents internal data + /// that is required for processing and must not be written to the GraphQL response. + /// public bool IsInternal { get @@ -202,6 +238,15 @@ public bool IsInternal } } + /// + /// Gets the for this element. + /// + /// + /// The instance. + /// + /// + /// This element does not represent the data of a selection set. + /// public ISelectionSet AssertSelectionSet() { var selectionSet = SelectionSet; @@ -214,6 +259,15 @@ public ISelectionSet AssertSelectionSet() return selectionSet; } + /// + /// Gets the for this element. + /// + /// + /// The instance. + /// + /// + /// This element does not represent the data of a field selection. + /// public ISelection AssertSelection() { var selection = Selection; @@ -226,6 +280,15 @@ public ISelection AssertSelection() return selection; } + /// + /// Gets the for this element. + /// + /// + /// The instance. + /// + /// + /// This element does not represent the data of a field selection. + /// public IType AssertType() { var type = Type; @@ -238,6 +301,10 @@ public IType AssertType() return type; } + /// + /// Marks this element as invalidated, which occurs during null propagation + /// when a non-nullable field returns null. + /// public void Invalidate() { CheckValidInstance(); @@ -246,8 +313,11 @@ public void Invalidate() } /// - /// Get the number of values contained within the current array value. + /// Gets the number of elements contained within the current array element. /// + /// + /// The number of elements in the array. + /// public int GetArrayLength() { CheckValidInstance(); @@ -256,8 +326,11 @@ public int GetArrayLength() } /// - /// Get the number of properties contained within the current object value. + /// Gets the number of properties contained within the current object element. /// + /// + /// The number of properties in the object. + /// public int GetPropertyCount() { CheckValidInstance(); @@ -265,6 +338,14 @@ public int GetPropertyCount() return _parent.GetPropertyCount(_cursor); } + /// + /// Gets a property by name when the current element is an object. + /// + /// The name of the property to find. + /// The property value. + /// + /// No property with the specified name was found. + /// public ResultElement GetProperty(string propertyName) { ArgumentNullException.ThrowIfNull(propertyName); @@ -277,6 +358,14 @@ public ResultElement GetProperty(string propertyName) throw new KeyNotFoundException(); } + /// + /// Gets a property by UTF-8 encoded name when the current element is an object. + /// + /// The UTF-8 encoded name of the property to find. + /// The property value. + /// + /// No property with the specified name was found. + /// public ResultElement GetProperty(ReadOnlySpan utf8PropertyName) { if (TryGetProperty(utf8PropertyName, out var property)) @@ -287,6 +376,16 @@ public ResultElement GetProperty(ReadOnlySpan utf8PropertyName) throw new KeyNotFoundException(); } + /// + /// Attempts to get a property by name when the current element is an object. + /// + /// The name of the property to find. + /// + /// When this method returns, contains the property value if found; otherwise, the default value. + /// + /// + /// true if the property was found; otherwise, false. + /// public bool TryGetProperty(string propertyName, out ResultElement value) { ArgumentNullException.ThrowIfNull(propertyName); @@ -294,6 +393,16 @@ public bool TryGetProperty(string propertyName, out ResultElement value) return _parent.TryGetNamedPropertyValue(_cursor, propertyName, out value); } + /// + /// Attempts to get a property by UTF-8 encoded name when the current element is an object. + /// + /// The UTF-8 encoded name of the property to find. + /// + /// When this method returns, contains the property value if found; otherwise, the default value. + /// + /// + /// true if the property was found; otherwise, false. + /// public bool TryGetProperty(ReadOnlySpan utf8PropertyName, out ResultElement value) { CheckValidInstance(); @@ -301,6 +410,13 @@ public bool TryGetProperty(ReadOnlySpan utf8PropertyName, out ResultElemen return _parent.TryGetNamedPropertyValue(_cursor, utf8PropertyName, out value); } + /// + /// Gets the value as a . + /// + /// The boolean value. + /// + /// This element's is not or . + /// public bool GetBoolean() { var type = TokenType; @@ -324,6 +440,10 @@ static bool ThrowJsonElementWrongTypeException(ElementTokenType actualType) } } + /// + /// Gets the value as a . + /// + /// The string value, or null if this element is a JSON null. public string? GetString() { CheckValidInstance(); @@ -331,6 +451,13 @@ static bool ThrowJsonElementWrongTypeException(ElementTokenType actualType) return _parent.GetString(_cursor, ElementTokenType.String); } + /// + /// Gets the value as a non-null . + /// + /// The string value. + /// + /// This element is a JSON null. + /// public string AssertString() { CheckValidInstance(); @@ -338,6 +465,11 @@ public string AssertString() return _parent.GetRequiredString(_cursor, ElementTokenType.String); } + /// + /// Attempts to get the value as an . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetSByte(out sbyte value) { CheckValidInstance(); @@ -345,8 +477,18 @@ public bool TryGetSByte(out sbyte value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as an . + /// + /// The value. + /// The value cannot be parsed as an . public sbyte GetSByte() => TryGetSByte(out var value) ? value : throw new FormatException(); + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetByte(out byte value) { CheckValidInstance(); @@ -354,6 +496,11 @@ public bool TryGetByte(out byte value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public byte GetByte() { if (TryGetByte(out var value)) @@ -364,6 +511,11 @@ public byte GetByte() throw new FormatException(); } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetInt16(out short value) { CheckValidInstance(); @@ -371,6 +523,11 @@ public bool TryGetInt16(out short value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public short GetInt16() { if (TryGetInt16(out var value)) @@ -381,6 +538,11 @@ public short GetInt16() throw new FormatException(); } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetUInt16(out ushort value) { CheckValidInstance(); @@ -388,6 +550,11 @@ public bool TryGetUInt16(out ushort value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public ushort GetUInt16() { if (TryGetUInt16(out var value)) @@ -398,6 +565,11 @@ public ushort GetUInt16() throw new FormatException(); } + /// + /// Attempts to get the value as an . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetInt32(out int value) { CheckValidInstance(); @@ -405,6 +577,11 @@ public bool TryGetInt32(out int value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as an . + /// + /// The value. + /// The value cannot be parsed as an . public int GetInt32() { if (!TryGetInt32(out var value)) @@ -415,6 +592,11 @@ public int GetInt32() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetUInt32(out uint value) { CheckValidInstance(); @@ -422,6 +604,11 @@ public bool TryGetUInt32(out uint value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public uint GetUInt32() { if (!TryGetUInt32(out var value)) @@ -432,6 +619,11 @@ public uint GetUInt32() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetInt64(out long value) { CheckValidInstance(); @@ -439,6 +631,11 @@ public bool TryGetInt64(out long value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public long GetInt64() { if (!TryGetInt64(out var value)) @@ -449,6 +646,11 @@ public long GetInt64() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetUInt64(out ulong value) { CheckValidInstance(); @@ -456,6 +658,11 @@ public bool TryGetUInt64(out ulong value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public ulong GetUInt64() { if (!TryGetUInt64(out var value)) @@ -466,6 +673,11 @@ public ulong GetUInt64() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetDouble(out double value) { CheckValidInstance(); @@ -473,6 +685,11 @@ public bool TryGetDouble(out double value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public double GetDouble() { if (!TryGetDouble(out var value)) @@ -483,6 +700,11 @@ public double GetDouble() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetSingle(out float value) { CheckValidInstance(); @@ -490,6 +712,11 @@ public bool TryGetSingle(out float value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public float GetSingle() { if (!TryGetSingle(out var value)) @@ -500,6 +727,11 @@ public float GetSingle() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetDecimal(out decimal value) { CheckValidInstance(); @@ -507,6 +739,11 @@ public bool TryGetDecimal(out decimal value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public decimal GetDecimal() { if (!TryGetDecimal(out var value)) @@ -531,6 +768,10 @@ internal ReadOnlySpan GetPropertyNameRaw() return _parent.GetPropertyNameRaw(_cursor); } + /// + /// Gets the raw JSON text representing this element. + /// + /// The raw JSON text. public string GetRawText() { CheckValidInstance(); @@ -545,6 +786,13 @@ internal ReadOnlySpan GetRawValue(bool includeQuotes = true) return _parent.GetRawValue(_cursor, includeQuotes: true); } + /// + /// Compares the text of this element to the specified string. + /// + /// The text to compare against. + /// + /// true if this element's value equals the specified text; otherwise, false. + /// public bool ValueEquals(string? text) { if (TokenType == ElementTokenType.Null) @@ -555,6 +803,13 @@ public bool ValueEquals(string? text) return TextEqualsHelper(text.AsSpan(), isPropertyName: false); } + /// + /// Compares the text of this element to the specified UTF-8 encoded text. + /// + /// The UTF-8 encoded text to compare against. + /// + /// true if this element's value equals the specified text; otherwise, false. + /// public bool ValueEquals(ReadOnlySpan utf8Text) { if (TokenType == ElementTokenType.Null) @@ -567,6 +822,13 @@ public bool ValueEquals(ReadOnlySpan utf8Text) return TextEqualsHelper(utf8Text, isPropertyName: false, shouldUnescape: true); } + /// + /// Compares the text of this element to the specified character span. + /// + /// The text to compare against. + /// + /// true if this element's value equals the specified text; otherwise, false. + /// public bool ValueEquals(ReadOnlySpan text) { if (TokenType == ElementTokenType.Null) @@ -600,6 +862,13 @@ internal string GetPropertyRawText() return _parent.GetPropertyRawValueAsString(_cursor); } + /// + /// Gets an enumerator to enumerate the elements of this array. + /// + /// An enumerator for the array elements. + /// + /// This element's is not . + /// public ArrayEnumerator EnumerateArray() { CheckValidInstance(); @@ -620,6 +889,13 @@ public ArrayEnumerator EnumerateArray() return new ArrayEnumerator(this); } + /// + /// Gets an enumerator to enumerate the properties of this object. + /// + /// An enumerator for the object properties. + /// + /// This element's is not . + /// public ObjectEnumerator EnumerateObject() { CheckValidInstance(); @@ -643,34 +919,242 @@ internal void SetObjectValue(SelectionSet selectionSet) ArgumentNullException.ThrowIfNull(selectionSet); + if (Type is { } type && !type.IsObjectType()) + { + throw new InvalidOperationException( + string.Format(ResultElement_SetObjectValue_NotObjectType, type)); + } + var obj = _parent.CreateObject(_cursor, selectionSet: selectionSet); - _parent.AssignCompositeValue(this, obj); + _parent.AssignObjectOrArray(this, obj); + } + + public void SetObjectValue(int propertyCount) + { + CheckValidInstance(); + + ArgumentOutOfRangeException.ThrowIfLessThan(propertyCount, 0); + + var obj = _parent.CreateObject(_cursor, propertyCount); + _parent.AssignObjectOrArray(this, obj); + } + + public void SetPropertyName(ReadOnlySpan propertyName) + { + CheckValidInstance(); + + if (propertyName.Length == 0) + { + throw new ArgumentNullException(nameof(propertyName)); + } + + var requiredBytes = Encoding.UTF8.GetByteCount(propertyName); + byte[]? rented = null; + var buffer = JsonConstants.StackallocByteThreshold <= requiredBytes + ? stackalloc byte[propertyName.Length] + : (rented = ArrayPool.Shared.Rent(requiredBytes)); + + try + { + var usedBytes = Encoding.UTF8.GetBytes(propertyName, buffer); + _parent.AssignPropertyName(this, buffer[..usedBytes]); + } + finally + { + if (rented is not null) + { + ArrayPool.Shared.Return(rented); + } + } } - internal void SetArrayValue(int length) + public void SetPropertyName(ReadOnlySpan propertyName) + { + CheckValidInstance(); + + if (propertyName.Length == 0) + { + throw new ArgumentNullException(nameof(propertyName)); + } + + _parent.AssignPropertyName(this, propertyName); + } + + public void SetArrayValue(int length) { CheckValidInstance(); ArgumentOutOfRangeException.ThrowIfNegative(length); + if (Type is { } type && !type.IsListType()) + { + throw new InvalidOperationException( + string.Format(ResultElement_SetArrayValue_NotListType, type)); + } + var arr = _parent.CreateArray(_cursor, length); - _parent.AssignCompositeValue(this, arr); + _parent.AssignObjectOrArray(this, arr); } - internal void SetLeafValue(SourceResultElement source) + public void SetNullValue() { CheckValidInstance(); - _parent.AssignSourceValue(this, source); + _parent.AssignNullValue(this); } - internal void SetNullValue() + public void SetBooleanValue(bool value) { CheckValidInstance(); - _parent.AssignNullValue(this); + _parent.AssignBooleanValue(this, value); + } + + public void SetStringValue(ReadOnlySpan value) + { + CheckValidInstance(); + + _parent.AssignStringValue(this, value); + } + + public void SetStringValue(ReadOnlySpan value) + { + CheckValidInstance(); + + // If we have an empty string, we can directly assign it. + if (value.Length == 0) + { + _parent.AssignStringValue(this, []); + return; + } + + var requiredBytes = Encoding.UTF8.GetByteCount(value); + byte[]? rented = null; + var buffer = JsonConstants.StackallocByteThreshold <= requiredBytes + ? stackalloc byte[value.Length] + : (rented = ArrayPool.Shared.Rent(requiredBytes)); + + try + { + var usedBytes = Encoding.UTF8.GetBytes(value, buffer); + _parent.AssignStringValue(this, buffer[..usedBytes]); + } + finally + { + if (rented is not null) + { + ArrayPool.Shared.Return(rented); + } + } + } + + public void SetNumberValue(ReadOnlySpan value) + { + CheckValidInstance(); + + _parent.AssignNumberValue(this, value); + } + + public void SetNumberValue(sbyte value) + { + CheckValidInstance(); + + Span buffer = stackalloc byte[4]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + _parent.AssignNumberValue(this, buffer[..bytesWritten]); + } + + public void SetNumberValue(byte value) + { + CheckValidInstance(); + + Span buffer = stackalloc byte[3]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + _parent.AssignNumberValue(this, buffer[..bytesWritten]); + } + + public void SetNumberValue(short value) + { + CheckValidInstance(); + + Span buffer = stackalloc byte[6]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + _parent.AssignNumberValue(this, buffer[..bytesWritten]); + } + + public void SetNumberValue(ushort value) + { + CheckValidInstance(); + + Span buffer = stackalloc byte[5]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + _parent.AssignNumberValue(this, buffer[..bytesWritten]); + } + + public void SetNumberValue(int value) + { + CheckValidInstance(); + + Span buffer = stackalloc byte[11]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + _parent.AssignNumberValue(this, buffer[..bytesWritten]); + } + + public void SetNumberValue(uint value) + { + CheckValidInstance(); + + Span buffer = stackalloc byte[10]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + _parent.AssignNumberValue(this, buffer[..bytesWritten]); + } + + public void SetNumberValue(long value) + { + CheckValidInstance(); + + Span buffer = stackalloc byte[20]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + _parent.AssignNumberValue(this, buffer[..bytesWritten]); + } + + public void SetNumberValue(ulong value) + { + CheckValidInstance(); + + Span buffer = stackalloc byte[20]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + _parent.AssignNumberValue(this, buffer[..bytesWritten]); + } + + public void SetNumberValue(float value) + { + CheckValidInstance(); + + Span buffer = stackalloc byte[16]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + _parent.AssignNumberValue(this, buffer[..bytesWritten]); + } + + public void SetNumberValue(double value) + { + CheckValidInstance(); + + Span buffer = stackalloc byte[24]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + _parent.AssignNumberValue(this, buffer[..bytesWritten]); + } + + public void SetNumberValue(decimal value) + { + CheckValidInstance(); + + Span buffer = stackalloc byte[31]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + _parent.AssignNumberValue(this, buffer[..bytesWritten]); } + /// public override string ToString() { switch (TokenType) diff --git a/src/HotChocolate/Core/src/Types/Text/Json/CompositeResultProperty.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultProperty.cs similarity index 89% rename from src/HotChocolate/Core/src/Types/Text/Json/CompositeResultProperty.cs rename to src/HotChocolate/Core/src/Types/Text/Json/ResultProperty.cs index d34e5576f8c..695bc20aa08 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/CompositeResultProperty.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultProperty.cs @@ -1,16 +1,16 @@ using System.Diagnostics; using System.Text.Json; -using HotChocolate.Fusion.Execution.Nodes; +using HotChocolate.Execution.Processing; -namespace HotChocolate.Fusion.Text.Json; +namespace HotChocolate.Text.Json; /// /// Represents a single property for a JSON object. /// [DebuggerDisplay("{DebuggerDisplay,nq}")] -public readonly struct CompositeResultProperty +public readonly struct ResultProperty { - internal CompositeResultProperty(CompositeResultElement value) + internal ResultProperty(ResultElement value) { Value = value; } @@ -18,7 +18,7 @@ internal CompositeResultProperty(CompositeResultElement value) /// /// The value of this property. /// - public CompositeResultElement Value { get; } + public ResultElement Value { get; } /// /// The name of this property. @@ -26,9 +26,9 @@ internal CompositeResultProperty(CompositeResultElement value) /// public string Name => Value.GetPropertyName(); - public Selection? Selection => Value.Selection; + public ISelection? Selection => Value.Selection; - public Selection GetRequiredSelection() => Value.AssertSelection(); + public ISelection AssertSelection() => Value.AssertSelection(); /// /// Compares to the name of this property. @@ -115,9 +115,9 @@ public override string ToString() private string DebuggerDisplay => Value.ValueKind == JsonValueKind.Undefined ? "" : $"\"{ToString()}\""; - public void Deconstruct(out Selection selection, out CompositeResultElement value) + public void Deconstruct(out ISelection selection, out ResultElement value) { - selection = GetRequiredSelection(); + selection = AssertSelection(); value = Value; } } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs index 551df5e0349..a72d6ac3b94 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs @@ -24,6 +24,13 @@ internal CompositeResultElement(CompositeResultDocument parent, CompositeResultD _cursor = cursor; } + /// + /// Writes this element as JSON to the specified buffer writer. + /// + /// The buffer writer to write to. + /// + /// true to write indented JSON; otherwise, false. + /// public void WriteTo(IBufferWriter writer, bool indented = false) { var formatter = new CompositeResultDocument.RawJsonFormatter(_parent, writer, indented); @@ -41,25 +48,19 @@ public void WriteTo(IBufferWriter writer, bool indented = false) private ElementTokenType TokenType => _parent?.GetElementTokenType(_cursor) ?? ElementTokenType.None; /// - /// The that the value is. + /// Gets the of this element. /// - /// - /// The parent has been disposed. - /// public JsonValueKind ValueKind => TokenType.ToValueKind(); /// - /// Get the value at a specified index when the current value is a - /// . + /// Gets the element at the specified index when the current element is an array. /// + /// The zero-based index of the element to get. /// - /// This value's is not . + /// This element's is not . /// /// - /// is not in the range [0, ()). - /// - /// - /// The parent has been disposed. + /// is not in the range [0, ()). /// public CompositeResultElement this[int index] { @@ -71,6 +72,9 @@ public CompositeResultElement this[int index] } } + /// + /// Gets the operation this element belongs to. + /// public Operation Operation { get @@ -81,6 +85,10 @@ public Operation Operation } } + /// + /// Gets the if this element represents the data of a selection set; + /// otherwise, null. + /// public SelectionSet? SelectionSet { get @@ -91,6 +99,10 @@ public SelectionSet? SelectionSet } } + /// + /// Gets the if this element represents the data of a field selection; + /// otherwise, null. + /// public Selection? Selection { get @@ -107,6 +119,10 @@ public Selection? Selection } } + /// + /// Gets the if this element represents the data of a field selection; + /// otherwise, null. + /// public IType? Type { get @@ -134,6 +150,9 @@ public IType? Type } } + /// + /// Gets a value indicating whether this element has been invalidated during null propagation. + /// public bool IsInvalidated { get @@ -144,6 +163,9 @@ public bool IsInvalidated } } + /// + /// Gets a value indicating whether this element is either null or was invalidated during null propagation. + /// public bool IsNullOrInvalidated { get @@ -157,6 +179,9 @@ public bool IsNullOrInvalidated } } + /// + /// Gets the path to this element within the result document. + /// public Path Path { get @@ -167,6 +192,9 @@ public Path Path } } + /// + /// Gets the parent element that contains this element. + /// public CompositeResultElement Parent { get @@ -177,6 +205,9 @@ public CompositeResultElement Parent } } + /// + /// Gets a value indicating whether this element is nullable according to the GraphQL type system. + /// public bool IsNullable { get @@ -192,6 +223,10 @@ public bool IsNullable } } + /// + /// Gets a value indicating whether this element represents internal data + /// that is required for processing and must not be written to the GraphQL response. + /// public bool IsInternal { get @@ -202,6 +237,15 @@ public bool IsInternal } } + /// + /// Gets the for this element. + /// + /// + /// The instance. + /// + /// + /// This element does not represent the data of a selection set. + /// public SelectionSet AssertSelectionSet() { var selectionSet = SelectionSet; @@ -214,6 +258,15 @@ public SelectionSet AssertSelectionSet() return selectionSet; } + /// + /// Gets the for this element. + /// + /// + /// The instance. + /// + /// + /// This element does not represent the data of a field selection. + /// public Selection AssertSelection() { var selection = Selection; @@ -226,6 +279,15 @@ public Selection AssertSelection() return selection; } + /// + /// Gets the for this element. + /// + /// + /// The instance. + /// + /// + /// This element does not represent the data of a field selection. + /// public IType AssertType() { var type = Type; @@ -238,6 +300,10 @@ public IType AssertType() return type; } + /// + /// Marks this element as invalidated, which occurs during null propagation + /// when a non-nullable field returns null. + /// public void Invalidate() { CheckValidInstance(); @@ -246,8 +312,11 @@ public void Invalidate() } /// - /// Get the number of values contained within the current array value. + /// Gets the number of elements contained within the current array element. /// + /// + /// The number of elements in the array. + /// public int GetArrayLength() { CheckValidInstance(); @@ -256,8 +325,11 @@ public int GetArrayLength() } /// - /// Get the number of properties contained within the current object value. + /// Gets the number of properties contained within the current object element. /// + /// + /// The number of properties in the object. + /// public int GetPropertyCount() { CheckValidInstance(); @@ -265,6 +337,14 @@ public int GetPropertyCount() return _parent.GetPropertyCount(_cursor); } + /// + /// Gets a property by name when the current element is an object. + /// + /// The name of the property to find. + /// The property value. + /// + /// No property with the specified name was found. + /// public CompositeResultElement GetProperty(string propertyName) { ArgumentNullException.ThrowIfNull(propertyName); @@ -277,6 +357,14 @@ public CompositeResultElement GetProperty(string propertyName) throw new KeyNotFoundException(); } + /// + /// Gets a property by UTF-8 encoded name when the current element is an object. + /// + /// The UTF-8 encoded name of the property to find. + /// The property value. + /// + /// No property with the specified name was found. + /// public CompositeResultElement GetProperty(ReadOnlySpan utf8PropertyName) { if (TryGetProperty(utf8PropertyName, out var property)) @@ -287,6 +375,16 @@ public CompositeResultElement GetProperty(ReadOnlySpan utf8PropertyName) throw new KeyNotFoundException(); } + /// + /// Attempts to get a property by name when the current element is an object. + /// + /// The name of the property to find. + /// + /// When this method returns, contains the property value if found; otherwise, the default value. + /// + /// + /// true if the property was found; otherwise, false. + /// public bool TryGetProperty(string propertyName, out CompositeResultElement value) { ArgumentNullException.ThrowIfNull(propertyName); @@ -294,6 +392,16 @@ public bool TryGetProperty(string propertyName, out CompositeResultElement value return _parent.TryGetNamedPropertyValue(_cursor, propertyName, out value); } + /// + /// Attempts to get a property by UTF-8 encoded name when the current element is an object. + /// + /// The UTF-8 encoded name of the property to find. + /// + /// When this method returns, contains the property value if found; otherwise, the default value. + /// + /// + /// true if the property was found; otherwise, false. + /// public bool TryGetProperty(ReadOnlySpan utf8PropertyName, out CompositeResultElement value) { CheckValidInstance(); @@ -301,6 +409,13 @@ public bool TryGetProperty(ReadOnlySpan utf8PropertyName, out CompositeRes return _parent.TryGetNamedPropertyValue(_cursor, utf8PropertyName, out value); } + /// + /// Gets the value as a . + /// + /// The boolean value. + /// + /// This element's is not or . + /// public bool GetBoolean() { var type = TokenType; @@ -324,6 +439,10 @@ static bool ThrowJsonElementWrongTypeException(ElementTokenType actualType) } } + /// + /// Gets the value as a . + /// + /// The string value, or null if this element is a JSON null. public string? GetString() { CheckValidInstance(); @@ -331,6 +450,13 @@ static bool ThrowJsonElementWrongTypeException(ElementTokenType actualType) return _parent.GetString(_cursor, ElementTokenType.String); } + /// + /// Gets the value as a non-null . + /// + /// The string value. + /// + /// This element is a JSON null. + /// public string AssertString() { CheckValidInstance(); @@ -338,6 +464,11 @@ public string AssertString() return _parent.GetRequiredString(_cursor, ElementTokenType.String); } + /// + /// Attempts to get the value as an . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetSByte(out sbyte value) { CheckValidInstance(); @@ -345,8 +476,18 @@ public bool TryGetSByte(out sbyte value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as an . + /// + /// The value. + /// The value cannot be parsed as an . public sbyte GetSByte() => TryGetSByte(out var value) ? value : throw new FormatException(); + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetByte(out byte value) { CheckValidInstance(); @@ -354,6 +495,11 @@ public bool TryGetByte(out byte value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public byte GetByte() { if (TryGetByte(out var value)) @@ -364,6 +510,11 @@ public byte GetByte() throw new FormatException(); } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetInt16(out short value) { CheckValidInstance(); @@ -371,6 +522,11 @@ public bool TryGetInt16(out short value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public short GetInt16() { if (TryGetInt16(out var value)) @@ -381,6 +537,11 @@ public short GetInt16() throw new FormatException(); } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetUInt16(out ushort value) { CheckValidInstance(); @@ -388,6 +549,11 @@ public bool TryGetUInt16(out ushort value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public ushort GetUInt16() { if (TryGetUInt16(out var value)) @@ -398,6 +564,11 @@ public ushort GetUInt16() throw new FormatException(); } + /// + /// Attempts to get the value as an . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetInt32(out int value) { CheckValidInstance(); @@ -405,6 +576,11 @@ public bool TryGetInt32(out int value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as an . + /// + /// The value. + /// The value cannot be parsed as an . public int GetInt32() { if (!TryGetInt32(out var value)) @@ -415,6 +591,11 @@ public int GetInt32() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetUInt32(out uint value) { CheckValidInstance(); @@ -422,6 +603,11 @@ public bool TryGetUInt32(out uint value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public uint GetUInt32() { if (!TryGetUInt32(out var value)) @@ -432,6 +618,11 @@ public uint GetUInt32() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetInt64(out long value) { CheckValidInstance(); @@ -439,6 +630,11 @@ public bool TryGetInt64(out long value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public long GetInt64() { if (!TryGetInt64(out var value)) @@ -449,6 +645,11 @@ public long GetInt64() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetUInt64(out ulong value) { CheckValidInstance(); @@ -456,6 +657,11 @@ public bool TryGetUInt64(out ulong value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public ulong GetUInt64() { if (!TryGetUInt64(out var value)) @@ -466,6 +672,11 @@ public ulong GetUInt64() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetDouble(out double value) { CheckValidInstance(); @@ -473,6 +684,11 @@ public bool TryGetDouble(out double value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public double GetDouble() { if (!TryGetDouble(out var value)) @@ -483,6 +699,11 @@ public double GetDouble() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetSingle(out float value) { CheckValidInstance(); @@ -490,6 +711,11 @@ public bool TryGetSingle(out float value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public float GetSingle() { if (!TryGetSingle(out var value)) @@ -500,6 +726,11 @@ public float GetSingle() return value; } + /// + /// Attempts to get the value as a . + /// + /// When this method returns, contains the parsed value. + /// true if the value could be parsed; otherwise, false. public bool TryGetDecimal(out decimal value) { CheckValidInstance(); @@ -507,6 +738,11 @@ public bool TryGetDecimal(out decimal value) return _parent.TryGetValue(_cursor, out value); } + /// + /// Gets the value as a . + /// + /// The value. + /// The value cannot be parsed as a . public decimal GetDecimal() { if (!TryGetDecimal(out var value)) @@ -531,6 +767,10 @@ internal ReadOnlySpan GetPropertyNameRaw() return _parent.GetPropertyNameRaw(_cursor); } + /// + /// Gets the raw JSON text representing this element. + /// + /// The raw JSON text. public string GetRawText() { CheckValidInstance(); @@ -545,6 +785,13 @@ internal ReadOnlySpan GetRawValue(bool includeQuotes = true) return _parent.GetRawValue(_cursor, includeQuotes: true); } + /// + /// Compares the text of this element to the specified string. + /// + /// The text to compare against. + /// + /// true if this element's value equals the specified text; otherwise, false. + /// public bool ValueEquals(string? text) { if (TokenType == ElementTokenType.Null) @@ -555,6 +802,13 @@ public bool ValueEquals(string? text) return TextEqualsHelper(text.AsSpan(), isPropertyName: false); } + /// + /// Compares the text of this element to the specified UTF-8 encoded text. + /// + /// The UTF-8 encoded text to compare against. + /// + /// true if this element's value equals the specified text; otherwise, false. + /// public bool ValueEquals(ReadOnlySpan utf8Text) { if (TokenType == ElementTokenType.Null) @@ -567,6 +821,13 @@ public bool ValueEquals(ReadOnlySpan utf8Text) return TextEqualsHelper(utf8Text, isPropertyName: false, shouldUnescape: true); } + /// + /// Compares the text of this element to the specified character span. + /// + /// The text to compare against. + /// + /// true if this element's value equals the specified text; otherwise, false. + /// public bool ValueEquals(ReadOnlySpan text) { if (TokenType == ElementTokenType.Null) @@ -600,6 +861,13 @@ internal string GetPropertyRawText() return _parent.GetPropertyRawValueAsString(_cursor); } + /// + /// Gets an enumerator to enumerate the elements of this array. + /// + /// An enumerator for the array elements. + /// + /// This element's is not . + /// public ArrayEnumerator EnumerateArray() { CheckValidInstance(); @@ -620,6 +888,13 @@ public ArrayEnumerator EnumerateArray() return new ArrayEnumerator(this); } + /// + /// Gets an enumerator to enumerate the properties of this object. + /// + /// An enumerator for the object properties. + /// + /// This element's is not . + /// public ObjectEnumerator EnumerateObject() { CheckValidInstance(); @@ -671,6 +946,7 @@ internal void SetNullValue() _parent.AssignNullValue(this); } + /// public override string ToString() { switch (TokenType) diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultProperty.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultProperty.cs index d34e5576f8c..e61eab856d8 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultProperty.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultProperty.cs @@ -28,7 +28,7 @@ internal CompositeResultProperty(CompositeResultElement value) public Selection? Selection => Value.Selection; - public Selection GetRequiredSelection() => Value.AssertSelection(); + public Selection AssertSelection() => Value.AssertSelection(); /// /// Compares to the name of this property. @@ -117,7 +117,7 @@ private string DebuggerDisplay public void Deconstruct(out Selection selection, out CompositeResultElement value) { - selection = GetRequiredSelection(); + selection = AssertSelection(); value = Value; } } From 971333fb830b529475f640d5c9892189aae936a0 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 27 Nov 2025 22:52:04 +0100 Subject: [PATCH 008/144] wip --- .../Types/Execution/Processing/IOperation.cs | 2 +- .../Types/Execution/Processing/ISelection.cs | 2 +- .../Execution/Processing/ISelectionSet.cs | 30 ++++ .../Types/Execution/Processing/Operation.cs | 4 + .../OperationCompiler.SelectionSetInfo.cs | 6 +- .../Execution/Processing/OperationCompiler.cs | 14 +- .../Processing/OperationContext.Operation.cs | 2 +- .../Types/Execution/Processing/Selection.cs | 6 +- .../Processing/SelectionCollection.cs | 12 +- .../Execution/Processing/SelectionLookup.cs | 156 ++++++++++++++++++ .../Execution/Processing/SelectionSet.cs | 16 +- .../Text/Json/JsonReaderHelper.cs | 2 +- 12 files changed, 229 insertions(+), 23 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/SelectionLookup.cs diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/IOperation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/IOperation.cs index 9ad9097c0c2..29635565407 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/IOperation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/IOperation.cs @@ -104,7 +104,7 @@ public interface IOperation : IHasReadOnlyContextData, IEnumerable /// Returns the include flags for the specified variable values. /// - long CreateIncludeFlags(IVariableValueCollection variables); + ulong CreateIncludeFlags(IVariableValueCollection variables); bool TryGetState(out TState? state); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs index f6979a4a84f..5eba9ad5385 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs @@ -109,5 +109,5 @@ public interface ISelection : IOptionalSelection /// /// Returns if this selection is annotated with the stream directive. /// - bool HasStreamDirective(long includeFlags); + bool HasStreamDirective(ulong includeFlags); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionSet.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionSet.cs index df45aea7ef5..6ef00358cc4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionSet.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionSet.cs @@ -1,3 +1,5 @@ +using System.Diagnostics.CodeAnalysis; + namespace HotChocolate.Execution.Processing; /// @@ -31,4 +33,32 @@ public interface ISelectionSet /// Gets the declaring operation. /// IOperation DeclaringOperation { get; } + + /// + /// Tries to resolve a selection by name. + /// + /// + /// The selection response name. + /// + /// + /// The resolved selection. + /// + /// + /// Returns true if the selection was successfully resolved. + /// + bool TryGetSelection(string responseName, [NotNullWhen(true)] out ISelection? selection); + + /// + /// Tries to resolve a selection by name. + /// + /// + /// The selection response name. + /// + /// + /// The resolved selection. + /// + /// + /// Returns true if the selection was successfully resolved. + /// + bool TryGetSelection(ReadOnlySpan utf8ResponseName, [NotNullWhen(true)] out ISelection? selection); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs index 0c2e3384b3f..ed5b4c63bf0 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs @@ -9,7 +9,11 @@ namespace HotChocolate.Execution.Processing; internal sealed class Operation : IOperation { +#if NET9_0_OR_GREATER + private readonly Lock _writeLock = new(); +#else private readonly object _writeLock = new(); +#endif private SelectionVariants[] _selectionVariants = []; private IncludeCondition[] _includeConditions = []; private ImmutableDictionary _contextData = diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.SelectionSetInfo.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.SelectionSetInfo.cs index a6363e4c195..7c46db01ff7 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.SelectionSetInfo.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.SelectionSetInfo.cs @@ -4,10 +4,12 @@ namespace HotChocolate.Execution.Processing; public sealed partial class OperationCompiler { - internal readonly struct SelectionSetInfo(SelectionSetNode selectionSet, long includeCondition) + internal readonly struct SelectionSetInfo( + SelectionSetNode selectionSet, + ulong includeCondition) { public SelectionSetNode SelectionSet { get; } = selectionSet; - public long IncludeCondition { get; } = includeCondition; + public ulong IncludeCondition { get; } = includeCondition; } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 02446a02fbd..174bc3ca348 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -370,7 +370,7 @@ private void CollectFields(CompilerContext context) private void CollectFields( CompilerContext context, SelectionSetNode selectionSet, - long includeCondition) + ulong includeCondition) { for (var j = 0; j < selectionSet.Selections.Count; j++) { @@ -411,7 +411,7 @@ private void ResolveFields( private void ResolveField( CompilerContext context, FieldNode selection, - long includeCondition) + ulong includeCondition) { includeCondition = GetSelectionIncludeCondition(selection, includeCondition); @@ -514,7 +514,7 @@ private void ResolveFragment( NamedTypeNode? typeCondition, SelectionSetNode selectionSet, IReadOnlyList directives, - long includeCondition) + ulong includeCondition) { if (typeCondition is null || (context.Schema.Types.TryGetType(typeCondition, out IType? typeCon) @@ -528,7 +528,7 @@ private void ResolveFragment( var nullValue = NullValueNode.Default; var ifValue = deferDirective?.GetArgumentValue(DirectiveNames.Defer.Arguments.If) ?? nullValue; - long ifConditionFlags = 0; + ulong ifConditionFlags = 0; if (ifValue.Kind is not SyntaxKind.NullValue) { @@ -649,9 +649,9 @@ private SelectionVariants GetOrCreateSelectionVariants(int selectionSetId) return variants; } - private long GetSelectionIncludeCondition( + private ulong GetSelectionIncludeCondition( ISelectionNode selectionSyntax, - long parentIncludeCondition) + ulong parentIncludeCondition) { var condition = IncludeCondition.FromSelection(selectionSyntax); @@ -697,7 +697,7 @@ private long GetSelectionIncludeCondition( private long GetSelectionIncludeCondition( IncludeCondition condition, - long parentIncludeCondition) + ulong parentIncludeCondition) { var pos = Array.IndexOf(_includeConditions, condition); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs index 8239f55055b..0005bf324d2 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs @@ -44,7 +44,7 @@ public IVariableValueCollection Variables /// /// Gets the include flags for the current request. /// - public long IncludeFlags { get; private set; } + public ulong IncludeFlags { get; private set; } /// /// Gets the value representing the instance of the diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index 1ed864d2455..9470b054e68 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -14,7 +14,7 @@ public class Selection : ISelection { private static readonly ArgumentMap s_emptyArguments = ArgumentMap.Empty; private ulong[] _includeConditions; - private long _streamIfCondition; + private ulong _streamIfCondition; private Flags _flags; private FieldNode _syntaxNode; private FieldNode[] _syntaxNodes; @@ -136,7 +136,7 @@ protected Selection(Selection selection) public ArgumentMap Arguments { get; } /// - public bool HasStreamDirective(long includeFlags) + public bool HasStreamDirective(ulong includeFlags) => (_flags & Flags.Stream) == Flags.Stream && (_streamIfCondition is 0 || (includeFlags & _streamIfCondition) != _streamIfCondition); @@ -313,7 +313,7 @@ internal void SetSelectionSetId(int selectionSetId) SelectionSetId = selectionSetId; } - internal void MarkAsStream(long ifCondition) + internal void MarkAsStream(ulong ifCondition) { if ((_flags & Flags.Sealed) == Flags.Sealed) { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionCollection.cs index 58fb04ac373..6a7370dfe04 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionCollection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionCollection.cs @@ -14,7 +14,7 @@ internal sealed class SelectionCollection( Schema schema, IOperation operation, ISelection[] selections, - long includeFlags) + ulong includeFlags) : ISelectionCollection { private readonly Schema _schema = schema ?? throw new ArgumentNullException(nameof(schema)); @@ -119,7 +119,7 @@ public bool IsSelected(string fieldName) static bool IsChildSelected( IOperation operation, - long includeFlags, + ulong includeFlags, ObjectType objectType, ISelection parent, string fieldName) @@ -199,7 +199,7 @@ public bool IsSelected(string fieldName1, string fieldName2) static bool IsChildSelected( IOperation operation, - long includeFlags, + ulong includeFlags, ObjectType objectType, ISelection parent, string fieldName1, @@ -284,7 +284,7 @@ public bool IsSelected(string fieldName1, string fieldName2, string fieldName3) static bool IsChildSelected( IOperation operation, - long includeFlags, + ulong includeFlags, ObjectType objectType, ISelection parent, string fieldName1, @@ -360,7 +360,7 @@ public bool IsSelected(ISet fieldNames) static bool IsChildSelected( IOperation operation, - long includeFlags, + ulong includeFlags, ObjectType objectType, ISelection parent, ISet fieldNames) @@ -481,7 +481,7 @@ private bool CollectSelections( private static void CollectFields( ReadOnlySpan fieldNames, - long includeFlags, + ulong includeFlags, ref ISelection[] buffer, ISelectionSet selectionSet, int index, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionLookup.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionLookup.cs new file mode 100644 index 00000000000..3986a6aab5a --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionLookup.cs @@ -0,0 +1,156 @@ +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace HotChocolate.Execution.Processing; + +internal sealed class SelectionLookup +{ + private readonly Entry[] _table; + private readonly int _seed; + private readonly int _mask; + + private SelectionLookup(Entry[] table, int seed, int mask) + { + _table = table; + _seed = seed; + _mask = mask; + } + + public static SelectionLookup Create(SelectionSet selectionSet) + { + var selections = selectionSet.Selections; + var tableSize = NextPowerOfTwo(Math.Max(selections.Count * 2, 4)); + var mask = tableSize - 1; + var table = new Entry[tableSize]; + + // We try multiple seeds to find one with minimal clustering + var bestSeed = 0; + var bestMaxProbeLength = int.MaxValue; + + for (var seed = 0; seed < 100; seed++) + { + Array.Clear(table); + var maxProbeLength = 0; + + foreach (var selection in selections) + { + var hashCode = ComputeHash(selection.Utf8ResponseName, seed); + var index = hashCode & mask; + var probeLength = 0; + + // Linear probe to find empty slot + while (table[index].Selection != null) + { + index = (index + 1) & mask; + probeLength++; + } + + table[index] = new Entry(hashCode, selection); + maxProbeLength = Math.Max(maxProbeLength, probeLength); + } + + // Track best seed + if (maxProbeLength < bestMaxProbeLength) + { + bestMaxProbeLength = maxProbeLength; + bestSeed = seed; + + // If we found excellent distribution, stop early + if (maxProbeLength <= 2) + { + break; + } + } + } + + // Rebuild table with best seed + Array.Clear(table); + foreach (var selection in selections) + { + var hashCode = ComputeHash(selection.Utf8ResponseName, bestSeed); + var index = hashCode & mask; + + while (table[index].Selection != null) + { + index = (index + 1) & mask; + } + + table[index] = new Entry(hashCode, selection); + } + + return new SelectionLookup(table, bestSeed, mask); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryGetSelection(ReadOnlySpan name, [NotNullWhen(true)] out ISelection? selection) + { + var table = _table.AsSpan(); + + if (table.Length == 0) + { + selection = null!; + return false; + } + + var hashCode = ComputeHash(name, _seed); + var index = hashCode & _mask; + + while (true) + { + ref var entry = ref table[index]; + + // if we hit an empty slot, then there is no selection with the specified name. + if (entry.Selection is null) + { + selection = null; + return false; + } + + if (entry.HashCode == hashCode && name.SequenceEqual(entry.Selection.Utf8ResponseName)) + { + selection = entry.Selection; + return true; + } + + // we had a hash collision need to find the next slot. + index = (index + 1) & _mask; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static int ComputeHash(ReadOnlySpan bytes, int seed) + { + var hash = (uint)seed; + + foreach (var b in bytes) + { + hash = hash * 31 + b; + } + + return (int)(hash & 0x7FFFFFFF); + } + + private static int NextPowerOfTwo(int n) + { + if (n <= 0) + { + return 1; + } + + n--; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n++; + + return n; + } + + private readonly struct Entry(int hashCode, ISelection selection) + { + public readonly int HashCode = hashCode; + public readonly ISelection? Selection = selection; + } +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs index cd38b9f6388..88223788ca3 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs @@ -1,3 +1,5 @@ +using System.Collections.Frozen; +using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using HotChocolate.Types; @@ -13,6 +15,8 @@ internal sealed class SelectionSet : ISelectionSet { private static readonly Fragment[] s_empty = []; private readonly Selection[] _selections; + private readonly FrozenDictionary _responseNameLookup; + private readonly SelectionLookup _utf8ResponseNameLookup; private readonly Fragment[] _fragments; private Flags _flags; @@ -30,7 +34,7 @@ internal sealed class SelectionSet : ISelectionSet /// some of the execution. /// /// - /// Defines if this list needs post processing for skip and include. + /// Defines if this list needs post-processing for skip and include. /// public SelectionSet( int id, @@ -40,6 +44,8 @@ public SelectionSet( { Id = id; _selections = selections; + _responseNameLookup = _selections.ToFrozenDictionary(t => t.ResponseName, ISelection (t) => t); + _utf8ResponseNameLookup = SelectionLookup.Create(this); _fragments = fragments ?? s_empty; _flags = isConditional ? Flags.Conditional : Flags.None; } @@ -59,6 +65,14 @@ public SelectionSet( /// public IOperation DeclaringOperation { get; private set; } = null!; + /// + public bool TryGetSelection(string responseName, [NotNullWhen(true)] out ISelection? selection) + => _responseNameLookup.TryGetValue(responseName, out selection); + + /// + public bool TryGetSelection(ReadOnlySpan utf8ResponseName, [NotNullWhen(true)] out ISelection? selection) + => _utf8ResponseNameLookup.TryGetSelection(utf8ResponseName, out selection); + /// /// Completes the selection set without sealing it. /// diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs index 100366d0af1..edbbcac3f24 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs @@ -10,7 +10,7 @@ namespace HotChocolate.Fusion.Text.Json; #else -using static HotChocolate.Properties.TypeResources; +using static HotChocolate.Properties.TextJsonResources; namespace HotChocolate.Text.Json; #endif From 0388821aaee84e6c6dc34ddc5fc5ffa8979f6bba Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 28 Nov 2025 11:34:39 +0100 Subject: [PATCH 009/144] wip --- .../ISelectionSet.cs | 5 + .../Types/Execution/Processing/ArgumentMap.cs | 91 +- .../Processing/CreateFieldPipeline.cs | 10 + .../Processing/DeferredExecutionTask.cs | 85 -- .../Processing/DeferredExecutionTaskResult.cs | 20 - .../Execution/Processing/DeferredFragment.cs | 98 -- .../Execution/Processing/DeferredStream.cs | 158 --- .../Processing/DeferredWorkScheduler.cs | 178 --- .../Execution/Processing/DeferredWorkState.cs | 215 ---- .../Types/Execution/Processing/Fragment.cs | 52 - .../Types/Execution/Processing/IFragment.cs | 46 - .../Types/Execution/Processing/IOperation.cs | 194 --- .../Processing/IOptionalSelection.cs | 31 - .../Types/Execution/Processing/ISelection.cs | 113 -- .../Execution/Processing/ISelectionSet.cs | 64 - .../Execution/Processing/IncludeCondition.cs | 173 --- .../Types/Execution/Processing/Operation.cs | 353 +++--- .../OperationCompiler.CoerceArgumentValues.cs | 122 ++ .../Execution/Processing/OperationCompiler.cs | 1074 +++++++---------- .../Processing/OperationFeatureCollection.cs | 113 ++ .../Types/Execution/Processing/Selection.cs | 365 ++---- .../Execution/Processing/SelectionSet.cs | 108 +- .../Execution/Processing/SelectionVariants.cs | 194 --- ...s => _OperationCompiler.ArgumentValues.cs} | 5 - .../Processing/_OperationCompiler.cs | 787 ++++++++++++ .../Core/src/Types/HotChocolate.Types.csproj | 2 + .../Nodes/IncludeConditionCollection.cs | 9 +- .../Execution/Nodes/SelectionSet.cs | 19 +- 28 files changed, 1903 insertions(+), 2781 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/CreateFieldPipeline.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTask.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTaskResult.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/DeferredFragment.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/DeferredStream.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkScheduler.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkState.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Fragment.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/IFragment.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/IOperation.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/IOptionalSelection.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionSet.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/IncludeCondition.cs create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/SelectionVariants.cs rename src/HotChocolate/Core/src/Types/Execution/Processing/{OperationCompiler.ArgumentValues.cs => _OperationCompiler.ArgumentValues.cs} (98%) create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.cs diff --git a/src/HotChocolate/Core/src/Execution.Operation.Abstractions/ISelectionSet.cs b/src/HotChocolate/Core/src/Execution.Operation.Abstractions/ISelectionSet.cs index 7bd3aeef3d3..a64c48f961a 100644 --- a/src/HotChocolate/Core/src/Execution.Operation.Abstractions/ISelectionSet.cs +++ b/src/HotChocolate/Core/src/Execution.Operation.Abstractions/ISelectionSet.cs @@ -2,6 +2,11 @@ namespace HotChocolate.Execution; +/// +/// A selection set is primarily composed of field selections. +/// When needed a selection set can preserve fragments so that the execution engine +/// can branch the processing of these fragments. +/// public interface ISelectionSet { /// diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ArgumentMap.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ArgumentMap.cs index e48ca10171d..354e3bdfd73 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ArgumentMap.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ArgumentMap.cs @@ -1,24 +1,25 @@ using System.Collections; +using System.Collections.Frozen; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; using HotChocolate.Resolvers; namespace HotChocolate.Execution.Processing; /// -/// Represents the map of argument values that can be accessed on the . +/// Represents a read-only map of argument values for a field selection in a GraphQL query. +/// This map provides efficient access to coerced argument values and tracks coercion errors. /// -public sealed class ArgumentMap - : IReadOnlyDictionary - , IEnumerable +public sealed class ArgumentMap : IReadOnlyDictionary { - private readonly Dictionary _arguments; - private readonly bool _isFinal; + private readonly FrozenDictionary _arguments; private readonly bool _hasErrors; internal ArgumentMap(Dictionary arguments) { - _arguments = arguments; - _isFinal = true; + _arguments = arguments.ToFrozenDictionary(StringComparer.Ordinal); + IsFullyCoercedNoErrors = true; if (_arguments.Count > 0) { @@ -26,7 +27,7 @@ internal ArgumentMap(Dictionary arguments) { if (!argument.IsFullyCoerced) { - _isFinal = false; + IsFullyCoercedNoErrors = false; } if (argument.HasError) @@ -38,49 +39,79 @@ internal ArgumentMap(Dictionary arguments) } /// - /// Gets an empty argument map. + /// Gets an empty argument map with no arguments. /// public static ArgumentMap Empty { get; } = new([]); /// - /// This indexer allows to access the - /// by the argument . + /// Gets the for the specified argument name. /// /// /// The argument name. /// + /// + /// The associated with the specified name. + /// + /// + /// Thrown when the specified is not found. + /// public ArgumentValue this[string name] => _arguments[name]; /// - /// Specifies if the argument map is fully coerced and has no errors. + /// Gets a value indicating whether all arguments in this map are + /// fully coerced and no errors occurred during coercion. /// - public bool IsFullyCoercedNoErrors => _isFinal && !_hasErrors; + /// + /// true if all arguments are fully coerced without errors; otherwise, false. + /// + public bool IsFullyCoercedNoErrors => field && !_hasErrors; /// - /// Specifies if this argument map has errors. + /// Gets a value indicating whether any argument in this map has coercion errors. /// + /// + /// true if at least one argument has errors; otherwise, false. + /// public bool HasErrors => _hasErrors; /// - /// The argument count. + /// Gets the number of arguments in this map. /// + /// + /// The total count of arguments. + /// public int Count => _arguments.Count; + /// + /// Gets an immutable array containing all argument names in this map. + /// + /// + /// An of argument names. + /// + public ImmutableArray ArgumentNames => _arguments.Keys; + IEnumerable IReadOnlyDictionary.Keys => _arguments.Keys; + /// + /// Gets an immutable array containing all argument values in this map. + /// + /// + /// An of instances. + /// + public ImmutableArray Values => _arguments.Values; + IEnumerable IReadOnlyDictionary.Values => _arguments.Values; /// - /// This method allows to check if an argument value with the specified - /// argument exists. + /// Determines whether this map contains an argument with the specified name. /// /// - /// The argument name. + /// The argument name to check. /// /// - /// true if the argument exists; otherwise, false. + /// true if an argument with the specified exists; otherwise, false. /// public bool ContainsName(string name) => _arguments.ContainsKey(name); @@ -88,17 +119,17 @@ bool IReadOnlyDictionary.ContainsKey(string key) => ContainsName(key); /// - /// Tries to get an by its . + /// Attempts to retrieve the associated with the specified argument name. /// /// - /// The argument name. + /// The argument name to locate. /// /// - /// The argument value. + /// When this method returns, contains the associated with the specified + /// , if found; otherwise, null. /// /// - /// true if an argument value with the specified - /// was retrieved; otherwise, false. + /// true if an argument with the specified was found; otherwise, false. /// public bool TryGetValue(string name, [NotNullWhen(true)] out ArgumentValue? value) => _arguments.TryGetValue(name, out value); @@ -108,14 +139,8 @@ bool IReadOnlyDictionary.TryGetValue( out ArgumentValue value) => TryGetValue(key, out value!); - /// - /// Gets an enumerator for the argument values. - /// - public IEnumerator GetEnumerator() - => _arguments.Values.GetEnumerator(); - - IEnumerator> - IEnumerable>.GetEnumerator() + /// + public IEnumerator> GetEnumerator() => _arguments.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/CreateFieldPipeline.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/CreateFieldPipeline.cs new file mode 100644 index 00000000000..6d2647936b3 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/CreateFieldPipeline.cs @@ -0,0 +1,10 @@ +using HotChocolate.Language; +using HotChocolate.Resolvers; +using HotChocolate.Types; + +namespace HotChocolate.Execution.Processing; + +internal delegate FieldDelegate CreateFieldPipeline( + Schema schema, + ObjectField field, + FieldNode selection); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTask.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTask.cs deleted file mode 100644 index f4de9856a12..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTask.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System.Collections.Immutable; -using HotChocolate.Utilities; -using static HotChocolate.WellKnownContextData; - -namespace HotChocolate.Execution.Processing; - -/// -/// Represents a deprioritized part of the query that will be executed after -/// the main execution has finished. -/// -internal abstract class DeferredExecutionTask -{ - /// - /// Initializes a new instance of . - /// - protected DeferredExecutionTask(IImmutableDictionary scopedContextData) - { - ScopedContextData = scopedContextData; - } - - /// - /// Gets the preserved scoped context from the parent resolver. - /// - public IImmutableDictionary ScopedContextData { get; } - - /// - /// Starts executing the deferred execution task. - /// - /// - /// The operation context owner. - /// - /// - /// The internal result identifier. - /// - /// - /// The internal identifier of the object that the result will be patched into. - /// - public void Begin(OperationContextOwner operationContextOwner, uint resultId, uint patchId) - { - // retrieve the task on which this task depends upon. We do this to ensure that the result - // of this task is not delivered before the parent result is delivered. - uint parentResultId = 0; - if (ScopedContextData.TryGetValue(DeferredResultId, out var value) - && value is uint id) - { - parentResultId = id; - } - - var capturedContext = ExecutionContext.Capture(); - if (capturedContext is null) - { - ExecuteAsync(operationContextOwner, resultId, parentResultId, patchId).FireAndForget(); - } - else - { - var execute = () => - ExecutionContext.Run( - capturedContext, - _ => ExecuteAsync(operationContextOwner, resultId, parentResultId, patchId), - null); - execute.FireAndForget(); - } - } - - /// - /// The task execution logic. - /// - /// - /// The operation context owner. - /// - /// - /// The internal result identifier. - /// - /// - /// The parent result identifier. - /// - /// - /// The internal identifier of the object that the result will be patched into. - /// - protected abstract Task ExecuteAsync( - OperationContextOwner operationContextOwner, - uint resultId, - uint parentResultId, - uint patchId); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTaskResult.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTaskResult.cs deleted file mode 100644 index 23fad4d1ea5..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredExecutionTaskResult.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace HotChocolate.Execution.Processing; - -internal readonly struct DeferredExecutionTaskResult -{ - public DeferredExecutionTaskResult( - uint taskId, - uint parentTaskId, - IOperationResult? result = null) - { - TaskId = taskId; - ParentTaskId = parentTaskId; - Result = result; - } - - public uint TaskId { get; } - - public uint ParentTaskId { get; } - - public IOperationResult? Result { get; } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredFragment.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredFragment.cs deleted file mode 100644 index 90faf750543..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredFragment.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System.Collections.Immutable; -using static HotChocolate.Execution.Processing.Tasks.ResolverTaskFactory; -using static HotChocolate.WellKnownContextData; - -namespace HotChocolate.Execution.Processing; - -/// -/// Represents a deprioritized fragment of the query that will be executed after -/// the main execution has finished. -/// -internal sealed class DeferredFragment : DeferredExecutionTask -{ - /// - /// Initializes a new instance of . - /// - public DeferredFragment( - IFragment fragment, - string? label, - Path path, - object? parent, - IImmutableDictionary scopedContextData) - : base(scopedContextData) - { - Fragment = fragment; - Label = label; - Path = path; - Parent = parent; - } - - /// - /// Gets the deferred fragment. - /// - public IFragment Fragment { get; } - - /// - /// If this argument label has a value other than null, it will be passed - /// on to the result of this defer directive. This label is intended to - /// give client applications a way to identify to which fragment a deferred - /// result belongs to. - /// - public string? Label { get; } - - /// - /// Gets the result path into which this deferred fragment shall be patched. - /// - public Path Path { get; } - - /// - /// Gets the parent / source value. - /// - public object? Parent { get; } - - protected override async Task ExecuteAsync( - OperationContextOwner operationContextOwner, - uint resultId, - uint parentResultId, - uint patchId) - { - try - { - var operationContext = operationContextOwner.OperationContext; - var parentResult = operationContext.Result.RentObject(Fragment.SelectionSet.Selections.Count); - - parentResult.PatchPath = Path; - - EnqueueResolverTasks( - operationContext, - Fragment.SelectionSet, - Parent, - Path, - // for the execution of this task we set the deferred task ID so that - // child deferrals can lookup their dependency to this task. - ScopedContextData.SetItem(DeferredResultId, resultId), - parentResult); - - // start executing the deferred fragment. - await operationContext.Scheduler.ExecuteAsync().ConfigureAwait(false); - - // we create the result but will not create the final result object yet. - // We will leave the final creation to the deferred work scheduler so that the - // has next property can be correctly set. - var result = - operationContext - .SetLabel(Label) - .SetPath(Path) - .SetData(parentResult) - .SetPatchId(patchId) - .BuildResult(); - - // complete the task and provide the result - operationContext.DeferredScheduler.Complete(new(resultId, parentResultId, result)); - } - finally - { - operationContextOwner.Dispose(); - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredStream.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredStream.cs deleted file mode 100644 index f5d6b220101..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredStream.cs +++ /dev/null @@ -1,158 +0,0 @@ -using System.Collections.Immutable; -using HotChocolate.Execution.Processing.Tasks; -using static HotChocolate.WellKnownContextData; - -namespace HotChocolate.Execution.Processing; - -/// -/// Represents the work to executed the deferred elements of a stream. -/// -internal sealed class DeferredStream : DeferredExecutionTask -{ - private StreamExecutionTask? _task; - - /// - /// Initializes a new instance of . - /// - public DeferredStream( - ISelection selection, - string? label, - Path path, - object? parent, - int index, - IAsyncEnumerator enumerator, - IImmutableDictionary scopedContextData) - : base(scopedContextData) - { - Selection = selection; - Label = label; - Path = path; - Parent = parent; - Index = index; - Enumerator = enumerator; - } - - /// - /// Gets the selection of the streamed field. - /// - public ISelection Selection { get; } - - /// - /// If this argument label has a value other than null, it will be passed - /// on to the result of this defer directive. This label is intended to - /// give client applications a way to identify to which fragment a deferred - /// result belongs to. - /// - public string? Label { get; } - - /// - /// Gets the result path into which this deferred fragment shall be patched. - /// - public Path Path { get; } - - /// - /// Gets the index of the last element. - /// - public int Index { get; private set; } - - /// - /// Gets the parent / source value. - /// - public object? Parent { get; } - - /// - /// Gets the enumerator to retrieve the payloads of the stream. - /// - public IAsyncEnumerator Enumerator { get; } - - protected override async Task ExecuteAsync( - OperationContextOwner operationContextOwner, - uint resultId, - uint parentResultId, - uint patchId) - { - var operationContext = operationContextOwner.OperationContext; - - try - { - _task ??= new StreamExecutionTask(this); - _task.Reset(operationContext, resultId); - operationContext.Scheduler.Register(_task); - await operationContext.Scheduler.ExecuteAsync().ConfigureAwait(false); - - // if there is no child task, then there is no more data, so we can complete. - if (_task.ChildTask is null) - { - operationContext.DeferredScheduler.Complete(new(resultId, parentResultId)); - return; - } - - var item = _task.ChildTask.ParentResult[0].Value!; - - var result = operationContext - .SetLabel(Label) - .SetPath(Path.Append(Index)) - .SetItems([item]) - .SetPatchId(patchId) - .BuildResult(); - - await _task.ChildTask.CompleteUnsafeAsync().ConfigureAwait(false); - - // we will register this same task again to get the next item. - operationContext.DeferredScheduler.Register(this, patchId); - operationContext.DeferredScheduler.Complete(new(resultId, parentResultId, result)); - } - catch (Exception ex) - { - var result = OperationResultBuilder.CreateError(ErrorBuilder.FromException(ex).Build()); - operationContext.DeferredScheduler.Complete(new(resultId, parentResultId, result)); - } - finally - { - operationContextOwner.Dispose(); - } - } - - private sealed class StreamExecutionTask : ExecutionTask - { - private readonly DeferredStream _deferredStream; - private OperationContext _operationContext = null!; - private IImmutableDictionary _scopedContextData; - - public StreamExecutionTask(DeferredStream deferredStream) - { - _deferredStream = deferredStream; - _scopedContextData = _deferredStream.ScopedContextData; - } - - protected override IExecutionTaskContext Context => _operationContext; - - public ResolverTask? ChildTask { get; private set; } - - protected override async ValueTask ExecuteAsync(CancellationToken cancellationToken) - { - ChildTask = null; - _deferredStream.Index++; - var hasNext = await _deferredStream.Enumerator.MoveNextAsync(); - - if (hasNext) - { - ChildTask = ResolverTaskFactory.EnqueueElementTasks( - _operationContext, - _deferredStream.Selection, - _deferredStream.Parent, - _deferredStream.Path, - _deferredStream.Index, - _deferredStream.Enumerator, - _scopedContextData); - } - } - - public void Reset(OperationContext operationContext, uint taskId) - { - _operationContext = operationContext; - _scopedContextData = _scopedContextData.SetItem(DeferredResultId, taskId); - Reset(); - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkScheduler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkScheduler.cs deleted file mode 100644 index 4bbccb2a888..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkScheduler.cs +++ /dev/null @@ -1,178 +0,0 @@ -using HotChocolate.Execution.DependencyInjection; -using HotChocolate.Execution.Instrumentation; -using Microsoft.Extensions.DependencyInjection; -using static HotChocolate.Execution.OperationResultBuilder; - -namespace HotChocolate.Execution.Processing; - -/// -/// Represents a backlog for deferred work. -/// -internal sealed class DeferredWorkScheduler -{ - private readonly object _stateSync = new(); - private IFactory _operationContextFactory = null!; - private IFactory _deferredWorkStateFactory = null!; - private OperationContext _parentContext = null!; - private DeferredWorkStateOwner? _stateOwner; - - private DeferredWorkStateOwner StateOwner - { - get - { - if (_stateOwner is null) - { - lock (_stateSync) - { - _stateOwner ??= _deferredWorkStateFactory.Create(); - } - } - - return _stateOwner; - } - } - - /// - /// Specifies if there was deferred work enqueued. - /// - public bool HasResults => _stateOwner?.State.HasResults is true; - - public void Initialize(OperationContext operationContext) - { - var services = operationContext.Services; - - _stateOwner = null; - _parentContext = operationContext; - _operationContextFactory = services.GetRequiredService>(); - _deferredWorkStateFactory = services.GetRequiredService>(); - } - - public void InitializeFrom(OperationContext operationContext, DeferredWorkScheduler scheduler) - { - _stateOwner = scheduler.StateOwner; - _parentContext = operationContext; - _operationContextFactory = scheduler._operationContextFactory; - _deferredWorkStateFactory = scheduler._deferredWorkStateFactory; - } - - /// - /// Registers deferred work - /// - public void Register(DeferredExecutionTask task, ResultData parentResult) - { - // first we get the result identifier which is used to refer to the result that we defer. - var resultId = StateOwner.State.CreateId(); - - // next we assign a patch identifier to the result set into which the deferred result - // shall be patched into. - var patchId = StateOwner.State.AssignPatchId(parentResult); - - // for the spawned execution we need an operation context which we will initialize - // from the current operation context. - var taskContextOwner = _operationContextFactory.Create(); - taskContextOwner.OperationContext.InitializeFrom(_parentContext); - - // Last we register our patch identifier with the parent result so that - // we can more efficiently mark discarded result sets to not send down - // patches that cannot be applied. - _parentContext.Result.AddPatchId(patchId); - - // with all in place we will start the execution of the deferred task. - task.Begin(taskContextOwner, resultId, patchId); - } - - public void Register(DeferredExecutionTask task, uint patchId) - { - var resultId = StateOwner.State.CreateId(); - var taskContextOwner = _operationContextFactory.Create(); - taskContextOwner.OperationContext.InitializeFrom(_parentContext); - task.Begin(taskContextOwner, resultId, patchId); - } - - public void Complete(DeferredExecutionTaskResult result) - => StateOwner.State.Complete(result); - - public IAsyncEnumerable CreateResultStream(IOperationResult initialResult) - => new DeferredResultStream( - initialResult, - StateOwner, - _parentContext.Operation, - _parentContext.DiagnosticEvents); - - public void Clear() - { - _stateOwner = null; - _operationContextFactory = null!; - _deferredWorkStateFactory = null!; - _parentContext = null!; - } - - private class DeferredResultStream : IAsyncEnumerable - { - private readonly IOperationResult _initialResult; - private readonly DeferredWorkStateOwner _stateOwner; - private readonly IOperation _operation; - private readonly IExecutionDiagnosticEvents _diagnosticEvents; - - public DeferredResultStream( - IOperationResult initialResult, - DeferredWorkStateOwner stateOwner, - IOperation operation, - IExecutionDiagnosticEvents diagnosticEvents) - { - _initialResult = FromResult(initialResult).SetHasNext(true).Build(); - _stateOwner = stateOwner; - _operation = operation; - _diagnosticEvents = diagnosticEvents; - } - - public async IAsyncEnumerator GetAsyncEnumerator( - CancellationToken cancellationToken = default) - { - var span = _diagnosticEvents.ExecuteStream(_operation); - var state = _stateOwner.State; - var hasNext = true; - var completed = false; - - try - { - yield return _initialResult; - - while (!cancellationToken.IsCancellationRequested) - { - var result = await state - .TryDequeueResultsAsync(cancellationToken) - .ConfigureAwait(false); - - if (result is not null) - { - hasNext = result.HasNext ?? false; - yield return result; - } - else if (state.IsCompleted) - { - if (hasNext) - { - yield return new OperationResult(null, hasNext: false); - } - - yield break; - } - } - - completed = !cancellationToken.IsCancellationRequested; - } - finally - { - span.Dispose(); - } - - // we only return the state back to its pool if the operation was not cancelled - // or otherwise faulted. - if (completed) - { - _stateOwner.Dispose(); - } - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkState.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkState.cs deleted file mode 100644 index ad678864378..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkState.cs +++ /dev/null @@ -1,215 +0,0 @@ -using System.Runtime.CompilerServices; -using static HotChocolate.WellKnownContextData; - -namespace HotChocolate.Execution.Processing; - -internal sealed class DeferredWorkState -{ - private readonly object _completeSync = new(); - private readonly object _deliverSync = new(); - private readonly object _patchSync = new(); - - private readonly List _ready = []; - private readonly Queue _deliverable = new(); - private readonly HashSet _completed = []; - private readonly HashSet _notPatchable = []; - private SemaphoreSlim _semaphore = new(0); - private uint _taskId; - private uint _work; - private uint _patchId; - - public bool HasResults => _taskId > 0; - - public bool IsCompleted => _work is 0; - - public uint CreateId() - { - lock (_deliverSync) - { - _work++; - return ++_taskId; - } - } - - public uint AssignPatchId(ResultData resultData) - { - if (resultData.PatchId == 0) - { - lock (_patchSync) - { - if (resultData.PatchId == 0) - { - var patchId = ++_patchId; - resultData.PatchId = patchId; - return patchId; - } - } - } - - return resultData.PatchId; - } - - public void Complete(DeferredExecutionTaskResult result) - { - var update = true; - - try - { - lock (_completeSync) - { - if (result.ParentTaskId is 0 || _completed.Contains(result.ParentTaskId)) - { - _completed.Add(result.TaskId); - EnqueueResult(result.Result); - - var evaluateDeferredResults = _ready.Count > 0; - - while (evaluateDeferredResults) - { - var i = 0; - evaluateDeferredResults = false; - - while (_ready.Count > 0 && i < _ready.Count) - { - var current = _ready[i]; - - if (_completed.Contains(current.ParentTaskId)) - { - _completed.Add(current.TaskId); - _ready.RemoveAt(i); - EnqueueResult(current.Result); - evaluateDeferredResults = true; - } - else - { - i++; - } - } - } - } - else - { - _ready.Add(result); - update = false; - } - } - } - finally - { - if (update) - { - _semaphore.Release(); - } - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void EnqueueResult(IOperationResult? queryResult) - { - lock (_deliverSync) - { - if (queryResult is not null) - { - _deliverable.Enqueue(queryResult); - } - else - { - _work--; - } - } - } - - public async ValueTask TryDequeueResultsAsync( - CancellationToken cancellationToken) - { - await _semaphore.WaitAsync(cancellationToken); - - lock (_deliverSync) - { - if (_deliverable.Count > 0) - { - var hasNext = true; - var result = new IOperationResult[_deliverable.Count]; - var consumed = 0; - - for (var i = 0; i < result.Length; i++) - { - var deliverable = _deliverable.Dequeue(); - - if (--_work is 0) - { - _semaphore.Release(); - hasNext = false; - } - - // if the deferred result can still be patched into the result set from which - // it was being spawned of we will add it to the result batch. - if ((deliverable.ContextData?.TryGetValue(PatchId, out var value) ?? false) - && value is uint patchId - && !_notPatchable.Contains(patchId)) - { - AddRemovedResultSetsToNotPatchable(deliverable, _notPatchable); - result[consumed++] = deliverable; - } - - // if the item is not patchable we will discard it and mark all dependant - // results as not patchable. - else - { - AddAllResultSetsToNotPatchable(deliverable, _notPatchable); - } - } - - if (consumed < result.Length) - { - Array.Resize(ref result, consumed); - } - - return new OperationResult(null, incremental: result, hasNext: hasNext); - } - } - - return null; - - static void AddRemovedResultSetsToNotPatchable( - IOperationResult result, - HashSet notPatchable) - { - if ((result.ContextData?.TryGetValue(RemovedResults, out var value) ?? false) - && value is IEnumerable patchIds) - { - foreach (var patchId in patchIds) - { - notPatchable.Add(patchId); - } - } - } - - static void AddAllResultSetsToNotPatchable( - IOperationResult result, - HashSet notPatchable) - { - if ((result.ContextData?.TryGetValue(ExpectedPatches, out var value) ?? false) - && value is IEnumerable patchIds) - { - foreach (var patchId in patchIds) - { - notPatchable.Add(patchId); - } - } - } - } - - public void Reset() - { - _semaphore.Dispose(); - _semaphore = new SemaphoreSlim(0); - _ready.Clear(); - _completed.Clear(); - _deliverable.Clear(); - _notPatchable.Clear(); - _taskId = 0; - _work = 0; - _patchId = 0; - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Fragment.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Fragment.cs deleted file mode 100644 index 3e3d2a1c42c..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Fragment.cs +++ /dev/null @@ -1,52 +0,0 @@ -using HotChocolate.Language; -using HotChocolate.Types; - -namespace HotChocolate.Execution.Processing; - -internal sealed class Fragment : IFragment -{ - private readonly ulong _includeCondition; - private readonly ulong _deferIfCondition; - - public Fragment( - int id, - IObjectTypeDefinition typeCondition, - ISyntaxNode syntaxNode, - IReadOnlyList directives, - ISelectionSet selectionSet, - ulong includeCondition, - ulong deferIfCondition, - bool isInternal = false) - { - Id = id; - TypeCondition = typeCondition; - SyntaxNode = syntaxNode; - Directives = directives; - SelectionSet = selectionSet; - _includeCondition = includeCondition; - _deferIfCondition = deferIfCondition; - IsInternal = isInternal; - } - - public int Id { get; } - - public IObjectTypeDefinition TypeCondition { get; } - - public ISyntaxNode SyntaxNode { get; } - - public IReadOnlyList Directives { get; } - - public ISelectionSet SelectionSet { get; } - - public bool IsInternal { get; } - - public bool IsConditional => _includeCondition is not 0 || _deferIfCondition is not 0; - - public string? GetLabel(IVariableValueCollection variables) - => Directives.GetDeferDirective(variables)?.Label; - - public bool IsIncluded(ulong includeFlags, bool allowInternals = false) - => (includeFlags & _includeCondition) == _includeCondition - && (_deferIfCondition is 0 || (includeFlags & _deferIfCondition) != _deferIfCondition) - && (!IsInternal || allowInternals); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/IFragment.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/IFragment.cs deleted file mode 100644 index a2947ee1382..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/IFragment.cs +++ /dev/null @@ -1,46 +0,0 @@ -using HotChocolate.Language; -using HotChocolate.Types; - -namespace HotChocolate.Execution.Processing; - -/// -/// Represents a deferred fragment. -/// -public interface IFragment : IOptionalSelection -{ - /// - /// Gets the internal fragment identifier. - /// - int Id { get; } - - /// - /// Gets the type condition. - /// - IObjectTypeDefinition TypeCondition { get; } - - /// - /// Gets the syntax node from the original GraphQL request document. - /// - ISyntaxNode SyntaxNode { get; } - - /// - /// Gets the collection of directives that are annotated to this fragment. - /// - IReadOnlyList Directives { get; } - - /// - /// Gets the selection set of this fragment. - /// - ISelectionSet SelectionSet { get; } - - /// - /// Gets the fragment label. - /// - /// - /// The variable values. - /// - /// - /// Returns the fragment label. - /// - string? GetLabel(IVariableValueCollection variables); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/IOperation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/IOperation.cs deleted file mode 100644 index 29635565407..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/IOperation.cs +++ /dev/null @@ -1,194 +0,0 @@ -using HotChocolate.Language; -using HotChocolate.Types; - -namespace HotChocolate.Execution.Processing; - -/// -/// Represents a compiled GraphQL operation. -/// -public interface IOperation : IHasReadOnlyContextData, IEnumerable -{ - /// - /// Gets the internal unique identifier for this operation. - /// - string Id { get; } - - /// - /// Gets the parsed query document that contains the - /// operation-. - /// - DocumentNode Document { get; } - - /// - /// Gets the syntax node representing the operation definition. - /// - OperationDefinitionNode Definition { get; } - - /// - /// Gets the root type on which the operation is executed. - /// - ObjectType RootType { get; } - - /// - /// Gets the name of the operation. - /// - string? Name { get; } - - /// - /// Gets the operation type (Query, Mutation, Subscription). - /// - OperationType Type { get; } - - /// - /// Gets the prepared root selections for this operation. - /// - /// - /// Returns the prepared root selections for this operation. - /// - ISelectionSet RootSelectionSet { get; } - - /// - /// Gets all selection variants of this operation. - /// - IReadOnlyList SelectionVariants { get; } - - /// - /// Defines if this operation has deferred fragments or streams. - /// - bool HasIncrementalParts { get; } - - /// - /// Gets the schema for which this operation is compiled. - /// - ISchemaDefinition Schema { get; } - - /// - /// Gets the selection set for the specified and - /// . - /// - /// - /// The selection set for which the selection set shall be resolved. - /// - /// - /// The result type context. - /// - /// - /// Returns the selection set for the specified and - /// . - /// - /// - /// The specified has no selection set. - /// - ISelectionSet GetSelectionSet(ISelection selection, ObjectType typeContext); - - /// - /// Gets the possible return types for the . - /// - /// - /// The selection for which the possible result types shall be returned. - /// - /// - /// Returns the possible return types for the specified . - /// - /// - /// The specified has no selection set. - /// - IEnumerable GetPossibleTypes(ISelection selection); - - /// - /// Creates the include flags for the specified variable values. - /// - /// - /// The variable values. - /// - /// - /// Returns the include flags for the specified variable values. - /// - ulong CreateIncludeFlags(IVariableValueCollection variables); - - bool TryGetState(out TState? state); - - bool TryGetState(string key, out TState? state); - - /// - /// Gets or adds state to this operation. - /// - /// - /// The type of the state. - /// - /// - /// The factory that creates the state if it does not exist. - /// - /// - /// Returns the state. - /// - TState GetOrAddState( - Func createState); - - /// - /// Gets or adds state to this operation. - /// - /// - /// The type of the state. - /// - /// - /// The type of the context. - /// - /// - /// The factory that creates the state if it does not exist. - /// - /// - /// The context that is passed to the factory. - /// - /// - /// Returns the state. - /// - TState GetOrAddState( - Func createState, - TContext context); - - /// - /// Gets or adds state to this operation. - /// - /// - /// The type of the state. - /// - /// - /// The key of the state. - /// - /// - /// The factory that creates the state if it does not exist. - /// - /// - /// Returns the state. - /// - TState GetOrAddState( - string key, - Func createState); - - /// - /// Gets or adds state to this operation. - /// - /// - /// The type of the state. - /// - /// - /// The type of the context. - /// - /// - /// The key of the state. - /// - /// - /// The factory that creates the state if it does not exist. - /// - /// - /// The context that is passed to the factory. - /// - /// - /// Returns the state. - /// - TState GetOrAddState( - string key, - Func createState, - TContext context); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/IOptionalSelection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/IOptionalSelection.cs deleted file mode 100644 index fb6839101d4..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/IOptionalSelection.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace HotChocolate.Execution.Processing; - -/// -/// Represents selections with inclusion conditions. -/// -public interface IOptionalSelection -{ - /// - /// Defines that this selection is only needed for internal processing. - /// - bool IsInternal { get; } - - /// - /// Defines that this selection is conditional and will not always be included. - /// - bool IsConditional { get; } - - /// - /// Defines if this selection will be included into the request execution. - /// - /// - /// The execution include flags. - /// - /// - /// Allow internal selections to be included. - /// - /// - /// True, if this selection shall be included into the request execution. - /// - bool IsIncluded(ulong includeFlags, bool allowInternals = false); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs deleted file mode 100644 index 5eba9ad5385..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelection.cs +++ /dev/null @@ -1,113 +0,0 @@ -using HotChocolate.Language; -using HotChocolate.Resolvers; -using HotChocolate.Types; - -namespace HotChocolate.Execution.Processing; - -/// -/// Represents a field selection during execution. -/// -public interface ISelection : IOptionalSelection -{ - /// - /// Gets an operation unique identifier of this selection. - /// - int Id { get; } - - /// - /// Gets the name this field will have in the response map. - /// - string ResponseName { get; } - - /// - /// Gets the UTF-8 encoded name this field will have in the response map. - /// - byte[] Utf8ResponseName { get; } - - /// - /// Gets the field that was selected. - /// - ObjectField Field { get; } - - /// - /// Gets the type of the selection. - /// - IType Type { get; } - - /// - /// Gets the type kind of the selection. - /// - TypeKind TypeKind { get; } - - /// - /// Specifies if the return type of this selection is a list type. - /// - bool IsList { get; } - - /// - /// Gets the type that declares the field that is selected by this selection. - /// - ObjectType DeclaringType { get; } - - /// - /// Gets the selectionSet that declares this selection. - /// - ISelectionSet DeclaringSelectionSet { get; } - - /// - /// Gets the operation that declares this selection. - /// - IOperation DeclaringOperation { get; } - - /// - /// Gets the merged field selection syntax node. - /// - FieldNode SyntaxNode { get; } - - /// - /// Gets the field selection syntax node. - /// - IReadOnlyList SyntaxNodes { get; } - - /// - /// If this selection selects a field that returns a composite type - /// then this selection set represents the fields that are selected - /// on that returning composite type. - /// - /// If this selection however selects a leaf field than this - /// selection set will be null. - /// - SelectionSetNode? SelectionSet { get; } - - /// - /// Gets the execution kind. - /// - SelectionExecutionStrategy Strategy { get; } - - /// - /// The compiled resolver pipeline for this selection. - /// - FieldDelegate? ResolverPipeline { get; } - - /// - /// The compiled pure resolver. - /// - PureFieldDelegate? PureResolver { get; } - - /// - /// The arguments that have been pre-coerced for this field selection. - /// - ArgumentMap Arguments { get; } - - /// - /// Defines if this selection is annotated with the stream directive. - /// - /// - /// The execution include flags that determine if the stream directive is applied for the - /// current execution run. - /// - /// - /// Returns if this selection is annotated with the stream directive. - /// - bool HasStreamDirective(ulong includeFlags); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionSet.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionSet.cs deleted file mode 100644 index 6ef00358cc4..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionSet.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System.Diagnostics.CodeAnalysis; - -namespace HotChocolate.Execution.Processing; - -/// -/// A selection set is primarily composed of field selections. -/// When needed a selection set can preserve fragments so that the execution engine -/// can branch the processing of these fragments. -/// -public interface ISelectionSet -{ - /// - /// Gets an operation unique selection-set identifier of this selection. - /// - int Id { get; } - - /// - /// Defines if this list needs post-processing for skip and include. - /// - bool IsConditional { get; } - - /// - /// Gets the selections that shall be executed. - /// - IReadOnlyList Selections { get; } - - /// - /// Gets the deferred fragments if any were preserved for execution. - /// - IReadOnlyList Fragments { get; } - - /// - /// Gets the declaring operation. - /// - IOperation DeclaringOperation { get; } - - /// - /// Tries to resolve a selection by name. - /// - /// - /// The selection response name. - /// - /// - /// The resolved selection. - /// - /// - /// Returns true if the selection was successfully resolved. - /// - bool TryGetSelection(string responseName, [NotNullWhen(true)] out ISelection? selection); - - /// - /// Tries to resolve a selection by name. - /// - /// - /// The selection response name. - /// - /// - /// The resolved selection. - /// - /// - /// Returns true if the selection was successfully resolved. - /// - bool TryGetSelection(ReadOnlySpan utf8ResponseName, [NotNullWhen(true)] out ISelection? selection); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/IncludeCondition.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/IncludeCondition.cs deleted file mode 100644 index 87061dba0df..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/IncludeCondition.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System.Runtime.CompilerServices; -using HotChocolate.Language; -using HotChocolate.Types; -using HotChocolate.Utilities; - -namespace HotChocolate.Execution.Processing; - -/// -/// This struct represents the include condition of a Field, InlineFragment or FragmentSpread. -/// -public readonly struct IncludeCondition : IEquatable -{ - internal IncludeCondition(IValueNode skip, IValueNode include) - { - Skip = skip; - Include = include; - } - - /// - /// Gets the skip value. - /// - public IValueNode Skip { get; } - - /// - /// Gets the include value. - /// - public IValueNode Include { get; } - - /// - /// If and are null then - /// there is no valid include condition. - /// - public bool IsDefault => Skip is null && Include is null; - - /// - /// Specifies if selections with this include condition are included with the - /// current variable values. - /// - /// - /// The variable values. - /// - /// - /// Returns true if selections with this include condition are included. - /// - public bool IsIncluded(IVariableValueCollection variables) - { - ArgumentNullException.ThrowIfNull(variables); - - if (Skip is null || Include is null) - { - return true; - } - - var skip = false; - - if (Skip.Kind is SyntaxKind.BooleanValue) - { - skip = ((BooleanValueNode)Skip).Value; - } - else if (Skip.Kind is SyntaxKind.Variable) - { - var variable = Unsafe.As(Skip); - skip = variables.GetValue(variable.Name.Value).Value; - } - - var include = true; - - if (Include.Kind is SyntaxKind.BooleanValue) - { - include = ((BooleanValueNode)Include).Value; - } - else if (Include.Kind is SyntaxKind.Variable) - { - var variable = Unsafe.As(Include); - include = variables.GetValue(variable.Name.Value).Value; - } - - return !skip && include; - } - - /// - /// Indicates whether the current object is equal to another object of the same type. - /// - /// An object to compare with this object. - /// - /// if the current object is equal to the - /// parameter; otherwise, . - /// - public bool Equals(IncludeCondition other) - => Skip.Equals(other.Skip, SyntaxComparison.Syntax) - && Include.Equals(other.Include, SyntaxComparison.Syntax); - - /// - /// Indicates whether this instance and a specified object are equal. - /// - /// - /// The object to compare with the current instance. - /// - /// - /// if and this instance is the same - /// type and represents the same value; otherwise, . - /// - public override bool Equals(object? obj) - => obj is IncludeCondition other && Equals(other); - - /// - /// Returns the hash code for this instance. - /// - /// - /// A 32-bit signed integer that is the hash code for this instance. - /// - public override int GetHashCode() - => HashCode.Combine( - SyntaxComparer.BySyntax.GetHashCode(Skip), - SyntaxComparer.BySyntax.GetHashCode(Include)); - - /// - /// Tries to extract the include condition from a field. - /// - /// - /// The selection to extract the include condition from. - /// - /// - /// Returns true if the selection has a custom visibility configuration. - /// - public static IncludeCondition FromSelection(ISelectionNode selection) - { - ArgumentNullException.ThrowIfNull(selection); - - IValueNode? skip = null; - IValueNode? include = null; - - if (selection.Directives.Count == 0) - { - return default; - } - - for (var i = 0; i < selection.Directives.Count; i++) - { - var directive = selection.Directives[i]; - - if (directive.Arguments.Count != 1) - { - // the skip and include arguments have a single argument. - continue; - } - - if (directive.Name.Value.EqualsOrdinal(DirectiveNames.Skip.Name)) - { - skip = directive.Arguments[0].Value; - } - - if (directive.Name.Value.EqualsOrdinal(DirectiveNames.Include.Name)) - { - include = directive.Arguments[0].Value; - } - - if (skip is not null && include is not null) - { - break; - } - } - - if (skip is null && include is null) - { - return default; - } - - return new IncludeCondition( - skip ?? NullValueNode.Default, - include ?? NullValueNode.Default); - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs index ed5b4c63bf0..72c8ed60f88 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs @@ -1,5 +1,8 @@ -using System.Collections; -using System.Collections.Immutable; +using System.Collections.Concurrent; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Types; using static HotChocolate.Execution.Properties.Resources; @@ -7,226 +10,252 @@ namespace HotChocolate.Execution.Processing; -internal sealed class Operation : IOperation +public sealed class Operation : IOperation { #if NET9_0_OR_GREATER - private readonly Lock _writeLock = new(); + private readonly Lock _sync = new(); #else - private readonly object _writeLock = new(); + private readonly object _sync = new(); #endif - private SelectionVariants[] _selectionVariants = []; - private IncludeCondition[] _includeConditions = []; - private ImmutableDictionary _contextData = -#if NET10_0_OR_GREATER - []; -#else - ImmutableDictionary.Empty; -#endif - private bool _sealed; - public Operation( + private readonly ConcurrentDictionary<(int, string), SelectionSet> _selectionSets = []; + private readonly OperationCompiler2 _compiler; + private readonly IncludeConditionCollection _includeConditions; + private readonly OperationFeatureCollection _features; + private readonly bool _isFinal; + private object[] _elementsById; + private int _lastId; + + internal Operation( string id, - DocumentNode document, + string hash, OperationDefinitionNode definition, ObjectType rootType, - ISchemaDefinition schema) + Schema schema, + SelectionSet rootSelectionSet, + OperationCompiler2 compiler, + IncludeConditionCollection includeConditions, + int lastId, + object[] elementsById, + bool isFinal) { + ArgumentException.ThrowIfNullOrWhiteSpace(id); + ArgumentException.ThrowIfNullOrWhiteSpace(hash); + ArgumentNullException.ThrowIfNull(definition); + ArgumentNullException.ThrowIfNull(rootType); + ArgumentNullException.ThrowIfNull(schema); + ArgumentNullException.ThrowIfNull(rootSelectionSet); + ArgumentNullException.ThrowIfNull(compiler); + ArgumentNullException.ThrowIfNull(includeConditions); + ArgumentNullException.ThrowIfNull(elementsById); + Id = id; - Document = document; + Hash = hash; Definition = definition; RootType = rootType; - Type = definition.Operation; Schema = schema; - - if (definition.Name?.Value is { } name) - { - Name = name; - } + RootSelectionSet = rootSelectionSet; + _compiler = compiler; + _includeConditions = includeConditions; + _lastId = lastId; + _elementsById = elementsById; + _isFinal = isFinal; + + _features = new OperationFeatureCollection(); + rootSelectionSet.Complete(this, seal: isFinal); } + /// + /// Gets the internal unique identifier for this operation. + /// public string Id { get; } - public DocumentNode Document { get; } + /// + /// Gets the hash of the original operation document. + /// + public string Hash { get; } + /// + /// Gets the name of the operation. + /// + public string? Name => Definition.Name?.Value; + + /// + /// Gets the syntax node representing the operation definition. + /// public OperationDefinitionNode Definition { get; } + /// + /// Gets the root type on which the operation is executed. + /// public ObjectType RootType { get; } - public string? Name { get; } - - public OperationType Type { get; } - - public ISelectionSet RootSelectionSet { get; private set; } = null!; - - public IReadOnlyList SelectionVariants - => _selectionVariants; - - public bool HasIncrementalParts { get; private set; } - - public IReadOnlyList IncludeConditions - => _includeConditions; - - public IReadOnlyDictionary ContextData => _contextData; - - public ISchemaDefinition Schema { get; } - - public ISelectionSet GetSelectionSet(ISelection selection, ObjectType typeContext) + IObjectTypeDefinition IOperation.RootType => RootType; + + public OperationType Kind => Definition.Operation; + + /// + /// Gets the schema for which this operation is compiled. + /// + public Schema Schema { get; } + + ISchemaDefinition IOperation.Schema => Schema; + + /// + /// Gets the prepared root selections for this operation. + /// + /// + /// Returns the prepared root selections for this operation. + /// + public SelectionSet RootSelectionSet { get; } + + ISelectionSet IOperation.RootSelectionSet + => RootSelectionSet; + + /// + public IFeatureCollection Features => _features; + + /// + /// Gets the selection set for the specified + /// if the selections named return type is an object type. + /// + /// + /// The selection set for which the selection set shall be resolved. + /// + /// + /// Returns the selection set for the specified and + /// the named return type of the selection. + /// + /// + /// - The specified has no selection set. + /// - The specified returns an abstract named type. + /// + public SelectionSet GetSelectionSet(Selection selection) { ArgumentNullException.ThrowIfNull(selection); - ArgumentNullException.ThrowIfNull(typeContext); - - var selectionSetId = ((Selection)selection).SelectionSetId; - - if (selectionSetId is -1) - { - throw Operation_NoSelectionSet(); - } - - return _selectionVariants[selectionSetId].GetSelectionSet(typeContext); + var typeContext = selection.Field.Type.NamedType(); + return GetSelectionSet(selection, typeContext); } - public IEnumerable GetPossibleTypes(ISelection selection) + /// + /// Gets the selection set for the specified and + /// . + /// + /// + /// The selection set for which the selection set shall be resolved. + /// + /// + /// The result type context. + /// + /// + /// Returns the selection set for the specified and + /// . + /// + /// + /// The specified has no selection set. + /// + public SelectionSet GetSelectionSet(Selection selection, IObjectTypeDefinition typeContext) { ArgumentNullException.ThrowIfNull(selection); + ArgumentNullException.ThrowIfNull(typeContext); - var selectionSetId = ((Selection)selection).SelectionSetId; - - if (selectionSetId == -1) - { - throw new ArgumentException(Operation_GetPossibleTypes_NoSelectionSet); - } - - return _selectionVariants[selectionSetId].GetPossibleTypes(); - } - - public long CreateIncludeFlags(IVariableValueCollection variables) - { - long context = 0; - - for (var i = 0; i < _includeConditions.Length; i++) - { - if (_includeConditions[i].IsIncluded(variables)) - { - long flag = 1; - flag <<= i; - context |= flag; - } - } - - return context; - } - - public bool TryGetState(out TState? state) - { - var key = typeof(TState).FullName ?? throw new InvalidOperationException(); - return TryGetState(key, out state); - } - - public bool TryGetState(string key, out TState? state) - { - if (_contextData.TryGetValue(key, out var value) - && value is TState casted) + if (typeContext is not ObjectType objectType) { - state = casted; - return true; + throw new ArgumentException( + "typeContext is not an ObjectType object.", + nameof(typeContext)); } - state = default; - return false; - } - - public TState GetOrAddState(Func createState) - => GetOrAddState(_ => createState(), null); - - public TState GetOrAddState(Func createState, TContext context) - { - var key = typeof(TState).FullName ?? throw new InvalidOperationException(); + var key = (selection.Id, typeContext.Name); - // ReSharper disable once InconsistentlySynchronizedField - if (!_contextData.TryGetValue(key, out var state)) + if (!_selectionSets.TryGetValue(key, out var selectionSet)) { - lock (_writeLock) + lock (_sync) { - if (!_contextData.TryGetValue(key, out state)) + if (!_selectionSets.TryGetValue(key, out selectionSet)) { - var newState = createState(context); - _contextData = _contextData.SetItem(key, newState); - return newState; + selectionSet = + _compiler.CompileSelectionSet( + selection, + objectType, + _includeConditions, + ref _elementsById, + ref _lastId); + selectionSet.Complete(this, seal: _isFinal); + _selectionSets.TryAdd(key, selectionSet); } } } - return (TState)state!; + return selectionSet; } - public TState GetOrAddState( - string key, - Func createState) - => GetOrAddState(key, (k, _) => createState(k), null); - - public TState GetOrAddState( - string key, - Func createState, - TContext context) + ISelectionSet IOperation.GetSelectionSet(ISelection selection, IObjectTypeDefinition typeContext) { - // ReSharper disable once InconsistentlySynchronizedField - if (!_contextData.TryGetValue(key, out var state)) - { - lock (_writeLock) - { - if (!_contextData.TryGetValue(key, out state)) - { - var newState = createState(key, context); - _contextData = _contextData.SetItem(key, newState); - return newState; - } - } - } - - return (TState)state!; - } + ArgumentNullException.ThrowIfNull(selection); + ArgumentNullException.ThrowIfNull(typeContext); - internal void Seal( - IReadOnlyDictionary contextData, - SelectionVariants[] selectionVariants, - bool hasIncrementalParts, - IncludeCondition[] includeConditions) - { - if (!_sealed) + if (selection is not Selection internalSelection) { - _contextData = contextData.ToImmutableDictionary(); - var root = selectionVariants[0]; - RootSelectionSet = root.GetSelectionSet(RootType); - _selectionVariants = selectionVariants; - HasIncrementalParts = hasIncrementalParts; - _includeConditions = includeConditions; - _sealed = true; + throw new InvalidOperationException( + $"Only selections of the type {typeof(Selection).FullName} are supported."); } - } - - public SelectionSet GetSelectionSetById(int selectionSetId) - { + return GetSelectionSet(internalSelection, typeContext); } - public Selection GetSelectionById(int selectionSetId) + /// + /// Gets the possible return types for the . + /// + /// + /// The selection for which the possible result types shall be returned. + /// + /// + /// Returns the possible return types for the specified . + /// + /// + /// The specified has no selection set. + /// + public IEnumerable GetPossibleTypes(Selection selection) { + ArgumentNullException.ThrowIfNull(selection); + return Schema.GetPossibleTypes(selection.Field.Type.NamedType()); } - public IEnumerator GetEnumerator() + IEnumerable IOperation.GetPossibleTypes(ISelection selection) + => Schema.GetPossibleTypes(selection.Field.Type.NamedType()); + + /// + /// Creates the include flags for the specified variable values. + /// + /// + /// The variable values. + /// + /// + /// Returns the include flags for the specified variable values. + /// + public ulong CreateIncludeFlags(IVariableValueCollection variables) { - foreach (var selectionVariant in _selectionVariants) + var index = 0; + var includeFlags = 0ul; + + foreach (var includeCondition in _includeConditions) { - foreach (var objectType in selectionVariant.GetPossibleTypes()) + if (includeCondition.IsIncluded(variables)) { - yield return selectionVariant.GetSelectionSet(objectType); + includeFlags |= 1ul << index++; } } + + return includeFlags; } - IEnumerator IEnumerable.GetEnumerator() - => GetEnumerator(); + internal Selection GetSelectionById(int id) + => Unsafe.As(Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_elementsById), id)); + + internal SelectionSet GetSelectionSetById(int id) + => Unsafe.As(Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_elementsById), id)); public override string ToString() => OperationPrinter.Print(this); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs new file mode 100644 index 00000000000..8f6068bbf80 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs @@ -0,0 +1,122 @@ +using System.Buffers; +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using HotChocolate.Fusion.Rewriters; +using HotChocolate.Language; +using HotChocolate.Language.Visitors; +using HotChocolate.Resolvers; +using HotChocolate.Types; +using Microsoft.Extensions.ObjectPool; + +namespace HotChocolate.Execution.Processing; + +internal sealed partial class OperationCompiler2 +{ + private ArgumentMap? CoerceArgumentValues( + ObjectField field, + FieldNode selection) + { + if (field.Arguments.Count == 0) + { + return null; + } + + var arguments = new Dictionary(StringComparer.Ordinal); + + for (var i = 0; i < selection.Arguments.Count; i++) + { + var argumentValue = selection.Arguments[i]; + if (field.Arguments.TryGetField( + argumentValue.Name.Value, + out var argument)) + { + arguments[argument.Name] = CreateArgumentValue(argument, argumentValue, argumentValue.Value, false); + } + } + + for (var i = 0; i < field.Arguments.Count; i++) + { + var argument = field.Arguments[i]; + if (!arguments.ContainsKey(argument.Name)) + { + var value = argument.DefaultValue ?? NullValueNode.Default; + arguments[argument.Name] = CreateArgumentValue(argument, null, value, true); + } + } + + return new ArgumentMap(arguments); + } + + private ArgumentValue CreateArgumentValue( + Argument argument, + ArgumentNode? argumentValue, + IValueNode value, + bool isDefaultValue) + { + var validationResult = + ArgumentNonNullValidator.Validate( + argument, + value, + Path.Root.Append(argument.Name)); + + if (argumentValue is not null && validationResult.HasErrors) + { + return new ArgumentValue( + argument, + ErrorHelper.ArgumentNonNullError( + argumentValue, + validationResult)); + } + + if (argument.Type.IsLeafType() && CanBeCompiled(value)) + { + try + { + return new ArgumentValue( + argument, + value.GetValueKind(), + true, + isDefaultValue, + _inputValueParser.ParseLiteral(value, argument), + value); + } + catch (SerializationException ex) + { + return new ArgumentValue( + argument, + ErrorHelper.ArgumentValueIsInvalid(argumentValue, ex)); + } + } + + return new ArgumentValue( + argument, + value.GetValueKind(), + false, + isDefaultValue, + null, + value); + } + + private static bool CanBeCompiled(IValueNode valueLiteral) + { + switch (valueLiteral.Kind) + { + case SyntaxKind.Variable: + case SyntaxKind.ObjectValue: + return false; + + case SyntaxKind.ListValue: + var list = (ListValueNode)valueLiteral; + for (var i = 0; i < list.Items.Count; i++) + { + if (!CanBeCompiled(list.Items[i])) + { + return false; + } + } + break; + } + + return true; + } +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 174bc3ca348..0984e29625a 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -1,787 +1,633 @@ -using System.Collections.Immutable; -using System.Runtime.CompilerServices; +using System.Buffers; +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using HotChocolate.Fusion.Rewriters; using HotChocolate.Language; -using HotChocolate.Resolvers; +using HotChocolate.Language.Visitors; using HotChocolate.Types; -using HotChocolate.Utilities; -using static System.Runtime.InteropServices.CollectionsMarshal; -using static System.Runtime.InteropServices.MemoryMarshal; -using static System.StringComparer; -using static HotChocolate.Execution.Properties.Resources; -using static HotChocolate.Execution.ThrowHelper; +using Microsoft.Extensions.ObjectPool; namespace HotChocolate.Execution.Processing; -/// -/// The operation compiler will analyze a specific operation of a GraphQL request document -/// and create from it an optimized executable operation tree. -/// -public sealed partial class OperationCompiler +internal sealed partial class OperationCompiler2 { - private readonly InputParser _parser; - private readonly CreateFieldPipeline _createFieldPipeline; - private readonly Queue _backlog = []; - private readonly Dictionary _selectionLookup = []; - private readonly Dictionary _selectionSetIdLookup = []; - private readonly Dictionary _selectionVariants = []; - private readonly Dictionary _fragmentDefinitions = []; - private readonly Dictionary _contextData = []; - private readonly List _selections = []; - private readonly HashSet _directiveNames = new(Ordinal); - private readonly List _pipelineComponents = []; - private readonly HashSet _enqueuedSelectionSets = []; - private IncludeCondition[] _includeConditions = []; - private CompilerContext? _deferContext; - private ImmutableArray _operationOptimizers = []; - private int _nextSelectionId; - private int _nextSelectionSetRefId; - private int _nextSelectionSetId; - private int _nextFragmentId; - private bool _hasIncrementalParts; - private OperationCompilerMetrics _metrics; - - public OperationCompiler(InputParser parser) + private readonly Schema _schema; + private readonly ObjectPool>> _fieldsPool; + private readonly DocumentRewriter _documentRewriter; + private readonly InputParser _inputValueParser; + private static readonly ArrayPool s_objectArrayPool = ArrayPool.Shared; + + public OperationCompiler2( + Schema schema, + InputParser inputValueParser, + ObjectPool>> fieldsPool) { - _parser = parser ?? throw new ArgumentNullException(nameof(parser)); - - _createFieldPipeline = - (schema, field, selection) - => CreateFieldPipeline( - schema, - field, - selection, - null, - _directiveNames, - _pipelineComponents); - } + ArgumentNullException.ThrowIfNull(schema); + ArgumentNullException.ThrowIfNull(fieldsPool); - internal OperationCompilerMetrics Metrics => _metrics; + _schema = schema; + _inputValueParser = inputValueParser; + _fieldsPool = fieldsPool; + _documentRewriter = new DocumentRewriter(schema, removeStaticallyExcludedSelections: true); + } - public IOperation Compile(OperationCompilerRequest request) + public Operation Compile(string id, string hash, OperationDefinitionNode operationDefinition) { - ArgumentException.ThrowIfNullOrEmpty(request.Id, nameof(request)); + ArgumentException.ThrowIfNullOrWhiteSpace(id); + ArgumentNullException.ThrowIfNull(operationDefinition); - try - { - var backlogMaxSize = 0; - var selectionSetOptimizers = request.SelectionSetOptimizers; - _operationOptimizers = request.OperationOptimizers; - - // collect root fields - var rootPath = SelectionPath.Root; - var id = GetOrCreateSelectionSetRefId(request.Definition.SelectionSet, request.RootType.Name, rootPath); - var variants = GetOrCreateSelectionVariants(id); - SelectionSetInfo[] infos = [new(request.Definition.SelectionSet, 0)]; - - var context = new CompilerContext((Schema)request.Schema, request.Document); - context.Initialize(request.RootType, variants, infos, rootPath, selectionSetOptimizers); - CompileSelectionSet(context); - - // process consecutive selections - while (_backlog.Count > 0) - { - backlogMaxSize = Math.Max(backlogMaxSize, _backlog.Count); + var document = new DocumentNode(new IDefinitionNode[] { operationDefinition }); + document = _documentRewriter.RewriteDocument(document); + operationDefinition = (OperationDefinitionNode)document.Definitions[0]; - var current = _backlog.Dequeue(); - var type = current.Type; - variants = GetOrCreateSelectionVariants(current.SelectionSetId); + var includeConditions = new IncludeConditionCollection(); + IncludeConditionVisitor.Instance.Visit(operationDefinition, includeConditions); + var fields = _fieldsPool.Get(); - if (!variants.ContainsSelectionSet(type)) - { - infos = _selectionLookup[current.Selection]; - context.Initialize(type, variants, infos, current.Path, current.Optimizers); - CompileSelectionSet(context); - } - } + var compilationContext = new CompilationContext(s_objectArrayPool.Rent(128)); - // create operation - var operation = CreateOperation(request); - - _metrics = new OperationCompilerMetrics( - _nextSelectionId, - _selectionVariants.Count, - backlogMaxSize); + try + { + var lastId = 0; + const ulong parentIncludeFlags = 0ul; + var rootType = _schema.GetOperationType(operationDefinition.Operation); - return operation; + CollectFields( + parentIncludeFlags, + operationDefinition.SelectionSet.Selections, + rootType, + fields, + includeConditions); + + var selectionSet = BuildSelectionSet( + fields, + rootType, + compilationContext, + ref lastId); + + compilationContext.Register(selectionSet, selectionSet.Id); + + return new Operation( + id, + hash, + operationDefinition, + rootType, + _schema, + selectionSet, + this, + includeConditions, + lastId, + compilationContext.ElementsById, + isFinal: true); // todo : add the interceptors back } finally { - _nextSelectionId = 0; - _nextSelectionSetRefId = 0; - _nextSelectionId = 0; - _nextFragmentId = 0; - _hasIncrementalParts = false; - - _backlog.Clear(); - _selectionLookup.Clear(); - _selectionSetIdLookup.Clear(); - _selectionVariants.Clear(); - _fragmentDefinitions.Clear(); - _contextData.Clear(); - _selections.Clear(); - _directiveNames.Clear(); - _pipelineComponents.Clear(); - _enqueuedSelectionSets.Clear(); - - _operationOptimizers = []; - - _includeConditions = []; - _deferContext = null; + _fieldsPool.Return(fields); } } - private Operation CreateOperation(OperationCompilerRequest request) + internal SelectionSet CompileSelectionSet( + Selection selection, + ObjectType objectType, + IncludeConditionCollection includeConditions, + ref object[] elementsById, + ref int lastId) { - var operation = new Operation( - request.Id, - request.Document, - request.Definition, - request.RootType, - request.Schema); - - var schema = Unsafe.As(request.Schema); + var compilationContext = new CompilationContext(elementsById); + var fields = _fieldsPool.Get(); + fields.Clear(); - var variants = new SelectionVariants[_selectionVariants.Count]; - - if (_operationOptimizers.Length == 0) + try { - CompleteResolvers(schema); + var nodes = selection.SyntaxNodes; + var first = nodes[0]; - // if we do not have any optimizers, we will copy - // the variants and seal them in one go. - foreach (var item in _selectionVariants) + CollectFields( + first.PathIncludeFlags, + first.Node.SelectionSet!.Selections, + objectType, + fields, + includeConditions); + + if (nodes.Length > 1) { - variants[item.Key] = item.Value; - item.Value.Seal(operation); + for (var i = 1; i < nodes.Length; i++) + { + var node = nodes[i]; + + CollectFields( + node.PathIncludeFlags, + node.Node.SelectionSet!.Selections, + objectType, + fields, + includeConditions); + } } + + var selectionSet = BuildSelectionSet(fields, objectType, compilationContext, ref lastId); + compilationContext.Register(selectionSet, selectionSet.Id); + elementsById = compilationContext.ElementsById; + return selectionSet; } - else + finally { - // if we have optimizers, we will first copy the variants to its array, - // after that we will run the optimizers and give them a chance to do some - // more mutations on the compiled selection variants. - // after we have executed all optimizers, we will seal the selection variants. - var context = new OperationOptimizerContext( - request.Id, - request.Document, - request.Definition, - schema, - request.RootType, - variants, - _includeConditions, - _contextData, - _hasIncrementalParts, - _createFieldPipeline); - - foreach (var item in _selectionVariants) - { - variants[item.Key] = item.Value; - } - - // we will complete the selection variants, sets and selections - // without sealing them so that analyzers in this step can fully - // inspect them. - var variantsSpan = variants.AsSpan(); - ref var variantsStart = ref GetReference(variantsSpan); - ref var variantsEnd = ref Unsafe.Add(ref variantsStart, variantsSpan.Length); - - while (Unsafe.IsAddressLessThan(ref variantsStart, ref variantsEnd)) - { - variantsStart.Complete(operation); - variantsStart = ref Unsafe.Add(ref variantsStart, 1)!; - } + _fieldsPool.Return(fields); + } + } - var optSpan = _operationOptimizers.AsSpan(); - ref var optStart = ref GetReference(optSpan); - ref var optEnd = ref Unsafe.Add(ref optStart, optSpan.Length); + private void CollectFields( + ulong parentIncludeFlags, + IReadOnlyList selections, + IObjectTypeDefinition typeContext, + OrderedDictionary> fields, + IncludeConditionCollection includeConditions) + { + for (var i = 0; i < selections.Count; i++) + { + var selection = selections[i]; - while (Unsafe.IsAddressLessThan(ref optStart, ref optEnd)) + if (selection is FieldNode fieldNode) { - optStart.OptimizeOperation(context); - optStart = ref Unsafe.Add(ref optStart, 1)!; - } + var responseName = fieldNode.Alias?.Value ?? fieldNode.Name.Value; + var pathIncludeFlags = parentIncludeFlags; - CompleteResolvers(schema); + if (!fields.TryGetValue(responseName, out var nodes)) + { + nodes = []; + fields.Add(responseName, nodes); + } - variantsSpan = variants.AsSpan(); - variantsStart = ref GetReference(variantsSpan)!; - variantsEnd = ref Unsafe.Add(ref variantsStart, variantsSpan.Length)!; + if (IncludeCondition.TryCreate(fieldNode, out var includeCondition)) + { + var index = includeConditions.IndexOf(includeCondition); + pathIncludeFlags |= 1ul << index; + } - while (Unsafe.IsAddressLessThan(ref variantsStart, ref variantsEnd)) - { - variantsStart.Seal(operation); - variantsStart = ref Unsafe.Add(ref variantsStart, 1)!; + nodes.Add(new FieldSelectionNode(fieldNode, pathIncludeFlags)); } - } - - operation.Seal(_contextData, variants, _hasIncrementalParts, _includeConditions); - return operation; - } - private void CompleteResolvers(Schema schema) - { - ref var searchSpace = ref GetReference(AsSpan(_selections)); - - Path? path = null; - for (var i = 0; i < _selections.Count; i++) - { - var selection = Unsafe.Add(ref searchSpace, i); - path = path?.Append(selection.ResponseName); - if (selection.ResolverPipeline is null && selection.PureResolver is null) + if (selection is InlineFragmentNode inlineFragmentNode + && DoesTypeApply(inlineFragmentNode.TypeCondition, typeContext)) { - var field = selection.Field; - var syntaxNode = selection.SyntaxNode; - if (syntaxNode.Directives.Count > 0 && path == null) + var pathIncludeFlags = parentIncludeFlags; + + if (IncludeCondition.TryCreate(inlineFragmentNode, out var includeCondition)) { - // create the path only on demand - path = PathHelper.CreatePathFromSelection(_selections, i + 1); + var index = includeConditions.IndexOf(includeCondition); + pathIncludeFlags |= 1ul << index; } - var resolver = CreateFieldPipeline( - schema, - field, - syntaxNode, - path, - _directiveNames, - _pipelineComponents); - var pureResolver = TryCreatePureField(schema, field, syntaxNode); - selection.SetResolvers(resolver, pureResolver); + CollectFields( + pathIncludeFlags, + inlineFragmentNode.SelectionSet.Selections, + typeContext, + fields, + includeConditions); } } } - private void CompileSelectionSet(CompilerContext context) - { - // We first collect the fields that we find in the selection set ... - CollectFields(context); - - // next we will call the selection set optimizers to rewrite the - // selection set if necessary. - OptimizeSelectionSet(context); - - // after that we start completing the selections and build the SelectionSet from - // the completed selections. - CompleteSelectionSet(context); - } - - private void CompleteSelectionSet(CompilerContext context) + private SelectionSet BuildSelectionSet( + OrderedDictionary> fieldMap, + ObjectType typeContext, + CompilationContext compilationContext, + ref int lastId) { - var selections = new Selection[context.Fields.Values.Count]; - var fragments = context.Fragments.Count is not 0 - ? new Fragment[context.Fragments.Count] - : []; - var selectionIndex = 0; + var i = 0; + var selections = new Selection[fieldMap.Count]; var isConditional = false; + var includeFlags = new List(); + var selectionSetId = ++lastId; - foreach (var selection in context.Fields.Values) + foreach (var (responseName, nodes) in fieldMap) { - // if the field of the selection returns a composite type, we will traverse - // the child selection-sets as well. - var fieldType = selection.Type.NamedType(); - var selectionSetId = -1; + includeFlags.Clear(); - if (selection.IsConditional) + var first = nodes[0]; + var isInternal = IsInternal(first.Node); + + if (first.PathIncludeFlags > 0) { - isConditional = true; + includeFlags.Add(first.PathIncludeFlags); } - // Determines if the type is a composite type. - if (fieldType.IsCompositeType()) + if (nodes.Count > 1) { - if (selection.SelectionSet is null) + for (var j = 1; j < nodes.Count; j++) { - // composite fields always have to have a selection-set - // otherwise we need to throw. - throw QueryCompiler_CompositeTypeSelectionSet(selection.SyntaxNode); - } - - var selectionPath = context.Path.Append(selection.ResponseName); - selectionSetId = GetOrCreateSelectionSetRefId(selection.SelectionSet, fieldType.Name, selectionPath); - var possibleTypes = context.Schema.GetPossibleTypes(fieldType); + var next = nodes[j]; - if (_enqueuedSelectionSets.Add(selectionSetId)) - { - for (var i = possibleTypes.Count - 1; i >= 0; i--) + if (!first.Node.Name.Value.Equals(next.Node.Name.Value, StringComparison.Ordinal)) { - _backlog.Enqueue( - new BacklogItem( - possibleTypes[i], - selectionSetId, - selection, - selectionPath, - ResolveOptimizers(context.Optimizers, selection.Field))); + throw new InvalidOperationException( + $"The syntax nodes for the response name {responseName} are not all the same."); } - } - // We are waiting for the latest stream and defer spec discussions to be codified - // before we change the overall stream handling. - // - // For now, we only allow streams on lists of composite types. - if (selection.SyntaxNode.IsStreamable()) - { - var streamDirective = selection.SyntaxNode.GetStreamDirective(); - var nullValue = NullValueNode.Default; - var ifValue = streamDirective?.GetArgumentValue(DirectiveNames.Stream.Arguments.If) ?? nullValue; - long ifConditionFlags = 0; - - if (ifValue.Kind is not SyntaxKind.NullValue) + if (next.PathIncludeFlags > 0) { - var ifCondition = new IncludeCondition(ifValue, nullValue); - ifConditionFlags = GetSelectionIncludeCondition(ifCondition, 0); + includeFlags.Add(next.PathIncludeFlags); } - selection.MarkAsStream(ifConditionFlags); - _hasIncrementalParts = true; + if (isInternal) + { + isInternal = IsInternal(next.Node); + } } } - selection.SetSelectionSetId(selectionSetId); - selections[selectionIndex++] = selection; - _selections.Add(selection); - } - - if (context.Fragments.Count > 0) - { - for (var i = 0; i < context.Fragments.Count; i++) + if (includeFlags.Count > 1) { - fragments[i] = context.Fragments[i]; + CollapseIncludeFlags(includeFlags); } - } - context.SelectionVariants.AddSelectionSet( - _nextSelectionSetId++, - context.Type, - selections, - fragments, - isConditional); - } + var field = typeContext.Fields[first.Node.Name.Value]; - private void CollectFields(CompilerContext context) - { - foreach (var selectionSetInfo in context.SelectionInfos) - { - CollectFields( - context, - selectionSetInfo.SelectionSet, - selectionSetInfo.IncludeCondition); - } - } + var selection = new Selection( + ++lastId, + responseName, + field, + nodes.ToArray(), + includeFlags.ToArray(), + isInternal); - private void CollectFields( - CompilerContext context, - SelectionSetNode selectionSet, - ulong includeCondition) - { - for (var j = 0; j < selectionSet.Selections.Count; j++) - { - ResolveFields(context, selectionSet.Selections[j], includeCondition); - } - } + // Register the selection in the elements array + compilationContext.Register(selection, selection.Id); + selections[i++] = selection; - private void ResolveFields( - CompilerContext context, - ISelectionNode selection, - long includeCondition) - { - switch (selection.Kind) - { - case SyntaxKind.Field: - ResolveField( - context, - (FieldNode)selection, - includeCondition); - break; - - case SyntaxKind.InlineFragment: - ResolveInlineFragment( - context, - (InlineFragmentNode)selection, - includeCondition); - break; - - case SyntaxKind.FragmentSpread: - ResolveFragmentSpread( - context, - (FragmentSpreadNode)selection, - includeCondition); - break; + if (includeFlags.Count > 1) + { + isConditional = true; + } } + + return new SelectionSet(selectionSetId, typeContext, selections, isConditional); } - private void ResolveField( - CompilerContext context, - FieldNode selection, - ulong includeCondition) + private static void CollapseIncludeFlags(List includeFlags) { - includeCondition = GetSelectionIncludeCondition(selection, includeCondition); + // we sort the include flags to improve early elimination and stability + includeFlags.Sort(); - var fieldName = selection.Name.Value; - var responseName = selection.Alias?.Value ?? fieldName; + var write = 0; - if (context.Type.Fields.TryGetField(fieldName, out var field)) + for (var read = 0; read < includeFlags.Count; read++) { - var fieldType = field.Type; + var candidate = includeFlags[read]; + var covered = false; - if (context.Fields.TryGetValue(responseName, out var preparedSelection)) + // we check if the candidate is already covered + for (var i = 0; i < write; i++) { - preparedSelection.AddSelection(selection, includeCondition); - - if (selection.SelectionSet is not null) + if ((candidate & includeFlags[i]) == includeFlags[i]) { - var selectionSetInfo = new SelectionSetInfo( - selection.SelectionSet!, - includeCondition); - var selectionInfos = _selectionLookup[preparedSelection]; - var next = selectionInfos.Length; - Array.Resize(ref selectionInfos, next + 1); - selectionInfos[next] = selectionSetInfo; - _selectionLookup[preparedSelection] = selectionInfos; + covered = true; + break; } } - else + + if (!covered) { - var id = GetNextSelectionId(); - - // if this is the first time we've found a selection to this field, we have to - // create a new prepared selection. - preparedSelection = new Selection.Sealed( - id, - context.Type, - field, - fieldType, - selection.SelectionSet is not null - ? selection.WithSelectionSet( - selection.SelectionSet.WithSelections( - selection.SelectionSet.Selections)) - : selection, - responseName: responseName, - arguments: CoerceArgumentValues(field, selection), - includeConditions: includeCondition == 0 - ? null - : [includeCondition], - isParallelExecutable: field.IsParallelExecutable); - - context.Fields.Add(responseName, preparedSelection); - - if (selection.SelectionSet is not null) + // lastly we remove more restrictive flags from the already written range + for (var i = 0; i < write;) + { + if ((includeFlags[i] & candidate) == candidate) + { + includeFlags[i] = includeFlags[--write]; + } + else + { + i++; + } + } + + if (write < read) { - var selectionSetInfo = new SelectionSetInfo( - selection.SelectionSet!, - includeCondition); - _selectionLookup.Add(preparedSelection, [selectionSetInfo]); + includeFlags[write] = candidate; } + write++; } } - else + + // we trim the list to the collapsed set + if (write < includeFlags.Count) { - throw FieldDoesNotExistOnType(selection, context.Type.Name); + includeFlags.RemoveRange(write, includeFlags.Count - write); } } - private void ResolveInlineFragment( - CompilerContext context, - InlineFragmentNode inlineFragment, - long includeCondition) + private bool DoesTypeApply(NamedTypeNode? typeCondition, IObjectTypeDefinition typeContext) { - ResolveFragment( - context, - inlineFragment, - inlineFragment.TypeCondition, - inlineFragment.SelectionSet, - inlineFragment.Directives, - includeCondition); - } + if (typeCondition is null) + { + return true; + } - private void ResolveFragmentSpread( - CompilerContext context, - FragmentSpreadNode fragmentSpread, - long includeCondition) - { - var fragmentDef = GetFragmentDefinition(context, fragmentSpread); - - ResolveFragment( - context, - fragmentSpread, - fragmentDef.TypeCondition, - fragmentDef.SelectionSet, - fragmentSpread.Directives, - includeCondition); + if (typeCondition.Name.Value.Equals(typeContext.Name, StringComparison.Ordinal)) + { + return true; + } + + if (_schema.Types.TryGetType(typeCondition.Name.Value, out var type)) + { + return type.IsAssignableFrom(typeContext); + } + + return false; } - private void ResolveFragment( - CompilerContext context, - ISelectionNode selection, - NamedTypeNode? typeCondition, - SelectionSetNode selectionSet, - IReadOnlyList directives, - ulong includeCondition) + private static bool IsInternal(FieldNode fieldNode) { - if (typeCondition is null - || (context.Schema.Types.TryGetType(typeCondition, out IType? typeCon) - && DoesTypeApply(typeCon, context.Type))) - { - includeCondition = GetSelectionIncludeCondition(selection, includeCondition); + const string isInternal = "fusion__requirement"; + var directives = fieldNode.Directives; - if (directives.IsDeferrable()) - { - var deferDirective = directives.GetDeferDirectiveNode(); - var nullValue = NullValueNode.Default; - var ifValue = deferDirective?.GetArgumentValue(DirectiveNames.Defer.Arguments.If) ?? nullValue; + if (directives.Count == 0) + { + return false; + } - ulong ifConditionFlags = 0; + if (directives.Count == 1) + { + return directives[0].Name.Value.Equals(isInternal, StringComparison.Ordinal); + } - if (ifValue.Kind is not SyntaxKind.NullValue) - { - var ifCondition = new IncludeCondition(ifValue, nullValue); - ifConditionFlags = GetSelectionIncludeCondition(ifCondition, includeCondition); - } + if (directives.Count == 2) + { + return directives[0].Name.Value.Equals(isInternal, StringComparison.Ordinal) + || directives[1].Name.Value.Equals(isInternal, StringComparison.Ordinal); + } - var typeName = typeCondition?.Name.Value ?? context.Type.Name; - var id = GetOrCreateSelectionSetRefId(selectionSet, typeName, context.Path); - var variants = GetOrCreateSelectionVariants(id); - var infos = new SelectionSetInfo[] { new(selectionSet, includeCondition) }; + if (directives.Count == 3) + { + return directives[0].Name.Value.Equals(isInternal, StringComparison.Ordinal) + || directives[1].Name.Value.Equals(isInternal, StringComparison.Ordinal) + || directives[2].Name.Value.Equals(isInternal, StringComparison.Ordinal); + } - if (!variants.ContainsSelectionSet(context.Type)) - { - var deferContext = RentContext(context); - deferContext.Initialize(context.Type, variants, infos, context.Path); - CompileSelectionSet(deferContext); - ReturnContext(deferContext); - } + for (var i = 0; i < directives.Count; i++) + { + var directive = directives[i]; - var fragment = new Fragment( - GetNextFragmentId(), - context.Type, - selection, - directives, - variants.GetSelectionSet(context.Type), - includeCondition, - ifConditionFlags); - - context.Fragments.Add(fragment); - _hasIncrementalParts = true; - - // if we have if-condition flags, there will be a runtime validation if something - // shall be deferred, so we need to prepare for both cases. - // - // this means that we will collect the fields with our if condition flags as - // if the fragment was not deferred. - if (ifConditionFlags is not 0) - { - CollectFields(context, selectionSet, ifConditionFlags); - } - } - else + if (directive.Name.Value.Equals(isInternal, StringComparison.Ordinal)) { - CollectFields(context, selectionSet, includeCondition); + return true; } } + + return false; } - private static bool DoesTypeApply(IType typeCondition, IObjectTypeDefinition current) - => typeCondition.Kind switch - { - TypeKind.Object => ReferenceEquals(typeCondition, current), - TypeKind.Interface => current.IsImplementing((InterfaceType)typeCondition), - TypeKind.Union => ((UnionType)typeCondition).Types.ContainsName(current.Name), - _ => false - }; - - private FragmentDefinitionNode GetFragmentDefinition( - CompilerContext context, - FragmentSpreadNode fragmentSpread) + private class IncludeConditionVisitor : SyntaxWalker { - var fragmentName = fragmentSpread.Name.Value; + public static readonly IncludeConditionVisitor Instance = new(); - if (!_fragmentDefinitions.TryGetValue(fragmentName, out var value)) + protected override ISyntaxVisitorAction Enter( + FieldNode node, + IncludeConditionCollection context) { - var document = context.Document; - - for (var i = 0; i < document.Definitions.Count; i++) + if (IncludeCondition.TryCreate(node, out var condition)) { - if (document.Definitions[i] is FragmentDefinitionNode fragmentDefinition - && fragmentDefinition.Name.Value.EqualsOrdinal(fragmentName)) - { - value = fragmentDefinition; - _fragmentDefinitions.Add(fragmentName, value); - goto EXIT; - } + context.Add(condition); } - throw new InvalidOperationException( - string.Format( - OperationCompiler_FragmentNotFound, - fragmentName)); + return base.Enter(node, context); } -EXIT: - return value; - } - - internal int GetNextSelectionId() => _nextSelectionId++; + protected override ISyntaxVisitorAction Enter( + InlineFragmentNode node, + IncludeConditionCollection context) + { + if (IncludeCondition.TryCreate(node, out var condition)) + { + context.Add(condition); + } - private int GetNextFragmentId() => _nextFragmentId++; + return base.Enter(node, context); + } + } - private int GetOrCreateSelectionSetRefId( - SelectionSetNode selectionSet, - string selectionSetTypeName, - SelectionPath path) + private class CompilationContext(object[] elementsById) { - var selectionSetRef = new SelectionSetRef(selectionSet, selectionSetTypeName, path); + private object[] _elementsById = elementsById; - if (!_selectionSetIdLookup.TryGetValue(selectionSetRef, out var selectionSetId)) + public object[] ElementsById => _elementsById; + + public void Register(object element, int id) { - selectionSetId = _nextSelectionSetRefId++; - _selectionSetIdLookup.Add(selectionSetRef, selectionSetId); - } + if (id >= _elementsById.Length) + { + var newArray = s_objectArrayPool.Rent(_elementsById.Length * 2); + _elementsById.AsSpan().CopyTo(newArray); + s_objectArrayPool.Return(_elementsById); + _elementsById = newArray; + } - return selectionSetId; + _elementsById[id] = element; + } } +} + +/// +/// Represents a field selection node with its path include flags. +/// +/// +/// The syntax node that represents the field selection. +/// +/// +/// The flags that must be all set for this selection to be included. +/// +internal sealed record FieldSelectionNode(FieldNode Node, ulong PathIncludeFlags); + +internal class IncludeConditionCollection : ICollection +{ + private readonly OrderedDictionary _dictionary = []; + + public IncludeCondition this[int index] + => _dictionary.GetAt(index).Key; + + public int Count => _dictionary.Count; + + public bool IsReadOnly => false; - private SelectionVariants GetOrCreateSelectionVariants(int selectionSetId) + public bool Add(IncludeCondition item) { - if (!_selectionVariants.TryGetValue(selectionSetId, out var variants)) + if (_dictionary.Count == 64) { - variants = new SelectionVariants(selectionSetId); - _selectionVariants.Add(selectionSetId, variants); + throw new InvalidOperationException( + "The maximum number of include conditions has been reached."); } - return variants; + return _dictionary.TryAdd(item, _dictionary.Count); } - private ulong GetSelectionIncludeCondition( - ISelectionNode selectionSyntax, - ulong parentIncludeCondition) + void ICollection.Add(IncludeCondition item) + => Add(item); + + public bool Remove(IncludeCondition item) + => throw new InvalidOperationException("This is an add only collection."); + + void ICollection.Clear() + => throw new InvalidOperationException("This is an add only collection."); + + public bool Contains(IncludeCondition item) + => _dictionary.ContainsKey(item); + + public int IndexOf(IncludeCondition item) + => _dictionary.GetValueOrDefault(item, -1); + + public void CopyTo(IncludeCondition[] array, int arrayIndex) + => _dictionary.Keys.CopyTo(array, arrayIndex); + + public IEnumerator GetEnumerator() + => _dictionary.Keys.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() + => GetEnumerator(); +} + +internal readonly struct IncludeCondition : IEquatable +{ + private readonly string? _skip; + private readonly string? _include; + + public IncludeCondition(string? skip, string? include) { - var condition = IncludeCondition.FromSelection(selectionSyntax); + _skip = skip; + _include = include; + } - if (condition.IsDefault) - { - return parentIncludeCondition; - } + public string? Skip => _skip; - var pos = Array.IndexOf(_includeConditions, condition); + public string? Include => _include; - if (pos == -1) + public bool IsIncluded(IVariableValueCollection variableValues) + { + if (_skip is not null) { - pos = _includeConditions.Length; - - if (pos == 64) + if (!variableValues.TryGetValue(_skip, out var value)) { - throw new InvalidOperationException(OperationCompiler_ToManyIncludeConditions); + throw new InvalidOperationException($"The variable {_skip} has an invalid value."); } - if (_includeConditions.Length == 0) + if (value.Value) { - _includeConditions = new IncludeCondition[1]; + return false; } - else + } + + if (_include is not null) + { + if (!variableValues.TryGetValue(_include, out var value)) { - Array.Resize(ref _includeConditions, pos + 1); + throw new InvalidOperationException($"The variable {_include} has an invalid value."); } - _includeConditions[pos] = condition; + if (!value.Value) + { + return false; + } } - long selectionIncludeCondition = 1; - selectionIncludeCondition <<= pos; + return true; + } - if (parentIncludeCondition == 0) - { - return selectionIncludeCondition; - } + public bool Equals(IncludeCondition other) + => string.Equals(Skip, other.Skip, StringComparison.Ordinal) + && string.Equals(Include, other.Include, StringComparison.Ordinal); - parentIncludeCondition |= selectionIncludeCondition; - return parentIncludeCondition; - } + public override bool Equals([NotNullWhen(true)] object? obj) + => obj is IncludeCondition other && Equals(other); + + public override int GetHashCode() + => HashCode.Combine(Skip, Include); + + public static bool TryCreate(FieldNode field, out IncludeCondition includeCondition) + => TryCreate(field.Directives, out includeCondition); + + public static bool TryCreate(InlineFragmentNode inlineFragment, out IncludeCondition includeCondition) + => TryCreate(inlineFragment.Directives, out includeCondition); - private long GetSelectionIncludeCondition( - IncludeCondition condition, - ulong parentIncludeCondition) + private static bool TryCreate(IReadOnlyList directives, out IncludeCondition includeCondition) { - var pos = Array.IndexOf(_includeConditions, condition); + string? skip = null; + string? include = null; - if (pos == -1) + if (directives.Count == 0) { - pos = _includeConditions.Length; + includeCondition = default; + return false; + } - if (pos == 64) + if (directives.Count == 1) + { + TryParseDirective(directives[0], ref skip, ref include); + if (TryCreateIncludeCondition(out includeCondition)) { - throw new InvalidOperationException(OperationCompiler_ToManyIncludeConditions); + return true; } + } - if (_includeConditions.Length == 0) - { - _includeConditions = new IncludeCondition[1]; - } - else + if (directives.Count == 2) + { + TryParseDirective(directives[0], ref skip, ref include); + TryParseDirective(directives[1], ref skip, ref include); + return TryCreateIncludeCondition(out includeCondition); + } + + if (directives.Count == 3) + { + TryParseDirective(directives[0], ref skip, ref include); + TryParseDirective(directives[1], ref skip, ref include); + + if (skip is not null && include is not null) { - Array.Resize(ref _includeConditions, pos + 1); + includeCondition = new IncludeCondition(skip, include); + return true; } - _includeConditions[pos] = condition; + TryParseDirective(directives[2], ref skip, ref include); + return TryCreateIncludeCondition(out includeCondition); } - long selectionIncludeCondition = 1; - selectionIncludeCondition <<= pos; - - if (parentIncludeCondition == 0) + for (var i = 0; i < directives.Count; i++) { - return selectionIncludeCondition; + TryParseDirective(directives[i], ref skip, ref include); + + if (skip is not null && include is not null) + { + includeCondition = new IncludeCondition(skip, include); + return true; + } } - parentIncludeCondition |= selectionIncludeCondition; - return parentIncludeCondition; - } + includeCondition = default; + return false; - private CompilerContext RentContext(CompilerContext context) - { - if (_deferContext is null) + bool TryCreateIncludeCondition(out IncludeCondition includeCondition) { - return new CompilerContext(context.Schema, context.Document); - } + if (skip is not null || include is not null) + { + includeCondition = new IncludeCondition(skip, include); + return true; + } - var temp = _deferContext; - _deferContext = null; - return temp; + includeCondition = default; + return false; + } } - private void ReturnContext(CompilerContext context) - => _deferContext ??= context; - - internal void RegisterNewSelection(Selection newSelection) + private static void TryParseDirective(DirectiveNode directive, ref string? skip, ref string? include) { - if (newSelection.SyntaxNode.SelectionSet is not null) + if (directive.Name.Value.Equals(DirectiveNames.Skip.Name, StringComparison.Ordinal) + && directive.Arguments.Count == 1 + && directive.Arguments[0].Value is VariableNode skipVariable) { - var selectionSetInfo = new SelectionSetInfo(newSelection.SelectionSet!, 0); - _selectionLookup.Add(newSelection, [selectionSetInfo]); + skip = skipVariable.Name.Value; + } + else if (directive.Name.Value.Equals(DirectiveNames.Include.Name, StringComparison.Ordinal) + && directive.Arguments.Count == 1 + && directive.Arguments[0].Value is VariableNode includeVariable) + { + include = includeVariable.Name.Value; } - } - - private readonly struct SelectionSetRef( - SelectionSetNode selectionSet, - string selectionSetTypeName, - SelectionPath path) - : IEquatable - { - public readonly SelectionSetNode SelectionSet = selectionSet; - - public readonly SelectionPath Path = path; - - public readonly string SelectionSetTypeName = selectionSetTypeName; - - public bool Equals(SelectionSetRef other) - => SyntaxComparer.BySyntax.Equals(SelectionSet, other.SelectionSet) - && Path.Equals(other.Path) - && Ordinal.Equals(SelectionSetTypeName, other.SelectionSetTypeName); - - public override bool Equals(object? obj) - => obj is SelectionSetRef other && Equals(other); - - public override int GetHashCode() - => HashCode.Combine( - SyntaxComparer.BySyntax.GetHashCode(SelectionSet), - Path.GetHashCode(), - Ordinal.GetHashCode(SelectionSetTypeName)); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs new file mode 100644 index 00000000000..025d3eb9600 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs @@ -0,0 +1,113 @@ +using System.Collections; +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; +using HotChocolate.Features; + +namespace HotChocolate.Execution.Processing; + +[SuppressMessage("ReSharper", "NonAtomicCompoundOperator")] +internal sealed class OperationFeatureCollection : IFeatureCollection +{ +#if NET9_0_OR_GREATER + private readonly Lock _writeLock = new(); +#else + private readonly object _writeLock = new(); +#endif +#if NET10_0_OR_GREATER + private ImmutableDictionary _features = []; +#else + private ImmutableDictionary _features = ImmutableDictionary.Empty; +#endif + private volatile int _containerRevision; + + /// + /// Initializes a new instance of . + /// + public OperationFeatureCollection() + { + } + + /// + public bool IsReadOnly => false; + + /// + public bool IsEmpty => _features.Count == 0; + + /// + public int Revision => _containerRevision; + + /// + public object? this[Type key] + { + get + { + ArgumentNullException.ThrowIfNull(key); + + return _features.GetValueOrDefault(key); + } + set + { + ArgumentNullException.ThrowIfNull(key); + + lock (_writeLock) + { + if (value == null) + { + _features = _features.Remove(key); + _containerRevision++; + return; + } + + _features = _features.SetItem(key, value); + _containerRevision++; + } + } + } + + /// + public TFeature? Get() + { + if (typeof(TFeature).IsValueType) + { + var feature = this[typeof(TFeature)]; + if (feature is null && Nullable.GetUnderlyingType(typeof(TFeature)) is null) + { + throw new InvalidOperationException( + $"{typeof(TFeature).FullName} does not exist in the feature collection " + + "and because it is a struct the method can't return null. " + + $"Use 'featureCollection[typeof({typeof(TFeature).FullName})] is not null' " + + "to check if the feature exists."); + } + + return (TFeature?)feature; + } + + return (TFeature?)this[typeof(TFeature)]; + } + + /// + public bool TryGet([NotNullWhen(true)] out TFeature? feature) + { + if (_features.TryGetValue(typeof(TFeature), out var result) + && result is TFeature f) + { + feature = f; + return true; + } + + feature = default; + return false; + } + + /// + public void Set(TFeature? instance) + { + this[typeof(TFeature)] = instance; + } + + /// + public IEnumerator> GetEnumerator() + => _features.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index 9470b054e68..26be9ca9c7f 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -1,5 +1,7 @@ using System.Diagnostics; +using System.Runtime.CompilerServices; using System.Text; +using HotChocolate.Caching.Memory; using HotChocolate.Execution.Properties; using HotChocolate.Language; using HotChocolate.Resolvers; @@ -13,280 +15,158 @@ namespace HotChocolate.Execution.Processing; public class Selection : ISelection { private static readonly ArgumentMap s_emptyArguments = ArgumentMap.Empty; - private ulong[] _includeConditions; - private ulong _streamIfCondition; + private readonly FieldSelectionNode[] _syntaxNodes; + private readonly ulong[] _includeFlags; + private readonly byte[] _utf8ResponseName; private Flags _flags; - private FieldNode _syntaxNode; - private FieldNode[] _syntaxNodes; - public Selection( + internal Selection( int id, - ObjectType declaringType, - ObjectField field, - IType type, - FieldNode syntaxNode, string responseName, + ObjectField field, + FieldSelectionNode[] syntaxNodes, + ulong[] includeFlags, + bool isInternal, ArgumentMap? arguments = null, - ulong[]? includeConditions = null, - bool isInternal = false, bool isParallelExecutable = true, FieldDelegate? resolverPipeline = null, PureFieldDelegate? pureResolver = null) { + ArgumentNullException.ThrowIfNull(field); + + if (syntaxNodes.Length == 0) + { + throw new ArgumentException( + "The syntaxNodes collection cannot be empty.", + nameof(syntaxNodes)); + } + Id = id; - DeclaringType = declaringType; - Field = field; - Type = type; - _syntaxNode = syntaxNode; - _syntaxNodes = [syntaxNode]; ResponseName = responseName; + Field = field; Arguments = arguments ?? s_emptyArguments; ResolverPipeline = resolverPipeline; PureResolver = pureResolver; - Strategy = InferStrategy(!isParallelExecutable, pureResolver is not null); - - _includeConditions = includeConditions ?? []; - - _flags = isInternal - ? Flags.Internal - : Flags.None; + Strategy = InferStrategy( + isSerial: !isParallelExecutable, + hasPureResolver: pureResolver is not null); + _syntaxNodes = syntaxNodes; + _includeFlags = includeFlags; + _flags = isInternal ? Flags.Internal : Flags.None; + + if (field.Type.NamedType().IsLeafType()) + { + _flags |= Flags.Leaf; + } - if (Type.IsListType()) + if (field.Type.IsListType()) { _flags |= Flags.List; } - } - protected Selection(Selection selection) - { - ArgumentNullException.ThrowIfNull(selection); - - Id = selection.Id; - Strategy = selection.Strategy; - DeclaringType = selection.DeclaringType; - Field = selection.Field; - Type = selection.Type; - _syntaxNode = selection._syntaxNode; - _syntaxNodes = selection._syntaxNodes; - ResponseName = selection.ResponseName; - ResolverPipeline = selection.ResolverPipeline; - PureResolver = selection.PureResolver; - Arguments = selection.Arguments; - _flags = selection._flags; - - _includeConditions = - selection._includeConditions.Length == 0 - ? [] - : selection._includeConditions.ToArray(); + _utf8ResponseName = Utf8StringCache.GetUtf8String(responseName); } /// public int Id { get; } - public CustomOptionsFlags CustomOptions { get; private set; } - /// - public SelectionExecutionStrategy Strategy { get; private set; } - - /// - public ObjectType DeclaringType { get; } - - /// - public ISelectionSet DeclaringSelectionSet { get; private set; } = null!; - - public IOperation DeclaringOperation { get; private set; } = null!; + public string ResponseName { get; } - /// - public ObjectField Field { get; } + internal ReadOnlySpan Utf8ResponseName => _utf8ResponseName; - /// - public IType Type { get; } + public bool IsInternal => (_flags & Flags.Internal) == Flags.Internal; - /// - public TypeKind TypeKind => Type.Kind; + public bool IsConditional => _includeFlags.Length > 0; - /// public bool IsList => (_flags & Flags.List) == Flags.List; - /// - public FieldNode SyntaxNode => _syntaxNode; - - /// - public IReadOnlyList SyntaxNodes => _syntaxNodes; + public bool IsLeaf => (_flags & Flags.Leaf) == Flags.Leaf; - public int SelectionSetId { get; private set; } + public ObjectField Field { get; } /// - public SelectionSetNode? SelectionSet => _syntaxNode.SelectionSet; + IOutputFieldDefinition ISelection.Field => Field; - /// - public string ResponseName { get; } + public IType Type => Field.Type; - /// - public byte[] Utf8ResponseName => _utf8ResponseName ??= Encoding.UTF8.GetBytes(ResponseName); - private byte[]? _utf8ResponseName; + public ObjectType DeclaringType => Field.DeclaringType; - /// - public FieldDelegate? ResolverPipeline { get; private set; } + public SelectionSet DeclaringSelectionSet { get; private set; } = null!; - /// - public PureFieldDelegate? PureResolver { get; private set; } + ISelectionSet ISelection.DeclaringSelectionSet => DeclaringSelectionSet; - /// - public ArgumentMap Arguments { get; } + public Operation DeclaringOperation => DeclaringSelectionSet.DeclaringOperation; - /// - public bool HasStreamDirective(ulong includeFlags) - => (_flags & Flags.Stream) == Flags.Stream - && (_streamIfCondition is 0 || (includeFlags & _streamIfCondition) != _streamIfCondition); + public ArgumentMap Arguments { get; } - /// - /// Specifies if the current selection is immutable. - /// - public bool IsReadOnly => (_flags & Flags.Sealed) == Flags.Sealed; + public SelectionExecutionStrategy Strategy { get; private set; } - /// - public bool IsInternal => (_flags & Flags.Internal) == Flags.Internal; + public FieldDelegate? ResolverPipeline { get; private set; } - /// - public bool IsConditional - => _includeConditions.Length > 0 || (_flags & Flags.Internal) == Flags.Internal; + public PureFieldDelegate? PureResolver { get; private set; } - internal ReadOnlySpan IncludeConditions => _includeConditions; + internal ReadOnlySpan SyntaxNodes => _syntaxNodes; - public bool IsIncluded(ulong includeFlags, bool allowInternals = false) + IEnumerable ISelection.GetSyntaxNodes() { - // in most case we do not have any include condition, - // so we can take the easy way out here if we do not have any flags. - if (_includeConditions.Length is 0) - { - return !IsInternal || allowInternals; - } - - // if there are flags in most cases we just have one, so we can - // check the first and optimize for this. - var includeCondition = _includeConditions[0]; - - if ((includeFlags & includeCondition) == includeCondition) - { - return !IsInternal || allowInternals; - } - - // if we just have one flag and the flags are not fulfilled we can just exit. - if (_includeConditions.Length is 1) - { - return false; - } - - // else, we will iterate over the rest of the conditions and validate them one by one. - for (var i = 1; i < _includeConditions.Length; i++) + for (var i = 0; i < SyntaxNodes.Length; i++) { - includeCondition = _includeConditions[i]; - - if ((includeFlags & includeCondition) == includeCondition) - { - return !IsInternal || allowInternals; - } + yield return SyntaxNodes[i].Node; } - - return false; } - public override string ToString() - => _syntaxNode.ToString(); - - internal void AddSelection(FieldNode selectionSyntax, ulong includeCondition = 0) + public bool IsIncluded(ulong includeFlags) { - if ((_flags & Flags.Sealed) == Flags.Sealed) + if (_includeFlags.Length == 0) { - throw new NotSupportedException(Resources.PreparedSelection_ReadOnly); + return true; } - if (includeCondition == 0) + if (_includeFlags.Length == 1) { - if (_includeConditions.Length > 0) - { - _includeConditions = []; - } + var flags1 = _includeFlags[0]; + return (flags1 & includeFlags) == flags1; } - else if (_includeConditions.Length > 0 && Array.IndexOf(_includeConditions, includeCondition) == -1) + + if (_includeFlags.Length == 2) { - var next = _includeConditions.Length; - Array.Resize(ref _includeConditions, next + 1); - _includeConditions[next] = includeCondition; + var flags1 = _includeFlags[0]; + var flags2 = _includeFlags[1]; + return (flags1 & includeFlags) == flags1 || (flags2 & includeFlags) == flags2; } - if (!_syntaxNode.Equals(selectionSyntax, SyntaxComparison.Syntax)) + if (_includeFlags.Length == 3) { - // enlarge the syntax nodes array and add the new syntax node. - var temp = new FieldNode[_syntaxNodes.Length + 1]; - Array.Copy(_syntaxNodes, temp, _syntaxNodes.Length); - temp[_syntaxNodes.Length] = selectionSyntax; - _syntaxNodes = temp; - - _syntaxNode = MergeField(_syntaxNode, selectionSyntax); + var flags1 = _includeFlags[0]; + var flags2 = _includeFlags[1]; + var flags3 = _includeFlags[2]; + return (flags1 & includeFlags) == flags1 + || (flags2 & includeFlags) == flags2 + || (flags3 & includeFlags) == flags3; } - } - private static FieldNode MergeField( - FieldNode first, - FieldNode other) - { - var directives = first.Directives; + var span = _includeFlags.AsSpan(); - if (other.Directives.Count > 0) + for (var i = 0; i < span.Length; i++) { - if (directives.Count == 0) - { - directives = other.Directives; - } - else + if ((span[i] & includeFlags) == span[i]) { - var temp = new DirectiveNode[directives.Count + other.Directives.Count]; - var next = 0; - - for (var i = 0; i < directives.Count; i++) - { - temp[next++] = directives[i]; - } - - for (var i = 0; i < other.Directives.Count; i++) - { - temp[next++] = other.Directives[i]; - } - - directives = temp; + return true; } } - var selectionSet = first.SelectionSet; + return false; + } - if (selectionSet is not null && other.SelectionSet is not null) + public override string ToString() + { + if (SyntaxNodes[0].Node.Alias is not null) { - var selections = new ISelectionNode[ - selectionSet.Selections.Count + other.SelectionSet.Selections.Count]; - var next = 0; - - for (var i = 0; i < selectionSet.Selections.Count; i++) - { - selections[next++] = selectionSet.Selections[i]; - } - - for (var i = 0; i < other.SelectionSet.Selections.Count; i++) - { - selections[next++] = other.SelectionSet.Selections[i]; - } - - selectionSet = selectionSet.WithSelections(selections); + return $"{ResponseName} : {Field.Name}"; } - return new FieldNode( - first.Location, - first.Name, - first.Alias, - directives, - first.Arguments, - selectionSet); + return Field.Name; } internal void SetResolvers( @@ -303,67 +183,24 @@ internal void SetResolvers( Strategy = InferStrategy(hasPureResolver: pureResolver is not null); } - internal void SetSelectionSetId(int selectionSetId) - { - if ((_flags & Flags.Sealed) == Flags.Sealed) - { - throw new NotSupportedException(Resources.PreparedSelection_ReadOnly); - } - - SelectionSetId = selectionSetId; - } - - internal void MarkAsStream(ulong ifCondition) - { - if ((_flags & Flags.Sealed) == Flags.Sealed) - { - throw new NotSupportedException(Resources.PreparedSelection_ReadOnly); - } - - _streamIfCondition = ifCondition; - _flags |= Flags.Stream; - } - - public void SetOption(CustomOptionsFlags customOptions) - { - if ((_flags & Flags.Sealed) == Flags.Sealed) - { - throw new NotSupportedException(Resources.PreparedSelection_ReadOnly); - } - - CustomOptions |= customOptions; - } - /// /// Completes the selection without sealing it. /// - internal void Complete(IOperation declaringOperation, ISelectionSet declaringSelectionSet) + internal void Complete(SelectionSet selectionSet, bool seal) { - Debug.Assert(declaringSelectionSet is not null); + ArgumentNullException.ThrowIfNull(selectionSet); - if ((_flags & Flags.Sealed) != Flags.Sealed) + if ((_flags & Flags.Sealed) == Flags.Sealed) { - DeclaringSelectionSet = declaringSelectionSet; - DeclaringOperation = declaringOperation; + throw new InvalidOperationException("Selection is already sealed."); } - Debug.Assert( - ReferenceEquals(declaringSelectionSet, DeclaringSelectionSet), - "Selections can only belong to a single selectionSet."); - } + DeclaringSelectionSet = selectionSet; - internal void Seal(IOperation declaringOperation, ISelectionSet declaringSelectionSet) - { - if ((_flags & Flags.Sealed) != Flags.Sealed) + if (seal) { - DeclaringSelectionSet = declaringSelectionSet; - DeclaringOperation = declaringOperation; _flags |= Flags.Sealed; } - - Debug.Assert( - ReferenceEquals(declaringSelectionSet, DeclaringSelectionSet), - "Selections can only belong to a single selectionSet."); } private SelectionExecutionStrategy InferStrategy( @@ -391,20 +228,8 @@ private enum Flags Internal = 1, Sealed = 2, List = 4, - Stream = 8 - } - - [Flags] - public enum CustomOptionsFlags : byte - { - None = 0, - Option1 = 1, - Option2 = 2, - Option3 = 4, - Option4 = 8, - Option5 = 16, - Option6 = 32, - Option7 = 64 + Stream = 8, + Leaf = 16 } internal sealed class Sealed : Selection @@ -438,3 +263,13 @@ public Sealed( } } } + +internal static class Utf8StringCache +{ + private static readonly Encoding s_utf8 = Encoding.UTF8; + private static readonly Cache s_cache = new(capacity: 4 * 1024); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte[] GetUtf8String(string s) + => s_cache.GetOrCreate(s, static k => s_utf8.GetBytes(k)); +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs index 88223788ca3..6968ad6a7a3 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs @@ -1,5 +1,4 @@ using System.Collections.Frozen; -using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using HotChocolate.Types; @@ -11,97 +10,74 @@ namespace HotChocolate.Execution.Processing; /// When needed a selection set can preserve fragments so that the execution engine /// can branch the processing of these fragments. /// -internal sealed class SelectionSet : ISelectionSet +public sealed class SelectionSet : ISelectionSet { - private static readonly Fragment[] s_empty = []; private readonly Selection[] _selections; - private readonly FrozenDictionary _responseNameLookup; + private readonly FrozenDictionary _responseNameLookup; private readonly SelectionLookup _utf8ResponseNameLookup; - private readonly Fragment[] _fragments; private Flags _flags; - /// - /// Initializes a new instance of . - /// - /// - /// The selection set unique id. - /// - /// - /// A list of executable field selections. - /// - /// - /// A list of preserved fragments that can be used to branch of - /// some of the execution. - /// - /// - /// Defines if this list needs post-processing for skip and include. - /// - public SelectionSet( - int id, - Selection[] selections, - Fragment[]? fragments, - bool isConditional) + public SelectionSet(int id, IObjectTypeDefinition type, Selection[] selections, bool isConditional) { + ArgumentNullException.ThrowIfNull(selections); + + if (selections.Length == 0) + { + throw new ArgumentException("Selections cannot be empty.", nameof(selections)); + } + Id = id; + Type = type; + _flags = isConditional ? Flags.Conditional : Flags.None; _selections = selections; - _responseNameLookup = _selections.ToFrozenDictionary(t => t.ResponseName, ISelection (t) => t); + _responseNameLookup = _selections.ToFrozenDictionary(t => t.ResponseName); _utf8ResponseNameLookup = SelectionLookup.Create(this); - _fragments = fragments ?? s_empty; - _flags = isConditional ? Flags.Conditional : Flags.None; } - /// + /// + /// Gets an operation unique selection-set identifier of this selection. + /// public int Id { get; } - /// + /// + /// Defines if this list needs post-processing for skip and include. + /// public bool IsConditional => (_flags & Flags.Conditional) == Flags.Conditional; - /// - public IReadOnlyList Selections => _selections; - - /// - public IReadOnlyList Fragments => _fragments; - - /// - public IOperation DeclaringOperation { get; private set; } = null!; + /// + /// Gets the type that declares this selection set. + /// + public IObjectTypeDefinition Type { get; } - /// - public bool TryGetSelection(string responseName, [NotNullWhen(true)] out ISelection? selection) - => _responseNameLookup.TryGetValue(responseName, out selection); + /// + /// Gets the declaring operation. + /// + public Operation DeclaringOperation { get; private set; } = null!; - /// - public bool TryGetSelection(ReadOnlySpan utf8ResponseName, [NotNullWhen(true)] out ISelection? selection) - => _utf8ResponseNameLookup.TryGetSelection(utf8ResponseName, out selection); + IOperation ISelectionSet.DeclaringOperation => DeclaringOperation; /// - /// Completes the selection set without sealing it. + /// Gets the selections that shall be executed. /// - internal void Complete(IOperation declaringOperation) - { - if ((_flags & Flags.Sealed) != Flags.Sealed) - { - DeclaringOperation = declaringOperation; - - for (var i = 0; i < _selections.Length; i++) - { - _selections[i].Complete(declaringOperation, this); - } - } - } + public ReadOnlySpan Selections => _selections; - internal void Seal(IOperation declaringOperation) + IEnumerable ISelectionSet.GetSelections() => _selections; + + internal void Complete(Operation declaringOperation, bool seal) { - if ((_flags & Flags.Sealed) != Flags.Sealed) + if ((_flags & Flags.Sealed) == Flags.Sealed) { - DeclaringOperation = declaringOperation; + throw new InvalidOperationException("Selection set is already sealed."); + } - for (var i = 0; i < _selections.Length; i++) - { - _selections[i].Seal(declaringOperation, this); - } + DeclaringOperation = declaringOperation; - _flags |= Flags.Sealed; + foreach (var selection in _selections) + { + selection.Complete(declaringOperation, this); } + + _flags |= Flags.Sealed; } /// diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionVariants.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionVariants.cs deleted file mode 100644 index 7cc029c1c6c..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionVariants.cs +++ /dev/null @@ -1,194 +0,0 @@ -using HotChocolate.Types; -using static HotChocolate.Execution.Properties.Resources; -using static HotChocolate.Execution.ThrowHelper; - -namespace HotChocolate.Execution.Processing; - -internal sealed class SelectionVariants(int id) : ISelectionVariants -{ - private ObjectType? _firstType; - private SelectionSet? _firstSelectionSet; - private ObjectType? _secondType; - private SelectionSet? _secondSelectionSet; - private Dictionary? _map; - private bool _readOnly; - - /// - public int Id { get; } = id; - - /// - public IOperation DeclaringOperation { get; private set; } = null!; - - public IEnumerable GetPossibleTypes() - => _map?.Keys ?? GetPossibleTypesLazy(); - - public bool IsPossibleType(ObjectType typeContext) - { - if (_map is not null) - { - return _map.ContainsKey(typeContext); - } - - if (ReferenceEquals(_firstType, typeContext)) - { - return true; - } - - if (ReferenceEquals(_secondType, typeContext)) - { - return true; - } - - return false; - } - - private IEnumerable GetPossibleTypesLazy() - { - yield return _firstType!; - - if (_secondType is not null) - { - yield return _secondType; - } - } - - public ISelectionSet GetSelectionSet(ObjectType typeContext) - { - if (_map is not null) - { - if (_map.TryGetValue(typeContext, out var selections)) - { - return selections; - } - else - { - throw SelectionSet_TypeContextInvalid(typeContext); - } - } - - if (ReferenceEquals(_firstType, typeContext)) - { - return _firstSelectionSet!; - } - - if (ReferenceEquals(_secondType, typeContext)) - { - return _secondSelectionSet!; - } - - throw SelectionSet_TypeContextInvalid(typeContext); - } - - internal bool ContainsSelectionSet(ObjectType typeContext) - { - if (_map is not null) - { - return _map.ContainsKey(typeContext); - } - - if (ReferenceEquals(_firstType, typeContext)) - { - return true; - } - - if (ReferenceEquals(_secondType, typeContext)) - { - return true; - } - - return false; - } - - internal void AddSelectionSet( - int id, - ObjectType typeContext, - Selection[] selections, - Fragment[]? fragments, - bool isConditional) - { - if (_readOnly) - { - throw new NotSupportedException(SelectionVariants_ReadOnly); - } - - var selectionSet = new SelectionSet(id, selections, fragments, isConditional); - - if (_map is not null) - { - _map[typeContext] = selectionSet; - } - else - { - if (_firstType is null) - { - _firstType = typeContext; - _firstSelectionSet = selectionSet; - } - else if (_secondType is null) - { - if (typeContext == _firstType) - { - throw SelectionSet_TypeAlreadyAdded(typeContext); - } - - _secondType = typeContext; - _secondSelectionSet = selectionSet; - } - else - { - _map = new Dictionary - { - { _firstType, _firstSelectionSet! }, - { _secondType, _secondSelectionSet! }, - { typeContext, selectionSet } - }; - - _firstType = null; - _firstSelectionSet = null; - _secondType = null; - _secondSelectionSet = null; - } - } - } - - /// - /// Completes the selection variant without sealing it. - /// - internal void Complete(IOperation declaringOperation) - { - if (!_readOnly) - { - DeclaringOperation = declaringOperation; - _firstSelectionSet?.Complete(declaringOperation); - _secondSelectionSet?.Complete(declaringOperation); - - if (_map is not null) - { - foreach (var selectionSet in _map.Values) - { - selectionSet.Complete(declaringOperation); - } - } - } - } - - internal void Seal(IOperation declaringOperation) - { - if (!_readOnly) - { - DeclaringOperation = declaringOperation; - _firstSelectionSet?.Seal(declaringOperation); - _secondSelectionSet?.Seal(declaringOperation); - - if (_map is not null) - { - foreach (var selectionSet in _map.Values) - { - selectionSet.Seal(declaringOperation); - } - } - - _readOnly = true; - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.ArgumentValues.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.ArgumentValues.cs similarity index 98% rename from src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.ArgumentValues.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.ArgumentValues.cs index a5c2aaf134a..c867fbb89d8 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.ArgumentValues.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.ArgumentValues.cs @@ -215,8 +215,3 @@ private static void BuildDirectivePipeline( } } } - -internal delegate FieldDelegate CreateFieldPipeline( - Schema schema, - ObjectField field, - FieldNode selection); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.cs new file mode 100644 index 00000000000..174bc3ca348 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.cs @@ -0,0 +1,787 @@ +using System.Collections.Immutable; +using System.Runtime.CompilerServices; +using HotChocolate.Language; +using HotChocolate.Resolvers; +using HotChocolate.Types; +using HotChocolate.Utilities; +using static System.Runtime.InteropServices.CollectionsMarshal; +using static System.Runtime.InteropServices.MemoryMarshal; +using static System.StringComparer; +using static HotChocolate.Execution.Properties.Resources; +using static HotChocolate.Execution.ThrowHelper; + +namespace HotChocolate.Execution.Processing; + +/// +/// The operation compiler will analyze a specific operation of a GraphQL request document +/// and create from it an optimized executable operation tree. +/// +public sealed partial class OperationCompiler +{ + private readonly InputParser _parser; + private readonly CreateFieldPipeline _createFieldPipeline; + private readonly Queue _backlog = []; + private readonly Dictionary _selectionLookup = []; + private readonly Dictionary _selectionSetIdLookup = []; + private readonly Dictionary _selectionVariants = []; + private readonly Dictionary _fragmentDefinitions = []; + private readonly Dictionary _contextData = []; + private readonly List _selections = []; + private readonly HashSet _directiveNames = new(Ordinal); + private readonly List _pipelineComponents = []; + private readonly HashSet _enqueuedSelectionSets = []; + private IncludeCondition[] _includeConditions = []; + private CompilerContext? _deferContext; + private ImmutableArray _operationOptimizers = []; + private int _nextSelectionId; + private int _nextSelectionSetRefId; + private int _nextSelectionSetId; + private int _nextFragmentId; + private bool _hasIncrementalParts; + private OperationCompilerMetrics _metrics; + + public OperationCompiler(InputParser parser) + { + _parser = parser ?? throw new ArgumentNullException(nameof(parser)); + + _createFieldPipeline = + (schema, field, selection) + => CreateFieldPipeline( + schema, + field, + selection, + null, + _directiveNames, + _pipelineComponents); + } + + internal OperationCompilerMetrics Metrics => _metrics; + + public IOperation Compile(OperationCompilerRequest request) + { + ArgumentException.ThrowIfNullOrEmpty(request.Id, nameof(request)); + + try + { + var backlogMaxSize = 0; + var selectionSetOptimizers = request.SelectionSetOptimizers; + _operationOptimizers = request.OperationOptimizers; + + // collect root fields + var rootPath = SelectionPath.Root; + var id = GetOrCreateSelectionSetRefId(request.Definition.SelectionSet, request.RootType.Name, rootPath); + var variants = GetOrCreateSelectionVariants(id); + SelectionSetInfo[] infos = [new(request.Definition.SelectionSet, 0)]; + + var context = new CompilerContext((Schema)request.Schema, request.Document); + context.Initialize(request.RootType, variants, infos, rootPath, selectionSetOptimizers); + CompileSelectionSet(context); + + // process consecutive selections + while (_backlog.Count > 0) + { + backlogMaxSize = Math.Max(backlogMaxSize, _backlog.Count); + + var current = _backlog.Dequeue(); + var type = current.Type; + variants = GetOrCreateSelectionVariants(current.SelectionSetId); + + if (!variants.ContainsSelectionSet(type)) + { + infos = _selectionLookup[current.Selection]; + context.Initialize(type, variants, infos, current.Path, current.Optimizers); + CompileSelectionSet(context); + } + } + + // create operation + var operation = CreateOperation(request); + + _metrics = new OperationCompilerMetrics( + _nextSelectionId, + _selectionVariants.Count, + backlogMaxSize); + + return operation; + } + finally + { + _nextSelectionId = 0; + _nextSelectionSetRefId = 0; + _nextSelectionId = 0; + _nextFragmentId = 0; + _hasIncrementalParts = false; + + _backlog.Clear(); + _selectionLookup.Clear(); + _selectionSetIdLookup.Clear(); + _selectionVariants.Clear(); + _fragmentDefinitions.Clear(); + _contextData.Clear(); + _selections.Clear(); + _directiveNames.Clear(); + _pipelineComponents.Clear(); + _enqueuedSelectionSets.Clear(); + + _operationOptimizers = []; + + _includeConditions = []; + _deferContext = null; + } + } + + private Operation CreateOperation(OperationCompilerRequest request) + { + var operation = new Operation( + request.Id, + request.Document, + request.Definition, + request.RootType, + request.Schema); + + var schema = Unsafe.As(request.Schema); + + var variants = new SelectionVariants[_selectionVariants.Count]; + + if (_operationOptimizers.Length == 0) + { + CompleteResolvers(schema); + + // if we do not have any optimizers, we will copy + // the variants and seal them in one go. + foreach (var item in _selectionVariants) + { + variants[item.Key] = item.Value; + item.Value.Seal(operation); + } + } + else + { + // if we have optimizers, we will first copy the variants to its array, + // after that we will run the optimizers and give them a chance to do some + // more mutations on the compiled selection variants. + // after we have executed all optimizers, we will seal the selection variants. + var context = new OperationOptimizerContext( + request.Id, + request.Document, + request.Definition, + schema, + request.RootType, + variants, + _includeConditions, + _contextData, + _hasIncrementalParts, + _createFieldPipeline); + + foreach (var item in _selectionVariants) + { + variants[item.Key] = item.Value; + } + + // we will complete the selection variants, sets and selections + // without sealing them so that analyzers in this step can fully + // inspect them. + var variantsSpan = variants.AsSpan(); + ref var variantsStart = ref GetReference(variantsSpan); + ref var variantsEnd = ref Unsafe.Add(ref variantsStart, variantsSpan.Length); + + while (Unsafe.IsAddressLessThan(ref variantsStart, ref variantsEnd)) + { + variantsStart.Complete(operation); + variantsStart = ref Unsafe.Add(ref variantsStart, 1)!; + } + + var optSpan = _operationOptimizers.AsSpan(); + ref var optStart = ref GetReference(optSpan); + ref var optEnd = ref Unsafe.Add(ref optStart, optSpan.Length); + + while (Unsafe.IsAddressLessThan(ref optStart, ref optEnd)) + { + optStart.OptimizeOperation(context); + optStart = ref Unsafe.Add(ref optStart, 1)!; + } + + CompleteResolvers(schema); + + variantsSpan = variants.AsSpan(); + variantsStart = ref GetReference(variantsSpan)!; + variantsEnd = ref Unsafe.Add(ref variantsStart, variantsSpan.Length)!; + + while (Unsafe.IsAddressLessThan(ref variantsStart, ref variantsEnd)) + { + variantsStart.Seal(operation); + variantsStart = ref Unsafe.Add(ref variantsStart, 1)!; + } + } + + operation.Seal(_contextData, variants, _hasIncrementalParts, _includeConditions); + return operation; + } + + private void CompleteResolvers(Schema schema) + { + ref var searchSpace = ref GetReference(AsSpan(_selections)); + + Path? path = null; + for (var i = 0; i < _selections.Count; i++) + { + var selection = Unsafe.Add(ref searchSpace, i); + path = path?.Append(selection.ResponseName); + if (selection.ResolverPipeline is null && selection.PureResolver is null) + { + var field = selection.Field; + var syntaxNode = selection.SyntaxNode; + if (syntaxNode.Directives.Count > 0 && path == null) + { + // create the path only on demand + path = PathHelper.CreatePathFromSelection(_selections, i + 1); + } + + var resolver = CreateFieldPipeline( + schema, + field, + syntaxNode, + path, + _directiveNames, + _pipelineComponents); + var pureResolver = TryCreatePureField(schema, field, syntaxNode); + selection.SetResolvers(resolver, pureResolver); + } + } + } + + private void CompileSelectionSet(CompilerContext context) + { + // We first collect the fields that we find in the selection set ... + CollectFields(context); + + // next we will call the selection set optimizers to rewrite the + // selection set if necessary. + OptimizeSelectionSet(context); + + // after that we start completing the selections and build the SelectionSet from + // the completed selections. + CompleteSelectionSet(context); + } + + private void CompleteSelectionSet(CompilerContext context) + { + var selections = new Selection[context.Fields.Values.Count]; + var fragments = context.Fragments.Count is not 0 + ? new Fragment[context.Fragments.Count] + : []; + var selectionIndex = 0; + var isConditional = false; + + foreach (var selection in context.Fields.Values) + { + // if the field of the selection returns a composite type, we will traverse + // the child selection-sets as well. + var fieldType = selection.Type.NamedType(); + var selectionSetId = -1; + + if (selection.IsConditional) + { + isConditional = true; + } + + // Determines if the type is a composite type. + if (fieldType.IsCompositeType()) + { + if (selection.SelectionSet is null) + { + // composite fields always have to have a selection-set + // otherwise we need to throw. + throw QueryCompiler_CompositeTypeSelectionSet(selection.SyntaxNode); + } + + var selectionPath = context.Path.Append(selection.ResponseName); + selectionSetId = GetOrCreateSelectionSetRefId(selection.SelectionSet, fieldType.Name, selectionPath); + var possibleTypes = context.Schema.GetPossibleTypes(fieldType); + + if (_enqueuedSelectionSets.Add(selectionSetId)) + { + for (var i = possibleTypes.Count - 1; i >= 0; i--) + { + _backlog.Enqueue( + new BacklogItem( + possibleTypes[i], + selectionSetId, + selection, + selectionPath, + ResolveOptimizers(context.Optimizers, selection.Field))); + } + } + + // We are waiting for the latest stream and defer spec discussions to be codified + // before we change the overall stream handling. + // + // For now, we only allow streams on lists of composite types. + if (selection.SyntaxNode.IsStreamable()) + { + var streamDirective = selection.SyntaxNode.GetStreamDirective(); + var nullValue = NullValueNode.Default; + var ifValue = streamDirective?.GetArgumentValue(DirectiveNames.Stream.Arguments.If) ?? nullValue; + long ifConditionFlags = 0; + + if (ifValue.Kind is not SyntaxKind.NullValue) + { + var ifCondition = new IncludeCondition(ifValue, nullValue); + ifConditionFlags = GetSelectionIncludeCondition(ifCondition, 0); + } + + selection.MarkAsStream(ifConditionFlags); + _hasIncrementalParts = true; + } + } + + selection.SetSelectionSetId(selectionSetId); + selections[selectionIndex++] = selection; + _selections.Add(selection); + } + + if (context.Fragments.Count > 0) + { + for (var i = 0; i < context.Fragments.Count; i++) + { + fragments[i] = context.Fragments[i]; + } + } + + context.SelectionVariants.AddSelectionSet( + _nextSelectionSetId++, + context.Type, + selections, + fragments, + isConditional); + } + + private void CollectFields(CompilerContext context) + { + foreach (var selectionSetInfo in context.SelectionInfos) + { + CollectFields( + context, + selectionSetInfo.SelectionSet, + selectionSetInfo.IncludeCondition); + } + } + + private void CollectFields( + CompilerContext context, + SelectionSetNode selectionSet, + ulong includeCondition) + { + for (var j = 0; j < selectionSet.Selections.Count; j++) + { + ResolveFields(context, selectionSet.Selections[j], includeCondition); + } + } + + private void ResolveFields( + CompilerContext context, + ISelectionNode selection, + long includeCondition) + { + switch (selection.Kind) + { + case SyntaxKind.Field: + ResolveField( + context, + (FieldNode)selection, + includeCondition); + break; + + case SyntaxKind.InlineFragment: + ResolveInlineFragment( + context, + (InlineFragmentNode)selection, + includeCondition); + break; + + case SyntaxKind.FragmentSpread: + ResolveFragmentSpread( + context, + (FragmentSpreadNode)selection, + includeCondition); + break; + } + } + + private void ResolveField( + CompilerContext context, + FieldNode selection, + ulong includeCondition) + { + includeCondition = GetSelectionIncludeCondition(selection, includeCondition); + + var fieldName = selection.Name.Value; + var responseName = selection.Alias?.Value ?? fieldName; + + if (context.Type.Fields.TryGetField(fieldName, out var field)) + { + var fieldType = field.Type; + + if (context.Fields.TryGetValue(responseName, out var preparedSelection)) + { + preparedSelection.AddSelection(selection, includeCondition); + + if (selection.SelectionSet is not null) + { + var selectionSetInfo = new SelectionSetInfo( + selection.SelectionSet!, + includeCondition); + var selectionInfos = _selectionLookup[preparedSelection]; + var next = selectionInfos.Length; + Array.Resize(ref selectionInfos, next + 1); + selectionInfos[next] = selectionSetInfo; + _selectionLookup[preparedSelection] = selectionInfos; + } + } + else + { + var id = GetNextSelectionId(); + + // if this is the first time we've found a selection to this field, we have to + // create a new prepared selection. + preparedSelection = new Selection.Sealed( + id, + context.Type, + field, + fieldType, + selection.SelectionSet is not null + ? selection.WithSelectionSet( + selection.SelectionSet.WithSelections( + selection.SelectionSet.Selections)) + : selection, + responseName: responseName, + arguments: CoerceArgumentValues(field, selection), + includeConditions: includeCondition == 0 + ? null + : [includeCondition], + isParallelExecutable: field.IsParallelExecutable); + + context.Fields.Add(responseName, preparedSelection); + + if (selection.SelectionSet is not null) + { + var selectionSetInfo = new SelectionSetInfo( + selection.SelectionSet!, + includeCondition); + _selectionLookup.Add(preparedSelection, [selectionSetInfo]); + } + } + } + else + { + throw FieldDoesNotExistOnType(selection, context.Type.Name); + } + } + + private void ResolveInlineFragment( + CompilerContext context, + InlineFragmentNode inlineFragment, + long includeCondition) + { + ResolveFragment( + context, + inlineFragment, + inlineFragment.TypeCondition, + inlineFragment.SelectionSet, + inlineFragment.Directives, + includeCondition); + } + + private void ResolveFragmentSpread( + CompilerContext context, + FragmentSpreadNode fragmentSpread, + long includeCondition) + { + var fragmentDef = GetFragmentDefinition(context, fragmentSpread); + + ResolveFragment( + context, + fragmentSpread, + fragmentDef.TypeCondition, + fragmentDef.SelectionSet, + fragmentSpread.Directives, + includeCondition); + } + + private void ResolveFragment( + CompilerContext context, + ISelectionNode selection, + NamedTypeNode? typeCondition, + SelectionSetNode selectionSet, + IReadOnlyList directives, + ulong includeCondition) + { + if (typeCondition is null + || (context.Schema.Types.TryGetType(typeCondition, out IType? typeCon) + && DoesTypeApply(typeCon, context.Type))) + { + includeCondition = GetSelectionIncludeCondition(selection, includeCondition); + + if (directives.IsDeferrable()) + { + var deferDirective = directives.GetDeferDirectiveNode(); + var nullValue = NullValueNode.Default; + var ifValue = deferDirective?.GetArgumentValue(DirectiveNames.Defer.Arguments.If) ?? nullValue; + + ulong ifConditionFlags = 0; + + if (ifValue.Kind is not SyntaxKind.NullValue) + { + var ifCondition = new IncludeCondition(ifValue, nullValue); + ifConditionFlags = GetSelectionIncludeCondition(ifCondition, includeCondition); + } + + var typeName = typeCondition?.Name.Value ?? context.Type.Name; + var id = GetOrCreateSelectionSetRefId(selectionSet, typeName, context.Path); + var variants = GetOrCreateSelectionVariants(id); + var infos = new SelectionSetInfo[] { new(selectionSet, includeCondition) }; + + if (!variants.ContainsSelectionSet(context.Type)) + { + var deferContext = RentContext(context); + deferContext.Initialize(context.Type, variants, infos, context.Path); + CompileSelectionSet(deferContext); + ReturnContext(deferContext); + } + + var fragment = new Fragment( + GetNextFragmentId(), + context.Type, + selection, + directives, + variants.GetSelectionSet(context.Type), + includeCondition, + ifConditionFlags); + + context.Fragments.Add(fragment); + _hasIncrementalParts = true; + + // if we have if-condition flags, there will be a runtime validation if something + // shall be deferred, so we need to prepare for both cases. + // + // this means that we will collect the fields with our if condition flags as + // if the fragment was not deferred. + if (ifConditionFlags is not 0) + { + CollectFields(context, selectionSet, ifConditionFlags); + } + } + else + { + CollectFields(context, selectionSet, includeCondition); + } + } + } + + private static bool DoesTypeApply(IType typeCondition, IObjectTypeDefinition current) + => typeCondition.Kind switch + { + TypeKind.Object => ReferenceEquals(typeCondition, current), + TypeKind.Interface => current.IsImplementing((InterfaceType)typeCondition), + TypeKind.Union => ((UnionType)typeCondition).Types.ContainsName(current.Name), + _ => false + }; + + private FragmentDefinitionNode GetFragmentDefinition( + CompilerContext context, + FragmentSpreadNode fragmentSpread) + { + var fragmentName = fragmentSpread.Name.Value; + + if (!_fragmentDefinitions.TryGetValue(fragmentName, out var value)) + { + var document = context.Document; + + for (var i = 0; i < document.Definitions.Count; i++) + { + if (document.Definitions[i] is FragmentDefinitionNode fragmentDefinition + && fragmentDefinition.Name.Value.EqualsOrdinal(fragmentName)) + { + value = fragmentDefinition; + _fragmentDefinitions.Add(fragmentName, value); + goto EXIT; + } + } + + throw new InvalidOperationException( + string.Format( + OperationCompiler_FragmentNotFound, + fragmentName)); + } + +EXIT: + return value; + } + + internal int GetNextSelectionId() => _nextSelectionId++; + + private int GetNextFragmentId() => _nextFragmentId++; + + private int GetOrCreateSelectionSetRefId( + SelectionSetNode selectionSet, + string selectionSetTypeName, + SelectionPath path) + { + var selectionSetRef = new SelectionSetRef(selectionSet, selectionSetTypeName, path); + + if (!_selectionSetIdLookup.TryGetValue(selectionSetRef, out var selectionSetId)) + { + selectionSetId = _nextSelectionSetRefId++; + _selectionSetIdLookup.Add(selectionSetRef, selectionSetId); + } + + return selectionSetId; + } + + private SelectionVariants GetOrCreateSelectionVariants(int selectionSetId) + { + if (!_selectionVariants.TryGetValue(selectionSetId, out var variants)) + { + variants = new SelectionVariants(selectionSetId); + _selectionVariants.Add(selectionSetId, variants); + } + + return variants; + } + + private ulong GetSelectionIncludeCondition( + ISelectionNode selectionSyntax, + ulong parentIncludeCondition) + { + var condition = IncludeCondition.FromSelection(selectionSyntax); + + if (condition.IsDefault) + { + return parentIncludeCondition; + } + + var pos = Array.IndexOf(_includeConditions, condition); + + if (pos == -1) + { + pos = _includeConditions.Length; + + if (pos == 64) + { + throw new InvalidOperationException(OperationCompiler_ToManyIncludeConditions); + } + + if (_includeConditions.Length == 0) + { + _includeConditions = new IncludeCondition[1]; + } + else + { + Array.Resize(ref _includeConditions, pos + 1); + } + + _includeConditions[pos] = condition; + } + + long selectionIncludeCondition = 1; + selectionIncludeCondition <<= pos; + + if (parentIncludeCondition == 0) + { + return selectionIncludeCondition; + } + + parentIncludeCondition |= selectionIncludeCondition; + return parentIncludeCondition; + } + + private long GetSelectionIncludeCondition( + IncludeCondition condition, + ulong parentIncludeCondition) + { + var pos = Array.IndexOf(_includeConditions, condition); + + if (pos == -1) + { + pos = _includeConditions.Length; + + if (pos == 64) + { + throw new InvalidOperationException(OperationCompiler_ToManyIncludeConditions); + } + + if (_includeConditions.Length == 0) + { + _includeConditions = new IncludeCondition[1]; + } + else + { + Array.Resize(ref _includeConditions, pos + 1); + } + + _includeConditions[pos] = condition; + } + + long selectionIncludeCondition = 1; + selectionIncludeCondition <<= pos; + + if (parentIncludeCondition == 0) + { + return selectionIncludeCondition; + } + + parentIncludeCondition |= selectionIncludeCondition; + return parentIncludeCondition; + } + + private CompilerContext RentContext(CompilerContext context) + { + if (_deferContext is null) + { + return new CompilerContext(context.Schema, context.Document); + } + + var temp = _deferContext; + _deferContext = null; + return temp; + } + + private void ReturnContext(CompilerContext context) + => _deferContext ??= context; + + internal void RegisterNewSelection(Selection newSelection) + { + if (newSelection.SyntaxNode.SelectionSet is not null) + { + var selectionSetInfo = new SelectionSetInfo(newSelection.SelectionSet!, 0); + _selectionLookup.Add(newSelection, [selectionSetInfo]); + } + } + + private readonly struct SelectionSetRef( + SelectionSetNode selectionSet, + string selectionSetTypeName, + SelectionPath path) + : IEquatable + { + public readonly SelectionSetNode SelectionSet = selectionSet; + + public readonly SelectionPath Path = path; + + public readonly string SelectionSetTypeName = selectionSetTypeName; + + public bool Equals(SelectionSetRef other) + => SyntaxComparer.BySyntax.Equals(SelectionSet, other.SelectionSet) + && Path.Equals(other.Path) + && Ordinal.Equals(SelectionSetTypeName, other.SelectionSetTypeName); + + public override bool Equals(object? obj) + => obj is SelectionSetRef other && Equals(other); + + public override int GetHashCode() + => HashCode.Combine( + SyntaxComparer.BySyntax.GetHashCode(SelectionSet), + Path.GetHashCode(), + Ordinal.GetHashCode(SelectionSetTypeName)); + } +} diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index ae9e6fe3046..2729033aa3b 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -62,10 +62,12 @@ + + diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/IncludeConditionCollection.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/IncludeConditionCollection.cs index a4818fa44ee..c6eed75faa7 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/IncludeConditionCollection.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/IncludeConditionCollection.cs @@ -37,14 +37,7 @@ public bool Contains(IncludeCondition item) => _dictionary.ContainsKey(item); public int IndexOf(IncludeCondition item) - { - if (_dictionary.TryGetValue(item, out var index)) - { - return index; - } - - return -1; - } + => _dictionary.GetValueOrDefault(item, -1); public void CopyTo(IncludeCondition[] array, int arrayIndex) => _dictionary.Keys.CopyTo(array, arrayIndex); diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/SelectionSet.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/SelectionSet.cs index 01a4d0a8b48..2ab53071b58 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/SelectionSet.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/SelectionSet.cs @@ -5,6 +5,11 @@ namespace HotChocolate.Fusion.Execution.Nodes; +/// +/// A selection set is primarily composed of field selections. +/// When needed a selection set can preserve fragments so that the execution engine +/// can branch the processing of these fragments. +/// public sealed class SelectionSet : ISelectionSet { private readonly Selection[] _selections; @@ -44,6 +49,13 @@ public SelectionSet(int id, IObjectTypeDefinition type, Selection[] selections, /// public IObjectTypeDefinition Type { get; } + /// + /// Gets the declaring operation. + /// + public Operation DeclaringOperation { get; private set; } = null!; + + IOperation ISelectionSet.DeclaringOperation => DeclaringOperation; + /// /// Gets the selections that shall be executed. /// @@ -81,13 +93,6 @@ public bool TryGetSelection(string responseName, [NotNullWhen(true)] out Selecti public bool TryGetSelection(ReadOnlySpan utf8ResponseName, [NotNullWhen(true)] out Selection? selection) => _utf8ResponseNameLookup.TryGetSelection(utf8ResponseName, out selection); - /// - /// Gets the declaring operation. - /// - public Operation DeclaringOperation { get; private set; } = null!; - - IOperation ISelectionSet.DeclaringOperation => DeclaringOperation; - internal void Seal(Operation operation) { if (_isSealed) From 95ae2c6224fe7496fbf58c9e02366dd5107776a7 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 28 Nov 2025 11:46:47 +0100 Subject: [PATCH 010/144] wip --- .../ISelection.cs | 2 +- .../DeferredWorkStateOwnerFactory.cs | 39 ------------------- .../InternalServiceCollectionExtensions.cs | 27 ------------- .../Processing/DeferredWorkStateOwner.cs | 25 ------------ .../Processing/MiddlewareContext.Selection.cs | 12 ++---- .../Processing/OperationContext.Operation.cs | 4 +- .../src/Types/Resolvers/IResolverContext.cs | 16 ++++---- .../Types/Resolvers/ISelectionCollection.cs | 6 +-- .../src/Types/Text/Json/ResultDocument.cs | 3 +- .../Core/src/Types/Text/Json/ResultElement.cs | 6 +-- .../src/Types/Text/Json/ResultProperty.cs | 4 +- 11 files changed, 25 insertions(+), 119 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/DeferredWorkStateOwnerFactory.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkStateOwner.cs diff --git a/src/HotChocolate/Core/src/Execution.Operation.Abstractions/ISelection.cs b/src/HotChocolate/Core/src/Execution.Operation.Abstractions/ISelection.cs index 40d92b1dd1e..5de00d5bd0b 100644 --- a/src/HotChocolate/Core/src/Execution.Operation.Abstractions/ISelection.cs +++ b/src/HotChocolate/Core/src/Execution.Operation.Abstractions/ISelection.cs @@ -96,7 +96,7 @@ public interface ISelection /// Gets the original syntax nodes that contributed to this selection. /// /// - /// An enumerable of field nodes from the original GraphQL document that + /// An enumerable collection of field nodes from the original GraphQL document that /// were merged to create this selection. Multiple nodes may be returned /// if field merging occurred (same response name, compatible arguments). /// diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/DeferredWorkStateOwnerFactory.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/DeferredWorkStateOwnerFactory.cs deleted file mode 100644 index 0e75c785bae..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/DeferredWorkStateOwnerFactory.cs +++ /dev/null @@ -1,39 +0,0 @@ -using HotChocolate.Execution.DependencyInjection; -using HotChocolate.Execution.Processing; -using Microsoft.Extensions.ObjectPool; - -namespace Microsoft.Extensions.DependencyInjection; - -/// -/// The deferred is injected as a scoped services and -/// preserves the instance it creates. -/// -/// This is done so that the executions running on one service scope share the deferred execution -/// state between each other. -/// -/// is disposable and will be disposed with the request scope. -/// -internal sealed class DeferredWorkStateOwnerFactory : IFactory -{ - private readonly object _sync = new(); - private readonly ObjectPool _pool; - private DeferredWorkStateOwner? _owner; - - public DeferredWorkStateOwnerFactory(ObjectPool pool) - { - _pool = pool; - } - - public DeferredWorkStateOwner Create() - { - if (_owner is null) - { - lock (_sync) - { - _owner ??= new DeferredWorkStateOwner(_pool); - } - } - - return _owner; - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs index 62551e42713..6a1afa07ec7 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs @@ -97,22 +97,6 @@ internal static IServiceCollection TryAddOperationContextPool( return services; } - internal static IServiceCollection TryAddDeferredWorkStatePool( - this IServiceCollection services) - { - services.TryAddSingleton( - sp => - { - var provider = sp.GetRequiredService(); - var policy = new DeferredWorkStatePooledObjectPolicy(); - return provider.Create(policy); - }); - - services.TryAddScoped, DeferredWorkStateOwnerFactory>(); - - return services; - } - internal static IServiceCollection TryAddTypeConverter( this IServiceCollection services) { @@ -233,15 +217,4 @@ public override bool Return(OperationContext obj) return false; } } - - private sealed class DeferredWorkStatePooledObjectPolicy : PooledObjectPolicy - { - public override DeferredWorkState Create() => new(); - - public override bool Return(DeferredWorkState obj) - { - obj.Reset(); - return true; - } - } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkStateOwner.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkStateOwner.cs deleted file mode 100644 index 4e9b95ed54d..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/DeferredWorkStateOwner.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Microsoft.Extensions.ObjectPool; - -namespace HotChocolate.Execution.Processing; - -internal sealed class DeferredWorkStateOwner : IDisposable -{ - private readonly ObjectPool _pool; - private int _disposed; - - public DeferredWorkStateOwner(ObjectPool pool) - { - _pool = pool ?? throw new ArgumentNullException(nameof(pool)); - State = pool.Get(); - } - - public DeferredWorkState State { get; } - - public void Dispose() - { - if (_disposed == 0 && Interlocked.CompareExchange(ref _disposed, 1, 0) == 0) - { - _pool.Return(State); - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs index 96099d85405..8bf018d95db 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs @@ -8,7 +8,7 @@ namespace HotChocolate.Execution.Processing; internal partial class MiddlewareContext { private readonly PureResolverContext _childContext; - private ISelection _selection = null!; + private Selection _selection = null!; public ObjectType ObjectType => _selection.DeclaringType; @@ -43,14 +43,14 @@ public bool TryCreatePureContext( public IReadOnlyList GetSelections( ObjectType typeContext, - ISelection? selection = null, + Selection? selection = null, bool allowInternals = false) { ArgumentNullException.ThrowIfNull(typeContext); selection ??= _selection; - if (selection.SelectionSet is null) + if (selection.IsLeaf) { return []; } @@ -60,14 +60,10 @@ public IReadOnlyList GetSelections( if (selectionSet.IsConditional) { var operationIncludeFlags = _operationContext.IncludeFlags; - var selectionCount = selectionSet.Selections.Count; - ref var selectionRef = ref ((SelectionSet)selectionSet).GetSelectionsReference(); var finalFields = new List(); - for (var i = 0; i < selectionCount; i++) + foreach (var childSelection in selectionSet.Selections) { - var childSelection = Unsafe.Add(ref selectionRef, i); - if (childSelection.IsIncluded(operationIncludeFlags, allowInternals)) { finalFields.Add(childSelection); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs index 0005bf324d2..8921485ebd5 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs @@ -20,7 +20,7 @@ public Schema Schema /// /// Gets the operation that is being executed. /// - public IOperation Operation + public Operation Operation { get { @@ -70,7 +70,7 @@ public object? RootValue /// The type context. /// /// - public ISelectionSet CollectFields(ISelection selection, ObjectType typeContext) + public SelectionSet CollectFields(Selection selection, ObjectType typeContext) { AssertInitialized(); return Operation.GetSelectionSet(selection, typeContext); diff --git a/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs b/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs index f3cdd188068..207af448055 100644 --- a/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs +++ b/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs @@ -26,13 +26,13 @@ public interface IResolverContext : IHasContextData, IFeatureProvider /// /// Gets the operation from the query that is being executed. /// - IOperation Operation { get; } + Operation Operation { get; } /// /// Gets the field selection for which a field resolver is /// being executed. /// - ISelection Selection { get; } + Selection Selection { get; } /// /// Gets access to the coerced variable values of the request. @@ -48,7 +48,7 @@ public interface IResolverContext : IHasContextData, IFeatureProvider /// Gets the previous (parent) resolver result. /// /// - /// The type to which the result shall be casted. + /// The type to which the result shall be cast. /// /// /// Returns the previous (parent) resolver result. @@ -62,7 +62,7 @@ public interface IResolverContext : IHasContextData, IFeatureProvider /// The argument name. /// /// - /// The type to which the argument shall be casted to. + /// The type to which the argument shall be cast to. /// /// /// Returns the value of the specified field argument as literal. @@ -76,7 +76,7 @@ public interface IResolverContext : IHasContextData, IFeatureProvider /// The argument name. /// /// - /// The type to which the argument shall be casted to. + /// The type to which the argument shall be cast to. /// /// /// Returns the value of the specified field argument as literal. @@ -90,7 +90,7 @@ public interface IResolverContext : IHasContextData, IFeatureProvider /// The argument name. /// /// - /// The type to which the argument shall be casted to. + /// The type to which the argument shall be cast to. /// /// /// Returns the value of the specified field argument as optional. @@ -182,7 +182,7 @@ public interface IResolverContext : IHasContextData, IFeatureProvider /// /// Notifies when the connection underlying this request is aborted - /// and thus request operations should be cancelled. + /// and thus request operations should be canceled. /// CancellationToken RequestAborted { get; } @@ -249,7 +249,7 @@ public interface IResolverContext : IHasContextData, IFeatureProvider /// Returns the pre-compiled selections for the /// with the specified . /// - IReadOnlyList GetSelections( + IReadOnlyList GetSelections( ObjectType typeContext, ISelection? selection = null, bool allowInternals = false); diff --git a/src/HotChocolate/Core/src/Types/Resolvers/ISelectionCollection.cs b/src/HotChocolate/Core/src/Types/Resolvers/ISelectionCollection.cs index 569871e746b..27de07f4665 100644 --- a/src/HotChocolate/Core/src/Types/Resolvers/ISelectionCollection.cs +++ b/src/HotChocolate/Core/src/Types/Resolvers/ISelectionCollection.cs @@ -1,4 +1,4 @@ -using HotChocolate.Execution.Processing; +using HotChocolate.Execution; using HotChocolate.Types; namespace HotChocolate.Resolvers; @@ -37,14 +37,14 @@ public interface ISelectionCollection : IReadOnlyList ISelectionCollection Select(ReadOnlySpan fieldNames); /// - /// Selects all selections where the typeContext is assignable from the field`s declaring type. + /// Selects all selections where the typeContext is assignable from the field's declaring type. /// /// /// The type context to select. /// /// /// Returns a containing - /// the selections where the typeContext is assignable from the field`s declaring type. + /// the selections where the typeContext is assignable from the field's declaring type. /// ISelectionCollection Select(ITypeDefinition typeContext); diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index 780e99ee305..da69ffbf89d 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -3,6 +3,7 @@ using System.Runtime.CompilerServices; using System.Text; using HotChocolate.Buffers; +using HotChocolate.Execution; using HotChocolate.Execution.Processing; using HotChocolate.Types; @@ -447,7 +448,7 @@ private ReadOnlySpan ReadLocalData(int location, int size) + "Use WriteLocalDataTo for writing to an IBufferWriter instead."); } - internal ResultElement CreateObject(Cursor parent, ISelectionSet selectionSet) + internal ResultElement CreateObject(Cursor parent, SelectionSet selectionSet) { var startObjectCursor = WriteStartObject(parent, selectionSet.Id); diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index 5b363b8bb8a..1cf8c384bb6 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -76,7 +76,7 @@ public ResultElement this[int index] /// /// Gets the operation this element belongs to. /// - public IOperation Operation + public Operation Operation { get { @@ -90,7 +90,7 @@ public IOperation Operation /// Gets the if this element represents the data of a selection set; /// otherwise, null. /// - public ISelectionSet? SelectionSet + public SelectionSet? SelectionSet { get { @@ -104,7 +104,7 @@ public ISelectionSet? SelectionSet /// Gets the if this element represents the data of a field selection; /// otherwise, null. /// - public ISelection? Selection + public Selection? Selection { get { diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultProperty.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultProperty.cs index 695bc20aa08..b76011d25ca 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultProperty.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultProperty.cs @@ -26,9 +26,9 @@ internal ResultProperty(ResultElement value) /// public string Name => Value.GetPropertyName(); - public ISelection? Selection => Value.Selection; + public Selection? Selection => Value.Selection; - public ISelection AssertSelection() => Value.AssertSelection(); + public Selection AssertSelection() => Value.AssertSelection(); /// /// Compares to the name of this property. From 4630aba9d17fb97b47ff55615f08fa33566c8c8b Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 28 Nov 2025 14:07:12 +0100 Subject: [PATCH 011/144] wip --- ...fsetPaginationResolverContextExtensions.cs | 15 ++- .../Processing/MiddlewareContext.Arguments.cs | 26 ++--- .../Processing/MiddlewareContext.Global.cs | 24 +++-- .../Processing/MiddlewareContext.Pooling.cs | 2 +- .../Processing/MiddlewareContext.Pure.cs | 36 ++++--- .../Processing/MiddlewareContext.Selection.cs | 27 +----- .../OperationCompiler.CompileResolver.cs | 97 +++++++++++++++++++ .../Execution/Processing/OperationCompiler.cs | 15 ++- .../Processing/OperationContext.Execution.cs | 13 --- .../Types/Execution/Processing/Selection.cs | 5 +- .../_OperationCompiler.ArgumentValues.cs | 2 +- ... => _OperationCompiler.CompilerContext.cs} | 0 .../Core/src/Types/HotChocolate.Types.csproj | 28 ++++++ .../src/Types/Resolvers/IMiddlewareContext.cs | 2 +- .../src/Types/Resolvers/IResolverContext.cs | 4 +- .../Types/Resolvers/SelectionEnumerator.cs | 77 +++++++++++++++ .../Core/src/Types/Text/Json/ResultElement.cs | 4 +- .../src/Types/Text/Json/ResultProperty.cs | 2 +- .../src/Types/Types/Relay/NodeTypeFeature.cs | 6 +- 19 files changed, 295 insertions(+), 90 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs rename src/HotChocolate/Core/src/Types/Execution/Processing/{OperationCompiler.CompilerContext.cs => _OperationCompiler.CompilerContext.cs} (100%) create mode 100644 src/HotChocolate/Core/src/Types/Resolvers/SelectionEnumerator.cs diff --git a/src/HotChocolate/Core/src/Types.OffsetPagination/Extensions/OffsetPaginationResolverContextExtensions.cs b/src/HotChocolate/Core/src/Types.OffsetPagination/Extensions/OffsetPaginationResolverContextExtensions.cs index e29fbba5915..63f5829a6a9 100644 --- a/src/HotChocolate/Core/src/Types.OffsetPagination/Extensions/OffsetPaginationResolverContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types.OffsetPagination/Extensions/OffsetPaginationResolverContextExtensions.cs @@ -6,10 +6,11 @@ namespace HotChocolate.Types.Pagination; internal static class OffsetPaginationResolverContextExtensions { /// + /// /// TotalCount is one of the heaviest operations. It is only necessary to load totalCount /// when it is enabled (IncludeTotalCount) and when it is contained in the selection set. - /// - /// This method checks if the total count is selected + /// + /// This method checks if the total count is selected /// /// /// @@ -17,10 +18,14 @@ public static bool IsTotalCountSelected(this IResolverContext context) { // TotalCount is one of the heaviest operations. It is only necessary to load totalCount // when it is enabled (IncludeTotalCount) and when it is contained in the selection set. - if (context.Selection.Type is ObjectType objectType - && context.Selection.SyntaxNode.SelectionSet is not null) + if (context.Selection is { Type: ObjectType objectType, IsLeaf: false }) { - var selections = context.GetSelections(objectType, null, true); + var selectionSet = context.Selection.DeclaringOperation.GetSelectionSet(context.Selection, objectType); + + foreach (var selection in selectionSet.Selections) + { )) + + } for (var i = 0; i < selections.Count; i++) { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs index 92e99932d2b..e69ab937ba7 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs @@ -17,7 +17,7 @@ public T ArgumentValue(string name) if (!Arguments.TryGetValue(name, out var argument)) { - throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNode, Path, name); + throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNodes[0].Node, Path, name); } try @@ -40,7 +40,7 @@ public Optional ArgumentOptional(string name) if (!Arguments.TryGetValue(name, out var argument)) { - throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNode, Path, name); + throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNodes[0].Node, Path, name); } return argument.IsDefaultValue @@ -54,7 +54,7 @@ public TValueNode ArgumentLiteral(string name) where TValueNode : IV if (!Arguments.TryGetValue(name, out var argument)) { - throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNode, Path, name); + throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNodes[0].Node, Path, name); } var literal = argument.ValueLiteral!; @@ -65,7 +65,11 @@ public TValueNode ArgumentLiteral(string name) where TValueNode : IV } throw ResolverContext_LiteralNotCompatible( - _selection.SyntaxNode, Path, name, typeof(TValueNode), literal.GetType()); + _selection.SyntaxNodes[0].Node, + Path, + name, + typeof(TValueNode), + literal.GetType()); } public ValueKind ArgumentKind(string name) @@ -74,10 +78,10 @@ public ValueKind ArgumentKind(string name) if (!Arguments.TryGetValue(name, out var argument)) { - throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNode, Path, name); + throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNodes[0].Node, Path, name); } - // There can only be no kind if there was an error which would have + // There can only be no kind of there was an error which would have // already been raised at this point. return argument.Kind ?? ValueKind.Unknown; } @@ -114,7 +118,7 @@ private T CoerceArgumentValue(ArgumentValue argument) if (typeof(IValueNode).IsAssignableFrom(typeof(T))) { throw ResolverContext_LiteralsNotSupported( - _selection.SyntaxNode, + _selection.SyntaxNodes[0].Node, Path, argument.Name, typeof(T)); @@ -122,7 +126,7 @@ private T CoerceArgumentValue(ArgumentValue argument) // we are unable to convert the argument to the request type. throw ResolverContext_CannotConvertArgument( - _selection.SyntaxNode, + _selection.SyntaxNodes[0].Node, Path, argument.Name, typeof(T), @@ -173,16 +177,14 @@ public ArgumentValue ReplaceArgument(string argumentName, ArgumentValue newArgum Arguments = mutableArguments; } - if (!mutableArguments.TryGetValue(argumentName, out var argumentValue)) + // we remove the original argument name ... + if (!mutableArguments.Remove(argumentName, out var argumentValue)) { throw new ArgumentException( string.Format(MiddlewareContext_ReplaceArgument_InvalidKey, argumentName), nameof(argumentName)); } - // we remove the original argument name ... - mutableArguments.Remove(argumentName); - // and allow the argument to be replaces with a new argument that could also have // a new name. mutableArguments.Add(newArgumentValue.Name, newArgumentValue); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs index 4b665e1c6fe..9211f4d4c0e 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs @@ -2,7 +2,6 @@ using HotChocolate.Language; using HotChocolate.Resolvers; using HotChocolate.Types; -using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Execution.Processing; @@ -26,7 +25,7 @@ public IServiceProvider Services public Schema Schema => _operationContext.Schema; - public IOperation Operation => _operationContext.Operation; + public Operation Operation => _operationContext.Operation; public IOperationResultBuilder OperationResult => _operationResultBuilder; @@ -48,7 +47,7 @@ public void ReportError(string errorMessage) ErrorBuilder.New() .SetMessage(errorMessage) .SetPath(Path) - .AddLocation(_selection.SyntaxNode) + .AddLocations(_selection) .Build()); } @@ -75,7 +74,7 @@ public void ReportError(Exception exception, Action? configure = n var errorBuilder = ErrorBuilder .FromException(exception) .SetPath(Path) - .AddLocation(_selection.SyntaxNode); + .AddLocations(_selection); configure?.Invoke(errorBuilder); @@ -108,14 +107,14 @@ void ReportSingle(IError singleError) { foreach (var ie in ar.Errors) { - var errorWithPath = EnsurePathAndLocation(ie, _selection.SyntaxNode, Path); + var errorWithPath = EnsurePathAndLocation(ie, _selection.SyntaxNodes[0].Node, Path); _operationContext.Result.AddError(errorWithPath, _selection); diagnosticEvents.ResolverError(this, errorWithPath); } } else { - var errorWithPath = EnsurePathAndLocation(handled, _selection.SyntaxNode, Path); + var errorWithPath = EnsurePathAndLocation(handled, _selection.SyntaxNodes[0].Node, Path); _operationContext.Result.AddError(errorWithPath, _selection); diagnosticEvents.ResolverError(this, errorWithPath); } @@ -290,3 +289,16 @@ c is null s))); } } + +file static class Extensions +{ + public static ErrorBuilder AddLocations(this ErrorBuilder errorBuilder, Selection selection) + { + foreach (var (node, _) in selection.SyntaxNodes) + { + errorBuilder.AddLocation(node); + } + + return errorBuilder; + } +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs index 6f29541152f..73d88af6347 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs @@ -18,7 +18,7 @@ public MiddlewareContext() public void Initialize( OperationContext operationContext, - ISelection selection, + Selection selection, ObjectResult parentResult, int responseIndex, object? parent, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs index c8e21be1f27..20c1d467e6f 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs @@ -5,7 +5,6 @@ using HotChocolate.Resolvers; using HotChocolate.Types; using HotChocolate.Utilities; -using Microsoft.Extensions.DependencyInjection; using static HotChocolate.Execution.ThrowHelper; namespace HotChocolate.Execution.Processing; @@ -16,13 +15,13 @@ private sealed class PureResolverContext(MiddlewareContext parentContext) : IRes { private ITypeConverter? _typeConverter; private IReadOnlyDictionary _argumentValues = null!; - private ISelection _selection = null!; + private Selection _selection = null!; private ObjectType _parentType = null!; private ObjectResult _parentResult = null!; private object? _parent; public bool Initialize( - ISelection selection, + Selection selection, ObjectType parentType, ObjectResult parentResult, object? parent) @@ -60,9 +59,9 @@ public void Clear() public ObjectType ObjectType => _parentType; - public IOperation Operation => parentContext.Operation; + public Operation Operation => parentContext.Operation; - public ISelection Selection => _selection; + public Selection Selection => _selection; public Path Path => PathHelper.CreatePathFromContext(_selection, _parentResult, -1); @@ -77,9 +76,9 @@ public void ReportError(IError error) public void ReportError(Exception exception, Action? configure = null) => throw new NotSupportedException(); - public IReadOnlyList GetSelections( + public SelectionEnumerator GetSelections( ObjectType typeContext, - ISelection? selection = null, + Selection? selection = null, bool allowInternals = false) => throw new NotSupportedException(); @@ -135,7 +134,7 @@ public T ArgumentValue(string name) if (!_argumentValues.TryGetValue(name, out var argument)) { - throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNode, Path, name); + throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNodes[0].Node, Path, name); } return CoerceArgumentValue(argument); @@ -148,7 +147,7 @@ public TValueNode ArgumentLiteral(string name) if (!_argumentValues.TryGetValue(name, out var argument)) { - throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNode, Path, name); + throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNodes[0].Node, Path, name); } var literal = argument.ValueLiteral!; @@ -159,7 +158,11 @@ public TValueNode ArgumentLiteral(string name) } throw ResolverContext_LiteralNotCompatible( - _selection.SyntaxNode, Path, name, typeof(TValueNode), literal.GetType()); + _selection.SyntaxNodes[0].Node, + Path, + name, + typeof(TValueNode), + literal.GetType()); } public Optional ArgumentOptional(string name) @@ -168,7 +171,7 @@ public Optional ArgumentOptional(string name) if (!_argumentValues.TryGetValue(name, out var argument)) { - throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNode, Path, name); + throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNodes[0].Node, Path, name); } return argument.IsDefaultValue @@ -180,10 +183,10 @@ public ValueKind ArgumentKind(string name) { if (!_argumentValues.TryGetValue(name, out var argument)) { - throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNode, Path, name); + throw ResolverContext_ArgumentDoesNotExist(_selection.SyntaxNodes[0].Node, Path, name); } - // There can only be no kind if there was an error which would have + // There can only be no kind of there was an error which would have // already been raised at this point. return argument.Kind ?? ValueKind.Unknown; } @@ -243,7 +246,10 @@ private T CoerceArgumentValue(ArgumentValue argument) if (typeof(IValueNode).IsAssignableFrom(typeof(T))) { throw ResolverContext_LiteralsNotSupported( - _selection.SyntaxNode, Path, argument.Name, typeof(T)); + _selection.SyntaxNodes[0].Node, + Path, + argument.Name, + typeof(T)); } // If the object is internally held as a dictionary structure we will try to @@ -270,7 +276,7 @@ private T CoerceArgumentValue(ArgumentValue argument) // we are unable to convert the argument to the request type. throw ResolverContext_CannotConvertArgument( - _selection.SyntaxNode, + _selection.SyntaxNodes[0].Node, Path, argument.Name, typeof(T), diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs index 8bf018d95db..660e99ded09 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs @@ -14,7 +14,7 @@ internal partial class MiddlewareContext public ObjectField Field => _selection.Field; - public ISelection Selection => _selection; + public Selection Selection => _selection; public string ResponseName => _selection.ResponseName; @@ -25,7 +25,7 @@ internal partial class MiddlewareContext public PureFieldDelegate? PureResolver => _selection.PureResolver; public bool TryCreatePureContext( - ISelection selection, + Selection selection, ObjectType parentType, ObjectResult parentResult, object? parent, @@ -41,7 +41,7 @@ public bool TryCreatePureContext( return false; } - public IReadOnlyList GetSelections( + public SelectionEnumerator GetSelections( ObjectType typeContext, Selection? selection = null, bool allowInternals = false) @@ -52,28 +52,11 @@ public IReadOnlyList GetSelections( if (selection.IsLeaf) { - return []; + return default; } var selectionSet = _operationContext.CollectFields(selection, typeContext); - - if (selectionSet.IsConditional) - { - var operationIncludeFlags = _operationContext.IncludeFlags; - var finalFields = new List(); - - foreach (var childSelection in selectionSet.Selections) - { - if (childSelection.IsIncluded(operationIncludeFlags, allowInternals)) - { - finalFields.Add(childSelection); - } - } - - return finalFields; - } - - return selectionSet.Selections; + return new SelectionEnumerator(selectionSet, _operationContext.IncludeFlags); } public ISelectionCollection Select() diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs new file mode 100644 index 00000000000..d5b73c6b40a --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs @@ -0,0 +1,97 @@ +using HotChocolate.Language; +using HotChocolate.Resolvers; +using HotChocolate.Types; + +namespace HotChocolate.Execution.Processing; + +internal sealed partial class OperationCompiler2 +{ + internal static FieldDelegate CreateFieldPipeline(Schema schema, ObjectField field, FieldNode selection) + { + var pipeline = field.Middleware; + + if (selection.Directives.Count == 0) + { + return pipeline; + } + + var pipelineComponents = new List(); + + // if we have selection directives we will inspect them and try to build a + // pipeline from them if they have middleware components. + BuildDirectivePipeline(schema, selection, pipelineComponents); + + // if we found middleware components on the selection directives we will build a new + // pipeline. + if (pipelineComponents.Count > 0) + { + var next = pipeline; + + for (var i = pipelineComponents.Count - 1; i >= 0; i--) + { + next = pipelineComponents[i](next); + } + + pipeline = next; + } + + return pipeline; + } + + private static PureFieldDelegate? TryCreatePureField( + Schema schema, + ObjectField field, + FieldNode selection) + { + if (field.PureResolver is not null && selection.Directives.Count == 0) + { + return field.PureResolver; + } + + for (var i = 0; i < selection.Directives.Count; i++) + { + if (schema.DirectiveTypes.TryGetDirective(selection.Directives[i].Name.Value, out var type) + && type.Middleware is not null) + { + return null; + } + } + + return field.PureResolver; + } + + // TODO : this needs a rewrite, we need to discuss how we handle field merging with directives + private static void BuildDirectivePipeline( + Schema schema, + FieldNode selection, + List pipelineComponents) + { + for (var i = 0; i < selection.Directives.Count; i++) + { + var directiveNode = selection.Directives[i]; + if (schema.DirectiveTypes.TryGetDirective(directiveNode.Name.Value, out var directiveType) + && directiveType.Middleware is not null) + { + Directive directive; + try + { + directive = new Directive( + directiveType, + directiveNode, + directiveType.Parse(directiveNode)); + } + catch (SerializationException ex) + { + throw new SerializationException( + ErrorBuilder.FromError(ex.Errors[0]) + .TryAddLocation(directiveNode) + .Build(), + ex.Type); + } + + var directiveMiddleware = directiveType.Middleware; + pipelineComponents.Add(next => directiveMiddleware(next, directive)); + } + } + } +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 0984e29625a..211d81d9e7d 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -241,6 +241,14 @@ private SelectionSet BuildSelectionSet( } var field = typeContext.Fields[first.Node.Name.Value]; + var fieldDelegate = CreateFieldPipeline(_schema, field, first.Node); + var pureFieldDelegate = TryCreatePureField(_schema, field, first.Node); + var arguments = ArgumentMap.Empty; + + if (first.Node.Arguments.Count > 0) + { + arguments = CoerceArgumentValues(field, first.Node); + } var selection = new Selection( ++lastId, @@ -248,7 +256,10 @@ private SelectionSet BuildSelectionSet( field, nodes.ToArray(), includeFlags.ToArray(), - isInternal); + isInternal, + arguments, + fieldDelegate, + pureFieldDelegate); // Register the selection in the elements array compilationContext.Register(selection, selection.Id); @@ -435,7 +446,7 @@ public void Register(object element, int id) /// /// The flags that must be all set for this selection to be included. /// -internal sealed record FieldSelectionNode(FieldNode Node, ulong PathIncludeFlags); +public sealed record FieldSelectionNode(FieldNode Node, ulong PathIncludeFlags); internal class IncludeConditionCollection : ICollection { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs index 862fb41a59a..6e74fb6e5ea 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs @@ -21,19 +21,6 @@ internal set } } - /// - /// Gets the backlog of the task that shall be processed after - /// all the main tasks have been executed. - /// - public DeferredWorkScheduler DeferredScheduler - { - get - { - AssertInitialized(); - return _deferredWorkScheduler; - } - } - /// /// The result helper which provides utilities to build up the result. /// diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index 26be9ca9c7f..1d44a51e445 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -28,7 +28,6 @@ internal Selection( ulong[] includeFlags, bool isInternal, ArgumentMap? arguments = null, - bool isParallelExecutable = true, FieldDelegate? resolverPipeline = null, PureFieldDelegate? pureResolver = null) { @@ -48,7 +47,7 @@ internal Selection( ResolverPipeline = resolverPipeline; PureResolver = pureResolver; Strategy = InferStrategy( - isSerial: !isParallelExecutable, + isSerial: !field.IsParallelExecutable, hasPureResolver: pureResolver is not null); _syntaxNodes = syntaxNodes; _includeFlags = includeFlags; @@ -106,7 +105,7 @@ internal Selection( public PureFieldDelegate? PureResolver { get; private set; } - internal ReadOnlySpan SyntaxNodes => _syntaxNodes; + public ReadOnlySpan SyntaxNodes => _syntaxNodes; IEnumerable ISelection.GetSyntaxNodes() { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.ArgumentValues.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.ArgumentValues.cs index c867fbb89d8..b614190999a 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.ArgumentValues.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.ArgumentValues.cs @@ -149,7 +149,7 @@ internal static FieldDelegate CreateFieldPipeline( pipeline = next; } - // at last we clear the rented lists + // at last, we clear the rented lists processed.Clear(); pipelineComponents.Clear(); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompilerContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.CompilerContext.cs similarity index 100% rename from src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompilerContext.cs rename to src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.CompilerContext.cs diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index 2729033aa3b..08a474f7f21 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -143,6 +143,34 @@ True TextJsonResources.resx + + + MiddlewareContext.Global.cs + + + + MiddlewareContext.Global.cs + + + + MiddlewareContext.Global.cs + + + + MiddlewareContext.Global.cs + + + + MiddlewareContext.Global.cs + + + + OperationCompiler.cs + + + + OperationCompiler.cs + diff --git a/src/HotChocolate/Core/src/Types/Resolvers/IMiddlewareContext.cs b/src/HotChocolate/Core/src/Types/Resolvers/IMiddlewareContext.cs index 0c79f8c852f..3ad1043b3b4 100644 --- a/src/HotChocolate/Core/src/Types/Resolvers/IMiddlewareContext.cs +++ b/src/HotChocolate/Core/src/Types/Resolvers/IMiddlewareContext.cs @@ -33,7 +33,7 @@ public interface IMiddlewareContext : IResolverContext /// Executes the field resolver and returns its result. /// /// - /// The type to which the result shall be casted. + /// The type to which the result shall be cast. /// /// /// Returns the resolved field value. diff --git a/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs b/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs index 207af448055..5eef2e5429d 100644 --- a/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs +++ b/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs @@ -249,9 +249,9 @@ public interface IResolverContext : IHasContextData, IFeatureProvider /// Returns the pre-compiled selections for the /// with the specified . /// - IReadOnlyList GetSelections( + SelectionEnumerator GetSelections( ObjectType typeContext, - ISelection? selection = null, + Selection? selection = null, bool allowInternals = false); /// diff --git a/src/HotChocolate/Core/src/Types/Resolvers/SelectionEnumerator.cs b/src/HotChocolate/Core/src/Types/Resolvers/SelectionEnumerator.cs new file mode 100644 index 00000000000..aed4577252b --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Resolvers/SelectionEnumerator.cs @@ -0,0 +1,77 @@ +using System.Collections; +using HotChocolate.Execution.Processing; + +namespace HotChocolate.Resolvers; + +/// +/// An SelectionSet enumerator. +/// +public struct SelectionEnumerator : IEnumerable, IEnumerator +{ + private readonly SelectionSet _selectionSet; + private readonly ulong _includeFlags; + private int _position = -1; + + internal SelectionEnumerator(SelectionSet selectionSet, ulong includeFlags) + { + _selectionSet = selectionSet; + _includeFlags = includeFlags; + Current = null!; + } + + /// + /// The currently selected selection. + /// + public Selection Current { get; private set; } + + object? IEnumerator.Current => Current; + + /// + /// Moves to the next visible selection. + /// + /// + /// true if there is another visible selection. + /// + public bool MoveNext() + { + if (_selectionSet is null) + { + return false; + } + + var length = _selectionSet.Selections.Length; + + while (_position < length) + { + _position++; + + if (_position >= length) + { + break; + } + + var selection = _selectionSet.Selections[_position]; + if (selection.IsIncluded(_includeFlags)) + { + Current = selection; + return true; + } + } + + Current = null!; + return false; + } + + public void Reset() + { + _position = -1; + } + + public SelectionEnumerator GetEnumerator() => this; + + IEnumerator IEnumerable.GetEnumerator() => this; + + IEnumerator IEnumerable.GetEnumerator() => this; + + public void Dispose() { } +} diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index 1cf8c384bb6..de454de6cd1 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -247,7 +247,7 @@ public bool IsInternal /// /// This element does not represent the data of a selection set. /// - public ISelectionSet AssertSelectionSet() + public SelectionSet AssertSelectionSet() { var selectionSet = SelectionSet; @@ -268,7 +268,7 @@ public ISelectionSet AssertSelectionSet() /// /// This element does not represent the data of a field selection. /// - public ISelection AssertSelection() + public Selection AssertSelection() { var selection = Selection; diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultProperty.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultProperty.cs index b76011d25ca..06e15a446d4 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultProperty.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultProperty.cs @@ -115,7 +115,7 @@ public override string ToString() private string DebuggerDisplay => Value.ValueKind == JsonValueKind.Undefined ? "" : $"\"{ToString()}\""; - public void Deconstruct(out ISelection selection, out ResultElement value) + public void Deconstruct(out Selection selection, out ResultElement value) { selection = AssertSelection(); value = Value; diff --git a/src/HotChocolate/Core/src/Types/Types/Relay/NodeTypeFeature.cs b/src/HotChocolate/Core/src/Types/Types/Relay/NodeTypeFeature.cs index 9106c0b2bfe..d1616dd5694 100644 --- a/src/HotChocolate/Core/src/Types/Types/Relay/NodeTypeFeature.cs +++ b/src/HotChocolate/Core/src/Types/Types/Relay/NodeTypeFeature.cs @@ -4,11 +4,9 @@ namespace HotChocolate.Types.Relay; internal sealed class NodeTypeFeature : ISealable { - private NodeResolverInfo? _nodeResolver; - public NodeResolverInfo? NodeResolver { - get => _nodeResolver; + get; set { if (IsReadOnly) @@ -17,7 +15,7 @@ public NodeResolverInfo? NodeResolver "The node resolver cannot be set after the feature is sealed."); } - _nodeResolver = value; + field = value; } } From fe8a8e63a4c0ed6c2b6c4347cc294a659b69b297 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Mon, 1 Dec 2025 09:16:15 +0100 Subject: [PATCH 012/144] wip --- .../Internal/ArgumentCoercionHelper.cs | 4 +- .../Internal/FieldMapPooledObjectPolicy.cs | 21 + .../Pipeline/OperationResolverMiddleware.cs | 89 +- .../Types/Execution/Processing/ArgumentMap.cs | 2 +- .../Types/Execution/Processing/Operation.cs | 4 +- .../OperationCompiler.BacklogItem.cs | 25 - .../OperationCompiler.CoerceArgumentValues.cs | 2 +- .../OperationCompiler.CompileResolver.cs | 2 +- .../OperationCompiler.Optimizers.cs | 62 -- .../OperationCompiler.SelectionSetInfo.cs | 15 - .../Execution/Processing/OperationCompiler.cs | 4 +- .../Processing/OperationCompilerOptimizers.cs | 54 +- .../Processing/OperationCompilerPool.cs | 31 - .../Processing/OperationContext.Pooling.cs | 12 +- .../_OperationCompiler.ArgumentValues.cs | 217 ----- .../_OperationCompiler.CompilerContext.cs | 46 - .../Processing/_OperationCompiler.cs | 787 ------------------ .../Types/Execution/RequestExecutorManager.cs | 16 + .../ObjectPoolProviderExtensions.cs | 15 + .../Extensions/ResolverContextExtensions.cs | 12 +- .../Core/src/Types/HotChocolate.Types.csproj | 24 + .../Pipeline/OperationPlanMiddleware.cs | 2 +- 22 files changed, 120 insertions(+), 1326 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Execution/Internal/FieldMapPooledObjectPolicy.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.BacklogItem.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.Optimizers.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.SelectionSetInfo.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerPool.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.ArgumentValues.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.CompilerContext.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.cs create mode 100644 src/HotChocolate/Core/src/Types/Extensions/ObjectPoolProviderExtensions.cs diff --git a/src/HotChocolate/Core/src/Types/Execution/Internal/ArgumentCoercionHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Internal/ArgumentCoercionHelper.cs index d1ee668a617..17ff11f9ac3 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Internal/ArgumentCoercionHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Internal/ArgumentCoercionHelper.cs @@ -41,7 +41,7 @@ public static bool TryCoerceArguments( // signal that this resolver task has errors and shall end. if (arguments.HasErrors) { - foreach (var argument in arguments) + foreach (var argument in arguments.ArgumentValues) { if (argument.HasError) { @@ -73,7 +73,7 @@ internal static void CoerceArguments( { // if there are arguments that have variables and need variable replacement we will // rewrite the arguments that need variable replacement. - foreach (var argument in arguments) + foreach (var argument in arguments.ArgumentValues) { if (argument.IsFullyCoerced) { diff --git a/src/HotChocolate/Core/src/Types/Execution/Internal/FieldMapPooledObjectPolicy.cs b/src/HotChocolate/Core/src/Types/Execution/Internal/FieldMapPooledObjectPolicy.cs new file mode 100644 index 00000000000..aca098df582 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Internal/FieldMapPooledObjectPolicy.cs @@ -0,0 +1,21 @@ +using HotChocolate.Execution.Processing; +using Microsoft.Extensions.ObjectPool; + +namespace HotChocolate.Execution; + +internal sealed class FieldMapPooledObjectPolicy + : DefaultPooledObjectPolicy>> +{ + public override OrderedDictionary> Create() => new(StringComparer.Ordinal); + + public override bool Return(OrderedDictionary> obj) + { + if (obj.Count > 256) + { + return false; + } + + obj.Clear(); + return base.Return(obj); + } +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs index 730872b3e4f..9c85a312c1d 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs @@ -1,10 +1,6 @@ -using System.Runtime.CompilerServices; using HotChocolate.Execution.Instrumentation; using HotChocolate.Execution.Processing; -using HotChocolate.Language; -using HotChocolate.Types; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.ObjectPool; +using HotChocolate.Fusion.Rewriters; using static HotChocolate.Execution.ErrorHelper; namespace HotChocolate.Execution.Pipeline; @@ -12,24 +8,24 @@ namespace HotChocolate.Execution.Pipeline; internal sealed class OperationResolverMiddleware { private readonly RequestDelegate _next; - private readonly ObjectPool _operationCompilerPool; - private readonly OperationCompilerOptimizers _operationCompilerOptimizers; + private readonly OperationCompiler _operationPlanner; + private readonly DocumentRewriter _documentRewriter; private readonly IExecutionDiagnosticEvents _diagnosticEvents; private OperationResolverMiddleware( RequestDelegate next, - ObjectPool operationCompilerPool, - OperationCompilerOptimizers operationCompilerOptimizer, + ISchemaDefinition schema, + OperationCompiler operationPlanner, IExecutionDiagnosticEvents diagnosticEvents) { ArgumentNullException.ThrowIfNull(next); - ArgumentNullException.ThrowIfNull(operationCompilerPool); - ArgumentNullException.ThrowIfNull(operationCompilerOptimizer); + ArgumentNullException.ThrowIfNull(schema); + ArgumentNullException.ThrowIfNull(operationPlanner); ArgumentNullException.ThrowIfNull(diagnosticEvents); _next = next; - _operationCompilerPool = operationCompilerPool; - _operationCompilerOptimizers = operationCompilerOptimizer; + _operationPlanner = operationPlanner; + _documentRewriter = new DocumentRewriter(schema, removeStaticallyExcludedSelections: true); _diagnosticEvents = diagnosticEvents; } @@ -46,21 +42,17 @@ public async ValueTask InvokeAsync(RequestContext context) { using (_diagnosticEvents.CompileOperation(context)) { - var operationDef = documentInfo.Document.GetOperation(context.Request.OperationName); - var operationType = ResolveOperationType(operationDef.Operation, Unsafe.As(context.Schema)); - - if (operationType is null) - { - context.Result = RootTypeNotFound(operationDef.Operation); - return; - } - - operation = CompileOperation( - documentInfo.Document, - operationDef, - operationType, + // Before we can plan an operation, we must de-fragmentize it and remove static include conditions. + var operationDocument = documentInfo.Document; + var operationName = context.Request.OperationName; + operationDocument = _documentRewriter.RewriteDocument(operationDocument, operationName); + var operationNode = operationDocument.GetOperation(operationName); + + // After optimizing the query structure we can begin the planning process. + operation = _operationPlanner.Compile( operationId ?? Guid.NewGuid().ToString("N"), - context.Schema); + documentInfo.Hash.Value, + operationNode); context.SetOperation(operation); } @@ -72,51 +64,18 @@ public async ValueTask InvokeAsync(RequestContext context) context.Result = StateInvalidForOperationResolver(); } - private IOperation CompileOperation( - DocumentNode document, - OperationDefinitionNode operationDefinition, - ObjectType operationType, - string operationId, - ISchemaDefinition schema) - { - var request = new OperationCompilerRequest( - operationId, - document, - operationDefinition, - operationType, - schema, - _operationCompilerOptimizers.OperationOptimizers, - _operationCompilerOptimizers.SelectionSetOptimizers); - - var compiler = _operationCompilerPool.Get(); - var operation = compiler.Compile(request); - _operationCompilerPool.Return(compiler); - - return operation; - } - - private static ObjectType? ResolveOperationType( - OperationType operationType, - Schema schema) - => operationType switch - { - OperationType.Query => schema.QueryType, - OperationType.Mutation => schema.MutationType, - OperationType.Subscription => schema.SubscriptionType, - _ => throw ThrowHelper.RootTypeNotSupported(operationType) - }; - public static RequestMiddlewareConfiguration Create() => new RequestMiddlewareConfiguration( (core, next) => { - var operationCompilerPool = core.Services.GetRequiredService>(); - var optimizers = core.SchemaServices.GetRequiredService(); + var schema = core.Schema; + var operationCompiler = core.Services.GetRequiredService(); var diagnosticEvents = core.SchemaServices.GetRequiredService(); + var middleware = new OperationResolverMiddleware( next, - operationCompilerPool, - optimizers, + schema, + operationCompiler, diagnosticEvents); return context => middleware.InvokeAsync(context); }, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ArgumentMap.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ArgumentMap.cs index 354e3bdfd73..118c9dbd800 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ArgumentMap.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ArgumentMap.cs @@ -99,7 +99,7 @@ IEnumerable IReadOnlyDictionary.Keys /// /// An of instances. /// - public ImmutableArray Values => _arguments.Values; + public ImmutableArray ArgumentValues => _arguments.Values; IEnumerable IReadOnlyDictionary.Values => _arguments.Values; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs index 72c8ed60f88..216d6fd00cd 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs @@ -19,7 +19,7 @@ public sealed class Operation : IOperation #endif private readonly ConcurrentDictionary<(int, string), SelectionSet> _selectionSets = []; - private readonly OperationCompiler2 _compiler; + private readonly OperationCompiler _compiler; private readonly IncludeConditionCollection _includeConditions; private readonly OperationFeatureCollection _features; private readonly bool _isFinal; @@ -33,7 +33,7 @@ internal Operation( ObjectType rootType, Schema schema, SelectionSet rootSelectionSet, - OperationCompiler2 compiler, + OperationCompiler compiler, IncludeConditionCollection includeConditions, int lastId, object[] elementsById, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.BacklogItem.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.BacklogItem.cs deleted file mode 100644 index 3345a16fd42..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.BacklogItem.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Immutable; -using HotChocolate.Types; - -namespace HotChocolate.Execution.Processing; - -public sealed partial class OperationCompiler -{ - private readonly struct BacklogItem( - ObjectType type, - int selectionSetId, - Selection selection, - SelectionPath path, - ImmutableArray optimizers) - { - public ObjectType Type { get; } = type; - - public int SelectionSetId { get; } = selectionSetId; - - public Selection Selection { get; } = selection; - - public SelectionPath Path { get; } = path; - - public ImmutableArray Optimizers { get; } = optimizers; - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs index 8f6068bbf80..f601fa279a6 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs @@ -10,7 +10,7 @@ namespace HotChocolate.Execution.Processing; -internal sealed partial class OperationCompiler2 +internal sealed partial class OperationCompiler { private ArgumentMap? CoerceArgumentValues( ObjectField field, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs index d5b73c6b40a..372d52fd5b7 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs @@ -4,7 +4,7 @@ namespace HotChocolate.Execution.Processing; -internal sealed partial class OperationCompiler2 +internal sealed partial class OperationCompiler { internal static FieldDelegate CreateFieldPipeline(Schema schema, ObjectField field, FieldNode selection) { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.Optimizers.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.Optimizers.cs deleted file mode 100644 index 50b9d9e2ecf..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.Optimizers.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.Collections.Immutable; -using HotChocolate.Types; -using static HotChocolate.Execution.Processing.OperationCompilerOptimizerHelper; - -namespace HotChocolate.Execution.Processing; - -public partial class OperationCompiler -{ - private void OptimizeSelectionSet(CompilerContext context) - { - if (context.Optimizers.Length == 0) - { - return; - } - - var optimizerContext = - new SelectionSetOptimizerContext( - this, - context, - _selectionLookup, - _contextData, - _createFieldPipeline, - context.Path); - - if (context.Optimizers.Length == 1) - { - context.Optimizers[0].OptimizeSelectionSet(optimizerContext); - } - else - { - for (var i = 0; i < context.Optimizers.Length; i++) - { - context.Optimizers[i].OptimizeSelectionSet(optimizerContext); - } - } - } - - private static ImmutableArray ResolveOptimizers( - ImmutableArray optimizers, - ObjectField field) - { - if (!TryGetOptimizers(field, out var fieldOptimizers)) - { - return optimizers; - } - - if (optimizers.IsEmpty) - { - return fieldOptimizers; - } - - foreach (var optimizer in fieldOptimizers) - { - if (!optimizers.Contains(optimizer)) - { - optimizers = optimizers.Add(optimizer); - } - } - - return optimizers; - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.SelectionSetInfo.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.SelectionSetInfo.cs deleted file mode 100644 index 7c46db01ff7..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.SelectionSetInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Execution.Processing; - -public sealed partial class OperationCompiler -{ - internal readonly struct SelectionSetInfo( - SelectionSetNode selectionSet, - ulong includeCondition) - { - public SelectionSetNode SelectionSet { get; } = selectionSet; - - public ulong IncludeCondition { get; } = includeCondition; - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 211d81d9e7d..33caee22385 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -9,7 +9,7 @@ namespace HotChocolate.Execution.Processing; -internal sealed partial class OperationCompiler2 +internal sealed partial class OperationCompiler { private readonly Schema _schema; private readonly ObjectPool>> _fieldsPool; @@ -17,7 +17,7 @@ internal sealed partial class OperationCompiler2 private readonly InputParser _inputValueParser; private static readonly ArrayPool s_objectArrayPool = ArrayPool.Shared; - public OperationCompiler2( + public OperationCompiler( Schema schema, InputParser inputValueParser, ObjectPool>> fieldsPool) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizers.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizers.cs index 726018644dd..e60919fe435 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizers.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizers.cs @@ -4,6 +4,7 @@ namespace HotChocolate.Execution.Processing; +// TODO : We might remove this internal sealed class OperationCompilerOptimizers { private ImmutableArray _operationOptimizers; @@ -49,56 +50,3 @@ private enum PropertyInitFlags SelectionSetOptimizers = 2 } } - -public readonly struct OperationCompilerRequest -{ - public OperationCompilerRequest( - string id, - DocumentNode document, - OperationDefinitionNode definition, - ObjectType rootType, - ISchemaDefinition schema, - ImmutableArray? operationOptimizers = null, - ImmutableArray? selectionSetOptimizers = null) - { - ArgumentException.ThrowIfNullOrEmpty(id); - - Id = id; - Document = document ?? throw new ArgumentNullException(nameof(document)); - Definition = definition ?? throw new ArgumentNullException(nameof(definition)); - RootType = rootType ?? throw new ArgumentNullException(nameof(rootType)); - Schema = schema ?? throw new ArgumentNullException(nameof(schema)); - OperationOptimizers = operationOptimizers ?? []; - SelectionSetOptimizers = selectionSetOptimizers ?? []; - } - - /// - /// Gets the internal unique identifier for this operation. - /// - public string Id { get; } - - /// - /// Gets the parsed query document that contains the - /// operation-. - /// - public DocumentNode Document { get; } - - /// - /// Gets the syntax node representing the operation definition. - /// - public OperationDefinitionNode Definition { get; } - - /// - /// Gets the root type on which the operation is executed. - /// - public ObjectType RootType { get; } - - /// - /// Gets the schema against which the operation shall be executed. - /// - public ISchemaDefinition Schema { get; } - - public ImmutableArray OperationOptimizers { get; } - - public ImmutableArray SelectionSetOptimizers { get; } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerPool.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerPool.cs deleted file mode 100644 index d62a317d0cb..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerPool.cs +++ /dev/null @@ -1,31 +0,0 @@ -using HotChocolate.Types; -using Microsoft.Extensions.ObjectPool; - -namespace HotChocolate.Execution.Processing; - -internal sealed class OperationCompilerPool : DefaultObjectPool -{ - public OperationCompilerPool(InputParser inputParser) - : base(new Policy(inputParser)) - { - } - - public OperationCompilerPool(InputParser inputParser, int maximumRetained) - : base(new Policy(inputParser), maximumRetained) - { - } - - private sealed class Policy : IPooledObjectPolicy - { - private readonly InputParser _inputParser; - - public Policy(InputParser inputParser) - { - _inputParser = inputParser; - } - - public OperationCompiler Create() => new(_inputParser); - - public bool Return(OperationCompiler obj) => true; - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs index d5e09ed7818..c396301d366 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs @@ -6,7 +6,6 @@ using HotChocolate.Resolvers; using HotChocolate.Types; using HotChocolate.Utilities; -using Microsoft.Extensions.DependencyInjection; using static HotChocolate.Execution.ThrowHelper; namespace HotChocolate.Execution.Processing; @@ -16,7 +15,6 @@ internal sealed partial class OperationContext private readonly IFactory _resolverTaskFactory; private readonly WorkScheduler _workScheduler; private WorkScheduler _currentWorkScheduler; - private readonly DeferredWorkScheduler _deferredWorkScheduler; private readonly ResultBuilder _resultBuilder; private readonly AggregateServiceScopeInitializer _serviceScopeInitializer; private RequestContext _requestContext = null!; @@ -26,7 +24,7 @@ internal sealed partial class OperationContext private IExecutionDiagnosticEvents _diagnosticEvents = null!; private IDictionary _contextData = null!; private CancellationToken _requestAborted; - private IOperation _operation = null!; + private Operation _operation = null!; private IVariableValueCollection _variables = null!; private IServiceProvider _services = null!; private Func _resolveQueryRootValue = null!; @@ -45,7 +43,6 @@ public OperationContext( _resolverTaskFactory = resolverTaskFactory; _workScheduler = new WorkScheduler(this); _currentWorkScheduler = _workScheduler; - _deferredWorkScheduler = new DeferredWorkScheduler(); _resultBuilder = resultBuilder; _serviceScopeInitializer = serviceScopeInitializer; Converter = typeConverter; @@ -59,7 +56,7 @@ public void Initialize( RequestContext requestContext, IServiceProvider scopedServices, IBatchDispatcher batchDispatcher, - IOperation operation, + Operation operation, IVariableValueCollection variables, object? rootValue, Func resolveQueryRootValue, @@ -82,9 +79,8 @@ public void Initialize( _variableIndex = variableIndex; _isInitialized = true; - IncludeFlags = _operation.CreateIncludeFlags(variables); + IncludeFlags = operation.CreateIncludeFlags(variables); _workScheduler.Initialize(batchDispatcher); - _deferredWorkScheduler.Initialize(this); _resultBuilder.Initialize(_requestContext, _diagnosticEvents); if (requestContext.RequestIndex != -1) @@ -120,7 +116,6 @@ public void InitializeFrom(OperationContext context) IncludeFlags = _operation.CreateIncludeFlags(_variables); _workScheduler.Initialize(_batchDispatcher); - _deferredWorkScheduler.InitializeFrom(this, context._deferredWorkScheduler); _resultBuilder.Initialize(_requestContext, _diagnosticEvents); if (context._requestContext.RequestIndex != -1) @@ -143,7 +138,6 @@ public void Clean() _currentWorkScheduler = _workScheduler; _workScheduler.Clear(); _resultBuilder.Clear(); - _deferredWorkScheduler.Clear(); _requestContext = null!; _schema = null!; _errorHandler = null!; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.ArgumentValues.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.ArgumentValues.cs deleted file mode 100644 index b614190999a..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.ArgumentValues.cs +++ /dev/null @@ -1,217 +0,0 @@ -using System.Diagnostics; -using HotChocolate.Language; -using HotChocolate.Resolvers; -using HotChocolate.Types; -using static System.StringComparer; - -namespace HotChocolate.Execution.Processing; - -public sealed partial class OperationCompiler -{ - private ArgumentMap? CoerceArgumentValues( - ObjectField field, - FieldNode selection) - { - if (field.Arguments.Count == 0) - { - return null; - } - - var arguments = new Dictionary(Ordinal); - - for (var i = 0; i < selection.Arguments.Count; i++) - { - var argumentValue = selection.Arguments[i]; - if (field.Arguments.TryGetField( - argumentValue.Name.Value, - out var argument)) - { - arguments[argument.Name] = CreateArgumentValue(argument, argumentValue, argumentValue.Value, false); - } - } - - for (var i = 0; i < field.Arguments.Count; i++) - { - var argument = field.Arguments[i]; - if (!arguments.ContainsKey(argument.Name)) - { - var value = argument.DefaultValue ?? NullValueNode.Default; - arguments[argument.Name] = CreateArgumentValue(argument, null, value, true); - } - } - - return new ArgumentMap(arguments); - } - - private ArgumentValue CreateArgumentValue( - Argument argument, - ArgumentNode? argumentValue, - IValueNode value, - bool isDefaultValue) - { - var validationResult = - ArgumentNonNullValidator.Validate( - argument, - value, - Path.Root.Append(argument.Name)); - - if (argumentValue is not null && validationResult.HasErrors) - { - return new ArgumentValue( - argument, - ErrorHelper.ArgumentNonNullError( - argumentValue, - validationResult)); - } - - if (argument.Type.IsLeafType() && CanBeCompiled(value)) - { - try - { - return new ArgumentValue( - argument, - value.GetValueKind(), - true, - isDefaultValue, - _parser.ParseLiteral(value, argument), - value); - } - catch (SerializationException ex) - { - return new ArgumentValue( - argument, - ErrorHelper.ArgumentValueIsInvalid(argumentValue, ex)); - } - } - - return new ArgumentValue( - argument, - value.GetValueKind(), - false, - isDefaultValue, - null, - value); - } - - private static bool CanBeCompiled(IValueNode valueLiteral) - { - switch (valueLiteral.Kind) - { - case SyntaxKind.Variable: - case SyntaxKind.ObjectValue: - return false; - - case SyntaxKind.ListValue: - var list = (ListValueNode)valueLiteral; - for (var i = 0; i < list.Items.Count; i++) - { - if (!CanBeCompiled(list.Items[i])) - { - return false; - } - } - break; - } - - return true; - } - - internal static FieldDelegate CreateFieldPipeline( - Schema schema, - ObjectField field, - FieldNode selection, - Path? path, - HashSet processed, - List pipelineComponents) - { - var pipeline = field.Middleware; - - if (selection.Directives.Count == 0) - { - return pipeline; - } - - // if we have selection directives we will inspect them and try to build a - // pipeline from them if they have middleware components. - BuildDirectivePipeline(schema, selection, path, processed, pipelineComponents); - - // if we found middleware components on the selection directives we will build a new - // pipeline. - if (pipelineComponents.Count > 0) - { - var next = pipeline; - - for (var i = pipelineComponents.Count - 1; i >= 0; i--) - { - next = pipelineComponents[i](next); - } - - pipeline = next; - } - - // at last, we clear the rented lists - processed.Clear(); - pipelineComponents.Clear(); - - return pipeline; - } - - private static PureFieldDelegate? TryCreatePureField( - Schema schema, - ObjectField field, - FieldNode selection) - { - if (field.PureResolver is not null && selection.Directives.Count == 0) - { - return field.PureResolver; - } - - for (var i = 0; i < selection.Directives.Count; i++) - { - if (schema.DirectiveTypes.TryGetDirective(selection.Directives[i].Name.Value, out var type) - && type.Middleware is not null) - { - return null; - } - } - - return field.PureResolver; - } - - private static void BuildDirectivePipeline( - Schema schema, - FieldNode selection, - Path? path, - HashSet processed, - List pipelineComponents) - { - for (var i = 0; i < selection.Directives.Count; i++) - { - var directiveNode = selection.Directives[i]; - if (schema.DirectiveTypes.TryGetDirective(directiveNode.Name.Value, out var directiveType) - && directiveType.Middleware is not null - && (directiveType.IsRepeatable || processed.Add(directiveType.Name))) - { - Debug.Assert(path != null, "path should not be null if a directive is present."); - Directive directive; - try - { - directive = new Directive( - directiveType, - directiveNode, - directiveType.Parse(directiveNode)); - } - catch (SerializationException ex) - { - throw new SerializationException( - ErrorBuilder.FromError(ex.Errors[0]).SetPath(path).TryAddLocation(directiveNode).Build(), - ex.Type, - path); - } - - var directiveMiddleware = directiveType.Middleware; - pipelineComponents.Add(next => directiveMiddleware(next, directive)); - } - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.CompilerContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.CompilerContext.cs deleted file mode 100644 index 977984e19d6..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.CompilerContext.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Collections.Immutable; -using HotChocolate.Language; -using HotChocolate.Types; -using static System.StringComparer; - -namespace HotChocolate.Execution.Processing; - -public sealed partial class OperationCompiler -{ - internal sealed class CompilerContext(Schema schema, DocumentNode document) - { - public Schema Schema { get; } = schema; - - public DocumentNode Document { get; } = document; - - public ObjectType Type { get; private set; } = null!; - - public SelectionSetInfo[] SelectionInfos { get; private set; } = null!; - - public SelectionPath Path { get; private set; } = SelectionPath.Root; - - public Dictionary Fields { get; } = new(Ordinal); - - public List Fragments { get; } = []; - - public SelectionVariants SelectionVariants { get; private set; } = null!; - - public ImmutableArray Optimizers { get; private set; } - - public void Initialize( - ObjectType type, - SelectionVariants selectionVariants, - SelectionSetInfo[] selectionInfos, - SelectionPath path, - ImmutableArray? optimizers = null) - { - Type = type; - SelectionVariants = selectionVariants; - SelectionInfos = selectionInfos; - Path = path; - Optimizers = optimizers ?? []; - Fields.Clear(); - Fragments.Clear(); - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.cs deleted file mode 100644 index 174bc3ca348..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/_OperationCompiler.cs +++ /dev/null @@ -1,787 +0,0 @@ -using System.Collections.Immutable; -using System.Runtime.CompilerServices; -using HotChocolate.Language; -using HotChocolate.Resolvers; -using HotChocolate.Types; -using HotChocolate.Utilities; -using static System.Runtime.InteropServices.CollectionsMarshal; -using static System.Runtime.InteropServices.MemoryMarshal; -using static System.StringComparer; -using static HotChocolate.Execution.Properties.Resources; -using static HotChocolate.Execution.ThrowHelper; - -namespace HotChocolate.Execution.Processing; - -/// -/// The operation compiler will analyze a specific operation of a GraphQL request document -/// and create from it an optimized executable operation tree. -/// -public sealed partial class OperationCompiler -{ - private readonly InputParser _parser; - private readonly CreateFieldPipeline _createFieldPipeline; - private readonly Queue _backlog = []; - private readonly Dictionary _selectionLookup = []; - private readonly Dictionary _selectionSetIdLookup = []; - private readonly Dictionary _selectionVariants = []; - private readonly Dictionary _fragmentDefinitions = []; - private readonly Dictionary _contextData = []; - private readonly List _selections = []; - private readonly HashSet _directiveNames = new(Ordinal); - private readonly List _pipelineComponents = []; - private readonly HashSet _enqueuedSelectionSets = []; - private IncludeCondition[] _includeConditions = []; - private CompilerContext? _deferContext; - private ImmutableArray _operationOptimizers = []; - private int _nextSelectionId; - private int _nextSelectionSetRefId; - private int _nextSelectionSetId; - private int _nextFragmentId; - private bool _hasIncrementalParts; - private OperationCompilerMetrics _metrics; - - public OperationCompiler(InputParser parser) - { - _parser = parser ?? throw new ArgumentNullException(nameof(parser)); - - _createFieldPipeline = - (schema, field, selection) - => CreateFieldPipeline( - schema, - field, - selection, - null, - _directiveNames, - _pipelineComponents); - } - - internal OperationCompilerMetrics Metrics => _metrics; - - public IOperation Compile(OperationCompilerRequest request) - { - ArgumentException.ThrowIfNullOrEmpty(request.Id, nameof(request)); - - try - { - var backlogMaxSize = 0; - var selectionSetOptimizers = request.SelectionSetOptimizers; - _operationOptimizers = request.OperationOptimizers; - - // collect root fields - var rootPath = SelectionPath.Root; - var id = GetOrCreateSelectionSetRefId(request.Definition.SelectionSet, request.RootType.Name, rootPath); - var variants = GetOrCreateSelectionVariants(id); - SelectionSetInfo[] infos = [new(request.Definition.SelectionSet, 0)]; - - var context = new CompilerContext((Schema)request.Schema, request.Document); - context.Initialize(request.RootType, variants, infos, rootPath, selectionSetOptimizers); - CompileSelectionSet(context); - - // process consecutive selections - while (_backlog.Count > 0) - { - backlogMaxSize = Math.Max(backlogMaxSize, _backlog.Count); - - var current = _backlog.Dequeue(); - var type = current.Type; - variants = GetOrCreateSelectionVariants(current.SelectionSetId); - - if (!variants.ContainsSelectionSet(type)) - { - infos = _selectionLookup[current.Selection]; - context.Initialize(type, variants, infos, current.Path, current.Optimizers); - CompileSelectionSet(context); - } - } - - // create operation - var operation = CreateOperation(request); - - _metrics = new OperationCompilerMetrics( - _nextSelectionId, - _selectionVariants.Count, - backlogMaxSize); - - return operation; - } - finally - { - _nextSelectionId = 0; - _nextSelectionSetRefId = 0; - _nextSelectionId = 0; - _nextFragmentId = 0; - _hasIncrementalParts = false; - - _backlog.Clear(); - _selectionLookup.Clear(); - _selectionSetIdLookup.Clear(); - _selectionVariants.Clear(); - _fragmentDefinitions.Clear(); - _contextData.Clear(); - _selections.Clear(); - _directiveNames.Clear(); - _pipelineComponents.Clear(); - _enqueuedSelectionSets.Clear(); - - _operationOptimizers = []; - - _includeConditions = []; - _deferContext = null; - } - } - - private Operation CreateOperation(OperationCompilerRequest request) - { - var operation = new Operation( - request.Id, - request.Document, - request.Definition, - request.RootType, - request.Schema); - - var schema = Unsafe.As(request.Schema); - - var variants = new SelectionVariants[_selectionVariants.Count]; - - if (_operationOptimizers.Length == 0) - { - CompleteResolvers(schema); - - // if we do not have any optimizers, we will copy - // the variants and seal them in one go. - foreach (var item in _selectionVariants) - { - variants[item.Key] = item.Value; - item.Value.Seal(operation); - } - } - else - { - // if we have optimizers, we will first copy the variants to its array, - // after that we will run the optimizers and give them a chance to do some - // more mutations on the compiled selection variants. - // after we have executed all optimizers, we will seal the selection variants. - var context = new OperationOptimizerContext( - request.Id, - request.Document, - request.Definition, - schema, - request.RootType, - variants, - _includeConditions, - _contextData, - _hasIncrementalParts, - _createFieldPipeline); - - foreach (var item in _selectionVariants) - { - variants[item.Key] = item.Value; - } - - // we will complete the selection variants, sets and selections - // without sealing them so that analyzers in this step can fully - // inspect them. - var variantsSpan = variants.AsSpan(); - ref var variantsStart = ref GetReference(variantsSpan); - ref var variantsEnd = ref Unsafe.Add(ref variantsStart, variantsSpan.Length); - - while (Unsafe.IsAddressLessThan(ref variantsStart, ref variantsEnd)) - { - variantsStart.Complete(operation); - variantsStart = ref Unsafe.Add(ref variantsStart, 1)!; - } - - var optSpan = _operationOptimizers.AsSpan(); - ref var optStart = ref GetReference(optSpan); - ref var optEnd = ref Unsafe.Add(ref optStart, optSpan.Length); - - while (Unsafe.IsAddressLessThan(ref optStart, ref optEnd)) - { - optStart.OptimizeOperation(context); - optStart = ref Unsafe.Add(ref optStart, 1)!; - } - - CompleteResolvers(schema); - - variantsSpan = variants.AsSpan(); - variantsStart = ref GetReference(variantsSpan)!; - variantsEnd = ref Unsafe.Add(ref variantsStart, variantsSpan.Length)!; - - while (Unsafe.IsAddressLessThan(ref variantsStart, ref variantsEnd)) - { - variantsStart.Seal(operation); - variantsStart = ref Unsafe.Add(ref variantsStart, 1)!; - } - } - - operation.Seal(_contextData, variants, _hasIncrementalParts, _includeConditions); - return operation; - } - - private void CompleteResolvers(Schema schema) - { - ref var searchSpace = ref GetReference(AsSpan(_selections)); - - Path? path = null; - for (var i = 0; i < _selections.Count; i++) - { - var selection = Unsafe.Add(ref searchSpace, i); - path = path?.Append(selection.ResponseName); - if (selection.ResolverPipeline is null && selection.PureResolver is null) - { - var field = selection.Field; - var syntaxNode = selection.SyntaxNode; - if (syntaxNode.Directives.Count > 0 && path == null) - { - // create the path only on demand - path = PathHelper.CreatePathFromSelection(_selections, i + 1); - } - - var resolver = CreateFieldPipeline( - schema, - field, - syntaxNode, - path, - _directiveNames, - _pipelineComponents); - var pureResolver = TryCreatePureField(schema, field, syntaxNode); - selection.SetResolvers(resolver, pureResolver); - } - } - } - - private void CompileSelectionSet(CompilerContext context) - { - // We first collect the fields that we find in the selection set ... - CollectFields(context); - - // next we will call the selection set optimizers to rewrite the - // selection set if necessary. - OptimizeSelectionSet(context); - - // after that we start completing the selections and build the SelectionSet from - // the completed selections. - CompleteSelectionSet(context); - } - - private void CompleteSelectionSet(CompilerContext context) - { - var selections = new Selection[context.Fields.Values.Count]; - var fragments = context.Fragments.Count is not 0 - ? new Fragment[context.Fragments.Count] - : []; - var selectionIndex = 0; - var isConditional = false; - - foreach (var selection in context.Fields.Values) - { - // if the field of the selection returns a composite type, we will traverse - // the child selection-sets as well. - var fieldType = selection.Type.NamedType(); - var selectionSetId = -1; - - if (selection.IsConditional) - { - isConditional = true; - } - - // Determines if the type is a composite type. - if (fieldType.IsCompositeType()) - { - if (selection.SelectionSet is null) - { - // composite fields always have to have a selection-set - // otherwise we need to throw. - throw QueryCompiler_CompositeTypeSelectionSet(selection.SyntaxNode); - } - - var selectionPath = context.Path.Append(selection.ResponseName); - selectionSetId = GetOrCreateSelectionSetRefId(selection.SelectionSet, fieldType.Name, selectionPath); - var possibleTypes = context.Schema.GetPossibleTypes(fieldType); - - if (_enqueuedSelectionSets.Add(selectionSetId)) - { - for (var i = possibleTypes.Count - 1; i >= 0; i--) - { - _backlog.Enqueue( - new BacklogItem( - possibleTypes[i], - selectionSetId, - selection, - selectionPath, - ResolveOptimizers(context.Optimizers, selection.Field))); - } - } - - // We are waiting for the latest stream and defer spec discussions to be codified - // before we change the overall stream handling. - // - // For now, we only allow streams on lists of composite types. - if (selection.SyntaxNode.IsStreamable()) - { - var streamDirective = selection.SyntaxNode.GetStreamDirective(); - var nullValue = NullValueNode.Default; - var ifValue = streamDirective?.GetArgumentValue(DirectiveNames.Stream.Arguments.If) ?? nullValue; - long ifConditionFlags = 0; - - if (ifValue.Kind is not SyntaxKind.NullValue) - { - var ifCondition = new IncludeCondition(ifValue, nullValue); - ifConditionFlags = GetSelectionIncludeCondition(ifCondition, 0); - } - - selection.MarkAsStream(ifConditionFlags); - _hasIncrementalParts = true; - } - } - - selection.SetSelectionSetId(selectionSetId); - selections[selectionIndex++] = selection; - _selections.Add(selection); - } - - if (context.Fragments.Count > 0) - { - for (var i = 0; i < context.Fragments.Count; i++) - { - fragments[i] = context.Fragments[i]; - } - } - - context.SelectionVariants.AddSelectionSet( - _nextSelectionSetId++, - context.Type, - selections, - fragments, - isConditional); - } - - private void CollectFields(CompilerContext context) - { - foreach (var selectionSetInfo in context.SelectionInfos) - { - CollectFields( - context, - selectionSetInfo.SelectionSet, - selectionSetInfo.IncludeCondition); - } - } - - private void CollectFields( - CompilerContext context, - SelectionSetNode selectionSet, - ulong includeCondition) - { - for (var j = 0; j < selectionSet.Selections.Count; j++) - { - ResolveFields(context, selectionSet.Selections[j], includeCondition); - } - } - - private void ResolveFields( - CompilerContext context, - ISelectionNode selection, - long includeCondition) - { - switch (selection.Kind) - { - case SyntaxKind.Field: - ResolveField( - context, - (FieldNode)selection, - includeCondition); - break; - - case SyntaxKind.InlineFragment: - ResolveInlineFragment( - context, - (InlineFragmentNode)selection, - includeCondition); - break; - - case SyntaxKind.FragmentSpread: - ResolveFragmentSpread( - context, - (FragmentSpreadNode)selection, - includeCondition); - break; - } - } - - private void ResolveField( - CompilerContext context, - FieldNode selection, - ulong includeCondition) - { - includeCondition = GetSelectionIncludeCondition(selection, includeCondition); - - var fieldName = selection.Name.Value; - var responseName = selection.Alias?.Value ?? fieldName; - - if (context.Type.Fields.TryGetField(fieldName, out var field)) - { - var fieldType = field.Type; - - if (context.Fields.TryGetValue(responseName, out var preparedSelection)) - { - preparedSelection.AddSelection(selection, includeCondition); - - if (selection.SelectionSet is not null) - { - var selectionSetInfo = new SelectionSetInfo( - selection.SelectionSet!, - includeCondition); - var selectionInfos = _selectionLookup[preparedSelection]; - var next = selectionInfos.Length; - Array.Resize(ref selectionInfos, next + 1); - selectionInfos[next] = selectionSetInfo; - _selectionLookup[preparedSelection] = selectionInfos; - } - } - else - { - var id = GetNextSelectionId(); - - // if this is the first time we've found a selection to this field, we have to - // create a new prepared selection. - preparedSelection = new Selection.Sealed( - id, - context.Type, - field, - fieldType, - selection.SelectionSet is not null - ? selection.WithSelectionSet( - selection.SelectionSet.WithSelections( - selection.SelectionSet.Selections)) - : selection, - responseName: responseName, - arguments: CoerceArgumentValues(field, selection), - includeConditions: includeCondition == 0 - ? null - : [includeCondition], - isParallelExecutable: field.IsParallelExecutable); - - context.Fields.Add(responseName, preparedSelection); - - if (selection.SelectionSet is not null) - { - var selectionSetInfo = new SelectionSetInfo( - selection.SelectionSet!, - includeCondition); - _selectionLookup.Add(preparedSelection, [selectionSetInfo]); - } - } - } - else - { - throw FieldDoesNotExistOnType(selection, context.Type.Name); - } - } - - private void ResolveInlineFragment( - CompilerContext context, - InlineFragmentNode inlineFragment, - long includeCondition) - { - ResolveFragment( - context, - inlineFragment, - inlineFragment.TypeCondition, - inlineFragment.SelectionSet, - inlineFragment.Directives, - includeCondition); - } - - private void ResolveFragmentSpread( - CompilerContext context, - FragmentSpreadNode fragmentSpread, - long includeCondition) - { - var fragmentDef = GetFragmentDefinition(context, fragmentSpread); - - ResolveFragment( - context, - fragmentSpread, - fragmentDef.TypeCondition, - fragmentDef.SelectionSet, - fragmentSpread.Directives, - includeCondition); - } - - private void ResolveFragment( - CompilerContext context, - ISelectionNode selection, - NamedTypeNode? typeCondition, - SelectionSetNode selectionSet, - IReadOnlyList directives, - ulong includeCondition) - { - if (typeCondition is null - || (context.Schema.Types.TryGetType(typeCondition, out IType? typeCon) - && DoesTypeApply(typeCon, context.Type))) - { - includeCondition = GetSelectionIncludeCondition(selection, includeCondition); - - if (directives.IsDeferrable()) - { - var deferDirective = directives.GetDeferDirectiveNode(); - var nullValue = NullValueNode.Default; - var ifValue = deferDirective?.GetArgumentValue(DirectiveNames.Defer.Arguments.If) ?? nullValue; - - ulong ifConditionFlags = 0; - - if (ifValue.Kind is not SyntaxKind.NullValue) - { - var ifCondition = new IncludeCondition(ifValue, nullValue); - ifConditionFlags = GetSelectionIncludeCondition(ifCondition, includeCondition); - } - - var typeName = typeCondition?.Name.Value ?? context.Type.Name; - var id = GetOrCreateSelectionSetRefId(selectionSet, typeName, context.Path); - var variants = GetOrCreateSelectionVariants(id); - var infos = new SelectionSetInfo[] { new(selectionSet, includeCondition) }; - - if (!variants.ContainsSelectionSet(context.Type)) - { - var deferContext = RentContext(context); - deferContext.Initialize(context.Type, variants, infos, context.Path); - CompileSelectionSet(deferContext); - ReturnContext(deferContext); - } - - var fragment = new Fragment( - GetNextFragmentId(), - context.Type, - selection, - directives, - variants.GetSelectionSet(context.Type), - includeCondition, - ifConditionFlags); - - context.Fragments.Add(fragment); - _hasIncrementalParts = true; - - // if we have if-condition flags, there will be a runtime validation if something - // shall be deferred, so we need to prepare for both cases. - // - // this means that we will collect the fields with our if condition flags as - // if the fragment was not deferred. - if (ifConditionFlags is not 0) - { - CollectFields(context, selectionSet, ifConditionFlags); - } - } - else - { - CollectFields(context, selectionSet, includeCondition); - } - } - } - - private static bool DoesTypeApply(IType typeCondition, IObjectTypeDefinition current) - => typeCondition.Kind switch - { - TypeKind.Object => ReferenceEquals(typeCondition, current), - TypeKind.Interface => current.IsImplementing((InterfaceType)typeCondition), - TypeKind.Union => ((UnionType)typeCondition).Types.ContainsName(current.Name), - _ => false - }; - - private FragmentDefinitionNode GetFragmentDefinition( - CompilerContext context, - FragmentSpreadNode fragmentSpread) - { - var fragmentName = fragmentSpread.Name.Value; - - if (!_fragmentDefinitions.TryGetValue(fragmentName, out var value)) - { - var document = context.Document; - - for (var i = 0; i < document.Definitions.Count; i++) - { - if (document.Definitions[i] is FragmentDefinitionNode fragmentDefinition - && fragmentDefinition.Name.Value.EqualsOrdinal(fragmentName)) - { - value = fragmentDefinition; - _fragmentDefinitions.Add(fragmentName, value); - goto EXIT; - } - } - - throw new InvalidOperationException( - string.Format( - OperationCompiler_FragmentNotFound, - fragmentName)); - } - -EXIT: - return value; - } - - internal int GetNextSelectionId() => _nextSelectionId++; - - private int GetNextFragmentId() => _nextFragmentId++; - - private int GetOrCreateSelectionSetRefId( - SelectionSetNode selectionSet, - string selectionSetTypeName, - SelectionPath path) - { - var selectionSetRef = new SelectionSetRef(selectionSet, selectionSetTypeName, path); - - if (!_selectionSetIdLookup.TryGetValue(selectionSetRef, out var selectionSetId)) - { - selectionSetId = _nextSelectionSetRefId++; - _selectionSetIdLookup.Add(selectionSetRef, selectionSetId); - } - - return selectionSetId; - } - - private SelectionVariants GetOrCreateSelectionVariants(int selectionSetId) - { - if (!_selectionVariants.TryGetValue(selectionSetId, out var variants)) - { - variants = new SelectionVariants(selectionSetId); - _selectionVariants.Add(selectionSetId, variants); - } - - return variants; - } - - private ulong GetSelectionIncludeCondition( - ISelectionNode selectionSyntax, - ulong parentIncludeCondition) - { - var condition = IncludeCondition.FromSelection(selectionSyntax); - - if (condition.IsDefault) - { - return parentIncludeCondition; - } - - var pos = Array.IndexOf(_includeConditions, condition); - - if (pos == -1) - { - pos = _includeConditions.Length; - - if (pos == 64) - { - throw new InvalidOperationException(OperationCompiler_ToManyIncludeConditions); - } - - if (_includeConditions.Length == 0) - { - _includeConditions = new IncludeCondition[1]; - } - else - { - Array.Resize(ref _includeConditions, pos + 1); - } - - _includeConditions[pos] = condition; - } - - long selectionIncludeCondition = 1; - selectionIncludeCondition <<= pos; - - if (parentIncludeCondition == 0) - { - return selectionIncludeCondition; - } - - parentIncludeCondition |= selectionIncludeCondition; - return parentIncludeCondition; - } - - private long GetSelectionIncludeCondition( - IncludeCondition condition, - ulong parentIncludeCondition) - { - var pos = Array.IndexOf(_includeConditions, condition); - - if (pos == -1) - { - pos = _includeConditions.Length; - - if (pos == 64) - { - throw new InvalidOperationException(OperationCompiler_ToManyIncludeConditions); - } - - if (_includeConditions.Length == 0) - { - _includeConditions = new IncludeCondition[1]; - } - else - { - Array.Resize(ref _includeConditions, pos + 1); - } - - _includeConditions[pos] = condition; - } - - long selectionIncludeCondition = 1; - selectionIncludeCondition <<= pos; - - if (parentIncludeCondition == 0) - { - return selectionIncludeCondition; - } - - parentIncludeCondition |= selectionIncludeCondition; - return parentIncludeCondition; - } - - private CompilerContext RentContext(CompilerContext context) - { - if (_deferContext is null) - { - return new CompilerContext(context.Schema, context.Document); - } - - var temp = _deferContext; - _deferContext = null; - return temp; - } - - private void ReturnContext(CompilerContext context) - => _deferContext ??= context; - - internal void RegisterNewSelection(Selection newSelection) - { - if (newSelection.SyntaxNode.SelectionSet is not null) - { - var selectionSetInfo = new SelectionSetInfo(newSelection.SelectionSet!, 0); - _selectionLookup.Add(newSelection, [selectionSetInfo]); - } - } - - private readonly struct SelectionSetRef( - SelectionSetNode selectionSet, - string selectionSetTypeName, - SelectionPath path) - : IEquatable - { - public readonly SelectionSetNode SelectionSet = selectionSet; - - public readonly SelectionPath Path = path; - - public readonly string SelectionSetTypeName = selectionSetTypeName; - - public bool Equals(SelectionSetRef other) - => SyntaxComparer.BySyntax.Equals(SelectionSet, other.SelectionSet) - && Path.Equals(other.Path) - && Ordinal.Equals(SelectionSetTypeName, other.SelectionSetTypeName); - - public override bool Equals(object? obj) - => obj is SelectionSetRef other && Equals(other); - - public override int GetHashCode() - => HashCode.Combine( - SyntaxComparer.BySyntax.GetHashCode(SelectionSet), - Path.GetHashCode(), - Ordinal.GetHashCode(SelectionSetTypeName)); - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs b/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs index 2dac198ab62..c26e30ec3db 100644 --- a/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs +++ b/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs @@ -266,6 +266,22 @@ await typeModuleChangeMonitor.ConfigureAsync(context, cancellationToken) serviceCollection.AddSingleton(new SchemaVersionInfo(version)); + serviceCollection.AddSingleton(context.DescriptorContext.TypeConverter); + + serviceCollection.AddSingleton( + static sp => new InputParser(sp.GetRequiredService())); + + serviceCollection.AddSingleton( + static sp => new OperationCompiler( + sp.GetRequiredService(), + sp.GetRequiredService(), + sp.GetRequiredService>>>())); + + serviceCollection.AddSingleton( + static _ => new DefaultObjectPoolProvider()); + serviceCollection.AddSingleton( + static sp => sp.GetRequiredService().CreateStringBuilderPool()); + serviceCollection.AddSingleton(executorOptions); serviceCollection.AddSingleton( static sp => sp.GetRequiredService()); diff --git a/src/HotChocolate/Core/src/Types/Extensions/ObjectPoolProviderExtensions.cs b/src/HotChocolate/Core/src/Types/Extensions/ObjectPoolProviderExtensions.cs new file mode 100644 index 00000000000..5a4feb791b5 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Extensions/ObjectPoolProviderExtensions.cs @@ -0,0 +1,15 @@ +using HotChocolate.Execution; +using HotChocolate.Execution.Processing; +using Microsoft.Extensions.ObjectPool; + +namespace HotChocolate; + +internal static class ObjectPoolProviderExtensions +{ + public static ObjectPool>> CreateFieldMapPool( + this ObjectPoolProvider provider) + { + ArgumentNullException.ThrowIfNull(provider); + return provider.Create(new FieldMapPooledObjectPolicy()); + } +} diff --git a/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs b/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs index 3d237262f67..8936dc920b4 100644 --- a/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs @@ -18,7 +18,7 @@ public static class ResolverContextExtensions /// /// Returns the global state for the specified /// or the default value of , if the state - /// could not be found or casted to . + /// could not be found or cast to . /// public static T? GetGlobalStateOrDefault( this IResolverContext context, @@ -51,7 +51,7 @@ public static class ResolverContextExtensions /// /// Returns the global state for the specified /// or the default value of , if the state - /// could not be found or casted to . + /// could not be found or cast to . /// public static T GetGlobalStateOrDefault( this IResolverContext context, @@ -114,7 +114,7 @@ public static T GetGlobalState( /// /// Returns the scoped state for the specified /// or the default value of , if the state - /// could not be found or casted to . + /// could not be found or cast to . /// public static T? GetScopedStateOrDefault( this IResolverContext context, @@ -147,7 +147,7 @@ public static T GetGlobalState( /// /// Returns the scoped state for the specified /// or the default value of , if the state - /// could not be found or casted to . + /// could not be found or cast to . /// public static T GetScopedStateOrDefault( this IResolverContext context, @@ -211,7 +211,7 @@ public static T GetScopedState( /// /// Returns the local state for the specified /// or the default value of , if the state - /// could not be found or casted to . + /// could not be found or cast to . /// public static T? GetLocalStateOrDefault( this IResolverContext context, @@ -244,7 +244,7 @@ public static T GetScopedState( /// /// Returns the local state for the specified /// or the default value of , if the state - /// could not be found or casted to . + /// could not be found or cast to . /// public static T GetLocalStateOrDefault( this IResolverContext context, diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index 08a474f7f21..2d0e7d9066a 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -171,6 +171,30 @@ OperationCompiler.cs + + + OperationContext.cs + + + + OperationContext.cs + + + + OperationContext.cs + + + + OperationContext.cs + + + + OperationContext.cs + + + + OperationContext.cs + diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationPlanMiddleware.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationPlanMiddleware.cs index 1c47df2b5db..d6df81b3a5d 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationPlanMiddleware.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationPlanMiddleware.cs @@ -21,7 +21,7 @@ private OperationPlanMiddleware( IEnumerable? interceptors, IFusionExecutionDiagnosticEvents diagnosticsEvents) { - _documentRewriter = new(schema, removeStaticallyExcludedSelections: true); + _documentRewriter = new DocumentRewriter(schema, removeStaticallyExcludedSelections: true); _planner = planner; _interceptors = interceptors?.ToArray() ?? []; _diagnosticsEvents = diagnosticsEvents; From 152c43ccd7e70681789456ac91f904e195a58288 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Mon, 1 Dec 2025 22:55:14 +0100 Subject: [PATCH 013/144] wip --- .../CacheControlConstraintsOptimizer.cs | 33 ++- .../ErrorBuilderExtensions.cs | 161 +++++++------- .../Execution.Projections/ExpressionCache.cs | 86 ++++++++ ...tChocolateExecutionDataLoaderExtensions.cs | 13 ++ ...otChocolateExecutionSelectionExtensions.cs | 154 ++++++------- .../SelectionExpressionBuilder.cs | 15 +- .../Caching/DefaultPreparedOperationCache.cs | 6 +- .../Caching/IPreparedOperationCache.cs | 4 +- .../InternalServiceCollectionExtensions.cs | 8 - ...uestExecutorServiceCollectionExtensions.cs | 2 - ...colateExecutionRequestContextExtensions.cs | 151 ++++++------- .../Extensions/OperationContextExtensions.cs | 165 +++++++------- .../Pipeline/OperationCacheMiddleware.cs | 1 - .../Pipeline/OperationExecutionMiddleware.cs | 51 +++-- .../Types/Execution/Pipeline/OperationInfo.cs | 2 +- .../Processing/MiddlewareContext.Selection.cs | 7 +- .../Types/Execution/Processing/Operation.cs | 4 +- .../Processing/OperationFeatureCollection.cs | 26 ++- .../Processing/OperationOptimizerContext.cs | 89 ++------ .../Result/ResultBuilder.NonNullHandling.cs | 3 +- .../Types/Execution/Processing/Selection.cs | 5 + .../Processing/SelectionCollection.cs | 206 ++++++++---------- .../Execution/Processing/SelectionLookup.cs | 8 +- .../Execution/Processing/SelectionSet.cs | 9 +- .../Processing/SubscriptionExecutor.cs | 2 +- .../Processing/Tasks/ResolverTask.Execute.cs | 18 +- .../Processing/Tasks/ResolverTask.Pooling.cs | 2 +- .../Processing/Tasks/ResolverTask.cs | 8 +- .../Processing/Tasks/ResolverTaskFactory.cs | 77 +------ .../Core/src/Types/HotChocolate.Types.csproj | 12 + .../OperationParameterExpressionBuilder.cs | 11 +- 31 files changed, 643 insertions(+), 696 deletions(-) create mode 100644 src/HotChocolate/Core/src/Execution.Projections/ExpressionCache.cs diff --git a/src/HotChocolate/Caching/src/Caching/CacheControlConstraintsOptimizer.cs b/src/HotChocolate/Caching/src/Caching/CacheControlConstraintsOptimizer.cs index c23eefea748..2fa588c8518 100644 --- a/src/HotChocolate/Caching/src/Caching/CacheControlConstraintsOptimizer.cs +++ b/src/HotChocolate/Caching/src/Caching/CacheControlConstraintsOptimizer.cs @@ -1,5 +1,4 @@ using System.Collections.Immutable; -using System.Runtime.CompilerServices; using HotChocolate.Execution.Processing; using HotChocolate.Language; using HotChocolate.Types; @@ -15,15 +14,16 @@ internal sealed class CacheControlConstraintsOptimizer : IOperationOptimizer { public void OptimizeOperation(OperationOptimizerContext context) { - if (context.Definition.Operation is not OperationType.Query - || context.HasIncrementalParts + // TODO : we need to include this again when defer is back. + if (context.Operation.Kind is not OperationType.Query + // || context.HasIncrementalParts || ContainsIntrospectionFields(context)) { // if this is an introspection query, we will not cache it. return; } - var constraints = ComputeCacheControlConstraints(context.CreateOperation()); + var constraints = ComputeCacheControlConstraints(context.Operation); if (constraints.MaxAge is not null || constraints.SharedMaxAge is not null) { @@ -56,7 +56,7 @@ public void OptimizeOperation(OperationOptimizerContext context) } private static ImmutableCacheConstraints ComputeCacheControlConstraints( - IOperation operation) + Operation operation) { var constraints = new CacheControlConstraints(); var rootSelections = operation.RootSelectionSet.Selections; @@ -91,9 +91,9 @@ private static ImmutableCacheConstraints ComputeCacheControlConstraints( } private static void ProcessSelection( - ISelection selection, + Selection selection, CacheControlConstraints constraints, - IOperation operation) + Operation operation) { var field = selection.Field; var maxAgeSet = false; @@ -117,19 +117,18 @@ private static void ProcessSelection( } } - if (selection.SelectionSet is not null) + if (selection.HasSelections) { var possibleTypes = operation.GetPossibleTypes(selection); foreach (var type in possibleTypes) { - var selectionSet = Unsafe.As(operation.GetSelectionSet(selection, type)); - var length = selectionSet.Selections.Count; - ref var start = ref selectionSet.GetSelectionsReference(); + var selectionSet = operation.GetSelectionSet(selection, type); + var selections = selectionSet.Selections; - for (var i = 0; i < length; i++) + foreach (var childSelection in selections) { - ProcessSelection(Unsafe.Add(ref start, i), constraints, operation); + ProcessSelection(childSelection, constraints, operation); } } } @@ -223,13 +222,11 @@ void ExtractCacheControlDetailsFromDirectives( private static bool ContainsIntrospectionFields(OperationOptimizerContext context) { - var length = context.RootSelectionSet.Selections.Count; - ref var start = ref ((SelectionSet)context.RootSelectionSet).GetSelectionsReference(); + var selections = context.Operation.RootSelectionSet.Selections; - for (var i = 0; i < length; i++) + foreach (var selection in selections) { - var field = Unsafe.Add(ref start, i).Field; - + var field = selection.Field; if (field.IsIntrospectionField && !field.Name.EqualsOrdinal(IntrospectionFieldNames.TypeName)) { diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs b/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs index 628a75e4eb4..9c4d6c88050 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs @@ -8,109 +8,102 @@ namespace HotChocolate; /// public static class ErrorBuilderExtensions { - /// - /// Sets the field coordinate of the error. - /// - /// The error builder. - /// The field coordinate. - /// The error builder. - public static ErrorBuilder SetCoordinate( - this ErrorBuilder builder, - SchemaCoordinate coordinate) + extension(ErrorBuilder builder) { - ArgumentNullException.ThrowIfNull(builder); - - return builder.SetExtension(nameof(coordinate), coordinate.ToString()); - } + /// + /// Sets the field coordinate of the error. + /// + /// The field coordinate. + /// The error builder. + public ErrorBuilder SetCoordinate(SchemaCoordinate coordinate) + { + ArgumentNullException.ThrowIfNull(builder); - /// - /// Sets the input path of the error. - /// - /// The error builder. - /// The input path. - /// The error builder. - public static ErrorBuilder SetInputPath( - this ErrorBuilder builder, - Path inputPath) - { - ArgumentNullException.ThrowIfNull(builder); + return builder.SetExtension(nameof(coordinate), coordinate.ToString()); + } - return builder.SetExtension(nameof(inputPath), inputPath); - } + /// + /// Sets the input path of the error. + /// + /// The input path. + /// The error builder. + public ErrorBuilder SetInputPath(Path inputPath) + { + ArgumentNullException.ThrowIfNull(builder); - /// - /// Sets the message of the error. - /// - /// The error builder. - /// The format of the message. - /// The arguments for the message. - /// The error builder. - public static ErrorBuilder SetMessage(this ErrorBuilder builder, string format, params object[] args) - { - ArgumentNullException.ThrowIfNull(builder); - ArgumentException.ThrowIfNullOrEmpty(format); - ArgumentNullException.ThrowIfNull(args); + return builder.SetExtension(nameof(inputPath), inputPath); + } - return builder.SetMessage(string.Format(CultureInfo.InvariantCulture, format, args)); - } + /// + /// Sets the message of the error. + /// + /// The format of the message. + /// The arguments for the message. + /// The error builder. + public ErrorBuilder SetMessage(string format, params object[] args) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentException.ThrowIfNullOrEmpty(format); + ArgumentNullException.ThrowIfNull(args); - /// - /// Adds a location to the error. - /// - /// The error builder. - /// The syntax node. - /// The error builder. - public static ErrorBuilder AddLocation(this ErrorBuilder builder, ISyntaxNode node) - { - ArgumentNullException.ThrowIfNull(node); + return builder.SetMessage(string.Format(CultureInfo.InvariantCulture, format, args)); + } - if (node.Location is null) + /// + /// Adds a location to the error. + /// + /// The syntax node. + /// The error builder. + public ErrorBuilder AddLocation(ISyntaxNode node) { - return builder; - } + ArgumentNullException.ThrowIfNull(node); - builder.AddLocation(new Location(node.Location.Line, node.Location.Column)); - return builder; - } + if (node.Location is null) + { + return builder; + } - /// - /// Adds a location to the error if the error does not already have a location. - /// - /// The error builder. - /// The syntax node. - /// The error builder. - public static ErrorBuilder TryAddLocation(this ErrorBuilder builder, ISyntaxNode? node) - { - if (node?.Location is null) - { + builder.AddLocation(new Location(node.Location.Line, node.Location.Column)); return builder; } - builder.TryAddLocation(new Location(node.Location.Line, node.Location.Column)); - return builder; - } + /// + /// Adds a location to the error if the error does not already have a location. + /// + /// The syntax node. + /// The error builder. + public ErrorBuilder TryAddLocation(ISyntaxNode? node) + { + if (node?.Location is null) + { + return builder; + } - /// - /// Adds multiple locations to the error. - /// - /// The error builder. - /// The syntax nodes. - /// The error builder. - public static ErrorBuilder AddLocations(this ErrorBuilder builder, IEnumerable nodes) - { - ArgumentNullException.ThrowIfNull(builder); - ArgumentNullException.ThrowIfNull(nodes); + builder.TryAddLocation(new Location(node.Location.Line, node.Location.Column)); + return builder; + } - foreach (var node in nodes) + /// + /// Adds multiple locations to the error. + /// + /// The syntax nodes. + /// The error builder. + public ErrorBuilder AddLocations(IEnumerable nodes) { - if (node.Location is null) + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(nodes); + + foreach (var node in nodes) { - continue; + if (node.Location is null) + { + continue; + } + + builder.AddLocation(new Location(node.Location.Line, node.Location.Column)); } - builder.AddLocation(new Location(node.Location.Line, node.Location.Column)); + return builder; } - - return builder; } } diff --git a/src/HotChocolate/Core/src/Execution.Projections/ExpressionCache.cs b/src/HotChocolate/Core/src/Execution.Projections/ExpressionCache.cs new file mode 100644 index 00000000000..17d66d918ec --- /dev/null +++ b/src/HotChocolate/Core/src/Execution.Projections/ExpressionCache.cs @@ -0,0 +1,86 @@ +// ReSharper disable InconsistentlySynchronizedField +using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; +using System.Linq.Expressions; +using GreenDonut.Data; +using HotChocolate.Execution.Processing; + +namespace HotChocolate.Execution.Projections; + +internal sealed class ExpressionCache +{ + private readonly object _writeLock = new(); + private readonly ConcurrentDictionary _cache = new(); + + public bool TryGetExpression( + Selection selection, + [NotNullWhen(true)] out Expression>? expression) + { + if (_cache.TryGetValue(selection.Id, out var cachedExpression) + && cachedExpression is Expression> casted) + { + expression = casted; + return true; + } + + expression = null; + return false; + } + + public Expression> GetOrCreateExpression( + Selection selection, + SelectionExpressionBuilder expressionBuilder) + { + if (!TryGetExpression(selection, out var expression)) + { + lock (_writeLock) + { + if (!TryGetExpression(selection, out expression)) + { + expression = expressionBuilder.BuildExpression(selection); + _cache.TryAdd(selection.Id, expression); + } + } + } + + return expression; + } + + public Expression> GetOrCreateExpression( + Selection selection, + ISelectorBuilder expressionBuilder) + { + if (!TryGetExpression(selection, out var expression)) + { + lock (_writeLock) + { + if (!TryGetExpression(selection, out expression)) + { + expression = expressionBuilder.TryCompile()!; + _cache.TryAdd(selection.Id, expression); + } + } + } + + return expression; + } + + public Expression> GetOrCreateNodeExpression( + Selection selection, + SelectionExpressionBuilder expressionBuilder) + { + if (!TryGetExpression(selection, out var expression)) + { + lock (_writeLock) + { + if (!TryGetExpression(selection, out expression)) + { + expression = expressionBuilder.BuildNodeExpression(selection); + _cache.TryAdd(selection.Id, expression); + } + } + } + + return expression; + } +} diff --git a/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionDataLoaderExtensions.cs b/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionDataLoaderExtensions.cs index e94f6f41dc8..3773922eee2 100644 --- a/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionDataLoaderExtensions.cs +++ b/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionDataLoaderExtensions.cs @@ -1,3 +1,4 @@ +using HotChocolate.Execution; using HotChocolate.Execution.Processing; // ReSharper disable once CheckNamespace @@ -38,6 +39,18 @@ public static IDataLoader Select( return dataLoader.Select(expression); } + public static IDataLoader Select( + this IDataLoader dataLoader, + Selection selection) + where TKey : notnull + { + ArgumentNullException.ThrowIfNull(dataLoader); + ArgumentNullException.ThrowIfNull(selection); + + var expression = selection.AsSelector(); + return dataLoader.Select(expression); + } + /// /// Selects the fields that where selected in the GraphQL selection tree. /// diff --git a/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionSelectionExtensions.cs b/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionSelectionExtensions.cs index 7dd18bcb0dd..6c7740745af 100644 --- a/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionSelectionExtensions.cs +++ b/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionSelectionExtensions.cs @@ -1,9 +1,6 @@ using System.Buffers; -using System.Buffers.Text; using System.Diagnostics.CodeAnalysis; using System.Linq.Expressions; -using System.Text; -using System.Runtime.CompilerServices; using GreenDonut.Data; using HotChocolate.Execution.Projections; using HotChocolate.Types; @@ -18,8 +15,6 @@ namespace HotChocolate.Execution.Processing; /// public static class HotChocolateExecutionSelectionExtensions { - private static readonly SelectionExpressionBuilder s_builder = new(); - /// /// Creates a selector expression from a GraphQL selection. /// @@ -34,6 +29,31 @@ public static class HotChocolateExecutionSelectionExtensions /// public static Expression> AsSelector( this ISelection selection) + { + if (selection is not Selection casted) + { + throw new ArgumentException( + $"Expected {typeof(Selection).FullName!}.", + nameof(selection)); + } + + return AsSelector(casted); + } + + /// + /// Creates a selector expression from a GraphQL selection. + /// + /// + /// The selection that shall be converted into a selector expression. + /// + /// + /// The type of the value that is returned by the . + /// + /// + /// Returns a selector expression that can be used for data projections. + /// + public static Expression> AsSelector( + this Selection selection) { // we first check if we already have an expression for this selection, // this would be the cheapest way to get the expression. @@ -50,66 +70,48 @@ public static Expression> AsSelector( if ((flags & CoreFieldFlags.Connection) == CoreFieldFlags.Connection) { var builder = new DefaultSelectorBuilder(); - var buffer = ArrayPool.Shared.Rent(16); + var buffer = ArrayPool.Shared.Rent(16); var count = GetConnectionSelections(selection, buffer); for (var i = 0; i < count; i++) { - builder.Add(GetOrCreateExpression(buffer[i])); + builder.Add(buffer[i].GetOrCreateExpression()); } - ArrayPool.Shared.Return(buffer); - return GetOrCreateExpression(selection, builder); + ArrayPool.Shared.Return(buffer); + return selection.GetOrCreateExpression(builder); } if ((flags & CoreFieldFlags.CollectionSegment) == CoreFieldFlags.CollectionSegment) { var builder = new DefaultSelectorBuilder(); - var buffer = ArrayPool.Shared.Rent(16); + var buffer = ArrayPool.Shared.Rent(16); var count = GetCollectionSelections(selection, buffer); for (var i = 0; i < count; i++) { - builder.Add(GetOrCreateExpression(buffer[i])); + builder.Add(buffer[i].GetOrCreateExpression()); } - ArrayPool.Shared.Return(buffer); - return GetOrCreateExpression(selection, builder); + ArrayPool.Shared.Return(buffer); + return selection.GetOrCreateExpression(builder); } if ((flags & CoreFieldFlags.GlobalIdNodeField) == CoreFieldFlags.GlobalIdNodeField || (flags & CoreFieldFlags.GlobalIdNodesField) == CoreFieldFlags.GlobalIdNodesField) { - return GetOrCreateNodeExpression(selection); + return selection.GetOrCreateNodeExpression(); } - return GetOrCreateExpression(selection); + return selection.GetOrCreateExpression(); } - private static Expression> GetOrCreateExpression( - ISelection selection) - => selection.DeclaringOperation.GetOrAddState( - CreateExpressionKey(selection.Id), - static (_, ctx) => ctx._builder.BuildExpression(ctx.selection), - (_builder: s_builder, selection)); - - private static Expression> GetOrCreateExpression( - ISelection selection, - ISelectorBuilder builder) - => selection.DeclaringOperation.GetOrAddState( - CreateExpressionKey(selection.Id), - static (_, ctx) => ctx.builder.TryCompile()!, - (builder, selection)); - - private static Expression> GetOrCreateNodeExpression( - ISelection selection) - => selection.DeclaringOperation.GetOrAddState( - CreateNodeExpressionKey(selection.Id), - static (_, ctx) => ctx._builder.BuildNodeExpression(ctx.selection), - (_builder: s_builder, selection)); - private static bool TryGetExpression( - ISelection selection, + Selection selection, [NotNullWhen(true)] out Expression>? expression) - => selection.DeclaringOperation.TryGetState(CreateExpressionKey(selection.Id), out expression); + { + var features = selection.DeclaringOperation.Features; + var cache = features.GetOrSetSafe(); + return cache.TryGetExpression(selection, out expression); + } - private static int GetConnectionSelections(ISelection selection, Span buffer) + private static int GetConnectionSelections(Selection selection, Span buffer) { var pageType = (ObjectType)selection.Field.Type.NamedType(); var connectionSelections = selection.DeclaringOperation.GetSelectionSet(selection, pageType); @@ -149,7 +151,7 @@ private static int GetConnectionSelections(ISelection selection, Span buffer) + private static int GetCollectionSelections(Selection selection, Span buffer) { var pageType = (ObjectType)selection.Field.Type.NamedType(); var connectionSelections = selection.DeclaringOperation.GetSelectionSet(selection, pageType); @@ -170,59 +172,27 @@ private static int GetCollectionSelections(ISelection selection, Span span = stackalloc byte[requiredBufferSize]; - keyPrefix.CopyTo(span); - Utf8Formatter.TryFormat(key, span[keyPrefix.Length..], out var written, 'D'); - return Encoding.UTF8.GetString(span[..(written + keyPrefix.Length)]); - } - - private static string CreateNodeExpressionKey(int key) - { - var typeName = typeof(TValue).FullName!; - var typeNameLength = Encoding.UTF8.GetMaxByteCount(typeName.Length); - var keyPrefix = GetKeyPrefix(); - var requiredBufferSize = EstimateIntLength(key) + keyPrefix.Length + typeNameLength; - byte[]? rented = null; - var span = requiredBufferSize <= 256 - ? stackalloc byte[requiredBufferSize] - : (rented = ArrayPool.Shared.Rent(requiredBufferSize)); - - keyPrefix.CopyTo(span); - Utf8Formatter.TryFormat(key, span[keyPrefix.Length..], out var written, 'D'); - var typeNameWritten = Encoding.UTF8.GetBytes(typeName, span[(written + keyPrefix.Length)..]); - var keyString = Encoding.UTF8.GetString(span[..(written + keyPrefix.Length + typeNameWritten)]); - - if (rented is not null) - { - ArrayPool.Shared.Return(rented); - } - - return keyString; - } - - private static ReadOnlySpan GetKeyPrefix() - => "hc-dataloader-expr-"u8; +file static class Extensions +{ + private static readonly SelectionExpressionBuilder s_builder = new(); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static int EstimateIntLength(int value) + extension(Selection selection) { - if (value == 0) - { - // to print 0 we need still 1 digit - return 1; - } - - // if the number is negative we need one more digit for the sign - var length = value < 0 ? 1 : 0; - - // we add the number of digits the number has to the length of the number. - length += (int)Math.Floor(Math.Log10(Math.Abs(value)) + 1); - - return length; + public Expression> GetOrCreateExpression() + => selection.DeclaringOperation.Features + .GetOrSetSafe() + .GetOrCreateExpression(selection, s_builder); + + public Expression> GetOrCreateExpression(ISelectorBuilder expressionBuilder) + => selection.DeclaringOperation.Features + .GetOrSetSafe() + .GetOrCreateExpression(selection, expressionBuilder); + + public Expression> GetOrCreateNodeExpression() + => selection.DeclaringOperation.Features + .GetOrSetSafe() + .GetOrCreateNodeExpression(selection, s_builder); } } diff --git a/src/HotChocolate/Core/src/Execution.Projections/SelectionExpressionBuilder.cs b/src/HotChocolate/Core/src/Execution.Projections/SelectionExpressionBuilder.cs index 4d812130668..2e511cff998 100644 --- a/src/HotChocolate/Core/src/Execution.Projections/SelectionExpressionBuilder.cs +++ b/src/HotChocolate/Core/src/Execution.Projections/SelectionExpressionBuilder.cs @@ -36,7 +36,7 @@ internal sealed class SelectionExpressionBuilder typeof(char?) ]; - public Expression> BuildExpression(ISelection selection) + public Expression> BuildExpression(Selection selection) { var rootType = typeof(TRoot); var parameter = Expression.Parameter(rootType, "root"); @@ -56,7 +56,7 @@ public Expression> BuildExpression(ISelection selectio return Expression.Lambda>(selectionSetExpression, parameter); } - public Expression> BuildNodeExpression(ISelection selection) + public Expression> BuildNodeExpression(Selection selection) { var rootType = typeof(TRoot); var parameter = Expression.Parameter(rootType, "root"); @@ -66,6 +66,7 @@ public Expression> BuildNodeExpression(ISelection sele var entityType = selection.DeclaringOperation .GetPossibleTypes(selection) + .Cast() .FirstOrDefault(t => t.RuntimeType == typeof(TRoot)); if (entityType is null) @@ -94,7 +95,7 @@ public Expression> BuildNodeExpression(ISelection sele return Expression.Lambda>(selectionSetExpression, parameter); } - private void CollectTypes(Context context, ISelection selection, TypeContainer parent) + private void CollectTypes(Context context, Selection selection, TypeContainer parent) { var namedType = selection.Type.NamedType(); @@ -105,7 +106,7 @@ private void CollectTypes(Context context, ISelection selection, TypeContainer p if (namedType.IsAbstractType()) { - foreach (var possibleType in selection.DeclaringOperation.GetPossibleTypes(selection)) + foreach (var possibleType in selection.DeclaringOperation.GetPossibleTypes(selection).Cast()) { var possibleTypeNode = new TypeNode(possibleType.RuntimeType); var possibleSelectionSet = selection.DeclaringOperation.GetSelectionSet(selection, possibleType); @@ -191,7 +192,7 @@ private void CollectTypes(Context context, ISelection selection, TypeContainer p private void CollectSelection( Context context, - ISelection selection, + Selection selection, TypeNode parent) { var namedType = selection.Field.Type.NamedType(); @@ -266,7 +267,7 @@ private static void TryAddAnyLeafField( private void CollectSelections( Context context, - ISelectionSet selectionSet, + SelectionSet selectionSet, TypeNode parent) { foreach (var selection in selectionSet.Selections) @@ -343,7 +344,7 @@ private readonly record struct Context( FieldRequirementsMetadata Requirements, NullabilityInfoContext NullabilityInfoContext) { - public TypeNode? GetRequirements(ISelection selection) + public TypeNode? GetRequirements(Selection selection) { var flags = selection.Field.Flags; return (flags & CoreFieldFlags.WithRequirements) == CoreFieldFlags.WithRequirements diff --git a/src/HotChocolate/Core/src/Types/Execution/Caching/DefaultPreparedOperationCache.cs b/src/HotChocolate/Core/src/Types/Execution/Caching/DefaultPreparedOperationCache.cs index a4f1107f8ce..c6f852a78ab 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Caching/DefaultPreparedOperationCache.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Caching/DefaultPreparedOperationCache.cs @@ -6,15 +6,15 @@ namespace HotChocolate.Execution.Caching; internal sealed class DefaultPreparedOperationCache(int capacity = 256) : IPreparedOperationCache { - private readonly Cache _cache = new(capacity); + private readonly Cache _cache = new(capacity); public int Capacity => _cache.Capacity; public int Count => _cache.Count; - public void TryAddOperation(string operationId, IOperation operation) + public void TryAddOperation(string operationId, Operation operation) => _cache.GetOrCreate(operationId, static (_, op) => op, operation); - public bool TryGetOperation(string operationId, [NotNullWhen(true)] out IOperation? operation) + public bool TryGetOperation(string operationId, [NotNullWhen(true)] out Operation? operation) => _cache.TryGet(operationId, out operation); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Caching/IPreparedOperationCache.cs b/src/HotChocolate/Core/src/Types/Execution/Caching/IPreparedOperationCache.cs index 8235bd73f45..65bca19c522 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Caching/IPreparedOperationCache.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Caching/IPreparedOperationCache.cs @@ -33,7 +33,7 @@ public interface IPreparedOperationCache /// true if an operation was found that matches the specified /// , otherwise false. /// - bool TryGetOperation(string operationId, [NotNullWhen(true)] out IOperation? operation); + bool TryGetOperation(string operationId, [NotNullWhen(true)] out Operation? operation); /// /// Tries to add a new compiled operation to the cache. @@ -44,5 +44,5 @@ public interface IPreparedOperationCache /// /// The operation that shall be cached. /// - void TryAddOperation(string operationId, IOperation operation); + void TryAddOperation(string operationId, Operation operation); } diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs index 6a1afa07ec7..be71c7446e7 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs @@ -71,14 +71,6 @@ internal static IServiceCollection TryAddResolverTaskPool( return services; } - internal static IServiceCollection TryAddOperationCompilerPool( - this IServiceCollection services) - { - services.TryAddSingleton>( - sp => new OperationCompilerPool(sp.GetRequiredService())); - return services; - } - internal static IServiceCollection TryAddOperationContextPool( this IServiceCollection services) { diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs index 63b88e77e99..d78ec74851f 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs @@ -57,8 +57,6 @@ public static IServiceCollection AddGraphQLCore(this IServiceCollection services .TryAddResultPool() .TryAddResolverTaskPool() .TryAddOperationContextPool() - .TryAddDeferredWorkStatePool() - .TryAddOperationCompilerPool() .TryAddSingleton>(new DocumentValidatorContextPool()); // global executor services diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/HotChocolateExecutionRequestContextExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/HotChocolateExecutionRequestContextExtensions.cs index 7032887c51f..2573e075aa9 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/HotChocolateExecutionRequestContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/HotChocolateExecutionRequestContextExtensions.cs @@ -8,106 +8,99 @@ namespace HotChocolate.Execution; public static class HotChocolateExecutionRequestContextExtensions { - public static bool TryGetOperationDefinition( - this RequestContext context, - [NotNullWhen(true)] out OperationDefinitionNode? operationDefinition) + extension(RequestContext context) { - ArgumentNullException.ThrowIfNull(context); + public bool TryGetOperationDefinition([NotNullWhen(true)] out OperationDefinitionNode? operationDefinition) + { + ArgumentNullException.ThrowIfNull(context); - var operationInfo = context.Features.GetOrSet(); + var operationInfo = context.Features.GetOrSet(); - if (operationInfo.Operation is not null) - { - operationDefinition = operationInfo.Operation.Definition; - return true; - } + if (operationInfo.Operation is not null) + { + operationDefinition = operationInfo.Operation.Definition; + return true; + } - if (operationInfo.Definition is not null) - { - operationDefinition = operationInfo.Definition; - return true; + if (operationInfo.Definition is not null) + { + operationDefinition = operationInfo.Definition; + return true; + } + + operationDefinition = null; + return false; } - operationDefinition = null; - return false; - } + public void SetOperationDefinition(OperationDefinitionNode operationDefinition) + { + ArgumentNullException.ThrowIfNull(context); - public static void SetOperationDefinition( - this RequestContext context, - OperationDefinitionNode operationDefinition) - { - ArgumentNullException.ThrowIfNull(context); + var operationInfo = context.Features.GetOrSet(); - var operationInfo = context.Features.GetOrSet(); + if (operationInfo.Operation is not null) + { + throw new InvalidOperationException( + "The operation definition cannot be set after " + + "the operation was already compiled."); + } - if (operationInfo.Operation is not null) - { - throw new InvalidOperationException( - "The operation definition cannot be set after " - + "the operation was already compiled."); + operationInfo.Definition = operationDefinition; } - operationInfo.Definition = operationDefinition; - } - - public static bool TryGetOperation( - this RequestContext context, - [NotNullWhen(true)] out IOperation? operation) - { - ArgumentNullException.ThrowIfNull(context); + public bool TryGetOperation([NotNullWhen(true)] out Operation? operation) + { + ArgumentNullException.ThrowIfNull(context); - var operationInfo = context.Features.GetOrSet(); - operation = operationInfo.Operation; - return operation is not null; - } + var operationInfo = context.Features.GetOrSet(); + operation = operationInfo.Operation; + return operation is not null; + } - public static bool TryGetOperation( - this RequestContext context, - [NotNullWhen(true)] out IOperation? operation, - [NotNullWhen(true)] out string? operationId) - { - ArgumentNullException.ThrowIfNull(context); + public bool TryGetOperation([NotNullWhen(true)] out Operation? operation, + [NotNullWhen(true)] out string? operationId) + { + ArgumentNullException.ThrowIfNull(context); - var operationInfo = context.Features.GetOrSet(); - operation = operationInfo.Operation; - operationId = operationInfo.Id; - return operation is not null; - } + var operationInfo = context.Features.GetOrSet(); + operation = operationInfo.Operation; + operationId = operationInfo.Id; + return operation is not null; + } - public static IOperation GetOperation(this RequestContext context) - { - ArgumentNullException.ThrowIfNull(context); + public Operation GetOperation() + { + ArgumentNullException.ThrowIfNull(context); - return context.Features.GetRequired().Operation - ?? throw new InvalidOperationException("The operation is not initialized."); - } + return context.Features.GetRequired().Operation + ?? throw new InvalidOperationException("The operation is not initialized."); + } - public static void SetOperation( - this RequestContext context, - IOperation operation) - { - ArgumentNullException.ThrowIfNull(context); - ArgumentNullException.ThrowIfNull(operation); + public void SetOperation(Operation operation) + { + ArgumentNullException.ThrowIfNull(context); + ArgumentNullException.ThrowIfNull(operation); - var operationInfo = context.Features.GetOrSet(); - operationInfo.Operation = operation; - operationInfo.Id = operation.Id; - operationInfo.Definition = operation.Definition; - } + var operationInfo = context.Features.GetOrSet(); + operationInfo.Operation = operation; + operationInfo.Id = operation.Id; + operationInfo.Definition = operation.Definition; + } - public static bool TryGetOperationId(this RequestContext context, [NotNullWhen(true)] out string? operationId) - { - ArgumentNullException.ThrowIfNull(context); + public bool TryGetOperationId([NotNullWhen(true)] out string? operationId) + { + ArgumentNullException.ThrowIfNull(context); - operationId = context.Features.GetOrSet().Id; - return operationId is not null; - } + operationId = context.Features.GetOrSet().Id; + return operationId is not null; + } - public static void SetOperationId(this RequestContext context, string operationId) - { - ArgumentNullException.ThrowIfNull(context); + public void SetOperationId(string operationId) + { + ArgumentNullException.ThrowIfNull(context); - var operationInfo = context.Features.GetOrSet(); - operationInfo.Id = operationId; + var operationInfo = context.Features.GetOrSet(); + operationInfo.Id = operationId; + } } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs index 32a7fcb170f..d721a1e8f24 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs @@ -5,61 +5,99 @@ namespace HotChocolate.Execution; internal static class OperationContextExtensions { - public static OperationContext ReportError( - this OperationContext operationContext, - Exception exception, - MiddlewareContext resolverContext, - ISelection? selection = null, - Path? path = null) + extension(OperationContext context) { - selection ??= resolverContext.Selection; - path ??= resolverContext.Path; + public OperationContext ReportError(Exception exception, + MiddlewareContext resolverContext, + ISelection? selection = null, + Path? path = null) + { + selection ??= resolverContext.Selection; + path ??= resolverContext.Path; - ArgumentNullException.ThrowIfNull(exception); + ArgumentNullException.ThrowIfNull(exception); - if (exception is GraphQLException ex) - { - foreach (var error in ex.Errors) + if (exception is GraphQLException ex) + { + foreach (var error in ex.Errors) + { + ReportError(context, error, resolverContext, selection); + } + } + else { - ReportError(operationContext, error, resolverContext, selection); + var error = ErrorBuilder + .FromException(exception) + .SetPath(path) + .AddLocations(selection.GetSyntaxNodes()) + .Build(); + + ReportError(context, error, resolverContext, selection); } + + return context; } - else + + public OperationContext ReportError(IError error, + MiddlewareContext resolverContext, + ISelection? selection = null) { - var error = ErrorBuilder - .FromException(exception) - .SetPath(path) - .AddLocation(selection.SyntaxNode) - .Build(); + var errors = new List(); + + ReportSingleError( + context.ErrorHandler, + error, + errors); - ReportError(operationContext, error, resolverContext, selection); + selection ??= resolverContext.Selection; + + foreach (var handled in errors) + { + context.Result.AddError(handled, selection); + context.DiagnosticEvents.ResolverError(resolverContext, handled); + } + + return context; } - return operationContext; - } + public OperationContext SetLabel(string? label) + { + context.Result.SetLabel(label); + return context; + } - public static OperationContext ReportError( - this OperationContext operationContext, - IError error, - MiddlewareContext resolverContext, - ISelection? selection = null) - { - var errors = new List(); + public OperationContext SetPath(Path? path) + { + context.Result.SetPath(path); + return context; + } + + public OperationContext SetData(ObjectResult objectResult) + { + context.Result.SetData(objectResult); + return context; + } - ReportSingleError( - operationContext.ErrorHandler, - error, - errors); + public OperationContext SetItems(IReadOnlyList items) + { + context.Result.SetItems(items); + return context; + } - selection ??= resolverContext.Selection; + public OperationContext SetPatchId(uint patchId) + { + context.Result.SetContextData(WellKnownContextData.PatchId, patchId); + return context; + } - foreach (var handled in errors) + public OperationContext ClearResult() { - operationContext.Result.AddError(handled, selection); - operationContext.DiagnosticEvents.ResolverError(resolverContext, handled); + context.Result.Clear(); + return context; } - return operationContext; + public IOperationResult BuildResult() + => context.Result.BuildResult(); } private static void ReportSingleError( @@ -93,55 +131,4 @@ private static void ReportSingleError( errors.Add(error); } } - - public static OperationContext SetLabel( - this OperationContext context, - string? label) - { - context.Result.SetLabel(label); - return context; - } - - public static OperationContext SetPath( - this OperationContext context, - Path? path) - { - context.Result.SetPath(path); - return context; - } - - public static OperationContext SetData( - this OperationContext context, - ObjectResult objectResult) - { - context.Result.SetData(objectResult); - return context; - } - - public static OperationContext SetItems( - this OperationContext context, - IReadOnlyList items) - { - context.Result.SetItems(items); - return context; - } - - public static OperationContext SetPatchId( - this OperationContext context, - uint patchId) - { - context.Result.SetContextData(WellKnownContextData.PatchId, patchId); - return context; - } - - public static OperationContext ClearResult( - this OperationContext context) - { - context.Result.Clear(); - return context; - } - - public static IOperationResult BuildResult( - this OperationContext context) => - context.Result.BuildResult(); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationCacheMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationCacheMiddleware.cs index b21a9ccaff5..5e0bad45ab0 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationCacheMiddleware.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationCacheMiddleware.cs @@ -1,6 +1,5 @@ using HotChocolate.Execution.Caching; using HotChocolate.Execution.Instrumentation; -using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Execution.Pipeline; diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs index a891e31e320..6355bf99f58 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs @@ -6,7 +6,6 @@ using HotChocolate.Fetching; using HotChocolate.Language; using HotChocolate.Types; -using Microsoft.Extensions.DependencyInjection; using static HotChocolate.Execution.RequestFlags; using static HotChocolate.Execution.ThrowHelper; @@ -91,7 +90,7 @@ public async ValueTask InvokeAsync( private async Task ExecuteOperationRequestAsync( RequestContext context, IBatchDispatcher batchDispatcher, - IOperation operation) + Operation operation) { if (operation.Definition.Operation is OperationType.Subscription) { @@ -114,7 +113,7 @@ await ExecuteQueryOrMutationAsync( private async Task ExecuteVariableBatchRequestAsync( RequestContext context, IBatchDispatcher batchDispatcher, - IOperation operation) + Operation operation) { if (operation.Definition.Operation is OperationType.Query) { @@ -137,7 +136,7 @@ private async Task ExecuteVariableBatchRequestAsync( private async Task ExecuteVariableBatchRequestOptimizedAsync( RequestContext context, IBatchDispatcher batchDispatcher, - IOperation operation) + Operation operation) { var variableSets = context.VariableValues; var query = GetQueryRootValue(context); @@ -182,7 +181,7 @@ await _queryExecutor.ExecuteBatchAsync( static void Initialize( RequestContext context, IBatchDispatcher batchDispatcher, - IOperation operation, + Operation operation, object? query, Span operationContexts, IVariableValueCollection variables, @@ -249,7 +248,7 @@ static void ReleaseResources( private async Task ExecuteQueryOrMutationAsync( RequestContext context, IBatchDispatcher batchDispatcher, - IOperation operation, + Operation operation, IVariableValueCollection variables) { var operationContextOwner = _contextFactory.Create(); @@ -266,15 +265,16 @@ await ExecuteQueryOrMutationAsync( variables) .ConfigureAwait(false); - if (operationContext.DeferredScheduler.HasResults) - { - var results = operationContext.DeferredScheduler.CreateResultStream(result); - var responseStream = new ResponseStream(() => results, ExecutionResultKind.DeferredResult); - responseStream.RegisterForCleanup(result); - responseStream.RegisterForCleanup(operationContextOwner); - operationContextOwner = null; - return responseStream; - } + // TODO : DEFER + // if (operationContext.DeferredScheduler.HasResults) + // { + // var results = operationContext.DeferredScheduler.CreateResultStream(result); + // var responseStream = new ResponseStream(() => results, ExecutionResultKind.DeferredResult); + // responseStream.RegisterForCleanup(result); + // responseStream.RegisterForCleanup(operationContextOwner); + // operationContextOwner = null; + // return responseStream; + // } return result; } @@ -296,7 +296,7 @@ await ExecuteQueryOrMutationAsync( private async Task ExecuteQueryOrMutationNoStreamAsync( RequestContext context, IBatchDispatcher batchDispatcher, - IOperation operation, + Operation operation, IVariableValueCollection variables, int variableIndex) { @@ -332,7 +332,7 @@ private async Task ExecuteQueryOrMutationNoStreamAsync( private async Task ExecuteQueryOrMutationAsync( RequestContext context, IBatchDispatcher batchDispatcher, - IOperation operation, + Operation operation, OperationContext operationContext, IVariableValueCollection variables, int variableIndex = -1) @@ -397,7 +397,7 @@ private async Task ExecuteQueryOrMutationAsync( Unsafe.As(context.Schema.MutationType)!, ref _cachedMutation); - private static bool IsOperationAllowed(IOperation operation, IOperationRequest request) + private static bool IsOperationAllowed(Operation operation, IOperationRequest request) { if (request.Flags is AllowAll) { @@ -412,21 +412,24 @@ private static bool IsOperationAllowed(IOperation operation, IOperationRequest r _ => true }; - if (allowed && operation.HasIncrementalParts) - { - return allowed && (request.Flags & AllowStreams) == AllowStreams; - } + // TODO : DEFER + // if (allowed && operation.HasIncrementalParts) + // { + // return allowed && (request.Flags & AllowStreams) == AllowStreams; + // } return allowed; } private static bool IsRequestTypeAllowed( - IOperation operation, + Operation operation, IReadOnlyList? variables) { if (variables is { Count: > 1 }) { - return operation.Definition.Operation is not OperationType.Subscription && !operation.HasIncrementalParts; + // TODO : DEFER + return operation.Definition.Operation is not OperationType.Subscription; + // && !operation.HasIncrementalParts; } return true; diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationInfo.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationInfo.cs index 831ae5e3aed..15a709dea36 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationInfo.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationInfo.cs @@ -7,7 +7,7 @@ internal sealed class OperationInfo : RequestFeature { public string? Id { get; set; } - public IOperation? Operation { get; set; } + public Operation? Operation { get; set; } public OperationDefinitionNode? Definition { get; set; } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs index 660e99ded09..6efa2b63cac 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs @@ -61,8 +61,11 @@ public SelectionEnumerator GetSelections( public ISelectionCollection Select() { - var schema = Unsafe.As(_operationContext.Schema); - return new SelectionCollection(schema, Operation, [Selection], _operationContext.IncludeFlags); + return new SelectionCollection( + _operationContext.Schema, + Operation, + [Selection], + _operationContext.IncludeFlags); } public ISelectionCollection Select(string fieldName) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs index 216d6fd00cd..4c440b5b1c0 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs @@ -113,7 +113,9 @@ ISelectionSet IOperation.RootSelectionSet => RootSelectionSet; /// - public IFeatureCollection Features => _features; + public OperationFeatureCollection Features => _features; + + IFeatureCollection IFeatureProvider.Features => Features; /// /// Gets the selection set for the specified diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs index 025d3eb9600..553e910d594 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs @@ -6,7 +6,7 @@ namespace HotChocolate.Execution.Processing; [SuppressMessage("ReSharper", "NonAtomicCompoundOperator")] -internal sealed class OperationFeatureCollection : IFeatureCollection +public sealed class OperationFeatureCollection : IFeatureCollection { #if NET9_0_OR_GREATER private readonly Lock _writeLock = new(); @@ -23,7 +23,7 @@ internal sealed class OperationFeatureCollection : IFeatureCollection /// /// Initializes a new instance of . /// - public OperationFeatureCollection() + internal OperationFeatureCollection() { } @@ -85,6 +85,28 @@ public object? this[Type key] return (TFeature?)this[typeof(TFeature)]; } + public TFeature GetOrSetSafe() where TFeature : new() + => GetOrSetSafe(static () => new TFeature()); + + public TFeature GetOrSetSafe(Func factory) + { + ArgumentNullException.ThrowIfNull(factory); + + if (!TryGet(out var feature)) + { + lock (_writeLock) + { + if (!TryGet(out feature)) + { + feature = factory(); + this[typeof(TFeature)] = feature; + } + } + } + + return feature; + } + /// public bool TryGet([NotNullWhen(true)] out TFeature? feature) { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationOptimizerContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationOptimizerContext.cs index 16f6fa38373..4aaabec22ae 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationOptimizerContext.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationOptimizerContext.cs @@ -10,86 +10,31 @@ namespace HotChocolate.Execution.Processing; /// public readonly ref struct OperationOptimizerContext { - private readonly SelectionVariants[] _variants; - private readonly IncludeCondition[] _includeConditions; - private readonly ObjectType _rootType; - private readonly Dictionary _contextData; - private readonly bool _hasIncrementalParts; private readonly CreateFieldPipeline _createFieldPipeline; /// /// Initializes a new instance of /// internal OperationOptimizerContext( - string id, - DocumentNode document, - OperationDefinitionNode definition, - Schema schema, - ObjectType rootType, - SelectionVariants[] variants, - IncludeCondition[] includeConditions, + Operation operation, Dictionary contextData, - bool hasIncrementalParts, CreateFieldPipeline createFieldPipeline) { - Id = id; - Document = document; - Definition = definition; - Schema = schema; - _rootType = rootType; - _variants = variants; - _includeConditions = includeConditions; - _contextData = contextData; - _hasIncrementalParts = hasIncrementalParts; + Operation = operation; + ContextData = contextData; _createFieldPipeline = createFieldPipeline; } /// - /// Gets the internal unique identifier for this operation. + /// Gets the operation. /// - public string Id { get; } - - /// - /// Gets the parsed query document that contains the - /// operation-. - /// - public DocumentNode Document { get; } - - /// - /// Gets the syntax node representing the operation definition. - /// - public OperationDefinitionNode Definition { get; } - - /// - /// Gets the schema for which the query is compiled. - /// - public Schema Schema { get; } - - /// - /// Gets the root type on which the operation is executed. - /// - public ObjectType RootType => _rootType; - - /// - /// Gets the prepared root selections for this operation. - /// - public ISelectionSet RootSelectionSet => _variants[0].GetSelectionSet(RootType); - - /// - /// Gets all selection variants of this operation. - /// - public IReadOnlyList SelectionVariants => _variants; + public Operation Operation { get; } /// /// The context data dictionary can be used by middleware components and /// resolvers to store and retrieve data during execution. /// - public IDictionary ContextData => _contextData; - - /// - /// Defines if the operation has incremental parts. - /// - public bool HasIncrementalParts => _hasIncrementalParts; + public IDictionary ContextData { get; } /// /// Sets the resolvers on the specified . @@ -104,29 +49,21 @@ internal OperationOptimizerContext( /// The pure resolver. /// public void SetResolver( - ISelection selection, + Selection selection, FieldDelegate? resolverPipeline = null, PureFieldDelegate? pureResolver = null) - => ((Selection)selection).SetResolvers(resolverPipeline, pureResolver); + => selection.SetResolvers(resolverPipeline, pureResolver); /// /// Allows to compile the field resolver pipeline for a field. /// /// The field. - /// The selection of the field. + /// The selection of the field. /// /// Returns a representing the field resolver pipeline. /// - public FieldDelegate CompileResolverPipeline(ObjectField field, FieldNode selection) - => _createFieldPipeline(Schema, field, selection); - - /// - /// Creates a temporary operation object for the optimizer. - /// - public IOperation CreateOperation() - { - var operation = new Operation(Id, Document, Definition, _rootType, Schema); - operation.Seal(_contextData, _variants, _hasIncrementalParts, _includeConditions); - return operation; - } + public FieldDelegate CompileResolverPipeline( + ObjectField field, + FieldNode fieldSelection) + => _createFieldPipeline(Operation.Schema, field, fieldSelection); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs index 8b127c59995..2eda9295e82 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs @@ -1,5 +1,4 @@ using HotChocolate.Language; -using Microsoft.Extensions.DependencyInjection; using static HotChocolate.Execution.ErrorHelper; namespace HotChocolate.Execution.Processing; @@ -30,7 +29,7 @@ private void ApplyNonNullViolations( continue; } - var error = NonNullOutputFieldViolation(violation.Path, violation.Selection.SyntaxNode); + var error = NonNullOutputFieldViolation(violation.Path, violation.Selection.GetSyntaxNodes().First()); error = errorHandler.Handle(error); _diagnosticEvents.ResolverError(_context, violation.Selection, error); errors.Add(error); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index 1d44a51e445..f4538b26dfe 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -82,6 +82,11 @@ internal Selection( public bool IsLeaf => (_flags & Flags.Leaf) == Flags.Leaf; + /// + /// Defines if this selection has child selections. + /// + public bool HasSelections => !IsLeaf; + public ObjectField Field { get; } /// diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionCollection.cs index 6a7370dfe04..4729fb96bde 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionCollection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionCollection.cs @@ -10,20 +10,34 @@ namespace HotChocolate.Execution.Processing; -internal sealed class SelectionCollection( - Schema schema, - IOperation operation, - ISelection[] selections, - ulong includeFlags) - : ISelectionCollection +internal sealed class SelectionCollection : ISelectionCollection { - private readonly Schema _schema = schema ?? throw new ArgumentNullException(nameof(schema)); - private readonly IOperation _operation = operation ?? throw new ArgumentNullException(nameof(operation)); - private readonly ISelection[] _selections = selections ?? throw new ArgumentNullException(nameof(selections)); + private readonly Schema _schema; + private readonly Operation _operation; + private readonly Selection[] _selections; + private readonly ulong _includeFlags; + + public SelectionCollection( + Schema schema, + Operation operation, + Selection[] selections, + ulong includeFlags) + { + ArgumentNullException.ThrowIfNull(schema); + ArgumentNullException.ThrowIfNull(operation); + ArgumentNullException.ThrowIfNull(selections); + + _includeFlags = includeFlags; + _schema = schema; + _operation = operation; + _selections = selections; + } public int Count => _selections.Length; - public ISelection this[int index] => _selections[index]; + public Selection this[int index] => _selections[index]; + + ISelection IReadOnlyList.this[int index] => _selections[index]; public ISelectionCollection Select(string fieldName) { @@ -31,26 +45,26 @@ public ISelectionCollection Select(string fieldName) if (!CollectSelections(fieldName, out var buffer, out var size)) { - return new SelectionCollection(_schema, _operation, [], includeFlags); + return new SelectionCollection(_schema, _operation, [], _includeFlags); } - var selections = new ISelection[size]; + var selections = new Selection[size]; buffer.AsSpan()[..size].CopyTo(selections); - ArrayPool.Shared.Return(buffer); - return new SelectionCollection(_schema, _operation, selections, includeFlags); + ArrayPool.Shared.Return(buffer); + return new SelectionCollection(_schema, _operation, selections, _includeFlags); } public ISelectionCollection Select(ReadOnlySpan fieldNames) { if (!CollectSelections(fieldNames, out var buffer, out var size)) { - return new SelectionCollection(_schema, _operation, [], includeFlags); + return new SelectionCollection(_schema, _operation, [], _includeFlags); } - var selections = new ISelection[size]; + var selections = new Selection[size]; buffer.AsSpan()[..size].CopyTo(selections); - ArrayPool.Shared.Return(buffer); - return new SelectionCollection(_schema, _operation, selections, includeFlags); + ArrayPool.Shared.Return(buffer); + return new SelectionCollection(_schema, _operation, selections, _includeFlags); } public ISelectionCollection Select(ITypeDefinition typeContext) @@ -59,13 +73,13 @@ public ISelectionCollection Select(ITypeDefinition typeContext) if (!CollectSelections(typeContext, out var buffer, out var size)) { - return new SelectionCollection(_schema, _operation, [], includeFlags); + return new SelectionCollection(_schema, _operation, [], _includeFlags); } - var selections = new ISelection[size]; + var selections = new Selection[size]; buffer.AsSpan()[..size].CopyTo(selections); - ArrayPool.Shared.Return(buffer); - return new SelectionCollection(_schema, _operation, selections, includeFlags); + ArrayPool.Shared.Return(buffer); + return new SelectionCollection(_schema, _operation, selections, _includeFlags); } public bool IsSelected(string fieldName) @@ -90,7 +104,7 @@ public bool IsSelected(string fieldName) { if (IsChildSelected( _operation, - includeFlags, + _includeFlags, possibleType, start, fieldName)) @@ -103,7 +117,7 @@ public bool IsSelected(string fieldName) { if (IsChildSelected( _operation, - includeFlags, + _includeFlags, Unsafe.As(ref namedType), start, fieldName)) @@ -118,27 +132,22 @@ public bool IsSelected(string fieldName) return false; static bool IsChildSelected( - IOperation operation, + Operation operation, ulong includeFlags, ObjectType objectType, - ISelection parent, + Selection parent, string fieldName) { var selectionSet = operation.GetSelectionSet(parent, objectType); var operationIncludeFlags = includeFlags; - var selectionCount = selectionSet.Selections.Count; - ref var start = ref Unsafe.As(ref selectionSet).GetSelectionsReference(); - ref var end = ref Unsafe.Add(ref start, selectionCount); - while (Unsafe.IsAddressLessThan(ref start, ref end)) + foreach (var child in selectionSet.Selections) { - if (start.IsIncluded(operationIncludeFlags) - && fieldName.EqualsOrdinal(start.Field.Name)) + if (child.IsIncluded(operationIncludeFlags) + && fieldName.EqualsOrdinal(child.Field.Name)) { return true; } - - start = ref Unsafe.Add(ref start, 1)!; } return false; @@ -168,7 +177,7 @@ public bool IsSelected(string fieldName1, string fieldName2) { if (IsChildSelected( _operation, - includeFlags, + _includeFlags, possibleType, start, fieldName1, @@ -182,7 +191,7 @@ public bool IsSelected(string fieldName1, string fieldName2) { if (IsChildSelected( _operation, - includeFlags, + _includeFlags, Unsafe.As(ref namedType), start, fieldName1, @@ -198,29 +207,25 @@ public bool IsSelected(string fieldName1, string fieldName2) return false; static bool IsChildSelected( - IOperation operation, + Operation operation, ulong includeFlags, ObjectType objectType, - ISelection parent, + Selection parent, string fieldName1, string fieldName2) { var selectionSet = operation.GetSelectionSet(parent, objectType); var operationIncludeFlags = includeFlags; - var selectionCount = selectionSet.Selections.Count; - ref var start = ref Unsafe.As(ref selectionSet).GetSelectionsReference(); - ref var end = ref Unsafe.Add(ref start, selectionCount); + var selections = selectionSet.Selections; - while (Unsafe.IsAddressLessThan(ref start, ref end)) + foreach (var selection in selections) { - if (start.IsIncluded(operationIncludeFlags) - && (fieldName1.EqualsOrdinal(start.Field.Name) - || fieldName2.EqualsOrdinal(start.Field.Name))) + if (selection.IsIncluded(operationIncludeFlags) + && (fieldName1.EqualsOrdinal(selection.Field.Name) + || fieldName2.EqualsOrdinal(selection.Field.Name))) { return true; } - - start = ref Unsafe.Add(ref start, 1)!; } return false; @@ -251,7 +256,7 @@ public bool IsSelected(string fieldName1, string fieldName2, string fieldName3) { if (IsChildSelected( _operation, - includeFlags, + _includeFlags, possibleType, start, fieldName1, @@ -266,7 +271,7 @@ public bool IsSelected(string fieldName1, string fieldName2, string fieldName3) { if (IsChildSelected( _operation, - includeFlags, + _includeFlags, Unsafe.As(ref namedType), start, fieldName1, @@ -283,31 +288,27 @@ public bool IsSelected(string fieldName1, string fieldName2, string fieldName3) return false; static bool IsChildSelected( - IOperation operation, + Operation operation, ulong includeFlags, ObjectType objectType, - ISelection parent, + Selection parent, string fieldName1, string fieldName2, string fieldName3) { var selectionSet = operation.GetSelectionSet(parent, objectType); var operationIncludeFlags = includeFlags; - var selectionCount = selectionSet.Selections.Count; - ref var start = ref Unsafe.As(ref selectionSet).GetSelectionsReference(); - ref var end = ref Unsafe.Add(ref start, selectionCount); + var selections = selectionSet.Selections; - while (Unsafe.IsAddressLessThan(ref start, ref end)) + foreach (var selection in selections) { - if (start.IsIncluded(operationIncludeFlags) - && (fieldName1.EqualsOrdinal(start.Field.Name) - || fieldName2.EqualsOrdinal(start.Field.Name) - || fieldName3.EqualsOrdinal(start.Field.Name))) + if (selection.IsIncluded(operationIncludeFlags) + && (fieldName1.EqualsOrdinal(selection.Field.Name) + || fieldName2.EqualsOrdinal(selection.Field.Name) + || fieldName3.EqualsOrdinal(selection.Field.Name))) { return true; } - - start = ref Unsafe.Add(ref start, 1)!; } return false; @@ -334,7 +335,7 @@ public bool IsSelected(ISet fieldNames) { foreach (var possibleType in _schema.GetPossibleTypes(namedType)) { - if (IsChildSelected(_operation, includeFlags, possibleType, start, fieldNames)) + if (IsChildSelected(_operation, _includeFlags, possibleType, start, fieldNames)) { return true; } @@ -344,7 +345,7 @@ public bool IsSelected(ISet fieldNames) { if (IsChildSelected( _operation, - includeFlags, + _includeFlags, Unsafe.As(ref namedType), start, fieldNames)) @@ -359,27 +360,23 @@ public bool IsSelected(ISet fieldNames) return false; static bool IsChildSelected( - IOperation operation, + Operation operation, ulong includeFlags, ObjectType objectType, - ISelection parent, + Selection parent, ISet fieldNames) { var selectionSet = operation.GetSelectionSet(parent, objectType); var operationIncludeFlags = includeFlags; - var selectionCount = selectionSet.Selections.Count; - ref var start = ref Unsafe.As(ref selectionSet).GetSelectionsReference(); - ref var end = ref Unsafe.Add(ref start, selectionCount); + var selections = selectionSet.Selections; - while (Unsafe.IsAddressLessThan(ref start, ref end)) + foreach (var selection in selections) { - if (start.IsIncluded(operationIncludeFlags) - && fieldNames.Contains(start.Field.Name)) + if (selection.IsIncluded(operationIncludeFlags) + && fieldNames.Contains(selection.Field.Name)) { return true; } - - start = ref Unsafe.Add(ref start, 1)!; } return false; @@ -388,7 +385,7 @@ static bool IsChildSelected( private bool CollectSelections( string fieldName, - out ISelection[] buffer, + out Selection[] buffer, out int size) { var fieldNames = ArrayPool.Shared.Rent(1); @@ -402,47 +399,42 @@ private bool CollectSelections( private bool CollectSelections( ReadOnlySpan fieldNames, - out ISelection[] buffer, + out Selection[] buffer, out int size) { - buffer = ArrayPool.Shared.Rent(4); + buffer = ArrayPool.Shared.Rent(4); size = 0; - ref var start = ref MemoryMarshal.GetReference(_selections.AsSpan()); - ref var end = ref Unsafe.Add(ref start, _selections.Length); - - while (Unsafe.IsAddressLessThan(ref start, ref end)) + foreach (var selection in _selections) { - var namedType = start.Type.NamedType(); + var namedType = selection.Type.NamedType(); if (!namedType.IsCompositeType()) { - goto NEXT; + continue; } if (namedType.IsAbstractType()) { foreach (var possibleType in _schema.GetPossibleTypes(namedType)) { - var selectionSet = _operation.GetSelectionSet(start, possibleType); - CollectFields(fieldNames, includeFlags, ref buffer, selectionSet, size, out var written); + var selectionSet = _operation.GetSelectionSet(selection, possibleType); + CollectFields(fieldNames, _includeFlags, ref buffer, selectionSet, size, out var written); size += written; } } else { - var selectionSet = _operation.GetSelectionSet(start, Unsafe.As(ref namedType)); - CollectFields(fieldNames, includeFlags, ref buffer, selectionSet, size, out var written); + var objectType = Unsafe.As(ref namedType); + var selectionSet = _operation.GetSelectionSet(selection, objectType); + CollectFields(fieldNames, _includeFlags, ref buffer, selectionSet, size, out var written); size += written; } - -NEXT: - start = ref Unsafe.Add(ref start, 1)!; } if (size == 0) { - ArrayPool.Shared.Return(buffer); + ArrayPool.Shared.Return(buffer); buffer = []; } @@ -451,10 +443,10 @@ private bool CollectSelections( private bool CollectSelections( ITypeDefinition typeContext, - out ISelection[] buffer, + out Selection[] buffer, out int size) { - buffer = ArrayPool.Shared.Rent(_selections.Length); + buffer = ArrayPool.Shared.Rent(_selections.Length); size = 0; ref var start = ref MemoryMarshal.GetReference(_selections.AsSpan()); @@ -472,7 +464,7 @@ private bool CollectSelections( if (size == 0) { - ArrayPool.Shared.Return(buffer); + ArrayPool.Shared.Return(buffer); buffer = []; } @@ -482,38 +474,32 @@ private bool CollectSelections( private static void CollectFields( ReadOnlySpan fieldNames, ulong includeFlags, - ref ISelection[] buffer, - ISelectionSet selectionSet, + ref Selection[] buffer, + SelectionSet selectionSet, int index, out int written) { written = 0; - var operationIncludeFlags = includeFlags; - var selectionCount = selectionSet.Selections.Count; + var selections = selectionSet.Selections; - ref var selectionRef = ref ((SelectionSet)selectionSet).GetSelectionsReference(); - ref var end = ref Unsafe.Add(ref selectionRef, selectionCount); + EnsureCapacity(ref buffer, index, selections.Length); - EnsureCapacity(ref buffer, index, selectionCount); - - while (Unsafe.IsAddressLessThan(ref selectionRef, ref end)) + foreach (var selection in selections) { foreach (var fieldName in fieldNames) { - if (selectionRef.IsIncluded(operationIncludeFlags) - && selectionRef.Field.Name.EqualsOrdinal(fieldName)) + if (selection.IsIncluded(includeFlags) + && selection.Field.Name.EqualsOrdinal(fieldName)) { - buffer[index++] = selectionRef; + buffer[index++] = selection; written++; } } - - selectionRef = ref Unsafe.Add(ref selectionRef, 1)!; } } - private static void EnsureCapacity(ref ISelection[] buffer, int index, int requiredSpace) + private static void EnsureCapacity(ref Selection[] buffer, int index, int requiredSpace) { var capacity = buffer.Length - index; @@ -527,9 +513,9 @@ private static void EnsureCapacity(ref ISelection[] buffer, int index, int requi capacity *= 2; } - var newBuffer = ArrayPool.Shared.Rent(capacity); + var newBuffer = ArrayPool.Shared.Rent(capacity); buffer.AsSpan()[..index].CopyTo(newBuffer); - ArrayPool.Shared.Return(buffer); + ArrayPool.Shared.Return(buffer); buffer = newBuffer; } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionLookup.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionLookup.cs index 3986a6aab5a..e6614d3827f 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionLookup.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionLookup.cs @@ -19,7 +19,7 @@ private SelectionLookup(Entry[] table, int seed, int mask) public static SelectionLookup Create(SelectionSet selectionSet) { var selections = selectionSet.Selections; - var tableSize = NextPowerOfTwo(Math.Max(selections.Count * 2, 4)); + var tableSize = NextPowerOfTwo(Math.Max(selections.Length * 2, 4)); var mask = tableSize - 1; var table = new Entry[tableSize]; @@ -82,7 +82,7 @@ public static SelectionLookup Create(SelectionSet selectionSet) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool TryGetSelection(ReadOnlySpan name, [NotNullWhen(true)] out ISelection? selection) + public bool TryGetSelection(ReadOnlySpan name, [NotNullWhen(true)] out Selection? selection) { var table = _table.AsSpan(); @@ -148,9 +148,9 @@ private static int NextPowerOfTwo(int n) return n; } - private readonly struct Entry(int hashCode, ISelection selection) + private readonly struct Entry(int hashCode, Selection selection) { public readonly int HashCode = hashCode; - public readonly ISelection? Selection = selection; + public readonly Selection? Selection = selection; } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs index 6968ad6a7a3..39af1b52e5a 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs @@ -62,7 +62,7 @@ public SelectionSet(int id, IObjectTypeDefinition type, Selection[] selections, public ReadOnlySpan Selections => _selections; IEnumerable ISelectionSet.GetSelections() => _selections; - + internal void Complete(Operation declaringOperation, bool seal) { if ((_flags & Flags.Sealed) == Flags.Sealed) @@ -74,10 +74,13 @@ internal void Complete(Operation declaringOperation, bool seal) foreach (var selection in _selections) { - selection.Complete(declaringOperation, this); + selection.Complete(this, seal); } - _flags |= Flags.Sealed; + if (seal) + { + _flags |= Flags.Sealed; + } } /// diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs index ce8e84a3630..e10abc1e2a5 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs @@ -36,7 +36,7 @@ public async Task ExecuteAsync( var operation = requestContext.GetOperation(); var selectionSet = operation.RootSelectionSet; - if (selectionSet.Selections.Count != 1) + if (selectionSet.Selections.Length != 1) { throw SubscriptionExecutor_SubscriptionsMustHaveOneField(); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs index 441f034c9e7..112df731c60 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs @@ -91,7 +91,7 @@ private async ValueTask TryExecuteAsync(CancellationToken cancellationToke // signal that this resolver task has errors and shall end. if (Selection.Arguments.HasErrors) { - foreach (var argument in Selection.Arguments) + foreach (var argument in Selection.Arguments.ArgumentValues) { if (argument.HasError) { @@ -157,12 +157,13 @@ private async ValueTask ExecuteResolverPipelineAsync(CancellationToken cancellat return; } - if (_selection.IsList && _selection.HasStreamDirective(_operationContext.IncludeFlags)) - { - var stream = postProcessor.ToStreamResultAsync(result, cancellationToken); - _context.Result = await CreateStreamResultAsync(stream).ConfigureAwait(false); - return; - } + // TODO: DEFER + // if (_selection.IsList && _selection.HasStreamDirective(_operationContext.IncludeFlags)) + // { + // var stream = postProcessor.ToStreamResultAsync(result, cancellationToken); + // _context.Result = await CreateStreamResultAsync(stream).ConfigureAwait(false); + // return; + // } _context.Result = await postProcessor.ToCompletionResultAsync(result, cancellationToken).ConfigureAwait(false); } @@ -199,8 +200,10 @@ private async ValueTask ExecuteResolverPipelineAsync(CancellationToken cancellat if (next) { + // TODO : DEFER // if the stream has more items than the initial requested items then we will // defer the rest of the stream. + /* _operationContext.DeferredScheduler.Register( new DeferredStream( Selection, @@ -211,6 +214,7 @@ private async ValueTask ExecuteResolverPipelineAsync(CancellationToken cancellat enumerator, _context.ScopedContextData), _context.ParentResult); + */ } return list; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs index b6203dc5395..a5d30fe42a4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs @@ -9,7 +9,7 @@ internal sealed partial class ResolverTask /// public void Initialize( OperationContext operationContext, - ISelection selection, + Selection selection, ObjectResult parentResult, int responseIndex, object? parent, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs index 21a20cc2830..4b19453a6e7 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs @@ -10,7 +10,7 @@ internal sealed partial class ResolverTask(ObjectPool objectPool) private readonly List _taskBuffer = []; private readonly Dictionary _args = new(StringComparer.Ordinal); private OperationContext _operationContext = null!; - private ISelection _selection = null!; + private Selection _selection = null!; private ExecutionTaskStatus _completionStatus = ExecutionTaskStatus.Completed; private Task? _task; @@ -32,7 +32,7 @@ internal sealed partial class ResolverTask(ObjectPool objectPool) /// /// Gets the selection for which a resolver is executed. /// - internal ISelection Selection => _selection; + internal Selection Selection => _selection; /// public ExecutionTaskKind Kind @@ -73,8 +73,4 @@ public void BeginExecute(CancellationToken cancellationToken) Status = ExecutionTaskStatus.Running; _task = ExecuteAsync(cancellationToken); } - - /// - public Task WaitForCompletionAsync(CancellationToken cancellationToken) - => _task ?? Task.CompletedTask; } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs index 46066fe111b..973ef1e29e5 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs @@ -1,6 +1,5 @@ using System.Collections.Immutable; using System.Diagnostics; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using HotChocolate.Types; using static HotChocolate.Execution.Processing.PathHelper; @@ -16,13 +15,14 @@ static ResolverTaskFactory() { } public static ObjectResult EnqueueResolverTasks( OperationContext operationContext, - ISelectionSet selectionSet, + SelectionSet selectionSet, object? parent, Path path, IImmutableDictionary scopedContext, ObjectResult? parentResult = null) { - var selectionsCount = selectionSet.Selections.Count; + var selections = selectionSet.Selections; + var selectionsCount = selections.Length; var responseIndex = selectionsCount; parentResult ??= operationContext.Result.RentObject(selectionsCount); var scheduler = operationContext.Scheduler; @@ -34,8 +34,6 @@ public static ObjectResult EnqueueResolverTasks( try { - ref var selectionSpace = ref ((SelectionSet)selectionSet).GetSelectionsReference(); - // we are iterating reverse so that in the case of a mutation the first // synchronous root selection is executed first, since the work scheduler // is using two stacks one for parallel work and one for synchronous work. @@ -44,7 +42,7 @@ public static ObjectResult EnqueueResolverTasks( // guarantees while executing efficient. for (var i = selectionsCount - 1; i >= 0; i--) { - ref var selection = ref Unsafe.Add(ref selectionSpace, i); + var selection = selections[i]; if (final || selection.IsIncluded(includeFlags)) { @@ -69,17 +67,6 @@ public static ObjectResult EnqueueResolverTasks( scheduler.Register(CollectionsMarshal.AsSpan(bufferedTasks)); } - if (selectionSet.Fragments.Count > 0) - { - TryHandleDeferredFragments( - operationContext, - selectionSet, - scopedContext, - path, - parent, - parentResult); - } - return parentResult; } finally @@ -144,10 +131,11 @@ public static ResolverTask EnqueueElementTasks( ResultData parentResult, int parentIndex, object parent, - ISelectionSet selectionSet) + SelectionSet selectionSet) { var responseIndex = 0; - var selectionsCount = selectionSet.Selections.Count; + var selections = selectionSet.Selections; + var selectionsCount = selections.Length; var operationContext = context.OperationContext; var result = operationContext.Result.RentObject(selectionsCount); var includeFlags = operationContext.IncludeFlags; @@ -155,10 +143,7 @@ public static ResolverTask EnqueueElementTasks( result.SetParent(parentResult, parentIndex); - ref var selection = ref ((SelectionSet)selectionSet).GetSelectionsReference(); - ref var end = ref Unsafe.Add(ref selection, selectionsCount); - - while (Unsafe.IsAddressLessThan(ref selection, ref end)) + foreach (var selection in selections) { if (result.IsInvalidated) { @@ -167,7 +152,7 @@ public static ResolverTask EnqueueElementTasks( if (!final && !selection.IsIncluded(includeFlags)) { - goto NEXT; + continue; } if (selection.Strategy is SelectionExecutionStrategy.Pure) @@ -190,20 +175,6 @@ public static ResolverTask EnqueueElementTasks( responseIndex++, context.ResolverContext.ScopedContextData)); } - -NEXT: - selection = ref Unsafe.Add(ref selection, 1)!; - } - - if (selectionSet.Fragments.Count > 0) - { - TryHandleDeferredFragments( - operationContext, - selectionSet, - context.ResolverContext.ScopedContextData, - CreatePathFromContext(result), - parent, - result); } return result.IsInvalidated ? null : result; @@ -211,7 +182,7 @@ public static ResolverTask EnqueueElementTasks( private static void ResolveAndCompleteInline( ValueCompletionContext context, - ISelection selection, + Selection selection, int responseIndex, ObjectType parentType, object parent, @@ -332,34 +303,6 @@ private static void CommitValue( } } - private static void TryHandleDeferredFragments( - OperationContext operationContext, - ISelectionSet selectionSet, - IImmutableDictionary scopedContext, - Path path, - object? parent, - ObjectResult parentResult) - { - var fragments = selectionSet.Fragments; - var includeFlags = operationContext.IncludeFlags; - - for (var i = 0; i < fragments.Count; i++) - { - var fragment = fragments[i]; - if (!fragment.IsConditional || fragment.IsIncluded(includeFlags)) - { - operationContext.DeferredScheduler.Register( - new DeferredFragment( - fragment, - fragment.GetLabel(operationContext.Variables), - path, - parent, - scopedContext), - parentResult); - } - } - } - private sealed class NoOpExecutionTask(OperationContext context) : ExecutionTask { protected override IExecutionTaskContext Context { get; } = context; diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index 2d0e7d9066a..a16f3d639cd 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -195,6 +195,18 @@ OperationContext.cs + + + ResolverTask.cs + + + + ResolverTask.cs + + + + ResolverTask.cs + diff --git a/src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/OperationParameterExpressionBuilder.cs b/src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/OperationParameterExpressionBuilder.cs index 06cc6ce1d09..0598c766c67 100644 --- a/src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/OperationParameterExpressionBuilder.cs +++ b/src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/OperationParameterExpressionBuilder.cs @@ -1,13 +1,14 @@ using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; +using HotChocolate.Execution; using HotChocolate.Execution.Processing; using HotChocolate.Internal; namespace HotChocolate.Resolvers.Expressions.Parameters; internal sealed class OperationParameterExpressionBuilder() - : LambdaParameterExpressionBuilder(ctx => ctx.Operation, isPure: true) + : LambdaParameterExpressionBuilder(ctx => ctx.Operation, isPure: true) , IParameterBindingFactory , IParameterBinding { @@ -15,10 +16,12 @@ public override ArgumentKind Kind => ArgumentKind.Operation; public override bool CanHandle(ParameterInfo parameter) - => typeof(IOperation) == parameter.ParameterType; + => typeof(IOperation) == parameter.ParameterType + || typeof(Operation) == parameter.ParameterType; public bool CanHandle(ParameterDescriptor parameter) - => typeof(IOperation) == parameter.Type; + => typeof(IOperation) == parameter.Type + || typeof(Operation) == parameter.Type; public IParameterBinding Create(ParameterDescriptor parameter) => this; @@ -27,6 +30,6 @@ public T Execute(IResolverContext context) { Debug.Assert(typeof(IOperation).IsAssignableFrom(typeof(T))); var operation = context.Operation; - return Unsafe.As(ref operation); + return Unsafe.As(ref operation); } } From a96af9a67125c4246358b3cb8c03d7459a75aead Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Mon, 1 Dec 2025 23:34:54 +0100 Subject: [PATCH 014/144] wip --- .../src/Authorization/AuthorizeMiddleware.cs | 2 +- .../ErrorBuilderExtensions.cs | 3 +- ...fsetPaginationResolverContextExtensions.cs | 7 +- .../Processing/FieldSelectionNode.cs | 14 + .../Execution/Processing/IncludeCondition.cs | 153 ++ .../Processing/IncludeConditionCollection.cs | 50 + .../Execution/Processing/OperationCompiler.cs | 208 --- .../Processing/OperationContext.Execution.cs | 2 +- .../Processing/OperationContextOwner.cs | 7 +- .../Types/Execution/Processing/Selection.cs | 13 - .../Processing/Tasks/ResolverTaskFactory.cs | 2 +- .../Execution/Processing/Utf8StringCache.cs | 15 + .../Core/src/Types/HotChocolate.Types.csproj | 10 +- .../Core/src/Validation/ErrorHelper.cs | 1295 ++++++++--------- 14 files changed, 849 insertions(+), 932 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/FieldSelectionNode.cs create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/IncludeCondition.cs create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/IncludeConditionCollection.cs create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Utf8StringCache.cs diff --git a/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs b/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs index 0a5aa008ea1..e7de30d536b 100644 --- a/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs +++ b/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs @@ -69,7 +69,7 @@ private void SetError( .SetMessage(AuthorizeMiddleware_NoDefaultPolicy) .SetCode(ErrorCodes.Authentication.NoDefaultPolicy) .SetPath(context.Path) - .AddLocation(context.Selection.SyntaxNode) + .AddLocations(context.Selection.SyntaxNodes) .Build(), AuthorizeResult.PolicyNotFound => ErrorBuilder.New() diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs b/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs index 9c4d6c88050..eb9d4a2843b 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Globalization; using HotChocolate.Language; @@ -40,7 +41,7 @@ public ErrorBuilder SetInputPath(Path inputPath) /// The format of the message. /// The arguments for the message. /// The error builder. - public ErrorBuilder SetMessage(string format, params object[] args) + public ErrorBuilder SetMessage([StringSyntax("CompositeFormat")] string format, params object?[] args) { ArgumentNullException.ThrowIfNull(builder); ArgumentException.ThrowIfNullOrEmpty(format); diff --git a/src/HotChocolate/Core/src/Types.OffsetPagination/Extensions/OffsetPaginationResolverContextExtensions.cs b/src/HotChocolate/Core/src/Types.OffsetPagination/Extensions/OffsetPaginationResolverContextExtensions.cs index 63f5829a6a9..089dccdd442 100644 --- a/src/HotChocolate/Core/src/Types.OffsetPagination/Extensions/OffsetPaginationResolverContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types.OffsetPagination/Extensions/OffsetPaginationResolverContextExtensions.cs @@ -23,13 +23,8 @@ public static bool IsTotalCountSelected(this IResolverContext context) var selectionSet = context.Selection.DeclaringOperation.GetSelectionSet(context.Selection, objectType); foreach (var selection in selectionSet.Selections) - { )) - - } - - for (var i = 0; i < selections.Count; i++) { - if (selections[i].Field.Name is OffsetPagingFieldNames.TotalCount) + if (selection.Field.Name is OffsetPagingFieldNames.TotalCount) { return true; } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/FieldSelectionNode.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/FieldSelectionNode.cs new file mode 100644 index 00000000000..f5964f13f64 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/FieldSelectionNode.cs @@ -0,0 +1,14 @@ +using HotChocolate.Language; + +namespace HotChocolate.Execution.Processing; + +/// +/// Represents a field selection node with its path include flags. +/// +/// +/// The syntax node that represents the field selection. +/// +/// +/// The flags that must be all set for this selection to be included. +/// +public sealed record FieldSelectionNode(FieldNode Node, ulong PathIncludeFlags); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/IncludeCondition.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/IncludeCondition.cs new file mode 100644 index 00000000000..f59672de25a --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/IncludeCondition.cs @@ -0,0 +1,153 @@ +using System.Diagnostics.CodeAnalysis; +using HotChocolate.Language; +using HotChocolate.Types; + +namespace HotChocolate.Execution.Processing; + +internal readonly struct IncludeCondition : IEquatable +{ + private readonly string? _skip; + private readonly string? _include; + + public IncludeCondition(string? skip, string? include) + { + _skip = skip; + _include = include; + } + + public string? Skip => _skip; + + public string? Include => _include; + + public bool IsIncluded(IVariableValueCollection variableValues) + { + if (_skip is not null) + { + if (!variableValues.TryGetValue(_skip, out var value)) + { + throw new InvalidOperationException($"The variable {_skip} has an invalid value."); + } + + if (value.Value) + { + return false; + } + } + + if (_include is not null) + { + if (!variableValues.TryGetValue(_include, out var value)) + { + throw new InvalidOperationException($"The variable {_include} has an invalid value."); + } + + if (!value.Value) + { + return false; + } + } + + return true; + } + + public bool Equals(IncludeCondition other) + => string.Equals(Skip, other.Skip, StringComparison.Ordinal) + && string.Equals(Include, other.Include, StringComparison.Ordinal); + + public override bool Equals([NotNullWhen(true)] object? obj) + => obj is IncludeCondition other && Equals(other); + + public override int GetHashCode() + => HashCode.Combine(Skip, Include); + + public static bool TryCreate(FieldNode field, out IncludeCondition includeCondition) + => TryCreate(field.Directives, out includeCondition); + + public static bool TryCreate(InlineFragmentNode inlineFragment, out IncludeCondition includeCondition) + => TryCreate(inlineFragment.Directives, out includeCondition); + + private static bool TryCreate(IReadOnlyList directives, out IncludeCondition includeCondition) + { + string? skip = null; + string? include = null; + + if (directives.Count == 0) + { + includeCondition = default; + return false; + } + + if (directives.Count == 1) + { + TryParseDirective(directives[0], ref skip, ref include); + if (TryCreateIncludeCondition(out includeCondition)) + { + return true; + } + } + + if (directives.Count == 2) + { + TryParseDirective(directives[0], ref skip, ref include); + TryParseDirective(directives[1], ref skip, ref include); + return TryCreateIncludeCondition(out includeCondition); + } + + if (directives.Count == 3) + { + TryParseDirective(directives[0], ref skip, ref include); + TryParseDirective(directives[1], ref skip, ref include); + + if (skip is not null && include is not null) + { + includeCondition = new IncludeCondition(skip, include); + return true; + } + + TryParseDirective(directives[2], ref skip, ref include); + return TryCreateIncludeCondition(out includeCondition); + } + + for (var i = 0; i < directives.Count; i++) + { + TryParseDirective(directives[i], ref skip, ref include); + + if (skip is not null && include is not null) + { + includeCondition = new IncludeCondition(skip, include); + return true; + } + } + + includeCondition = default; + return false; + + bool TryCreateIncludeCondition(out IncludeCondition includeCondition) + { + if (skip is not null || include is not null) + { + includeCondition = new IncludeCondition(skip, include); + return true; + } + + includeCondition = default; + return false; + } + } + + private static void TryParseDirective(DirectiveNode directive, ref string? skip, ref string? include) + { + if (directive.Name.Value.Equals(DirectiveNames.Skip.Name, StringComparison.Ordinal) + && directive.Arguments.Count == 1 + && directive.Arguments[0].Value is VariableNode skipVariable) + { + skip = skipVariable.Name.Value; + } + else if (directive.Name.Value.Equals(DirectiveNames.Include.Name, StringComparison.Ordinal) + && directive.Arguments.Count == 1 + && directive.Arguments[0].Value is VariableNode includeVariable) + { + include = includeVariable.Name.Value; + } + } +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/IncludeConditionCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/IncludeConditionCollection.cs new file mode 100644 index 00000000000..f9cbbdd292f --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/IncludeConditionCollection.cs @@ -0,0 +1,50 @@ +using System.Collections; + +namespace HotChocolate.Execution.Processing; + +internal class IncludeConditionCollection : ICollection +{ + private readonly OrderedDictionary _dictionary = []; + + public IncludeCondition this[int index] + => _dictionary.GetAt(index).Key; + + public int Count => _dictionary.Count; + + public bool IsReadOnly => false; + + public bool Add(IncludeCondition item) + { + if (_dictionary.Count == 64) + { + throw new InvalidOperationException( + "The maximum number of include conditions has been reached."); + } + + return _dictionary.TryAdd(item, _dictionary.Count); + } + + void ICollection.Add(IncludeCondition item) + => Add(item); + + public bool Remove(IncludeCondition item) + => throw new InvalidOperationException("This is an add only collection."); + + void ICollection.Clear() + => throw new InvalidOperationException("This is an add only collection."); + + public bool Contains(IncludeCondition item) + => _dictionary.ContainsKey(item); + + public int IndexOf(IncludeCondition item) + => _dictionary.GetValueOrDefault(item, -1); + + public void CopyTo(IncludeCondition[] array, int arrayIndex) + => _dictionary.Keys.CopyTo(array, arrayIndex); + + public IEnumerator GetEnumerator() + => _dictionary.Keys.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() + => GetEnumerator(); +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 33caee22385..e83d352bbb0 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -1,6 +1,4 @@ using System.Buffers; -using System.Collections; -using System.Diagnostics.CodeAnalysis; using HotChocolate.Fusion.Rewriters; using HotChocolate.Language; using HotChocolate.Language.Visitors; @@ -436,209 +434,3 @@ public void Register(object element, int id) } } } - -/// -/// Represents a field selection node with its path include flags. -/// -/// -/// The syntax node that represents the field selection. -/// -/// -/// The flags that must be all set for this selection to be included. -/// -public sealed record FieldSelectionNode(FieldNode Node, ulong PathIncludeFlags); - -internal class IncludeConditionCollection : ICollection -{ - private readonly OrderedDictionary _dictionary = []; - - public IncludeCondition this[int index] - => _dictionary.GetAt(index).Key; - - public int Count => _dictionary.Count; - - public bool IsReadOnly => false; - - public bool Add(IncludeCondition item) - { - if (_dictionary.Count == 64) - { - throw new InvalidOperationException( - "The maximum number of include conditions has been reached."); - } - - return _dictionary.TryAdd(item, _dictionary.Count); - } - - void ICollection.Add(IncludeCondition item) - => Add(item); - - public bool Remove(IncludeCondition item) - => throw new InvalidOperationException("This is an add only collection."); - - void ICollection.Clear() - => throw new InvalidOperationException("This is an add only collection."); - - public bool Contains(IncludeCondition item) - => _dictionary.ContainsKey(item); - - public int IndexOf(IncludeCondition item) - => _dictionary.GetValueOrDefault(item, -1); - - public void CopyTo(IncludeCondition[] array, int arrayIndex) - => _dictionary.Keys.CopyTo(array, arrayIndex); - - public IEnumerator GetEnumerator() - => _dictionary.Keys.GetEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() - => GetEnumerator(); -} - -internal readonly struct IncludeCondition : IEquatable -{ - private readonly string? _skip; - private readonly string? _include; - - public IncludeCondition(string? skip, string? include) - { - _skip = skip; - _include = include; - } - - public string? Skip => _skip; - - public string? Include => _include; - - public bool IsIncluded(IVariableValueCollection variableValues) - { - if (_skip is not null) - { - if (!variableValues.TryGetValue(_skip, out var value)) - { - throw new InvalidOperationException($"The variable {_skip} has an invalid value."); - } - - if (value.Value) - { - return false; - } - } - - if (_include is not null) - { - if (!variableValues.TryGetValue(_include, out var value)) - { - throw new InvalidOperationException($"The variable {_include} has an invalid value."); - } - - if (!value.Value) - { - return false; - } - } - - return true; - } - - public bool Equals(IncludeCondition other) - => string.Equals(Skip, other.Skip, StringComparison.Ordinal) - && string.Equals(Include, other.Include, StringComparison.Ordinal); - - public override bool Equals([NotNullWhen(true)] object? obj) - => obj is IncludeCondition other && Equals(other); - - public override int GetHashCode() - => HashCode.Combine(Skip, Include); - - public static bool TryCreate(FieldNode field, out IncludeCondition includeCondition) - => TryCreate(field.Directives, out includeCondition); - - public static bool TryCreate(InlineFragmentNode inlineFragment, out IncludeCondition includeCondition) - => TryCreate(inlineFragment.Directives, out includeCondition); - - private static bool TryCreate(IReadOnlyList directives, out IncludeCondition includeCondition) - { - string? skip = null; - string? include = null; - - if (directives.Count == 0) - { - includeCondition = default; - return false; - } - - if (directives.Count == 1) - { - TryParseDirective(directives[0], ref skip, ref include); - if (TryCreateIncludeCondition(out includeCondition)) - { - return true; - } - } - - if (directives.Count == 2) - { - TryParseDirective(directives[0], ref skip, ref include); - TryParseDirective(directives[1], ref skip, ref include); - return TryCreateIncludeCondition(out includeCondition); - } - - if (directives.Count == 3) - { - TryParseDirective(directives[0], ref skip, ref include); - TryParseDirective(directives[1], ref skip, ref include); - - if (skip is not null && include is not null) - { - includeCondition = new IncludeCondition(skip, include); - return true; - } - - TryParseDirective(directives[2], ref skip, ref include); - return TryCreateIncludeCondition(out includeCondition); - } - - for (var i = 0; i < directives.Count; i++) - { - TryParseDirective(directives[i], ref skip, ref include); - - if (skip is not null && include is not null) - { - includeCondition = new IncludeCondition(skip, include); - return true; - } - } - - includeCondition = default; - return false; - - bool TryCreateIncludeCondition(out IncludeCondition includeCondition) - { - if (skip is not null || include is not null) - { - includeCondition = new IncludeCondition(skip, include); - return true; - } - - includeCondition = default; - return false; - } - } - - private static void TryParseDirective(DirectiveNode directive, ref string? skip, ref string? include) - { - if (directive.Name.Value.Equals(DirectiveNames.Skip.Name, StringComparison.Ordinal) - && directive.Arguments.Count == 1 - && directive.Arguments[0].Value is VariableNode skipVariable) - { - skip = skipVariable.Name.Value; - } - else if (directive.Name.Value.Equals(DirectiveNames.Include.Name, StringComparison.Ordinal) - && directive.Arguments.Count == 1 - && directive.Arguments[0].Value is VariableNode includeVariable) - { - include = includeVariable.Name.Value; - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs index 6e74fb6e5ea..3fca2464889 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs @@ -43,7 +43,7 @@ public RequestContext RequestContext } public ResolverTask CreateResolverTask( - ISelection selection, + Selection selection, object? parent, ObjectResult parentResult, int responseIndex, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContextOwner.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContextOwner.cs index ae26c204bad..c0aa82e3049 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContextOwner.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContextOwner.cs @@ -4,12 +4,15 @@ namespace HotChocolate.Execution.Processing; /// +/// /// The operation context owner abstracts the interaction of resolving of -/// an instance from its pool and returning to to +/// an instance from its pool and returning to /// the pool through the implementation of . -/// +/// +/// /// In some cases its desirable to not call dispose and abandon a pooled /// . +/// /// internal sealed class OperationContextOwner : IDisposable { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index f4538b26dfe..cd95444549b 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -1,7 +1,4 @@ using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Text; -using HotChocolate.Caching.Memory; using HotChocolate.Execution.Properties; using HotChocolate.Language; using HotChocolate.Resolvers; @@ -267,13 +264,3 @@ public Sealed( } } } - -internal static class Utf8StringCache -{ - private static readonly Encoding s_utf8 = Encoding.UTF8; - private static readonly Cache s_cache = new(capacity: 4 * 1024); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static byte[] GetUtf8String(string s) - => s_cache.GetOrCreate(s, static k => s_utf8.GetBytes(k)); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs index 973ef1e29e5..420df73c557 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs @@ -78,7 +78,7 @@ public static ObjectResult EnqueueResolverTasks( public static ResolverTask EnqueueElementTasks( OperationContext operationContext, - ISelection selection, + Selection selection, object? parent, Path path, int index, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Utf8StringCache.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Utf8StringCache.cs new file mode 100644 index 00000000000..330f0c33daf --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Utf8StringCache.cs @@ -0,0 +1,15 @@ +using System.Runtime.CompilerServices; +using System.Text; +using HotChocolate.Caching.Memory; + +namespace HotChocolate.Execution.Processing; + +internal static class Utf8StringCache +{ + private static readonly Encoding s_utf8 = Encoding.UTF8; + private static readonly Cache s_cache = new(capacity: 4 * 1024); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte[] GetUtf8String(string s) + => s_cache.GetOrCreate(s, static k => s_utf8.GetBytes(k)); +} diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index a16f3d639cd..7b3d5a23453 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -46,7 +46,6 @@ - @@ -65,19 +64,18 @@ - - - - - + + + + diff --git a/src/HotChocolate/Core/src/Validation/ErrorHelper.cs b/src/HotChocolate/Core/src/Validation/ErrorHelper.cs index 415369aa554..daaadbe780f 100644 --- a/src/HotChocolate/Core/src/Validation/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Validation/ErrorHelper.cs @@ -6,763 +6,672 @@ namespace HotChocolate.Validation; internal static class ErrorHelper { - public static IError VariableNotUsed( - this DocumentValidatorContext context, - OperationDefinitionNode node, - IEnumerable unusedVariables) - { - return ErrorBuilder.New() - .SetMessage( - "The following variables were not used: " - + $"{string.Join(", ", unusedVariables)}.") - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SpecifiedBy("sec-All-Variables-Used") - .Build(); - } - - public static IError VariableNotDeclared( - this DocumentValidatorContext context, - OperationDefinitionNode node, - IEnumerable usedVariables) - { - return ErrorBuilder.New() - .SetMessage( - "The following variables were not declared: " - + $"{string.Join(", ", usedVariables)}.") - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SpecifiedBy("sec-All-Variable-Uses-Defined") - .Build(); - } - - public static IError OneOfVariableIsNotCompatible( - this DocumentValidatorContext context, - VariableNode variable, - VariableDefinitionNode variableDefinition) - { - var variableName = variableDefinition.Variable.Name.Value; - - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_OneOfVariableIsNotCompatible, - variableName) - .AddLocation(variable) - .SetPath(context.CreateErrorPath()) - .SetExtension("variable", variableName) - .SpecifiedBy("sec-All-Variable-Usages-are-Allowed") - .Build(); - } - - public static IError VariableIsNotCompatible( - this DocumentValidatorContext context, - VariableNode variable, - VariableDefinitionNode variableDefinition) - { - var variableName = variableDefinition.Variable.Name.Value; - - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_VariableIsNotCompatible, - variableName) - .AddLocation(variable) - .SetPath(context.CreateErrorPath()) - .SetExtension("variable", variableName) - .SetExtension("variableType", variableDefinition.Type.ToString()) - .SetExtension("locationType", context.Types.Peek().FullTypeName()) - .SpecifiedBy("sec-All-Variable-Usages-are-Allowed") - .Build(); - } - - public static IError DirectiveNotValidInLocation( - this DocumentValidatorContext context, - DirectiveNode node) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_DirectiveNotValidInLocation) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SpecifiedBy("sec-Directives-Are-In-Valid-Locations") - .Build(); - } - - public static IError DirectiveNotSupported( - this DocumentValidatorContext context, - DirectiveNode node) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_DirectiveNotSupported, - node.Name.Value) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SpecifiedBy("sec-Directives-Are-Defined") - .Build(); - } - - public static IError DirectiveMustBeUniqueInLocation( - this DocumentValidatorContext context, - DirectiveNode node) => - ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_DirectiveMustBeUniqueInLocation) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SpecifiedBy("sec-Directives-Are-Unique-Per-Location") - .Build(); - - public static IError TypeSystemDefinitionNotAllowed( - this DocumentValidatorContext context, - IDefinitionNode node) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_TypeSystemDefinitionNotAllowed) - .AddLocation(node) - .SpecifiedBy("sec-Executable-Definitions") - .Build(); - } - - public static IError UnionFieldError( - this DocumentValidatorContext context, - SelectionSetNode node, - IUnionTypeDefinition type) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_UnionFieldError) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("type", type.Name) - .SpecifiedBy("sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types") - .Build(); - } - - public static IError FieldDoesNotExist( - this DocumentValidatorContext context, - FieldNode node, - IComplexTypeDefinition outputType) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_FieldDoesNotExist, - node.Name.Value, outputType.Name) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("type", outputType.Name) - .SetExtension("field", node.Name.Value) - .SetExtension("responseName", (node.Alias ?? node.Name).Value) - .SpecifiedBy("sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types") - .Build(); - } - - public static IError LeafFieldsCannotHaveSelections( - this DocumentValidatorContext context, - FieldNode node, - IComplexTypeDefinition declaringType, - IType fieldType) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_LeafFieldsCannotHaveSelections, - node.Name.Value, - fieldType.FullTypeName()) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("declaringType", declaringType.Name) - .SetExtension("field", node.Name.Value) - .SetExtension("type", fieldType.FullTypeName()) - .SetExtension("responseName", (node.Alias ?? node.Name).Value) - .SpecifiedBy("sec-Leaf-Field-Selections") - .Build(); - } - - public static IError ArgumentValueIsNotCompatible( - this DocumentValidatorContext context, - ArgumentNode node, - IInputType locationType, - IValueNode value) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_ArgumentValueIsNotCompatible) - .AddLocation(value) - .SetPath(context.CreateErrorPath()) - .SetExtension("argument", node.Name.Value) - .SetExtension("argumentValue", value.ToString()) - .SetExtension("locationType", locationType.FullTypeName()) - .SpecifiedBy("sec-Values-of-Correct-Type") - .Build(); - } - - public static IError FieldValueIsNotCompatible( - this DocumentValidatorContext context, - IInputValueDefinition field, - IInputType locationType, - IValueNode valueNode) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_FieldValueIsNotCompatible, field.Name) - .AddLocation(valueNode) - .SetExtension("fieldName", field.Name) - .SetExtension("fieldType", field.Type.FullTypeName()) - .SetExtension("locationType", locationType.FullTypeName()) - .SetPath(context.CreateErrorPath()) - .SpecifiedBy("sec-Values-of-Correct-Type") - .Build(); - } - - public static IError VariableDefaultValueIsNotCompatible( - this DocumentValidatorContext context, - VariableDefinitionNode node, - IInputType locationType, - IValueNode valueNode) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_VariableDefaultValueIsNotCompatible, - node.Variable.Name.Value) - .AddLocation(valueNode) - .SetPath(context.CreateErrorPath()) - .SetExtension("variable", node.Variable.Name.Value) - .SetExtension("variableType", node.Type.ToString()) - .SetExtension("locationType", locationType.FullTypeName()) - .SpecifiedBy("sec-Values-of-Correct-Type") + public static IError SkipAndIncludeNotAllowedOnSubscriptionRootField( + ISelectionNode selection) + => ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_SkipAndIncludeNotAllowedOnSubscriptionRootField) + .AddLocation(selection) + .SpecifiedBy("sec-Single-Root-Field", rfc: 860) .Build(); - } - public static IError NoSelectionOnCompositeField( - this DocumentValidatorContext context, - FieldNode node, - IComplexTypeDefinition declaringType, - IType fieldType) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_NoSelectionOnCompositeField, - node.Name.Value, - fieldType.ToTypeNode().ToString()) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("declaringType", declaringType.Name) - .SetExtension("field", node.Name.Value) - .SetExtension("type", fieldType.FullTypeName()) - .SetExtension("responseName", (node.Alias ?? node.Name).Value) - .SpecifiedBy("sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types") + public static IError DeferAndStreamNotAllowedOnMutationOrSubscriptionRoot( + ISelectionNode selection) + => ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_DeferAndStreamNotAllowedOnMutationOrSubscriptionRoot) + .AddLocation(selection) + .SpecifiedBy("sec-Defer-And-Stream-Directives-Are-Used-On-Valid-Root-Field") .Build(); - } - public static IError NoSelectionOnRootType( - this DocumentValidatorContext context, - OperationDefinitionNode node, - IType fieldType) + extension(DocumentValidatorContext context) { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_NoSelectionOnRootType, - node.Name?.Value ?? "Unnamed") - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("operation", node.Name?.Value ?? "Unnamed") - .SetExtension("type", fieldType.FullTypeName()) - .SpecifiedBy("sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types") - .Build(); - } + public IError VariableNotUsed(OperationDefinitionNode node, + IEnumerable unusedVariables) + { + return ErrorBuilder.New() + .SetMessage( + "The following variables were not used: " + + $"{string.Join(", ", unusedVariables)}.") + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SpecifiedBy("sec-All-Variables-Used") + .Build(); + } - public static IError FieldIsRequiredButNull( - this DocumentValidatorContext context, - ISyntaxNode node, - string fieldName) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_FieldIsRequiredButNull, fieldName) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("field", fieldName) - .SpecifiedBy("sec-Input-Object-Required-Fields") - .Build(); - } + public IError VariableNotDeclared(OperationDefinitionNode node, + IEnumerable usedVariables) + { + return ErrorBuilder.New() + .SetMessage( + "The following variables were not declared: " + + $"{string.Join(", ", usedVariables)}.") + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SpecifiedBy("sec-All-Variable-Uses-Defined") + .Build(); + } - public static IError FieldsAreNotMergeable( - this DocumentValidatorContext context, - FieldInfo fieldA, - FieldInfo fieldB) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_FieldsAreNotMergeable) - .AddLocation(fieldA.SyntaxNode) - .AddLocation(fieldB.SyntaxNode) - .SetExtension("declaringTypeA", fieldA.DeclaringType.NamedType().Name) - .SetExtension("declaringTypeB", fieldB.DeclaringType.NamedType().Name) - .SetExtension("fieldA", fieldA.SyntaxNode.Name.Value) - .SetExtension("fieldB", fieldB.SyntaxNode.Name.Value) - .SetExtension("typeA", fieldA.Type.FullTypeName()) - .SetExtension("typeB", fieldB.Type.FullTypeName()) - .SetExtension("responseNameA", fieldA.ResponseName) - .SetExtension("responseNameB", fieldB.ResponseName) - .SpecifiedBy("sec-Field-Selection-Merging") - .Build(); - } + public IError OneOfVariableIsNotCompatible(VariableNode variable, + VariableDefinitionNode variableDefinition) + { + var variableName = variableDefinition.Variable.Name.Value; - public static IError OperationNotSupported( - this DocumentValidatorContext context, - OperationType operationType) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_OperationNotSupported, - operationType) - .Build(); - } + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_OneOfVariableIsNotCompatible, + variableName) + .AddLocation(variable) + .SetPath(context.CreateErrorPath()) + .SetExtension("variable", variableName) + .SpecifiedBy("sec-All-Variable-Usages-are-Allowed") + .Build(); + } - public static IError FragmentNameNotUnique( - this DocumentValidatorContext context, - FragmentDefinitionNode fragmentDefinition) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_FragmentNameNotUnique, - fragmentDefinition.Name.Value) - .AddLocation(fragmentDefinition) - .SetExtension("fragment", fragmentDefinition.Name.Value) - .SpecifiedBy("sec-Fragment-Name-Uniqueness") - .Build(); - } + public IError VariableIsNotCompatible(VariableNode variable, + VariableDefinitionNode variableDefinition) + { + var variableName = variableDefinition.Variable.Name.Value; - public static IError FragmentNotUsed( - this DocumentValidatorContext context, - FragmentDefinitionNode fragmentDefinition) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_FragmentNotUsed, - fragmentDefinition.Name.Value) - .AddLocation(fragmentDefinition) - .SetPath(context.CreateErrorPath()) - .SetExtension("fragment", fragmentDefinition.Name.Value) - .SpecifiedBy("sec-Fragments-Must-Be-Used") - .Build(); - } + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_VariableIsNotCompatible, + variableName) + .AddLocation(variable) + .SetPath(context.CreateErrorPath()) + .SetExtension("variable", variableName) + .SetExtension("variableType", variableDefinition.Type.ToString()) + .SetExtension("locationType", context.Types.Peek().FullTypeName()) + .SpecifiedBy("sec-All-Variable-Usages-are-Allowed") + .Build(); + } - public static IError FragmentCycleDetected( - this DocumentValidatorContext context, - FragmentSpreadNode fragmentSpread) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_FragmentCycleDetected) - .AddLocation(fragmentSpread) - .SetPath(context.CreateErrorPath()) - .SetExtension("fragment", fragmentSpread.Name.Value) - .SpecifiedBy("sec-Fragment-spreads-must-not-form-cycles") - .Build(); - } + public IError DirectiveNotValidInLocation(DirectiveNode node) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_DirectiveNotValidInLocation) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SpecifiedBy("sec-Directives-Are-In-Valid-Locations") + .Build(); + } - public static IError FragmentDoesNotExist( - this DocumentValidatorContext context, - FragmentSpreadNode fragmentSpread) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_FragmentDoesNotExist, - fragmentSpread.Name.Value) - .AddLocation(fragmentSpread) - .SetPath(context.CreateErrorPath()) - .SetExtension("fragment", fragmentSpread.Name.Value) - .SpecifiedBy("sec-Fragment-spread-target-defined") - .Build(); - } + public IError DirectiveNotSupported(DirectiveNode node) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_DirectiveNotSupported, + node.Name.Value) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SpecifiedBy("sec-Directives-Are-Defined") + .Build(); + } - public static IError FragmentNotPossible( - this DocumentValidatorContext context, - ISyntaxNode node, - ITypeDefinition typeCondition, - ITypeDefinition parentType) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_FragmentNotPossible) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("typeCondition", typeCondition.Name) - .SetExtension("selectionSetType", parentType.Name) - .SetFragmentName(node) - .SpecifiedBy("sec-Fragment-spread-is-possible") - .Build(); - } + public IError DirectiveMustBeUniqueInLocation(DirectiveNode node) => + ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_DirectiveMustBeUniqueInLocation) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SpecifiedBy("sec-Directives-Are-Unique-Per-Location") + .Build(); - public static IError FragmentTypeConditionUnknown( - this DocumentValidatorContext context, - ISyntaxNode node, - NamedTypeNode typeCondition) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_FragmentTypeConditionUnknown, - typeCondition.Name.Value) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("typeCondition", typeCondition.Name.Value) - .SetFragmentName(node) - .SpecifiedBy("sec-Fragment-Spread-Type-Existence") - .Build(); - } + public IError TypeSystemDefinitionNotAllowed(IDefinitionNode node) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_TypeSystemDefinitionNotAllowed) + .AddLocation(node) + .SpecifiedBy("sec-Executable-Definitions") + .Build(); + } - public static IError FragmentOnlyCompositeType( - this DocumentValidatorContext context, - ISyntaxNode node, - ITypeDefinition type) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_FragmentOnlyCompositeType) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("typeCondition", type.FullTypeName()) - .SetFragmentName(node) - .SpecifiedBy("sec-Fragments-On-Composite-Types") - .Build(); - } + public IError UnionFieldError(SelectionSetNode node, + IUnionTypeDefinition type) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_UnionFieldError) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("type", type.Name) + .SpecifiedBy("sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types") + .Build(); + } - public static IError InputFieldAmbiguous( - this DocumentValidatorContext context, - ObjectFieldNode field) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_InputFieldAmbiguous, field.Name.Value) - .AddLocation(field) - .SetPath(context.CreateErrorPath()) - .SetExtension("field", field.Name.Value) - .SpecifiedBy("sec-Input-Object-Field-Uniqueness") - .Build(); - } + public IError FieldDoesNotExist(FieldNode node, + IComplexTypeDefinition outputType) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_FieldDoesNotExist, + node.Name.Value, outputType.Name) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("type", outputType.Name) + .SetExtension("field", node.Name.Value) + .SetExtension("responseName", (node.Alias ?? node.Name).Value) + .SpecifiedBy("sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types") + .Build(); + } - public static IError InputFieldDoesNotExist( - this DocumentValidatorContext context, - ObjectFieldNode field) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_InputFieldDoesNotExist, - field.Name.Value) - .AddLocation(field) - .SetPath(context.CreateErrorPath()) - .SetExtension("field", field.Name.Value) - .SpecifiedBy("sec-Input-Object-Field-Names") - .Build(); - } + public IError LeafFieldsCannotHaveSelections(FieldNode node, + IComplexTypeDefinition declaringType, + IType fieldType) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_LeafFieldsCannotHaveSelections, + node.Name.Value, + fieldType.FullTypeName()) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("declaringType", declaringType.Name) + .SetExtension("field", node.Name.Value) + .SetExtension("type", fieldType.FullTypeName()) + .SetExtension("responseName", (node.Alias ?? node.Name).Value) + .SpecifiedBy("sec-Leaf-Field-Selections") + .Build(); + } - public static IError InputFieldRequired( - this DocumentValidatorContext context, - ISyntaxNode node, - string fieldName) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_InputFieldRequired, fieldName) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("field", fieldName) - .SpecifiedBy("sec-Input-Object-Required-Fields") - .Build(); - } + public IError ArgumentValueIsNotCompatible(ArgumentNode node, + IInputType locationType, + IValueNode value) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_ArgumentValueIsNotCompatible) + .AddLocation(value) + .SetPath(context.CreateErrorPath()) + .SetExtension("argument", node.Name.Value) + .SetExtension("argumentValue", value.ToString()) + .SetExtension("locationType", locationType.FullTypeName()) + .SpecifiedBy("sec-Values-of-Correct-Type") + .Build(); + } - public static IError OperationNameNotUnique( - this DocumentValidatorContext context, - OperationDefinitionNode operation, - string operationName) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_OperationNameNotUnique, - operationName) - .AddLocation(operation) - .SetExtension("operation", operationName) - .SpecifiedBy("sec-Operation-Name-Uniqueness") - .Build(); - } + public IError FieldValueIsNotCompatible(IInputValueDefinition field, + IInputType locationType, + IValueNode valueNode) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_FieldValueIsNotCompatible, field.Name) + .AddLocation(valueNode) + .SetExtension("fieldName", field.Name) + .SetExtension("fieldType", field.Type.FullTypeName()) + .SetExtension("locationType", locationType.FullTypeName()) + .SetPath(context.CreateErrorPath()) + .SpecifiedBy("sec-Values-of-Correct-Type") + .Build(); + } - public static IError OperationAnonymousMoreThanOne( - this DocumentValidatorContext context, - OperationDefinitionNode operation, - int operations) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_OperationAnonymousMoreThanOne) - .AddLocation(operation) - .SetExtension("operations", operations) - .SpecifiedBy("sec-Lone-Anonymous-Operation") - .Build(); - } + public IError VariableDefaultValueIsNotCompatible(VariableDefinitionNode node, + IInputType locationType, + IValueNode valueNode) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_VariableDefaultValueIsNotCompatible, + node.Variable.Name.Value) + .AddLocation(valueNode) + .SetPath(context.CreateErrorPath()) + .SetExtension("variable", node.Variable.Name.Value) + .SetExtension("variableType", node.Type.ToString()) + .SetExtension("locationType", locationType.FullTypeName()) + .SpecifiedBy("sec-Values-of-Correct-Type") + .Build(); + } - public static IError VariableNotInputType( - this DocumentValidatorContext context, - VariableDefinitionNode node, - string variableName) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_VariableNotInputType, variableName) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("variable", variableName) - .SetExtension("variableType", node.Type.ToString()) - .SpecifiedBy("sec-Variables-Are-Input-Types") - .Build(); - } + public IError NoSelectionOnCompositeField(FieldNode node, + IComplexTypeDefinition declaringType, + IType fieldType) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_NoSelectionOnCompositeField, + node.Name.Value, + fieldType.ToTypeNode().ToString()) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("declaringType", declaringType.Name) + .SetExtension("field", node.Name.Value) + .SetExtension("type", fieldType.FullTypeName()) + .SetExtension("responseName", (node.Alias ?? node.Name).Value) + .SpecifiedBy("sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types") + .Build(); + } - public static IError VariableNameNotUnique( - this DocumentValidatorContext context, - VariableDefinitionNode node, - string variableName) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_VariableNameNotUnique) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension("variable", variableName) - .SetExtension("variableType", node.Type.ToString()) - .SpecifiedBy("sec-Variable-Uniqueness") - .Build(); - } + public IError NoSelectionOnRootType(OperationDefinitionNode node, + IType fieldType) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_NoSelectionOnRootType, + node.Name?.Value ?? "Unnamed") + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("operation", node.Name?.Value ?? "Unnamed") + .SetExtension("type", fieldType.FullTypeName()) + .SpecifiedBy("sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types") + .Build(); + } - public static IError ArgumentNotUnique( - this DocumentValidatorContext context, - ArgumentNode node, - SchemaCoordinate? field = null, - IDirectiveDefinition? directive = null) - { - var builder = ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_ArgumentNotUnique) - .AddLocation(node) - .SetPath(context.CreateErrorPath()); + public IError FieldIsRequiredButNull(ISyntaxNode node, + string fieldName) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_FieldIsRequiredButNull, fieldName) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("field", fieldName) + .SpecifiedBy("sec-Input-Object-Required-Fields") + .Build(); + } - if (field.HasValue) + public IError FieldsAreNotMergeable(FieldInfo fieldA, + FieldInfo fieldB) { - builder - .SetExtension("type", field.Value.Name) - .SetExtension("field", field.Value.MemberName); + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_FieldsAreNotMergeable) + .AddLocation(fieldA.SyntaxNode) + .AddLocation(fieldB.SyntaxNode) + .SetExtension("declaringTypeA", fieldA.DeclaringType.NamedType().Name) + .SetExtension("declaringTypeB", fieldB.DeclaringType.NamedType().Name) + .SetExtension("fieldA", fieldA.SyntaxNode.Name.Value) + .SetExtension("fieldB", fieldB.SyntaxNode.Name.Value) + .SetExtension("typeA", fieldA.Type.FullTypeName()) + .SetExtension("typeB", fieldB.Type.FullTypeName()) + .SetExtension("responseNameA", fieldA.ResponseName) + .SetExtension("responseNameB", fieldB.ResponseName) + .SpecifiedBy("sec-Field-Selection-Merging") + .Build(); } - if (directive is not null) + public IError OperationNotSupported(OperationType operationType) { - builder.SetExtension("directive", directive.Name); + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_OperationNotSupported, + operationType) + .Build(); } - return builder - .SetExtension("argument", node.Name.Value) - .SpecifiedBy("sec-Argument-Uniqueness") - .Build(); - } + public IError FragmentNameNotUnique(FragmentDefinitionNode fragmentDefinition) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_FragmentNameNotUnique, + fragmentDefinition.Name.Value) + .AddLocation(fragmentDefinition) + .SetExtension("fragment", fragmentDefinition.Name.Value) + .SpecifiedBy("sec-Fragment-Name-Uniqueness") + .Build(); + } - public static IError ArgumentRequired( - this DocumentValidatorContext context, - ISyntaxNode node, - string argumentName, - SchemaCoordinate? field = null, - IDirectiveDefinition? directive = null) - { - var builder = ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_ArgumentRequired, argumentName) - .AddLocation(node) - .SetPath(context.CreateErrorPath()); + public IError FragmentNotUsed(FragmentDefinitionNode fragmentDefinition) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_FragmentNotUsed, + fragmentDefinition.Name.Value) + .AddLocation(fragmentDefinition) + .SetPath(context.CreateErrorPath()) + .SetExtension("fragment", fragmentDefinition.Name.Value) + .SpecifiedBy("sec-Fragments-Must-Be-Used") + .Build(); + } - if (field.HasValue) + public IError FragmentCycleDetected(FragmentSpreadNode fragmentSpread) { - builder - .SetExtension("type", field.Value.Name) - .SetExtension("field", field.Value.MemberName); + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_FragmentCycleDetected) + .AddLocation(fragmentSpread) + .SetPath(context.CreateErrorPath()) + .SetExtension("fragment", fragmentSpread.Name.Value) + .SpecifiedBy("sec-Fragment-spreads-must-not-form-cycles") + .Build(); } - if (directive is not null) + public IError FragmentDoesNotExist(FragmentSpreadNode fragmentSpread) { - builder.SetExtension("directive", directive.Name); + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_FragmentDoesNotExist, + fragmentSpread.Name.Value) + .AddLocation(fragmentSpread) + .SetPath(context.CreateErrorPath()) + .SetExtension("fragment", fragmentSpread.Name.Value) + .SpecifiedBy("sec-Fragment-spread-target-defined") + .Build(); } - return builder - .SetExtension("argument", argumentName) - .SpecifiedBy("sec-Required-Arguments") - .Build(); - } + public IError FragmentNotPossible(ISyntaxNode node, + ITypeDefinition typeCondition, + ITypeDefinition parentType) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_FragmentNotPossible) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("typeCondition", typeCondition.Name) + .SetExtension("selectionSetType", parentType.Name) + .SetFragmentName(node) + .SpecifiedBy("sec-Fragment-spread-is-possible") + .Build(); + } - public static IError ArgumentDoesNotExist( - this DocumentValidatorContext context, - ArgumentNode node, - SchemaCoordinate? field = null, - IDirectiveDefinition? directive = null) - { - var builder = ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_ArgumentDoesNotExist, node.Name.Value) - .AddLocation(node) - .SetPath(context.CreateErrorPath()); + public IError FragmentTypeConditionUnknown(ISyntaxNode node, + NamedTypeNode typeCondition) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_FragmentTypeConditionUnknown, + typeCondition.Name.Value) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("typeCondition", typeCondition.Name.Value) + .SetFragmentName(node) + .SpecifiedBy("sec-Fragment-Spread-Type-Existence") + .Build(); + } - if (field.HasValue) + public IError FragmentOnlyCompositeType(ISyntaxNode node, + ITypeDefinition type) { - builder - .SetExtension("type", field.Value.Name) - .SetExtension("field", field.Value.MemberName); + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_FragmentOnlyCompositeType) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("typeCondition", type.FullTypeName()) + .SetFragmentName(node) + .SpecifiedBy("sec-Fragments-On-Composite-Types") + .Build(); } - if (directive is not null) + public IError InputFieldAmbiguous(ObjectFieldNode field) { - builder.SetExtension("directive", directive.Name); + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_InputFieldAmbiguous, field.Name.Value) + .AddLocation(field) + .SetPath(context.CreateErrorPath()) + .SetExtension("field", field.Name.Value) + .SpecifiedBy("sec-Input-Object-Field-Uniqueness") + .Build(); } - return builder - .SetExtension("argument", node.Name.Value) - .SpecifiedBy("sec-Required-Arguments") - .Build(); - } + public IError InputFieldDoesNotExist(ObjectFieldNode field) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_InputFieldDoesNotExist, + field.Name.Value) + .AddLocation(field) + .SetPath(context.CreateErrorPath()) + .SetExtension("field", field.Name.Value) + .SpecifiedBy("sec-Input-Object-Field-Names") + .Build(); + } - public static IError SubscriptionSingleRootField( - this DocumentValidatorContext context, - OperationDefinitionNode operation) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_SubscriptionSingleRootField) - .AddLocation(operation) - .SpecifiedBy("sec-Single-root-field") - .Build(); - } + public IError InputFieldRequired(ISyntaxNode node, + string fieldName) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_InputFieldRequired, fieldName) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("field", fieldName) + .SpecifiedBy("sec-Input-Object-Required-Fields") + .Build(); + } - public static IError SubscriptionNoTopLevelIntrospectionField( - this DocumentValidatorContext context, - OperationDefinitionNode operation) - { - return ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_SubscriptionNoTopLevelIntrospectionField) - .AddLocation(operation) - .SpecifiedBy("sec-Single-root-field") - .Build(); - } + public IError OperationNameNotUnique(OperationDefinitionNode operation, + string operationName) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_OperationNameNotUnique, + operationName) + .AddLocation(operation) + .SetExtension("operation", operationName) + .SpecifiedBy("sec-Operation-Name-Uniqueness") + .Build(); + } - public static IError MaxExecutionDepth( - this DocumentValidatorContext context, - OperationDefinitionNode operation, - int allowedExecutionDepth, - int detectedExecutionDepth) - { - return ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_MaxExecutionDepth, - detectedExecutionDepth, allowedExecutionDepth) - .AddLocation(operation) - .SetExtension("allowedExecutionDepth", allowedExecutionDepth) - .SetExtension("detectedExecutionDepth", detectedExecutionDepth) - .Build(); - } + public IError OperationAnonymousMoreThanOne(OperationDefinitionNode operation, + int operations) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_OperationAnonymousMoreThanOne) + .AddLocation(operation) + .SetExtension("operations", operations) + .SpecifiedBy("sec-Lone-Anonymous-Operation") + .Build(); + } - public static IError IntrospectionNotAllowed( - this DocumentValidatorContext context, - FieldNode field, - string? customErrorMessage) - { - var message = customErrorMessage ?? Resources.ErrorHelper_IntrospectionNotAllowed; + public IError VariableNotInputType(VariableDefinitionNode node, + string variableName) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_VariableNotInputType, variableName) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("variable", variableName) + .SetExtension("variableType", node.Type.ToString()) + .SpecifiedBy("sec-Variables-Are-Input-Types") + .Build(); + } - return ErrorBuilder.New() - .SetMessage(message) - .AddLocation(field) - .SetExtension(nameof(field), field.Name) - .SetCode(ErrorCodes.Validation.IntrospectionNotAllowed) - .Build(); - } + public IError VariableNameNotUnique(VariableDefinitionNode node, + string variableName) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_VariableNameNotUnique) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension("variable", variableName) + .SetExtension("variableType", node.Type.ToString()) + .SpecifiedBy("sec-Variable-Uniqueness") + .Build(); + } - public static IError OneOfMustHaveExactlyOneField( - this DocumentValidatorContext context, - ISyntaxNode node, - IInputObjectTypeDefinition type) - => ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_OneOfMustHaveExactlyOneField, type.Name) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetExtension(nameof(type), type.Name) - .SpecifiedBy("sec-All-Variable-Usages-Are-Allowed", rfc: 825) - .Build(); + public IError ArgumentNotUnique(ArgumentNode node, + SchemaCoordinate? field = null, + IDirectiveDefinition? directive = null) + { + var builder = ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_ArgumentNotUnique) + .AddLocation(node) + .SetPath(context.CreateErrorPath()); + + if (field.HasValue) + { + builder + .SetExtension("type", field.Value.Name) + .SetExtension("field", field.Value.MemberName); + } + + if (directive is not null) + { + builder.SetExtension("directive", directive.Name); + } + + return builder + .SetExtension("argument", node.Name.Value) + .SpecifiedBy("sec-Argument-Uniqueness") + .Build(); + } - public static IError OneOfVariablesMustBeNonNull( - this DocumentValidatorContext context, - ISyntaxNode node, - SchemaCoordinate fieldCoordinate, - string variableName) - => ErrorBuilder.New() - .SetMessage( - Resources.ErrorHelper_OneOfVariablesMustBeNonNull, - variableName, - fieldCoordinate.MemberName!, - fieldCoordinate.Name) - .AddLocation(node) - .SetPath(context.CreateErrorPath()) - .SetCoordinate(fieldCoordinate) - .SpecifiedBy("sec-All-Variable-Usages-Are-Allowed", rfc: 825) - .Build(); + public IError ArgumentRequired(ISyntaxNode node, + string argumentName, + SchemaCoordinate? field = null, + IDirectiveDefinition? directive = null) + { + var builder = ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_ArgumentRequired, argumentName) + .AddLocation(node) + .SetPath(context.CreateErrorPath()); + + if (field.HasValue) + { + builder + .SetExtension("type", field.Value.Name) + .SetExtension("field", field.Value.MemberName); + } + + if (directive is not null) + { + builder.SetExtension("directive", directive.Name); + } + + return builder + .SetExtension("argument", argumentName) + .SpecifiedBy("sec-Required-Arguments") + .Build(); + } - public static IError SkipAndIncludeNotAllowedOnSubscriptionRootField( - ISelectionNode selection) - => ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_SkipAndIncludeNotAllowedOnSubscriptionRootField) - .AddLocation(selection) - .SpecifiedBy("sec-Single-Root-Field", rfc: 860) - .Build(); + public IError ArgumentDoesNotExist(ArgumentNode node, + SchemaCoordinate? field = null, + IDirectiveDefinition? directive = null) + { + var builder = ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_ArgumentDoesNotExist, node.Name.Value) + .AddLocation(node) + .SetPath(context.CreateErrorPath()); + + if (field.HasValue) + { + builder + .SetExtension("type", field.Value.Name) + .SetExtension("field", field.Value.MemberName); + } + + if (directive is not null) + { + builder.SetExtension("directive", directive.Name); + } + + return builder + .SetExtension("argument", node.Name.Value) + .SpecifiedBy("sec-Required-Arguments") + .Build(); + } - public static IError DeferAndStreamNotAllowedOnMutationOrSubscriptionRoot( - ISelectionNode selection) - => ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_DeferAndStreamNotAllowedOnMutationOrSubscriptionRoot) - .AddLocation(selection) - .SpecifiedBy("sec-Defer-And-Stream-Directives-Are-Used-On-Valid-Root-Field") - .Build(); + public IError SubscriptionSingleRootField(OperationDefinitionNode operation) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_SubscriptionSingleRootField) + .AddLocation(operation) + .SpecifiedBy("sec-Single-root-field") + .Build(); + } - public static IError DeferAndStreamDuplicateLabel( - this DocumentValidatorContext context, - ISyntaxNode selection, - string label) - => ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_DeferAndStreamDuplicateLabel) - .AddLocation(selection) - .SpecifiedBy("sec-Defer-And-Stream-Directive-Labels-Are-Unique") - .SetExtension(nameof(label), label) - .SetPath(context.CreateErrorPath()) - .Build(); + public IError SubscriptionNoTopLevelIntrospectionField(OperationDefinitionNode operation) + { + return ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_SubscriptionNoTopLevelIntrospectionField) + .AddLocation(operation) + .SpecifiedBy("sec-Single-root-field") + .Build(); + } - public static IError DeferAndStreamLabelIsVariable( - this DocumentValidatorContext context, - ISyntaxNode selection, - string variable) - => ErrorBuilder.New() - .SetMessage(Resources.ErrorHelper_DeferAndStreamLabelIsVariable) - .AddLocation(selection) - .SpecifiedBy("sec-Defer-And-Stream-Directive-Labels-Are-Unique") - .SetExtension(nameof(variable), $"${variable}") - .SetPath(context.CreateErrorPath()) - .Build(); + public IError MaxExecutionDepth(OperationDefinitionNode operation, + int allowedExecutionDepth, + int detectedExecutionDepth) + { + return ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_MaxExecutionDepth, + detectedExecutionDepth, allowedExecutionDepth) + .AddLocation(operation) + .SetExtension("allowedExecutionDepth", allowedExecutionDepth) + .SetExtension("detectedExecutionDepth", detectedExecutionDepth) + .Build(); + } - public static IError StreamOnNonListField( - this DocumentValidatorContext context, - ISyntaxNode selection) - => ErrorBuilder.New() - .SetMessage("@stream directive is only valid on list fields.") - .AddLocation(selection) - .SpecifiedBy("sec-Stream-Directives-Are-Used-On-List-Fields") - .SetPath(context.CreateErrorPath()) - .Build(); + public IError IntrospectionNotAllowed(FieldNode field, + string? customErrorMessage) + { + var message = customErrorMessage ?? Resources.ErrorHelper_IntrospectionNotAllowed; + + return ErrorBuilder.New() + .SetMessage(message) + .AddLocation(field) + .SetExtension(nameof(field), field.Name) + .SetCode(ErrorCodes.Validation.IntrospectionNotAllowed) + .Build(); + } - public static void ReportMaxIntrospectionDepthOverflow( - this DocumentValidatorContext context, - ISyntaxNode selection) - { - context.FatalErrorDetected = true; - context.ReportError( - ErrorBuilder.New() - .SetMessage("Maximum allowed introspection depth exceeded.") - .SetCode(ErrorCodes.Validation.MaxIntrospectionDepthOverflow) + public IError OneOfMustHaveExactlyOneField(ISyntaxNode node, + IInputObjectTypeDefinition type) + => ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_OneOfMustHaveExactlyOneField, type.Name) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetExtension(nameof(type), type.Name) + .SpecifiedBy("sec-All-Variable-Usages-Are-Allowed", rfc: 825) + .Build(); + + public IError OneOfVariablesMustBeNonNull(ISyntaxNode node, + SchemaCoordinate fieldCoordinate, + string variableName) + => ErrorBuilder.New() + .SetMessage( + Resources.ErrorHelper_OneOfVariablesMustBeNonNull, + variableName, + fieldCoordinate.MemberName!, + fieldCoordinate.Name) + .AddLocation(node) + .SetPath(context.CreateErrorPath()) + .SetCoordinate(fieldCoordinate) + .SpecifiedBy("sec-All-Variable-Usages-Are-Allowed", rfc: 825) + .Build(); + + public IError DeferAndStreamDuplicateLabel(ISyntaxNode selection, + string label) + => ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_DeferAndStreamDuplicateLabel) .AddLocation(selection) + .SpecifiedBy("sec-Defer-And-Stream-Directive-Labels-Are-Unique") + .SetExtension(nameof(label), label) .SetPath(context.CreateErrorPath()) - .Build()); - } + .Build(); - public static void ReportMaxCoordinateCycleDepthOverflow( - this DocumentValidatorContext context, - ISyntaxNode selection) - { - context.FatalErrorDetected = true; + public IError DeferAndStreamLabelIsVariable(ISyntaxNode selection, + string variable) + => ErrorBuilder.New() + .SetMessage(Resources.ErrorHelper_DeferAndStreamLabelIsVariable) + .AddLocation(selection) + .SpecifiedBy("sec-Defer-And-Stream-Directive-Labels-Are-Unique") + .SetExtension(nameof(variable), $"${variable}") + .SetPath(context.CreateErrorPath()) + .Build(); - context.ReportError( - ErrorBuilder.New() - .SetMessage("Maximum allowed coordinate cycle depth was exceeded.") - .SetCode(ErrorCodes.Validation.MaxCoordinateCycleDepthOverflow) + public IError StreamOnNonListField(ISyntaxNode selection) + => ErrorBuilder.New() + .SetMessage("@stream directive is only valid on list fields.") .AddLocation(selection) + .SpecifiedBy("sec-Stream-Directives-Are-Used-On-List-Fields") .SetPath(context.CreateErrorPath()) - .Build()); + .Build(); + + public void ReportMaxIntrospectionDepthOverflow(ISyntaxNode selection) + { + context.FatalErrorDetected = true; + context.ReportError( + ErrorBuilder.New() + .SetMessage("Maximum allowed introspection depth exceeded.") + .SetCode(ErrorCodes.Validation.MaxIntrospectionDepthOverflow) + .AddLocation(selection) + .SetPath(context.CreateErrorPath()) + .Build()); + } + + public void ReportMaxCoordinateCycleDepthOverflow(ISyntaxNode selection) + { + context.FatalErrorDetected = true; + + context.ReportError( + ErrorBuilder.New() + .SetMessage("Maximum allowed coordinate cycle depth was exceeded.") + .SetCode(ErrorCodes.Validation.MaxCoordinateCycleDepthOverflow) + .AddLocation(selection) + .SetPath(context.CreateErrorPath()) + .Build()); + } } } From 1d42995b1c4665dc24719eb75e26f17a1c106691 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 2 Dec 2025 12:12:49 +0100 Subject: [PATCH 015/144] wip --- .../src/Caching/QueryCacheMiddleware.cs | 3 +- .../src/Authorization/AuthorizeMiddleware.cs | 6 +- .../ErrorBuilderExtensions.cs | 23 +- .../Execution.Projections/ExpressionCache.cs | 86 -- ...otChocolateExecutionSelectionExtensions.cs | 18 +- .../Core/src/Features/IFeatureCollection.cs | 23 +- .../Core/src/Types/Execution/ErrorHelper.cs | 22 +- .../Processing/ISelectionVariants.cs | 49 - .../Processing/MiddlewareContext.Global.cs | 2 + .../Processing/MiddlewareContext.Pure.cs | 2 + .../Processing/MiddlewareContext.Selection.cs | 1 - .../Types/Execution/Processing/Operation.cs | 10 +- .../Execution/Processing/OperationCompiler.cs | 8 +- .../OperationFeatureCollection.Selections.cs | 84 + .../Processing/OperationFeatureCollection.cs | 4 +- .../Execution/Processing/OperationPrinter.cs | 238 --- .../Types/Execution/Processing/Selection.cs | 96 +- .../Processing/SelectionFeatureCollection.cs | 44 + .../Execution/Processing/SelectionSet.cs | 43 +- .../SubscriptionExecutor.Subscription.cs | 7 +- .../Processing/Tasks/ResolverTask.Execute.cs | 6 +- .../Processing/Tasks/ResolverTask.Pooling.cs | 1 + .../Processing/Tasks/ResolverTaskFactory.cs | 2 +- .../Processing/ValueCompletion.Leaf.cs | 6 +- .../Processing/ValueCompletion.List.cs | 6 +- .../Execution/Processing/ValueCompletion.cs | 6 +- .../Extensions/ErrorBuilderExtensions.cs | 20 + .../Extensions/ResolverContextExtensions.cs | 1348 ++++++++--------- .../Core/src/Types/HotChocolate.Types.csproj | 16 + .../Resolvers/DefaultResolverCompiler.cs | 1 - .../FieldSyntaxParameterExpressionBuilder.cs | 32 - .../SelectionParameterExpressionBuilder.cs | 9 +- .../src/Types/Resolvers/IResolverContext.cs | 5 + .../Resolvers/ParameterBindingResolver.cs | 1 - .../Types/Text/Json/ResultDocument.WriteTo.cs | 22 +- .../src/Types/Text/Json/ResultDocument.cs | 5 +- .../DirectiveCollectionExtensions.cs | 257 ---- .../Types/Pagination/PagingMiddleware.cs | 2 +- .../Types/Types/Relay/NodeFieldResolvers.cs | 8 +- .../Core/src/Types/Utilities/ErrorHelper.cs | 9 +- .../IsProjectedProjectionOptimizer.cs | 9 +- .../Visitor/IProjectionOptimizer.cs | 2 +- .../Execution/Nodes/Selection.cs | 18 + 43 files changed, 1064 insertions(+), 1496 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Execution.Projections/ExpressionCache.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionVariants.cs create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.Selections.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationPrinter.cs create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs create mode 100644 src/HotChocolate/Core/src/Types/Extensions/ErrorBuilderExtensions.cs delete mode 100644 src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/FieldSyntaxParameterExpressionBuilder.cs delete mode 100644 src/HotChocolate/Core/src/Types/Types/Extensions/DirectiveCollectionExtensions.cs diff --git a/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs b/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs index 266b4011184..190acf51ae9 100644 --- a/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs +++ b/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs @@ -30,8 +30,7 @@ public async ValueTask InvokeAsync(RequestContext context) } if (!context.TryGetOperation(out var operation) - || !operation.ContextData.TryGetValue(ExecutionContextData.CacheControlHeaderValue, out var value) - || value is not CacheControlHeaderValue cacheControlHeaderValue) + || !operation.Features.TryGet(out var cacheControlHeaderValue)) { return; } diff --git a/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs b/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs index e7de30d536b..38f27393a8e 100644 --- a/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs +++ b/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs @@ -69,7 +69,7 @@ private void SetError( .SetMessage(AuthorizeMiddleware_NoDefaultPolicy) .SetCode(ErrorCodes.Authentication.NoDefaultPolicy) .SetPath(context.Path) - .AddLocations(context.Selection.SyntaxNodes) + .AddLocations(context.Selection) .Build(), AuthorizeResult.PolicyNotFound => ErrorBuilder.New() @@ -78,7 +78,7 @@ private void SetError( _directive.Policy!) .SetCode(ErrorCodes.Authentication.PolicyNotFound) .SetPath(context.Path) - .AddLocation(context.Selection.SyntaxNode) + .AddLocations(context.Selection) .Build(), _ => ErrorBuilder.New() @@ -88,7 +88,7 @@ private void SetError( ? ErrorCodes.Authentication.NotAuthorized : ErrorCodes.Authentication.NotAuthenticated) .SetPath(context.Path) - .AddLocation(context.Selection.SyntaxNode) + .AddLocations(context.Selection) .Build() }; } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs b/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs index eb9d4a2843b..7b13fee3b11 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs @@ -35,17 +35,36 @@ public ErrorBuilder SetInputPath(Path inputPath) return builder.SetExtension(nameof(inputPath), inputPath); } + /// + /// Sets the message of the error. + /// + /// The format of the message. + /// The argument for the message. + /// The error builder. + public ErrorBuilder SetMessage([StringSyntax("CompositeFormat")] string format, object? arg) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentException.ThrowIfNullOrEmpty(format); + + return builder.SetMessage(string.Format(CultureInfo.InvariantCulture, format, arg)); + } + /// /// Sets the message of the error. /// /// The format of the message. /// The arguments for the message. /// The error builder. - public ErrorBuilder SetMessage([StringSyntax("CompositeFormat")] string format, params object?[] args) + public ErrorBuilder SetMessage( + [StringSyntax("CompositeFormat")] string format, +#if NET10_0_OR_GREATER + params ReadOnlySpan args) +#else + params object[] args) +#endif { ArgumentNullException.ThrowIfNull(builder); ArgumentException.ThrowIfNullOrEmpty(format); - ArgumentNullException.ThrowIfNull(args); return builder.SetMessage(string.Format(CultureInfo.InvariantCulture, format, args)); } diff --git a/src/HotChocolate/Core/src/Execution.Projections/ExpressionCache.cs b/src/HotChocolate/Core/src/Execution.Projections/ExpressionCache.cs deleted file mode 100644 index 17d66d918ec..00000000000 --- a/src/HotChocolate/Core/src/Execution.Projections/ExpressionCache.cs +++ /dev/null @@ -1,86 +0,0 @@ -// ReSharper disable InconsistentlySynchronizedField -using System.Collections.Concurrent; -using System.Diagnostics.CodeAnalysis; -using System.Linq.Expressions; -using GreenDonut.Data; -using HotChocolate.Execution.Processing; - -namespace HotChocolate.Execution.Projections; - -internal sealed class ExpressionCache -{ - private readonly object _writeLock = new(); - private readonly ConcurrentDictionary _cache = new(); - - public bool TryGetExpression( - Selection selection, - [NotNullWhen(true)] out Expression>? expression) - { - if (_cache.TryGetValue(selection.Id, out var cachedExpression) - && cachedExpression is Expression> casted) - { - expression = casted; - return true; - } - - expression = null; - return false; - } - - public Expression> GetOrCreateExpression( - Selection selection, - SelectionExpressionBuilder expressionBuilder) - { - if (!TryGetExpression(selection, out var expression)) - { - lock (_writeLock) - { - if (!TryGetExpression(selection, out expression)) - { - expression = expressionBuilder.BuildExpression(selection); - _cache.TryAdd(selection.Id, expression); - } - } - } - - return expression; - } - - public Expression> GetOrCreateExpression( - Selection selection, - ISelectorBuilder expressionBuilder) - { - if (!TryGetExpression(selection, out var expression)) - { - lock (_writeLock) - { - if (!TryGetExpression(selection, out expression)) - { - expression = expressionBuilder.TryCompile()!; - _cache.TryAdd(selection.Id, expression); - } - } - } - - return expression; - } - - public Expression> GetOrCreateNodeExpression( - Selection selection, - SelectionExpressionBuilder expressionBuilder) - { - if (!TryGetExpression(selection, out var expression)) - { - lock (_writeLock) - { - if (!TryGetExpression(selection, out expression)) - { - expression = expressionBuilder.BuildNodeExpression(selection); - _cache.TryAdd(selection.Id, expression); - } - } - } - - return expression; - } -} diff --git a/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionSelectionExtensions.cs b/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionSelectionExtensions.cs index 6c7740745af..652dedfb075 100644 --- a/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionSelectionExtensions.cs +++ b/src/HotChocolate/Core/src/Execution.Projections/Extensions/HotChocolateExecutionSelectionExtensions.cs @@ -105,11 +105,7 @@ public static Expression> AsSelector( private static bool TryGetExpression( Selection selection, [NotNullWhen(true)] out Expression>? expression) - { - var features = selection.DeclaringOperation.Features; - var cache = features.GetOrSetSafe(); - return cache.TryGetExpression(selection, out expression); - } + => selection.Features.TryGet(out expression); private static int GetConnectionSelections(Selection selection, Span buffer) { @@ -181,18 +177,12 @@ file static class Extensions extension(Selection selection) { public Expression> GetOrCreateExpression() - => selection.DeclaringOperation.Features - .GetOrSetSafe() - .GetOrCreateExpression(selection, s_builder); + => selection.Features.GetOrSetSafe(() => s_builder.BuildExpression(selection)); public Expression> GetOrCreateExpression(ISelectorBuilder expressionBuilder) - => selection.DeclaringOperation.Features - .GetOrSetSafe() - .GetOrCreateExpression(selection, expressionBuilder); + => selection.Features.GetOrSetSafe(() => expressionBuilder.TryCompile()!); public Expression> GetOrCreateNodeExpression() - => selection.DeclaringOperation.Features - .GetOrSetSafe() - .GetOrCreateNodeExpression(selection, s_builder); + => selection.Features.GetOrSetSafe(() => s_builder.BuildNodeExpression(selection)); } } diff --git a/src/HotChocolate/Core/src/Features/IFeatureCollection.cs b/src/HotChocolate/Core/src/Features/IFeatureCollection.cs index 1e6f6654470..ee319b7b841 100644 --- a/src/HotChocolate/Core/src/Features/IFeatureCollection.cs +++ b/src/HotChocolate/Core/src/Features/IFeatureCollection.cs @@ -36,7 +36,25 @@ public interface IFeatureCollection : IEnumerable> /// /// The feature key. /// The requested feature, or null if it is not present. - TFeature? Get(); + TFeature? Get() + { + if (typeof(TFeature).IsValueType) + { + var feature = this[typeof(TFeature)]; + if (feature is null && Nullable.GetUnderlyingType(typeof(TFeature)) is null) + { + throw new InvalidOperationException( + $"{typeof(TFeature).FullName} does not exist in the feature collection " + + "and because it is a struct the method can't return null. " + + $"Use 'featureCollection[typeof({typeof(TFeature).FullName})] is not null' " + + "to check if the feature exists."); + } + + return (TFeature?)feature; + } + + return (TFeature?)this[typeof(TFeature)]; + } /// /// Tries to retrieve the requested feature from the collection. @@ -55,5 +73,6 @@ public interface IFeatureCollection : IEnumerable> /// /// The feature key. /// The feature value. - void Set(TFeature? instance); + void Set(TFeature? instance) + => this[typeof(TFeature)] = instance; } diff --git a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs index 1de37cf2a30..5ed2a9d615d 100644 --- a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs @@ -32,11 +32,11 @@ public static IError ArgumentValueIsInvalid( public static IError InvalidLeafValue( GraphQLException exception, - FieldNode field, + Selection selection, Path path) { return ErrorBuilder.FromError(exception.Errors[0]) - .TryAddLocation(field) + .AddLocations(selection) .SetPath(path) .SetCode(ErrorCodes.Execution.CannotSerializeLeafValue) .Build(); @@ -44,12 +44,12 @@ public static IError InvalidLeafValue( public static IError UnexpectedLeafValueSerializationError( Exception exception, - FieldNode field, + Selection selection, Path path) { return ErrorBuilder .FromException(exception) - .AddLocation(field) + .AddLocations(selection) .SetPath(path) .SetCode(ErrorCodes.Execution.CannotSerializeLeafValue) .Build(); @@ -85,24 +85,24 @@ public static IError UnexpectedErrorWhileResolvingAbstractType( public static IError ListValueIsNotSupported( Type listType, - FieldNode field, + Selection selection, Path path) { return ErrorBuilder.New() .SetMessage(ErrorHelper_ListValueIsNotSupported_Message, listType.FullName!) - .AddLocation(field) + .AddLocations(selection) .SetPath(path) .SetCode(ErrorCodes.Execution.ListTypeNotSupported) .Build(); } public static IError UnexpectedValueCompletionError( - FieldNode field, + Selection selection, Path path) { return ErrorBuilder.New() .SetMessage(ErrorHelper_UnexpectedValueCompletionError_Message) - .AddLocation(field) + .AddLocations(selection) .SetPath(path) .SetCode(ErrorCodes.Execution.ListTypeNotSupported) .Build(); @@ -137,16 +137,16 @@ public static IOperationResult StateInvalidForOperationExecution() => .Build()); public static IError ValueCompletion_CouldNotResolveAbstractType( - FieldNode field, + Selection selection, Path path, object result) => ErrorBuilder.New() .SetMessage( ErrorHelper_ValueCompletion_CouldNotResolveAbstractType_Message, result.GetType().FullName ?? result.GetType().Name, - field.Name) + selection.ResponseName) .SetPath(path) - .AddLocation(field) + .AddLocations(selection) .Build(); public static IOperationResult OperationKindNotAllowed() => diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionVariants.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionVariants.cs deleted file mode 100644 index 19d60e8bb67..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ISelectionVariants.cs +++ /dev/null @@ -1,49 +0,0 @@ -using HotChocolate.Types; - -namespace HotChocolate.Execution.Processing; - -/// -/// Represents all the selection set variants of a field. -/// -public interface ISelectionVariants -{ - /// - /// Gets the operation unique id for this variant. - /// - int Id { get; } - - /// - /// Gets the operation that declares this variant. - /// - IOperation DeclaringOperation { get; } - - /// - /// Gets all the possible return types of the field to which this variant belongs to. - /// - IEnumerable GetPossibleTypes(); - - /// - /// Evaluates if the specified type context is a possible type for this variant. - /// - /// - /// The type context to evaluate. - /// - /// - /// Returns true if the specified type context is a possible type for this variant; - /// - bool IsPossibleType(ObjectType typeContext); - - /// - /// Gets the selection set for the specified field return type. - /// - /// - /// The field return type. - /// - /// - /// Returns the selection set for the specified field return type. - /// - /// - /// Invalid field return type. - /// - ISelectionSet GetSelectionSet(ObjectType typeContext); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs index 9211f4d4c0e..d1ba41b2545 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs @@ -33,6 +33,8 @@ public IServiceProvider Services public IVariableValueCollection Variables => _operationContext.Variables; + public ulong IncludeFlags => _operationContext.IncludeFlags; + public CancellationToken RequestAborted { get; private set; } public bool HasCleanupTasks => _cleanupTasks.Count > 0; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs index 20c1d467e6f..896dd713716 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs @@ -65,6 +65,8 @@ public void Clear() public Path Path => PathHelper.CreatePathFromContext(_selection, _parentResult, -1); + public ulong IncludeFlags => parentContext.IncludeFlags; + public CancellationToken RequestAborted => parentContext.RequestAborted; public void ReportError(string errorMessage) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs index 6efa2b63cac..88ac8f0e8d5 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs @@ -1,5 +1,4 @@ using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; using HotChocolate.Resolvers; using HotChocolate.Types; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs index 4c440b5b1c0..10151268f48 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs @@ -29,6 +29,7 @@ public sealed class Operation : IOperation internal Operation( string id, string hash, + DocumentNode document, OperationDefinitionNode definition, ObjectType rootType, Schema schema, @@ -41,6 +42,7 @@ internal Operation( { ArgumentException.ThrowIfNullOrWhiteSpace(id); ArgumentException.ThrowIfNullOrWhiteSpace(hash); + ArgumentNullException.ThrowIfNull(document); ArgumentNullException.ThrowIfNull(definition); ArgumentNullException.ThrowIfNull(rootType); ArgumentNullException.ThrowIfNull(schema); @@ -51,6 +53,7 @@ internal Operation( Id = id; Hash = hash; + Document = document; Definition = definition; RootType = rootType; Schema = schema; @@ -80,6 +83,11 @@ internal Operation( /// public string? Name => Definition.Name?.Value; + /// + /// Gets the normalized operation document. + /// + public DocumentNode Document { get; } + /// /// Gets the syntax node representing the operation definition. /// @@ -259,5 +267,5 @@ internal Selection GetSelectionById(int id) internal SelectionSet GetSelectionSetById(int id) => Unsafe.As(Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_elementsById), id)); - public override string ToString() => OperationPrinter.Print(this); + public override string ToString() => Definition.ToString(indented: true); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index e83d352bbb0..ee24611434a 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -29,12 +29,15 @@ public OperationCompiler( _documentRewriter = new DocumentRewriter(schema, removeStaticallyExcludedSelections: true); } - public Operation Compile(string id, string hash, OperationDefinitionNode operationDefinition) + public Operation Compile( + string id, + string hash, + OperationDefinitionNode operationDefinition) { ArgumentException.ThrowIfNullOrWhiteSpace(id); ArgumentNullException.ThrowIfNull(operationDefinition); - var document = new DocumentNode(new IDefinitionNode[] { operationDefinition }); + var document = new DocumentNode([operationDefinition]); document = _documentRewriter.RewriteDocument(document); operationDefinition = (OperationDefinitionNode)document.Definitions[0]; @@ -68,6 +71,7 @@ public Operation Compile(string id, string hash, OperationDefinitionNode operati return new Operation( id, hash, + document, operationDefinition, rootType, _schema, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.Selections.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.Selections.cs new file mode 100644 index 00000000000..22cda22d024 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.Selections.cs @@ -0,0 +1,84 @@ +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; + +namespace HotChocolate.Execution.Processing; + +[SuppressMessage("ReSharper", "NonAtomicCompoundOperator")] +public sealed partial class OperationFeatureCollection +{ + internal bool TryGet(int selectionId, [NotNullWhen(true)] out TFeature? feature) + { + if (_selectionFeatures.TryGetValue((selectionId, typeof(TFeature)), out var result) + && result is TFeature f) + { + feature = f; + return true; + } + + feature = default; + return false; + } + + internal object? this[int selectionId, Type featureType] + { + get + { + ArgumentOutOfRangeException.ThrowIfLessThan(selectionId, 0); + ArgumentNullException.ThrowIfNull(featureType); + + return _selectionFeatures.GetValueOrDefault((selectionId, featureType)); + } + set + { + ArgumentOutOfRangeException.ThrowIfLessThan(selectionId, 0); + ArgumentNullException.ThrowIfNull(featureType); + + lock (_writeLock) + { + if (value == null) + { + _selectionFeatures = _selectionFeatures.Remove((selectionId, featureType)); + _containerRevision++; + return; + } + + _selectionFeatures = _selectionFeatures.SetItem((selectionId, featureType), value); + _containerRevision++; + } + } + } + + internal TFeature GetOrSetSafe(int selectionId, Func factory) + { + ArgumentNullException.ThrowIfNull(factory); + + if (!TryGet(selectionId, out var feature)) + { + lock (_writeLock) + { + if (!TryGet(selectionId, out feature)) + { + feature = factory(); + this[selectionId, typeof(TFeature)] = feature; + } + } + } + + return feature; + } + + internal IEnumerable> GetFeatures(int selectionId) + { + foreach (var ((id, type), value) in _selectionFeatures) + { + if (selectionId == id) + { + yield return new KeyValuePair(type, value); + } + } + } + + internal bool HasFeatures(int selectionId) + => !_selectionFeatures.IsEmpty + && _selectionFeatures.Keys.Any(t => t.Item1 == selectionId); +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs index 553e910d594..69972333267 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs @@ -6,7 +6,7 @@ namespace HotChocolate.Execution.Processing; [SuppressMessage("ReSharper", "NonAtomicCompoundOperator")] -public sealed class OperationFeatureCollection : IFeatureCollection +public sealed partial class OperationFeatureCollection : IFeatureCollection { #if NET9_0_OR_GREATER private readonly Lock _writeLock = new(); @@ -15,8 +15,10 @@ public sealed class OperationFeatureCollection : IFeatureCollection #endif #if NET10_0_OR_GREATER private ImmutableDictionary _features = []; + private ImmutableDictionary<(int, Type), object> _selectionFeatures = []; #else private ImmutableDictionary _features = ImmutableDictionary.Empty; + private ImmutableDictionary<(int, Type), object> _selectionFeatures = ImmutableDictionary<(int, Type), object>.Empty; #endif private volatile int _containerRevision; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationPrinter.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationPrinter.cs deleted file mode 100644 index 22c45421c45..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationPrinter.cs +++ /dev/null @@ -1,238 +0,0 @@ -using HotChocolate.Language; -using HotChocolate.Types; - -namespace HotChocolate.Execution.Processing; - -/// -/// This operation printer is made for testing purposes. -/// -internal static class OperationPrinter -{ - public static string Print(Operation operation) - { - var directives = operation.Definition.Directives; - - if (operation.IncludeConditions.Count > 0) - { - var temp = operation.Definition.Directives.ToList(); - directives = temp; - - for (var i = 0; i < operation.IncludeConditions.Count; i++) - { - var includeCondition = operation.IncludeConditions[i]; - long flag = 2 ^ i; - - var arguments = new List { new("flag", new IntValueNode(flag)) }; - - if (includeCondition.Skip is BooleanValueNode) - { - arguments.Add(new ArgumentNode("skip", includeCondition.Skip)); - } - - if (includeCondition.Include is BooleanValueNode) - { - arguments.Add(new ArgumentNode("include", includeCondition.Include)); - } - - temp.Add(new DirectiveNode("includeCondition", arguments)); - } - } - - var definitions = new List(); - var context = new PrintContext(operation, operation.SelectionVariants[0], definitions); - - var selectionSet = Visit(context); - - var operationDefinition = new OperationDefinitionNode( - operation.Definition.Location, - operation.Definition.Name, - operation.Definition.Description, - operation.Definition.Operation, - operation.Definition.VariableDefinitions, - directives, - selectionSet); - definitions.Insert(0, operationDefinition); - - return new DocumentNode(definitions).ToString(); - } - - private static SelectionSetNode Visit(PrintContext context) - { - var fragments = new List(); - - foreach (var objectType in context.SelectionVariants.GetPossibleTypes()) - { - var typeContext = objectType; - var selectionSet = context.SelectionVariants.GetSelectionSet(typeContext); - var selections = new List(); - - fragments.Add(new InlineFragmentNode( - null, - new NamedTypeNode(typeContext.Name), - Array.Empty(), - CreateSelectionSet(context, selectionSet, selections))); - - foreach (var fragment in selectionSet.Fragments) - { - if (context.GetOrCreateFragmentName(fragment.SelectionSet.Id, out var fragmentName)) - { - var index = context.Definitions.Count; - context.Definitions.Add(null!); - - context.Definitions[index] = - new FragmentDefinitionNode( - null, - new(fragmentName), - description: null, - Array.Empty(), - new NamedTypeNode(typeContext.Name), - Array.Empty(), - CreateSelectionSet(context, fragment.SelectionSet, [])); - } - - selections.Add( - new FragmentSpreadNode( - null, - new(fragmentName), - new[] { new DirectiveNode("defer") })); - } - } - - return new SelectionSetNode(fragments); - } - - private static SelectionSetNode CreateSelectionSet( - PrintContext context, - ISelectionSet selectionSet, - List selections) - { - foreach (var selection in selectionSet.Selections) - { - var selectionSetId = ((Selection)selection).SelectionSetId; - SelectionSetNode? selectionSetNode = null; - - if (selection.SelectionSet is not null) - { - var childSelectionSet = context.Operation.SelectionVariants[selectionSetId]; - selectionSetNode = Visit(context.Branch(childSelectionSet)); - } - - selections.Add(CreateSelection(selection, selectionSetNode)); - } - - return new SelectionSetNode(selections); - } - - private static FieldNode CreateSelection( - ISelection selection, - SelectionSetNode? selectionSet) - { - var directives = new List(); - - if (selection.IsConditional) - { - directives.Add(new DirectiveNode("conditional")); - } - - directives.Add(CreateExecutionInfo(selection)); - - return new FieldNode( - null, - selection.SyntaxNode.Name, - selection.SyntaxNode.Alias, - directives, - selection.SyntaxNode.Arguments, - selectionSet); - } - - private static DirectiveNode CreateExecutionInfo(ISelection selection) - { - var arguments = new ArgumentNode[selection.IsInternal ? 4 : 3]; - arguments[0] = new ArgumentNode("id", new IntValueNode(selection.Id)); - arguments[1] = new ArgumentNode("kind", new EnumValueNode(selection.Strategy)); - - if (selection.Type.IsListType()) - { - if (selection.Type.NamedType().IsLeafType()) - { - arguments[2] = new ArgumentNode("type", new EnumValueNode("LEAF_LIST")); - } - else - { - arguments[2] = new ArgumentNode("type", new EnumValueNode("COMPOSITE_LIST")); - } - } - else if (selection.Type.IsCompositeType()) - { - arguments[2] = new ArgumentNode("type", new EnumValueNode("COMPOSITE")); - } - else if (selection.Type.IsLeafType()) - { - arguments[2] = new ArgumentNode("type", new EnumValueNode("LEAF")); - } - - if (selection.IsInternal) - { - arguments[3] = new ArgumentNode("internal", BooleanValueNode.True); - } - - return new DirectiveNode("__execute", arguments); - } - - private sealed class PrintContext - { - private readonly GlobalState _state; - - public PrintContext( - Operation operation, - ISelectionVariants selectionVariants, - List definitions) - { - Operation = operation; - SelectionVariants = selectionVariants; - Definitions = definitions; - _state = new(); - } - - private PrintContext( - Operation operation, - ISelectionVariants selectionVariants, - List definitions, - GlobalState state) - { - Operation = operation; - SelectionVariants = selectionVariants; - Definitions = definitions; - _state = state; - } - - public Operation Operation { get; } - - public ISelectionVariants SelectionVariants { get; } - - public List Definitions { get; } - - public bool GetOrCreateFragmentName(int selectionSetId, out string fragmentName) - { - if (!_state.FragmentNames.TryGetValue(selectionSetId, out var name)) - { - name = $"Fragment_{_state.FragmentId++}"; - _state.FragmentNames.Add(selectionSetId, name); - fragmentName = name; - return true; - } - - fragmentName = name; - return false; - } - - public PrintContext Branch(ISelectionVariants selectionVariants) - => new(Operation, selectionVariants, Definitions, _state); - - private sealed class GlobalState - { - public int FragmentId; - public readonly Dictionary FragmentNames = []; - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index cd95444549b..b782c6cf467 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -1,5 +1,5 @@ -using System.Diagnostics; using HotChocolate.Execution.Properties; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Resolvers; using HotChocolate.Types; @@ -9,7 +9,7 @@ namespace HotChocolate.Execution.Processing; /// /// Represents a field selection during execution. /// -public class Selection : ISelection +public sealed class Selection : ISelection, IFeatureProvider { private static readonly ArgumentMap s_emptyArguments = ArgumentMap.Empty; private readonly FieldSelectionNode[] _syntaxNodes; @@ -24,9 +24,9 @@ internal Selection( FieldSelectionNode[] syntaxNodes, ulong[] includeFlags, bool isInternal, - ArgumentMap? arguments = null, - FieldDelegate? resolverPipeline = null, - PureFieldDelegate? pureResolver = null) + ArgumentMap? arguments, + FieldDelegate? resolverPipeline, + PureFieldDelegate? pureResolver) { ArgumentNullException.ThrowIfNull(field); @@ -71,42 +71,84 @@ internal Selection( internal ReadOnlySpan Utf8ResponseName => _utf8ResponseName; + /// public bool IsInternal => (_flags & Flags.Internal) == Flags.Internal; + /// public bool IsConditional => _includeFlags.Length > 0; + /// + /// Gets a value indicating whether this selection returns a list type. + /// public bool IsList => (_flags & Flags.List) == Flags.List; + /// public bool IsLeaf => (_flags & Flags.Leaf) == Flags.Leaf; /// - /// Defines if this selection has child selections. + /// Gets a value indicating whether this selection has child selections. /// public bool HasSelections => !IsLeaf; + /// + /// Gets the field definition from the schema that this selection targets. + /// public ObjectField Field { get; } /// IOutputFieldDefinition ISelection.Field => Field; + /// public IType Type => Field.Type; + /// + /// Gets the object type that declares the field being selected. + /// public ObjectType DeclaringType => Field.DeclaringType; + /// + /// Gets the selection set that contains this selection. + /// public SelectionSet DeclaringSelectionSet { get; private set; } = null!; + /// ISelectionSet ISelection.DeclaringSelectionSet => DeclaringSelectionSet; + /// + /// Gets the operation that contains this selection. + /// public Operation DeclaringOperation => DeclaringSelectionSet.DeclaringOperation; + /// + /// Gets the selection features. + /// + public SelectionFeatureCollection Features => new(DeclaringOperation.Features, Id); + + IFeatureCollection IFeatureProvider.Features => Features; + + /// + /// Gets the arguments that were provided to this field selection. + /// public ArgumentMap Arguments { get; } + /// + /// Gets the execution strategy for this selection. + /// public SelectionExecutionStrategy Strategy { get; private set; } + /// + /// Gets the resolver pipeline delegate for this selection. + /// public FieldDelegate? ResolverPipeline { get; private set; } + /// + /// Gets the pure resolver delegate for this selection. + /// public PureFieldDelegate? PureResolver { get; private set; } + /// + /// Gets the syntax nodes that contributed to this selection. + /// public ReadOnlySpan SyntaxNodes => _syntaxNodes; IEnumerable ISelection.GetSyntaxNodes() @@ -117,6 +159,17 @@ IEnumerable ISelection.GetSyntaxNodes() } } + /// + /// Determines whether this selection should be skipped based on conditional flags. + /// + /// The conditional inclusion flags. + /// + /// true if this selection should be included; otherwise, false. + /// + public bool IsSkipped(ulong includeFlags) + => IsIncluded(includeFlags); + + /// public bool IsIncluded(ulong includeFlags) { if (_includeFlags.Length == 0) @@ -232,35 +285,4 @@ private enum Flags Stream = 8, Leaf = 16 } - - internal sealed class Sealed : Selection - { - public Sealed( - int id, - ObjectType declaringType, - ObjectField field, - IType type, - FieldNode syntaxNode, - string responseName, - ArgumentMap? arguments = null, - ulong[]? includeConditions = null, - bool isInternal = false, - bool isParallelExecutable = true, - FieldDelegate? resolverPipeline = null, - PureFieldDelegate? pureResolver = null) : base( - id, - declaringType, - field, - type, - syntaxNode, - responseName, - arguments, - includeConditions, - isInternal, - isParallelExecutable, - resolverPipeline, - pureResolver) - { - } - } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs new file mode 100644 index 00000000000..c122ee84ae3 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs @@ -0,0 +1,44 @@ +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using HotChocolate.Features; + +namespace HotChocolate.Execution.Processing; + +public readonly struct SelectionFeatureCollection : IFeatureCollection +{ + private readonly OperationFeatureCollection _parent; + private readonly int _selectionId; + + internal SelectionFeatureCollection(OperationFeatureCollection parent, int selectionId) + { + _parent = parent; + _selectionId = selectionId; + } + + public bool IsReadOnly => _parent.IsReadOnly; + + public bool IsEmpty => !_parent.HasFeatures(_selectionId); + + public int Revision => _parent.Revision; + + public object? this[Type key] + { + get => _parent[_selectionId, key]; + set => _parent[_selectionId, key] = value; + } + + public bool TryGet([NotNullWhen(true)] out TFeature? feature) + => _parent.TryGet(_selectionId, out feature); + + public TFeature GetOrSetSafe() where TFeature : new() + => GetOrSetSafe(static () => new TFeature()); + + internal TFeature GetOrSetSafe(Func factory) + => _parent.GetOrSetSafe(_selectionId, factory); + + public IEnumerator> GetEnumerator() + => _parent.GetFeatures(_selectionId).GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() + => GetEnumerator(); +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs index 39af1b52e5a..46cce24dd61 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs @@ -1,4 +1,5 @@ using System.Collections.Frozen; +using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using HotChocolate.Types; @@ -17,7 +18,7 @@ public sealed class SelectionSet : ISelectionSet private readonly SelectionLookup _utf8ResponseNameLookup; private Flags _flags; - public SelectionSet(int id, IObjectTypeDefinition type, Selection[] selections, bool isConditional) + internal SelectionSet(int id, IObjectTypeDefinition type, Selection[] selections, bool isConditional) { ArgumentNullException.ThrowIfNull(selections); @@ -63,6 +64,36 @@ public SelectionSet(int id, IObjectTypeDefinition type, Selection[] selections, IEnumerable ISelectionSet.GetSelections() => _selections; + /// + /// Tries to resolve a selection by name. + /// + /// + /// The selection response name. + /// + /// + /// The resolved selection. + /// + /// + /// Returns true if the selection was successfully resolved. + /// + public bool TryGetSelection(string responseName, [NotNullWhen(true)] out Selection? selection) + => _responseNameLookup.TryGetValue(responseName, out selection); + + /// + /// Tries to resolve a selection by name. + /// + /// + /// The selection response name. + /// + /// + /// The resolved selection. + /// + /// + /// Returns true if the selection was successfully resolved. + /// + public bool TryGetSelection(ReadOnlySpan utf8ResponseName, [NotNullWhen(true)] out Selection? selection) + => _utf8ResponseNameLookup.TryGetSelection(utf8ResponseName, out selection); + internal void Complete(Operation declaringOperation, bool seal) { if ((_flags & Flags.Sealed) == Flags.Sealed) @@ -83,16 +114,6 @@ internal void Complete(Operation declaringOperation, bool seal) } } - /// - /// Returns a reference to the 0th element of the underlying selections array. - /// If the selections array is empty, returns a reference to the location where the 0th element - /// would have been stored. Such a reference may or may not be null. - /// It can be used for pinning but must never be de-referenced. - /// This is only meant for use by the execution engine. - /// - internal ref Selection GetSelectionsReference() - => ref MemoryMarshal.GetReference(_selections.AsSpan()); - [Flags] private enum Flags { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.Subscription.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.Subscription.cs index 5d0609fafb7..ef15af5a215 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.Subscription.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.Subscription.cs @@ -3,7 +3,6 @@ using HotChocolate.Execution.Internal; using HotChocolate.Fetching; using HotChocolate.Types; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.ObjectPool; namespace HotChocolate.Execution.Processing; @@ -20,7 +19,7 @@ private sealed class Subscription : ISubscription, IAsyncDisposable private IDisposable? _subscriptionScope; private readonly RequestContext _requestContext; private readonly ObjectType _subscriptionType; - private readonly ISelectionSet _rootSelections; + private readonly SelectionSet _rootSelections; private readonly Func _resolveQueryRootValue; private ISourceStream _sourceStream = null!; private object? _cachedRootValue; @@ -33,7 +32,7 @@ private Subscription( QueryExecutor queryExecutor, RequestContext requestContext, ObjectType subscriptionType, - ISelectionSet rootSelections, + SelectionSet rootSelections, Func resolveQueryRootValue, IExecutionDiagnosticEvents diagnosticEvents) { @@ -85,7 +84,7 @@ public static async ValueTask SubscribeAsync( QueryExecutor queryExecutor, RequestContext requestContext, ObjectType subscriptionType, - ISelectionSet rootSelections, + SelectionSet rootSelections, Func resolveQueryRootValue, IExecutionDiagnosticEvents diagnosticsEvents) { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs index 112df731c60..0ffe890c8a2 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs @@ -1,6 +1,5 @@ using HotChocolate.Execution.Internal; using HotChocolate.Types; -using Microsoft.Extensions.DependencyInjection; using System.Runtime.InteropServices; namespace HotChocolate.Execution.Processing.Tasks; @@ -168,6 +167,8 @@ private async ValueTask ExecuteResolverPipelineAsync(CancellationToken cancellat _context.Result = await postProcessor.ToCompletionResultAsync(result, cancellationToken).ConfigureAwait(false); } + // TODO : DEFER + /* private async ValueTask> CreateStreamResultAsync(IAsyncEnumerable stream) { var streamDirective = _selection.GetStreamDirective(_context.Variables)!; @@ -203,7 +204,6 @@ private async ValueTask ExecuteResolverPipelineAsync(CancellationToken cancellat // TODO : DEFER // if the stream has more items than the initial requested items then we will // defer the rest of the stream. - /* _operationContext.DeferredScheduler.Register( new DeferredStream( Selection, @@ -214,7 +214,6 @@ private async ValueTask ExecuteResolverPipelineAsync(CancellationToken cancellat enumerator, _context.ScopedContextData), _context.ParentResult); - */ } return list; @@ -230,6 +229,7 @@ private async ValueTask ExecuteResolverPipelineAsync(CancellationToken cancellat } } } + */ /// /// diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs index a5d30fe42a4..5bd5f9edf88 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs @@ -40,6 +40,7 @@ internal bool Reset() Next = null; Previous = null; State = null; + _task = null; _taskBuffer.Clear(); _args.Clear(); return true; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs index 420df73c557..c54b36a56f5 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs @@ -251,7 +251,7 @@ private static void ResolveAndCompleteInline( private static void CompleteInline( OperationContext operationContext, MiddlewareContext resolverContext, - ISelection selection, + Selection selection, IType type, int responseIndex, ObjectResult parentResult, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs index b5adb3b5674..a2866256f59 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs @@ -9,7 +9,7 @@ internal static partial class ValueCompletion { private static object? CompleteLeafValue( ValueCompletionContext context, - ISelection selection, + Selection selection, IType type, ResultData parent, int index, @@ -34,13 +34,13 @@ internal static partial class ValueCompletion catch (SerializationException ex) { var errorPath = CreatePathFromContext(selection, parent, index); - var error = InvalidLeafValue(ex, selection.SyntaxNode, errorPath); + var error = InvalidLeafValue(ex, selection, errorPath); operationContext.ReportError(error, resolverContext, selection); } catch (Exception ex) { var errorPath = CreatePathFromContext(selection, parent, index); - var error = UnexpectedLeafValueSerializationError(ex, selection.SyntaxNode, errorPath); + var error = UnexpectedLeafValueSerializationError(ex, selection, errorPath); operationContext.ReportError(error, resolverContext, selection); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs index 4608d697f24..cfa0ba15099 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs @@ -10,7 +10,7 @@ internal static partial class ValueCompletion { private static object? CompleteListValue( ValueCompletionContext context, - ISelection selection, + Selection selection, IType type, ResultData parent, int index, @@ -114,7 +114,7 @@ internal static partial class ValueCompletion } var errorPath = CreatePathFromContext(selection, parent, index); - var error = ListValueIsNotSupported(result.GetType(), selection.SyntaxNode, errorPath); + var error = ListValueIsNotSupported(result.GetType(), selection, errorPath); operationContext.ReportError(error, resolverContext, selection); return null; @@ -122,7 +122,7 @@ internal static partial class ValueCompletion private static bool TryCompleteElement( ValueCompletionContext context, - ISelection selection, + Selection selection, IType elementType, bool isLeafType, ListResult list, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs index a18286305d3..3eb8a859f72 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs @@ -8,7 +8,7 @@ internal static partial class ValueCompletion { public static object? Complete( ValueCompletionContext context, - ISelection selection, + Selection selection, ResultData parent, int index, object? result) @@ -16,7 +16,7 @@ internal static partial class ValueCompletion public static object? Complete( ValueCompletionContext context, - ISelection selection, + Selection selection, IType type, ResultData parent, int index, @@ -51,7 +51,7 @@ internal static partial class ValueCompletion } var errorPath = CreatePathFromContext(selection, parent, index); - var error = UnexpectedValueCompletionError(selection.SyntaxNode, errorPath); + var error = UnexpectedValueCompletionError(selection, errorPath); context.OperationContext.ReportError(error, context.ResolverContext, selection); return null; } diff --git a/src/HotChocolate/Core/src/Types/Extensions/ErrorBuilderExtensions.cs b/src/HotChocolate/Core/src/Types/Extensions/ErrorBuilderExtensions.cs new file mode 100644 index 00000000000..7a6362d85c2 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Extensions/ErrorBuilderExtensions.cs @@ -0,0 +1,20 @@ +using System.Diagnostics; +using HotChocolate.Execution.Processing; + +namespace HotChocolate; + +internal static class ErrorBuilderExtensions +{ + public static ErrorBuilder AddLocations(this ErrorBuilder errorBuilder, Selection selection) + { + Debug.Assert(errorBuilder is not null); + Debug.Assert(selection is not null); + + foreach (var syntaxNode in selection.SyntaxNodes) + { + errorBuilder.AddLocation(syntaxNode.Node); + } + + return errorBuilder; + } +} diff --git a/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs b/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs index 8936dc920b4..29c5d692654 100644 --- a/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs @@ -8,779 +8,750 @@ namespace HotChocolate; public static class ResolverContextExtensions { - /// - /// Gets the global state for the specified , - /// or a default value if the state could not be resolved. - /// - /// The resolver context. - /// The name of the state. - /// The type of the state. - /// - /// Returns the global state for the specified - /// or the default value of , if the state - /// could not be found or cast to . - /// - public static T? GetGlobalStateOrDefault( - this IResolverContext context, - string name) + extension(IResolverContext context) { - ArgumentNullException.ThrowIfNull(context); + /// + /// Gets the global state for the specified , + /// or a default value if the state could not be resolved. + /// + /// The name of the state. + /// The type of the state. + /// + /// Returns the global state for the specified + /// or the default value of , if the state + /// could not be found or cast to . + /// + public T? GetGlobalStateOrDefault(string name) + { + ArgumentNullException.ThrowIfNull(context); + + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + if (context.ContextData.TryGetValue(name, out var value) + && value is T casted) + { + return casted; + } + + return default; } - if (context.ContextData.TryGetValue(name, out var value) - && value is T casted) + /// + /// Gets the global state for the specified , + /// or a default value if the state could not be resolved. + /// + /// The name of the state. + /// The default value. + /// The type of the state. + /// + /// Returns the global state for the specified + /// or the default value of , if the state + /// could not be found or cast to . + /// + public T GetGlobalStateOrDefault(string name, + T defaultValue) { - return casted; - } + ArgumentNullException.ThrowIfNull(context); - return default; - } + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - /// - /// Gets the global state for the specified , - /// or a default value if the state could not be resolved. - /// - /// The resolver context. - /// The name of the state. - /// The default value. - /// The type of the state. - /// - /// Returns the global state for the specified - /// or the default value of , if the state - /// could not be found or cast to . - /// - public static T GetGlobalStateOrDefault( - this IResolverContext context, - string name, - T defaultValue) - { - ArgumentNullException.ThrowIfNull(context); + if (context.ContextData.TryGetValue(name, out var value) + && value is T casted) + { + return casted; + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + return defaultValue; } - if (context.ContextData.TryGetValue(name, out var value) - && value is T casted) + /// + /// Gets the global state for the specified , + /// or throws if the state does not exist. + /// + /// The name of the state. + /// The type of the state. + /// + /// Returns the global state for the specified . + /// + public T GetGlobalState(string name) { - return casted; - } + ArgumentNullException.ThrowIfNull(context); - return defaultValue; - } + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - /// - /// Gets the global state for the specified , - /// or throws if the state does not exist. - /// - /// The resolver context. - /// The name of the state. - /// The type of the state. - /// - /// Returns the global state for the specified . - /// - public static T GetGlobalState( - this IResolverContext context, - string name) - { - ArgumentNullException.ThrowIfNull(context); + if (context.ContextData.TryGetValue(name, out var value) && value is T typedValue) + { + return typedValue; + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + throw new ArgumentException( + string.Format(ResolverContextExtensions_ContextData_KeyNotFound, name)); } - if (context.ContextData.TryGetValue(name, out var value) && value is T typedValue) + /// + /// Gets the scoped state for the specified , + /// or a default value if the state could not be resolved. + /// + /// The name of the state. + /// The type of the state. + /// + /// Returns the scoped state for the specified + /// or the default value of , if the state + /// could not be found or cast to . + /// + public T? GetScopedStateOrDefault(string name) { - return typedValue; - } + ArgumentNullException.ThrowIfNull(context); - throw new ArgumentException( - string.Format(ResolverContextExtensions_ContextData_KeyNotFound, name)); - } + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - /// - /// Gets the scoped state for the specified , - /// or a default value if the state could not be resolved. - /// - /// The resolver context. - /// The name of the state. - /// The type of the state. - /// - /// Returns the scoped state for the specified - /// or the default value of , if the state - /// could not be found or cast to . - /// - public static T? GetScopedStateOrDefault( - this IResolverContext context, - string name) - { - ArgumentNullException.ThrowIfNull(context); + if (context.ScopedContextData.TryGetValue(name, out var value) + && value is T casted) + { + return casted; + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + return default; } - if (context.ScopedContextData.TryGetValue(name, out var value) - && value is T casted) + /// + /// Gets the scoped state for the specified , + /// or a default value if the state could not be resolved. + /// + /// The name of the state. + /// The default value. + /// The type of the state. + /// + /// Returns the scoped state for the specified + /// or the default value of , if the state + /// could not be found or cast to . + /// + public T GetScopedStateOrDefault(string name, + T defaultValue) { - return casted; - } + ArgumentNullException.ThrowIfNull(context); - return default; - } + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - /// - /// Gets the scoped state for the specified , - /// or a default value if the state could not be resolved. - /// - /// The resolver context. - /// The name of the state. - /// The default value. - /// The type of the state. - /// - /// Returns the scoped state for the specified - /// or the default value of , if the state - /// could not be found or cast to . - /// - public static T GetScopedStateOrDefault( - this IResolverContext context, - string name, - T defaultValue) - { - ArgumentNullException.ThrowIfNull(context); + if (context.ScopedContextData.TryGetValue(name, out var value) + && value is T casted) + { + return casted; + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + return defaultValue; } - if (context.ScopedContextData.TryGetValue(name, out var value) - && value is T casted) + /// + /// Gets the scoped state for the specified , + /// or throws if the state does not exist. + /// + /// The name of the state. + /// The type of the state. + /// + /// Returns the scoped state for the specified . + /// + public T GetScopedState(string name) { - return casted; - } + ArgumentNullException.ThrowIfNull(context); - return defaultValue; - } + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - /// - /// Gets the scoped state for the specified , - /// or throws if the state does not exist. - /// - /// The resolver context. - /// The name of the state. - /// The type of the state. - /// - /// Returns the scoped state for the specified . - /// - public static T GetScopedState( - this IResolverContext context, - string name) - { - ArgumentNullException.ThrowIfNull(context); + if (context.ScopedContextData.TryGetValue(name, out var value) + && value is T typedValue) + { + return typedValue; + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + throw new ArgumentException( + string.Format(ResolverContextExtensions_ScopedContextData_KeyNotFound, name)); } - if (context.ScopedContextData.TryGetValue(name, out var value) - && value is T typedValue) + /// + /// Gets the local state for the specified , + /// or a default value if the state could not be resolved. + /// + /// The name of the state. + /// The type of the state. + /// + /// Returns the local state for the specified + /// or the default value of , if the state + /// could not be found or cast to . + /// + public T? GetLocalStateOrDefault(string name) { - return typedValue; - } + ArgumentNullException.ThrowIfNull(context); - throw new ArgumentException( - string.Format(ResolverContextExtensions_ScopedContextData_KeyNotFound, name)); - } + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - /// - /// Gets the local state for the specified , - /// or a default value if the state could not be resolved. - /// - /// The resolver context. - /// The name of the state. - /// The type of the state. - /// - /// Returns the local state for the specified - /// or the default value of , if the state - /// could not be found or cast to . - /// - public static T? GetLocalStateOrDefault( - this IResolverContext context, - string name) - { - ArgumentNullException.ThrowIfNull(context); + if (context.LocalContextData.TryGetValue(name, out var value) + && value is T casted) + { + return casted; + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + return default; } - if (context.LocalContextData.TryGetValue(name, out var value) - && value is T casted) + /// + /// Gets the local state for the specified , + /// or a default value if the state could not be resolved. + /// + /// The name of the state. + /// The default value. + /// The type of the state. + /// + /// Returns the local state for the specified + /// or the default value of , if the state + /// could not be found or cast to . + /// + public T GetLocalStateOrDefault(string name, + T defaultValue) { - return casted; - } + ArgumentNullException.ThrowIfNull(context); - return default; - } + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - /// - /// Gets the local state for the specified , - /// or a default value if the state could not be resolved. - /// - /// The resolver context. - /// The name of the state. - /// The default value. - /// The type of the state. - /// - /// Returns the local state for the specified - /// or the default value of , if the state - /// could not be found or cast to . - /// - public static T GetLocalStateOrDefault( - this IResolverContext context, - string name, - T defaultValue) - { - ArgumentNullException.ThrowIfNull(context); + if (context.LocalContextData.TryGetValue(name, out var value) + && value is T casted) + { + return casted; + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + return defaultValue; } - if (context.LocalContextData.TryGetValue(name, out var value) - && value is T casted) + /// + /// Gets the local state for the specified , + /// or throws if the state does not exist. + /// + /// The name of the state. + /// The type of the state. + /// + /// Returns the local state for the specified . + /// + public T GetLocalState(string name) { - return casted; - } + ArgumentNullException.ThrowIfNull(context); - return defaultValue; - } + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - /// - /// Gets the local state for the specified , - /// or throws if the state does not exist. - /// - /// The resolver context. - /// The name of the state. - /// The type of the state. - /// - /// Returns the local state for the specified . - /// - public static T GetLocalState( - this IResolverContext context, - string name) - { - ArgumentNullException.ThrowIfNull(context); + if (context.LocalContextData.TryGetValue(name, out var value) + && value is T casted) + { + return casted; + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + throw new ArgumentException( + string.Format(ResolverContextExtensions_LocalContextData_KeyNotFound, name)); } - if (context.LocalContextData.TryGetValue(name, out var value) - && value is T casted) + /// + /// Sets the global state for + /// to the specified . + /// State set previously using the same + /// will be overwritten. + /// + /// The name of the state. + /// The new state value. + /// The type of the state. + public void SetGlobalState(string name, + T value) { - return casted; - } + ArgumentNullException.ThrowIfNull(context); - throw new ArgumentException( - string.Format(ResolverContextExtensions_LocalContextData_KeyNotFound, name)); - } - - /// - /// Sets the global state for - /// to the specified . - /// State set previously using the same - /// will be overwritten. - /// - /// The resolver context. - /// The name of the state. - /// The new state value. - /// The type of the state. - public static void SetGlobalState( - this IResolverContext context, - string name, - T value) - { - ArgumentNullException.ThrowIfNull(context); + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + context.ContextData[name] = value; } - context.ContextData[name] = value; - } - - /// - /// Sets the scoped state for - /// to the specified . - /// State set previously using the same - /// will be overwritten. - /// - /// The resolver context. - /// The name of the state. - /// The new state value. - /// The type of the state. - public static void SetScopedState( - this IResolverContext context, - string name, - T value) - { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) + /// + /// Sets the scoped state for + /// to the specified . + /// State set previously using the same + /// will be overwritten. + /// + /// The name of the state. + /// The new state value. + /// The type of the state. + public void SetScopedState(string name, + T value) { - throw String_NullOrEmpty(nameof(name)); - } - - context.ScopedContextData = context.ScopedContextData.SetItem(name, value); - } + ArgumentNullException.ThrowIfNull(context); - /// - /// Sets the local state for - /// to the specified . - /// State set previously using the same - /// will be overwritten. - /// - /// The resolver context. - /// The name of the state. - /// The new state value. - /// The type of the state. - public static void SetLocalState( - this IResolverContext context, - string name, - T value) - { - ArgumentNullException.ThrowIfNull(context); + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + context.ScopedContextData = context.ScopedContextData.SetItem(name, value); } - context.LocalContextData = context.LocalContextData.SetItem(name, value); - } - - /// - /// Gets or sets the global state for the specified . - /// - /// The resolver context. - /// The name of the state. - /// - /// A function that receives the name of the state as an argument - /// and returns the new state value that should be set. - /// - /// The type of the state. - /// - /// The existing state for the specified , - /// or the newly created state using the function. - /// - public static T GetOrSetGlobalState( - this IResolverContext context, - string name, - Func createValue) - { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) + /// + /// Sets the local state for + /// to the specified . + /// State set previously using the same + /// will be overwritten. + /// + /// The name of the state. + /// The new state value. + /// The type of the state. + public void SetLocalState(string name, + T value) { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentNullException.ThrowIfNull(context); - ArgumentNullException.ThrowIfNull(createValue); + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - if (context.ContextData.TryGetValue(name, out var value) - && value is T casted) - { - return casted; + context.LocalContextData = context.LocalContextData.SetItem(name, value); } - var newValue = createValue(name); - SetGlobalState(context, name, newValue); - return newValue; - } - - /// - /// Gets or sets the scoped state for the specified . - /// - /// The resolver context. - /// The name of the state. - /// - /// A function that receives the name of the state as an argument - /// and returns the new state value that should be set. - /// - /// The type of the state. - /// - /// The existing state for the specified , - /// or the newly created state using the function. - /// - public static T GetOrSetScopedState( - this IResolverContext context, - string name, - Func createValue) - { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) + /// + /// Gets or sets the global state for the specified . + /// + /// The name of the state. + /// + /// A function that receives the name of the state as an argument + /// and returns the new state value that should be set. + /// + /// The type of the state. + /// + /// The existing state for the specified , + /// or the newly created state using the function. + /// + public T GetOrSetGlobalState(string name, + Func createValue) { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentNullException.ThrowIfNull(context); - ArgumentNullException.ThrowIfNull(createValue); + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - if (context.ScopedContextData.TryGetValue(name, out var value) - && value is T casted) - { - return casted; - } + ArgumentNullException.ThrowIfNull(createValue); - var newValue = createValue(name); - SetScopedState(context, name, newValue); - return newValue; - } + if (context.ContextData.TryGetValue(name, out var value) + && value is T casted) + { + return casted; + } - /// - /// Gets or sets the local state for the specified . - /// - /// The resolver context. - /// The name of the state. - /// - /// A function that receives the name of the state as an argument - /// and returns the new state value that should be set. - /// - /// The type of the state. - /// - /// The existing state for the specified , - /// or the newly created state using the function. - /// - public static T GetOrSetLocalState( - this IResolverContext context, - string name, - Func createValue) - { - ArgumentNullException.ThrowIfNull(context); + var newValue = createValue(name); + SetGlobalState(context, name, newValue); + return newValue; + } + + /// + /// Gets or sets the scoped state for the specified . + /// + /// The name of the state. + /// + /// A function that receives the name of the state as an argument + /// and returns the new state value that should be set. + /// + /// The type of the state. + /// + /// The existing state for the specified , + /// or the newly created state using the function. + /// + public T GetOrSetScopedState(string name, + Func createValue) + { + ArgumentNullException.ThrowIfNull(context); + + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentNullException.ThrowIfNull(createValue); - ArgumentNullException.ThrowIfNull(createValue); + if (context.ScopedContextData.TryGetValue(name, out var value) + && value is T casted) + { + return casted; + } - if (context.LocalContextData.TryGetValue(name, out var value) - && value is T casted) - { - return casted; - } + var newValue = createValue(name); + SetScopedState(context, name, newValue); + return newValue; + } + + /// + /// Gets or sets the local state for the specified . + /// + /// The name of the state. + /// + /// A function that receives the name of the state as an argument + /// and returns the new state value that should be set. + /// + /// The type of the state. + /// + /// The existing state for the specified , + /// or the newly created state using the function. + /// + public T GetOrSetLocalState(string name, + Func createValue) + { + ArgumentNullException.ThrowIfNull(context); + + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - var newValue = createValue(name); - SetLocalState(context, name, newValue); - return newValue; - } + ArgumentNullException.ThrowIfNull(createValue); - /// - /// Removes the scoped state set for the specified . - /// - /// The resolver context. - /// The name of the state. - public static void RemoveScopedState( - this IResolverContext context, - string name) - { - ArgumentNullException.ThrowIfNull(context); + if (context.LocalContextData.TryGetValue(name, out var value) + && value is T casted) + { + return casted; + } - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); + var newValue = createValue(name); + SetLocalState(context, name, newValue); + return newValue; } - context.ScopedContextData = context.ScopedContextData.Remove(name); - } - - /// - /// Removes the local state set for the specified . - /// - /// The resolver context. - /// The name of the state. - public static void RemoveLocalState( - this IResolverContext context, - string name) - { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) + /// + /// Removes the scoped state set for the specified . + /// + /// The name of the state. + public void RemoveScopedState(string name) { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentNullException.ThrowIfNull(context); - context.LocalContextData = context.LocalContextData.Remove(name); - } + if (string.IsNullOrEmpty(name)) + { + throw String_NullOrEmpty(nameof(name)); + } - /// - /// Gets the event message. - /// - /// The resolver context. - /// The type of the event message. - /// The event message. - public static T GetEventMessage(this IResolverContext context) - { - ArgumentNullException.ThrowIfNull(context); + context.ScopedContextData = context.ScopedContextData.Remove(name); + } - if (context.ScopedContextData.TryGetValue( - WellKnownContextData.EventMessage, - out var value) && value is { }) + /// + /// Removes the local state set for the specified . + /// + /// The name of the state. + public void RemoveLocalState(string name) { - if (value is T casted) + ArgumentNullException.ThrowIfNull(context); + + if (string.IsNullOrEmpty(name)) { - return casted; + throw String_NullOrEmpty(nameof(name)); } - throw EventMessage_InvalidCast(typeof(T), value.GetType()); + context.LocalContextData = context.LocalContextData.Remove(name); } - throw EventMessage_NotFound(); - } + /// + /// Gets the event message. + /// + /// The type of the event message. + /// The event message. + public T GetEventMessage() + { + ArgumentNullException.ThrowIfNull(context); - /// - /// Gets the user for this request. - /// - /// - /// The resolver context. - /// - /// - /// Returns the user for this request. - /// - public static ClaimsPrincipal? GetUser(this IResolverContext context) - => context.GetGlobalStateOrDefault(nameof(ClaimsPrincipal)); - - /// - /// Checks if a field is selected in the current selection set. - /// - /// - /// The resolver context. - /// - /// - /// The name of the field that shall be checked. - /// - /// - /// true if the field is selected; otherwise, false. - /// - /// - /// is null. - /// - /// - /// is null or whitespace. - /// - public static bool IsSelected(this IResolverContext context, string fieldName) - { - ArgumentNullException.ThrowIfNull(context); + if (context.ScopedContextData.TryGetValue( + WellKnownContextData.EventMessage, + out var value) && value is { }) + { + if (value is T casted) + { + return casted; + } - if (string.IsNullOrWhiteSpace(fieldName)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName)); - } + throw EventMessage_InvalidCast(typeof(T), value.GetType()); + } - var namedType = context.Selection.Type.NamedType(); + throw EventMessage_NotFound(); + } + + /// + /// Gets the user for this request. + /// + /// + /// Returns the user for this request. + /// + public ClaimsPrincipal? GetUser() + => context.GetGlobalStateOrDefault(nameof(ClaimsPrincipal)); + + /// + /// Checks if a field is selected in the current selection set. + /// + /// + /// The name of the field that shall be checked. + /// + /// + /// true if the field is selected; otherwise, false. + /// + /// + /// is null. + /// + /// + /// is null or whitespace. + /// + public bool IsSelected(string fieldName) + { + ArgumentNullException.ThrowIfNull(context); + + if (string.IsNullOrWhiteSpace(fieldName)) + { + throw new ArgumentException( + ResolverContextExtensions_IsSelected_FieldNameEmpty, + nameof(fieldName)); + } - if (!namedType.IsCompositeType()) - { - return false; - } + var namedType = context.Selection.Type.NamedType(); - if (namedType.IsAbstractType()) - { - foreach (var possibleType in context.Schema.GetPossibleTypes(namedType)) + if (!namedType.IsCompositeType()) { - var selections = context.GetSelections(possibleType, context.Selection); + return false; + } - for (var i = 0; i < selections.Count; i++) + if (namedType.IsAbstractType()) + { + foreach (var possibleType in context.Schema.GetPossibleTypes(namedType)) { - if (selections[i].Field.Name.Equals(fieldName)) + var includeFlags = context.IncludeFlags; + var selectionSet = context.Operation.GetSelectionSet(context.Selection, possibleType); + + foreach(var selection in selectionSet.Selections) { - return true; + if (selection.IsIncluded(includeFlags) + && selection.Field.Name.Equals(fieldName)) + { + return true; + } } } } - } - else - { - var selections = context.GetSelections((ObjectType)namedType, context.Selection); - - for (var i = 0; i < selections.Count; i++) + else { - if (selections[i].Field.Name.Equals(fieldName)) + var includeFlags = context.IncludeFlags; + var selectionSet = context.Operation.GetSelectionSet(context.Selection, (ObjectType)namedType); + + foreach(var selection in selectionSet.Selections) { - return true; + if (selection.IsIncluded(includeFlags) + && selection.Field.Name.Equals(fieldName)) + { + return true; + } } } - } - - return false; - } - /// - /// Checks if a field is selected in the current selection set. - /// - /// - /// The resolver context. - /// - /// - /// The name of the first field that shall be checked. - /// - /// - /// The name of the second field that shall be checked. - /// - /// - /// - /// is null. - /// - /// - /// is null or whitespace or - /// is null or whitespace. - /// - public static bool IsSelected(this IResolverContext context, string fieldName1, string fieldName2) - { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrWhiteSpace(fieldName1)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName1)); + return false; } - if (string.IsNullOrWhiteSpace(fieldName2)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName2)); - } + /// + /// Checks if a field is selected in the current selection set. + /// + /// + /// The name of the first field that shall be checked. + /// + /// + /// The name of the second field that shall be checked. + /// + /// + /// + /// is null. + /// + /// + /// is null or whitespace or + /// is null or whitespace. + /// + public bool IsSelected(string fieldName1, string fieldName2) + { + ArgumentNullException.ThrowIfNull(context); + + if (string.IsNullOrWhiteSpace(fieldName1)) + { + throw new ArgumentException( + ResolverContextExtensions_IsSelected_FieldNameEmpty, + nameof(fieldName1)); + } - var namedType = context.Selection.Type.NamedType(); + if (string.IsNullOrWhiteSpace(fieldName2)) + { + throw new ArgumentException( + ResolverContextExtensions_IsSelected_FieldNameEmpty, + nameof(fieldName2)); + } - if (!namedType.IsCompositeType()) - { - return false; - } + var namedType = context.Selection.Type.NamedType(); - if (namedType.IsAbstractType()) - { - foreach (var possibleType in context.Schema.GetPossibleTypes(namedType)) + if (!namedType.IsCompositeType()) { - var selections = context.GetSelections(possibleType, context.Selection); + return false; + } - for (var i = 0; i < selections.Count; i++) + if (namedType.IsAbstractType()) + { + foreach (var possibleType in context.Schema.GetPossibleTypes(namedType)) { - var selection = selections[i]; + var includeFlags = context.IncludeFlags; + var selectionSet = context.Operation.GetSelectionSet(context.Selection, possibleType); - if (selection.Field.Name.Equals(fieldName1) || selection.Field.Name.Equals(fieldName2)) + foreach(var selection in selectionSet.Selections) { - return true; + if (selection.IsSkipped(includeFlags)) + { + continue; + } + + if (selection.Field.Name.Equals(fieldName1) || selection.Field.Name.Equals(fieldName2)) + { + return true; + } } } } - } - else - { - var selections = context.GetSelections((ObjectType)namedType, context.Selection); - - for (var i = 0; i < selections.Count; i++) + else { - var selection = selections[i]; + var includeFlags = context.IncludeFlags; + var selectionSet = context.Operation.GetSelectionSet(context.Selection, (ObjectType)namedType); - if (selection.Field.Name.Equals(fieldName1) || selection.Field.Name.Equals(fieldName2)) + foreach(var selection in selectionSet.Selections) { - return true; + if (selection.IsSkipped(includeFlags)) + { + continue; + } + + if (selection.Field.Name.Equals(fieldName1) || selection.Field.Name.Equals(fieldName2)) + { + return true; + } } } - } - return false; - } + return false; + } - /// - /// Checks if a field is selected in the current selection set. - /// - /// - /// The resolver context. - /// - /// - /// The name of the first field that shall be checked. - /// - /// - /// The name of the second field that shall be checked. - /// - /// - /// The name of the third field that shall be checked. - /// - /// - /// - /// is null. - /// - /// - /// is null or whitespace or - /// is null or whitespace or - /// is null or whitespace. - /// - public static bool IsSelected( - this IResolverContext context, - string fieldName1, - string fieldName2, - string fieldName3) - { - ArgumentNullException.ThrowIfNull(context); + /// + /// Checks if a field is selected in the current selection set. + /// + /// + /// The name of the first field that shall be checked. + /// + /// + /// The name of the second field that shall be checked. + /// + /// + /// The name of the third field that shall be checked. + /// + /// + /// + /// is null. + /// + /// + /// is null or whitespace or + /// is null or whitespace or + /// is null or whitespace. + /// + public bool IsSelected(string fieldName1, string fieldName2, string fieldName3) + { + ArgumentNullException.ThrowIfNull(context); + + if (string.IsNullOrWhiteSpace(fieldName1)) + { + throw new ArgumentException( + ResolverContextExtensions_IsSelected_FieldNameEmpty, + nameof(fieldName1)); + } - if (string.IsNullOrWhiteSpace(fieldName1)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName1)); - } + if (string.IsNullOrWhiteSpace(fieldName2)) + { + throw new ArgumentException( + ResolverContextExtensions_IsSelected_FieldNameEmpty, + nameof(fieldName2)); + } - if (string.IsNullOrWhiteSpace(fieldName2)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName2)); - } + if (string.IsNullOrWhiteSpace(fieldName3)) + { + throw new ArgumentException( + ResolverContextExtensions_IsSelected_FieldNameEmpty, + nameof(fieldName3)); + } - if (string.IsNullOrWhiteSpace(fieldName3)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName3)); - } + var namedType = context.Selection.Type.NamedType(); - var namedType = context.Selection.Type.NamedType(); + if (!namedType.IsCompositeType()) + { + return false; + } - if (!namedType.IsCompositeType()) - { - return false; - } + if (namedType.IsAbstractType()) + { + foreach (var possibleType in context.Schema.GetPossibleTypes(namedType)) + { + var includeFlags = context.IncludeFlags; + var selectionSet = context.Operation.GetSelectionSet(context.Selection, possibleType); - if (namedType.IsAbstractType()) - { - foreach (var possibleType in context.Schema.GetPossibleTypes(namedType)) + foreach(var selection in selectionSet.Selections) + { + if (selection.IsSkipped(includeFlags)) + { + continue; + } + + if (selection.Field.Name.Equals(fieldName1) + || selection.Field.Name.Equals(fieldName2) + || selection.Field.Name.Equals(fieldName3)) + { + return true; + } + } + } + } + else { - var selections = context.GetSelections(possibleType, context.Selection); + var includeFlags = context.IncludeFlags; + var selectionSet = context.Operation.GetSelectionSet(context.Selection, (ObjectType)namedType); - for (var i = 0; i < selections.Count; i++) + foreach(var selection in selectionSet.Selections) { - var selection = selections[i]; + if (selection.IsSkipped(includeFlags)) + { + continue; + } if (selection.Field.Name.Equals(fieldName1) || selection.Field.Name.Equals(fieldName2) @@ -790,83 +761,66 @@ public static bool IsSelected( } } } + + return false; } - else + + /// + /// Checks if a field is selected in the current selection set. + /// + /// + /// The names of the fields that shall be checked. + /// + /// + /// + /// is null or + /// is null. + /// + public bool IsSelected(ISet fieldNames) { - var selections = context.GetSelections((ObjectType)namedType, context.Selection); + ArgumentNullException.ThrowIfNull(context); + ArgumentNullException.ThrowIfNull(fieldNames); + + var namedType = context.Selection.Type.NamedType(); - for (var i = 0; i < selections.Count; i++) + if (!namedType.IsCompositeType()) { - var selection = selections[i]; + return false; + } - if (selection.Field.Name.Equals(fieldName1) - || selection.Field.Name.Equals(fieldName2) - || selection.Field.Name.Equals(fieldName3)) + if (namedType.IsAbstractType()) + { + foreach (var possibleType in context.Schema.GetPossibleTypes(namedType)) { - return true; + var includeFlags = context.IncludeFlags; + var selectionSet = context.Operation.GetSelectionSet(context.Selection, possibleType); + + foreach(var selection in selectionSet.Selections) + { + if (selection.IsIncluded(includeFlags) + && fieldNames.Contains(selection.Field.Name)) + { + return true; + } + } } } - } - - return false; - } - - /// - /// Checks if a field is selected in the current selection set. - /// - /// - /// The resolver context. - /// - /// - /// The names of the fields that shall be checked. - /// - /// - /// - /// is null or - /// is null. - /// - public static bool IsSelected( - this IResolverContext context, - ISet fieldNames) - { - ArgumentNullException.ThrowIfNull(context); - ArgumentNullException.ThrowIfNull(fieldNames); - - var namedType = context.Selection.Type.NamedType(); - - if (!namedType.IsCompositeType()) - { - return false; - } - - if (namedType.IsAbstractType()) - { - foreach (var possibleType in context.Schema.GetPossibleTypes(namedType)) + else { - var selections = context.GetSelections(possibleType, context.Selection); + var includeFlags = context.IncludeFlags; + var selectionSet = context.Operation.GetSelectionSet(context.Selection, (ObjectType)namedType); - for (var i = 0; i < selections.Count; i++) + foreach(var selection in selectionSet.Selections) { - if (fieldNames.Contains(selections[i].Field.Name)) + if (selection.IsIncluded(includeFlags) + && fieldNames.Contains(selection.Field.Name)) { return true; } } } - } - else - { - var selections = context.GetSelections((ObjectType)namedType, context.Selection); - for (var i = 0; i < selections.Count; i++) - { - if (fieldNames.Contains(selections[i].Field.Name)) - { - return true; - } - } + return false; } - - return false; } } diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index 7b3d5a23453..a36c9b2e24c 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -205,6 +205,22 @@ ResolverTask.cs + + + ValueCompletion.cs + + + + ValueCompletion.cs + + + + ValueCompletion.cs + + + + OperationFeatureCollection.cs + diff --git a/src/HotChocolate/Core/src/Types/Resolvers/DefaultResolverCompiler.cs b/src/HotChocolate/Core/src/Types/Resolvers/DefaultResolverCompiler.cs index c661a27188c..e4f509b19cd 100644 --- a/src/HotChocolate/Core/src/Types/Resolvers/DefaultResolverCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Resolvers/DefaultResolverCompiler.cs @@ -86,7 +86,6 @@ public DefaultResolverCompiler( expressionBuilders.Add(new ResolverContextParameterExpressionBuilder()); expressionBuilders.Add(new SchemaParameterExpressionBuilder()); expressionBuilders.Add(new SelectionParameterExpressionBuilder()); - expressionBuilders.Add(new FieldSyntaxParameterExpressionBuilder()); expressionBuilders.Add(new ObjectTypeParameterExpressionBuilder()); expressionBuilders.Add(new OperationDefinitionParameterExpressionBuilder()); expressionBuilders.Add(new OperationParameterExpressionBuilder()); diff --git a/src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/FieldSyntaxParameterExpressionBuilder.cs b/src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/FieldSyntaxParameterExpressionBuilder.cs deleted file mode 100644 index cc1d1fe29ec..00000000000 --- a/src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/FieldSyntaxParameterExpressionBuilder.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Diagnostics; -using System.Reflection; -using System.Runtime.CompilerServices; -using HotChocolate.Internal; -using HotChocolate.Language; - -namespace HotChocolate.Resolvers.Expressions.Parameters; - -internal sealed class FieldSyntaxParameterExpressionBuilder() - : LambdaParameterExpressionBuilder(ctx => ctx.Selection.SyntaxNode, isPure: true) - , IParameterBindingFactory - , IParameterBinding -{ - public override ArgumentKind Kind - => ArgumentKind.FieldSyntax; - - public override bool CanHandle(ParameterInfo parameter) - => typeof(FieldNode) == parameter.ParameterType; - - public bool CanHandle(ParameterDescriptor parameter) - => typeof(FieldNode) == parameter.Type; - - public IParameterBinding Create(ParameterDescriptor parameter) - => this; - - public T Execute(IResolverContext context) - { - Debug.Assert(typeof(T) == typeof(FieldNode)); - var syntaxNode = context.Selection.SyntaxNode; - return Unsafe.As(ref syntaxNode); - } -} diff --git a/src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/SelectionParameterExpressionBuilder.cs b/src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/SelectionParameterExpressionBuilder.cs index b6a3903611f..2ce5729ad9b 100644 --- a/src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/SelectionParameterExpressionBuilder.cs +++ b/src/HotChocolate/Core/src/Types/Resolvers/Expressions/Parameters/SelectionParameterExpressionBuilder.cs @@ -2,6 +2,7 @@ using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; +using HotChocolate.Execution; using HotChocolate.Execution.Processing; using HotChocolate.Internal; @@ -16,10 +17,12 @@ public override ArgumentKind Kind => ArgumentKind.Selection; public override bool CanHandle(ParameterInfo parameter) - => typeof(ISelection).IsAssignableFrom(parameter.ParameterType); + => typeof(ISelection).IsAssignableFrom(parameter.ParameterType) + || typeof(Selection).IsAssignableFrom(parameter.ParameterType); public bool CanHandle(ParameterDescriptor parameter) - => typeof(ISelection).IsAssignableFrom(parameter.Type); + => typeof(ISelection).IsAssignableFrom(parameter.Type) + || typeof(Selection).IsAssignableFrom(parameter.Type); public override Expression Build(ParameterExpressionBuilderContext context) => Expression.Convert(base.Build(context), context.Parameter.ParameterType); @@ -31,6 +34,6 @@ public T Execute(IResolverContext context) { Debug.Assert(typeof(T) == typeof(ISelection)); var selection = context.Selection; - return Unsafe.As(ref selection); + return Unsafe.As(ref selection); } } diff --git a/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs b/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs index 5eef2e5429d..7a055e474f2 100644 --- a/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs +++ b/src/HotChocolate/Core/src/Types/Resolvers/IResolverContext.cs @@ -44,6 +44,11 @@ public interface IResolverContext : IHasContextData, IFeatureProvider /// Path Path { get; } + /// + /// Gets the selection include flags. + /// + ulong IncludeFlags { get; } + /// /// Gets the previous (parent) resolver result. /// diff --git a/src/HotChocolate/Core/src/Types/Resolvers/ParameterBindingResolver.cs b/src/HotChocolate/Core/src/Types/Resolvers/ParameterBindingResolver.cs index 4c0e43d9cd7..e4b3eafd3fa 100644 --- a/src/HotChocolate/Core/src/Types/Resolvers/ParameterBindingResolver.cs +++ b/src/HotChocolate/Core/src/Types/Resolvers/ParameterBindingResolver.cs @@ -45,7 +45,6 @@ public ParameterBindingResolver( bindingFactories.Add(new ResolverContextParameterExpressionBuilder()); bindingFactories.Add(new SchemaParameterExpressionBuilder()); bindingFactories.Add(new SelectionParameterExpressionBuilder()); - bindingFactories.Add(new FieldSyntaxParameterExpressionBuilder()); bindingFactories.Add(new ObjectTypeParameterExpressionBuilder()); bindingFactories.Add(new OperationDefinitionParameterExpressionBuilder()); bindingFactories.Add(new OperationParameterExpressionBuilder()); diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index 869b8c26d26..9246b7aca06 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -16,7 +16,7 @@ public void WriteTo(IBufferWriter writer, bool indented = false) internal ref struct RawJsonFormatter(ResultDocument document, IBufferWriter writer, bool indented) { - private int _indentLevel = 0; + private int _indentation = 0; public void Write() { @@ -25,7 +25,7 @@ public void Write() if (indented) { WriteNewLine(); - _indentLevel++; + _indentation++; } if (document._errors?.Count > 0) @@ -117,7 +117,7 @@ public void Write() if (indented) { - _indentLevel--; + _indentation--; WriteNewLine(); WriteIndent(); } @@ -144,12 +144,12 @@ public void WriteValue(Cursor cursor, DbRow row) switch (tokenType) { case ElementTokenType.StartObject - when (ElementFlags.SourceResult & row.Flags) != ElementFlags.SourceResult: + when (ElementFlags.IsObject & row.Flags) != ElementFlags.IsObject: WriteObject(cursor, row); break; case ElementTokenType.StartArray - when (ElementFlags.SourceResult & row.Flags) != ElementFlags.SourceResult: + when (ElementFlags.IsList & row.Flags) != ElementFlags.IsList: WriteArray(cursor, row); break; @@ -167,7 +167,7 @@ public void WriteValue(Cursor cursor, DbRow row) break; default: - document.WriteRawValueTo(writer, row, _indentLevel, indented); + document.WriteRawValueTo(writer, row, _indentation, indented); break; } } @@ -183,7 +183,7 @@ private void WriteObject(Cursor start, DbRow startRow) if (indented && current < end) { - _indentLevel++; + _indentation++; } var first = true; @@ -234,7 +234,7 @@ private void WriteObject(Cursor start, DbRow startRow) if (indented && !first) { - _indentLevel--; + _indentation--; WriteNewLine(); WriteIndent(); } @@ -253,7 +253,7 @@ private void WriteArray(Cursor start, DbRow startRow) if (indented && current < end) { - _indentLevel++; + _indentation++; } var first = true; @@ -279,7 +279,7 @@ private void WriteArray(Cursor start, DbRow startRow) if (indented && end > start + 1) { - _indentLevel--; + _indentation--; WriteNewLine(); WriteIndent(); } @@ -293,7 +293,7 @@ private void WriteArray(Cursor start, DbRow startRow) [MethodImpl(MethodImplOptions.AggressiveInlining)] private readonly void WriteIndent() { - var indentSize = _indentLevel * 2; + var indentSize = _indentation * 2; if (indentSize > 0) { var span = writer.GetSpan(indentSize); diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index da69ffbf89d..d4fae9588fc 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -335,7 +335,7 @@ internal void Invalidate(Cursor current) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void WriteRawValueTo(IBufferWriter writer, DbRow row) + private void WriteRawValueTo(IBufferWriter writer, DbRow row, int indentation, bool indented) { switch (row.TokenType) { @@ -360,6 +360,7 @@ private void WriteRawValueTo(IBufferWriter writer, DbRow row) WriteLocalDataTo(writer, row.Location, row.SizeOrLength); return; + // TODO : We need to handle any types. default: throw new NotSupportedException(); } @@ -738,7 +739,7 @@ private void WriteEmptyProperty(Cursor parent, ISelection selection) flags |= ElementFlags.IsList; } - if (selection.Type.IsCompositeType()) + if (selection.Type.NamedType().IsCompositeType()) { flags |= ElementFlags.IsObject; } diff --git a/src/HotChocolate/Core/src/Types/Types/Extensions/DirectiveCollectionExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Extensions/DirectiveCollectionExtensions.cs deleted file mode 100644 index b9646781854..00000000000 --- a/src/HotChocolate/Core/src/Types/Types/Extensions/DirectiveCollectionExtensions.cs +++ /dev/null @@ -1,257 +0,0 @@ -using HotChocolate.Execution; -using HotChocolate.Execution.Processing; -using HotChocolate.Language; -using HotChocolate.Utilities; -using ThrowHelper = HotChocolate.Utilities.ThrowHelper; - -// ReSharper disable once CheckNamespace -namespace HotChocolate.Types; - -public static class DirectiveCollectionExtensions -{ - public static T? SingleOrDefault(this DirectiveCollection directives) where T : notnull - { - foreach (var directive in directives) - { - if (typeof(T).IsAssignableFrom(directive.Type.RuntimeType)) - { - return directive.ToValue(); - } - } - - return default; - } - - internal static IValueNode? SkipValue(this IReadOnlyList directives) - { - var directive = directives.GetSkipDirectiveNode(); - - if (directive is null) - { - return null; - } - - return directive.GetArgumentValue(DirectiveNames.Skip.Arguments.If, BooleanValueNode.True) - ?? throw ThrowHelper.MissingIfArgument(directive); - } - - internal static IValueNode? IncludeValue(this IReadOnlyList directives) - { - var directive = directives.GetIncludeDirectiveNode(); - - if (directive is null) - { - return null; - } - - return directive.GetArgumentValue(DirectiveNames.Include.Arguments.If, BooleanValueNode.True) - ?? throw ThrowHelper.MissingIfArgument(directive); - } - - internal static bool IsDeferrable(this InlineFragmentNode fragmentNode) - => fragmentNode.Directives.IsDeferrable(); - - internal static bool IsDeferrable(this FragmentSpreadNode fragmentSpreadNode) - => fragmentSpreadNode.Directives.IsDeferrable(); - - internal static bool IsDeferrable(this IReadOnlyList directives) - { - var directive = directives.GetDeferDirectiveNode(); - var ifValue = directive?.GetArgumentValue(DirectiveNames.Defer.Arguments.If, BooleanValueNode.True); - - // a fragment is not deferrable if we do not find a defer directive or - // if the `if`-argument of the defer directive is a bool literal with a false value. - return directive is not null && ifValue is not { Value: false }; - } - - internal static DirectiveNode? GetSkipDirectiveNode( - this IReadOnlyList directives) - => GetDirectiveNode(directives, DirectiveNames.Skip.Name); - - internal static DirectiveNode? GetIncludeDirectiveNode( - this IReadOnlyList directives) - => GetDirectiveNode(directives, DirectiveNames.Include.Name); - - internal static DeferDirective? GetDeferDirective( - this IReadOnlyList directives, - IVariableValueCollection variables) - { - var directiveNode = GetDirectiveNode(directives, DirectiveNames.Defer.Name); - - if (directiveNode is not null) - { - var @if = true; - string? label = null; - - foreach (var argument in directiveNode.Arguments) - { - switch (argument.Name.Value) - { - case DirectiveNames.Defer.Arguments.If: - @if = argument.Value switch - { - VariableNode variable => !variables.GetBooleanValue(variable.Name.Value) ?? true, - BooleanValueNode b => b.Value, - _ => true - }; - break; - - case DirectiveNames.Defer.Arguments.Label: - label = argument.Value switch - { - VariableNode variable => variables.GetStringValue(variable.Name.Value), - StringValueNode b => b.Value, - _ => null - }; - break; - } - } - - return new DeferDirective(@if, label); - } - - return null; - } - - private static bool? GetBooleanValue(this IVariableValueCollection variables, string variableName) - => variables.TryGetValue(variableName, out BooleanValueNode? value) ? value.Value : null; - - private static string? GetStringValue(this IVariableValueCollection variables, string variableName) - => variables.TryGetValue(variableName, out StringValueNode? value) ? value.Value : null; - - private static int? GetIntValue(this IVariableValueCollection variables, string variableName) - => variables.TryGetValue(variableName, out IntValueNode? value) ? value.ToInt32() : null; - - internal static StreamDirective? GetStreamDirective( - this ISelection selection, - IVariableValueCollection variables) => - selection.SyntaxNode.GetStreamDirective(variables); - - internal static StreamDirective? GetStreamDirective( - this FieldNode fieldNode, - IVariableValueCollection variables) - { - var directiveNode = GetDirectiveNode(fieldNode.Directives, DirectiveNames.Stream.Name); - - if (directiveNode is not null) - { - var @if = true; - string? label = null; - var initialCount = 0; - - foreach (var argument in directiveNode.Arguments) - { - switch (argument.Name.Value) - { - case DirectiveNames.Stream.Arguments.If: - @if = argument.Value switch - { - VariableNode variable => !variables.GetBooleanValue(variable.Name.Value) ?? true, - BooleanValueNode b => b.Value, - _ => true - }; - break; - - case DirectiveNames.Stream.Arguments.Label: - label = argument.Value switch - { - VariableNode variable => variables.GetStringValue(variable.Name.Value), - StringValueNode b => b.Value, - _ => null - }; - break; - - case DirectiveNames.Stream.Arguments.InitialCount: - initialCount = argument.Value switch - { - VariableNode variable => variables.GetIntValue(variable.Name.Value) ?? 0, - IntValueNode b => b.ToInt32(), - _ => 0 - }; - break; - } - } - - return new StreamDirective(@if, initialCount, label); - } - - return null; - } - - internal static bool StreamDirectiveEquals( - this DirectiveNode streamA, - DirectiveNode streamB) - { - var argsA = CreateStreamArgs(streamA); - var argsB = CreateStreamArgs(streamB); - - return SyntaxComparer.BySyntax.Equals(argsA.If, argsB.If) - && SyntaxComparer.BySyntax.Equals(argsA.InitialCount, argsB.InitialCount) - && SyntaxComparer.BySyntax.Equals(argsA.Label, argsB.Label); - } - - private static StreamArgs CreateStreamArgs(DirectiveNode directiveNode) - { - var args = new StreamArgs(); - - for (var i = 0; i < directiveNode.Arguments.Count; i++) - { - var argument = directiveNode.Arguments[i]; - - switch (argument.Name.Value) - { - case DirectiveNames.Stream.Arguments.If: - args.If = argument.Value; - break; - - case DirectiveNames.Stream.Arguments.Label: - args.Label = argument.Value; - break; - - case DirectiveNames.Stream.Arguments.InitialCount: - args.InitialCount = argument.Value; - break; - } - } - - return args; - } - - internal static DirectiveNode? GetDeferDirectiveNode( - this IHasDirectives container) => - GetDirectiveNode(container.Directives, DirectiveNames.Defer.Name); - - internal static DirectiveNode? GetDeferDirectiveNode( - this IReadOnlyList directives) => - GetDirectiveNode(directives, DirectiveNames.Defer.Name); - - private static DirectiveNode? GetDirectiveNode( - this IReadOnlyList directives, - string name) - { - if (directives.Count == 0) - { - return null; - } - - for (var i = 0; i < directives.Count; i++) - { - var directive = directives[i]; - - if (directive.Name.Value.EqualsOrdinal(name)) - { - return directive; - } - } - return null; - } - - private ref struct StreamArgs - { - public IValueNode? If { get; set; } - - public IValueNode? Label { get; set; } - - public IValueNode? InitialCount { get; set; } - } -} diff --git a/src/HotChocolate/Core/src/Types/Types/Pagination/PagingMiddleware.cs b/src/HotChocolate/Core/src/Types/Types/Pagination/PagingMiddleware.cs index f84b093f38f..94bee128925 100644 --- a/src/HotChocolate/Core/src/Types/Types/Pagination/PagingMiddleware.cs +++ b/src/HotChocolate/Core/src/Types/Types/Pagination/PagingMiddleware.cs @@ -46,7 +46,7 @@ public async ValueTask InvokeAsync(IMiddlewareContext context) { errors[i] = ErrorBuilder .FromError(ex.Errors[i]) - .AddLocations(context.Selection.SyntaxNodes) + .AddLocations(context.Selection) .SetPath(context.Path) .Build(); } diff --git a/src/HotChocolate/Core/src/Types/Types/Relay/NodeFieldResolvers.cs b/src/HotChocolate/Core/src/Types/Types/Relay/NodeFieldResolvers.cs index ca32579e62b..c188213f885 100644 --- a/src/HotChocolate/Core/src/Types/Types/Relay/NodeFieldResolvers.cs +++ b/src/HotChocolate/Core/src/Types/Types/Relay/NodeFieldResolvers.cs @@ -40,7 +40,7 @@ public static async ValueTask ResolveSingleNodeAsync( ErrorHelper.Relay_NoNodeResolver( typeName, context.Path, - context.Selection.SyntaxNodes)); + context.Selection)); context.Result = null; } @@ -64,7 +64,7 @@ public static async ValueTask ResolveManyNodeAsync( { context.ReportError( ErrorHelper.FetchedToManyNodesAtOnce( - context.Selection.SyntaxNodes, + context.Selection, context.Path, maxAllowedNodes, list.Items.Count)); @@ -100,7 +100,7 @@ public static async ValueTask ResolveManyNodeAsync( ErrorHelper.Relay_NoNodeResolver( typeName, context.Path, - context.Selection.SyntaxNodes)); + context.Selection)); } } @@ -183,7 +183,7 @@ public static async ValueTask ResolveManyNodeAsync( ErrorHelper.Relay_NoNodeResolver( typeName, context.Path, - context.Selection.SyntaxNodes)); + context.Selection)); } context.Result = results; diff --git a/src/HotChocolate/Core/src/Types/Utilities/ErrorHelper.cs b/src/HotChocolate/Core/src/Types/Utilities/ErrorHelper.cs index df07ef5efbe..7c90512ef9d 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ErrorHelper.cs @@ -1,4 +1,5 @@ using System.Globalization; +using HotChocolate.Execution.Processing; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Types; @@ -452,11 +453,11 @@ public static ISchemaError NoSchemaTypesAllowedAsRuntimeType( .SetTypeSystemObject(type) .Build(); - public static IError Relay_NoNodeResolver(string typeName, Path path, IReadOnlyList fieldNodes) + public static IError Relay_NoNodeResolver(string typeName, Path path, Selection selection) => ErrorBuilder.New() .SetMessage(ErrorHelper_Relay_NoNodeResolver, typeName) .SetPath(path) - .AddLocations(fieldNodes) + .AddLocations(selection) .Build(); public static ISchemaError NodeResolver_MustHaveExactlyOneIdArg( @@ -494,7 +495,7 @@ public static ISchemaError NodeResolverMissing( .Build(); public static IError FetchedToManyNodesAtOnce( - IReadOnlyList fieldNodes, + Selection selection, Path path, int maxAllowedNodes, int requestNodes) @@ -503,7 +504,7 @@ public static IError FetchedToManyNodesAtOnce( ErrorHelper_FetchedToManyNodesAtOnce, maxAllowedNodes, requestNodes) - .AddLocations(fieldNodes) + .AddLocations(selection) .SetPath(path) .SetCode(ErrorCodes.Execution.FetchedToManyNodesAtOnce) .Build(); diff --git a/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs index 4739c744624..feab6327d5f 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs @@ -1,20 +1,19 @@ using HotChocolate.Execution.Processing; using HotChocolate.Language; -using HotChocolate.Types; namespace HotChocolate.Data.Projections.Handlers; public class IsProjectedProjectionOptimizer : IProjectionOptimizer { - public bool CanHandle(ISelection field) => - field.DeclaringType is ObjectType objectType - && objectType.Features.Get()?.AlwaysProjectedFields.Length > 0; + public bool CanHandle(Selection field) + => field.DeclaringType is { } objectType + && objectType.Features.Get()?.AlwaysProjectedFields.Length > 0; public Selection RewriteSelection( SelectionSetOptimizerContext context, Selection selection) { - if (context.Type is not ObjectType type + if (context.Type is not { } type || !type.Features.TryGet(out ProjectionTypeFeature? feature)) { return selection; diff --git a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionOptimizer.cs index 4222ab7f8e2..53d5cfc8c2d 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionOptimizer.cs @@ -11,7 +11,7 @@ public interface IProjectionOptimizer /// /// The selection to test for /// Returns true if the selection can be handled - bool CanHandle(ISelection selection); + bool CanHandle(Selection selection); /// /// Rewrites a selection. In case nothing is rewritten, the diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Selection.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Selection.cs index c951df63810..dcdca53e219 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Selection.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Selection.cs @@ -5,6 +5,9 @@ namespace HotChocolate.Fusion.Execution.Nodes; +/// +/// Represents a field selection during execution in the Fusion execution engine. +/// public sealed class Selection : ISelection { private readonly FieldSelectionNode[] _syntaxNodes; @@ -44,26 +47,40 @@ public Selection( _utf8ResponseName = Utf8StringCache.GetUtf8String(responseName); } + /// public int Id { get; } + /// public string ResponseName { get; } internal ReadOnlySpan Utf8ResponseName => _utf8ResponseName; + /// public bool IsInternal => (_flags & Flags.Internal) == Flags.Internal; + /// public bool IsConditional => _includeFlags.Length > 0; + /// public bool IsLeaf => (_flags & Flags.Leaf) == Flags.Leaf; + /// public IOutputFieldDefinition Field { get; } + /// public IType Type => Field.Type; + /// + /// Gets the selection set that contains this selection. + /// public SelectionSet DeclaringSelectionSet { get; private set; } = null!; + /// ISelectionSet ISelection.DeclaringSelectionSet => DeclaringSelectionSet; + /// + /// Gets the syntax nodes that contributed to this selection. + /// public ReadOnlySpan SyntaxNodes => _syntaxNodes; internal ResolveFieldValue? Resolver => Field.Features.Get(); @@ -76,6 +93,7 @@ IEnumerable ISelection.GetSyntaxNodes() } } + /// public bool IsIncluded(ulong includeFlags) { if (_includeFlags.Length == 0) From fbb3ff7a4cac76270da57ed44d042e92ade0ac72 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 2 Dec 2025 12:16:32 +0100 Subject: [PATCH 016/144] wip --- .../Core/src/Validation/ErrorHelper.cs | 93 +++++++++---------- 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/src/HotChocolate/Core/src/Validation/ErrorHelper.cs b/src/HotChocolate/Core/src/Validation/ErrorHelper.cs index daaadbe780f..45f730d958c 100644 --- a/src/HotChocolate/Core/src/Validation/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Validation/ErrorHelper.cs @@ -24,7 +24,8 @@ public static IError DeferAndStreamNotAllowedOnMutationOrSubscriptionRoot( extension(DocumentValidatorContext context) { - public IError VariableNotUsed(OperationDefinitionNode node, + public IError VariableNotUsed( + OperationDefinitionNode node, IEnumerable unusedVariables) { return ErrorBuilder.New() @@ -37,7 +38,8 @@ public IError VariableNotUsed(OperationDefinitionNode node, .Build(); } - public IError VariableNotDeclared(OperationDefinitionNode node, + public IError VariableNotDeclared( + OperationDefinitionNode node, IEnumerable usedVariables) { return ErrorBuilder.New() @@ -50,7 +52,8 @@ public IError VariableNotDeclared(OperationDefinitionNode node, .Build(); } - public IError OneOfVariableIsNotCompatible(VariableNode variable, + public IError OneOfVariableIsNotCompatible( + VariableNode variable, VariableDefinitionNode variableDefinition) { var variableName = variableDefinition.Variable.Name.Value; @@ -66,7 +69,8 @@ public IError OneOfVariableIsNotCompatible(VariableNode variable, .Build(); } - public IError VariableIsNotCompatible(VariableNode variable, + public IError VariableIsNotCompatible( + VariableNode variable, VariableDefinitionNode variableDefinition) { var variableName = variableDefinition.Variable.Name.Value; @@ -123,8 +127,7 @@ public IError TypeSystemDefinitionNotAllowed(IDefinitionNode node) .Build(); } - public IError UnionFieldError(SelectionSetNode node, - IUnionTypeDefinition type) + public IError UnionFieldError(SelectionSetNode node, IUnionTypeDefinition type) { return ErrorBuilder.New() .SetMessage(Resources.ErrorHelper_UnionFieldError) @@ -135,8 +138,7 @@ public IError UnionFieldError(SelectionSetNode node, .Build(); } - public IError FieldDoesNotExist(FieldNode node, - IComplexTypeDefinition outputType) + public IError FieldDoesNotExist(FieldNode node, IComplexTypeDefinition outputType) { return ErrorBuilder.New() .SetMessage( @@ -151,7 +153,8 @@ public IError FieldDoesNotExist(FieldNode node, .Build(); } - public IError LeafFieldsCannotHaveSelections(FieldNode node, + public IError LeafFieldsCannotHaveSelections( + FieldNode node, IComplexTypeDefinition declaringType, IType fieldType) { @@ -170,7 +173,8 @@ public IError LeafFieldsCannotHaveSelections(FieldNode node, .Build(); } - public IError ArgumentValueIsNotCompatible(ArgumentNode node, + public IError ArgumentValueIsNotCompatible( + ArgumentNode node, IInputType locationType, IValueNode value) { @@ -185,7 +189,8 @@ public IError ArgumentValueIsNotCompatible(ArgumentNode node, .Build(); } - public IError FieldValueIsNotCompatible(IInputValueDefinition field, + public IError FieldValueIsNotCompatible( + IInputValueDefinition field, IInputType locationType, IValueNode valueNode) { @@ -200,7 +205,8 @@ public IError FieldValueIsNotCompatible(IInputValueDefinition field, .Build(); } - public IError VariableDefaultValueIsNotCompatible(VariableDefinitionNode node, + public IError VariableDefaultValueIsNotCompatible( + VariableDefinitionNode node, IInputType locationType, IValueNode valueNode) { @@ -217,7 +223,8 @@ public IError VariableDefaultValueIsNotCompatible(VariableDefinitionNode node, .Build(); } - public IError NoSelectionOnCompositeField(FieldNode node, + public IError NoSelectionOnCompositeField( + FieldNode node, IComplexTypeDefinition declaringType, IType fieldType) { @@ -236,8 +243,7 @@ public IError NoSelectionOnCompositeField(FieldNode node, .Build(); } - public IError NoSelectionOnRootType(OperationDefinitionNode node, - IType fieldType) + public IError NoSelectionOnRootType(OperationDefinitionNode node, IType fieldType) { return ErrorBuilder.New() .SetMessage( @@ -251,8 +257,7 @@ public IError NoSelectionOnRootType(OperationDefinitionNode node, .Build(); } - public IError FieldIsRequiredButNull(ISyntaxNode node, - string fieldName) + public IError FieldIsRequiredButNull(ISyntaxNode node, string fieldName) { return ErrorBuilder.New() .SetMessage(Resources.ErrorHelper_FieldIsRequiredButNull, fieldName) @@ -263,8 +268,7 @@ public IError FieldIsRequiredButNull(ISyntaxNode node, .Build(); } - public IError FieldsAreNotMergeable(FieldInfo fieldA, - FieldInfo fieldB) + public IError FieldsAreNotMergeable(FieldInfo fieldA, FieldInfo fieldB) { return ErrorBuilder.New() .SetMessage(Resources.ErrorHelper_FieldsAreNotMergeable) @@ -340,7 +344,8 @@ public IError FragmentDoesNotExist(FragmentSpreadNode fragmentSpread) .Build(); } - public IError FragmentNotPossible(ISyntaxNode node, + public IError FragmentNotPossible( + ISyntaxNode node, ITypeDefinition typeCondition, ITypeDefinition parentType) { @@ -355,8 +360,7 @@ public IError FragmentNotPossible(ISyntaxNode node, .Build(); } - public IError FragmentTypeConditionUnknown(ISyntaxNode node, - NamedTypeNode typeCondition) + public IError FragmentTypeConditionUnknown(ISyntaxNode node, NamedTypeNode typeCondition) { return ErrorBuilder.New() .SetMessage( @@ -370,8 +374,7 @@ public IError FragmentTypeConditionUnknown(ISyntaxNode node, .Build(); } - public IError FragmentOnlyCompositeType(ISyntaxNode node, - ITypeDefinition type) + public IError FragmentOnlyCompositeType(ISyntaxNode node, ITypeDefinition type) { return ErrorBuilder.New() .SetMessage(Resources.ErrorHelper_FragmentOnlyCompositeType) @@ -407,8 +410,7 @@ public IError InputFieldDoesNotExist(ObjectFieldNode field) .Build(); } - public IError InputFieldRequired(ISyntaxNode node, - string fieldName) + public IError InputFieldRequired(ISyntaxNode node, string fieldName) { return ErrorBuilder.New() .SetMessage(Resources.ErrorHelper_InputFieldRequired, fieldName) @@ -419,8 +421,7 @@ public IError InputFieldRequired(ISyntaxNode node, .Build(); } - public IError OperationNameNotUnique(OperationDefinitionNode operation, - string operationName) + public IError OperationNameNotUnique(OperationDefinitionNode operation, string operationName) { return ErrorBuilder.New() .SetMessage( @@ -432,8 +433,7 @@ public IError OperationNameNotUnique(OperationDefinitionNode operation, .Build(); } - public IError OperationAnonymousMoreThanOne(OperationDefinitionNode operation, - int operations) + public IError OperationAnonymousMoreThanOne(OperationDefinitionNode operation, int operations) { return ErrorBuilder.New() .SetMessage(Resources.ErrorHelper_OperationAnonymousMoreThanOne) @@ -443,8 +443,7 @@ public IError OperationAnonymousMoreThanOne(OperationDefinitionNode operation, .Build(); } - public IError VariableNotInputType(VariableDefinitionNode node, - string variableName) + public IError VariableNotInputType(VariableDefinitionNode node, string variableName) { return ErrorBuilder.New() .SetMessage(Resources.ErrorHelper_VariableNotInputType, variableName) @@ -456,8 +455,7 @@ public IError VariableNotInputType(VariableDefinitionNode node, .Build(); } - public IError VariableNameNotUnique(VariableDefinitionNode node, - string variableName) + public IError VariableNameNotUnique(VariableDefinitionNode node, string variableName) { return ErrorBuilder.New() .SetMessage(Resources.ErrorHelper_VariableNameNotUnique) @@ -469,7 +467,8 @@ public IError VariableNameNotUnique(VariableDefinitionNode node, .Build(); } - public IError ArgumentNotUnique(ArgumentNode node, + public IError ArgumentNotUnique( + ArgumentNode node, SchemaCoordinate? field = null, IDirectiveDefinition? directive = null) { @@ -496,7 +495,8 @@ public IError ArgumentNotUnique(ArgumentNode node, .Build(); } - public IError ArgumentRequired(ISyntaxNode node, + public IError ArgumentRequired( + ISyntaxNode node, string argumentName, SchemaCoordinate? field = null, IDirectiveDefinition? directive = null) @@ -524,7 +524,8 @@ public IError ArgumentRequired(ISyntaxNode node, .Build(); } - public IError ArgumentDoesNotExist(ArgumentNode node, + public IError ArgumentDoesNotExist( + ArgumentNode node, SchemaCoordinate? field = null, IDirectiveDefinition? directive = null) { @@ -569,7 +570,8 @@ public IError SubscriptionNoTopLevelIntrospectionField(OperationDefinitionNode o .Build(); } - public IError MaxExecutionDepth(OperationDefinitionNode operation, + public IError MaxExecutionDepth( + OperationDefinitionNode operation, int allowedExecutionDepth, int detectedExecutionDepth) { @@ -583,8 +585,7 @@ public IError MaxExecutionDepth(OperationDefinitionNode operation, .Build(); } - public IError IntrospectionNotAllowed(FieldNode field, - string? customErrorMessage) + public IError IntrospectionNotAllowed(FieldNode field, string? customErrorMessage) { var message = customErrorMessage ?? Resources.ErrorHelper_IntrospectionNotAllowed; @@ -596,8 +597,7 @@ public IError IntrospectionNotAllowed(FieldNode field, .Build(); } - public IError OneOfMustHaveExactlyOneField(ISyntaxNode node, - IInputObjectTypeDefinition type) + public IError OneOfMustHaveExactlyOneField(ISyntaxNode node, IInputObjectTypeDefinition type) => ErrorBuilder.New() .SetMessage(Resources.ErrorHelper_OneOfMustHaveExactlyOneField, type.Name) .AddLocation(node) @@ -606,7 +606,8 @@ public IError OneOfMustHaveExactlyOneField(ISyntaxNode node, .SpecifiedBy("sec-All-Variable-Usages-Are-Allowed", rfc: 825) .Build(); - public IError OneOfVariablesMustBeNonNull(ISyntaxNode node, + public IError OneOfVariablesMustBeNonNull( + ISyntaxNode node, SchemaCoordinate fieldCoordinate, string variableName) => ErrorBuilder.New() @@ -621,8 +622,7 @@ public IError OneOfVariablesMustBeNonNull(ISyntaxNode node, .SpecifiedBy("sec-All-Variable-Usages-Are-Allowed", rfc: 825) .Build(); - public IError DeferAndStreamDuplicateLabel(ISyntaxNode selection, - string label) + public IError DeferAndStreamDuplicateLabel(ISyntaxNode selection, string label) => ErrorBuilder.New() .SetMessage(Resources.ErrorHelper_DeferAndStreamDuplicateLabel) .AddLocation(selection) @@ -631,8 +631,7 @@ public IError DeferAndStreamDuplicateLabel(ISyntaxNode selection, .SetPath(context.CreateErrorPath()) .Build(); - public IError DeferAndStreamLabelIsVariable(ISyntaxNode selection, - string variable) + public IError DeferAndStreamLabelIsVariable(ISyntaxNode selection, string variable) => ErrorBuilder.New() .SetMessage(Resources.ErrorHelper_DeferAndStreamLabelIsVariable) .AddLocation(selection) From cd27228b90310d8d3ec57473bb7a260e3fa85dfb Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 2 Dec 2025 21:16:12 +0100 Subject: [PATCH 017/144] wip --- .../Core/src/Types/Execution/Processing/Operation.cs | 7 ++----- .../Core/src/Types/Execution/Processing/SelectionSet.cs | 1 - .../Core/src/Validation/HotChocolate.Validation.csproj | 1 - .../Optimizers/QueryablePagingProjectionOptimizer.cs | 7 +++---- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs index 10151268f48..78631edb320 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs @@ -1,12 +1,9 @@ using System.Collections.Concurrent; -using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Types; -using static HotChocolate.Execution.Properties.Resources; -using static HotChocolate.Execution.ThrowHelper; namespace HotChocolate.Execution.Processing; @@ -68,7 +65,7 @@ internal Operation( rootSelectionSet.Complete(this, seal: isFinal); } - /// + /// /// Gets the internal unique identifier for this operation. /// public string Id { get; } @@ -191,7 +188,7 @@ public SelectionSet GetSelectionSet(Selection selection, IObjectTypeDefinition t _includeConditions, ref _elementsById, ref _lastId); - selectionSet.Complete(this, seal: _isFinal); + selectionSet.Complete(this, seal: _isFinal); _selectionSets.TryAdd(key, selectionSet); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs index 46cce24dd61..7c0cc5c51db 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs @@ -1,6 +1,5 @@ using System.Collections.Frozen; using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; using System.Text; using HotChocolate.Types; diff --git a/src/HotChocolate/Core/src/Validation/HotChocolate.Validation.csproj b/src/HotChocolate/Core/src/Validation/HotChocolate.Validation.csproj index 5b35cede164..1195b619af7 100644 --- a/src/HotChocolate/Core/src/Validation/HotChocolate.Validation.csproj +++ b/src/HotChocolate/Core/src/Validation/HotChocolate.Validation.csproj @@ -4,7 +4,6 @@ HotChocolate.Validation HotChocolate.Validation HotChocolate.Validation - diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs index 9182d19349d..c6ad38ed3ff 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs @@ -26,10 +26,9 @@ public Selection RewriteSelection( if (context.Type.NamedType() is not IPageType pageType) { - throw ThrowHelper - .PagingProjectionOptimizer_NotAPagingField( - selection.DeclaringType, - selection.Field); + throw ThrowHelper.PagingProjectionOptimizer_NotAPagingField( + selection.DeclaringType, + selection.Field); } var selections = CollectSelection(context); From 01e428470fc46a145964fc64099f8154fefccece Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Wed, 3 Dec 2025 09:45:29 +0100 Subject: [PATCH 018/144] wip --- .../src/Authorization/AuthorizeMiddleware.cs | 2 +- .../ErrorBuilderExtensions.cs | 82 ++++++++++++++++++- .../Core/src/Validation/ErrorHelper.cs | 2 +- 3 files changed, 81 insertions(+), 5 deletions(-) diff --git a/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs b/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs index 38f27393a8e..62f998fee96 100644 --- a/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs +++ b/src/HotChocolate/Core/src/Authorization/AuthorizeMiddleware.cs @@ -75,7 +75,7 @@ private void SetError( => ErrorBuilder.New() .SetMessage( AuthorizeMiddleware_PolicyNotFound, - _directive.Policy!) + _directive.Policy) .SetCode(ErrorCodes.Authentication.PolicyNotFound) .SetPath(context.Path) .AddLocations(context.Selection) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs b/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs index 7b13fee3b11..c269b159a40 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs @@ -39,14 +39,90 @@ public ErrorBuilder SetInputPath(Path inputPath) /// Sets the message of the error. /// /// The format of the message. - /// The argument for the message. + /// The argument for the message. /// The error builder. - public ErrorBuilder SetMessage([StringSyntax("CompositeFormat")] string format, object? arg) + public ErrorBuilder SetMessage([StringSyntax("CompositeFormat")] string format, object? arg1) { ArgumentNullException.ThrowIfNull(builder); ArgumentException.ThrowIfNullOrEmpty(format); - return builder.SetMessage(string.Format(CultureInfo.InvariantCulture, format, arg)); + return builder.SetMessage(string.Format(CultureInfo.InvariantCulture, format, arg1)); + } + + /// + /// Sets the message of the error. + /// + /// The format of the message. + /// The first argument for the message. + /// The second argument for the message. + /// The error builder. + public ErrorBuilder SetMessage([StringSyntax("CompositeFormat")] string format, object? arg1, object? arg2) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentException.ThrowIfNullOrEmpty(format); + + return builder.SetMessage(string.Format(CultureInfo.InvariantCulture, format, arg1, arg2)); + } + + /// + /// Sets the message of the error. + /// + /// The format of the message. + /// The first argument for the message. + /// The second argument for the message. + /// The third argument for the message. + /// The error builder. + public ErrorBuilder SetMessage([StringSyntax("CompositeFormat")] string format, object? arg1, object? arg2, object? arg3) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentException.ThrowIfNullOrEmpty(format); + + return builder.SetMessage(string.Format(CultureInfo.InvariantCulture, format, arg1, arg2, arg3)); + } + + /// + /// Sets the message of the error. + /// + /// The format of the message. + /// The argument for the message. + /// The error builder. + public ErrorBuilder SetMessage([StringSyntax("CompositeFormat")] string format, string? arg1) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentException.ThrowIfNullOrEmpty(format); + + return builder.SetMessage(string.Format(CultureInfo.InvariantCulture, format, arg1)); + } + + /// + /// Sets the message of the error. + /// + /// The format of the message. + /// The first argument for the message. + /// The second argument for the message. + /// The error builder. + public ErrorBuilder SetMessage([StringSyntax("CompositeFormat")] string format, string? arg1, string? arg2) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentException.ThrowIfNullOrEmpty(format); + + return builder.SetMessage(string.Format(CultureInfo.InvariantCulture, format, arg1, arg2)); + } + + /// + /// Sets the message of the error. + /// + /// The format of the message. + /// The first argument for the message. + /// The second argument for the message. + /// The third argument for the message. + /// The error builder. + public ErrorBuilder SetMessage([StringSyntax("CompositeFormat")] string format, string? arg1, string? arg2, string? arg3) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentException.ThrowIfNullOrEmpty(format); + + return builder.SetMessage(string.Format(CultureInfo.InvariantCulture, format, arg1, arg2, arg3)); } /// diff --git a/src/HotChocolate/Core/src/Validation/ErrorHelper.cs b/src/HotChocolate/Core/src/Validation/ErrorHelper.cs index 45f730d958c..eefd5dfed09 100644 --- a/src/HotChocolate/Core/src/Validation/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Validation/ErrorHelper.cs @@ -614,7 +614,7 @@ public IError OneOfVariablesMustBeNonNull( .SetMessage( Resources.ErrorHelper_OneOfVariablesMustBeNonNull, variableName, - fieldCoordinate.MemberName!, + fieldCoordinate.MemberName, fieldCoordinate.Name) .AddLocation(node) .SetPath(context.CreateErrorPath()) From 50a3a78cec48303648b810b691958e11fb775ef9 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 4 Dec 2025 10:34:28 +0100 Subject: [PATCH 019/144] wip --- .../Core/src/Types/Execution/ErrorHelper.cs | 10 +- .../Types/Execution/Processing/Operation.cs | 12 +- .../Execution/Processing/OperationCompiler.cs | 102 +++++++- .../OperationCompilerOptimizerHelper.cs | 22 +- .../OperationFeatureCollection.Selections.cs | 48 +++- .../Processing/OperationOptimizerContext.cs | 45 +--- .../Types/Execution/Processing/Selection.cs | 14 +- .../Processing/SelectionFeatureCollection.cs | 46 ++++ .../Execution/Processing/SelectionSet.cs | 14 +- .../SelectionSetOptimizerContext.cs | 111 ++++----- .../Processing/ValueCompletion.Object.cs | 10 +- .../Types/Execution/RequestExecutorManager.cs | 3 +- .../Core/src/Types/Execution/ThrowHelper.cs | 6 + .../Extensions/ResolverContextExtensions.cs | 230 ++++-------------- .../Types/Pagination/ConnectionFlagsHelper.cs | 89 ++++--- .../Core/src/Types/Utilities/ThrowHelper.cs | 9 +- .../Processing/OperationCompilerTests.cs | 2 +- .../QueryablePagingProjectionOptimizer.cs | 2 +- .../IsProjectedProjectionOptimizer.cs | 2 +- 19 files changed, 370 insertions(+), 407 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs index 5ed2a9d615d..abcb9c0ca53 100644 --- a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs @@ -57,12 +57,12 @@ public static IError UnexpectedLeafValueSerializationError( public static IError UnableToResolveTheAbstractType( string typeName, - FieldNode field, + Selection selection, Path path) { return ErrorBuilder.New() .SetMessage(ErrorHelper_UnableToResolveTheAbstractType_Message, typeName) - .AddLocation(field) + .AddLocations(selection) .SetPath(path) .SetCode(ErrorCodes.Execution.CannotResolveAbstractType) .Build(); @@ -71,12 +71,12 @@ public static IError UnableToResolveTheAbstractType( public static IError UnexpectedErrorWhileResolvingAbstractType( Exception exception, string typeName, - FieldNode field, + Selection selection, Path path) { return ErrorBuilder.New() .SetMessage(ErrorHelper_UnableToResolveTheAbstractType_Message, typeName) - .AddLocation(field) + .AddLocations(selection) .SetPath(path) .SetCode(ErrorCodes.Execution.CannotResolveAbstractType) .SetException(exception) @@ -89,7 +89,7 @@ public static IError ListValueIsNotSupported( Path path) { return ErrorBuilder.New() - .SetMessage(ErrorHelper_ListValueIsNotSupported_Message, listType.FullName!) + .SetMessage(ErrorHelper_ListValueIsNotSupported_Message, listType.FullName) .AddLocations(selection) .SetPath(path) .SetCode(ErrorCodes.Execution.ListTypeNotSupported) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs index 78631edb320..c88f27dda86 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs @@ -19,7 +19,6 @@ public sealed class Operation : IOperation private readonly OperationCompiler _compiler; private readonly IncludeConditionCollection _includeConditions; private readonly OperationFeatureCollection _features; - private readonly bool _isFinal; private object[] _elementsById; private int _lastId; @@ -33,9 +32,9 @@ internal Operation( SelectionSet rootSelectionSet, OperationCompiler compiler, IncludeConditionCollection includeConditions, + OperationFeatureCollection features, int lastId, - object[] elementsById, - bool isFinal) + object[] elementsById) { ArgumentException.ThrowIfNullOrWhiteSpace(id); ArgumentException.ThrowIfNullOrWhiteSpace(hash); @@ -59,10 +58,7 @@ internal Operation( _includeConditions = includeConditions; _lastId = lastId; _elementsById = elementsById; - _isFinal = isFinal; - - _features = new OperationFeatureCollection(); - rootSelectionSet.Complete(this, seal: isFinal); + _features = features; } /// @@ -183,12 +179,12 @@ public SelectionSet GetSelectionSet(Selection selection, IObjectTypeDefinition t { selectionSet = _compiler.CompileSelectionSet( + this, selection, objectType, _includeConditions, ref _elementsById, ref _lastId); - selectionSet.Complete(this, seal: _isFinal); _selectionSets.TryAdd(key, selectionSet); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index ee24611434a..2565aa7b5fd 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -1,4 +1,6 @@ using System.Buffers; +using System.Collections.Immutable; +using System.Runtime.InteropServices; using HotChocolate.Fusion.Rewriters; using HotChocolate.Language; using HotChocolate.Language.Visitors; @@ -11,6 +13,7 @@ internal sealed partial class OperationCompiler { private readonly Schema _schema; private readonly ObjectPool>> _fieldsPool; + private readonly OperationCompilerOptimizers _optimizers; private readonly DocumentRewriter _documentRewriter; private readonly InputParser _inputValueParser; private static readonly ArrayPool s_objectArrayPool = ArrayPool.Shared; @@ -18,7 +21,8 @@ internal sealed partial class OperationCompiler public OperationCompiler( Schema schema, InputParser inputValueParser, - ObjectPool>> fieldsPool) + ObjectPool>> fieldsPool, + OperationCompilerOptimizers optimizers) { ArgumentNullException.ThrowIfNull(schema); ArgumentNullException.ThrowIfNull(fieldsPool); @@ -27,6 +31,7 @@ public OperationCompiler( _inputValueParser = inputValueParser; _fieldsPool = fieldsPool; _documentRewriter = new DocumentRewriter(schema, removeStaticallyExcludedSelections: true); + _optimizers = optimizers; } public Operation Compile( @@ -64,11 +69,12 @@ public Operation Compile( fields, rootType, compilationContext, + _optimizers.SelectionSetOptimizers, ref lastId); compilationContext.Register(selectionSet, selectionSet.Id); - return new Operation( + var operation = new Operation( id, hash, document, @@ -76,11 +82,24 @@ public Operation Compile( rootType, _schema, selectionSet, - this, + compiler: this, includeConditions, + compilationContext.Features, lastId, - compilationContext.ElementsById, - isFinal: true); // todo : add the interceptors back + compilationContext.ElementsById); + + selectionSet.Complete(operation); + + if (_optimizers.OperationOptimizers.Length > 0) + { + var context = new OperationOptimizerContext(operation); + foreach (var optimizer in _optimizers.OperationOptimizers) + { + optimizer.OptimizeOperation(context); + } + } + + return operation; } finally { @@ -89,13 +108,16 @@ public Operation Compile( } internal SelectionSet CompileSelectionSet( + Operation operation, Selection selection, ObjectType objectType, IncludeConditionCollection includeConditions, ref object[] elementsById, ref int lastId) { - var compilationContext = new CompilationContext(elementsById); + var compilationContext = new CompilationContext(elementsById, operation.Features); + var optimizers = OperationCompilerOptimizerHelper.GetOptimizers(selection); + var fields = _fieldsPool.Get(); fields.Clear(); @@ -126,9 +148,10 @@ internal SelectionSet CompileSelectionSet( } } - var selectionSet = BuildSelectionSet(fields, objectType, compilationContext, ref lastId); + var selectionSet = BuildSelectionSet(fields, objectType, compilationContext, optimizers, ref lastId); compilationContext.Register(selectionSet, selectionSet.Id); elementsById = compilationContext.ElementsById; + selectionSet.Complete(operation); return selectionSet; } finally @@ -193,6 +216,7 @@ private SelectionSet BuildSelectionSet( OrderedDictionary> fieldMap, ObjectType typeContext, CompilationContext compilationContext, + ImmutableArray optimizers, ref int lastId) { var i = 0; @@ -263,6 +287,11 @@ private SelectionSet BuildSelectionSet( fieldDelegate, pureFieldDelegate); + if (optimizers.Length > 0) + { + selection.Features.SetSafe(optimizers); + } + // Register the selection in the elements array compilationContext.Register(selection, selection.Id); selections[i++] = selection; @@ -273,6 +302,53 @@ private SelectionSet BuildSelectionSet( } } + // if there are no optimizers registered for this selection we exit early. + if (optimizers.Length == 0) + { + return new SelectionSet(selectionSetId, typeContext, selections, isConditional); + } + + var current = ImmutableCollectionsMarshal.AsImmutableArray(selections); + var rewritten = current; + + var optimizerContext = new SelectionSetOptimizerContext( + selectionSetId, + typeContext, + ref rewritten, + compilationContext.Features, + ref lastId, + _schema, + CreateFieldPipeline); + + foreach (var optimizer in optimizers) + { + optimizer.OptimizeSelectionSet(optimizerContext); + } + + // If `rewritten` is still the same instance as `current`, + // the optimizers did not change the selections array. + // This mean we can simply construct the SelectionSet. + if (current == rewritten) + { + return new SelectionSet(selectionSetId, typeContext, selections, isConditional); + } + + if (current.Length < rewritten.Length) + { + for (var j = current.Length; j < rewritten.Length; j++) + { + var selection = rewritten[j]; + + if (optimizers.Length > 0) + { + selection.Features.SetSafe(optimizers); + } + + compilationContext.Register(selection, selection.Id); + } + } + + selections = ImmutableCollectionsMarshal.AsArray(rewritten)!; return new SelectionSet(selectionSetId, typeContext, selections, isConditional); } @@ -418,12 +494,20 @@ protected override ISyntaxVisitorAction Enter( } } - private class CompilationContext(object[] elementsById) + private class CompilationContext { - private object[] _elementsById = elementsById; + private object[] _elementsById; + + public CompilationContext(object[] elementsById, OperationFeatureCollection? features = null) + { + _elementsById = elementsById; + Features = features ?? new OperationFeatureCollection(); + } public object[] ElementsById => _elementsById; + public OperationFeatureCollection Features { get; } + public void Register(object element, int id) { if (id >= _elementsById.Length) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizerHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizerHelper.cs index 4a9ed3b2d8e..43b1bd835e7 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizerHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizerHelper.cs @@ -6,7 +6,7 @@ namespace HotChocolate.Execution.Processing; /// -/// This helper class allows adding optimizers to context data or retrieve optimizers from context data. +/// This helper class allows to register optimizers with a field configuration. /// internal static class OperationCompilerOptimizerHelper { @@ -33,8 +33,20 @@ private static void RegisterOptimizerInternal( } } - public static bool TryGetOptimizers( - IFeatureProvider featureProvider, - out ImmutableArray optimizers) - => featureProvider.Features.TryGet(out optimizers); + public static ImmutableArray GetOptimizers(Selection selection) + { + var optimizers = ImmutableArray.Empty; + + if (selection.Features.TryGet>(out var selectionOptimizers)) + { + optimizers = selectionOptimizers; + } + + if (selection.Field.Features.TryGet>(out var fieldOptimizers)) + { + optimizers = optimizers.AddRange(fieldOptimizers); + } + + return optimizers; + } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.Selections.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.Selections.cs index 22cda22d024..bb718cc5eb7 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.Selections.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.Selections.cs @@ -6,19 +6,6 @@ namespace HotChocolate.Execution.Processing; [SuppressMessage("ReSharper", "NonAtomicCompoundOperator")] public sealed partial class OperationFeatureCollection { - internal bool TryGet(int selectionId, [NotNullWhen(true)] out TFeature? feature) - { - if (_selectionFeatures.TryGetValue((selectionId, typeof(TFeature)), out var result) - && result is TFeature f) - { - feature = f; - return true; - } - - feature = default; - return false; - } - internal object? this[int selectionId, Type featureType] { get @@ -48,6 +35,19 @@ internal bool TryGet(int selectionId, [NotNullWhen(true)] out TFeature } } + internal bool TryGet(int selectionId, [NotNullWhen(true)] out TFeature? feature) + { + if (_selectionFeatures.TryGetValue((selectionId, typeof(TFeature)), out var result) + && result is TFeature f) + { + feature = f; + return true; + } + + feature = default; + return false; + } + internal TFeature GetOrSetSafe(int selectionId, Func factory) { ArgumentNullException.ThrowIfNull(factory); @@ -67,6 +67,28 @@ internal TFeature GetOrSetSafe(int selectionId, Func factory return feature; } + internal TFeature GetOrSetSafe( + int selectionId, + Func factory, + TContext context) + { + ArgumentNullException.ThrowIfNull(factory); + + if (!TryGet(selectionId, out var feature)) + { + lock (_writeLock) + { + if (!TryGet(selectionId, out feature)) + { + feature = factory(context); + this[selectionId, typeof(TFeature)] = feature; + } + } + } + + return feature; + } + internal IEnumerable> GetFeatures(int selectionId) { foreach (var ((id, type), value) in _selectionFeatures) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationOptimizerContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationOptimizerContext.cs index 4aaabec22ae..c2f721a968a 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationOptimizerContext.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationOptimizerContext.cs @@ -10,60 +10,17 @@ namespace HotChocolate.Execution.Processing; /// public readonly ref struct OperationOptimizerContext { - private readonly CreateFieldPipeline _createFieldPipeline; - /// /// Initializes a new instance of /// internal OperationOptimizerContext( - Operation operation, - Dictionary contextData, - CreateFieldPipeline createFieldPipeline) + Operation operation) { Operation = operation; - ContextData = contextData; - _createFieldPipeline = createFieldPipeline; } /// /// Gets the operation. /// public Operation Operation { get; } - - /// - /// The context data dictionary can be used by middleware components and - /// resolvers to store and retrieve data during execution. - /// - public IDictionary ContextData { get; } - - /// - /// Sets the resolvers on the specified . - /// - /// - /// The selection to set the resolvers on. - /// - /// - /// The async resolver pipeline. - /// - /// - /// The pure resolver. - /// - public void SetResolver( - Selection selection, - FieldDelegate? resolverPipeline = null, - PureFieldDelegate? pureResolver = null) - => selection.SetResolvers(resolverPipeline, pureResolver); - - /// - /// Allows to compile the field resolver pipeline for a field. - /// - /// The field. - /// The selection of the field. - /// - /// Returns a representing the field resolver pipeline. - /// - public FieldDelegate CompileResolverPipeline( - ObjectField field, - FieldNode fieldSelection) - => _createFieldPipeline(Operation.Schema, field, fieldSelection); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index b782c6cf467..cef3f42b1cd 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -16,6 +16,7 @@ public sealed class Selection : ISelection, IFeatureProvider private readonly ulong[] _includeFlags; private readonly byte[] _utf8ResponseName; private Flags _flags; + private SelectionSet? _declaringSelectionSet; internal Selection( int id, @@ -109,7 +110,8 @@ internal Selection( /// /// Gets the selection set that contains this selection. /// - public SelectionSet DeclaringSelectionSet { get; private set; } = null!; + public SelectionSet DeclaringSelectionSet + => _declaringSelectionSet ?? throw ThrowHelper.Selection_NotFullyInitialized(); /// ISelectionSet ISelection.DeclaringSelectionSet => DeclaringSelectionSet; @@ -240,7 +242,7 @@ internal void SetResolvers( /// /// Completes the selection without sealing it. /// - internal void Complete(SelectionSet selectionSet, bool seal) + internal void Complete(SelectionSet selectionSet) { ArgumentNullException.ThrowIfNull(selectionSet); @@ -249,12 +251,8 @@ internal void Complete(SelectionSet selectionSet, bool seal) throw new InvalidOperationException("Selection is already sealed."); } - DeclaringSelectionSet = selectionSet; - - if (seal) - { - _flags |= Flags.Sealed; - } + _declaringSelectionSet = selectionSet; + _flags |= Flags.Sealed; } private SelectionExecutionStrategy InferStrategy( diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs index c122ee84ae3..b1fe6773b6e 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs @@ -4,6 +4,11 @@ namespace HotChocolate.Execution.Processing; +/// +/// Represents a collection of features associated with a specific selection +/// within a GraphQL operation. This struct provides a view into the parent +/// scoped to a single selection. +/// public readonly struct SelectionFeatureCollection : IFeatureCollection { private readonly OperationFeatureCollection _parent; @@ -15,27 +20,68 @@ internal SelectionFeatureCollection(OperationFeatureCollection parent, int selec _selectionId = selectionId; } + /// + /// Gets a value indicating whether this feature collection is read-only. + /// public bool IsReadOnly => _parent.IsReadOnly; + /// + /// Gets a value indicating whether this selection has no features. + /// public bool IsEmpty => !_parent.HasFeatures(_selectionId); + /// + /// Gets the revision number of the underlying feature collection. + /// public int Revision => _parent.Revision; + /// + /// Gets or sets a feature by its type. + /// + /// The type of the feature. + /// The feature instance, or null if not found. public object? this[Type key] { get => _parent[_selectionId, key]; set => _parent[_selectionId, key] = value; } + /// + /// Sets a feature instance for this selection. + /// + /// The type of the feature. + /// The feature instance to set, or null to remove. + /// This method is thread-safe. + public void SetSafe(TFeature? instance) + => this[typeof(TFeature)] = instance; + + /// + /// Tries to get a feature of the specified type. + /// + /// The type of the feature. + /// + /// When this method returns, contains the feature if found; otherwise, null. + /// + /// true if the feature was found; otherwise, false. public bool TryGet([NotNullWhen(true)] out TFeature? feature) => _parent.TryGet(_selectionId, out feature); + /// + /// Gets an existing feature or creates and sets a new instance using the default constructor. + /// + /// The type of the feature. + /// The existing or newly created feature instance. + /// This method is thread-safe. public TFeature GetOrSetSafe() where TFeature : new() => GetOrSetSafe(static () => new TFeature()); internal TFeature GetOrSetSafe(Func factory) => _parent.GetOrSetSafe(_selectionId, factory); + internal TFeature GetOrSetSafe(Func factory, TContext context) + => _parent.GetOrSetSafe(_selectionId, factory, context); + + /// public IEnumerator> GetEnumerator() => _parent.GetFeatures(_selectionId).GetEnumerator(); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs index 7c0cc5c51db..228f15f6261 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs @@ -16,6 +16,7 @@ public sealed class SelectionSet : ISelectionSet private readonly FrozenDictionary _responseNameLookup; private readonly SelectionLookup _utf8ResponseNameLookup; private Flags _flags; + private Operation? _declaringOperation; internal SelectionSet(int id, IObjectTypeDefinition type, Selection[] selections, bool isConditional) { @@ -52,7 +53,7 @@ internal SelectionSet(int id, IObjectTypeDefinition type, Selection[] selections /// /// Gets the declaring operation. /// - public Operation DeclaringOperation { get; private set; } = null!; + public Operation DeclaringOperation => _declaringOperation ?? throw ThrowHelper.SelectionSet_NotFullyInitialized(); IOperation ISelectionSet.DeclaringOperation => DeclaringOperation; @@ -93,24 +94,21 @@ public bool TryGetSelection(string responseName, [NotNullWhen(true)] out Selecti public bool TryGetSelection(ReadOnlySpan utf8ResponseName, [NotNullWhen(true)] out Selection? selection) => _utf8ResponseNameLookup.TryGetSelection(utf8ResponseName, out selection); - internal void Complete(Operation declaringOperation, bool seal) + internal void Complete(Operation declaringOperation) { if ((_flags & Flags.Sealed) == Flags.Sealed) { throw new InvalidOperationException("Selection set is already sealed."); } - DeclaringOperation = declaringOperation; + _declaringOperation = declaringOperation; foreach (var selection in _selections) { - selection.Complete(this, seal); + selection.Complete(this); } - if (seal) - { - _flags |= Flags.Sealed; - } + _flags |= Flags.Sealed; } [Flags] diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs index a7beac3cfaa..afb94e02f92 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs @@ -1,6 +1,9 @@ +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; using HotChocolate.Language; using HotChocolate.Resolvers; using HotChocolate.Types; +using HotChocolate.Utilities; namespace HotChocolate.Execution.Processing; @@ -8,66 +11,67 @@ namespace HotChocolate.Execution.Processing; /// The optimizer provides helper methods /// to optimize a . /// -public readonly ref struct SelectionSetOptimizerContext +public ref struct SelectionSetOptimizerContext { - private readonly OperationCompiler _compiler; - private readonly OperationCompiler.CompilerContext _compilerContext; - private readonly Dictionary _selectionLookup; - private readonly CreateFieldPipeline _createFieldPipeline; - + private readonly int _selectionSetId; + private readonly ref ImmutableArray _selections; + private readonly OperationFeatureCollection _features; + private readonly ref int _lastSelectionId; + private readonly Func _createFieldPipeline; + private Dictionary? _selectionMap; /// /// Initializes a new instance of /// internal SelectionSetOptimizerContext( - OperationCompiler compiler, - OperationCompiler.CompilerContext compilerContext, - Dictionary selectionLookup, - Dictionary contextData, - CreateFieldPipeline createFieldPipeline, - SelectionPath path) + int selectionSetId, + ObjectType typeContext, + ref ImmutableArray selections, + OperationFeatureCollection features, + ref int lastSelectionId, + Schema schema, + Func createFieldPipeline) { - _compiler = compiler; - _compilerContext = compilerContext; - _selectionLookup = selectionLookup; + _selectionSetId = selectionSetId; + _selections = ref selections; + _features = features; + _lastSelectionId = ref lastSelectionId; _createFieldPipeline = createFieldPipeline; - ContextData = contextData; - Path = path; + TypeContext = typeContext; + Schema = schema; } /// /// Gets the schema for which the query is compiled. /// - public Schema Schema - => _compilerContext.Schema; + public Schema Schema { get; } /// /// Gets the type context of the current selection-set. /// - public ObjectType Type - => _compilerContext.Type; + public ObjectType TypeContext { get; } - /// - /// Gets the selections of this selection set. - /// - public IReadOnlyDictionary Selections - => _compilerContext.Fields; + public bool ContainsField(string fieldName) + => _selections.Any(t => t.Field.Name.EqualsOrdinal(fieldName)); - /// - /// The context data dictionary can be used by middleware components and - /// resolvers to store and retrieve data during execution. - /// - public IDictionary ContextData { get; } + public bool ContainsResponseName(string responseName) + { + _selectionMap ??= _selections.ToDictionary(t => t.ResponseName); + return _selectionMap.ContainsKey(responseName); + } - /// - /// Gets the current selection path. - /// - public SelectionPath Path { get; } + public bool TryGetSelection(string responseName, [MaybeNullWhen(false)] out Selection value) + { + _selectionMap ??= _selections.ToDictionary(t => t.ResponseName); + return _selectionMap.TryGetValue(responseName, out value); + } + + public SelectionFeatureCollection Features => new(_features, _selectionSetId); /// /// Gets the next operation unique selection id. /// - public int GetNextSelectionId() - => _compiler.GetNextSelectionId(); + public int NewSelectionId() + => ++_lastSelectionId; /// /// Sets the resolvers on the specified . @@ -99,20 +103,21 @@ public FieldDelegate CompileResolverPipeline(ObjectField field, FieldNode select => _createFieldPipeline(Schema, field, selection); /// - /// Adds an additional selection for internal purposes. + /// Adds a selection for internal purposes. /// - /// - /// The new optimized selection. + /// + /// The internal selection. /// /// - /// is null. + /// is null. /// - public void AddSelection(Selection newSelection) + public void AddSelection(Selection internalSelection) { - ArgumentNullException.ThrowIfNull(newSelection); + ArgumentNullException.ThrowIfNull(internalSelection); - _compilerContext.Fields.Add(newSelection.ResponseName, newSelection); - _compiler.RegisterNewSelection(newSelection); + _selectionMap ??= _selections.ToDictionary(t => t.ResponseName); + _selectionMap.Add(internalSelection.ResponseName, internalSelection); + _selections = _selections.Add(internalSelection); } /// @@ -132,19 +137,15 @@ public void ReplaceSelection(Selection newSelection) { ArgumentNullException.ThrowIfNull(newSelection); - if (!_compilerContext.Fields.TryGetValue( - newSelection.ResponseName, - out var currentSelection)) + _selectionMap ??= _selections.ToDictionary(t => t.ResponseName); + + if (!_selectionMap.TryGetValue(newSelection.ResponseName, out var currentSelection)) { throw new ArgumentException($"The `{newSelection.ResponseName}` does not exist."); } - _compilerContext.Fields[newSelection.ResponseName] = newSelection; - - if (_selectionLookup.TryGetValue(currentSelection, out var selectionSetInfos)) - { - _selectionLookup.Remove(currentSelection); - _selectionLookup.Add(newSelection, selectionSetInfos); - } + _selectionMap[newSelection.ResponseName] = newSelection; + var index = _selections.IndexOf(currentSelection); + _selections = _selections.SetItem(index, newSelection); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs index 4c940e97cd1..522a3698743 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs @@ -11,7 +11,7 @@ internal static partial class ValueCompletion { private static ObjectResult? CompleteCompositeValue( ValueCompletionContext context, - ISelection selection, + Selection selection, IType type, ResultData parent, int index, @@ -34,14 +34,14 @@ internal static partial class ValueCompletion } var errorPath = CreatePathFromContext(selection, parent, index); - var error = ValueCompletion_CouldNotResolveAbstractType(selection.SyntaxNode, errorPath, result); + var error = ValueCompletion_CouldNotResolveAbstractType(selection, errorPath, result); operationContext.ReportError(error, context.ResolverContext, selection); return null; } private static bool TryResolveObjectType( ValueCompletionContext context, - ISelection selection, + Selection selection, IType fieldType, ResultData parent, int index, @@ -76,7 +76,7 @@ private static bool TryResolveObjectType( var error = UnableToResolveTheAbstractType( fieldType.Print(), - selection.SyntaxNode, + selection, CreatePathFromContext(selection, parent, index)); context.OperationContext.ReportError(error, context.ResolverContext, selection); } @@ -85,7 +85,7 @@ private static bool TryResolveObjectType( var error = UnexpectedErrorWhileResolvingAbstractType( ex, fieldType.Print(), - selection.SyntaxNode, + selection, CreatePathFromContext(selection, parent, index)); context.OperationContext.ReportError(error, context.ResolverContext, selection); } diff --git a/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs b/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs index c26e30ec3db..a3ebe5b7ee4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs +++ b/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs @@ -275,7 +275,8 @@ await typeModuleChangeMonitor.ConfigureAsync(context, cancellationToken) static sp => new OperationCompiler( sp.GetRequiredService(), sp.GetRequiredService(), - sp.GetRequiredService>>>())); + sp.GetRequiredService>>>(), + sp.GetRequiredService())); serviceCollection.AddSingleton( static _ => new DefaultObjectPoolProvider()); diff --git a/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs index a9b8ebe2e4e..d2ac4820927 100644 --- a/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs @@ -6,6 +6,12 @@ namespace HotChocolate.Execution; internal static class ThrowHelper { + public static InvalidOperationException SelectionSet_NotFullyInitialized() + => new InvalidOperationException("The selection set is not fully initialized."); + + public static InvalidOperationException Selection_NotFullyInitialized() + => new InvalidOperationException("The selection is not fully initialized."); + public static GraphQLException VariableIsNotAnInputType( VariableDefinitionNode variableDefinition) { diff --git a/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs b/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs index 29c5d692654..9a886885497 100644 --- a/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs @@ -23,12 +23,7 @@ public static class ResolverContextExtensions /// public T? GetGlobalStateOrDefault(string name) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentException.ThrowIfNullOrEmpty(name); if (context.ContextData.TryGetValue(name, out var value) && value is T casted) @@ -51,15 +46,9 @@ public static class ResolverContextExtensions /// or the default value of , if the state /// could not be found or cast to . /// - public T GetGlobalStateOrDefault(string name, - T defaultValue) + public T GetGlobalStateOrDefault(string name, T defaultValue) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentException.ThrowIfNullOrEmpty(name); if (context.ContextData.TryGetValue(name, out var value) && value is T casted) @@ -81,12 +70,7 @@ public T GetGlobalStateOrDefault(string name, /// public T GetGlobalState(string name) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentException.ThrowIfNullOrEmpty(name); if (context.ContextData.TryGetValue(name, out var value) && value is T typedValue) { @@ -110,12 +94,7 @@ public T GetGlobalState(string name) /// public T? GetScopedStateOrDefault(string name) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentException.ThrowIfNullOrEmpty(name); if (context.ScopedContextData.TryGetValue(name, out var value) && value is T casted) @@ -138,15 +117,9 @@ public T GetGlobalState(string name) /// or the default value of , if the state /// could not be found or cast to . /// - public T GetScopedStateOrDefault(string name, - T defaultValue) + public T GetScopedStateOrDefault(string name, T defaultValue) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentException.ThrowIfNullOrEmpty(name); if (context.ScopedContextData.TryGetValue(name, out var value) && value is T casted) @@ -168,12 +141,7 @@ public T GetScopedStateOrDefault(string name, /// public T GetScopedState(string name) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentException.ThrowIfNullOrEmpty(name); if (context.ScopedContextData.TryGetValue(name, out var value) && value is T typedValue) @@ -198,12 +166,7 @@ public T GetScopedState(string name) /// public T? GetLocalStateOrDefault(string name) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentException.ThrowIfNullOrEmpty(name); if (context.LocalContextData.TryGetValue(name, out var value) && value is T casted) @@ -226,15 +189,9 @@ public T GetScopedState(string name) /// or the default value of , if the state /// could not be found or cast to . /// - public T GetLocalStateOrDefault(string name, - T defaultValue) + public T GetLocalStateOrDefault(string name, T defaultValue) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentException.ThrowIfNullOrEmpty(name); if (context.LocalContextData.TryGetValue(name, out var value) && value is T casted) @@ -256,12 +213,7 @@ public T GetLocalStateOrDefault(string name, /// public T GetLocalState(string name) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } + ArgumentException.ThrowIfNullOrEmpty(name); if (context.LocalContextData.TryGetValue(name, out var value) && value is T casted) @@ -282,16 +234,9 @@ public T GetLocalState(string name) /// The name of the state. /// The new state value. /// The type of the state. - public void SetGlobalState(string name, - T value) + public void SetGlobalState(string name, T value) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } - + ArgumentException.ThrowIfNullOrEmpty(name); context.ContextData[name] = value; } @@ -304,16 +249,9 @@ public void SetGlobalState(string name, /// The name of the state. /// The new state value. /// The type of the state. - public void SetScopedState(string name, - T value) + public void SetScopedState(string name, T value) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } - + ArgumentException.ThrowIfNullOrEmpty(name); context.ScopedContextData = context.ScopedContextData.SetItem(name, value); } @@ -326,16 +264,9 @@ public void SetScopedState(string name, /// The name of the state. /// The new state value. /// The type of the state. - public void SetLocalState(string name, - T value) + public void SetLocalState(string name, T value) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } - + ArgumentException.ThrowIfNullOrEmpty(name); context.LocalContextData = context.LocalContextData.SetItem(name, value); } @@ -352,16 +283,9 @@ public void SetLocalState(string name, /// The existing state for the specified , /// or the newly created state using the function. /// - public T GetOrSetGlobalState(string name, - Func createValue) + public T GetOrSetGlobalState(string name, Func createValue) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } - + ArgumentException.ThrowIfNullOrEmpty(name); ArgumentNullException.ThrowIfNull(createValue); if (context.ContextData.TryGetValue(name, out var value) @@ -388,16 +312,9 @@ public T GetOrSetGlobalState(string name, /// The existing state for the specified , /// or the newly created state using the function. /// - public T GetOrSetScopedState(string name, - Func createValue) + public T GetOrSetScopedState(string name, Func createValue) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } - + ArgumentException.ThrowIfNullOrEmpty(name); ArgumentNullException.ThrowIfNull(createValue); if (context.ScopedContextData.TryGetValue(name, out var value) @@ -424,16 +341,9 @@ public T GetOrSetScopedState(string name, /// The existing state for the specified , /// or the newly created state using the function. /// - public T GetOrSetLocalState(string name, - Func createValue) + public T GetOrSetLocalState(string name, Func createValue) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } - + ArgumentException.ThrowIfNullOrEmpty(name); ArgumentNullException.ThrowIfNull(createValue); if (context.LocalContextData.TryGetValue(name, out var value) @@ -453,13 +363,7 @@ public T GetOrSetLocalState(string name, /// The name of the state. public void RemoveScopedState(string name) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } - + ArgumentException.ThrowIfNullOrEmpty(name); context.ScopedContextData = context.ScopedContextData.Remove(name); } @@ -469,13 +373,7 @@ public void RemoveScopedState(string name) /// The name of the state. public void RemoveLocalState(string name) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrEmpty(name)) - { - throw String_NullOrEmpty(nameof(name)); - } - + ArgumentException.ThrowIfNullOrEmpty(name); context.LocalContextData = context.LocalContextData.Remove(name); } @@ -486,8 +384,6 @@ public void RemoveLocalState(string name) /// The event message. public T GetEventMessage() { - ArgumentNullException.ThrowIfNull(context); - if (context.ScopedContextData.TryGetValue( WellKnownContextData.EventMessage, out var value) && value is { }) @@ -521,22 +417,12 @@ public T GetEventMessage() /// /// true if the field is selected; otherwise, false. /// - /// - /// is null. - /// /// /// is null or whitespace. /// public bool IsSelected(string fieldName) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrWhiteSpace(fieldName)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName)); - } + ArgumentException.ThrowIfNullOrWhiteSpace(fieldName); var namedType = context.Selection.Type.NamedType(); @@ -589,31 +475,17 @@ public bool IsSelected(string fieldName) /// /// The name of the second field that shall be checked. /// - /// - /// - /// is null. - /// + /// + /// true if one of the fields is selected; otherwise, false. + /// /// /// is null or whitespace or /// is null or whitespace. /// public bool IsSelected(string fieldName1, string fieldName2) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrWhiteSpace(fieldName1)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName1)); - } - - if (string.IsNullOrWhiteSpace(fieldName2)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName2)); - } + ArgumentException.ThrowIfNullOrWhiteSpace(fieldName1); + ArgumentException.ThrowIfNullOrWhiteSpace(fieldName2); var namedType = context.Selection.Type.NamedType(); @@ -677,10 +549,9 @@ public bool IsSelected(string fieldName1, string fieldName2) /// /// The name of the third field that shall be checked. /// - /// - /// - /// is null. - /// + /// + /// true if one of the fields is selected; otherwise, false. + /// /// /// is null or whitespace or /// is null or whitespace or @@ -688,28 +559,9 @@ public bool IsSelected(string fieldName1, string fieldName2) /// public bool IsSelected(string fieldName1, string fieldName2, string fieldName3) { - ArgumentNullException.ThrowIfNull(context); - - if (string.IsNullOrWhiteSpace(fieldName1)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName1)); - } - - if (string.IsNullOrWhiteSpace(fieldName2)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName2)); - } - - if (string.IsNullOrWhiteSpace(fieldName3)) - { - throw new ArgumentException( - ResolverContextExtensions_IsSelected_FieldNameEmpty, - nameof(fieldName3)); - } + ArgumentException.ThrowIfNullOrWhiteSpace(fieldName1); + ArgumentException.ThrowIfNullOrWhiteSpace(fieldName2); + ArgumentException.ThrowIfNullOrWhiteSpace(fieldName3); var namedType = context.Selection.Type.NamedType(); @@ -771,14 +623,14 @@ public bool IsSelected(string fieldName1, string fieldName2, string fieldName3) /// /// The names of the fields that shall be checked. /// - /// + /// + /// true if one of the fields is selected; otherwise, false. + /// /// - /// is null or /// is null. /// public bool IsSelected(ISet fieldNames) { - ArgumentNullException.ThrowIfNull(context); ArgumentNullException.ThrowIfNull(fieldNames); var namedType = context.Selection.Type.NamedType(); diff --git a/src/HotChocolate/Core/src/Types/Types/Pagination/ConnectionFlagsHelper.cs b/src/HotChocolate/Core/src/Types/Types/Pagination/ConnectionFlagsHelper.cs index ce5b2eecdd7..9bce97065b6 100644 --- a/src/HotChocolate/Core/src/Types/Types/Pagination/ConnectionFlagsHelper.cs +++ b/src/HotChocolate/Core/src/Types/Types/Pagination/ConnectionFlagsHelper.cs @@ -12,71 +12,66 @@ namespace HotChocolate.Types.Pagination; /// public static class ConnectionFlagsHelper { - private const string KeyFormat = "HotChocolate.Types.Pagination.ConnectionFlags_{0}"; private static readonly ConcurrentDictionary s_parsedSelectionSets = new(); /// /// Gets the connection flags from the current resolver context. /// public static ConnectionFlags GetConnectionFlags(IResolverContext context) + => context.Selection.Features.GetOrSetSafe(CreateConnectionFlags, context); + + private static ConnectionFlags CreateConnectionFlags(IResolverContext context) { - return context.Operation.GetOrAddState( - string.Format(KeyFormat, context.Selection.Id), - static (_, ctx) => - { - if (ctx.Selection.Field is ObjectField field - && !field.Flags.HasFlag(CoreFieldFlags.Connection)) - { - return ConnectionFlags.None; - } + if (context.Selection.Field.Flags.HasFlag(CoreFieldFlags.Connection)) + { + return ConnectionFlags.None; + } - var options = PagingHelper.GetPagingOptions(ctx.Schema, ctx.Selection.Field); + var connectionFlags = ConnectionFlags.None; - var connectionFlags = ConnectionFlags.None; + if (context.IsSelected("edges")) + { + connectionFlags |= ConnectionFlags.Edges; + } - if (ctx.IsSelected("edges")) - { - connectionFlags |= ConnectionFlags.Edges; - } + if (context.IsSelected("nodes")) + { + connectionFlags |= ConnectionFlags.Nodes; + } - if (ctx.IsSelected("nodes")) - { - connectionFlags |= ConnectionFlags.Nodes; - } + if (context.IsSelected("totalCount")) + { + connectionFlags |= ConnectionFlags.TotalCount; + } + + var options = PagingHelper.GetPagingOptions(context.Schema, context.Selection.Field); + + if (options.PageInfoFields.Count > 0 + || ((options.EnableRelativeCursors ?? PagingDefaults.EnableRelativeCursors) + && options.RelativeCursorFields.Count > 0)) + { + var startSelections = context.Select(); + var selectionContext = new IsSelectedContext(context.Schema, startSelections); - if (ctx.IsSelected("totalCount")) + if (options.PageInfoFields.Count > 0) + { + if (ArePatternsMatched(startSelections, selectionContext, options.PageInfoFields)) { - connectionFlags |= ConnectionFlags.TotalCount; + connectionFlags |= ConnectionFlags.PageInfo; } + } - if (options.PageInfoFields.Count > 0 - || ((options.EnableRelativeCursors ?? PagingDefaults.EnableRelativeCursors) - && options.RelativeCursorFields.Count > 0)) + if ((options.EnableRelativeCursors ?? PagingDefaults.EnableRelativeCursors) + && options.RelativeCursorFields.Count > 0) + { + if (ArePatternsMatched(startSelections, selectionContext, options.RelativeCursorFields)) { - var startSelections = ctx.Select(); - var selectionContext = new IsSelectedContext(ctx.Schema, startSelections); - - if (options.PageInfoFields.Count > 0) - { - if (ArePatternsMatched(startSelections, selectionContext, options.PageInfoFields)) - { - connectionFlags |= ConnectionFlags.PageInfo; - } - } - - if ((options.EnableRelativeCursors ?? PagingDefaults.EnableRelativeCursors) - && options.RelativeCursorFields.Count > 0) - { - if (ArePatternsMatched(startSelections, selectionContext, options.RelativeCursorFields)) - { - connectionFlags |= ConnectionFlags.RelativeCursor; - } - } + connectionFlags |= ConnectionFlags.RelativeCursor; } + } + } - return connectionFlags; - }, - context); + return connectionFlags; } private static bool ArePatternsMatched( diff --git a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs index 97b079fc8fe..60b2676dcda 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs @@ -12,11 +12,6 @@ namespace HotChocolate.Utilities; internal static class ThrowHelper { - public static ArgumentException String_NullOrEmpty(string parameterName) => - new ArgumentException( - $"'{parameterName}' cannot be null or empty", - parameterName); - public static GraphQLException EventMessage_InvalidCast( Type expectedType, Type messageType) => @@ -24,8 +19,8 @@ public static GraphQLException EventMessage_InvalidCast( ErrorBuilder.New() .SetMessage( ThrowHelper_EventMessage_InvalidCast, - messageType.FullName!, - expectedType.FullName!) + messageType.FullName, + expectedType.FullName) .Build()); public static GraphQLException EventMessage_NotFound() => diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs index ca9bd53c437..1274cf5d887 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs @@ -1441,7 +1441,7 @@ public void OptimizeSelectionSet(SelectionSetOptimizerContext context) var bazPipeline = context.CompileResolverPipeline(baz, bazSelection); var compiledSelection = new Selection( - context.GetNextSelectionId(), + context.NewSelectionId(), context.Type, baz, baz.Type, diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs index c6ad38ed3ff..d75c48d9c51 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs @@ -68,7 +68,7 @@ private Selection CreateCombinedSelection( context.CompileResolverPipeline(nodesField, combinedField); return new Selection.Sealed( - context.GetNextSelectionId(), + context.NewSelectionId(), declaringType, nodesField, nodesField.Type, diff --git a/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs index feab6327d5f..c89ef8cbfe2 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs @@ -50,7 +50,7 @@ public Selection RewriteSelection( var nodesPipeline = context.CompileResolverPipeline(nodesField, nodesFieldNode); var compiledSelection = new Selection.Sealed( - context.GetNextSelectionId(), + context.NewSelectionId(), context.Type, nodesField, nodesField.Type, From 45ed184b524cf8b5a5e5821b69da9378860ce74b Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 4 Dec 2025 11:14:34 +0100 Subject: [PATCH 020/144] align extension argument validation --- ...uestExecutorServiceCollectionExtensions.cs | 6 --- .../ObjectPoolProviderExtensions.cs | 5 +-- .../SchemaBuilderExtensions.Resolvers.cs | 44 ++----------------- .../src/Types/Extensions/SchemaExtensions.cs | 16 ------- .../DataLoaderResolverContextExtensions.cs | 2 - .../src/Types/Internal/TypeInfoExtensions.cs | 1 - .../Directives/InternalDirectiveExtensions.cs | 10 +---- .../Directives/LookupDirectiveExtensions.cs | 5 +-- .../Directives/RequireDescriptorExtensions.cs | 5 --- .../ShareableDirectiveExtensions.cs | 13 +----- .../Configurations/BindableListExtensions.cs | 6 +-- .../ArgumentDescriptorExtensions.cs | 3 -- .../DirectiveTypeDescriptorExtensions.cs | 5 --- .../InputObjectTypeDescriptorExtensions.cs | 29 ++---------- .../InterfaceTypeDescriptorExtensions.cs | 5 --- .../ObjectFieldDescriptorExtensions.cs | 20 --------- .../ObjectTypeDescriptorExtensions.cs | 2 - .../Types/Types/Extensions/TypeExtensions.cs | 13 +----- .../Extensions/NodeTypeFeatureExtensions.cs | 3 -- .../Extensions/RelayIdFieldExtensions.cs | 21 --------- .../Core/src/Types/Types/TypeNamePrinter.cs | 2 - .../src/Types/Utilities/ReflectionUtils.cs | 24 ++-------- 22 files changed, 17 insertions(+), 223 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs index d78ec74851f..1c77312e894 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs @@ -25,8 +25,6 @@ public static class RequestExecutorServiceCollectionExtensions /// The . public static IServiceCollection AddGraphQLCore(this IServiceCollection services) { - ArgumentNullException.ThrowIfNull(services); - services.AddOptions(); services.TryAddSingleton(); @@ -109,8 +107,6 @@ public static IRequestExecutorBuilder AddGraphQL( this IServiceCollection services, string? schemaName = null) { - ArgumentNullException.ThrowIfNull(services); - services.AddGraphQLCore(); schemaName ??= ISchemaDefinition.DefaultName; return CreateBuilder(services, schemaName); @@ -133,8 +129,6 @@ public static IRequestExecutorBuilder AddGraphQL( this IRequestExecutorBuilder builder, string? schemaName = null) { - ArgumentNullException.ThrowIfNull(builder); - schemaName ??= ISchemaDefinition.DefaultName; return CreateBuilder(builder.Services, schemaName); } diff --git a/src/HotChocolate/Core/src/Types/Extensions/ObjectPoolProviderExtensions.cs b/src/HotChocolate/Core/src/Types/Extensions/ObjectPoolProviderExtensions.cs index 5a4feb791b5..771e393a38c 100644 --- a/src/HotChocolate/Core/src/Types/Extensions/ObjectPoolProviderExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Extensions/ObjectPoolProviderExtensions.cs @@ -8,8 +8,5 @@ internal static class ObjectPoolProviderExtensions { public static ObjectPool>> CreateFieldMapPool( this ObjectPoolProvider provider) - { - ArgumentNullException.ThrowIfNull(provider); - return provider.Create(new FieldMapPooledObjectPolicy()); - } + => provider.Create(new FieldMapPooledObjectPolicy()); } diff --git a/src/HotChocolate/Core/src/Types/Extensions/SchemaBuilderExtensions.Resolvers.cs b/src/HotChocolate/Core/src/Types/Extensions/SchemaBuilderExtensions.Resolvers.cs index c1de2f430d9..15961ae8f91 100644 --- a/src/HotChocolate/Core/src/Types/Extensions/SchemaBuilderExtensions.Resolvers.cs +++ b/src/HotChocolate/Core/src/Types/Extensions/SchemaBuilderExtensions.Resolvers.cs @@ -33,9 +33,7 @@ public static ISchemaBuilder AddResolver( FieldResolverDelegate resolver, Type? resultType = null) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - return AddResolverConfigInternal(builder, fieldCoordinate, resolver, resultType); } @@ -63,9 +61,7 @@ public static ISchemaBuilder AddResolver( string fieldName, Func resolver) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - return AddResolverInternal( builder, typeName, @@ -97,11 +93,8 @@ public static ISchemaBuilder AddResolver( string fieldName, Func> resolver) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - - return AddResolverInternal(builder, typeName, fieldName, - ctx => resolver(ctx)); + return AddResolverInternal(builder, typeName, fieldName, ctx => resolver(ctx)); } /// @@ -128,9 +121,7 @@ public static ISchemaBuilder AddResolver( string fieldName, Func resolver) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - return AddResolverInternal(builder, typeName, fieldName, ctx => new ValueTask(resolver(ctx))); } @@ -159,9 +150,7 @@ public static ISchemaBuilder AddResolver( string fieldName, Func> resolver) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - return AddResolverInternal(builder, typeName, fieldName, async ctx => await resolver(ctx).ConfigureAwait(false)); } @@ -190,9 +179,7 @@ public static ISchemaBuilder AddResolver( string fieldName, Func resolver) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - return AddResolverInternal(builder, typeName, fieldName, _ => new ValueTask(resolver())); } @@ -221,9 +208,7 @@ public static ISchemaBuilder AddResolver( string fieldName, Func> resolver) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - return AddResolverInternal(builder, typeName, fieldName, _ => resolver()); } @@ -251,9 +236,7 @@ public static ISchemaBuilder AddResolver( string fieldName, Func resolver) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - return AddResolverInternal(builder, typeName, fieldName, _ => new ValueTask(resolver())); } @@ -282,9 +265,7 @@ public static ISchemaBuilder AddResolver( string fieldName, Func> resolver) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - return AddResolverInternal( builder, typeName, @@ -318,9 +299,7 @@ public static ISchemaBuilder AddResolver( string fieldName, Func resolver) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - return AddResolverInternal(builder, typeName, fieldName, ctx => new ValueTask(resolver(ctx, ctx.RequestAborted))); } @@ -349,9 +328,7 @@ public static ISchemaBuilder AddResolver( string fieldName, Func resolver) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - return AddResolverInternal(builder, typeName, fieldName, ctx => new ValueTask(resolver(ctx, ctx.RequestAborted))); } @@ -380,9 +357,7 @@ public static ISchemaBuilder AddResolver( string fieldName, Func> resolver) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolver); - return AddResolverInternal( builder, typeName, @@ -415,12 +390,8 @@ public static ISchemaBuilder AddResolver( string typeName, string fieldName, object? constantResult) - { - ArgumentNullException.ThrowIfNull(builder); - - return AddResolverInternal(builder, typeName, fieldName, + => AddResolverInternal(builder, typeName, fieldName, _ => new ValueTask(constantResult)); - } /// /// Adds a resolver delegate that returns a constant result. @@ -445,12 +416,8 @@ public static ISchemaBuilder AddResolver( string typeName, string fieldName, TResult constantResult) - { - ArgumentNullException.ThrowIfNull(builder); - - return AddResolverInternal(builder, typeName, fieldName, + => AddResolverInternal(builder, typeName, fieldName, _ => new ValueTask(constantResult)); - } /// /// Adds a resolver delegate for a specific field. @@ -473,7 +440,6 @@ public static ISchemaBuilder AddResolver( Type resolverType, string? typeName = null) { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(resolverType); if (resolverType is { IsClass: true, IsAbstract: false, IsPublic: true } or @@ -519,8 +485,6 @@ public static ISchemaBuilder AddResolver( public static ISchemaBuilder AddRootResolver(this ISchemaBuilder builder, Type resolverType) { - ArgumentNullException.ThrowIfNull(builder); - if (resolverType is { IsClass: true } or { IsInterface: true }) { foreach (var property in resolverType.GetProperties()) @@ -542,9 +506,7 @@ public static ISchemaBuilder AddRootResolver(this ISchemaBuilder builder) public static ISchemaBuilder AddRootResolver(this ISchemaBuilder builder, T root) where T : class { - ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(root); - InitializeResolverTypeInterceptor(builder); var feature = builder.Features.GetRequired(); feature.RootInstance = root; diff --git a/src/HotChocolate/Core/src/Types/Extensions/SchemaExtensions.cs b/src/HotChocolate/Core/src/Types/Extensions/SchemaExtensions.cs index fa8a39f604a..e66dbf29e1c 100644 --- a/src/HotChocolate/Core/src/Types/Extensions/SchemaExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Extensions/SchemaExtensions.cs @@ -44,9 +44,6 @@ public static class SchemaExtensions /// true if a type system member was found with the given /// ; otherwise, false. /// - /// - /// is null. - /// public static bool TryGetMember( this Schema schema, string coordinateString, @@ -77,16 +74,11 @@ public static bool TryGetMember( /// true if a type system member was found with the given /// ; otherwise, false. /// - /// - /// is null. - /// public static bool TryGetMember( this Schema schema, SchemaCoordinate coordinate, [NotNullWhen(true)] out ITypeSystemMember? member) { - ArgumentNullException.ThrowIfNull(schema); - if (coordinate.OfDirective) { if (schema.DirectiveTypes.TryGetDirective(coordinate.Name, out var directive)) @@ -178,9 +170,6 @@ public static bool TryGetMember( /// /// Returns the resolved type system member. /// - /// - /// is null. - /// /// /// The has invalid syntax. /// @@ -205,9 +194,6 @@ public static ITypeSystemMember GetMember( /// /// Returns the resolved type system member. /// - /// - /// is null. - /// /// /// Unable to resolve a type system member with the /// specified . @@ -216,8 +202,6 @@ public static ITypeSystemMember GetMember( this Schema schema, SchemaCoordinate coordinate) { - ArgumentNullException.ThrowIfNull(schema); - if (coordinate.OfDirective) { if (schema.DirectiveTypes.TryGetDirective(coordinate.Name, out var directive)) diff --git a/src/HotChocolate/Core/src/Types/Fetching/Extensions/DataLoaderResolverContextExtensions.cs b/src/HotChocolate/Core/src/Types/Fetching/Extensions/DataLoaderResolverContextExtensions.cs index 6acc7d516d7..b2487a09c38 100644 --- a/src/HotChocolate/Core/src/Types/Fetching/Extensions/DataLoaderResolverContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Fetching/Extensions/DataLoaderResolverContextExtensions.cs @@ -12,8 +12,6 @@ public static class DataLoaderResolverContextExtensions public static T DataLoader(this IResolverContext context) where T : IDataLoader { - ArgumentNullException.ThrowIfNull(context); - var services = context.RequestServices; var reg = services.GetRequiredService(); return reg.GetDataLoader(); diff --git a/src/HotChocolate/Core/src/Types/Internal/TypeInfoExtensions.cs b/src/HotChocolate/Core/src/Types/Internal/TypeInfoExtensions.cs index 4d74b04267f..cd40ef9723d 100644 --- a/src/HotChocolate/Core/src/Types/Internal/TypeInfoExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Internal/TypeInfoExtensions.cs @@ -33,7 +33,6 @@ internal static IType CreateType(this ITypeInfo typeInfo, ITypeDefinition typeDe /// public static TypeReference CreateTypeReference(this ITypeInfo typeInfo, NamedTypeNode namedType) { - ArgumentNullException.ThrowIfNull(typeInfo); ArgumentNullException.ThrowIfNull(namedType); ITypeNode type = namedType; diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Directives/InternalDirectiveExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Directives/InternalDirectiveExtensions.cs index 5568f9d79e6..a98a9ba00f6 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Directives/InternalDirectiveExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Directives/InternalDirectiveExtensions.cs @@ -26,10 +26,7 @@ public static class InternalDirectiveExtensions /// /// public static IObjectTypeDescriptor Internal(this IObjectTypeDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - return descriptor.Directive(Composite.Internal.Instance); - } + => descriptor.Directive(Composite.Internal.Instance); /// /// @@ -52,8 +49,5 @@ public static IObjectTypeDescriptor Internal(this IObjectTypeDescriptor descript /// /// public static IObjectFieldDescriptor Internal(this IObjectFieldDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - return descriptor.Directive(Composite.Internal.Instance); - } + => descriptor.Directive(Composite.Internal.Instance); } diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Directives/LookupDirectiveExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Directives/LookupDirectiveExtensions.cs index d8990b5ce08..69d988acb54 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Directives/LookupDirectiveExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Directives/LookupDirectiveExtensions.cs @@ -23,8 +23,5 @@ public static class LookupDirectiveExtensions /// /// public static IObjectFieldDescriptor Lookup(this IObjectFieldDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - return descriptor.Directive(Composite.Lookup.Instance); - } + => descriptor.Directive(Composite.Lookup.Instance); } diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Directives/RequireDescriptorExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Directives/RequireDescriptorExtensions.cs index 4dd41df7462..1b9865e740e 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Directives/RequireDescriptorExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Directives/RequireDescriptorExtensions.cs @@ -23,16 +23,11 @@ public static class RequireDescriptorExtensions /// The argument descriptor. /// The field selection map. /// The argument descriptor with the @require directive applied. - /// - /// The is null. - /// /// /// The syntax used in the parameter is invalid. /// public static IArgumentDescriptor Require(this IArgumentDescriptor descriptor, string field) { - ArgumentNullException.ThrowIfNull(descriptor); - IValueSelectionNode valueSelection; try diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Directives/ShareableDirectiveExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Directives/ShareableDirectiveExtensions.cs index 9fa833ee517..93d5eb8846a 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Directives/ShareableDirectiveExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Directives/ShareableDirectiveExtensions.cs @@ -46,15 +46,10 @@ public static class ShareableDirectiveExtensions /// fields of the type sharable. /// /// The object type descriptor with the directive applied. - /// - /// The is null. - /// public static IObjectTypeDescriptor Shareable( this IObjectTypeDescriptor descriptor, bool scoped = false) { - ArgumentNullException.ThrowIfNull(descriptor); - if (scoped) { // The @sharable directive on a type is meant as a helper to apply it to all fields within its scope. @@ -117,12 +112,6 @@ public static IObjectTypeDescriptor Shareable( /// /// The object field descriptor. /// The object field descriptor with the directive applied. - /// - /// The is null. - /// public static IObjectFieldDescriptor Shareable(this IObjectFieldDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - return descriptor.Directive(Composite.Shareable.Instance); - } + => descriptor.Directive(Composite.Shareable.Instance); } diff --git a/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/BindableListExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/BindableListExtensions.cs index e23c9d3d122..87684e4dc06 100644 --- a/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/BindableListExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/BindableListExtensions.cs @@ -3,9 +3,5 @@ namespace HotChocolate.Types.Descriptors.Configurations; public static class BindableListExtensions { public static bool IsImplicitBinding(this IBindableList list) - { - ArgumentNullException.ThrowIfNull(list); - - return list.BindingBehavior == BindingBehavior.Implicit; - } + => list.BindingBehavior == BindingBehavior.Implicit; } diff --git a/src/HotChocolate/Core/src/Types/Types/Extensions/ArgumentDescriptorExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Extensions/ArgumentDescriptorExtensions.cs index 8c355e36286..8fa5fc4408b 100644 --- a/src/HotChocolate/Core/src/Types/Types/Extensions/ArgumentDescriptorExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Extensions/ArgumentDescriptorExtensions.cs @@ -23,7 +23,6 @@ public static class ArgumentDescriptorExtensions /// Returns the input field descriptor for configuration chaining. /// /// - /// is null. /// is null. /// /// @@ -33,9 +32,7 @@ public static IArgumentDescriptor DefaultValueSyntax( this IArgumentDescriptor descriptor, [StringSyntax("graphql")] string syntax) { - ArgumentNullException.ThrowIfNull(descriptor); ArgumentNullException.ThrowIfNull(syntax); - var value = Utf8GraphQLParser.Syntax.ParseValueLiteral(syntax); return descriptor.DefaultValue(value); } diff --git a/src/HotChocolate/Core/src/Types/Types/Extensions/DirectiveTypeDescriptorExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Extensions/DirectiveTypeDescriptorExtensions.cs index a657798315e..50c86c59cfa 100644 --- a/src/HotChocolate/Core/src/Types/Types/Extensions/DirectiveTypeDescriptorExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Extensions/DirectiveTypeDescriptorExtensions.cs @@ -9,9 +9,7 @@ public static IDirectiveTypeDescriptor Ignore( this IDirectiveTypeDescriptor descriptor, Expression> property) { - ArgumentNullException.ThrowIfNull(descriptor); ArgumentNullException.ThrowIfNull(property); - descriptor.Argument(property).Ignore(); return descriptor; } @@ -29,7 +27,6 @@ public static IDirectiveTypeDescriptor Ignore( /// Returns the directive argument descriptor for configuration chaining. /// /// - /// is null. /// is null. /// /// @@ -39,9 +36,7 @@ public static IDirectiveArgumentDescriptor Type( this IDirectiveArgumentDescriptor descriptor, string typeSyntax) { - ArgumentNullException.ThrowIfNull(descriptor); ArgumentNullException.ThrowIfNull(typeSyntax); - return descriptor.Type(Utf8GraphQLParser.Syntax.ParseTypeReference(typeSyntax)); } } diff --git a/src/HotChocolate/Core/src/Types/Types/Extensions/InputObjectTypeDescriptorExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Extensions/InputObjectTypeDescriptorExtensions.cs index cbe781a1857..50bdd7826db 100644 --- a/src/HotChocolate/Core/src/Types/Types/Extensions/InputObjectTypeDescriptorExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Extensions/InputObjectTypeDescriptorExtensions.cs @@ -25,16 +25,13 @@ public static class InputObjectTypeDescriptorExtensions /// Returns the descriptor for configuration chaining. /// /// - /// The is null or - /// the is null. + /// The is null. /// public static IInputObjectTypeDescriptor Ignore( this IInputObjectTypeDescriptor descriptor, Expression> property) { - ArgumentNullException.ThrowIfNull(descriptor); ArgumentNullException.ThrowIfNull(property); - descriptor.Field(property).Ignore(); return descriptor; } @@ -49,15 +46,8 @@ public static IInputObjectTypeDescriptor Ignore( /// /// Returns the descriptor for configuration chaining. /// - /// - /// The is null. - /// public static IInputObjectTypeDescriptor OneOf(this IInputObjectTypeDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - - return descriptor.Directive(DirectiveNames.OneOf.Name); - } + => descriptor.Directive(DirectiveNames.OneOf.Name); /// /// Defines an input object type as a OneOf input object type @@ -72,16 +62,9 @@ public static IInputObjectTypeDescriptor OneOf(this IInputObjectTypeDescriptor d /// /// Returns the descriptor for configuration chaining. /// - /// - /// The is null. - /// public static IInputObjectTypeDescriptor OneOf( this IInputObjectTypeDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - - return descriptor.Directive(DirectiveNames.OneOf.Name); - } + => descriptor.Directive(DirectiveNames.OneOf.Name); /// /// Specifies the type of an input field with GraphQL SDL type syntax. @@ -96,7 +79,6 @@ public static IInputObjectTypeDescriptor OneOf( /// Returns the input field descriptor for configuration chaining. /// /// - /// is null. /// is null. /// /// @@ -106,9 +88,7 @@ public static IInputFieldDescriptor Type( this IInputFieldDescriptor descriptor, string typeSyntax) { - ArgumentNullException.ThrowIfNull(descriptor); ArgumentNullException.ThrowIfNull(typeSyntax); - return descriptor.Type(Utf8GraphQLParser.Syntax.ParseTypeReference(typeSyntax)); } @@ -125,7 +105,6 @@ public static IInputFieldDescriptor Type( /// Returns the input field descriptor for configuration chaining. /// /// - /// is null. /// is null. /// /// @@ -135,9 +114,7 @@ public static IInputFieldDescriptor DefaultValueSyntax( this IInputFieldDescriptor descriptor, [StringSyntax("graphql")] string syntax) { - ArgumentNullException.ThrowIfNull(descriptor); ArgumentNullException.ThrowIfNull(syntax); - var value = Utf8GraphQLParser.Syntax.ParseValueLiteral(syntax); return descriptor.DefaultValue(value); } diff --git a/src/HotChocolate/Core/src/Types/Types/Extensions/InterfaceTypeDescriptorExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Extensions/InterfaceTypeDescriptorExtensions.cs index 58223d2e9f4..ce65ff90a3b 100644 --- a/src/HotChocolate/Core/src/Types/Types/Extensions/InterfaceTypeDescriptorExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Extensions/InterfaceTypeDescriptorExtensions.cs @@ -9,9 +9,7 @@ public static IInterfaceTypeDescriptor Ignore( this IInterfaceTypeDescriptor descriptor, Expression> propertyOrMethod) { - ArgumentNullException.ThrowIfNull(descriptor); ArgumentNullException.ThrowIfNull(propertyOrMethod); - descriptor.Field(propertyOrMethod).Ignore(); return descriptor; } @@ -29,7 +27,6 @@ public static IInterfaceTypeDescriptor Ignore( /// Returns the interface field descriptor for configuration chaining. /// /// - /// is null. /// is null. /// /// @@ -39,9 +36,7 @@ public static IInterfaceFieldDescriptor Type( this IInterfaceFieldDescriptor descriptor, string typeSyntax) { - ArgumentNullException.ThrowIfNull(descriptor); ArgumentNullException.ThrowIfNull(typeSyntax); - return descriptor.Type(Utf8GraphQLParser.Syntax.ParseTypeReference(typeSyntax)); } } diff --git a/src/HotChocolate/Core/src/Types/Types/Extensions/ObjectFieldDescriptorExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Extensions/ObjectFieldDescriptorExtensions.cs index 8a2e3c96d49..708ff4b135d 100644 --- a/src/HotChocolate/Core/src/Types/Types/Extensions/ObjectFieldDescriptorExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Extensions/ObjectFieldDescriptorExtensions.cs @@ -14,8 +14,6 @@ public static class ObjectFieldDescriptorExtensions /// public static IObjectFieldDescriptor Serial(this IObjectFieldDescriptor descriptor) { - ArgumentNullException.ThrowIfNull(descriptor); - descriptor.Extend().OnBeforeCreate(c => c.IsParallelExecutable = false); return descriptor; } @@ -26,8 +24,6 @@ public static IObjectFieldDescriptor Serial(this IObjectFieldDescriptor descript /// public static IObjectFieldDescriptor Parallel(this IObjectFieldDescriptor descriptor) { - ArgumentNullException.ThrowIfNull(descriptor); - descriptor.Extend().OnBeforeCreate(c => c.IsParallelExecutable = true); return descriptor; } @@ -45,7 +41,6 @@ public static IObjectFieldDescriptor Parallel(this IObjectFieldDescriptor descri /// Returns the object field descriptor for configuration chaining. /// /// - /// is null. /// is null. /// /// @@ -55,9 +50,7 @@ public static IObjectFieldDescriptor Type( this IObjectFieldDescriptor descriptor, string typeSyntax) { - ArgumentNullException.ThrowIfNull(descriptor); ArgumentNullException.ThrowIfNull(typeSyntax); - return descriptor.Type(Utf8GraphQLParser.Syntax.ParseTypeReference(typeSyntax)); } @@ -74,7 +67,6 @@ public static IObjectFieldDescriptor Type( /// Returns the argument descriptor for configuration chaining. /// /// - /// is null. /// is null. /// /// @@ -84,9 +76,7 @@ public static IArgumentDescriptor Type( this IArgumentDescriptor descriptor, string typeSyntax) { - ArgumentNullException.ThrowIfNull(descriptor); ArgumentNullException.ThrowIfNull(typeSyntax); - return descriptor.Type(Utf8GraphQLParser.Syntax.ParseTypeReference(typeSyntax)); } @@ -99,14 +89,9 @@ public static IArgumentDescriptor Type( /// /// Returns the object field descriptor for configuration chaining. /// - /// - /// is null. - /// public static IObjectFieldDescriptor UseRequestScope( this IObjectFieldDescriptor descriptor) { - ArgumentNullException.ThrowIfNull(descriptor); - descriptor.Extend().Configuration.DependencyInjectionScope = DependencyInjectionScope.Request; return descriptor; } @@ -120,14 +105,9 @@ public static IObjectFieldDescriptor UseRequestScope( /// /// Returns the object field descriptor for configuration chaining. /// - /// - /// is null. - /// public static IObjectFieldDescriptor UseResolverScope( this IObjectFieldDescriptor descriptor) { - ArgumentNullException.ThrowIfNull(descriptor); - descriptor.Extend().Configuration.DependencyInjectionScope = DependencyInjectionScope.Resolver; return descriptor; } diff --git a/src/HotChocolate/Core/src/Types/Types/Extensions/ObjectTypeDescriptorExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Extensions/ObjectTypeDescriptorExtensions.cs index 4aad269bb55..e80c9ff6d31 100644 --- a/src/HotChocolate/Core/src/Types/Types/Extensions/ObjectTypeDescriptorExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Extensions/ObjectTypeDescriptorExtensions.cs @@ -12,9 +12,7 @@ public static IObjectTypeDescriptor Ignore( this IObjectTypeDescriptor descriptor, Expression> propertyOrMethod) { - ArgumentNullException.ThrowIfNull(descriptor); ArgumentNullException.ThrowIfNull(propertyOrMethod); - descriptor.Field(propertyOrMethod).Ignore(); return descriptor; } diff --git a/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs index eac5e96bdf8..4751b4964cf 100644 --- a/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs @@ -11,8 +11,6 @@ public static class TypeExtensions { internal static IInputType EnsureInputType(this IType type) { - ArgumentNullException.ThrowIfNull(type); - if (type.NamedType() is not IInputType) { throw InputTypeExpected(type); @@ -23,8 +21,6 @@ internal static IInputType EnsureInputType(this IType type) internal static IOutputType EnsureOutputType(this IType type) { - ArgumentNullException.ThrowIfNull(type); - if (type.NamedType() is not IOutputType) { throw OutputTypeExpected(type); @@ -34,16 +30,10 @@ internal static IOutputType EnsureOutputType(this IType type) } public static string TypeName(this IType type) - { - ArgumentNullException.ThrowIfNull(type); - - return type.NamedType().Name; - } + => type.NamedType().Name; public static Type ToRuntimeType(this IType type) { - ArgumentNullException.ThrowIfNull(type); - if (type.IsListType()) { var elementType = ToRuntimeType(type.ElementType()); @@ -94,7 +84,6 @@ public static ITypeNode RenameName(this ITypeNode typeNode, string name) public static bool IsInstanceOfType(this IInputType type, IValueNode literal) { - ArgumentNullException.ThrowIfNull(type); ArgumentNullException.ThrowIfNull(literal); while (true) diff --git a/src/HotChocolate/Core/src/Types/Types/Relay/Extensions/NodeTypeFeatureExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Relay/Extensions/NodeTypeFeatureExtensions.cs index 1fa86b4ecea..e7486276a7a 100644 --- a/src/HotChocolate/Core/src/Types/Types/Relay/Extensions/NodeTypeFeatureExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Relay/Extensions/NodeTypeFeatureExtensions.cs @@ -15,8 +15,6 @@ internal static class NodeTypeFeatureExtensions /// True if the node resolver was found, false otherwise. public static bool TryGetNodeResolver(this ObjectType type, [NotNullWhen(true)] out NodeResolverInfo? nodeResolver) { - ArgumentNullException.ThrowIfNull(type); - if (type.Features.TryGet(out var feature) && feature.NodeResolver is not null) { nodeResolver = feature.NodeResolver; @@ -39,7 +37,6 @@ public static void SetNodeResolver( this ObjectType type, NodeResolverInfo nodeResolver) { - ArgumentNullException.ThrowIfNull(type); ArgumentNullException.ThrowIfNull(nodeResolver); var feature = type.Features.Get(); diff --git a/src/HotChocolate/Core/src/Types/Types/Relay/Extensions/RelayIdFieldExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Relay/Extensions/RelayIdFieldExtensions.cs index c7319f40361..fb39ff1f0d8 100644 --- a/src/HotChocolate/Core/src/Types/Types/Relay/Extensions/RelayIdFieldExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Relay/Extensions/RelayIdFieldExtensions.cs @@ -67,10 +67,7 @@ public static IInputFieldDescriptor ID( this IInputFieldDescriptor descriptor, string? typeName = null) { - ArgumentNullException.ThrowIfNull(descriptor); - RelayIdFieldHelpers.ApplyIdToField(descriptor, typeName); - return descriptor; } @@ -80,10 +77,7 @@ public static IInputFieldDescriptor ID( /// public static IInputFieldDescriptor ID(this IInputFieldDescriptor descriptor) { - ArgumentNullException.ThrowIfNull(descriptor); - RelayIdFieldHelpers.ApplyIdToField(descriptor); - return descriptor; } @@ -96,10 +90,7 @@ public static IArgumentDescriptor ID( this IArgumentDescriptor descriptor, string? typeName = null) { - ArgumentNullException.ThrowIfNull(descriptor); - RelayIdFieldHelpers.ApplyIdToField(descriptor, typeName); - return descriptor; } @@ -109,10 +100,7 @@ public static IArgumentDescriptor ID( /// public static IArgumentDescriptor ID(this IArgumentDescriptor descriptor) { - ArgumentNullException.ThrowIfNull(descriptor); - RelayIdFieldHelpers.ApplyIdToField(descriptor); - return descriptor; } @@ -125,10 +113,7 @@ public static IObjectFieldDescriptor ID( this IObjectFieldDescriptor descriptor, string? typeName = null) { - ArgumentNullException.ThrowIfNull(descriptor); - RelayIdFieldHelpers.ApplyIdToField(descriptor, typeName); - return descriptor; } @@ -138,10 +123,7 @@ public static IObjectFieldDescriptor ID( /// public static IObjectFieldDescriptor ID(this IObjectFieldDescriptor descriptor) { - ArgumentNullException.ThrowIfNull(descriptor); - RelayIdFieldHelpers.ApplyIdToField(descriptor); - return descriptor; } @@ -149,10 +131,7 @@ public static IObjectFieldDescriptor ID(this IObjectFieldDescriptor descripto /// the descriptor public static IInterfaceFieldDescriptor ID(this IInterfaceFieldDescriptor descriptor) { - ArgumentNullException.ThrowIfNull(descriptor); - RelayIdFieldHelpers.ApplyIdToField(descriptor); - return descriptor; } } diff --git a/src/HotChocolate/Core/src/Types/Types/TypeNamePrinter.cs b/src/HotChocolate/Core/src/Types/Types/TypeNamePrinter.cs index 39ff7debc72..aff5cae7b6c 100644 --- a/src/HotChocolate/Core/src/Types/Types/TypeNamePrinter.cs +++ b/src/HotChocolate/Core/src/Types/Types/TypeNamePrinter.cs @@ -8,8 +8,6 @@ public static class TypeNamePrinter private static string Print(IType type, int count) { - ArgumentNullException.ThrowIfNull(type); - if (count > MaxTypeDepth) { throw new InvalidOperationException( diff --git a/src/HotChocolate/Core/src/Types/Utilities/ReflectionUtils.cs b/src/HotChocolate/Core/src/Types/Utilities/ReflectionUtils.cs index 73e4ec4aab7..7cb3f36bd38 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ReflectionUtils.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ReflectionUtils.cs @@ -15,11 +15,7 @@ public static class ReflectionUtils public static MemberInfo TryExtractMember( this Expression> memberExpression, bool allowStatic = false) - { - ArgumentNullException.ThrowIfNull(memberExpression); - - return TryExtractMemberInternal(UnwrapFunc(memberExpression), allowStatic); - } + => TryExtractMemberInternal(UnwrapFunc(memberExpression), allowStatic); internal static MemberInfo TryExtractCallMember( this Expression expression) @@ -56,20 +52,12 @@ public static MethodInfo ExtractMethod( public static MemberInfo ExtractMember( this Expression> memberExpression, bool allowStatic = false) - { - ArgumentNullException.ThrowIfNull(memberExpression); - - return ExtractMemberInternal(UnwrapAction(memberExpression), allowStatic); - } + => ExtractMemberInternal(UnwrapAction(memberExpression), allowStatic); public static MemberInfo ExtractMember( this Expression> memberExpression, bool allowStatic = false) - { - ArgumentNullException.ThrowIfNull(memberExpression); - - return ExtractMemberInternal(UnwrapFunc(memberExpression), allowStatic); - } + => ExtractMemberInternal(UnwrapFunc(memberExpression), allowStatic); private static MemberInfo ExtractMemberInternal( Expression expression, @@ -184,13 +172,9 @@ private static bool IsStaticMethod(MethodInfo method) => method.IsStatic; public static string GetTypeName(this Type type) - { - ArgumentNullException.ThrowIfNull(type); - - return type.IsGenericType + => type.IsGenericType ? CreateGenericTypeName(type) : CreateTypeName(type, type.Name); - } private static string CreateGenericTypeName(Type type) { From be3c2a5bdc36d1bafd587f9f8959cd4e4ea8af95 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 4 Dec 2025 21:57:05 +0100 Subject: [PATCH 021/144] wip --- .../CacheControlConstraintsOptimizer.cs | 16 +-- .../src/Caching/ImmutableCacheConstraints.cs | 12 +++ .../src/Caching/QueryCacheMiddleware.cs | 11 +-- .../Processing/OperationFeatureCollection.cs | 13 ++- .../Types/Execution/Processing/Selection.cs | 99 ++++++++++++++++++- .../Processing/SelectionFeatureCollection.cs | 28 ++++++ .../SelectionSetOptimizerContext.cs | 8 ++ .../Core/src/Types/HotChocolate.Types.csproj | 3 +- .../Extensions/FilterFeatureExtensions.cs | 4 +- .../HotChocolateDataQueryableExtensions.cs | 16 ++- .../Data/src/Data/HotChocolate.Data.csproj | 1 + ...gingArgumentsParameterExpressionBuilder.cs | 2 +- .../Projections/Context/ISelectedField.cs | 4 +- .../Data/Projections/Context/SelectedField.cs | 29 +++--- .../ProjectionProviderDescriptorExtensions.cs | 1 + .../Convention/IProjectionFieldInterceptor.cs | 2 +- .../IProjectionFieldInterceptor`1.cs | 4 +- .../ProjectionInterceptorCombinator.cs | 6 +- .../Convention/ProjectionProvider.cs | 5 +- .../Convention/ProjectionSelection.cs | 23 ----- .../ProjectionSelectionExtensions.cs | 12 +++ .../Handlers/ProjectionFieldHandler.cs | 16 +-- .../Handlers/ProjectionFieldWrapper.cs | 14 +-- .../QueryableProjectionFieldHandler.cs | 6 +- .../QueryableProjectionHandlerBase.cs | 4 +- .../QueryableProjectionListHandler.cs | 8 +- .../QueryableProjectionScalarHandler.cs | 6 +- .../Interceptor/QueryableFilterInterceptor.cs | 11 +-- .../Interceptor/QueryableSortInterceptor.cs | 18 ++-- .../QueryableTakeHandlerInterceptor.cs | 6 +- .../QueryableFilterProjectionOptimizer.cs | 2 +- .../QueryablePagingProjectionOptimizer.cs | 51 +++++----- .../QueryableSortProjectionOptimizer.cs | 6 +- .../Expressions/QueryableProjectionContext.cs | 22 +++-- .../Expressions/QueryableProjectionVisitor.cs | 6 +- ...ojectionObjectFieldDescriptorExtensions.cs | 49 +++------ .../Extensions/SelectionFlagsExtensions.cs | 16 +-- .../Data/Projections/IProjectionSelection.cs | 8 -- .../Projections/ISelectionVisitorContext.cs | 13 ++- .../IsProjectedProjectionOptimizer.cs | 33 +++---- .../Optimizers/NodeSelectionSetOptimizer.cs | 4 +- .../src/Data/Projections/ProjectionFeature.cs | 5 - .../Data/Projections/ProjectionOptimizer.cs | 6 +- .../Data/Projections/ProjectionTypeFeature.cs | 6 ++ .../Projections/ProjectionTypeInterceptor.cs | 1 + .../src/Data/Projections/ProjectionVisitor.cs | 66 ++++++------- .../src/Data/Projections/SelectionVisitor.cs | 4 +- .../Projections/SelectionVisitorContext.cs | 10 +- .../Data/Projections/SelectionVisitor`1.cs | 76 +++++++------- .../Visitor/IProjectionFieldHandler.cs | 9 +- .../Visitor/IProjectionFieldHandler~1.cs | 16 ++- .../Projections/Visitor/ProjectionScope.cs | 7 +- .../Visitor/ProjectionVisitorContext.cs | 9 +- ...SortingContextResolverContextExtensions.cs | 2 +- .../Extensions/SortingFeatureExtensions.cs | 29 +++--- .../src/Diagnostics/ActivityEnricher.cs | 10 +- .../Fusion.Execution.Benchmarks.csproj | 1 + .../GraphQLQueryBenchmark.cs | 9 +- ...bProjectionProviderDescriptorExtensions.cs | 1 + .../HotChocolate.Utilities.Buffers.csproj | 1 + 60 files changed, 480 insertions(+), 386 deletions(-) delete mode 100644 src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelection.cs create mode 100644 src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelectionExtensions.cs delete mode 100644 src/HotChocolate/Data/src/Data/Projections/IProjectionSelection.cs create mode 100644 src/HotChocolate/Data/src/Data/Projections/ProjectionTypeFeature.cs diff --git a/src/HotChocolate/Caching/src/Caching/CacheControlConstraintsOptimizer.cs b/src/HotChocolate/Caching/src/Caching/CacheControlConstraintsOptimizer.cs index 2fa588c8518..a12a2c80b87 100644 --- a/src/HotChocolate/Caching/src/Caching/CacheControlConstraintsOptimizer.cs +++ b/src/HotChocolate/Caching/src/Caching/CacheControlConstraintsOptimizer.cs @@ -38,20 +38,8 @@ public void OptimizeOperation(OperationOptimizerContext context) : null }; - context.ContextData.Add( - ExecutionContextData.CacheControlConstraints, - constraints); - - context.ContextData.Add( - ExecutionContextData.CacheControlHeaderValue, - headerValue); - } - - if (constraints.Vary is { Length: > 0 }) - { - context.ContextData.Add( - ExecutionContextData.VaryHeaderValue, - string.Join(", ", constraints.Vary)); + context.Operation.Features.SetSafe(constraints); + context.Operation.Features.SetSafe(headerValue); } } diff --git a/src/HotChocolate/Caching/src/Caching/ImmutableCacheConstraints.cs b/src/HotChocolate/Caching/src/Caching/ImmutableCacheConstraints.cs index 97472f0697e..91a1f454ef5 100644 --- a/src/HotChocolate/Caching/src/Caching/ImmutableCacheConstraints.cs +++ b/src/HotChocolate/Caching/src/Caching/ImmutableCacheConstraints.cs @@ -16,4 +16,16 @@ internal sealed class ImmutableCacheConstraints( public CacheControlScope Scope { get; } = scope; public ImmutableArray Vary { get; } = vary; + + public string VaryString + { + get + { + field ??= Vary.Length is 0 + ? string.Empty + : string.Join(", ", Vary); + + return field; + } + } } diff --git a/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs b/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs index 190acf51ae9..889d3476e28 100644 --- a/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs +++ b/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs @@ -30,7 +30,8 @@ public async ValueTask InvokeAsync(RequestContext context) } if (!context.TryGetOperation(out var operation) - || !operation.Features.TryGet(out var cacheControlHeaderValue)) + || !operation.Features.TryGet(out var headerValue) + || !operation.Features.TryGet(out var constraints)) { return; } @@ -45,13 +46,11 @@ operationResult.ContextData is not null ? new ExtensionData(operationResult.ContextData) : []; - contextData.Add(ExecutionContextData.CacheControlHeaderValue, cacheControlHeaderValue); + contextData.Add(ExecutionContextData.CacheControlHeaderValue, headerValue); - if (operation.ContextData.TryGetValue(ExecutionContextData.VaryHeaderValue, out var varyValue) - && varyValue is string varyHeaderValue - && !string.IsNullOrEmpty(varyHeaderValue)) + if (constraints.Vary.Length > 0) { - contextData.Add(ExecutionContextData.VaryHeaderValue, varyHeaderValue); + contextData.Add(ExecutionContextData.VaryHeaderValue, constraints.Vary); } context.Result = operationResult.WithContextData(contextData); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs index 69972333267..dfbf1426fb2 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationFeatureCollection.cs @@ -123,11 +123,14 @@ public bool TryGet([NotNullWhen(true)] out TFeature? feature) return false; } - /// - public void Set(TFeature? instance) - { - this[typeof(TFeature)] = instance; - } + /// + /// Sets a feature instance for this selection. + /// + /// The type of the feature. + /// The feature instance to set, or null to remove. + /// This method is thread-safe. + public void SetSafe(TFeature? instance) + => this[typeof(TFeature)] = instance; /// public IEnumerator> GetEnumerator() diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index cef3f42b1cd..d47b00eb706 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -24,10 +24,10 @@ internal Selection( ObjectField field, FieldSelectionNode[] syntaxNodes, ulong[] includeFlags, - bool isInternal, - ArgumentMap? arguments, - FieldDelegate? resolverPipeline, - PureFieldDelegate? pureResolver) + bool isInternal = false, + ArgumentMap? arguments = null, + FieldDelegate? resolverPipeline = null, + PureFieldDelegate? pureResolver = null) { ArgumentNullException.ThrowIfNull(field); @@ -41,6 +41,7 @@ internal Selection( Id = id; ResponseName = responseName; Field = field; + Type = field.Type; Arguments = arguments ?? s_emptyArguments; ResolverPipeline = resolverPipeline; PureResolver = pureResolver; @@ -64,6 +65,34 @@ internal Selection( _utf8ResponseName = Utf8StringCache.GetUtf8String(responseName); } + private Selection( + int id, + string responseName, + byte[] utf8ResponseName, + ObjectField field, + IType type, + FieldSelectionNode[] syntaxNodes, + ulong[] includeFlags, + Flags flags, + ArgumentMap? arguments, + SelectionExecutionStrategy strategy, + FieldDelegate? resolverPipeline, + PureFieldDelegate? pureResolver) + { + Id = id; + ResponseName = responseName; + Field = field; + Type = type; + Arguments = arguments ?? s_emptyArguments; + ResolverPipeline = resolverPipeline; + PureResolver = pureResolver; + Strategy = strategy; + _syntaxNodes = syntaxNodes; + _includeFlags = includeFlags; + _flags = flags; + _utf8ResponseName = utf8ResponseName; + } + /// public int Id { get; } @@ -100,7 +129,7 @@ internal Selection( IOutputFieldDefinition ISelection.Field => Field; /// - public IType Type => Field.Type; + public IType Type { get; } /// /// Gets the object type that declares the field being selected. @@ -161,6 +190,28 @@ IEnumerable ISelection.GetSyntaxNodes() } } + /// + /// Gets the selection set for this selection resolved against the specified object type. + /// + /// + /// The object type context to resolve the selection set against. + /// + /// + /// The selection set containing the child selections for the specified type context. + /// + /// + /// Thrown when this selection is a leaf selection (scalar or enum) which does not have child selections. + /// + public SelectionSet GetSelectionSet(ObjectType typeContext) + { + if (IsLeaf) + { + throw new InvalidOperationException("Leaf selections do not have a selection set."); + } + + return DeclaringOperation.GetSelectionSet(this, typeContext); + } + /// /// Determines whether this selection should be skipped based on conditional flags. /// @@ -215,6 +266,44 @@ public bool IsIncluded(ulong includeFlags) return false; } + public Selection WithField(ObjectField field) + { + ArgumentNullException.ThrowIfNull(field); + + return new Selection( + Id, + ResponseName, + _utf8ResponseName, + field, + field.Type, + _syntaxNodes, + _includeFlags, + _flags, + Arguments, + Strategy, + ResolverPipeline, + PureResolver); + } + + public Selection WithType(IType type) + { + ArgumentNullException.ThrowIfNull(type); + + return new Selection( + Id, + ResponseName, + _utf8ResponseName, + Field, + type, + _syntaxNodes, + _includeFlags, + _flags, + Arguments, + Strategy, + ResolverPipeline, + PureResolver); + } + public override string ToString() { if (SyntaxNodes[0].Node.Alias is not null) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs index b1fe6773b6e..f14458099ba 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs @@ -46,6 +46,34 @@ public object? this[Type key] set => _parent[_selectionId, key] = value; } + /// + /// Gets a feature of the specified type. + /// + /// The type of the feature. + /// The feature instance, or null if not found. + /// + /// Thrown when is a non-nullable value type and the feature does not exist. + /// + public TFeature? Get() + { + if (typeof(TFeature).IsValueType) + { + var feature = this[typeof(TFeature)]; + if (feature is null && Nullable.GetUnderlyingType(typeof(TFeature)) is null) + { + throw new InvalidOperationException( + $"{typeof(TFeature).FullName} does not exist in the feature collection " + + "and because it is a struct the method can't return null. " + + $"Use 'featureCollection[typeof({typeof(TFeature).FullName})] is not null' " + + "to check if the feature exists."); + } + + return (TFeature?)feature; + } + + return (TFeature?)this[typeof(TFeature)]; + } + /// /// Sets a feature instance for this selection. /// diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs index afb94e02f92..c956a0fa9a0 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs @@ -50,6 +50,8 @@ internal SelectionSetOptimizerContext( /// public ObjectType TypeContext { get; } + public ImmutableArray Selections => _selections; + public bool ContainsField(string fieldName) => _selections.Any(t => t.Field.Name.EqualsOrdinal(fieldName)); @@ -65,6 +67,12 @@ public bool TryGetSelection(string responseName, [MaybeNullWhen(false)] out Sele return _selectionMap.TryGetValue(responseName, out value); } + public Selection GetSelection(string responseName) + { + _selectionMap ??= _selections.ToDictionary(t => t.ResponseName); + return _selectionMap[responseName]; + } + public SelectionFeatureCollection Features => new(_features, _selectionSetId); /// diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index a36c9b2e24c..d17deed0210 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -35,8 +35,7 @@ - - + diff --git a/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFeatureExtensions.cs b/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFeatureExtensions.cs index e1873fe3f38..cb7cde8e8da 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFeatureExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFeatureExtensions.cs @@ -15,7 +15,7 @@ public static class FilterFeatureExtensions /// true if the selection has a filtering enabled; /// otherwise, false. /// - public static bool HasFilterFeature(this ISelection selection) + public static bool HasFilterFeature(this Selection selection) { ArgumentNullException.ThrowIfNull(selection); @@ -30,7 +30,7 @@ public static bool HasFilterFeature(this ISelection selection) /// The filter feature from the selection; /// otherwise, null. /// - public static FilterFeature? GetFilterFeature(this ISelection selection) + public static FilterFeature? GetFilterFeature(this Selection selection) { ArgumentNullException.ThrowIfNull(selection); diff --git a/src/HotChocolate/Data/src/Data/Filters/Extensions/HotChocolateDataQueryableExtensions.cs b/src/HotChocolate/Data/src/Data/Filters/Extensions/HotChocolateDataQueryableExtensions.cs index d48cdbd9598..7d7fb6188ab 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Extensions/HotChocolateDataQueryableExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Extensions/HotChocolateDataQueryableExtensions.cs @@ -1,5 +1,6 @@ using HotChocolate.Data.Filters; using HotChocolate.Data.Sorting; +using HotChocolate.Execution; using HotChocolate.Execution.Processing; // ReSharper disable once CheckNamespace @@ -7,7 +8,7 @@ namespace System.Linq; /// /// Provides extension methods to integrate -/// with and . +/// with and . /// public static class HotChocolateDataQueryableExtensions { @@ -27,13 +28,11 @@ public static class HotChocolateDataQueryableExtensions /// Returns a queryable that has the selection applied. /// /// - /// Throws if is null or if is null. + /// Throws if is null. /// - public static IQueryable Select(this IQueryable queryable, ISelection selection) + public static IQueryable Select(this IQueryable queryable, Selection selection) { - ArgumentNullException.ThrowIfNull(queryable); ArgumentNullException.ThrowIfNull(selection); - return queryable.Select(selection.AsSelector()); } @@ -53,13 +52,11 @@ public static IQueryable Select(this IQueryable queryable, ISelection s /// Returns a queryable that has the filter applied. /// /// - /// Throws if is null or if is null. + /// Throws if is null. /// public static IQueryable Where(this IQueryable queryable, IFilterContext filter) { - ArgumentNullException.ThrowIfNull(queryable); ArgumentNullException.ThrowIfNull(filter); - var predicate = filter.AsPredicate(); return predicate is null ? queryable : queryable.Where(predicate); } @@ -80,11 +77,10 @@ public static IQueryable Where(this IQueryable queryable, IFilterContex /// Returns a queryable that has the sorting applied. /// /// - /// Throws if is null or if is null. + /// Throws if is null. /// public static IQueryable Order(this IQueryable queryable, ISortingContext sorting) { - ArgumentNullException.ThrowIfNull(queryable); ArgumentNullException.ThrowIfNull(sorting); var sortDefinition = sorting.AsSortDefinition(); diff --git a/src/HotChocolate/Data/src/Data/HotChocolate.Data.csproj b/src/HotChocolate/Data/src/Data/HotChocolate.Data.csproj index f5f21fbc643..a8f0d569b50 100644 --- a/src/HotChocolate/Data/src/Data/HotChocolate.Data.csproj +++ b/src/HotChocolate/Data/src/Data/HotChocolate.Data.csproj @@ -12,6 +12,7 @@ + diff --git a/src/HotChocolate/Data/src/Data/PagingArgumentsParameterExpressionBuilder.cs b/src/HotChocolate/Data/src/Data/PagingArgumentsParameterExpressionBuilder.cs index 0bba80e0794..a9ad284273b 100644 --- a/src/HotChocolate/Data/src/Data/PagingArgumentsParameterExpressionBuilder.cs +++ b/src/HotChocolate/Data/src/Data/PagingArgumentsParameterExpressionBuilder.cs @@ -42,6 +42,6 @@ private static PagingArguments MapArguments(IResolverContext context) private static PagingArguments MapArguments(CursorPagingArguments arguments, bool includeTotalCount) => new(arguments.First, arguments.After, arguments.Last, arguments.Before, includeTotalCount); - private static bool IncludeTotalCount(ISelection selection) + private static bool IncludeTotalCount(Selection selection) => selection.Field.Features.Get()?.IncludeTotalCount is true; } diff --git a/src/HotChocolate/Data/src/Data/Projections/Context/ISelectedField.cs b/src/HotChocolate/Data/src/Data/Projections/Context/ISelectedField.cs index a2c98a8aa24..048cf55079b 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Context/ISelectedField.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Context/ISelectedField.cs @@ -6,7 +6,7 @@ namespace HotChocolate.Data.Projections.Context; /// /// Represents a field that is selected in a query in the context of an operation. /// -/// The difference between and is that +/// The difference between and is that /// is specific to the current request/operation and not cached. This /// makes it possible to recursively iterate through the selected fields by calling /// . @@ -35,7 +35,7 @@ public interface ISelectedField /// Gets the field selection for which a field resolver is /// being executed. /// - ISelection Selection { get; } + Selection Selection { get; } /// /// Gets the field on which the field resolver is being executed. diff --git a/src/HotChocolate/Data/src/Data/Projections/Context/SelectedField.cs b/src/HotChocolate/Data/src/Data/Projections/Context/SelectedField.cs index 3f47dc6b21a..825c0c0db55 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Context/SelectedField.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Context/SelectedField.cs @@ -1,3 +1,4 @@ +using HotChocolate.Execution; using HotChocolate.Execution.Processing; using HotChocolate.Resolvers; using HotChocolate.Types; @@ -13,14 +14,14 @@ public sealed class SelectedField : ISelectedField /// /// Creates a new instance of /// - internal SelectedField(IResolverContext resolverContext, ISelection selection) + internal SelectedField(IResolverContext resolverContext, Selection selection) { _resolverContext = resolverContext; Selection = selection; } /// - public ISelection Selection { get; } + public Selection Selection { get; } /// public IOutputFieldDefinition Field => Selection.Field; @@ -36,21 +37,21 @@ public IReadOnlyList GetFields( ObjectType? type = null, bool allowInternals = false) { - var fields = GetFieldSelections(type, allowInternals); + var selections = GetSelections(type, allowInternals); - if (fields is null) + if (selections is null) { return []; } - var finalFields = new SelectedField[fields.Count]; + var selectedFields = new List(); - for (var i = 0; i < fields.Count; i++) + foreach (var selection in selections) { - finalFields[i] = new SelectedField(_resolverContext, fields[i]); + selectedFields.Add(new SelectedField(_resolverContext, selection)); } - return finalFields; + return selectedFields; } /// @@ -59,16 +60,16 @@ public bool IsSelected( ObjectType? type = null, bool allowInternals = false) { - var fields = GetFieldSelections(type, allowInternals); + var selections = GetSelections(type, allowInternals); - if (fields is null) + if (selections is null) { return false; } - for (var i = 0; i < fields.Count; i++) + foreach (var selection in selections) { - if (fields[i].Field.Name == fieldName) + if (selection.Field.Name == fieldName) { return true; } @@ -77,13 +78,13 @@ public bool IsSelected( return false; } - private IReadOnlyList? GetFieldSelections( + private SelectionEnumerator? GetSelections( ObjectType? type = null, bool allowInternals = false) { var namedType = Field.Type.NamedType(); - if (Selection.SelectionSet is null) + if (Selection.IsLeaf) { return null; } diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/Extensions/ProjectionProviderDescriptorExtensions.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/Extensions/ProjectionProviderDescriptorExtensions.cs index 536e7fa6047..03dca1a4cf9 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/Extensions/ProjectionProviderDescriptorExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/Extensions/ProjectionProviderDescriptorExtensions.cs @@ -1,6 +1,7 @@ using HotChocolate.Data.Projections; using HotChocolate.Data.Projections.Expressions.Handlers; using HotChocolate.Data.Projections.Handlers; +using HotChocolate.Data.Projections.Optimizers; namespace HotChocolate.Data; diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor.cs index f20404790c6..5643a3e185a 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor.cs @@ -11,5 +11,5 @@ public interface IProjectionFieldInterceptor /// /// The selection to test for /// Returns true if the selection can be handled - bool CanHandle(ISelection selection); + bool CanHandle(Selection selection); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor`1.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor`1.cs index a83fe0cde84..607cf11369e 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor`1.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor`1.cs @@ -14,7 +14,7 @@ public interface IProjectionFieldInterceptor /// The current selection void BeforeProjection( TContext context, - ISelection selection); + Selection selection); /// /// This method is called after the enter and leave methods of a @@ -24,5 +24,5 @@ void BeforeProjection( /// The current selection void AfterProjection( TContext context, - ISelection selection); + Selection selection); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionInterceptorCombinator.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionInterceptorCombinator.cs index 2fbac715201..72064262abc 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionInterceptorCombinator.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionInterceptorCombinator.cs @@ -20,11 +20,11 @@ public ProjectionInterceptorCombinator( _next = next; } - public bool CanHandle(ISelection selection) => true; + public bool CanHandle(Selection selection) => true; public void BeforeProjection( T context, - ISelection selection) + Selection selection) { if (_current is IProjectionFieldInterceptor currentHandler) { @@ -37,7 +37,7 @@ public void BeforeProjection( } } - public void AfterProjection(T context, ISelection selection) + public void AfterProjection(T context, Selection selection) { if (_next is IProjectionFieldInterceptor nextHandler) { diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs index f74cea5be9d..0ea678db3a1 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs @@ -154,9 +154,8 @@ public Selection RewriteSelection( } } - return ProjectionSelection.From( - selection, - fieldHandler); + selection.Features.SetSafe(fieldHandler); + return selection; } } diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelection.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelection.cs deleted file mode 100644 index de4997ce000..00000000000 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelection.cs +++ /dev/null @@ -1,23 +0,0 @@ -using HotChocolate.Execution.Processing; - -namespace HotChocolate.Data.Projections; - -public class ProjectionSelection - : Selection - , IProjectionSelection -{ - public ProjectionSelection( - IProjectionFieldHandler handler, - Selection selection) - : base(selection) - { - Handler = handler; - } - - public IProjectionFieldHandler Handler { get; } - - public static ProjectionSelection From( - Selection selection, - IProjectionFieldHandler handler) => - new(handler, selection); -} diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelectionExtensions.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelectionExtensions.cs new file mode 100644 index 00000000000..fc66246730e --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelectionExtensions.cs @@ -0,0 +1,12 @@ +using HotChocolate.Execution.Processing; +using HotChocolate.Features; + +namespace HotChocolate.Data.Projections; + +public static class ProjectionSelectionExtensions +{ + extension(Selection selection) + { + public IProjectionFieldHandler? ProjectionHandler { get => selection.Features.Get(); } + } +} diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/ProjectionFieldHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/ProjectionFieldHandler.cs index c9fb8e6c66c..967b3dfeacc 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/ProjectionFieldHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/ProjectionFieldHandler.cs @@ -4,7 +4,7 @@ namespace HotChocolate.Data.Projections.Expressions.Handlers; /// -/// A handler that can intersect a and optimize the selection set for +/// A handler that can intersect a and optimize the selection set for /// projections. /// public abstract class ProjectionFieldHandler @@ -23,35 +23,35 @@ public virtual IProjectionFieldHandler Wrap(IProjectionFieldInterceptor intercep } /// - public abstract bool CanHandle(ISelection selection); + public abstract bool CanHandle(Selection selection); /// - public virtual T OnBeforeEnter(T context, ISelection selection) => context; + public virtual T OnBeforeEnter(T context, Selection selection) => context; /// public abstract bool TryHandleEnter( T context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action); /// public virtual T OnAfterEnter( T context, - ISelection selection, + Selection selection, ISelectionVisitorAction action) => context; /// - public virtual T OnBeforeLeave(T context, ISelection selection) => context; + public virtual T OnBeforeLeave(T context, Selection selection) => context; /// public abstract bool TryHandleLeave( T context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action); /// public virtual T OnAfterLeave( T context, - ISelection selection, + Selection selection, ISelectionVisitorAction action) => context; } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/ProjectionFieldWrapper.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/ProjectionFieldWrapper.cs index af0626e2e02..62bde2f0f59 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/ProjectionFieldWrapper.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/ProjectionFieldWrapper.cs @@ -19,33 +19,33 @@ public ProjectionFieldWrapper( _interceptor = interceptor; } - public bool CanHandle(ISelection selection) => + public bool CanHandle(Selection selection) => _handler.CanHandle(selection); public IProjectionFieldHandler Wrap(IProjectionFieldInterceptor interceptor) => _handler.Wrap(new ProjectionInterceptorCombinator(_interceptor, interceptor)); - public T OnBeforeEnter(T context, ISelection selection) => + public T OnBeforeEnter(T context, Selection selection) => _handler.OnBeforeEnter(context, selection); public bool TryHandleEnter( T context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { _interceptor.BeforeProjection(context, selection); return _handler.TryHandleEnter(context, selection, out action); } - public T OnAfterEnter(T context, ISelection selection, ISelectionVisitorAction result) => + public T OnAfterEnter(T context, Selection selection, ISelectionVisitorAction result) => _handler.OnAfterEnter(context, selection, result); - public T OnBeforeLeave(T context, ISelection selection) => + public T OnBeforeLeave(T context, Selection selection) => _handler.OnBeforeLeave(context, selection); public bool TryHandleLeave( T context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { _handler.TryHandleLeave(context, selection, out action); @@ -53,6 +53,6 @@ public bool TryHandleLeave( return action is not null; } - public T OnAfterLeave(T context, ISelection selection, ISelectionVisitorAction result) => + public T OnAfterLeave(T context, Selection selection, ISelectionVisitorAction result) => _handler.OnAfterLeave(context, selection, result); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs index 4851a43e156..dc13c5b0c68 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs @@ -9,13 +9,13 @@ namespace HotChocolate.Data.Projections.Expressions.Handlers; public class QueryableProjectionFieldHandler : QueryableProjectionHandlerBase { - public override bool CanHandle(ISelection selection) => + public override bool CanHandle(Selection selection) => selection.Field.Member is { } && selection.SelectionSet is not null; public override bool TryHandleEnter( QueryableProjectionContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { var field = selection.Field; @@ -48,7 +48,7 @@ public override bool TryHandleEnter( public override bool TryHandleLeave( QueryableProjectionContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { var field = selection.Field; diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionHandlerBase.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionHandlerBase.cs index 2b45b6b5c1d..44937250621 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionHandlerBase.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionHandlerBase.cs @@ -8,7 +8,7 @@ public abstract class QueryableProjectionHandlerBase { public override bool TryHandleEnter( QueryableProjectionContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { action = SelectionVisitor.Continue; @@ -17,7 +17,7 @@ public override bool TryHandleEnter( public override bool TryHandleLeave( QueryableProjectionContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { action = SelectionVisitor.Continue; diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionListHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionListHandler.cs index b2bd688a0b9..9466a674a2c 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionListHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionListHandler.cs @@ -9,13 +9,13 @@ namespace HotChocolate.Data.Projections.Expressions.Handlers; public class QueryableProjectionListHandler : QueryableProjectionHandlerBase { - public override bool CanHandle(ISelection selection) => + public override bool CanHandle(Selection selection) => selection.Field.Member is { } && (selection.IsList || selection.IsMemberIsList()); public override QueryableProjectionContext OnBeforeEnter( QueryableProjectionContext context, - ISelection selection) + Selection selection) { var field = selection.Field; if (field.Member is PropertyInfo { CanWrite: true }) @@ -30,7 +30,7 @@ public override QueryableProjectionContext OnBeforeEnter( public override bool TryHandleEnter( QueryableProjectionContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { var field = selection.Field; @@ -58,7 +58,7 @@ public override bool TryHandleEnter( public override bool TryHandleLeave( QueryableProjectionContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { var field = selection.Field; diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs index 7d5be358f91..594df9df6c3 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs @@ -8,13 +8,13 @@ namespace HotChocolate.Data.Projections.Expressions.Handlers; public class QueryableProjectionScalarHandler : QueryableProjectionHandlerBase { - public override bool CanHandle(ISelection selection) => + public override bool CanHandle(Selection selection) => selection.Field.Member is { } && selection.SelectionSet is null; public override bool TryHandleEnter( QueryableProjectionContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { if (selection.Field.Member is PropertyInfo { CanWrite: true }) @@ -29,7 +29,7 @@ public override bool TryHandleEnter( public override bool TryHandleLeave( QueryableProjectionContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { var field = selection.Field; diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFilterInterceptor.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFilterInterceptor.cs index 3fba65b481a..ce707b212db 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFilterInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableFilterInterceptor.cs @@ -14,21 +14,20 @@ namespace HotChocolate.Data.Projections.Handlers; public class QueryableFilterInterceptor : IProjectionFieldInterceptor { - public bool CanHandle(ISelection selection) => + public bool CanHandle(Selection selection) => selection.Field.Member is PropertyInfo propertyInfo && propertyInfo.CanWrite && selection.HasFilterFeature(); public void BeforeProjection( QueryableProjectionContext context, - ISelection selection) + Selection selection) { - var field = selection.Field; var filterFeature = selection.GetFilterFeature(); if (filterFeature is not null - && context.Selection.Count > 0 - && context.Selection.Peek().Arguments.TryCoerceArguments(context.ResolverContext, out var coercedArgs) + && context.Selections.Count > 0 + && context.Selections.Peek().Arguments.TryCoerceArguments(context.ResolverContext, out var coercedArgs) && coercedArgs.TryGetValue(filterFeature.ArgumentName, out var argumentValue) && argumentValue.Type is IFilterInputType filterInputType && argumentValue.ValueLiteral is { } valueNode and not NullValueNode) @@ -64,7 +63,7 @@ public void BeforeProjection( } } - public void AfterProjection(QueryableProjectionContext context, ISelection selection) + public void AfterProjection(QueryableProjectionContext context, Selection selection) { } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs index 3898b8ac62a..2953c81bf7a 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs @@ -4,7 +4,7 @@ using HotChocolate.Data.Projections.Expressions.Handlers; using HotChocolate.Data.Sorting; using HotChocolate.Data.Sorting.Expressions; -using HotChocolate.Execution.Internal; +using HotChocolate.Execution; using HotChocolate.Execution.Processing; using HotChocolate.Language; using HotChocolate.Types; @@ -15,20 +15,20 @@ namespace HotChocolate.Data.Projections.Handlers; public class QueryableSortInterceptor : IProjectionFieldInterceptor { - public bool CanHandle(ISelection selection) => - selection.Field.Member is PropertyInfo propertyInfo - && propertyInfo.CanWrite - && selection.HasSortingFeature(); + public bool CanHandle(Selection selection) + => selection.Field.Member is PropertyInfo propertyInfo + && propertyInfo.CanWrite + && selection.HasSortingFeature; public void BeforeProjection( QueryableProjectionContext context, - ISelection selection) + Selection selection) { var field = selection.Field; if (field.Features.TryGet(out SortingFeature? feature) - && context.Selection.Count > 0 - && context.Selection.Peek().Arguments.TryCoerceArguments(context.ResolverContext, out var coercedArgs) + && context.Selections.Count > 0 + && context.Selections.Peek().Arguments.TryCoerceArguments(context.ResolverContext, out var coercedArgs) && coercedArgs.TryGetValue(feature.ArgumentName, out var argumentValue) && argumentValue.Type is ListType lt && lt.ElementType is NonNullType nn @@ -51,7 +51,7 @@ public void BeforeProjection( } } - public void AfterProjection(QueryableProjectionContext context, ISelection selection) + public void AfterProjection(QueryableProjectionContext context, Selection selection) { } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableTakeHandlerInterceptor.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableTakeHandlerInterceptor.cs index 540f0d2da23..5b50413b9fa 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableTakeHandlerInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableTakeHandlerInterceptor.cs @@ -20,13 +20,13 @@ protected QueryableTakeHandlerInterceptor(SelectionFlags selectionFlags, int tak _take = take; } - public bool CanHandle(ISelection selection) => + public bool CanHandle(Selection selection) => selection.Field.Member is PropertyInfo { CanWrite: true } && selection.IsSelectionFlags(_selectionFlags); public void BeforeProjection( QueryableProjectionContext context, - ISelection selection) + Selection selection) { if (selection.IsSelectionFlags(_selectionFlags)) { @@ -42,7 +42,7 @@ public void BeforeProjection( public void AfterProjection( QueryableProjectionContext context, - ISelection selection) + Selection selection) { } } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs index 59bfd237377..286acd8f250 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs @@ -8,7 +8,7 @@ namespace HotChocolate.Data.Projections.Handlers; public sealed class QueryableFilterProjectionOptimizer : IProjectionOptimizer { - public bool CanHandle(ISelection field) + public bool CanHandle(Selection field) => field.Field.Member is { } && field.HasFilterFeature(); public Selection RewriteSelection( diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs index d75c48d9c51..7b4ef8f5ef2 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs @@ -9,7 +9,7 @@ namespace HotChocolate.Data.Projections.Handlers; public sealed class QueryablePagingProjectionOptimizer : IProjectionOptimizer { - public bool CanHandle(ISelection field) => + public bool CanHandle(Selection field) => field.DeclaringType is IPageType && field.Field.Name is "edges" or "items" or "nodes"; @@ -19,12 +19,12 @@ public Selection RewriteSelection( { // The selection optimizer will also process the field we just added // we have to avoid processing this field twice. - if (context.Selections.ContainsKey(CombinedEdgeField)) + if (context.ContainsResponseName(CombinedEdgeField)) { return selection; } - if (context.Type.NamedType() is not IPageType pageType) + if (context.TypeContext is not IPageType pageType) { throw ThrowHelper.PagingProjectionOptimizer_NotAPagingField( selection.DeclaringType, @@ -48,7 +48,7 @@ public Selection RewriteSelection( private Selection CreateCombinedSelection( SelectionSetOptimizerContext context, - ISelection selection, + Selection selection, ObjectType declaringType, IPageType pageType, IReadOnlyList selections) @@ -110,20 +110,22 @@ private static void CollectSelectionOfEdges( SelectionSetOptimizerContext context, List selections) { - if (context.Selections.Values.FirstOrDefault( - x => x.Field.Name == "edges") is { } edgeSelection) + if (context.Selections.FirstOrDefault(t => t.Field.Name == "edges") is { } edgeSelection) { - foreach (var edgeSubField in edgeSelection.SelectionSet!.Selections) + foreach (var fieldNode in edgeSelection.SyntaxNodes) { - if (edgeSubField is FieldNode edgeSubFieldNode - && edgeSubFieldNode.Name.Value is "node" - && edgeSubFieldNode.SelectionSet?.Selections is not null) + foreach (var edgeSubField in fieldNode.Node.SelectionSet!.Selections) { - foreach (var nodeField in edgeSubFieldNode.SelectionSet.Selections) + if (edgeSubField is FieldNode edgeSubFieldNode + && edgeSubFieldNode.Name.Value is "node" + && edgeSubFieldNode.SelectionSet?.Selections is not null) { - selections.Add( - s_cloneSelectionSetRewriter.Rewrite(nodeField) ?? + foreach (var nodeField in edgeSubFieldNode.SelectionSet.Selections) + { + selections.Add( + s_cloneSelectionSetRewriter.Rewrite(nodeField) ?? throw new SyntaxNodeCannotBeNullException(nodeField)); + } } } } @@ -134,14 +136,16 @@ private static void CollectSelectionOfItems( SelectionSetOptimizerContext context, List selections) { - if (context.Selections.Values - .FirstOrDefault(x => x.Field.Name == "items") is { } itemSelection) + if (context.Selections.FirstOrDefault(x => x.Field.Name == "items") is { } itemSelection) { - foreach (var nodeField in itemSelection.SelectionSet!.Selections) + foreach (var fieldNode in itemSelection.SyntaxNodes) { - selections.Add( - s_cloneSelectionSetRewriter.Rewrite(nodeField) ?? + foreach (var nodeField in fieldNode.Node.SelectionSet!.Selections) + { + selections.Add( + s_cloneSelectionSetRewriter.Rewrite(nodeField) ?? throw new SyntaxNodeCannotBeNullException(nodeField)); + } } } } @@ -150,13 +154,16 @@ private static void CollectSelectionOfNodes( SelectionSetOptimizerContext context, List selections) { - if (context.Selections.Values.FirstOrDefault(x => x.Field.Name == "nodes") is { } nodeSelection) + if (context.Selections.FirstOrDefault(x => x.Field.Name == "nodes") is { } nodeSelection) { - foreach (var nodeField in nodeSelection.SelectionSet!.Selections) + foreach (var fieldNode in nodeSelection.SyntaxNodes) { - selections.Add( - s_cloneSelectionSetRewriter.Rewrite(nodeField) ?? + foreach (var nodeField in fieldNode.Node.SelectionSet!.Selections) + { + selections.Add( + s_cloneSelectionSetRewriter.Rewrite(nodeField) ?? throw new SyntaxNodeCannotBeNullException(nodeField)); + } } } } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableSortProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableSortProjectionOptimizer.cs index c242f3373cb..d8e2e96e6a1 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableSortProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableSortProjectionOptimizer.cs @@ -7,8 +7,8 @@ namespace HotChocolate.Data.Projections.Handlers; public sealed class QueryableSortProjectionOptimizer : IProjectionOptimizer { - public bool CanHandle(ISelection field) - => field.Field.Member is { } && field.HasSortingFeature(); + public bool CanHandle(Selection field) + => field.Field.Member is { } && field.HasSortingFeature; public Selection RewriteSelection( SelectionSetOptimizerContext context, @@ -16,7 +16,7 @@ public Selection RewriteSelection( { var resolverPipeline = selection.ResolverPipeline ?? - context.CompileResolverPipeline(selection.Field, selection.SyntaxNode); + context.CompileResolverPipeline(selection.Field, selection.SyntaxNodes[0].Node); static FieldDelegate WrappedPipeline(FieldDelegate next) => ctx => diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/QueryableProjectionContext.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/QueryableProjectionContext.cs index 4d09ce1d3c8..a700222c976 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/QueryableProjectionContext.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/QueryableProjectionContext.cs @@ -4,15 +4,17 @@ namespace HotChocolate.Data.Projections.Expressions; -public class QueryableProjectionContext( - IResolverContext context, - IOutputType initialType, - Type runtimeType, - bool inMemory) - : ProjectionVisitorContext( - context, - initialType, - new QueryableProjectionScope(runtimeType, "_s1")) +public class QueryableProjectionContext : ProjectionVisitorContext { - public bool InMemory { get; } = inMemory; + public QueryableProjectionContext( + IResolverContext context, + IOutputType initialType, + Type runtimeType, + bool inMemory) + : base(context, initialType, new QueryableProjectionScope(runtimeType, "_s1")) + { + InMemory = inMemory; + } + + public bool InMemory { get; } } diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/QueryableProjectionVisitor.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/QueryableProjectionVisitor.cs index a2a9adce4e8..5db151a404d 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/QueryableProjectionVisitor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/QueryableProjectionVisitor.cs @@ -10,7 +10,7 @@ public class QueryableProjectionVisitor : ProjectionVisitor(IProjectionConvention convention) => new ProjectionQueryBuilder(convention.CreateBuilder()); - private static Selection UnwrapMutationPayloadSelection(ISelectionSet selectionSet, ObjectField field) + private static Selection UnwrapMutationPayloadSelection(SelectionSet selectionSet, ObjectField field) { - ref var selection = ref Unsafe.As(selectionSet).GetSelectionsReference(); - ref var end = ref Unsafe.Add(ref selection, selectionSet.Selections.Count); - - while (Unsafe.IsAddressLessThan(ref selection, ref end)) + foreach (var selection in selectionSet.Selections) { if (ReferenceEquals(selection.Field, field)) { return selection; } - - selection = ref Unsafe.Add(ref selection, 1)!; } throw new InvalidOperationException( @@ -226,12 +220,12 @@ public void Prepare(IMiddlewareContext context) && objectType.RuntimeType != typeof(object)) { var fieldProxy = new ObjectField(context.Selection.Field, objectType); - var selection = CreateProxySelection(context.Selection, fieldProxy); + var selection = context.Selection.WithField(fieldProxy); context = new MiddlewareContextProxy(context, selection, objectType); } //for use case when projection is used with Mutation Conventions - else if (context.Operation.Type is OperationType.Mutation + else if (context.Operation.Kind is OperationType.Mutation && context.Selection.Type.NamedType() is ObjectType mutationPayloadType && mutationPayloadType.Features.TryGet(out MutationPayloadInfo? mutationInfo)) { @@ -254,7 +248,7 @@ public void Apply(IMiddlewareContext context) private sealed class MiddlewareContextProxy( IMiddlewareContext context, - ISelection selection, + Selection selection, ObjectType objectType) : IMiddlewareContext { @@ -266,16 +260,18 @@ private sealed class MiddlewareContextProxy( public ObjectType ObjectType { get; } = objectType; - public IOperation Operation => _context.Operation; + public Operation Operation => _context.Operation; public IOperationResultBuilder OperationResult => _context.OperationResult; - public ISelection Selection { get; } = selection; + public Selection Selection { get; } = selection; public IVariableValueCollection Variables => _context.Variables; public Path Path => _context.Path; + public ulong IncludeFlags => _context.IncludeFlags; + public IServiceProvider RequestServices => _context.RequestServices; public string ResponseName => _context.ResponseName; @@ -336,9 +332,9 @@ public TValueNode ArgumentLiteral(string name) where TValueNode : IV public void ReportError(Exception exception, Action? configure = null) => _context.ReportError(exception, configure); - public IReadOnlyList GetSelections( + public SelectionEnumerator GetSelections( ObjectType typeContext, - ISelection? selection = null, + Selection? selection = null, bool allowInternals = false) => _context.GetSelections(typeContext, selection, allowInternals); @@ -372,27 +368,4 @@ public ArgumentValue ReplaceArgument(string argumentName, ArgumentValue newArgum IResolverContext IResolverContext.Clone() => _context.Clone(); } - - private static Selection.Sealed CreateProxySelection(ISelection selection, ObjectField field) - { - var includeConditionsSource = ((Selection)selection).IncludeConditions; - var includeConditions = new long[includeConditionsSource.Length]; - includeConditionsSource.CopyTo(includeConditions); - - var proxy = new Selection.Sealed(selection.Id, - selection.DeclaringType, - field, - field.Type, - selection.SyntaxNode, - selection.ResponseName, - selection.Arguments, - includeConditions, - selection.IsInternal, - selection.Strategy != SelectionExecutionStrategy.Serial, - selection.ResolverPipeline, - selection.PureResolver); - proxy.SetSelectionSetId(((Selection)selection).SelectionSetId); - proxy.Seal(selection.DeclaringOperation, selection.DeclaringSelectionSet); - return proxy; - } } diff --git a/src/HotChocolate/Data/src/Data/Projections/Extensions/SelectionFlagsExtensions.cs b/src/HotChocolate/Data/src/Data/Projections/Extensions/SelectionFlagsExtensions.cs index 9869506075d..2a3d70a5010 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Extensions/SelectionFlagsExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Extensions/SelectionFlagsExtensions.cs @@ -15,10 +15,8 @@ public static class SelectionFlagsExtensions /// The selection. /// /// true if the field has a first or default middleware; otherwise, false. - public static bool IsFirstOrDefault(this ISelection selection) + public static bool IsFirstOrDefault(this Selection selection) { - ArgumentNullException.ThrowIfNull(selection); - var flags = selection.Field.Features.Get() ?? SelectionFlags.None; return (flags & SelectionFlags.FirstOrDefault) == SelectionFlags.FirstOrDefault; } @@ -29,10 +27,8 @@ public static bool IsFirstOrDefault(this ISelection selection) /// The selection. /// /// true if the field has a single or default middleware; otherwise, false. - public static bool IsSingleOrDefault(this ISelection selection) + public static bool IsSingleOrDefault(this Selection selection) { - ArgumentNullException.ThrowIfNull(selection); - var flags = selection.Field.Features.Get() ?? SelectionFlags.None; return (flags & SelectionFlags.SingleOrDefault) == SelectionFlags.SingleOrDefault; } @@ -43,10 +39,8 @@ public static bool IsSingleOrDefault(this ISelection selection) /// The selection. /// /// true if the field is a list; otherwise, false. - public static bool IsMemberIsList(this ISelection selection) + public static bool IsMemberIsList(this Selection selection) { - ArgumentNullException.ThrowIfNull(selection); - var flags = selection.Field.Features.Get() ?? SelectionFlags.None; return (flags & SelectionFlags.MemberIsList) == SelectionFlags.MemberIsList; } @@ -58,10 +52,8 @@ public static bool IsMemberIsList(this ISelection selection) /// The flags. /// /// true if the specified are set on the field; otherwise, false. - public static bool IsSelectionFlags(this ISelection selection, SelectionFlags flags) + public static bool IsSelectionFlags(this Selection selection, SelectionFlags flags) { - ArgumentNullException.ThrowIfNull(selection); - var actualFlags = selection.Field.Features.Get() ?? SelectionFlags.None; return (actualFlags & flags) == flags; } diff --git a/src/HotChocolate/Data/src/Data/Projections/IProjectionSelection.cs b/src/HotChocolate/Data/src/Data/Projections/IProjectionSelection.cs deleted file mode 100644 index f1201812a9e..00000000000 --- a/src/HotChocolate/Data/src/Data/Projections/IProjectionSelection.cs +++ /dev/null @@ -1,8 +0,0 @@ -using HotChocolate.Execution.Processing; - -namespace HotChocolate.Data.Projections; - -public interface IProjectionSelection : ISelection -{ - IProjectionFieldHandler Handler { get; } -} diff --git a/src/HotChocolate/Data/src/Data/Projections/ISelectionVisitorContext.cs b/src/HotChocolate/Data/src/Data/Projections/ISelectionVisitorContext.cs index a9f81f88691..3986a83d9a6 100644 --- a/src/HotChocolate/Data/src/Data/Projections/ISelectionVisitorContext.cs +++ b/src/HotChocolate/Data/src/Data/Projections/ISelectionVisitorContext.cs @@ -6,9 +6,18 @@ namespace HotChocolate.Data.Projections; public interface ISelectionVisitorContext { - Stack Selection { get; } + ulong IncludeFlags => ResolverContext.IncludeFlags; - Stack ResolvedType { get; } + Operation Operation => ResolverContext.Operation; + + Stack Selections { get; } + + Stack ResolvedTypes { get; } IResolverContext ResolverContext { get; } + + SelectionEnumerator GetSelections( + ObjectType typeContext, + Selection? selection = null, + bool allowInternals = false); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs index c89ef8cbfe2..36a108fe8a9 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Optimizers/IsProjectedProjectionOptimizer.cs @@ -1,7 +1,7 @@ using HotChocolate.Execution.Processing; using HotChocolate.Language; -namespace HotChocolate.Data.Projections.Handlers; +namespace HotChocolate.Data.Projections.Optimizers; public class IsProjectedProjectionOptimizer : IProjectionOptimizer { @@ -13,8 +13,7 @@ public Selection RewriteSelection( SelectionSetOptimizerContext context, Selection selection) { - if (context.Type is not { } type - || !type.Features.TryGet(out ProjectionTypeFeature? feature)) + if (!context.TypeContext.Features.TryGet(out ProjectionTypeFeature? feature)) { return selection; } @@ -22,41 +21,39 @@ public Selection RewriteSelection( for (var i = 0; i < feature.AlwaysProjectedFields.Length; i++) { var alias = "__projection_alias_" + i; - var alwaysProjectedField = feature.AlwaysProjectedFields[i]; + var fieldName = feature.AlwaysProjectedFields[i]; // if the field is already in the selection set we do not need to project it - if (context.Selections.TryGetValue(alwaysProjectedField, out var field) - && field.Field.Name == alwaysProjectedField) + if (context.TryGetSelection(fieldName, out var otherSelection) + && otherSelection.Field.Name == fieldName) { continue; } // if the field is already added as an alias we do not need to add it - if (context.Selections.TryGetValue(alias, out field) - && field.Field.Name == alwaysProjectedField) + if (context.TryGetSelection(alias, out otherSelection) + && otherSelection.Field.Name == fieldName) { continue; } - var nodesField = type.Fields[alwaysProjectedField]; - var nodesFieldNode = new FieldNode( + var field = context.TypeContext.Fields[fieldName]; + var fieldNode = new FieldNode( null, - new NameNode(alwaysProjectedField), + new NameNode(fieldName), new NameNode(alias), [], [], null); - var nodesPipeline = context.CompileResolverPipeline(nodesField, nodesFieldNode); + var nodesPipeline = context.CompileResolverPipeline(field, fieldNode); - var compiledSelection = new Selection.Sealed( + var compiledSelection = new Selection( context.NewSelectionId(), - context.Type, - nodesField, - nodesField.Type, - nodesFieldNode, alias, - arguments: selection.Arguments, + field, + [new FieldSelectionNode(fieldNode, 0)], + [], isInternal: true, resolverPipeline: nodesPipeline); diff --git a/src/HotChocolate/Data/src/Data/Projections/Optimizers/NodeSelectionSetOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Optimizers/NodeSelectionSetOptimizer.cs index 75be2f45836..a386eb80d27 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Optimizers/NodeSelectionSetOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Optimizers/NodeSelectionSetOptimizer.cs @@ -1,13 +1,13 @@ using HotChocolate.Execution.Processing; using HotChocolate.Types.Relay; -namespace HotChocolate.Data.Projections; +namespace HotChocolate.Data.Projections.Optimizers; internal sealed class NodeSelectionSetOptimizer(ISelectionSetOptimizer optimizer) : ISelectionSetOptimizer { public void OptimizeSelectionSet(SelectionSetOptimizerContext context) { - if (context.Type.Features.TryGet(out var feature) + if (context.TypeContext.Features.TryGet(out var feature) && feature.NodeResolver is { } nodeResolverInfo && nodeResolverInfo.QueryField?.HasProjectionMiddleware() == true) { diff --git a/src/HotChocolate/Data/src/Data/Projections/ProjectionFeature.cs b/src/HotChocolate/Data/src/Data/Projections/ProjectionFeature.cs index 27a92191716..baa0ce03083 100644 --- a/src/HotChocolate/Data/src/Data/Projections/ProjectionFeature.cs +++ b/src/HotChocolate/Data/src/Data/Projections/ProjectionFeature.cs @@ -1,10 +1,5 @@ -using System.Collections.Immutable; - namespace HotChocolate.Data.Projections; public record ProjectionFeature( bool AlwaysProjected = false, bool HasProjectionMiddleware = false); - -public record ProjectionTypeFeature( - ImmutableArray AlwaysProjectedFields); diff --git a/src/HotChocolate/Data/src/Data/Projections/ProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/ProjectionOptimizer.cs index 2030c3d416a..6e6d1fe04bd 100644 --- a/src/HotChocolate/Data/src/Data/Projections/ProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/ProjectionOptimizer.cs @@ -8,16 +8,16 @@ internal sealed class ProjectionOptimizer(IProjectionProvider provider) public void OptimizeSelectionSet(SelectionSetOptimizerContext context) { var processedSelections = new HashSet(); - while (!processedSelections.SetEquals(context.Selections.Keys)) + while (!processedSelections.SetEquals(context.Selections.Select(t => t.ResponseName))) { - var selectionToProcess = new HashSet(context.Selections.Keys); + var selectionToProcess = new HashSet(context.Selections.Select(t => t.ResponseName)); selectionToProcess.ExceptWith(processedSelections); foreach (var responseName in selectionToProcess) { var rewrittenSelection = provider.RewriteSelection( context, - context.Selections[responseName]); + context.GetSelection(responseName)); context.ReplaceSelection(rewrittenSelection); diff --git a/src/HotChocolate/Data/src/Data/Projections/ProjectionTypeFeature.cs b/src/HotChocolate/Data/src/Data/Projections/ProjectionTypeFeature.cs new file mode 100644 index 00000000000..4e2b61e1c7e --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Projections/ProjectionTypeFeature.cs @@ -0,0 +1,6 @@ +using System.Collections.Immutable; + +namespace HotChocolate.Data.Projections; + +public record ProjectionTypeFeature( + ImmutableArray AlwaysProjectedFields); diff --git a/src/HotChocolate/Data/src/Data/Projections/ProjectionTypeInterceptor.cs b/src/HotChocolate/Data/src/Data/Projections/ProjectionTypeInterceptor.cs index 1724e17488b..0136708102a 100644 --- a/src/HotChocolate/Data/src/Data/Projections/ProjectionTypeInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/ProjectionTypeInterceptor.cs @@ -1,4 +1,5 @@ using HotChocolate.Configuration; +using HotChocolate.Data.Projections.Optimizers; using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Types; diff --git a/src/HotChocolate/Data/src/Data/Projections/ProjectionVisitor.cs b/src/HotChocolate/Data/src/Data/Projections/ProjectionVisitor.cs index c50346ddd28..c10436726a2 100644 --- a/src/HotChocolate/Data/src/Data/Projections/ProjectionVisitor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/ProjectionVisitor.cs @@ -14,16 +14,15 @@ public virtual void Visit(TContext context) Visit(context, context.ResolverContext.Selection); } - public virtual void Visit(TContext context, ISelection selection) + public virtual void Visit(TContext context, Selection selection) { - context.Selection.Push(selection); + context.Selections.Push(selection); Visit(selection.Field, context); } - protected override TContext OnBeforeLeave(ISelection selection, TContext localContext) + protected override TContext OnBeforeLeave(Selection selection, TContext localContext) { - if (selection is IProjectionSelection projectionSelection - && projectionSelection.Handler is IProjectionFieldHandler handler) + if (selection.ProjectionHandler is IProjectionFieldHandler handler) { return handler.OnBeforeLeave(localContext, selection); } @@ -32,12 +31,11 @@ protected override TContext OnBeforeLeave(ISelection selection, TContext localCo } protected override TContext OnAfterLeave( - ISelection selection, + Selection selection, TContext localContext, ISelectionVisitorAction result) { - if (selection is IProjectionSelection projectionSelection - && projectionSelection.Handler is IProjectionFieldHandler handler) + if (selection.ProjectionHandler is IProjectionFieldHandler handler) { return handler.OnAfterLeave(localContext, selection, result); } @@ -46,12 +44,11 @@ protected override TContext OnAfterLeave( } protected override TContext OnAfterEnter( - ISelection selection, + Selection selection, TContext localContext, ISelectionVisitorAction result) { - if (selection is IProjectionSelection projectionSelection - && projectionSelection.Handler is IProjectionFieldHandler handler) + if (selection.ProjectionHandler is IProjectionFieldHandler handler) { return handler.OnAfterEnter(localContext, selection, result); } @@ -59,10 +56,9 @@ protected override TContext OnAfterEnter( return localContext; } - protected override TContext OnBeforeEnter(ISelection selection, TContext context) + protected override TContext OnBeforeEnter(Selection selection, TContext context) { - if (selection is IProjectionSelection projectionSelection - && projectionSelection.Handler is IProjectionFieldHandler handler) + if (selection.ProjectionHandler is IProjectionFieldHandler handler) { return handler.OnBeforeEnter(context, selection); } @@ -71,17 +67,13 @@ protected override TContext OnBeforeEnter(ISelection selection, TContext context } protected override ISelectionVisitorAction Enter( - ISelection selection, + Selection selection, TContext context) { base.Enter(selection, context); - if (selection is IProjectionSelection projectionSelection - && projectionSelection.Handler is IProjectionFieldHandler handler - && handler.TryHandleEnter( - context, - selection, - out var handlerResult)) + if (selection.ProjectionHandler is IProjectionFieldHandler handler + && handler.TryHandleEnter(context, selection, out var handlerResult)) { return handlerResult; } @@ -90,17 +82,13 @@ protected override ISelectionVisitorAction Enter( } protected override ISelectionVisitorAction Leave( - ISelection selection, + Selection selection, TContext context) { base.Leave(selection, context); - if (selection is IProjectionSelection projectionSelection - && projectionSelection.Handler is IProjectionFieldHandler handler - && handler.TryHandleLeave( - context, - selection, - out var handlerResult)) + if (selection.ProjectionHandler is IProjectionFieldHandler handler + && handler.TryHandleLeave(context, selection, out var handlerResult)) { return handlerResult; } @@ -108,7 +96,7 @@ protected override ISelectionVisitorAction Leave( return SkipAndLeave; } - protected override ISelectionVisitorAction Visit(ISelection selection, TContext context) + protected override ISelectionVisitorAction Visit(Selection selection, TContext context) { if (selection.Field.IsNotProjected()) { @@ -120,21 +108,29 @@ protected override ISelectionVisitorAction Visit(ISelection selection, TContext protected override ISelectionVisitorAction Visit(IOutputFieldDefinition field, TContext context) { - if (context.Selection.Count > 1 && field.IsNotProjected()) + if (context.Selections.Count > 1 && field.IsNotProjected()) { return Skip; } if (field.Type.NamedType() is IPageType and ObjectType pageType - && context.Selection.Peek() is { } pagingFieldSelection) + && context.Selections.Peek() is { } pagingFieldSelection) { - var selections = context.ResolverContext.GetSelections(pageType, pagingFieldSelection, true); + var includeFlags = context.IncludeFlags; + var selections = context.Operation.GetSelectionSet(pagingFieldSelection, pageType).Selections; - for (var index = selections.Count - 1; index >= 0; index--) + for (var i = selections.Length - 1; i >= 0; i--) { - if (selections[index] is { ResponseName: CombinedEdgeField } selection) + var selection = selections[i]; + + if (selection.IsSkipped(includeFlags)) + { + continue; + } + + if (selection is { ResponseName: CombinedEdgeField }) { - context.Selection.Push(selection); + context.Selections.Push(selection); return base.Visit(selection.Field, context); } diff --git a/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor.cs b/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor.cs index b851405ab16..3b8520b7461 100644 --- a/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor.cs @@ -1,12 +1,12 @@ namespace HotChocolate.Data.Projections; -public class SelectionVisitor +public abstract class SelectionVisitor { /// /// The visitor default action. /// /// - protected virtual ISelectionVisitorAction DefaultAction => Continue; + protected ISelectionVisitorAction DefaultAction => Continue; /// /// Ends traversing the graph. diff --git a/src/HotChocolate/Data/src/Data/Projections/SelectionVisitorContext.cs b/src/HotChocolate/Data/src/Data/Projections/SelectionVisitorContext.cs index 2fb0e328214..016c478ec86 100644 --- a/src/HotChocolate/Data/src/Data/Projections/SelectionVisitorContext.cs +++ b/src/HotChocolate/Data/src/Data/Projections/SelectionVisitorContext.cs @@ -7,11 +7,17 @@ namespace HotChocolate.Data.Projections; public class SelectionVisitorContext(IResolverContext context) : ISelectionVisitorContext { - public Stack Selection { get; } = new(); + public Stack Selections { get; } = new(); public Stack SelectionSetNodes { get; } = new(); - public Stack ResolvedType { get; } = new(); + public Stack ResolvedTypes { get; } = new(); public IResolverContext ResolverContext { get; } = context; + + public SelectionEnumerator GetSelections( + ObjectType typeContext, + Selection? selection = null, + bool allowInternals = false) + => ResolverContext.GetSelections(typeContext, selection, allowInternals); } diff --git a/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor`1.cs b/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor`1.cs index 8ca14d0bfaf..00f814fdb9c 100644 --- a/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor`1.cs +++ b/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor`1.cs @@ -3,9 +3,7 @@ namespace HotChocolate.Data.Projections; -public class SelectionVisitor - : SelectionVisitor - where TContext : ISelectionVisitorContext +public class SelectionVisitor : SelectionVisitor where TContext : ISelectionVisitorContext { protected virtual ISelectionVisitorAction Visit( IOutputFieldDefinition field, @@ -15,16 +13,15 @@ protected virtual ISelectionVisitorAction Visit( var result = Enter(field, localContext); localContext = OnAfterEnter(field, localContext, result); - if (result.Kind == SelectionVisitorActionKind.Continue) + if (result.Kind is SelectionVisitorActionKind.Continue) { - if (VisitChildren(field, context).Kind == SelectionVisitorActionKind.Break) + if (VisitChildren(field, context).Kind is SelectionVisitorActionKind.Break) { return Break; } } - if (result.Kind == SelectionVisitorActionKind.Continue - || result.Kind == SelectionVisitorActionKind.SkipAndLeave) + if (result.Kind is SelectionVisitorActionKind.Continue or SelectionVisitorActionKind.SkipAndLeave) { localContext = OnBeforeLeave(field, localContext); result = Leave(field, localContext); @@ -36,42 +33,41 @@ protected virtual ISelectionVisitorAction Visit( protected virtual TContext OnBeforeLeave( IOutputFieldDefinition field, - TContext localContext) => - localContext; + TContext localContext) + => localContext; protected virtual TContext OnAfterLeave( IOutputFieldDefinition field, TContext localContext, - ISelectionVisitorAction result) => - localContext; + ISelectionVisitorAction result) + => localContext; protected virtual TContext OnAfterEnter( IOutputFieldDefinition field, TContext localContext, - ISelectionVisitorAction result) => - localContext; + ISelectionVisitorAction result) + => localContext; protected virtual TContext OnBeforeEnter( IOutputFieldDefinition field, - TContext context) => - context; + TContext context) + => context; protected virtual ISelectionVisitorAction Visit( - ISelection selection, + Selection selection, TContext context) { var localContext = OnBeforeEnter(selection, context); var result = Enter(selection, localContext); localContext = OnAfterEnter(selection, localContext, result); - if (result.Kind == SelectionVisitorActionKind.Continue + if (result.Kind is SelectionVisitorActionKind.Continue && VisitChildren(selection, context).Kind == SelectionVisitorActionKind.Break) { return Break; } - if (result.Kind == SelectionVisitorActionKind.Continue - || result.Kind == SelectionVisitorActionKind.SkipAndLeave) + if (result.Kind is SelectionVisitorActionKind.Continue or SelectionVisitorActionKind.SkipAndLeave) { localContext = OnBeforeLeave(selection, localContext); result = Leave(selection, localContext); @@ -82,31 +78,31 @@ protected virtual ISelectionVisitorAction Visit( } protected virtual TContext OnBeforeLeave( - ISelection selection, + Selection selection, TContext localContext) => localContext; protected virtual TContext OnAfterLeave( - ISelection selection, + Selection selection, TContext localContext, ISelectionVisitorAction result) => localContext; protected virtual TContext OnAfterEnter( - ISelection selection, + Selection selection, TContext localContext, ISelectionVisitorAction result) => localContext; protected virtual TContext OnBeforeEnter( - ISelection selection, + Selection selection, TContext context) => context; protected virtual ISelectionVisitorAction VisitChildren(IOutputFieldDefinition field, TContext context) { var type = field.Type; - var selection = context.Selection.Peek(); + var selection = context.Selections.Peek(); var namedType = type.NamedType(); if (namedType.IsAbstractType()) @@ -133,19 +129,24 @@ protected virtual ISelectionVisitorAction VisitChildren(IOutputFieldDefinition f protected virtual ISelectionVisitorAction VisitObjectType( IOutputFieldDefinition field, ObjectType objectType, - ISelection selection, + Selection selection, TContext context) { - context.ResolvedType.Push(field.Type.NamedType().IsAbstractType() ? objectType : null); + context.ResolvedTypes.Push(field.Type.NamedType().IsAbstractType() ? objectType : null); try { - var selections = context.ResolverContext.GetSelections(objectType, selection, true); + var selectionSet = selection.GetSelectionSet(objectType); + var includeFlags = context.ResolverContext.IncludeFlags; - for (var i = 0; i < selections.Count; i++) + foreach (var childSelection in selectionSet.Selections) { - var result = Visit(selections[i], context); - if (result.Kind is SelectionVisitorActionKind.Break) + if (childSelection.IsSkipped(includeFlags)) + { + continue; + } + + if (Visit(selection, context).Kind is SelectionVisitorActionKind.Break) { return Break; } @@ -153,18 +154,17 @@ protected virtual ISelectionVisitorAction VisitObjectType( } finally { - context.ResolvedType.Pop(); + context.ResolvedTypes.Pop(); } return DefaultAction; } protected virtual ISelectionVisitorAction VisitChildren( - ISelection selection, + Selection selection, TContext context) { - var field = selection.Field; - return Visit(field, context); + return Visit(selection.Field, context); } protected virtual ISelectionVisitorAction Enter( @@ -178,18 +178,18 @@ protected virtual ISelectionVisitorAction Leave( DefaultAction; protected virtual ISelectionVisitorAction Enter( - ISelection selection, + Selection selection, TContext context) { - context.Selection.Push(selection); + context.Selections.Push(selection); return DefaultAction; } protected virtual ISelectionVisitorAction Leave( - ISelection selection, + Selection selection, TContext context) { - context.Selection.Pop(); + context.Selections.Pop(); return DefaultAction; } } diff --git a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs index 6edbc0e0d95..14d8dc98451 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs @@ -1,21 +1,22 @@ +using HotChocolate.Execution; using HotChocolate.Execution.Processing; namespace HotChocolate.Data.Projections; /// -/// A handler that can intersect a and optimize the selection set for +/// A handler that can intersect a and optimize the selection set for /// projections. /// public interface IProjectionFieldHandler { /// - /// Tests if this field handle can handle a selection. If it can handle the selection it + /// Tests if this field can handle a selection. If it can handle the selection it /// will be attached to the compiled selection set on the - /// type + /// type /// /// The selection to test for /// Returns true if the selection can be handled - bool CanHandle(ISelection selection); + bool CanHandle(Selection selection); /// /// Wrapped this field handler with a type interceptor diff --git a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler~1.cs b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler~1.cs index aa2d9f68e78..64c69b5200e 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler~1.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler~1.cs @@ -4,9 +4,7 @@ namespace HotChocolate.Data.Projections; /// -public interface IProjectionFieldHandler - : IProjectionFieldHandler - where TContext : IProjectionVisitorContext +public interface IProjectionFieldHandler : IProjectionFieldHandler where TContext : IProjectionVisitorContext { /// /// This method is called before the visitor calls @@ -17,7 +15,7 @@ public interface IProjectionFieldHandler /// /// The instance of that is used in TryHandleEnter /// - TContext OnBeforeEnter(TContext context, ISelection selection); + TContext OnBeforeEnter(TContext context, Selection selection); /// /// Tries to apply projection to the field. This method is called after @@ -33,7 +31,7 @@ public interface IProjectionFieldHandler /// If true is returned the action is used for further processing bool TryHandleEnter( TContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action); /// @@ -48,7 +46,7 @@ bool TryHandleEnter( /// TContext OnAfterEnter( TContext context, - ISelection selection, + Selection selection, ISelectionVisitorAction result); /// @@ -60,7 +58,7 @@ TContext OnAfterEnter( /// /// The instance of that is used in TryHandleLeave /// - TContext OnBeforeLeave(TContext context, ISelection selection); + TContext OnBeforeLeave(TContext context, Selection selection); /// /// Tries to apply projection to the field. This method is called after @@ -76,7 +74,7 @@ TContext OnAfterEnter( /// If true is returned the action is used for further processing bool TryHandleLeave( TContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action); /// @@ -91,6 +89,6 @@ bool TryHandleLeave( /// TContext OnAfterLeave( TContext context, - ISelection selection, + Selection selection, ISelectionVisitorAction result); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Visitor/ProjectionScope.cs b/src/HotChocolate/Data/src/Data/Projections/Visitor/ProjectionScope.cs index 106e24f094c..858d8b87ce9 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Visitor/ProjectionScope.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Visitor/ProjectionScope.cs @@ -6,13 +6,8 @@ namespace HotChocolate.Data.Projections; /// The type of the filter configuration public class ProjectionScope { - public ProjectionScope() - { - Instance = new Stack(); - } - /// /// Stores the current instance. In case of an expression this would be x.Foo.Bar /// - public Stack Instance { get; } + public Stack Instance { get; } = []; } diff --git a/src/HotChocolate/Data/src/Data/Projections/Visitor/ProjectionVisitorContext.cs b/src/HotChocolate/Data/src/Data/Projections/Visitor/ProjectionVisitorContext.cs index 76bf3664a8f..53b83b233eb 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Visitor/ProjectionVisitorContext.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Visitor/ProjectionVisitorContext.cs @@ -4,13 +4,14 @@ namespace HotChocolate.Data.Projections; public abstract class ProjectionVisitorContext - : SelectionVisitorContext, - IProjectionVisitorContext + : SelectionVisitorContext + , IProjectionVisitorContext { protected ProjectionVisitorContext( IResolverContext context, IOutputType initialType, - ProjectionScope projectionScope) : base(context) + ProjectionScope projectionScope) + : base(context) { ArgumentNullException.ThrowIfNull(initialType); @@ -21,7 +22,7 @@ protected ProjectionVisitorContext( public Stack> Scopes { get; } - public Stack Types { get; } = new Stack(); + public Stack Types { get; } = []; public IList Errors { get; } = []; } diff --git a/src/HotChocolate/Data/src/Data/Sorting/Context/SortingContextResolverContextExtensions.cs b/src/HotChocolate/Data/src/Data/Sorting/Context/SortingContextResolverContextExtensions.cs index 50209933f4b..687ba355cce 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Context/SortingContextResolverContextExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Context/SortingContextResolverContextExtensions.cs @@ -16,7 +16,7 @@ public static class SortingContextResolverContextExtensions { ArgumentNullException.ThrowIfNull(context); - var argumentName = context.Selection.GetSortingArgumentName(); + var argumentName = context.Selection.SortingArgumentName; if (string.IsNullOrEmpty(argumentName)) { return null; diff --git a/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortingFeatureExtensions.cs b/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortingFeatureExtensions.cs index caefe88366c..6f46ec06bdc 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortingFeatureExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortingFeatureExtensions.cs @@ -7,19 +7,20 @@ namespace HotChocolate.Data.Sorting; /// public static class SortingFeatureExtensions { - /// - /// Gets the sorting argument name from the selection. - /// - /// The selection. - /// The sorting argument name. - public static string? GetSortingArgumentName(this ISelection selection) - => selection.Field.Features.Get()?.ArgumentName; + extension(Selection selection) + { + /// + /// Gets the sorting argument name from the selection. + /// + /// The sorting argument name. + public string? SortingArgumentName + => selection.Field.Features.Get()?.ArgumentName; - /// - /// Checks if the selection has a sorting feature. - /// - /// The selection. - /// True if the selection has a sorting feature, otherwise false. - public static bool HasSortingFeature(this ISelection selection) - => selection.Field.Features.Get() is not null; + /// + /// Checks if the selection has a sorting feature. + /// + /// True if the selection has a sorting feature, otherwise false. + public bool HasSortingFeature + => selection.Field.Features.Get() is not null; + } } diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs index 531406760fa..988c5231a84 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs @@ -336,7 +336,7 @@ public virtual void EnrichExecuteRequest(RequestContext context, Activity activi activity.SetTag("graphql.document.hash", documentInfo.Hash.Value); activity.SetTag("graphql.document.valid", documentInfo.IsValidated); activity.SetTag("graphql.operation.id", operation?.Id); - activity.SetTag("graphql.operation.kind", operation?.Type); + activity.SetTag("graphql.operation.kind", operation?.Kind); activity.SetTag("graphql.operation.name", operation?.Name); if (_options.IncludeDocument && documentInfo.Document is not null) @@ -351,7 +351,7 @@ public virtual void EnrichExecuteRequest(RequestContext context, Activity activi } } - protected virtual string? CreateOperationDisplayName(RequestContext context, IOperation? operation) + protected virtual string? CreateOperationDisplayName(RequestContext context, Operation? operation) { if (operation is null) { @@ -367,7 +367,7 @@ public virtual void EnrichExecuteRequest(RequestContext context, Activity activi displayName.Append('{'); displayName.Append(' '); - foreach (var selection in rootSelectionSet.Selections.Take(3)) + foreach (var selection in rootSelectionSet.Selections[..3]) { if (displayName.Length > 2) { @@ -377,7 +377,7 @@ public virtual void EnrichExecuteRequest(RequestContext context, Activity activi displayName.Append(selection.ResponseName); } - if (rootSelectionSet.Selections.Count > 3) + if (rootSelectionSet.Selections.Length > 3) { displayName.Append(' '); displayName.Append('.'); @@ -667,6 +667,8 @@ private static ISyntaxNode CreateVariablesNode( items[i] = new ObjectValueNode(fields); } + + return new ListValueNode(items); } throw new InvalidOperationException(); diff --git a/src/HotChocolate/Fusion-vnext/benchmarks/Fusion.Execution.Benchmarks/Fusion.Execution.Benchmarks.csproj b/src/HotChocolate/Fusion-vnext/benchmarks/Fusion.Execution.Benchmarks/Fusion.Execution.Benchmarks.csproj index 61d4ec3dfb3..293f667f6ee 100644 --- a/src/HotChocolate/Fusion-vnext/benchmarks/Fusion.Execution.Benchmarks/Fusion.Execution.Benchmarks.csproj +++ b/src/HotChocolate/Fusion-vnext/benchmarks/Fusion.Execution.Benchmarks/Fusion.Execution.Benchmarks.csproj @@ -6,6 +6,7 @@ net10.0 true Preview + HotChocolate.Fusion.Execution.Benchmarks diff --git a/src/HotChocolate/Fusion-vnext/benchmarks/Fusion.Execution.Benchmarks/GraphQLQueryBenchmark.cs b/src/HotChocolate/Fusion-vnext/benchmarks/Fusion.Execution.Benchmarks/GraphQLQueryBenchmark.cs index 3704e00135e..581d0fc787f 100644 --- a/src/HotChocolate/Fusion-vnext/benchmarks/Fusion.Execution.Benchmarks/GraphQLQueryBenchmark.cs +++ b/src/HotChocolate/Fusion-vnext/benchmarks/Fusion.Execution.Benchmarks/GraphQLQueryBenchmark.cs @@ -14,6 +14,7 @@ using BenchmarkDotNet.Columns; using BenchmarkDotNet.Exporters.Csv; using BenchmarkDotNet.Exporters; +using HotChocolate.Buffers; namespace Fusion.Execution.Benchmarks; @@ -61,8 +62,12 @@ public async Task GlobalSetup() _transportFewItemsRequest = new TransportGraphQLHttpRequest(fewItems, _requestUri); _transportClient = new TransportClient(_client); - JsonMemory.Return(JsonMemory.Rent()); - MetaDbMemory.Return(MetaDbMemory.Rent()); + JsonMemory.Reconfigure( + static () => new FixedSizeArrayPool( + FixedSizeArrayPoolKinds.JsonMemory, + JsonMemory.BufferSize, + 128, + preAllocate: true)); } [GlobalCleanup] diff --git a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Extensions/MongoDbProjectionProviderDescriptorExtensions.cs b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Extensions/MongoDbProjectionProviderDescriptorExtensions.cs index 6a5714432a8..829ac6daf61 100644 --- a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Extensions/MongoDbProjectionProviderDescriptorExtensions.cs +++ b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Extensions/MongoDbProjectionProviderDescriptorExtensions.cs @@ -1,6 +1,7 @@ using HotChocolate.Data.MongoDb.Projections; using HotChocolate.Data.Projections; using HotChocolate.Data.Projections.Handlers; +using HotChocolate.Data.Projections.Optimizers; namespace HotChocolate.Data; diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj b/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj index 8bde094eee5..b767d7e82a9 100644 --- a/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj @@ -16,6 +16,7 @@ + From 76ff6cc367d00276fb9c7b37e470d06d9b3b7024 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 4 Dec 2025 22:41:23 +0100 Subject: [PATCH 022/144] wip --- .../OperationCompiler.CoerceArgumentValues.cs | 2 +- .../OperationCompiler.CompileResolver.cs | 2 +- .../Execution/Processing/OperationCompiler.cs | 23 ++++++++++++++-- .../Types/Resolvers/SelectionEnumerator.cs | 11 +++++++- .../QueryableCursorPagingProviderTests.cs | 26 +++++++++---------- .../Convention/IProjectionFieldInterceptor.cs | 2 +- .../QueryableProjectionFieldHandler.cs | 5 ++-- .../QueryableProjectionScalarHandler.cs | 5 ++-- .../Interceptor/QueryableSortInterceptor.cs | 2 +- .../QueryableFilterProjectionOptimizer.cs | 2 +- .../QueryablePagingProjectionOptimizer.cs | 18 +++++-------- .../Visitor/IProjectionFieldHandler.cs | 2 +- .../Visitor/IProjectionOptimizer.cs | 2 +- .../Handlers/MongoDbProjectionFieldHandler.cs | 8 +++--- ...QueryableSpatialProjectionScalarHandler.cs | 4 +-- ...ocumentAnalyzer.CollectInputObjectTypes.cs | 4 +-- .../Analyzers/FieldCollector.cs | 9 ++++--- .../Mappers/TypeDescriptorMapper.cs | 5 ++-- 18 files changed, 77 insertions(+), 55 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs index f601fa279a6..bcfc1ce0212 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs @@ -10,7 +10,7 @@ namespace HotChocolate.Execution.Processing; -internal sealed partial class OperationCompiler +public sealed partial class OperationCompiler { private ArgumentMap? CoerceArgumentValues( ObjectField field, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs index 372d52fd5b7..ef36b6e2d52 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs @@ -4,7 +4,7 @@ namespace HotChocolate.Execution.Processing; -internal sealed partial class OperationCompiler +public sealed partial class OperationCompiler { internal static FieldDelegate CreateFieldPipeline(Schema schema, ObjectField field, FieldNode selection) { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 2565aa7b5fd..ff196c9d4d4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -9,7 +9,7 @@ namespace HotChocolate.Execution.Processing; -internal sealed partial class OperationCompiler +public sealed partial class OperationCompiler { private readonly Schema _schema; private readonly ObjectPool>> _fieldsPool; @@ -18,7 +18,7 @@ internal sealed partial class OperationCompiler private readonly InputParser _inputValueParser; private static readonly ArrayPool s_objectArrayPool = ArrayPool.Shared; - public OperationCompiler( + internal OperationCompiler( Schema schema, InputParser inputValueParser, ObjectPool>> fieldsPool, @@ -34,6 +34,25 @@ public OperationCompiler( _optimizers = optimizers; } + public static Operation Compile( + string id, + OperationDefinitionNode operationDefinition, + Schema schema) + => Compile(id, id, operationDefinition, schema); + + public static Operation Compile( + string id, + string hash, + OperationDefinitionNode operationDefinition, + Schema schema) + => new OperationCompiler( + schema, + new InputParser(), + new DefaultObjectPool>>( + new DefaultPooledObjectPolicy>>()), + new OperationCompilerOptimizers()) + .Compile(id, hash, operationDefinition); + public Operation Compile( string id, string hash, diff --git a/src/HotChocolate/Core/src/Types/Resolvers/SelectionEnumerator.cs b/src/HotChocolate/Core/src/Types/Resolvers/SelectionEnumerator.cs index aed4577252b..23347abd46b 100644 --- a/src/HotChocolate/Core/src/Types/Resolvers/SelectionEnumerator.cs +++ b/src/HotChocolate/Core/src/Types/Resolvers/SelectionEnumerator.cs @@ -12,7 +12,16 @@ public struct SelectionEnumerator : IEnumerable, IEnumerator + /// Initializes a new instance of + /// + /// + /// The selection set to enumerate on. + /// + /// + /// The include flags representing the selections that shall be included. + /// + public SelectionEnumerator(SelectionSet selectionSet, ulong includeFlags) { _selectionSet = selectionSet; _includeFlags = includeFlags; diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/QueryableCursorPagingProviderTests.cs b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/QueryableCursorPagingProviderTests.cs index 5c417d78101..7555d0f1906 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/QueryableCursorPagingProviderTests.cs +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/QueryableCursorPagingProviderTests.cs @@ -493,7 +493,7 @@ private sealed class MockContext : IResolverContext { private readonly CursorPagingArguments _arguments; - private MockContext(CursorPagingArguments arguments, IOperation operation, ISelection selection) + private MockContext(CursorPagingArguments arguments, Operation operation, Selection selection) { _arguments = arguments; Operation = operation; @@ -519,14 +519,10 @@ public static async Task CreateContextAsync(CursorPagingArgume } """); - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "abc", - document, - document.Definitions.OfType().First(), - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "abc", + document.Definitions.OfType().First(), + schema); return new MockContext(arguments, operation, operation.RootSelectionSet.Selections[0]); } @@ -574,13 +570,13 @@ public void ReportError(Exception exception, Action? configure = n throw new NotImplementedException(); } - public IReadOnlyList GetSelections( + public SelectionEnumerator GetSelections( ObjectType typeContext, - ISelection? selection = null, + Selection? selection = null, bool allowInternals = false) { var selectionSet = Operation.GetSelectionSet(selection ?? Selection, typeContext); - return selectionSet.Selections; + return new SelectionEnumerator(selectionSet, IncludeFlags); } public ISelectionCollection Select() @@ -607,14 +603,16 @@ public IResolverContext Clone() public ObjectType ObjectType => throw new NotImplementedException(); - public IOperation Operation { get; } + public Operation Operation { get; } - public ISelection Selection { get; } + public Selection Selection { get; } public IVariableValueCollection Variables => throw new NotImplementedException(); public Path Path => throw new NotImplementedException(); + public ulong IncludeFlags => 0; + public T Parent() { throw new NotImplementedException(); diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor.cs index 5643a3e185a..0c455a1e94c 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/IProjectionFieldInterceptor.cs @@ -7,7 +7,7 @@ public interface IProjectionFieldInterceptor /// /// Tests if this interceptor can handle a selection If it can handle the selection it /// will be attached to the compiled selection set on the - /// type + /// type ProjectionSelection. /// /// The selection to test for /// Returns true if the selection can be handled diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs index dc13c5b0c68..96557f400f5 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs @@ -9,9 +9,8 @@ namespace HotChocolate.Data.Projections.Expressions.Handlers; public class QueryableProjectionFieldHandler : QueryableProjectionHandlerBase { - public override bool CanHandle(Selection selection) => - selection.Field.Member is { } - && selection.SelectionSet is not null; + public override bool CanHandle(Selection selection) + => selection.Field.Member is not null && !selection.IsLeaf; public override bool TryHandleEnter( QueryableProjectionContext context, diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs index 594df9df6c3..e16fef75060 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionScalarHandler.cs @@ -8,9 +8,8 @@ namespace HotChocolate.Data.Projections.Expressions.Handlers; public class QueryableProjectionScalarHandler : QueryableProjectionHandlerBase { - public override bool CanHandle(Selection selection) => - selection.Field.Member is { } - && selection.SelectionSet is null; + public override bool CanHandle(Selection selection) + => selection.Field.Member is not null && selection.IsLeaf; public override bool TryHandleEnter( QueryableProjectionContext context, diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs index 2953c81bf7a..3051f34d423 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Interceptor/QueryableSortInterceptor.cs @@ -4,7 +4,7 @@ using HotChocolate.Data.Projections.Expressions.Handlers; using HotChocolate.Data.Sorting; using HotChocolate.Data.Sorting.Expressions; -using HotChocolate.Execution; +using HotChocolate.Execution.Internal; using HotChocolate.Execution.Processing; using HotChocolate.Language; using HotChocolate.Types; diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs index 286acd8f250..19eec26c72d 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryableFilterProjectionOptimizer.cs @@ -17,7 +17,7 @@ public Selection RewriteSelection( { var resolverPipeline = selection.ResolverPipeline - ?? context.CompileResolverPipeline(selection.Field, selection.SyntaxNode); + ?? context.CompileResolverPipeline(selection.Field, selection.SyntaxNodes[0].Node); static FieldDelegate WrappedPipeline(FieldDelegate next) => ctx => diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs index 7b4ef8f5ef2..4026a494ce0 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Optimizers/QueryablePagingProjectionOptimizer.cs @@ -9,9 +9,8 @@ namespace HotChocolate.Data.Projections.Handlers; public sealed class QueryablePagingProjectionOptimizer : IProjectionOptimizer { - public bool CanHandle(Selection field) => - field.DeclaringType is IPageType - && field.Field.Name is "edges" or "items" or "nodes"; + public bool CanHandle(Selection field) + => field is { DeclaringType: IPageType, Field.Name: "edges" or "items" or "nodes" }; public Selection RewriteSelection( SelectionSetOptimizerContext context, @@ -37,7 +36,6 @@ public Selection RewriteSelection( CreateCombinedSelection( context, selection, - selection.DeclaringType, pageType, selections); @@ -49,7 +47,6 @@ public Selection RewriteSelection( private Selection CreateCombinedSelection( SelectionSetOptimizerContext context, Selection selection, - ObjectType declaringType, IPageType pageType, IReadOnlyList selections) { @@ -67,15 +64,14 @@ private Selection CreateCombinedSelection( selection.ResolverPipeline ?? context.CompileResolverPipeline(nodesField, combinedField); - return new Selection.Sealed( + return new Selection( context.NewSelectionId(), - declaringType, - nodesField, - nodesField.Type, - combinedField, CombinedEdgeField, - arguments: selection.Arguments, + nodesField, + [new FieldSelectionNode(combinedField, 0)], + [], isInternal: true, + arguments: selection.Arguments, resolverPipeline: nodesPipeline); } diff --git a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs index 14d8dc98451..0d939dee70e 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs @@ -12,7 +12,7 @@ public interface IProjectionFieldHandler /// /// Tests if this field can handle a selection. If it can handle the selection it /// will be attached to the compiled selection set on the - /// type + /// type IProjectionSelection. /// /// The selection to test for /// Returns true if the selection can be handled diff --git a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionOptimizer.cs index 53d5cfc8c2d..1bd4518490d 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionOptimizer.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionOptimizer.cs @@ -7,7 +7,7 @@ public interface IProjectionOptimizer /// /// Tests if this optimizer can handle a selection If it can handle the selection it /// will be attached to the compiled selection set on the - /// type + /// type ProjectionSelection. /// /// The selection to test for /// Returns true if the selection can be handled diff --git a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionFieldHandler.cs b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionFieldHandler.cs index b089ef4ca76..92b3f6a017a 100644 --- a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionFieldHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionFieldHandler.cs @@ -9,13 +9,13 @@ public class MongoDbProjectionFieldHandler : MongoDbProjectionHandlerBase { /// - public override bool CanHandle(ISelection selection) => - selection.SelectionSet is not null; + public override bool CanHandle(Selection selection) + => !selection.IsLeaf; /// public override bool TryHandleEnter( MongoDbProjectionVisitorContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { var field = selection.Field; @@ -27,7 +27,7 @@ public override bool TryHandleEnter( /// public override bool TryHandleLeave( MongoDbProjectionVisitorContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { context.Path.Pop(); diff --git a/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/QueryableSpatialProjectionScalarHandler.cs b/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/QueryableSpatialProjectionScalarHandler.cs index a2c57a634d5..48fd21c4b2a 100644 --- a/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/QueryableSpatialProjectionScalarHandler.cs +++ b/src/HotChocolate/Spatial/src/Data/Projections/Extensions/Extensions/QueryableSpatialProjectionScalarHandler.cs @@ -8,9 +8,9 @@ namespace HotChocolate.Data.Projections.Spatial; public class QueryableSpatialProjectionScalarHandler : QueryableProjectionScalarHandler { - public override bool CanHandle(ISelection selection) => + public override bool CanHandle(Selection selection) => selection.Field.Member is not null && typeof(Geometry).IsAssignableFrom(selection.Field.Member.GetReturnType()); - public static new QueryableSpatialProjectionScalarHandler Create(ProjectionProviderContext context) => new(); + public new static QueryableSpatialProjectionScalarHandler Create(ProjectionProviderContext context) => new(); } diff --git a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Analyzers/DocumentAnalyzer.CollectInputObjectTypes.cs b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Analyzers/DocumentAnalyzer.CollectInputObjectTypes.cs index 4ad3991107b..1ad24060502 100644 --- a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Analyzers/DocumentAnalyzer.CollectInputObjectTypes.cs +++ b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Analyzers/DocumentAnalyzer.CollectInputObjectTypes.cs @@ -41,7 +41,7 @@ private static void RegisterInputObjectType( foreach (var inputField in inputObjectType.Fields) { - rename = inputField.Directives.SingleOrDefault(); + rename = inputField.Directives.FirstOrDefault()?.ToValue(); fields.Add(new InputFieldModel( GetClassName(rename?.Name ?? inputField.Name), @@ -55,7 +55,7 @@ inputField.DefaultValue is not null context.RegisterType(inputField.Type.NamedType()); } - rename = inputObjectType.Directives.SingleOrDefault(); + rename = inputObjectType.Directives.FirstOrDefault()?.ToValue(); var typeName = context.ResolveTypeName( GetClassName(rename?.Name ?? inputObjectType.Name)); diff --git a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Analyzers/FieldCollector.cs b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Analyzers/FieldCollector.cs index e1390615d65..6fdf84008ea 100644 --- a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Analyzers/FieldCollector.cs +++ b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Analyzers/FieldCollector.cs @@ -207,9 +207,10 @@ private void ResolveFragmentSpread( if (DoesTypeApply(fragment.TypeCondition, type)) { - var deferDirective = fragmentSpreadSyntax.Directives.GetDeferDirectiveNode(); + // TODO : DEFER + // var deferDirective = fragmentSpreadSyntax.Directives.GetDeferDirectiveNode(); var nodes = new List(); - var fragmentNode = new FragmentNode(fragment, nodes, deferDirective); + var fragmentNode = new FragmentNode(fragment, nodes, null); fragmentNodes.Add(fragmentNode); CollectFields( @@ -232,9 +233,9 @@ private void ResolveInlineFragment( if (DoesTypeApply(fragment.TypeCondition, type)) { - var deferDirective = inlineFragmentSyntax.Directives.GetDeferDirectiveNode(); + // var deferDirective = inlineFragmentSyntax.Directives.GetDeferDirectiveNode(); var nodes = new List(); - var fragmentNode = new FragmentNode(fragment, nodes, deferDirective); + var fragmentNode = new FragmentNode(fragment, nodes, null); fragmentNodes.Add(fragmentNode); CollectFields( diff --git a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Mappers/TypeDescriptorMapper.cs b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Mappers/TypeDescriptorMapper.cs index 4bf5c476ae1..bada4a415c8 100644 --- a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Mappers/TypeDescriptorMapper.cs +++ b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Mappers/TypeDescriptorMapper.cs @@ -375,8 +375,9 @@ private static void CollectClassesThatImplementInterface( private static bool IncludeOrSkipDirective(OutputFieldModel field) { - return field.SyntaxNode.Directives.GetIncludeDirectiveNode() is not null - || field.SyntaxNode.Directives.GetSkipDirectiveNode() is not null; + return field.SyntaxNode.Directives.Any( + t => t.Name.Value.Equals(DirectiveNames.Include.Name) + || t.Name.Value.Equals(DirectiveNames.Skip.Name)); } private static void AddProperties( From 9d8eeb9daff3697ad975a2312d3d451810840d09 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 4 Dec 2025 22:41:30 +0100 Subject: [PATCH 023/144] wip --- src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj | 1 + .../AutomaticMocking/MockFieldMiddleware.cs | 2 +- .../Convention/Handlers/MongoDbProjectionHandlerBase.cs | 6 +++--- .../Convention/Handlers/MongoDbProjectionScalarHandler.cs | 6 +++--- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index d17deed0210..30ebd2b0c99 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -22,6 +22,7 @@ + diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.Tests.Shared/AutomaticMocking/MockFieldMiddleware.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.Tests.Shared/AutomaticMocking/MockFieldMiddleware.cs index 617211388ea..bd0251809d2 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.Tests.Shared/AutomaticMocking/MockFieldMiddleware.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.Tests.Shared/AutomaticMocking/MockFieldMiddleware.cs @@ -312,7 +312,7 @@ private static IError CreateError(IResolverContext context, int? index = null) return ErrorBuilder.New() .SetMessage("Unexpected Execution Error") .SetPath(path) - .AddLocation(context.Selection.SyntaxNode) + .AddLocations(context.Selection) .Build(); } diff --git a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionHandlerBase.cs b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionHandlerBase.cs index b9baa931b05..b38b1abf437 100644 --- a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionHandlerBase.cs +++ b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionHandlerBase.cs @@ -6,7 +6,7 @@ namespace HotChocolate.Data.MongoDb.Projections; /// -/// A handler that can intersect a and optimize the selection set for +/// A handler that can intersect a and optimize the selection set for /// mongodb projections. /// public abstract class MongoDbProjectionHandlerBase @@ -15,7 +15,7 @@ public abstract class MongoDbProjectionHandlerBase /// public override bool TryHandleEnter( MongoDbProjectionVisitorContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { action = SelectionVisitor.Continue; @@ -25,7 +25,7 @@ public override bool TryHandleEnter( /// public override bool TryHandleLeave( MongoDbProjectionVisitorContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { action = SelectionVisitor.Continue; diff --git a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionScalarHandler.cs b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionScalarHandler.cs index e093ef61513..161bcd5aece 100644 --- a/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionScalarHandler.cs +++ b/src/HotChocolate/MongoDb/src/Data/Projections/Convention/Handlers/MongoDbProjectionScalarHandler.cs @@ -10,13 +10,13 @@ public class MongoDbProjectionScalarHandler : MongoDbProjectionHandlerBase { /// - public override bool CanHandle(ISelection selection) => - selection.SelectionSet is null; + public override bool CanHandle(Selection selection) => + selection.IsLeaf; /// public override bool TryHandleEnter( MongoDbProjectionVisitorContext context, - ISelection selection, + Selection selection, [NotNullWhen(true)] out ISelectionVisitorAction? action) { var field = selection.Field; From cdfbd3fa6e96bbee772c24cd2d4aa8efedaa700b Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 4 Dec 2025 23:53:38 +0100 Subject: [PATCH 024/144] wip --- .../Execution/Processing/OperationCompiler.cs | 12 +- .../Execution/Processing/SelectionSet.cs | 15 +- .../SelectionSetOptimizerContext.cs | 7 + .../Extensions/ErrorBuilderExtensions.cs | 21 +- .../Execution.Tests/MiddlewareContextTests.cs | 13 +- .../Processing/OperationCompilerTests.cs | 411 ++++++------------ .../Processing/VisibilityTests.cs | 68 +-- .../Resolvers/ResolverCompilerTests.cs | 136 ++++-- .../Types/Brands/BrandNode.cs | 1 + 9 files changed, 339 insertions(+), 345 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index ff196c9d4d4..1aa47e7467e 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -85,6 +85,7 @@ public Operation Compile( includeConditions); var selectionSet = BuildSelectionSet( + SelectionPath.Root, fields, rootType, compilationContext, @@ -167,7 +168,8 @@ internal SelectionSet CompileSelectionSet( } } - var selectionSet = BuildSelectionSet(fields, objectType, compilationContext, optimizers, ref lastId); + var path = selection.DeclaringSelectionSet.Path.Append(selection.ResponseName); + var selectionSet = BuildSelectionSet(path, fields, objectType, compilationContext, optimizers, ref lastId); compilationContext.Register(selectionSet, selectionSet.Id); elementsById = compilationContext.ElementsById; selectionSet.Complete(operation); @@ -232,6 +234,7 @@ private void CollectFields( } private SelectionSet BuildSelectionSet( + SelectionPath path, OrderedDictionary> fieldMap, ObjectType typeContext, CompilationContext compilationContext, @@ -324,7 +327,7 @@ private SelectionSet BuildSelectionSet( // if there are no optimizers registered for this selection we exit early. if (optimizers.Length == 0) { - return new SelectionSet(selectionSetId, typeContext, selections, isConditional); + return new SelectionSet(selectionSetId, path, typeContext, selections, isConditional); } var current = ImmutableCollectionsMarshal.AsImmutableArray(selections); @@ -332,6 +335,7 @@ private SelectionSet BuildSelectionSet( var optimizerContext = new SelectionSetOptimizerContext( selectionSetId, + path, typeContext, ref rewritten, compilationContext.Features, @@ -349,7 +353,7 @@ private SelectionSet BuildSelectionSet( // This mean we can simply construct the SelectionSet. if (current == rewritten) { - return new SelectionSet(selectionSetId, typeContext, selections, isConditional); + return new SelectionSet(selectionSetId, path, typeContext, selections, isConditional); } if (current.Length < rewritten.Length) @@ -368,7 +372,7 @@ private SelectionSet BuildSelectionSet( } selections = ImmutableCollectionsMarshal.AsArray(rewritten)!; - return new SelectionSet(selectionSetId, typeContext, selections, isConditional); + return new SelectionSet(selectionSetId, path, typeContext, selections, isConditional); } private static void CollapseIncludeFlags(List includeFlags) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs index 228f15f6261..b27ea77f5b5 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs @@ -18,7 +18,12 @@ public sealed class SelectionSet : ISelectionSet private Flags _flags; private Operation? _declaringOperation; - internal SelectionSet(int id, IObjectTypeDefinition type, Selection[] selections, bool isConditional) + internal SelectionSet( + int id, + SelectionPath path, + IObjectTypeDefinition type, + Selection[] selections, + bool isConditional) { ArgumentNullException.ThrowIfNull(selections); @@ -28,6 +33,7 @@ internal SelectionSet(int id, IObjectTypeDefinition type, Selection[] selections } Id = id; + Path = path; Type = type; _flags = isConditional ? Flags.Conditional : Flags.None; _selections = selections; @@ -40,13 +46,18 @@ internal SelectionSet(int id, IObjectTypeDefinition type, Selection[] selections /// public int Id { get; } + /// + /// Gets the path where this selection set is located within the GraphQL operation document. + /// + public SelectionPath Path { get; } + /// /// Defines if this list needs post-processing for skip and include. /// public bool IsConditional => (_flags & Flags.Conditional) == Flags.Conditional; /// - /// Gets the type that declares this selection set. + /// Gets the type context of this selection set. /// public IObjectTypeDefinition Type { get; } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs index c956a0fa9a0..17d94802be4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs @@ -24,6 +24,7 @@ public ref struct SelectionSetOptimizerContext /// internal SelectionSetOptimizerContext( int selectionSetId, + SelectionPath path, ObjectType typeContext, ref ImmutableArray selections, OperationFeatureCollection features, @@ -36,6 +37,7 @@ internal SelectionSetOptimizerContext( _features = features; _lastSelectionId = ref lastSelectionId; _createFieldPipeline = createFieldPipeline; + Path = path; TypeContext = typeContext; Schema = schema; } @@ -45,6 +47,11 @@ internal SelectionSetOptimizerContext( /// public Schema Schema { get; } + /// + /// Gets the path where this selection set is located within the GraphQL operation document. + /// + public SelectionPath Path { get; } + /// /// Gets the type context of the current selection-set. /// diff --git a/src/HotChocolate/Core/src/Types/Extensions/ErrorBuilderExtensions.cs b/src/HotChocolate/Core/src/Types/Extensions/ErrorBuilderExtensions.cs index 7a6362d85c2..db9ded8259a 100644 --- a/src/HotChocolate/Core/src/Types/Extensions/ErrorBuilderExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Extensions/ErrorBuilderExtensions.cs @@ -1,14 +1,27 @@ -using System.Diagnostics; using HotChocolate.Execution.Processing; namespace HotChocolate; -internal static class ErrorBuilderExtensions +/// +/// Provides extension methods for . +/// +public static class ErrorBuilderExtensions { + /// + /// Adds all syntax node locations from a selection to the error builder. + /// + /// + /// The error builder to which locations will be added. + /// + /// + /// The selection containing the syntax nodes whose locations will be added to the error. + /// + /// + /// The for method chaining. + /// public static ErrorBuilder AddLocations(this ErrorBuilder errorBuilder, Selection selection) { - Debug.Assert(errorBuilder is not null); - Debug.Assert(selection is not null); + ArgumentNullException.ThrowIfNull(selection); foreach (var syntaxNode in selection.SyntaxNodes) { diff --git a/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs b/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs index 7d294bf4644..a798cdb7f4f 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs @@ -18,7 +18,7 @@ public async Task AccessVariables() .AddResolver( "Query", "foo", - ctx => ctx.Variables.GetValue("abc")?.Value) + ctx => ctx.Variables.GetValue("abc").Value) .Create(); var request = OperationRequestBuilder.New() @@ -43,7 +43,7 @@ public async Task AccessVariables_Fails_When_Variable_Not_Exists() .AddResolver( "Query", "foo", - ctx => ctx.Variables.GetValue("abc")?.Value) + ctx => ctx.Variables.GetValue("abc").Value) .Create(); var request = OperationRequestBuilder.New() @@ -63,7 +63,7 @@ public async Task AccessVariables_Fails_When_Variable_Not_Exists() public async Task CollectFields() { // arrange - var list = new List(); + var list = new List(); var schema = SchemaBuilder.New() .AddDocumentFromString( @@ -105,7 +105,7 @@ await schema.MakeExecutable().ExecuteAsync( }"); // assert - list.Select(t => t.SyntaxNode.Name.Value).ToList().MatchSnapshot(); + list.Select(t => t.SyntaxNodes[0].Node.Name.Value).ToList().MatchSnapshot(); } [Fact] @@ -627,8 +627,8 @@ public async Task SetResultExtensionData_With_ObjectValue_WhenDeferred() private static void CollectSelections( IResolverContext context, - ISelection selection, - ICollection collected) + Selection selection, + ICollection collected) { if (selection.Type.IsLeafType()) { @@ -644,5 +644,6 @@ private static void CollectSelections( } } + // ReSharper disable once NotAccessedPositionalProperty.Local private record SomeData(string SomeField); } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs index 1274cf5d887..09311f012ba 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs @@ -27,14 +27,10 @@ public void Prepare_One_Field() var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -59,14 +55,10 @@ public void Prepare_Duplicate_Field() document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -91,14 +83,10 @@ public void Prepare_Empty_Operation_SelectionSet() document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -129,14 +117,10 @@ ... on Human { document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -172,14 +156,10 @@ fragment def on Human { document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -242,14 +222,10 @@ fragment Human3 on Human { document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -274,14 +250,10 @@ public void Prepare_Duplicate_Field_With_Skip() var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -308,14 +280,10 @@ public void Field_Does_Not_Exist() // act void Action() { - var compiler = new OperationCompiler(new InputParser()); - compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + OperationCompiler.Compile( + "opid", + operationDefinition, + schema); } // assert @@ -348,14 +316,10 @@ fragment abc on Droid { document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -384,14 +348,10 @@ fragment abc on Droid { var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -420,14 +380,10 @@ fragment abc on Droid { var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -460,14 +416,10 @@ fragment abc on Droid { document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -508,14 +460,10 @@ ... @include(if: $v) { document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -580,14 +528,10 @@ fragment Human3 on Human { var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -622,14 +566,10 @@ ... @include(if: $v) { document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -653,14 +593,10 @@ name @include(if: $q) var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -693,14 +629,10 @@ public void Field_Based_Optimizers() var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -728,14 +660,10 @@ ... @defer { document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -765,14 +693,10 @@ fragment Foo on Droid { document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -802,14 +726,10 @@ friends @include(if: $withFriends) { document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -836,14 +756,10 @@ ... abc var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -858,24 +774,22 @@ public void InlineFragment_SelectionsSet_Empty() .Create(); var document = Utf8GraphQLParser.Parse( - @"query foo($v: Boolean){ - hero(episode: EMPIRE) { - name @include(if: $v) - ... on Droid { } - } - }"); + """ + query foo($v: Boolean){ + hero(episode: EMPIRE) { + name @include(if: $v) + ... on Droid { } + } + } + """); var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -899,14 +813,10 @@ query foo($v: Boolean) { var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -929,14 +839,10 @@ public async Task Large_Query_Test() document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -960,14 +866,10 @@ public async Task Crypto_Details_Test() document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -1005,14 +907,10 @@ fragment PriceInfo on Asset { var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -1050,14 +948,10 @@ fragment PriceInfo on Asset { var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -1096,14 +990,10 @@ fragment PriceInfo on Asset { var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -1127,14 +1017,10 @@ public async Task Crypto_List_Test() document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -1215,14 +1101,10 @@ type OrganizationUnit2 implements OrganizationUnit { var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -1303,19 +1185,13 @@ type OrganizationUnit2 implements OrganizationUnit { var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert - Assert.Equal(29, compiler.Metrics.Selections); - Assert.Equal(7, compiler.Metrics.SelectionSetVariants); - Assert.Equal(4, compiler.Metrics.BacklogMaxSize); + // Note: Metrics are no longer accessible with static method } [Fact] @@ -1352,14 +1228,10 @@ fragment TypeTwoParts on TypeTwo { var operationDefinition = document.Definitions.OfType().Single(); // act - var compiler = new OperationCompiler(new InputParser()); - var operation = compiler.Compile( - new OperationCompilerRequest( - "opid", - document, - operationDefinition, - schema.QueryType, - schema)); + var operation = OperationCompiler.Compile( + "opid", + operationDefinition, + schema); // assert MatchSnapshot(document, operation); @@ -1436,17 +1308,16 @@ public void OptimizeSelectionSet(SelectionSetOptimizerContext context) { if (context.Path is { Name: "bar" }) { - var baz = context.Type.Fields["baz"]; + var baz = context.TypeContext.Fields["baz"]; var bazSelection = Utf8GraphQLParser.Syntax.ParseField("baz { text }"); var bazPipeline = context.CompileResolverPipeline(baz, bazSelection); var compiledSelection = new Selection( context.NewSelectionId(), - context.Type, - baz, - baz.Type, - bazSelection, "someName", + baz, + [new FieldSelectionNode(bazSelection, 0)], + [], isInternal: true, resolverPipeline: bazPipeline); diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/VisibilityTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/VisibilityTests.cs index 2342c35e52c..13a0bee45dd 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/VisibilityTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/VisibilityTests.cs @@ -13,9 +13,10 @@ public void TryExtract_Skip_With_Literal() var field = Utf8GraphQLParser.Syntax.ParseField("field @skip(if: true)"); // act - var includeCondition = IncludeCondition.FromSelection(field); + var hasIncludeCondition = IncludeCondition.TryCreate(field, out var includeCondition); // assert + Assert.True(hasIncludeCondition); Assert.False(includeCondition.IsIncluded(variables.Object)); } @@ -27,10 +28,12 @@ public void Equals_Skip_With_Literal_True() var fieldB = Utf8GraphQLParser.Syntax.ParseField("fieldB @skip(if: true)"); // act - var includeConditionA = IncludeCondition.FromSelection(fieldA); - var includeConditionB = IncludeCondition.FromSelection(fieldB); + var hasIncludeConditionA = IncludeCondition.TryCreate(fieldA, out var includeConditionA); + var hasIncludeConditionB = IncludeCondition.TryCreate(fieldB, out var includeConditionB); // assert + Assert.True(hasIncludeConditionA); + Assert.True(hasIncludeConditionB); Assert.True(includeConditionA.Equals(includeConditionB)); } @@ -42,10 +45,12 @@ public void Equals_Skip_With_Variable_True() var fieldB = Utf8GraphQLParser.Syntax.ParseField("fieldB @skip(if: $a)"); // act - var includeConditionA = IncludeCondition.FromSelection(fieldA); - var includeConditionB = IncludeCondition.FromSelection(fieldB); + var hasIncludeConditionA = IncludeCondition.TryCreate(fieldA, out var includeConditionA); + var hasIncludeConditionB = IncludeCondition.TryCreate(fieldB, out var includeConditionB); // assert + Assert.True(hasIncludeConditionA); + Assert.True(hasIncludeConditionB); Assert.True(includeConditionA.Equals(includeConditionB)); } @@ -57,10 +62,12 @@ public void Equals_Skip_With_Literal_False() var fieldB = Utf8GraphQLParser.Syntax.ParseField("fieldB @skip(if: false)"); // act - var includeConditionA = IncludeCondition.FromSelection(fieldA); - var includeConditionB = IncludeCondition.FromSelection(fieldB); + var hasIncludeConditionA = IncludeCondition.TryCreate(fieldA, out var includeConditionA); + var hasIncludeConditionB = IncludeCondition.TryCreate(fieldB, out var includeConditionB); // assert + Assert.True(hasIncludeConditionA); + Assert.True(hasIncludeConditionB); Assert.False(includeConditionA.Equals(includeConditionB)); } @@ -72,10 +79,12 @@ public void Equals_Skip_With_Variable_False() var fieldB = Utf8GraphQLParser.Syntax.ParseField("fieldB @skip(if: $a)"); // act - var includeConditionA = IncludeCondition.FromSelection(fieldA); - var includeConditionB = IncludeCondition.FromSelection(fieldB); + var hasIncludeConditionA = IncludeCondition.TryCreate(fieldA, out var includeConditionA); + var hasIncludeConditionB = IncludeCondition.TryCreate(fieldB, out var includeConditionB); // assert + Assert.True(hasIncludeConditionA); + Assert.True(hasIncludeConditionB); Assert.False(includeConditionA.Equals(includeConditionB)); } @@ -87,10 +96,10 @@ public void TryExtract_False() var field = Utf8GraphQLParser.Syntax.ParseField("field @test(test: true)"); // act - var includeCondition = IncludeCondition.FromSelection(field); + var hasIncludeCondition = IncludeCondition.TryCreate(field, out var includeCondition); // assert - Assert.True(includeCondition.IsIncluded(variables.Object)); + Assert.False(hasIncludeCondition); } [Fact] @@ -101,10 +110,10 @@ public void TryExtract_False_2() var field = Utf8GraphQLParser.Syntax.ParseField("field"); // act - var includeCondition = IncludeCondition.FromSelection(field); + var hasIncludeCondition = IncludeCondition.TryCreate(field, out var includeCondition); // assert - Assert.True(includeCondition.IsIncluded(variables.Object)); + Assert.False(hasIncludeCondition); } [Fact] @@ -115,9 +124,10 @@ public void TryExtract_True() var field = Utf8GraphQLParser.Syntax.ParseField("field @skip(if: true)"); // act - var includeCondition = IncludeCondition.FromSelection(field); + var hasIncludeCondition = IncludeCondition.TryCreate(field, out var includeCondition); // assert + Assert.True(hasIncludeCondition); Assert.False(includeCondition.IsIncluded(variables.Object)); } @@ -128,14 +138,16 @@ public void GetHashCode_Skip_With_Literal_Equal() var fieldA = Utf8GraphQLParser.Syntax.ParseField("fieldA @skip(if: true)"); var fieldB = Utf8GraphQLParser.Syntax.ParseField("fieldB @skip(if: true)"); - var includeConditionA = IncludeCondition.FromSelection(fieldA); - var includeConditionB = IncludeCondition.FromSelection(fieldB); + var hasIncludeConditionA = IncludeCondition.TryCreate(fieldA, out var includeConditionA); + var hasIncludeConditionB = IncludeCondition.TryCreate(fieldB, out var includeConditionB); // act var hashCodeA = includeConditionA.GetHashCode(); var hashCodeB = includeConditionB.GetHashCode(); // assert + Assert.True(hasIncludeConditionA); + Assert.True(hasIncludeConditionB); Assert.Equal(hashCodeA, hashCodeB); } @@ -146,14 +158,16 @@ public void GetHashCode_Skip_With_Literal_NotEqual() var fieldA = Utf8GraphQLParser.Syntax.ParseField("fieldA @skip(if: true)"); var fieldB = Utf8GraphQLParser.Syntax.ParseField("fieldB @skip(if: false)"); - var includeConditionA = IncludeCondition.FromSelection(fieldA); - var includeConditionB = IncludeCondition.FromSelection(fieldB); + var hasIncludeConditionA = IncludeCondition.TryCreate(fieldA, out var includeConditionA); + var hasIncludeConditionB = IncludeCondition.TryCreate(fieldB, out var includeConditionB); // act var hashCodeA = includeConditionA.GetHashCode(); var hashCodeB = includeConditionB.GetHashCode(); // assert + Assert.True(hasIncludeConditionA); + Assert.True(hasIncludeConditionB); Assert.NotEqual(hashCodeA, hashCodeB); } @@ -164,13 +178,13 @@ public void IsVisible_Skip_Variables_True() var variables = new Mock(); variables.Setup(t => t.GetValue(It.IsAny())).Returns(BooleanValueNode.False); var field = Utf8GraphQLParser.Syntax.ParseField("field @skip(if: $a)"); - var includeCondition = IncludeCondition.FromSelection(field); // act - var visible = includeCondition.IsIncluded(variables.Object); + var hasIncludeCondition = IncludeCondition.TryCreate(field, out var includeCondition); // assert - Assert.True(visible); + Assert.True(hasIncludeCondition); + Assert.True(includeCondition.IsIncluded(variables.Object)); } [Fact] @@ -180,13 +194,13 @@ public void IsVisible_Include_Variables_True() var variables = new Mock(); variables.Setup(t => t.GetValue(It.IsAny())).Returns(BooleanValueNode.True); var field = Utf8GraphQLParser.Syntax.ParseField("field @include(if: $a)"); - var includeCondition = IncludeCondition.FromSelection(field); // act - var visible = includeCondition.IsIncluded(variables.Object); + var hasIncludeCondition = IncludeCondition.TryCreate(field, out var includeCondition); // assert - Assert.True(visible); + Assert.True(hasIncludeCondition); + Assert.True(includeCondition.IsIncluded(variables.Object)); } [Fact] @@ -195,12 +209,12 @@ public void IsVisible_Include_Literal_True() // arrange var variables = new Mock(); var field = Utf8GraphQLParser.Syntax.ParseField("field @include(if: true)"); - var includeCondition = IncludeCondition.FromSelection(field); // act - var visible = includeCondition.IsIncluded(variables.Object); + var hasIncludeCondition = IncludeCondition.TryCreate(field, out var includeCondition); // assert - Assert.True(visible); + Assert.True(hasIncludeCondition); + Assert.True(includeCondition.IsIncluded(variables.Object)); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs b/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs index 90ee7a94b30..1ae88b29256 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs @@ -467,11 +467,29 @@ public async Task Compile_Arguments_FieldSelection() var resolver = compiler.CompileResolve(member, type).Resolver!; // assert - var selection = new Mock(); + var fieldSyntax = new FieldNode( + null, + new NameNode("foo"), + null, + Array.Empty(), + Array.Empty(), + null); + + var schema = + SchemaBuilder.New() + .AddQueryType(c => c.Name("Query").Field("abc").Resolve("def")) + .Create(); + + var selection = new Selection( + id: 1, + "abc", + schema.Types.GetType("Query").Fields["abc"], + [new FieldSelectionNode(fieldSyntax, 1)], + []); var context = new Mock(); context.Setup(t => t.Parent()).Returns(new Resolvers()); - context.SetupGet(t => t.Selection).Returns(selection.Object); + context.SetupGet(t => t.Selection).Returns(selection); var result = (bool)(await resolver(context.Object))!; Assert.True(result); @@ -491,11 +509,29 @@ public async Task Compile_Arguments_Selection() var pure = compiler.CompileResolve(member, type).PureResolver!; // assert - var selection = new Mock(); + var fieldSyntax = new FieldNode( + null, + new NameNode("foo"), + null, + Array.Empty(), + Array.Empty(), + null); + + var schema = + SchemaBuilder.New() + .AddQueryType(c => c.Name("Query").Field("abc").Resolve("def")) + .Create(); + + var selection = new Selection( + id: 1, + "abc", + schema.Types.GetType("Query").Fields["abc"], + [new FieldSelectionNode(fieldSyntax, 1)], + []); var context = new Mock(); context.Setup(t => t.Parent()).Returns(new Resolvers()); - context.SetupGet(t => t.Selection).Returns(selection.Object); + context.SetupGet(t => t.Selection).Returns(selection); var result = (bool)(await resolver(context.Object))!; Assert.True(result, "Standard Resolver"); @@ -526,12 +562,21 @@ public async Task Compile_Arguments_FieldSyntax() Array.Empty(), null); - var selection = new Mock(); - selection.SetupGet(t => t.SyntaxNode).Returns(fieldSyntax); + var schema = + SchemaBuilder.New() + .AddQueryType(c => c.Name("Query").Field("abc").Resolve("def")) + .Create(); + + var selection = new Selection( + id: 1, + "abc", + schema.Types.GetType("Query").Fields["abc"], + [new FieldSelectionNode(fieldSyntax, 1)], + []); var context = new Mock(); context.Setup(t => t.Parent()).Returns(new Resolvers()); - context.SetupGet(t => t.Selection).Returns(selection.Object); + context.SetupGet(t => t.Selection).Returns(selection); var result = (bool)(await resolver(context.Object))!; Assert.True(result, "Standard Resolver"); @@ -579,24 +624,20 @@ public async Task Compile_Arguments_Operation() var resolver = compiler.CompileResolve(member, type).Resolver!; // assert - var operationDefinition = - new OperationDefinitionNode( - null, - null, - null, - OperationType.Query, - Array.Empty(), - Array.Empty(), - new SelectionSetNode( - null, - Array.Empty())); - - var operation = new Mock(); - operation.Setup(t => t.Definition).Returns(operationDefinition); + var schema = + SchemaBuilder.New() + .AddQueryType(c => c.Name("Query").Field("abc").Resolve("def")) + .Create(); + + var document = Utf8GraphQLParser.Parse("{ abc }"); + var operation = OperationCompiler.Compile( + "abc", + document.Definitions.OfType().First(), + schema); var context = new Mock(); context.Setup(t => t.Parent()).Returns(new Resolvers()); - context.SetupGet(t => t.Operation).Returns(operation.Object); + context.SetupGet(t => t.Operation).Returns(operation); var result = (bool)(await resolver(context.Object))!; Assert.True(result); } @@ -614,6 +655,14 @@ public async Task Compile_Arguments_ObjectField() var resolver = compiler.CompileResolve(member, type).Resolver!; // assert + var fieldSyntax = new FieldNode( + null, + new NameNode("a"), + null, + Array.Empty(), + Array.Empty(), + null); + var schema = SchemaBuilder.New() .AddDocumentFromString("type Query { a: String }") .Use(next => next) @@ -621,12 +670,16 @@ public async Task Compile_Arguments_ObjectField() var queryType = schema.Types.GetType("Query"); - var selection = new Mock(); - selection.SetupGet(t => t.Field).Returns(queryType.Fields.First()); + var selection = new Selection( + id: 1, + "a", + queryType.Fields.First(), + [new FieldSelectionNode(fieldSyntax, 1)], + []); var context = new Mock(); context.Setup(t => t.Parent()).Returns(new Resolvers()); - context.SetupGet(t => t.Selection).Returns(selection.Object); + context.SetupGet(t => t.Selection).Returns(selection); var result = (bool)(await resolver(context.Object))!; Assert.True(result); @@ -645,6 +698,14 @@ public async Task Compile_Arguments_IOutputField() var resolver = compiler.CompileResolve(member, type).Resolver!; // assert + var fieldSyntax = new FieldNode( + null, + new NameNode("a"), + null, + Array.Empty(), + Array.Empty(), + null); + var schema = SchemaBuilder.New() .AddDocumentFromString("type Query { a: String }") .Use(next => next) @@ -652,12 +713,16 @@ public async Task Compile_Arguments_IOutputField() var queryType = schema.Types.GetType("Query"); - var selection = new Mock(); - selection.SetupGet(t => t.Field).Returns(queryType.Fields.First()); + var selection = new Selection( + id: 1, + "a", + queryType.Fields.First(), + [new FieldSelectionNode(fieldSyntax, 1)], + []); var context = new Mock(); context.Setup(t => t.Parent()).Returns(new Resolvers()); - context.SetupGet(t => t.Selection).Returns(selection.Object); + context.SetupGet(t => t.Selection).Returns(selection); var result = (bool)(await resolver(context.Object))!; Assert.True(result); @@ -676,13 +741,20 @@ public async Task Compile_Arguments_Document() var resolver = compiler.CompileResolve(member, type).Resolver!; // assert - var document = new DocumentNode(Array.Empty()); - var operation = new Mock(); - operation.Setup(t => t.Document).Returns(document); + var schema = + SchemaBuilder.New() + .AddQueryType(c => c.Name("Query").Field("abc").Resolve("def")) + .Create(); + + var document = Utf8GraphQLParser.Parse("{ abc }"); + var operation = OperationCompiler.Compile( + "abc", + document.Definitions.OfType().First(), + schema); var context = new Mock(); context.Setup(t => t.Parent()).Returns(new Resolvers()); - context.SetupGet(t => t.Operation).Returns(operation.Object); + context.SetupGet(t => t.Operation).Returns(operation); var result = (bool)(await resolver(context.Object))!; Assert.True(result); } diff --git a/src/HotChocolate/Data/test/Data.PostgreSQL.Tests/Types/Brands/BrandNode.cs b/src/HotChocolate/Data/test/Data.PostgreSQL.Tests/Types/Brands/BrandNode.cs index 7eee8c9b14b..122ef0ab407 100644 --- a/src/HotChocolate/Data/test/Data.PostgreSQL.Tests/Types/Brands/BrandNode.cs +++ b/src/HotChocolate/Data/test/Data.PostgreSQL.Tests/Types/Brands/BrandNode.cs @@ -1,6 +1,7 @@ using GreenDonut.Data; using HotChocolate.Data.Models; using HotChocolate.Data.Services; +using HotChocolate.Execution; using HotChocolate.Execution.Processing; using HotChocolate.Types; using HotChocolate.Types.Pagination; From 722e60f5dea17ffe4c7f5ed1774b3b8f4709031a Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Thu, 4 Dec 2025 23:58:48 +0100 Subject: [PATCH 025/144] Fixed middleware --- .../Execution/Pipeline/OperationResolverMiddleware.cs | 9 ++------- .../src/Types/Execution/Processing/OperationCompiler.cs | 1 + 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs index 9c85a312c1d..0a301750db7 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs @@ -9,7 +9,6 @@ internal sealed class OperationResolverMiddleware { private readonly RequestDelegate _next; private readonly OperationCompiler _operationPlanner; - private readonly DocumentRewriter _documentRewriter; private readonly IExecutionDiagnosticEvents _diagnosticEvents; private OperationResolverMiddleware( @@ -25,7 +24,6 @@ private OperationResolverMiddleware( _next = next; _operationPlanner = operationPlanner; - _documentRewriter = new DocumentRewriter(schema, removeStaticallyExcludedSelections: true); _diagnosticEvents = diagnosticEvents; } @@ -42,13 +40,10 @@ public async ValueTask InvokeAsync(RequestContext context) { using (_diagnosticEvents.CompileOperation(context)) { - // Before we can plan an operation, we must de-fragmentize it and remove static include conditions. - var operationDocument = documentInfo.Document; var operationName = context.Request.OperationName; - operationDocument = _documentRewriter.RewriteDocument(operationDocument, operationName); + var operationDocument = documentInfo.Document; var operationNode = operationDocument.GetOperation(operationName); - // After optimizing the query structure we can begin the planning process. operation = _operationPlanner.Compile( operationId ?? Guid.NewGuid().ToString("N"), documentInfo.Hash.Value, @@ -69,7 +64,7 @@ public static RequestMiddlewareConfiguration Create() (core, next) => { var schema = core.Schema; - var operationCompiler = core.Services.GetRequiredService(); + var operationCompiler = core.SchemaServices.GetRequiredService(); var diagnosticEvents = core.SchemaServices.GetRequiredService(); var middleware = new OperationResolverMiddleware( diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 1aa47e7467e..49a07b7e4e9 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -61,6 +61,7 @@ public Operation Compile( ArgumentException.ThrowIfNullOrWhiteSpace(id); ArgumentNullException.ThrowIfNull(operationDefinition); + // Before we can plan an operation, we must de-fragmentize it and remove static include conditions. var document = new DocumentNode([operationDefinition]); document = _documentRewriter.RewriteDocument(document); operationDefinition = (OperationDefinitionNode)document.Definitions[0]; From 133f6942efba492f489153f7563c745040bbabff Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 5 Dec 2025 14:40:05 +0100 Subject: [PATCH 026/144] wip --- ...estExecutorBuilderExtensions.Convention.cs | 2 +- .../Core/src/Types/Execution/ErrorHelper.cs | 2 +- .../Extensions/ExecutionResultExtensions.cs | 2 +- .../Processing/MiddlewareContext.Arguments.cs | 2 +- .../Types/Execution/Processing/Operation.cs | 2 +- .../OperationCompiler.CoerceArgumentValues.cs | 6 - .../Execution/Processing/OperationCompiler.cs | 2 +- .../Processing/OperationContext.Operation.cs | 2 +- .../Processing/Result/ResultBuilder.cs | 2 +- .../Execution/Processing/RootValueResolver.cs | 3 +- .../Types/Execution/Processing/Selection.cs | 2 +- .../Processing/Tasks/ResolverTask.Pooling.cs | 1 - .../Processing/Tasks/ResolverTask.cs | 4 +- .../Processing/VariableValueOrLiteral.cs | 2 +- .../Types/Execution/RequestExecutorManager.cs | 17 +- .../Core/src/Types/Execution/ThrowHelper.cs | 2 +- .../Types/Fetching/BatchDispatcherResult.cs | 2 +- .../Fetching/ExecutionDataLoaderScope.cs | 3 +- .../Types/Fetching/Utilities/ThrowHelper.cs | 2 +- .../Core/src/Types/HotChocolate.Types.csproj | 23 + .../Properties/FetchingResources.Designer.cs | 34 +- .../Types/Properties/FetchingResources.resx | 112 +---- .../Types/Properties/Resources.Designer.cs | 470 +++++------------- .../Conventions/DescriptorContext.cs | 8 +- .../Execution/FusionRequestExecutorManager.cs | 2 +- 25 files changed, 215 insertions(+), 494 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Convention.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Convention.cs index a2c6eab4b96..bc762ba1c1c 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Convention.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/SchemaRequestExecutorBuilderExtensions.Convention.cs @@ -1,6 +1,6 @@ using HotChocolate; using HotChocolate.Execution.Configuration; -using HotChocolate.Execution.Properties; +using HotChocolate.Properties; using HotChocolate.Types.Descriptors; using static HotChocolate.Execution.ThrowHelper; diff --git a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs index abcb9c0ca53..2507ff251a6 100644 --- a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs @@ -2,7 +2,7 @@ using System.Net; using HotChocolate.Execution.Processing; using HotChocolate.Language; -using static HotChocolate.Execution.Properties.Resources; +using static HotChocolate.Properties.Resources; namespace HotChocolate.Execution; diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionResultExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionResultExtensions.cs index 8e0e5c914f2..08931bcac27 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionResultExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionResultExtensions.cs @@ -3,7 +3,7 @@ using HotChocolate.Buffers; using HotChocolate.Execution; using HotChocolate.Transport.Formatters; -using static HotChocolate.Execution.Properties.Resources; +using static HotChocolate.Properties.Resources; // ReSharper disable once CheckNamespace namespace HotChocolate; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs index e69ab937ba7..16bca1ca7b7 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs @@ -2,7 +2,7 @@ using HotChocolate.Resolvers; using HotChocolate.Types; using HotChocolate.Utilities; -using static HotChocolate.Execution.Properties.Resources; +using static HotChocolate.Properties.Resources; using static HotChocolate.Execution.ThrowHelper; namespace HotChocolate.Execution.Processing; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs index c88f27dda86..f62474155e8 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs @@ -32,7 +32,7 @@ internal Operation( SelectionSet rootSelectionSet, OperationCompiler compiler, IncludeConditionCollection includeConditions, - OperationFeatureCollection features, + OperationFeatureCollection features, int lastId, object[] elementsById) { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs index bcfc1ce0212..62b09006798 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs @@ -1,12 +1,6 @@ -using System.Buffers; -using System.Collections; -using System.Diagnostics.CodeAnalysis; -using HotChocolate.Fusion.Rewriters; using HotChocolate.Language; -using HotChocolate.Language.Visitors; using HotChocolate.Resolvers; using HotChocolate.Types; -using Microsoft.Extensions.ObjectPool; namespace HotChocolate.Execution.Processing; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 49a07b7e4e9..e417997b6ae 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -294,7 +294,7 @@ private SelectionSet BuildSelectionSet( var pureFieldDelegate = TryCreatePureField(_schema, field, first.Node); var arguments = ArgumentMap.Empty; - if (first.Node.Arguments.Count > 0) + if (field.Arguments.Count > 0) { arguments = CoerceArgumentValues(field, first.Node); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs index 8921485ebd5..ab9451f9a43 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Operation.cs @@ -1,4 +1,4 @@ -using HotChocolate.Execution.Properties; +using HotChocolate.Properties; using HotChocolate.Types; namespace HotChocolate.Execution.Processing; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.cs index 82f764c4804..653ea7c7d95 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.cs @@ -1,6 +1,6 @@ using System.Buffers; using System.Runtime.CompilerServices; -using HotChocolate.Execution.Properties; +using HotChocolate.Properties; using HotChocolate.Resolvers; namespace HotChocolate.Execution.Processing; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/RootValueResolver.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/RootValueResolver.cs index eb1c09b379b..d0d6524aa18 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/RootValueResolver.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/RootValueResolver.cs @@ -1,6 +1,5 @@ using HotChocolate.Types; -using Microsoft.Extensions.DependencyInjection; -using static HotChocolate.Execution.Properties.Resources; +using static HotChocolate.Properties.Resources; namespace HotChocolate.Execution.Processing; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index d47b00eb706..194fa17715d 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -1,4 +1,4 @@ -using HotChocolate.Execution.Properties; +using HotChocolate.Properties; using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Resolvers; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs index 5bd5f9edf88..a5d30fe42a4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs @@ -40,7 +40,6 @@ internal bool Reset() Next = null; Previous = null; State = null; - _task = null; _taskBuffer.Clear(); _args.Clear(); return true; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs index 4b19453a6e7..277a00bd565 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs @@ -1,5 +1,6 @@ using HotChocolate.Execution.Instrumentation; using HotChocolate.Resolvers; +using HotChocolate.Utilities; using Microsoft.Extensions.ObjectPool; namespace HotChocolate.Execution.Processing.Tasks; @@ -12,7 +13,6 @@ internal sealed partial class ResolverTask(ObjectPool objectPool) private OperationContext _operationContext = null!; private Selection _selection = null!; private ExecutionTaskStatus _completionStatus = ExecutionTaskStatus.Completed; - private Task? _task; /// /// Gets or sets the internal execution id. @@ -71,6 +71,6 @@ public ExecutionTaskKind Kind public void BeginExecute(CancellationToken cancellationToken) { Status = ExecutionTaskStatus.Running; - _task = ExecuteAsync(cancellationToken); + ExecuteAsync(cancellationToken).FireAndForget(); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueOrLiteral.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueOrLiteral.cs index 4b82070912f..61844bacb3e 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueOrLiteral.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueOrLiteral.cs @@ -1,6 +1,6 @@ using HotChocolate.Language; using HotChocolate.Types; -using static HotChocolate.Execution.Properties.Resources; +using static HotChocolate.Properties.Resources; namespace HotChocolate.Execution.Processing; diff --git a/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs b/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs index a3ebe5b7ee4..56e873af829 100644 --- a/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs +++ b/src/HotChocolate/Core/src/Types/Execution/RequestExecutorManager.cs @@ -35,18 +35,19 @@ internal sealed partial class RequestExecutorManager private readonly IServiceProvider _applicationServices; private readonly EventObservable _events = new(); private readonly ChannelWriter _executorEvictionChannelWriter; + private ulong _version; private bool _disposed; public RequestExecutorManager( IOptionsMonitor optionsMonitor, - IServiceProvider serviceProvider) + IServiceProvider applicationServices) { ArgumentNullException.ThrowIfNull(optionsMonitor); - ArgumentNullException.ThrowIfNull(serviceProvider); + ArgumentNullException.ThrowIfNull(applicationServices); _optionsMonitor = optionsMonitor; - _applicationServices = serviceProvider; + _applicationServices = applicationServices; var executorEvictionChannel = Channel.CreateUnbounded(); _executorEvictionChannelWriter = executorEvictionChannel.Writer; @@ -89,8 +90,9 @@ public async ValueTask GetExecutorAsync( throw new InvalidOperationException($"The requested schema '{schemaName}' does not exist."); } - var registeredExecutor = await CreateRequestExecutorAsync(schemaName, true, cancellationToken) - .ConfigureAwait(false); + var registeredExecutor = + await CreateRequestExecutorAsync(schemaName, true, cancellationToken) + .ConfigureAwait(false); return registeredExecutor.Executor; } @@ -266,7 +268,8 @@ await typeModuleChangeMonitor.ConfigureAsync(context, cancellationToken) serviceCollection.AddSingleton(new SchemaVersionInfo(version)); - serviceCollection.AddSingleton(context.DescriptorContext.TypeConverter); + serviceCollection.AddSingleton( + _ => context.DescriptorContext.TypeConverter); serviceCollection.AddSingleton( static sp => new InputParser(sp.GetRequiredService())); @@ -282,6 +285,8 @@ await typeModuleChangeMonitor.ConfigureAsync(context, cancellationToken) static _ => new DefaultObjectPoolProvider()); serviceCollection.AddSingleton( static sp => sp.GetRequiredService().CreateStringBuilderPool()); + serviceCollection.AddSingleton( + static sp => sp.GetRequiredService().CreateFieldMapPool()); serviceCollection.AddSingleton(executorOptions); serviceCollection.AddSingleton( diff --git a/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs index d2ac4820927..81cd8a172c0 100644 --- a/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs @@ -1,6 +1,6 @@ using HotChocolate.Language; using HotChocolate.Types; -using static HotChocolate.Execution.Properties.Resources; +using static HotChocolate.Properties.Resources; namespace HotChocolate.Execution; diff --git a/src/HotChocolate/Core/src/Types/Fetching/BatchDispatcherResult.cs b/src/HotChocolate/Core/src/Types/Fetching/BatchDispatcherResult.cs index 96e1ef89d5b..409662c4ca2 100644 --- a/src/HotChocolate/Core/src/Types/Fetching/BatchDispatcherResult.cs +++ b/src/HotChocolate/Core/src/Types/Fetching/BatchDispatcherResult.cs @@ -1,4 +1,4 @@ -using HotChocolate.Fetching.Properties; +using HotChocolate.Properties; namespace HotChocolate.Fetching; diff --git a/src/HotChocolate/Core/src/Types/Fetching/ExecutionDataLoaderScope.cs b/src/HotChocolate/Core/src/Types/Fetching/ExecutionDataLoaderScope.cs index ebf55abd726..737e035edfc 100644 --- a/src/HotChocolate/Core/src/Types/Fetching/ExecutionDataLoaderScope.cs +++ b/src/HotChocolate/Core/src/Types/Fetching/ExecutionDataLoaderScope.cs @@ -1,8 +1,7 @@ using System.Collections.Concurrent; using GreenDonut; using GreenDonut.DependencyInjection; -using HotChocolate.Fetching.Properties; -using Microsoft.Extensions.DependencyInjection; +using HotChocolate.Properties; namespace HotChocolate.Fetching; diff --git a/src/HotChocolate/Core/src/Types/Fetching/Utilities/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Fetching/Utilities/ThrowHelper.cs index 51281d7e99e..bb7a836dc5f 100644 --- a/src/HotChocolate/Core/src/Types/Fetching/Utilities/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Fetching/Utilities/ThrowHelper.cs @@ -1,4 +1,4 @@ -using static HotChocolate.Fetching.Properties.FetchingResources; +using static HotChocolate.Properties.FetchingResources; namespace HotChocolate.Fetching.Utilities; diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index 30ebd2b0c99..17b5240fe90 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -221,6 +221,24 @@ OperationFeatureCollection.cs + + + RequestExecutorManager.cs + + + + RequestExecutorManager.cs + + + + RequestExecutorManager.cs + + + + True + True + FetchingResources.resx + @@ -322,6 +340,11 @@ ResXFileCodeGenerator TextJsonResources.Designer.cs + + + ResXFileCodeGenerator + FetchingResources.Designer.cs + diff --git a/src/HotChocolate/Core/src/Types/Properties/FetchingResources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/FetchingResources.Designer.cs index 83d091f7900..a7beaa7e6ea 100644 --- a/src/HotChocolate/Core/src/Types/Properties/FetchingResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types/Properties/FetchingResources.Designer.cs @@ -7,34 +7,34 @@ // //------------------------------------------------------------------------------ -namespace HotChocolate.Fetching.Properties { +namespace HotChocolate.Properties { using System; - - + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class FetchingResources { - + private static System.Resources.ResourceManager resourceMan; - + private static System.Globalization.CultureInfo resourceCulture; - + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal FetchingResources() { } - + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] internal static System.Resources.ResourceManager ResourceManager { get { if (object.Equals(null, resourceMan)) { - System.Resources.ResourceManager temp = new System.Resources.ResourceManager("HotChocolate.Fetching.Properties.FetchingResources", typeof(FetchingResources).Assembly); + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("HotChocolate.Properties.FetchingResources", typeof(FetchingResources).Assembly); resourceMan = temp; } return resourceMan; } } - + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] internal static System.Globalization.CultureInfo Culture { get { @@ -44,49 +44,49 @@ internal static System.Globalization.CultureInfo Culture { resourceCulture = value; } } - + internal static string DataLoaderRegistry_KeyNullOrEmpty { get { return ResourceManager.GetString("DataLoaderRegistry_KeyNullOrEmpty", resourceCulture); } } - + internal static string DefaultDataLoaderRegistry_GetOrRegister { get { return ResourceManager.GetString("DefaultDataLoaderRegistry_GetOrRegister", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_CreateDataLoader_AbstractType { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_CreateDataLoader_AbstractType", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_CreateDataLoader_UnableToCreate { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_CreateDataLoader_UnableToCreate", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_RegistryIsNull { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_RegistryIsNull", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_UnableToRegister { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_UnableToRegister", resourceCulture); } } - + internal static string ThrowHelper_DataLoader_InvalidType { get { return ResourceManager.GetString("ThrowHelper_DataLoader_InvalidType", resourceCulture); } } - + internal static string BatchDispatcherResult_NoExceptions { get { return ResourceManager.GetString("BatchDispatcherResult_NoExceptions", resourceCulture); diff --git a/src/HotChocolate/Core/src/Types/Properties/FetchingResources.resx b/src/HotChocolate/Core/src/Types/Properties/FetchingResources.resx index 054ca8f64cb..67e73398d1e 100644 --- a/src/HotChocolate/Core/src/Types/Properties/FetchingResources.resx +++ b/src/HotChocolate/Core/src/Types/Properties/FetchingResources.resx @@ -1,122 +1,24 @@ - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + text/microsoft-resx - 2.0 + 1.3 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + The DataLoader key cannot be null or empty. @@ -136,7 +38,7 @@ Unable to register a DataLoader with your DataLoader registry. - The provided type {0} is not a dataloader + The provided type {0} is not a DataLoader. There must be at least one exception to create an error result. diff --git a/src/HotChocolate/Core/src/Types/Properties/Resources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/Resources.Designer.cs index bf137efe381..89f003a93dd 100644 --- a/src/HotChocolate/Core/src/Types/Properties/Resources.Designer.cs +++ b/src/HotChocolate/Core/src/Types/Properties/Resources.Designer.cs @@ -7,50 +7,36 @@ // //------------------------------------------------------------------------------ -namespace HotChocolate.Execution.Properties { +namespace HotChocolate.Properties { using System; - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { - private static global::System.Resources.ResourceManager resourceMan; + private static System.Resources.ResourceManager resourceMan; - private static global::System.Globalization.CultureInfo resourceCulture; + private static System.Globalization.CultureInfo resourceCulture; - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager { get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HotChocolate.Execution.Properties.Resources", typeof(Resources).Assembly); + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("HotChocolate.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -59,561 +45,375 @@ internal Resources() { } } - /// - /// Looks up a localized string similar to Serial execution tasks cannot be batched.. - /// - internal static string BatchExecutionTask_AddExecutionTask_SerialTasksNotAllowed { + internal static string ThrowHelper_FieldDoesNotExistOnType { get { - return ResourceManager.GetString("BatchExecutionTask_AddExecutionTask_SerialTasksNotAllowed", resourceCulture); + return ResourceManager.GetString("ThrowHelper_FieldDoesNotExistOnType", resourceCulture); } } - /// - /// Looks up a localized string similar to You can only read a response stream once.. - /// - internal static string DeferredResult_ReadResultsAsync_ReadOnlyOnce { + internal static string ObjectBuffer_IsEmpty { get { - return ResourceManager.GetString("DeferredResult_ReadResultsAsync_ReadOnlyOnce", resourceCulture); + return ResourceManager.GetString("ObjectBuffer_IsEmpty", resourceCulture); } } - /// - /// Looks up a localized string similar to Detected a non-null violation in argument `{0}`.. - /// - internal static string ErrorHelper_ArgumentNonNullError_Message { + internal static string ObjectBuffer_IsUsedUp { get { - return ResourceManager.GetString("ErrorHelper_ArgumentNonNullError_Message", resourceCulture); + return ResourceManager.GetString("ObjectBuffer_IsUsedUp", resourceCulture); } } - /// - /// Looks up a localized string similar to The type `{0}` is not supported as list value.. - /// - internal static string ErrorHelper_ListValueIsNotSupported_Message { + internal static string PreparedSelection_ReadOnly { get { - return ResourceManager.GetString("ErrorHelper_ListValueIsNotSupported_Message", resourceCulture); + return ResourceManager.GetString("PreparedSelection_ReadOnly", resourceCulture); } } - /// - /// Looks up a localized string similar to The request exceeded the configured timeout of `{0}`.. - /// - internal static string ErrorHelper_RequestTimeout { + internal static string DeferredResult_ReadResultsAsync_ReadOnlyOnce { get { - return ResourceManager.GetString("ErrorHelper_RequestTimeout", resourceCulture); + return ResourceManager.GetString("DeferredResult_ReadResultsAsync_ReadOnlyOnce", resourceCulture); } } - /// - /// Looks up a localized string similar to The specified root type `{0}` is not supported by this server.. - /// - internal static string ErrorHelper_RootTypeNotFound_Message { + internal static string ErrorHelper_ArgumentNonNullError_Message { get { - return ResourceManager.GetString("ErrorHelper_RootTypeNotFound_Message", resourceCulture); + return ResourceManager.GetString("ErrorHelper_ArgumentNonNullError_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Either no compiled operation was found or the variables have not been coerced.. - /// - internal static string ErrorHelper_StateInvalidForOperationExecution_Message { + internal static string ErrorHelper_UnableToResolveTheAbstractType_Message { get { - return ResourceManager.GetString("ErrorHelper_StateInvalidForOperationExecution_Message", resourceCulture); + return ResourceManager.GetString("ErrorHelper_UnableToResolveTheAbstractType_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Either no query document exists or the document validation result is invalid.. - /// - internal static string ErrorHelper_StateInvalidForOperationResolver_Message { + internal static string ErrorHelper_ListValueIsNotSupported_Message { get { - return ResourceManager.GetString("ErrorHelper_StateInvalidForOperationResolver_Message", resourceCulture); + return ResourceManager.GetString("ErrorHelper_ListValueIsNotSupported_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to There is no operation on the context which can be used to coerce variables.. - /// - internal static string ErrorHelper_StateInvalidForOperationVariableCoercion_Message { + internal static string ErrorHelper_UnexpectedValueCompletionError_Message { get { - return ResourceManager.GetString("ErrorHelper_StateInvalidForOperationVariableCoercion_Message", resourceCulture); + return ResourceManager.GetString("ErrorHelper_UnexpectedValueCompletionError_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Unable to resolve the abstract type `{0}`.. - /// - internal static string ErrorHelper_UnableToResolveTheAbstractType_Message { + internal static string ErrorHelper_RootTypeNotFound_Message { get { - return ResourceManager.GetString("ErrorHelper_UnableToResolveTheAbstractType_Message", resourceCulture); + return ResourceManager.GetString("ErrorHelper_RootTypeNotFound_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Unexpected error during value completion.. - /// - internal static string ErrorHelper_UnexpectedValueCompletionError_Message { + internal static string ErrorHelper_StateInvalidForOperationResolver_Message { get { - return ResourceManager.GetString("ErrorHelper_UnexpectedValueCompletionError_Message", resourceCulture); + return ResourceManager.GetString("ErrorHelper_StateInvalidForOperationResolver_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Could not resolve the actual object type from `{0}` for the abstract type `{1}`.. - /// - internal static string ErrorHelper_ValueCompletion_CouldNotResolveAbstractType_Message { + internal static string ErrorHelper_StateInvalidForOperationVariableCoercion_Message { get { - return ResourceManager.GetString("ErrorHelper_ValueCompletion_CouldNotResolveAbstractType_Message", resourceCulture); + return ResourceManager.GetString("ErrorHelper_StateInvalidForOperationVariableCoercion_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to The query cannot be null or empty.. - /// - internal static string ExecutionRequestExecutorExtensions_ExecuteAsync_QueryCannotBeNullOrEmpty { + internal static string ErrorHelper_StateInvalidForOperationExecution_Message { get { - return ResourceManager.GetString("ExecutionRequestExecutorExtensions_ExecuteAsync_QueryCannotBeNullOrEmpty", resourceCulture); + return ResourceManager.GetString("ErrorHelper_StateInvalidForOperationExecution_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Only query results are supported.. - /// - internal static string ExecutionResultExtensions_OnlyQueryResults { + internal static string ErrorHelper_ValueCompletion_CouldNotResolveAbstractType_Message { get { - return ResourceManager.GetString("ExecutionResultExtensions_OnlyQueryResults", resourceCulture); + return ResourceManager.GetString("ErrorHelper_ValueCompletion_CouldNotResolveAbstractType_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to There is no argument with the name `{0}`.. - /// - internal static string MiddlewareContext_ReplaceArgument_InvalidKey { + internal static string ThrowHelper_VariableIsNotAnInputType_Message { get { - return ResourceManager.GetString("MiddlewareContext_ReplaceArgument_InvalidKey", resourceCulture); + return ResourceManager.GetString("ThrowHelper_VariableIsNotAnInputType_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to It is not allowed to replace the arguments with null.. - /// - internal static string MiddlewareContext_ReplaceArguments_NullNotAllowed { + internal static string ThrowHelper_NonNullVariableIsNull_Message { get { - return ResourceManager.GetString("MiddlewareContext_ReplaceArguments_NullNotAllowed", resourceCulture); + return ResourceManager.GetString("ThrowHelper_NonNullVariableIsNull_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Buffer is full.. - /// - internal static string ObjectBuffer_IsEmpty { + internal static string ThrowHelper_VariableValueInvalidType_Message { get { - return ResourceManager.GetString("ObjectBuffer_IsEmpty", resourceCulture); + return ResourceManager.GetString("ThrowHelper_VariableValueInvalidType_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Buffer is used up.. - /// - internal static string ObjectBuffer_IsUsedUp { + internal static string ThrowHelper_VariableNotFound_Message { get { - return ResourceManager.GetString("ObjectBuffer_IsUsedUp", resourceCulture); + return ResourceManager.GetString("ThrowHelper_VariableNotFound_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to The specified selection does not have a selection set.. - /// - internal static string Operation_GetPossibleTypes_NoSelectionSet { + internal static string ThrowHelper_VariableNotOfType_Message { get { - return ResourceManager.GetString("Operation_GetPossibleTypes_NoSelectionSet", resourceCulture); + return ResourceManager.GetString("ThrowHelper_VariableNotOfType_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to The operation selection set is empty.. - /// - internal static string OperationCompiler_Compile_SelectionSetIsEmpty { + internal static string ThrowHelper_RootTypeNotSupported_Message { get { - return ResourceManager.GetString("OperationCompiler_Compile_SelectionSetIsEmpty", resourceCulture); + return ResourceManager.GetString("ThrowHelper_RootTypeNotSupported_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to The document did not contain a fragment definition with the name `{0}`.. - /// - internal static string OperationCompiler_FragmentNotFound { + internal static string ThrowHelper_SubscriptionExecutor_ContextInvalidState_Message { get { - return ResourceManager.GetString("OperationCompiler_FragmentNotFound", resourceCulture); + return ResourceManager.GetString("ThrowHelper_SubscriptionExecutor_ContextInvalidState_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to The operation compiler only allows for 64 unique include conditions.. - /// - internal static string OperationCompiler_ToManyIncludeConditions { + internal static string ThrowHelper_SubscriptionExecutor_SubscriptionsMustHaveOneField_Message { get { - return ResourceManager.GetString("OperationCompiler_ToManyIncludeConditions", resourceCulture); + return ResourceManager.GetString("ThrowHelper_SubscriptionExecutor_SubscriptionsMustHaveOneField_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to The query type could not be casted to {0}.. - /// - internal static string OperationContext_GetQueryRoot_InvalidCast { + internal static string ThrowHelper_SubscriptionExecutor_NoSubscribeResolver_Message { get { - return ResourceManager.GetString("OperationContext_GetQueryRoot_InvalidCast", resourceCulture); + return ResourceManager.GetString("ThrowHelper_SubscriptionExecutor_NoSubscribeResolver_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to The selection is read-only.. - /// - internal static string PreparedSelection_ReadOnly { + internal static string ThrowHelper_ResolverContext_LiteralsNotSupported_Message { get { - return ResourceManager.GetString("PreparedSelection_ReadOnly", resourceCulture); + return ResourceManager.GetString("ThrowHelper_ResolverContext_LiteralsNotSupported_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Invalid fragment id.. - /// - internal static string QueryPlan_InvalidFragmentId { + internal static string ThrowHelper_ResolverContext_CannotConvertArgument_Message { get { - return ResourceManager.GetString("QueryPlan_InvalidFragmentId", resourceCulture); + return ResourceManager.GetString("ThrowHelper_ResolverContext_CannotConvertArgument_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to The specified convention type is not supported.. - /// - internal static string RequestExecutorBuilder_Convention_NotSupported { + internal static string ThrowHelper_ResolverContext_LiteralNotCompatible_Message { get { - return ResourceManager.GetString("RequestExecutorBuilder_Convention_NotSupported", resourceCulture); + return ResourceManager.GetString("ThrowHelper_ResolverContext_LiteralNotCompatible_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Its not allowed to set `items` and `data` at the same time.. - /// - internal static string ResultBuilder_DataAndItemsNotAllowed { + internal static string ThrowHelper_ResolverContext_ArgumentDoesNotExist_Message { get { - return ResourceManager.GetString("ResultBuilder_DataAndItemsNotAllowed", resourceCulture); + return ResourceManager.GetString("ThrowHelper_ResolverContext_ArgumentDoesNotExist_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to A GraphQL result must have data, errors or both.. - /// - internal static string ResultHelper_BuildResult_InvalidResult { + internal static string ThrowHelper_OperationResolverHelper_NoOperationFound_Message { get { - return ResourceManager.GetString("ResultHelper_BuildResult_InvalidResult", resourceCulture); + return ResourceManager.GetString("ThrowHelper_OperationResolverHelper_NoOperationFound_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Unable to create the operation type `{0}` instance. Try adding the following service: `services.AddScoped<{1}>();`. - /// - internal static string RootValueResolver_Resolve_CannotCreateInstance { + internal static string ThrowHelper_OperationResolverHelper_MultipleOperation_Message { get { - return ResourceManager.GetString("RootValueResolver_Resolve_CannotCreateInstance", resourceCulture); + return ResourceManager.GetString("ThrowHelper_OperationResolverHelper_MultipleOperation_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to The provided response name must be the same as on the selection.. - /// - internal static string SelectionSetOptimizerContext_AddSelection_ResponseNameNotTheSame { + internal static string ThrowHelper_OperationResolverHelper_InvalidOperationName_Message { get { - return ResourceManager.GetString("SelectionSetOptimizerContext_AddSelection_ResponseNameNotTheSame", resourceCulture); + return ResourceManager.GetString("ThrowHelper_OperationResolverHelper_InvalidOperationName_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to The `{0}` is not a valid GraphQL field name.. - /// - internal static string SelectionSetOptimizerContext_InvalidFieldName { + internal static string ThrowHelper_BatchExecutor_CannotSerializeVariable_Message { get { - return ResourceManager.GetString("SelectionSetOptimizerContext_InvalidFieldName", resourceCulture); + return ResourceManager.GetString("ThrowHelper_BatchExecutor_CannotSerializeVariable_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to This SelectionVariants instance is read-only.. - /// - internal static string SelectionVariants_ReadOnly { + internal static string ThrowHelper_CollectVariablesVisitor_NoCompatibleType_Message { get { - return ResourceManager.GetString("SelectionVariants_ReadOnly", resourceCulture); + return ResourceManager.GetString("ThrowHelper_CollectVariablesVisitor_NoCompatibleType_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to The specified type `{0}` is not a possible type to this selection set.. - /// - internal static string SelectionVariants_TypeContextInvalid { + internal static string ThrowHelper_FieldVisibility_ValueNotSupported_Message { get { - return ResourceManager.GetString("SelectionVariants_TypeContextInvalid", resourceCulture); + return ResourceManager.GetString("ThrowHelper_FieldVisibility_ValueNotSupported_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Could not serialize the specified variable `{0}`.. - /// - internal static string ThrowHelper_BatchExecutor_CannotSerializeVariable_Message { + internal static string ThrowHelper_QueryCompiler_CompositeTypeSelectionSet_Message { get { - return ResourceManager.GetString("ThrowHelper_BatchExecutor_CannotSerializeVariable_Message", resourceCulture); + return ResourceManager.GetString("ThrowHelper_QueryCompiler_CompositeTypeSelectionSet_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Unable to find a compatible input type for the exported object type.. - /// - internal static string ThrowHelper_CollectVariablesVisitor_NoCompatibleType_Message { + internal static string ThrowHelper_OperationExecutionMiddleware_NoBatchDispatcher_Message { get { - return ResourceManager.GetString("ThrowHelper_CollectVariablesVisitor_NoCompatibleType_Message", resourceCulture); + return ResourceManager.GetString("ThrowHelper_OperationExecutionMiddleware_NoBatchDispatcher_Message", resourceCulture); } } - /// - /// Looks up a localized string similar to Field `{0}` does not exist on type `{1}`.. - /// - internal static string ThrowHelper_FieldDoesNotExistOnType { + internal static string OperationCompiler_Compile_SelectionSetIsEmpty { get { - return ResourceManager.GetString("ThrowHelper_FieldDoesNotExistOnType", resourceCulture); + return ResourceManager.GetString("OperationCompiler_Compile_SelectionSetIsEmpty", resourceCulture); } } - /// - /// Looks up a localized string similar to The skip/include if-argument value has to be a 'Boolean'.. - /// - internal static string ThrowHelper_FieldVisibility_ValueNotSupported_Message { + internal static string ExecutionRequestExecutorExtensions_ExecuteAsync_QueryCannotBeNullOrEmpty { get { - return ResourceManager.GetString("ThrowHelper_FieldVisibility_ValueNotSupported_Message", resourceCulture); + return ResourceManager.GetString("ExecutionRequestExecutorExtensions_ExecuteAsync_QueryCannotBeNullOrEmpty", resourceCulture); } } - /// - /// Looks up a localized string similar to The {0} only supports formatting `IQueryResult`.. - /// - internal static string ThrowHelper_JsonFormatter_ResultNotSupported { + internal static string RequestExecutorBuilder_Convention_NotSupported { get { - return ResourceManager.GetString("ThrowHelper_JsonFormatter_ResultNotSupported", resourceCulture); + return ResourceManager.GetString("RequestExecutorBuilder_Convention_NotSupported", resourceCulture); } } - /// - /// Looks up a localized string similar to Variable `{0}` is required.. - /// - internal static string ThrowHelper_NonNullVariableIsNull_Message { + internal static string RootValueResolver_Resolve_CannotCreateInstance { get { - return ResourceManager.GetString("ThrowHelper_NonNullVariableIsNull_Message", resourceCulture); + return ResourceManager.GetString("RootValueResolver_Resolve_CannotCreateInstance", resourceCulture); } } - /// - /// Looks up a localized string similar to Value for OneOf field {0} must be non-null.. - /// - internal static string ThrowHelper_OneOfFieldMustBeNonNull { + internal static string OperationContext_GetQueryRoot_InvalidCast { get { - return ResourceManager.GetString("ThrowHelper_OneOfFieldMustBeNonNull", resourceCulture); + return ResourceManager.GetString("OperationContext_GetQueryRoot_InvalidCast", resourceCulture); } } - /// - /// Looks up a localized string similar to The specified selection does not have a selection set.. - /// - internal static string ThrowHelper_Operation_NoSelectionSet { + internal static string ErrorHelper_RequestTimeout { get { - return ResourceManager.GetString("ThrowHelper_Operation_NoSelectionSet", resourceCulture); + return ResourceManager.GetString("ErrorHelper_RequestTimeout", resourceCulture); } } - /// - /// Looks up a localized string similar to Make sure that you have registered an IBatchDispatcher with your scoped request services.. - /// - internal static string ThrowHelper_OperationExecutionMiddleware_NoBatchDispatcher_Message { + internal static string ResultHelper_BuildResult_InvalidResult { get { - return ResourceManager.GetString("ThrowHelper_OperationExecutionMiddleware_NoBatchDispatcher_Message", resourceCulture); + return ResourceManager.GetString("ResultHelper_BuildResult_InvalidResult", resourceCulture); } } - /// - /// Looks up a localized string similar to The specified operation `{0}` cannot be found.. - /// - internal static string ThrowHelper_OperationResolverHelper_InvalidOperationName_Message { + internal static string BatchExecutionTask_AddExecutionTask_SerialTasksNotAllowed { get { - return ResourceManager.GetString("ThrowHelper_OperationResolverHelper_InvalidOperationName_Message", resourceCulture); + return ResourceManager.GetString("BatchExecutionTask_AddExecutionTask_SerialTasksNotAllowed", resourceCulture); } } - /// - /// Looks up a localized string similar to The operation name can only be omitted if there is just one operation in a GraphQL document.. - /// - internal static string ThrowHelper_OperationResolverHelper_MultipleOperation_Message { + internal static string QueryPlan_InvalidFragmentId { get { - return ResourceManager.GetString("ThrowHelper_OperationResolverHelper_MultipleOperation_Message", resourceCulture); + return ResourceManager.GetString("QueryPlan_InvalidFragmentId", resourceCulture); } } - /// - /// Looks up a localized string similar to There are no operations in the GraphQL document.. - /// - internal static string ThrowHelper_OperationResolverHelper_NoOperationFound_Message { + internal static string WorkBacklog_NotFullyInitialized { get { - return ResourceManager.GetString("ThrowHelper_OperationResolverHelper_NoOperationFound_Message", resourceCulture); + return ResourceManager.GetString("WorkBacklog_NotFullyInitialized", resourceCulture); } } - /// - /// Looks up a localized string similar to A composite type always needs to specify a selection set.. - /// - internal static string ThrowHelper_QueryCompiler_CompositeTypeSelectionSet_Message { + internal static string ThrowHelper_ResolverContext_CannotCastParent { get { - return ResourceManager.GetString("ThrowHelper_QueryCompiler_CompositeTypeSelectionSet_Message", resourceCulture); + return ResourceManager.GetString("ThrowHelper_ResolverContext_CannotCastParent", resourceCulture); } } - /// - /// Looks up a localized string similar to There was no argument with the name `{0}` found on the field `{1}`.. - /// - internal static string ThrowHelper_ResolverContext_ArgumentDoesNotExist_Message { + internal static string ExecutionResultExtensions_OnlyQueryResults { get { - return ResourceManager.GetString("ThrowHelper_ResolverContext_ArgumentDoesNotExist_Message", resourceCulture); + return ResourceManager.GetString("ExecutionResultExtensions_OnlyQueryResults", resourceCulture); } } - /// - /// Looks up a localized string similar to The resolver parent type of field `{0}` is `{1}` but the resolver requested the type `{2}`. The resolver was unable to cast the parent type to the requested type.. - /// - internal static string ThrowHelper_ResolverContext_CannotCastParent { + internal static string SelectionVariants_ReadOnly { get { - return ResourceManager.GetString("ThrowHelper_ResolverContext_CannotCastParent", resourceCulture); + return ResourceManager.GetString("SelectionVariants_ReadOnly", resourceCulture); } } - /// - /// Looks up a localized string similar to Unable to convert the value of the argument `{0}` to `{1}`. Check if the requested type is correct or register a custom type converter.. - /// - internal static string ThrowHelper_ResolverContext_CannotConvertArgument_Message { + internal static string OperationCompiler_FragmentNotFound { get { - return ResourceManager.GetString("ThrowHelper_ResolverContext_CannotConvertArgument_Message", resourceCulture); + return ResourceManager.GetString("OperationCompiler_FragmentNotFound", resourceCulture); } } - /// - /// Looks up a localized string similar to The argument literal representation is `{0}` which is not compatible with the request literal type `{1}`.. - /// - internal static string ThrowHelper_ResolverContext_LiteralNotCompatible_Message { + internal static string SelectionSetOptimizerContext_InvalidFieldName { get { - return ResourceManager.GetString("ThrowHelper_ResolverContext_LiteralNotCompatible_Message", resourceCulture); + return ResourceManager.GetString("SelectionSetOptimizerContext_InvalidFieldName", resourceCulture); } } - /// - /// Looks up a localized string similar to The ArgumentValue method on the resolver context only allows for runtime values. If you want to retrieve the argument value as GraphQL literal use the ArgumentLiteral method instead.. - /// - internal static string ThrowHelper_ResolverContext_LiteralsNotSupported_Message { + internal static string OperationCompiler_ToManyIncludeConditions { get { - return ResourceManager.GetString("ThrowHelper_ResolverContext_LiteralsNotSupported_Message", resourceCulture); + return ResourceManager.GetString("OperationCompiler_ToManyIncludeConditions", resourceCulture); } } - /// - /// Looks up a localized string similar to The root type `{0}` is not supported.. - /// - internal static string ThrowHelper_RootTypeNotSupported_Message { + internal static string SelectionVariants_TypeContextInvalid { get { - return ResourceManager.GetString("ThrowHelper_RootTypeNotSupported_Message", resourceCulture); + return ResourceManager.GetString("SelectionVariants_TypeContextInvalid", resourceCulture); } } - /// - /// Looks up a localized string similar to The type {0} was already added.. - /// internal static string ThrowHelper_SelectionSet_TypeAlreadyAdded { get { return ResourceManager.GetString("ThrowHelper_SelectionSet_TypeAlreadyAdded", resourceCulture); } } - /// - /// Looks up a localized string similar to The request context is in an invalid state for subscriptions.. - /// - internal static string ThrowHelper_SubscriptionExecutor_ContextInvalidState_Message { + internal static string ThrowHelper_OneOfFieldMustBeNonNull { get { - return ResourceManager.GetString("ThrowHelper_SubscriptionExecutor_ContextInvalidState_Message", resourceCulture); + return ResourceManager.GetString("ThrowHelper_OneOfFieldMustBeNonNull", resourceCulture); } } - /// - /// Looks up a localized string similar to You must declare a subscribe resolver for subscription fields.. - /// - internal static string ThrowHelper_SubscriptionExecutor_NoSubscribeResolver_Message { + internal static string ThrowHelper_Operation_NoSelectionSet { get { - return ResourceManager.GetString("ThrowHelper_SubscriptionExecutor_NoSubscribeResolver_Message", resourceCulture); + return ResourceManager.GetString("ThrowHelper_Operation_NoSelectionSet", resourceCulture); } } - /// - /// Looks up a localized string similar to Subscription queries must have exactly one root field.. - /// - internal static string ThrowHelper_SubscriptionExecutor_SubscriptionsMustHaveOneField_Message { + internal static string ThrowHelper_JsonFormatter_ResultNotSupported { get { - return ResourceManager.GetString("ThrowHelper_SubscriptionExecutor_SubscriptionsMustHaveOneField_Message", resourceCulture); + return ResourceManager.GetString("ThrowHelper_JsonFormatter_ResultNotSupported", resourceCulture); } } - /// - /// Looks up a localized string similar to Variable `{0}` is not an input type.. - /// - internal static string ThrowHelper_VariableIsNotAnInputType_Message { + internal static string ResultBuilder_DataAndItemsNotAllowed { get { - return ResourceManager.GetString("ThrowHelper_VariableIsNotAnInputType_Message", resourceCulture); + return ResourceManager.GetString("ResultBuilder_DataAndItemsNotAllowed", resourceCulture); } } - /// - /// Looks up a localized string similar to The variable with the name `{0}` does not exist.. - /// - internal static string ThrowHelper_VariableNotFound_Message { + internal static string MiddlewareContext_ReplaceArgument_InvalidKey { get { - return ResourceManager.GetString("ThrowHelper_VariableNotFound_Message", resourceCulture); + return ResourceManager.GetString("MiddlewareContext_ReplaceArgument_InvalidKey", resourceCulture); } } - /// - /// Looks up a localized string similar to The variable with the name `{0}` is not of the requested type `{1}`.. - /// - internal static string ThrowHelper_VariableNotOfType_Message { + internal static string VariableValueOrLiteral_NullNotAllowed { get { - return ResourceManager.GetString("ThrowHelper_VariableNotOfType_Message", resourceCulture); + return ResourceManager.GetString("VariableValueOrLiteral_NullNotAllowed", resourceCulture); } } - /// - /// Looks up a localized string similar to Variable `{0}` got an invalid value.. - /// - internal static string ThrowHelper_VariableValueInvalidType_Message { + internal static string Operation_GetPossibleTypes_NoSelectionSet { get { - return ResourceManager.GetString("ThrowHelper_VariableValueInvalidType_Message", resourceCulture); + return ResourceManager.GetString("Operation_GetPossibleTypes_NoSelectionSet", resourceCulture); } } - /// - /// Looks up a localized string similar to The runtime value can only be null if the literal is also null.. - /// - internal static string VariableValueOrLiteral_NullNotAllowed { + internal static string MiddlewareContext_ReplaceArguments_NullNotAllowed { get { - return ResourceManager.GetString("VariableValueOrLiteral_NullNotAllowed", resourceCulture); + return ResourceManager.GetString("MiddlewareContext_ReplaceArguments_NullNotAllowed", resourceCulture); } } - /// - /// Looks up a localized string similar to The WorkBacklog is not fully initialized.. - /// - internal static string WorkBacklog_NotFullyInitialized { + internal static string SelectionSetOptimizerContext_AddSelection_ResponseNameNotTheSame { get { - return ResourceManager.GetString("WorkBacklog_NotFullyInitialized", resourceCulture); + return ResourceManager.GetString("SelectionSetOptimizerContext_AddSelection_ResponseNameNotTheSame", resourceCulture); } } } diff --git a/src/HotChocolate/Core/src/Types/Types/Descriptors/Conventions/DescriptorContext.cs b/src/HotChocolate/Core/src/Types/Types/Descriptors/Conventions/DescriptorContext.cs index 8d3a58a703d..a4eaa83a427 100644 --- a/src/HotChocolate/Core/src/Types/Types/Descriptors/Conventions/DescriptorContext.cs +++ b/src/HotChocolate/Core/src/Types/Types/Descriptors/Conventions/DescriptorContext.cs @@ -267,26 +267,26 @@ private TypeDiscoveryHandler[] CreateTypeDiscoveryHandlers() internal static DescriptorContext Create( IReadOnlySchemaOptions? options = null, - IServiceProvider? services = null, + IServiceProvider? schemaServices = null, IFeatureCollection? features = null, SchemaBuilder.LazySchema? schema = null, TypeInterceptor? typeInterceptor = null) => new DescriptorContext( () => options ??= new SchemaOptions(), - services ?? EmptyServiceProvider.Instance, + schemaServices ?? EmptyServiceProvider.Instance, features ?? new FeatureCollection(), schema ?? new SchemaBuilder.LazySchema(), typeInterceptor ?? new AggregateTypeInterceptor()); internal static DescriptorContext Create( Func options, - IServiceProvider services, + IServiceProvider schemaServices, IFeatureCollection? features = null, SchemaBuilder.LazySchema? schema = null, TypeInterceptor? typeInterceptor = null) => new DescriptorContext( options, - services, + schemaServices, features ?? new FeatureCollection(), schema ?? new SchemaBuilder.LazySchema(), typeInterceptor ?? new AggregateTypeInterceptor()); diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/FusionRequestExecutorManager.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/FusionRequestExecutorManager.cs index 45e2670f7ce..091741d21e4 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/FusionRequestExecutorManager.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/FusionRequestExecutorManager.cs @@ -560,7 +560,7 @@ private sealed class SchemaDefinitionAccessor public FusionSchemaDefinition Schema { get; set; } = null!; } - public sealed class RequestExecutorRegistration : IAsyncDisposable + private sealed class RequestExecutorRegistration : IAsyncDisposable { private readonly CancellationTokenSource _cancellationTokenSource = new(); private readonly CancellationToken _cancellationToken; From 1b44d4591dd370b4ac4fcff484268f6739fe101b Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 5 Dec 2025 19:20:19 +0100 Subject: [PATCH 027/144] wip --- .../Pipeline/OperationResolverMiddleware.cs | 8 +- .../Processing/MiddlewareContext.Global.cs | 17 +-- .../Execution/Processing/OperationCompiler.cs | 26 ++-- .../Extensions/ResolverContextExtensions.cs | 16 +- ...cMethod_Await_Return_ApplicationError.json | 6 - ...ncMethod_Await_Throw_ApplicationError.json | 6 - ...yncMethod_Await_Throw_UnexpectedError.json | 6 - ...ethod_NoAwait_Return_ApplicationError.json | 6 - ...Method_NoAwait_Throw_ApplicationError.json | 6 - ...cMethod_NoAwait_Throw_UnexpectedError.json | 6 - ...haviorTests.Error_Filter_Adds_Details.json | 6 - ...viorTests.Error_On_NonNull_Root_Field.json | 6 - ...ests.Property_Return_ApplicationError.json | 6 - ...Tests.Property_Throw_ApplicationError.json | 6 - ...rTests.Property_Throw_UnexpectedError.json | 6 - ...ts.SyncMethod_Return_ApplicationError.json | 6 - ...sts.SyncMethod_Throw_ApplicationError.json | 6 - ...ests.SyncMethod_Throw_UnexpectedError.json | 6 - ...ErrorHandlerTests.AddClassErrorFilter.json | 6 - ...ViaServiceExtensions_ErrorFilterWorks.json | 6 - ...ViaServiceExtensions_ErrorFilterWorks.json | 6 - ...rTests.AddClassErrorFilterWithFactory.json | 6 - ...ViaServiceExtensions_ErrorFilterWorks.json | 6 - .../ErrorHandlerTests.AddFuncErrorFilter.json | 6 - ...dlerTests.FilterOnlyNullRefExceptions.json | 12 -- ...ests.ReportAggregateError_In_Resolver.json | 12 -- ...ests.UseAggregateError_In_ErrorFilter.json | 12 -- ...HasError_nonnull_list_nonnull_element.json | 6 - ...asError_nonnull_list_nullable_element.json | 6 - ...asError_nullable_list_nonnull_element.json | 6 - ...sError_nullable_list_nullable_element.json | 6 - ...ntIsNull_nonnull_list_nonnull_element.json | 6 - ...tIsNull_nonnull_list_nullable_element.json | 6 - ...tIsNull_nullable_list_nonnull_element.json | 6 - ...IsNull_nullable_list_nullable_element.json | 6 - ...t_NonNullElementHasError_nonnull_prop.json | 6 - ..._NonNullElementHasError_nullable_prop.json | 6 - ...ect_NonNullElementIsNull_nonnull_prop.json | 6 - ...ct_NonNullElementIsNull_nullable_prop.json | 6 - ...ld_ThrowException_When_NotADataLoader.snap | 2 +- ..._To_NonNullArgument_With_DefaultValue.snap | 8 +- .../StarWarsCodeFirstTests.cs | 66 ++++---- .../Processing/OperationCompilerTests.cs | 144 ++++-------------- ...iables_Fails_When_Variable_Not_Exists.snap | 6 - ...s_Delegate_ReplaceWithNull_ShouldFail.snap | 6 - ...sure_Errors_Do_Not_Result_In_Timeouts.snap | 8 +- ...OutputType_ClrValue_CannotBeConverted.snap | 8 +- ...ts.OutputType_ClrValue_CannotBeParsed.snap | 6 - ...t_Item_Returns_Null_Should_Error_Item.snap | 6 - ...m_Throwing_Should_Null_And_Error_Item.snap | 12 -- ...Object_List_Returns_Null_Should_Error.snap | 6 - ..._List_Throwing_Should_Null_FAnd_Error.snap | 6 - ...sync_Object_Returns_Null_Should_Error.snap | 6 - ...Object_Throwing_Should_Null_And_Error.snap | 6 - ...t_Item_Returns_Null_Should_Error_Item.snap | 6 - ...m_Throwing_Should_Null_And_Error_Item.snap | 12 -- ...Scalar_List_Returns_Null_Should_Error.snap | 6 - ...r_List_Throwing_Should_Null_And_Error.snap | 6 - ...sync_Scalar_Returns_Null_Should_Error.snap | 6 - ...Scalar_Throwing_Should_Null_And_Error.snap | 6 - ...t_Item_Returns_Null_Should_Error_Item.snap | 6 - ...m_Throwing_Should_Null_And_Error_Item.snap | 12 -- ...Object_List_Returns_Null_Should_Error.snap | 6 - ..._List_Throwing_Should_Null_FAnd_Error.snap | 6 - ...Pure_Object_Returns_Null_Should_Error.snap | 6 - ...Object_Throwing_Should_Null_And_Error.snap | 6 - ...ner_Return_Null_Should_Null_And_Error.snap | 12 -- ...le_Returns_Null_Should_Null_And_Error.snap | 6 - ...t_Item_Returns_Null_Should_Error_Item.snap | 6 - ...m_Throwing_Should_Null_And_Error_Item.snap | 12 -- ...Scalar_List_Returns_Null_Should_Error.snap | 6 - ...r_List_Throwing_Should_Null_And_Error.snap | 6 - ...Pure_Scalar_Returns_Null_Should_Error.snap | 6 - ...Scalar_Throwing_Should_Null_And_Error.snap | 6 - ...ticNonNullTests.Query_With_Connection.snap | 6 - ...SchemaBuilderExtensions.Resolvers.Tests.cs | 10 +- .../Descriptors/ArgumentDescriptorTests.cs | 2 +- .../DirectiveArgumentDescriptorTests.cs | 2 +- .../Descriptors/InputFieldDescriptorTests.cs | 2 +- .../InterfaceFieldDescriptorTests.cs | 2 +- .../Descriptors/ObjectFieldDescriptorTests.cs | 2 +- .../Types.Tests/Types/DirectiveTypeTests.cs | 2 +- .../Types.Tests/Types/InputObjectTypeTests.cs | 6 +- .../Types.Tests/Types/InterfaceTypeTests.cs | 2 +- .../test/Types.Tests/Types/ObjectTypeTests.cs | 2 +- .../Execution/Nodes/OperationCompiler.cs | 2 +- 86 files changed, 116 insertions(+), 659 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs index 0a301750db7..d67c0373e4d 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs @@ -1,6 +1,5 @@ using HotChocolate.Execution.Instrumentation; using HotChocolate.Execution.Processing; -using HotChocolate.Fusion.Rewriters; using static HotChocolate.Execution.ErrorHelper; namespace HotChocolate.Execution.Pipeline; @@ -40,14 +39,11 @@ public async ValueTask InvokeAsync(RequestContext context) { using (_diagnosticEvents.CompileOperation(context)) { - var operationName = context.Request.OperationName; - var operationDocument = documentInfo.Document; - var operationNode = operationDocument.GetOperation(operationName); - operation = _operationPlanner.Compile( operationId ?? Guid.NewGuid().ToString("N"), documentInfo.Hash.Value, - operationNode); + context.Request.OperationName, + documentInfo.Document); context.SetOperation(operation); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs index d1ba41b2545..e6dbd0f01c9 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs @@ -49,7 +49,6 @@ public void ReportError(string errorMessage) ErrorBuilder.New() .SetMessage(errorMessage) .SetPath(Path) - .AddLocations(_selection) .Build()); } @@ -75,8 +74,7 @@ public void ReportError(Exception exception, Action? configure = n { var errorBuilder = ErrorBuilder .FromException(exception) - .SetPath(Path) - .AddLocations(_selection); + .SetPath(Path); configure?.Invoke(errorBuilder); @@ -291,16 +289,3 @@ c is null s))); } } - -file static class Extensions -{ - public static ErrorBuilder AddLocations(this ErrorBuilder errorBuilder, Selection selection) - { - foreach (var (node, _) in selection.SyntaxNodes) - { - errorBuilder.AddLocation(node); - } - - return errorBuilder; - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index e417997b6ae..5448655c3ae 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -36,14 +36,22 @@ internal OperationCompiler( public static Operation Compile( string id, - OperationDefinitionNode operationDefinition, + DocumentNode document, Schema schema) - => Compile(id, id, operationDefinition, schema); + => Compile(id, id, null, document, schema); + + public static Operation Compile( + string id, + string? operationName, + DocumentNode document, + Schema schema) + => Compile(id, id, operationName, document, schema); public static Operation Compile( string id, string hash, - OperationDefinitionNode operationDefinition, + string? operationName, + DocumentNode document, Schema schema) => new OperationCompiler( schema, @@ -51,20 +59,20 @@ public static Operation Compile( new DefaultObjectPool>>( new DefaultPooledObjectPolicy>>()), new OperationCompilerOptimizers()) - .Compile(id, hash, operationDefinition); + .Compile(id, hash, operationName, document); public Operation Compile( string id, string hash, - OperationDefinitionNode operationDefinition) + string? operationName, + DocumentNode document) { ArgumentException.ThrowIfNullOrWhiteSpace(id); - ArgumentNullException.ThrowIfNull(operationDefinition); + ArgumentNullException.ThrowIfNull(document); // Before we can plan an operation, we must de-fragmentize it and remove static include conditions. - var document = new DocumentNode([operationDefinition]); document = _documentRewriter.RewriteDocument(document); - operationDefinition = (OperationDefinitionNode)document.Definitions[0]; + var operationDefinition = document.GetOperation(operationName); var includeConditions = new IncludeConditionCollection(); IncludeConditionVisitor.Instance.Visit(operationDefinition, includeConditions); @@ -319,7 +327,7 @@ private SelectionSet BuildSelectionSet( compilationContext.Register(selection, selection.Id); selections[i++] = selection; - if (includeFlags.Count > 1) + if (includeFlags.Count > 0) { isConditional = true; } diff --git a/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs b/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs index 9a886885497..2865bfed608 100644 --- a/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Extensions/ResolverContextExtensions.cs @@ -438,7 +438,7 @@ public bool IsSelected(string fieldName) var includeFlags = context.IncludeFlags; var selectionSet = context.Operation.GetSelectionSet(context.Selection, possibleType); - foreach(var selection in selectionSet.Selections) + foreach (var selection in selectionSet.Selections) { if (selection.IsIncluded(includeFlags) && selection.Field.Name.Equals(fieldName)) @@ -453,7 +453,7 @@ public bool IsSelected(string fieldName) var includeFlags = context.IncludeFlags; var selectionSet = context.Operation.GetSelectionSet(context.Selection, (ObjectType)namedType); - foreach(var selection in selectionSet.Selections) + foreach (var selection in selectionSet.Selections) { if (selection.IsIncluded(includeFlags) && selection.Field.Name.Equals(fieldName)) @@ -501,7 +501,7 @@ public bool IsSelected(string fieldName1, string fieldName2) var includeFlags = context.IncludeFlags; var selectionSet = context.Operation.GetSelectionSet(context.Selection, possibleType); - foreach(var selection in selectionSet.Selections) + foreach (var selection in selectionSet.Selections) { if (selection.IsSkipped(includeFlags)) { @@ -520,7 +520,7 @@ public bool IsSelected(string fieldName1, string fieldName2) var includeFlags = context.IncludeFlags; var selectionSet = context.Operation.GetSelectionSet(context.Selection, (ObjectType)namedType); - foreach(var selection in selectionSet.Selections) + foreach (var selection in selectionSet.Selections) { if (selection.IsSkipped(includeFlags)) { @@ -577,7 +577,7 @@ public bool IsSelected(string fieldName1, string fieldName2, string fieldName3) var includeFlags = context.IncludeFlags; var selectionSet = context.Operation.GetSelectionSet(context.Selection, possibleType); - foreach(var selection in selectionSet.Selections) + foreach (var selection in selectionSet.Selections) { if (selection.IsSkipped(includeFlags)) { @@ -598,7 +598,7 @@ public bool IsSelected(string fieldName1, string fieldName2, string fieldName3) var includeFlags = context.IncludeFlags; var selectionSet = context.Operation.GetSelectionSet(context.Selection, (ObjectType)namedType); - foreach(var selection in selectionSet.Selections) + foreach (var selection in selectionSet.Selections) { if (selection.IsSkipped(includeFlags)) { @@ -647,7 +647,7 @@ public bool IsSelected(ISet fieldNames) var includeFlags = context.IncludeFlags; var selectionSet = context.Operation.GetSelectionSet(context.Selection, possibleType); - foreach(var selection in selectionSet.Selections) + foreach (var selection in selectionSet.Selections) { if (selection.IsIncluded(includeFlags) && fieldNames.Contains(selection.Field.Name)) @@ -662,7 +662,7 @@ public bool IsSelected(ISet fieldNames) var includeFlags = context.IncludeFlags; var selectionSet = context.Operation.GetSelectionSet(context.Selection, (ObjectType)namedType); - foreach(var selection in selectionSet.Selections) + foreach (var selection in selectionSet.Selections) { if (selection.IsIncluded(includeFlags) && fieldNames.Contains(selection.Field.Name)) diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Return_ApplicationError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Return_ApplicationError.json index b850c73db2b..6b78593e0be 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Return_ApplicationError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Return_ApplicationError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "query error 6", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error6" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Throw_ApplicationError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Throw_ApplicationError.json index 7b000a4d97e..789fcde3231 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Throw_ApplicationError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Throw_ApplicationError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "query error 4", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error4" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Throw_UnexpectedError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Throw_UnexpectedError.json index afbf6e89d41..4c878b126c4 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Throw_UnexpectedError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_Await_Throw_UnexpectedError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error5" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Return_ApplicationError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Return_ApplicationError.json index fdefe0720fc..7bfbbfb8e89 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Return_ApplicationError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Return_ApplicationError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "query error 3", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error3" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Throw_ApplicationError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Throw_ApplicationError.json index 4e2e87ae3a4..0d87efd2255 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Throw_ApplicationError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Throw_ApplicationError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "query error 1", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error1" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Throw_UnexpectedError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Throw_UnexpectedError.json index d664a0c23c0..3fc814a785f 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Throw_UnexpectedError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.AsyncMethod_NoAwait_Throw_UnexpectedError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error2" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Error_Filter_Adds_Details.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Error_Filter_Adds_Details.json index 1c8564fb675..a23da695a95 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Error_Filter_Adds_Details.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Error_Filter_Adds_Details.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error14" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Error_On_NonNull_Root_Field.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Error_On_NonNull_Root_Field.json index 0e2677a1dae..c556743fc23 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Error_On_NonNull_Root_Field.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Error_On_NonNull_Root_Field.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error15" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Return_ApplicationError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Return_ApplicationError.json index 1e0b49ac42f..96fe813df42 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Return_ApplicationError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Return_ApplicationError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "query error 12", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error12" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Throw_ApplicationError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Throw_ApplicationError.json index 75de3a1df02..37bb2829107 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Throw_ApplicationError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Throw_ApplicationError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "query error 10", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error10" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Throw_UnexpectedError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Throw_UnexpectedError.json index 97b6b55fea8..7d17b7ccf14 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Throw_UnexpectedError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.Property_Throw_UnexpectedError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error11" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Return_ApplicationError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Return_ApplicationError.json index 19eb7bc4683..651f04b8fe5 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Return_ApplicationError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Return_ApplicationError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "query error 9", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error9" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Throw_ApplicationError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Throw_ApplicationError.json index 33700a3ac45..976e35bf402 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Throw_ApplicationError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Throw_ApplicationError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "query error 7", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error7" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Throw_UnexpectedError.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Throw_UnexpectedError.json index c80eaa0aa71..c0c6aa99577 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Throw_UnexpectedError.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorBehaviorTests.SyncMethod_Throw_UnexpectedError.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "error8" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilter.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilter.json index ef697553c2f..4b69180ef2e 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilter.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilter.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterUsingDI_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterUsingDI_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json index 20e2cfaaf20..9a8d330d490 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterUsingDI_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterUsingDI_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterUsingFactory_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterUsingFactory_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json index 20e2cfaaf20..9a8d330d490 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterUsingFactory_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterUsingFactory_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterWithFactory.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterWithFactory.json index ef697553c2f..4b69180ef2e 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterWithFactory.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilterWithFactory.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilter_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilter_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json index 20e2cfaaf20..9a8d330d490 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilter_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddClassErrorFilter_SchemaBuiltViaServiceExtensions_ErrorFilterWorks.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddFuncErrorFilter.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddFuncErrorFilter.json index ef697553c2f..4b69180ef2e 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddFuncErrorFilter.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.AddFuncErrorFilter.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.FilterOnlyNullRefExceptions.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.FilterOnlyNullRefExceptions.json index 8e67f4315f2..4cfef53f3ea 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.FilterOnlyNullRefExceptions.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.FilterOnlyNullRefExceptions.json @@ -2,24 +2,12 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ] }, { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 7 - } - ], "path": [ "bar" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.ReportAggregateError_In_Resolver.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.ReportAggregateError_In_Resolver.json index 8bce9986d95..07034838f59 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.ReportAggregateError_In_Resolver.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.ReportAggregateError_In_Resolver.json @@ -2,24 +2,12 @@ "errors": [ { "message": "abc", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ] }, { "message": "def", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.UseAggregateError_In_ErrorFilter.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.UseAggregateError_In_ErrorFilter.json index 550bc931dd5..a0f0b7e4f95 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.UseAggregateError_In_ErrorFilter.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/ErrorHandlerTests.UseAggregateError_In_ErrorFilter.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ], @@ -17,12 +11,6 @@ }, { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nonnull_list_nonnull_element.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nonnull_list_nonnull_element.json index 40a93880bd1..d12e8f2d757 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nonnull_list_nonnull_element.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nonnull_list_nonnull_element.json @@ -2,12 +2,6 @@ "errors": [ { "message": "ERROR", - "locations": [ - { - "line": 1, - "column": 40 - } - ], "path": [ "foo", "nonnull_list_nonnull_element", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nonnull_list_nullable_element.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nonnull_list_nullable_element.json index 31644d0b788..af36a82c07b 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nonnull_list_nullable_element.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nonnull_list_nullable_element.json @@ -2,12 +2,6 @@ "errors": [ { "message": "ERROR", - "locations": [ - { - "line": 1, - "column": 41 - } - ], "path": [ "foo", "nonnull_list_nullable_element", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nullable_list_nonnull_element.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nullable_list_nonnull_element.json index 2329e540d0f..265459aee68 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nullable_list_nonnull_element.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nullable_list_nonnull_element.json @@ -2,12 +2,6 @@ "errors": [ { "message": "ERROR", - "locations": [ - { - "line": 1, - "column": 41 - } - ], "path": [ "foo", "nullable_list_nonnull_element", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nullable_list_nullable_element.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nullable_list_nullable_element.json index 9575ba78887..3a8291a85f3 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nullable_list_nullable_element.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementHasError_nullable_list_nullable_element.json @@ -2,12 +2,6 @@ "errors": [ { "message": "ERROR", - "locations": [ - { - "line": 1, - "column": 42 - } - ], "path": [ "foo", "nullable_list_nullable_element", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nonnull_list_nonnull_element.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nonnull_list_nonnull_element.json index 431b16bef0c..353787c469a 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nonnull_list_nonnull_element.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nonnull_list_nonnull_element.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for non-nullable field.", - "locations": [ - { - "line": 1, - "column": 40 - } - ], "path": [ "foo", "nonnull_list_nonnull_element", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nonnull_list_nullable_element.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nonnull_list_nullable_element.json index 6befba572a7..c2a87772b88 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nonnull_list_nullable_element.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nonnull_list_nullable_element.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for non-nullable field.", - "locations": [ - { - "line": 1, - "column": 41 - } - ], "path": [ "foo", "nonnull_list_nullable_element", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nullable_list_nonnull_element.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nullable_list_nonnull_element.json index cb65fd9194d..12fd757bf13 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nullable_list_nonnull_element.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nullable_list_nonnull_element.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for non-nullable field.", - "locations": [ - { - "line": 1, - "column": 41 - } - ], "path": [ "foo", "nullable_list_nonnull_element", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nullable_list_nullable_element.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nullable_list_nullable_element.json index 1cb53765ff2..82339e96531 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nullable_list_nullable_element.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.List_NonNullElementIsNull_nullable_list_nullable_element.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for non-nullable field.", - "locations": [ - { - "line": 1, - "column": 42 - } - ], "path": [ "foo", "nullable_list_nullable_element", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementHasError_nonnull_prop.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementHasError_nonnull_prop.json index 40d979abf24..2de6c622f64 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementHasError_nonnull_prop.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementHasError_nonnull_prop.json @@ -2,12 +2,6 @@ "errors": [ { "message": "ERROR", - "locations": [ - { - "line": 1, - "column": 24 - } - ], "path": [ "foo", "nonnull_prop", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementHasError_nullable_prop.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementHasError_nullable_prop.json index ee6b4a00fa1..fca3c8ee191 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementHasError_nullable_prop.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementHasError_nullable_prop.json @@ -2,12 +2,6 @@ "errors": [ { "message": "ERROR", - "locations": [ - { - "line": 1, - "column": 25 - } - ], "path": [ "foo", "nullable_prop", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementIsNull_nonnull_prop.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementIsNull_nonnull_prop.json index add4b91ff56..1a5bb81281e 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementIsNull_nonnull_prop.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementIsNull_nonnull_prop.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for non-nullable field.", - "locations": [ - { - "line": 1, - "column": 24 - } - ], "path": [ "foo", "nonnull_prop", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementIsNull_nullable_prop.json b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementIsNull_nullable_prop.json index 77c93273c7d..ec5ad8f3cb9 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementIsNull_nullable_prop.json +++ b/src/HotChocolate/Core/test/Execution.Tests/Errors/__snapshots__/NullErrorPropagationTests.Object_NonNullElementIsNull_nullable_prop.json @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for non-nullable field.", - "locations": [ - { - "line": 1, - "column": 25 - } - ], "path": [ "foo", "nullable_prop", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/__snapshots__/UseDataLoaderTests.UseDataLoader_Should_ThrowException_When_NotADataLoader.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/__snapshots__/UseDataLoaderTests.UseDataLoader_Should_ThrowException_When_NotADataLoader.snap index f8943c78f19..31655be4474 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/__snapshots__/UseDataLoaderTests.UseDataLoader_Should_ThrowException_When_NotADataLoader.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/__snapshots__/UseDataLoaderTests.UseDataLoader_Should_ThrowException_When_NotADataLoader.snap @@ -2,7 +2,7 @@ For more details look at the `Errors` property. 1. For more details look at the `Errors` property. -1. The provided type HotChocolate.Execution.Integration.DataLoader.UseDataLoaderTests+Foo is not a dataloader +1. The provided type HotChocolate.Execution.Integration.DataLoader.UseDataLoaderTests+Foo is not a DataLoader. (HotChocolate.Types.ObjectType) at HotChocolate.Types.DataLoaderObjectFieldExtensions.UseDataLoader(IObjectFieldDescriptor descriptor, Type dataLoaderType) in ObjectFieldDataLoaderExtensions.cs:line 28 diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap index 55c5694d490..de63f0ffdb4 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap @@ -1,13 +1,7 @@ -{ +{ "errors": [ { "message": "Detected a non-null violation in argument `name`.", - "locations": [ - { - "line": 1, - "column": 12 - } - ], "path": [ "sayHello" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs index ff4017a85bf..431abffa852 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs @@ -110,24 +110,26 @@ await ExpectValid( public async Task GraphQLOrgFragmentExample() { await ExpectValid( - @"{ - leftComparison: hero(episode: EMPIRE) { - ...comparisonFields - } - rightComparison: hero(episode: JEDI) { - ...comparisonFields + """ + { + leftComparison: hero(episode: EMPIRE) { + ...comparisonFields + } + rightComparison: hero(episode: JEDI) { + ...comparisonFields + } } - } - fragment comparisonFields on Character { - name - appearsIn - friends { - nodes { - name + fragment comparisonFields on Character { + name + appearsIn + friends { + nodes { + name + } } } - }") + """) .MatchSnapshotAsync(); } @@ -191,23 +193,24 @@ query HeroNameAndFriends($episode: Episode = JEDI) { public async Task GraphQLOrgDirectiveIncludeExample1() { await ExpectValid( - @" - query Hero($episode: Episode, $withFriends: Boolean!) { - hero(episode: $episode) { - name - friends @include(if: $withFriends) { - nodes { - name - } + """ + query Hero($episode: Episode, $withFriends: Boolean!) { + hero(episode: $episode) { + name + friends @include(if: $withFriends) { + nodes { + name } } - }", - request: c => c.SetVariableValues( - new Dictionary - { - { "episode", new EnumValueNode("JEDI") }, - { "withFriends", new BooleanValueNode(false) } - })) + } + } + """, + request: c => c.SetVariableValues( + new Dictionary + { + { "episode", new EnumValueNode("JEDI") }, + { "withFriends", new BooleanValueNode(false) } + })) .MatchSnapshotAsync(); } @@ -263,7 +266,7 @@ friends @skip(if: $withFriends) { public async Task GraphQLOrgDirectiveSkipExample2() { await ExpectValid( - @" + """ query Hero($episode: Episode, $withFriends: Boolean!) { hero(episode: $episode) { name @@ -273,7 +276,8 @@ friends @skip(if: $withFriends) { } } } - }", + } + """, request: r => r.SetVariableValues( new Dictionary { diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs index 09311f012ba..103dee2fb3c 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs @@ -24,12 +24,10 @@ public void Prepare_One_Field() var document = Utf8GraphQLParser.Parse("{ foo }"); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -51,13 +49,10 @@ public void Prepare_Duplicate_Field() var document = Utf8GraphQLParser.Parse("{ foo foo }"); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -79,13 +74,10 @@ public void Prepare_Empty_Operation_SelectionSet() var document = Utf8GraphQLParser.Parse("{ }"); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -113,13 +105,10 @@ ... on Human { } }"); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -152,13 +141,10 @@ fragment def on Human { } "); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -218,13 +204,10 @@ fragment Human3 on Human { } """); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -247,12 +230,10 @@ public void Prepare_Duplicate_Field_With_Skip() var document = Utf8GraphQLParser.Parse( "{ foo @skip(if: true) foo @skip(if: false) }"); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -274,15 +255,12 @@ public void Field_Does_Not_Exist() var document = Utf8GraphQLParser.Parse("{ foo bar }"); - var operationDefinition = - document.Definitions.OfType().Single(); - // act void Action() { OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); } @@ -312,13 +290,10 @@ fragment abc on Droid { name }"); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -345,12 +320,10 @@ fragment abc on Droid { name }"); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -377,12 +350,10 @@ fragment abc on Droid { name }"); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -412,13 +383,10 @@ fragment abc on Droid { } }"); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -456,13 +424,10 @@ ... @include(if: $v) { } }"); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -525,12 +490,10 @@ fragment Human3 on Human { } """); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -562,13 +525,10 @@ ... @include(if: $v) { } }"); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -590,12 +550,10 @@ name @include(if: $q) } }"); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -626,12 +584,10 @@ public void Field_Based_Optimizers() } """); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -656,13 +612,10 @@ ... @defer { } }"); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -689,13 +642,10 @@ fragment Foo on Droid { id }"); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -722,13 +672,10 @@ friends @include(if: $withFriends) { } }"); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -753,12 +700,10 @@ ... abc fragment abc on Droid { }"); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -783,12 +728,10 @@ ... on Droid { } } """); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -810,12 +753,10 @@ query foo($v: Boolean) { } """); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -835,13 +776,10 @@ public async Task Large_Query_Test() var document = Utf8GraphQLParser.Parse( FileResource.Open("LargeQuery.graphql")); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -862,13 +800,10 @@ public async Task Crypto_Details_Test() var document = Utf8GraphQLParser.Parse( FileResource.Open("CryptoDetailQuery.graphql")); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -904,12 +839,10 @@ fragment PriceInfo on Asset { } """); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -945,12 +878,10 @@ fragment PriceInfo on Asset { } """); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -987,12 +918,10 @@ fragment PriceInfo on Asset { } """); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -1013,13 +942,10 @@ public async Task Crypto_List_Test() var document = Utf8GraphQLParser.Parse( FileResource.Open("CryptoQuery.graphql")); - var operationDefinition = - document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -1098,12 +1024,10 @@ type OrganizationUnit2 implements OrganizationUnit { } """); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -1182,12 +1106,10 @@ type OrganizationUnit2 implements OrganizationUnit { } """); - var operationDefinition = document.Definitions.OfType().Single(); - // act OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert @@ -1225,12 +1147,10 @@ fragment TypeTwoParts on TypeTwo { } """); - var operationDefinition = document.Definitions.OfType().Single(); - // act var operation = OperationCompiler.Compile( "opid", - operationDefinition, + document, schema); // assert diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/MiddlewareContextTests.AccessVariables_Fails_When_Variable_Not_Exists.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/MiddlewareContextTests.AccessVariables_Fails_When_Variable_Not_Exists.snap index 9c1f3b954d6..c96c7071efb 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/MiddlewareContextTests.AccessVariables_Fails_When_Variable_Not_Exists.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/MiddlewareContextTests.AccessVariables_Fails_When_Variable_Not_Exists.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The variable with the name `abc` does not exist.", - "locations": [ - { - "line": 1, - "column": 26 - } - ], "path": [ "foo" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/MiddlewareContextTests.ReplaceArguments_Delegate_ReplaceWithNull_ShouldFail.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/MiddlewareContextTests.ReplaceArguments_Delegate_ReplaceWithNull_ShouldFail.snap index c04812ef5e3..081fea4c8ec 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/MiddlewareContextTests.ReplaceArguments_Delegate_ReplaceWithNull_ShouldFail.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/MiddlewareContextTests.ReplaceArguments_Delegate_ReplaceWithNull_ShouldFail.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "abc" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/RequestExecutorTests.Ensure_Errors_Do_Not_Result_In_Timeouts.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/RequestExecutorTests.Ensure_Errors_Do_Not_Result_In_Timeouts.snap index 92153eb8136..f9b707d7a51 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/RequestExecutorTests.Ensure_Errors_Do_Not_Result_In_Timeouts.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/RequestExecutorTests.Ensure_Errors_Do_Not_Result_In_Timeouts.snap @@ -1,13 +1,7 @@ -{ +{ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 4, - "column": 25 - } - ], "path": [ "test" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeConverted.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeConverted.snap index 80077d78462..f4c607274eb 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeConverted.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeConverted.snap @@ -1,13 +1,7 @@ -{ +{ "errors": [ { "message": "Name cannot serialize the given value.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "stringToName" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeParsed.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeParsed.snap index 8291e303e9b..0f73e3da82c 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeParsed.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeParsed.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Foo cannot serialize the given value.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "stringToFoo" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Item_Returns_Null_Should_Error_Item.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Item_Returns_Null_Should_Error_Item.snap index cef5849184d..e64c9d4a214 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Item_Returns_Null_Should_Error_Item.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Item_Returns_Null_Should_Error_Item.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "objectListItemReturningNull", 1 diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Item_Throwing_Should_Null_And_Error_Item.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Item_Throwing_Should_Null_And_Error_Item.snap index c136aaacabf..d578768ba80 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Item_Throwing_Should_Null_And_Error_Item.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Item_Throwing_Should_Null_And_Error_Item.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Another error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "objectListItemThrowingError", 1 @@ -15,12 +9,6 @@ }, { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "objectListItemThrowingError", 1 diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Returns_Null_Should_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Returns_Null_Should_Error.snap index 5272b1193ac..cd74246f7cc 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Returns_Null_Should_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Returns_Null_Should_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "objectListReturningNull" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Throwing_Should_Null_FAnd_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Throwing_Should_Null_FAnd_Error.snap index 584bc579f4d..1a8e1b1447f 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Throwing_Should_Null_FAnd_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_List_Throwing_Should_Null_FAnd_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "objectListThrowingError" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_Returns_Null_Should_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_Returns_Null_Should_Error.snap index fa19729099c..de90deed3b8 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_Returns_Null_Should_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_Returns_Null_Should_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "objectReturningNull" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_Throwing_Should_Null_And_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_Throwing_Should_Null_And_Error.snap index de64fcf0f25..57ccb939ca0 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_Throwing_Should_Null_And_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Object_Throwing_Should_Null_And_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "objectThrowingError" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Item_Returns_Null_Should_Error_Item.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Item_Returns_Null_Should_Error_Item.snap index 6e3b5178b29..f4a6d5a8478 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Item_Returns_Null_Should_Error_Item.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Item_Returns_Null_Should_Error_Item.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "scalarListItemReturningNull", 1 diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Item_Throwing_Should_Null_And_Error_Item.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Item_Throwing_Should_Null_And_Error_Item.snap index 87f194c0037..464d5cdb295 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Item_Throwing_Should_Null_And_Error_Item.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Item_Throwing_Should_Null_And_Error_Item.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Another error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "scalarListItemThrowingError", 1 @@ -15,12 +9,6 @@ }, { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "scalarListItemThrowingError", 1 diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Returns_Null_Should_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Returns_Null_Should_Error.snap index 136f20e321e..7c3567e8c3f 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Returns_Null_Should_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Returns_Null_Should_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "scalarListReturningNull" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Throwing_Should_Null_And_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Throwing_Should_Null_And_Error.snap index fe169a3cc33..a406ecdc3d9 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Throwing_Should_Null_And_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_List_Throwing_Should_Null_And_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "scalarListThrowingError" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_Returns_Null_Should_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_Returns_Null_Should_Error.snap index d6f046b374e..d12cef73fdc 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_Returns_Null_Should_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_Returns_Null_Should_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "scalarReturningNull" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_Throwing_Should_Null_And_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_Throwing_Should_Null_And_Error.snap index f992ef3496b..ced147f1349 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_Throwing_Should_Null_And_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Async_Scalar_Throwing_Should_Null_And_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "scalarThrowingError" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Item_Returns_Null_Should_Error_Item.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Item_Returns_Null_Should_Error_Item.snap index 20741ef4898..702c8496c8a 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Item_Returns_Null_Should_Error_Item.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Item_Returns_Null_Should_Error_Item.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureObjectListItemReturningNull", 1 diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Item_Throwing_Should_Null_And_Error_Item.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Item_Throwing_Should_Null_And_Error_Item.snap index 338ea110d60..561c8238624 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Item_Throwing_Should_Null_And_Error_Item.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Item_Throwing_Should_Null_And_Error_Item.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Another error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureObjectListItemThrowingError", 1 @@ -15,12 +9,6 @@ }, { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureObjectListItemThrowingError", 1 diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Returns_Null_Should_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Returns_Null_Should_Error.snap index dd9c523f560..2262faed20a 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Returns_Null_Should_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Returns_Null_Should_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureObjectListReturningNull" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Throwing_Should_Null_FAnd_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Throwing_Should_Null_FAnd_Error.snap index 89587618619..42516bd3c4b 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Throwing_Should_Null_FAnd_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_List_Throwing_Should_Null_FAnd_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureObjectListThrowingError" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_Returns_Null_Should_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_Returns_Null_Should_Error.snap index 81b0b6ca595..c15611a44a1 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_Returns_Null_Should_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_Returns_Null_Should_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureObjectReturningNull" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_Throwing_Should_Null_And_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_Throwing_Should_Null_And_Error.snap index 76230f78282..63eeb3487ae 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_Throwing_Should_Null_And_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Object_Throwing_Should_Null_And_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureObjectThrowingError" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_ListOfList_Nullable_Middle_Item_Outer_And_Inner_Return_Null_Should_Null_And_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_ListOfList_Nullable_Middle_Item_Outer_And_Inner_Return_Null_Should_Null_And_Error.snap index 7c42ba3a2a3..7bf76b7e4c0 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_ListOfList_Nullable_Middle_Item_Outer_And_Inner_Return_Null_Should_Null_And_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_ListOfList_Nullable_Middle_Item_Outer_And_Inner_Return_Null_Should_Null_And_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "nestedScalarArrayNullableMiddleItem", 0, @@ -19,12 +13,6 @@ }, { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "nestedScalarArrayNullableMiddleItem", 2, diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_ListOfList_Nullable_Outer_And_Inner_Middle_Returns_Null_Should_Null_And_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_ListOfList_Nullable_Outer_And_Inner_Middle_Returns_Null_Should_Null_And_Error.snap index 5b68ea3fafb..bf9a690b5f8 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_ListOfList_Nullable_Outer_And_Inner_Middle_Returns_Null_Should_Null_And_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_ListOfList_Nullable_Outer_And_Inner_Middle_Returns_Null_Should_Null_And_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "nestedScalarArrayNullableOuterItems", 1 diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Item_Returns_Null_Should_Error_Item.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Item_Returns_Null_Should_Error_Item.snap index f3a0b0bb1ca..ed0a4dd9a70 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Item_Returns_Null_Should_Error_Item.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Item_Returns_Null_Should_Error_Item.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureScalarListItemReturningNull", 1 diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Item_Throwing_Should_Null_And_Error_Item.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Item_Throwing_Should_Null_And_Error_Item.snap index e5ecb022752..cdb53b6f7ff 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Item_Throwing_Should_Null_And_Error_Item.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Item_Throwing_Should_Null_And_Error_Item.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Another error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureScalarListItemThrowingError", 1 @@ -15,12 +9,6 @@ }, { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureScalarListItemThrowingError", 1 diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Returns_Null_Should_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Returns_Null_Should_Error.snap index e6c89302539..465984d2f34 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Returns_Null_Should_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Returns_Null_Should_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureScalarListReturningNull" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Throwing_Should_Null_And_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Throwing_Should_Null_And_Error.snap index 87eb04d1690..44c06c8d747 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Throwing_Should_Null_And_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_List_Throwing_Should_Null_And_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureScalarListThrowingError" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_Returns_Null_Should_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_Returns_Null_Should_Error.snap index 4ddf157a011..d2e3122ede9 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_Returns_Null_Should_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_Returns_Null_Should_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Cannot return null for semantic non-null field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureScalarReturningNull" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_Throwing_Should_Null_And_Error.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_Throwing_Should_Null_And_Error.snap index a1980169f92..1cbac92d059 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_Throwing_Should_Null_And_Error.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Pure_Scalar_Throwing_Should_Null_And_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "pureScalarThrowingError" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Query_With_Connection.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Query_With_Connection.snap index af087216eda..e0e253ee4af 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Query_With_Connection.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/SemanticNonNullTests.Query_With_Connection.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 4, - "column": 7 - } - ], "path": [ "scalarConnection", "edges", diff --git a/src/HotChocolate/Core/test/Types.Tests/Extensions/SchemaBuilderExtensions.Resolvers.Tests.cs b/src/HotChocolate/Core/test/Types.Tests/Extensions/SchemaBuilderExtensions.Resolvers.Tests.cs index 3763da8f045..cc4c61b9e7f 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Extensions/SchemaBuilderExtensions.Resolvers.Tests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Extensions/SchemaBuilderExtensions.Resolvers.Tests.cs @@ -21,7 +21,7 @@ public void AddResolverContextObject_BuilderIsNull_ArgNullExcept() new Func(c => new object())); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -78,7 +78,7 @@ public void AddResolverContextTaskObject_BuilderIsNull_ArgNullExcept() c => Task.FromResult(new object()))); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -137,7 +137,7 @@ public void AddResolverContextTResult_BuilderIsNull_ArgNullExcept() c => "abc")); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -197,7 +197,7 @@ public void AddResolverContextTaskTResult_BuilderIsNull_ArgNullExcept() c => Task.FromResult("abc"))); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -256,7 +256,7 @@ public void AddResolverObject_BuilderIsNull_ArgNullExcept() new Func(() => "abc")); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/ArgumentDescriptorTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/ArgumentDescriptorTests.cs index ad52c19a3b4..7ad560d1e7f 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/ArgumentDescriptorTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/ArgumentDescriptorTests.cs @@ -254,6 +254,6 @@ public void Type_Syntax_Type_Null() public void Type_Syntax_Descriptor_Null() { void Error() => default(ArgumentDescriptor)!.Type("foo"); - Assert.Throws(Error); + Assert.Throws(Error); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/DirectiveArgumentDescriptorTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/DirectiveArgumentDescriptorTests.cs index 0d2960e0a16..5a0c82a5207 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/DirectiveArgumentDescriptorTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/DirectiveArgumentDescriptorTests.cs @@ -16,7 +16,7 @@ public void Type_Syntax_Type_Null() public void Type_Syntax_Descriptor_Null() { void Error() => default(DirectiveArgumentDescriptor)!.Type("foo"); - Assert.Throws(Error); + Assert.Throws(Error); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/InputFieldDescriptorTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/InputFieldDescriptorTests.cs index 4f3a202a4c5..a8ae1bfe3a0 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/InputFieldDescriptorTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/InputFieldDescriptorTests.cs @@ -275,6 +275,6 @@ public void Type_Syntax_Type_Null() public void Type_Syntax_Descriptor_Null() { void Error() => default(InputFieldDescriptor)!.Type("foo"); - Assert.Throws(Error); + Assert.Throws(Error); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/InterfaceFieldDescriptorTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/InterfaceFieldDescriptorTests.cs index 32fe4edbef0..15fdd5ba3b9 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/InterfaceFieldDescriptorTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/InterfaceFieldDescriptorTests.cs @@ -15,6 +15,6 @@ public void Type_Syntax_Type_Null() public void Type_Syntax_Descriptor_Null() { void Error() => default(InterfaceFieldDescriptor)!.Type("foo"); - Assert.Throws(Error); + Assert.Throws(Error); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/ObjectFieldDescriptorTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/ObjectFieldDescriptorTests.cs index 60012d8f644..9bfdc1e5b6e 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/ObjectFieldDescriptorTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Descriptors/ObjectFieldDescriptorTests.cs @@ -200,7 +200,7 @@ public void Type_Syntax_Type_Null() public void Type_Syntax_Descriptor_Null() { void Error() => default(IObjectFieldDescriptor)!.Type("foo"); - Assert.Throws(Error); + Assert.Throws(Error); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/DirectiveTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/DirectiveTypeTests.cs index 29302077107..10d61b736cc 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/DirectiveTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/DirectiveTypeTests.cs @@ -224,7 +224,7 @@ public void Ignore_DescriptorIsNull_ArgumentNullException() .Ignore(null!, t => t.Argument2); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/InputObjectTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/InputObjectTypeTests.cs index d5c75930696..9950a885fc9 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/InputObjectTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/InputObjectTypeTests.cs @@ -370,7 +370,7 @@ void Action() => InputObjectTypeDescriptorExtensions.Ignore(null!, t => t.Id); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -723,7 +723,7 @@ public void OneOf_descriptor_is_null() { void Fail() => InputObjectTypeDescriptorExtensions.OneOf(null!); - Assert.Throws(Fail); + Assert.Throws(Fail); } [Fact] @@ -731,7 +731,7 @@ public void OneOf_generic_descriptor_is_null() { void Fail() => InputObjectTypeDescriptorExtensions.OneOf(null!); - Assert.Throws(Fail); + Assert.Throws(Fail); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/InterfaceTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/InterfaceTypeTests.cs index 5ce75ba4a04..d4b1590cfa3 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/InterfaceTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/InterfaceTypeTests.cs @@ -439,7 +439,7 @@ public void Ignore_DescriptorIsNull_ArgumentNullException() void Action() => InterfaceTypeDescriptorExtensions.Ignore(null!, t => t.Bar); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/ObjectTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/ObjectTypeTests.cs index f8ef72e86dc..4d625b68366 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/ObjectTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/ObjectTypeTests.cs @@ -1236,7 +1236,7 @@ public void IgnoreField_DescriptorIsNull_ArgumentNullException() void Action() => ObjectTypeDescriptorExtensions.Ignore(null!, t => t.Description); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/OperationCompiler.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/OperationCompiler.cs index bfabcec6ed3..f61b6edcba4 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/OperationCompiler.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/OperationCompiler.cs @@ -254,7 +254,7 @@ private SelectionSet BuildSelectionSet( compilationContext.Register(selection, selection.Id); selections[i++] = selection; - if (includeFlags.Count > 1) + if (includeFlags.Count > 0) { isConditional = true; } From e4180e61d0349d0d91d38b78081b632dd7cb0207 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 9 Dec 2025 12:06:02 +0100 Subject: [PATCH 028/144] Updated Snapshots --- .../Execution/Processing/OperationCompiler.cs | 4 +- .../Processing/SelectionFeatureCollection.cs | 2 +- .../Processing/Tasks/ResolverTaskFactory.cs | 1 + ..._To_NonNullArgument_With_DefaultValue.snap | 6 +++ .../StarWarsCodeFirstTests.cs | 16 ++++---- .../QueryableCursorPagingProviderTests.cs | 5 +-- .../IntegrationTests.First_Value_Not_Set.snap | 6 --- ...ationTests.Invalid_After_Index_Cursor.snap | 6 --- ...tionTests.Invalid_Before_Index_Cursor.snap | 6 --- ...nvalid_EmptyString_After_Index_Cursor.snap | 6 --- ...valid_EmptyString_Before_Index_Cursor.snap | 6 --- ...grationTests.MaxPageSizeReached_First.snap | 6 --- ...egrationTests.MaxPageSizeReached_Last.snap | 6 --- ...grationTests.MinPageSizeReached_First.snap | 6 --- ...egrationTests.MinPageSizeReached_Last.snap | 6 --- .../IntegrationTests.No_Boundaries_Set.snap | 6 --- ...s.Mutation_Aggregate_Error_Not_Mapped.snap | 6 --- .../IntegrationTests.MaxPageSizeReached.snap | 8 +--- ...IntegrationTests.No_Paging_Boundaries.snap | 8 +--- ...esult_And_Exceptions_Unexpected_Error.snap | 6 --- ...esult_And_Exceptions_Unexpected_Error.snap | 6 --- .../Resolvers/ResolverCompilerTests.cs | 10 +---- ...ptorTests.Input_Should_EmptySelection.snap | 8 +--- ...ceptorTests.Input_Should_UnknownValue.snap | 8 +--- ...ttributeTests.Id_On_Objects_InvalidId.snap | 4 +- ...ributeTests.Id_On_Objects_InvalidType.snap | 4 +- ...g_Throws_On_InvalidInputs_InvalidArgs.snap | 24 ------------ ....Node_Resolve_Implicit_Custom_IdField.snap | 6 --- .../NodeFieldSupportTests.Tow_Many_Nodes.snap | 6 --- ...houldReturnNonNullError_When_IdIsNull.snap | 8 +--- ..._Against_Interface_Without_Impl_Field.snap | 6 --- .../Rewriters/DocumentRewriter.cs | 2 +- .../InlineFragmentOperationRewriter.cs | 22 ++++++----- ...ault_ErrorHandlingMode_Can_Be_Changed.yaml | 6 --- ...Http_Request_In_Node_Is_Still_Ongoing.yaml | 6 --- ...d_While_Subscription_Is_Still_Ongoing.yaml | 6 --- ..._Source_Schema_Are_Properly_Forwarded.yaml | 6 --- ..._On_Lookup_Field_In_List_OnError_Halt.yaml | 18 --------- ..._On_Lookup_Field_In_List_OnError_Null.yaml | 18 --------- ...ookup_Field_In_List_OnError_Propagate.yaml | 18 --------- ...ts.Error_On_Lookup_Field_OnError_Halt.yaml | 6 --- ...ts.Error_On_Lookup_Field_OnError_Null.yaml | 6 --- ...ror_On_Lookup_Field_OnError_Propagate.yaml | 6 --- ...kup_Leaf_In_List_NonNull_OnError_Halt.yaml | 18 --------- ...kup_Leaf_In_List_NonNull_OnError_Null.yaml | 18 --------- ...eaf_In_List_NonNull_OnError_Propagate.yaml | 18 --------- ...r_On_Lookup_Leaf_In_List_OnError_Halt.yaml | 18 --------- ...r_On_Lookup_Leaf_In_List_OnError_Null.yaml | 18 --------- ...Lookup_Leaf_In_List_OnError_Propagate.yaml | 18 --------- ...r_On_Lookup_Leaf_NonNull_OnError_Halt.yaml | 6 --- ...r_On_Lookup_Leaf_NonNull_OnError_Null.yaml | 6 --- ...Lookup_Leaf_NonNull_OnError_Propagate.yaml | 6 --- ...sts.Error_On_Lookup_Leaf_OnError_Halt.yaml | 6 --- ...sts.Error_On_Lookup_Leaf_OnError_Null.yaml | 6 --- ...rror_On_Lookup_Leaf_OnError_Propagate.yaml | 6 --- ...ests.Error_On_Root_Field_OnError_Halt.yaml | 6 --- ...ests.Error_On_Root_Field_OnError_Null.yaml | 6 --- ...Error_On_Root_Field_OnError_Propagate.yaml | 6 --- ...Tests.Error_On_Root_Leaf_OnError_Halt.yaml | 6 --- ...Tests.Error_On_Root_Leaf_OnError_Null.yaml | 6 --- ....Error_On_Root_Leaf_OnError_Propagate.yaml | 6 --- ...For_Lookup_Field_NonNull_OnError_Halt.yaml | 6 --- ...For_Lookup_Field_NonNull_OnError_Null.yaml | 6 --- ...ookup_Field_NonNull_OnError_Propagate.yaml | 6 --- ..._For_Lookup_Leaf_NonNull_OnError_Halt.yaml | 6 --- ..._For_Lookup_Leaf_NonNull_OnError_Null.yaml | 6 --- ...Lookup_Leaf_NonNull_OnError_Propagate.yaml | 6 --- ...h_For_Root_Field_NonNull_OnError_Halt.yaml | 6 --- ...h_For_Root_Field_NonNull_OnError_Null.yaml | 6 --- ..._Root_Field_NonNull_OnError_Propagate.yaml | 6 --- ...NonNull_One_Service_Errors_EntryField.yaml | 6 --- ...ullable_One_Service_Errors_EntryField.yaml | 6 --- ...d_NonNull_One_Service_Errors_SubField.yaml | 6 --- ..._Nullable_One_Service_Errors_SubField.yaml | 6 --- ..._Nullable_One_Service_Errors_SubField.yaml | 6 --- ...NonNull_One_Service_Errors_EntryField.yaml | 6 --- ...t_NonNull_One_Service_Errors_SubField.yaml | 6 --- ...ullable_One_Service_Errors_EntryField.yaml | 6 --- ..._Nullable_One_Service_Errors_SubField.yaml | 6 --- ...ullable_One_Service_Errors_EntryField.yaml | 6 --- ..._Nullable_One_Service_Errors_SubField.yaml | 6 --- .../InlineFragmentOperationRewriterTests.cs | 37 +++++++++++++++++++ 82 files changed, 80 insertions(+), 589 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 5448655c3ae..b9d6de55af4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -14,7 +14,7 @@ public sealed partial class OperationCompiler private readonly Schema _schema; private readonly ObjectPool>> _fieldsPool; private readonly OperationCompilerOptimizers _optimizers; - private readonly DocumentRewriter _documentRewriter; + private readonly InlineFragmentOperationRewriter _documentRewriter; private readonly InputParser _inputValueParser; private static readonly ArrayPool s_objectArrayPool = ArrayPool.Shared; @@ -30,7 +30,7 @@ internal OperationCompiler( _schema = schema; _inputValueParser = inputValueParser; _fieldsPool = fieldsPool; - _documentRewriter = new DocumentRewriter(schema, removeStaticallyExcludedSelections: true); + _documentRewriter = new InlineFragmentOperationRewriter(schema, removeStaticallyExcludedSelections: true); _optimizers = optimizers; } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs index f14458099ba..ce8d18f2e11 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionFeatureCollection.cs @@ -101,7 +101,7 @@ public bool TryGet([NotNullWhen(true)] out TFeature? feature) /// The existing or newly created feature instance. /// This method is thread-safe. public TFeature GetOrSetSafe() where TFeature : new() - => GetOrSetSafe(static () => new TFeature()); + => GetOrSetSafe(static () => new TFeature()); internal TFeature GetOrSetSafe(Func factory) => _parent.GetOrSetSafe(_selectionId, factory); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs index c54b36a56f5..d48b6592620 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs @@ -76,6 +76,7 @@ public static ObjectResult EnqueueResolverTasks( } } + // TODO : remove ? public static ResolverTask EnqueueElementTasks( OperationContext operationContext, Selection selection, diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap index de63f0ffdb4..5644d15eb0b 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap @@ -2,6 +2,12 @@ "errors": [ { "message": "Detected a non-null violation in argument `name`.", + "locations": [ + { + "line": 1, + "column": 12 + } + ], "path": [ "sayHello" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs index 431abffa852..610a421e5ba 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs @@ -1101,15 +1101,15 @@ name @include(if: {{ifValue}}) public async Task Include_With_Variable(bool ifValue) { await ExpectValid( - """ - query ($if: Boolean!) { - human(id: "1000") { - name @include(if: $if) - height - } + """ + query ($if: Boolean!) { + human(id: "1000") { + name @include(if: $if) + height } - """, - request: r => r.SetVariableValues(new Dictionary { { "if", ifValue } })) + } + """, + request: r => r.SetVariableValues(new Dictionary { { "if", ifValue } })) .MatchSnapshotAsync(postFix: ifValue); } diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/QueryableCursorPagingProviderTests.cs b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/QueryableCursorPagingProviderTests.cs index 7555d0f1906..8b4a846d4c4 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/QueryableCursorPagingProviderTests.cs +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/QueryableCursorPagingProviderTests.cs @@ -519,10 +519,7 @@ public static async Task CreateContextAsync(CursorPagingArgume } """); - var operation = OperationCompiler.Compile( - "abc", - document.Definitions.OfType().First(), - schema); + var operation = OperationCompiler.Compile("abc", document, schema); return new MockContext(arguments, operation, operation.RootSelectionSet.Selections[0]); } diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.First_Value_Not_Set.snap b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.First_Value_Not_Set.snap index d7a9894ef12..a1203609ca9 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.First_Value_Not_Set.snap +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.First_Value_Not_Set.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "You must provide a `first` value to properly paginate the `LettersConnection`.", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_After_Index_Cursor.snap b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_After_Index_Cursor.snap index 826e7a0cb9b..7aa38b4514b 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_After_Index_Cursor.snap +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_After_Index_Cursor.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The cursor specified in `after` has an invalid format.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_Before_Index_Cursor.snap b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_Before_Index_Cursor.snap index cd2cb54e714..dd21d96ff6d 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_Before_Index_Cursor.snap +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_Before_Index_Cursor.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The cursor specified in `before` has an invalid format.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_EmptyString_After_Index_Cursor.snap b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_EmptyString_After_Index_Cursor.snap index c15f8a3745b..deeb2a245cc 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_EmptyString_After_Index_Cursor.snap +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_EmptyString_After_Index_Cursor.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The cursor specified in `after` has an invalid format.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_EmptyString_Before_Index_Cursor.snap b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_EmptyString_Before_Index_Cursor.snap index f130bc24d0f..d10fd0432e0 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_EmptyString_Before_Index_Cursor.snap +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.Invalid_EmptyString_Before_Index_Cursor.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The cursor specified in `before` has an invalid format.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached_First.snap b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached_First.snap index aff5a792fec..b48fc9361dd 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached_First.snap +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached_First.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The maximum allowed items per page were exceeded.", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached_Last.snap b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached_Last.snap index aff5a792fec..b48fc9361dd 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached_Last.snap +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached_Last.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The maximum allowed items per page were exceeded.", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MinPageSizeReached_First.snap b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MinPageSizeReached_First.snap index 2f4bd3fe3d0..e3b36abf61b 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MinPageSizeReached_First.snap +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MinPageSizeReached_First.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The requested number of values per page must be at least 0.", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MinPageSizeReached_Last.snap b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MinPageSizeReached_Last.snap index 2f4bd3fe3d0..e3b36abf61b 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MinPageSizeReached_Last.snap +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.MinPageSizeReached_Last.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The requested number of values per page must be at least 0.", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.No_Boundaries_Set.snap b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.No_Boundaries_Set.snap index 9ff705486c9..5c3f2ffa91f 100644 --- a/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.No_Boundaries_Set.snap +++ b/src/HotChocolate/Core/test/Types.CursorPagination.Tests/__snapshots__/IntegrationTests.No_Boundaries_Set.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "You must provide a `first` or `last` value to properly paginate the `LettersConnection`.", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.Mutations.Tests/__snapshots__/AnnotationBasedMutations.Mutation_Aggregate_Error_Not_Mapped.snap b/src/HotChocolate/Core/test/Types.Mutations.Tests/__snapshots__/AnnotationBasedMutations.Mutation_Aggregate_Error_Not_Mapped.snap index 76b40b4a801..6a0504ad745 100644 --- a/src/HotChocolate/Core/test/Types.Mutations.Tests/__snapshots__/AnnotationBasedMutations.Mutation_Aggregate_Error_Not_Mapped.snap +++ b/src/HotChocolate/Core/test/Types.Mutations.Tests/__snapshots__/AnnotationBasedMutations.Mutation_Aggregate_Error_Not_Mapped.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 5 - } - ], "path": [ "doSomething2" ] diff --git a/src/HotChocolate/Core/test/Types.OffsetPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached.snap b/src/HotChocolate/Core/test/Types.OffsetPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached.snap index 4201ec8fb7f..2dad32b0401 100644 --- a/src/HotChocolate/Core/test/Types.OffsetPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached.snap +++ b/src/HotChocolate/Core/test/Types.OffsetPagination.Tests/__snapshots__/IntegrationTests.MaxPageSizeReached.snap @@ -1,13 +1,7 @@ -{ +{ "errors": [ { "message": "The maximum allowed items per page were exceeded.", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.OffsetPagination.Tests/__snapshots__/IntegrationTests.No_Paging_Boundaries.snap b/src/HotChocolate/Core/test/Types.OffsetPagination.Tests/__snapshots__/IntegrationTests.No_Paging_Boundaries.snap index 3320ff188f4..d516032374a 100644 --- a/src/HotChocolate/Core/test/Types.OffsetPagination.Tests/__snapshots__/IntegrationTests.No_Paging_Boundaries.snap +++ b/src/HotChocolate/Core/test/Types.OffsetPagination.Tests/__snapshots__/IntegrationTests.No_Paging_Boundaries.snap @@ -1,13 +1,7 @@ -{ +{ "errors": [ { "message": "You must provide take to properly paginate the `LettersCollectionSegment`.", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "letters" ], diff --git a/src/HotChocolate/Core/test/Types.Queries.Tests/__snapshots__/AnnotationBasedSchemaTests.Execute_Query_With_FieldResult_And_Exceptions_Unexpected_Error.snap b/src/HotChocolate/Core/test/Types.Queries.Tests/__snapshots__/AnnotationBasedSchemaTests.Execute_Query_With_FieldResult_And_Exceptions_Unexpected_Error.snap index 13609ca9403..884083d29d0 100644 --- a/src/HotChocolate/Core/test/Types.Queries.Tests/__snapshots__/AnnotationBasedSchemaTests.Execute_Query_With_FieldResult_And_Exceptions_Unexpected_Error.snap +++ b/src/HotChocolate/Core/test/Types.Queries.Tests/__snapshots__/AnnotationBasedSchemaTests.Execute_Query_With_FieldResult_And_Exceptions_Unexpected_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "userById" ] diff --git a/src/HotChocolate/Core/test/Types.Queries.Tests/__snapshots__/CodeFirstSchemaTests.Execute_Query_With_FieldResult_And_Exceptions_Unexpected_Error.snap b/src/HotChocolate/Core/test/Types.Queries.Tests/__snapshots__/CodeFirstSchemaTests.Execute_Query_With_FieldResult_And_Exceptions_Unexpected_Error.snap index 13609ca9403..884083d29d0 100644 --- a/src/HotChocolate/Core/test/Types.Queries.Tests/__snapshots__/CodeFirstSchemaTests.Execute_Query_With_FieldResult_And_Exceptions_Unexpected_Error.snap +++ b/src/HotChocolate/Core/test/Types.Queries.Tests/__snapshots__/CodeFirstSchemaTests.Execute_Query_With_FieldResult_And_Exceptions_Unexpected_Error.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "userById" ] diff --git a/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs b/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs index 1ae88b29256..329c2ae5357 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs @@ -630,10 +630,7 @@ public async Task Compile_Arguments_Operation() .Create(); var document = Utf8GraphQLParser.Parse("{ abc }"); - var operation = OperationCompiler.Compile( - "abc", - document.Definitions.OfType().First(), - schema); + var operation = OperationCompiler.Compile("abc", document, schema); var context = new Mock(); context.Setup(t => t.Parent()).Returns(new Resolvers()); @@ -747,10 +744,7 @@ public async Task Compile_Arguments_Document() .Create(); var document = Utf8GraphQLParser.Parse("{ abc }"); - var operation = OperationCompiler.Compile( - "abc", - document.Definitions.OfType().First(), - schema); + var operation = OperationCompiler.Compile("abc", document, schema); var context = new Mock(); context.Setup(t => t.Parent()).Returns(new Resolvers()); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Interceptors/__snapshots__/FlagEnumInterceptorTests.Input_Should_EmptySelection.snap b/src/HotChocolate/Core/test/Types.Tests/Types/Interceptors/__snapshots__/FlagEnumInterceptorTests.Input_Should_EmptySelection.snap index dbfb030642e..a5a60149dd2 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Interceptors/__snapshots__/FlagEnumInterceptorTests.Input_Should_EmptySelection.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Interceptors/__snapshots__/FlagEnumInterceptorTests.Input_Should_EmptySelection.snap @@ -1,13 +1,7 @@ -{ +{ "errors": [ { "message": "Flags need to have at least one selection. Type: FlagsEnumFlagsInput", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "test" ] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Interceptors/__snapshots__/FlagEnumInterceptorTests.Input_Should_UnknownValue.snap b/src/HotChocolate/Core/test/Types.Tests/Types/Interceptors/__snapshots__/FlagEnumInterceptorTests.Input_Should_UnknownValue.snap index 163f6e8b341..e4b071e30f2 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Interceptors/__snapshots__/FlagEnumInterceptorTests.Input_Should_UnknownValue.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Interceptors/__snapshots__/FlagEnumInterceptorTests.Input_Should_UnknownValue.snap @@ -1,13 +1,7 @@ -{ +{ "errors": [ { "message": "The value isAsd is not known for type FlagsEnumFlagsInput", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "test" ] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdAttributeTests.Id_On_Objects_InvalidId.snap b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdAttributeTests.Id_On_Objects_InvalidId.snap index 3e0559c0364..e4427c22fe6 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdAttributeTests.Id_On_Objects_InvalidId.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdAttributeTests.Id_On_Objects_InvalidId.snap @@ -1,4 +1,4 @@ -{ - "result": "{\n \"errors\": [\n {\n \"message\": \"The node ID string has an invalid format.\",\n \"locations\": [\n {\n \"line\": 2,\n \"column\": 5\n }\n ],\n \"path\": [\n \"foo\"\n ],\n \"extensions\": {\n \"originalValue\": \"abc\"\n }\n }\n ],\n \"data\": null\n}", +{ + "result": "{\n \"errors\": [\n {\n \"message\": \"The node ID string has an invalid format.\",\n \"path\": [\n \"foo\"\n ],\n \"extensions\": {\n \"originalValue\": \"abc\"\n }\n }\n ],\n \"data\": null\n}", "someId": "abc" } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdAttributeTests.Id_On_Objects_InvalidType.snap b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdAttributeTests.Id_On_Objects_InvalidType.snap index b1a75519cee..2377ccf1b7d 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdAttributeTests.Id_On_Objects_InvalidType.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdAttributeTests.Id_On_Objects_InvalidType.snap @@ -1,4 +1,4 @@ -{ - "result": "{\n \"errors\": [\n {\n \"message\": \"The node id type name `Query` does not match the expected type name `Some`.\",\n \"locations\": [\n {\n \"line\": 2,\n \"column\": 5\n }\n ],\n \"path\": [\n \"foo\"\n ]\n }\n ],\n \"data\": null\n}", +{ + "result": "{\n \"errors\": [\n {\n \"message\": \"The node id type name `Query` does not match the expected type name `Some`.\",\n \"path\": [\n \"foo\"\n ]\n }\n ],\n \"data\": null\n}", "someId": "UXVlcnk6AAAAAAAAAAAAAAAAAAAAAA==" } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdDescriptorTests.Id_Honors_CustomTypeNaming_Throws_On_InvalidInputs_InvalidArgs.snap b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdDescriptorTests.Id_Honors_CustomTypeNaming_Throws_On_InvalidInputs_InvalidArgs.snap index dd746ccc21a..696c3baa90b 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdDescriptorTests.Id_Honors_CustomTypeNaming_Throws_On_InvalidInputs_InvalidArgs.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/IdDescriptorTests.Id_Honors_CustomTypeNaming_Throws_On_InvalidInputs_InvalidArgs.snap @@ -2,48 +2,24 @@ "errors": [ { "message": "The node id type name `FooFoo` does not match the expected type name `RenamedUser`.", - "locations": [ - { - "line": 2, - "column": 5 - } - ], "path": [ "validUserIdInput" ] }, { "message": "The node id type name `FooFooFluent` does not match the expected type name `FooFoo`.", - "locations": [ - { - "line": 3, - "column": 5 - } - ], "path": [ "validFooIdInput" ] }, { "message": "The node id type name `FooFooFluentSingle` does not match the expected type name `FooFooFluent`.", - "locations": [ - { - "line": 4, - "column": 5 - } - ], "path": [ "validFluentFooIdInput" ] }, { "message": "The node id type name `RenamedUser` does not match the expected type name `FooFooFluentSingle`.", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "validSingleTypeFluentFooIdInput" ] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/NodeFieldSupportTests.Node_Resolve_Implicit_Custom_IdField.snap b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/NodeFieldSupportTests.Node_Resolve_Implicit_Custom_IdField.snap index f375a3abe1c..1473ba45ce5 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/NodeFieldSupportTests.Node_Resolve_Implicit_Custom_IdField.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/NodeFieldSupportTests.Node_Resolve_Implicit_Custom_IdField.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Could not resolve the actual object type from `HotChocolate.Types.Relay.NodeFieldSupportTests+Bar2` for the abstract type `node`.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "node" ] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/NodeFieldSupportTests.Tow_Many_Nodes.snap b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/NodeFieldSupportTests.Tow_Many_Nodes.snap index 06301c15d06..c5202261061 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/NodeFieldSupportTests.Tow_Many_Nodes.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/NodeFieldSupportTests.Tow_Many_Nodes.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The maximum number of nodes that can be fetched at once is 1. This selection tried to fetch 2 nodes that exceeded the maximum allowed amount.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "nodes" ], diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/RelaySchemaTests.Relay_ShouldReturnNonNullError_When_IdIsNull.snap b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/RelaySchemaTests.Relay_ShouldReturnNonNullError_When_IdIsNull.snap index fa2eb7d3585..a4d5f0b6cfa 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/RelaySchemaTests.Relay_ShouldReturnNonNullError_When_IdIsNull.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/__snapshots__/RelaySchemaTests.Relay_ShouldReturnNonNullError_When_IdIsNull.snap @@ -1,13 +1,7 @@ -{ +{ "errors": [ { "message": "Cannot return null for non-nullable field.", - "locations": [ - { - "line": 1, - "column": 16 - } - ], "path": [ "user", "id" diff --git a/src/HotChocolate/Core/test/Types.Tests/__snapshots__/SchemaBuilderTests.Execute_Against_Interface_Without_Impl_Field.snap b/src/HotChocolate/Core/test/Types.Tests/__snapshots__/SchemaBuilderTests.Execute_Against_Interface_Without_Impl_Field.snap index 981d9a23dc4..1e5d92424a3 100644 --- a/src/HotChocolate/Core/test/Types.Tests/__snapshots__/SchemaBuilderTests.Execute_Against_Interface_Without_Impl_Field.snap +++ b/src/HotChocolate/Core/test/Types.Tests/__snapshots__/SchemaBuilderTests.Execute_Against_Interface_Without_Impl_Field.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Could not resolve the actual object type from `System.String` for the abstract type `foo`.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "foo" ] diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/DocumentRewriter.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/DocumentRewriter.cs index 689620e30dc..d4aea762a95 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/DocumentRewriter.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/DocumentRewriter.cs @@ -828,7 +828,7 @@ private sealed class Context( /// /// Provides a fast way to get all FieldNodes for the same response name. - /// The key is the respones name. + /// The key is the response name. /// public Dictionary>? Fields { get; private set; } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/InlineFragmentOperationRewriter.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/InlineFragmentOperationRewriter.cs index 7ea0e766b4f..07b5f8a91de 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/InlineFragmentOperationRewriter.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/InlineFragmentOperationRewriter.cs @@ -568,19 +568,21 @@ private static IReadOnlyList RemoveStaticIncludeConditions( static bool IsStaticIncludeCondition(DirectiveNode directive, ref bool skipChecked, ref bool includeChecked) { - if (directive.Name.Value.Equals(DirectiveNames.Skip.Name, StringComparison.Ordinal) - && directive.Arguments.Count == 1 - && directive.Arguments[0].Value is BooleanValueNode skipConstant - && !skipConstant.Value) + if(directive.Name.Value.Equals(DirectiveNames.Skip.Name, StringComparison.Ordinal)) { - return true; + skipChecked = true; + if (directive.Arguments is [{ Value: BooleanValueNode }]) + { + return true; + } } - else if (directive.Name.Value.Equals(DirectiveNames.Include.Name, StringComparison.Ordinal) - && (directive.Arguments.Count != 1 - || directive.Arguments[0].Value is not BooleanValueNode includeConstant - || includeConstant.Value)) + else if(directive.Name.Value.Equals(DirectiveNames.Include.Name, StringComparison.Ordinal)) { - return true; + includeChecked = true; + if (directive.Arguments is [{ Value: BooleanValueNode }]) + { + return true; + } } return false; diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Default_ErrorHandlingMode_Can_Be_Changed.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Default_ErrorHandlingMode_Can_Be_Changed.yaml index 74b61133c8e..a16305dda21 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Default_ErrorHandlingMode_Can_Be_Changed.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Default_ErrorHandlingMode_Can_Be_Changed.yaml @@ -47,12 +47,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve reviews", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "reviews" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Execution_Is_Halted_While_Http_Request_In_Node_Is_Still_Ongoing.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Execution_Is_Halted_While_Http_Request_In_Node_Is_Still_Ongoing.yaml index 142c5dedb94..d43e5fef38d 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Execution_Is_Halted_While_Http_Request_In_Node_Is_Still_Ongoing.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Execution_Is_Halted_While_Http_Request_In_Node_Is_Still_Ongoing.yaml @@ -72,12 +72,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve reviews", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "reviews" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Execution_Is_Halted_While_Subscription_Is_Still_Ongoing.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Execution_Is_Halted_While_Subscription_Is_Still_Ongoing.yaml index c56a349960c..39cb784934f 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Execution_Is_Halted_While_Subscription_Is_Still_Ongoing.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/CancellationTests.Execution_Is_Halted_While_Subscription_Is_Still_Ongoing.yaml @@ -68,12 +68,6 @@ sourceSchemas: "errors": [ { "message": "Could not produce review", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "onReviewCreated" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_Extensions_From_Source_Schema_Are_Properly_Forwarded.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_Extensions_From_Source_Schema_Are_Properly_Forwarded.yaml index ffd7c58bb2c..3936766b644 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_Extensions_From_Source_Schema_Are_Properly_Forwarded.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_Extensions_From_Source_Schema_Are_Properly_Forwarded.yaml @@ -46,12 +46,6 @@ sourceSchemas: "errors": [ { "message": "Something went wrong", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "someField" ], diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Halt.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Halt.yaml index ad5d46a25f4..86f6bbda802 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Halt.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Halt.yaml @@ -113,12 +113,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -133,12 +127,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -153,12 +141,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Null.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Null.yaml index 71e8d18bf91..3fc85073acc 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Null.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Null.yaml @@ -145,12 +145,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -165,12 +159,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -185,12 +173,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Propagate.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Propagate.yaml index e68f2836769..1a913d705ee 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Propagate.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_In_List_OnError_Propagate.yaml @@ -144,12 +144,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -164,12 +158,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -184,12 +172,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Halt.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Halt.yaml index 1101ad8bd1a..94720026ab0 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Halt.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Halt.yaml @@ -94,12 +94,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Null.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Null.yaml index a2fd147935b..d0e7c4a9957 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Null.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Null.yaml @@ -100,12 +100,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Propagate.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Propagate.yaml index ba31c74d2db..7850f33c18e 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Propagate.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Field_OnError_Propagate.yaml @@ -99,12 +99,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Halt.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Halt.yaml index 012eaad7478..cb5f798e19d 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Halt.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Halt.yaml @@ -113,12 +113,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -133,12 +127,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -153,12 +141,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Null.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Null.yaml index 588e98daca9..ba8a5029d94 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Null.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Null.yaml @@ -145,12 +145,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -165,12 +159,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -185,12 +173,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Propagate.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Propagate.yaml index ead712a5f2f..18552f06227 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Propagate.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_NonNull_OnError_Propagate.yaml @@ -112,12 +112,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -132,12 +126,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] @@ -152,12 +140,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Halt.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Halt.yaml index 25b8242856b..dec776c96b4 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Halt.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Halt.yaml @@ -113,12 +113,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" @@ -136,12 +130,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" @@ -159,12 +147,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Null.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Null.yaml index 159f5a363f4..467ce3b9060 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Null.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Null.yaml @@ -145,12 +145,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" @@ -168,12 +162,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" @@ -191,12 +179,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Propagate.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Propagate.yaml index 5e1e3ea6e5c..f2e9911e655 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Propagate.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_In_List_OnError_Propagate.yaml @@ -144,12 +144,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" @@ -167,12 +161,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" @@ -190,12 +178,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Halt.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Halt.yaml index 25ebf37958f..157973a0108 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Halt.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Halt.yaml @@ -94,12 +94,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Null.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Null.yaml index 82e0e776c41..a66d94e7cdf 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Null.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Null.yaml @@ -100,12 +100,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Propagate.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Propagate.yaml index e6b5913d04c..7a4186d81ec 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Propagate.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_NonNull_OnError_Propagate.yaml @@ -93,12 +93,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Halt.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Halt.yaml index 2b35f43081d..2b40e33950a 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Halt.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Halt.yaml @@ -94,12 +94,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Null.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Null.yaml index cdfb5bfee91..41e32d1c801 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Null.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Null.yaml @@ -100,12 +100,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Propagate.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Propagate.yaml index 37913ca0554..852d595015b 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Propagate.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Lookup_Leaf_OnError_Propagate.yaml @@ -99,12 +99,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Halt.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Halt.yaml index 2e63fcd8853..1c5a760f448 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Halt.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Halt.yaml @@ -49,12 +49,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Null.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Null.yaml index 28f1bb1aa06..2025c497028 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Null.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Null.yaml @@ -52,12 +52,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Propagate.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Propagate.yaml index 4ab469854c4..cb08cd00a61 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Propagate.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Field_OnError_Propagate.yaml @@ -51,12 +51,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Halt.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Halt.yaml index ace8a030e95..65b5c9895d3 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Halt.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Halt.yaml @@ -50,12 +50,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 3, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Null.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Null.yaml index f26ed11ca88..c445fb8baaf 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Null.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Null.yaml @@ -55,12 +55,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 3, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Propagate.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Propagate.yaml index dfed1bc3ec2..fd07ff284ef 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Propagate.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.Error_On_Root_Leaf_OnError_Propagate.yaml @@ -54,12 +54,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 3, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Halt.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Halt.yaml index 80d61079dd3..de2886aecd4 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Halt.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Halt.yaml @@ -94,12 +94,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Null.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Null.yaml index b5808323917..b798d10242b 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Null.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Null.yaml @@ -100,12 +100,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Propagate.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Propagate.yaml index 5a6ef6d3431..0ce71a9e555 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Propagate.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Field_NonNull_OnError_Propagate.yaml @@ -93,12 +93,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Halt.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Halt.yaml index ee505e22443..889bd2c60a6 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Halt.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Halt.yaml @@ -94,12 +94,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Null.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Null.yaml index 65e4bfa011b..34802735c60 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Null.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Null.yaml @@ -100,12 +100,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Propagate.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Propagate.yaml index 965f0f72366..870450722b8 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Propagate.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Lookup_Leaf_NonNull_OnError_Propagate.yaml @@ -93,12 +93,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product.name", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "productById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Halt.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Halt.yaml index e78b20a3a68..2f39e67321a 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Halt.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Halt.yaml @@ -49,12 +49,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Null.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Null.yaml index ebd23e3d03e..fcf5004f6a9 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Null.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Null.yaml @@ -52,12 +52,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Propagate.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Propagate.yaml index 7969aba8bc1..0ad108fc55f 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Propagate.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/__snapshots__/SourceSchemaErrorTests.No_Data_And_Error_With_Path_For_Root_Field_NonNull_OnError_Propagate.yaml @@ -48,12 +48,6 @@ sourceSchemas: "errors": [ { "message": "Could not resolve Product", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "productById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_EntryField_NonNull_One_Service_Errors_EntryField.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_EntryField_NonNull_One_Service_Errors_EntryField.yaml index b63f5d8c073..b64c80f82a4 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_EntryField_NonNull_One_Service_Errors_EntryField.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_EntryField_NonNull_One_Service_Errors_EntryField.yaml @@ -72,12 +72,6 @@ sourceSchemas: "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "other" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_EntryField_Nullable_One_Service_Errors_EntryField.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_EntryField_Nullable_One_Service_Errors_EntryField.yaml index a1741c8cd93..e1d8b1e02fc 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_EntryField_Nullable_One_Service_Errors_EntryField.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_EntryField_Nullable_One_Service_Errors_EntryField.yaml @@ -87,12 +87,6 @@ sourceSchemas: "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "other" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_NonNull_EntryField_NonNull_One_Service_Errors_SubField.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_NonNull_EntryField_NonNull_One_Service_Errors_SubField.yaml index 0fa953035e8..a98f1e81628 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_NonNull_EntryField_NonNull_One_Service_Errors_SubField.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_NonNull_EntryField_NonNull_One_Service_Errors_SubField.yaml @@ -72,12 +72,6 @@ sourceSchemas: "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 3, - "column": 5 - } - ], "path": [ "other", "userId" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_NonNull_EntryField_Nullable_One_Service_Errors_SubField.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_NonNull_EntryField_Nullable_One_Service_Errors_SubField.yaml index 24d0820925f..eff02802c8c 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_NonNull_EntryField_Nullable_One_Service_Errors_SubField.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_NonNull_EntryField_Nullable_One_Service_Errors_SubField.yaml @@ -87,12 +87,6 @@ sourceSchemas: "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 3, - "column": 5 - } - ], "path": [ "other", "userId" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_Nullable_EntryField_Nullable_One_Service_Errors_SubField.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_Nullable_EntryField_Nullable_One_Service_Errors_SubField.yaml index df4dff0c19b..85438db1290 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_Nullable_EntryField_Nullable_One_Service_Errors_SubField.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Parallel_SubField_Nullable_EntryField_Nullable_One_Service_Errors_SubField.yaml @@ -90,12 +90,6 @@ sourceSchemas: "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 3, - "column": 5 - } - ], "path": [ "other", "userId" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_NonNull_One_Service_Errors_EntryField.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_NonNull_One_Service_Errors_EntryField.yaml index 60d3fb6a170..1b3d0f292f6 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_NonNull_One_Service_Errors_EntryField.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_NonNull_One_Service_Errors_EntryField.yaml @@ -105,12 +105,6 @@ sourceSchemas: "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "brandById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_NonNull_One_Service_Errors_SubField.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_NonNull_One_Service_Errors_SubField.yaml index 25eac97730e..a595dc063b5 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_NonNull_One_Service_Errors_SubField.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_NonNull_One_Service_Errors_SubField.yaml @@ -105,12 +105,6 @@ sourceSchemas: "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "brandById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_Nullable_One_Service_Errors_EntryField.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_Nullable_One_Service_Errors_EntryField.yaml index 767440f9dce..7d0ef901476 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_Nullable_One_Service_Errors_EntryField.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_Nullable_One_Service_Errors_EntryField.yaml @@ -108,12 +108,6 @@ sourceSchemas: "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "brandById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_Nullable_One_Service_Errors_SubField.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_Nullable_One_Service_Errors_SubField.yaml index 82f7987e4c1..8730cfc995b 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_Nullable_One_Service_Errors_SubField.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_NonNull_Parent_Nullable_One_Service_Errors_SubField.yaml @@ -108,12 +108,6 @@ sourceSchemas: "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "brandById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_Nullable_Parent_Nullable_One_Service_Errors_EntryField.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_Nullable_Parent_Nullable_One_Service_Errors_EntryField.yaml index f0a77593a12..e0d03c5fccb 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_Nullable_Parent_Nullable_One_Service_Errors_EntryField.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_Nullable_Parent_Nullable_One_Service_Errors_EntryField.yaml @@ -111,12 +111,6 @@ sourceSchemas: "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 4, - "column": 3 - } - ], "path": [ "brandById" ] diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_Nullable_Parent_Nullable_One_Service_Errors_SubField.yaml b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_Nullable_Parent_Nullable_One_Service_Errors_SubField.yaml index f7a3aa98214..63be5799b16 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_Nullable_Parent_Nullable_One_Service_Errors_SubField.yaml +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/v15/__snapshots__/SubgraphErrorTests.Resolve_Sequence_SubField_Nullable_Parent_Nullable_One_Service_Errors_SubField.yaml @@ -111,12 +111,6 @@ sourceSchemas: "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 5, - "column": 5 - } - ], "path": [ "brandById", "name" diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.Utilities.Tests/Rewriters/InlineFragmentOperationRewriterTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.Utilities.Tests/Rewriters/InlineFragmentOperationRewriterTests.cs index 8c66269a3ed..4a03c817556 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.Utilities.Tests/Rewriters/InlineFragmentOperationRewriterTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.Utilities.Tests/Rewriters/InlineFragmentOperationRewriterTests.cs @@ -699,4 +699,41 @@ ... UnknownFragment "A fragment with the name 'UnknownFragment' does not exist.", Assert.Throws(Action).Message); } + + [Fact] + public void Single_Include_With_Variable() + { + // arrange + var sourceText = FileResource.Open("schema1.graphql"); + var schemaDefinition = SchemaParser.Parse(sourceText); + + var doc = Utf8GraphQLParser.Parse( + """ + query($skip: Boolean!) { + productById(id: 1) { + name @include(if: $skip) + id + } + } + """); + + // act + var rewriter = new InlineFragmentOperationRewriter( + schemaDefinition, + removeStaticallyExcludedSelections: true); + var rewritten = rewriter.RewriteDocument(doc); + + // assert + rewritten.MatchInlineSnapshot( + """ + query( + $skip: Boolean! + ) { + productById(id: 1) { + name @include(if: $skip) + id + } + } + """); + } } From 183bce543a7b745e34bcc0a5a824ddfac0a7db9a Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 9 Dec 2025 12:17:47 +0100 Subject: [PATCH 029/144] fixed tests --- .../Types/Execution/Processing/OperationCompilerOptimizers.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizers.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizers.cs index e60919fe435..855c089dfd4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizers.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompilerOptimizers.cs @@ -7,8 +7,8 @@ namespace HotChocolate.Execution.Processing; // TODO : We might remove this internal sealed class OperationCompilerOptimizers { - private ImmutableArray _operationOptimizers; - private ImmutableArray _selectionSetOptimizers; + private ImmutableArray _operationOptimizers = []; + private ImmutableArray _selectionSetOptimizers = []; private PropertyInitFlags _initFlags; public ImmutableArray OperationOptimizers From 11075e61ff83f2546392271bc94392e94ef0a8db Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 12 Dec 2025 09:50:52 +0100 Subject: [PATCH 030/144] wip --- .../Processing/OperationCompilerTests.cs | 58 +++++++++++-------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs index 103dee2fb3c..a5d11e907b5 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs @@ -544,11 +544,13 @@ public void Object_Field_Visibility_Is_Correctly_Inherited_3() .Create(); var document = Utf8GraphQLParser.Parse( - @"query foo($v: Boolean!, $q: Boolean!) { - hero(episode: EMPIRE) @include(if: $v) { - name @include(if: $q) - } - }"); + """ + query foo($v: Boolean!, $q: Boolean!) { + hero(episode: EMPIRE) @include(if: $v) { + name @include(if: $q) + } + } + """); // act var operation = OperationCompiler.Compile( @@ -603,14 +605,16 @@ public void Defer_Inline_Fragment() .Create(); var document = Utf8GraphQLParser.Parse( - @"{ - hero(episode: EMPIRE) { - name - ... @defer { - id - } + """ + { + hero(episode: EMPIRE) { + name + ... @defer { + id } - }"); + } + } + """); // act var operation = OperationCompiler.Compile( @@ -631,16 +635,18 @@ public void Defer_Fragment_Spread() .Create(); var document = Utf8GraphQLParser.Parse( - @"{ - hero(episode: EMPIRE) { - name - ... Foo @defer - } + """ + { + hero(episode: EMPIRE) { + name + ... Foo @defer + } } fragment Foo on Droid { - id - }"); + id + } + """); // act var operation = OperationCompiler.Compile( @@ -691,14 +697,16 @@ public void FragmentSpread_SelectionsSet_Empty() .Create(); var document = Utf8GraphQLParser.Parse( - @"query foo($v: Boolean){ - hero(episode: EMPIRE) { - name @include(if: $v) - ... abc - } + """ + query foo($v: Boolean){ + hero(episode: EMPIRE) { + name @include(if: $v) + ... abc + } } - fragment abc on Droid { }"); + fragment abc on Droid { } + """); // act var operation = OperationCompiler.Compile( From f8e619c907a1c05f7d4bdc8c298299f3e515de04 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Mon, 15 Dec 2025 08:27:10 +0100 Subject: [PATCH 031/144] wip --- .../Internal/MiddlewareContextMarshal.cs | 2 +- .../Processing/MiddlewareContext.Global.cs | 2 +- .../Processing/MiddlewareContext.Pooling.cs | 13 +- .../Processing/MiddlewareContext.Selection.cs | 2 - .../Processing/MiddlewareContext.State.cs | 5 +- .../Processing/OperationContext.Execution.cs | 15 +- .../Types/Execution/Processing/PathHelper.cs | 146 -------- .../Execution/Processing/QueryExecutor.cs | 20 +- .../Execution/Processing/Result/ListResult.cs | 192 ---------- .../Processing/Result/ListResultPool.cs | 40 --- .../Processing/Result/ObjectFieldResult.cs | 44 --- .../Processing/Result/ObjectResult.cs | 301 ---------------- .../Result/ObjectResultExtensions.cs | 11 - .../Processing/Result/ObjectResultPool.cs | 40 --- .../Processing/Result/ResultBucket.cs | 81 ----- .../Result/ResultBuilder.NonNullHandling.cs | 45 --- .../Result/ResultBuilder.ObjectResult.cs | 46 --- .../Result/ResultBuilder.Pooling.cs | 58 --- .../Processing/Result/ResultBuilder.cs | 339 ------------------ .../Execution/Processing/Result/ResultData.cs | 72 ---- .../Processing/Result/ResultMemoryOwner.cs | 28 -- .../Execution/Processing/Result/ResultPool.cs | 37 -- .../Processing/Result/ResultPoolDefaults.cs | 8 - .../Tasks/ResolverTask.CompleteValue.cs | 15 +- .../Processing/Tasks/ResolverTask.Execute.cs | 6 +- .../Processing/Tasks/ResolverTask.Pooling.cs | 12 +- .../Processing/Tasks/ResolverTask.cs | 5 - .../Processing/Tasks/ResolverTaskFactory.cs | 25 +- .../Processing/ValueCompletion.Leaf.cs | 29 +- .../Processing/ValueCompletion.List.cs | 42 +-- .../Processing/ValueCompletion.Object.cs | 1 - .../Execution/Processing/ValueCompletion.cs | 52 +-- .../Core/src/Types/HotChocolate.Types.csproj | 4 + .../src/Types/Text/Json/ResultDocument.cs | 4 +- .../src/Types/Types/Contracts/ILeafType.cs | 61 ++++ 35 files changed, 162 insertions(+), 1641 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/PathHelper.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResult.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResultPool.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectFieldResult.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResult.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultExtensions.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultPool.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBucket.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.ObjectResult.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.Pooling.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultData.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultMemoryOwner.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPool.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPoolDefaults.cs diff --git a/src/HotChocolate/Core/src/Types/Execution/Internal/MiddlewareContextMarshal.cs b/src/HotChocolate/Core/src/Types/Execution/Internal/MiddlewareContextMarshal.cs index 01f583a780f..1d32ba7964d 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Internal/MiddlewareContextMarshal.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Internal/MiddlewareContextMarshal.cs @@ -25,7 +25,7 @@ public static class MiddlewareContextMarshal ArgumentNullException.ThrowIfNull(context); return context is MiddlewareContext middlewareContext - ? middlewareContext.ParentResult + ? middlewareContext.ResultValue : null; } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs index e6dbd0f01c9..4b495a813d5 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs @@ -226,7 +226,7 @@ public IMiddlewareContext Clone() _operationContext.CreateResolverTask( Selection, _parent, - ParentResult, + ResultValue, ResponseIndex, ScopedContextData); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs index 73d88af6347..314510bea0c 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using HotChocolate.Text.Json; namespace HotChocolate.Execution.Processing; @@ -17,11 +18,10 @@ public MiddlewareContext() } public void Initialize( - OperationContext operationContext, - Selection selection, - ObjectResult parentResult, - int responseIndex, object? parent, + Selection selection, + ResultElement resultValue, + OperationContext operationContext, IImmutableDictionary scopedContextData, Path? path) { @@ -30,8 +30,7 @@ public void Initialize( _services = operationContext.Services; _selection = selection; _path = path; - ParentResult = parentResult; - ResponseIndex = responseIndex; + ResultValue = resultValue; _parent = parent; _parser = operationContext.InputParser; ScopedContextData = scopedContextData; @@ -60,7 +59,7 @@ public void Clean() IsResultModified = false; ValueType = null; ResponseIndex = 0; - ParentResult = null!; + ResultValue = default; HasErrors = false; Arguments = null!; RequestAborted = CancellationToken.None; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs index 88ac8f0e8d5..549e9eca418 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs @@ -17,8 +17,6 @@ internal partial class MiddlewareContext public string ResponseName => _selection.ResponseName; - public int ResponseIndex { get; private set; } - public FieldDelegate? ResolverPipeline => _selection.ResolverPipeline; public PureFieldDelegate? PureResolver => _selection.PureResolver; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs index 2fb48366a1a..5af573e6aee 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using HotChocolate.Text.Json; using HotChocolate.Types; using HotChocolate.Utilities; @@ -10,7 +11,7 @@ internal partial class MiddlewareContext private object? _parent; private Path? _path; - public Path Path => _path ??= PathHelper.CreatePathFromContext(Selection, ParentResult, -1); + public Path Path => _path ??= ResultValue.Path.Append(Selection.ResponseName); public IImmutableDictionary ScopedContextData { get; set; } = null!; @@ -18,7 +19,7 @@ internal partial class MiddlewareContext public IType? ValueType { get; set; } - public ObjectResult ParentResult { get; private set; } = null!; + public ResultElement ResultValue { get; private set; } public bool HasErrors { get; private set; } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs index 3fca2464889..f5fc05827e6 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs @@ -1,5 +1,6 @@ using System.Collections.Immutable; using HotChocolate.Execution.Processing.Tasks; +using HotChocolate.Text.Json; namespace HotChocolate.Execution.Processing; @@ -33,6 +34,8 @@ public ResultBuilder Result } } + public ResultDocument ResultDocument => throw new NotImplementedException(); + public RequestContext RequestContext { get @@ -43,10 +46,9 @@ public RequestContext RequestContext } public ResolverTask CreateResolverTask( - Selection selection, object? parent, - ObjectResult parentResult, - int responseIndex, + Selection selection, + ResultElement resultValue, IImmutableDictionary scopedContextData, Path? path = null) { @@ -55,11 +57,10 @@ public ResolverTask CreateResolverTask( var resolverTask = _resolverTaskFactory.Create(); resolverTask.Initialize( - this, - selection, - parentResult, - responseIndex, parent, + selection, + resultValue, + this, scopedContextData, path); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/PathHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/PathHelper.cs deleted file mode 100644 index 1ecbecaf37e..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/PathHelper.cs +++ /dev/null @@ -1,146 +0,0 @@ -using System.Buffers; -using System.Text.Json; - -namespace HotChocolate.Execution.Processing; - -internal static class PathHelper -{ - private const int InitialPathLength = 64; - - public static Path CreatePathFromContext(ObjectResult parent) - { - if (parent.Parent is null) - { - if (parent.PatchPath is null) - { - return Path.Root; - } - - return parent.PatchPath; - } - - return CreatePath(parent); - } - - public static Path CreatePathFromContext(ISelection selection, ResultData parent, int index) - => parent switch - { - ObjectResult => CreatePath(parent, selection.ResponseName), - ListResult => CreatePath(parent, index), - _ => throw new NotSupportedException($"{parent.GetType().FullName} is not a supported parent type.") - }; - - public static Path CombinePath(Path path, JsonElement errorSubPath, int skipSubElements) - { - for (var i = skipSubElements; i < errorSubPath.GetArrayLength(); i++) - { - path = errorSubPath[i] switch - { - { ValueKind: JsonValueKind.String } nameElement => path.Append(nameElement.GetString()!), - { ValueKind: JsonValueKind.Number } indexElement => path.Append(indexElement.GetInt32()), - _ => throw new InvalidOperationException("The error path contains an unsupported element.") - }; - } - - return path; - } - - public static Path CreatePathFromSelection(IReadOnlyList selections, int depth) - { - var path = Path.Root; - for (var j = 0; j < depth; j++) - { - path = path.Append(selections[j].ResponseName); - } - - return path; - } - - private static Path CreatePath(ResultData parent, object segmentValue) - { - var segments = ArrayPool.Shared.Rent(InitialPathLength); - segments[0] = segmentValue; - var current = parent; - var length = Build(segments, ref current); - var path = CreatePath(current.PatchPath, segments, length); - ArrayPool.Shared.Return(segments); - return path; - } - - private static Path CreatePath(ResultData parent) - { - var segments = ArrayPool.Shared.Rent(InitialPathLength); - var current = parent; - var length = Build(segments, ref current, 0); - var path = CreatePath(current.PatchPath, segments, length); - ArrayPool.Shared.Return(segments); - return path; - } - - private static Path CreatePath(Path? patchPath, object[] segments, int length) - { - var root = patchPath ?? Path.Root; - var path = root.Append((string)segments[length - 1]); - - if (length > 1) - { - for (var i = length - 2; i >= 0; i--) - { - path = segments[i] switch - { - string s => path.Append(s), - int n => path.Append(n), - _ => path - }; - } - } - - return path; - } - - private static int Build(object[] segments, ref ResultData parent, int start = 1) - { - var segment = start; - var current = parent; - - while (current.Parent is not null) - { - if (segments.Length <= segment) - { - var temp = ArrayPool.Shared.Rent(segments.Length * 2); - segments.AsSpan().CopyTo(temp); - ArrayPool.Shared.Return(segments); - segments = temp; - } - - var i = current.ParentIndex; - var p = current.Parent; - - switch (p) - { - case ObjectResult o: - var field = o[i]; - - if (!field.IsInitialized) - { - throw new InvalidOperationException("Cannot build path from an uninitialized field."); - } - - segments[segment++] = field.Name; - current = o; - break; - - case ListResult l: - segments[segment++] = i; - current = l; - break; - - default: - throw new NotSupportedException($"{p.GetType().FullName} is not a supported parent type."); - } - } - - parent = current; - return segment; - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs index 0953a0a3c5e..cec7f1fa841 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs @@ -23,16 +23,16 @@ private static async Task ExecuteInternalAsync( OperationContext operationContext, IImmutableDictionary scopedContext) { - var resultMap = EnqueueResolverTasks( + EnqueueResolverTasks( operationContext, - operationContext.Operation.RootSelectionSet, operationContext.RootValue, - Path.Root, - scopedContext); + operationContext.ResultDocument.Data, + scopedContext, + Path.Root); await operationContext.Scheduler.ExecuteAsync().ConfigureAwait(false); - return operationContext.SetData(resultMap).BuildResult(); + return operationContext.BuildResult(); } public async Task ExecuteBatchAsync( @@ -62,14 +62,12 @@ private static void FillSchedulerWithWork( var context = contextOwner.OperationContext; context.Scheduler = scheduler; - var resultMap = EnqueueResolverTasks( + EnqueueResolverTasks( context, - context.Operation.RootSelectionSet, context.RootValue, - Path.Root, - scopedContext); - - context.SetData(resultMap); + context.ResultDocument.Data, + scopedContext, + Path.Root); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResult.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResult.cs deleted file mode 100644 index 4278df600a1..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResult.cs +++ /dev/null @@ -1,192 +0,0 @@ -using System.Collections; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Text.Json; - -namespace HotChocolate.Execution.Processing; - -/// -/// Represents an optimized list result that is used by the execution engine -/// to store completed elements. -/// -public sealed class ListResult : ResultData, IReadOnlyList -{ - private object?[] _buffer = []; - private int _capacity; - private int _count; - - /// - /// Gets the number of elements this list can hold. - /// - public int Capacity => _capacity; - - /// - /// Gets the number of elements in this list. - /// - public int Count => _count; - - /// - public object? this[int index] => _buffer[index]; - - /// - /// Defines if the elements of this list are nullable. - /// - internal bool IsNullable { get; set; } - - internal int AddUnsafe(object? item) - { - var index = _count++; - _buffer[index] = item; - return index; - } - - internal int AddUnsafe(ResultData? item) - { - var index = _count++; - item?.SetParent(this, index); - _buffer[index] = item; - return index; - } - - internal void SetUnsafe(int index, object? item) - { - _buffer[index] = item; - } - - internal void SetUnsafe(int index, ResultData? item) - { - item?.SetParent(this, index); - _buffer[index] = item; - } - - internal bool TrySetNull(int index) - { - if (_count > index) - { - _buffer[index] = null; - return IsNullable; - } - - return false; - } - - /// - /// Ensures that the result object has enough capacity on the buffer - /// to store the expected fields. - /// - /// - /// The capacity needed. - /// - internal void EnsureCapacity(int requiredCapacity) - { - // If this list has a capacity specified we will reset it. - // The capacity is only set when the list is rented out, - // Once the item is returned the capacity is reset to zero. - if (_capacity > 0) - { - Reset(); - } - - if (_buffer.Length < requiredCapacity) - { - Array.Resize(ref _buffer, requiredCapacity); - } - - _capacity = requiredCapacity; - } - - /// - /// Grows the internal capacity. - /// - internal void Grow() - { - if (_capacity == 0) - { - EnsureCapacity(4); - return; - } - - var newCapacity = _capacity * 2; - Array.Resize(ref _buffer, newCapacity); - _capacity = newCapacity; - } - - public override void WriteTo( - Utf8JsonWriter writer, - JsonSerializerOptions? options = null, - JsonNullIgnoreCondition nullIgnoreCondition = JsonNullIgnoreCondition.None) - { -#if NET9_0_OR_GREATER - options ??= JsonSerializerOptions.Web; -#else - options ??= JsonSerializerOptions.Default; -#endif - - writer.WriteStartArray(); - - ref var item = ref GetReference(); - ref var end = ref Unsafe.Add(ref item, _count); - - while (Unsafe.IsAddressLessThan(ref item, ref end)) - { - if (item is null) - { - if ((nullIgnoreCondition & JsonNullIgnoreCondition.Lists) != JsonNullIgnoreCondition.Lists) - { - writer.WriteNullValue(); - } - } - else - { - if (item is ResultData resultData) - { - resultData.WriteTo(writer, options, nullIgnoreCondition); - } - else - { - JsonValueFormatter.WriteValue(writer, item, options, nullIgnoreCondition); - } - } - - item = ref Unsafe.Add(ref item, 1)!; - } - - writer.WriteEndArray(); - } - - /// - /// Resets the result object. - /// - internal void Reset() - { - if (_capacity > 0) - { - _buffer.AsSpan()[.._capacity].Clear(); - _capacity = 0; - _count = 0; - } - - IsInvalidated = false; - ParentIndex = 0; - Parent = null; - PatchId = 0; - PatchPath = null; - } - - private ref object? GetReference() - => ref MemoryMarshal.GetReference(_buffer.AsSpan()); - - /// - public IEnumerator GetEnumerator() - { - for (var i = 0; i < _count; i++) - { - yield return _buffer[i]; - } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResultPool.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResultPool.cs deleted file mode 100644 index f2ff62fee19..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ListResultPool.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.Extensions.ObjectPool; - -namespace HotChocolate.Execution.Processing; - -internal sealed class ListResultPool(int maximumRetained, int maxAllowedCapacity, int bucketSize) - : DefaultObjectPool>(new BufferPolicy(maxAllowedCapacity, bucketSize), maximumRetained) -{ - private sealed class BufferPolicy(int maxAllowedCapacity, int bucketSize) - : PooledObjectPolicy> - { - private readonly ObjectPolicy _objectPolicy = new(maxAllowedCapacity); - - public override ResultBucket Create() - => new(bucketSize, _objectPolicy); - - public override bool Return(ResultBucket obj) - { - obj.Reset(); - return true; - } - } - - private sealed class ObjectPolicy(int maxAllowedCapacity) - : PooledObjectPolicy - { - public override ListResult Create() => new(); - - public override bool Return(ListResult obj) - { - if (obj.Count > maxAllowedCapacity) - { - obj.Reset(); - return false; - } - - obj.Reset(); - return true; - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectFieldResult.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectFieldResult.cs deleted file mode 100644 index 09fbb050557..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectFieldResult.cs +++ /dev/null @@ -1,44 +0,0 @@ -namespace HotChocolate.Execution.Processing; - -public sealed class ObjectFieldResult -{ - private Flags _flags = Flags.Nullable; - private string _name = null!; - private object? _value; - - public string Name => _name; - - public object? Value => _value; - - internal bool IsNullable => (_flags & Flags.Nullable) == Flags.Nullable; - - internal bool IsInitialized => (_flags & Flags.Initialized) == Flags.Initialized; - - internal void Set(string name, object? value, bool isNullable) - { - _name = name; - _value = value; - _flags = isNullable ? Flags.InitializedAndNullable : Flags.Initialized; - } - - internal bool TrySetNull() - { - _value = null; - return (_flags & Flags.InitializedAndNullable) == Flags.InitializedAndNullable; - } - - internal void Reset() - { - _name = null!; - _value = null; - _flags = Flags.Nullable; - } - - [Flags] - private enum Flags : byte - { - Initialized = 1, - Nullable = 2, - InitializedAndNullable = Initialized | Nullable - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResult.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResult.cs deleted file mode 100644 index cd6fb31319b..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResult.cs +++ /dev/null @@ -1,301 +0,0 @@ -using System.Collections; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Text.Json; - -namespace HotChocolate.Execution.Processing; - -/// -/// Represents an optimized object result that is used by the execution engine -/// to store completed values. -/// -public sealed class ObjectResult - : ResultData - , IReadOnlyDictionary - , IEnumerable -{ - private ObjectFieldResult[] _buffer = []; - private int _capacity; - - /// - /// Gets the capacity of this object result. - /// It essentially specifies how many field results can be stored. - /// - internal int Capacity => _capacity; - - /// - /// This indexer allows direct access to the underlying buffer - /// to access a . - /// - internal ObjectFieldResult this[int index] => _buffer[index]; - - /// - /// Gets a reference to the first in the buffer. - /// - private ref ObjectFieldResult GetReference() - => ref MemoryMarshal.GetReference(_buffer.AsSpan()); - - /// - /// Sets a field value in the buffer. - /// Note: Set will not validate if the buffer has enough space. - /// - /// - /// The index in the buffer on which the value shall be stored. - /// - /// - /// The name of the field. - /// - /// - /// The field value. - /// - /// - /// Specifies if the value is allowed to be null. - /// - internal void SetValueUnsafe(int index, string name, object? value, bool isNullable = true) - => _buffer[index].Set(name, value, isNullable); - - /// - /// Sets a field value in the buffer. - /// Note: Set will not validate if the buffer has enough space. - /// - /// - /// The index in the buffer on which the value shall be stored. - /// - /// - /// The name of the field. - /// - /// - /// The field value. - /// - /// - /// Specifies if the value is allowed to be null. - /// - internal void SetValueUnsafe(int index, string name, ResultData? value, bool isNullable = true) - { - value?.SetParent(this, index); - _buffer[index].Set(name, value, isNullable); - } - - /// - /// Removes a field value from the buffer. - /// Note: Remove will not validate if the buffer has enough space. - /// - /// - /// The index in the buffer on which the value shall be removed. - /// - internal void RemoveValueUnsafe(int index) - { - _buffer[index].Reset(); - } - - /// - /// Searches within the capacity of the buffer to find a field value that matches - /// the specified . - /// - /// - /// The name of the field to search for. - /// - /// - /// The index on the buffer where the field value is located. - /// - /// - /// Returns the field value or null. - /// - internal ObjectFieldResult? TryGetValue(string name, out int index) - { - ref var searchSpace = ref GetReference(); - - for (var i = 0; i < _capacity; i++) - { - var item = Unsafe.Add(ref searchSpace, i); - if (name.Equals(item.Name, StringComparison.Ordinal)) - { - index = i; - return item; - } - } - - index = -1; - return null; - } - - /// - /// Ensures that the result object has enough capacity on the buffer - /// to store the expected fields. - /// - /// - /// The capacity needed. - /// - internal void EnsureCapacity(int capacity) - { - if (_capacity > 0) - { - Reset(); - } - - if (_buffer.Length < capacity) - { - var oldCapacity = _buffer.Length; - Array.Resize(ref _buffer, capacity); - - for (var i = oldCapacity; i < _buffer.Length; i++) - { - _buffer[i] = new ObjectFieldResult(); - } - } - - _capacity = capacity; - } - - public override void WriteTo( - Utf8JsonWriter writer, - JsonSerializerOptions? options = null, - JsonNullIgnoreCondition nullIgnoreCondition = JsonNullIgnoreCondition.None) - { -#if NET9_0_OR_GREATER - options ??= JsonSerializerOptions.Web; -#else - options ??= JsonSerializerOptions.Default; -#endif - - writer.WriteStartObject(); - - ref var field = ref GetReference(); - ref var end = ref Unsafe.Add(ref field, _capacity); - - while (Unsafe.IsAddressLessThan(ref field, ref end)) - { - if (field.IsInitialized) - { - switch (field.Value) - { - case null: - if ((nullIgnoreCondition & JsonNullIgnoreCondition.Fields) == JsonNullIgnoreCondition.Fields) - { - break; - } - - writer.WriteNull(field.Name); - break; - - case ResultData resultData: - writer.WritePropertyName(field.Name); - resultData.WriteTo(writer, options, nullIgnoreCondition); - break; - - default: - writer.WritePropertyName(field.Name); - JsonValueFormatter.WriteValue(writer, field.Value, options, nullIgnoreCondition); - break; - } - } - - field = ref Unsafe.Add(ref field, 1)!; - } - - writer.WriteEndObject(); - } - - /// - /// Resets the result object. - /// - internal void Reset() - { - ref var searchSpace = ref GetReference(); - - for (var i = 0; i < _capacity; i++) - { - Unsafe.Add(ref searchSpace, i).Reset(); - } - - _capacity = 0; - IsInvalidated = false; - ParentIndex = 0; - Parent = null; - PatchId = 0; - PatchPath = null; - } - - object? IReadOnlyDictionary.this[string key] - => TryGetValue(key, out _)?.Value; - - IEnumerable IReadOnlyDictionary.Keys - { - get - { - for (var i = 0; i < _capacity; i++) - { - var fieldResult = _buffer[i]; - - if (fieldResult.IsInitialized) - { - yield return fieldResult.Name; - } - } - } - } - - IEnumerable IReadOnlyDictionary.Values - { - get - { - for (var i = 0; i < _capacity; i++) - { - var fieldResult = _buffer[i]; - - if (fieldResult.IsInitialized) - { - yield return fieldResult.Value; - } - } - } - } - - int IReadOnlyCollection>.Count => _capacity; - - bool IReadOnlyDictionary.ContainsKey(string key) - => TryGetValue(key, out _)?.Name is not null; - - bool IReadOnlyDictionary.TryGetValue(string key, out object? value) - { - var field = TryGetValue(key, out _); - - if (field?.Name is not null) - { - value = field.Value; - return true; - } - - value = null; - return false; - } - - public IEnumerator GetEnumerator() - { - for (var i = 0; i < _capacity; i++) - { - var field = _buffer[i]; - - if (field.IsInitialized) - { - yield return field; - } - } - } - - IEnumerator> - IEnumerable>.GetEnumerator() - { - for (var i = 0; i < _capacity; i++) - { - var field = _buffer[i]; - - if (field.IsInitialized) - { - yield return new KeyValuePair(field.Name, field.Value); - } - } - } - - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultExtensions.cs deleted file mode 100644 index 4e2c4fad373..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultExtensions.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Runtime.CompilerServices; -using HotChocolate.Types; - -namespace HotChocolate.Execution.Processing; - -internal static class ObjectResultExtensions -{ - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void InitValueUnsafe(this ObjectResult result, int index, ISelection selection) - => result.SetValueUnsafe(index, selection.ResponseName, null, selection.Type.Kind is not TypeKind.NonNull); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultPool.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultPool.cs deleted file mode 100644 index 9134c068f54..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ObjectResultPool.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.Extensions.ObjectPool; - -namespace HotChocolate.Execution.Processing; - -internal sealed class ObjectResultPool(int maximumRetained, int maxAllowedCapacity, int bucketSize) - : DefaultObjectPool>(new BufferPolicy(maxAllowedCapacity, bucketSize), maximumRetained) -{ - private sealed class BufferPolicy(int maxAllowedCapacity, int bucketSize) - : PooledObjectPolicy> - { - private readonly ObjectPolicy _objectPolicy = new(maxAllowedCapacity); - - public override ResultBucket Create() - => new(bucketSize, _objectPolicy); - - public override bool Return(ResultBucket obj) - { - obj.Reset(); - return true; - } - } - - private sealed class ObjectPolicy(int maxAllowedCapacity) - : PooledObjectPolicy - { - public override ObjectResult Create() => new(); - - public override bool Return(ObjectResult obj) - { - if (obj.Capacity > maxAllowedCapacity) - { - obj.Reset(); - return false; - } - - obj.Reset(); - return true; - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBucket.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBucket.cs deleted file mode 100644 index aa4260e50f6..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBucket.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using Microsoft.Extensions.ObjectPool; - -namespace HotChocolate.Execution.Processing; - -internal sealed class ResultBucket where T : class -{ - private readonly int _capacity; - private readonly IPooledObjectPolicy _policy; - private readonly T?[] _buffer; - private int _index; - - public ResultBucket(int capacity, IPooledObjectPolicy policy) - { - _capacity = capacity; - _policy = policy; - _buffer = new T[capacity]; - } - - public T Pop() - { - if (TryPop(out var obj)) - { - return obj; - } - - throw new InvalidOperationException("Buffer is used up."); - } - - public bool TryPop([NotNullWhen(true)] out T? obj) - { - var nextIndex = Interlocked.Increment(ref _index); - if (nextIndex < _capacity) - { - var buffered = _buffer[nextIndex]; - - if (buffered is not null) - { - obj = buffered; - return true; - } - - obj = _policy.Create(); - _buffer[nextIndex] = obj; - return true; - } - - obj = null; - return false; - } - - public void Reset() - { - if (_index == 0) - { - return; - } - - if (_index >= _capacity) - { - _index = _capacity; - } - - ref var mem = ref MemoryMarshal.GetReference(_buffer.AsSpan()); - ref var end = ref Unsafe.Add(ref mem, _index); - - while (Unsafe.IsAddressLessThan(ref mem, ref end)) - { - if (mem is not null && !_policy.Return(mem)) - { - mem = null; - } - - mem = ref Unsafe.Add(ref mem, 1); - } - - _index = 0; - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs deleted file mode 100644 index 2eda9295e82..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.NonNullHandling.cs +++ /dev/null @@ -1,45 +0,0 @@ -using HotChocolate.Language; -using static HotChocolate.Execution.ErrorHelper; - -namespace HotChocolate.Execution.Processing; - -internal sealed partial class ResultBuilder -{ - private void ApplyNonNullViolations( - List errors, - List violations, - HashSet fieldErrors) - { - if (violations.Count == 0) - { - return; - } - - var errorHandler = _context.Schema.Services.GetRequiredService(); - - while (violations.TryPop(out var violation)) - { - if (fieldErrors.Contains(violation.Selection)) - { - continue; - } - - if (_errorPaths.Contains(violation.Path)) - { - continue; - } - - var error = NonNullOutputFieldViolation(violation.Path, violation.Selection.GetSyntaxNodes().First()); - error = errorHandler.Handle(error); - _diagnosticEvents.ResolverError(_context, violation.Selection, error); - errors.Add(error); - } - } - - private sealed class NonNullViolation(ISelection selection, Path path) - { - public ISelection Selection { get; } = selection; - - public Path Path { get; } = path; - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.ObjectResult.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.ObjectResult.cs deleted file mode 100644 index 73a5ced5248..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.ObjectResult.cs +++ /dev/null @@ -1,46 +0,0 @@ -namespace HotChocolate.Execution.Processing; - -internal sealed partial class ResultBuilder -{ - private readonly ResultPool _resultPool; - private readonly object _objectSync = new(); - private ResultBucket _objectBucket = null!; - private readonly object _listSync = new(); - private ResultBucket _listBucket = null!; - - public ObjectResult RentObject(int capacity) - { - while (true) - { - if (_objectBucket.TryPop(out var obj)) - { - obj.EnsureCapacity(capacity); - return obj; - } - - lock (_objectSync) - { - _objectBucket = _resultPool.GetObjectBucket(); - _resultOwner.ObjectBuckets.Add(_objectBucket); - } - } - } - - public ListResult RentList(int capacity) - { - while (true) - { - if (_listBucket.TryPop(out var obj)) - { - obj.EnsureCapacity(capacity); - return obj; - } - - lock (_listSync) - { - _listBucket = _resultPool.GetListBucket(); - _resultOwner.ListBuckets.Add(_listBucket); - } - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.Pooling.cs deleted file mode 100644 index c0a131faae2..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.Pooling.cs +++ /dev/null @@ -1,58 +0,0 @@ -using HotChocolate.Execution.Instrumentation; - -namespace HotChocolate.Execution.Processing; - -internal sealed partial class ResultBuilder -{ - private RequestContext _context = null!; - private IExecutionDiagnosticEvents _diagnosticEvents = null!; - - public ResultBuilder(ResultPool resultPool) - { - _resultPool = resultPool; - InitializeResult(); - } - - public void Initialize( - RequestContext context, - IExecutionDiagnosticEvents diagnosticEvents) - { - _context = context; - _diagnosticEvents = diagnosticEvents; - } - - public void Clear() - { - _errors.Clear(); - _errorPaths.Clear(); - _fieldErrors.Clear(); - _nonNullViolations.Clear(); - _extensions.Clear(); - _contextData.Clear(); - _cleanupTasks.Clear(); - _removedResults.Clear(); - _patchIds.Clear(); - - InitializeResult(); - - _context = null!; - _diagnosticEvents = null!; - _data = null; - _items = null; - _path = null; - _label = null; - _hasNext = null; - _requestIndex = null; - _variableIndex = null; - _singleErrorPerPath = false; - } - - private void InitializeResult() - { - _resultOwner = new ResultMemoryOwner(_resultPool); - _objectBucket = _resultPool.GetObjectBucket(); - _resultOwner.ObjectBuckets.Add(_objectBucket); - _listBucket = _resultPool.GetListBucket(); - _resultOwner.ListBuckets.Add(_listBucket); - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.cs deleted file mode 100644 index 653ea7c7d95..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultBuilder.cs +++ /dev/null @@ -1,339 +0,0 @@ -using System.Buffers; -using System.Runtime.CompilerServices; -using HotChocolate.Properties; -using HotChocolate.Resolvers; - -namespace HotChocolate.Execution.Processing; - -internal sealed partial class ResultBuilder -{ - private readonly List _errors = []; - private readonly HashSet _errorPaths = []; - private readonly HashSet _fieldErrors = []; - private readonly List _nonNullViolations = []; - private readonly HashSet _removedResults = []; - private readonly HashSet _patchIds = []; - - private readonly Dictionary _extensions = []; - private readonly Dictionary _contextData = []; - private readonly List> _cleanupTasks = []; - - private ResultMemoryOwner _resultOwner = null!; - private ObjectResult? _data; - private IReadOnlyList? _items; - private Path? _path; - private string? _label; - private bool? _hasNext; - private int? _requestIndex; - private int? _variableIndex; - private bool _singleErrorPerPath; - - public IReadOnlyList Errors => _errors; - - public void SetData(ObjectResult? data) - { - if (_items is not null) - { - throw new InvalidOperationException( - Resources.ResultBuilder_DataAndItemsNotAllowed); - } - - _data = data; - } - - public void SetItems(IReadOnlyList items) - { - if (_data is not null) - { - throw new InvalidOperationException( - Resources.ResultBuilder_DataAndItemsNotAllowed); - } - - _items = items; - } - - public void SetExtension(string key, object? value) - { - lock (_extensions) - { - _extensions[key] = value; - } - } - - public void SetExtension(string key, UpdateState value) - { - lock (_extensions) - { - if (_extensions.TryGetValue(key, out var current) && current is T casted) - { - _extensions[key] = value(key, casted); - } - else - { - _extensions[key] = value(key, default!); - } - } - } - - public void SetExtension(string key, TState state, UpdateState value) - { - lock (_extensions) - { - if (_extensions.TryGetValue(key, out var current) && current is T casted) - { - _extensions[key] = value(key, casted, state); - } - else - { - _extensions[key] = value(key, default!, state); - } - } - } - - public void SetContextData(string key, object? value) - { - lock (_contextData) - { - _contextData[key] = value; - } - } - - public void SetContextData(string key, UpdateState value) - { - lock (_contextData) - { - _contextData.TryGetValue(key, out var current); - _contextData[key] = value(key, current); - } - } - - public void SetContextData(string key, TState state, UpdateState value) - { - lock (_contextData) - { - _contextData.TryGetValue(key, out var current); - _contextData[key] = value(key, current, state); - } - } - - /// - /// Register cleanup tasks that will be executed after resolver execution is finished. - /// - /// - /// Cleanup action. - /// - public void RegisterForCleanup(Func action) - { - lock (_cleanupTasks) - { - _cleanupTasks.Add(action); - } - } - - public void RegisterForCleanup(T state, Func action) - { - lock (_cleanupTasks) - { - _cleanupTasks.Add(() => action(state)); - } - } - - public void RegisterForCleanup(T state) where T : IDisposable - { - lock (_cleanupTasks) - { - _cleanupTasks.Add( - () => - { - state.Dispose(); - return default!; - }); - } - } - - public void SetPath(Path? path) - => _path = path; - - public void SetLabel(string? label) - => _label = label; - - public void SetHasNext(bool value) - => _hasNext = value; - - public void SetSingleErrorPerPath(bool value = true) - { - _singleErrorPerPath = value; - } - - public void AddError(IError error, ISelection? selection = null) - { - lock (_errors) - { - if (!_singleErrorPerPath || error.Path is null || _errorPaths.Add(error.Path)) - { - _errors.Add(error); - } - - if (selection is not null) - { - _fieldErrors.Add(selection); - } - } - } - - public void AddNonNullViolation(ISelection selection, Path path) - { - var violation = new NonNullViolation(selection, path); - - lock (_errors) - { - _nonNullViolations.Add(violation); - } - } - - public void AddRemovedResult(ResultData result) - { - if (result.PatchId <= 0) - { - return; - } - - lock (_errors) - { - _removedResults.Add(result.PatchId); - } - } - - public void AddPatchId(uint patchId) - { - lock (_patchIds) - { - _patchIds.Add(patchId); - } - } - - public void SetRequestIndex(int requestIndex) - => _requestIndex = requestIndex; - - public void SetVariableIndex(int variableIndex) - => _variableIndex = variableIndex; - - // ReSharper disable InconsistentlySynchronizedField - public IOperationResult BuildResult() - { - ApplyNonNullViolations(_errors, _nonNullViolations, _fieldErrors); - - if (_data?.IsInvalidated == true) - { - // The non-null violation cased the whole result being deleted. - _data = null; - _resultOwner.Dispose(); - } - - if (_data is null && _items is null && _errors.Count == 0 && _hasNext is not false) - { - throw new InvalidOperationException(Resources.ResultHelper_BuildResult_InvalidResult); - } - - if (_errors.Count > 1) - { - _errors.Sort(ErrorComparer.Default); - } - - _removedResults.Remove(0); - - if (_removedResults.Count > 0) - { - _contextData.Add(WellKnownContextData.RemovedResults, _removedResults.ToArray()); - } - - _patchIds.Remove(0); - - if (_patchIds.Count > 0) - { - _contextData.Add(WellKnownContextData.ExpectedPatches, _patchIds.ToArray()); - } - - Func[] cleanupTasks = []; - var cleanupTasksLength = _cleanupTasks.Count; - if (cleanupTasksLength > 0) - { - cleanupTasks = ArrayPool>.Shared.Rent(cleanupTasksLength); - for (var i = 0; i < cleanupTasksLength; i++) - { - cleanupTasks[i] = _cleanupTasks[i]; - } - } - - var result = new OperationResult( - _data, - _errors.Count == 0 ? null : _errors.ToArray(), - CreateExtensionData(_extensions), - CreateExtensionData(_contextData), - items: _items, - incremental: null, - label: _label, - path: _path, - hasNext: _hasNext, - cleanupTasks: (cleanupTasks, cleanupTasksLength), - isDataSet: true, - requestIndex: _requestIndex, - variableIndex: _variableIndex); - - if (_data is not null) - { - result.RegisterForCleanup(_resultOwner); - } - - return result; - } - - // ReSharper restore InconsistentlySynchronizedField - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static Dictionary? CreateExtensionData(Dictionary data) - => data.Count == 0 ? null : new Dictionary(data); - - public void DiscardResult() - => _resultOwner.Dispose(); - - private sealed class ErrorComparer : IComparer - { - public int Compare(IError? x, IError? y) - { - if (ReferenceEquals(x, y)) - { - return 0; - } - - if (ReferenceEquals(null, y)) - { - return 1; - } - - if (ReferenceEquals(null, x)) - { - return -1; - } - - if (y.Locations?.Count > 0) - { - if (x.Locations?.Count > 0) - { - return x.Locations[0].CompareTo(y.Locations[0]); - } - - return 1; - } - - if (x.Locations?.Count > 0) - { - return -1; - } - - return 0; - } - - public static readonly ErrorComparer Default = new(); - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultData.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultData.cs deleted file mode 100644 index 3d8d79da9ef..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultData.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Text.Json; - -namespace HotChocolate.Execution.Processing; - -/// -/// Represents a result data object like an object or list. -/// -public abstract class ResultData : IResultDataJsonFormatter -{ - /// - /// Gets the parent result data object. - /// - protected internal ResultData? Parent { get; protected set; } - - /// - /// Gets the index under which this data is stored in the parent result. - /// - protected internal int ParentIndex { get; protected set; } - - /// - /// Defines that this result was invalidated by one task and can be discarded. - /// - protected internal bool IsInvalidated { get; set; } - - /// - /// Gets an internal ID that tracks result objects. - /// In most cases, this id is 0. But if this result object has - /// significance for deferred work, it will get assigned a proper id which - /// allows us to efficiently track if this result was deleted due to - /// non-null propagation. - /// - public uint PatchId { get; set; } - - /// - /// Gets an internal patch path that specifies from where this result was branched of. - /// - protected internal Path? PatchPath { get; set; } - - /// - /// Connects this result to the parent result. - /// - /// - /// The parent result. - /// - /// - /// The index under which this result is stored in the parent result. - /// - public void SetParent(ResultData parent, int index) - { - ArgumentOutOfRangeException.ThrowIfNegative(index); - - Parent = parent ?? throw new ArgumentNullException(nameof(parent)); - ParentIndex = index; - } - - /// - /// Writes the result data to the given . - /// - /// - /// The writer to write the result data to. - /// - /// - /// The serializer options to use. - /// - /// - /// The null ignore condition. - /// - public abstract void WriteTo( - Utf8JsonWriter writer, - JsonSerializerOptions? options = null, - JsonNullIgnoreCondition nullIgnoreCondition = JsonNullIgnoreCondition.None); -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultMemoryOwner.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultMemoryOwner.cs deleted file mode 100644 index 3a23e261eaf..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultMemoryOwner.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace HotChocolate.Execution.Processing; - -internal sealed class ResultMemoryOwner : IDisposable -{ - private readonly ResultPool _resultPool; - private bool _disposed; - - public ResultMemoryOwner(ResultPool resultPool) - { - _resultPool = resultPool; - } - - public ObjectResult? Data { get; set; } - - public List> ObjectBuckets { get; } = []; - - public List> ListBuckets { get; } = []; - - public void Dispose() - { - if (!_disposed) - { - _resultPool.Return(ObjectBuckets); - _resultPool.Return(ListBuckets); - _disposed = true; - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPool.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPool.cs deleted file mode 100644 index 729e0424dbf..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPool.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace HotChocolate.Execution.Processing; - -internal sealed class ResultPool -{ - private readonly ObjectResultPool _objectResultPool; - private readonly ListResultPool _listResultPool; - - public ResultPool( - ObjectResultPool objectResultPool, - ListResultPool listResultPool) - { - _objectResultPool = objectResultPool; - _listResultPool = listResultPool; - } - - public ResultBucket GetObjectBucket() - => _objectResultPool.Get(); - - public ResultBucket GetListBucket() - => _listResultPool.Get(); - - public void Return(IList> buffers) - { - for (var i = 0; i < buffers.Count; i++) - { - _objectResultPool.Return(buffers[i]); - } - } - - public void Return(IList> buffers) - { - for (var i = 0; i < buffers.Count; i++) - { - _listResultPool.Return(buffers[i]); - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPoolDefaults.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPoolDefaults.cs deleted file mode 100644 index 4356e12589f..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Result/ResultPoolDefaults.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace HotChocolate.Execution.Processing; - -internal static class ResultPoolDefaults -{ - public const int MaximumRetained = 512; - public const int BucketSize = 64; - public const int MaximumAllowedCapacity = 512; -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs index 66ec8dc8bfc..7b5f944f2da 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs @@ -12,11 +12,9 @@ internal sealed partial class ResolverTask /// The execution cancellation token. private void CompleteValue(bool success, CancellationToken cancellationToken) { - var responseIndex = _context.ResponseIndex; var responseName = _context.ResponseName; - var parentResult = _context.ParentResult; + var resultValue = _context.ResultValue; var result = _context.Result; - object? completedResult = null; try { @@ -24,7 +22,7 @@ private void CompleteValue(bool success, CancellationToken cancellationToken) if (success) { var completionContext = new ValueCompletionContext(_operationContext, _context, _taskBuffer); - completedResult = Complete(completionContext, _selection, parentResult, responseIndex, result); + Complete(completionContext, _selection, resultValue, result); } } catch (OperationCanceledException) @@ -42,16 +40,13 @@ private void CompleteValue(bool success, CancellationToken cancellationToken) if (!cancellationToken.IsCancellationRequested) { _context.ReportError(ex); - completedResult = null; + resultValue.SetNullValue(); } } - var isNonNullType = _selection.Type.Kind is TypeKind.NonNull; - _context.ParentResult.SetValueUnsafe(responseIndex, responseName, completedResult, !isNonNullType); - - if (completedResult is null && isNonNullType) + if (resultValue is { IsNullable: false, IsNullOrInvalidated: true }) { - PropagateNullValues(parentResult); + PropagateNullValues(resultValue); _completionStatus = ExecutionTaskStatus.Faulted; _operationContext.Result.AddNonNullViolation(_selection, _context.Path); _taskBuffer.Clear(); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs index 0ffe890c8a2..f536c07f65c 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Execute.cs @@ -6,16 +6,12 @@ namespace HotChocolate.Execution.Processing.Tasks; internal sealed partial class ResolverTask { - private async Task ExecuteAsync(CancellationToken cancellationToken) + private async ValueTask ExecuteAsync(CancellationToken cancellationToken) { try { using (DiagnosticEvents.ResolveFieldValue(_context)) { - // we initialize the field, so we are able to propagate non-null violations - // through the result tree. - _context.ParentResult.InitValueUnsafe(_context.ResponseIndex, _context.Selection); - var success = await TryExecuteAsync(cancellationToken).ConfigureAwait(false); CompleteValue(success, cancellationToken); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs index a5d30fe42a4..50e086e5c8c 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.Pooling.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using HotChocolate.Text.Json; namespace HotChocolate.Execution.Processing.Tasks; @@ -8,18 +9,16 @@ internal sealed partial class ResolverTask /// Initializes this task after it is retrieved from its pool. /// public void Initialize( - OperationContext operationContext, - Selection selection, - ObjectResult parentResult, - int responseIndex, object? parent, + Selection selection, + ResultElement resultValue, + OperationContext operationContext, IImmutableDictionary scopedContextData, Path? path) { _operationContext = operationContext; _selection = selection; - _context.Initialize(operationContext, selection, parentResult, responseIndex, parent, scopedContextData, path); - ParentResult = parentResult; + _context.Initialize(parent, selection, resultValue, operationContext, scopedContextData, path); IsSerial = selection.Strategy is SelectionExecutionStrategy.Serial; } @@ -33,7 +32,6 @@ internal bool Reset() _operationContext = null!; _selection = null!; _context.Clean(); - ParentResult = null!; Status = ExecutionTaskStatus.WaitingToRun; IsSerial = false; IsRegistered = false; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs index 277a00bd565..07244b911ab 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.cs @@ -53,11 +53,6 @@ public ExecutionTaskKind Kind /// public IExecutionTask? Previous { get; set; } - /// - /// Gets access to the internal result map into which the task will write the result. - /// - public ObjectResult ParentResult { get; private set; } = null!; - /// public object? State { get; set; } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs index d48b6592620..6db66a53bb4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs @@ -1,8 +1,8 @@ using System.Collections.Immutable; using System.Diagnostics; using System.Runtime.InteropServices; +using HotChocolate.Text.Json; using HotChocolate.Types; -using static HotChocolate.Execution.Processing.PathHelper; using static HotChocolate.Execution.Processing.ValueCompletion; namespace HotChocolate.Execution.Processing.Tasks; @@ -13,18 +13,16 @@ internal static class ResolverTaskFactory static ResolverTaskFactory() { } - public static ObjectResult EnqueueResolverTasks( + public static void EnqueueResolverTasks( OperationContext operationContext, - SelectionSet selectionSet, object? parent, - Path path, + ResultElement parentResult, IImmutableDictionary scopedContext, - ObjectResult? parentResult = null) + Path path) { + var selectionSet = parentResult.AssertSelectionSet(); var selections = selectionSet.Selections; - var selectionsCount = selections.Length; - var responseIndex = selectionsCount; - parentResult ??= operationContext.Result.RentObject(selectionsCount); + var scheduler = operationContext.Scheduler; var includeFlags = operationContext.IncludeFlags; var final = !selectionSet.IsConditional; @@ -40,7 +38,7 @@ public static ObjectResult EnqueueResolverTasks( // the scheduler tries to schedule new work first. // coincidentally we can use that to schedule a mutation so that we honor the spec // guarantees while executing efficient. - for (var i = selectionsCount - 1; i >= 0; i--) + for (var i = selections.Length - 1; i >= 0; i--) { var selection = selections[i]; @@ -48,10 +46,9 @@ public static ObjectResult EnqueueResolverTasks( { bufferedTasks.Add( operationContext.CreateResolverTask( - selection, parent, + selection, parentResult, - --responseIndex, scopedContext)); } } @@ -59,15 +56,13 @@ public static ObjectResult EnqueueResolverTasks( if (bufferedTasks.Count == 0) { // in the case all root fields are skipped we execute a dummy task in order - // to not have to many extra API for this special case. + // to not have extra logic for this case. scheduler.Register(new NoOpExecutionTask(operationContext)); } else { scheduler.Register(CollectionsMarshal.AsSpan(bufferedTasks)); } - - return parentResult; } finally { @@ -77,6 +72,7 @@ public static ObjectResult EnqueueResolverTasks( } // TODO : remove ? + /* public static ResolverTask EnqueueElementTasks( OperationContext operationContext, Selection selection, @@ -125,6 +121,7 @@ public static ResolverTask EnqueueElementTasks( return resolverTask; } + */ public static ObjectResult? EnqueueOrInlineResolverTasks( ValueCompletionContext context, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs index a2866256f59..7fdaf7aa7d2 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs @@ -1,49 +1,48 @@ +using HotChocolate.Text.Json; using HotChocolate.Types; using HotChocolate.Utilities; using static HotChocolate.Execution.ErrorHelper; -using static HotChocolate.Execution.Processing.PathHelper; namespace HotChocolate.Execution.Processing; internal static partial class ValueCompletion { - private static object? CompleteLeafValue( + private static void CompleteLeafValue( ValueCompletionContext context, Selection selection, - IType type, - ResultData parent, - int index, - object? result) + ILeafType2 type, + ResultElement resultValue, + object? runtimeValue) { var operationContext = context.OperationContext; var resolverContext = context.ResolverContext; try { - var leafType = (ILeafType)type; - var runtimeType = leafType.ToRuntimeType(); + var runtimeType = type.ToRuntimeType(); - if (!runtimeType.IsInstanceOfType(result) - && operationContext.Converter.TryConvert(runtimeType, result, out var c)) + if (!runtimeType.IsInstanceOfType(runtimeValue) + && operationContext.Converter.TryConvert(runtimeType, runtimeValue, out var c)) { - result = c; + runtimeValue = c; } - return leafType.Serialize(result); + type.Serialize(runtimeValue, resultValue); + return; } catch (SerializationException ex) { - var errorPath = CreatePathFromContext(selection, parent, index); + var errorPath = resultValue.Path; var error = InvalidLeafValue(ex, selection, errorPath); operationContext.ReportError(error, resolverContext, selection); } catch (Exception ex) { - var errorPath = CreatePathFromContext(selection, parent, index); + var errorPath = resultValue.Path; var error = UnexpectedLeafValueSerializationError(ex, selection, errorPath); operationContext.ReportError(error, resolverContext, selection); } - return null; + resultValue.SetNullValue(); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs index cfa0ba15099..892bf5176ed 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs @@ -1,8 +1,8 @@ using System.Collections; using System.Text.Json; +using HotChocolate.Text.Json; using HotChocolate.Types; using static HotChocolate.Execution.ErrorHelper; -using static HotChocolate.Execution.Processing.PathHelper; namespace HotChocolate.Execution.Processing; @@ -156,46 +156,14 @@ private static bool TryCompleteElement( return list.IsNullable; } - internal static void PropagateNullValues(ResultData result) + internal static void PropagateNullValues(ResultElement result) { - if (result.IsInvalidated) - { - return; - } - - result.IsInvalidated = true; + result.Invalidate(); - while (result.Parent is not null) + while (result.IsInvalidated || result.IsInvalidated) { - var index = result.ParentIndex; - var parent = result.Parent; - - if (parent.IsInvalidated) - { - return; - } - - switch (parent) - { - case ObjectResult objectResult: - var field = objectResult[index]; - if (field.TrySetNull()) - { - return; - } - objectResult.IsInvalidated = true; - break; - - case ListResult listResult: - if (listResult.TrySetNull(index)) - { - return; - } - listResult.IsInvalidated = true; - break; - } + result = result.Parent; - result = parent; } } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs index 522a3698743..dc459f2c4ca 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs @@ -2,7 +2,6 @@ using HotChocolate.Types; using HotChocolate.Utilities; using static HotChocolate.Execution.ErrorHelper; -using static HotChocolate.Execution.Processing.PathHelper; using static HotChocolate.Execution.Processing.Tasks.ResolverTaskFactory; namespace HotChocolate.Execution.Processing; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs index 3eb8a859f72..c0605295da6 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs @@ -1,25 +1,23 @@ +using HotChocolate.Text.Json; using HotChocolate.Types; using static HotChocolate.Execution.ErrorHelper; -using static HotChocolate.Execution.Processing.PathHelper; namespace HotChocolate.Execution.Processing; internal static partial class ValueCompletion { - public static object? Complete( + public static void Complete( ValueCompletionContext context, Selection selection, - ResultData parent, - int index, + ResultElement resultValue, object? result) - => Complete(context, selection, selection.Type, parent, index, result); + => Complete(context, selection, selection.Type, resultValue, index, result); - public static object? Complete( + public static void Complete( ValueCompletionContext context, Selection selection, IType type, - ResultData parent, - int index, + ResultElement parent, object? result) { var typeKind = type.Kind; @@ -32,27 +30,29 @@ internal static partial class ValueCompletion if (result is null) { - return null; + parent.SetNullValue(); + return; } - if (typeKind is TypeKind.Scalar or TypeKind.Enum) + switch (typeKind) { - return CompleteLeafValue(context, selection, type, parent, index, result); + case TypeKind.Scalar or TypeKind.Enum: + CompleteLeafValue(context, selection, type, parent, index, result); + break; + + case TypeKind.List: + return CompleteListValue(context, selection, type, parent, index, result); + + case TypeKind.Object or TypeKind.Interface or TypeKind.Union: + return CompleteCompositeValue(context, selection, type, parent, index, result); + + default: + { + var errorPath = CreatePathFromContext(selection, parent, index); + var error = UnexpectedValueCompletionError(selection, errorPath); + context.OperationContext.ReportError(error, context.ResolverContext, selection); + return null; + } } - - if (typeKind is TypeKind.List) - { - return CompleteListValue(context, selection, type, parent, index, result); - } - - if (typeKind is TypeKind.Object or TypeKind.Interface or TypeKind.Union) - { - return CompleteCompositeValue(context, selection, type, parent, index, result); - } - - var errorPath = CreatePathFromContext(selection, parent, index); - var error = UnexpectedValueCompletionError(selection, errorPath); - context.OperationContext.ReportError(error, context.ResolverContext, selection); - return null; } } diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index 17b5240fe90..26d565a8354 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -239,6 +239,10 @@ True FetchingResources.resx + + + SubscriptionExecutor.cs + diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index d4fae9588fc..8bc813ba527 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -178,8 +178,8 @@ internal Path CreatePath(Cursor current) if (parentTokenType is ElementTokenType.StartArray) { // arrayIndex = abs(child) - (abs(parent) + 1) - var absChild = c.Chunk * Cursor.RowsPerChunk + c.Row; - var absParent = parentCursor.Chunk * Cursor.RowsPerChunk + parentCursor.Row; + var absChild = (c.Chunk * Cursor.RowsPerChunk) + c.Row; + var absParent = (parentCursor.Chunk * Cursor.RowsPerChunk) + parentCursor.Row; var arrayIndex = absChild - (absParent + 1); path = path.Append(arrayIndex); } diff --git a/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs b/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs index e0b4e7fe862..1703bffc19d 100644 --- a/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs @@ -1,4 +1,5 @@ using HotChocolate.Language; +using HotChocolate.Text.Json; // ReSharper disable once CheckNamespace namespace HotChocolate.Types; @@ -110,3 +111,63 @@ public interface ILeafType : IInputTypeDefinition, IOutputTypeDefinition /// bool TryDeserialize(object? resultValue, out object? runtimeValue); } + +/// +/// Represents a GraphQL leaf-type e.g., scalar or enum. +/// +public interface ILeafType2 : IInputTypeDefinition, IOutputTypeDefinition +{ + /// + /// Defines if the given is possibly of this type. + /// + /// + /// The runtime value which shall be validated. + /// + /// + /// true if the given is possibly of this type. + /// + bool IsInstanceOfType(object? runtimeValue); + + /// + /// Parses the GraphQL value syntax of this type into a runtime value representation. + /// + /// + /// A GraphQL value syntax representation of this type. + /// + /// + /// Returns a runtime value representation of this type. + /// + object? ParseLiteral(IValueNode valueSyntax); + + /// + /// Parses a runtime value of this type into a GraphQL value syntax representation. + /// + /// + /// A result value representation of this type. + /// + /// + /// Returns a GraphQL value syntax representation of the . + /// + /// + /// Unable to parse the given + /// into a GraphQL value syntax representation of this type. + /// + IValueNode ParseValue(object? runtimeValue); + + /// + /// Serializes a runtime value of this type to the result value format. + /// + /// + /// A runtime value representation of this type. + /// + /// + /// + /// + /// + /// Returns a result value representation of this type. + /// + /// + /// Unable to serialize the given . + /// + void Serialize(object? runtimeValue, ResultElement resultValue); +} From a25b01059250da320fb2193d718950865ce50856 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Mon, 15 Dec 2025 09:13:51 +0100 Subject: [PATCH 032/144] wip --- .../Factories/OperationContextFactory.cs | 2 - .../Internal/MiddlewareContextMarshal.cs | 75 ---------- .../Processing/MiddlewareContext.Pooling.cs | 1 - .../Processing/MiddlewareContext.Pure.cs | 21 +-- .../Processing/MiddlewareContext.Selection.cs | 7 +- .../Processing/MiddlewareContext.State.cs | 1 + .../Processing/OperationContext.Execution.cs | 14 +- .../OperationContext.IExecutionTaskContext.cs | 5 +- .../Processing/OperationContext.Pooling.cs | 39 ++--- .../Execution/Processing/QueryExecutor.cs | 4 +- .../Tasks/ResolverTask.CompleteValue.cs | 1 - .../Processing/Tasks/ResolverTaskFactory.cs | 134 ++++-------------- .../Processing/ValueCompletion.Object.cs | 35 +++-- .../src/Types/Text/Json/ResultDocument.cs | 4 + 14 files changed, 87 insertions(+), 256 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Internal/MiddlewareContextMarshal.cs diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/OperationContextFactory.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/OperationContextFactory.cs index 6f86b46fd29..f0e36070029 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/OperationContextFactory.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/Factories/OperationContextFactory.cs @@ -19,7 +19,6 @@ namespace Microsoft.Extensions.DependencyInjection; /// internal sealed class OperationContextFactory( IFactory resolverTaskFactory, - ResultPool resultPool, ITypeConverter typeConverter, AggregateServiceScopeInitializer serviceScopeInitializer) : IFactory @@ -27,7 +26,6 @@ internal sealed class OperationContextFactory( public OperationContext Create() => new OperationContext( resolverTaskFactory, - new ResultBuilder(resultPool), typeConverter, serviceScopeInitializer); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Internal/MiddlewareContextMarshal.cs b/src/HotChocolate/Core/src/Types/Execution/Internal/MiddlewareContextMarshal.cs deleted file mode 100644 index 1d32ba7964d..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Internal/MiddlewareContextMarshal.cs +++ /dev/null @@ -1,75 +0,0 @@ -using HotChocolate.Execution.Processing; -using HotChocolate.Resolvers; - -namespace HotChocolate.Execution.Internal; - -/// -/// An unsafe class that provides a set of methods to access the -/// underlying data representations of the middleware context. -/// -public static class MiddlewareContextMarshal -{ - /// - /// Gets access to the result data of an object in the GraphQL execution. - /// ResultData is pooled and writing to it can corrupt the result. - /// Multiple threads might be writing into the result object. - /// - /// - /// The resolver context. - /// - /// - /// Returns the result data of the current resolver context. - /// - public static ObjectResult? GetParentResultUnsafe(IResolverContext context) - { - ArgumentNullException.ThrowIfNull(context); - - return context is MiddlewareContext middlewareContext - ? middlewareContext.ResultValue - : null; - } - - /// - /// Gets the parent result data of the current . - /// - /// - /// The result data for which to get the parent. - /// - /// - /// The type of the result data. - /// - /// - /// Returns the parent result data of the current . - /// - /// - /// Throws if is null. - /// - public static ResultData? GetParent(T resultData) where T : ResultData - { - ArgumentNullException.ThrowIfNull(resultData); - - return resultData.Parent; - } - - /// - /// Gets the index under which the is stored in the parent result. - /// - /// - /// The result data for which to get the parent index. - /// - /// - /// The type of the result data. - /// - /// - /// Returns the index under which the is stored in the parent result. - /// - /// - /// Throws if is null. - /// - public static int GetParentIndex(T resultData) where T : ResultData - { - ArgumentNullException.ThrowIfNull(resultData); - - return resultData.ParentIndex; - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs index 314510bea0c..49bcf648d8f 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pooling.cs @@ -58,7 +58,6 @@ public void Clean() LocalContextData = null!; IsResultModified = false; ValueType = null; - ResponseIndex = 0; ResultValue = default; HasErrors = false; Arguments = null!; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs index 896dd713716..a87acc09772 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Pure.cs @@ -3,6 +3,7 @@ using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Resolvers; +using HotChocolate.Text.Json; using HotChocolate.Types; using HotChocolate.Utilities; using static HotChocolate.Execution.ThrowHelper; @@ -16,19 +17,19 @@ private sealed class PureResolverContext(MiddlewareContext parentContext) : IRes private ITypeConverter? _typeConverter; private IReadOnlyDictionary _argumentValues = null!; private Selection _selection = null!; - private ObjectType _parentType = null!; - private ObjectResult _parentResult = null!; + private ObjectType _selectionSetType = null!; + private ResultElement _resultValue; private object? _parent; public bool Initialize( Selection selection, - ObjectType parentType, - ObjectResult parentResult, + ObjectType selectionSetType, + ResultElement resultValue, object? parent) { _selection = selection; - _parentType = parentType; - _parentResult = parentResult; + _selectionSetType = selectionSetType; + _resultValue = resultValue; _parent = parent; _argumentValues = selection.Arguments; @@ -49,21 +50,21 @@ public bool Initialize( public void Clear() { _selection = null!; - _parentType = null!; - _parentResult = null!; + _selectionSetType = null!; + _resultValue = default; _parent = null; _argumentValues = null!; } public Schema Schema => parentContext.Schema; - public ObjectType ObjectType => _parentType; + public ObjectType ObjectType => _selectionSetType; public Operation Operation => parentContext.Operation; public Selection Selection => _selection; - public Path Path => PathHelper.CreatePathFromContext(_selection, _parentResult, -1); + public Path Path => _resultValue.Path; public ulong IncludeFlags => parentContext.IncludeFlags; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs index 549e9eca418..22ee26c41ce 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Selection.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using HotChocolate.Resolvers; +using HotChocolate.Text.Json; using HotChocolate.Types; namespace HotChocolate.Execution.Processing; @@ -23,12 +24,12 @@ internal partial class MiddlewareContext public bool TryCreatePureContext( Selection selection, - ObjectType parentType, - ObjectResult parentResult, + ObjectType selectionSetType, + ResultElement resultValue, object? parent, [NotNullWhen(true)] out IResolverContext? context) { - if (_childContext.Initialize(selection, parentType, parentResult, parent)) + if (_childContext.Initialize(selection, selectionSetType, resultValue, parent)) { context = _childContext; return true; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs index 5af573e6aee..b3cf76ae8d9 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs @@ -17,6 +17,7 @@ internal partial class MiddlewareContext public IImmutableDictionary LocalContextData { get; set; } = null!; + // TODO : Remove? public IType? ValueType { get; set; } public ResultElement ResultValue { get; private set; } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs index f5fc05827e6..2c8130038a0 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs @@ -22,19 +22,7 @@ internal set } } - /// - /// The result helper which provides utilities to build up the result. - /// - public ResultBuilder Result - { - get - { - AssertInitialized(); - return _resultBuilder; - } - } - - public ResultDocument ResultDocument => throw new NotImplementedException(); + public ResultDocument Result => _resultDocument; public RequestContext RequestContext { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.IExecutionTaskContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.IExecutionTaskContext.cs index 511ede6b1cc..45508919dfc 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.IExecutionTaskContext.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.IExecutionTaskContext.cs @@ -33,18 +33,19 @@ private void ReportError(IExecutionTask task, IError error) void ReportSingle(IError singleError) { var handled = ErrorHandler.Handle(singleError); + Result.Errors ??= []; if (handled is AggregateError ar) { foreach (var ie in ar.Errors) { - Result.AddError(ie); + Result.Errors.Add(ie); _diagnosticEvents.TaskError(task, ie); } } else { - Result.AddError(handled); + Result.Errors.Add(handled); _diagnosticEvents.TaskError(task, handled); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs index c396301d366..bcc1e64f9e3 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs @@ -4,6 +4,7 @@ using HotChocolate.Execution.Processing.Tasks; using HotChocolate.Fetching; using HotChocolate.Resolvers; +using HotChocolate.Text.Json; using HotChocolate.Types; using HotChocolate.Utilities; using static HotChocolate.Execution.ThrowHelper; @@ -15,8 +16,8 @@ internal sealed partial class OperationContext private readonly IFactory _resolverTaskFactory; private readonly WorkScheduler _workScheduler; private WorkScheduler _currentWorkScheduler; - private readonly ResultBuilder _resultBuilder; private readonly AggregateServiceScopeInitializer _serviceScopeInitializer; + private ResultDocument _resultDocument = null!; private RequestContext _requestContext = null!; private Schema _schema = null!; private IErrorHandler _errorHandler = null!; @@ -36,14 +37,12 @@ internal sealed partial class OperationContext public OperationContext( IFactory resolverTaskFactory, - ResultBuilder resultBuilder, ITypeConverter typeConverter, AggregateServiceScopeInitializer serviceScopeInitializer) { _resolverTaskFactory = resolverTaskFactory; _workScheduler = new WorkScheduler(this); _currentWorkScheduler = _workScheduler; - _resultBuilder = resultBuilder; _serviceScopeInitializer = serviceScopeInitializer; Converter = typeConverter; } @@ -80,19 +79,13 @@ public void Initialize( _isInitialized = true; IncludeFlags = operation.CreateIncludeFlags(variables); - _workScheduler.Initialize(batchDispatcher); - _resultBuilder.Initialize(_requestContext, _diagnosticEvents); - - if (requestContext.RequestIndex != -1) + _resultDocument = new ResultDocument(operation, IncludeFlags) { - _resultBuilder.SetRequestIndex(requestContext.RequestIndex); - } - - if (variableIndex != -1) - { - _resultBuilder.SetVariableIndex(variableIndex); - } + RequestIndex = _requestContext.RequestIndex, + VariableIndex = variableIndex + }; + _workScheduler.Initialize(batchDispatcher); _currentWorkScheduler = _workScheduler; } @@ -115,19 +108,13 @@ public void InitializeFrom(OperationContext context) _isInitialized = true; IncludeFlags = _operation.CreateIncludeFlags(_variables); - _workScheduler.Initialize(_batchDispatcher); - _resultBuilder.Initialize(_requestContext, _diagnosticEvents); - - if (context._requestContext.RequestIndex != -1) + _resultDocument = new ResultDocument(_operation, IncludeFlags) { - _resultBuilder.SetRequestIndex(context._requestContext.RequestIndex); - } - - if (context._variableIndex != -1) - { - _resultBuilder.SetVariableIndex(context._variableIndex); - } + RequestIndex = _requestContext.RequestIndex, + VariableIndex = context._variableIndex + }; + _workScheduler.Initialize(_batchDispatcher); _currentWorkScheduler = _workScheduler; } @@ -137,7 +124,7 @@ public void Clean() { _currentWorkScheduler = _workScheduler; _workScheduler.Clear(); - _resultBuilder.Clear(); + _resultDocument = null!; _requestContext = null!; _schema = null!; _errorHandler = null!; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs index cec7f1fa841..50d8ece2ad3 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs @@ -26,7 +26,7 @@ private static async Task ExecuteInternalAsync( EnqueueResolverTasks( operationContext, operationContext.RootValue, - operationContext.ResultDocument.Data, + operationContext.Result.Data, scopedContext, Path.Root); @@ -65,7 +65,7 @@ private static void FillSchedulerWithWork( EnqueueResolverTasks( context, context.RootValue, - context.ResultDocument.Data, + context.Result.Data, scopedContext, Path.Root); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs index 7b5f944f2da..52e84d7fa20 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs @@ -12,7 +12,6 @@ internal sealed partial class ResolverTask /// The execution cancellation token. private void CompleteValue(bool success, CancellationToken cancellationToken) { - var responseName = _context.ResponseName; var resultValue = _context.ResultValue; var result = _context.Result; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs index 6db66a53bb4..a1303e38f38 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs @@ -123,83 +123,67 @@ public static ResolverTask EnqueueElementTasks( } */ - public static ObjectResult? EnqueueOrInlineResolverTasks( + public static void EnqueueOrInlineResolverTasks( ValueCompletionContext context, - ObjectType parentType, - ResultData parentResult, - int parentIndex, - object parent, - SelectionSet selectionSet) + SelectionSet selectionSet, + ObjectType selectionSetType, + ResultElement resultValue, + object parent) { - var responseIndex = 0; - var selections = selectionSet.Selections; - var selectionsCount = selections.Length; + Debug.Assert(selectionSet.Type == selectionSetType); + Debug.Assert(resultValue.Type == selectionSetType); + var operationContext = context.OperationContext; - var result = operationContext.Result.RentObject(selectionsCount); - var includeFlags = operationContext.IncludeFlags; - var final = !selectionSet.IsConditional; - result.SetParent(parentResult, parentIndex); + resultValue.SetObjectValue(selectionSet); - foreach (var selection in selections) + foreach (var field in resultValue.EnumerateObject()) { - if (result.IsInvalidated) - { - return null; - } - - if (!final && !selection.IsIncluded(includeFlags)) - { - continue; - } + var selection = field.AssertSelection(); if (selection.Strategy is SelectionExecutionStrategy.Pure) { ResolveAndCompleteInline( context, selection, - responseIndex++, - parentType, - parent, - result); + selectionSetType, + field.Value, + parent); } else { context.Tasks.Add( operationContext.CreateResolverTask( - selection, parent, - result, - responseIndex++, + selection, + resultValue, context.ResolverContext.ScopedContextData)); } } - - return result.IsInvalidated ? null : result; } private static void ResolveAndCompleteInline( ValueCompletionContext context, Selection selection, - int responseIndex, - ObjectType parentType, - object parent, - ObjectResult parentResult) + ObjectType selectionSetType, + ResultElement fieldValue, + object parent) { var operationContext = context.OperationContext; var resolverContext = context.ResolverContext; var executedSuccessfully = false; object? resolverResult = null; - parentResult.InitValueUnsafe(responseIndex, selection); - try { // we first try to create a context for our pure resolver. // this should actually only fail if we are unable to coerce // the field arguments. if (resolverContext.TryCreatePureContext( - selection, parentType, parentResult, parent, + selection, + selectionSetType, + fieldValue, + parent, out var childContext)) { // if we have a pure context we can execute out pure resolver. @@ -215,53 +199,17 @@ private static void ResolveAndCompleteInline( } catch (Exception ex) { - var path = CreatePathFromContext(selection, parentResult, responseIndex); - operationContext.ReportError(ex, resolverContext, selection, path); + operationContext.ReportError(ex, resolverContext, selection, fieldValue.Path); } - if (executedSuccessfully) + if (!executedSuccessfully) { - // if we were able to execute the resolver we will try to complete the - // resolver result inline and commit the value to the result. - CompleteInline( - operationContext, - resolverContext, - selection, - selection.Type, - responseIndex, - parentResult, - resolverResult, - context.Tasks); + fieldValue.SetNullValue(); } - else - { - // if we were not able to execute the resolver we will commit the null value - // of the resolver to the object result which could trigger a non-null propagation. - CommitValue( - operationContext, - selection, - responseIndex, - parentResult, - resolverResult); - } - } - - private static void CompleteInline( - OperationContext operationContext, - MiddlewareContext resolverContext, - Selection selection, - IType type, - int responseIndex, - ObjectResult parentResult, - object? value, - List bufferedTasks) - { - object? completedValue = null; try { - var completionContext = new ValueCompletionContext(operationContext, resolverContext, bufferedTasks); - completedValue = Complete(completionContext, selection, type, parentResult, responseIndex, value); + Complete(context, selection, fieldValue, resolverResult); } catch (OperationCanceledException) { @@ -271,33 +219,13 @@ private static void CompleteInline( } catch (Exception ex) { - var errorPath = CreatePathFromContext(selection, parentResult, responseIndex); - operationContext.ReportError(ex, resolverContext, selection, errorPath); + operationContext.ReportError(ex, resolverContext, selection, fieldValue.Path); } - CommitValue(operationContext, selection, responseIndex, parentResult, completedValue); - } - - private static void CommitValue( - OperationContext operationContext, - ISelection selection, - int responseIndex, - ObjectResult parentResult, - object? completedValue) - { - var isNonNullType = selection.Type.Kind is TypeKind.NonNull; - - parentResult.SetValueUnsafe( - responseIndex, - selection.ResponseName, - completedValue, - !isNonNullType); - - if (completedValue is null && isNonNullType) + if (fieldValue is { IsNullable: false, IsNullOrInvalidated: true }) { - PropagateNullValues(parentResult); - var errorPath = CreatePathFromContext(selection, parentResult, responseIndex); - operationContext.Result.AddNonNullViolation(selection, errorPath); + PropagateNullValues(fieldValue); + operationContext.Result.AddNonNullViolation(_selection, _context.Path); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs index dc459f2c4ca..30bb5f92356 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using HotChocolate.Text.Json; using HotChocolate.Types; using HotChocolate.Utilities; using static HotChocolate.Execution.ErrorHelper; @@ -8,32 +9,31 @@ namespace HotChocolate.Execution.Processing; internal static partial class ValueCompletion { - private static ObjectResult? CompleteCompositeValue( + private static void CompleteCompositeValue( ValueCompletionContext context, Selection selection, IType type, - ResultData parent, - int index, - object result) + ResultElement resultValue, + object runtimeValue) { var operationContext = context.OperationContext; - if (TryResolveObjectType(context, selection, type, parent, index, result, out var objectType)) + if (TryResolveObjectType(context, selection, type, resultValue, runtimeValue, out var objectType)) { - var selectionSet = operationContext.CollectFields(selection, objectType); + var selectionSet = selection.DeclaringOperation.GetSelectionSet(selection, objectType); var runtimeType = objectType.RuntimeType; - if (!runtimeType.IsInstanceOfType(result) - && operationContext.Converter.TryConvert(runtimeType, result, out var converted)) + if (!runtimeType.IsInstanceOfType(runtimeValue) + && operationContext.Converter.TryConvert(runtimeType, runtimeValue, out var converted)) { - result = converted; + runtimeValue = converted; } - return EnqueueOrInlineResolverTasks(context, objectType, parent, index, result, selectionSet); + return EnqueueOrInlineResolverTasks(context, objectType, parent, index, runtimeValue, selectionSet); } var errorPath = CreatePathFromContext(selection, parent, index); - var error = ValueCompletion_CouldNotResolveAbstractType(selection, errorPath, result); + var error = ValueCompletion_CouldNotResolveAbstractType(selection, errorPath, runtimeValue); operationContext.ReportError(error, context.ResolverContext, selection); return null; } @@ -42,9 +42,8 @@ private static bool TryResolveObjectType( ValueCompletionContext context, Selection selection, IType fieldType, - ResultData parent, - int index, - object result, + ResultElement resultValue, + object runtimeValue, [NotNullWhen(true)] out ObjectType? objectType) { try @@ -64,19 +63,19 @@ private static bool TryResolveObjectType( case TypeKind.Interface: objectType = ((InterfaceType)fieldType) - .ResolveConcreteType(context.ResolverContext, result); + .ResolveConcreteType(context.ResolverContext, runtimeValue); return objectType is not null; case TypeKind.Union: objectType = ((UnionType)fieldType) - .ResolveConcreteType(context.ResolverContext, result); + .ResolveConcreteType(context.ResolverContext, runtimeValue); return objectType is not null; } var error = UnableToResolveTheAbstractType( fieldType.Print(), selection, - CreatePathFromContext(selection, parent, index)); + resultValue.Path); context.OperationContext.ReportError(error, context.ResolverContext, selection); } catch (Exception ex) @@ -85,7 +84,7 @@ private static bool TryResolveObjectType( ex, fieldType.Print(), selection, - CreatePathFromContext(selection, parent, index)); + resultValue.Path); context.OperationContext.ReportError(error, context.ResolverContext, selection); } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index 8bc813ba527..4d931fed0de 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -40,6 +40,10 @@ public List? Errors internal set => _errors = value; } + public int RequestIndex { get; init; } + + public int VariableIndex { get; init; } + public Dictionary? Extensions { get; set; } [MethodImpl(MethodImplOptions.AggressiveInlining)] From 9a79137b84585cefcd0dffed0118388302e4f64d Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Mon, 15 Dec 2025 23:09:02 +0100 Subject: [PATCH 033/144] wip --- .../OpenApiResultFormatter.cs | 6 +- .../Execution/CompletedResult.cs | 24 ++ .../Execution/ExecutionResult.cs | 20 +- .../CoreExecutionResultExtensions.cs | 4 +- .../Execution/IExecutionResult.cs | 7 +- .../Execution/IIncrementalListResult.cs | 12 + .../Execution/IIncrementalObjectResult.cs | 19 ++ .../Execution/IIncrementalResult.cs | 18 ++ .../Execution/IOperationResult.cs | 51 ++-- .../Execution/OperationResult.cs | 183 ------------- .../Execution/OperationResultBatch.cs | 45 +--- .../Execution/OperationResultBuilder.cs | 250 ------------------ .../OperationResultBuilderExtensions.cs | 64 ----- .../Execution/PendingResult.cs | 31 +++ .../Execution/ResponseStream.cs | 48 +--- .../Execution/WarmupExecutionResult.cs | 2 - .../InternalServiceCollectionExtensions.cs | 34 --- .../RequestExecutorBuilderExtensions.cs | 26 -- ...uestExecutorServiceCollectionExtensions.cs | 1 - .../Extensions/OperationContextExtensions.cs | 53 +--- .../Execution/Options/ResultBufferOptions.cs | 82 ------ .../Processing/ValueCompletion.List.cs | 182 ++++++------- .../Processing/ValueCompletion.Object.cs | 12 +- .../Execution/Processing/ValueCompletion.cs | 21 +- .../Processing/WorkScheduler.Pooling.cs | 3 - .../Types/Text/Json/ResultDocument.WriteTo.cs | 4 +- .../src/Types/Text/Json/ResultDocument.cs | 84 +++--- 27 files changed, 306 insertions(+), 980 deletions(-) create mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/CompletedResult.cs create mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalListResult.cs create mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalObjectResult.cs create mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalResult.cs delete mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs delete mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBuilder.cs delete mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBuilderExtensions.cs create mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/PendingResult.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Options/ResultBufferOptions.cs diff --git a/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs b/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs index a0c93ad8c4d..1f05da24626 100644 --- a/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs +++ b/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs @@ -8,10 +8,10 @@ namespace HotChocolate.Adapters.OpenApi; internal sealed class OpenApiResultFormatter : IOpenApiResultFormatter { private static readonly JsonWriterOptions s_jsonWriterOptions = - new JsonWriterOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; + new() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; private static readonly JsonSerializerOptions s_jsonSerializerOptions = - new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; + new() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; public async Task FormatResultAsync( IOperationResult operationResult, @@ -19,7 +19,7 @@ public async Task FormatResultAsync( OpenApiEndpointDescriptor endpoint, CancellationToken cancellationToken) { - // If the root field is null and we don't have any errors, + // If the root field is null, and we don't have any errors, // we return HTTP 404 for queries and HTTP 500 otherwise. if (operationResult.Data?.TryGetValue(endpoint.ResponseNameToExtract, out var responseData) != true || responseData is null) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/CompletedResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/CompletedResult.cs new file mode 100644 index 00000000000..a036a399afc --- /dev/null +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/CompletedResult.cs @@ -0,0 +1,24 @@ +namespace HotChocolate.Execution; + +/// +/// Represents the completion of a pending incremental delivery operation in a GraphQL response. +/// Indicates that all data associated with the corresponding pending result has been delivered. +/// +/// The request unique pending data identifier that matches a prior pending result. +/// +/// Field errors that caused the incremental delivery to fail due to error bubbling above the incremental result's path. +/// When present, indicates the delivery has failed. +/// +public sealed record CompletedResult(uint Id, IReadOnlyList? Errors = null) +{ + /// + /// Gets the request unique pending data identifier that matches a prior pending result. + /// + public uint Id { get; init; } = Id; + + /// + /// Gets field errors that caused the incremental delivery to fail due to error bubbling + /// above the incremental result's path. When present, indicates the delivery has failed. + /// + public IReadOnlyList? Errors { get; init; } = Errors; +} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ExecutionResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ExecutionResult.cs index 904a1d47621..88b7c2035a7 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ExecutionResult.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ExecutionResult.cs @@ -1,4 +1,5 @@ using System.Buffers; +using System.Collections.Immutable; using HotChocolate.Features; namespace HotChocolate.Execution; @@ -15,26 +16,27 @@ public abstract class ExecutionResult : IExecutionResult protected ExecutionResult() { + Features = new FeatureCollection(); } - protected ExecutionResult((Func[] Tasks, int Length) cleanupTasks) + protected ExecutionResult((Func[] Tasks, int Length)? cleanupTasks, IFeatureCollection? features) { - if (cleanupTasks.Tasks is null) - { - throw new ArgumentNullException(nameof(cleanupTasks)); - } - - (_cleanUpTasks, _cleanupTasksLength) = cleanupTasks; + Features = features ?? new FeatureCollection(); + (_cleanUpTasks, _cleanupTasksLength) = cleanupTasks ?? ([], 0); } /// public abstract ExecutionResultKind Kind { get; } /// - public abstract IReadOnlyDictionary? ContextData { get; } + public ImmutableDictionary ContextData + { + get => Features.Get>() ?? ImmutableDictionary.Empty; + set => Features.Set(value); + } /// - public IFeatureCollection Features { get; } = new FeatureCollection(); + public IFeatureCollection Features { get; } /// /// This helper allows someone else to take over the responsibility over the cleanup tasks. diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs index f18b6e30e81..6e7a1985f1d 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs @@ -78,9 +78,9 @@ public static bool IsStreamResult(this IExecutionResult result) /// /// Expects a single GraphQL operation result. /// - public static OperationResult ExpectOperationResult(this IExecutionResult result) + public static IOperationResult ExpectOperationResult(this IExecutionResult result) { - if (result is OperationResult qr) + if (result is IOperationResult qr) { return qr; } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IExecutionResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IExecutionResult.cs index d46dad49d59..1b16e2a40d3 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IExecutionResult.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IExecutionResult.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using HotChocolate.Features; namespace HotChocolate.Execution; @@ -21,7 +22,11 @@ public interface IExecutionResult : IFeatureProvider, IAsyncDisposable /// Gets the result context data which represent additional /// properties that are NOT written to the transport. /// - IReadOnlyDictionary? ContextData { get; } + ImmutableDictionary ContextData + { + get => Features.Get>() ?? ImmutableDictionary.Empty; + set => Features.Set(value); + } /// /// Registers a cleanup task for execution resources bound to this execution result. diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalListResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalListResult.cs new file mode 100644 index 00000000000..148ec3d3e03 --- /dev/null +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalListResult.cs @@ -0,0 +1,12 @@ +namespace HotChocolate.Execution; + +/// +/// Represents an incremental result that delivers additional list items for a @stream directive. +/// +public interface IIncrementalListResult : IIncrementalResult +{ + /// + /// Gets the additional list items to append to the streamed list field. + /// + IReadOnlyList Items { get; } +} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalObjectResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalObjectResult.cs new file mode 100644 index 00000000000..8e04e2dc878 --- /dev/null +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalObjectResult.cs @@ -0,0 +1,19 @@ +namespace HotChocolate.Execution; + +/// +/// Represents an incremental result that delivers additional fields for a @defer directive. +/// +public interface IIncrementalObjectResult : IIncrementalResult +{ + /// + /// Gets the sub-path that is concatenated with the pending result's path to determine + /// the final path for this incremental data. When null, the path is the same + /// as the pending result's path. + /// + Path? SubPath { get; } + + /// + /// Gets the additional response fields to merge into the deferred fragment location. + /// + object? Data { get; } +} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalResult.cs new file mode 100644 index 00000000000..52861205a19 --- /dev/null +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IIncrementalResult.cs @@ -0,0 +1,18 @@ +namespace HotChocolate.Execution; + +/// +/// Represents an incremental result that delivers data for a @defer or @stream directive. +/// +public interface IIncrementalResult +{ + /// + /// Gets the request unique pending data identifier that matches a prior pending result. + /// + uint Id { get; } + + /// + /// Gets field errors that occurred during execution of this incremental result. + /// Only includes errors that did not bubble above the incremental result's path. + /// + IReadOnlyList? Errors { get; } +} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResult.cs index f05abd205a7..5404286d00a 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResult.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResult.cs @@ -1,9 +1,9 @@ namespace HotChocolate.Execution; /// -/// Represents a query result object. +/// Represents a GraphQL operation result payload. /// -public interface IOperationResult : IExecutionResult +public interface IOperationResult : IExecutionResult, IResultDataJsonFormatter { /// /// Gets the index of the request that corresponds to this result. @@ -15,34 +15,22 @@ public interface IOperationResult : IExecutionResult /// int? VariableIndex { get; } - /// - /// A string that was passed to the label argument of the @defer or @stream - /// directive that corresponds to this result. - /// - /// - string? Label { get; } - /// /// A path to the insertion point that informs the client how to patch a /// subsequent delta payload into the original payload. /// - /// Path? Path { get; } /// /// The data that is being delivered. /// - /// - IReadOnlyDictionary? Data { get; } + object? Data { get; } /// - /// The `items` entry in a stream payload is a list of results from the execution of - /// the associated @stream directive. This output will be a list of the same type as - /// the field with the associated `@stream` directive. If `items` is set to `null`, - /// it indicates that an error has caused a `null` to bubble up to a field higher - /// than the list field with the associated `@stream` directive. + /// Specifies if data was explicitly set. + /// If false the data was not set (including null). /// - IReadOnlyList? Items { get; } + bool IsDataSet { get; } /// /// Gets the GraphQL errors of the result. @@ -56,22 +44,27 @@ public interface IOperationResult : IExecutionResult IReadOnlyDictionary? Extensions { get; } /// - /// Gets the incremental patches provided with this result. + /// Gets the list of pending incremental delivery operations. + /// Each pending result announces data that will be delivered incrementally in subsequent payloads. /// - IReadOnlyList? Incremental { get; } + IReadOnlyList? Pending { get; } /// - /// A boolean that is present and true when there are more payloads - /// that will be sent for this operation. The last payload in a multi payload response - /// should return HasNext: false. - /// HasNext is null for single-payload responses to preserve backwards compatibility. + /// Gets the list of incremental results containing data from @defer or @stream directives. + /// Contains the actual data for previously announced pending operations. /// - /// - bool? HasNext { get; } + IReadOnlyList? Incremental { get; } /// - /// Specifies if data was explicitly set. - /// If false the data was not set (including null). + /// Gets the list of completed incremental delivery operations. + /// Each completed result indicates that all data for a pending operation has been delivered. /// - bool IsDataSet { get; } + IReadOnlyList? Completed { get; } + + /// + /// Indicates whether more payloads will follow in the response stream. + /// When true, clients should expect additional incremental data. + /// When false, this is the final payload. + /// + bool HasNext { get; } } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs deleted file mode 100644 index 6aa84238825..00000000000 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs +++ /dev/null @@ -1,183 +0,0 @@ -namespace HotChocolate.Execution; - -/// -/// Represents an operation result object. -/// -public sealed class OperationResult : ExecutionResult, IOperationResult -{ - internal OperationResult( - IReadOnlyDictionary? data, - IReadOnlyList? errors, - IReadOnlyDictionary? extensions, - IReadOnlyDictionary? contextData, - IReadOnlyList? items, - IReadOnlyList? incremental, - string? label, - Path? path, - bool? hasNext, - (Func[] Tasks, int Length) cleanupTasks, - bool isDataSet, - int? requestIndex, - int? variableIndex, - bool skipValidation = false) - : base(cleanupTasks) - { - if (!skipValidation - && data is null - && items is null - && errors is null - && incremental is null - && hasNext is not false) - { - throw new ArgumentException( - ExecutionAbstractionsResources.QueryResult_DataAndResultAreNull, - nameof(data)); - } - - Data = data; - Items = items; - Errors = errors; - Extensions = extensions; - ContextData = contextData; - Incremental = incremental; - Label = label; - Path = path; - HasNext = hasNext; - IsDataSet = isDataSet; - RequestIndex = requestIndex; - VariableIndex = variableIndex; - } - - /// - /// Initializes a new . - /// - public OperationResult( - IReadOnlyDictionary? data, - IReadOnlyList? errors = null, - IReadOnlyDictionary? extensions = null, - IReadOnlyDictionary? contextData = null, - IReadOnlyList? items = null, - IReadOnlyList? incremental = null, - string? label = null, - Path? path = null, - bool? hasNext = null, - int? requestIndex = null, - int? variableIndex = null) - { - if (data is null - && items is null - && errors is null - && incremental is null - && hasNext is not false) - { - throw new ArgumentException( - ExecutionAbstractionsResources.QueryResult_DataAndResultAreNull, - nameof(data)); - } - - Data = data; - Items = items; - Errors = errors; - Extensions = extensions; - ContextData = contextData; - Incremental = incremental; - Label = label; - Path = path; - HasNext = hasNext; - RequestIndex = requestIndex; - VariableIndex = variableIndex; - } - - /// - public override ExecutionResultKind Kind => ExecutionResultKind.SingleResult; - - /// - public int? RequestIndex { get; } - - /// - public int? VariableIndex { get; } - - /// - public string? Label { get; } - - /// - public Path? Path { get; } - - /// - public IReadOnlyDictionary? Data { get; } - - /// - public IReadOnlyList? Items { get; } - - /// - public IReadOnlyList? Errors { get; } - - /// - public IReadOnlyDictionary? Extensions { get; } - - /// - public IReadOnlyList? Incremental { get; } - - /// - public override IReadOnlyDictionary? ContextData { get; } - - /// - public bool? HasNext { get; } - - /// - public bool IsDataSet { get; } - - /// - /// Creates a new with the specified extension data. - /// - /// - /// The extension data that shall be added to the result. - /// - /// - /// Returns a new that represents the result. - /// - public OperationResult WithExtensions( - IReadOnlyDictionary? extensions) - { - return new OperationResult( - data: Data, - errors: Errors, - extensions: extensions, - contextData: ContextData, - items: Items, - incremental: Incremental, - label: Label, - path: Path, - hasNext: HasNext, - cleanupTasks: TakeCleanUpTasks(), - isDataSet: IsDataSet, - requestIndex: RequestIndex, - variableIndex: VariableIndex); - } - - /// - /// Creates a new with the specified context data. - /// - /// - /// The context data that shall be added to the result. - /// - /// - /// Returns a new that represents the result. - /// - public OperationResult WithContextData( - IReadOnlyDictionary? contextData) - => new OperationResult( - data: Data, - errors: Errors, - extensions: Extensions, - contextData: contextData, - items: Items, - incremental: Incremental, - label: Label, - path: Path, - hasNext: HasNext, - cleanupTasks: TakeCleanUpTasks(), - isDataSet: IsDataSet, - requestIndex: RequestIndex, - variableIndex: VariableIndex); -} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBatch.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBatch.cs index fc932b5262d..a2d59c69a96 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBatch.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBatch.cs @@ -11,24 +11,19 @@ public sealed class OperationResultBatch : ExecutionResult /// /// The results of this batch. /// - /// - /// The result context data which represent additional properties that are NOT written to the transport. - /// /// /// The result must be either an operation result or a response stream. /// /// /// is null. /// - public OperationResultBatch( - IReadOnlyList results, - IReadOnlyDictionary? contextData = null) + public OperationResultBatch(IReadOnlyList results) { ArgumentNullException.ThrowIfNull(results); foreach (var result in results) { - if (result is not IResponseStream and not OperationResult) + if (result is not IResponseStream and not IOperationResult) { throw new ArgumentException( ExecutionAbstractionsResources.OperationResultBatch_ResponseStreamOrOperationResult, @@ -37,8 +32,6 @@ public OperationResultBatch( } Results = results ?? throw new ArgumentNullException(nameof(results)); - ContextData = contextData; - RegisterForCleanup(() => RunCleanUp(results)); } @@ -52,40 +45,6 @@ public OperationResultBatch( /// public IReadOnlyList Results { get; } - /// - /// Gets the result context data which represent additional - /// properties that are NOT written to the transport. - /// - public override IReadOnlyDictionary? ContextData { get; } - - /// - /// Creates a new with the specified results. - /// - /// - /// The results of this batch. - /// - /// - /// Returns a new with the specified results. - /// - public OperationResultBatch WithResults(IReadOnlyList results) - { - var newBatch = new OperationResultBatch(results, ContextData); - var (tasks, length) = TakeCleanUpTasks(); - - if (length > 0) - { - foreach (var cleanupTask in tasks) - { - newBatch.RegisterForCleanup(cleanupTask); - } - - tasks.AsSpan(0, length).Clear(); - CleanUpTaskPool.Return(tasks); - } - - return newBatch; - } - private static async ValueTask RunCleanUp(IReadOnlyList results) { foreach (var result in results) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBuilder.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBuilder.cs deleted file mode 100644 index 3e4e2850a29..00000000000 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBuilder.cs +++ /dev/null @@ -1,250 +0,0 @@ -using System.Buffers; - -namespace HotChocolate.Execution; - -public sealed class OperationResultBuilder -{ - private static readonly ArrayPool> s_arrayPool = ArrayPool>.Shared; - private IReadOnlyDictionary? _data; - private IReadOnlyList? _items; - private List? _errors; - private OrderedDictionary? _extensionData; - private Dictionary? _contextData; - private List? _incremental; - private string? _label; - private Path? _path; - private bool? _hasNext; - private bool? _isDataSet; - private int? _requestIndex; - private int? _variableIndex; - private Func[] _cleanupTasks = []; - private int _cleanupTasksLength; - - public OperationResultBuilder SetData(IReadOnlyDictionary? data) - { - _data = data; - _items = null; - _isDataSet = true; - return this; - } - - public OperationResultBuilder SetItems(IReadOnlyList? items) - { - _items = items; - - if (items is not null) - { - _data = null; - } - - return this; - } - - public OperationResultBuilder AddError(IError error) - { - ArgumentNullException.ThrowIfNull(error); - - _errors ??= []; - _errors.Add(error); - return this; - } - - public OperationResultBuilder AddErrors(IEnumerable errors) - { - ArgumentNullException.ThrowIfNull(errors); - - _errors ??= []; - _errors.AddRange(errors); - return this; - } - - public OperationResultBuilder AddExtension(string key, object? data) - { - _extensionData ??= []; - _extensionData.Add(key, data); - return this; - } - - public OperationResultBuilder SetExtension(string key, object? data) - { - _extensionData ??= []; - _extensionData[key] = data; - return this; - } - - public OperationResultBuilder SetExtensions(IReadOnlyDictionary? extensions) - { - if (extensions is OrderedDictionary extensionData) - { - _extensionData = extensionData; - } - else if (extensions is not null) - { -#if NET9_0_OR_GREATER - _extensionData = new OrderedDictionary(extensions); -#else - _extensionData = []; -#endif - } - else - { - _extensionData = null; - } - - return this; - } - - public OperationResultBuilder AddContextData(string key, object? data) - { - _contextData ??= []; - _contextData.Add(key, data); - return this; - } - - public OperationResultBuilder SetContextData(string key, object? data) - { - _contextData ??= []; - _contextData[key] = data; - return this; - } - - public OperationResultBuilder SetContextData(IReadOnlyDictionary? contextData) - { - if (contextData is Dictionary extensionData) - { - _contextData = extensionData; - } - else if (contextData is not null) - { - _contextData = new Dictionary(contextData); - } - else - { - _contextData = null; - } - - return this; - } - - public OperationResultBuilder AddPatch(IOperationResult patch) - { - ArgumentNullException.ThrowIfNull(patch); - - _incremental ??= []; - _incremental.Add(patch); - return this; - } - - public OperationResultBuilder SetLabel(string? label) - { - _label = label; - return this; - } - - public OperationResultBuilder SetPath(Path? path) - { - _path = path; - return this; - } - - public OperationResultBuilder SetHasNext(bool? hasNext) - { - _hasNext = hasNext; - return this; - } - - public OperationResultBuilder RegisterForCleanup(Func clean) - { - ArgumentNullException.ThrowIfNull(clean); - - if (_cleanupTasks.Length == 0) - { - _cleanupTasks = s_arrayPool.Rent(9); - } - else if (_cleanupTasksLength >= _cleanupTasks.Length) - { - var buffer = s_arrayPool.Rent(_cleanupTasks.Length * 2); - - var oldBuffer = _cleanupTasks.AsSpan(); - oldBuffer.CopyTo(buffer); - oldBuffer.Clear(); - s_arrayPool.Return(buffer); - - _cleanupTasks = buffer; - } - - _cleanupTasks[_cleanupTasksLength++] = clean; - return this; - } - - public IOperationResult Build() - => new OperationResult( - _data, - _errors?.Count > 0 ? _errors : null, - _extensionData?.Count > 0 ? _extensionData : null, - _contextData?.Count > 0 ? _contextData : null, - _items, - _incremental, - _label, - _path, - _hasNext, - (_cleanupTasks, _cleanupTasksLength), - _isDataSet ?? false, - _requestIndex, - _variableIndex); - - public static OperationResultBuilder New() => new(); - - public static OperationResultBuilder FromResult(IOperationResult result) - { - var builder = new OperationResultBuilder { _data = result.Data }; - - if (result.Errors is not null) - { - builder._errors = [.. result.Errors]; - } - - if (result.Extensions is OrderedDictionary ext) - { - builder._extensionData = ext; - } - else if (result.Extensions is not null) - { -#if NET9_0_OR_GREATER - builder._extensionData = new OrderedDictionary(result.Extensions); -#else - builder._extensionData = []; -#endif - } - - if (result.ContextData is Dictionary cd) - { - builder._contextData = cd; - } - else if (result.ContextData is not null) - { - builder._contextData = new Dictionary(result.ContextData); - } - - builder._label = result.Label; - builder._path = result.Path; - builder._hasNext = result.HasNext; - builder._isDataSet = result.IsDataSet; - builder._requestIndex = result.RequestIndex; - builder._variableIndex = result.VariableIndex; - - return builder; - } - - public static IOperationResult CreateError( - IError error, - IReadOnlyDictionary? contextData = null) - => error is AggregateError aggregateError - ? CreateError(aggregateError.Errors, contextData) - : new OperationResult(null, new List { error }, contextData: contextData); - - public static IOperationResult CreateError( - IReadOnlyList errors, - IReadOnlyDictionary? contextData = null) - => new OperationResult(null, errors, contextData: contextData); -} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBuilderExtensions.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBuilderExtensions.cs deleted file mode 100644 index 1d7bac150c0..00000000000 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBuilderExtensions.cs +++ /dev/null @@ -1,64 +0,0 @@ -namespace HotChocolate.Execution; - -/// -/// Extensions methods for . -/// -public static class OperationResultBuilderExtensions -{ - /// - /// Registers a cleanup task for execution resources with the . - /// - /// - /// The . - /// - /// - /// A cleanup task that will be executed when this result is disposed. - /// - public static void RegisterForCleanup(this OperationResultBuilder builder, Action clean) - { - ArgumentNullException.ThrowIfNull(builder); - ArgumentNullException.ThrowIfNull(clean); - - builder.RegisterForCleanup(() => - { - clean(); - return default; - }); - } - - /// - /// Registers a cleanup task for execution resources with the . - /// - /// - /// The . - /// - /// - /// The resource that needs to be disposed. - /// - public static void RegisterForCleanup(this OperationResultBuilder builder, IDisposable disposable) - { - ArgumentNullException.ThrowIfNull(builder); - ArgumentNullException.ThrowIfNull(disposable); - - builder.RegisterForCleanup(disposable.Dispose); - } - - /// - /// Registers a cleanup task for execution resources with the . - /// - /// - /// The . - /// - /// - /// The resource that needs to be disposed. - /// - public static void RegisterForCleanup( - this OperationResultBuilder builder, - IAsyncDisposable disposable) - { - ArgumentNullException.ThrowIfNull(builder); - ArgumentNullException.ThrowIfNull(disposable); - - builder.RegisterForCleanup(disposable.DisposeAsync); - } -} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/PendingResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/PendingResult.cs new file mode 100644 index 00000000000..38c0fab5469 --- /dev/null +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/PendingResult.cs @@ -0,0 +1,31 @@ +namespace HotChocolate.Execution; + +/// +/// Represents a pending incremental delivery operation in a GraphQL response. +/// +/// The request unique pending data identifier. +/// +/// The path in the response where the incremental data will be delivered. +/// For @stream: indicates the list field that is not complete. +/// For @defer: indicates where the deferred fragment fields will be added. +/// +/// The label from the @defer or @stream directive's label argument, if present. +public sealed record PendingResult(uint Id, Path Path, string? Label = null) +{ + /// + /// Gets the request unique pending data identifier. + /// + public uint Id { get; init; } = Id; + + /// + /// Gets the path in the response where the incremental data will be delivered. + /// For @stream: indicates the list field that is not complete. + /// For @defer: indicates where the deferred fragment fields will be added. + /// + public Path Path { get; init; } = Path; + + /// + /// Gets the label from the @defer or @stream directive's label argument, if present. + /// + public string? Label { get; init; } = Label; +} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResponseStream.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResponseStream.cs index 90ffb231465..48a406bbe35 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResponseStream.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResponseStream.cs @@ -11,9 +11,7 @@ public sealed class ResponseStream : ExecutionResult, IResponseStream public ResponseStream( Func>? resultStreamFactory, - ExecutionResultKind kind = SubscriptionResult, - IReadOnlyDictionary? contextData = null, - IReadOnlyList>? onFirstResult = null) + ExecutionResultKind kind = SubscriptionResult) { _resultStreamFactory = resultStreamFactory ?? throw new ArgumentNullException(nameof(resultStreamFactory)); @@ -24,15 +22,15 @@ public ResponseStream( } Kind = kind; - ContextData = contextData; - OnFirstResult = onFirstResult ?? ImmutableArray>.Empty; } public override ExecutionResultKind Kind { get; } - public override IReadOnlyDictionary? ContextData { get; } - - public IReadOnlyList> OnFirstResult { get; } + public ImmutableList> OnFirstResult + { + get => Features.Get>>() ?? []; + set => Features.Set(value); + } public IAsyncEnumerable ReadResultsAsync() { @@ -52,40 +50,6 @@ public IAsyncEnumerable ReadResultsAsync() return new OperationResultStream(_resultStreamFactory, ExecuteOnFirstResult); } - /// - /// Creates a new response stream with a list of mutators that are applied to the first result of this stream. - /// - /// - /// The mutators that are applied to the first result of this stream. - /// - /// - /// Returns a new response stream with the specified mutators. - /// - public ResponseStream WithOnFirstResult( - IReadOnlyList> onFirstResult) - { - var newStream = new ResponseStream( - _resultStreamFactory, - Kind, - ContextData, - onFirstResult); - - var (tasks, length) = TakeCleanUpTasks(); - - if (length > 0) - { - for (var i = 0; i < length; i++) - { - newStream.RegisterForCleanup(tasks[i]); - } - - tasks.AsSpan(0, length).Clear(); - CleanUpTaskPool.Return(tasks); - } - - return newStream; - } - private class OperationResultStream( Func> resultStreamFactory, Func onFirstResult) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/WarmupExecutionResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/WarmupExecutionResult.cs index d4b864c9fc8..89de5f61b3b 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/WarmupExecutionResult.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/WarmupExecutionResult.cs @@ -3,6 +3,4 @@ namespace HotChocolate.Execution; public sealed class WarmupExecutionResult : ExecutionResult { public override ExecutionResultKind Kind => ExecutionResultKind.WarmupResult; - - public override IReadOnlyDictionary? ContextData => null; } diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs index be71c7446e7..0d8c703d88b 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/InternalServiceCollectionExtensions.cs @@ -2,7 +2,6 @@ using GreenDonut.DependencyInjection; using HotChocolate.Execution; using HotChocolate.Execution.DependencyInjection; -using HotChocolate.Execution.Options; using HotChocolate.Execution.Processing; using HotChocolate.Execution.Processing.Tasks; using HotChocolate.Fetching; @@ -24,39 +23,6 @@ internal static IServiceCollection TryAddVariableCoercion( return services; } - internal static IServiceCollection TryAddResultPool( - this IServiceCollection services) - { - services.TryAddSingleton(sp => - { - var options = new ResultBufferOptions(); - var modifiers = sp.GetServices>(); - - foreach (var modifier in modifiers) - { - modifier.Invoke(options); - } - - return options; - }); - - services.TryAddSingleton(sp => - { - var options = sp.GetRequiredService(); - return new ObjectResultPool(options.MaximumRetained, options.MaximumAllowedCapacity, options.BucketSize); - }); - - services.TryAddSingleton(sp => - { - var options = sp.GetRequiredService(); - return new ListResultPool(options.MaximumRetained, options.MaximumAllowedCapacity, options.BucketSize); - }); - - services.TryAddSingleton(); - - return services; - } - internal static IServiceCollection TryAddResolverTaskPool( this IServiceCollection services, int maximumRetained = 128) diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.cs index 92324f6a32c..3cc7a1a354b 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.cs @@ -290,32 +290,6 @@ public static IRequestExecutorBuilder ModifyParserOptions( return builder; } - /// - /// Configures the result buffer options. - /// - /// - /// The request executor builder. - /// - /// - /// The configuration action. - /// - /// - /// Returns the request executor builder. - /// - /// - /// is null. - /// - public static IRequestExecutorBuilder ModifyResultBuffersOptions( - this IRequestExecutorBuilder builder, - Action configure) - { - ArgumentNullException.ThrowIfNull(builder); - ArgumentNullException.ThrowIfNull(configure); - - builder.Services.AddSingleton(configure); - return builder; - } - public static IRequestExecutorBuilder ConfigureSchemaServices( this IRequestExecutorBuilder builder, Action configureServices) diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs index 1c77312e894..3e8fd18f4e5 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs @@ -52,7 +52,6 @@ public static IServiceCollection AddGraphQLCore(this IServiceCollection services // pools services - .TryAddResultPool() .TryAddResolverTaskPool() .TryAddOperationContextPool() .TryAddSingleton>(new DocumentValidatorContextPool()); diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs index d721a1e8f24..867091cd66e 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs @@ -7,7 +7,8 @@ internal static class OperationContextExtensions { extension(OperationContext context) { - public OperationContext ReportError(Exception exception, + public OperationContext ReportError( + Exception exception, MiddlewareContext resolverContext, ISelection? selection = null, Path? path = null) @@ -21,7 +22,7 @@ public OperationContext ReportError(Exception exception, { foreach (var error in ex.Errors) { - ReportError(context, error, resolverContext, selection); + ReportError(context, error, resolverContext); } } else @@ -32,15 +33,15 @@ public OperationContext ReportError(Exception exception, .AddLocations(selection.GetSyntaxNodes()) .Build(); - ReportError(context, error, resolverContext, selection); + ReportError(context, error, resolverContext); } return context; } - public OperationContext ReportError(IError error, - MiddlewareContext resolverContext, - ISelection? selection = null) + public OperationContext ReportError( + IError error, + MiddlewareContext resolverContext) { var errors = new List(); @@ -49,53 +50,17 @@ public OperationContext ReportError(IError error, error, errors); - selection ??= resolverContext.Selection; + context.Result.Errors ??= []; foreach (var handled in errors) { - context.Result.AddError(handled, selection); + context.Result.Errors.Add(handled); context.DiagnosticEvents.ResolverError(resolverContext, handled); } return context; } - public OperationContext SetLabel(string? label) - { - context.Result.SetLabel(label); - return context; - } - - public OperationContext SetPath(Path? path) - { - context.Result.SetPath(path); - return context; - } - - public OperationContext SetData(ObjectResult objectResult) - { - context.Result.SetData(objectResult); - return context; - } - - public OperationContext SetItems(IReadOnlyList items) - { - context.Result.SetItems(items); - return context; - } - - public OperationContext SetPatchId(uint patchId) - { - context.Result.SetContextData(WellKnownContextData.PatchId, patchId); - return context; - } - - public OperationContext ClearResult() - { - context.Result.Clear(); - return context; - } - public IOperationResult BuildResult() => context.Result.BuildResult(); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Options/ResultBufferOptions.cs b/src/HotChocolate/Core/src/Types/Execution/Options/ResultBufferOptions.cs deleted file mode 100644 index 09121d622d5..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Options/ResultBufferOptions.cs +++ /dev/null @@ -1,82 +0,0 @@ -using HotChocolate.Execution.Processing; - -namespace HotChocolate.Execution.Options; - -/// -/// Defines the options for the result buffers. -/// -public sealed class ResultBufferOptions -{ - private int _maximumAllowedCapacity = ResultPoolDefaults.MaximumAllowedCapacity; - private int _bucketSize = ResultPoolDefaults.BucketSize; - private int _maximumRetained = ResultPoolDefaults.MaximumRetained; - - /// - /// Defines the maximum number of pooled result objects that are retained in a bucket. - /// - /// - /// The maximum retained must be greater than or equal to 16. - /// - public int MaximumRetained - { - get => _maximumRetained; - set - { - if (value <= 16) - { - throw new ArgumentOutOfRangeException( - nameof(value), - "The maximum retained must be greater than or equal to 16."); - } - - _maximumRetained = value; - } - } - - /// - /// Defines the bucket size for pooled result objects. - /// - /// - /// The bucket size must be greater than or equal to 8. - /// - public int BucketSize - { - get - { - return _bucketSize; - } - set - { - if (value <= 8) - { - throw new ArgumentOutOfRangeException( - nameof(value), - "The bucket size must be greater than or equal to 8."); - } - - _bucketSize = value; - } - } - - /// - /// Defines the maximum allowed fields or list entries of a pooled object. - /// - /// - /// The maximum allowed capacity must be greater than or equal to 16. - /// - public int MaximumAllowedCapacity - { - get => _maximumAllowedCapacity; - set - { - if (value <= 16) - { - throw new ArgumentOutOfRangeException( - nameof(value), - "The maximum allowed capacity must be greater than or equal to 16."); - } - - _maximumAllowedCapacity = value; - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs index 892bf5176ed..ce2a7f9fe9b 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs @@ -8,162 +8,136 @@ namespace HotChocolate.Execution.Processing; internal static partial class ValueCompletion { - private static object? CompleteListValue( + private static void CompleteListValue( ValueCompletionContext context, Selection selection, IType type, - ResultData parent, - int index, - object? result) + ResultElement resultValue, + object runtimeValue) { - if (result is null) - { - return null; - } - var elementType = type.InnerType(); - var isLeafType = elementType.IsLeafType(); - var operationContext = context.OperationContext; - var resolverContext = context.ResolverContext; - if (result is Array array) + if (runtimeValue is Array array) { - var resultList = operationContext.Result.RentList(array.Length); - resultList.IsNullable = elementType.Kind is not TypeKind.NonNull; - resultList.SetParent(parent, index); + var i = 0; - for (var i = 0; i < array.Length; i++) - { - var elementResult = array.GetValue(i); + resultValue.SetArrayValue(array.Length); - if (!TryCompleteElement(context, selection, elementType, isLeafType, resultList, i, elementResult)) + foreach (var element in resultValue.EnumerateArray()) + { + Complete( + context, + selection, + elementType, + element, + array.GetValue(i++)); + + // if we ran into an error that invalidated the result we abort. + if (element.IsInvalidated) { - operationContext.Result.AddRemovedResult(resultList); - return null; + return; } } - - return resultList; } - if (result is IList list) + if (runtimeValue is IList list) { - var resultList = operationContext.Result.RentList(list.Count); - resultList.IsNullable = elementType.Kind is not TypeKind.NonNull; - resultList.SetParent(parent, index); + var i = 0; + + resultValue.SetArrayValue(list.Count); - for (var i = 0; i < list.Count; i++) + foreach (var element in resultValue.EnumerateArray()) { - if (!TryCompleteElement(context, selection, elementType, isLeafType, resultList, i, list[i])) + Complete( + context, + selection, + elementType, + element, + list[i++]); + + // if we ran into an error that invalidated the result we abort. + if (element.IsInvalidated) { - operationContext.Result.AddRemovedResult(resultList); - return null; + return; } } - - return resultList; } - if (result is IEnumerable enumerable) + if (runtimeValue is JsonElement { ValueKind: JsonValueKind.Array } node) { - var resultList = operationContext.Result.RentList(4); - resultList.IsNullable = elementType.Kind is not TypeKind.NonNull; - resultList.SetParent(parent, index); + resultValue.SetArrayValue(node.GetArrayLength()); - var i = 0; + using var runtimeEnumerator = node.EnumerateArray().GetEnumerator(); - foreach (var element in enumerable) + foreach (var element in resultValue.EnumerateArray()) { - if (resultList.Count == resultList.Capacity) - { - resultList.Grow(); - } + runtimeEnumerator.MoveNext(); - if (!TryCompleteElement(context, selection, elementType, isLeafType, resultList, i++, element)) + Complete( + context, + selection, + elementType, + element, + runtimeEnumerator.Current); + + // if we ran into an error that invalidated the result we abort. + if (element.IsInvalidated) { - operationContext.Result.AddRemovedResult(resultList); - return null; + return; } } - - return resultList; } - if (result is JsonElement { ValueKind: JsonValueKind.Array } node) + if (runtimeValue is IEnumerable enumerable) { - var resultList = operationContext.Result.RentList(4); - resultList.IsNullable = elementType.Kind is not TypeKind.NonNull; - resultList.SetParent(parent, index); - var i = 0; - foreach (var element in node.EnumerateArray()) - { - if (resultList.Count == resultList.Capacity) - { - resultList.Grow(); - } + var temp = new List(); - if (!TryCompleteElement(context, selection, elementType, isLeafType, resultList, i++, element)) - { - operationContext.Result.AddRemovedResult(resultList); - return null; - } + foreach (var value in enumerable) + { + temp.Add(value); } - return resultList; - } - - var errorPath = CreatePathFromContext(selection, parent, index); - var error = ListValueIsNotSupported(result.GetType(), selection, errorPath); - operationContext.ReportError(error, resolverContext, selection); - - return null; - } + resultValue.SetArrayValue(temp.Count); - private static bool TryCompleteElement( - ValueCompletionContext context, - Selection selection, - IType elementType, - bool isLeafType, - ListResult list, - int parentIndex, - object? elementResult) - { - // We first add a null entry so that the null-propagation has an element to traverse. - var index = list.AddUnsafe(null); - var completedElement = Complete(context, selection, elementType, list, parentIndex, elementResult); - - if (completedElement is not null) - { - if (isLeafType) + foreach (var element in resultValue.EnumerateArray()) { - list.SetUnsafe(index, completedElement); - } - else - { - var resultData = (ResultData)completedElement; - - if (resultData.IsInvalidated) + Complete( + context, + selection, + elementType, + element, + temp[i++]); + + // if we ran into an error that invalidated the result we abort. + if (element.IsInvalidated) { - return list.IsNullable; + return; } - - list.SetUnsafe(index, resultData); } - return true; } - return list.IsNullable; + var operationContext = context.OperationContext; + var resolverContext = context.ResolverContext; + var error = ListValueIsNotSupported(runtimeValue.GetType(), selection, resultValue.Path); + operationContext.ReportError(error, resolverContext, selection); } internal static void PropagateNullValues(ResultElement result) { result.Invalidate(); - while (result.IsInvalidated || result.IsInvalidated) + do { result = result.Parent; - } + if (result.IsNullable) + { + result.SetNullValue(); + return; + } + + result.Invalidate(); + } while (result is { IsInvalidated: false }); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs index 30bb5f92356..080e9a75d99 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs @@ -29,13 +29,17 @@ private static void CompleteCompositeValue( runtimeValue = converted; } - return EnqueueOrInlineResolverTasks(context, objectType, parent, index, runtimeValue, selectionSet); + EnqueueOrInlineResolverTasks( + context, + selectionSet, + objectType, + resultValue, + runtimeValue); + return; } - var errorPath = CreatePathFromContext(selection, parent, index); - var error = ValueCompletion_CouldNotResolveAbstractType(selection, errorPath, runtimeValue); + var error = ValueCompletion_CouldNotResolveAbstractType(selection, resultValue.Path, runtimeValue); operationContext.ReportError(error, context.ResolverContext, selection); - return null; } private static bool TryResolveObjectType( diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs index c0605295da6..6c849e2d813 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs @@ -11,13 +11,13 @@ public static void Complete( Selection selection, ResultElement resultValue, object? result) - => Complete(context, selection, selection.Type, resultValue, index, result); + => Complete(context, selection, selection.Type, resultValue, result); public static void Complete( ValueCompletionContext context, Selection selection, IType type, - ResultElement parent, + ResultElement resultValue, object? result) { var typeKind = type.Kind; @@ -30,29 +30,28 @@ public static void Complete( if (result is null) { - parent.SetNullValue(); + resultValue.SetNullValue(); return; } switch (typeKind) { case TypeKind.Scalar or TypeKind.Enum: - CompleteLeafValue(context, selection, type, parent, index, result); + CompleteLeafValue(context, selection, (ILeafType2)type, resultValue, result); break; case TypeKind.List: - return CompleteListValue(context, selection, type, parent, index, result); + CompleteListValue(context, selection, type, resultValue, result); + break; case TypeKind.Object or TypeKind.Interface or TypeKind.Union: - return CompleteCompositeValue(context, selection, type, parent, index, result); + CompleteCompositeValue(context, selection, type, resultValue, result); + break; default: - { - var errorPath = CreatePathFromContext(selection, parent, index); - var error = UnexpectedValueCompletionError(selection, errorPath); + var error = UnexpectedValueCompletionError(selection, resultValue.Path); context.OperationContext.ReportError(error, context.ResolverContext, selection); - return null; - } + break; } } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Pooling.cs index f769423b490..e0f6c02a344 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Pooling.cs @@ -17,7 +17,6 @@ internal sealed partial class WorkScheduler(OperationContext operationContext) private IBatchDispatcher _batchDispatcher = null!; private IDisposable _batchDispatcherSession = null!; private IErrorHandler _errorHandler = null!; - private ResultBuilder _result = null!; private IExecutionDiagnosticEvents _diagnosticEvents = null!; private readonly ConcurrentDictionary _completed = new(); private uint _nextId = 1; @@ -33,7 +32,6 @@ public void Initialize(IBatchDispatcher batchDispatcher) _batchDispatcherSession = _batchDispatcher.Subscribe(this); _errorHandler = operationContext.ErrorHandler; - _result = operationContext.Result; _diagnosticEvents = operationContext.DiagnosticEvents; _ct = operationContext.RequestAborted; @@ -63,7 +61,6 @@ public void Clear() _nextId = 1; _requestContext = null!; _errorHandler = null!; - _result = null!; _diagnosticEvents = null!; _ct = CancellationToken.None; diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index 9246b7aca06..41b9d050cd4 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -28,7 +28,7 @@ public void Write() _indentation++; } - if (document._errors?.Count > 0) + if (document.Errors?.Count > 0) { if (indented) { @@ -49,7 +49,7 @@ public void Write() using var jsonWriter = new Utf8JsonWriter(writer, options); JsonValueFormatter.WriteErrors( jsonWriter, - document._errors, + document.Errors, new JsonSerializerOptions(JsonSerializerDefaults.Web), default); jsonWriter.Flush(); diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index 4d931fed0de..5fafdee1c60 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -1,10 +1,13 @@ using System.Buffers; +using System.Collections.Immutable; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; using System.Text; using HotChocolate.Buffers; using HotChocolate.Execution; using HotChocolate.Execution.Processing; +using HotChocolate.Features; using HotChocolate.Types; namespace HotChocolate.Text.Json; @@ -18,8 +21,11 @@ public sealed partial class ResultDocument : IDisposable private int _nextDataIndex; private int _rentedDataSize; private readonly List _data = []; +#if NET10_0_OR_GREATER + private readonly Lock _dataChunkLock = new(); +#else private readonly object _dataChunkLock = new(); - private List? _errors; +#endif private bool _disposed; internal ResultDocument(Operation operation, ulong includeFlags) @@ -33,19 +39,6 @@ internal ResultDocument(Operation operation, ulong includeFlags) public ResultElement Data { get; } - // we need extra methods to add stuff - public List? Errors - { - get => _errors; - internal set => _errors = value; - } - - public int RequestIndex { get; init; } - - public int VariableIndex { get; init; } - - public Dictionary? Extensions { get; set; } - [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ElementTokenType GetElementTokenType(Cursor cursor) => _metaDb.GetElementTokenType(cursor); @@ -216,8 +209,8 @@ internal ResultElement GetParent(Cursor current) // if we have not yet reached the root and the element type of the parent is an object or an array // then we need to get still the parent of this row as we want to get the logical parent // which is the value level of the property or the element in an array. - if (parent != Cursor.Zero - && _metaDb.GetElementTokenType(parent) is ElementTokenType.StartObject or ElementTokenType.StartArray) + if (parent != Cursor.Zero && + _metaDb.GetElementTokenType(parent) is ElementTokenType.StartObject or ElementTokenType.StartArray) { parent = _metaDb.GetParentCursor(parent); @@ -449,52 +442,61 @@ private ReadOnlySpan ReadLocalData(int location, int size) // Data spans chunk boundaries - this should be rare for typical JSON values throw new NotSupportedException( - "Reading data that spans chunk boundaries as a span is not supported. " - + "Use WriteLocalDataTo for writing to an IBufferWriter instead."); + "Reading data that spans chunk boundaries as a span is not supported. " + + "Use WriteLocalDataTo for writing to an IBufferWriter instead."); } internal ResultElement CreateObject(Cursor parent, SelectionSet selectionSet) { - var startObjectCursor = WriteStartObject(parent, selectionSet.Id); - - var selectionCount = 0; - foreach (var selection in selectionSet.Selections) + lock (_dataChunkLock) { - WriteEmptyProperty(startObjectCursor, selection); - selectionCount++; - } + var startObjectCursor = WriteStartObject(parent, selectionSet.Id); - WriteEndObject(startObjectCursor, selectionCount); + var selectionCount = 0; + foreach (var selection in selectionSet.Selections) + { + WriteEmptyProperty(startObjectCursor, selection); + selectionCount++; + } - return new ResultElement(this, startObjectCursor); + WriteEndObject(startObjectCursor, selectionCount); + + return new ResultElement(this, startObjectCursor); + } } internal ResultElement CreateObject(Cursor parent, int propertyCount) { - var startObjectCursor = WriteStartObject(parent, isSelectionSet: false); - - for (var i = 0; i < propertyCount; i++) + lock (_dataChunkLock) { - WriteEmptyProperty(startObjectCursor); - } + var startObjectCursor = WriteStartObject(parent, isSelectionSet: false); - WriteEndObject(startObjectCursor, propertyCount); + for (var i = 0; i < propertyCount; i++) + { + WriteEmptyProperty(startObjectCursor); + } - return new ResultElement(this, startObjectCursor); + WriteEndObject(startObjectCursor, propertyCount); + + return new ResultElement(this, startObjectCursor); + } } internal ResultElement CreateArray(Cursor parent, int length) { - var cursor = WriteStartArray(parent, length); - - for (var i = 0; i < length; i++) + lock (_dataChunkLock) { - WriteEmptyValue(cursor); - } + var cursor = WriteStartArray(parent, length); + + for (var i = 0; i < length; i++) + { + WriteEmptyValue(cursor); + } - WriteEndArray(); + WriteEndArray(); - return new ResultElement(this, cursor); + return new ResultElement(this, cursor); + } } [MethodImpl(MethodImplOptions.AggressiveInlining)] From 8da86fd931663da6d5989f5ae3eb7d55a581efbd Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 16 Dec 2025 10:55:25 +0100 Subject: [PATCH 034/144] wip --- .../DefaultHttpResponseFormatter.cs | 22 +- .../DefaultWebSocketPayloadFormatter.cs | 2 +- .../Formatters/IWebSocketPayloadFormatter.cs | 2 +- .../HttpMultipartMiddleware.cs | 2 +- .../HttpPostMiddlewareBase.cs | 16 +- .../AggregateServerDiagnosticEventListener.cs | 2 +- .../IServerDiagnosticEvents.cs | 2 +- .../NoopServerDiagnosticEventListener.cs | 2 +- .../Interceptors/ISocketSessionInterceptor.cs | 6 +- .../Utilities/ErrorHelper.cs | 22 +- .../Utilities/MiddlewareHelper.cs | 10 +- .../EventStreamResultFormatter.cs | 8 +- .../JsonLinesResultFormatter.cs | 8 +- .../JsonResultFormatter.cs | 82 +---- .../MultiPartResultFormatter.cs | 8 +- .../src/Transport.Http/GraphQLHttpResponse.cs | 33 +- .../GraphQLOverHttpSpecTests.cs | 1 + .../Execution/OperationResultHelper.cs | 83 ----- .../Abstractions/SingleValueExtensionData.cs | 91 ----- .../Execution/ExecutionResult.cs | 38 +-- .../CoreExecutionResultExtensions.cs | 164 +++++---- .../Features/IncrementalDataFeature.cs | 16 + .../Execution/IOperationResult.cs | 70 ---- .../Execution/IOperationResultFormatter.cs | 6 +- .../Execution/IRawJsonFormatter.cs | 5 +- .../Execution/IRequestExecutor.cs | 6 +- .../Execution/IResponseStream.cs | 4 +- .../Execution/OperationResult.cs | 314 ++++++++++++++++++ .../Execution/OperationResultBatch.cs | 10 +- .../Execution/OperationResultData.cs | 58 ++++ .../Execution/RequestExecutorProxy.cs | 6 +- .../Execution/ResponseStream.cs | 20 +- .../DocumentParserMiddleware.cs | 2 +- .../DocumentValidationMiddleware.cs | 13 +- .../src/Execution.Pipeline/ErrorHelper.cs | 4 +- .../Execution.Pipeline/ExceptionMiddleware.cs | 6 +- .../src/Validation/DocumentValidatorResult.cs | 4 +- .../FusionTestBase.MatchSnapshot.cs | 8 +- ...ticPersistedOperationNotFoundMiddleware.cs | 29 +- ...nlyPersistedOperationsAllowedMiddleware.cs | 9 +- .../PersistedOperationNotFoundMiddleware.cs | 6 +- .../WritePersistedOperationMiddleware.cs | 11 +- 42 files changed, 643 insertions(+), 568 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Abstractions/Execution/OperationResultHelper.cs delete mode 100644 src/HotChocolate/Core/src/Abstractions/SingleValueExtensionData.cs create mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/Features/IncrementalDataFeature.cs delete mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResult.cs create mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs create mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultData.cs diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultHttpResponseFormatter.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultHttpResponseFormatter.cs index d16564200d0..fbd0f33c145 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultHttpResponseFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultHttpResponseFormatter.cs @@ -201,22 +201,20 @@ private async ValueTask FormatInternalAsync( { switch (result) { - case IOperationResult operationResult: + case OperationResult operationResult: { var statusCode = (int)OnDetermineStatusCode(operationResult, format, proposedStatusCode); response.ContentType = format.ContentType; response.StatusCode = statusCode; - if (result.ContextData is not null - && result.ContextData.TryGetValue(ExecutionContextData.CacheControlHeaderValue, out var value) + if (result.ContextData.TryGetValue(ExecutionContextData.CacheControlHeaderValue, out var value) && value is CacheControlHeaderValue cacheControlHeaderValue) { response.GetTypedHeaders().CacheControl = cacheControlHeaderValue; } - if (result.ContextData is not null - && result.ContextData.TryGetValue(ExecutionContextData.VaryHeaderValue, out var varyValue) + if (result.ContextData.TryGetValue(ExecutionContextData.VaryHeaderValue, out var varyValue) && varyValue is string varyHeaderValue) { response.Headers.Vary = varyHeaderValue; @@ -301,7 +299,7 @@ CachedSchemaOutput Update(string _) /// Determines which status code shall be returned for this result. /// /// - /// The . + /// The . /// /// /// Provides information about the transport format that is applied. @@ -313,7 +311,7 @@ CachedSchemaOutput Update(string _) /// Returns the that the formatter must use. /// protected virtual HttpStatusCode OnDetermineStatusCode( - IOperationResult result, + OperationResult result, FormatInfo format, HttpStatusCode? proposedStatusCode) { @@ -346,10 +344,8 @@ protected virtual HttpStatusCode OnDetermineStatusCode( // if the GraphQL result has context data, we will check if some middleware provided // a status code or indicated an error that should be interpreted as a status code. - if (result.ContextData is not null) + if (result.ContextData is { Count: > 0 } contextData) { - var contextData = result.ContextData; - // First, we check if there is an explicit HTTP status code override by the user. if (contextData.TryGetValue(ExecutionContextData.HttpStatusCode, out var value)) { @@ -371,7 +367,7 @@ protected virtual HttpStatusCode OnDetermineStatusCode( return HttpStatusCode.BadRequest; } - if (result.ContextData.ContainsKey(ExecutionContextData.OperationNotAllowed)) + if (contextData.ContainsKey(ExecutionContextData.OperationNotAllowed)) { return HttpStatusCode.MethodNotAllowed; } @@ -405,7 +401,7 @@ protected virtual HttpStatusCode OnDetermineStatusCode( /// the formatter starts writing the response body. /// /// - /// The . + /// The . /// /// /// Provides information about the transport format that is applied. @@ -414,7 +410,7 @@ protected virtual HttpStatusCode OnDetermineStatusCode( /// The header dictionary. /// protected virtual void OnWriteResponseHeaders( - IOperationResult result, + OperationResult result, FormatInfo format, IHeaderDictionary headers) { diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs index f7eda176d65..0516575b22c 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs @@ -12,7 +12,7 @@ public class DefaultWebSocketPayloadFormatter(WebSocketPayloadFormatterOptions o private readonly JsonResultFormatter _jsonFormatter = new(options.Json); /// - public void Format(IOperationResult result, Utf8JsonWriter jsonWriter) + public void Format(OperationResult result, Utf8JsonWriter jsonWriter) { _jsonFormatter.Format(result, jsonWriter); } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/IWebSocketPayloadFormatter.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/IWebSocketPayloadFormatter.cs index 6833e680501..367939e0f69 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/IWebSocketPayloadFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/IWebSocketPayloadFormatter.cs @@ -16,7 +16,7 @@ public interface IWebSocketPayloadFormatter /// /// The JSON writer that is used to write the payload. /// - void Format(IOperationResult result, Utf8JsonWriter jsonWriter); + void Format(OperationResult result, Utf8JsonWriter jsonWriter); /// /// Formats the into a WebSocket payload. diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs index 7f96517c911..a2f1df11c1a 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs @@ -20,7 +20,7 @@ public sealed class HttpMultipartMiddleware : HttpPostMiddlewareBase private const string Operations = "operations"; private const string Map = "map"; private readonly FormOptions _formOptions; - private readonly IOperationResult _multipartRequestError = MultiPartRequestPreflightRequired(); + private readonly OperationResult _multipartRequestError = MultiPartRequestPreflightRequired(); public HttpMultipartMiddleware( HttpRequestDelegate next, diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs index 739fa6f5263..655d7fe06be 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs @@ -79,7 +79,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses statusCode = HttpStatusCode.NotAcceptable; var error = ErrorHelper.NoSupportedAcceptMediaType(); - result = OperationResultBuilder.CreateError(error); + result = OperationResult.FromError(error); session.DiagnosticEvents.HttpRequestError(context, error); goto HANDLE_RESULT; } @@ -100,7 +100,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses // GraphQL error result. statusCode = HttpStatusCode.BadRequest; var errors = session.Handle(ex.Errors); - result = OperationResultBuilder.CreateError(errors); + result = OperationResult.FromError([..errors]); session.DiagnosticEvents.ParserErrors(context, errors); goto HANDLE_RESULT; } @@ -108,7 +108,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses { statusCode = HttpStatusCode.InternalServerError; var error = ErrorBuilder.FromException(ex).Build(); - result = OperationResultBuilder.CreateError(error); + result = OperationResult.FromError(error); session.DiagnosticEvents.HttpRequestError(context, error); goto HANDLE_RESULT; } @@ -125,7 +125,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses { statusCode = HttpStatusCode.BadRequest; var error = session.Handle(ErrorHelper.RequestHasNoElements()); - result = OperationResultBuilder.CreateError(error); + result = OperationResult.FromError(error); session.DiagnosticEvents.HttpRequestError(context, error); break; } @@ -151,7 +151,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses { var error = session.Handle(ErrorHelper.InvalidRequest()); statusCode = HttpStatusCode.BadRequest; - result = OperationResultBuilder.CreateError(error); + result = OperationResult.FromError(error); session.DiagnosticEvents.HttpRequestError(context, error); } @@ -180,7 +180,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses { var error = session.Handle(ErrorHelper.InvalidRequest()); statusCode = HttpStatusCode.BadRequest; - result = OperationResultBuilder.CreateError(error); + result = OperationResult.FromError(error); session.DiagnosticEvents.HttpRequestError(context, error); } break; @@ -190,7 +190,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses { // This allows extensions to throw GraphQL exceptions in the GraphQL interceptor. statusCode = null; // we let the serializer determine the status code. - result = OperationResultBuilder.CreateError(ex.Errors); + result = OperationResult.FromError([..ex.Errors]); foreach (var error in ex.Errors) { @@ -201,7 +201,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses { statusCode = HttpStatusCode.InternalServerError; var error = ErrorBuilder.FromException(ex).Build(); - result = OperationResultBuilder.CreateError(error); + result = OperationResult.FromError(error); session.DiagnosticEvents.HttpRequestError(context, error); } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/AggregateServerDiagnosticEventListener.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/AggregateServerDiagnosticEventListener.cs index 5f0dbf09438..3fd66e60177 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/AggregateServerDiagnosticEventListener.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/AggregateServerDiagnosticEventListener.cs @@ -87,7 +87,7 @@ public void ParserErrors(HttpContext context, IReadOnlyList errors) } } - public IDisposable FormatHttpResponse(HttpContext context, IOperationResult result) + public IDisposable FormatHttpResponse(HttpContext context, OperationResult result) { var scopes = new IDisposable[_listeners.Length]; diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/IServerDiagnosticEvents.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/IServerDiagnosticEvents.cs index 925a546f5c1..781460bcdb1 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/IServerDiagnosticEvents.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/IServerDiagnosticEvents.cs @@ -124,7 +124,7 @@ void StartOperationBatchRequest( /// /// A scope that will be disposed when GraphQL query result is written to the response stream. /// - IDisposable FormatHttpResponse(HttpContext context, IOperationResult result); + IDisposable FormatHttpResponse(HttpContext context, OperationResult result); /// /// Called when starting to establish a GraphQL WebSocket session. diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/NoopServerDiagnosticEventListener.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/NoopServerDiagnosticEventListener.cs index 2387107c8e0..2270cb61880 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/NoopServerDiagnosticEventListener.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/NoopServerDiagnosticEventListener.cs @@ -37,7 +37,7 @@ public void ParserErrors(HttpContext context, IReadOnlyList errors) { } - public IDisposable FormatHttpResponse(HttpContext context, IOperationResult result) => EmptyScope; + public IDisposable FormatHttpResponse(HttpContext context, OperationResult result) => EmptyScope; public IDisposable WebSocketSession(HttpContext context) => EmptyScope; diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/ISocketSessionInterceptor.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/ISocketSessionInterceptor.cs index 6945d03bca1..4333b22b3ca 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/ISocketSessionInterceptor.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/ISocketSessionInterceptor.cs @@ -67,12 +67,12 @@ ValueTask OnRequestAsync( /// The cancellation token. /// /// - /// Returns the result that shall be send to the client. + /// Returns the result that shall be sent to the client. /// - ValueTask OnResultAsync( + ValueTask OnResultAsync( ISocketSession session, string operationSessionId, - IOperationResult result, + OperationResult result, CancellationToken cancellationToken = default); /// diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/ErrorHelper.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/ErrorHelper.cs index 2f250d25e4e..4497118695b 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/ErrorHelper.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/ErrorHelper.cs @@ -26,8 +26,8 @@ public static IError NoSupportedAcceptMediaType() .SetCode(ErrorCodes.Server.NoSupportedAcceptMediaType) .Build(); - public static IOperationResult TypeNameIsEmpty() - => OperationResultBuilder.CreateError( + public static OperationResult TypeNameIsEmpty() + => OperationResult.FromError( new Error { Message = ErrorHelper_TypeNameIsEmpty, @@ -35,8 +35,8 @@ public static IOperationResult TypeNameIsEmpty() .Add("code", ErrorCodes.Server.TypeParameterIsEmpty) }); - public static IOperationResult InvalidTypeName(string typeName) - => OperationResultBuilder.CreateError( + public static OperationResult InvalidTypeName(string typeName) + => OperationResult.FromError( new Error { Message = ErrorHelper_InvalidTypeName, @@ -45,8 +45,8 @@ public static IOperationResult InvalidTypeName(string typeName) .Add(nameof(typeName), typeName) }); - public static IOperationResult TypeNotFound(string typeName) - => OperationResultBuilder.CreateError( + public static OperationResult TypeNotFound(string typeName) + => OperationResult.FromError( new Error { Message = string.Format(ErrorHelper_TypeNotFound, typeName), @@ -55,8 +55,8 @@ public static IOperationResult TypeNotFound(string typeName) .Add(nameof(typeName), typeName) }); - public static IOperationResult InvalidAcceptMediaType(string headerValue) - => OperationResultBuilder.CreateError( + public static OperationResult InvalidAcceptMediaType(string headerValue) + => OperationResult.FromError( new Error { Message = string.Format(ErrorHelper_InvalidAcceptMediaType, headerValue), @@ -65,8 +65,8 @@ public static IOperationResult InvalidAcceptMediaType(string headerValue) .Add(nameof(headerValue), headerValue) }); - public static IOperationResult MultiPartRequestPreflightRequired() - => OperationResultBuilder.CreateError( + public static OperationResult MultiPartRequestPreflightRequired() + => OperationResult.FromError( new Error { Message = ErrorHelper_MultiPartRequestPreflightRequired, @@ -81,7 +81,7 @@ public static GraphQLRequestException InvalidOperationIdFormat() .Build()); public static IExecutionResult OperationNameRequired() - => OperationResultBuilder.CreateError( + => OperationResult.FromError( ErrorBuilder.New() .SetMessage("The operation name is required.") .Build()); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs index 9c9e3ac6ff7..d894b5a34fd 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs @@ -227,14 +227,14 @@ await executorSession.OnCreateAsync( } return new ExecuteRequestResult( - OperationResultBuilder.CreateError(ex.Errors)); + OperationResult.FromError([..ex.Errors])); } catch (Exception ex) { var error = ErrorBuilder.FromException(ex).Build(); executorSession.DiagnosticEvents.HttpRequestError(context, error); return new ExecuteRequestResult( - OperationResultBuilder.CreateError(error), + OperationResult.FromError(error), HttpStatusCode.InternalServerError); } } @@ -313,7 +313,7 @@ public ValidateAcceptContentTypeResult( AcceptMediaType[] acceptMediaTypes) { IsValid = false; - Error = OperationResultBuilder.CreateError(error); + Error = OperationResult.FromError(error); StatusCode = statusCode; RequestFlags = RequestFlags.None; AcceptMediaTypes = acceptMediaTypes; @@ -345,7 +345,7 @@ public ParseRequestResult(GraphQLRequest request) public ParseRequestResult(IReadOnlyList errors, HttpStatusCode statusCode) { IsValid = false; - Error = OperationResultBuilder.CreateError(errors); + Error = OperationResult.FromError([..errors]); StatusCode = statusCode; Request = null; } @@ -353,7 +353,7 @@ public ParseRequestResult(IReadOnlyList errors, HttpStatusCode statusCod public ParseRequestResult(IError error, HttpStatusCode statusCode) { IsValid = false; - Error = OperationResultBuilder.CreateError(error); + Error = OperationResult.FromError(error); StatusCode = statusCode; Request = null; } diff --git a/src/HotChocolate/AspNetCore/src/Transport.Formatters/EventStreamResultFormatter.cs b/src/HotChocolate/AspNetCore/src/Transport.Formatters/EventStreamResultFormatter.cs index a939da7cf81..e5905bd7649 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Formatters/EventStreamResultFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Formatters/EventStreamResultFormatter.cs @@ -34,7 +34,7 @@ public ValueTask FormatAsync( return result switch { - IOperationResult operationResult + OperationResult operationResult => FormatOperationResultAsync(operationResult, writer, cancellationToken), OperationResultBatch resultBatch => FormatResultBatchAsync(resultBatch, writer, cancellationToken), @@ -45,7 +45,7 @@ IResponseStream responseStream } private async ValueTask FormatOperationResultAsync( - IOperationResult operationResult, + OperationResult operationResult, PipeWriter writer, CancellationToken ct) { @@ -83,7 +83,7 @@ private async ValueTask FormatResultBatchAsync( { switch (result) { - case IOperationResult operationResult: + case OperationResult operationResult: { using var scope = Log.FormatOperationResultStart(); await semaphore.WaitAsync(ct).ConfigureAwait(false); @@ -364,7 +364,7 @@ private static class MessageHelper public static void FormatNextMessage( JsonResultFormatter payloadFormatter, - IOperationResult result, + OperationResult result, IBufferWriter writer) { // write the SSE event field diff --git a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonLinesResultFormatter.cs b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonLinesResultFormatter.cs index 9b0804e7d8b..382ffaf74db 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonLinesResultFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonLinesResultFormatter.cs @@ -23,7 +23,7 @@ public ValueTask FormatAsync( return result switch { - IOperationResult operationResult + OperationResult operationResult => FormatOperationResultAsync(operationResult, writer, cancellationToken), OperationResultBatch resultBatch => FormatResultBatchAsync(resultBatch, writer, cancellationToken), @@ -37,7 +37,7 @@ IResponseStream responseStream /// Writes a single GraphQL response and then completes. /// private async ValueTask FormatOperationResultAsync( - IOperationResult operationResult, + OperationResult operationResult, PipeWriter writer, CancellationToken ct) { @@ -78,7 +78,7 @@ private async ValueTask FormatResultBatchAsync( { switch (result) { - case IOperationResult operationResult: + case OperationResult operationResult: { using var scope = Log.FormatOperationResultStart(); await semaphore.WaitAsync(ct).ConfigureAwait(false); @@ -316,7 +316,7 @@ private static class MessageHelper public static void FormatNextMessage( JsonResultFormatter payloadFormatter, - IOperationResult result, + OperationResult result, IBufferWriter writer) { // write the result data diff --git a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs index 5589fcde80d..788b2877a89 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs @@ -8,7 +8,7 @@ namespace HotChocolate.Transport.Formatters; /// -/// The default JSON formatter for . +/// The default JSON formatter for . /// public sealed class JsonResultFormatter : IOperationResultFormatter, IExecutionResultFormatter { @@ -42,12 +42,12 @@ public JsonResultFormatter(JsonResultFormatterOptions options) } /// - /// The default JSON formatter for with indentations. + /// The default JSON formatter for with indentations. /// public static JsonResultFormatter Indented { get; } = new(true); /// - /// The default JSON formatter for without indentations. + /// The default JSON formatter for without indentations. /// public static JsonResultFormatter Default { get; } = new(); @@ -62,7 +62,7 @@ public ValueTask FormatAsync( return result switch { - IOperationResult singleResult => FormatInternalAsync(singleResult, writer, cancellationToken), + OperationResult singleResult => FormatInternalAsync(singleResult, writer, cancellationToken), OperationResultBatch resultBatch => FormatInternalAsync(resultBatch, writer, cancellationToken), IResponseStream responseStream => FormatInternalAsync(responseStream, writer, cancellationToken), _ => throw new NotSupportedException($"The result type '{result.GetType().FullName}' is not supported.") @@ -82,7 +82,7 @@ public ValueTask FormatAsync( /// is null. /// is null. /// - public void Format(IOperationResult result, Utf8JsonWriter writer) + public void Format(OperationResult result, Utf8JsonWriter writer) { ArgumentNullException.ThrowIfNull(result); ArgumentNullException.ThrowIfNull(writer); @@ -147,7 +147,7 @@ public void FormatDictionary(IReadOnlyDictionary dictionary, Ut WriteDictionary(writer, dictionary, _serializerOptions, _nullIgnoreCondition); } - public void Format(IOperationResult result, IBufferWriter writer) + public void Format(OperationResult result, IBufferWriter writer) { ArgumentNullException.ThrowIfNull(result); ArgumentNullException.ThrowIfNull(writer); @@ -155,11 +155,11 @@ public void Format(IOperationResult result, IBufferWriter writer) FormatInternal(result, writer); } - private void FormatInternal(IOperationResult result, IBufferWriter writer) + private void FormatInternal(OperationResult result, IBufferWriter writer) { - if (result is IRawJsonFormatter formatter) + if (result.JsonFormatter is { } formatter) { - formatter.WriteTo(writer, _options.Indented); + formatter.WriteTo(result, writer, _options.Indented); return; } @@ -169,7 +169,7 @@ private void FormatInternal(IOperationResult result, IBufferWriter writer) } public ValueTask FormatAsync( - IOperationResult result, + OperationResult result, PipeWriter writer, CancellationToken cancellationToken = default) { @@ -180,7 +180,7 @@ public ValueTask FormatAsync( } private async ValueTask FormatInternalAsync( - IOperationResult result, + OperationResult result, PipeWriter writer, CancellationToken cancellationToken) { @@ -197,7 +197,7 @@ private async ValueTask FormatInternalAsync( { switch (result) { - case IOperationResult singleResult: + case OperationResult singleResult: FormatInternal(singleResult, writer); break; @@ -244,7 +244,7 @@ private async ValueTask FormatInternalAsync( } } - private void WriteResult(Utf8JsonWriter writer, IOperationResult result) + private void WriteResult(Utf8JsonWriter writer, OperationResult result) { writer.WriteStartObject(); @@ -260,33 +260,15 @@ private void WriteResult(Utf8JsonWriter writer, IOperationResult result) WriteErrors(writer, result.Errors); WriteData(writer, result); - WriteItems(writer, result.Items); - WriteIncremental(writer, result.Incremental); WriteExtensions(writer, result.Extensions, _serializerOptions, _nullIgnoreCondition); - WritePatchInfo(writer, result); WriteHasNext(writer, result); writer.WriteEndObject(); } - private static void WritePatchInfo( - Utf8JsonWriter writer, - IOperationResult result) - { - if (result.Label is not null) - { - writer.WriteString("label", result.Label); - } - - if (result.Path is not null) - { - WritePath(writer, result.Path); - } - } - private static void WriteHasNext( Utf8JsonWriter writer, - IOperationResult result) + OperationResult result) { if (result.HasNext.HasValue) { @@ -296,7 +278,7 @@ private static void WriteHasNext( private void WriteData( Utf8JsonWriter writer, - IOperationResult result) + OperationResult result) { if (!result.IsDataSet) { @@ -314,23 +296,6 @@ private void WriteData( WriteValue(writer, result.Data, _serializerOptions, _nullIgnoreCondition); } - private void WriteItems(Utf8JsonWriter writer, IReadOnlyList? items) - { - if (items is { Count: > 0 }) - { - writer.WritePropertyName(Items); - - writer.WriteStartArray(); - - for (var i = 0; i < items.Count; i++) - { - WriteValue(writer, items[i], _serializerOptions, _nullIgnoreCondition); - } - - writer.WriteEndArray(); - } - } - private void WriteErrors(Utf8JsonWriter writer, IReadOnlyList? errors) { if (errors is { Count: > 0 }) @@ -348,23 +313,6 @@ private void WriteErrors(Utf8JsonWriter writer, IReadOnlyList? errors) } } - private void WriteIncremental(Utf8JsonWriter writer, IReadOnlyList? patches) - { - if (patches is { Count: > 0 }) - { - writer.WritePropertyName(Incremental); - - writer.WriteStartArray(); - - for (var i = 0; i < patches.Count; i++) - { - WriteResult(writer, patches[i]); - } - - writer.WriteEndArray(); - } - } - private Utf8JsonWriter CreateWriter(IBufferWriter buffer) { if (_writer.Value is not { } writer) diff --git a/src/HotChocolate/AspNetCore/src/Transport.Formatters/MultiPartResultFormatter.cs b/src/HotChocolate/AspNetCore/src/Transport.Formatters/MultiPartResultFormatter.cs index acbd3a4b2f5..06d8160d54e 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Formatters/MultiPartResultFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Formatters/MultiPartResultFormatter.cs @@ -59,7 +59,7 @@ public ValueTask FormatAsync( return result switch { - IOperationResult operationResult + OperationResult operationResult => FormatOperationResultAsync(operationResult, writer, cancellationToken), OperationResultBatch resultBatch => FormatResultBatchAsync(resultBatch, writer, cancellationToken), @@ -70,7 +70,7 @@ IResponseStream responseStream } private async ValueTask FormatOperationResultAsync( - IOperationResult result, + OperationResult result, PipeWriter writer, CancellationToken ct = default) { @@ -98,7 +98,7 @@ private async ValueTask FormatResultBatchAsync( { switch (result) { - case IOperationResult operationResult: + case OperationResult operationResult: buffer ??= new PooledArrayWriter(); MessageHelper.WriteNext(buffer); MessageHelper.WriteResultHeader(buffer); @@ -186,7 +186,7 @@ public static void WriteEnd(IBufferWriter writer) public static void WritePayload( IBufferWriter writer, - IOperationResult result, + OperationResult result, IOperationResultFormatter payloadFormatter) => payloadFormatter.Format(result, writer); diff --git a/src/HotChocolate/AspNetCore/src/Transport.Http/GraphQLHttpResponse.cs b/src/HotChocolate/AspNetCore/src/Transport.Http/GraphQLHttpResponse.cs index 2281101d5b2..5bcefd216d2 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Http/GraphQLHttpResponse.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Http/GraphQLHttpResponse.cs @@ -1,5 +1,3 @@ - -using HotChocolate.Buffers; #if FUSION using System.Buffers; using System.Net; @@ -12,6 +10,7 @@ using System.Net.Http.Headers; using System.Text.Json; #endif +using HotChocolate.Buffers; #if FUSION namespace HotChocolate.Fusion.Transport.Http; @@ -105,19 +104,29 @@ public GraphQLHttpResponse(HttpResponseMessage message) /// public HttpResponseHeaders TrailingHeaders => _message.TrailingHeaders; +#if FUSION /// - /// Reads the GraphQL response as a . + /// Reads the GraphQL response as a . /// /// /// A cancellation token that can be used to cancel the HTTP request. /// /// /// A that represents the asynchronous read operation - /// to read the from the underlying . + /// to read the from the underlying . /// -#if FUSION public ValueTask ReadAsResultAsync(CancellationToken cancellationToken = default) #else + /// + /// Reads the GraphQL response as a . + /// + /// + /// A cancellation token that can be used to cancel the HTTP request. + /// + /// + /// A that represents the asynchronous read operation + /// to read the from the underlying . + /// public ValueTask ReadAsResultAsync(CancellationToken cancellationToken = default) #endif { @@ -302,6 +311,17 @@ private async ValueTask ReadAsResultInternalAsync(string? charS #endif } +#if FUSION + /// + /// Reads the GraphQL response as a of . + /// + /// + /// A of that represents the asynchronous + /// read operation to read the stream of s from the underlying + /// . + /// + public IAsyncEnumerable ReadAsResultStreamAsync() +#else /// /// Reads the GraphQL response as a of . /// @@ -310,9 +330,6 @@ private async ValueTask ReadAsResultInternalAsync(string? charS /// read operation to read the stream of s from the underlying /// . /// -#if FUSION - public IAsyncEnumerable ReadAsResultStreamAsync() -#else public IAsyncEnumerable ReadAsResultStreamAsync() #endif { diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs index 799e4afb4cc..c0bfcc614dd 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs @@ -10,6 +10,7 @@ using static System.Net.HttpStatusCode; using static HotChocolate.AspNetCore.HttpTransportVersion; using MediaTypeHeaderValue = System.Net.Http.Headers.MediaTypeHeaderValue; +using OperationResult = HotChocolate.Execution.OperationResult; namespace HotChocolate.AspNetCore; diff --git a/src/HotChocolate/Core/src/Abstractions/Execution/OperationResultHelper.cs b/src/HotChocolate/Core/src/Abstractions/Execution/OperationResultHelper.cs deleted file mode 100644 index b8e26e910cc..00000000000 --- a/src/HotChocolate/Core/src/Abstractions/Execution/OperationResultHelper.cs +++ /dev/null @@ -1,83 +0,0 @@ -namespace HotChocolate.Execution; - -internal static class OperationResultHelper -{ - private const string Data = "data"; - private const string Errors = "errors"; - private const string Extensions = "extensions"; - private const string Message = "message"; - private const string Locations = "locations"; - private const string Path = "path"; - private const string Line = "line"; - private const string Column = "column"; - - public static IReadOnlyDictionary ToDictionary(IOperationResult result) - { - var formatted = new OrderedDictionary(); - - if (result.Errors is { Count: > 0 }) - { - formatted[Errors] = SerializeErrors(result.Errors); - } - - if (result.Data is { Count: > 0 }) - { - formatted[Data] = result.Data; - } - - if (result.Extensions is { Count: > 0 }) - { - formatted[Extensions] = result.Extensions; - } - - return formatted; - } - - private static ICollection SerializeErrors( - IReadOnlyCollection errors) - { - var formattedErrors = new List(); - - foreach (var error in errors) - { - var formattedError = new OrderedDictionary { [Message] = error.Message }; - - if (error.Locations is { Count: > 0 }) - { - formattedError[Locations] = SerializeLocations(error.Locations); - } - - if (error.Path is { }) - { - formattedError[Path] = error.Path.ToList(); - } - - if (error.Extensions is { Count: > 0 }) - { - formattedError[Extensions] = error.Extensions; - } - - formattedErrors.Add(formattedError); - } - - return formattedErrors; - } - - private static IReadOnlyList> SerializeLocations( - IReadOnlyList locations) - { - var serializedLocations = new IReadOnlyDictionary[locations.Count]; - - for (var i = 0; i < locations.Count; i++) - { - var location = locations[i]; - serializedLocations[i] = new OrderedDictionary - { - { Line, location.Line }, - { Column, location.Column } - }; - } - - return serializedLocations; - } -} diff --git a/src/HotChocolate/Core/src/Abstractions/SingleValueExtensionData.cs b/src/HotChocolate/Core/src/Abstractions/SingleValueExtensionData.cs deleted file mode 100644 index 67fc7f375c3..00000000000 --- a/src/HotChocolate/Core/src/Abstractions/SingleValueExtensionData.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System.Collections; -using HotChocolate.Execution; -using static HotChocolate.Properties.AbstractionResources; - -namespace HotChocolate; - -/// -/// An optimized extension data dictionary for or -/// when only one value is needed. -/// -public sealed class SingleValueExtensionData : IReadOnlyDictionary -{ - private readonly string _key; - private readonly object? _value; - - /// - /// Creates a new instance of . - /// - /// The key. - /// The value. - public SingleValueExtensionData(string key, object? value) - { - ArgumentException.ThrowIfNullOrEmpty(key); - - _key = key; - _value = value; - } - - /// - public int Count => 1; - - /// - public bool ContainsKey(string key) => string.Equals(_key, key, StringComparison.Ordinal); - - /// - public bool TryGetValue(string key, out object? value) - { - if (ContainsKey(key)) - { - value = _value; - return true; - } - - value = null; - return false; - } - - /// - public object? this[string key] - { - get - { - if (TryGetValue(key, out var value)) - { - return value; - } - - throw new KeyNotFoundException(string.Format( - SingleValueExtensionData_KeyNotFound, - key)); - } - } - - /// - public IEnumerable Keys - { - get - { - yield return _key; - } - } - - /// - public IEnumerable Values - { - get - { - yield return _value; - } - } - - /// - public IEnumerator> GetEnumerator() - { - yield return new KeyValuePair(_key, _value); - } - - /// - IEnumerator IEnumerable.GetEnumerator() - => GetEnumerator(); -} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ExecutionResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ExecutionResult.cs index 88b7c2035a7..a3d5f869992 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ExecutionResult.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ExecutionResult.cs @@ -9,22 +9,11 @@ namespace HotChocolate.Execution; /// public abstract class ExecutionResult : IExecutionResult { - protected static readonly ArrayPool> CleanUpTaskPool = ArrayPool>.Shared; + private static readonly ArrayPool> s_cleanUpTaskPool = ArrayPool>.Shared; private Func[] _cleanUpTasks = []; private int _cleanupTasksLength; private bool _disposed; - protected ExecutionResult() - { - Features = new FeatureCollection(); - } - - protected ExecutionResult((Func[] Tasks, int Length)? cleanupTasks, IFeatureCollection? features) - { - Features = features ?? new FeatureCollection(); - (_cleanUpTasks, _cleanupTasksLength) = cleanupTasks ?? ([], 0); - } - /// public abstract ExecutionResultKind Kind { get; } @@ -36,22 +25,7 @@ protected ExecutionResult((Func[] Tasks, int Length)? cleanupTasks, I } /// - public IFeatureCollection Features { get; } - - /// - /// This helper allows someone else to take over the responsibility over the cleanup tasks. - /// This object no longer will track them after they were taken over. - /// - private protected (Func[] Tasks, int Length) TakeCleanUpTasks() - { - var tasks = _cleanUpTasks; - var taskLength = _cleanupTasksLength; - - _cleanUpTasks = []; - _cleanupTasksLength = 0; - - return (tasks, taskLength); - } + public IFeatureCollection Features { get; } = new FeatureCollection(); /// public void RegisterForCleanup(Func clean) @@ -60,17 +34,17 @@ public void RegisterForCleanup(Func clean) if (_cleanUpTasks.Length == 0) { - _cleanUpTasks = CleanUpTaskPool.Rent(8); + _cleanUpTasks = s_cleanUpTaskPool.Rent(8); _cleanupTasksLength = 0; } else if (_cleanupTasksLength >= _cleanUpTasks.Length) { - var buffer = CleanUpTaskPool.Rent(_cleanupTasksLength * 2); + var buffer = s_cleanUpTaskPool.Rent(_cleanupTasksLength * 2); var currentBuffer = _cleanUpTasks.AsSpan(); currentBuffer.CopyTo(buffer); currentBuffer.Clear(); - CleanUpTaskPool.Return(_cleanUpTasks); + s_cleanUpTaskPool.Return(_cleanUpTasks); _cleanUpTasks = buffer; } @@ -98,7 +72,7 @@ public async ValueTask DisposeAsync() } tasks.AsSpan(0, _cleanupTasksLength).Clear(); - CleanUpTaskPool.Return(tasks); + s_cleanUpTaskPool.Return(tasks); } _disposed = true; diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs index 6e7a1985f1d..c704855ca06 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs @@ -8,109 +8,97 @@ namespace HotChocolate.Execution; /// public static class CoreExecutionResultExtensions { - /// - /// Registers a cleanup task for execution resources bound to this execution result. - /// - /// - /// The . - /// - /// - /// A cleanup task that will be executed when this result is disposed. - /// - public static void RegisterForCleanup(this IExecutionResult result, Action clean) + extension(IExecutionResult result) { - ArgumentNullException.ThrowIfNull(result); - ArgumentNullException.ThrowIfNull(clean); - - result.RegisterForCleanup(() => + /// + /// Registers a cleanup task for execution resources bound to this execution result. + /// + /// + /// A cleanup task that will be executed when this result is disposed. + /// + public void RegisterForCleanup(Action clean) { - clean(); - return default; - }); - } - - /// - /// Registers a resource that needs to be disposed when the result is being disposed. - /// - /// - /// The . - /// - /// - /// The resource that needs to be disposed. - /// - public static void RegisterForCleanup(this IExecutionResult result, IDisposable disposable) - { - ArgumentNullException.ThrowIfNull(result); - ArgumentNullException.ThrowIfNull(disposable) -; - result.RegisterForCleanup(disposable.Dispose); - } + ArgumentNullException.ThrowIfNull(clean); - /// - /// Registers a resource that needs to be disposed when the result is being disposed. - /// - /// - /// The . - /// - /// - /// The resource that needs to be disposed. - /// - public static void RegisterForCleanup(this IExecutionResult result, IAsyncDisposable disposable) - { - ArgumentNullException.ThrowIfNull(result); - ArgumentNullException.ThrowIfNull(disposable); + result.RegisterForCleanup(() => + { + clean(); + return default; + }); + } - result.RegisterForCleanup(disposable.DisposeAsync); - } + /// + /// Registers a resource that needs to be disposed when the result is being disposed. + /// + /// + /// The resource that needs to be disposed. + /// + public void RegisterForCleanup(IDisposable disposable) + { + ArgumentNullException.ThrowIfNull(disposable); - /// - /// Defines if the specified is a response stream. - /// - /// - /// The . - /// - /// - /// A boolean that specifies if the is a response stream. - /// - public static bool IsStreamResult(this IExecutionResult result) - => result.Kind is BatchResult or DeferredResult or SubscriptionResult; + result.RegisterForCleanup(disposable.Dispose); + } - /// - /// Expects a single GraphQL operation result. - /// - public static IOperationResult ExpectOperationResult(this IExecutionResult result) - { - if (result is IOperationResult qr) + /// + /// Registers a resource that needs to be disposed when the result is being disposed. + /// + /// + /// The resource that needs to be disposed. + /// + public void RegisterForCleanup(IAsyncDisposable disposable) { - return qr; + ArgumentNullException.ThrowIfNull(disposable); + + result.RegisterForCleanup(disposable.DisposeAsync); } - throw new ArgumentException(ExecutionResultExtensions_ExpectOperationResult_NotOperationResult); - } + /// + /// Defines if the specified is a response stream. + /// + /// + /// A boolean that specifies if the is a response stream. + /// + public bool IsStreamResult() + => result.Kind is BatchResult or DeferredResult or SubscriptionResult; - /// - /// Expects a batch of operation results. - /// - public static OperationResultBatch ExpectOperationResultBatch(this IExecutionResult result) - { - if (result is OperationResultBatch qr) + /// + /// Expects a single GraphQL operation result. + /// + public OperationResult ExpectOperationResult() { - return qr; - } + if (result is OperationResult qr) + { + return qr; + } - throw new ArgumentException(ExecutionResultExtensions_ExpectOperationResultBatch_NotOperationResultBatch); - } + throw new ArgumentException(ExecutionResultExtensions_ExpectOperationResult_NotOperationResult); + } - /// - /// Expect a stream result. - /// - public static ResponseStream ExpectResponseStream(this IExecutionResult result) - { - if (result is ResponseStream rs) + /// + /// Expects a batch of operation results. + /// + public OperationResultBatch ExpectOperationResultBatch() { - return rs; + if (result is OperationResultBatch qr) + { + return qr; + } + + throw new ArgumentException(ExecutionResultExtensions_ExpectOperationResultBatch_NotOperationResultBatch); } - throw new ArgumentException(ExecutionResultExtensions_ExpectResponseStream_NotResponseStream); + /// + /// Expect a stream result. + /// + public ResponseStream ExpectResponseStream() + { + if (result is ResponseStream rs) + { + return rs; + } + + throw new ArgumentException(ExecutionResultExtensions_ExpectResponseStream_NotResponseStream); + } } } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Features/IncrementalDataFeature.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Features/IncrementalDataFeature.cs new file mode 100644 index 00000000000..9910ad658ee --- /dev/null +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Features/IncrementalDataFeature.cs @@ -0,0 +1,16 @@ +using System.Collections.Immutable; + +namespace HotChocolate.Execution; + +internal sealed class IncrementalDataFeature +{ + public Path? Path { get; set; } + + public ImmutableList? Pending { get; set; } + + public ImmutableList? Incremental { get; set; } + + public ImmutableList? Completed { get; set; } + + public bool? HasNext { get; set; } +} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResult.cs deleted file mode 100644 index 5404286d00a..00000000000 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResult.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace HotChocolate.Execution; - -/// -/// Represents a GraphQL operation result payload. -/// -public interface IOperationResult : IExecutionResult, IResultDataJsonFormatter -{ - /// - /// Gets the index of the request that corresponds to this result. - /// - int? RequestIndex { get; } - - /// - /// Gets the index of the variable set that corresponds to this result. - /// - int? VariableIndex { get; } - - /// - /// A path to the insertion point that informs the client how to patch a - /// subsequent delta payload into the original payload. - /// - Path? Path { get; } - - /// - /// The data that is being delivered. - /// - object? Data { get; } - - /// - /// Specifies if data was explicitly set. - /// If false the data was not set (including null). - /// - bool IsDataSet { get; } - - /// - /// Gets the GraphQL errors of the result. - /// - IReadOnlyList? Errors { get; } - - /// - /// Gets the additional information that is passed along - /// with the result and will be serialized for transport. - /// - IReadOnlyDictionary? Extensions { get; } - - /// - /// Gets the list of pending incremental delivery operations. - /// Each pending result announces data that will be delivered incrementally in subsequent payloads. - /// - IReadOnlyList? Pending { get; } - - /// - /// Gets the list of incremental results containing data from @defer or @stream directives. - /// Contains the actual data for previously announced pending operations. - /// - IReadOnlyList? Incremental { get; } - - /// - /// Gets the list of completed incremental delivery operations. - /// Each completed result indicates that all data for a pending operation has been delivered. - /// - IReadOnlyList? Completed { get; } - - /// - /// Indicates whether more payloads will follow in the response stream. - /// When true, clients should expect additional incremental data. - /// When false, this is the final payload. - /// - bool HasNext { get; } -} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResultFormatter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResultFormatter.cs index cdf3eab0661..b0c43f1e5cb 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResultFormatter.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationResultFormatter.cs @@ -4,7 +4,7 @@ namespace HotChocolate.Execution; /// -/// Represents a formatter for s. +/// Represents a formatter for s. /// public interface IOperationResultFormatter { @@ -26,7 +26,7 @@ public interface IOperationResultFormatter /// is null. /// ValueTask FormatAsync( - IOperationResult result, + OperationResult result, PipeWriter writer, CancellationToken cancellationToken = default); @@ -45,6 +45,6 @@ ValueTask FormatAsync( /// is null. /// void Format( - IOperationResult result, + OperationResult result, IBufferWriter writer); } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs index 313cdac91ab..d6ea127ba1e 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs @@ -12,11 +12,14 @@ public interface IRawJsonFormatter /// /// Writes the JSON data into the . /// + /// + /// The result that shall be serialized. + /// /// /// The pipe writer of the transport layer. /// /// /// Specifies if the JSON shall be indented. /// - void WriteTo(IBufferWriter writer, bool indented = false); + void WriteTo(OperationResult result, IBufferWriter writer, bool indented = false); } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRequestExecutor.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRequestExecutor.cs index 0ecbd56e3da..581b36a48c7 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRequestExecutor.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRequestExecutor.cs @@ -32,16 +32,16 @@ public interface IRequestExecutor : IFeatureProvider /// Returns the execution result of the given GraphQL . /// /// If the request operation is a simple query or mutation the result is a - /// . + /// . /// /// If the request operation is a query or mutation where data is deferred, streamed or /// includes live data the result is a where each result - /// that the yields is a . + /// that the yields is a . /// /// If the request operation is a subscription the result is a /// where each result that the /// yields is a - /// . + /// . /// Task ExecuteAsync( IOperationRequest request, diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IResponseStream.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IResponseStream.cs index b1977f8dcd2..b40bffdcfc0 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IResponseStream.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IResponseStream.cs @@ -1,7 +1,7 @@ namespace HotChocolate.Execution; /// -/// The response stream represents a stream of that are produced +/// The response stream represents a stream of that are produced /// by the execution engine. /// public interface IResponseStream : IExecutionResult @@ -9,5 +9,5 @@ public interface IResponseStream : IExecutionResult /// /// Reads the result stream. /// - IAsyncEnumerable ReadResultsAsync(); + IAsyncEnumerable ReadResultsAsync(); } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs new file mode 100644 index 00000000000..2d6904a02be --- /dev/null +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs @@ -0,0 +1,314 @@ +using System.Collections.Immutable; + +namespace HotChocolate.Execution; + +/// +/// Represents a GraphQL operation result containing data, errors, extensions, and incremental delivery information. +/// +public sealed class OperationResult : ExecutionResult +{ + private readonly DataFlags _dataFlags; + + /// + /// Initializes a new instance of with structured data and an optional formatter. + /// + /// + /// The operation result data with its formatter and memory management. + /// + /// + /// The GraphQL errors that occurred during execution. + /// + /// + /// Additional information passed along with the result. + /// + /// + /// Thrown when the data structure is invalid or when neither data, errors, nor extensions are provided. + /// + public OperationResult( + OperationResultData data, + ImmutableList? errors = null, + ImmutableDictionary? extensions = null) + { + if (data.Value is not null && data.Formatter is not null) + { + throw new ArgumentException("The result data structure is not supported."); + } + + if (data.IsValueNull && errors is null or { Count: 0 } && extensions is null or { Count: 0 }) + { + throw new ArgumentException("Either data or errors must be provided or extensions must be provided."); + } + + _dataFlags = data.IsValueNull + ? DataFlags.DataIsSet | DataFlags.DataIsNull + : DataFlags.DataIsSet; + Data = data.Value; + Errors = errors; + Extensions = extensions; + + Features.Set(data.Formatter); + + if (data.MemoryHolder is { } memoryHolder) + { + RegisterForCleanup(() => + { + memoryHolder.Dispose(); + return ValueTask.CompletedTask; + }); + } + } + + /// + /// Initializes a new instance of with dictionary-based data. + /// + /// + /// The data dictionary representing the GraphQL response data. + /// + /// + /// The GraphQL errors that occurred during execution. + /// + /// + /// Additional information passed along with the result. + /// + /// + /// Thrown when neither data, errors, nor extensions are provided. + /// + public OperationResult( + IReadOnlyDictionary? data, + ImmutableList? errors = null, + ImmutableDictionary? extensions = null) + { + if (data is null && errors is null or { Count: 0 } && extensions is null or { Count: 0 }) + { + throw new ArgumentException("Either data or errors must be provided or extensions must be provided."); + } + + _dataFlags = data is null + ? DataFlags.DataIsSet | DataFlags.DataIsNull + : DataFlags.DataIsSet; + + Data = data; + Errors = errors; + Extensions = extensions; + } + + /// + /// Initializes a new instance of with only errors. + /// + /// + /// The GraphQL errors that occurred during execution. + /// + /// + /// Additional information passed along with the result. + /// + /// + /// Thrown when is null. + /// + /// + /// Thrown when the errors list is empty. + /// + public OperationResult(ImmutableList errors, ImmutableDictionary? extensions = null) + { + ArgumentNullException.ThrowIfNull(errors); + + if (errors.Count == 0) + { + throw new ArgumentException("At least one error must be provided."); + } + + _dataFlags = DataFlags.DataIsNull; + Errors = errors; + Extensions = extensions; + } + + /// + /// Initializes a new instance of with only extensions. + /// + /// + /// Additional information passed along with the result. + /// + /// + /// Thrown when is null. + /// + /// + /// Thrown when the extensions dictionary is empty. + /// + public OperationResult(ImmutableDictionary extensions) + { + ArgumentNullException.ThrowIfNull(extensions); + + if (extensions.Count == 0) + { + throw new ArgumentException("At least one extension must be provided."); + } + + _dataFlags = DataFlags.DataIsNull; + Extensions = extensions; + } + + /// + /// Gets the kind of execution result. + /// + public override ExecutionResultKind Kind => ExecutionResultKind.SingleResult; + + /// + /// Gets or initializes the index of the request that corresponds to this result. + /// Used in batched operations to correlate results with requests. + /// + public int? RequestIndex { get; init; } + + /// + /// Gets or initializes the index of the variable set that corresponds to this result. + /// Used when executing operations with multiple variable sets. + /// + public int? VariableIndex { get; init; } + + /// + /// Gets or sets the path to the insertion point for incremental delivery. + /// Informs clients how to patch subsequent delta payloads into the original payload. + /// + public Path? Path + { + get => Features.Get()?.Path; + set + { + var feature = Features.Get() ?? new IncrementalDataFeature(); + feature.Path = value; + Features.Set(feature); + } + } + + /// + /// Gets the data that is being delivered in this operation result. + /// + public object? Data { get; } + + /// + /// Gets a value indicating whether data was explicitly set. + /// If false, the data was not set (including null). + /// + public bool IsDataSet => (_dataFlags & DataFlags.DataIsSet) == DataFlags.DataIsSet; + + /// + /// Gets a value indicating whether is null or not set. + /// If true, the data is null or not set. + /// + public bool IsDataNull => (_dataFlags & DataFlags.DataIsNull) == DataFlags.DataIsNull; + + /// + /// Gets the GraphQL errors that occurred during execution. + /// + public ImmutableList? Errors { get; } + + /// + /// Gets or sets additional information passed along with the result. + /// + /// + /// Thrown when setting to null or empty when data and errors are also null or empty. + /// + public ImmutableDictionary? Extensions + { + get; + set + { + if (IsDataNull && Errors is null or { Count: 0 } && Extensions is null or { Count: 0 }) + { + throw new ArgumentException("Either data, errors or extensions must be provided."); + } + + field = value; + } + } + + /// + /// Gets or sets the list of pending incremental delivery operations. + /// Each pending result announces data that will be delivered incrementally in subsequent payloads. + /// + public ImmutableList? Pending + { + get => Features.Get()?.Pending; + set + { + var feature = Features.Get() ?? new IncrementalDataFeature(); + feature.Pending = value; + Features.Set(feature); + } + } + + /// + /// Gets or sets the list of incremental results containing data from @defer or @stream directives. + /// Contains the actual data for previously announced pending operations. + /// + public ImmutableList? Incremental + { + get => Features.Get()?.Incremental; + set + { + var feature = Features.Get() ?? new IncrementalDataFeature(); + feature.Incremental = value; + Features.Set(feature); + } + } + + /// + /// Gets or sets the list of completed incremental delivery operations. + /// Each completed result indicates that all data for a pending operation has been delivered. + /// + public ImmutableList? Completed + { + get => Features.Get()?.Completed; + set + { + var feature = Features.Get() ?? new IncrementalDataFeature(); + feature.Completed = value; + Features.Set(feature); + } + } + + /// + /// Gets or sets a value indicating whether more payloads will follow in the response stream. + /// When true, clients should expect additional incremental data. + /// When false, this is the final payload. + /// + public bool? HasNext + { + get => Features.Get()?.HasNext; + set + { + var feature = Features.Get() ?? new IncrementalDataFeature(); + feature.HasNext = value; + Features.Set(feature); + } + } + + /// + /// Gets the JSON formatter that can serialize this operation result. + /// Used for high-performance custom serialization. + /// + public IRawJsonFormatter? JsonFormatter => Features.Get(); + + /// + /// Creates an operation result containing a single error. + /// + /// The error to include in the result. + /// An operation result containing the specified error. + public static OperationResult FromError(IError error) + => new([error]); + + /// + /// Creates an operation result containing multiple errors. + /// + /// The errors to include in the result. + /// An operation result containing the specified errors. + public static OperationResult FromError(params ImmutableList errors) + => new(errors); + + [Flags] + private enum DataFlags + { + // ReSharper disable once UnusedMember.Local + None = 0, + DataIsNull = 1, + DataIsSet = 2 + } +} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBatch.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBatch.cs index a2d59c69a96..c823b372817 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBatch.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultBatch.cs @@ -1,3 +1,5 @@ +using System.Collections.Immutable; + namespace HotChocolate.Execution; /// @@ -17,13 +19,13 @@ public sealed class OperationResultBatch : ExecutionResult /// /// is null. /// - public OperationResultBatch(IReadOnlyList results) + public OperationResultBatch(ImmutableList results) { ArgumentNullException.ThrowIfNull(results); foreach (var result in results) { - if (result is not IResponseStream and not IOperationResult) + if (result is not IResponseStream and not OperationResult) { throw new ArgumentException( ExecutionAbstractionsResources.OperationResultBatch_ResponseStreamOrOperationResult, @@ -32,7 +34,7 @@ public OperationResultBatch(IReadOnlyList results) } Results = results ?? throw new ArgumentNullException(nameof(results)); - RegisterForCleanup(() => RunCleanUp(results)); + RegisterForCleanup(() => RunCleanUp(Results)); } /// @@ -43,7 +45,7 @@ public OperationResultBatch(IReadOnlyList results) /// /// Gets the results of this batch. /// - public IReadOnlyList Results { get; } + public ImmutableList Results { get; } private static async ValueTask RunCleanUp(IReadOnlyList results) { diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultData.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultData.cs new file mode 100644 index 00000000000..b6a5555512e --- /dev/null +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultData.cs @@ -0,0 +1,58 @@ +namespace HotChocolate.Execution; + +/// +/// Represents the data portion of a GraphQL operation result with its associated formatter and memory management. +/// +public readonly ref struct OperationResultData +{ + /// + /// Initializes a new instance of . + /// + /// + /// The object representing the data property of the GraphQL response. + /// + /// + /// true if the value object represents a null value; otherwise, false. + /// This allows distinguishing between a null data payload and an object that serializes to null. + /// + /// + /// The formatter that can serialize the operation result and its data to JSON. + /// + /// + /// The memory holder that needs to be disposed after the operation result was handled. + /// + /// + /// Thrown when or is null. + /// + public OperationResultData(object value, bool isValueNull, IRawJsonFormatter formatter, IDisposable? memoryHolder) + { + ArgumentNullException.ThrowIfNull(value); + ArgumentNullException.ThrowIfNull(formatter); + + Value = value; + IsValueNull = isValueNull; + Formatter = formatter; + MemoryHolder = memoryHolder; + } + + /// + /// Gets the object representing the `Data` property of the GraphQL response. + /// + public object Value { get; } + + /// + /// Gets a value indicating whether the value object represents a null value. + /// This allows distinguishing between a null data payload and an object that serializes to null. + /// + public bool IsValueNull { get; } + + /// + /// Gets the formatter that can serialize the operation result and its data. + /// + public IRawJsonFormatter Formatter { get; } + + /// + /// Gets the memory holder that needs to be disposed after the operation result was handled. + /// + public IDisposable? MemoryHolder { get; } +} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/RequestExecutorProxy.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/RequestExecutorProxy.cs index 924a028c859..5d6a12b9c09 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/RequestExecutorProxy.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/RequestExecutorProxy.cs @@ -93,16 +93,16 @@ IFeatureCollection IFeatureProvider.Features /// Returns the execution result of the given GraphQL . /// /// If the request operation is a simple query or mutation the result is a - /// . + /// . /// /// If the request operation is a query or mutation where data is deferred, streamed or /// includes live data the result is a where each result - /// that the yields is a . + /// that the yields is a . /// /// If the request operation is a subscription the result is a /// where each result that the /// yields is a - /// . + /// . /// public async Task ExecuteAsync( IOperationRequest request, diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResponseStream.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResponseStream.cs index 48a406bbe35..2af98f1b67f 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResponseStream.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResponseStream.cs @@ -6,11 +6,11 @@ namespace HotChocolate.Execution; public sealed class ResponseStream : ExecutionResult, IResponseStream { - private readonly Func>? _resultStreamFactory; + private readonly Func>? _resultStreamFactory; private bool _isRead; public ResponseStream( - Func>? resultStreamFactory, + Func>? resultStreamFactory, ExecutionResultKind kind = SubscriptionResult) { _resultStreamFactory = resultStreamFactory ?? @@ -26,13 +26,13 @@ public ResponseStream( public override ExecutionResultKind Kind { get; } - public ImmutableList> OnFirstResult + public ImmutableList> OnFirstResult { - get => Features.Get>>() ?? []; + get => Features.Get>>() ?? []; set => Features.Set(value); } - public IAsyncEnumerable ReadResultsAsync() + public IAsyncEnumerable ReadResultsAsync() { if (_resultStreamFactory is null) { @@ -51,11 +51,11 @@ public IAsyncEnumerable ReadResultsAsync() } private class OperationResultStream( - Func> resultStreamFactory, - Func onFirstResult) - : IAsyncEnumerable + Func> resultStreamFactory, + Func onFirstResult) + : IAsyncEnumerable { - public async IAsyncEnumerator GetAsyncEnumerator( + public async IAsyncEnumerator GetAsyncEnumerator( CancellationToken cancellationToken) { var first = true; @@ -74,7 +74,7 @@ public async IAsyncEnumerator GetAsyncEnumerator( } } - private IOperationResult ExecuteOnFirstResult(IOperationResult firstResult) + private OperationResult ExecuteOnFirstResult(OperationResult firstResult) { foreach (var mutator in OnFirstResult) { diff --git a/src/HotChocolate/Core/src/Execution.Pipeline/DocumentParserMiddleware.cs b/src/HotChocolate/Core/src/Execution.Pipeline/DocumentParserMiddleware.cs index eee6268bbaf..6696c954451 100644 --- a/src/HotChocolate/Core/src/Execution.Pipeline/DocumentParserMiddleware.cs +++ b/src/HotChocolate/Core/src/Execution.Pipeline/DocumentParserMiddleware.cs @@ -80,7 +80,7 @@ public async ValueTask InvokeAsync(RequestContext context) .AddLocation(new Location(ex.Line, ex.Column)) .Build()); - context.Result = OperationResultBuilder.CreateError(error); + context.Result = OperationResult.FromError(error); _diagnosticEvents.RequestError(context, ex); } } diff --git a/src/HotChocolate/Core/src/Execution.Pipeline/DocumentValidationMiddleware.cs b/src/HotChocolate/Core/src/Execution.Pipeline/DocumentValidationMiddleware.cs index a497edb86c1..736e8277d0b 100644 --- a/src/HotChocolate/Core/src/Execution.Pipeline/DocumentValidationMiddleware.cs +++ b/src/HotChocolate/Core/src/Execution.Pipeline/DocumentValidationMiddleware.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using HotChocolate.Execution.Instrumentation; using HotChocolate.Validation; using Microsoft.Extensions.DependencyInjection; @@ -50,10 +51,8 @@ public async ValueTask InvokeAsync(RequestContext context) if (result.HasErrors) { // create result context data that indicate that validation has failed. - var resultContextData = new Dictionary - { - { ExecutionContextData.ValidationErrors, true } - }; + var resultContextData = ImmutableDictionary.CreateBuilder(); + resultContextData.Add(ExecutionContextData.ValidationErrors, true); // if one of the validation rules proposed a status code, we will add // it as a proposed status code to the result context data. @@ -64,7 +63,11 @@ public async ValueTask InvokeAsync(RequestContext context) resultContextData.Add(ExecutionContextData.HttpStatusCode, value); } - context.Result = OperationResultBuilder.CreateError(result.Errors, resultContextData); + context.Result = new OperationResult(result.Errors) + { + ContextData = resultContextData.ToImmutable() + }; + _diagnosticEvents.ValidationErrors(context, result.Errors); return; } diff --git a/src/HotChocolate/Core/src/Execution.Pipeline/ErrorHelper.cs b/src/HotChocolate/Core/src/Execution.Pipeline/ErrorHelper.cs index b4188ba9a33..c986e9fa362 100644 --- a/src/HotChocolate/Core/src/Execution.Pipeline/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Execution.Pipeline/ErrorHelper.cs @@ -16,8 +16,8 @@ public static IError OperationCanceled(Exception ex) public static NotSupportedException QueryTypeNotSupported() => new(ExecutionPipelineResources.ThrowHelper_QueryTypeNotSupported_Message); - public static IOperationResult StateInvalidForDocumentValidation() - => OperationResultBuilder.CreateError( + public static OperationResult StateInvalidForDocumentValidation() + => OperationResult.FromError( ErrorBuilder.New() .SetMessage(ExecutionPipelineResources.ErrorHelper_StateInvalidForDocumentValidation_Message) .SetCode(ErrorCodes.Execution.OperationDocumentNotFound) diff --git a/src/HotChocolate/Core/src/Execution.Pipeline/ExceptionMiddleware.cs b/src/HotChocolate/Core/src/Execution.Pipeline/ExceptionMiddleware.cs index 6c116f92fd5..93ca9418ca0 100644 --- a/src/HotChocolate/Core/src/Execution.Pipeline/ExceptionMiddleware.cs +++ b/src/HotChocolate/Core/src/Execution.Pipeline/ExceptionMiddleware.cs @@ -32,19 +32,19 @@ public async ValueTask InvokeAsync(RequestContext context) catch (OperationCanceledException ex) { var error = _errorHandler.Handle(ErrorHelper.OperationCanceled(ex)); - context.Result = OperationResultBuilder.CreateError(error); + context.Result = OperationResult.FromError(error); _diagnosticEvents.RequestError(context, ex); } catch (GraphQLException ex) { var errors = _errorHandler.Handle(ex.Errors); - context.Result = OperationResultBuilder.CreateError(errors); + context.Result = OperationResult.FromError([..errors]); _diagnosticEvents.RequestError(context, ex); } catch (Exception ex) { var error = _errorHandler.Handle(ErrorBuilder.FromException(ex).Build()); - context.Result = OperationResultBuilder.CreateError(error); + context.Result = OperationResult.FromError(error); _diagnosticEvents.RequestError(context, ex); } } diff --git a/src/HotChocolate/Core/src/Validation/DocumentValidatorResult.cs b/src/HotChocolate/Core/src/Validation/DocumentValidatorResult.cs index 5f1ce368ce8..b70b98b89e7 100644 --- a/src/HotChocolate/Core/src/Validation/DocumentValidatorResult.cs +++ b/src/HotChocolate/Core/src/Validation/DocumentValidatorResult.cs @@ -1,3 +1,5 @@ +using System.Collections.Immutable; + namespace HotChocolate.Validation; public class DocumentValidatorResult @@ -18,7 +20,7 @@ public DocumentValidatorResult(IEnumerable errors) public bool HasErrors { get; } - public IReadOnlyList Errors { get; } + public ImmutableList Errors { get; } public static DocumentValidatorResult OK { get; } = new(); } diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/FusionTestBase.MatchSnapshot.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/FusionTestBase.MatchSnapshot.cs index 7ef9ea1992e..c4ac83b5bc7 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/FusionTestBase.MatchSnapshot.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/FusionTestBase.MatchSnapshot.cs @@ -27,7 +27,7 @@ protected async Task MatchSnapshotAsync( { var snapshot = new Snapshot(postFix, ".yaml"); - var results = new List(); + var results = new List(); // We first wait and capture all possible gateway responses. await foreach (var result in response.ReadAsResultStreamAsync()) @@ -78,7 +78,7 @@ protected async Task MatchSnapshotAsync( private static async Task TryWriteOperationPlanAsync( CodeWriter writer, Gateway gateway, - List results) + List results) { foreach (var result in results) { @@ -121,7 +121,7 @@ private static async Task TryWriteOperationPlanAsync( } } - private void WriteResults(CodeWriter writer, List results) + private void WriteResults(CodeWriter writer, List results) { if (results is [{ } singleResult]) { @@ -154,7 +154,7 @@ private void WriteResults(CodeWriter writer, List results) } } - private static void WriteResult(CodeWriter writer, OperationResult result) + private static void WriteResult(CodeWriter writer, HotChocolate.Execution.OperationResult result) { var memoryStream = new MemoryStream(); using var jsonWriter = new Utf8JsonWriter(memoryStream, new JsonWriterOptions { Indented = true }); diff --git a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/AutomaticPersistedOperationNotFoundMiddleware.cs b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/AutomaticPersistedOperationNotFoundMiddleware.cs index b8451fa312f..d28c4038871 100644 --- a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/AutomaticPersistedOperationNotFoundMiddleware.cs +++ b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/AutomaticPersistedOperationNotFoundMiddleware.cs @@ -1,31 +1,23 @@ -using HotChocolate.Execution.Instrumentation; -using Microsoft.Extensions.DependencyInjection; +using System.Collections.Immutable; namespace HotChocolate.Execution.Pipeline; internal sealed class AutomaticPersistedOperationNotFoundMiddleware { - private static readonly IOperationResult s_errorResult = - OperationResultBuilder.CreateError( - PersistedOperationNotFound(), - contextData: new Dictionary - { - { ExecutionContextData.HttpStatusCode, 400 } - }); + private static readonly OperationResult s_errorResult = + new([PersistedOperationNotFound()]) + { + ContextData = ImmutableDictionary.Empty.Add(ExecutionContextData.HttpStatusCode, 400) + }; + private readonly RequestDelegate _next; -#pragma warning disable IDE0052 // WIP - private readonly ICoreExecutionDiagnosticEvents _diagnosticEvents; -#pragma warning restore IDE0052 private AutomaticPersistedOperationNotFoundMiddleware( - RequestDelegate next, - ICoreExecutionDiagnosticEvents diagnosticEvents) + RequestDelegate next) { ArgumentNullException.ThrowIfNull(next); - ArgumentNullException.ThrowIfNull(diagnosticEvents); _next = next; - _diagnosticEvents = diagnosticEvents; } public ValueTask InvokeAsync(RequestContext context) @@ -50,10 +42,9 @@ public static IError PersistedOperationNotFound() public static RequestMiddlewareConfiguration Create() => new RequestMiddlewareConfiguration( - static (factoryContext, next) => + static (_, next) => { - var diagnosticEvents = factoryContext.SchemaServices.GetRequiredService(); - var middleware = new AutomaticPersistedOperationNotFoundMiddleware(next, diagnosticEvents); + var middleware = new AutomaticPersistedOperationNotFoundMiddleware(next); return context => middleware.InvokeAsync(context); }, WellKnownRequestMiddleware.AutomaticPersistedOperationNotFoundMiddleware); diff --git a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/OnlyPersistedOperationsAllowedMiddleware.cs b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/OnlyPersistedOperationsAllowedMiddleware.cs index 195c54186a3..65dcb3c53de 100644 --- a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/OnlyPersistedOperationsAllowedMiddleware.cs +++ b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/OnlyPersistedOperationsAllowedMiddleware.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using HotChocolate.Execution.Instrumentation; using HotChocolate.PersistedOperations; using Microsoft.Extensions.DependencyInjection; @@ -9,8 +10,7 @@ internal sealed class OnlyPersistedOperationsAllowedMiddleware private readonly RequestDelegate _next; private readonly ICoreExecutionDiagnosticEvents _diagnosticEvents; private readonly PersistedOperationOptions _options; - private readonly IOperationResult _errorResult; - private readonly Dictionary _statusCode = new() { { ExecutionContextData.HttpStatusCode, 400 } }; + private readonly OperationResult _errorResult; private OnlyPersistedOperationsAllowedMiddleware( RequestDelegate next, @@ -26,7 +26,10 @@ private OnlyPersistedOperationsAllowedMiddleware( // prepare options. _options = options; - _errorResult = OperationResultBuilder.CreateError(options.OperationNotAllowedError, _statusCode); + _errorResult = new OperationResult([options.OperationNotAllowedError]) + { + ContextData = ImmutableDictionary.Empty.Add(ExecutionContextData.HttpStatusCode, 400) + }; } public ValueTask InvokeAsync(RequestContext context) diff --git a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/PersistedOperationNotFoundMiddleware.cs b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/PersistedOperationNotFoundMiddleware.cs index 3a5c22418bd..e43fd2d9c2f 100644 --- a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/PersistedOperationNotFoundMiddleware.cs +++ b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/PersistedOperationNotFoundMiddleware.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using HotChocolate.Execution.Instrumentation; using HotChocolate.Language; using Microsoft.Extensions.DependencyInjection; @@ -6,9 +7,10 @@ namespace HotChocolate.Execution.Pipeline; internal sealed class PersistedOperationNotFoundMiddleware { + private static readonly ImmutableDictionary s_statusCode = + ImmutableDictionary.Empty.Add(ExecutionContextData.HttpStatusCode, 400); private readonly RequestDelegate _next; private readonly ICoreExecutionDiagnosticEvents _diagnosticEvents; - private readonly Dictionary _statusCode = new() { { ExecutionContextData.HttpStatusCode, 400 } }; private PersistedOperationNotFoundMiddleware( RequestDelegate next, @@ -41,7 +43,7 @@ context.OperationDocumentInfo.Document is not null // must be present, otherwise the request would not have been routed to this middleware. _diagnosticEvents.DocumentNotFoundInStorage(context, context.Request.DocumentId); var error = PersistedOperationNotFound(context.Request.DocumentId); - context.Result = OperationResultBuilder.CreateError(error, _statusCode); + context.Result = new OperationResult([error]) { ContextData = s_statusCode }; return default; } diff --git a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs index 2e279d0f78c..0188ef4d7a8 100644 --- a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs +++ b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using HotChocolate.Language; using HotChocolate.PersistedOperations; @@ -40,13 +41,13 @@ public async ValueTask InvokeAsync(RequestContext context) && documentInfo.IsValidated && documentInfo.Document is not null && !documentInfo.Id.IsEmpty - && context.Result is IOperationResult result + && context.Result is OperationResult result && context.Request.Document is { } document && context.Request.Extensions is not null && context.Request.Extensions.TryGetValue(PersistedQuery, out var s) && s is IReadOnlyDictionary settings) { - var resultBuilder = OperationResultBuilder.FromResult(result); + var extensions = result.Extensions ?? ImmutableDictionary.Empty; // hash is found and matches the query key -> store the query if (DoHashesMatch(settings, documentInfo.Id, _hashProvider.Name, out var userHash)) @@ -55,7 +56,7 @@ public async ValueTask InvokeAsync(RequestContext context) await _operationDocumentStorage.SaveAsync(documentInfo.Id, document).ConfigureAwait(false); // add persistence receipt to the result - resultBuilder.SetExtension( + extensions = extensions.SetItem( PersistedQuery, new Dictionary { @@ -67,7 +68,7 @@ public async ValueTask InvokeAsync(RequestContext context) } else { - resultBuilder.SetExtension( + extensions = extensions.SetItem( PersistedQuery, new Dictionary { @@ -79,7 +80,7 @@ public async ValueTask InvokeAsync(RequestContext context) }); } - context.Result = resultBuilder.Build(); + result.Extensions = extensions; } } From 36ac559e6ceb4d57d378506b79f515f76b5a9cf1 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 16 Dec 2025 14:46:54 +0100 Subject: [PATCH 035/144] wip --- .../Extensions/CommonTestExtensions.cs | 6 +- .../Handlers/CallToolHandler.cs | 2 +- .../Execution/DynamicEndpointMiddleware.cs | 18 +- .../Execution/IOpenApiResultFormatter.cs | 2 +- .../FusionOpenApiResultFormatter.cs | 7 +- .../HttpPostMiddlewareBase.cs | 2 +- .../ServerDiagnosticEventListener.cs | 2 +- .../DefaultSocketSessionInterceptor.cs | 4 +- .../Interceptors/ISocketSessionInterceptor.cs | 2 +- .../Subscriptions/OperationSession.cs | 4 +- .../ApolloSubscriptionProtocolHandler.cs | 2 +- .../GraphQLOverWebSocketProtocolHandler.cs | 2 +- .../Protocols/IProtocolHandler.cs | 2 +- .../Utilities/HeaderUtilities.cs | 2 +- .../Utilities/MiddlewareHelper.cs | 8 +- .../src/Caching/QueryCacheMiddleware.cs | 13 +- .../Pipeline/AuthorizeRequestMiddleware.cs | 11 +- .../Types/Execution/DefaultRequestExecutor.cs | 15 +- ...equestExecutorServiceProviderExtensions.cs | 36 ++-- .../Core/src/Types/Execution/ErrorHelper.cs | 67 +++---- .../Extensions/ExecutionResultExtensions.cs | 4 +- .../Extensions/OperationContextExtensions.cs | 52 ++++-- .../src/Types/Execution/NeedsFormatting.cs | 3 + .../Pipeline/OperationExecutionMiddleware.cs | 19 +- .../Processing/MiddlewareContext.Global.cs | 28 +-- .../Processing/MiddlewareContext.State.cs | 2 +- .../Processing/OperationContext.Execution.cs | 2 +- .../OperationContext.IExecutionTaskContext.cs | 5 +- .../Processing/OperationContext.Pooling.cs | 19 +- .../Processing/OperationContextOwner.cs | 2 + .../Processing/OperationResultBuilder.cs | 170 ++++++++++++++++++ .../Execution/Processing/QueryExecutor.cs | 14 +- .../SubscriptionExecutor.Subscription.cs | 40 ++--- .../Processing/SubscriptionExecutor.cs | 14 +- .../Tasks/ResolverTask.CompleteValue.cs | 2 +- .../Processing/Tasks/ResolverTaskFactory.cs | 2 +- .../Processing/ValueCompletion.Leaf.cs | 4 +- .../Processing/ValueCompletion.List.cs | 2 +- .../Processing/ValueCompletion.Object.cs | 6 +- .../Execution/Processing/ValueCompletion.cs | 2 +- .../Processing/WorkScheduler.Pooling.cs | 3 + .../Core/src/Types/HotChocolate.Types.csproj | 104 +++++++++++ .../Types/Text/Json/ResultDocument.DbRow.cs | 3 +- .../Types/Text/Json/ResultDocument.WriteTo.cs | 18 +- .../src/Types/Text/Json/ResultDocument.cs | 11 +- .../Core/src/Types/Text/Json/ResultElement.cs | 16 +- .../Fusion.Execution/Execution/ErrorHelper.cs | 12 +- .../Execution/FusionRequestExecutor.cs | 14 +- .../Execution/OperationPlanContext.cs | 11 +- .../Execution/OperationPlanExecutor.cs | 4 +- .../Pipeline/OperationExecutionMiddleware.cs | 5 +- .../OperationVariableCoercionMiddleware.cs | 4 +- .../Execution/Results/RawOperationResult.cs | 60 ------- .../Json/CompositeResultDocument.WriteTo.cs | 2 +- .../Text/Json/CompositeResultElement.cs | 2 +- 55 files changed, 545 insertions(+), 323 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs delete mode 100644 src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/RawOperationResult.cs diff --git a/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/CommonTestExtensions.cs b/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/CommonTestExtensions.cs index b5686f4c0c5..26fb999cda1 100644 --- a/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/CommonTestExtensions.cs +++ b/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/CommonTestExtensions.cs @@ -15,11 +15,7 @@ public static ValueTask CreateExceptionExecutor( await next(context); if (context.ContextData.TryGetValue("ex", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("ex", queryString) - .Build(); + context.Result!.ContextData = context.Result.ContextData.SetItem("ex", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs b/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs index f9df5cfab4c..2b61924e662 100644 --- a/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs +++ b/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs @@ -59,7 +59,7 @@ public static async ValueTask HandleAsync( .SetVariableValues(variableValues) .Build(); var result = await requestExecutor.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); - var operationResult = (IOperationResult)result; + var operationResult = result.ExpectOperationResult(); using var writer = new PooledArrayWriter(); diff --git a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs index 3d9a11ba6b5..226e8265a9d 100644 --- a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs +++ b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs @@ -1,12 +1,12 @@ using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.DependencyInjection; using HotChocolate.AspNetCore; using HotChocolate.Buffers; using HotChocolate.Execution; using HotChocolate.Language; using HotChocolate.Types; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Adapters.OpenApi; @@ -62,22 +62,22 @@ await Results.Problem( requestBuilder.Build(), cancellationToken).ConfigureAwait(false); - // If the request was cancelled, we do not attempt to write a response. + // If the request was canceled, we do not attempt to write a response. if (cancellationToken.IsCancellationRequested) { return; } - // If we do not have an operation result, something went wrong and we return HTTP 500. - if (executionResult is not IOperationResult operationResult) + // If we do not have an operation result, something went wrong, and we return HTTP 500. + if (executionResult is not OperationResult operationResult) { await Results.InternalServerError().ExecuteAsync(context); return; } // If the request had validation errors or execution didn't start, we return HTTP 400. - if (operationResult.ContextData?.ContainsKey(ExecutionContextData.ValidationErrors) == true - || operationResult is OperationResult { IsDataSet: false }) + if (operationResult.ContextData.ContainsKey(ExecutionContextData.ValidationErrors) + || operationResult is { IsDataSet: false }) { var firstErrorMessage = operationResult.Errors?.FirstOrDefault()?.Message; @@ -279,7 +279,7 @@ private static bool TryGetValueForParameter( IQueryCollection query, [NotNullWhen(true)] out IValueNode? parameterValue) { - parameterValue = default; + parameterValue = null; if (leaf.ParameterType is OpenApiEndpointParameterType.Route) { diff --git a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/IOpenApiResultFormatter.cs b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/IOpenApiResultFormatter.cs index 2d3ab506c34..b96ceb58ea3 100644 --- a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/IOpenApiResultFormatter.cs +++ b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/IOpenApiResultFormatter.cs @@ -6,7 +6,7 @@ namespace HotChocolate.Adapters.OpenApi; internal interface IOpenApiResultFormatter { Task FormatResultAsync( - IOperationResult operationResult, + OperationResult operationResult, HttpContext httpContext, OpenApiEndpointDescriptor endpoint, CancellationToken cancellationToken); diff --git a/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs b/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs index 154e4516082..49613679281 100644 --- a/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs +++ b/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs @@ -1,5 +1,6 @@ using HotChocolate.Execution; using HotChocolate.Fusion.Execution.Results; +using HotChocolate.Fusion.Text.Json; using Microsoft.AspNetCore.Http; namespace HotChocolate.Adapters.OpenApi; @@ -7,18 +8,18 @@ namespace HotChocolate.Adapters.OpenApi; internal sealed class FusionOpenApiResultFormatter : IOpenApiResultFormatter { public async Task FormatResultAsync( - IOperationResult operationResult, + OperationResult operationResult, HttpContext httpContext, OpenApiEndpointDescriptor endpoint, CancellationToken cancellationToken) { - if (operationResult is not RawOperationResult rawOperationResult) + if (operationResult.Data is not CompositeResultDocument resultDocument) { await Results.InternalServerError().ExecuteAsync(httpContext); return; } - if (!rawOperationResult.Result.Data.TryGetProperty(endpoint.ResponseNameToExtract, out var rootProperty)) + if (!resultDocument.Data.TryGetProperty(endpoint.ResponseNameToExtract, out var rootProperty)) { await Results.InternalServerError().ExecuteAsync(httpContext); return; diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs index 655d7fe06be..da3e85f30e3 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs @@ -221,7 +221,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses // to the HTTP response stream. Debug.Assert(result is not null, "No GraphQL result was created."); - if (result is IOperationResult operationResult) + if (result is OperationResult operationResult) { formatScope = session.DiagnosticEvents.FormatHttpResponse(context, operationResult); } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/ServerDiagnosticEventListener.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/ServerDiagnosticEventListener.cs index c4b43872714..ee6e9db0de0 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/ServerDiagnosticEventListener.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Instrumentation/ServerDiagnosticEventListener.cs @@ -57,7 +57,7 @@ public virtual void ParserErrors(HttpContext context, IReadOnlyList erro } /// - public virtual IDisposable FormatHttpResponse(HttpContext context, IOperationResult result) + public virtual IDisposable FormatHttpResponse(HttpContext context, OperationResult result) => EmptyScope; /// diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/DefaultSocketSessionInterceptor.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/DefaultSocketSessionInterceptor.cs index af437c15c50..d1119ba8d37 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/DefaultSocketSessionInterceptor.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/DefaultSocketSessionInterceptor.cs @@ -43,10 +43,10 @@ public virtual ValueTask OnRequestAsync( return default; } - public virtual ValueTask OnResultAsync( + public virtual ValueTask OnResultAsync( ISocketSession session, string operationSessionId, - IOperationResult result, + OperationResult result, CancellationToken cancellationToken = default) => new(result); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/ISocketSessionInterceptor.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/ISocketSessionInterceptor.cs index 4333b22b3ca..7b38b5479c6 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/ISocketSessionInterceptor.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Interceptors/ISocketSessionInterceptor.cs @@ -80,7 +80,7 @@ ValueTask OnResultAsync( /// This interception method is guaranteed to be invoked even if the operation /// fails or the connection is closed. /// - /// The cancellation token might be cancelled if the connection is closed. + /// The cancellation token might be canceled if the connection is closed. /// /// /// The socket session. diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs index 89db615bdbb..68959a8cdae 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs @@ -47,7 +47,7 @@ private async Task SendResultsAsync(GraphQLRequest request, CancellationToken ca switch (result) { - case IOperationResult queryResult: + case OperationResult queryResult: if (queryResult.Data is null && queryResult.Errors is { Count: > 0 }) { await _session.Protocol.SendErrorMessageAsync( @@ -163,7 +163,7 @@ private static OperationRequestBuilder CreateRequestBuilder(GraphQLRequest reque return requestBuilder; } - private async Task SendResultMessageAsync(IOperationResult result, CancellationToken ct) + private async Task SendResultMessageAsync(OperationResult result, CancellationToken ct) { result = await _interceptor.OnResultAsync(_session, Id, result, ct); await _session.Protocol.SendResultMessageAsync(_session, Id, result, ct); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs index 724d89d0529..0bc372971bf 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs @@ -236,7 +236,7 @@ public ValueTask SendKeepAliveMessageAsync( public async ValueTask SendResultMessageAsync( ISocketSession session, string operationSessionId, - IOperationResult result, + OperationResult result, CancellationToken cancellationToken) { using var arrayWriter = new PooledArrayWriter(); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs index 17e9c3dc178..7d6b537ccf6 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs @@ -209,7 +209,7 @@ public ValueTask SendKeepAliveMessageAsync( public async ValueTask SendResultMessageAsync( ISocketSession session, string operationSessionId, - IOperationResult result, + OperationResult result, CancellationToken cancellationToken) { using var arrayWriter = new PooledArrayWriter(); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/IProtocolHandler.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/IProtocolHandler.cs index d9548e9b490..9c5b77435f8 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/IProtocolHandler.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/IProtocolHandler.cs @@ -62,7 +62,7 @@ ValueTask SendKeepAliveMessageAsync( ValueTask SendResultMessageAsync( ISocketSession session, string operationSessionId, - IOperationResult result, + OperationResult result, CancellationToken cancellationToken = default); /// diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/HeaderUtilities.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/HeaderUtilities.cs index b49666beb19..9725273c505 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/HeaderUtilities.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/HeaderUtilities.cs @@ -165,7 +165,7 @@ public AcceptHeaderResult(string headerValue) public AcceptMediaType[] AcceptMediaTypes { get; } - public IOperationResult? ErrorResult { get; } + public OperationResult? ErrorResult { get; } [MemberNotNullWhen(true, nameof(ErrorResult))] public bool HasError { get; } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs index d894b5a34fd..6d432782c7a 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs @@ -264,7 +264,7 @@ public static async Task WriteResultAsync( // to the HTTP response stream. Debug.Assert(result is not null, "No GraphQL result was created."); - if (result is IOperationResult queryResult) + if (result is OperationResult queryResult) { formatScope = executorSession.DiagnosticEvents.FormatHttpResponse(context, queryResult); } @@ -297,7 +297,7 @@ public ValidateAcceptContentTypeResult( } public ValidateAcceptContentTypeResult( - IOperationResult errorResult, + OperationResult errorResult, HttpStatusCode statusCode) { IsValid = false; @@ -323,7 +323,7 @@ public ValidateAcceptContentTypeResult( [MemberNotNullWhen(false, nameof(StatusCode))] public bool IsValid { get; } - public IOperationResult? Error { get; } + public OperationResult? Error { get; } public HttpStatusCode? StatusCode { get; } @@ -365,7 +365,7 @@ public ParseRequestResult(IError error, HttpStatusCode statusCode) public GraphQLRequest? Request { get; } - public IOperationResult? Error { get; } + public OperationResult? Error { get; } public HttpStatusCode? StatusCode { get; } } diff --git a/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs b/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs index 889d3476e28..2953f9e26f1 100644 --- a/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs +++ b/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs @@ -39,21 +39,16 @@ public async ValueTask InvokeAsync(RequestContext context) // only single operation results can be cached. var operationResult = context.Result?.ExpectOperationResult(); - if (operationResult is { Errors: null }) + if (operationResult is { Errors: null, ContextData: { } contextData }) { - var contextData = - operationResult.ContextData is not null - ? new ExtensionData(operationResult.ContextData) - : []; - - contextData.Add(ExecutionContextData.CacheControlHeaderValue, headerValue); + contextData = contextData.Add(ExecutionContextData.CacheControlHeaderValue, headerValue); if (constraints.Vary.Length > 0) { - contextData.Add(ExecutionContextData.VaryHeaderValue, constraints.Vary); + contextData =contextData.Add(ExecutionContextData.VaryHeaderValue, constraints.Vary); } - context.Result = operationResult.WithContextData(contextData); + operationResult.ContextData = contextData; } } diff --git a/src/HotChocolate/Core/src/Authorization/Pipeline/AuthorizeRequestMiddleware.cs b/src/HotChocolate/Core/src/Authorization/Pipeline/AuthorizeRequestMiddleware.cs index 78b0ef09fe5..c17c494a8c3 100644 --- a/src/HotChocolate/Core/src/Authorization/Pipeline/AuthorizeRequestMiddleware.cs +++ b/src/HotChocolate/Core/src/Authorization/Pipeline/AuthorizeRequestMiddleware.cs @@ -45,11 +45,12 @@ public async ValueTask InvokeAsync(RequestContext context) await next(context); } - private static IOperationResult CreateErrorResult(AuthorizeResult result) - => OperationResultBuilder.New() - .AddError(CreateError(result)) - .SetContextData(ExecutionContextData.HttpStatusCode, 401) - .Build(); + private static OperationResult CreateErrorResult(AuthorizeResult authorizeResult) + { + var result = OperationResult.FromError(CreateError(authorizeResult)); + result.ContextData = result.ContextData.Add(ExecutionContextData.HttpStatusCode, 401); + return result; + } private static IError CreateError(AuthorizeResult result) { diff --git a/src/HotChocolate/Core/src/Types/Execution/DefaultRequestExecutor.cs b/src/HotChocolate/Core/src/Types/Execution/DefaultRequestExecutor.cs index b786d8a9579..25757de7d35 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DefaultRequestExecutor.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DefaultRequestExecutor.cs @@ -1,7 +1,6 @@ using System.Runtime.CompilerServices; using HotChocolate.Features; using HotChocolate.Fetching; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.ObjectPool; namespace HotChocolate.Execution; @@ -183,7 +182,7 @@ private async Task ExecuteAsync( /// /// Executes a batch of GraphQL operation requests and returns an /// that yields each individual - /// as it becomes available. + /// as it becomes available. /// /// /// The batch of operation requests. @@ -203,7 +202,7 @@ public Task ExecuteBatchAsync( ExecutionResultKind.BatchResult)); } - private async IAsyncEnumerable CreateResponseStream( + private async IAsyncEnumerable CreateResponseStream( OperationRequestBatch requestBatch, [EnumeratorCancellation] CancellationToken ct = default) { @@ -241,7 +240,7 @@ private async IAsyncEnumerable CreateResponseStream( } } - private async IAsyncEnumerable ExecuteBatchStream( + private async IAsyncEnumerable ExecuteBatchStream( OperationRequestBatch requestBatch, IServiceProvider services, [EnumeratorCancellation] CancellationToken ct = default) @@ -250,14 +249,14 @@ private async IAsyncEnumerable ExecuteBatchStream( var requestCount = requests.Count; var tasks = Interlocked.Exchange(ref _taskList, null) ?? new List(requestCount); - var completed = new List(); + var completed = new List(); for (var i = 0; i < requestCount; i++) { tasks.Add(ExecuteBatchItemAsync(WithServices(requests[i], services), i, completed, ct)); } - var buffer = new IOperationResult[Math.Min(16, requestCount)]; + var buffer = new OperationResult[Math.Min(16, requestCount)]; while (tasks.Count > 0 || completed.Count > 0) { @@ -314,7 +313,7 @@ private static IOperationRequest WithServices( private async Task ExecuteBatchItemAsync( IOperationRequest request, int requestIndex, - List completed, + List completed, CancellationToken cancellationToken) { var result = await ExecuteAsync(request, false, requestIndex, cancellationToken).ConfigureAwait(false); @@ -323,7 +322,7 @@ private async Task ExecuteBatchItemAsync( private static async Task UnwrapBatchItemResultAsync( IExecutionResult result, - List completed, + List completed, CancellationToken cancellationToken) { switch (result) diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceProviderExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceProviderExtensions.cs index 686acf72861..6501a64d3be 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceProviderExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorServiceProviderExtensions.cs @@ -1,6 +1,5 @@ using System.Diagnostics.CodeAnalysis; using HotChocolate.Execution.Configuration; -using Microsoft.Extensions.DependencyInjection; // ReSharper disable once CheckNamespace namespace HotChocolate.Execution; @@ -132,19 +131,24 @@ public static ValueTask BuildRequestExecutorAsync( /// The cancellation token. /// /// + /// /// Returns the execution result of the given GraphQL . - /// + /// + /// /// If the request operation is a simple query or mutation the result is a - /// . - /// + /// . + /// + /// /// If the request operation is a query or mutation where data is deferred, streamed or /// includes live data the result is a where each result - /// that the yields is a . - /// + /// that the yields is a . + /// + /// /// If the request operation is a subscription the result is a /// where each result that the /// yields is a - /// . + /// . + /// /// public static async Task ExecuteRequestAsync( this IServiceProvider services, @@ -180,16 +184,16 @@ await GetRequestExecutorAsync(services, schemaName, cancellationToken) /// Returns the execution result of the given GraphQL . /// /// If the request operation is a simple query or mutation the result is a - /// . + /// . /// /// If the request operation is a query or mutation where data is deferred, streamed or /// includes live data the result is a where each result - /// that the yields is a . + /// that the yields is a . /// /// If the request operation is a subscription the result is a /// where each result that the /// yields is a - /// . + /// . /// public static async Task ExecuteRequestAsync( this IRequestExecutorBuilder builder, @@ -225,17 +229,17 @@ await BuildRequestExecutorAsync(builder, schemaName, cancellationToken) /// Returns the execution result of the given GraphQL . /// /// If the request operation is a simple query or mutation the result is a - /// . + /// . /// /// If the request operation is a query or mutation where data is deferred, streamed or /// includes live data the result is a where each result /// that the yields is a - /// . + /// . /// /// If the request operation is a subscription the result is a /// where each result that the /// yields is a - /// . + /// . /// public static async Task ExecuteRequestAsync( this IServiceProvider services, @@ -271,19 +275,19 @@ await GetRequestExecutorAsync(services, schemaName, cancellationToken) /// Returns the execution result of the given GraphQL . /// /// If the request operation is a simple query or mutation the result is a - /// . + /// . /// /// /// If the request operation is a query or mutation where data is deferred, streamed or /// includes live data the result is a where each result /// that the yields is a - /// . + /// . /// /// /// If the request operation is a subscription the result is a /// where each result that the /// yields is a - /// . + /// . /// /// public static async Task ExecuteRequestAsync( diff --git a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs index 2507ff251a6..03ffb49c778 100644 --- a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs @@ -108,30 +108,30 @@ public static IError UnexpectedValueCompletionError( .Build(); } - public static IOperationResult RootTypeNotFound(OperationType operationType) => - OperationResultBuilder.CreateError( + public static OperationResult RootTypeNotFound(OperationType operationType) + { + var result = OperationResult.FromError( ErrorBuilder.New() .SetMessage(ErrorHelper_RootTypeNotFound_Message, operationType) - .Build(), - new Dictionary - { - { ExecutionContextData.HttpStatusCode, HttpStatusCode.BadRequest } - }); + .Build()); + result.ContextData = result.ContextData.Add(ExecutionContextData.HttpStatusCode, HttpStatusCode.BadRequest); + return result; + } - public static IOperationResult StateInvalidForOperationResolver() => - OperationResultBuilder.CreateError( + public static OperationResult StateInvalidForOperationResolver() + => OperationResult.FromError( ErrorBuilder.New() .SetMessage(ErrorHelper_StateInvalidForOperationResolver_Message) .Build()); - public static IOperationResult StateInvalidForOperationVariableCoercion() => - OperationResultBuilder.CreateError( + public static OperationResult StateInvalidForOperationVariableCoercion() + => OperationResult.FromError( ErrorBuilder.New() .SetMessage(ErrorHelper_StateInvalidForOperationVariableCoercion_Message) .Build()); - public static IOperationResult StateInvalidForOperationExecution() => - OperationResultBuilder.CreateError( + public static OperationResult StateInvalidForOperationExecution() + => OperationResult.FromError( ErrorBuilder.New() .SetMessage(ErrorHelper_StateInvalidForOperationExecution_Message) .Build()); @@ -139,8 +139,8 @@ public static IOperationResult StateInvalidForOperationExecution() => public static IError ValueCompletion_CouldNotResolveAbstractType( Selection selection, Path path, - object result) => - ErrorBuilder.New() + object result) + => ErrorBuilder.New() .SetMessage( ErrorHelper_ValueCompletion_CouldNotResolveAbstractType_Message, result.GetType().FullName ?? result.GetType().Name, @@ -149,34 +149,39 @@ public static IError ValueCompletion_CouldNotResolveAbstractType( .AddLocations(selection) .Build(); - public static IOperationResult OperationKindNotAllowed() => - OperationResultBuilder.CreateError( + public static OperationResult OperationKindNotAllowed() + { + var result = OperationResult.FromError( ErrorBuilder.New() .SetMessage("The specified operation kind is not allowed.") - .Build(), - new Dictionary - { - { ExecutionContextData.OperationNotAllowed, null } - }); + .Build()); - public static IOperationResult RequestTypeNotAllowed() => - OperationResultBuilder.CreateError( + result.ContextData = result.ContextData.Add(ExecutionContextData.OperationNotAllowed, null); + + return result; + } + + public static OperationResult RequestTypeNotAllowed() + { + var result = OperationResult.FromError( ErrorBuilder.New() .SetMessage("Variable batch requests are only allowed for mutations and subscriptions.") - .Build(), - new Dictionary - { - { ExecutionContextData.ValidationErrors, null } - }); + .Build()); + + result.ContextData = result.ContextData.Add(ExecutionContextData.ValidationErrors, null); + + return result; + } - public static IOperationResult RequestTimeout(TimeSpan timeout) => - OperationResultBuilder.CreateError( + public static OperationResult RequestTimeout(TimeSpan timeout) + => OperationResult.FromError( new Error { Message = string.Format(ErrorHelper_RequestTimeout, timeout), Extensions = ImmutableDictionary.Empty.Add("code", ErrorCodes.Execution.Timeout) }); + // TODO : Remove? public static IError NonNullOutputFieldViolation(Path? path, FieldNode selection) => ErrorBuilder.New() .SetMessage("Cannot return null for non-nullable field.") diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionResultExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionResultExtensions.cs index 08931bcac27..5086de1e7d2 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionResultExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionResultExtensions.cs @@ -14,7 +14,7 @@ public static class ExecutionResultExtensions private static readonly JsonResultFormatter s_formatterIndented = JsonResultFormatter.Indented; public static void WriteTo( - this IOperationResult result, + this OperationResult result, IBufferWriter writer, bool withIndentations = true) { @@ -53,7 +53,7 @@ public static string ToJson( { ArgumentNullException.ThrowIfNull(result); - if (result is IOperationResult operationResult) + if (result is OperationResult operationResult) { using var writer = new PooledArrayWriter(); diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs index 867091cd66e..229eeb2d74e 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs @@ -45,27 +45,61 @@ public OperationContext ReportError( { var errors = new List(); - ReportSingleError( + UnwrapError( context.ErrorHandler, error, errors); - context.Result.Errors ??= []; + context.Result.AddErrorRange(errors); foreach (var handled in errors) { - context.Result.Errors.Add(handled); context.DiagnosticEvents.ResolverError(resolverContext, handled); } return context; } - public IOperationResult BuildResult() - => context.Result.BuildResult(); + public OperationResult BuildResult() + { + var resultBuilder = context.Result; + + var result = new OperationResult( + new OperationResultData( + resultBuilder.Data, + resultBuilder.Data.Data.IsNullOrInvalidated, + resultBuilder.Data, + resultBuilder.Data), + resultBuilder.Errors is { Count: > 0 } errors ? errors : null, + resultBuilder.Extensions is { Count: > 0 } extensions ? extensions : null) + { + RequestIndex = resultBuilder.RequestIndex > -1 ? resultBuilder.RequestIndex : 0, + VariableIndex = resultBuilder.VariableIndex > -1 ? resultBuilder.VariableIndex : 0, + ContextData = resultBuilder.ContextData + }; + + if (resultBuilder.Path is not null + || resultBuilder.HasNext.HasValue + || resultBuilder.Pending is not null + || resultBuilder.Incremental is not null + || resultBuilder.Completed is not null) + { + result.Features.Set( + new IncrementalDataFeature + { + Path = resultBuilder.Path, + HasNext = resultBuilder.HasNext, + Pending = resultBuilder.Pending, + Incremental = resultBuilder.Incremental, + Completed = resultBuilder.Completed + }); + } + + return result; + } } - private static void ReportSingleError( + private static void UnwrapError( IErrorHandler errorHandler, IError error, List errors, @@ -84,11 +118,7 @@ private static void ReportSingleError( { foreach (var innerError in aggregateError.Errors) { - ReportSingleError( - errorHandler, - innerError, - errors, - depth++); + UnwrapError(errorHandler, innerError, errors, depth++); } } else diff --git a/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs b/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs index 126086ceef0..057c777ae01 100644 --- a/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs +++ b/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs @@ -41,6 +41,9 @@ void IResultDataJsonFormatter.WriteTo( #else => FormatValue(writer, options ?? JsonSerializerOptions.Default, nullIgnoreCondition); #endif + + public static NeedsFormatting Create(TValue value) + => new(value); } /// diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs index 6355bf99f58..8124581c387 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs @@ -122,7 +122,7 @@ private async Task ExecuteVariableBatchRequestAsync( } var variableSet = context.VariableValues; - var tasks = new Task[variableSet.Length]; + var tasks = new Task[variableSet.Length]; for (var i = 0; i < variableSet.Length; i++) { @@ -130,7 +130,7 @@ private async Task ExecuteVariableBatchRequestAsync( } var results = await Task.WhenAll(tasks).ConfigureAwait(false); - context.Result = new OperationResultBatch(results); + context.Result = new OperationResultBatch([..results]); } private async Task ExecuteVariableBatchRequestOptimizedAsync( @@ -141,7 +141,7 @@ private async Task ExecuteVariableBatchRequestOptimizedAsync( var variableSets = context.VariableValues; var query = GetQueryRootValue(context); var operationContextBuffer = ArrayPool.Shared.Rent(variableSets.Length); - var resultBuffer = ArrayPool.Shared.Rent(variableSets.Length); + var resultBuffer = ArrayPool.Shared.Rent(variableSets.Length); for (var variableIndex = 0; variableIndex < variableSets.Length; variableIndex++) { @@ -162,7 +162,7 @@ await _queryExecutor.ExecuteBatchAsync( operationContextBuffer.AsMemory(0, variableSets.Length), resultBuffer.AsMemory(0, variableSets.Length)); - context.Result = new OperationResultBatch(CreateResults(resultBuffer.AsSpan(0, variableSets.Length))); + context.Result = new OperationResultBatch([..resultBuffer.AsSpan(0, variableSets.Length)]); } catch (OperationCanceledException) { @@ -204,9 +204,6 @@ static void Initialize( operationContexts[variableIndex] = operationContextOwner; } - static IOperationResult[] CreateResults(ReadOnlySpan results) - => results.ToArray(); - static void AbandonContexts(ref OperationContextOwner[]? operationContextBuffer, int length) { if (operationContextBuffer is not null) @@ -220,12 +217,12 @@ static void AbandonContexts(ref OperationContextOwner[]? operationContextBuffer, static void ReleaseResources( ref OperationContextOwner[]? operationContextBuffer, - IOperationResult[] resultBuffer, + IExecutionResult[] resultBuffer, int length) { var results = resultBuffer.AsSpan(0, length); results.Clear(); - ArrayPool.Shared.Return(resultBuffer); + ArrayPool.Shared.Return(resultBuffer); if (operationContextBuffer is null) { @@ -293,7 +290,7 @@ await ExecuteQueryOrMutationAsync( } } - private async Task ExecuteQueryOrMutationNoStreamAsync( + private async Task ExecuteQueryOrMutationNoStreamAsync( RequestContext context, IBatchDispatcher batchDispatcher, Operation operation, @@ -329,7 +326,7 @@ private async Task ExecuteQueryOrMutationNoStreamAsync( } } - private async Task ExecuteQueryOrMutationAsync( + private async Task ExecuteQueryOrMutationAsync( RequestContext context, IBatchDispatcher batchDispatcher, Operation operation, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs index 4b495a813d5..85151fa4dad 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs @@ -108,14 +108,14 @@ void ReportSingle(IError singleError) foreach (var ie in ar.Errors) { var errorWithPath = EnsurePathAndLocation(ie, _selection.SyntaxNodes[0].Node, Path); - _operationContext.Result.AddError(errorWithPath, _selection); + _operationContext.Result.AddError(errorWithPath); diagnosticEvents.ResolverError(this, errorWithPath); } } else { var errorWithPath = EnsurePathAndLocation(handled, _selection.SyntaxNodes[0].Node, Path); - _operationContext.Result.AddError(errorWithPath, _selection); + _operationContext.Result.AddError(errorWithPath); diagnosticEvents.ResolverError(this, errorWithPath); } @@ -224,10 +224,9 @@ public IMiddlewareContext Clone() // this context. var resolverTask = _operationContext.CreateResolverTask( - Selection, _parent, + Selection, ResultValue, - ResponseIndex, ScopedContextData); // We need to manually copy the local state. @@ -249,16 +248,16 @@ private sealed class OperationResultBuilderFacade : IOperationResultBuilder public OperationContext Context { get; set; } = null!; public void SetResultState(string key, object? value) - => Context.Result.SetContextData(key, value); + => Context.Result.SetResultState(key, value); public void SetResultState(string key, UpdateState value) - => Context.Result.SetContextData(key, value); + => Context.Result.SetResultState(key, value); public void SetResultState( string key, TState state, UpdateState value) - => Context.Result.SetContextData(key, state, value); + => Context.Result.SetResultState(key, state, value); public void SetExtension(string key, TValue value) => Context.Result.SetExtension(key, new NeedsFormatting(value)); @@ -266,12 +265,7 @@ public void SetExtension(string key, TValue value) public void SetExtension(string key, UpdateState value) => Context.Result.SetExtension?>( key, - (k, c) => new NeedsFormatting( - value( - k, - c is null - ? default! - : c.Value))); + (k, c) => NeedsFormatting.Create(value(k, c is null ? default! : c.Value))); public void SetExtension( string key, @@ -280,12 +274,6 @@ public void SetExtension( => Context.Result.SetExtension?, TState>( key, state, - (k, c, s) => new NeedsFormatting( - value( - k, - c is null - ? default! - : c.Value, - s))); + (k, c, s) => NeedsFormatting.Create(value(k, c is null ? default! : c.Value, s))); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs index b3cf76ae8d9..cf50c859c87 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.State.cs @@ -11,7 +11,7 @@ internal partial class MiddlewareContext private object? _parent; private Path? _path; - public Path Path => _path ??= ResultValue.Path.Append(Selection.ResponseName); + public Path Path => _path ??= ResultValue.Path; public IImmutableDictionary ScopedContextData { get; set; } = null!; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs index 2c8130038a0..87c7c41ec72 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Execution.cs @@ -22,7 +22,7 @@ internal set } } - public ResultDocument Result => _resultDocument; + public OperationResultBuilder Result { get; } = new(); public RequestContext RequestContext { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.IExecutionTaskContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.IExecutionTaskContext.cs index 45508919dfc..511ede6b1cc 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.IExecutionTaskContext.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.IExecutionTaskContext.cs @@ -33,19 +33,18 @@ private void ReportError(IExecutionTask task, IError error) void ReportSingle(IError singleError) { var handled = ErrorHandler.Handle(singleError); - Result.Errors ??= []; if (handled is AggregateError ar) { foreach (var ie in ar.Errors) { - Result.Errors.Add(ie); + Result.AddError(ie); _diagnosticEvents.TaskError(task, ie); } } else { - Result.Errors.Add(handled); + Result.AddError(handled); _diagnosticEvents.TaskError(task, handled); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs index bcc1e64f9e3..4c2d9605d8a 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContext.Pooling.cs @@ -17,7 +17,6 @@ internal sealed partial class OperationContext private readonly WorkScheduler _workScheduler; private WorkScheduler _currentWorkScheduler; private readonly AggregateServiceScopeInitializer _serviceScopeInitializer; - private ResultDocument _resultDocument = null!; private RequestContext _requestContext = null!; private Schema _schema = null!; private IErrorHandler _errorHandler = null!; @@ -79,11 +78,9 @@ public void Initialize( _isInitialized = true; IncludeFlags = operation.CreateIncludeFlags(variables); - _resultDocument = new ResultDocument(operation, IncludeFlags) - { - RequestIndex = _requestContext.RequestIndex, - VariableIndex = variableIndex - }; + Result.Data = new ResultDocument(operation, IncludeFlags); + Result.RequestIndex = _requestContext.RequestIndex; + Result.VariableIndex = variableIndex; _workScheduler.Initialize(batchDispatcher); _currentWorkScheduler = _workScheduler; @@ -108,11 +105,9 @@ public void InitializeFrom(OperationContext context) _isInitialized = true; IncludeFlags = _operation.CreateIncludeFlags(_variables); - _resultDocument = new ResultDocument(_operation, IncludeFlags) - { - RequestIndex = _requestContext.RequestIndex, - VariableIndex = context._variableIndex - }; + Result.Data = new ResultDocument(_operation, IncludeFlags); + Result.RequestIndex = _requestContext.RequestIndex; + Result.VariableIndex = context._variableIndex; _workScheduler.Initialize(_batchDispatcher); _currentWorkScheduler = _workScheduler; @@ -124,7 +119,6 @@ public void Clean() { _currentWorkScheduler = _workScheduler; _workScheduler.Clear(); - _resultDocument = null!; _requestContext = null!; _schema = null!; _errorHandler = null!; @@ -138,6 +132,7 @@ public void Clean() _resolveQueryRootValue = null!; _batchDispatcher = null!; _isInitialized = false; + Result.Reset(); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContextOwner.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContextOwner.cs index c0aa82e3049..3bb712d0666 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContextOwner.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationContextOwner.cs @@ -22,6 +22,8 @@ internal sealed class OperationContextOwner : IDisposable public OperationContextOwner(ObjectPool operationContextPool) { + ArgumentNullException.ThrowIfNull(operationContextPool); + _pool = operationContextPool; _context = operationContextPool.Get(); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs new file mode 100644 index 00000000000..f5b8376561d --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs @@ -0,0 +1,170 @@ +using System.Collections.Immutable; +using HotChocolate.Resolvers; +using HotChocolate.Text.Json; + +namespace HotChocolate.Execution; + +internal sealed class OperationResultBuilder : IOperationResultBuilder +{ + private readonly object _sync = new(); + + public int RequestIndex { get; set; } = -1; + + public int VariableIndex { get; set; } = -1; + + public Path? Path { get; set; } + + public ResultDocument Data { get; set; } = null!; + + public ImmutableList Errors { get; set; } = ImmutableList.Empty; + + public ImmutableDictionary Extensions { get; set; } = ImmutableDictionary.Empty; + + public ImmutableDictionary ContextData { get; set; } = ImmutableDictionary.Empty; + + public ImmutableList? Pending { get; set; } + + public ImmutableList? Incremental { get; set; } + + public ImmutableList? Completed { get; set; } + + public ImmutableList> CleanupTasks { get; set; } = ImmutableList>.Empty; + + // TODO : Is this still needed? + public ImmutableHashSet NonNullViolations { get; set; } = ImmutableHashSet.Empty; + + public bool? HasNext { get; set; } + + public void AddError(IError error) + { + lock (_sync) + { + Errors = Errors.Add(error); + } + } + + public void AddErrorRange(IReadOnlyList errors) + { + lock (_sync) + { + Errors = Errors.AddRange(errors); + } + } + + public void AddNonNullViolation(Path path) + { + lock (_sync) + { + NonNullViolations = NonNullViolations.Add(path); + } + } + + public void SetExtension(string key, TValue value) + { + lock (_sync) + { + Extensions = Extensions.SetItem(key, value); + } + } + + public void SetExtension(string key, UpdateState value) + { + lock (_sync) + { + if (Extensions.TryGetValue(key, out var currentValue)) + { + var newValue = value(key, (TValue)currentValue!); + Extensions = Extensions.SetItem(key, newValue); + } + else + { + var initialValue = value(key, default!); + Extensions = Extensions.Add(key, initialValue); + } + } + } + + public void SetExtension(string key, TState state, UpdateState value) + { + lock (_sync) + { + if (Extensions.TryGetValue(key, out var currentValue)) + { + var newValue = value(key, (TValue)currentValue!, state); + Extensions = Extensions.SetItem(key, newValue); + } + else + { + var initialValue = value(key, default!, state); + Extensions = Extensions.Add(key, initialValue); + } + } + } + + public void SetResultState(string key, object? value) + { + lock (_sync) + { + ContextData = ContextData.SetItem(key, value); + } + } + + public void SetResultState(string key, UpdateState value) + { + lock (_sync) + { + if (Extensions.TryGetValue(key, out var currentValue)) + { + var newValue = value(key, currentValue); + Extensions = Extensions.SetItem(key, newValue); + } + else + { + var initialValue = value(key, null); + Extensions = Extensions.Add(key, initialValue); + } + } + } + + public void SetResultState(string key, TState state, UpdateState value) + { + lock (_sync) + { + if (Extensions.TryGetValue(key, out var currentValue)) + { + var newValue = value(key, currentValue, state); + Extensions = Extensions.SetItem(key, newValue); + } + else + { + var initialValue = value(key, null, state); + Extensions = Extensions.Add(key, initialValue); + } + } + } + + public void RegisterForCleanup(Func action) + { + lock (_sync) + { + CleanupTasks = CleanupTasks.Add(action); + } + } + + public void Reset() + { + RequestIndex = -1; + VariableIndex = -1; + Path = null; + Data = null!; + Errors = ImmutableList.Empty; + Pending = ImmutableList.Empty; + Extensions = ImmutableDictionary.Empty; + CleanupTasks = ImmutableList>.Empty; + NonNullViolations = ImmutableHashSet.Empty; + Pending = null; + Incremental = null; + Completed = null; + HasNext = null; + } +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs index 50d8ece2ad3..6fce5589c74 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/QueryExecutor.cs @@ -5,11 +5,11 @@ namespace HotChocolate.Execution.Processing; internal sealed class QueryExecutor { - public Task ExecuteAsync( + public Task ExecuteAsync( OperationContext operationContext) => ExecuteAsync(operationContext, ImmutableDictionary.Empty); - public Task ExecuteAsync( + public Task ExecuteAsync( OperationContext operationContext, IImmutableDictionary scopedContext) { @@ -19,14 +19,14 @@ public Task ExecuteAsync( return ExecuteInternalAsync(operationContext, scopedContext); } - private static async Task ExecuteInternalAsync( + private static async Task ExecuteInternalAsync( OperationContext operationContext, IImmutableDictionary scopedContext) { EnqueueResolverTasks( operationContext, operationContext.RootValue, - operationContext.Result.Data, + operationContext.Result.Data.Data, scopedContext, Path.Root); @@ -37,7 +37,7 @@ private static async Task ExecuteInternalAsync( public async Task ExecuteBatchAsync( ReadOnlyMemory operationContexts, - Memory results) + Memory results) { var scopedContext = ImmutableDictionary.Empty; @@ -65,7 +65,7 @@ private static void FillSchedulerWithWork( EnqueueResolverTasks( context, context.RootValue, - context.Result.Data, + context.Result.Data.Data, scopedContext, Path.Root); } @@ -73,7 +73,7 @@ private static void FillSchedulerWithWork( private static void BuildResults( ReadOnlySpan operationContexts, - Span results) + Span results) { for (var i = 0; i < operationContexts.Length; ++i) { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.Subscription.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.Subscription.cs index ef15af5a215..1eda1d3c4a4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.Subscription.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.Subscription.cs @@ -103,7 +103,7 @@ public static async ValueTask SubscribeAsync( return subscription; } - public IAsyncEnumerable ExecuteAsync() + public IAsyncEnumerable ExecuteAsync() => new SubscriptionEnumerable( _requestContext, Id, @@ -147,7 +147,7 @@ public async ValueTask DisposeAsync() /// /// Returns a query result which will be enqueued to the response stream. /// - private async Task OnEvent(object payload) + private async Task OnEvent(object payload) { using var es = _diagnosticEvents.OnSubscriptionEvent(_requestContext, _id); using var serviceScope = _requestContext.RequestServices.CreateScope(); @@ -183,9 +183,7 @@ private async Task OnEvent(object payload) rootValue, _resolveQueryRootValue); - operationContext.Result.SetContextData( - WellKnownContextData.EventMessage, - payload); + operationContext.Result.SetResultState(WellKnownContextData.EventMessage, payload); var result = await _queryExecutor .ExecuteAsync(operationContext, scopedContextData) @@ -247,18 +245,17 @@ private async ValueTask SubscribeAsync() // next we need a result map so that we can store the subscribe temporarily // while executing the subscribe pipeline. - var resultMap = operationContext.Result.RentObject(1); + var resultMap = operationContext.Result.Data.Data; var rootSelection = _rootSelections.Selections[0]; // we create a temporary middleware context so that we can use the standard // resolver pipeline. var middlewareContext = new MiddlewareContext(); middlewareContext.Initialize( - operationContext, + rootValue, rootSelection, resultMap, - 1, - rootValue, + operationContext, _scopedContextData, null); @@ -314,18 +311,19 @@ await rootSelection.Field.SubscribeResolver! } finally { - operationContext.Result.DiscardResult(); + operationContext.Result.Data.Dispose(); + operationContext.Result.Reset(); _operationContextPool.Return(operationContext); } } } - private sealed class SubscriptionEnumerable : IAsyncEnumerable + private sealed class SubscriptionEnumerable : IAsyncEnumerable { private readonly RequestContext _requestContext; private readonly ulong _subscriptionId; private readonly ISourceStream _sourceStream; - private readonly Func> _onEvent; + private readonly Func> _onEvent; private readonly IExecutionDiagnosticEvents _diagnosticEvents; private readonly IErrorHandler _errorHandler; @@ -333,7 +331,7 @@ public SubscriptionEnumerable( RequestContext requestContext, ulong subscriptionId, ISourceStream sourceStream, - Func> onEvent, + Func> onEvent, IExecutionDiagnosticEvents diagnosticEvents, IErrorHandler errorHandler) { @@ -345,7 +343,7 @@ public SubscriptionEnumerable( _errorHandler = errorHandler; } - public IAsyncEnumerator GetAsyncEnumerator( + public IAsyncEnumerator GetAsyncEnumerator( CancellationToken cancellationToken = default) { try @@ -371,12 +369,12 @@ public IAsyncEnumerator GetAsyncEnumerator( } } - private sealed class SubscriptionEnumerator : IAsyncEnumerator + private sealed class SubscriptionEnumerator : IAsyncEnumerator { private readonly RequestContext _requestContext; private readonly ulong _subscriptionId; private readonly IAsyncEnumerator _eventEnumerator; - private readonly Func> _onEvent; + private readonly Func> _onEvent; private readonly IExecutionDiagnosticEvents _diagnosticEvents; private readonly IErrorHandler _errorHandler; private readonly CancellationToken _requestAborted; @@ -387,7 +385,7 @@ public SubscriptionEnumerator( RequestContext requestContext, ulong subscriptionId, IAsyncEnumerator eventEnumerator, - Func> onEvent, + Func> onEvent, IExecutionDiagnosticEvents diagnosticEvents, IErrorHandler errorHandler, CancellationToken requestAborted) @@ -401,7 +399,7 @@ public SubscriptionEnumerator( _requestAborted = requestAborted; } - public IOperationResult Current { get; private set; } = null!; + public OperationResult Current { get; private set; } = null!; public async ValueTask MoveNextAsync() { @@ -429,7 +427,7 @@ public async ValueTask MoveNextAsync() _diagnosticEvents.SubscriptionEventError(_requestContext, _subscriptionId, ex); _completed = true; - Current = OperationResultBuilder.CreateError(error); + Current = OperationResult.FromError(error); return true; } @@ -446,9 +444,9 @@ public async ValueTask DisposeAsync() } } - private sealed class ErrorSubscriptionEnumerator : IAsyncEnumerator + private sealed class ErrorSubscriptionEnumerator : IAsyncEnumerator { - public IOperationResult Current => null!; + public OperationResult Current => null!; public ValueTask MoveNextAsync() => new(false); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs index e10abc1e2a5..ee00cb1b8aa 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using HotChocolate.Execution.Instrumentation; using Microsoft.Extensions.ObjectPool; using static HotChocolate.Execution.ThrowHelper; @@ -60,11 +61,8 @@ public async Task ExecuteAsync( _diagnosticEvents) .ConfigureAwait(false); - var response = new ResponseStream( - () => subscription.ExecuteAsync(), - contextData: new SingleValueExtensionData( - WellKnownContextData.Subscription, - subscription)); + var response = new ResponseStream(() => subscription.ExecuteAsync()); + response.ContextData = response.ContextData.SetItem(WellKnownContextData.Subscription, subscription); response.RegisterForCleanup(subscription); return response; } @@ -75,7 +73,7 @@ public async Task ExecuteAsync( await subscription.DisposeAsync().ConfigureAwait(false); } - return new OperationResult(null, ex.Errors); + return new OperationResult([..ex.Errors]); } catch (Exception ex) { @@ -89,11 +87,11 @@ public async Task ExecuteAsync( return new OperationResult(null, Unwrap(error)); } - static IReadOnlyList Unwrap(IError error) + static ImmutableList Unwrap(IError error) { if (error is AggregateError aggregateError) { - return aggregateError.Errors; + return [..aggregateError.Errors]; } return [error]; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs index 52e84d7fa20..22e050998a8 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs @@ -47,7 +47,7 @@ private void CompleteValue(bool success, CancellationToken cancellationToken) { PropagateNullValues(resultValue); _completionStatus = ExecutionTaskStatus.Faulted; - _operationContext.Result.AddNonNullViolation(_selection, _context.Path); + _operationContext.Result.AddNonNullViolation(_context.Path); _taskBuffer.Clear(); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs index a1303e38f38..e20aa151edf 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs @@ -225,7 +225,7 @@ private static void ResolveAndCompleteInline( if (fieldValue is { IsNullable: false, IsNullOrInvalidated: true }) { PropagateNullValues(fieldValue); - operationContext.Result.AddNonNullViolation(_selection, _context.Path); + operationContext.Result.AddNonNullViolation(fieldValue.Path); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs index 7fdaf7aa7d2..297eb489584 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs @@ -34,13 +34,13 @@ private static void CompleteLeafValue( { var errorPath = resultValue.Path; var error = InvalidLeafValue(ex, selection, errorPath); - operationContext.ReportError(error, resolverContext, selection); + operationContext.ReportError(error, resolverContext); } catch (Exception ex) { var errorPath = resultValue.Path; var error = UnexpectedLeafValueSerializationError(ex, selection, errorPath); - operationContext.ReportError(error, resolverContext, selection); + operationContext.ReportError(error, resolverContext); } resultValue.SetNullValue(); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs index ce2a7f9fe9b..3665f80bb3e 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs @@ -120,7 +120,7 @@ private static void CompleteListValue( var operationContext = context.OperationContext; var resolverContext = context.ResolverContext; var error = ListValueIsNotSupported(runtimeValue.GetType(), selection, resultValue.Path); - operationContext.ReportError(error, resolverContext, selection); + operationContext.ReportError(error, resolverContext); } internal static void PropagateNullValues(ResultElement result) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs index 080e9a75d99..9d59648c26e 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Object.cs @@ -39,7 +39,7 @@ private static void CompleteCompositeValue( } var error = ValueCompletion_CouldNotResolveAbstractType(selection, resultValue.Path, runtimeValue); - operationContext.ReportError(error, context.ResolverContext, selection); + operationContext.ReportError(error, context.ResolverContext); } private static bool TryResolveObjectType( @@ -80,7 +80,7 @@ private static bool TryResolveObjectType( fieldType.Print(), selection, resultValue.Path); - context.OperationContext.ReportError(error, context.ResolverContext, selection); + context.OperationContext.ReportError(error, context.ResolverContext); } catch (Exception ex) { @@ -89,7 +89,7 @@ private static bool TryResolveObjectType( fieldType.Print(), selection, resultValue.Path); - context.OperationContext.ReportError(error, context.ResolverContext, selection); + context.OperationContext.ReportError(error, context.ResolverContext); } objectType = null; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs index 6c849e2d813..87b48c2572b 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs @@ -50,7 +50,7 @@ public static void Complete( default: var error = UnexpectedValueCompletionError(selection, resultValue.Path); - context.OperationContext.ReportError(error, context.ResolverContext, selection); + context.OperationContext.ReportError(error, context.ResolverContext); break; } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Pooling.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Pooling.cs index e0f6c02a344..8304359ae77 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Pooling.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/WorkScheduler.Pooling.cs @@ -16,6 +16,7 @@ internal sealed partial class WorkScheduler(OperationContext operationContext) private RequestContext _requestContext = null!; private IBatchDispatcher _batchDispatcher = null!; private IDisposable _batchDispatcherSession = null!; + private OperationResultBuilder _result = null!; private IErrorHandler _errorHandler = null!; private IExecutionDiagnosticEvents _diagnosticEvents = null!; private readonly ConcurrentDictionary _completed = new(); @@ -31,6 +32,7 @@ public void Initialize(IBatchDispatcher batchDispatcher) _batchDispatcher = batchDispatcher; _batchDispatcherSession = _batchDispatcher.Subscribe(this); + _result = operationContext.Result; _errorHandler = operationContext.ErrorHandler; _diagnosticEvents = operationContext.DiagnosticEvents; _ct = operationContext.RequestAborted; @@ -54,6 +56,7 @@ public void Clear() _completed.Clear(); _signal.Reset(); + _result = null!; _batchDispatcherSession.Dispose(); _batchDispatcherSession = null!; _batchDispatcher = null!; diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index 26d565a8354..b974b656938 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -243,6 +243,110 @@ SubscriptionExecutor.cs + + + WorkScheduler.cs + + + + WorkScheduler.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + RequestExecutorBuilderExtensions.cs + + + + SchemaRequestExecutorBuilderExtensions.cs + + + + SchemaRequestExecutorBuilderExtensions.cs + + + + SchemaRequestExecutorBuilderExtensions.cs + + + + SchemaRequestExecutorBuilderExtensions.cs + + + + SchemaRequestExecutorBuilderExtensions.cs + + + + SchemaRequestExecutorBuilderExtensions.cs + + + + SchemaRequestExecutorBuilderExtensions.cs + + + + SchemaRequestExecutorBuilderExtensions.cs + + + + SchemaRequestExecutorBuilderExtensions.cs + diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs index 5e613d3f224..8228e23195a 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs @@ -39,11 +39,10 @@ public DbRow( { Debug.Assert((byte)tokenType < 16); Debug.Assert(location is >= 0 and <= 0x07FFFFFF); // 27 bits - Debug.Assert(sizeOrLength == UnknownSize || sizeOrLength is >= 0 and <= 0x07FFFFFF); // 27 bits + Debug.Assert(sizeOrLength is UnknownSize or >= 0 and <= 0x07FFFFFF); // 27 bits Debug.Assert(parentRow is >= 0 and <= 0x07FFFFFF); // 27 bits Debug.Assert(operationReferenceId is >= 0 and <= 0x7FFF); // 15 bits Debug.Assert(numberOfRows is >= 0 and <= 0x07FFFFFF); // 27 bits - Debug.Assert((byte)flags <= 255); // 8 bits (0xFF) Debug.Assert((byte)operationReferenceType <= 3); // 2 bits Debug.Assert(Unsafe.SizeOf() == Size); diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index 41b9d050cd4..709bcecbea8 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -8,13 +8,17 @@ namespace HotChocolate.Text.Json; public sealed partial class ResultDocument : IRawJsonFormatter { - public void WriteTo(IBufferWriter writer, bool indented = false) + public void WriteTo(OperationResult result, IBufferWriter writer, bool indented = false) { - var formatter = new RawJsonFormatter(this, writer, indented); + var formatter = new RawJsonFormatter(result, this, writer, indented); formatter.Write(); } - internal ref struct RawJsonFormatter(ResultDocument document, IBufferWriter writer, bool indented) + internal ref struct RawJsonFormatter( + OperationResult result, + ResultDocument document, + IBufferWriter writer, + bool indented) { private int _indentation = 0; @@ -28,7 +32,7 @@ public void Write() _indentation++; } - if (document.Errors?.Count > 0) + if (result.Errors?.Count > 0) { if (indented) { @@ -49,7 +53,7 @@ public void Write() using var jsonWriter = new Utf8JsonWriter(writer, options); JsonValueFormatter.WriteErrors( jsonWriter, - document.Errors, + result.Errors, new JsonSerializerOptions(JsonSerializerDefaults.Web), default); jsonWriter.Flush(); @@ -86,7 +90,7 @@ public void Write() WriteObject(root, row); } - if (document.Extensions?.Count > 0) + if (result.Extensions?.Count > 0) { WriteByte(JsonConstants.Comma); @@ -109,7 +113,7 @@ public void Write() using var jsonWriter = new Utf8JsonWriter(writer, options); JsonValueFormatter.WriteDictionary( jsonWriter, - document.Extensions, + result.Extensions, new JsonSerializerOptions(JsonSerializerDefaults.Web), default); jsonWriter.Flush(); diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index 5fafdee1c60..857764161b6 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -1,13 +1,10 @@ using System.Buffers; -using System.Collections.Immutable; using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; using System.Text; using HotChocolate.Buffers; using HotChocolate.Execution; using HotChocolate.Execution.Processing; -using HotChocolate.Features; using HotChocolate.Types; namespace HotChocolate.Text.Json; @@ -209,8 +206,8 @@ internal ResultElement GetParent(Cursor current) // if we have not yet reached the root and the element type of the parent is an object or an array // then we need to get still the parent of this row as we want to get the logical parent // which is the value level of the property or the element in an array. - if (parent != Cursor.Zero && - _metaDb.GetElementTokenType(parent) is ElementTokenType.StartObject or ElementTokenType.StartArray) + if (parent != Cursor.Zero + && _metaDb.GetElementTokenType(parent) is ElementTokenType.StartObject or ElementTokenType.StartArray) { parent = _metaDb.GetParentCursor(parent); @@ -442,8 +439,8 @@ private ReadOnlySpan ReadLocalData(int location, int size) // Data spans chunk boundaries - this should be rare for typical JSON values throw new NotSupportedException( - "Reading data that spans chunk boundaries as a span is not supported. " + - "Use WriteLocalDataTo for writing to an IBufferWriter instead."); + "Reading data that spans chunk boundaries as a span is not supported. " + + "Use WriteLocalDataTo for writing to an IBufferWriter instead."); } internal ResultElement CreateObject(Cursor parent, SelectionSet selectionSet) diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index de454de6cd1..452973d3dab 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -12,7 +12,7 @@ namespace HotChocolate.Text.Json; -public readonly partial struct ResultElement : IRawJsonFormatter +public readonly partial struct ResultElement { private readonly ResultDocument _parent; private readonly ResultDocument.Cursor _cursor; @@ -26,20 +26,6 @@ internal ResultElement(ResultDocument parent, ResultDocument.Cursor cursor) _cursor = cursor; } - /// - /// Writes this element as JSON to the specified buffer writer. - /// - /// The buffer writer to write to. - /// - /// true to write indented JSON; otherwise, false. - /// - public void WriteTo(IBufferWriter writer, bool indented = false) - { - var formatter = new ResultDocument.RawJsonFormatter(_parent, writer, indented); - var row = _parent._metaDb.Get(_cursor); - formatter.WriteValue(_cursor, row); - } - /// /// Gets the internal meta-db cursor. /// diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/ErrorHelper.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/ErrorHelper.cs index 5ec44b36aa3..1926ddd14aa 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/ErrorHelper.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/ErrorHelper.cs @@ -5,23 +5,23 @@ namespace HotChocolate.Fusion.Execution; internal static class ErrorHelper { - public static IOperationResult RequestTimeout(TimeSpan timeout) => - OperationResultBuilder.CreateError( + public static OperationResult RequestTimeout(TimeSpan timeout) => + OperationResult.FromError( new Error { Message = string.Format("The request exceeded the configured timeout of `{0}`.", timeout), Extensions = ImmutableOrderedDictionary.Empty.Add("code", ErrorCodes.Execution.Timeout) }); - public static IOperationResult StateInvalidForOperationPlanCache() - => OperationResultBuilder.CreateError( + public static OperationResult StateInvalidForOperationPlanCache() + => OperationResult.FromError( ErrorBuilder.New() .SetMessage("The operation plan cache requires a operation document hash.") .SetCode(ErrorCodes.Execution.OperationDocumentNotFound) .Build()); - public static IOperationResult StateInvalidForVariableCoercion() - => OperationResultBuilder.CreateError( + public static OperationResult StateInvalidForVariableCoercion() + => OperationResult.FromError( ErrorBuilder.New() .SetMessage("The variable coercion requires an operation execution plan.") .Build()); diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/FusionRequestExecutor.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/FusionRequestExecutor.cs index d6ac169bde9..a1c2dd9fcdf 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/FusionRequestExecutor.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/FusionRequestExecutor.cs @@ -152,7 +152,7 @@ private async Task ExecuteAsync( /// /// Executes a batch of GraphQL operation requests and returns an /// that yields each individual - /// as it becomes available. + /// as it becomes available. /// /// /// The batch of operation requests. @@ -172,7 +172,7 @@ public Task ExecuteBatchAsync( ExecutionResultKind.BatchResult)); } - private async IAsyncEnumerable CreateResponseStream( + private async IAsyncEnumerable CreateResponseStream( OperationRequestBatch requestBatch, [EnumeratorCancellation] CancellationToken ct = default) { @@ -207,7 +207,7 @@ private async IAsyncEnumerable CreateResponseStream( } } - private async IAsyncEnumerable ExecuteBatchStream( + private async IAsyncEnumerable ExecuteBatchStream( OperationRequestBatch requestBatch, IServiceProvider services, [EnumeratorCancellation] CancellationToken ct = default) @@ -216,14 +216,14 @@ private async IAsyncEnumerable ExecuteBatchStream( var requestCount = requests.Count; var tasks = Interlocked.Exchange(ref _taskList, null) ?? new List(requestCount); - var completed = new List(); + var completed = new List(); for (var i = 0; i < requestCount; i++) { tasks.Add(ExecuteBatchItemAsync(WithServices(requests[i], services), i, completed, ct)); } - var buffer = new IOperationResult[Math.Min(16, requestCount)]; + var buffer = new OperationResult[Math.Min(16, requestCount)]; while (tasks.Count > 0 || completed.Count > 0) { @@ -280,7 +280,7 @@ private static IOperationRequest WithServices( private async Task ExecuteBatchItemAsync( IOperationRequest request, int requestIndex, - List completed, + List completed, CancellationToken cancellationToken) { var result = await ExecuteAsync(request, requestIndex, cancellationToken).ConfigureAwait(false); @@ -289,7 +289,7 @@ private async Task ExecuteBatchItemAsync( private static async Task UnwrapBatchItemResultAsync( IExecutionResult result, - List completed, + List completed, CancellationToken cancellationToken) { switch (result) diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs index ea53da84b23..eeb6ddfb7ad 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs @@ -261,7 +261,7 @@ internal void Begin(long? start = null, string? traceId = null) } } - internal IOperationResult Complete(bool reusable = false) + internal OperationResult Complete(bool reusable = false) { var environment = Schema.TryGetEnvironment(); @@ -277,7 +277,14 @@ internal IOperationResult Complete(bool reusable = false) : null; var result = _resultStore.Result; - var operationResult = new RawOperationResult(result, contextData: null); + var operationResult = new OperationResult( + new OperationResultData( + result, + result.Data.IsNullOrInvalidated, + result, + result), + result.Errors?.ToImmutableList(), + result.Extensions?.ToImmutableDictionary()); // we take over the memory owners from the result context // and store them on the response so that the server can diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanExecutor.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanExecutor.cs index e4217d6296a..abe4de8c703 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanExecutor.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanExecutor.cs @@ -197,7 +197,7 @@ private static async Task ExecuteMutationAsync( } } - private static async IAsyncEnumerable CreateSubscriptionEnumerable( + private static async IAsyncEnumerable CreateSubscriptionEnumerable( OperationPlanContext context, OperationExecutionNode subscriptionNode, SubscriptionResult subscriptionResult, @@ -217,7 +217,7 @@ private static async IAsyncEnumerable CreateSubscriptionEnumer subscriptionNode.SchemaName ?? context.GetDynamicSchemaName(subscriptionNode), subscriptionResult.Id); - IOperationResult result; + OperationResult result; try { diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationExecutionMiddleware.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationExecutionMiddleware.cs index 57cfba647d7..a6595cb8a26 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationExecutionMiddleware.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationExecutionMiddleware.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using System.Runtime.InteropServices; using HotChocolate.Execution; using HotChocolate.Fusion.Diagnostics; @@ -41,7 +42,7 @@ public async ValueTask InvokeAsync( _diagnosticEvents.RequestError(context, error); - context.Result = OperationResultBuilder.CreateError(error); + context.Result = OperationResult.FromError(error); return; } @@ -63,7 +64,7 @@ public async ValueTask InvokeAsync( cancellationToken); } - var results = await Task.WhenAll(tasks); + var results = ImmutableList.CreateRange(await Task.WhenAll(tasks)); context.Result = new OperationResultBatch(results); } else diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs index 9d7611b703a..53397ab4db8 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs @@ -70,7 +70,7 @@ private static bool TryCoerceVariables( return true; } - context.Result = OperationResultBuilder.CreateError(error); + context.Result = OperationResult.FromError(error); return false; } } @@ -96,7 +96,7 @@ private static bool TryCoerceVariables( } else { - context.Result = OperationResultBuilder.CreateError(error); + context.Result = OperationResult.FromError(error); return false; } } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/RawOperationResult.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/RawOperationResult.cs deleted file mode 100644 index 820a87794b4..00000000000 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/RawOperationResult.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Buffers; -using System.Text.Json; -using HotChocolate.Execution; -using HotChocolate.Fusion.Text.Json; - -namespace HotChocolate.Fusion.Execution.Results; - -public sealed class RawOperationResult : ExecutionResult, IRawJsonFormatter, IOperationResult -{ - private readonly CompositeResultDocument _result; - private readonly IReadOnlyDictionary? _contextData; - - internal RawOperationResult( - CompositeResultDocument result, - IReadOnlyDictionary? contextData) - { - _result = result; - _contextData = contextData; - } - - public override ExecutionResultKind Kind => ExecutionResultKind.SingleResult; - - public CompositeResultDocument Result => _result; - - public IReadOnlyList? Errors => _result.Errors; - - public IReadOnlyDictionary? Extensions => _result.Extensions; - - public override IReadOnlyDictionary? ContextData => _contextData; - - public void WriteTo(IBufferWriter writer, bool indented = false) - { - ArgumentNullException.ThrowIfNull(writer); - _result.WriteTo(writer); - } - - #region NotSupported - - int? IOperationResult.RequestIndex => throw new NotSupportedException(); - - int? IOperationResult.VariableIndex => throw new NotSupportedException(); - - string? IOperationResult.Label => throw new NotSupportedException(); - - Path? IOperationResult.Path => throw new NotSupportedException(); - - IReadOnlyDictionary? IOperationResult.Data => throw new NotSupportedException(); - - IReadOnlyList? IOperationResult.Items => throw new NotSupportedException(); - - IReadOnlyDictionary? IOperationResult.Extensions => throw new NotSupportedException(); - - IReadOnlyList? IOperationResult.Incremental => throw new NotSupportedException(); - - bool? IOperationResult.HasNext => throw new NotSupportedException(); - - bool IOperationResult.IsDataSet => _result.Data.ValueKind is JsonValueKind.Object; - - #endregion -} diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs index 0a80ae01435..cd60ae23faa 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs @@ -8,7 +8,7 @@ namespace HotChocolate.Fusion.Text.Json; public sealed partial class CompositeResultDocument : IRawJsonFormatter { - public void WriteTo(IBufferWriter writer, bool indented = false) + public void WriteTo(OperationResult result, IBufferWriter writer, bool indented = false) { var formatter = new RawJsonFormatter(this, writer, indented); formatter.Write(); diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs index a72d6ac3b94..7aef388f1c2 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs @@ -10,7 +10,7 @@ namespace HotChocolate.Fusion.Text.Json; -public readonly partial struct CompositeResultElement : IRawJsonFormatter +public readonly partial struct CompositeResultElement { private readonly CompositeResultDocument _parent; private readonly CompositeResultDocument.Cursor _cursor; From 91d3d60d67375f043ff5b8beb8e27bb42689e0aa Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 16 Dec 2025 20:05:35 +0100 Subject: [PATCH 036/144] wip --- .../OpenApiResultFormatter.cs | 25 ++-- .../FusionOpenApiResultFormatter.cs | 1 - .../src/Caching/ICacheControlConstraints.cs | 2 +- .../CoreExecutionResultExtensions.cs | 81 ++++++------ .../Types/Text/Json/ResultDocument.WriteTo.cs | 7 +- .../Core/src/Types/Text/Json/ResultElement.cs | 14 +++ .../Execution/OperationResultBuilderTests.cs | 71 ----------- .../Execution/OperationResultBuilderTests.cs | 71 ----------- .../CostAnalysis/Utilities/ResultHelper.cs | 117 ++++++------------ .../SortVisitorTestBase.cs | 7 +- .../src/Diagnostics/ActivityEnricher.cs | 2 +- .../ActivityServerDiagnosticListener.cs | 6 +- .../Scopes/ExecuteOperationScope.cs | 2 +- .../Diagnostics/Scopes/ExecuteRequestScope.cs | 2 +- .../ProjectionVisitorTestBase.cs | 11 +- .../SortVisitorTestBase.cs | 7 +- .../IntegrationTests.cs | 7 +- .../IntegrationTests.cs | 21 +--- .../FilterVisitorTestBase.cs | 9 +- .../Transport.InMemory/InMemoryConnection.cs | 29 ++--- 20 files changed, 151 insertions(+), 341 deletions(-) delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationResultBuilderTests.cs delete mode 100644 src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationResultBuilderTests.cs diff --git a/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs b/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs index 1f05da24626..bf6e56be174 100644 --- a/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs +++ b/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs @@ -1,6 +1,7 @@ using System.Text.Encodings.Web; using System.Text.Json; using HotChocolate.Execution; +using HotChocolate.Text.Json; using Microsoft.AspNetCore.Http; namespace HotChocolate.Adapters.OpenApi; @@ -14,15 +15,26 @@ internal sealed class OpenApiResultFormatter : IOpenApiResultFormatter new() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; public async Task FormatResultAsync( - IOperationResult operationResult, + OperationResult operationResult, HttpContext httpContext, OpenApiEndpointDescriptor endpoint, CancellationToken cancellationToken) { + if (operationResult.Data is not ResultDocument resultDocument) + { + await Results.InternalServerError().ExecuteAsync(httpContext); + return; + } + + if (!resultDocument.Data.TryGetProperty(endpoint.ResponseNameToExtract, out var rootProperty)) + { + await Results.InternalServerError().ExecuteAsync(httpContext); + return; + } + // If the root field is null, and we don't have any errors, // we return HTTP 404 for queries and HTTP 500 otherwise. - if (operationResult.Data?.TryGetValue(endpoint.ResponseNameToExtract, out var responseData) != true - || responseData is null) + if (rootProperty.IsNullOrInvalidated) { var result = endpoint.HttpMethod == HttpMethods.Get ? Results.NotFound() @@ -35,11 +47,10 @@ public async Task FormatResultAsync( httpContext.Response.StatusCode = StatusCodes.Status200OK; httpContext.Response.ContentType = "application/json"; - var jsonWriter = new Utf8JsonWriter(httpContext.Response.BodyWriter, s_jsonWriterOptions); + var bodyWriter = httpContext.Response.BodyWriter; - JsonValueFormatter.WriteValue(jsonWriter, responseData, s_jsonSerializerOptions, - JsonNullIgnoreCondition.None); + rootProperty.WriteTo(bodyWriter); - await jsonWriter.FlushAsync(cancellationToken); + await bodyWriter.FlushAsync(cancellationToken); } } diff --git a/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs b/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs index 49613679281..362b3d01bba 100644 --- a/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs +++ b/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs @@ -1,5 +1,4 @@ using HotChocolate.Execution; -using HotChocolate.Fusion.Execution.Results; using HotChocolate.Fusion.Text.Json; using Microsoft.AspNetCore.Http; diff --git a/src/HotChocolate/Caching/src/Caching/ICacheControlConstraints.cs b/src/HotChocolate/Caching/src/Caching/ICacheControlConstraints.cs index 8fd3dc23966..2b33b511552 100644 --- a/src/HotChocolate/Caching/src/Caching/ICacheControlConstraints.cs +++ b/src/HotChocolate/Caching/src/Caching/ICacheControlConstraints.cs @@ -21,7 +21,7 @@ public interface ICacheConstraints int? SharedMaxAge { get; } /// - /// The scope of the that shall be cached. + /// The scope of the that shall be cached. /// CacheControlScope Scope { get; } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs index c704855ca06..dd6aa672b08 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/Extensions/CoreExecutionResultExtensions.cs @@ -8,6 +8,48 @@ namespace HotChocolate.Execution; /// public static class CoreExecutionResultExtensions { + extension(IExecutionResult? result) + { + /// + /// Expects a single GraphQL operation result. + /// + public OperationResult ExpectOperationResult() + { + if (result is OperationResult qr) + { + return qr; + } + + throw new ArgumentException(ExecutionResultExtensions_ExpectOperationResult_NotOperationResult); + } + + /// + /// Expects a batch of operation results. + /// + public OperationResultBatch ExpectOperationResultBatch() + { + if (result is OperationResultBatch qr) + { + return qr; + } + + throw new ArgumentException(ExecutionResultExtensions_ExpectOperationResultBatch_NotOperationResultBatch); + } + + /// + /// Expect a stream result. + /// + public ResponseStream ExpectResponseStream() + { + if (result is ResponseStream rs) + { + return rs; + } + + throw new ArgumentException(ExecutionResultExtensions_ExpectResponseStream_NotResponseStream); + } + } + extension(IExecutionResult result) { /// @@ -61,44 +103,5 @@ public void RegisterForCleanup(IAsyncDisposable disposable) /// public bool IsStreamResult() => result.Kind is BatchResult or DeferredResult or SubscriptionResult; - - /// - /// Expects a single GraphQL operation result. - /// - public OperationResult ExpectOperationResult() - { - if (result is OperationResult qr) - { - return qr; - } - - throw new ArgumentException(ExecutionResultExtensions_ExpectOperationResult_NotOperationResult); - } - - /// - /// Expects a batch of operation results. - /// - public OperationResultBatch ExpectOperationResultBatch() - { - if (result is OperationResultBatch qr) - { - return qr; - } - - throw new ArgumentException(ExecutionResultExtensions_ExpectOperationResultBatch_NotOperationResultBatch); - } - - /// - /// Expect a stream result. - /// - public ResponseStream ExpectResponseStream() - { - if (result is ResponseStream rs) - { - return rs; - } - - throw new ArgumentException(ExecutionResultExtensions_ExpectResponseStream_NotResponseStream); - } } } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index 709bcecbea8..ea50b4df715 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -10,19 +10,18 @@ public sealed partial class ResultDocument : IRawJsonFormatter { public void WriteTo(OperationResult result, IBufferWriter writer, bool indented = false) { - var formatter = new RawJsonFormatter(result, this, writer, indented); - formatter.Write(); + var formatter = new RawJsonFormatter(this, writer, indented); + formatter.Write(result); } internal ref struct RawJsonFormatter( - OperationResult result, ResultDocument document, IBufferWriter writer, bool indented) { private int _indentation = 0; - public void Write() + public void Write(OperationResult result) { WriteByte(JsonConstants.OpenBrace); diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index 452973d3dab..9f6d6f12291 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -1140,6 +1140,20 @@ public void SetNumberValue(decimal value) _parent.AssignNumberValue(this, buffer[..bytesWritten]); } + /// + /// Writes this element as JSON to the specified buffer writer. + /// + /// The buffer writer to write to. + /// + /// true to write indented JSON; otherwise, false. + /// + public void WriteTo(IBufferWriter writer, bool indented = false) + { + var formatter = new ResultDocument.RawJsonFormatter(_parent, writer, indented); + var row = _parent._metaDb.Get(_cursor); + formatter.WriteValue(_cursor, row); + } + /// public override string ToString() { diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationResultBuilderTests.cs b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationResultBuilderTests.cs deleted file mode 100644 index dfac59c39f5..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationResultBuilderTests.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace HotChocolate.Execution; - -public class OperationResultBuilderTests -{ - [Fact] - public void Create_Result_Without_Data_And_Errors() - { - // arrange - // act - Action result = () => OperationResultBuilder.New().Build(); - - // assert - Assert.Throws(result); - } - - [Fact] - public void Create_Result_Set_Data() - { - // arrange - var builder = new OperationResultBuilder(); - - // act - builder.SetData(new Dictionary { { "a", "b" } }); - - // assert - builder.Build().MatchSnapshot(); - } - - [Fact] - public void Create_Result_Set_Items() - { - // arrange - var builder = new OperationResultBuilder(); - - // act - builder.SetItems(new List { 1 }); - - // assert - builder.Build().MatchSnapshot(); - } - - [Fact] - public void ExpectOperationResult() - { - // arrange - IExecutionResult result = OperationResultBuilder.New() - .SetData(new Dictionary { { "a", "b" } }) - .Build(); - - // act - var queryResult = result.ExpectOperationResult(); - - // assert - Assert.NotNull(queryResult); - } - - [Fact] - public void ExpectResponseStream() - { - // arrange - IExecutionResult result = OperationResultBuilder.New() - .SetData(new Dictionary { { "a", "b" } }) - .Build(); - - // act - void Fail() => result.ExpectResponseStream(); - - // assert - Assert.Throws(Fail); - } -} diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationResultBuilderTests.cs b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationResultBuilderTests.cs deleted file mode 100644 index dfac59c39f5..00000000000 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationResultBuilderTests.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace HotChocolate.Execution; - -public class OperationResultBuilderTests -{ - [Fact] - public void Create_Result_Without_Data_And_Errors() - { - // arrange - // act - Action result = () => OperationResultBuilder.New().Build(); - - // assert - Assert.Throws(result); - } - - [Fact] - public void Create_Result_Set_Data() - { - // arrange - var builder = new OperationResultBuilder(); - - // act - builder.SetData(new Dictionary { { "a", "b" } }); - - // assert - builder.Build().MatchSnapshot(); - } - - [Fact] - public void Create_Result_Set_Items() - { - // arrange - var builder = new OperationResultBuilder(); - - // act - builder.SetItems(new List { 1 }); - - // assert - builder.Build().MatchSnapshot(); - } - - [Fact] - public void ExpectOperationResult() - { - // arrange - IExecutionResult result = OperationResultBuilder.New() - .SetData(new Dictionary { { "a", "b" } }) - .Build(); - - // act - var queryResult = result.ExpectOperationResult(); - - // assert - Assert.NotNull(queryResult); - } - - [Fact] - public void ExpectResponseStream() - { - // arrange - IExecutionResult result = OperationResultBuilder.New() - .SetData(new Dictionary { { "a", "b" } }) - .Build(); - - // act - void Fail() => result.ExpectResponseStream(); - - // assert - Assert.Throws(Fail); - } -} diff --git a/src/HotChocolate/CostAnalysis/src/CostAnalysis/Utilities/ResultHelper.cs b/src/HotChocolate/CostAnalysis/src/CostAnalysis/Utilities/ResultHelper.cs index ebd58cc12eb..f7f6e0f4d28 100644 --- a/src/HotChocolate/CostAnalysis/src/CostAnalysis/Utilities/ResultHelper.cs +++ b/src/HotChocolate/CostAnalysis/src/CostAnalysis/Utilities/ResultHelper.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using HotChocolate.Collections.Immutable; using HotChocolate.Execution; namespace HotChocolate.CostAnalysis.Utilities; @@ -14,7 +15,7 @@ internal static class ResultHelper public static IExecutionResult CreateError(IError error, CostMetrics? costMetrics) { - IReadOnlyDictionary? extensions = null; + ImmutableDictionary? extensions = null; if (costMetrics is not null) { extensions = AddCostMetrics(extensions, costMetrics); @@ -22,47 +23,24 @@ public static IExecutionResult CreateError(IError error, CostMetrics? costMetric return error is AggregateError aggregateError ? CreateError(aggregateError.Errors, costMetrics) - : new OperationResult( - null, - ImmutableArray.Create(error), - extensions: extensions, - contextData: s_validationError); + : new OperationResult([error], extensions) { ContextData = s_validationError }; } public static IExecutionResult CreateError(IReadOnlyList errors, CostMetrics? costMetrics) { - IReadOnlyDictionary? extensions = null; + ImmutableDictionary? extensions = null; if (costMetrics is not null) { extensions = AddCostMetrics(extensions, costMetrics); } - return new OperationResult( - null, - errors, - extensions: extensions, - contextData: s_validationError); + return new OperationResult([..errors], extensions) { ContextData = s_validationError }; } public static IExecutionResult CreateResult(this CostMetrics costMetrics) { var extensions = AddCostMetrics(ImmutableDictionary.Empty, costMetrics); - - return new OperationResult( - data: null, - errors: null, - extensions: extensions, - contextData: s_ok, - items: null, - incremental: null, - label: null, - path: null, - hasNext: null, - cleanupTasks: ([], 0), - isDataSet: false, - requestIndex: null, - variableIndex: null, - skipValidation: true); + return new OperationResult(extensions: extensions) { ContextData = s_ok }; } public static IExecutionResult AddCostMetrics( @@ -78,17 +56,14 @@ public static IExecutionResult AddCostMetrics( return AddCostMetrics(r, costMetrics); case OperationResultBatch r: - var results = new IExecutionResult[r.Results.Count]; - IImmutableDictionary? costMetricsMap = null; - - for (var i = 0; i < r.Results.Count; i++) + ImmutableOrderedDictionary? costMetricsMap = null; + foreach (var current in r.Results) { - switch (r.Results[i]) + switch (current) { case OperationResult operationResult: costMetricsMap ??= CreateCostMetricsMap(costMetrics); - results[i] = operationResult.WithExtensions( - AddCostMetrics(operationResult.Extensions, costMetricsMap)); + operationResult.Extensions = AddCostMetrics(operationResult.Extensions, costMetricsMap); break; case ResponseStream responseStream: @@ -99,7 +74,7 @@ public static IExecutionResult AddCostMetrics( } } - return new OperationResultBatch(results); + return r; default: throw new NotSupportedException(); @@ -111,7 +86,8 @@ private static OperationResult AddCostMetrics( CostMetrics costMetrics) { var extensions = AddCostMetrics(operationResult.Extensions, costMetrics); - return operationResult.WithExtensions(extensions); + operationResult.Extensions = extensions; + return operationResult; } private static ResponseStream AddCostMetrics( @@ -120,47 +96,42 @@ private static ResponseStream AddCostMetrics( { var onFirstResult = responseStream.OnFirstResult; - if (onFirstResult.Count == 0) + if (onFirstResult.IsEmpty) { onFirstResult = - ImmutableArray.Create>( - result => result is OperationResult operationResult - ? operationResult.WithExtensions(AddCostMetrics(operationResult.Extensions, costMetrics)) - : result); - - return responseStream.WithOnFirstResult(onFirstResult); + ImmutableList.Create>( + result => + { + result.Extensions = AddCostMetrics(result.Extensions, costMetrics); + return result; + }); } - - if (onFirstResult is ImmutableArray> immutable) + else { - onFirstResult = immutable.Add( - result => result is OperationResult operationResult - ? operationResult.WithExtensions(AddCostMetrics(operationResult.Extensions, costMetrics)) - : result); - - return responseStream.WithOnFirstResult(onFirstResult); + onFirstResult = + onFirstResult.Add( + result => + { + result.Extensions = AddCostMetrics(result.Extensions, costMetrics); + return result; + }); } - var builder = ImmutableArray.CreateBuilder>(); - builder.AddRange(onFirstResult); - builder.Add( - result => result is OperationResult operationResult - ? operationResult.WithExtensions(AddCostMetrics(operationResult.Extensions, costMetrics)) - : result); - return responseStream.WithOnFirstResult(builder.ToImmutable()); + responseStream.OnFirstResult = onFirstResult; + return responseStream; } - private static IReadOnlyDictionary AddCostMetrics( - IReadOnlyDictionary? extensions, + private static ImmutableDictionary AddCostMetrics( + ImmutableDictionary? extensions, CostMetrics costMetrics) { var costMetricsMap = CreateCostMetricsMap(costMetrics); return AddCostMetrics(extensions, costMetricsMap); } - private static IReadOnlyDictionary AddCostMetrics( - IReadOnlyDictionary? extensions, - IImmutableDictionary costMetrics) + private static ImmutableDictionary AddCostMetrics( + ImmutableDictionary? extensions, + ImmutableOrderedDictionary costMetrics) { const string costKey = "operationCost"; @@ -169,28 +140,20 @@ private static ResponseStream AddCostMetrics( return ImmutableDictionary.Empty.Add(costKey, costMetrics); } - if (extensions is ImmutableDictionary immutable) - { - return immutable.Add(costKey, costMetrics); - } - - var builder = ImmutableDictionary.CreateBuilder(); - builder.AddRange(extensions); - builder.Add(costKey, costMetrics); - return builder.ToImmutable(); + return extensions.Add(costKey, costMetrics); } - private static IImmutableDictionary CreateCostMetricsMap( + private static ImmutableOrderedDictionary CreateCostMetricsMap( CostMetrics costMetrics) { - var builder = ImmutableSortedDictionary.CreateBuilder(StringComparer.Ordinal); + var builder = ImmutableOrderedDictionary.CreateBuilder(); builder.Add("fieldCost", costMetrics.FieldCost); builder.Add("typeCost", costMetrics.TypeCost); return builder.ToImmutable(); } - public static IOperationResult StateInvalidForCostAnalysis() => - OperationResultBuilder.CreateError( + public static OperationResult StateInvalidForCostAnalysis() + => OperationResult.FromError( ErrorBuilder.New() .SetMessage("The query request contains no document or no document id.") .SetCode(ErrorCodes.Execution.OperationDocumentNotFound) diff --git a/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/SortVisitorTestBase.cs b/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/SortVisitorTestBase.cs index 1b0a08a2282..3d1f24d93bf 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/SortVisitorTestBase.cs +++ b/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/SortVisitorTestBase.cs @@ -74,11 +74,8 @@ protected IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("sql", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("sql", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("sql", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs index 988c5231a84..3db175520fb 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs @@ -344,7 +344,7 @@ public virtual void EnrichExecuteRequest(RequestContext context, Activity activi activity.SetTag("graphql.document.body", documentInfo.Document.Print()); } - if (context.Result is IOperationResult result) + if (context.Result is OperationResult result) { var errorCount = result.Errors?.Count ?? 0; activity.SetTag("graphql.errors.count", errorCount); diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/Listeners/ActivityServerDiagnosticListener.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/Listeners/ActivityServerDiagnosticListener.cs index 36f60d17378..7f803428364 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/Listeners/ActivityServerDiagnosticListener.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/Listeners/ActivityServerDiagnosticListener.cs @@ -134,7 +134,7 @@ public override void ParserErrors(HttpContext context, IReadOnlyList err } } - public override IDisposable FormatHttpResponse(HttpContext context, IOperationResult result) + public override IDisposable FormatHttpResponse(HttpContext context, OperationResult result) { if (_options.SkipFormatHttpResponse) { @@ -154,8 +154,4 @@ public override IDisposable FormatHttpResponse(HttpContext context, IOperationRe return activity; } - - // removed for 12.5 public override IDisposable WebSocketSession(HttpContext context) - // removed for 12.5public override void WebSocketSessionError( - // HttpContext context, Exception exception) } diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/Scopes/ExecuteOperationScope.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/Scopes/ExecuteOperationScope.cs index 35f0faa5890..2c7915ad6d0 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/Scopes/ExecuteOperationScope.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/Scopes/ExecuteOperationScope.cs @@ -19,7 +19,7 @@ protected override void EnrichActivity() protected override void SetStatus() { - if (Context.Result is null or IOperationResult { Errors: [_, ..] }) + if (Context.Result is null or OperationResult { Errors: [_, ..] }) { Activity.SetStatus(Status.Error); Activity.SetStatus(ActivityStatusCode.Error); diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/Scopes/ExecuteRequestScope.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/Scopes/ExecuteRequestScope.cs index b91757f61c7..32c4affad3f 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/Scopes/ExecuteRequestScope.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/Scopes/ExecuteRequestScope.cs @@ -19,7 +19,7 @@ protected override void EnrichActivity() protected override void SetStatus() { - if (Context.Result is null or IOperationResult { Errors: [_, ..] }) + if (Context.Result is null or OperationResult { Errors: [_, ..] }) { Activity.SetStatus(Status.Error); Activity.SetStatus(ActivityStatusCode.Error); diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Projections.Tests/ProjectionVisitorTestBase.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Projections.Tests/ProjectionVisitorTestBase.cs index 9b89e976fdd..e7896ad2ad3 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Projections.Tests/ProjectionVisitorTestBase.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Projections.Tests/ProjectionVisitorTestBase.cs @@ -17,8 +17,8 @@ private Func> BuildResolver( mongoResource.CreateCollection("data_" + Guid.NewGuid().ToString("N")); collection.InsertMany(results); - - return ctx => collection.AsExecutable(); + + return _ => collection.AsExecutable(); } protected T[] CreateEntity(params T[] entities) => entities; @@ -64,11 +64,8 @@ public IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .ModifyRequestOptions(x => x.IncludeExceptionDetails = true) diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/SortVisitorTestBase.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/SortVisitorTestBase.cs index e45da8c26bf..30c5a572c0e 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/SortVisitorTestBase.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/SortVisitorTestBase.cs @@ -57,11 +57,8 @@ protected IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs index fc43d72714e..11e810b9198 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs @@ -37,12 +37,9 @@ await storage.SaveAsync( { await n(c); - if (c.IsPersistedOperationDocument() && c.Result is IOperationResult r) + if (c.IsPersistedOperationDocument() && c.Result is OperationResult result) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + result.ContextData = result.ContextData.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs index 522db01b12c..3e3054ce0e4 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs @@ -27,12 +27,9 @@ public async Task ExecutePersistedOperation() { await n(c); - if (c.IsPersistedOperationDocument() && c.Result is IOperationResult r) + if (c.IsPersistedOperationDocument() && c.Result is OperationResult result) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + result.ContextData = result.ContextData.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() @@ -65,12 +62,9 @@ public async Task ExecutePersistedOperation_NotFound() { await n(c); - if (c.IsPersistedOperationDocument() && c.Result is IOperationResult r) + if (c.IsPersistedOperationDocument() && c.Result is OperationResult result) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + result.ContextData = result.ContextData.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() @@ -100,12 +94,9 @@ public async Task ExecuteAutomaticPersistedOperation() { await n(c); - if (c.IsPersistedOperationDocument() && c.Result is IOperationResult r) + if (c.IsPersistedOperationDocument() && c.Result is OperationResult result) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + result.ContextData = result.ContextData.SetItem("persistedDocument", true); } }) .UseAutomaticPersistedOperationPipeline() diff --git a/src/HotChocolate/Spatial/test/Data.Projections.SqlServer.Tests/FilterVisitorTestBase.cs b/src/HotChocolate/Spatial/test/Data.Projections.SqlServer.Tests/FilterVisitorTestBase.cs index a07847b7d07..d1ed266dcb8 100644 --- a/src/HotChocolate/Spatial/test/Data.Projections.SqlServer.Tests/FilterVisitorTestBase.cs +++ b/src/HotChocolate/Spatial/test/Data.Projections.SqlServer.Tests/FilterVisitorTestBase.cs @@ -28,7 +28,7 @@ private async Task>> BuildResolverAsync await dbContext.SaveChangesAsync(); } - return ctx => dbContext.Data.AsQueryable(); + return _ => dbContext.Data.AsQueryable(); } protected async Task CreateSchemaAsync( @@ -72,11 +72,8 @@ protected async Task CreateSchemaAsync( if (context.ContextData.TryGetValue("sql", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("sql", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("sql", queryString); } }) .UseDefaultPipeline() diff --git a/src/StrawberryShake/Client/src/Transport.InMemory/InMemoryConnection.cs b/src/StrawberryShake/Client/src/Transport.InMemory/InMemoryConnection.cs index 04ad6d5d0ba..9f664c9094f 100644 --- a/src/StrawberryShake/Client/src/Transport.InMemory/InMemoryConnection.cs +++ b/src/StrawberryShake/Client/src/Transport.InMemory/InMemoryConnection.cs @@ -12,41 +12,32 @@ public class InMemoryConnection : IInMemoryConnection { private readonly Func> _createClientAsync; - public InMemoryConnection( - Func> createClientAsync) + public InMemoryConnection(Func> createClientAsync) { - _createClientAsync = createClientAsync ?? - throw new ArgumentNullException(nameof(createClientAsync)); + ArgumentNullException.ThrowIfNull(createClientAsync); + _createClientAsync = createClientAsync; } public IAsyncEnumerable> ExecuteAsync( OperationRequest request) => new ResponseStream(_createClientAsync, request); - private sealed class ResponseStream : IAsyncEnumerable> + private sealed class ResponseStream( + Func> createClient, + OperationRequest request) + : IAsyncEnumerable> { - private readonly Func> _createClientAsync; - private readonly OperationRequest _request; - - public ResponseStream( - Func> createClientAsync, - OperationRequest request) - { - _createClientAsync = createClientAsync; - _request = request; - } - public async IAsyncEnumerator> GetAsyncEnumerator( CancellationToken cancellationToken = default) { - var client = await _createClientAsync(cancellationToken); + var client = await createClient(cancellationToken); Exception? exception = null; IExecutionResult? result = null; try { - result = await client.ExecuteAsync(_request, cancellationToken); + result = await client.ExecuteAsync(request, cancellationToken); } catch (Exception ex) { @@ -78,7 +69,7 @@ private async IAsyncEnumerable> ProcessResultAsync( switch (executionResult) { - case HotChocolate.Execution.IOperationResult queryResult: + case OperationResult queryResult: queryResult.WriteTo(writer); yield return new Response(Parse(writer.GetWrittenMemory()), null); break; From f7d6975bf7d972cd132edf72f739b4a51739a1e2 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 16 Dec 2025 21:19:57 +0100 Subject: [PATCH 037/144] wip --- .../AnnotationBased/CertificationTests.cs | 26 ++++++++------ .../CodeFirst/CertificationTests.cs | 12 ++++--- .../ExecutionOperationResultExtensions.cs | 32 +++++++++++++++++ .../Extensions/ExecutionSchemaExtensions.cs | 1 - .../DateTimeZoneTypeTests.cs | 26 +++++++------- ...rationTypeJsonRoundtripIntegrationTests.cs | 36 +++++++++---------- .../Types.NodaTime.Tests/DurationTypeTests.cs | 28 +++++++-------- ...stantTypeDateTimeOffsetIntegrationTests.cs | 10 +++--- .../InstantTypeGeneralIntegrationTests.cs | 6 ++-- .../Types.NodaTime.Tests/InstantTypeTests.cs | 6 ++-- .../IsoDayOfWeekTypeTests.cs | 10 +++--- ...teTimeTypeFullRoundtripIntegrationTests.cs | 6 ++-- ...lDateTimeTypeGeneralIsoIntegrationTests.cs | 6 ++-- .../LocalDateTimeTypeTests.cs | 6 ++-- ...alDateTypeFullRoundtripIntegrationTests.cs | 6 ++-- .../LocalDateTypeTests.cs | 6 ++-- ...LocalTimeTypeGeneralIsoIntegrationTests.cs | 6 ++-- .../LocalTimeTypeIntegrationTests.cs | 10 +++--- ...setDateTimeTypeExtendedIntegrationTests.cs | 12 +++---- ...fsetDateTimeTypeGeneralIntegrationTests.cs | 12 +++---- ...fsetDateTimeTypeRfc3339IntegrationTests.cs | 12 +++---- .../OffsetDateTimeTypeTests.cs | 12 +++---- ...etDateTypeFullRoundtripIntegrationTests.cs | 12 +++---- .../OffsetDateTypeTests.cs | 12 +++---- .../OffsetTimeTypeExtendedIntegrationTests.cs | 12 +++---- .../OffsetTimeTypeRfc3339IntegrationTests.cs | 12 +++---- .../OffsetTimeTypeTests.cs | 12 +++---- ...eneralInvariantWithoutZIntegrationTests.cs | 16 ++++----- .../Types.NodaTime.Tests/OffsetTypeTests.cs | 16 ++++----- ...eriodTypeNormalizingIsoIntegrationTests.cs | 6 ++-- .../Types.NodaTime.Tests/PeriodTypeTests.cs | 6 ++-- ...ZonedDateTimeTypeCustomIntegrationTests.cs | 12 +++---- .../ZonedDateTimeTypeTests.cs | 12 +++---- .../Core/test/Utilities/SnapshotExtensions.cs | 2 +- .../Core/test/Utilities/TestHelper.cs | 2 +- .../FilterVisitorTestBase.cs | 7 ++-- 36 files changed, 230 insertions(+), 196 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionOperationResultExtensions.cs diff --git a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/AnnotationBased/CertificationTests.cs b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/AnnotationBased/CertificationTests.cs index daec97a0ca5..1c778cfceb2 100644 --- a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/AnnotationBased/CertificationTests.cs +++ b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/AnnotationBased/CertificationTests.cs @@ -1,5 +1,4 @@ using HotChocolate.Execution; -using HotChocolate.Execution.Processing; using HotChocolate.Language; namespace HotChocolate.ApolloFederation.CertificationSchema.AnnotationBased; @@ -21,19 +20,22 @@ public async Task Subgraph_SDL() // act var result = await executor.ExecuteAsync( - @"{ + """ + { _service { sdl } - }"); + } + """); // assert - Assert.IsType( - Assert.IsType( - Assert.IsType(result).Data) - .GetValueOrDefault("_service")) - .GetValueOrDefault("sdl") - .MatchSnapshot(); + result + .ExpectOperationResult() + .UnwrapData() + .GetProperty("_service") + .GetProperty("sdl") + .GetString() + .MatchSnapshot(); } [Fact] @@ -44,13 +46,15 @@ public async Task Product_By_Id() // act var result = await executor.ExecuteAsync( - @"query ($representations: [_Any!]!) { + """ + query ($representations: [_Any!]!) { _entities(representations: $representations) { ... on Product { sku } } - }", + } + """, new Dictionary { ["representations"] = new List diff --git a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/CodeFirst/CertificationTests.cs b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/CodeFirst/CertificationTests.cs index 5eabd160994..2ec9e488dc2 100644 --- a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/CodeFirst/CertificationTests.cs +++ b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/CodeFirst/CertificationTests.cs @@ -1,5 +1,4 @@ using HotChocolate.Execution; -using HotChocolate.Execution.Processing; using HotChocolate.Language; namespace HotChocolate.ApolloFederation.CertificationSchema.CodeFirst; @@ -30,10 +29,13 @@ public async Task Subgraph_SDL() """); // assert - var queryResult = Assert.IsType(result); - var data = Assert.IsType(queryResult.Data); - var service = Assert.IsType(data.GetValueOrDefault("_service")); - service.GetValueOrDefault("sdl").MatchSnapshot(); + result + .ExpectOperationResult() + .UnwrapData() + .GetProperty("_service") + .GetProperty("sdl") + .GetString() + .MatchSnapshot(); } [Fact] diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionOperationResultExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionOperationResultExtensions.cs new file mode 100644 index 00000000000..54d3b2e774d --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionOperationResultExtensions.cs @@ -0,0 +1,32 @@ +using HotChocolate.Text.Json; + +namespace HotChocolate.Execution; + +/// +/// Provides extension methods for . +/// +public static class ExecutionOperationResultExtensions +{ + extension(OperationResult result) + { + /// + /// Unwraps the data from the operation result and returns the underlying . + /// + /// + /// The containing the operation result data. + /// + /// + /// Thrown when the data object is not of type . + /// + public ResultElement UnwrapData() + { + if (result.Data is not ResultDocument resultDocument) + { + throw new InvalidOperationException( + "Unexpected data object type."); + } + + return resultDocument.Data; + } + } +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionSchemaExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionSchemaExtensions.cs index 65d04b09b9e..16de45eeaae 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionSchemaExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionSchemaExtensions.cs @@ -1,6 +1,5 @@ using HotChocolate.Execution; using HotChocolate.Execution.Options; -using Microsoft.Extensions.DependencyInjection; // ReSharper disable once CheckNamespace namespace HotChocolate; diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DateTimeZoneTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/DateTimeZoneTypeTests.cs index 4c5cf1802af..63ca2190d94 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DateTimeZoneTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/DateTimeZoneTypeTests.cs @@ -34,21 +34,21 @@ public string Test(DateTimeZone arg) public void QueryReturnsUtc() { var result = _testExecutor.Execute("query { test: utc }"); - Assert.Equal("UTC", Assert.IsType(result).Data!["test"]); + Assert.Equal("UTC", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsRome() { var result = _testExecutor.Execute("query { test: rome }"); - Assert.Equal("Europe/Rome", Assert.IsType(result).Data!["test"]); + Assert.Equal("Europe/Rome", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsChihuahua() { var result = _testExecutor.Execute("query { test: chihuahua }"); - Assert.Equal("America/Chihuahua", Assert.IsType(result).Data!["test"]); + Assert.Equal("America/Chihuahua", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -59,19 +59,19 @@ public void ParsesVariable() .SetDocument("mutation($arg: DateTimeZone!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "Europe/Amsterdam" } }) .Build()); - Assert.Equal("Europe/Amsterdam", Assert.IsType(result).Data!["test"]); + Assert.Equal("Europe/Amsterdam", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] - public void DoesntParseIncorrectVariable() + public void DoesNotParseIncorrectVariable() { var result = _testExecutor .Execute(OperationRequestBuilder.New() .SetDocument("mutation($arg: DateTimeZone!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "Europe/Hamster" } }) .Build()); - Assert.Null(Assert.IsType(result).Data); - Assert.Single(Assert.IsType(result).Errors!); + Assert.True(result.ExpectOperationResult().IsDataNull); + Assert.Single(result.ExpectOperationResult().Errors!); } [Fact] @@ -81,21 +81,21 @@ public void ParsesLiteral() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"Europe/Amsterdam\") }") .Build()); - Assert.Equal("Europe/Amsterdam", Assert.IsType(result).Data!["test"]); + Assert.Equal("Europe/Amsterdam", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] - public void DoesntParseIncorrectLiteral() + public void DoesNotParseIncorrectLiteral() { var result = _testExecutor .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"Europe/Hamster\") }") .Build()); - Assert.Null(Assert.IsType(result).Data); - Assert.Single(Assert.IsType(result).Errors!); - Assert.Null(Assert.IsType(result).Errors!.First().Code); + Assert.Null(result.ExpectOperationResult().Data); + Assert.Single(result.ExpectOperationResult().Errors!); + Assert.Null(result.ExpectOperationResult().Errors![0].Code); Assert.Equal( "Unable to deserialize string to DateTimeZone", - Assert.IsType(result).Errors!.First().Message); + result.ExpectOperationResult().Errors![0].Message); } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeJsonRoundtripIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeJsonRoundtripIntegrationTests.cs index 9e08d1e8a50..93f1e5b7123 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeJsonRoundtripIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeJsonRoundtripIntegrationTests.cs @@ -48,42 +48,42 @@ public Duration Test(Duration arg) public void QueryReturnsSerializedDataWithDecimals() { var result = _testExecutor.Execute("query { test: positiveWithDecimals }"); - Assert.Equal("2959:53:10.019", Assert.IsType(result).Data!["test"]); + Assert.Equal("2959:53:10.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsSerializedDataWithNegativeValue() { var result = _testExecutor.Execute("query { test: negativeWithDecimals }"); - Assert.Equal("-2959:53:10.019", Assert.IsType(result).Data!["test"]); + Assert.Equal("-2959:53:10.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsSerializedDataWithoutDecimals() { var result = _testExecutor.Execute("query { test: positiveWithoutDecimals }"); - Assert.Equal("2959:53:10", Assert.IsType(result).Data!["test"]); + Assert.Equal("2959:53:10", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsSerializedDataWithoutSeconds() { var result = _testExecutor.Execute("query { test: positiveWithoutSeconds }"); - Assert.Equal("2959:53:00", Assert.IsType(result).Data!["test"]); + Assert.Equal("2959:53:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsSerializedDataWithoutMinutes() { var result = _testExecutor.Execute("query { test: positiveWithoutMinutes }"); - Assert.Equal("2959:00:00", Assert.IsType(result).Data!["test"]); + Assert.Equal("2959:00:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsSerializedDataWithRoundtrip() { var result = _testExecutor.Execute("query { test: positiveWithRoundtrip }"); - Assert.Equal("2978:01:10", Assert.IsType(result).Data!["test"]); + Assert.Equal("2978:01:10", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -94,7 +94,7 @@ public void MutationParsesInputWithDecimals() .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "238:01:00.019" } }) .Build()); - Assert.Equal("238:11:00.019", Assert.IsType(result).Data!["test"]); + Assert.Equal("238:11:00.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -105,7 +105,7 @@ public void MutationParsesInputWithoutDecimals() .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "238:01:00" } }) .Build()); - Assert.Equal("238:11:00", Assert.IsType(result).Data!["test"]); + Assert.Equal("238:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -116,7 +116,7 @@ public void MutationParsesInputWithoutLeadingZero() .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "238:01:00" } }) .Build()); - Assert.Equal("238:11:00", Assert.IsType(result).Data!["test"]); + Assert.Equal("238:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -127,7 +127,7 @@ public void MutationParsesInputWithNegativeValue() .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "-238:01:00" } }) .Build()); - Assert.Equal("-237:51:00", Assert.IsType(result).Data!["test"]); + Assert.Equal("-237:51:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -138,8 +138,8 @@ public void MutationDoesntParseInputWithPlusSign() .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "+09:22:01:00" } }) .Build()); - Assert.Null(Assert.IsType(result).Data); - Assert.Single(Assert.IsType(result).Errors!); + Assert.Null(result.ExpectOperationResult().Data); + Assert.Single(result.ExpectOperationResult().Errors!); } [Fact] @@ -149,7 +149,7 @@ public void MutationParsesLiteralWithDecimals() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"238:01:00.019\") }") .Build()); - Assert.Equal("238:11:00.019", Assert.IsType(result).Data!["test"]); + Assert.Equal("238:11:00.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -159,7 +159,7 @@ public void MutationParsesLiteralWithoutDecimals() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"238:01:00\") }") .Build()); - Assert.Equal("238:11:00", Assert.IsType(result).Data!["test"]); + Assert.Equal("238:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -169,7 +169,7 @@ public void MutationParsesLiteralWithoutLeadingZero() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"238:01:00\") }") .Build()); - Assert.Equal("238:11:00", Assert.IsType(result).Data!["test"]); + Assert.Equal("238:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -179,7 +179,7 @@ public void MutationParsesLiteralWithNegativeValue() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"-238:01:00\") }") .Build()); - Assert.Equal("-237:51:00", Assert.IsType(result).Data!["test"]); + Assert.Equal("-237:51:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -189,7 +189,7 @@ public void MutationDoesntParseLiteralWithPlusSign() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"+238:01:00\") }") .Build()); - Assert.Null(Assert.IsType(result).Data); - Assert.Single(Assert.IsType(result).Errors!); + Assert.Null(result.ExpectOperationResult().Data); + Assert.Single(result.ExpectOperationResult().Errors!); } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeTests.cs index c03b5c21d77..da5e4049842 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeTests.cs @@ -43,42 +43,42 @@ public Duration Test(Duration arg) public void QueryReturnsSerializedDataWithDecimals() { var result = _testExecutor.Execute("query { test: positiveWithDecimals }"); - Assert.Equal("123:07:53:10.019", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("123:07:53:10.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsSerializedDataWithNegativeValue() { var result = _testExecutor.Execute("query{test: negativeWithDecimals}"); - Assert.Equal("-123:07:53:10.019", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("-123:07:53:10.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsSerializedDataWithoutDecimals() { var result = _testExecutor.Execute("query{test: positiveWithoutDecimals}"); - Assert.Equal("123:07:53:10", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("123:07:53:10", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsSerializedDataWithoutSeconds() { var result = _testExecutor.Execute("query{test:positiveWithoutSeconds}"); - Assert.Equal("123:07:53:00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("123:07:53:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsSerializedDataWithoutMinutes() { var result = _testExecutor.Execute("query{test:positiveWithoutMinutes}"); - Assert.Equal("123:07:00:00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("123:07:00:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsSerializedDataWithRoundtrip() { var result = _testExecutor.Execute("query{test:positiveWithRoundtrip}"); - Assert.Equal("124:02:01:10", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("124:02:01:10", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -89,7 +89,7 @@ public void MutationParsesInputWithDecimals() .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "09:22:01:00.019" } }) .Build()); - Assert.Equal("9:22:11:00.019", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("9:22:11:00.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -100,7 +100,7 @@ public void MutationParsesInputWithoutDecimals() .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "09:22:01:00" } }) .Build()); - Assert.Equal("9:22:11:00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("9:22:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -111,7 +111,7 @@ public void MutationParsesInputWithoutLeadingZero() .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "9:22:01:00" } }) .Build()); - Assert.Equal("9:22:11:00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("9:22:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -122,7 +122,7 @@ public void MutationParsesInputWithNegativeValue() .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "-9:22:01:00" } }) .Build()); - Assert.Equal("-9:21:51:00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("-9:21:51:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -157,7 +157,7 @@ public void MutationParsesLiteralWithDecimals() .SetDocument("mutation { test(arg: \"09:22:01:00.019\") }") .Build()); - Assert.Equal("9:22:11:00.019", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("9:22:11:00.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -168,7 +168,7 @@ public void MutationParsesLiteralWithoutDecimals() .SetDocument("mutation { test(arg: \"09:22:01:00\") }") .Build()); - Assert.Equal("9:22:11:00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("9:22:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -179,7 +179,7 @@ public void MutationParsesLiteralWithoutLeadingZero() .SetDocument("mutation { test(arg: \"09:22:01:00\") }") .Build()); - Assert.Equal("9:22:11:00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("9:22:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -190,7 +190,7 @@ public void MutationParsesLiteralWithNegativeValue() .SetDocument("mutation { test(arg: \"-9:22:01:00\") }") .Build()); - Assert.Equal("-9:21:51:00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("-9:21:51:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeDateTimeOffsetIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeDateTimeOffsetIntegrationTests.cs index a611ec5d8dd..dc31f468026 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeDateTimeOffsetIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeDateTimeOffsetIntegrationTests.cs @@ -50,7 +50,7 @@ public void QueryReturnsUtc() Assert.Equal( "2020-02-20T17:42:59.000001234Z", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -64,7 +64,7 @@ public void ParsesVariable() Assert.Equal( "2020-02-21T17:52:59.000001234Z", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -76,7 +76,7 @@ public void DoesParseAnIncorrectExtendedVariableAsDateTimeOffset() .SetVariableValues(new Dictionary { { "arg", "2020-02-20T17:42:59" } }) .Build()); - Assert.Equal("2020-02-20T17:52:59Z", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-20T17:52:59Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -89,7 +89,7 @@ public void ParsesLiteral() Assert.Equal( "2020-02-20T17:52:59.000001234Z", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -100,6 +100,6 @@ public void DoesParseIncorrectExtendedLiteralAsDateTimeOffset() .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59\") }") .Build()); - Assert.Equal("2020-02-20T17:52:59Z", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-20T17:52:59Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeGeneralIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeGeneralIntegrationTests.cs index 4f5c46bb632..1d042285f01 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeGeneralIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeGeneralIntegrationTests.cs @@ -19,7 +19,7 @@ public void QueryReturnsUtc() { var result = _testExecutor.Execute("query { test: one }"); - Assert.Equal("2020-02-20T17:42:59Z", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-20T17:42:59Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -31,7 +31,7 @@ public void ParsesVariable() .SetVariableValues(new Dictionary { { "arg", "2020-02-21T17:42:59Z" } }) .Build()); - Assert.Equal("2020-02-21T17:52:59Z", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-21T17:52:59Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -55,7 +55,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59Z\") }") .Build()); - Assert.Equal("2020-02-20T17:52:59Z", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-20T17:52:59Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeTests.cs index 7a44df83b48..30b4cde9a5f 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeTests.cs @@ -38,7 +38,7 @@ public void QueryReturnsUtc() Assert.Equal( "2020-02-20T17:42:59.000001234Z", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -52,7 +52,7 @@ public void ParsesVariable() Assert.Equal( "2020-02-21T17:52:59.000001234Z", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -78,7 +78,7 @@ public void ParsesLiteral() Assert.Equal( "2020-02-20T17:52:59.000001234Z", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/IsoDayOfWeekTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/IsoDayOfWeekTypeTests.cs index add8ef39acb..0fc3454402f 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/IsoDayOfWeekTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/IsoDayOfWeekTypeTests.cs @@ -39,7 +39,7 @@ public void QueryReturnsMonday() { var result = _testExecutor.Execute("query { test: monday }"); - Assert.Equal(1, result.ExpectOperationResult().Data!["test"]); + Assert.Equal(1, result.ExpectOperationResult().UnwrapData().GetProperty("test").GetInt32()); } [Fact] @@ -47,7 +47,7 @@ public void QueryReturnsSunday() { var result = _testExecutor.Execute("query { test: sunday }"); - Assert.Equal(7, result.ExpectOperationResult().Data!["test"]); + Assert.Equal(7, result.ExpectOperationResult().UnwrapData().GetProperty("test").GetInt32()); } [Fact] @@ -55,7 +55,7 @@ public void QueryReturnsFriday() { var result = _testExecutor.Execute("query { test: friday }"); - Assert.Equal(5, result.ExpectOperationResult().Data!["test"]); + Assert.Equal(5, result.ExpectOperationResult().UnwrapData().GetProperty("test").GetInt32()); } [Fact] @@ -76,7 +76,7 @@ public void MutationParsesMonday() .SetVariableValues(new Dictionary { { "arg", 1 } }) .Build()); - Assert.Equal(2, result.ExpectOperationResult().Data!["test"]); + Assert.Equal(2, result.ExpectOperationResult().UnwrapData().GetProperty("test").GetInt32()); } [Fact] @@ -88,7 +88,7 @@ public void MutationParsesSunday() .SetVariableValues(new Dictionary { { "arg", 7 } }) .Build()); - Assert.Equal(1, result.ExpectOperationResult().Data!["test"]); + Assert.Equal(1, result.ExpectOperationResult().UnwrapData().GetProperty("test").GetInt32()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeFullRoundtripIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeFullRoundtripIntegrationTests.cs index c38887f62e2..f0df5838368 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeFullRoundtripIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeFullRoundtripIntegrationTests.cs @@ -21,7 +21,7 @@ public void QueryReturns() Assert.Equal( "2020-02-07T17:42:59.000001234 (Julian)", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -35,7 +35,7 @@ public void ParsesVariable() Assert.Equal( "2020-02-21T17:52:59.000001234 (Julian)", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -61,7 +61,7 @@ public void ParsesLiteral() Assert.Equal( "2020-02-20T17:52:59.000001234 (Julian)", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeGeneralIsoIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeGeneralIsoIntegrationTests.cs index b8b783cd6a0..3e3b84dd1ef 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeGeneralIsoIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeGeneralIsoIntegrationTests.cs @@ -19,7 +19,7 @@ public void QueryReturns() { var result = _testExecutor.Execute("query { test: one }"); - Assert.Equal("2020-02-07T17:42:59", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-07T17:42:59", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -31,7 +31,7 @@ public void ParsesVariable() .SetVariableValues(new Dictionary { { "arg", "2020-02-21T17:42:59" } }) .Build()); - Assert.Equal("2020-02-21T17:52:59", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-21T17:52:59", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -55,7 +55,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59\") }") .Build()); - Assert.Equal("2020-02-20T17:52:59", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-20T17:52:59", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeTests.cs index b13cf4b6d44..e1850cce4a4 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeTests.cs @@ -40,7 +40,7 @@ public void QueryReturns() { var result = _testExecutor.Execute("query { test: one }"); - Assert.Equal("2020-02-07T17:42:59.000001234", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-07T17:42:59.000001234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -54,7 +54,7 @@ public void ParsesVariable() new Dictionary { { "arg", "2020-02-21T17:42:59.000001234" } }) .Build()); - Assert.Equal("2020-02-21T17:52:59.000001234", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-21T17:52:59.000001234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -81,7 +81,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59.000001234\") }") .Build()); - Assert.Equal("2020-02-20T17:52:59.000001234", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-20T17:52:59.000001234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeFullRoundtripIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeFullRoundtripIntegrationTests.cs index 3a3fae2d2e6..754c7ff4adb 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeFullRoundtripIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeFullRoundtripIntegrationTests.cs @@ -19,7 +19,7 @@ public void QueryReturns() { var result = _testExecutor.Execute("query { test: one }"); - Assert.Equal("5780-05-25 (Hebrew Civil)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("5780-05-25 (Hebrew Civil)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -32,7 +32,7 @@ public void ParsesVariable() .SetVariableValues(new Dictionary { { "arg", "2020-02-21 (Hebrew Civil)" } }) .Build()); - Assert.Equal("2020-02-24 (Hebrew Civil)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-24 (Hebrew Civil)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -59,7 +59,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"2020-02-20 (Hebrew Civil)\") }") .Build()); - Assert.Equal("2020-02-23 (Hebrew Civil)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-23 (Hebrew Civil)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeTests.cs index 180d6345b0f..1872c9c08c6 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeTests.cs @@ -38,7 +38,7 @@ public void QueryReturns() { var result = _testExecutor.Execute("query { test: one }"); - Assert.Equal("5780-05-25", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("5780-05-25", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -50,7 +50,7 @@ public void ParsesVariable() .SetVariableValues(new Dictionary { { "arg", "2020-02-21" } }) .Build()); - Assert.Equal("2020-02-24", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-24", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -74,7 +74,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"2020-02-20\") }") .Build()); - Assert.Equal("2020-02-23", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-02-23", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeGeneralIsoIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeGeneralIsoIntegrationTests.cs index a887a63bd31..e8258154470 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeGeneralIsoIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeGeneralIsoIntegrationTests.cs @@ -19,7 +19,7 @@ public void QueryReturns() { var result = _testExecutor.Execute("query { test: one }"); - Assert.Equal("12:42:13", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("12:42:13", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -31,7 +31,7 @@ public void ParsesVariable() .SetVariableValues(new Dictionary { { "arg", "12:42:13" } }) .Build()); - Assert.Equal("12:52:13", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("12:52:13", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -55,7 +55,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"12:42:13\") }") .Build()); - Assert.Equal("12:52:13", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("12:52:13", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeIntegrationTests.cs index 6bae387e8b0..7a4c395966a 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeIntegrationTests.cs @@ -39,7 +39,7 @@ public void QueryReturns() { var result = _testExecutor.Execute("query { test: one }"); - Assert.Equal("12:42:13.031011234", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("12:42:13.031011234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -52,7 +52,7 @@ public void ParsesVariable() .SetVariableValues(new Dictionary { { "arg", "12:42:13.031011234" } }) .Build()); - Assert.Equal("12:52:13.031011234", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("12:52:13.031011234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -65,7 +65,7 @@ public void ParsesVariableWithoutTicks() .SetVariableValues(new Dictionary { { "arg", "12:42:13" } }) .Build()); - Assert.Equal("12:52:13", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("12:52:13", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -91,7 +91,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"12:42:13.031011234\") }") .Build()); - Assert.Equal("12:52:13.031011234", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("12:52:13.031011234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -103,7 +103,7 @@ public void ParsesLiteralWithoutTick() .SetDocument("mutation { test(arg: \"12:42:13\") }") .Build()); - Assert.Equal("12:52:13", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("12:52:13", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeExtendedIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeExtendedIntegrationTests.cs index 03e5e863c40..ac2d1323f9c 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeExtendedIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeExtendedIntegrationTests.cs @@ -19,7 +19,7 @@ public void QueryReturns() { var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("2020-12-31T18:30:13.000001234+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:30:13.000001234+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -27,7 +27,7 @@ public void QueryReturnsWithMinutes() { var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("2020-12-31T18:30:13.000001234+02:30", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:30:13.000001234+02:30", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -40,7 +40,7 @@ public void ParsesVariable() .SetVariableValues(new Dictionary { { "arg", "2020-12-31T18:30:13+02" } }) .Build()); - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -53,7 +53,7 @@ public void ParsesVariableWithMinutes() .SetVariableValues(new Dictionary { { "arg", "2020-12-31T18:30:13+02:35" } }) .Build()); - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -79,7 +79,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02\") }") .Build()); - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -91,7 +91,7 @@ public void ParsesLiteralWithMinutes() .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02:35\") }") .Build()); - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeGeneralIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeGeneralIntegrationTests.cs index d7132f4918e..a8b768beaf1 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeGeneralIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeGeneralIntegrationTests.cs @@ -18,14 +18,14 @@ public class OffsetDateTimeTypeGeneralIntegrationTests public void QueryReturns() { var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("2020-12-31T18:30:13+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:30:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsWithMinutes() { var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("2020-12-31T18:30:13+02:30", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:30:13+02:30", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -36,7 +36,7 @@ public void ParsesVariable() .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "2020-12-31T18:30:13+02" } }) .Build()); - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -47,7 +47,7 @@ public void ParsesVariableWithMinutes() .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "2020-12-31T18:30:13+02:35" } }) .Build()); - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -69,7 +69,7 @@ public void ParsesLiteral() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02\") }") .Build()); - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -79,7 +79,7 @@ public void ParsesLiteralWithMinutes() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02:35\") }") .Build()); - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeRfc3339IntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeRfc3339IntegrationTests.cs index a8b24741009..5a8308d216c 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeRfc3339IntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeRfc3339IntegrationTests.cs @@ -21,7 +21,7 @@ public void QueryReturns() Assert.Equal( "2020-12-31T18:30:13.000001234+02:00", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -31,7 +31,7 @@ public void QueryReturnsWithMinutes() Assert.Equal( "2020-12-31T18:30:13.000001234+02:30", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -45,7 +45,7 @@ public void ParsesVariable() Assert.Equal( "2020-12-31T18:40:13.000001234+02:00", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -57,7 +57,7 @@ public void ParsesVariableWithMinutes() .SetVariableValues(new Dictionary { { "arg", "2020-12-31T18:30:13+02:35" } }) .Build()); - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -83,7 +83,7 @@ public void ParsesLiteral() Assert.Equal( "2020-12-31T18:40:13.000001234+02:00", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -94,7 +94,7 @@ public void ParsesLiteralWithMinutes() .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02:35\") }") .Build()); - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeTests.cs index 28c13d1deb6..d0eb97f3ecb 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeTests.cs @@ -60,7 +60,7 @@ public void QueryReturns() { var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("2020-12-31T18:30:13+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:30:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -68,7 +68,7 @@ public void QueryReturnsWithMinutes() { var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("2020-12-31T18:30:13+02:30", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:30:13+02:30", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -81,7 +81,7 @@ public void ParsesVariable() .SetVariableValues(new Dictionary { { "arg", "2020-12-31T18:30:13+02" } }) .Build()); - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -94,7 +94,7 @@ public void ParsesVariableWithMinutes() .SetVariableValues(new Dictionary { { "arg", "2020-12-31T18:30:13+02:35" } }) .Build()); - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -120,7 +120,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02\") }") .Build()); - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -132,7 +132,7 @@ public void ParsesLiteralWithMinutes() .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02:35\") }") .Build()); - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeFullRoundtripIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeFullRoundtripIntegrationTests.cs index e36a4e5a3b2..bec9334efa4 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeFullRoundtripIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeFullRoundtripIntegrationTests.cs @@ -19,7 +19,7 @@ public void QueryReturns() { var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("2020-12-31+02 (Gregorian)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -27,7 +27,7 @@ public void QueryReturnsWithMinutes() { var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("2020-12-31+02:35 (Gregorian)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02:35 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -39,7 +39,7 @@ public void ParsesVariable() .SetVariableValues(new Dictionary { { "arg", "2020-12-31+02 (Gregorian)" } }) .Build()); - Assert.Equal("2020-12-31+02 (Gregorian)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -51,7 +51,7 @@ public void ParsesVariableWithMinutes() .SetVariableValues(new Dictionary { { "arg", "2020-12-31+02:35 (Gregorian)" } }) .Build()); - Assert.Equal("2020-12-31+02:35 (Gregorian)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02:35 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -75,7 +75,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"2020-12-31+02 (Gregorian)\") }") .Build()); - Assert.Equal("2020-12-31+02 (Gregorian)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -86,7 +86,7 @@ public void ParsesLiteralWithMinutes() .SetDocument("mutation { test(arg: \"2020-12-31+02:35 (Gregorian)\") }") .Build()); - Assert.Equal("2020-12-31+02:35 (Gregorian)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02:35 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeTests.cs index 19b6c2fba6e..79232fa3ca6 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeTests.cs @@ -40,14 +40,14 @@ public class Mutation public void QueryReturns() { var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("2020-12-31+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsWithMinutes() { var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("2020-12-31+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -58,7 +58,7 @@ public void ParsesVariable() .SetDocument("mutation($arg: OffsetDate!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "2020-12-31+02" } }) .Build()); - Assert.Equal("2020-12-31+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -69,7 +69,7 @@ public void ParsesVariableWithMinutes() .SetDocument("mutation($arg: OffsetDate!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "2020-12-31+02:35" } }) .Build()); - Assert.Equal("2020-12-31+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -91,7 +91,7 @@ public void ParsesLiteral() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"2020-12-31+02\") }") .Build()); - Assert.Equal("2020-12-31+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -101,7 +101,7 @@ public void ParsesLiteralWithMinutes() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"2020-12-31+02:35\") }") .Build()); - Assert.Equal("2020-12-31+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeExtendedIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeExtendedIntegrationTests.cs index 2f6cc0c2ebc..18bc3d6beb4 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeExtendedIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeExtendedIntegrationTests.cs @@ -19,7 +19,7 @@ public void QueryReturns() { var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("18:30:13.010011234+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -27,7 +27,7 @@ public void QueryReturnsWithMinutes() { var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -39,7 +39,7 @@ public void ParsesVariable() .SetVariableValues(new Dictionary { { "arg", "18:30:13.010011234+02" } }) .Build()); - Assert.Equal("18:30:13.010011234+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -51,7 +51,7 @@ public void ParsesVariableWithMinutes() .SetVariableValues(new Dictionary { { "arg", "18:30:13.010011234+02:35" } }) .Build()); - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -75,7 +75,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"18:30:13.010011234+02\") }") .Build()); - Assert.Equal("18:30:13.010011234+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -86,7 +86,7 @@ public void ParsesLiteralWithMinutes() .SetDocument("mutation { test(arg: \"18:30:13.010011234+02:35\") }") .Build()); - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeRfc3339IntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeRfc3339IntegrationTests.cs index cc5f640c312..66f6d28bcff 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeRfc3339IntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeRfc3339IntegrationTests.cs @@ -17,14 +17,14 @@ public class OffsetTimeTypeRfc3339IntegrationTests public void QueryReturns() { var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("18:30:13.010011234+02:00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsWithMinutes() { var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -36,7 +36,7 @@ public void ParsesVariable() .SetVariableValues(new Dictionary { { "arg", "18:30:13.010011234+02:00" } }) .Build()); - Assert.Equal("18:30:13.010011234+02:00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -47,7 +47,7 @@ public void ParsesVariableWithMinutes() .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "18:30:13.010011234+02:35" } }) .Build()); - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -69,7 +69,7 @@ public void ParsesLiteral() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"18:30:13.010011234+02:00\") }") .Build()); - Assert.Equal("18:30:13.010011234+02:00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -79,7 +79,7 @@ public void ParsesLiteralWithMinutes() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"18:30:13.010011234+02:35\") }") .Build()); - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeTests.cs index eb373d29a9b..0ce34098950 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeTests.cs @@ -44,14 +44,14 @@ public class Mutation public void QueryReturns() { var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("18:30:13+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsWithMinutes() { var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("18:30:13+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -62,7 +62,7 @@ public void ParsesVariable() .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "18:30:13+02" } }) .Build()); - Assert.Equal("18:30:13+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -73,7 +73,7 @@ public void ParsesVariableWithMinutes() .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "18:30:13+02:35" } }) .Build()); - Assert.Equal("18:30:13+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -95,7 +95,7 @@ public void ParsesLiteral() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"18:30:13+02\") }") .Build()); - Assert.Equal("18:30:13+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -105,7 +105,7 @@ public void ParsesLiteralWithMinutes() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"18:30:13+02:35\") }") .Build()); - Assert.Equal("18:30:13+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("18:30:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeGeneralInvariantWithoutZIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeGeneralInvariantWithoutZIntegrationTests.cs index d4838742fb9..1474c1efa91 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeGeneralInvariantWithoutZIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeGeneralInvariantWithoutZIntegrationTests.cs @@ -18,21 +18,21 @@ public class OffsetTypeGeneralInvariantWithoutZIntegrationTests public void QueryReturns() { var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsWithMinutes() { var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsWithZ() { var result = _testExecutor.Execute("query { test: zOffset }"); - Assert.Equal("+00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -43,7 +43,7 @@ public void ParsesVariable() .SetDocument("mutation($arg: Offset!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "+02" } }) .Build()); - Assert.Equal("+03:05", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+03:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -54,7 +54,7 @@ public void ParsesVariableWithMinutes() .SetDocument("mutation($arg: Offset!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "+02:35" } }) .Build()); - Assert.Equal("+03:40", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+03:40", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -77,7 +77,7 @@ public void ParsesLiteral() .SetDocument("mutation { test(arg: \"+02\") }") .Build()); - Assert.Equal("+03:05", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+03:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -87,7 +87,7 @@ public void ParsesLiteralWithMinutes() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"+02:35\") }") .Build()); - Assert.Equal("+03:40", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+03:40", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -97,7 +97,7 @@ public void ParsesLiteralWithZero() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"+00\") }") .Build()); - Assert.Equal("+01:05", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+01:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeTests.cs index 99c9f80d9ba..7b717fdbf47 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeTests.cs @@ -34,21 +34,21 @@ public Offset Test(Offset arg) public void QueryReturns() { var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("+02", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsWithMinutes() { var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("+02:35", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsWithZ() { var result = _testExecutor.Execute("query { test: zOffset }"); - Assert.Equal("Z", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -59,7 +59,7 @@ public void ParsesVariable() .SetDocument("mutation($arg: Offset!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "+02" } }) .Build()); - Assert.Equal("+03:05", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+03:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -70,7 +70,7 @@ public void ParsesVariableWithMinutes() .SetDocument("mutation($arg: Offset!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "+02:35" } }) .Build()); - Assert.Equal("+03:40", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+03:40", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -92,7 +92,7 @@ public void ParsesLiteral() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"+02\") }") .Build()); - Assert.Equal("+03:05", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+03:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -102,7 +102,7 @@ public void ParsesLiteralWithMinutes() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"+02:35\") }") .Build()); - Assert.Equal("+03:40", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+03:40", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -112,7 +112,7 @@ public void ParsesLiteralWithZ() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"Z\") }") .Build()); - Assert.Equal("+01:05", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("+01:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeNormalizingIsoIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeNormalizingIsoIntegrationTests.cs index 21b6fee42c1..7b8111df88b 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeNormalizingIsoIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeNormalizingIsoIntegrationTests.cs @@ -17,7 +17,7 @@ public class PeriodTypeNormalizingIsoIntegrationTests public void QueryReturns() { var result = _testExecutor.Execute("query { test: one }"); - Assert.Equal("P-17DT-23H-59M-59.9999861S", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("P-17DT-23H-59M-59.9999861S", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -28,7 +28,7 @@ public void ParsesVariable() .SetDocument("mutation($arg: Period!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "P-17DT-23H-59M-59.9999861S" } }) .Build()); - Assert.Equal("P-18DT-9M-59.9999861S", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("P-18DT-9M-59.9999861S", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -50,7 +50,7 @@ public void ParsesLiteral() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"P-17DT-23H-59M-59.9999861S\") }") .Build()); - Assert.Equal("P-18DT-9M-59.9999861S", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("P-18DT-9M-59.9999861S", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeTests.cs index fca2029be53..47ce66fd346 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeTests.cs @@ -32,7 +32,7 @@ public Period Test(Period arg) public void QueryReturns() { var result = _testExecutor.Execute("query { test: one }"); - Assert.Equal("P-3W3DT139t", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("P-3W3DT139t", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -43,7 +43,7 @@ public void ParsesVariable() .SetDocument("mutation($arg: Period!) { test(arg: $arg) }") .SetVariableValues(new Dictionary { { "arg", "P-3W15DT139t" } }) .Build()); - Assert.Equal("P-3W15DT-10M139t", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("P-3W15DT-10M139t", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -65,7 +65,7 @@ public void ParsesLiteral() .Execute(OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"P-3W15DT139t\") }") .Build()); - Assert.Equal("P-3W15DT-10M139t", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("P-3W15DT-10M139t", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeCustomIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeCustomIntegrationTests.cs index 1c3d21e2915..7486c6ee2a7 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeCustomIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeCustomIntegrationTests.cs @@ -29,14 +29,14 @@ public void QueryReturns() var result = _testExecutor.Execute("query { test: rome }"); Assert.Equal( "2020-12-31T18:30:13 Asia/Kathmandu (+05:45)", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] public void QueryReturnsUtc() { var result = _testExecutor.Execute("query { test: utc }"); - Assert.Equal("2020-12-31T18:30:13 UTC (+00)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T18:30:13 UTC (+00)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -50,7 +50,7 @@ public void ParsesVariable() Assert.Equal( "2020-12-31T19:40:13 Asia/Kathmandu (+05:45)", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -62,7 +62,7 @@ public void ParsesVariableWithUTC() .SetVariableValues(new Dictionary { { "arg", "2020-12-31T19:30:13 UTC (+00)" } }) .Build()); - Assert.Equal("2020-12-31T19:40:13 UTC (+00)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T19:40:13 UTC (+00)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -93,7 +93,7 @@ public void ParsesLiteral() Assert.Equal( "2020-12-31T19:40:13 Asia/Kathmandu (+05:45)", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -104,7 +104,7 @@ public void ParsesLiteralWithUtc() .SetDocument("mutation { test(arg: \"2020-12-31T19:30:13 UTC (+00)\") }") .Build()); - Assert.Equal("2020-12-31T19:40:13 UTC (+00)", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T19:40:13 UTC (+00)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeTests.cs index 6f0d1d2d245..0782923e2bd 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeTests.cs @@ -47,7 +47,7 @@ public void QueryReturns() var result = _testExecutor.Execute("query { test: rome }"); Assert.Equal( "2020-12-31T18:30:13 Asia/Kathmandu +05:45", - Assert.IsType(result).Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -56,7 +56,7 @@ public void QueryReturnsUtc() var result = _testExecutor.Execute("query { test: utc }"); Assert.Equal( "2020-12-31T18:30:13 UTC +00", - Assert.IsType(result).Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -74,7 +74,7 @@ public void ParsesVariable() .Build()); Assert.Equal( "2020-12-31T19:40:13 Asia/Kathmandu +05:45", - Assert.IsType(result).Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -92,7 +92,7 @@ public void ParsesVariableWithUtc() .Build()); Assert.Equal( "2020-12-31T19:40:13 UTC +00", - Assert.IsType(result).Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -122,7 +122,7 @@ public void ParsesLiteral() .Build()); Assert.Equal( "2020-12-31T19:40:13 Asia/Kathmandu +05:45", - result.ExpectOperationResult().Data!["test"]); + result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] @@ -133,7 +133,7 @@ public void ParsesLiteralWithUtc() OperationRequestBuilder.New() .SetDocument("mutation { test(arg: \"2020-12-31T19:30:13 UTC +00\") }") .Build()); - Assert.Equal("2020-12-31T19:40:13 UTC +00", result.ExpectOperationResult().Data!["test"]); + Assert.Equal("2020-12-31T19:40:13 UTC +00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); } [Fact] diff --git a/src/HotChocolate/Core/test/Utilities/SnapshotExtensions.cs b/src/HotChocolate/Core/test/Utilities/SnapshotExtensions.cs index cf41547db1b..646bbb90ea1 100644 --- a/src/HotChocolate/Core/test/Utilities/SnapshotExtensions.cs +++ b/src/HotChocolate/Core/test/Utilities/SnapshotExtensions.cs @@ -48,6 +48,6 @@ public static async Task ToJsonAsync(this Task task) public static void MatchSnapshot(this GraphQLException ex) { - OperationResultBuilder.CreateError(ex.Errors).MatchSnapshot(); + OperationResult.FromError([.. ex.Errors]).MatchSnapshot(); } } diff --git a/src/HotChocolate/Core/test/Utilities/TestHelper.cs b/src/HotChocolate/Core/test/Utilities/TestHelper.cs index e8668a22650..ad00599406c 100644 --- a/src/HotChocolate/Core/test/Utilities/TestHelper.cs +++ b/src/HotChocolate/Core/test/Utilities/TestHelper.cs @@ -104,7 +104,7 @@ public static async Task ExpectError( var result = await executor.ExecuteAsync(request); // assert - IOperationResult operationResult = Assert.IsType(result); + var operationResult = Assert.IsType(result); Assert.NotNull(operationResult.Errors); if (elementInspectors.Length > 0) diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/FilterVisitorTestBase.cs b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/FilterVisitorTestBase.cs index 78f7b5ffb76..bfa3767a340 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/FilterVisitorTestBase.cs +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/FilterVisitorTestBase.cs @@ -85,11 +85,8 @@ protected IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("sql", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("sql", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("sql", queryString); } }) .UseDefaultPipeline() From 3e44243165eb08d6763059e510cac3f0e9d8beb2 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 16 Dec 2025 21:44:59 +0100 Subject: [PATCH 038/144] wip --- .../ProjectionVisitorTestBase.cs | 6 +- .../FusionTestBase.MatchSnapshot.cs | 8 +-- .../test/Fusion.AspNetCore.Tests/NullTests.cs | 20 +++--- .../SourceSchemaErrorTests.cs | 6 +- .../FusionRequestExecutorManagerTests.cs | 15 ++--- .../Text/Json/CompositeResultDocumentTests.cs | 19 +++++- .../FilterVisitorTestBase.cs | 7 +-- .../SortVisitorTestBase.cs | 7 +-- .../FilterVisitorTestBase.cs | 7 +-- .../MongoDbAggregateFluentTests.cs | 7 +-- .../MongoDbCollectionTests.cs | 7 +-- .../MongoDbFindFluentTests.cs | 7 +-- ...MongoDbCursorPagingAggregateFluentTests.cs | 7 +-- .../MongoDbCursorPagingFindFluentTests.cs | 7 +-- .../MongoDbOffsetPagingAggregateTests.cs | 7 +-- .../MongoDbOffsetPagingFindFluentTests.cs | 7 +-- .../VisitorTestBase.cs | 7 +-- .../MongoDbAggregateFluentTests.cs | 7 +-- .../MongoDbFindFluentTests.cs | 7 +-- .../MongoDbSortCollectionTests.cs | 7 +-- .../IntegrationTests.cs | 9 ++- .../IntegrationTests.cs | 19 +++--- .../IntegrationTests.cs | 63 ++++++++----------- 23 files changed, 112 insertions(+), 151 deletions(-) diff --git a/src/HotChocolate/Data/test/Data.Projections.SqlServer.Tests/ProjectionVisitorTestBase.cs b/src/HotChocolate/Data/test/Data.Projections.SqlServer.Tests/ProjectionVisitorTestBase.cs index 53a3ebeb55e..11aa719c4b1 100644 --- a/src/HotChocolate/Data/test/Data.Projections.SqlServer.Tests/ProjectionVisitorTestBase.cs +++ b/src/HotChocolate/Data/test/Data.Projections.SqlServer.Tests/ProjectionVisitorTestBase.cs @@ -100,10 +100,8 @@ public IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("sql", out var queryString)) { - context.Result = OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("sql", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("sql", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/FusionTestBase.MatchSnapshot.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/FusionTestBase.MatchSnapshot.cs index c4ac83b5bc7..7ef9ea1992e 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/FusionTestBase.MatchSnapshot.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/FusionTestBase.MatchSnapshot.cs @@ -27,7 +27,7 @@ protected async Task MatchSnapshotAsync( { var snapshot = new Snapshot(postFix, ".yaml"); - var results = new List(); + var results = new List(); // We first wait and capture all possible gateway responses. await foreach (var result in response.ReadAsResultStreamAsync()) @@ -78,7 +78,7 @@ protected async Task MatchSnapshotAsync( private static async Task TryWriteOperationPlanAsync( CodeWriter writer, Gateway gateway, - List results) + List results) { foreach (var result in results) { @@ -121,7 +121,7 @@ private static async Task TryWriteOperationPlanAsync( } } - private void WriteResults(CodeWriter writer, List results) + private void WriteResults(CodeWriter writer, List results) { if (results is [{ } singleResult]) { @@ -154,7 +154,7 @@ private void WriteResults(CodeWriter writer, List b.AddQueryType() - .InsertUseRequest(WellKnownRequestMiddleware.OperationExecutionMiddleware, (_, _) => context => - { - context.Result = OperationResultBuilder.New() - .SetData(new Dictionary { ["nonNullString"] = null }) - .Build(); - - return ValueTask.CompletedTask; - }, key: "SetNull")); + .InsertUseRequest( + WellKnownRequestMiddleware.OperationExecutionMiddleware, + (_, _) => context => + { + context.Result = new OperationResult( + new Dictionary + { + ["nonNullString"] = null + }); + return ValueTask.CompletedTask; + }, + key: "SetNull")); // act using var gateway = await CreateCompositeSchemaAsync( diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/SourceSchemaErrorTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/SourceSchemaErrorTests.cs index f21788c237a..d85fbf88573 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/SourceSchemaErrorTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/SourceSchemaErrorTests.cs @@ -139,7 +139,7 @@ public async Task No_Data_And_Error_Without_Path_For_Root_Field(ErrorHandlingMod { return context => { - context.Result = OperationResultBuilder.CreateError( + context.Result = OperationResult.FromError( ErrorBuilder.New() .SetMessage("A global error") .Build()); @@ -191,7 +191,7 @@ public async Task No_Data_And_Error_Without_Path_For_Root_Field_NonNull(ErrorHan { return context => { - context.Result = OperationResultBuilder.CreateError( + context.Result = OperationResult.FromError( ErrorBuilder.New() .SetMessage("A global error") .Build()); @@ -671,7 +671,7 @@ public async Task No_Data_And_Error_Without_Path_For_Lookup_Field_NonNull(ErrorH { return context => { - context.Result = OperationResultBuilder.CreateError( + context.Result = OperationResult.FromError( ErrorBuilder.New() .SetMessage("A global error") .Build()); diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs index 3bee9767122..738a80bdc17 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using HotChocolate.Execution; using HotChocolate.Fusion.Configuration; using HotChocolate.Fusion.Execution.Nodes; @@ -89,18 +90,14 @@ type Query { { var plan = context.GetOperationPlan(); context.Result = - OperationResultBuilder.New() - .SetData( - new Dictionary + new OperationResult( + new Dictionary { { "foo", null } }) - .SetContextData( - new Dictionary - { - { "operationPlan", plan } - }) - .Build(); + { + ContextData = ImmutableDictionary.Empty.Add("operationPlan", plan) + }; return ValueTask.CompletedTask; }; }) diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs index 5ebd3b067e4..191fa13e4bf 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs @@ -2,6 +2,7 @@ using System.Text; using System.Text.Json; using HotChocolate.Buffers; +using HotChocolate.Execution; namespace HotChocolate.Fusion.Text.Json; @@ -467,7 +468,14 @@ public void Write_Document_To_BufferWriter() } // act - compositeResult.WriteTo(buffer, indented: true); + var operationResultData = new OperationResultData( + compositeResult, + compositeResult.Data.IsNullOrInvalidated, + compositeResult, + compositeResult); + var operationResult = new OperationResult( + operationResultData); + compositeResult.WriteTo(operationResult, buffer, indented: true); // assert var json = Encoding.UTF8.GetString(buffer.WrittenSpan); @@ -527,7 +535,14 @@ public async Task Write_Document_To_PipeWriter() // act await using var memoryStream = new MemoryStream(); var writer = PipeWriter.Create(memoryStream); - compositeResult.WriteTo(writer, indented: true); + var operationResultData = new OperationResultData( + compositeResult, + compositeResult.Data.IsNullOrInvalidated, + compositeResult, + compositeResult); + var operationResult = new OperationResult( + operationResultData); + compositeResult.WriteTo(operationResult, writer, indented: true); await writer.FlushAsync(); await writer.CompleteAsync(); diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/FilterVisitorTestBase.cs b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/FilterVisitorTestBase.cs index 91265af3655..1ec43e6b595 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/FilterVisitorTestBase.cs +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/FilterVisitorTestBase.cs @@ -81,11 +81,8 @@ protected async Task CreateSchemaAsync( await next(context); if (context.ContextData.TryGetValue("sql", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("sql", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("sql", queryString); } }) .ModifyPagingOptions(o => o.IncludeTotalCount = true) diff --git a/src/HotChocolate/Marten/test/Data.Marten.Sorting.Tests/SortVisitorTestBase.cs b/src/HotChocolate/Marten/test/Data.Marten.Sorting.Tests/SortVisitorTestBase.cs index 47ec5c4ffb5..95a37374536 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Sorting.Tests/SortVisitorTestBase.cs +++ b/src/HotChocolate/Marten/test/Data.Marten.Sorting.Tests/SortVisitorTestBase.cs @@ -124,11 +124,8 @@ protected async Task CreateSchemaAsync( await next(context); if (context.ContextData.TryGetValue("sql", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("sql", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("sql", queryString); } }) .ModifyRequestOptions(x => x.IncludeExceptionDetails = true) diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/FilterVisitorTestBase.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/FilterVisitorTestBase.cs index c5eade6aa65..f5506460ae5 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/FilterVisitorTestBase.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/FilterVisitorTestBase.cs @@ -59,11 +59,8 @@ protected IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbAggregateFluentTests.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbAggregateFluentTests.cs index 4fbbbbf0ae2..aee2ef90293 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbAggregateFluentTests.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbAggregateFluentTests.cs @@ -147,11 +147,8 @@ private static IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbCollectionTests.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbCollectionTests.cs index 2bb57fd0dcd..21b1d527ed4 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbCollectionTests.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbCollectionTests.cs @@ -146,11 +146,8 @@ private static IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFindFluentTests.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFindFluentTests.cs index afde657472c..f289e4e279e 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFindFluentTests.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFindFluentTests.cs @@ -193,11 +193,8 @@ private static IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbCursorPagingAggregateFluentTests.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbCursorPagingAggregateFluentTests.cs index 14a5119e8f2..c795ffad144 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbCursorPagingAggregateFluentTests.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbCursorPagingAggregateFluentTests.cs @@ -270,11 +270,8 @@ private ValueTask CreateSchemaAsync() await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .ModifyRequestOptions(x => x.IncludeExceptionDetails = true) diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbCursorPagingFindFluentTests.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbCursorPagingFindFluentTests.cs index 3f89247ea4d..dcb5f1e4873 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbCursorPagingFindFluentTests.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbCursorPagingFindFluentTests.cs @@ -305,11 +305,8 @@ private ValueTask CreateSchemaAsync(bool requiresPagingBoundar await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .ModifyRequestOptions(x => x.IncludeExceptionDetails = true) diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbOffsetPagingAggregateTests.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbOffsetPagingAggregateTests.cs index 234b90df7c8..59a9cc1567b 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbOffsetPagingAggregateTests.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbOffsetPagingAggregateTests.cs @@ -213,11 +213,8 @@ private ValueTask CreateSchemaAsync() await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .ModifyRequestOptions(x => x.IncludeExceptionDetails = true) diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbOffsetPagingFindFluentTests.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbOffsetPagingFindFluentTests.cs index f34db3bfb72..ef378d6a5e3 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbOffsetPagingFindFluentTests.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbOffsetPagingFindFluentTests.cs @@ -211,11 +211,8 @@ private ValueTask CreateSchemaAsync() await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .ModifyRequestOptions(x => x.IncludeExceptionDetails = true) diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/VisitorTestBase.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/VisitorTestBase.cs index 369d90cca4f..89c1b865bed 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/VisitorTestBase.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/VisitorTestBase.cs @@ -64,11 +64,8 @@ protected IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbAggregateFluentTests.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbAggregateFluentTests.cs index 66c99e7a846..df579f7a7a4 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbAggregateFluentTests.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbAggregateFluentTests.cs @@ -142,11 +142,8 @@ private static IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbFindFluentTests.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbFindFluentTests.cs index 60ae122018a..12af390a934 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbFindFluentTests.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbFindFluentTests.cs @@ -207,11 +207,8 @@ private static IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbSortCollectionTests.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbSortCollectionTests.cs index 98f0d7a122b..944595ba9b6 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbSortCollectionTests.cs +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbSortCollectionTests.cs @@ -151,11 +151,8 @@ private static IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .UseDefaultPipeline() diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs index 11e810b9198..518605e4d7c 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs @@ -69,12 +69,11 @@ public async Task ExecutePersistedOperation_NotFound() { await n(c); - if (c.IsPersistedOperationDocument() && c.Result is IOperationResult r) + if (c.IsPersistedOperationDocument()) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + var result = c.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? []; + result.Extensions = extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.InMemory.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.InMemory.Tests/IntegrationTests.cs index 51e88460e8a..7eb3f6c7ba8 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.InMemory.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.InMemory.Tests/IntegrationTests.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using HotChocolate.Execution; using HotChocolate.Language; using HotChocolate.Types; @@ -25,12 +26,11 @@ public async Task ExecutePersistedOperation() { await n(c); - if (c.IsPersistedOperationDocument() && c.Result is IOperationResult r) + if (c.IsPersistedOperationDocument()) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + var result = c.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? ImmutableDictionary.Empty; + result.Extensions = extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() @@ -63,12 +63,11 @@ public async Task ExecutePersistedOperation_NotFound() { await n(c); - if (c.IsPersistedOperationDocument() && c.Result is IOperationResult r) + if (c.IsPersistedOperationDocument()) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + var result = c.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? ImmutableDictionary.Empty; + result.Extensions = extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs index 76c9a28b38b..b0fe06d2f02 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs @@ -39,12 +39,11 @@ await storage.SaveAsync( await n(c); var documentInfo = c.OperationDocumentInfo; - if (documentInfo.Id == documentId && c.Result is IOperationResult r) + if (documentInfo.Id == documentId) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + var result = c.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? []; + result.Extensions = extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() @@ -73,12 +72,11 @@ public async Task ExecutePersistedOperation_After_Expiration() await n(c); var documentInfo = c.OperationDocumentInfo; - if (documentInfo.Id == documentId && c.Result is IOperationResult r) + if (documentInfo.Id == documentId) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + var result = c.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? []; + result.Extensions = extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() @@ -122,12 +120,11 @@ public async Task ExecutePersistedOperation_Before_Expiration() await n(c); var documentInfo = c.OperationDocumentInfo; - if (documentInfo.Id == documentId && c.Result is IOperationResult r) + if (documentInfo.Id == documentId) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + var result = c.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? []; + result.Extensions = extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() @@ -163,20 +160,18 @@ public async Task ExecutePersistedOperation_ApplicationDI() await n(c); var documentInfo = c.OperationDocumentInfo; - if (documentInfo.Id == documentId && c.Result is IOperationResult r) + if (documentInfo.Id == documentId) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + var result = c.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? []; + result.Extensions = extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() .BuildRequestExecutorAsync(); // act - var result = - await executor.ExecuteAsync(OperationRequest.FromId(documentId)); + var result = await executor.ExecuteAsync(OperationRequest.FromId(documentId)); // assert result.MatchSnapshot(); @@ -203,20 +198,18 @@ public async Task ExecutePersistedOperation_ApplicationDI_Default() await n(c); var documentInfo = c.OperationDocumentInfo; - if (documentInfo.Id == documentId && c.Result is IOperationResult r) + if (documentInfo.Id == documentId) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + var result = c.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? []; + result.Extensions = extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() .BuildRequestExecutorAsync(); // act - var result = - await executor.ExecuteAsync(OperationRequest.FromId(documentId)); + var result = await executor.ExecuteAsync(OperationRequest.FromId(documentId)); // assert result.MatchSnapshot(); @@ -240,20 +233,18 @@ public async Task ExecutePersistedOperation_NotFound() await n(c); var documentInfo = c.OperationDocumentInfo; - if (documentInfo.Id == documentId && c.Result is IOperationResult r) + if (documentInfo.Id == documentId) { - c.Result = OperationResultBuilder - .FromResult(r) - .SetExtension("persistedDocument", true) - .Build(); + var result = c.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? []; + result.Extensions = extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() .BuildRequestExecutorAsync(); // act - var result = - await executor.ExecuteAsync(OperationRequest.FromId("does_not_exist")); + var result = await executor.ExecuteAsync(OperationRequest.FromId("does_not_exist")); // assert result.MatchSnapshot(); From b304652847012b7d63351131a1c1998387a63a7a Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 16 Dec 2025 22:10:08 +0100 Subject: [PATCH 039/144] Refactor OperationResult usage in tests and remove obsolete ResultBuilderTests --- .../GraphQLOverHttpSpecTests.cs | 1 - .../HttpPostMiddlewareTests.cs | 2 +- .../Subscriptions/OperationManagerTests.cs | 2 +- .../Integration/DataLoader/DataLoaderTests.cs | 42 ++++++++----------- .../StarWarsCodeFirstTests.cs | 8 ++-- .../Processing/Result/ResultBuilderTests.cs | 27 ------------ .../Types/SomeRequestMiddleware.cs | 14 +++---- .../Data.Tests/InterfaceIntegrationTests.cs | 12 ++++-- 8 files changed, 38 insertions(+), 70 deletions(-) delete mode 100644 src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ResultBuilderTests.cs diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs index c0bfcc614dd..799e4afb4cc 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs @@ -10,7 +10,6 @@ using static System.Net.HttpStatusCode; using static HotChocolate.AspNetCore.HttpTransportVersion; using MediaTypeHeaderValue = System.Net.Http.Headers.MediaTypeHeaderValue; -using OperationResult = HotChocolate.Execution.OperationResult; namespace HotChocolate.AspNetCore; diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/HttpPostMiddlewareTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/HttpPostMiddlewareTests.cs index 9eab856746c..53c885309ad 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/HttpPostMiddlewareTests.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/HttpPostMiddlewareTests.cs @@ -229,7 +229,7 @@ await server.PostHttpAsync( private class CustomFormatter : DefaultHttpResponseFormatter { protected override void OnWriteResponseHeaders( - IOperationResult result, + OperationResult result, FormatInfo format, IHeaderDictionary headers) { diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/OperationManagerTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/OperationManagerTests.cs index 2edadba5a40..d908a97571b 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/OperationManagerTests.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/OperationManagerTests.cs @@ -325,7 +325,7 @@ public ValueTask SendKeepAliveMessageAsync( public ValueTask SendResultMessageAsync( ISocketSession session, string operationSessionId, - IOperationResult result, + OperationResult result, CancellationToken cancellationToken) => default; diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/DataLoaderTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/DataLoaderTests.cs index 7d468dbbea3..d4090096fb5 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/DataLoaderTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/DataLoaderTests.cs @@ -34,10 +34,9 @@ public async Task ClassDataLoader() .GetRequiredService() .GetDataLoader(_ => throw new Exception()); - context.Result = OperationResultBuilder - .FromResult((IOperationResult)context.Result!) - .AddExtension("loads", dataLoader.Loads) - .Build(); + var result = context.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? ImmutableDictionary.Empty; + extensions = extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline()); @@ -101,10 +100,9 @@ public async Task ClassDataLoader_Out_Off_GraphQL_Context_Not_Initialized() .GetRequiredService() .GetDataLoader(_ => throw new Exception()); - context.Result = OperationResultBuilder - .FromResult((IOperationResult)context.Result!) - .AddExtension("loads", dataLoader.Loads) - .Build(); + var result = context.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? ImmutableDictionary.Empty; + extensions = extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline() .Services @@ -136,10 +134,9 @@ public async Task ClassDataLoader_Out_Off_GraphQL_Context() .GetRequiredService() .GetDataLoader(_ => throw new Exception()); - context.Result = OperationResultBuilder - .FromResult((IOperationResult)context.Result!) - .AddExtension("loads", dataLoader.Loads) - .Build(); + var result = context.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? ImmutableDictionary.Empty; + extensions = extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline() .Services @@ -174,10 +171,9 @@ public async Task ClassDataLoader_Out_Off_GraphQL_Context_Just_Works() .GetRequiredService() .GetDataLoader(_ => throw new Exception()); - context.Result = OperationResultBuilder - .FromResult((IOperationResult)context.Result!) - .AddExtension("loads", dataLoader.Loads) - .Build(); + var result = context.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? ImmutableDictionary.Empty; + extensions = extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline() .Services @@ -259,10 +255,9 @@ public async Task ClassDataLoader_Resolve_From_DependencyInjection() var dataLoader = (TestDataLoader)context.RequestServices.GetRequiredService(); - context.Result = OperationResultBuilder - .FromResult(((IOperationResult)context.Result!)) - .AddExtension("loads", dataLoader.Loads) - .Build(); + var result = context.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? ImmutableDictionary.Empty; + extensions = extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline()); @@ -326,10 +321,9 @@ public async Task ClassDataLoader_Resolve_From_DependencyInjection_Using_Factory var dataLoader = (TestDataLoader)context.RequestServices.GetRequiredService(); - context.Result = OperationResultBuilder - .FromResult((IOperationResult)context.Result!) - .AddExtension("loads", dataLoader.Loads) - .Build(); + var result = context.Result.ExpectOperationResult(); + var extensions = result.Extensions ?? ImmutableDictionary.Empty; + extensions = extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline()); diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs index 610a421e5ba..e82f4ca6c08 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs @@ -662,7 +662,7 @@ await executor.ExecuteAsync( } """); - IOperationResult? eventResult = null; + OperationResult? eventResult = null; using (var cts = new CancellationTokenSource(2000)) { @@ -708,7 +708,7 @@ await executor.ExecuteAsync( } """); - IOperationResult? eventResult = null; + OperationResult? eventResult = null; using (var cts = new CancellationTokenSource(2000)) { @@ -756,7 +756,7 @@ await executor.ExecuteAsync( } """); - IOperationResult? eventResult = null; + OperationResult? eventResult = null; using (var cts = new CancellationTokenSource(2000)) { @@ -802,7 +802,7 @@ await executor.ExecuteAsync( } """); - IOperationResult? eventResult = null; + OperationResult? eventResult = null; using (var cts = new CancellationTokenSource(2000)) { diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ResultBuilderTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ResultBuilderTests.cs deleted file mode 100644 index c585f571862..00000000000 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ResultBuilderTests.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace HotChocolate.Execution.Processing; - -public class ResultBuilderTests -{ - [Fact] - public void BuildResult_SimpleResultSet_SnapshotMatches() - { - // arrange - var helper = new ResultBuilder(CreatePool()); - var map = helper.RentObject(1); - map.SetValueUnsafe(0, "abc", "def", false); - helper.SetData(map); - - // act - var result = helper.BuildResult(); - - // assert - result.ToJson().MatchSnapshot(); - } - - private ResultPool CreatePool() - { - return new ResultPool( - new ObjectResultPool(16, 16, 16), - new ListResultPool(16, 16, 16)); - } -} diff --git a/src/HotChocolate/Core/test/Types.Analyzers.Tests/Types/SomeRequestMiddleware.cs b/src/HotChocolate/Core/test/Types.Analyzers.Tests/Types/SomeRequestMiddleware.cs index 914328bf181..4b0466aa0fd 100644 --- a/src/HotChocolate/Core/test/Types.Analyzers.Tests/Types/SomeRequestMiddleware.cs +++ b/src/HotChocolate/Core/test/Types.Analyzers.Tests/Types/SomeRequestMiddleware.cs @@ -9,15 +9,13 @@ public async ValueTask InvokeAsync(RequestContext context, Service3 service3) await next(context); context.Result = - OperationResultBuilder.New() - .SetData( - new Dictionary + new OperationResult( + new Dictionary + { { - { - $"{service1.Say()} {service3.Hello()} {service2.World()}", true - } - }) - .Build(); + $"{service1.Say()} {service3.Hello()} {service2.World()}", true + } + }); } } diff --git a/src/HotChocolate/Data/test/Data.Tests/InterfaceIntegrationTests.cs b/src/HotChocolate/Data/test/Data.Tests/InterfaceIntegrationTests.cs index c9fd54a6f6c..f9915b1dae1 100644 --- a/src/HotChocolate/Data/test/Data.Tests/InterfaceIntegrationTests.cs +++ b/src/HotChocolate/Data/test/Data.Tests/InterfaceIntegrationTests.cs @@ -63,11 +63,12 @@ public async Task Query_Owner_Animals() .Build()); var operationResult = result.ExpectOperationResult(); + operationResult.Extensions = ImmutableDictionary.Empty; await Snapshot .Create(postFix: TestEnvironment.TargetFramework) .AddQueries(queries) - .Add(operationResult.WithExtensions(ImmutableDictionary.Empty)) + .Add(operationResult) .MatchMarkdownAsync(); } @@ -115,11 +116,12 @@ public async Task Query_Owner_Animals_With_TotalCount() .Build()); var operationResult = result.ExpectOperationResult(); + operationResult.Extensions = ImmutableDictionary.Empty; await Snapshot .Create(postFix: TestEnvironment.TargetFramework) .AddQueries(queries) - .Add(operationResult.WithExtensions(ImmutableDictionary.Empty)) + .Add(operationResult) .MatchMarkdownAsync(); } @@ -171,11 +173,12 @@ ... on Cat { .Build()); var operationResult = result.ExpectOperationResult(); + operationResult.Extensions = ImmutableDictionary.Empty; await Snapshot .Create(postFix: TestEnvironment.TargetFramework) .AddQueries(queries) - .Add(operationResult.WithExtensions(ImmutableDictionary.Empty)) + .Add(operationResult) .MatchMarkdownAsync(); } @@ -214,6 +217,7 @@ public async Task Query_Pets() .Build()); var operationResult = result.ExpectOperationResult(); + operationResult.Extensions = ImmutableDictionary.Empty; await Snapshot .Create( @@ -221,7 +225,7 @@ await Snapshot ? TestEnvironment.TargetFramework : null) .AddQueries(queries) - .Add(operationResult.WithExtensions(ImmutableDictionary.Empty)) + .Add(operationResult) .MatchMarkdownAsync(); } From 3bcb7c8584697904713721f56d984eb2fc106d78 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Tue, 16 Dec 2025 22:43:52 +0100 Subject: [PATCH 040/144] Enhance ImmutableOrderedDictionary and OperationResult with new Create method; refactor extensions handling in various tests --- .../Immutable/ImmutableOrderedDictionary.cs | 34 +++ .../Execution/OperationResult.cs | 36 +-- .../Execution.Tests/MiddlewareContextTests.cs | 8 +- .../Result/ObjectFieldResultTests.cs | 67 ------ .../Processing/Result/ObjectResultTests.cs | 213 ------------------ ...esult_SimpleResultSet_SnapshotMatches.snap | 5 - .../Execution.Tests/WarmupRequestTests.cs | 4 +- .../PagingHelperIntegrationTests.cs | 3 +- .../WritePersistedOperationMiddleware.cs | 3 +- .../IntegrationTests.cs | 12 +- .../FilterVisitorTestBase.cs | 7 +- .../RavenAsyncDocumentQueryTests.cs | 7 +- 12 files changed, 73 insertions(+), 326 deletions(-) delete mode 100644 src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ObjectFieldResultTests.cs delete mode 100644 src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ObjectResultTests.cs delete mode 100644 src/HotChocolate/Core/test/Execution.Tests/Processing/Result/__snapshots__/ResultBuilderTests.BuildResult_SimpleResultSet_SnapshotMatches.snap diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Collections/Immutable/ImmutableOrderedDictionary.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Collections/Immutable/ImmutableOrderedDictionary.cs index a5615e7dd8a..f330a177dc8 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Collections/Immutable/ImmutableOrderedDictionary.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Collections/Immutable/ImmutableOrderedDictionary.cs @@ -1,6 +1,7 @@ using System.Collections; using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; namespace HotChocolate.Collections.Immutable; @@ -20,6 +21,7 @@ namespace HotChocolate.Collections.Immutable; /// which does not guarantee any particular order. /// /// +[CollectionBuilder(typeof(ImmutableOrderedDictionary), nameof(ImmutableOrderedDictionary.Create))] public sealed class ImmutableOrderedDictionary : IImmutableDictionary where TKey : IEquatable { @@ -472,6 +474,26 @@ public bool ContainsKey(TKey key) public ImmutableOrderedDictionary ToImmutable() => new([.. _dictionary.Keys], ImmutableDictionary.CreateRange(_dictionary)); } + + internal static ImmutableOrderedDictionary Create( + ReadOnlySpan> items) + { + if (items.Length == 0) + { + return Empty; + } + + var keys = ImmutableList.CreateBuilder(); + var map = ImmutableDictionary.CreateBuilder(); + + foreach (var item in items) + { + keys.Add(item.Key); + map.Add(item.Key, item.Value); + } + + return new ImmutableOrderedDictionary(keys.ToImmutable(), map.ToImmutable()); + } } /// @@ -488,4 +510,16 @@ public static class ImmutableOrderedDictionary public static ImmutableOrderedDictionary.Builder CreateBuilder() where TKey : IEquatable => new(); + + /// + /// Creates an immutable ordered dictionary from the specified key-value pairs. + /// + /// The type of keys in the dictionary. + /// The type of values in the dictionary. + /// The key-value pairs to include in the dictionary. + /// An immutable ordered dictionary containing the specified key-value pairs. + public static ImmutableOrderedDictionary Create( + ReadOnlySpan> items) + where TKey : IEquatable + => ImmutableOrderedDictionary.Create(items); } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs index 2d6904a02be..9a84eee2be6 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using HotChocolate.Collections.Immutable; namespace HotChocolate.Execution; @@ -27,7 +28,7 @@ public sealed class OperationResult : ExecutionResult public OperationResult( OperationResultData data, ImmutableList? errors = null, - ImmutableDictionary? extensions = null) + ImmutableOrderedDictionary? extensions = null) { if (data.Value is not null && data.Formatter is not null) { @@ -43,8 +44,8 @@ public OperationResult( ? DataFlags.DataIsSet | DataFlags.DataIsNull : DataFlags.DataIsSet; Data = data.Value; - Errors = errors; - Extensions = extensions; + Errors = errors ?? []; + Extensions = extensions ?? []; Features.Set(data.Formatter); @@ -76,7 +77,7 @@ public OperationResult( public OperationResult( IReadOnlyDictionary? data, ImmutableList? errors = null, - ImmutableDictionary? extensions = null) + ImmutableOrderedDictionary? extensions = null) { if (data is null && errors is null or { Count: 0 } && extensions is null or { Count: 0 }) { @@ -88,8 +89,8 @@ public OperationResult( : DataFlags.DataIsSet; Data = data; - Errors = errors; - Extensions = extensions; + Errors = errors ?? []; + Extensions = extensions ?? []; } /// @@ -107,7 +108,7 @@ public OperationResult( /// /// Thrown when the errors list is empty. /// - public OperationResult(ImmutableList errors, ImmutableDictionary? extensions = null) + public OperationResult(ImmutableList errors, ImmutableOrderedDictionary? extensions = null) { ArgumentNullException.ThrowIfNull(errors); @@ -118,7 +119,7 @@ public OperationResult(ImmutableList errors, ImmutableDictionary @@ -133,7 +134,7 @@ public OperationResult(ImmutableList errors, ImmutableDictionary /// Thrown when the extensions dictionary is empty. /// - public OperationResult(ImmutableDictionary extensions) + public OperationResult(ImmutableOrderedDictionary extensions) { ArgumentNullException.ThrowIfNull(extensions); @@ -143,6 +144,7 @@ public OperationResult(ImmutableDictionary extensions) } _dataFlags = DataFlags.DataIsNull; + Errors = []; Extensions = extensions; } @@ -198,7 +200,7 @@ public Path? Path /// /// Gets the GraphQL errors that occurred during execution. /// - public ImmutableList? Errors { get; } + public ImmutableList Errors { get; } /// /// Gets or sets additional information passed along with the result. @@ -206,7 +208,7 @@ public Path? Path /// /// Thrown when setting to null or empty when data and errors are also null or empty. /// - public ImmutableDictionary? Extensions + public ImmutableOrderedDictionary Extensions { get; set @@ -224,9 +226,9 @@ public Path? Path /// Gets or sets the list of pending incremental delivery operations. /// Each pending result announces data that will be delivered incrementally in subsequent payloads. /// - public ImmutableList? Pending + public ImmutableList Pending { - get => Features.Get()?.Pending; + get => Features.Get()?.Pending ?? []; set { var feature = Features.Get() ?? new IncrementalDataFeature(); @@ -239,9 +241,9 @@ public ImmutableList? Pending /// Gets or sets the list of incremental results containing data from @defer or @stream directives. /// Contains the actual data for previously announced pending operations. /// - public ImmutableList? Incremental + public ImmutableList Incremental { - get => Features.Get()?.Incremental; + get => Features.Get()?.Incremental ?? []; set { var feature = Features.Get() ?? new IncrementalDataFeature(); @@ -254,9 +256,9 @@ public ImmutableList? Incremental /// Gets or sets the list of completed incremental delivery operations. /// Each completed result indicates that all data for a pending operation has been delivered. /// - public ImmutableList? Completed + public ImmutableList Completed { - get => Features.Get()?.Completed; + get => Features.Get()?.Completed ?? []; set { var feature = Features.Get() ?? new IncrementalDataFeature(); diff --git a/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs b/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs index a798cdb7f4f..8dfeebff4b2 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs @@ -334,9 +334,11 @@ public async Task SetResultContextData_Delegate_IntValue_When_Deferred() continue; } - Assert.NotNull(queryResult.Incremental?[0].ContextData); - Assert.True(queryResult.Incremental[0].ContextData!.TryGetValue("abc", out var value)); - Assert.Equal(2, value); + // TODO : FIX THIS TEST + throw new InvalidOperationException(); + // Assert.NotNull(queryResult.Incremental?[0].ContextData); + // Assert.True(queryResult.Incremental[0].ContextData!.TryGetValue("abc", out var value)); + // Assert.Equal(2, value); } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ObjectFieldResultTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ObjectFieldResultTests.cs deleted file mode 100644 index af5e1df90c9..00000000000 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ObjectFieldResultTests.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace HotChocolate.Execution.Processing; - -public class ObjectFieldResultTests -{ - [Fact] - public void SetNullable() - { - // arrange - var field = new ObjectFieldResult(); - - // act - field.Set("abc", "def", true); - - // assert - Assert.Equal("abc", field.Name); - Assert.Equal("def", field.Value); - Assert.True(field.IsNullable); - Assert.True(field.IsInitialized); - } - - [Fact] - public void SetNonNullable() - { - // arrange - var field = new ObjectFieldResult(); - - // act - field.Set("abc", "def", false); - - // assert - Assert.Equal("abc", field.Name); - Assert.Equal("def", field.Value); - Assert.False(field.IsNullable); - Assert.True(field.IsInitialized); - } - - [Fact] - public void NewInstance() - { - // arrange - // act - var field = new ObjectFieldResult(); - - // assert - Assert.Null(field.Name); - Assert.Null(field.Value); - Assert.True(field.IsNullable); - Assert.False(field.IsInitialized); - } - - [Fact] - public void ResetInstance() - { - // arrange - var field = new ObjectFieldResult(); - field.Set("abc", "def", false); - - // act - field.Reset(); - - // assert - Assert.Null(field.Name); - Assert.Null(field.Value); - Assert.True(field.IsNullable); - Assert.False(field.IsInitialized); - } -} diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ObjectResultTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ObjectResultTests.cs deleted file mode 100644 index 1925df6ed4f..00000000000 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/ObjectResultTests.cs +++ /dev/null @@ -1,213 +0,0 @@ -namespace HotChocolate.Execution.Processing; - -public class ObjectResultTests -{ - [InlineData(8)] - [InlineData(4)] - [InlineData(2)] - [Theory] - public void EnsureCapacity(int size) - { - // arrange - var resultMap = new ObjectResult(); - - // act - resultMap.EnsureCapacity(size); - - // assert - Assert.Equal(size, resultMap.Capacity); - } - - [Fact] - public void SetValue() - { - // arrange - var objectResult = new ObjectResult(); - objectResult.EnsureCapacity(1); - - // act - objectResult.SetValueUnsafe(0, "abc", "def"); - - // assert - Assert.Collection( - (IEnumerable)objectResult, - t => - { - Assert.Equal("abc", t.Name); - Assert.Equal("def", t.Value); - }); - } - - [InlineData(9)] - [InlineData(8)] - [InlineData(7)] - [InlineData(5)] - [InlineData(4)] - [InlineData(3)] - [Theory] - public void GetValue_ValueIsFound(int capacity) - { - // arrange - var objectResult = new ObjectResult(); - objectResult.EnsureCapacity(capacity); - objectResult.SetValueUnsafe(0, "abc", "def"); - objectResult.SetValueUnsafe(capacity / 2, "def", "def"); - objectResult.SetValueUnsafe(capacity - 1, "ghi", "def"); - - // act - var value = objectResult.TryGetValue("def", out var index); - - // assert - Assert.Equal("def", value?.Name); - Assert.Equal(capacity / 2, index); - } - - [InlineData(9)] - [InlineData(8)] - [InlineData(7)] - [InlineData(5)] - [InlineData(4)] - [InlineData(3)] - [Theory] - public void TryGetValue_ValueIsFound(int capacity) - { - // arrange - var objectResult = new ObjectResult(); - objectResult.EnsureCapacity(capacity); - objectResult.SetValueUnsafe(0, "abc", "def"); - objectResult.SetValueUnsafe(capacity / 2, "def", "def"); - objectResult.SetValueUnsafe(capacity - 1, "ghi", "def"); - - IReadOnlyDictionary dict = objectResult; - - // act - var found = dict.TryGetValue("def", out var value); - - // assert - Assert.True(found); - Assert.Equal("def", value); - } - - [InlineData(9)] - [InlineData(8)] - [InlineData(7)] - [InlineData(5)] - [InlineData(4)] - [InlineData(3)] - [Theory] - public void TryGetValue_ValueIsNotFound(int capacity) - { - // arrange - var objectResult = new ObjectResult(); - objectResult.EnsureCapacity(capacity); - objectResult.SetValueUnsafe(0, "abc", "def"); - objectResult.SetValueUnsafe(capacity / 2, "def", "def"); - objectResult.SetValueUnsafe(capacity - 1, "ghi", "def"); - - IReadOnlyDictionary dict = objectResult; - - // act - var found = dict.TryGetValue("jkl", out var value); - - // assert - Assert.False(found); - Assert.Null(value); - } - - [InlineData(9)] - [InlineData(8)] - [InlineData(7)] - [InlineData(5)] - [InlineData(4)] - [InlineData(3)] - [Theory] - public void ContainsKey(int capacity) - { - // arrange - var objectResult = new ObjectResult(); - objectResult.EnsureCapacity(capacity); - objectResult.SetValueUnsafe(0, "abc", "def"); - objectResult.SetValueUnsafe(capacity / 2, "def", "def"); - objectResult.SetValueUnsafe(capacity - 1, "ghi", "def"); - - IReadOnlyDictionary dict = objectResult; - - // act - var found = dict.ContainsKey("def"); - - // assert - Assert.True(found); - } - - [Fact] - public void EnumerateResultValue() - { - // arrange - var objectResult = new ObjectResult(); - objectResult.EnsureCapacity(5); - - // act - objectResult.SetValueUnsafe(0, "abc1", "def"); - objectResult.SetValueUnsafe(2, "abc2", "def"); - objectResult.SetValueUnsafe(4, "abc3", "def"); - - // assert - Assert.Collection( - (IEnumerable)objectResult, - t => - { - Assert.Equal("abc1", t.Name); - Assert.Equal("def", t.Value); - }, - t => - { - Assert.Equal("abc2", t.Name); - Assert.Equal("def", t.Value); - }, - t => - { - Assert.Equal("abc3", t.Name); - Assert.Equal("def", t.Value); - }); - } - - [Fact] - public void EnumerateKeys() - { - // arrange - var objectResult = new ObjectResult(); - objectResult.EnsureCapacity(5); - - // act - objectResult.SetValueUnsafe(0, "abc1", "def"); - objectResult.SetValueUnsafe(2, "abc2", "def"); - objectResult.SetValueUnsafe(4, "abc3", "def"); - - // assert - Assert.Collection( - ((IReadOnlyDictionary)objectResult).Keys, - t => Assert.Equal("abc1", t), - t => Assert.Equal("abc2", t), - t => Assert.Equal("abc3", t)); - } - - [Fact] - public void EnumerateValues() - { - // arrange - var objectResult = new ObjectResult(); - objectResult.EnsureCapacity(5); - - // act - objectResult.SetValueUnsafe(0, "abc1", "def"); - objectResult.SetValueUnsafe(2, "abc2", "def"); - objectResult.SetValueUnsafe(4, "abc3", "def"); - - // assert - Assert.Collection( - ((IReadOnlyDictionary)objectResult).Values, - t => Assert.Equal("def", t), - t => Assert.Equal("def", t), - t => Assert.Equal("def", t)); - } -} diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/__snapshots__/ResultBuilderTests.BuildResult_SimpleResultSet_SnapshotMatches.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/__snapshots__/ResultBuilderTests.BuildResult_SimpleResultSet_SnapshotMatches.snap deleted file mode 100644 index 769cd361886..00000000000 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/Result/__snapshots__/ResultBuilderTests.BuildResult_SimpleResultSet_SnapshotMatches.snap +++ /dev/null @@ -1,5 +0,0 @@ -{ - "data": { - "abc": "def" - } -} diff --git a/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs b/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs index 9274f7f9d17..56dfcd88f37 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs @@ -47,8 +47,8 @@ public async Task Warmup_Request_Warms_Up_Caches() // assert 2 Assert.Null(regularOperationResult.Errors); - Assert.NotNull(regularOperationResult.Data); - Assert.NotEmpty(regularOperationResult.Data); + Assert.False(regularOperationResult.IsDataNull); + Assert.True(regularOperationResult.UnwrapData().EnumerateObject().Any()); Assert.True(documentCache.TryGetDocument(documentId, out _)); Assert.Equal(1, operationCache.Count); diff --git a/src/HotChocolate/Data/test/Data.Tests/PagingHelperIntegrationTests.cs b/src/HotChocolate/Data/test/Data.Tests/PagingHelperIntegrationTests.cs index 2b7530a0bfb..fafd08dd6e9 100644 --- a/src/HotChocolate/Data/test/Data.Tests/PagingHelperIntegrationTests.cs +++ b/src/HotChocolate/Data/test/Data.Tests/PagingHelperIntegrationTests.cs @@ -544,11 +544,12 @@ public async Task Nested_Paging_First_2() // Assert var operationResult = result.ExpectOperationResult(); + operationResult.Extensions = []; await Snapshot .Create(postFix: TestEnvironment.TargetFramework) .AddQueries(queries) - .Add(operationResult.WithExtensions(ImmutableDictionary.Empty)) + .Add(operationResult) .MatchMarkdownAsync(); } diff --git a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs index 0188ef4d7a8..43abffb803a 100644 --- a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs +++ b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs @@ -1,4 +1,3 @@ -using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using HotChocolate.Language; using HotChocolate.PersistedOperations; @@ -47,7 +46,7 @@ public async ValueTask InvokeAsync(RequestContext context) && context.Request.Extensions.TryGetValue(PersistedQuery, out var s) && s is IReadOnlyDictionary settings) { - var extensions = result.Extensions ?? ImmutableDictionary.Empty; + var extensions = result.Extensions; // hash is found and matches the query key -> store the query if (DoHashesMatch(settings, documentInfo.Id, _hashProvider.Name, out var userHash)) diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs index b0fe06d2f02..4aed775bc78 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs @@ -42,7 +42,7 @@ await storage.SaveAsync( if (documentInfo.Id == documentId) { var result = c.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? []; + var extensions = result.Extensions; result.Extensions = extensions.SetItem("persistedDocument", true); } }) @@ -75,7 +75,7 @@ public async Task ExecutePersistedOperation_After_Expiration() if (documentInfo.Id == documentId) { var result = c.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? []; + var extensions = result.Extensions; result.Extensions = extensions.SetItem("persistedDocument", true); } }) @@ -123,7 +123,7 @@ public async Task ExecutePersistedOperation_Before_Expiration() if (documentInfo.Id == documentId) { var result = c.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? []; + var extensions = result.Extensions; result.Extensions = extensions.SetItem("persistedDocument", true); } }) @@ -163,7 +163,7 @@ public async Task ExecutePersistedOperation_ApplicationDI() if (documentInfo.Id == documentId) { var result = c.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? []; + var extensions = result.Extensions; result.Extensions = extensions.SetItem("persistedDocument", true); } }) @@ -201,7 +201,7 @@ public async Task ExecutePersistedOperation_ApplicationDI_Default() if (documentInfo.Id == documentId) { var result = c.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? []; + var extensions = result.Extensions; result.Extensions = extensions.SetItem("persistedDocument", true); } }) @@ -236,7 +236,7 @@ public async Task ExecutePersistedOperation_NotFound() if (documentInfo.Id == documentId) { var result = c.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? []; + var extensions = result.Extensions; result.Extensions = extensions.SetItem("persistedDocument", true); } }) diff --git a/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/FilterVisitorTestBase.cs b/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/FilterVisitorTestBase.cs index 2069863dba2..c75e5728e4d 100644 --- a/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/FilterVisitorTestBase.cs +++ b/src/HotChocolate/Raven/test/Data.Raven.Filters.Tests/FilterVisitorTestBase.cs @@ -60,11 +60,8 @@ protected IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("sql", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("sql", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("sql", queryString); } }) .ModifyRequestOptions(x => x.IncludeExceptionDetails = true) diff --git a/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/RavenAsyncDocumentQueryTests.cs b/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/RavenAsyncDocumentQueryTests.cs index 5165a5e5dee..9e2eb9bcc5d 100644 --- a/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/RavenAsyncDocumentQueryTests.cs +++ b/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/RavenAsyncDocumentQueryTests.cs @@ -435,11 +435,8 @@ private ValueTask CreateSchemaAsync() await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .ModifyRequestOptions(x => x.IncludeExceptionDetails = true) From a1d18d0563930ba80d988a7bc21586809de65f4e Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Wed, 17 Dec 2025 14:56:51 +0100 Subject: [PATCH 041/144] Add Create method to ImmutableOrderedDictionary; refactor OperationResult and related tests to use ImmutableOrderedDictionary for extensions --- .../Immutable/ImmutableOrderedDictionary.cs | 38 ++++++++++++ .../Execution/OperationResult.cs | 38 ++++++++++++ .../Extensions/OperationContextExtensions.cs | 6 +- .../Processing/OperationResultBuilder.cs | 31 +++++----- .../Integration/DataLoader/DataLoaderTests.cs | 18 ++---- .../TransactionScopeHandlerTests.cs | 2 +- .../CostAnalysis/Utilities/ResultHelper.cs | 23 +++---- .../Data.Tests/InterfaceIntegrationTests.cs | 8 +-- .../Execution/OperationPlanContext.cs | 3 +- .../Text/Json/CompositeResultDocument.cs | 4 +- .../IntegrationTests.cs | 3 +- .../IntegrationTests.cs | 7 +-- .../RavenQueryableTests.cs | 6 +- .../VisitorTestBase.cs | 7 +-- .../ProjectionVisitorTestBase.cs | 7 +-- .../SortVisitorTestBase.cs | 7 +-- .../FilterVisitorTestBase.cs | 7 +-- .../TestHelper/TestServerHelper.cs | 61 +++++++++---------- 18 files changed, 163 insertions(+), 113 deletions(-) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Collections/Immutable/ImmutableOrderedDictionary.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Collections/Immutable/ImmutableOrderedDictionary.cs index f330a177dc8..ec770f6b299 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Collections/Immutable/ImmutableOrderedDictionary.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Collections/Immutable/ImmutableOrderedDictionary.cs @@ -494,6 +494,26 @@ internal static ImmutableOrderedDictionary Create( return new ImmutableOrderedDictionary(keys.ToImmutable(), map.ToImmutable()); } + + internal static ImmutableOrderedDictionary Create( + OrderedDictionary items) + { + if (items.Count == 0) + { + return Empty; + } + + var keys = ImmutableList.CreateBuilder(); + var map = ImmutableDictionary.CreateBuilder(); + + foreach (var item in items) + { + keys.Add(item.Key); + map.Add(item.Key, item.Value); + } + + return new ImmutableOrderedDictionary(keys.ToImmutable(), map.ToImmutable()); + } } /// @@ -523,3 +543,21 @@ public static ImmutableOrderedDictionary Create( where TKey : IEquatable => ImmutableOrderedDictionary.Create(items); } + +/// +/// Provides extension methods for immutable ordered dictionaries. +/// +public static class ImmutableOrderedDictionaryExtensions +{ + /// + /// Converts the specified ordered dictionary to an immutable ordered dictionary. + /// + /// The type of keys in the dictionary. + /// The type of values in the dictionary. + /// The ordered dictionary to convert. + /// An immutable ordered dictionary containing the same key-value pairs as the input dictionary. + public static ImmutableOrderedDictionary ToImmutableOrderedDictionary( + this OrderedDictionary dictionary) + where TKey : IEquatable + => ImmutableOrderedDictionary.Create(dictionary); +} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs index 9a84eee2be6..c6231291388 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs @@ -148,6 +148,23 @@ public OperationResult(ImmutableOrderedDictionary extensions) Extensions = extensions; } + private OperationResult( + object? data, + DataFlags dataFlags, + IRawJsonFormatter? dataFormatter, + ImmutableList? errors, + ImmutableOrderedDictionary? extensions, + IAsyncDisposable resourceOwner) + { + _dataFlags = dataFlags; + Data = data; + Errors = errors ?? []; + Extensions = extensions ?? []; + Features.Set(dataFormatter); + + RegisterForCleanup(resourceOwner.DisposeAsync); + } + /// /// Gets the kind of execution result. /// @@ -289,6 +306,27 @@ public bool? HasNext /// public IRawJsonFormatter? JsonFormatter => Features.Get(); + /// + /// Creates a new operation result with the specified error added. + /// + /// The errors to add to the result. + /// A new operation result with the added errors. + public OperationResult WithErrors(ImmutableList errors) + { + ArgumentNullException.ThrowIfNull(errors); + + return new OperationResult(Data, _dataFlags, JsonFormatter, errors, Extensions, this) + { + RequestIndex = RequestIndex, + VariableIndex = VariableIndex, + Path = Path, + Pending = Pending, + Incremental = Incremental, + Completed = Completed, + HasNext = HasNext + }; + } + /// /// Creates an operation result containing a single error. /// diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs index 229eeb2d74e..eaa7d29fffe 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs @@ -70,11 +70,11 @@ public OperationResult BuildResult() resultBuilder.Data.Data.IsNullOrInvalidated, resultBuilder.Data, resultBuilder.Data), - resultBuilder.Errors is { Count: > 0 } errors ? errors : null, - resultBuilder.Extensions is { Count: > 0 } extensions ? extensions : null) + resultBuilder.Errors, + resultBuilder.Extensions) { RequestIndex = resultBuilder.RequestIndex > -1 ? resultBuilder.RequestIndex : 0, - VariableIndex = resultBuilder.VariableIndex > -1 ? resultBuilder.VariableIndex : 0, + VariableIndex = resultBuilder.VariableIndex > -1 ? resultBuilder.VariableIndex : 0, ContextData = resultBuilder.ContextData }; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs index f5b8376561d..e93b073b0d8 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using HotChocolate.Collections.Immutable; using HotChocolate.Resolvers; using HotChocolate.Text.Json; @@ -16,22 +17,22 @@ internal sealed class OperationResultBuilder : IOperationResultBuilder public ResultDocument Data { get; set; } = null!; - public ImmutableList Errors { get; set; } = ImmutableList.Empty; + public ImmutableList Errors { get; set; } = []; - public ImmutableDictionary Extensions { get; set; } = ImmutableDictionary.Empty; + public ImmutableOrderedDictionary Extensions { get; set; } = []; public ImmutableDictionary ContextData { get; set; } = ImmutableDictionary.Empty; - public ImmutableList? Pending { get; set; } + public ImmutableList Pending { get; set; } = []; - public ImmutableList? Incremental { get; set; } + public ImmutableList Incremental { get; set; } = []; - public ImmutableList? Completed { get; set; } + public ImmutableList Completed { get; set; } = []; - public ImmutableList> CleanupTasks { get; set; } = ImmutableList>.Empty; + public ImmutableList> CleanupTasks { get; set; } = []; // TODO : Is this still needed? - public ImmutableHashSet NonNullViolations { get; set; } = ImmutableHashSet.Empty; + public ImmutableHashSet NonNullViolations { get; set; } = []; public bool? HasNext { get; set; } @@ -157,14 +158,14 @@ public void Reset() VariableIndex = -1; Path = null; Data = null!; - Errors = ImmutableList.Empty; - Pending = ImmutableList.Empty; - Extensions = ImmutableDictionary.Empty; - CleanupTasks = ImmutableList>.Empty; - NonNullViolations = ImmutableHashSet.Empty; - Pending = null; - Incremental = null; - Completed = null; + Errors = []; + Extensions = []; + ContextData = ImmutableDictionary.Empty; + CleanupTasks = []; + NonNullViolations = []; + Pending = []; + Incremental = []; + Completed = []; HasNext = null; } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/DataLoaderTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/DataLoaderTests.cs index d4090096fb5..2580c3577bc 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/DataLoaderTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/DataLoaderTests.cs @@ -35,8 +35,7 @@ public async Task ClassDataLoader() .GetDataLoader(_ => throw new Exception()); var result = context.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? ImmutableDictionary.Empty; - extensions = extensions.SetItem("loads", dataLoader.Loads); + result.Extensions = result.Extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline()); @@ -101,8 +100,7 @@ public async Task ClassDataLoader_Out_Off_GraphQL_Context_Not_Initialized() .GetDataLoader(_ => throw new Exception()); var result = context.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? ImmutableDictionary.Empty; - extensions = extensions.SetItem("loads", dataLoader.Loads); + result.Extensions = result.Extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline() .Services @@ -135,8 +133,7 @@ public async Task ClassDataLoader_Out_Off_GraphQL_Context() .GetDataLoader(_ => throw new Exception()); var result = context.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? ImmutableDictionary.Empty; - extensions = extensions.SetItem("loads", dataLoader.Loads); + result.Extensions = result.Extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline() .Services @@ -172,8 +169,7 @@ public async Task ClassDataLoader_Out_Off_GraphQL_Context_Just_Works() .GetDataLoader(_ => throw new Exception()); var result = context.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? ImmutableDictionary.Empty; - extensions = extensions.SetItem("loads", dataLoader.Loads); + result.Extensions = result.Extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline() .Services @@ -256,8 +252,7 @@ public async Task ClassDataLoader_Resolve_From_DependencyInjection() var dataLoader = (TestDataLoader)context.RequestServices.GetRequiredService(); var result = context.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? ImmutableDictionary.Empty; - extensions = extensions.SetItem("loads", dataLoader.Loads); + result.Extensions = result.Extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline()); @@ -322,8 +317,7 @@ public async Task ClassDataLoader_Resolve_From_DependencyInjection_Using_Factory var dataLoader = (TestDataLoader)context.RequestServices.GetRequiredService(); var result = context.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? ImmutableDictionary.Empty; - extensions = extensions.SetItem("loads", dataLoader.Loads); + result.Extensions = result.Extensions.SetItem("loads", dataLoader.Loads); }) .UseDefaultPipeline()); diff --git a/src/HotChocolate/Core/test/Execution.Tests/TransactionScopeHandlerTests.cs b/src/HotChocolate/Core/test/Execution.Tests/TransactionScopeHandlerTests.cs index bacec108e9f..b08e86b3b1f 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/TransactionScopeHandlerTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/TransactionScopeHandlerTests.cs @@ -95,7 +95,7 @@ public class MockTransactionScope(Action complete, Action dispose, RequestContex { public void Complete() { - if (context.Result is IOperationResult { Data: not null, Errors: null or { Count: 0 } }) + if (context.Result is OperationResult { Data: not null, Errors: null or { Count: 0 } }) { complete(); } diff --git a/src/HotChocolate/CostAnalysis/src/CostAnalysis/Utilities/ResultHelper.cs b/src/HotChocolate/CostAnalysis/src/CostAnalysis/Utilities/ResultHelper.cs index f7f6e0f4d28..4f4f0f29e59 100644 --- a/src/HotChocolate/CostAnalysis/src/CostAnalysis/Utilities/ResultHelper.cs +++ b/src/HotChocolate/CostAnalysis/src/CostAnalysis/Utilities/ResultHelper.cs @@ -15,7 +15,7 @@ internal static class ResultHelper public static IExecutionResult CreateError(IError error, CostMetrics? costMetrics) { - ImmutableDictionary? extensions = null; + ImmutableOrderedDictionary? extensions = null; if (costMetrics is not null) { extensions = AddCostMetrics(extensions, costMetrics); @@ -28,18 +28,18 @@ public static IExecutionResult CreateError(IError error, CostMetrics? costMetric public static IExecutionResult CreateError(IReadOnlyList errors, CostMetrics? costMetrics) { - ImmutableDictionary? extensions = null; + ImmutableOrderedDictionary? extensions = null; if (costMetrics is not null) { extensions = AddCostMetrics(extensions, costMetrics); } - return new OperationResult([..errors], extensions) { ContextData = s_validationError }; + return new OperationResult([.. errors], extensions) { ContextData = s_validationError }; } public static IExecutionResult CreateResult(this CostMetrics costMetrics) { - var extensions = AddCostMetrics(ImmutableDictionary.Empty, costMetrics); + var extensions = AddCostMetrics([], costMetrics); return new OperationResult(extensions: extensions) { ContextData = s_ok }; } @@ -99,12 +99,13 @@ private static ResponseStream AddCostMetrics( if (onFirstResult.IsEmpty) { onFirstResult = - ImmutableList.Create>( + [ result => { result.Extensions = AddCostMetrics(result.Extensions, costMetrics); return result; - }); + } + ]; } else { @@ -121,23 +122,23 @@ private static ResponseStream AddCostMetrics( return responseStream; } - private static ImmutableDictionary AddCostMetrics( - ImmutableDictionary? extensions, + private static ImmutableOrderedDictionary AddCostMetrics( + ImmutableOrderedDictionary? extensions, CostMetrics costMetrics) { var costMetricsMap = CreateCostMetricsMap(costMetrics); return AddCostMetrics(extensions, costMetricsMap); } - private static ImmutableDictionary AddCostMetrics( - ImmutableDictionary? extensions, + private static ImmutableOrderedDictionary AddCostMetrics( + ImmutableOrderedDictionary? extensions, ImmutableOrderedDictionary costMetrics) { const string costKey = "operationCost"; if (extensions is null || extensions.Count == 0) { - return ImmutableDictionary.Empty.Add(costKey, costMetrics); + return ImmutableOrderedDictionary.Empty.Add(costKey, costMetrics); } return extensions.Add(costKey, costMetrics); diff --git a/src/HotChocolate/Data/test/Data.Tests/InterfaceIntegrationTests.cs b/src/HotChocolate/Data/test/Data.Tests/InterfaceIntegrationTests.cs index f9915b1dae1..f9cb5802e37 100644 --- a/src/HotChocolate/Data/test/Data.Tests/InterfaceIntegrationTests.cs +++ b/src/HotChocolate/Data/test/Data.Tests/InterfaceIntegrationTests.cs @@ -63,7 +63,7 @@ public async Task Query_Owner_Animals() .Build()); var operationResult = result.ExpectOperationResult(); - operationResult.Extensions = ImmutableDictionary.Empty; + operationResult.Extensions = []; await Snapshot .Create(postFix: TestEnvironment.TargetFramework) @@ -116,7 +116,7 @@ public async Task Query_Owner_Animals_With_TotalCount() .Build()); var operationResult = result.ExpectOperationResult(); - operationResult.Extensions = ImmutableDictionary.Empty; + operationResult.Extensions = []; await Snapshot .Create(postFix: TestEnvironment.TargetFramework) @@ -173,7 +173,7 @@ ... on Cat { .Build()); var operationResult = result.ExpectOperationResult(); - operationResult.Extensions = ImmutableDictionary.Empty; + operationResult.Extensions = []; await Snapshot .Create(postFix: TestEnvironment.TargetFramework) @@ -217,7 +217,7 @@ public async Task Query_Pets() .Build()); var operationResult = result.ExpectOperationResult(); - operationResult.Extensions = ImmutableDictionary.Empty; + operationResult.Extensions = []; await Snapshot .Create( diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs index eeb6ddfb7ad..bb1f55e0f45 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using HotChocolate.Buffers; +using HotChocolate.Collections.Immutable; using HotChocolate.Execution; using HotChocolate.Features; using HotChocolate.Fusion.Diagnostics; @@ -284,7 +285,7 @@ internal OperationResult Complete(bool reusable = false) result, result), result.Errors?.ToImmutableList(), - result.Extensions?.ToImmutableDictionary()); + result.Extensions?.ToImmutableOrderedDictionary()); // we take over the memory owners from the result context // and store them on the response so that the server can diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs index 8521ed61412..8cfccd0c18e 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs @@ -14,7 +14,7 @@ public sealed partial class CompositeResultDocument : IDisposable private readonly Operation _operation; private readonly ulong _includeFlags; private List? _errors; - private Dictionary? _extensions; + private OrderedDictionary? _extensions; internal MetaDb _metaDb; private bool _disposed; @@ -35,7 +35,7 @@ public List? Errors internal set => _errors = value; } - public Dictionary? Extensions + public OrderedDictionary? Extensions { get => _extensions; internal set => _extensions = value; diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs index 518605e4d7c..f5e3dd7b082 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs @@ -72,8 +72,7 @@ public async Task ExecutePersistedOperation_NotFound() if (c.IsPersistedOperationDocument()) { var result = c.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? []; - result.Extensions = extensions.SetItem("persistedDocument", true); + result.Extensions = result.Extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.InMemory.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.InMemory.Tests/IntegrationTests.cs index 7eb3f6c7ba8..2dc428eec53 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.InMemory.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.InMemory.Tests/IntegrationTests.cs @@ -1,4 +1,3 @@ -using System.Collections.Immutable; using HotChocolate.Execution; using HotChocolate.Language; using HotChocolate.Types; @@ -29,8 +28,7 @@ public async Task ExecutePersistedOperation() if (c.IsPersistedOperationDocument()) { var result = c.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? ImmutableDictionary.Empty; - result.Extensions = extensions.SetItem("persistedDocument", true); + result.Extensions = result.Extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() @@ -66,8 +64,7 @@ public async Task ExecutePersistedOperation_NotFound() if (c.IsPersistedOperationDocument()) { var result = c.Result.ExpectOperationResult(); - var extensions = result.Extensions ?? ImmutableDictionary.Empty; - result.Extensions = extensions.SetItem("persistedDocument", true); + result.Extensions = result.Extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() diff --git a/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/RavenQueryableTests.cs b/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/RavenQueryableTests.cs index b20b15ae833..42a61ea61cd 100644 --- a/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/RavenQueryableTests.cs +++ b/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/RavenQueryableTests.cs @@ -431,10 +431,8 @@ private ValueTask CreateSchemaAsync() await next(context); if (context.ContextData.TryGetValue("query", out var queryString)) { - context.Result = OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("query", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("query", queryString); } }) .ModifyRequestOptions(x => x.IncludeExceptionDetails = true) diff --git a/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/VisitorTestBase.cs b/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/VisitorTestBase.cs index d0b2213fd41..39f4819ce7d 100644 --- a/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/VisitorTestBase.cs +++ b/src/HotChocolate/Raven/test/Data.Raven.Paging.Tests/VisitorTestBase.cs @@ -66,11 +66,8 @@ protected IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("sql", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("sql", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("sql", queryString); } }) .ModifyRequestOptions(x => x.IncludeExceptionDetails = true) diff --git a/src/HotChocolate/Raven/test/Data.Raven.Projections.Tests/ProjectionVisitorTestBase.cs b/src/HotChocolate/Raven/test/Data.Raven.Projections.Tests/ProjectionVisitorTestBase.cs index 8a95cb3ffbc..a0a3ebbae85 100644 --- a/src/HotChocolate/Raven/test/Data.Raven.Projections.Tests/ProjectionVisitorTestBase.cs +++ b/src/HotChocolate/Raven/test/Data.Raven.Projections.Tests/ProjectionVisitorTestBase.cs @@ -103,11 +103,8 @@ protected IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("sql", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("sql", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("sql", queryString); } }) .UseDefaultPipeline(); diff --git a/src/HotChocolate/Raven/test/Data.Raven.Sorting.Tests/SortVisitorTestBase.cs b/src/HotChocolate/Raven/test/Data.Raven.Sorting.Tests/SortVisitorTestBase.cs index 5168c664e66..1b2ced78e07 100644 --- a/src/HotChocolate/Raven/test/Data.Raven.Sorting.Tests/SortVisitorTestBase.cs +++ b/src/HotChocolate/Raven/test/Data.Raven.Sorting.Tests/SortVisitorTestBase.cs @@ -80,11 +80,8 @@ protected IRequestExecutor CreateSchema( await next(context); if (context.ContextData.TryGetValue("sql", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("sql", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("sql", queryString); } }) .ModifyRequestOptions(x => x.IncludeExceptionDetails = true) diff --git a/src/HotChocolate/Spatial/test/Data.Filters.SqlServer.Tests/FilterVisitorTestBase.cs b/src/HotChocolate/Spatial/test/Data.Filters.SqlServer.Tests/FilterVisitorTestBase.cs index 6c805e55f30..3679c0850ae 100644 --- a/src/HotChocolate/Spatial/test/Data.Filters.SqlServer.Tests/FilterVisitorTestBase.cs +++ b/src/HotChocolate/Spatial/test/Data.Filters.SqlServer.Tests/FilterVisitorTestBase.cs @@ -84,11 +84,8 @@ protected async Task CreateSchemaAsync( await next(context); if (context.ContextData.TryGetValue("sql", out var queryString)) { - context.Result = - OperationResultBuilder - .FromResult(context.Result!.ExpectOperationResult()) - .SetContextData("sql", queryString) - .Build(); + var result = context.Result.ExpectOperationResult(); + result.ContextData = result.ContextData.SetItem("sql", queryString); } }) .UseDefaultPipeline() diff --git a/src/StrawberryShake/Client/test/Transport.WebSocket.Tests/TestHelper/TestServerHelper.cs b/src/StrawberryShake/Client/test/Transport.WebSocket.Tests/TestHelper/TestServerHelper.cs index 4f045f285b6..be35f7b7c5e 100644 --- a/src/StrawberryShake/Client/test/Transport.WebSocket.Tests/TestHelper/TestServerHelper.cs +++ b/src/StrawberryShake/Client/test/Transport.WebSocket.Tests/TestHelper/TestServerHelper.cs @@ -51,25 +51,21 @@ public static IWebHost CreateServer(Action configure, o nameof(HttpContext), out var value) && value is HttpContext httpContext - && context.Result is HotChocolate.Execution.IOperationResult result) + && context.Result is OperationResult result) { var headers = httpContext.Request.Headers; if (headers.ContainsKey("sendErrorStatusCode")) { - context.Result = result = - OperationResultBuilder - .FromResult(result) - .SetContextData(ExecutionContextData.HttpStatusCode, 403) - .Build(); + result.ContextData = + result.ContextData.SetItem( + ExecutionContextData.HttpStatusCode, + 403); } if (headers.ContainsKey("sendError")) { - context.Result = - OperationResultBuilder - .FromResult(result) - .AddError(new Error { Message = "Some error!" }) - .Build(); + var errors = result.Errors.Add(new Error { Message = "Some error!" }); + context.Result = result.WithErrors(errors); } } @@ -78,30 +74,29 @@ public static IWebHost CreateServer(Action configure, o }) .Configure( app => - app.Use( - async (ct, next) => + app.Use(async (ct, next) => + { + try + { + // Kestrel does not return proper error responses: + // https://github.com/aspnet/KestrelHttpServer/issues/43 + await next(); + } + catch (Exception ex) + { + if (ct.Response.HasStarted) { - try - { - // Kestrel does not return proper error responses: - // https://github.com/aspnet/KestrelHttpServer/issues/43 - await next(); - } - catch (Exception ex) - { - if (ct.Response.HasStarted) - { - throw; - } + throw; + } - ct.Response.StatusCode = 500; - ct.Response.Headers.Clear(); - await ct.Response.WriteAsync(ex.ToString()); - } - }) - .UseWebSockets() - .UseRouting() - .UseEndpoints(e => e.MapGraphQL())) + ct.Response.StatusCode = 500; + ct.Response.Headers.Clear(); + await ct.Response.WriteAsync(ex.ToString()); + } + }) + .UseWebSockets() + .UseRouting() + .UseEndpoints(e => e.MapGraphQL())) .Build(); host.Start(); From f3c99bd9d34f1222a4e4d27ac64a7e561c01ad62 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 19 Dec 2025 08:40:29 +0100 Subject: [PATCH 042/144] Refactor GeoJSON serialization tests to throw LeafCoercionException instead of SerializationException - Updated multiple test cases across various GeoJSON input and serializer tests to assert LeafCoercionException for invalid inputs instead of SerializationException. - Changed method calls from ParseLiteral and Serialize to their respective CoerceInputLiteral and CoerceOutputValue methods where applicable. - Ensured consistency in exception handling across all GeoJSON related tests. --- .../Resolvers/ArgumentParser.cs | 4 +- .../src/ApolloFederation/ThrowHelper.cs | 12 +- .../ApolloFederation/Types/FieldSetType.cs | 2 +- .../src/ApolloFederation/Types/PolicyType.cs | 2 +- .../src/ApolloFederation/Types/ScopeType.cs | 2 +- .../src/ApolloFederation/Types/_AnyType.cs | 4 +- .../FieldSetTypeTests.cs | 12 +- .../ApolloFederation.Tests/_AnyTypeTests.cs | 22 +- .../Types/IScalarTypeDefinition.cs | 2 +- .../BaseTypes/IntToStructBaseType.cs | 14 +- .../BaseTypes/StringToClassBaseType.cs | 12 +- .../BaseTypes/StringToStructBaseType.cs | 12 +- .../src/Types.NodaTime/DateTimeZoneType.cs | 2 +- .../Core/src/Types.NodaTime/DurationType.cs | 2 +- .../Core/src/Types.NodaTime/InstantType.cs | 2 +- .../src/Types.NodaTime/IsoDayOfWeekType.cs | 2 +- .../src/Types.NodaTime/LocalDateTimeType.cs | 2 +- .../Core/src/Types.NodaTime/LocalDateType.cs | 2 +- .../Core/src/Types.NodaTime/LocalTimeType.cs | 2 +- .../src/Types.NodaTime/OffsetDateTimeType.cs | 2 +- .../Core/src/Types.NodaTime/OffsetDateType.cs | 2 +- .../Core/src/Types.NodaTime/OffsetTimeType.cs | 2 +- .../Core/src/Types.NodaTime/OffsetType.cs | 2 +- .../Core/src/Types.NodaTime/PeriodType.cs | 2 +- .../src/Types.NodaTime/ZonedDateTimeType.cs | 2 +- .../src/Types.Scalars.Upload/UploadType.cs | 2 +- .../src/Types.Scalars/EmailAddressType.cs | 4 +- .../Core/src/Types.Scalars/HexColorType.cs | 4 +- .../Core/src/Types.Scalars/HslType.cs | 4 +- .../Core/src/Types.Scalars/HslaType.cs | 4 +- .../Core/src/Types.Scalars/IPv4Type.cs | 4 +- .../Core/src/Types.Scalars/IPv6Type.cs | 4 +- .../Core/src/Types.Scalars/IsbnType.cs | 4 +- .../Core/src/Types.Scalars/LatitudeType.cs | 4 +- .../src/Types.Scalars/LocalCurrencyType.cs | 2 +- .../Core/src/Types.Scalars/LongitudeType.cs | 4 +- .../Core/src/Types.Scalars/MacAddressType.cs | 4 +- .../src/Types.Scalars/NegativeFloatType.cs | 6 +- .../Core/src/Types.Scalars/NegativeIntType.cs | 6 +- .../src/Types.Scalars/NonEmptyStringType.cs | 6 +- .../src/Types.Scalars/NonNegativeFloatType.cs | 6 +- .../src/Types.Scalars/NonNegativeIntType.cs | 6 +- .../src/Types.Scalars/NonPositiveFloatType.cs | 6 +- .../src/Types.Scalars/NonPositiveIntType.cs | 6 +- .../Core/src/Types.Scalars/PhoneNumberType.cs | 4 +- .../Core/src/Types.Scalars/PortType.cs | 6 +- .../Core/src/Types.Scalars/PositiveIntType.cs | 4 +- .../Core/src/Types.Scalars/PostalCodeType.cs | 6 +- .../Core/src/Types.Scalars/RegexType.cs | 6 +- .../Core/src/Types.Scalars/RgbType.cs | 4 +- .../Core/src/Types.Scalars/RgbaType.cs | 4 +- .../Core/src/Types.Scalars/SignedByteType.cs | 6 +- .../Core/src/Types.Scalars/ThrowHelper.cs | 240 +++---- .../Core/src/Types.Scalars/UnsignedIntType.cs | 6 +- .../src/Types.Scalars/UnsignedLongType.cs | 6 +- .../src/Types.Scalars/UnsignedShortType.cs | 6 +- .../Core/src/Types.Scalars/UtcOffsetType.cs | 2 +- .../Processing/MiddlewareContext.Arguments.cs | 4 +- .../OperationCompiler.CoerceArgumentValues.cs | 2 +- .../OperationCompiler.CompileResolver.cs | 4 +- .../Processing/ValueCompletion.Leaf.cs | 6 +- .../Execution/Processing/ValueCompletion.cs | 2 +- .../Core/src/Types/Execution/ThrowHelper.cs | 2 +- .../Properties/TypeResources.Designer.cs | 672 +++++++++--------- .../src/Types/Properties/TypeResources.resx | 4 +- .../Properties/TypeResourcesExtensions.cs | 39 +- .../Composite/Types/FieldSelectionMapType.cs | 4 +- .../Composite/Types/FieldSelectionSetType.cs | 4 +- .../src/Types/Types/Contracts/ILeafType.cs | 158 ++-- ...nException.cs => LeafCoercionException.cs} | 10 +- .../src/Types/Types/DirectiveCollection.cs | 2 +- .../Core/src/Types/Types/EnumType.cs | 20 +- .../Types/Types/Extensions/TypeExtensions.cs | 2 +- .../Core/src/Types/Types/InputFormatter.cs | 12 +- .../Core/src/Types/Types/InputParser.cs | 14 +- .../Core/src/Types/Types/Scalars/AnyType.cs | 137 ++-- .../src/Types/Types/Scalars/BooleanType.cs | 51 +- .../src/Types/Types/Scalars/ByteArrayType.cs | 4 +- .../src/Types/Types/Scalars/DateTimeType.cs | 8 +- .../Core/src/Types/Types/Scalars/DateType.cs | 8 +- .../src/Types/Types/Scalars/FloatTypeBase.cs | 20 +- .../Core/src/Types/Types/Scalars/IdType.cs | 18 +- .../Types/Types/Scalars/IntegerTypeBase.cs | 4 +- .../Core/src/Types/Types/Scalars/JsonType.cs | 12 +- .../Types/Types/Scalars/LocalDateTimeType.cs | 8 +- .../src/Types/Types/Scalars/LocalDateType.cs | 8 +- .../src/Types/Types/Scalars/LocalTimeType.cs | 8 +- .../src/Types/Types/Scalars/ScalarType.cs | 255 +++---- .../src/Types/Types/Scalars/ScalarType~1.cs | 84 ++- .../src/Types/Types/Scalars/ScalarType~2.cs | 199 +++--- .../src/Types/Types/Scalars/StringType.cs | 2 +- .../src/Types/Types/Scalars/TimeSpanType.cs | 10 +- .../Core/src/Types/Types/Scalars/UrlType.cs | 8 +- .../Core/src/Types/Types/Scalars/UuidType.cs | 14 +- .../Core/src/Types/Utilities/ErrorHelper.cs | 2 +- .../Core/src/Types/Utilities/ThrowHelper.cs | 52 +- .../Processing/VariableCoercionHelperTests.cs | 6 +- .../ScalarExecutionErrorTests.cs | 20 +- .../Types.Scalars.Tests/LatitudeTypeTests.cs | 42 +- .../LocalCurrencyTypeTests.cs | 30 +- .../Types.Scalars.Tests/LongitudeTypeTests.cs | 42 +- .../Types.Scalars.Tests/ScalarTypeTestBase.cs | 20 +- .../Types.Scalars.Tests/UtcOffsetTypeTests.cs | 24 +- .../Configuration/SchemaTypeDiscoveryTests.cs | 8 +- .../test/Types.Tests/Types/EnumTypeTests.cs | 2 +- .../Types.Tests/Types/InputCoercionTests.cs | 12 +- .../Types.Tests/Types/InputParserTests.cs | 18 +- .../Types.Tests/Types/Scalars/AnyTypeTests.cs | 38 +- .../Types/Scalars/BooleanTypeTests.cs | 12 +- .../Types/Scalars/ByteArrayTypeTests.cs | 24 +- .../Types/Scalars/ByteTypeTests.cs | 34 +- .../Types/Scalars/DateTimeTypeTests.cs | 16 +- .../Types/Scalars/DateTypeTests.cs | 12 +- .../Types/Scalars/DecimalTypeTests.cs | 40 +- .../Types/Scalars/FloatTypeTests.cs | 40 +- .../Types.Tests/Types/Scalars/IdTypeTests.cs | 32 +- .../Types.Tests/Types/Scalars/IntTypeTests.cs | 34 +- .../Types/Scalars/LocalDateTimeTypeTests.cs | 12 +- .../Types/Scalars/LocalDateTypeTests.cs | 18 +- .../Types/Scalars/LocalTimeTypeTests.cs | 12 +- .../Types/Scalars/LongTypeTests.cs | 34 +- .../Types/Scalars/ScalarBindingTests.cs | 12 +- .../Types/Scalars/ShortTypeTests.cs | 34 +- .../Types/Scalars/StringTypeTests.cs | 26 +- .../Types/Scalars/TimeSpanTypeTests.cs | 8 +- .../Types.Tests/Types/Scalars/UrlTypeTests.cs | 20 +- .../Types/Scalars/UuidTypeTests.cs | 44 +- .../Validation.Tests/Types/InvalidScalar.cs | 6 +- .../Data/src/Data/Sorting/SortEnumType.cs | 2 +- .../FusionScalarTypeDefinition.cs | 2 +- .../InaccessibleTests.cs | 8 +- .../MongoDb/src/Types/BsonType.cs | 16 +- .../MongoDb/src/Types/ObjectIdType.cs | 2 +- .../MongoDb/src/Types/ThrowHelper.cs | 4 +- .../test/Types.MongoDb/BsonTypeTests.cs | 30 +- .../MutableScalarTypeDefinition.cs | 2 +- .../src/Types/GeoJsonCoordinatesType.cs | 8 +- .../Spatial/src/Types/GeoJsonPositionType.cs | 8 +- .../Spatial/src/Types/GeometryType.cs | 8 +- .../Types/Serialization/IGeoJsonSerializer.cs | 6 +- .../Spatial/src/Types/ThrowHelper.cs | 48 +- .../GeoJsonLineStringInputTests.cs | 8 +- .../GeoJsonLineStringSerializerTests.cs | 20 +- .../GeoJsonMultiLineStringInputTests.cs | 8 +- .../GeoJsonMultiLineStringSerializerTests.cs | 20 +- .../GeoJsonMultiPointInputTests.cs | 8 +- .../GeoJsonMultiPointSerializerTests.cs | 20 +- .../GeoJsonMultiPolygonInputTests.cs | 8 +- .../GeoJsonMultiPolygonSerializerTests.cs | 20 +- .../Types.Tests/GeoJsonPointInputTests.cs | 10 +- .../GeoJsonPointSerializerTests.cs | 22 +- .../Types.Tests/GeoJsonPolygonInputTests.cs | 8 +- .../GeoJsonPolygonSerializerTests.cs | 20 +- .../Types.Tests/GeoJsonPositionScalarTest.cs | 40 +- .../Types.Tests/GeoJsonTypeSerializerTests.cs | 4 +- 155 files changed, 1675 insertions(+), 1802 deletions(-) rename src/HotChocolate/Core/src/Types/Types/Contracts/{SerializationException.cs => LeafCoercionException.cs} (78%) diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Resolvers/ArgumentParser.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Resolvers/ArgumentParser.cs index d61e7af3b56..01db89dec51 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Resolvers/ArgumentParser.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Resolvers/ArgumentParser.cs @@ -69,7 +69,7 @@ private static bool TryGetValue( break; } - var literal = scalarType.ParseLiteral(valueNode)!; + var literal = scalarType.CoerceInputLiteral(valueNode)!; if (DefaultTypeConverter.Default.TryConvert(typeof(T), literal, out var converted)) { @@ -85,7 +85,7 @@ private static bool TryGetValue( break; } - value = (T)enumType.ParseLiteral(valueNode)!; + value = (T)enumType.CoerceInputLiteral(valueNode)!; return true; } diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/ThrowHelper.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/ThrowHelper.cs index 41ff2c52ef4..fbaf9dec6a8 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/ThrowHelper.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/ThrowHelper.cs @@ -14,9 +14,9 @@ internal static class ThrowHelper /// Either the syntax node is invalid when parsing the literal or the syntax /// node value has an invalid format. /// - public static SerializationException FieldSet_InvalidFormat( + public static LeafCoercionException FieldSet_InvalidFormat( FieldSetType fieldSetType) => - new SerializationException( + new LeafCoercionException( ErrorBuilder.New() .SetMessage(ThrowHelper_FieldSet_HasInvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -27,9 +27,9 @@ public static SerializationException FieldSet_InvalidFormat( /// Either the syntax node is invalid when parsing the literal or the syntax /// node value has an invalid format. /// - public static SerializationException Any_InvalidFormat( + public static LeafCoercionException Any_InvalidFormat( _AnyType anyType) => - new SerializationException( + new LeafCoercionException( ErrorBuilder.New() .SetMessage(ThrowHelper_Any_HasInvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -70,10 +70,10 @@ public static SchemaException ReferenceResolverAttribute_EntityResolverNotFound( /// /// The runtime type is not supported by the scalars ParseValue method. /// - public static SerializationException Scalar_CannotParseValue( + public static LeafCoercionException Scalar_CannotParseValue( ScalarType scalarType, Type valueType) => - new SerializationException( + new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_Scalar_CannotParseValue, diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs index 2c71e547780..babcb23d4e3 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs @@ -78,7 +78,7 @@ public override IValueNode ParseResult(object? resultValue) } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs index 182e03f3718..bc3c331a409 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs @@ -34,7 +34,7 @@ protected override Policy ParseLiteral(StringValueNode valueSyntax) => new(valueSyntax.Value); public override IValueNode ParseResult(object? resultValue) - => ParseValue(resultValue); + => CoerceInputValue(resultValue); protected override StringValueNode ParseValue(Policy runtimeValue) => new(runtimeValue.Value); diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs index bedf8f2c8f0..fd89000a6bc 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs @@ -34,7 +34,7 @@ protected override Scope ParseLiteral(StringValueNode valueSyntax) => new(valueSyntax.Value); public override IValueNode ParseResult(object? resultValue) - => ParseValue(resultValue); + => CoerceInputValue(resultValue); protected override StringValueNode ParseValue(Scope runtimeValue) => new(runtimeValue.Value); diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs index 5e81e1403c4..0c64385f22f 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs @@ -73,7 +73,7 @@ protected override Representation ParseLiteral(ObjectValueNode valueSyntax) } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { @@ -83,7 +83,7 @@ public override bool TrySerialize(object? runtimeValue, out object? resultValue) if (runtimeValue is Representation) { - resultValue = ParseValue(runtimeValue); + resultValue = CoerceInputValue(runtimeValue); return true; } diff --git a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/FieldSetTypeTests.cs b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/FieldSetTypeTests.cs index 9e4130a489a..400e959b62f 100644 --- a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/FieldSetTypeTests.cs +++ b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/FieldSetTypeTests.cs @@ -44,7 +44,7 @@ public void Deserialize_Invalid_Format() void Action() => type.Deserialize(serialized); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -131,7 +131,7 @@ public void Serialize_Invalid_Format() void Action() => type.Serialize(1); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -143,7 +143,7 @@ public void TrySerialize() var selectionSet = Syntax.ParseSelectionSet(Braces(selection)); // act - var success = type.TrySerialize(selectionSet, out var serialized); + var success = type.TryCoerceOutputValue(selectionSet, out var serialized); // assert Assert.True(success); @@ -157,7 +157,7 @@ public void TrySerialize_Invalid_Format() var type = new FieldSetType(); // act - var success = type.TrySerialize(1, out var serialized); + var success = type.TryCoerceOutputValue(1, out var serialized); // assert Assert.False(success); @@ -203,9 +203,9 @@ public void ParseValue_InvalidValue() var type = new FieldSetType(); // act - void Action() => type.ParseValue(1); + void Action() => type.CoerceInputValue(1); // assert - Assert.Throws(Action); + Assert.Throws(Action); } } diff --git a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs index 57571e2f770..f2722ea7256 100644 --- a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs +++ b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs @@ -80,7 +80,7 @@ public void Deserialize_Invalid_Format() void Action() => type.Deserialize(serialized); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -166,7 +166,7 @@ public void Serialize_Invalid_Format() void Action() => type.Serialize(1); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -187,7 +187,7 @@ public void TrySerialize() var representation = new Representation("test", objectValueNode); // act - var success = type.TrySerialize(representation, out var serialized); + var success = type.TryCoerceOutputValue(representation, out var serialized); // assert Assert.True(success); @@ -204,7 +204,7 @@ public void TrySerialize_Invalid_Type() var type = new AnyType(); // act - var success = type.TrySerialize(1, out var serialized); + var success = type.TryCoerceOutputValue(1, out var serialized); // assert Assert.False(success); @@ -218,7 +218,7 @@ public void TrySerialize_Invalid_Null() var type = new AnyType(); // act - var success = type.TrySerialize(null, out var serialized); + var success = type.TryCoerceOutputValue(null, out var serialized); // assert Assert.True(success); @@ -269,7 +269,7 @@ public void ParseLiteral() ); // act - var valueSyntax = type.ParseLiteral(objectValueNode); + var valueSyntax = type.CoerceInputLiteral(objectValueNode); // assert var parsedRepresentation = Assert.IsType(valueSyntax); @@ -284,10 +284,10 @@ public void ParseLiteral_InvalidValue() var type = new AnyType(); // act - void Action() => type.ParseLiteral(new ObjectValueNode()); + void Action() => type.CoerceInputLiteral(new ObjectValueNode()); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -340,7 +340,7 @@ public void ParseResult_InvalidValue() void Action() => type.ParseResult(new ObjectValueNode()); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -363,9 +363,9 @@ public void ParseValue_InvalidValue() var type = new AnyType(); // act - void Action() => type.ParseValue(1); + void Action() => type.CoerceInputValue(1); // assert - Assert.Throws(Action); + Assert.Throws(Action); } } diff --git a/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs b/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs index e12e053baf7..7b69a7c29dc 100644 --- a/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs +++ b/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs @@ -33,5 +33,5 @@ public interface IScalarTypeDefinition /// /// true if the value is an instance of this type; otherwise, false. /// - bool IsInstanceOfType(IValueNode value); + bool IsValueCompatible(IValueNode value); } diff --git a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/IntToStructBaseType.cs b/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/IntToStructBaseType.cs index 1eba389ac97..6f09d37f8c6 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/IntToStructBaseType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/IntToStructBaseType.cs @@ -34,7 +34,7 @@ protected override TRuntimeType ParseLiteral(IntValueNode literal) return value.Value; } - throw new SerializationException( + throw new LeafCoercionException( string.Format(IntToStructBaseType_ParseLiteral_UnableToDeserializeInt, Name), this); } @@ -42,12 +42,12 @@ protected override TRuntimeType ParseLiteral(IntValueNode literal) /// protected override IntValueNode ParseValue(TRuntimeType value) { - if (TrySerialize(value, out var val)) + if (TryCoerceOutputValue(value, out var val)) { return new IntValueNode(val.Value); } - throw new SerializationException( + throw new LeafCoercionException( string.Format(IntToStructBaseType_ParseLiteral_UnableToDeserializeInt, Name), this); } @@ -70,13 +70,13 @@ public override IValueNode ParseResult(object? resultValue) return ParseValue(v); } - throw new SerializationException( + throw new LeafCoercionException( string.Format(IntToStructBaseType_ParseLiteral_UnableToDeserializeInt, Name), this); } /// - public override bool TrySerialize( + public override bool TryCoerceOutputValue( object? runtimeValue, out object? resultValue) { @@ -86,7 +86,7 @@ public override bool TrySerialize( return true; } - if (runtimeValue is TRuntimeType dt && TrySerialize(dt, out var val)) + if (runtimeValue is TRuntimeType dt && TryCoerceOutputValue(dt, out var val)) { resultValue = val.Value; return true; @@ -109,7 +109,7 @@ public override bool TrySerialize( /// /// Returns the serialized result value. /// - protected abstract bool TrySerialize( + protected abstract bool TryCoerceOutputValue( TRuntimeType runtimeValue, [NotNullWhen(true)] out int? resultValue); diff --git a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToClassBaseType.cs b/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToClassBaseType.cs index 7e176ff5698..8dfeac1194c 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToClassBaseType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToClassBaseType.cs @@ -34,14 +34,14 @@ protected override TRuntimeType ParseLiteral(StringValueNode literal) return value; } - throw new SerializationException( + throw new LeafCoercionException( string.Format(StringToClassBaseType_ParseLiteral_UnableToDeserializeString, Name), this); } /// protected override StringValueNode ParseValue(TRuntimeType value) => - new(Serialize(value)); + new(CoerceOutputValue(value)); /// public override IValueNode ParseResult(object? resultValue) @@ -61,13 +61,13 @@ public override IValueNode ParseResult(object? resultValue) return ParseValue(v); } - throw new SerializationException( + throw new LeafCoercionException( string.Format(StringToClassBaseType_ParseLiteral_UnableToDeserializeString, Name), this); } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { @@ -77,7 +77,7 @@ public override bool TrySerialize(object? runtimeValue, out object? resultValue) if (runtimeValue is TRuntimeType dt) { - resultValue = Serialize(dt); + resultValue = CoerceOutputValue(dt); return true; } @@ -94,7 +94,7 @@ public override bool TrySerialize(object? runtimeValue, out object? resultValue) /// /// Returns the serialized result value. /// - protected abstract string Serialize(TRuntimeType runtimeValue); + protected abstract string CoerceOutputValue(TRuntimeType runtimeValue); /// public override bool TryDeserialize(object? resultValue, out object? runtimeValue) diff --git a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToStructBaseType.cs b/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToStructBaseType.cs index b8b93e28a5c..565bccc72c5 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToStructBaseType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToStructBaseType.cs @@ -35,7 +35,7 @@ protected override TRuntimeType ParseLiteral(StringValueNode literal) return value.Value; } - throw new SerializationException( + throw new LeafCoercionException( string.Format(StringToStructBaseType_ParseLiteral_UnableToDeserializeString, Name), this); } @@ -43,7 +43,7 @@ protected override TRuntimeType ParseLiteral(StringValueNode literal) /// protected override StringValueNode ParseValue(TRuntimeType value) { - return new(Serialize(value)); + return new(CoerceOutputValue(value)); } /// @@ -64,13 +64,13 @@ public override IValueNode ParseResult(object? resultValue) return ParseValue(v); } - throw new SerializationException( + throw new LeafCoercionException( string.Format(StringToStructBaseType_ParseLiteral_UnableToDeserializeString, Name), this); } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { @@ -80,7 +80,7 @@ public override bool TrySerialize(object? runtimeValue, out object? resultValue) if (runtimeValue is TRuntimeType dt) { - resultValue = Serialize(dt); + resultValue = CoerceOutputValue(dt); return true; } @@ -97,7 +97,7 @@ public override bool TrySerialize(object? runtimeValue, out object? resultValue) /// /// Returns the serialized result value. /// - protected abstract string Serialize(TRuntimeType runtimeValue); + protected abstract string CoerceOutputValue(TRuntimeType runtimeValue); /// public override bool TryDeserialize(object? resultValue, out object? runtimeValue) diff --git a/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs b/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs index 195f1b765ca..3e621af3e6f 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs @@ -22,7 +22,7 @@ public DateTimeZoneType() : base("DateTimeZone") } /// - protected override string Serialize(DateTimeZone runtimeValue) + protected override string CoerceOutputValue(DateTimeZone runtimeValue) => runtimeValue.Id; /// diff --git a/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs b/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs index 0bc26920264..4e6e31af7d9 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs @@ -42,7 +42,7 @@ public DurationType() : this(DurationPattern.Roundtrip) } /// - protected override string Serialize(Duration runtimeValue) + protected override string CoerceOutputValue(Duration runtimeValue) => _serializationPattern .Format(runtimeValue); diff --git a/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs b/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs index 2eaa2e30f0b..eefe7634e91 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs @@ -42,7 +42,7 @@ public InstantType() : this(InstantPattern.ExtendedIso) } /// - protected override string Serialize(Instant runtimeValue) + protected override string CoerceOutputValue(Instant runtimeValue) => _serializationPattern .Format(runtimeValue); diff --git a/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs b/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs index cb6c12d558b..fab77c48e20 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs @@ -21,7 +21,7 @@ public IsoDayOfWeekType() : base("IsoDayOfWeek") } /// - protected override bool TrySerialize( + protected override bool TryCoerceOutputValue( IsoDayOfWeek runtimeValue, [NotNullWhen(true)] out int? resultValue) { diff --git a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs index 346456a3fa8..263b6b6c843 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs @@ -42,7 +42,7 @@ public LocalDateTimeType() : this(LocalDateTimePattern.ExtendedIso) } /// - protected override string Serialize(LocalDateTime runtimeValue) + protected override string CoerceOutputValue(LocalDateTime runtimeValue) => _serializationPattern .Format(runtimeValue); diff --git a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs index aa45c479de2..264776a39d9 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs @@ -43,7 +43,7 @@ public LocalDateType() : this(LocalDatePattern.Iso) } /// - protected override string Serialize(LocalDate runtimeValue) + protected override string CoerceOutputValue(LocalDate runtimeValue) => _serializationPattern .Format(runtimeValue); diff --git a/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs index d516e4c3780..f64c4bf2849 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs @@ -43,7 +43,7 @@ public LocalTimeType() : this(LocalTimePattern.ExtendedIso) } /// - protected override string Serialize(LocalTime runtimeValue) + protected override string CoerceOutputValue(LocalTime runtimeValue) => _serializationPattern .Format(runtimeValue); diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs index cb21cb74611..371c1705810 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs @@ -46,7 +46,7 @@ public OffsetDateTimeType() : this(OffsetDateTimePattern.ExtendedIso) } /// - protected override string Serialize(OffsetDateTime runtimeValue) + protected override string CoerceOutputValue(OffsetDateTime runtimeValue) => _serializationPattern .Format(runtimeValue); diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs index 435c596a609..d12fc4aa279 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs @@ -44,7 +44,7 @@ public OffsetDateType() : this(OffsetDatePattern.GeneralIso) } /// - protected override string Serialize(OffsetDate runtimeValue) + protected override string CoerceOutputValue(OffsetDate runtimeValue) => _serializationPattern .Format(runtimeValue); diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs index aecc2c79c78..48ae0b99ef5 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs @@ -43,7 +43,7 @@ public OffsetTimeType() : this(OffsetTimePattern.GeneralIso) } /// - protected override string Serialize(OffsetTime runtimeValue) + protected override string CoerceOutputValue(OffsetTime runtimeValue) => _serializationPattern .Format(runtimeValue); diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs index c6a36d32458..2974bcd6c2b 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs @@ -44,7 +44,7 @@ public OffsetType() : this(OffsetPattern.GeneralInvariantWithZ) } /// - protected override string Serialize(Offset runtimeValue) + protected override string CoerceOutputValue(Offset runtimeValue) => _serializationPattern .Format(runtimeValue); diff --git a/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs b/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs index 7c346cd814c..5364fb9f291 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs @@ -39,7 +39,7 @@ public PeriodType() : this(PeriodPattern.Roundtrip) } /// - protected override string Serialize(Period runtimeValue) + protected override string CoerceOutputValue(Period runtimeValue) => _serializationPattern.Format(runtimeValue); /// diff --git a/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs index 33b93edae13..17e27b31935 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs @@ -49,7 +49,7 @@ public ZonedDateTimeType() : this(s_default) } /// - protected override string Serialize(ZonedDateTime runtimeValue) + protected override string CoerceOutputValue(ZonedDateTime runtimeValue) => _serializationPattern .Format(runtimeValue); diff --git a/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs b/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs index be90ec49db3..069495feaef 100644 --- a/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs @@ -54,7 +54,7 @@ protected override IFile ParseLiteral(FileValueNode valueSyntax) => protected override FileValueNode ParseValue(IFile runtimeValue) => new(runtimeValue); - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { throw new GraphQLException( UploadResources.UploadType_TrySerialize_NotSupported); diff --git a/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs b/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs index b30e35b6f9f..6af11a10714 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs @@ -45,10 +45,10 @@ public EmailAddressType() { } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) => ThrowHelper.EmailAddressType_ParseLiteral_IsInvalid(this); /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) => ThrowHelper.EmailAddressType_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs b/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs index 67c7b7bb872..2ba59e5a306 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs @@ -42,13 +42,13 @@ public HexColorType() } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { return ThrowHelper.HexColorType_ParseLiteral_IsInvalid(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { return ThrowHelper.HexColorType_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/HslType.cs b/src/HotChocolate/Core/src/Types.Scalars/HslType.cs index 66f40f9ca8e..61f000cde83 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/HslType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/HslType.cs @@ -42,13 +42,13 @@ public HslType() } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { return ThrowHelper.HslType_ParseLiteral_IsInvalid(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { return ThrowHelper.HslType_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs b/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs index c5e65cbbf56..ae1c9dbdbdc 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs @@ -42,13 +42,13 @@ public HslaType() } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { return ThrowHelper.HslaType_ParseLiteral_IsInvalid(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { return ThrowHelper.HslaType_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs b/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs index 958369860e6..207f56d2f57 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs @@ -44,13 +44,13 @@ public IPv4Type() } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { return ThrowHelper.IPv4Type_ParseLiteral_IsInvalid(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { return ThrowHelper.IPv4Type_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs b/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs index b33c66c89e4..d5ad1972d48 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs @@ -63,10 +63,10 @@ public IPv6Type() } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) => ThrowHelper.IPv6Type_ParseLiteral_IsInvalid(this); /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) => ThrowHelper.IPv6Type_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs b/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs index 2883ef4d8fa..2e68950fb04 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs @@ -47,13 +47,13 @@ public IsbnType() } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { return ThrowHelper.IsbnType_ParseLiteral_IsInvalid(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { return ThrowHelper.IsbnType_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/LatitudeType.cs b/src/HotChocolate/Core/src/Types.Scalars/LatitudeType.cs index 46dd5e1f75d..0f3d989ee1b 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/LatitudeType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/LatitudeType.cs @@ -46,7 +46,7 @@ public override IValueNode ParseResult(object? resultValue) null => NullValueNode.Default, string s when Latitude.TryDeserialize(s, out var runtimeValue) => - ParseValue(runtimeValue), + CoerceInputValue(runtimeValue), int i => ParseValue(i), @@ -79,7 +79,7 @@ protected override StringValueNode ParseValue(double runtimeValue) } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { switch (runtimeValue) { diff --git a/src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs b/src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs index 0995384f83b..1d18658a3e1 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs @@ -67,7 +67,7 @@ protected override StringValueNode ParseValue(decimal runtimeValue) } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { switch (runtimeValue) { diff --git a/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs b/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs index e359270416d..f327853435b 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs @@ -46,7 +46,7 @@ public override IValueNode ParseResult(object? resultValue) null => NullValueNode.Default, string s when Longitude.TryDeserialize(s, out var runtimeValue) => - ParseValue(runtimeValue), + CoerceInputValue(runtimeValue), int i => ParseValue(i), @@ -79,7 +79,7 @@ protected override StringValueNode ParseValue(double runtimeValue) } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { switch (runtimeValue) { diff --git a/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs b/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs index 70e78496963..d1e6244cbc6 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs @@ -58,13 +58,13 @@ public MacAddressType() } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { return ThrowHelper.MacAddressType_ParseLiteral_IsInvalid(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { return ThrowHelper.MacAddressType_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs index bd884ae247e..6564cc96ff1 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs @@ -42,19 +42,19 @@ protected override bool IsInstanceOfType(IFloatValueLiteral valueSyntax) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateParseLiteralError(IValueNode valueSyntax) { throw ThrowHelper.NegativeFloatType_ParseLiteral_IsNotNegative(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.NegativeFloatType_ParseValue_IsNotNegative(this); } /// - protected override SerializationException CreateParseResultError(object runtimeValue) + protected override LeafCoercionException CreateParseResultError(object runtimeValue) { throw ThrowHelper.NegativeFloatType_ParseValue_IsNotNegative(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs index eccc5106f63..467e8125b87 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs @@ -44,19 +44,19 @@ protected override bool IsInstanceOfType(IntValueNode valueSyntax) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.NegativeIntType_ParseLiteral_IsNotNegative(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.NegativeIntType_ParseValue_IsNotNegative(this); } /// - protected override SerializationException CreateParseResultError(object runtimeValue) + protected override LeafCoercionException CreateParseResultError(object runtimeValue) { throw ThrowHelper.NegativeIntType_ParseValue_IsNotNegative(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs index a297a163525..41e480e22f1 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs @@ -43,7 +43,7 @@ protected override bool IsInstanceOfType(StringValueNode valueSyntax) } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is string s && s == string.Empty) { @@ -71,13 +71,13 @@ public override bool TryDeserialize(object? resultValue, out object? runtimeValu } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.NonEmptyStringType_ParseLiteral_IsEmpty(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.NonEmptyStringType_ParseValue_IsEmpty(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs index c438b551f13..08b7f3c6822 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs @@ -43,19 +43,19 @@ protected override bool IsInstanceOfType(IFloatValueLiteral valueSyntax) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateParseLiteralError(IValueNode valueSyntax) { throw ThrowHelper.NonNegativeFloatType_ParseLiteral_IsNotNonNegative(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.NonNegativeFloatType_ParseValue_IsNotNonNegative(this); } /// - protected override SerializationException CreateParseResultError(object runtimeValue) + protected override LeafCoercionException CreateParseResultError(object runtimeValue) { throw ThrowHelper.NonNegativeFloatType_ParseValue_IsNotNonNegative(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs index 197d55138df..ce4e47421b2 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs @@ -43,19 +43,19 @@ protected override bool IsInstanceOfType(IntValueNode valueSyntax) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.NonNegativeIntType_ParseLiteral_IsNotNonNegative(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.NonNegativeIntType_ParseValue_IsNotNonNegative(this); } /// - protected override SerializationException CreateParseResultError(object runtimeValue) + protected override LeafCoercionException CreateParseResultError(object runtimeValue) { throw ThrowHelper.NonNegativeIntType_ParseValue_IsNotNonNegative(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs index ee7bb982a77..055a4e9f2f2 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs @@ -43,19 +43,19 @@ protected override bool IsInstanceOfType(IFloatValueLiteral valueSyntax) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateParseLiteralError(IValueNode valueSyntax) { throw ThrowHelper.NonPositiveFloatType_ParseLiteral_IsNotNonPositive(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.NonPositiveFloatType_ParseValue_IsNotNonPositive(this); } /// - protected override SerializationException CreateParseResultError(object runtimeValue) + protected override LeafCoercionException CreateParseResultError(object runtimeValue) { throw ThrowHelper.NonPositiveFloatType_ParseValue_IsNotNonPositive(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs index 37fc786d7f4..19077bd6ac9 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs @@ -43,19 +43,19 @@ protected override bool IsInstanceOfType(IntValueNode valueSyntax) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.NonPositiveIntType_ParseLiteral_IsNotNonPositive(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.NonPositiveIntType_ParseValue_IsNotNonPositive(this); } /// - protected override SerializationException CreateParseResultError(object runtimeValue) + protected override LeafCoercionException CreateParseResultError(object runtimeValue) { throw ThrowHelper.NonPositiveIntType_ParseValue_IsNotNonPositive(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs b/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs index d7eb96b52d1..62cd8163647 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs @@ -44,13 +44,13 @@ public PhoneNumberType() } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { return ThrowHelper.PhoneNumber_ParseLiteral_IsInvalid(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { return ThrowHelper.PhoneNumber_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/PortType.cs b/src/HotChocolate/Core/src/Types.Scalars/PortType.cs index a63ed3c21bd..bc00e0de99e 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/PortType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/PortType.cs @@ -46,19 +46,19 @@ protected override bool IsInstanceOfType(IntValueNode valueSyntax) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.PortType_ParseLiteral_OutOfRange(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.PortType_ParseValue_OutOfRange(this); } /// - protected override SerializationException CreateParseResultError(object runtimeValue) + protected override LeafCoercionException CreateParseResultError(object runtimeValue) { throw ThrowHelper.PortType_ParseValue_OutOfRange(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs index 97423ffa952..bd07e6ddc0e 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs @@ -37,13 +37,13 @@ protected override bool IsInstanceOfType(IntValueNode valueSyntax) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.PositiveIntType_ParseLiteral_ZeroOrLess(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.PositiveIntType_ParseValue_ZeroOrLess(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/PostalCodeType.cs b/src/HotChocolate/Core/src/Types.Scalars/PostalCodeType.cs index d6a984fae1e..a7d6a1e600e 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/PostalCodeType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/PostalCodeType.cs @@ -183,7 +183,7 @@ protected override bool IsInstanceOfType(StringValueNode valueSyntax) } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { @@ -223,13 +223,13 @@ public override bool TryDeserialize(object? resultValue, out object? runtimeValu } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { return ThrowHelper.PostalCodeType_ParseLiteral_IsInvalid(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { return ThrowHelper.PostalCodeType_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs b/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs index a55a4b09b5c..c353f80e68f 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs @@ -55,7 +55,7 @@ protected override bool IsInstanceOfType(StringValueNode valueSyntax) => _validationRegex.IsMatch(valueSyntax.Value); /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { @@ -95,10 +95,10 @@ public override bool TryDeserialize(object? resultValue, out object? runtimeValu } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) => ThrowHelper.RegexType_ParseLiteral_IsInvalid(this, Name); /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) => ThrowHelper.RegexType_ParseValue_IsInvalid(this, Name); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs b/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs index 86a4ea9375c..ff1cc9f42f8 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs @@ -44,13 +44,13 @@ public RgbType() } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { return ThrowHelper.RgbType_ParseLiteral_IsInvalid(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { return ThrowHelper.RgbType_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs b/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs index 5ee38b1f5fb..e6b41cc85f7 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs @@ -42,13 +42,13 @@ public RgbaType() } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { return ThrowHelper.RgbaType_ParseLiteral_IsInvalid(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { return ThrowHelper.RgbaType_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs b/src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs index 7b526d715f2..a645ef8968c 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs @@ -56,19 +56,19 @@ protected override IntValueNode ParseValue(sbyte runtimeValue) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.UnsignedIntType_ParseLiteral_IsNotUnsigned(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); } /// - protected override SerializationException CreateParseResultError(object runtimeValue) + protected override LeafCoercionException CreateParseResultError(object runtimeValue) { throw ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs index 620bf41dc56..95c19763292 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs @@ -2,9 +2,9 @@ namespace HotChocolate.Types; internal static class ThrowHelper { - public static SerializationException EmailAddressType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException EmailAddressType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.EmailAddressType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -13,9 +13,9 @@ public static SerializationException EmailAddressType_ParseLiteral_IsInvalid(ITy type); } - public static SerializationException EmailAddressType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException EmailAddressType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.EmailAddressType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -24,9 +24,9 @@ public static SerializationException EmailAddressType_ParseValue_IsInvalid(IType type); } - public static SerializationException HexColorType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException HexColorType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.HexColorType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -35,9 +35,9 @@ public static SerializationException HexColorType_ParseValue_IsInvalid(IType typ type); } - public static SerializationException HexColorType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException HexColorType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.HexColorType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -46,9 +46,9 @@ public static SerializationException HexColorType_ParseLiteral_IsInvalid(IType t type); } - public static SerializationException HslType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException HslType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.HslType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -57,9 +57,9 @@ public static SerializationException HslType_ParseValue_IsInvalid(IType type) type); } - public static SerializationException HslType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException HslType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.HslType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -68,9 +68,9 @@ public static SerializationException HslType_ParseLiteral_IsInvalid(IType type) type); } - public static SerializationException HslaType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException HslaType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.HslaType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -79,9 +79,9 @@ public static SerializationException HslaType_ParseValue_IsInvalid(IType type) type); } - public static SerializationException HslaType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException HslaType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.HslaType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -90,9 +90,9 @@ public static SerializationException HslaType_ParseLiteral_IsInvalid(IType type) type); } - public static SerializationException IPv4Type_ParseValue_IsInvalid(IType type) + public static LeafCoercionException IPv4Type_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.IPv4Type_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -101,9 +101,9 @@ public static SerializationException IPv4Type_ParseValue_IsInvalid(IType type) type); } - public static SerializationException IPv4Type_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException IPv4Type_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.IPv4Type_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -112,9 +112,9 @@ public static SerializationException IPv4Type_ParseLiteral_IsInvalid(IType type) type); } - public static SerializationException IPv6Type_ParseValue_IsInvalid(IType type) + public static LeafCoercionException IPv6Type_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.IPv6Type_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -123,9 +123,9 @@ public static SerializationException IPv6Type_ParseValue_IsInvalid(IType type) type); } - public static SerializationException IPv6Type_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException IPv6Type_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.IPv6Type_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -134,9 +134,9 @@ public static SerializationException IPv6Type_ParseLiteral_IsInvalid(IType type) type); } - public static SerializationException IsbnType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException IsbnType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.IsbnType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -145,9 +145,9 @@ public static SerializationException IsbnType_ParseValue_IsInvalid(IType type) type); } - public static SerializationException IsbnType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException IsbnType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.IsbnType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -156,9 +156,9 @@ public static SerializationException IsbnType_ParseLiteral_IsInvalid(IType type) type); } - public static SerializationException LatitudeType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException LatitudeType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.LatitudeType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -167,9 +167,9 @@ public static SerializationException LatitudeType_ParseValue_IsInvalid(IType typ type); } - public static SerializationException LatitudeType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException LatitudeType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.LatitudeType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -178,9 +178,9 @@ public static SerializationException LatitudeType_ParseLiteral_IsInvalid(IType t type); } - public static SerializationException LocalCurrencyType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException LocalCurrencyType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.LocalCurrencyType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -189,9 +189,9 @@ public static SerializationException LocalCurrencyType_ParseValue_IsInvalid(ITyp type); } - public static SerializationException LocalCurrencyType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException LocalCurrencyType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.LocalCurrencyType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -200,9 +200,9 @@ public static SerializationException LocalCurrencyType_ParseLiteral_IsInvalid(IT type); } - public static SerializationException LongitudeType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException LongitudeType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.LongitudeType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -211,9 +211,9 @@ public static SerializationException LongitudeType_ParseValue_IsInvalid(IType ty type); } - public static SerializationException LongitudeType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException LongitudeType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.LongitudeType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -222,9 +222,9 @@ public static SerializationException LongitudeType_ParseLiteral_IsInvalid(IType type); } - public static SerializationException MacAddressType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException MacAddressType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.MacAddressType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -233,9 +233,9 @@ public static SerializationException MacAddressType_ParseValue_IsInvalid(IType t type); } - public static SerializationException MacAddressType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException MacAddressType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.MacAddressType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -244,10 +244,10 @@ public static SerializationException MacAddressType_ParseLiteral_IsInvalid(IType type); } - public static SerializationException NegativeFloatType_ParseLiteral_IsNotNegative( + public static LeafCoercionException NegativeFloatType_ParseLiteral_IsNotNegative( IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NegativeFloatType_IsNotNegative_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -256,9 +256,9 @@ public static SerializationException NegativeFloatType_ParseLiteral_IsNotNegativ type); } - public static SerializationException NegativeFloatType_ParseValue_IsNotNegative(IType type) + public static LeafCoercionException NegativeFloatType_ParseValue_IsNotNegative(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NegativeFloatType_IsNotNegative_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -267,9 +267,9 @@ public static SerializationException NegativeFloatType_ParseValue_IsNotNegative( type); } - public static SerializationException NegativeIntType_ParseLiteral_IsNotNegative(IType type) + public static LeafCoercionException NegativeIntType_ParseLiteral_IsNotNegative(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NegativeIntType_IsNotNegative_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -278,9 +278,9 @@ public static SerializationException NegativeIntType_ParseLiteral_IsNotNegative( type); } - public static SerializationException NegativeIntType_ParseValue_IsNotNegative(IType type) + public static LeafCoercionException NegativeIntType_ParseValue_IsNotNegative(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NegativeIntType_IsNotNegative_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -289,9 +289,9 @@ public static SerializationException NegativeIntType_ParseValue_IsNotNegative(IT type); } - public static SerializationException NonEmptyStringType_ParseLiteral_IsEmpty(IType type) + public static LeafCoercionException NonEmptyStringType_ParseLiteral_IsEmpty(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NonEmptyStringType_IsEmpty_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -300,9 +300,9 @@ public static SerializationException NonEmptyStringType_ParseLiteral_IsEmpty(ITy type); } - public static SerializationException NonEmptyStringType_ParseValue_IsEmpty(IType type) + public static LeafCoercionException NonEmptyStringType_ParseValue_IsEmpty(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NonEmptyStringType_IsEmpty_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -311,10 +311,10 @@ public static SerializationException NonEmptyStringType_ParseValue_IsEmpty(IType type); } - public static SerializationException NonNegativeIntType_ParseLiteral_IsNotNonNegative( + public static LeafCoercionException NonNegativeIntType_ParseLiteral_IsNotNonNegative( IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NonNegativeIntType_IsNotNonNegative_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -323,10 +323,10 @@ public static SerializationException NonNegativeIntType_ParseLiteral_IsNotNonNeg type); } - public static SerializationException NonNegativeIntType_ParseValue_IsNotNonNegative( + public static LeafCoercionException NonNegativeIntType_ParseValue_IsNotNonNegative( IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NonNegativeIntType_IsNotNonNegative_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -335,10 +335,10 @@ public static SerializationException NonNegativeIntType_ParseValue_IsNotNonNegat type); } - public static SerializationException NonPositiveIntType_ParseLiteral_IsNotNonPositive( + public static LeafCoercionException NonPositiveIntType_ParseLiteral_IsNotNonPositive( IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NonPositiveIntType_IsNotNonPositive_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -347,10 +347,10 @@ public static SerializationException NonPositiveIntType_ParseLiteral_IsNotNonPos type); } - public static SerializationException NonPositiveFloatType_ParseLiteral_IsNotNonPositive( + public static LeafCoercionException NonPositiveFloatType_ParseLiteral_IsNotNonPositive( IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NonPositiveFloatType_IsNotNonPositive_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -359,10 +359,10 @@ public static SerializationException NonPositiveFloatType_ParseLiteral_IsNotNonP type); } - public static SerializationException NonPositiveFloatType_ParseValue_IsNotNonPositive( + public static LeafCoercionException NonPositiveFloatType_ParseValue_IsNotNonPositive( IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NonPositiveFloatType_IsNotNonPositive_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -371,10 +371,10 @@ public static SerializationException NonPositiveFloatType_ParseValue_IsNotNonPos type); } - public static SerializationException NonPositiveIntType_ParseValue_IsNotNonPositive( + public static LeafCoercionException NonPositiveIntType_ParseValue_IsNotNonPositive( IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NonPositiveIntType_IsNotNonPositive_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -383,10 +383,10 @@ public static SerializationException NonPositiveIntType_ParseValue_IsNotNonPosit type); } - public static SerializationException NonNegativeFloatType_ParseLiteral_IsNotNonNegative( + public static LeafCoercionException NonNegativeFloatType_ParseLiteral_IsNotNonNegative( IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NonNegativeFloatType_IsNotNonNegative_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -395,10 +395,10 @@ public static SerializationException NonNegativeFloatType_ParseLiteral_IsNotNonN type); } - public static SerializationException NonNegativeFloatType_ParseValue_IsNotNonNegative( + public static LeafCoercionException NonNegativeFloatType_ParseValue_IsNotNonNegative( IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.NonNegativeFloatType_IsNotNonNegative_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -407,9 +407,9 @@ public static SerializationException NonNegativeFloatType_ParseValue_IsNotNonNeg type); } - public static SerializationException PhoneNumber_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException PhoneNumber_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.PhoneNumberType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -418,9 +418,9 @@ public static SerializationException PhoneNumber_ParseLiteral_IsInvalid(IType ty type); } - public static SerializationException PhoneNumber_ParseValue_IsInvalid(IType type) + public static LeafCoercionException PhoneNumber_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.PhoneNumberType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -429,9 +429,9 @@ public static SerializationException PhoneNumber_ParseValue_IsInvalid(IType type type); } - public static SerializationException PortType_ParseLiteral_OutOfRange(IType type) + public static LeafCoercionException PortType_ParseLiteral_OutOfRange(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.PortType_OutOfRange_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -440,9 +440,9 @@ public static SerializationException PortType_ParseLiteral_OutOfRange(IType type type); } - public static SerializationException PortType_ParseValue_OutOfRange(IType type) + public static LeafCoercionException PortType_ParseValue_OutOfRange(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.PortType_OutOfRange_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -451,9 +451,9 @@ public static SerializationException PortType_ParseValue_OutOfRange(IType type) type); } - public static SerializationException PositiveIntType_ParseLiteral_ZeroOrLess(IType type) + public static LeafCoercionException PositiveIntType_ParseLiteral_ZeroOrLess(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.PositiveIntType_ZeroOrLess_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -462,9 +462,9 @@ public static SerializationException PositiveIntType_ParseLiteral_ZeroOrLess(ITy type); } - public static SerializationException PositiveIntType_ParseValue_ZeroOrLess(IType type) + public static LeafCoercionException PositiveIntType_ParseValue_ZeroOrLess(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.PositiveIntType_ZeroOrLess_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -473,9 +473,9 @@ public static SerializationException PositiveIntType_ParseValue_ZeroOrLess(IType type); } - public static SerializationException PostalCodeType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException PostalCodeType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.PostalCodeType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -484,9 +484,9 @@ public static SerializationException PostalCodeType_ParseLiteral_IsInvalid(IType type); } - public static SerializationException PostalCodeType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException PostalCodeType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.PostalCodeType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -495,11 +495,11 @@ public static SerializationException PostalCodeType_ParseValue_IsInvalid(IType t type); } - public static SerializationException RegexType_ParseValue_IsInvalid( + public static LeafCoercionException RegexType_ParseValue_IsInvalid( IType type, string name) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage( string.Format( @@ -510,11 +510,11 @@ public static SerializationException RegexType_ParseValue_IsInvalid( type); } - public static SerializationException RegexType_ParseLiteral_IsInvalid( + public static LeafCoercionException RegexType_ParseLiteral_IsInvalid( IType type, string name) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage( string.Format( @@ -525,9 +525,9 @@ public static SerializationException RegexType_ParseLiteral_IsInvalid( type); } - public static SerializationException RgbType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException RgbType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.RgbType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -536,9 +536,9 @@ public static SerializationException RgbType_ParseLiteral_IsInvalid(IType type) type); } - public static SerializationException RgbType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException RgbType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.RgbType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -547,9 +547,9 @@ public static SerializationException RgbType_ParseValue_IsInvalid(IType type) type); } - public static SerializationException RgbaType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException RgbaType_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.RgbaType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -558,9 +558,9 @@ public static SerializationException RgbaType_ParseValue_IsInvalid(IType type) type); } - public static SerializationException RgbaType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException RgbaType_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.RgbaType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -569,9 +569,9 @@ public static SerializationException RgbaType_ParseLiteral_IsInvalid(IType type) type); } - public static SerializationException UnsignedShortType_ParseValue_IsNotUnsigned(IType type) + public static LeafCoercionException UnsignedShortType_ParseValue_IsNotUnsigned(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.UnsignedShortType_IsNotUnsigned_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -580,9 +580,9 @@ public static SerializationException UnsignedShortType_ParseValue_IsNotUnsigned( type); } - public static SerializationException UnsignedShortType_ParseLiteral_IsNotUnsigned(IType type) + public static LeafCoercionException UnsignedShortType_ParseLiteral_IsNotUnsigned(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.UnsignedShortType_IsNotUnsigned_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -591,9 +591,9 @@ public static SerializationException UnsignedShortType_ParseLiteral_IsNotUnsigne type); } - public static SerializationException SignedByteType_ParseValue_IsNotSigned(IType type) + public static LeafCoercionException SignedByteType_ParseValue_IsNotSigned(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.SignedByteType_IsNotSigned_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -602,9 +602,9 @@ public static SerializationException SignedByteType_ParseValue_IsNotSigned(IType type); } - public static SerializationException SignedByteType_ParseLiteral_IsNotSigned(IType type) + public static LeafCoercionException SignedByteType_ParseLiteral_IsNotSigned(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.SignedByteType_IsNotSigned_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -613,9 +613,9 @@ public static SerializationException SignedByteType_ParseLiteral_IsNotSigned(ITy type); } - public static SerializationException UnsignedIntType_ParseValue_IsNotUnsigned(IType type) + public static LeafCoercionException UnsignedIntType_ParseValue_IsNotUnsigned(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.UnsignedIntType_IsNotUnsigned_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -624,9 +624,9 @@ public static SerializationException UnsignedIntType_ParseValue_IsNotUnsigned(IT type); } - public static SerializationException UnsignedIntType_ParseLiteral_IsNotUnsigned(IType type) + public static LeafCoercionException UnsignedIntType_ParseLiteral_IsNotUnsigned(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.UnsignedIntType_IsNotUnsigned_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -635,9 +635,9 @@ public static SerializationException UnsignedIntType_ParseLiteral_IsNotUnsigned( type); } - public static SerializationException UnsignedLongType_ParseValue_IsNotUnsigned(IType type) + public static LeafCoercionException UnsignedLongType_ParseValue_IsNotUnsigned(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.UnsignedLongType_IsNotUnsigned_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -646,9 +646,9 @@ public static SerializationException UnsignedLongType_ParseValue_IsNotUnsigned(I type); } - public static SerializationException UnsignedLongType_ParseLiteral_IsNotUnsigned(IType type) + public static LeafCoercionException UnsignedLongType_ParseLiteral_IsNotUnsigned(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.UnsignedLongType_IsNotUnsigned_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) @@ -657,9 +657,9 @@ public static SerializationException UnsignedLongType_ParseLiteral_IsNotUnsigned type); } - public static SerializationException UtcOffset_ParseValue_IsInvalid(IType type) + public static LeafCoercionException UtcOffset_ParseValue_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.UtcOffsetType_IsInvalid_ParseValue) .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -668,9 +668,9 @@ public static SerializationException UtcOffset_ParseValue_IsInvalid(IType type) type); } - public static SerializationException UtcOffset_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException UtcOffset_ParseLiteral_IsInvalid(IType type) { - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage(ScalarResources.UtcOffsetType_IsInvalid_ParseLiteral) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) diff --git a/src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs index f734734556e..2eb81910492 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs @@ -56,19 +56,19 @@ protected override IntValueNode ParseValue(uint runtimeValue) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.UnsignedIntType_ParseLiteral_IsNotUnsigned(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); } /// - protected override SerializationException CreateParseResultError(object runtimeValue) + protected override LeafCoercionException CreateParseResultError(object runtimeValue) { throw ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs b/src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs index 4d3b566069e..113e4b67204 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs @@ -56,19 +56,19 @@ protected override IntValueNode ParseValue(ulong runtimeValue) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.UnsignedLongType_ParseLiteral_IsNotUnsigned(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.UnsignedLongType_ParseValue_IsNotUnsigned(this); } /// - protected override SerializationException CreateParseResultError(object runtimeValue) + protected override LeafCoercionException CreateParseResultError(object runtimeValue) { throw ThrowHelper.UnsignedLongType_ParseValue_IsNotUnsigned(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs b/src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs index 7d6b823f2fc..9018f5f99d6 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs @@ -56,19 +56,19 @@ protected override IntValueNode ParseValue(ushort runtimeValue) } /// - protected override SerializationException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.UnsignedShortType_ParseLiteral_IsNotUnsigned(this); } /// - protected override SerializationException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateParseValueError(object runtimeValue) { throw ThrowHelper.UnsignedShortType_ParseValue_IsNotUnsigned(this); } /// - protected override SerializationException CreateParseResultError(object runtimeValue) + protected override LeafCoercionException CreateParseResultError(object runtimeValue) { throw ThrowHelper.UnsignedShortType_ParseValue_IsNotUnsigned(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs b/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs index b51d25fcd6f..4805b280fe1 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs @@ -70,7 +70,7 @@ protected override StringValueNode ParseValue(TimeSpan runtimeValue) } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { switch (runtimeValue) { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs index 16bca1ca7b7..6a42cba2e78 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Arguments.cs @@ -24,10 +24,10 @@ public T ArgumentValue(string name) { return CoerceArgumentValue(argument); } - catch (SerializationException ex) + catch (LeafCoercionException ex) { var syntaxNode = Selection.Arguments[argument.Name].ValueLiteral; - throw new SerializationException( + throw new LeafCoercionException( ErrorBuilder.FromError(ex.Errors[0]).SetPath(Path).TryAddLocation(syntaxNode).Build(), ex.Type, Path); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs index 62b09006798..f520c494b78 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs @@ -74,7 +74,7 @@ private ArgumentValue CreateArgumentValue( _inputValueParser.ParseLiteral(value, argument), value); } - catch (SerializationException ex) + catch (LeafCoercionException ex) { return new ArgumentValue( argument, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs index ef36b6e2d52..e635c3ddeee 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CompileResolver.cs @@ -80,9 +80,9 @@ private static void BuildDirectivePipeline( directiveNode, directiveType.Parse(directiveNode)); } - catch (SerializationException ex) + catch (LeafCoercionException ex) { - throw new SerializationException( + throw new LeafCoercionException( ErrorBuilder.FromError(ex.Errors[0]) .TryAddLocation(directiveNode) .Build(), diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs index 297eb489584..b314d6a3139 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs @@ -10,7 +10,7 @@ internal static partial class ValueCompletion private static void CompleteLeafValue( ValueCompletionContext context, Selection selection, - ILeafType2 type, + ILeafType type, ResultElement resultValue, object? runtimeValue) { @@ -27,10 +27,10 @@ private static void CompleteLeafValue( runtimeValue = c; } - type.Serialize(runtimeValue, resultValue); + type.CoerceOutputValue(runtimeValue, resultValue); return; } - catch (SerializationException ex) + catch (LeafCoercionException ex) { var errorPath = resultValue.Path; var error = InvalidLeafValue(ex, selection, errorPath); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs index 87b48c2572b..e4aa5a98674 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.cs @@ -37,7 +37,7 @@ public static void Complete( switch (typeKind) { case TypeKind.Scalar or TypeKind.Enum: - CompleteLeafValue(context, selection, (ILeafType2)type, resultValue, result); + CompleteLeafValue(context, selection, (ILeafType)type, resultValue, result); break; case TypeKind.List: diff --git a/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs index 81cd8a172c0..925033daf15 100644 --- a/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/ThrowHelper.cs @@ -45,7 +45,7 @@ public static GraphQLException VariableValueInvalidType( VariableDefinitionNode variableDefinition, Exception? exception = null) { - var underlyingError = exception is SerializationException serializationException + var underlyingError = exception is LeafCoercionException serializationException ? serializationException.Message : null; diff --git a/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs index e91ea8d0d67..df986f14505 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs @@ -9,21 +9,21 @@ namespace HotChocolate.Properties { using System; - - + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class TypeResources { - + private static System.Resources.ResourceManager resourceMan; - + private static System.Globalization.CultureInfo resourceCulture; - + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal TypeResources() { } - + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] internal static System.Resources.ResourceManager ResourceManager { get { @@ -34,7 +34,7 @@ internal static System.Resources.ResourceManager ResourceManager { return resourceMan; } } - + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] internal static System.Globalization.CultureInfo Culture { get { @@ -44,67 +44,67 @@ internal static System.Globalization.CultureInfo Culture { resourceCulture = value; } } - + internal static string ThrowHelper_MissingDirectiveIfArgument { get { return ResourceManager.GetString("ThrowHelper_MissingDirectiveIfArgument", resourceCulture); } } - + internal static string ArgumentDescriptor_InputTypeViolation { get { return ResourceManager.GetString("ArgumentDescriptor_InputTypeViolation", resourceCulture); } } - + internal static string ArgumentValueBuilder_NonNull { get { return ResourceManager.GetString("ArgumentValueBuilder_NonNull", resourceCulture); } } - + internal static string BooleanType_Description { get { return ResourceManager.GetString("BooleanType_Description", resourceCulture); } } - + internal static string ByteType_Description { get { return ResourceManager.GetString("ByteType_Description", resourceCulture); } } - + internal static string ComplexTypeBindingBuilder_FieldBuilderNotSupported { get { return ResourceManager.GetString("ComplexTypeBindingBuilder_FieldBuilderNotSupported", resourceCulture); } } - + internal static string ComplexTypeBindingBuilder_FieldNotComplete { get { return ResourceManager.GetString("ComplexTypeBindingBuilder_FieldNotComplete", resourceCulture); } } - + internal static string DataLoaderRegistry_KeyNullOrEmpty { get { return ResourceManager.GetString("DataLoaderRegistry_KeyNullOrEmpty", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_RegistryIsNull { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_RegistryIsNull", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_UnableToRegister { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_UnableToRegister", resourceCulture); } } - + /// /// Looks up a localized string similar to The `DateTime` scalar represents an exact point in time. This point in time is specified by having an offset to UTC and does not use a time zone.. /// @@ -113,1885 +113,1885 @@ internal static string DateTimeType_Description { return ResourceManager.GetString("DateTimeType_Description", resourceCulture); } } - + internal static string DateType_Description { get { return ResourceManager.GetString("DateType_Description", resourceCulture); } } - + internal static string DecimalType_Description { get { return ResourceManager.GetString("DecimalType_Description", resourceCulture); } } - + internal static string DefaultTypeInspector_MemberInvalid { get { return ResourceManager.GetString("DefaultTypeInspector_MemberInvalid", resourceCulture); } } - + internal static string DependencyDescriptorBase_OnlyTsoIsAllowed { get { return ResourceManager.GetString("DependencyDescriptorBase_OnlyTsoIsAllowed", resourceCulture); } } - + internal static string DirectiveCollection_DirectiveIsUnique { get { return ResourceManager.GetString("DirectiveCollection_DirectiveIsUnique", resourceCulture); } } - + internal static string DirectiveCollection_LocationNotAllowed { get { return ResourceManager.GetString("DirectiveCollection_LocationNotAllowed", resourceCulture); } } - + internal static string DirectiveLocation_ArgumentDefinition { get { return ResourceManager.GetString("DirectiveLocation_ArgumentDefinition", resourceCulture); } } - + internal static string DirectiveLocation_Description { get { return ResourceManager.GetString("DirectiveLocation_Description", resourceCulture); } } - + internal static string DirectiveLocation_Enum { get { return ResourceManager.GetString("DirectiveLocation_Enum", resourceCulture); } } - + internal static string DirectiveLocation_EnumValue { get { return ResourceManager.GetString("DirectiveLocation_EnumValue", resourceCulture); } } - + internal static string DirectiveLocation_Field { get { return ResourceManager.GetString("DirectiveLocation_Field", resourceCulture); } } - + internal static string DirectiveLocation_FieldDefinition { get { return ResourceManager.GetString("DirectiveLocation_FieldDefinition", resourceCulture); } } - + internal static string DirectiveLocation_FragmentDefinition { get { return ResourceManager.GetString("DirectiveLocation_FragmentDefinition", resourceCulture); } } - + internal static string DirectiveLocation_FragmentSpread { get { return ResourceManager.GetString("DirectiveLocation_FragmentSpread", resourceCulture); } } - + internal static string DirectiveLocation_InlineFragment { get { return ResourceManager.GetString("DirectiveLocation_InlineFragment", resourceCulture); } } - + internal static string DirectiveLocation_InputFieldDefinition { get { return ResourceManager.GetString("DirectiveLocation_InputFieldDefinition", resourceCulture); } } - + internal static string DirectiveLocation_InputObject { get { return ResourceManager.GetString("DirectiveLocation_InputObject", resourceCulture); } } - + internal static string DirectiveLocation_Interface { get { return ResourceManager.GetString("DirectiveLocation_Interface", resourceCulture); } } - + internal static string DirectiveLocation_Mutation { get { return ResourceManager.GetString("DirectiveLocation_Mutation", resourceCulture); } } - + internal static string DirectiveLocation_Object { get { return ResourceManager.GetString("DirectiveLocation_Object", resourceCulture); } } - + internal static string DirectiveLocation_Query { get { return ResourceManager.GetString("DirectiveLocation_Query", resourceCulture); } } - + internal static string DirectiveLocation_Scalar { get { return ResourceManager.GetString("DirectiveLocation_Scalar", resourceCulture); } } - + internal static string DirectiveLocation_Schema { get { return ResourceManager.GetString("DirectiveLocation_Schema", resourceCulture); } } - + internal static string DirectiveLocation_Subscription { get { return ResourceManager.GetString("DirectiveLocation_Subscription", resourceCulture); } } - + internal static string DirectiveLocation_Union { get { return ResourceManager.GetString("DirectiveLocation_Union", resourceCulture); } } - + internal static string DirectiveTypeDescriptor_OnlyProperties { get { return ResourceManager.GetString("DirectiveTypeDescriptor_OnlyProperties", resourceCulture); } } - + internal static string DirectiveType_NoLocations { get { return ResourceManager.GetString("DirectiveType_NoLocations", resourceCulture); } } - + internal static string DirectiveType_ReplaceWithUse { get { return ResourceManager.GetString("DirectiveType_ReplaceWithUse", resourceCulture); } } - + internal static string DirectiveType_UnableToConvert { get { return ResourceManager.GetString("DirectiveType_UnableToConvert", resourceCulture); } } - + internal static string Directive_Description { get { return ResourceManager.GetString("Directive_Description", resourceCulture); } } - + internal static string Directive_UseLocation { get { return ResourceManager.GetString("Directive_UseLocation", resourceCulture); } } - + internal static string EnumTypeExtension_CannotMerge { get { return ResourceManager.GetString("EnumTypeExtension_CannotMerge", resourceCulture); } } - + internal static string EnumTypeExtension_ValueTypeInvalid { get { return ResourceManager.GetString("EnumTypeExtension_ValueTypeInvalid", resourceCulture); } } - + internal static string EnumType_NoValues { get { return ResourceManager.GetString("EnumType_NoValues", resourceCulture); } } - + internal static string EnumValue_Description { get { return ResourceManager.GetString("EnumValue_Description", resourceCulture); } } - + internal static string EnumValue_ValueIsNull { get { return ResourceManager.GetString("EnumValue_ValueIsNull", resourceCulture); } } - + internal static string FieldInitHelper_InvalidDefaultValue { get { return ResourceManager.GetString("FieldInitHelper_InvalidDefaultValue", resourceCulture); } } - + internal static string FieldInitHelper_NoFields { get { return ResourceManager.GetString("FieldInitHelper_NoFields", resourceCulture); } } - + internal static string Field_Description { get { return ResourceManager.GetString("Field_Description", resourceCulture); } } - + internal static string FloatType_Description { get { return ResourceManager.GetString("FloatType_Description", resourceCulture); } } - + internal static string IdType_Description { get { return ResourceManager.GetString("IdType_Description", resourceCulture); } } - + internal static string InputField_CannotSetValue { get { return ResourceManager.GetString("InputField_CannotSetValue", resourceCulture); } } - + internal static string InputObjectTypeExtension_CannotMerge { get { return ResourceManager.GetString("InputObjectTypeExtension_CannotMerge", resourceCulture); } } - + internal static string InputObjectType_CannotParseLiteral { get { return ResourceManager.GetString("InputObjectType_CannotParseLiteral", resourceCulture); } } - + internal static string InputObjectType_NoFields { get { return ResourceManager.GetString("InputObjectType_NoFields", resourceCulture); } } - + internal static string InputTypeNonNullCheck_ValueIsNull { get { return ResourceManager.GetString("InputTypeNonNullCheck_ValueIsNull", resourceCulture); } } - + internal static string InputValue_DefaultValue { get { return ResourceManager.GetString("InputValue_DefaultValue", resourceCulture); } } - + internal static string InputValue_Description { get { return ResourceManager.GetString("InputValue_Description", resourceCulture); } } - + internal static string InterfaceImplRule_ArgumentsDoNotMatch { get { return ResourceManager.GetString("InterfaceImplRule_ArgumentsDoNotMatch", resourceCulture); } } - + internal static string InterfaceImplRule_ArgumentsNotImpl { get { return ResourceManager.GetString("InterfaceImplRule_ArgumentsNotImpl", resourceCulture); } } - + internal static string InterfaceImplRule_FieldNotImpl { get { return ResourceManager.GetString("InterfaceImplRule_FieldNotImpl", resourceCulture); } } - + internal static string InterfaceImplRule_FieldTypeInvalid { get { return ResourceManager.GetString("InterfaceImplRule_FieldTypeInvalid", resourceCulture); } } - + internal static string InterfaceImplRule_ReturnTypeInvalid { get { return ResourceManager.GetString("InterfaceImplRule_ReturnTypeInvalid", resourceCulture); } } - + internal static string InterfaceTypeExtension_CannotMerge { get { return ResourceManager.GetString("InterfaceTypeExtension_CannotMerge", resourceCulture); } } - + internal static string IntType_Description { get { return ResourceManager.GetString("IntType_Description", resourceCulture); } } - + internal static string LongType_Description { get { return ResourceManager.GetString("LongType_Description", resourceCulture); } } - + internal static string NameType_Description { get { return ResourceManager.GetString("NameType_Description", resourceCulture); } } - + internal static string Name_Cannot_BeEmpty { get { return ResourceManager.GetString("Name_Cannot_BeEmpty", resourceCulture); } } - + internal static string ObjectFieldDescriptorBase_FieldType { get { return ResourceManager.GetString("ObjectFieldDescriptorBase_FieldType", resourceCulture); } } - + internal static string ObjectTypeDescriptor_InterfaceBaseClass { get { return ResourceManager.GetString("ObjectTypeDescriptor_InterfaceBaseClass", resourceCulture); } } - + internal static string InterfaceTypeDescriptor_InterfaceBaseClass { get { return ResourceManager.GetString("InterfaceTypeDescriptor_InterfaceBaseClass", resourceCulture); } } - + internal static string ObjectTypeDescriptor_MustBePropertyOrMethod { get { return ResourceManager.GetString("ObjectTypeDescriptor_MustBePropertyOrMethod", resourceCulture); } } - + internal static string ObjectTypeDescriptor_ResolveWith_NonAbstract { get { return ResourceManager.GetString("ObjectTypeDescriptor_ResolveWith_NonAbstract", resourceCulture); } } - + internal static string NodeDescriptor_MustBeMethod { get { return ResourceManager.GetString("NodeDescriptor_MustBeMethod", resourceCulture); } } - + internal static string NodeDescriptor_IdMember { get { return ResourceManager.GetString("NodeDescriptor_IdMember", resourceCulture); } } - + internal static string ObjectTypeDescriptor_Resolver_SchemaType { get { return ResourceManager.GetString("ObjectTypeDescriptor_Resolver_SchemaType", resourceCulture); } } - + internal static string Reflection_MemberMust_BeMethodOrProperty { get { return ResourceManager.GetString("Reflection_MemberMust_BeMethodOrProperty", resourceCulture); } } - + internal static string ResolverCompiler_UnknownParameterType { get { return ResourceManager.GetString("ResolverCompiler_UnknownParameterType", resourceCulture); } } - + internal static string ResolverTypeBindingBuilder_FieldBuilderNotSupported { get { return ResourceManager.GetString("ResolverTypeBindingBuilder_FieldBuilderNotSupported", resourceCulture); } } - + internal static string ResolverTypeBindingBuilder_FieldNotComplete { get { return ResourceManager.GetString("ResolverTypeBindingBuilder_FieldNotComplete", resourceCulture); } } - + internal static string Scalar_Cannot_Deserialize { get { return ResourceManager.GetString("Scalar_Cannot_Deserialize", resourceCulture); } } - - internal static string Scalar_Cannot_ParseLiteral { + + internal static string Scalar_Cannot_CoerceInputLiteral { get { - return ResourceManager.GetString("Scalar_Cannot_ParseLiteral", resourceCulture); + return ResourceManager.GetString("Scalar_Cannot_CoerceInputLiteral", resourceCulture); } } - - internal static string Scalar_Cannot_ParseValue { + + internal static string Scalar_Cannot_CoerceInputValue { get { - return ResourceManager.GetString("Scalar_Cannot_ParseValue", resourceCulture); + return ResourceManager.GetString("Scalar_Cannot_CoerceInputValue", resourceCulture); } } - + internal static string Scalar_Cannot_Serialize { get { return ResourceManager.GetString("Scalar_Cannot_Serialize", resourceCulture); } } - + internal static string SchemaBuilderExtensions_DirectiveTypeIsBaseType { get { return ResourceManager.GetString("SchemaBuilderExtensions_DirectiveTypeIsBaseType", resourceCulture); } } - + internal static string SchemaBuilderExtensions_MustBeDirectiveType { get { return ResourceManager.GetString("SchemaBuilderExtensions_MustBeDirectiveType", resourceCulture); } } - + internal static string SchemaBuilder_Binding_CannotBeHandled { get { return ResourceManager.GetString("SchemaBuilder_Binding_CannotBeHandled", resourceCulture); } } - + internal static string SchemaBuilder_Binding_Invalid { get { return ResourceManager.GetString("SchemaBuilder_Binding_Invalid", resourceCulture); } } - + internal static string SchemaBuilder_NoQueryType { get { return ResourceManager.GetString("SchemaBuilder_NoQueryType", resourceCulture); } } - + internal static string SchemaBuilder_RootType_MustBeClass { get { return ResourceManager.GetString("SchemaBuilder_RootType_MustBeClass", resourceCulture); } } - + internal static string SchemaBuilder_RootType_MustBeObjectType { get { return ResourceManager.GetString("SchemaBuilder_RootType_MustBeObjectType", resourceCulture); } } - + internal static string SchemaBuilder_RootType_NonGenericType { get { return ResourceManager.GetString("SchemaBuilder_RootType_NonGenericType", resourceCulture); } } - + internal static string SchemaBuilder_SchemaTypeInvalid { get { return ResourceManager.GetString("SchemaBuilder_SchemaTypeInvalid", resourceCulture); } } - + internal static string SchemaField_Description { get { return ResourceManager.GetString("SchemaField_Description", resourceCulture); } } - + internal static string SchemaSyntaxVisitor_UnknownOperationType { get { return ResourceManager.GetString("SchemaSyntaxVisitor_UnknownOperationType", resourceCulture); } } - + internal static string Schema_Description { get { return ResourceManager.GetString("Schema_Description", resourceCulture); } } - + internal static string Schema_Directives { get { return ResourceManager.GetString("Schema_Directives", resourceCulture); } } - + internal static string Schema_MutationType { get { return ResourceManager.GetString("Schema_MutationType", resourceCulture); } } - + internal static string Schema_QueryType { get { return ResourceManager.GetString("Schema_QueryType", resourceCulture); } } - + internal static string Schema_SubscriptionType { get { return ResourceManager.GetString("Schema_SubscriptionType", resourceCulture); } } - + internal static string Schema_Types { get { return ResourceManager.GetString("Schema_Types", resourceCulture); } } - + internal static string ShortType_Description { get { return ResourceManager.GetString("ShortType_Description", resourceCulture); } } - + internal static string StringType_Description { get { return ResourceManager.GetString("StringType_Description", resourceCulture); } } - + internal static string String_Argument_NullOrEmpty { get { return ResourceManager.GetString("String_Argument_NullOrEmpty", resourceCulture); } } - + internal static string TypeConfiguration_ConfigureIsNull { get { return ResourceManager.GetString("TypeConfiguration_ConfigureIsNull", resourceCulture); } } - + internal static string TypeConfiguration_DefinitionIsNull { get { return ResourceManager.GetString("TypeConfiguration_DefinitionIsNull", resourceCulture); } } - + internal static string TypeDependency_MustBeSchemaType { get { return ResourceManager.GetString("TypeDependency_MustBeSchemaType", resourceCulture); } } - + internal static string TypeExtensions_NoListType { get { return ResourceManager.GetString("TypeExtensions_NoListType", resourceCulture); } } - + internal static string TypeExtensions_TypeIsNotOfT { get { return ResourceManager.GetString("TypeExtensions_TypeIsNotOfT", resourceCulture); } } - + internal static string TypeField_Description { get { return ResourceManager.GetString("TypeField_Description", resourceCulture); } } - + internal static string TypeInitializer_CannotResolveDependency { get { return ResourceManager.GetString("TypeInitializer_CannotResolveDependency", resourceCulture); } } - + internal static string TypeInitializer_CompleteName_Duplicate { get { return ResourceManager.GetString("TypeInitializer_CompleteName_Duplicate", resourceCulture); } } - + internal static string TypeInitializer_Merge_KindDoesNotMatch { get { return ResourceManager.GetString("TypeInitializer_Merge_KindDoesNotMatch", resourceCulture); } } - + internal static string TypeKind_Description { get { return ResourceManager.GetString("TypeKind_Description", resourceCulture); } } - + internal static string TypeKind_Enum { get { return ResourceManager.GetString("TypeKind_Enum", resourceCulture); } } - + internal static string TypeKind_InputObject { get { return ResourceManager.GetString("TypeKind_InputObject", resourceCulture); } } - + internal static string TypeKind_Interface { get { return ResourceManager.GetString("TypeKind_Interface", resourceCulture); } } - + internal static string TypeKind_List { get { return ResourceManager.GetString("TypeKind_List", resourceCulture); } } - + internal static string TypeKind_NonNull { get { return ResourceManager.GetString("TypeKind_NonNull", resourceCulture); } } - + internal static string TypeKind_Object { get { return ResourceManager.GetString("TypeKind_Object", resourceCulture); } } - + internal static string TypeKind_Scalar { get { return ResourceManager.GetString("TypeKind_Scalar", resourceCulture); } } - + internal static string TypeKind_Union { get { return ResourceManager.GetString("TypeKind_Union", resourceCulture); } } - + internal static string TypeNameField_Description { get { return ResourceManager.GetString("TypeNameField_Description", resourceCulture); } } - + internal static string TypeNameHelper_InvalidTypeStructure { get { return ResourceManager.GetString("TypeNameHelper_InvalidTypeStructure", resourceCulture); } } - + internal static string TypeNameHelper_OnlyTypeSystemObjectsAreAllowed { get { return ResourceManager.GetString("TypeNameHelper_OnlyTypeSystemObjectsAreAllowed", resourceCulture); } } - + internal static string Type_Description { get { return ResourceManager.GetString("Type_Description", resourceCulture); } } - + internal static string UnionTypeExtension_CannotMerge { get { return ResourceManager.GetString("UnionTypeExtension_CannotMerge", resourceCulture); } } - + internal static string VariableValueBuilder_InputType { get { return ResourceManager.GetString("VariableValueBuilder_InputType", resourceCulture); } } - + internal static string VariableValueBuilder_InvalidValue { get { return ResourceManager.GetString("VariableValueBuilder_InvalidValue", resourceCulture); } } - + internal static string VariableValueBuilder_NodeKind { get { return ResourceManager.GetString("VariableValueBuilder_NodeKind", resourceCulture); } } - + internal static string VariableValueBuilder_NonNull { get { return ResourceManager.GetString("VariableValueBuilder_NonNull", resourceCulture); } } - + internal static string VariableValueBuilder_NonNull_In_Graph { get { return ResourceManager.GetString("VariableValueBuilder_NonNull_In_Graph", resourceCulture); } } - + internal static string VariableValueBuilder_VarNameEmpty { get { return ResourceManager.GetString("VariableValueBuilder_VarNameEmpty", resourceCulture); } } - + internal static string Argument_TypeIsNull { get { return ResourceManager.GetString("Argument_TypeIsNull", resourceCulture); } } - + internal static string NonNullType_NotAnInputType { get { return ResourceManager.GetString("NonNullType_NotAnInputType", resourceCulture); } } - + internal static string NonNullType_TypeIsNunNullType { get { return ResourceManager.GetString("NonNullType_TypeIsNunNullType", resourceCulture); } } - + internal static string NonNullType_ValueIsNull { get { return ResourceManager.GetString("NonNullType_ValueIsNull", resourceCulture); } } - + internal static string ObjectTypeExtension_CannotMerge { get { return ResourceManager.GetString("ObjectTypeExtension_CannotMerge", resourceCulture); } } - + internal static string TypeSystemObjectBase_DefinitionIsNull { get { return ResourceManager.GetString("TypeSystemObjectBase_DefinitionIsNull", resourceCulture); } } - + internal static string TypeSystemObjectBase_NameIsNull { get { return ResourceManager.GetString("TypeSystemObjectBase_NameIsNull", resourceCulture); } } - + internal static string TypeSystemObject_DescriptionImmutable { get { return ResourceManager.GetString("TypeSystemObject_DescriptionImmutable", resourceCulture); } } - + internal static string TypeSystem_Immutable { get { return ResourceManager.GetString("TypeSystem_Immutable", resourceCulture); } } - + internal static string TypeSystemObject_NameImmutable { get { return ResourceManager.GetString("TypeSystemObject_NameImmutable", resourceCulture); } } - + internal static string UnionType_MustHaveTypes { get { return ResourceManager.GetString("UnionType_MustHaveTypes", resourceCulture); } } - + internal static string UnionType_UnableToResolveType { get { return ResourceManager.GetString("UnionType_UnableToResolveType", resourceCulture); } } - + internal static string SchemaBuilder_MustBeSchemaType { get { return ResourceManager.GetString("SchemaBuilder_MustBeSchemaType", resourceCulture); } } - + internal static string TypeRegistrar_TypesInconsistent { get { return ResourceManager.GetString("TypeRegistrar_TypesInconsistent", resourceCulture); } } - + internal static string TypeConversion_ConvertNotSupported { get { return ResourceManager.GetString("TypeConversion_ConvertNotSupported", resourceCulture); } } - + internal static string SchemaBuilder_Interceptor_NotSupported { get { return ResourceManager.GetString("SchemaBuilder_Interceptor_NotSupported", resourceCulture); } } - + internal static string IdSerializer_UnableToEncode { get { return ResourceManager.GetString("IdSerializer_UnableToEncode", resourceCulture); } } - + internal static string IdSerializer_UnableToDecode { get { return ResourceManager.GetString("IdSerializer_UnableToDecode", resourceCulture); } } - + internal static string SchemaBuilder_Convention_NotSupported { get { return ResourceManager.GetString("SchemaBuilder_Convention_NotSupported", resourceCulture); } } - + internal static string TimeSpanType_Description { get { return ResourceManager.GetString("TimeSpanType_Description", resourceCulture); } } - + internal static string DefaultDataLoaderRegistry_GetOrRegister { get { return ResourceManager.GetString("DefaultDataLoaderRegistry_GetOrRegister", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_CreateDataLoader_AbstractType { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_CreateDataLoader_AbstractType", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_CreateDataLoader_UnableToCreate { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_CreateDataLoader_UnableToCreate", resourceCulture); } } - + internal static string NonNamedType_IsInstanceOfType_NotAnInputType { get { return ResourceManager.GetString("NonNamedType_IsInstanceOfType_NotAnInputType", resourceCulture); } } - + internal static string RegisteredType_CompletionContext_Not_Initialized { get { return ResourceManager.GetString("RegisteredType_CompletionContext_Not_Initialized", resourceCulture); } } - + internal static string RegisteredType_CompletionContext_Already_Set { get { return ResourceManager.GetString("RegisteredType_CompletionContext_Already_Set", resourceCulture); } } - + internal static string DeferDirectiveType_Description { get { return ResourceManager.GetString("DeferDirectiveType_Description", resourceCulture); } } - + internal static string DeferDirectiveType_Label_Description { get { return ResourceManager.GetString("DeferDirectiveType_Label_Description", resourceCulture); } } - + internal static string DeferDirectiveType_If_Description { get { return ResourceManager.GetString("DeferDirectiveType_If_Description", resourceCulture); } } - + internal static string StreamDirectiveType_Description { get { return ResourceManager.GetString("StreamDirectiveType_Description", resourceCulture); } } - + internal static string StreamDirectiveType_Label_Description { get { return ResourceManager.GetString("StreamDirectiveType_Label_Description", resourceCulture); } } - + internal static string StreamDirectiveType_InitialCount_Description { get { return ResourceManager.GetString("StreamDirectiveType_InitialCount_Description", resourceCulture); } } - + internal static string StreamDirectiveType_If_Description { get { return ResourceManager.GetString("StreamDirectiveType_If_Description", resourceCulture); } } - + internal static string SchemaBuilder_AddRootType_TypeAlreadyRegistered { get { return ResourceManager.GetString("SchemaBuilder_AddRootType_TypeAlreadyRegistered", resourceCulture); } } - + internal static string NodeDescriptor_IdField_MustBePropertyOrMethod { get { return ResourceManager.GetString("NodeDescriptor_IdField_MustBePropertyOrMethod", resourceCulture); } } - + internal static string DeprecatedDirectiveType_TypeDescription { get { return ResourceManager.GetString("DeprecatedDirectiveType_TypeDescription", resourceCulture); } } - + internal static string DeprecatedDirectiveType_ReasonDescription { get { return ResourceManager.GetString("DeprecatedDirectiveType_ReasonDescription", resourceCulture); } } - + internal static string IncludeDirectiveType_TypeDescription { get { return ResourceManager.GetString("IncludeDirectiveType_TypeDescription", resourceCulture); } } - + internal static string IncludeDirectiveType_IfDescription { get { return ResourceManager.GetString("IncludeDirectiveType_IfDescription", resourceCulture); } } - + internal static string SkipDirectiveType_TypeDescription { get { return ResourceManager.GetString("SkipDirectiveType_TypeDescription", resourceCulture); } } - + internal static string SkipDirectiveType_IfDescription { get { return ResourceManager.GetString("SkipDirectiveType_IfDescription", resourceCulture); } } - + internal static string SpecifiedByDirectiveType_TypeDescription { get { return ResourceManager.GetString("SpecifiedByDirectiveType_TypeDescription", resourceCulture); } } - + internal static string SpecifiedByDirectiveType_UrlDescription { get { return ResourceManager.GetString("SpecifiedByDirectiveType_UrlDescription", resourceCulture); } } - + internal static string NodeType_TypeDescription { get { return ResourceManager.GetString("NodeType_TypeDescription", resourceCulture); } } - + internal static string AnyType_CycleInObjectGraph { get { return ResourceManager.GetString("AnyType_CycleInObjectGraph", resourceCulture); } } - + internal static string UuidType_FormatUnknown { get { return ResourceManager.GetString("UuidType_FormatUnknown", resourceCulture); } } - + internal static string Directive_GetArgument_ArgumentNameIsInvalid { get { return ResourceManager.GetString("Directive_GetArgument_ArgumentNameIsInvalid", resourceCulture); } } - + internal static string AppliedDirective_Description { get { return ResourceManager.GetString("AppliedDirective_Description", resourceCulture); } } - + internal static string DirectiveArgument_Description { get { return ResourceManager.GetString("DirectiveArgument_Description", resourceCulture); } } - + internal static string ThrowHelper_UsePagingAttribute_NodeTypeUnknown { get { return ResourceManager.GetString("ThrowHelper_UsePagingAttribute_NodeTypeUnknown", resourceCulture); } } - + internal static string ErrorHelper_ObjectField_HasNoResolver { get { return ResourceManager.GetString("ErrorHelper_ObjectField_HasNoResolver", resourceCulture); } } - + internal static string ExtendedTypeReferenceHandler_NonGenericExecutableNotAllowed { get { return ResourceManager.GetString("ExtendedTypeReferenceHandler_NonGenericExecutableNotAllowed", resourceCulture); } } - + internal static string BindingCompiler_AddBinding_BindingCannotBeHandled { get { return ResourceManager.GetString("BindingCompiler_AddBinding_BindingCannotBeHandled", resourceCulture); } } - + internal static string Type_SpecifiedByUrl_Description { get { return ResourceManager.GetString("Type_SpecifiedByUrl_Description", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddObjectType_TIsSchemaType { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddObjectType_TIsSchemaType", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddUnionType_TIsSchemaType { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddUnionType_TIsSchemaType", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddEnumType_TIsSchemaType { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddEnumType_TIsSchemaType", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddInterfaceType_TIsSchemaType { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddInterfaceType_TIsSchemaType", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddInputObjectType_TIsSchemaType { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddInputObjectType_TIsSchemaType", resourceCulture); } } - + internal static string EventMessageParameterExpressionBuilder_MessageNotFound { get { return ResourceManager.GetString("EventMessageParameterExpressionBuilder_MessageNotFound", resourceCulture); } } - + internal static string DefaultResolverCompilerService_CreateResolver_ArgumentValidationError { get { return ResourceManager.GetString("DefaultResolverCompilerService_CreateResolver_ArgumentValidationError", resourceCulture); } } - + internal static string DefaultResolverCompilerService_CompileSubscribe_OnlyMethodsAllowed { get { return ResourceManager.GetString("DefaultResolverCompilerService_CompileSubscribe_OnlyMethodsAllowed", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddResolverConfig_ContextInvalid { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddResolverConfig_ContextInvalid", resourceCulture); } } - + internal static string ExpressionHelper_GetGlobalStateWithDefault_NoDefaults { get { return ResourceManager.GetString("ExpressionHelper_GetGlobalStateWithDefault_NoDefaults", resourceCulture); } } - + internal static string ExpressionHelper_ResolveScopedContextData_KeyDoesNotExist { get { return ResourceManager.GetString("ExpressionHelper_ResolveScopedContextData_KeyDoesNotExist", resourceCulture); } } - + internal static string ExpressionHelper_GetScopedStateWithDefault_NoDefaultValue { get { return ResourceManager.GetString("ExpressionHelper_GetScopedStateWithDefault_NoDefaultValue", resourceCulture); } } - + internal static string ClaimsPrincipalParameterExpressionBuilder_NoClaimsFound { get { return ResourceManager.GetString("ClaimsPrincipalParameterExpressionBuilder_NoClaimsFound", resourceCulture); } } - + internal static string DirectiveLocation_VariableDefinition { get { return ResourceManager.GetString("DirectiveLocation_VariableDefinition", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddResolver_TypeConditionNotMet { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddResolver_TypeConditionNotMet", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddRootResolver_NeedsToBeClassOrInterface { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddRootResolver_NeedsToBeClassOrInterface", resourceCulture); } } - + internal static string Relay_NodeField_Description { get { return ResourceManager.GetString("Relay_NodeField_Description", resourceCulture); } } - + internal static string Relay_NodeField_Id_Description { get { return ResourceManager.GetString("Relay_NodeField_Id_Description", resourceCulture); } } - + internal static string Relay_NodesField_Description { get { return ResourceManager.GetString("Relay_NodesField_Description", resourceCulture); } } - + internal static string Relay_NodesField_Ids_Description { get { return ResourceManager.GetString("Relay_NodesField_Ids_Description", resourceCulture); } } - + internal static string ErrorHelper_MiddlewareOrderInvalid { get { return ResourceManager.GetString("ErrorHelper_MiddlewareOrderInvalid", resourceCulture); } } - + internal static string ErrorHelper_NoSchemaTypesAllowedAsRuntimeType { get { return ResourceManager.GetString("ErrorHelper_NoSchemaTypesAllowedAsRuntimeType", resourceCulture); } } - + internal static string FieldInitHelper_CompleteFields_MaxFieldCountToSmall { get { return ResourceManager.GetString("FieldInitHelper_CompleteFields_MaxFieldCountToSmall", resourceCulture); } } - + internal static string RegisteredType_Completion_NotYetReady { get { return ResourceManager.GetString("RegisteredType_Completion_NotYetReady", resourceCulture); } } - + internal static string EdgeType_IsInstanceOfType_NonObject { get { return ResourceManager.GetString("EdgeType_IsInstanceOfType_NonObject", resourceCulture); } } - + internal static string EdgeType_Description { get { return ResourceManager.GetString("EdgeType_Description", resourceCulture); } } - + internal static string EdgeType_Cursor_Description { get { return ResourceManager.GetString("EdgeType_Cursor_Description", resourceCulture); } } - + internal static string EdgeType_Node_Description { get { return ResourceManager.GetString("EdgeType_Node_Description", resourceCulture); } } - + internal static string ConnectionType_Description { get { return ResourceManager.GetString("ConnectionType_Description", resourceCulture); } } - + internal static string ConnectionType_PageInfo_Description { get { return ResourceManager.GetString("ConnectionType_PageInfo_Description", resourceCulture); } } - + internal static string ConnectionType_Edges_Description { get { return ResourceManager.GetString("ConnectionType_Edges_Description", resourceCulture); } } - + internal static string ConnectionType_TotalCount_Description { get { return ResourceManager.GetString("ConnectionType_TotalCount_Description", resourceCulture); } } - + internal static string CollectionSegmentType_PageInfo_Description { get { return ResourceManager.GetString("CollectionSegmentType_PageInfo_Description", resourceCulture); } } - + internal static string CollectionSegmentType_Description { get { return ResourceManager.GetString("CollectionSegmentType_Description", resourceCulture); } } - + internal static string CollectionSegmentType_Items_Description { get { return ResourceManager.GetString("CollectionSegmentType_Items_Description", resourceCulture); } } - + internal static string ConnectionType_Nodes_Description { get { return ResourceManager.GetString("ConnectionType_Nodes_Description", resourceCulture); } } - + internal static string ServiceHelper_UseResolverServiceInternal_Order { get { return ResourceManager.GetString("ServiceHelper_UseResolverServiceInternal_Order", resourceCulture); } } - + internal static string DefaultNamingConventions_FormatFieldName_EmptyOrNull { get { return ResourceManager.GetString("DefaultNamingConventions_FormatFieldName_EmptyOrNull", resourceCulture); } } - + internal static string OneOfDirectiveType_Description { get { return ResourceManager.GetString("OneOfDirectiveType_Description", resourceCulture); } } - + internal static string ThrowHelper_OneOfNoFieldSet { get { return ResourceManager.GetString("ThrowHelper_OneOfNoFieldSet", resourceCulture); } } - + internal static string ThrowHelper_OneOfMoreThanOneFieldSet { get { return ResourceManager.GetString("ThrowHelper_OneOfMoreThanOneFieldSet", resourceCulture); } } - + internal static string ThrowHelper_OneOfFieldIsNull { get { return ResourceManager.GetString("ThrowHelper_OneOfFieldIsNull", resourceCulture); } } - + internal static string ReflectionUtils_ExtractMethod_MethodExpected { get { return ResourceManager.GetString("ReflectionUtils_ExtractMethod_MethodExpected", resourceCulture); } } - + internal static string ResolverContextExtensions_ScopedContextData_KeyNotFound { get { return ResourceManager.GetString("ResolverContextExtensions_ScopedContextData_KeyNotFound", resourceCulture); } } - + internal static string ResolverContextExtensions_LocalContextData_KeyNotFound { get { return ResourceManager.GetString("ResolverContextExtensions_LocalContextData_KeyNotFound", resourceCulture); } } - + internal static string ResolverContextExtensions_ContextData_KeyNotFound { get { return ResourceManager.GetString("ResolverContextExtensions_ContextData_KeyNotFound", resourceCulture); } } - + internal static string SchemaTypes_GetType_DoesNotExist { get { return ResourceManager.GetString("SchemaTypes_GetType_DoesNotExist", resourceCulture); } } - + internal static string SchemaTypes_DefinitionInvalid { get { return ResourceManager.GetString("SchemaTypes_DefinitionInvalid", resourceCulture); } } - + internal static string InputObjectTypeDescriptor_OnlyProperties { get { return ResourceManager.GetString("InputObjectTypeDescriptor_OnlyProperties", resourceCulture); } } - + internal static string InterfaceTypeDescriptor_MustBePropertyOrMethod { get { return ResourceManager.GetString("InterfaceTypeDescriptor_MustBePropertyOrMethod", resourceCulture); } } - + internal static string ThrowHelper_FieldBase_Sealed { get { return ResourceManager.GetString("ThrowHelper_FieldBase_Sealed", resourceCulture); } } - + internal static string TypeInitializer_CannotFindType { get { return ResourceManager.GetString("TypeInitializer_CannotFindType", resourceCulture); } } - + internal static string ThrowHelper_RelayIdFieldHelpers_NoFieldType { get { return ResourceManager.GetString("ThrowHelper_RelayIdFieldHelpers_NoFieldType", resourceCulture); } } - + internal static string ThrowHelper_NodeResolver_ObjNoDefinition { get { return ResourceManager.GetString("ThrowHelper_NodeResolver_ObjNoDefinition", resourceCulture); } } - + internal static string ThrowHelper_NodeResolver_ArgumentTypeMissing { get { return ResourceManager.GetString("ThrowHelper_NodeResolver_ArgumentTypeMissing", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_TypeNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_TypeNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_FieldNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_FieldNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_FieldArgNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_FieldArgNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_InvalidCoordinate { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_InvalidCoordinate", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_InputFieldNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_InputFieldNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_EnumValueNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_EnumValueNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_DirectiveNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_DirectiveNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_DirectiveArgumentNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_DirectiveArgumentNotFound", resourceCulture); } } - + internal static string ThrowHelper_FormatResultLeaf_InvalidSyntaxKind { get { return ResourceManager.GetString("ThrowHelper_FormatResultLeaf_InvalidSyntaxKind", resourceCulture); } } - + internal static string ThrowHelper_FormatResultList_InvalidObjectKind { get { return ResourceManager.GetString("ThrowHelper_FormatResultList_InvalidObjectKind", resourceCulture); } } - + internal static string ThrowHelper_FormatResultObject_InvalidObjectKind { get { return ResourceManager.GetString("ThrowHelper_FormatResultObject_InvalidObjectKind", resourceCulture); } } - + internal static string ThrowHelper_FormatValueList_InvalidObjectKind { get { return ResourceManager.GetString("ThrowHelper_FormatValueList_InvalidObjectKind", resourceCulture); } } - + internal static string ThrowHelper_ParseList_InvalidObjectKind { get { return ResourceManager.GetString("ThrowHelper_ParseList_InvalidObjectKind", resourceCulture); } } - + internal static string ThrowHelper_ParseNestedList_InvalidSyntaxKind { get { return ResourceManager.GetString("ThrowHelper_ParseNestedList_InvalidSyntaxKind", resourceCulture); } } - + internal static string ThrowHelper_ParseInputObject_InvalidObjectKind { get { return ResourceManager.GetString("ThrowHelper_ParseInputObject_InvalidObjectKind", resourceCulture); } } - + internal static string ThrowHelper_ParseInputObject_InvalidSyntaxKind { get { return ResourceManager.GetString("ThrowHelper_ParseInputObject_InvalidSyntaxKind", resourceCulture); } } - + internal static string ThrowHelper_NonNullInputViolation { get { return ResourceManager.GetString("ThrowHelper_NonNullInputViolation", resourceCulture); } } - + internal static string ThrowHelper_InvalidInputFieldNames { get { return ResourceManager.GetString("ThrowHelper_InvalidInputFieldNames", resourceCulture); } } - + internal static string ThrowHelper_RequiredInputFieldIsMissing { get { return ResourceManager.GetString("ThrowHelper_RequiredInputFieldIsMissing", resourceCulture); } } - + internal static string ThrowHelper_DataLoader_InvalidType { get { return ResourceManager.GetString("ThrowHelper_DataLoader_InvalidType", resourceCulture); } } - + internal static string ThrowHelper_Convention_ConventionCouldNotBeCreated { get { return ResourceManager.GetString("ThrowHelper_Convention_ConventionCouldNotBeCreated", resourceCulture); } } - + internal static string ThrowHelper_Convention_TwoConventionsRegisteredForScope { get { return ResourceManager.GetString("ThrowHelper_Convention_TwoConventionsRegisteredForScope", resourceCulture); } } - + internal static string ThrowHelper_NodeAttribute_IdFieldNotFound { get { return ResourceManager.GetString("ThrowHelper_NodeAttribute_IdFieldNotFound", resourceCulture); } } - + internal static string ThrowHelper_TypeCompletionContext_UnableToResolveType { get { return ResourceManager.GetString("ThrowHelper_TypeCompletionContext_UnableToResolveType", resourceCulture); } } - + internal static string ThrowHelper_TypeRegistrar_CreateInstanceFailed { get { return ResourceManager.GetString("ThrowHelper_TypeRegistrar_CreateInstanceFailed", resourceCulture); } } - + internal static string ThrowHelper_Convention_UnableToCreateConvention { get { return ResourceManager.GetString("ThrowHelper_Convention_UnableToCreateConvention", resourceCulture); } } - + internal static string ThrowHelper_SubscribeAttribute_SubscribeResolverNotFound { get { return ResourceManager.GetString("ThrowHelper_SubscribeAttribute_SubscribeResolverNotFound", resourceCulture); } } - + internal static string ThrowHelper_SubscribeAttribute_TopicTypeUnspecified { get { return ResourceManager.GetString("ThrowHelper_SubscribeAttribute_TopicTypeUnspecified", resourceCulture); } } - + internal static string ThrowHelper_SubscribeAttribute_MessageTypeUnspecified { get { return ResourceManager.GetString("ThrowHelper_SubscribeAttribute_MessageTypeUnspecified", resourceCulture); } } - + internal static string ThrowHelper_EventMessage_NotFound { get { return ResourceManager.GetString("ThrowHelper_EventMessage_NotFound", resourceCulture); } } - + internal static string ThrowHelper_EventMessage_InvalidCast { get { return ResourceManager.GetString("ThrowHelper_EventMessage_InvalidCast", resourceCulture); } } - + internal static string ErrorHelper_NeedsOneAtLeastField { get { return ResourceManager.GetString("ErrorHelper_NeedsOneAtLeastField", resourceCulture); } } - + internal static string ErrorHelper_TwoUnderscoresNotAllowedField { get { return ResourceManager.GetString("ErrorHelper_TwoUnderscoresNotAllowedField", resourceCulture); } } - + internal static string ErrorHelper_TwoUnderscoresNotAllowedOnArgument { get { return ResourceManager.GetString("ErrorHelper_TwoUnderscoresNotAllowedOnArgument", resourceCulture); } } - + internal static string ErrorHelper_TwoUnderscoresNotAllowedOnDirectiveName { get { return ResourceManager.GetString("ErrorHelper_TwoUnderscoresNotAllowedOnDirectiveName", resourceCulture); } } - + internal static string ErrorHelper_NotTransitivelyImplemented { get { return ResourceManager.GetString("ErrorHelper_NotTransitivelyImplemented", resourceCulture); } } - + internal static string ErrorHelper_InvalidFieldDeprecation { get { return ResourceManager.GetString("ErrorHelper_InvalidFieldDeprecation", resourceCulture); } } - + internal static string ErrorHelper_InvalidFieldType { get { return ResourceManager.GetString("ErrorHelper_InvalidFieldType", resourceCulture); } } - + internal static string ErrorHelper_FieldNotImplemented { get { return ResourceManager.GetString("ErrorHelper_FieldNotImplemented", resourceCulture); } } - + internal static string ErrorHelper_InvalidArgumentType { get { return ResourceManager.GetString("ErrorHelper_InvalidArgumentType", resourceCulture); } } - + internal static string ErrorHelper_AdditionalArgumentNotNullable { get { return ResourceManager.GetString("ErrorHelper_AdditionalArgumentNotNullable", resourceCulture); } } - + internal static string ErrorHelper_ArgumentNotImplemented { get { return ResourceManager.GetString("ErrorHelper_ArgumentNotImplemented", resourceCulture); } } - + internal static string ErrorHelper_OneOfInputObjectMustHaveNullableFieldsWithoutDefaults { get { return ResourceManager.GetString("ErrorHelper_OneOfInputObjectMustHaveNullableFieldsWithoutDefaults", resourceCulture); } } - + internal static string ErrorHelper_InputObjectMustNotHaveRecursiveNonNullableReferencesToSelf { get { return ResourceManager.GetString("ErrorHelper_InputObjectMustNotHaveRecursiveNonNullableReferencesToSelf", resourceCulture); } } - + internal static string ErrorHelper_RequiredArgumentCannotBeDeprecated { get { return ResourceManager.GetString("ErrorHelper_RequiredArgumentCannotBeDeprecated", resourceCulture); } } - + internal static string ErrorHelper_RequiredFieldCannotBeDeprecated { get { return ResourceManager.GetString("ErrorHelper_RequiredFieldCannotBeDeprecated", resourceCulture); } } - + internal static string ErrorHelper_InterfaceHasNoImplementation { get { return ResourceManager.GetString("ErrorHelper_InterfaceHasNoImplementation", resourceCulture); } } - + internal static string ErrorHelper_CompleteInterfacesHelper_UnableToResolveInterface { get { return ResourceManager.GetString("ErrorHelper_CompleteInterfacesHelper_UnableToResolveInterface", resourceCulture); } } - + internal static string ErrorHelper_DirectiveCollection_ArgumentDoesNotExist { get { return ResourceManager.GetString("ErrorHelper_DirectiveCollection_ArgumentDoesNotExist", resourceCulture); } } - + internal static string ErrorHelper_DirectiveCollection_ArgumentNonNullViolation { get { return ResourceManager.GetString("ErrorHelper_DirectiveCollection_ArgumentNonNullViolation", resourceCulture); } } - + internal static string ErrorHelper_ObjectType_UnableToInferOrResolveType { get { return ResourceManager.GetString("ErrorHelper_ObjectType_UnableToInferOrResolveType", resourceCulture); } } - + internal static string ErrorHelper_Relay_NoNodeResolver { get { return ResourceManager.GetString("ErrorHelper_Relay_NoNodeResolver", resourceCulture); } } - + internal static string ErrorHelper_NodeResolver_MustHaveExactlyOneIdArg { get { return ResourceManager.GetString("ErrorHelper_NodeResolver_MustHaveExactlyOneIdArg", resourceCulture); } } - + internal static string ErrorHelper_NodeResolver_MustReturnObject { get { return ResourceManager.GetString("ErrorHelper_NodeResolver_MustReturnObject", resourceCulture); } } - + internal static string ErrorHelper_NodeResolver_NodeTypeHasNoId { get { return ResourceManager.GetString("ErrorHelper_NodeResolver_NodeTypeHasNoId", resourceCulture); } } - + internal static string ThrowHelper_InvalidInputFieldNames_Single { get { return ResourceManager.GetString("ThrowHelper_InvalidInputFieldNames_Single", resourceCulture); } } - + internal static string ThrowHelper_MutationDuplicateErrorName { get { return ResourceManager.GetString("ThrowHelper_MutationDuplicateErrorName", resourceCulture); } } - + internal static string ErrorHelper_NodeResolverMissing { get { return ResourceManager.GetString("ErrorHelper_NodeResolverMissing", resourceCulture); } } - + internal static string ThrowHelper_Flags_Enum_Shape_Unknown { get { return ResourceManager.GetString("ThrowHelper_Flags_Enum_Shape_Unknown", resourceCulture); } } - + internal static string ThrowHelper_Flags_Parser_NoSelection { get { return ResourceManager.GetString("ThrowHelper_Flags_Parser_NoSelection", resourceCulture); } } - + internal static string ThrowHelper_Flags_Parser_UnknownSelection { get { return ResourceManager.GetString("ThrowHelper_Flags_Parser_UnknownSelection", resourceCulture); } } - + internal static string ThrowHelper_Flags_IllegalFlagEnumName { get { return ResourceManager.GetString("ThrowHelper_Flags_IllegalFlagEnumName", resourceCulture); } } - + internal static string Directive_GetArgumentValue_UnknownArgument { get { return ResourceManager.GetString("Directive_GetArgumentValue_UnknownArgument", resourceCulture); } } - + internal static string ErrorHelper_DirectiveCollection_ArgumentValueTypeIsWrong { get { return ResourceManager.GetString("ErrorHelper_DirectiveCollection_ArgumentValueTypeIsWrong", resourceCulture); } } - + internal static string TypeDiscoveryInfo_TypeRefKindNotSupported { get { return ResourceManager.GetString("TypeDiscoveryInfo_TypeRefKindNotSupported", resourceCulture); } } - + internal static string ErrorHelper_FetchedToManyNodesAtOnce { get { return ResourceManager.GetString("ErrorHelper_FetchedToManyNodesAtOnce", resourceCulture); } } - + internal static string ThrowHelper_InputTypeExpected_Message { get { return ResourceManager.GetString("ThrowHelper_InputTypeExpected_Message", resourceCulture); } } - + internal static string ThrowHelper_OutputTypeExpected_Message { get { return ResourceManager.GetString("ThrowHelper_OutputTypeExpected_Message", resourceCulture); } } - + internal static string TagDirective_Name_NotValid { get { return ResourceManager.GetString("TagDirective_Name_NotValid", resourceCulture); } } - + internal static string TagDirective_Descriptor_NotSupported { get { return ResourceManager.GetString("TagDirective_Descriptor_NotSupported", resourceCulture); } } - + internal static string ErrorHelper_DuplicateFieldName_Message { get { return ResourceManager.GetString("ErrorHelper_DuplicateFieldName_Message", resourceCulture); } } - + internal static string ErrorHelper_DuplicateDataMiddlewareDetected_Message { get { return ResourceManager.GetString("ErrorHelper_DuplicateDataMiddlewareDetected_Message", resourceCulture); } } - + internal static string SchemaException_UnexpectedError { get { return ResourceManager.GetString("SchemaException_UnexpectedError", resourceCulture); } } - + internal static string SchemaException_ErrorSummaryText { get { return ResourceManager.GetString("SchemaException_ErrorSummaryText", resourceCulture); } } - + internal static string ResolverContextExtensions_IsSelected_FieldNameEmpty { get { return ResourceManager.GetString("ResolverContextExtensions_IsSelected_FieldNameEmpty", resourceCulture); } } - + internal static string ObjectToDictionaryConverter_CycleInObjectGraph { get { return ResourceManager.GetString("ObjectToDictionaryConverter_CycleInObjectGraph", resourceCulture); } } - + internal static string LocalDateTimeType_Description { get { return ResourceManager.GetString("LocalDateTimeType_Description", resourceCulture); } } - + internal static string LocalDateType_Description { get { return ResourceManager.GetString("LocalDateType_Description", resourceCulture); } } - + internal static string LocalTimeType_Description { get { return ResourceManager.GetString("LocalTimeType_Description", resourceCulture); } } - + internal static string SchemaBuilder_BindRuntimeType_ObjectNotAllowed { get { return ResourceManager.GetString("SchemaBuilder_BindRuntimeType_ObjectNotAllowed", resourceCulture); } } - + internal static string TypeExtensions_KindIsNotSupported { get { return ResourceManager.GetString("TypeExtensions_KindIsNotSupported", resourceCulture); } } - + internal static string ThrowHelper_InvalidTypeConversion { get { return ResourceManager.GetString("ThrowHelper_InvalidTypeConversion", resourceCulture); diff --git a/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx b/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx index 4b97a51592d..e81860474d7 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx +++ b/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx @@ -266,10 +266,10 @@ In some cases, you need to provide options to alter GraphQL's execution behavior {0} cannot deserialize the given value. - + {0} cannot parse the given literal of type `{1}`. - + {0} cannot parse the given value of type `{1}`. diff --git a/src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs b/src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs index 29424f1d424..f7a043adb79 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs @@ -4,10 +4,16 @@ namespace HotChocolate.Properties; internal static class TypeResourceHelper { - public static string Scalar_Cannot_Serialize(string typeName) + public static string Scalar_Cannot_ConvertValueToLiteral(Type actualType, string actualValue) { - ArgumentException.ThrowIfNullOrEmpty(typeName); + return string.Format( + CultureInfo.InvariantCulture, + TypeResources.Scalar_Cannot_Deserialize, + typeName); + } + public static string Scalar_Cannot_Serialize(string typeName) + { return string.Format( CultureInfo.InvariantCulture, TypeResources.Scalar_Cannot_Serialize, @@ -16,49 +22,35 @@ public static string Scalar_Cannot_Serialize(string typeName) public static string Scalar_Cannot_Deserialize(string typeName) { - ArgumentException.ThrowIfNullOrEmpty(typeName); - return string.Format( CultureInfo.InvariantCulture, TypeResources.Scalar_Cannot_Deserialize, typeName); } - public static string Scalar_Cannot_ParseLiteral( - string typeName, Type literalType) + public static string Scalar_Cannot_CoerceInputLiteral(string typeName, Type literalType) { - ArgumentException.ThrowIfNullOrEmpty(typeName); - ArgumentNullException.ThrowIfNull(literalType); - return string.Format( CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_ParseLiteral, + TypeResources.Scalar_Cannot_CoerceInputLiteral, typeName, literalType.Name); } - public static string Scalar_Cannot_ParseValue( - string typeName, Type valueType) + public static string Scalar_Cannot_CoerceInputValue(string typeName, Type valueType) { - ArgumentException.ThrowIfNullOrEmpty(typeName); - ArgumentNullException.ThrowIfNull(valueType); - return string.Format( CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_ParseValue, + TypeResources.Scalar_Cannot_CoerceInputValue, typeName, valueType.FullName); } - public static string Scalar_Cannot_ParseResult( - string typeName, Type valueType) + public static string Scalar_Cannot_ParseResult(string typeName, Type valueType) { - ArgumentException.ThrowIfNullOrEmpty(typeName); - ArgumentNullException.ThrowIfNull(valueType); - return string.Format( CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_ParseValue, + TypeResources.Scalar_Cannot_CoerceInputValue, typeName, valueType.FullName); } @@ -66,7 +58,6 @@ public static string Scalar_Cannot_ParseResult( public static string Type_Name_IsNotValid(string typeName) { var name = typeName ?? "null"; - return $"`{name}` is not a valid " - + "GraphQL type name."; + return $"`{name}` is not a valid GraphQL type name."; } } diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs index 0126705a663..44a3642753c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs @@ -52,7 +52,7 @@ public override IValueNode ParseResult(object? resultValue) return new StringValueNode(FormatValueSelection(valueSelection)); } - throw new SerializationException( + throw new LeafCoercionException( ErrorBuilder.New() .SetMessage("The field selection set syntax is invalid.") .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -61,7 +61,7 @@ public override IValueNode ParseResult(object? resultValue) } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs index 0ede9912dcd..03a4449044d 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs @@ -51,7 +51,7 @@ public override IValueNode ParseResult(object? resultValue) return new StringValueNode(SerializeSelectionSet(selectionSet)); } - throw new SerializationException( + throw new LeafCoercionException( ErrorBuilder.New() .SetMessage("The field selection set syntax is invalid.") .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) @@ -60,7 +60,7 @@ public override IValueNode ParseResult(object? resultValue) } /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { diff --git a/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs b/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs index 1703bffc19d..41bedd1dd3c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Text.Json; @@ -10,164 +11,93 @@ namespace HotChocolate.Types; public interface ILeafType : IInputTypeDefinition, IOutputTypeDefinition { /// - /// Defines if the given is possibly of this type. + /// Determines if the given is compatible with this type. /// - /// - /// The GraphQL value syntax which shall be validated. + /// + /// The GraphQL literal to validate. /// /// - /// true if the given is possibly of this type. + /// true if the given is compatible with this type. /// - bool IsInstanceOfType(IValueNode valueSyntax); + bool IsValueCompatible(IValueNode valueLiteral); /// - /// Defines if the given is possibly of this type. + /// Determines if the given is compatible with this type. /// - /// - /// The runtime value which shall be validated. + /// + /// The deserialized JSON input value to validate. /// /// - /// true if the given is possibly of this type. + /// true if the given is compatible with this type. /// - bool IsInstanceOfType(object? runtimeValue); + bool IsValueCompatible(JsonElement inputValue); /// - /// Parses the GraphQL value syntax of this type into a runtime value representation. - /// - /// - /// A GraphQL value syntax representation of this type. - /// - /// - /// Returns a runtime value representation of this type. - /// - object? ParseLiteral(IValueNode valueSyntax); - - /// - /// Parses a runtime value of this type into a GraphQL value syntax representation. + /// Determines if the given is an instance of this type. /// /// - /// A result value representation of this type. + /// The runtime value to validate. /// /// - /// Returns a GraphQL value syntax representation of the . + /// true if the given is an instance of this type. /// - /// - /// Unable to parse the given - /// into a GraphQL value syntax representation of this type. - /// - IValueNode ParseValue(object? runtimeValue); + bool IsInstanceOfType(object? runtimeValue); /// - /// Parses a result value of this into a GraphQL value syntax representation. + /// Coerces a GraphQL literal (AST value node) into a runtime value. /// - /// - /// A result value representation of this type. + /// + /// The GraphQL literal to coerce. /// /// - /// Returns a GraphQL value syntax representation of the . + /// Returns the runtime value representation. /// - /// - /// Unable to parse the given - /// into a GraphQL value syntax representation of this type. + /// + /// Unable to coerce the given into a runtime value. /// - IValueNode ParseResult(object? resultValue); + object? CoerceInputLiteral(IValueNode valueLiteral); /// - /// Serializes a runtime value of this type to the result value format. + /// Coerces an external input value (deserialized JSON) into a runtime value. /// - /// - /// A runtime value representation of this type. + /// + /// The deserialized JSON input value to coerce. /// /// - /// Returns a result value representation of this type. + /// Returns the runtime value representation. /// - /// - /// Unable to serialize the given . + /// + /// Unable to coerce the given into a runtime value. /// - object? Serialize(object? runtimeValue); - - /// - /// Deserializes a result value of this type to the runtime value format. - /// - /// - /// A result value representation of this type. - /// - /// - /// Returns a runtime value representation of this type. - /// - object? Deserialize(object? resultValue); + object? CoerceInputValue(JsonElement inputValue); /// - /// Deserializes a result value of this type to the runtime value format. + /// Coerces a runtime value into an external output representation + /// and writes it to the result. /// - /// - /// A result value representation of this type. - /// /// - /// The runtime value representation of this type. + /// The runtime value to coerce. /// - /// - /// true if the deserialization was successful; otherwise, false. - /// - bool TryDeserialize(object? resultValue, out object? runtimeValue); -} - -/// -/// Represents a GraphQL leaf-type e.g., scalar or enum. -/// -public interface ILeafType2 : IInputTypeDefinition, IOutputTypeDefinition -{ - /// - /// Defines if the given is possibly of this type. - /// - /// - /// The runtime value which shall be validated. - /// - /// - /// true if the given is possibly of this type. - /// - bool IsInstanceOfType(object? runtimeValue); - - /// - /// Parses the GraphQL value syntax of this type into a runtime value representation. - /// - /// - /// A GraphQL value syntax representation of this type. - /// - /// - /// Returns a runtime value representation of this type. - /// - object? ParseLiteral(IValueNode valueSyntax); - - /// - /// Parses a runtime value of this type into a GraphQL value syntax representation. - /// - /// - /// A result value representation of this type. + /// + /// The result element to write the output value to. /// - /// - /// Returns a GraphQL value syntax representation of the . - /// - /// - /// Unable to parse the given - /// into a GraphQL value syntax representation of this type. + /// + /// Unable to coerce the given into an output value. /// - IValueNode ParseValue(object? runtimeValue); + void CoerceOutputValue(object? runtimeValue, ResultElement resultValue); /// - /// Serializes a runtime value of this type to the result value format. + /// Converts a runtime value into a GraphQL literal (AST value node). + /// Used for default value representation in SDL and introspection. /// /// - /// A runtime value representation of this type. - /// - /// - /// + /// The runtime value to convert. /// /// - /// Returns a result value representation of this type. + /// Returns a GraphQL literal representation of the runtime value. /// - /// - /// Unable to serialize the given . + /// + /// Unable to convert the given into a literal. /// - void Serialize(object? runtimeValue, ResultElement resultValue); + IValueNode ValueToLiteral(object? runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Contracts/SerializationException.cs b/src/HotChocolate/Core/src/Types/Types/Contracts/LeafCoercionException.cs similarity index 78% rename from src/HotChocolate/Core/src/Types/Types/Contracts/SerializationException.cs rename to src/HotChocolate/Core/src/Types/Types/Contracts/LeafCoercionException.cs index b1ee88cddc1..b27ba2a4b60 100644 --- a/src/HotChocolate/Core/src/Types/Types/Contracts/SerializationException.cs +++ b/src/HotChocolate/Core/src/Types/Types/Contracts/LeafCoercionException.cs @@ -4,10 +4,10 @@ namespace HotChocolate.Types; /// The serialization exception is thrown whenever a type cannot /// serialize, deserialize or parse a value. /// -public class SerializationException : GraphQLException +public class LeafCoercionException : GraphQLException { /// - /// Initializes the . + /// Initializes the . /// /// /// The error message. @@ -18,7 +18,7 @@ public class SerializationException : GraphQLException /// /// The field path that points to the exact field causing the exception. /// - public SerializationException(string message, ITypeSystemMember type, Path? path = null) + public LeafCoercionException(string message, ITypeSystemMember type, Path? path = null) : base(message) { Type = type; @@ -26,7 +26,7 @@ public SerializationException(string message, ITypeSystemMember type, Path? path } /// - /// Initializes the . + /// Initializes the . /// /// /// The serialization error object. @@ -37,7 +37,7 @@ public SerializationException(string message, ITypeSystemMember type, Path? path /// /// The field path that points to the exact field causing the exception. /// - public SerializationException(IError error, ITypeSystemMember type, Path? path = null) + public LeafCoercionException(IError error, ITypeSystemMember type, Path? path = null) : base(error) { Type = type; diff --git a/src/HotChocolate/Core/src/Types/Types/DirectiveCollection.cs b/src/HotChocolate/Core/src/Types/Types/DirectiveCollection.cs index a66e332e232..deb8ae74ac2 100644 --- a/src/HotChocolate/Core/src/Types/Types/DirectiveCollection.cs +++ b/src/HotChocolate/Core/src/Types/Types/DirectiveCollection.cs @@ -247,7 +247,7 @@ internal static DirectiveCollection CreateAndComplete( runtimeValue = value; } } - catch (SerializationException ex) + catch (LeafCoercionException ex) { hasErrors = true; diff --git a/src/HotChocolate/Core/src/Types/Types/EnumType.cs b/src/HotChocolate/Core/src/Types/Types/EnumType.cs index 27381c065f4..4d60433e75b 100644 --- a/src/HotChocolate/Core/src/Types/Types/EnumType.cs +++ b/src/HotChocolate/Core/src/Types/Types/EnumType.cs @@ -69,7 +69,7 @@ public bool TryGetRuntimeValue(string name, [NotNullWhen(true)] out object? runt } /// - public bool IsInstanceOfType(IValueNode valueSyntax) + public bool IsValueCompatible(IValueNode valueSyntax) { ArgumentNullException.ThrowIfNull(valueSyntax); @@ -96,7 +96,7 @@ public bool IsInstanceOfType(object? runtimeValue) => runtimeValue is null || RuntimeType.IsInstanceOfType(runtimeValue); /// - public object? ParseLiteral(IValueNode valueSyntax) + public object? CoerceInputLiteral(IValueNode valueSyntax) { ArgumentNullException.ThrowIfNull(valueSyntax); @@ -117,13 +117,13 @@ public bool IsInstanceOfType(object? runtimeValue) return null; } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, valueSyntax.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); } /// - public IValueNode ParseValue(object? runtimeValue) + public IValueNode CoerceInputValue(object? runtimeValue) { if (runtimeValue is null) { @@ -135,8 +135,8 @@ public IValueNode ParseValue(object? runtimeValue) return new EnumValueNode(enumValue.Name); } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseValue(Name, runtimeValue.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, runtimeValue.GetType()), this); } @@ -159,7 +159,7 @@ public IValueNode ParseResult(object? resultValue) return new EnumValueNode(enumValue.Name); } - throw new SerializationException( + throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this); } @@ -188,7 +188,7 @@ public IValueNode ParseResult(object? resultValue) } } - throw new SerializationException( + throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_Serialize(Name), this); } @@ -201,7 +201,7 @@ public IValueNode ParseResult(object? resultValue) return runtimeValue; } - throw new SerializationException( + throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_Deserialize(Name), this); } diff --git a/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs index 4751b4964cf..d1ce603e430 100644 --- a/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs @@ -119,7 +119,7 @@ public static bool IsInstanceOfType(this IInputType type, IValueNode literal) return literal.Kind == SyntaxKind.ObjectValue; default: - return ((ILeafType)type).IsInstanceOfType(literal); + return ((ILeafType)type).IsValueCompatible(literal); } } } diff --git a/src/HotChocolate/Core/src/Types/Types/InputFormatter.cs b/src/HotChocolate/Core/src/Types/Types/InputFormatter.cs index bda31fcf0a1..70a80a97f7b 100644 --- a/src/HotChocolate/Core/src/Types/Types/InputFormatter.cs +++ b/src/HotChocolate/Core/src/Types/Types/InputFormatter.cs @@ -129,11 +129,11 @@ private IValueNode FormatValueLeaf(object runtimeValue, ILeafType type, Path pat runtimeValue = converted; } - return type.ParseValue(runtimeValue); + return type.CoerceInputValue(runtimeValue); } - catch (SerializationException ex) + catch (LeafCoercionException ex) { - throw new SerializationException(ex.Errors[0], ex.Type, path); + throw new LeafCoercionException(ex.Errors[0], ex.Type, path); } } @@ -295,7 +295,7 @@ private static IValueNode FormatResultLeaf(object resultValue, ILeafType type, P { if (resultValue is IValueNode node) { - if (type.IsInstanceOfType(node)) + if (type.IsValueCompatible(node)) { return node; } @@ -307,9 +307,9 @@ private static IValueNode FormatResultLeaf(object resultValue, ILeafType type, P { return type.ParseResult(resultValue); } - catch (SerializationException ex) + catch (LeafCoercionException ex) { - throw new SerializationException(ex.Errors[0], ex.Type, path); + throw new LeafCoercionException(ex.Errors[0], ex.Type, path); } } } diff --git a/src/HotChocolate/Core/src/Types/Types/InputParser.cs b/src/HotChocolate/Core/src/Types/Types/InputParser.cs index 3067f926142..3fd57afca3a 100644 --- a/src/HotChocolate/Core/src/Types/Types/InputParser.cs +++ b/src/HotChocolate/Core/src/Types/Types/InputParser.cs @@ -293,13 +293,13 @@ private object ParseObject( { try { - return type.ParseLiteral(resultValue); + return type.CoerceInputLiteral(resultValue); } - catch (SerializationException ex) + catch (LeafCoercionException ex) { if (field is null) { - throw new SerializationException(ex.Errors[0].WithPath(path), ex.Type, path); + throw new LeafCoercionException(ex.Errors[0].WithPath(path), ex.Type, path); } var error = ErrorBuilder.FromError(ex.Errors[0]) @@ -308,7 +308,7 @@ private object ParseObject( .SetExtension("fieldType", type.Name) .Build(); - throw new SerializationException(error, ex.Type, path); + throw new LeafCoercionException(error, ex.Type, path); } } @@ -587,11 +587,11 @@ private object DeserializeObject(object resultValue, InputObjectType type, Path { return type.Deserialize(resultValue); } - catch (SerializationException ex) + catch (LeafCoercionException ex) { if (field is null) { - throw new SerializationException(ex.Errors[0].WithPath(path), ex.Type, path); + throw new LeafCoercionException(ex.Errors[0].WithPath(path), ex.Type, path); } var error = ErrorBuilder.FromError(ex.Errors[0]) @@ -600,7 +600,7 @@ private object DeserializeObject(object resultValue, InputObjectType type, Path .SetExtension("fieldType", type.Name) .Build(); - throw new SerializationException(error, ex.Type, path); + throw new LeafCoercionException(error, ex.Type, path); } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs index 4459f8640ce..a6b3a7c586f 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs @@ -3,6 +3,7 @@ using HotChocolate.Configuration; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; using HotChocolate.Types.Descriptors.Configurations; using HotChocolate.Utilities; @@ -44,7 +45,7 @@ protected override void OnCompleteType( _objectToDictConverter = new ObjectToDictionaryConverter(Converter); } - public override bool IsInstanceOfType(IValueNode literal) + public override bool IsValueCompatible(IValueNode literal) { ArgumentNullException.ThrowIfNull(literal); @@ -64,7 +65,7 @@ public override bool IsInstanceOfType(IValueNode literal) } } - public override object? ParseLiteral(IValueNode literal) + public override object? CoerceInputLiteral(IValueNode literal) { switch (literal) { @@ -90,20 +91,20 @@ public override bool IsInstanceOfType(IValueNode literal) return null; default: - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, literal.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, literal.GetType()), this); } } - public override IValueNode ParseValue(object? value) + public override IValueNode CoerceInputValue(object? value) { return value is null ? NullValueNode.Default : ParseValue(value, new HashSet(ReferenceEqualityComparer.Instance)); } - private IValueNode ParseValue(object? value, ISet set) + private IValueNode ParseValue(object? value, HashSet set) { if (value is null) { @@ -180,105 +181,85 @@ private IValueNode ParseValue(object? value, ISet set) return valueNode; } - throw new SerializationException( + throw new LeafCoercionException( TypeResources.AnyType_CycleInObjectGraph, this); } - public override IValueNode ParseResult(object? resultValue) => - ParseValue(resultValue); - - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, ResultElement resultValue) { if (runtimeValue is null) { - resultValue = null; + resultValue.SetNullValue(); return true; } switch (runtimeValue) { - case string: - case short: - case int: - case long: - case float: - case double: - case decimal: - case bool: - case sbyte: - case byte: - resultValue = runtimeValue; + case string castedString: + resultValue.SetStringValue(castedString); return true; - default: - var type = runtimeValue.GetType(); + case short castedShort: + resultValue.SetNumberValue(castedShort); + return true; - if (type.IsValueType - && Converter.TryConvert(type, typeof(string), runtimeValue, out var c, out _) - && c is string casted) - { - resultValue = casted; - return true; - } + case int castedInt: + resultValue.SetNumberValue(castedInt); + return true; - resultValue = _objectToDictConverter.Convert(runtimeValue); + case long castedLong: + resultValue.SetNumberValue(castedLong); return true; - } - } - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - object? elementValue; - runtimeValue = null; - switch (resultValue) - { - case IDictionary dictionary: - { - var result = new Dictionary(); - foreach (var element in dictionary) - { - if (TryDeserialize(element.Value, out elementValue)) - { - result[element.Key] = elementValue; - } - else - { - return false; - } - } + case float castedFloat: + resultValue.SetNumberValue(castedFloat); + return true; - runtimeValue = result; + case double castedDouble: + resultValue.SetNumberValue(castedDouble); return true; - } - case IList list: - { - var result = new object?[list.Count]; - for (var i = 0; i < list.Count; i++) - { - if (TryDeserialize(list[i], out elementValue)) - { - result[i] = elementValue; - } - else - { - return false; - } - } + case decimal castedDecimal: + resultValue.SetNumberValue(castedDecimal); + return true; - runtimeValue = result; + case bool castedBool: + resultValue.SetBooleanValue(castedBool); + return true; + + case sbyte castedSByte: + resultValue.SetNumberValue(castedSByte); + return true; + + case byte castedByte: + resultValue.SetNumberValue(castedByte); + return true; + + case ushort castedUShort: + resultValue.SetNumberValue(castedUShort); + return true; + + case uint castedUInt: + resultValue.SetNumberValue(castedUInt); return true; - } - // TODO: this is only done for a bug in schema stitching and needs to be removed - // once we have release stitching 2. - case IValueNode literal: - runtimeValue = ParseLiteral(literal); + case ulong castedULong: + resultValue.SetNumberValue(castedULong); return true; default: - runtimeValue = resultValue; + var type = runtimeValue.GetType(); + + if (type.IsValueType + && Converter.TryConvert(type, typeof(string), runtimeValue, out var c, out _) + && c is string casted) + { + resultValue = casted; + return true; + } + + resultValue = _objectToDictConverter.Convert(runtimeValue); return true; } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs index a990945b698..bce932a27df 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs @@ -1,12 +1,17 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; namespace HotChocolate.Types; /// +/// /// The Boolean scalar type represents true or false. -/// -/// http://facebook.github.io/graphql/June2018/#sec-Boolean +/// +/// +/// https://spec.graphql.org/September2025/#sec-Boolean +/// /// [SpecScalar] public class BooleanType : ScalarType @@ -35,30 +40,32 @@ public BooleanType() { } - protected override bool ParseLiteral(BooleanValueNode valueSyntax) - { - return valueSyntax.Value; - } - - protected override BooleanValueNode ParseValue(bool runtimeValue) - { - return runtimeValue ? BooleanValueNode.True : BooleanValueNode.False; - } + public override object? CoerceInputLiteral(BooleanValueNode valueLiteral) + => valueLiteral.Value; - public override IValueNode ParseResult(object? resultValue) + public override object? CoerceInputValue(JsonElement inputValue) { - if (resultValue is null) + switch (inputValue.ValueKind) { - return NullValueNode.Default; - } + case JsonValueKind.Null: + return null; - if (resultValue is bool b) - { - return b ? BooleanValueNode.True : BooleanValueNode.False; - } + case JsonValueKind.True: + return true; + + case JsonValueKind.False: + return false; - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), - this); + default: + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_ParseValue(Name, inputValue.ValueKind.ToString()), + this); + } } + + public override void CoerceOutputValue(bool runtimeValue, ResultElement resultValue) + => resultValue.SetBooleanValue(runtimeValue); + + public override IValueNode ValueToLiteral(bool runtimeValue) + => runtimeValue ? BooleanValueNode.True : BooleanValueNode.False; } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs index 6bb21583664..7c2da01cb89 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs @@ -59,12 +59,12 @@ public override IValueNode ParseResult(object? resultValue) return ParseValue(b); } - throw new SerializationException( + throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this); } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs index 0b130984417..5bb6157af90 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs @@ -79,8 +79,8 @@ protected override DateTimeOffset ParseLiteral(StringValueNode valueSyntax) return value.Value; } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, valueSyntax.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); } @@ -111,12 +111,12 @@ public override IValueNode ParseResult(object? resultValue) return ParseValue(new DateTimeOffset(dt.ToUniversalTime(), TimeSpan.Zero)); } - throw new SerializationException( + throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this); } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs index fb933349249..8554dcef57a 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs @@ -53,8 +53,8 @@ protected override DateOnly ParseLiteral(StringValueNode valueSyntax) return value.Value; } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, valueSyntax.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); } @@ -70,12 +70,12 @@ public override IValueNode ParseResult(object? resultValue) DateOnly d => ParseValue(d), DateTimeOffset o => ParseValue(DateOnly.FromDateTime(o.UtcDateTime)), DateTime dt => ParseValue(DateOnly.FromDateTime(dt.ToUniversalTime())), - _ => throw new SerializationException( + _ => throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this) }; } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { switch (runtimeValue) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs index e684c5377ed..462902c6608 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs @@ -22,7 +22,7 @@ protected FloatTypeBase( public TRuntimeType MaxValue { get; } - public override bool IsInstanceOfType(IValueNode valueSyntax) + public override bool IsValueCompatible(IValueNode valueSyntax) { ArgumentNullException.ThrowIfNull(valueSyntax); @@ -78,7 +78,7 @@ protected virtual bool IsInstanceOfType(TRuntimeType value) return true; } - public override object? ParseLiteral(IValueNode valueSyntax) + public override object? CoerceInputLiteral(IValueNode valueSyntax) { ArgumentNullException.ThrowIfNull(valueSyntax); @@ -106,7 +106,7 @@ protected virtual bool IsInstanceOfType(TRuntimeType value) protected abstract TRuntimeType ParseLiteral(IFloatValueLiteral valueSyntax); - public override IValueNode ParseValue(object? runtimeValue) + public override IValueNode CoerceInputValue(object? runtimeValue) { if (runtimeValue is null) { @@ -144,7 +144,7 @@ public sealed override IValueNode ParseResult(object? resultValue) throw CreateParseResultError(resultValue); } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { @@ -189,7 +189,7 @@ public override bool TryDeserialize(object? resultValue, out object? runtimeValu } /// - /// Creates the exception that will be thrown when + /// Creates the exception that will be thrown when /// encountered an invalid runtime value. /// /// @@ -198,11 +198,11 @@ public override bool TryDeserialize(object? resultValue, out object? runtimeValu /// /// The created exception that should be thrown /// - protected virtual SerializationException CreateParseValueError(object runtimeValue) + protected virtual LeafCoercionException CreateParseValueError(object runtimeValue) => new(TypeResourceHelper.Scalar_Cannot_ParseResult(Name, runtimeValue.GetType()), this); /// - /// Creates the exception that will be thrown when encountered an + /// Creates the exception that will be thrown when encountered an /// invalid /// /// @@ -211,8 +211,8 @@ protected virtual SerializationException CreateParseValueError(object runtimeVal /// /// The created exception that should be thrown /// - protected virtual SerializationException CreateParseLiteralError(IValueNode valueSyntax) - => new(TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, valueSyntax.GetType()), this); + protected virtual LeafCoercionException CreateParseLiteralError(IValueNode valueSyntax) + => new(TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); /// /// Creates the exception that will be thrown when encountered an @@ -224,6 +224,6 @@ protected virtual SerializationException CreateParseLiteralError(IValueNode valu /// /// The created exception that should be thrown /// - protected virtual SerializationException CreateParseResultError(object runtimeValue) + protected virtual LeafCoercionException CreateParseResultError(object runtimeValue) => new(TypeResourceHelper.Scalar_Cannot_ParseResult(Name, runtimeValue.GetType()), this); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs index 995d141d6b1..fa29b4c83e9 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs @@ -35,7 +35,7 @@ public IdType() : this(ScalarNames.ID, TypeResources.IdType_Description) { } - public override bool IsInstanceOfType(IValueNode literal) + public override bool IsValueCompatible(IValueNode literal) { ArgumentNullException.ThrowIfNull(literal); @@ -44,7 +44,7 @@ public override bool IsInstanceOfType(IValueNode literal) || literal is NullValueNode; } - public override object? ParseLiteral(IValueNode literal) + public override object? CoerceInputLiteral(IValueNode literal) { ArgumentNullException.ThrowIfNull(literal); @@ -63,12 +63,12 @@ public override bool IsInstanceOfType(IValueNode literal) return null; } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, literal.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, literal.GetType()), this); } - public override IValueNode ParseValue(object? runtimeValue) + public override IValueNode CoerceInputValue(object? runtimeValue) { if (runtimeValue is null) { @@ -80,8 +80,8 @@ public override IValueNode ParseValue(object? runtimeValue) return new StringValueNode(s); } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseValue(Name, runtimeValue.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, runtimeValue.GetType()), this); } @@ -102,12 +102,12 @@ public override IValueNode ParseResult(object? resultValue) return new IntValueNode(i); } - throw new SerializationException( + throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this); } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs index 6e2d0db3a5a..18ea19331a7 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs @@ -44,7 +44,7 @@ protected override bool IsInstanceOfType(TRuntimeType runtimeValue) return true; } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { @@ -118,7 +118,7 @@ public sealed override IValueNode ParseResult(object? resultValue) /// /// The created exception that should be thrown /// - protected virtual SerializationException CreateParseResultError(object runtimeValue) + protected virtual LeafCoercionException CreateParseResultError(object runtimeValue) { return new( TypeResourceHelper.Scalar_Cannot_ParseResult(Name, runtimeValue.GetType()), diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs index 22379970a38..b3e2c90c026 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs @@ -43,7 +43,7 @@ public JsonType() /// true if the specified can be handled /// by the JSON scalar; otherwise false. /// - public override bool IsInstanceOfType(IValueNode valueSyntax) + public override bool IsValueCompatible(IValueNode valueSyntax) => true; /// @@ -55,7 +55,7 @@ public override bool IsInstanceOfType(IValueNode valueSyntax) /// /// Returns null or a . /// - public override object ParseLiteral(IValueNode valueSyntax) + public override object CoerceInputLiteral(IValueNode valueSyntax) => JsonFormatter.Format(valueSyntax); /// @@ -67,7 +67,7 @@ public override object ParseLiteral(IValueNode valueSyntax) /// /// Returns GraphQL value syntax. /// - public override IValueNode ParseValue(object? runtimeValue) + public override IValueNode CoerceInputValue(object? runtimeValue) { if (runtimeValue is null) { @@ -84,10 +84,10 @@ public override IValueNode ParseValue(object? runtimeValue) /// public override IValueNode ParseResult(object? resultValue) - => ParseValue(resultValue); + => CoerceInputValue(resultValue); - private SerializationException CreateParseValueError(object runtimeValue) - => new(TypeResourceHelper.Scalar_Cannot_ParseValue(Name, runtimeValue.GetType()), this); + private LeafCoercionException CreateParseValueError(object runtimeValue) + => new(TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, runtimeValue.GetType()), this); private static class JsonParser { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs index eb46c35179e..0a6a0a1504a 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs @@ -46,7 +46,7 @@ public override IValueNode ParseResult(object? resultValue) string s => new StringValueNode(s), DateTimeOffset o => ParseValue(o.DateTime), DateTime dt => ParseValue(dt), - _ => throw new SerializationException( + _ => throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this) }; } @@ -58,8 +58,8 @@ protected override DateTime ParseLiteral(StringValueNode valueSyntax) return value.Value; } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, valueSyntax.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); } @@ -68,7 +68,7 @@ protected override StringValueNode ParseValue(DateTime runtimeValue) return new(Serialize(runtimeValue)); } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { switch (runtimeValue) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs index 6a5d28bfabb..dbab98ad9e0 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs @@ -70,7 +70,7 @@ public override IValueNode ParseResult(object? resultValue) DateOnly d => ParseValue(d), DateTimeOffset o => ParseValue(DateOnly.FromDateTime(o.DateTime)), DateTime dt => ParseValue(DateOnly.FromDateTime(dt)), - _ => throw new SerializationException( + _ => throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this) }; } @@ -82,8 +82,8 @@ protected override DateOnly ParseLiteral(StringValueNode valueSyntax) return value.Value; } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, valueSyntax.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); } @@ -92,7 +92,7 @@ protected override StringValueNode ParseValue(DateOnly runtimeValue) return new(Serialize(runtimeValue)); } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { switch (runtimeValue) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs index d7f7c0b97d4..0e68d5a6fe4 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs @@ -62,7 +62,7 @@ public override IValueNode ParseResult(object? resultValue) TimeOnly t => ParseValue(t), DateTimeOffset d => ParseValue(TimeOnly.FromDateTime(d.DateTime)), DateTime dt => ParseValue(TimeOnly.FromDateTime(dt)), - _ => throw new SerializationException( + _ => throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this) }; } @@ -74,8 +74,8 @@ protected override TimeOnly ParseLiteral(StringValueNode valueSyntax) return value.Value; } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, valueSyntax.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); } @@ -84,7 +84,7 @@ protected override StringValueNode ParseValue(TimeOnly runtimeValue) return new(Serialize(runtimeValue)); } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { switch (runtimeValue) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs index 90c86c2e09b..0b57471b532 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs @@ -1,5 +1,7 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; using HotChocolate.Types.Descriptors.Configurations; using HotChocolate.Utilities; using static HotChocolate.Serialization.SchemaDebugFormatter; @@ -18,7 +20,6 @@ public abstract partial class ScalarType , IHasRuntimeType { private Uri? _specifiedBy; - private ScalarSerializationType _serializationType; private string? _pattern; /// @@ -60,19 +61,7 @@ protected set } /// - public ScalarSerializationType SerializationType - { - get => _serializationType; - protected set - { - if (IsExecutable) - { - throw new InvalidOperationException( - TypeResources.TypeSystem_Immutable); - } - _serializationType = value; - } - } + public abstract ScalarSerializationType SerializationType { get; } /// public string? Pattern @@ -115,191 +104,127 @@ IReadOnlyDirectiveCollection IDirectivesProvider.Directives public bool IsAssignableFrom(ITypeDefinition type) => ReferenceEquals(type, this); - public bool Equals(IType? other) => ReferenceEquals(other, this); - /// - /// Defines if the specified - /// can be parsed by this scalar. + /// Defines if the specified is equal to the current . /// - /// - /// The literal that shall be checked. + /// + /// The other scalar type. /// /// - /// true if the literal can be parsed by this scalar; + /// true if the specified is equal to the current ; /// otherwise, false. /// - /// - /// is null. - /// - public abstract bool IsInstanceOfType(IValueNode valueSyntax); + public bool Equals(IType? other) => ReferenceEquals(other, this); - /// - /// Defines if the specified - /// is an instance of this type. - /// - /// - /// A value representation of this type. - /// - /// - /// true if the value is a value of this type; - /// otherwise, false. - /// - public virtual bool IsInstanceOfType(object? runtimeValue) + /// + public virtual bool IsValueCompatible(IValueNode valueLiteral) { - if (runtimeValue is null) + ArgumentNullException.ThrowIfNull(valueLiteral); + + if ((SerializationType & ScalarSerializationType.String) == ScalarSerializationType.String + && valueLiteral.Kind == SyntaxKind.StringValue) { return true; } - return RuntimeType.IsInstanceOfType(runtimeValue); - } + if ((SerializationType & ScalarSerializationType.Int) == ScalarSerializationType.Int + && valueLiteral.Kind == SyntaxKind.IntValue) + { + return true; + } - /// - /// Parses the specified - /// to the .NET representation of this type. - /// - /// - /// The literal that shall be parsed. - /// - /// - /// - /// is null. - /// - /// - /// The specified cannot be parsed - /// by this scalar. - /// - public abstract object? ParseLiteral(IValueNode valueSyntax); + if ((SerializationType & ScalarSerializationType.Float) == ScalarSerializationType.Float + && valueLiteral.Kind == SyntaxKind.FloatValue) + { + return true; + } - /// - /// Parses the .NET value representation to a value literal. - /// - /// - /// The .NET value representation. - /// - /// - /// Returns a GraphQL literal representing the .NET value. - /// - /// - /// The specified cannot be parsed - /// by this scalar. - /// - public abstract IValueNode ParseValue(object? runtimeValue); + if ((SerializationType & ScalarSerializationType.Boolean) == ScalarSerializationType.Boolean + && valueLiteral.Kind == SyntaxKind.BooleanValue) + { + return true; + } - /// - /// Parses a result value of this scalar into a GraphQL value syntax representation. - /// - /// - /// A result value representation of this type. - /// - /// - /// Returns a GraphQL value syntax representation of the . - /// - /// - /// Unable to parse the given - /// into a GraphQL value syntax representation of this type. - /// - public abstract IValueNode ParseResult(object? resultValue); + if ((SerializationType & ScalarSerializationType.List) == ScalarSerializationType.List + && valueLiteral.Kind == SyntaxKind.ListValue) + { + return true; + } - /// - /// Serializes the .NET value representation. - /// - /// - /// The .NET value representation. - /// - /// - /// Returns the serialized value. - /// - /// - /// The specified cannot be serialized - /// by this scalar. - /// - public virtual object? Serialize(object? runtimeValue) - { - if (TrySerialize(runtimeValue, out var s)) + if ((SerializationType & ScalarSerializationType.Object) == ScalarSerializationType.Object + && valueLiteral.Kind == SyntaxKind.ObjectValue) { - return s; + return true; } - throw new SerializationException( - ErrorBuilder.New() - .SetMessage(TypeResourceHelper.Scalar_Cannot_Serialize(Name)) - .SetExtension("actualValue", runtimeValue?.ToString() ?? "null") - .SetExtension("actualType", runtimeValue?.GetType().FullName ?? "null") - .Build(), - this); + return false; } - /// - /// Tries to serializes the .NET value representation to the output format. - /// - /// - /// The .NET value representation. - /// - /// - /// The serialized value. - /// - /// - /// true if the value was correctly serialized; otherwise, false. - /// - public abstract bool TrySerialize(object? runtimeValue, out object? resultValue); - - /// - /// Deserializes the serialized value to it`s .NET value representation. - /// - /// - /// The serialized value representation. - /// - /// - /// Returns the .NET value representation. - /// - /// - /// The specified cannot be deserialized - /// by this scalar. - /// - public virtual object? Deserialize(object? resultValue) + /// + public virtual bool IsValueCompatible(JsonElement inputValue) { - if (TryDeserialize(resultValue, out var v)) + if ((SerializationType & ScalarSerializationType.String) == ScalarSerializationType.String + && inputValue.ValueKind == JsonValueKind.String) { - return v; + return true; } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_Deserialize(Name), - this); - } + if ((SerializationType & ScalarSerializationType.Int) == ScalarSerializationType.Int + && inputValue.ValueKind == JsonValueKind.Number) + { + return true; + } - /// - /// Tries to deserializes the value from the output format to the .NET value representation. - /// - /// - /// The serialized value. - /// - /// - /// The .NET value representation. - /// - /// - /// true if the serialized value was correctly deserialized; otherwise, false. - /// - public abstract bool TryDeserialize(object? resultValue, out object? runtimeValue); + if ((SerializationType & ScalarSerializationType.Float) == ScalarSerializationType.Float + && inputValue.ValueKind == JsonValueKind.Number) + { + return true; + } - protected bool TryConvertSerialized( - object serialized, - ValueKind expectedKind, - out T value) - { - if (Scalars.TryGetKind(serialized, out var kind) - && kind == expectedKind - && _converter.TryConvert(serialized, out T c)) + if ((SerializationType & ScalarSerializationType.Boolean) == ScalarSerializationType.Boolean + && inputValue.ValueKind == JsonValueKind.True) + { + return true; + } + + if ((SerializationType & ScalarSerializationType.List) == ScalarSerializationType.List + && inputValue.ValueKind == JsonValueKind.Array) + { + return true; + } + + if ((SerializationType & ScalarSerializationType.Object) == ScalarSerializationType.Object + && inputValue.ValueKind == JsonValueKind.Object) { - value = c; return true; } - value = default!; return false; } + /// + public virtual bool IsInstanceOfType(object? runtimeValue) + { + if (runtimeValue is null) + { + return true; + } + + return RuntimeType.IsInstanceOfType(runtimeValue); + } + + /// + public abstract object? CoerceInputLiteral(IValueNode valueLiteral); + + /// + public abstract object? CoerceInputValue(JsonElement inputValue); + + /// + public abstract void CoerceOutputValue(object? runtimeValue, ResultElement resultValue); + + /// + public abstract IValueNode ValueToLiteral(object? runtimeValue); + /// /// Returns a string that represents the current . /// diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs index e335d80e903..04e57ab20ad 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs @@ -1,3 +1,7 @@ +using HotChocolate.Language; +using HotChocolate.Properties; +using HotChocolate.Text.Json; + namespace HotChocolate.Types; /// @@ -5,6 +9,9 @@ namespace HotChocolate.Types; /// GraphQL responses take the form of a hierarchical tree; /// the leaves on these trees are GraphQL scalars. /// +/// +/// The .NET runtime type that this scalar represents. +/// public abstract class ScalarType : ScalarType { /// @@ -17,40 +24,85 @@ protected ScalarType(string name, BindingBehavior bind = BindingBehavior.Explici public sealed override Type RuntimeType => typeof(TRuntimeType); /// - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool IsInstanceOfType(object? runtimeValue) { if (runtimeValue is null) { - resultValue = null; return true; } - if (runtimeValue is TRuntimeType) + return RuntimeType.IsInstanceOfType(runtimeValue); + } + + /// + public override void CoerceOutputValue(object? runtimeValue, ResultElement resultValue) + { + if (runtimeValue is null) { - resultValue = runtimeValue; - return true; + resultValue.SetNullValue(); + return; } - resultValue = null; - return false; + if (runtimeValue is TRuntimeType t) + { + CoerceOutputValue(t, resultValue); + return; + } + + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceOutputValue( + runtimeValue.GetType(), + runtimeValue.ToString() ?? "null"), + this); } + /// + /// Coerces a runtime value into an external output representation + /// and writes it to the result. + /// + /// + /// The runtime value to coerce. + /// + /// + /// The result element to write the output value to. + /// + /// + /// Unable to coerce the given into an output value. + /// + public abstract void CoerceOutputValue(TRuntimeType? runtimeValue, ResultElement resultValue); + /// - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + public override IValueNode ValueToLiteral(object? runtimeValue) { - if (resultValue is null) + if (runtimeValue is null) { - runtimeValue = null; - return true; + return NullValueNode.Default; } - if (resultValue is TRuntimeType) + if (runtimeValue is TRuntimeType runtimeType) { - runtimeValue = resultValue; - return true; + return ValueToLiteral(runtimeType); } - runtimeValue = null; - return false; + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_ConvertValueToLiteral( + runtimeValue.GetType(), + runtimeValue.ToString() ?? "null"), + this); } + + /// + /// Converts a runtime value into a GraphQL literal (AST value node). + /// Used for default value representation in SDL and introspection. + /// + /// + /// The runtime value to convert. + /// + /// + /// Returns a GraphQL literal representation of the runtime value. + /// + /// + /// Unable to convert the given into a literal. + /// + public abstract IValueNode ValueToLiteral(TRuntimeType? runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs index fc9c56503b1..e1d6b76b42b 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; @@ -8,9 +9,7 @@ namespace HotChocolate.Types; /// GraphQL responses take the form of a hierarchical tree; /// the leaves on these trees are GraphQL scalars. /// -public abstract class ScalarType - : ScalarType - where TLiteral : IValueNode +public abstract class ScalarType : ScalarType where TLiteral : IValueNode { /// protected ScalarType(string name, BindingBehavior bind = BindingBehavior.Explicit) @@ -19,125 +18,132 @@ protected ScalarType(string name, BindingBehavior bind = BindingBehavior.Explici } /// - public sealed override bool IsInstanceOfType(IValueNode valueSyntax) + public override ScalarSerializationType SerializationType { - ArgumentNullException.ThrowIfNull(valueSyntax); - - return valueSyntax is TLiteral casted && IsInstanceOfType(casted) - || valueSyntax is NullValueNode; + get + { + if (typeof(TLiteral) == typeof(StringValueNode)) + { + return ScalarSerializationType.String; + } + + if (typeof(TLiteral) == typeof(IntValueNode)) + { + return ScalarSerializationType.Int; + } + + if (typeof(TLiteral) == typeof(FloatValueNode)) + { + return ScalarSerializationType.Float; + } + + if (typeof(TLiteral) == typeof(BooleanValueNode)) + { + return ScalarSerializationType.Boolean; + } + + if (typeof(TLiteral) == typeof(ObjectValueNode)) + { + return ScalarSerializationType.Object; + } + + if (typeof(TLiteral) == typeof(ListValueNode)) + { + return ScalarSerializationType.List; + } + + throw new NotSupportedException(); + } } - /// - /// Defines if the specified - /// can be parsed by this scalar. - /// - /// - /// The literal that shall be checked. - /// - /// - /// true if the literal can be parsed by this scalar; - /// otherwise, false. - /// - /// - /// is null. - /// - protected virtual bool IsInstanceOfType(TLiteral valueSyntax) + /// + public sealed override bool IsValueCompatible(IValueNode valueSyntax) { - return true; + ArgumentNullException.ThrowIfNull(valueSyntax); + + if (valueSyntax.Kind == SyntaxKind.NullValue) + { + return true; + } + + return valueSyntax is TLiteral; } /// - public sealed override bool IsInstanceOfType(object? runtimeValue) + public override bool IsValueCompatible(JsonElement inputValue) { - if (runtimeValue is null) + if (inputValue.ValueKind == JsonValueKind.Undefined) + { + return false; + } + + if (inputValue.ValueKind == JsonValueKind.Null) { return true; } - if (runtimeValue is TRuntimeType t) + if (SerializationType == ScalarSerializationType.String + && inputValue.ValueKind == JsonValueKind.String) { - return IsInstanceOfType(t); + return true; } - return false; - } + if (SerializationType == ScalarSerializationType.Int + && inputValue.ValueKind == JsonValueKind.Number) + { + return true; + } - /// - /// Defines if the specified - /// is an instance of this type. - /// - /// - /// A value representation of this type. - /// - /// - /// true if the value is a value of this type; - /// otherwise, false. - /// - protected virtual bool IsInstanceOfType(TRuntimeType runtimeValue) - { - return true; - } + if (SerializationType == ScalarSerializationType.Float + && inputValue.ValueKind == JsonValueKind.Number) + { + return true; + } - /// - public sealed override object? ParseLiteral(IValueNode valueSyntax) - { - ArgumentNullException.ThrowIfNull(valueSyntax); + if (SerializationType == ScalarSerializationType.Boolean + && (inputValue.ValueKind == JsonValueKind.True + || inputValue.ValueKind == JsonValueKind.False)) + { + return true; + } - if (valueSyntax is TLiteral casted && IsInstanceOfType(casted)) + if (SerializationType == ScalarSerializationType.Object + && inputValue.ValueKind == JsonValueKind.Object) { - return ParseLiteral(casted); + return true; } - if (valueSyntax is NullValueNode) + if (SerializationType == ScalarSerializationType.List + && inputValue.ValueKind == JsonValueKind.Array) { - return null; + return true; } - throw CreateParseLiteralError(valueSyntax); + return false; } - /// - /// Parses the specified - /// to the .net representation of this type. - /// - /// - /// The literal that shall be parsed. - /// - /// - /// - /// is null. - /// - /// - /// The specified cannot be parsed - /// by this scalar. - /// - protected abstract TRuntimeType ParseLiteral(TLiteral valueSyntax); - /// - public sealed override IValueNode ParseValue(object? runtimeValue) + public sealed override object? CoerceInputLiteral(IValueNode valueLiteral) { - if (runtimeValue is null) + ArgumentNullException.ThrowIfNull(valueLiteral); + + if (valueLiteral.Kind is SyntaxKind.NullValue) { - return NullValueNode.Default; + return null; } - if (runtimeValue is TRuntimeType t && IsInstanceOfType(t)) + if (valueLiteral is TLiteral literal) { - return ParseValue(t); + return CoerceInputLiteral(literal); } - throw CreateParseValueError(runtimeValue); + throw CreateCoerceInputLiteralError(valueLiteral); } - /// - /// Parses a runtime value into a valueSyntax. - /// - /// The value to parse - /// The parsed value syntax - protected abstract TLiteral ParseValue(TRuntimeType runtimeValue); + public abstract object? CoerceInputLiteral(TLiteral valueLiteral); /// - /// Creates the exception that will be thrown when encountered an + /// Creates the exception that will be thrown when encountered an /// invalid /// /// @@ -146,27 +152,8 @@ public sealed override IValueNode ParseValue(object? runtimeValue) /// /// The created exception that should be thrown /// - protected virtual SerializationException CreateParseLiteralError(IValueNode valueSyntax) - { - return new( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, valueSyntax.GetType()), - this); - } - - /// - /// Creates the exception that will be thrown when encountered an - /// invalid value. - /// - /// - /// The runtimeValue that should be parsed - /// - /// - /// The created exception that should be thrown - /// - protected virtual SerializationException CreateParseValueError(object runtimeValue) - { - return new( - TypeResourceHelper.Scalar_Cannot_ParseValue(Name, runtimeValue.GetType()), + protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) + => new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); - } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs index 6d49a5ff361..e1c4e4f76f6 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs @@ -44,5 +44,5 @@ protected override StringValueNode ParseValue(string runtimeValue) => new(runtimeValue); public override IValueNode ParseResult(object? resultValue) => - ParseValue(resultValue); + CoerceInputValue(resultValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs index ad69758e0fb..4e8a413bc63 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs @@ -53,8 +53,8 @@ protected override TimeSpan ParseLiteral(StringValueNode valueSyntax) return value.Value; } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, valueSyntax.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); } @@ -75,7 +75,7 @@ public override IValueNode ParseResult(object? resultValue) if (resultValue is string s && TryDeserializeFromString(s, Format, out var timeSpan)) { - return ParseValue(timeSpan); + return CoerceInputValue(timeSpan); } if (resultValue is TimeSpan ts) @@ -83,12 +83,12 @@ public override IValueNode ParseResult(object? resultValue) return ParseValue(ts); } - throw new SerializationException( + throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this); } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs index 5501d484dc3..5ed9829478d 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs @@ -43,8 +43,8 @@ protected override Uri ParseLiteral(StringValueNode valueSyntax) return uri; } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, valueSyntax.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); } @@ -70,12 +70,12 @@ public override IValueNode ParseResult(object? resultValue) return ParseValue(uri); } - throw new SerializationException( + throw new LeafCoercionException( TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this); } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs index 87c9c4c1572..cb27a900423 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs @@ -24,7 +24,7 @@ public class UuidType : ScalarType /// /// /// Specifies if the is enforced and violations will cause - /// a . If set to false and the string + /// a . If set to false and the string /// does not match the the scalar will try to deserialize /// the string using the other formats. /// @@ -55,7 +55,7 @@ public UuidType(char defaultFormat = '\0', bool enforceFormat = false) /// /// /// Specifies if the is enforced and violations will cause - /// a . If set to false and the string + /// a . If set to false and the string /// does not match the the scalar will try to deserialize /// the string using the other formats. /// @@ -132,8 +132,8 @@ protected override Guid ParseLiteral(StringValueNode valueSyntax) return g; } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, valueSyntax.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); } @@ -159,12 +159,12 @@ public override IValueNode ParseResult(object? resultValue) return ParseValue(g); } - throw new SerializationException( - TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, resultValue.GetType()), + throw new LeafCoercionException( + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, resultValue.GetType()), this); } - public override bool TrySerialize(object? runtimeValue, out object? resultValue) + public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { if (runtimeValue is null) { diff --git a/src/HotChocolate/Core/src/Types/Utilities/ErrorHelper.cs b/src/HotChocolate/Core/src/Types/Utilities/ErrorHelper.cs index 7c90512ef9d..bc573178406 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ErrorHelper.cs @@ -366,7 +366,7 @@ public static ISchemaError DirectiveCollection_ArgumentError( DirectiveNode? syntaxNode, object source, Path path, - SerializationException exception) + LeafCoercionException exception) { var message = string.Format( ErrorHelper_DirectiveCollection_ArgumentValueTypeIsWrong, diff --git a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs index 60b2676dcda..e18d471929c 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs @@ -189,10 +189,10 @@ public static SchemaException NonGenericExecutableNotAllowed() => .SetMessage(ExtendedTypeReferenceHandler_NonGenericExecutableNotAllowed) .Build()); - public static SerializationException RequiredInputFieldIsMissing( + public static LeafCoercionException RequiredInputFieldIsMissing( IInputValueInfo field, Path fieldPath) - => new SerializationException( + => new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_RequiredInputFieldIsMissing, @@ -203,7 +203,7 @@ public static SerializationException RequiredInputFieldIsMissing( field.Type, fieldPath); - public static SerializationException InvalidInputFieldNames( + public static LeafCoercionException InvalidInputFieldNames( T type, IReadOnlyList invalidFieldNames, Path path) @@ -211,7 +211,7 @@ public static SerializationException InvalidInputFieldNames( { if (invalidFieldNames.Count == 1) { - throw new SerializationException( + throw new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_InvalidInputFieldNames_Single, @@ -224,7 +224,7 @@ public static SerializationException InvalidInputFieldNames( path); } - throw new SerializationException( + throw new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_InvalidInputFieldNames, @@ -237,7 +237,7 @@ public static SerializationException InvalidInputFieldNames( path); } - public static SerializationException OneOfNoFieldSet( + public static LeafCoercionException OneOfNoFieldSet( InputObjectType type, Path? path) { @@ -249,7 +249,7 @@ public static SerializationException OneOfNoFieldSet( return new(builder.Build(), type, path); } - public static SerializationException OneOfMoreThanOneFieldSet( + public static LeafCoercionException OneOfMoreThanOneFieldSet( InputObjectType type, Path? path) { @@ -261,7 +261,7 @@ public static SerializationException OneOfMoreThanOneFieldSet( return new(builder.Build(), type, path); } - public static SerializationException OneOfFieldIsNull( + public static LeafCoercionException OneOfFieldIsNull( InputObjectType type, Path? path, InputField field) @@ -275,7 +275,7 @@ public static SerializationException OneOfFieldIsNull( return new(builder.Build(), type, path); } - public static SerializationException NonNullInputViolation( + public static LeafCoercionException NonNullInputViolation( ITypeSystemMember type, Path? path, IInputValueInfo? field = null) @@ -293,11 +293,11 @@ public static SerializationException NonNullInputViolation( return new(builder.Build(), type, path); } - public static SerializationException ParseInputObject_InvalidSyntaxKind( + public static LeafCoercionException ParseInputObject_InvalidSyntaxKind( InputObjectType type, SyntaxKind kind, Path path) - => new SerializationException( + => new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_ParseInputObject_InvalidSyntaxKind, @@ -309,11 +309,11 @@ public static SerializationException ParseInputObject_InvalidSyntaxKind( type, path); - public static SerializationException ParseInputObject_InvalidObjectKind( + public static LeafCoercionException ParseInputObject_InvalidObjectKind( InputObjectType type, Type objectType, Path path) - => new SerializationException( + => new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_ParseInputObject_InvalidObjectKind, @@ -326,11 +326,11 @@ public static SerializationException ParseInputObject_InvalidObjectKind( type, path); - public static SerializationException ParseNestedList_InvalidSyntaxKind( + public static LeafCoercionException ParseNestedList_InvalidSyntaxKind( ListType type, SyntaxKind kind, Path path) - => new SerializationException( + => new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_ParseNestedList_InvalidSyntaxKind, @@ -343,13 +343,13 @@ public static SerializationException ParseNestedList_InvalidSyntaxKind( type, path); - public static SerializationException ParseList_InvalidObjectKind( + public static LeafCoercionException ParseList_InvalidObjectKind( ListType type, Type listType, Path path) { var runtimeType = type.ToRuntimeType(); - return new SerializationException( + return new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_ParseList_InvalidObjectKind, @@ -361,11 +361,11 @@ public static SerializationException ParseList_InvalidObjectKind( path); } - public static SerializationException FormatValueList_InvalidObjectKind( + public static LeafCoercionException FormatValueList_InvalidObjectKind( ListType type, Type listType, Path path) - => new SerializationException( + => new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_FormatValueList_InvalidObjectKind, @@ -376,11 +376,11 @@ public static SerializationException FormatValueList_InvalidObjectKind( type, path); - public static SerializationException FormatResultObject_InvalidObjectKind( + public static LeafCoercionException FormatResultObject_InvalidObjectKind( InputObjectType type, Type objectType, Path path) - => new SerializationException( + => new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_FormatResultObject_InvalidObjectKind, @@ -393,11 +393,11 @@ public static SerializationException FormatResultObject_InvalidObjectKind( type, path); - public static SerializationException FormatResultList_InvalidObjectKind( + public static LeafCoercionException FormatResultList_InvalidObjectKind( ListType type, Type listType, Path path) - => new SerializationException( + => new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_FormatResultList_InvalidObjectKind, @@ -408,11 +408,11 @@ public static SerializationException FormatResultList_InvalidObjectKind( type, path); - public static SerializationException FormatResultLeaf_InvalidSyntaxKind( + public static LeafCoercionException FormatResultLeaf_InvalidSyntaxKind( IType type, SyntaxKind kind, Path path) - => new SerializationException( + => new LeafCoercionException( ErrorBuilder.New() .SetMessage( ThrowHelper_FormatResultLeaf_InvalidSyntaxKind, @@ -586,7 +586,7 @@ public static SchemaException OutputTypeExpected(IType type) .Build()); } - public static SerializationException InvalidTypeConversion( + public static LeafCoercionException InvalidTypeConversion( ITypeSystemMember type, IInputValueInfo inputField, Path inputFieldPath, diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs index e75a9dd2e7d..06cf0cf459d 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs @@ -546,7 +546,7 @@ void Action() => helper.CoerceVariableValues( schema, variableDefinitions, variableValues, coercedValues); // assert - Assert.Throws(Action) + Assert.Throws(Action) .Errors.Select(t => t.WithException(null)) .ToList() .MatchSnapshot(); @@ -581,7 +581,7 @@ void Action() => helper.CoerceVariableValues( schema, variableDefinitions, variableValues, coercedValues); // assert - Assert.Throws(Action).Errors.MatchSnapshot(); + Assert.Throws(Action).Errors.MatchSnapshot(); } [Fact] @@ -645,7 +645,7 @@ void Action() => helper.CoerceVariableValues( schema, variableDefinitions, variableValues, coercedValues); // assert - Assert.Throws(Action) + Assert.Throws(Action) .Errors.Select(t => t.WithException(null)) .ToList() .MatchSnapshot(); diff --git a/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs b/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs index 461fe664510..fb62dc2c5b1 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs @@ -123,7 +123,7 @@ public FooType() : base("Foo") public override Type RuntimeType => typeof(string); - public override bool IsInstanceOfType(IValueNode literal) + public override bool IsValueCompatible(IValueNode literal) { ArgumentNullException.ThrowIfNull(literal); @@ -145,7 +145,7 @@ public override bool IsInstanceOfType(object? value) return value is "a"; } - public override object? ParseLiteral(IValueNode literal) + public override object? CoerceInputLiteral(IValueNode literal) { ArgumentNullException.ThrowIfNull(literal); @@ -159,10 +159,10 @@ public override bool IsInstanceOfType(object? value) return "a"; } - throw new SerializationException("StringValue is not a.", this); + throw new LeafCoercionException("StringValue is not a.", this); } - public override IValueNode ParseValue(object? value) + public override IValueNode CoerceInputValue(object? value) { if (value is null) { @@ -174,11 +174,11 @@ public override IValueNode ParseValue(object? value) return new StringValueNode("a"); } - throw new SerializationException("String is not a.", this); + throw new LeafCoercionException("String is not a.", this); } public override IValueNode ParseResult(object? resultValue) - => ParseValue(resultValue); + => CoerceInputValue(resultValue); public override bool TrySerialize( object? runtimeValue, @@ -242,7 +242,7 @@ protected override string ParseLiteral(StringValueNode valueSyntax) { if (string.IsNullOrWhiteSpace(valueSyntax.Value)) { - throw new SerializationException("Not a valid name.", this); + throw new LeafCoercionException("Not a valid name.", this); } return valueSyntax.Value; @@ -252,13 +252,13 @@ protected override StringValueNode ParseValue(string runtimeValue) => new(runtimeValue); public override IValueNode ParseResult(object? resultValue) - => ParseValue(resultValue); + => CoerceInputValue(resultValue); - public override object? Serialize(object? runtimeValue) + public override object? CoerceOutputValue(object? runtimeValue) { if (runtimeValue is not string s || string.IsNullOrWhiteSpace(s)) { - throw new SerializationException("Name cannot serialize the given value.", this); + throw new LeafCoercionException("Name cannot serialize the given value.", this); } return base.Serialize(runtimeValue); diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs index 105f698c3cb..1d1de21f986 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs @@ -37,7 +37,7 @@ protected void Latitude_ExpectIsStringInstanceToMatch() StringValueNode valueSyntax = new("89° 0' 0.000\" S"); // act - var result = scalar.IsInstanceOfType(valueSyntax); + var result = scalar.IsValueCompatible(valueSyntax); // assert Assert.True(result); @@ -110,7 +110,7 @@ protected void Latitude_ExpectParseResultToThrowOnInvalidString() var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -138,7 +138,7 @@ protected void Latitude_ExpectParseResultToThrowOnInvalidInt() var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -166,7 +166,7 @@ protected void Latitude_ExpectParseResultToThrowOnInvalidDouble() var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -180,7 +180,7 @@ protected void Latitude_ExpectParseResultToThrowOnInvalidType() var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Theory] @@ -225,10 +225,10 @@ protected void Latitude_ExpectParseLiteralToThrowSerializationException() StringValueNode valueSyntax = new("foo"); // act - var result = Record.Exception(() => scalar.ParseLiteral(valueSyntax)); + var result = Record.Exception(() => scalar.CoerceInputLiteral(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -239,7 +239,7 @@ public void Latitude_ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = scalar.ParseLiteral(literal)!; + var value = scalar.CoerceInputLiteral(literal)!; // assert Assert.Null(value); @@ -253,7 +253,7 @@ protected void Latitude_ExpectParseValueToMatchType() const double valueSyntax = 74.3; // act - var result = scalar.ParseValue(valueSyntax); + var result = scalar.CoerceInputValue(valueSyntax); // assert Assert.Equal(typeof(StringValueNode), result.GetType()); @@ -283,7 +283,7 @@ protected void Latitude_ExpectParseValueToMatch(double runtime, string literal) StringValueNode expected = new(literal); // act - var result = scalar.ParseValue(runtime); + var result = scalar.CoerceInputValue(runtime); // assert Assert.Equal(expected, result, SyntaxComparer.BySyntax); @@ -297,10 +297,10 @@ protected void Latitude_ExpectParseValueToThrowSerializationException_GreaterTha const double runtimeValue = 91d; // act - var result = Record.Exception(() => scalar.ParseValue(runtimeValue)); + var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -311,10 +311,10 @@ protected void Latitude_ExpectParseValueToThrowSerializationException_LessThanMi const double runtimeValue = -91d; // act - var result = Record.Exception(() => scalar.ParseValue(runtimeValue)); + var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -345,7 +345,7 @@ protected void Latitude_ExpectDeserializeStringToThrowSerializationException_Les var result = Record.Exception(() => scalar.Deserialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -360,7 +360,7 @@ protected void var result = Record.Exception(() => scalar.Deserialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -389,7 +389,7 @@ protected void Latitude_ExpectSerializeIntToThrowSerializationException_LessThan var result = Record.Exception(() => scalar.Serialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -403,7 +403,7 @@ protected void Latitude_ExpectSerializeIntToThrowSerializationException_GreaterT var result = Record.Exception(() => scalar.Serialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -432,7 +432,7 @@ protected void Latitude_ExpectSerializeDoubleToThrowSerializationException_LessT var result = Record.Exception(() => scalar.Serialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -446,7 +446,7 @@ protected void Latitude_ExpectSerializeDoubleToThrowSerializationException_Great var result = Record.Exception(() => scalar.Serialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -484,7 +484,7 @@ private static double ToPrecision( int precision = 8) { return Math.Round( - (double)scalar.ParseLiteral(valueSyntax)!, + (double)scalar.CoerceInputLiteral(valueSyntax)!, precision, MidpointRounding.AwayFromZero); } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/LocalCurrencyTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/LocalCurrencyTypeTests.cs index a3e27cb9707..cc174cb8406 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/LocalCurrencyTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/LocalCurrencyTypeTests.cs @@ -52,7 +52,7 @@ protected void LocalCurrency_ExpectIsStringValueToMatch() var valueSyntax = new StringValueNode("$10.99"); // act - var result = scalar.IsInstanceOfType(valueSyntax); + var result = scalar.IsValueCompatible(valueSyntax); // assert Assert.True(result); @@ -79,7 +79,7 @@ protected void LocalCurrency_ExpectIsStringValueToMatchEuro() var valueSyntax = new StringValueNode("10,99 €"); // act - var result = scalar.IsInstanceOfType(valueSyntax); + var result = scalar.IsValueCompatible(valueSyntax); // assert Assert.True(result); @@ -93,10 +93,10 @@ protected void LocalCurrency_ExpectIsStringValueToNotMatchEuro() var valueSyntax = new StringValueNode("$10.99"); // act - var result = Record.Exception(() => scalar.ParseLiteral(valueSyntax)); + var result = Record.Exception(() => scalar.CoerceInputLiteral(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -108,7 +108,7 @@ protected void LocalCurrency_ExpectParseLiteralToMatch() const decimal expectedResult = 24.99m; // act - object result = (decimal)scalar.ParseLiteral(valueSyntax)!; + object result = (decimal)scalar.CoerceInputLiteral(valueSyntax)!; // assert Assert.Equal(expectedResult, result); @@ -123,7 +123,7 @@ protected void LocalCurrency_ExpectParseLiteralToMatchEuro() const decimal expectedResult = 24.99m; // act - object result = (decimal)scalar.ParseLiteral(valueSyntax)!; + object result = (decimal)scalar.CoerceInputLiteral(valueSyntax)!; // assert Assert.Equal(expectedResult, result); @@ -142,7 +142,7 @@ public void LocalCurrency_ParseLiteralStringValueDifferentCulture(string name, s const decimal expectedDecimal = 9.99m; // act - var result = (decimal)scalar.ParseLiteral(valueSyntax)!; + var result = (decimal)scalar.CoerceInputLiteral(valueSyntax)!; // assert Assert.Equal(expectedDecimal, result); @@ -156,10 +156,10 @@ protected void LocalCurrency_ExpectParseLiteralToThrowSerializationException() var valueSyntax = new StringValueNode("foo"); // act - var result = Record.Exception(() => scalar.ParseLiteral(valueSyntax)); + var result = Record.Exception(() => scalar.CoerceInputLiteral(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -170,7 +170,7 @@ protected void LocalCurrency_ExpectParseValueToMatchDecimal() const decimal valueSyntax = 24.95m; // act - var result = scalar.ParseValue(valueSyntax); + var result = scalar.CoerceInputValue(valueSyntax); // assert Assert.Equal(typeof(StringValueNode), result.GetType()); @@ -184,10 +184,10 @@ protected void LocalCurrency_ExpectParseValueToThrowSerializationException() var runtimeValue = new StringValueNode("foo"); // act - var result = Record.Exception(() => scalar.ParseValue(runtimeValue)); + var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -299,7 +299,7 @@ protected void LocalCurrency_ExpectSerializeToThrowSerializationException() var result = Record.Exception(() => scalar.Serialize("foo")); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -313,7 +313,7 @@ protected void LocalCurrency_ExpectDeserializeToThrowSerializationException() var result = Record.Exception(() => scalar.Deserialize(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -354,7 +354,7 @@ protected void LocalCurrency_ExpectParseResultToThrowSerializationException() var result = Record.Exception(() => scalar.ParseResult(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs index 3f2a6d571a9..4300c408a34 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs @@ -38,7 +38,7 @@ protected void Longitude_ExpectIsStringInstanceToMatch() StringValueNode valueSyntax = new("179° 0' 0.000\" E"); // act - var result = scalar.IsInstanceOfType(valueSyntax); + var result = scalar.IsValueCompatible(valueSyntax); // assert Assert.True(result); @@ -111,7 +111,7 @@ protected void Longitude_ExpectParseResultToThrowOnInvalidString() var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -139,7 +139,7 @@ protected void Longitude_ExpectParseResultToThrowOnInvalidInt() var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -167,7 +167,7 @@ protected void Longitude_ExpectParseResultToThrowOnInvalidDouble() var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -181,7 +181,7 @@ protected void Longitude_ExpectParseResultToThrowOnInvalidType() var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Theory] @@ -226,10 +226,10 @@ protected void Longitude_ExpectParseLiteralToThrowSerializationException() StringValueNode valueSyntax = new("foo"); // act - var result = Record.Exception(() => scalar.ParseLiteral(valueSyntax)); + var result = Record.Exception(() => scalar.CoerceInputLiteral(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -240,7 +240,7 @@ public void Longitude_ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = scalar.ParseLiteral(literal)!; + var value = scalar.CoerceInputLiteral(literal)!; // assert Assert.Null(value); @@ -254,7 +254,7 @@ protected void Longitude_ExpectParseValueToMatchType() const double valueSyntax = 74.3d; // act - var result = scalar.ParseValue(valueSyntax); + var result = scalar.CoerceInputValue(valueSyntax); // assert Assert.Equal(typeof(StringValueNode), result.GetType()); @@ -287,7 +287,7 @@ protected void Longitude_ExpectParseValueToMatch(double runtime, string literal) StringValueNode expected = new(literal); // act - ISyntaxNode result = scalar.ParseValue(runtime); + ISyntaxNode result = scalar.CoerceInputValue(runtime); // assert Assert.Equal(expected, result, BySyntax); @@ -301,10 +301,10 @@ protected void Longitude_ExpectParseValueToThrowSerializationException_GreaterTh const double runtimeValue = 181d; // act - var result = Record.Exception(() => scalar.ParseValue(runtimeValue)); + var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -315,10 +315,10 @@ protected void Longitude_ExpectParseValueToThrowSerializationException_LessThanM const double runtimeValue = -181d; // act - var result = Record.Exception(() => scalar.ParseValue(runtimeValue)); + var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -349,7 +349,7 @@ protected void Longitude_ExpectDeserializeStringToThrowSerializationException_Le var result = Record.Exception(() => scalar.Deserialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -364,7 +364,7 @@ protected void var result = Record.Exception(() => scalar.Deserialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -393,7 +393,7 @@ protected void Longitude_ExpectSerializeIntToThrowSerializationException_LessTha var result = Record.Exception(() => scalar.Serialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -407,7 +407,7 @@ protected void Longitude_ExpectSerializeIntToThrowSerializationException_Greater var result = Record.Exception(() => scalar.Serialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -436,7 +436,7 @@ protected void Longitude_ExpectSerializeDoubleToThrowSerializationException_Less var result = Record.Exception(() => scalar.Serialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -450,7 +450,7 @@ protected void Longitude_ExpectSerializeDoubleToThrowSerializationException_Grea var result = Record.Exception(() => scalar.Serialize(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -488,7 +488,7 @@ private static double ToPrecision( int precision = 8) { return Math.Round( - (double)scalar.ParseLiteral(valueSyntax)!, + (double)scalar.CoerceInputLiteral(valueSyntax)!, precision, MidpointRounding.AwayFromZero); } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs index 84a80ec6f43..d384d7bdae7 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs @@ -62,7 +62,7 @@ protected void ExpectIsInstanceOfTypeToMatch( var scalar = CreateType(); // act - var result = scalar.IsInstanceOfType(valueSyntax); + var result = scalar.IsValueCompatible(valueSyntax); // assert Assert.Equal(expectedResult, result); @@ -92,7 +92,7 @@ protected void ExpectParseLiteralToMatch( var scalar = CreateType(); // act - var result = scalar.ParseLiteral(valueSyntax); + var result = scalar.CoerceInputLiteral(valueSyntax); // assert Assert.Equal(expectedResult, result); @@ -106,10 +106,10 @@ protected void ExpectParseLiteralToThrowSerializationException( var scalar = CreateType(); // act - var result = Record.Exception(() => scalar.ParseLiteral(valueSyntax)); + var result = Record.Exception(() => scalar.CoerceInputLiteral(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } protected void ExpectParseValueToMatchType( @@ -121,7 +121,7 @@ protected void ExpectParseValueToMatchType( var scalar = CreateType(); // act - var result = scalar.ParseValue(valueSyntax); + var result = scalar.CoerceInputValue(valueSyntax); // assert Assert.Equal(type, result.GetType()); @@ -134,10 +134,10 @@ protected void ExpectParseValueToThrowSerializationException(object? runt var scalar = CreateType(); // act - var result = Record.Exception(() => scalar.ParseValue(runtimeValue)); + var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } protected void ExpectSerializeToMatch( @@ -180,7 +180,7 @@ protected void ExpectSerializeToThrowSerializationException(object runtim var result = Record.Exception(() => scalar.Serialize(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } protected void ExpectDeserializeToThrowSerializationException(object runtimeValue) @@ -193,7 +193,7 @@ protected void ExpectDeserializeToThrowSerializationException(object runt var result = Record.Exception(() => scalar.Deserialize(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } protected void ExpectParseResultToMatchType( @@ -221,7 +221,7 @@ protected void ExpectParseResultToThrowSerializationException(object? run var result = Record.Exception(() => scalar.ParseResult(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } protected async Task ExpectScalarTypeToBoundImplicityWhenRegistered() diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs index e3132ac2799..eb701dd8cbf 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs @@ -36,7 +36,7 @@ protected void UtcOffset_ExpectIsStringValueToMatch() var valueSyntax = new StringValueNode("+12:00"); // act - var result = scalar.IsInstanceOfType(valueSyntax); + var result = scalar.IsValueCompatible(valueSyntax); // assert Assert.True(result); @@ -50,7 +50,7 @@ protected void UtcOffset_ExpectNegativeIsStringValueToMatch() var valueSyntax = new StringValueNode("-12:00"); // act - var result = scalar.IsInstanceOfType(valueSyntax); + var result = scalar.IsValueCompatible(valueSyntax); // assert Assert.True(result); @@ -64,7 +64,7 @@ protected void UtcOffset_ExpectPositiveIsStringValueToMatch() var valueSyntax = new StringValueNode("-00:00"); // act - var result = scalar.IsInstanceOfType(valueSyntax); + var result = scalar.IsValueCompatible(valueSyntax); // assert Assert.True(result); @@ -93,7 +93,7 @@ protected void UtcOffset_ExpectParseLiteralToMatch() var expectedResult = new TimeSpan(-12, 0, 0); // act - object result = (TimeSpan)scalar.ParseLiteral(valueSyntax)!; + object result = (TimeSpan)scalar.CoerceInputLiteral(valueSyntax)!; // assert Assert.Equal(expectedResult, result); @@ -107,10 +107,10 @@ protected void UtcOffset_ExpectParseLiteralToThrowSerializationException() var valueSyntax = new StringValueNode("+17:00"); // act - var result = Record.Exception(() => scalar.ParseLiteral(valueSyntax)); + var result = Record.Exception(() => scalar.CoerceInputLiteral(valueSyntax)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -121,7 +121,7 @@ protected void UtcOffset_ExpectParseValueToMatchTimeSpan() var valueSyntax = new TimeSpan(0, 0, 0); // act - var result = scalar.ParseValue(valueSyntax); + var result = scalar.CoerceInputValue(valueSyntax); // assert Assert.Equal(typeof(StringValueNode), result.GetType()); @@ -135,10 +135,10 @@ protected void UtcOffset_ExpectParseValueToThrowSerializationException() var runtimeValue = new StringValueNode("foo"); // act - var result = Record.Exception(() => scalar.ParseValue(runtimeValue)); + var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -253,7 +253,7 @@ protected void UtcOffset_ExpectSerializeToThrowSerializationException() var result = Record.Exception(() => scalar.Serialize("foo")); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -267,7 +267,7 @@ protected void UtcOffset_ExpectDeserializeToThrowSerializationException() var result = Record.Exception(() => scalar.Deserialize(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] @@ -308,7 +308,7 @@ protected void UtcOffset_ExpectParseResultToThrowSerializationException() var result = Record.Exception(() => scalar.ParseResult(runtimeValue)); // assert - Assert.IsType(result); + Assert.IsType(result); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs b/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs index 5cb26ccb374..0d6e49ab8f3 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs @@ -185,17 +185,17 @@ public ByteArrayType() : base("ByteArray", BindingBehavior.Implicit) public override Type RuntimeType => typeof(byte[]); - public override bool IsInstanceOfType(IValueNode literal) + public override bool IsValueCompatible(IValueNode literal) { throw new NotSupportedException(); } - public override object ParseLiteral(IValueNode literal) + public override object CoerceInputLiteral(IValueNode literal) { throw new NotSupportedException(); } - public override IValueNode ParseValue(object? value) + public override IValueNode CoerceInputValue(object? value) { throw new NotSupportedException(); } @@ -205,7 +205,7 @@ public override IValueNode ParseResult(object? resultValue) throw new NotSupportedException(); } - public override object Serialize(object? runtimeValue) + public override object CoerceOutputValue(object? runtimeValue) { throw new NotSupportedException(); } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs index 5f21f390c90..f4d420adc70 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs @@ -646,7 +646,7 @@ public void EnumName_Set_Name_Comparer() // assert var type = schema.Types.GetType("Foo"); - Assert.True(type.IsInstanceOfType(new EnumValueNode("baz"))); + Assert.True(type.IsValueCompatible(new EnumValueNode("baz"))); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/InputCoercionTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/InputCoercionTests.cs index ea8c3efca01..255940339b4 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/InputCoercionTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/InputCoercionTests.cs @@ -150,7 +150,7 @@ void Action() => inputParser.ParseLiteral(value, type, Path.Root.Append("root")); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -182,7 +182,7 @@ void Action() => inputParser.ParseLiteral(list, type, Path.Root.Append("root")); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -198,7 +198,7 @@ void Action() => inputParser.ParseLiteral(element, type, Path.Root.Append("root")); // assert - Assert.Throws(Action); + Assert.Throws(Action); } private void InputIsCoercedCorrectly( @@ -210,7 +210,7 @@ private void InputIsCoercedCorrectly( var type = new TType(); // act - var coercedValue = type.ParseLiteral(literal); + var coercedValue = type.CoerceInputLiteral(literal); // assert Assert.IsType(coercedValue); @@ -226,9 +226,9 @@ private void InputCannotBeCoercedCorrectly( var type = new TType(); // act - void Action() => type.ParseLiteral(literal); + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.Throws(Action); + Assert.Throws(Action); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs index e0523c411cd..ea5d8f8e2f8 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs @@ -125,7 +125,7 @@ public void Deserialize_InputObject_AllIsSet_MissingRequired() void Action() => parser.ParseResult(fieldData, type, Path.Root); // assert - Assert.Throws(Action).MatchSnapshot(); + Assert.Throws(Action).MatchSnapshot(); } [Fact] @@ -147,7 +147,7 @@ public void Parse_InputObject_AllIsSet_MissingRequired() void Action() => parser.ParseLiteral(fieldData, type, Path.Root); // assert - Assert.Throws(Action).MatchSnapshot(); + Assert.Throws(Action).MatchSnapshot(); } [Fact] @@ -174,7 +174,7 @@ void Action() => parser.ParseResult(fieldData, type, Path.Root.Append("root")); // assert - Assert.Throws(Action).MatchSnapshot(); + Assert.Throws(Action).MatchSnapshot(); } [Fact] @@ -199,7 +199,7 @@ void Action() => parser.ParseLiteral(fieldData, type, Path.Root.Append("root")); // assert - Assert.Throws(Action).MatchSnapshot(); + Assert.Throws(Action).MatchSnapshot(); } [Fact] @@ -227,7 +227,7 @@ void Action() => parser.ParseResult(fieldData, type, Path.Root.Append("root")); // assert - Assert.Throws(Action).MatchSnapshot(); + Assert.Throws(Action).MatchSnapshot(); } [Fact] @@ -253,7 +253,7 @@ void Action() => parser.ParseLiteral(fieldData, type, Path.Root.Append("root")); // assert - Assert.Throws(Action).MatchSnapshot(); + Assert.Throws(Action).MatchSnapshot(); } [Fact] @@ -331,7 +331,7 @@ void Action() Path.Root.Append("root")); // assert - Assert.Throws(Action).MatchSnapshot(); + Assert.Throws(Action).MatchSnapshot(); } [Fact] @@ -413,7 +413,7 @@ public void OneOf_A_and_B_Are_Set() void Fail() => parser.ParseLiteral(data, oneOfInput, Path.Root.Append("root")); // assert - Assert.Throws(Fail).Errors.MatchSnapshot(); + Assert.Throws(Fail).Errors.MatchSnapshot(); } [Fact] @@ -440,7 +440,7 @@ void Fail() => parser.ParseLiteral(data, oneOfInput, Path.Root.Append("root")); // assert - Assert.Throws(Fail).Errors.MatchSnapshot(); + Assert.Throws(Fail).Errors.MatchSnapshot(); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs index 2ee156a668f..ba9c3daee30 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs @@ -776,7 +776,7 @@ public void IsInstanceOfType_EnumValue_False() var type = schema.Types.GetType("Any"); // act - var result = type.IsInstanceOfType(new EnumValueNode("foo")); + var result = type.IsValueCompatible(new EnumValueNode("foo")); // assert Assert.False(result); @@ -799,7 +799,7 @@ public void IsInstanceOfType_ObjectValue_True() var type = schema.Types.GetType("Any"); // act - var result = type.IsInstanceOfType(new ObjectValueNode([])); + var result = type.IsValueCompatible(new ObjectValueNode([])); // assert Assert.True(result); @@ -822,7 +822,7 @@ public void IsInstanceOfType_ListValue_False() var type = schema.Types.GetType("Any"); // act - var result = type.IsInstanceOfType(new ListValueNode([])); + var result = type.IsValueCompatible(new ListValueNode([])); // assert Assert.True(result); @@ -845,7 +845,7 @@ public void IsInstanceOfType_StringValue_False() var type = schema.Types.GetType("Any"); // act - var result = type.IsInstanceOfType(new StringValueNode("foo")); + var result = type.IsValueCompatible(new StringValueNode("foo")); // assert Assert.True(result); @@ -868,7 +868,7 @@ public void IsInstanceOfType_IntValue_False() var type = schema.Types.GetType("Any"); // act - var result = type.IsInstanceOfType(new IntValueNode(123)); + var result = type.IsValueCompatible(new IntValueNode(123)); // assert Assert.True(result); @@ -891,7 +891,7 @@ public void IsInstanceOfType_FloatValue_False() var type = schema.Types.GetType("Any"); // act - var result = type.IsInstanceOfType(new FloatValueNode(1.2)); + var result = type.IsValueCompatible(new FloatValueNode(1.2)); // assert Assert.True(result); @@ -914,7 +914,7 @@ public void IsInstanceOfType_BooleanValue_False() var type = schema.Types.GetType("Any"); // act - var result = type.IsInstanceOfType(new BooleanValueNode(true)); + var result = type.IsValueCompatible(new BooleanValueNode(true)); // assert Assert.True(result); @@ -937,7 +937,7 @@ public void IsInstanceOfType_NullValue_True() var type = schema.Types.GetType("Any"); // act - var result = type.IsInstanceOfType(NullValueNode.Default); + var result = type.IsValueCompatible(NullValueNode.Default); // assert Assert.True(result); @@ -960,7 +960,7 @@ public void IsInstanceOfType_Null_ArgumentNullException() var type = schema.Types.GetType("Any"); // act - void Action() => type.IsInstanceOfType(null!); + void Action() => type.IsValueCompatible(null!); // assert Assert.Throws(Action); @@ -991,7 +991,7 @@ public void ParseValue_ScalarValues(object value, Type expectedType) var type = schema.Types.GetType("Any"); // act - var literal = type.ParseValue(value); + var literal = type.CoerceInputValue(value); // assert Assert.IsType(expectedType, literal); @@ -1014,7 +1014,7 @@ public void ParseValue_Decimal() var type = schema.Types.GetType("Any"); // act - var literal = type.ParseValue((decimal)1); + var literal = type.CoerceInputValue((decimal)1); // assert Assert.IsType(literal); @@ -1037,7 +1037,7 @@ public void ParseValue_List_Of_Object() var type = schema.Types.GetType("Any"); // act - var literal = type.ParseValue(new List()); + var literal = type.CoerceInputValue(new List()); // assert Assert.IsType(literal); @@ -1060,7 +1060,7 @@ public void ParseValue_List_Of_String() var type = schema.Types.GetType("Any"); // act - var literal = type.ParseValue(new List()); + var literal = type.CoerceInputValue(new List()); // assert Assert.IsType(literal); @@ -1087,7 +1087,7 @@ public void ParseValue_List_Of_Foo() foo.Bar2 = bar; // act - var literal = type.ParseValue(new List { foo, foo }); + var literal = type.CoerceInputValue(new List { foo, foo }); // assert Assert.IsType(literal); @@ -1114,7 +1114,7 @@ public void ParseValue_List_Of_FooCyclic() barCyclic.FooCyclic = fooCyclic; // act - void Act() => type.ParseValue(new List { fooCyclic, fooCyclic }); + void Act() => type.CoerceInputValue(new List { fooCyclic, fooCyclic }); // assert Assert.Equal( @@ -1139,7 +1139,7 @@ public void ParseValue_List_Of_FooRecord() var type = schema.Types.GetType("Any"); // act - var literal = type.ParseValue(new List { new(), new() }); + var literal = type.CoerceInputValue(new List { new(), new() }); // assert Assert.IsType(literal); @@ -1162,7 +1162,7 @@ public void ParseValue_Foo() var type = schema.Types.GetType("Any"); // act - var literal = type.ParseValue(new Foo()); + var literal = type.CoerceInputValue(new Foo()); // assert Assert.IsType(literal); @@ -1189,7 +1189,7 @@ public void ParseValue_FooCyclic() barCyclic.FooCyclic = fooCyclic; // act - void Act() => type.ParseValue(fooCyclic); + void Act() => type.CoerceInputValue(fooCyclic); // assert Assert.Equal( @@ -1214,7 +1214,7 @@ public void ParseValue_Dictionary() var type = schema.Types.GetType("Any"); // act - var literal = type.ParseValue( + var literal = type.CoerceInputValue( new Dictionary()); // assert diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs index bac728fa043..028e0daf509 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs @@ -12,7 +12,7 @@ public void ParseLiteral() // act var booleanType = new BooleanType(); - var result = booleanType.ParseLiteral(literal); + var result = booleanType.CoerceInputLiteral(literal); // assert Assert.IsType(result); @@ -29,9 +29,9 @@ public void IsInstanceOfType() // act var booleanType = new BooleanType(); - var isIntLiteralInstanceOf = booleanType.IsInstanceOfType(boolLiteral); - var isStringLiteralInstanceOf = booleanType.IsInstanceOfType(stringLiteral); - var isNullLiteralInstanceOf = booleanType.IsInstanceOfType(nullLiteral); + var isIntLiteralInstanceOf = booleanType.IsValueCompatible(boolLiteral); + var isStringLiteralInstanceOf = booleanType.IsValueCompatible(stringLiteral); + var isNullLiteralInstanceOf = booleanType.IsValueCompatible(nullLiteral); // assert Assert.True(isIntLiteralInstanceOf); @@ -89,7 +89,7 @@ public void Serialize_String_Exception() Action a = () => booleanType.Serialize("foo"); // assert - Assert.Throws(a); + Assert.Throws(a); } [Fact] @@ -129,6 +129,6 @@ public void Deserialize_String_Exception() Action a = () => booleanType.Serialize("foo"); // assert - Assert.Throws(a); + Assert.Throws(a); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs index 9958309d372..0bee56f9823 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs @@ -26,7 +26,7 @@ public void IsInstanceOfType_NullLiteral() var literal = new NullValueNode(null); // act - var isOfType = byteArrayType.IsInstanceOfType(literal); + var isOfType = byteArrayType.IsValueCompatible(literal); // assert Assert.True(isOfType); @@ -41,7 +41,7 @@ public void IsInstanceOfType_IntLiteral() var literal = new IntValueNode(123); // act - var isOfType = byteArrayType.IsInstanceOfType(literal); + var isOfType = byteArrayType.IsValueCompatible(literal); // assert Assert.False(isOfType); @@ -55,7 +55,7 @@ public void IsInstanceOfType_Null() var guid = Guid.NewGuid(); // act - Action action = () => byteArrayType.IsInstanceOfType(null!); + Action action = () => byteArrayType.IsValueCompatible(null!); // assert Assert.Throws(action); @@ -102,7 +102,7 @@ public void Serialize_Int() Action action = () => byteArrayType.Serialize(value); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -190,7 +190,7 @@ public void ParseLiteral_StringValueNode() // act var actual = (byte[]?)byteArrayType - .ParseLiteral(literal); + .CoerceInputLiteral(literal); // assert Assert.Equal(expected, actual); @@ -204,10 +204,10 @@ public void ParseLiteral_IntValueNode() var literal = new IntValueNode(123); // act - Action action = () => byteArrayType.ParseLiteral(literal); + Action action = () => byteArrayType.CoerceInputLiteral(literal); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -218,7 +218,7 @@ public void ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = byteArrayType.ParseLiteral(literal); + var value = byteArrayType.CoerceInputLiteral(literal); // assert Assert.Null(value); @@ -231,7 +231,7 @@ public void ParseLiteral_Null() var byteArrayType = new ByteArrayType(); // act - Action action = () => byteArrayType.ParseLiteral(null!); + Action action = () => byteArrayType.CoerceInputLiteral(null!); // assert Assert.Throws(action); @@ -262,7 +262,7 @@ public void ParseValue_Null() // act var stringLiteral = - byteArrayType.ParseValue(guid); + byteArrayType.CoerceInputValue(guid); // assert Assert.True(stringLiteral is NullValueNode); @@ -277,10 +277,10 @@ public void ParseValue_Int() const int value = 123; // act - Action action = () => byteArrayType.ParseValue(value); + Action action = () => byteArrayType.CoerceInputValue(value); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs index 04cfe8e5353..0001db5df67 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs @@ -12,7 +12,7 @@ public void IsInstanceOfType_FloatLiteral_True() var literal = new IntValueNode(1); // act - var result = type.IsInstanceOfType(literal); + var result = type.IsValueCompatible(literal); // assert Assert.True(result); @@ -25,7 +25,7 @@ public void IsInstanceOfType_NullLiteral_True() var type = new ByteType(); // act - var result = type.IsInstanceOfType(NullValueNode.Default); + var result = type.IsValueCompatible(NullValueNode.Default); // assert Assert.True(result); @@ -38,7 +38,7 @@ public void IsInstanceOfType_StringLiteral_False() var type = new ByteType(); // act - var result = type.IsInstanceOfType(new FloatValueNode(1M)); + var result = type.IsValueCompatible(new FloatValueNode(1M)); // assert Assert.False(result); @@ -53,7 +53,7 @@ public void IsInstanceOfType_Null_Throws() // act // assert Assert.Throws( - () => type.IsInstanceOfType(null!)); + () => type.IsValueCompatible(null!)); } [Fact] @@ -93,7 +93,7 @@ public void Serialize_Wrong_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(input)); } @@ -106,7 +106,7 @@ public void Serialize_MaxValue_Violation() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(value)); } @@ -118,7 +118,7 @@ public void ParseLiteral_IntLiteral() var literal = new IntValueNode(1); // act - var value = type.ParseLiteral(literal); + var value = type.CoerceInputLiteral(literal); // assert Assert.IsType(value); @@ -132,7 +132,7 @@ public void ParseLiteral_NullValueNode() var type = new ByteType(); // act - var output = type.ParseLiteral(NullValueNode.Default); + var output = type.CoerceInputLiteral(NullValueNode.Default); // assert Assert.Null(output); @@ -147,8 +147,8 @@ public void ParseLiteral_Wrong_ValueNode_Throws() // act // assert - Assert.Throws( - () => type.ParseLiteral(input)); + Assert.Throws( + () => type.CoerceInputLiteral(input)); } [Fact] @@ -160,7 +160,7 @@ public void ParseLiteral_Null_Throws() // act // assert Assert.Throws( - () => type.ParseLiteral(null!)); + () => type.CoerceInputLiteral(null!)); } [Fact] @@ -188,7 +188,7 @@ public void ParseValue_MaxValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -216,7 +216,7 @@ public void ParseValue_MinValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -228,8 +228,8 @@ public void ParseValue_Wrong_Value_Throws() // act // assert - Assert.Throws( - () => type.ParseValue(value)); + Assert.Throws( + () => type.CoerceInputValue(value)); } [Fact] @@ -240,7 +240,7 @@ public void ParseValue_Null() object input = null!; // act - object output = type.ParseValue(input); + object output = type.CoerceInputValue(input); // assert Assert.IsType(output); @@ -254,7 +254,7 @@ public void ParseValue_Nullable() byte? input = 123; // act - var output = (IntValueNode)type.ParseValue(input); + var output = (IntValueNode)type.CoerceInputValue(input); // assert Assert.Equal(123, output.ToDouble()); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs index ca4744a9516..b27f4da5255 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs @@ -70,7 +70,7 @@ public void Serialize_String_Exception() Action a = () => dateTimeType.Serialize("foo"); // assert - Assert.Throws(a); + Assert.Throws(a); } [Fact] @@ -85,7 +85,7 @@ public void ParseLiteral_StringValueNode() new TimeSpan(4, 0, 0)); // act - var dateTime = (DateTimeOffset)dateTimeType.ParseLiteral(literal)!; + var dateTime = (DateTimeOffset)dateTimeType.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedDateTime, dateTime); @@ -100,7 +100,7 @@ public void ParseLiteral_StringValueNode_Valid(string dateTime, DateTimeOffset r var literal = new StringValueNode(dateTime); // act - var dateTimeOffset = (DateTimeOffset?)dateTimeType.ParseLiteral(literal); + var dateTimeOffset = (DateTimeOffset?)dateTimeType.CoerceInputLiteral(literal); // assert Assert.Equal(result, dateTimeOffset); @@ -117,13 +117,13 @@ public void ParseLiteral_StringValueNode_Invalid(string dateTime) // act void Act() { - dateTimeType.ParseLiteral(literal); + dateTimeType.CoerceInputLiteral(literal); } // assert Assert.Equal( "DateTime cannot parse the given literal of type `StringValueNode`.", - Assert.Throws(Act).Message); + Assert.Throws(Act).Message); } [InlineData("en-US")] @@ -146,7 +146,7 @@ public void ParseLiteral_StringValueNode_DifferentCulture(string cultureName) new TimeSpan(4, 0, 0)); // act - var dateTime = (DateTimeOffset)dateTimeType.ParseLiteral(literal)!; + var dateTime = (DateTimeOffset)dateTimeType.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedDateTime, dateTime); @@ -326,7 +326,7 @@ public void ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = dateTimeType.ParseLiteral(literal); + var value = dateTimeType.CoerceInputLiteral(literal); // assert Assert.Null(value); @@ -374,7 +374,7 @@ public void ParseValue_Null() var dateTimeType = new DateTimeType(); // act - var literal = dateTimeType.ParseValue(null); + var literal = dateTimeType.CoerceInputValue(null); // assert Assert.IsType(literal); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs index 43edaea3640..b90f9b198f6 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs @@ -78,7 +78,7 @@ public void Serialize_String_Exception() void Action() => dateType.Serialize("foo"); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -223,7 +223,7 @@ public void ParseLiteral_StringValueNode() var expectedDateTime = new DateOnly(2018, 6, 29); // act - var dateTime = (DateOnly)dateType.ParseLiteral(literal)!; + var dateTime = (DateOnly)dateType.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedDateTime, dateTime); @@ -247,7 +247,7 @@ public void ParseLiteral_StringValueNode_DifferentCulture( var expectedDateTime = new DateOnly(2018, 6, 29); // act - var dateTime = (DateOnly)dateType.ParseLiteral(literal)!; + var dateTime = (DateOnly)dateType.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedDateTime, dateTime); @@ -261,7 +261,7 @@ public void ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = dateType.ParseLiteral(literal); + var value = dateType.CoerceInputLiteral(literal); // assert Assert.Null(value); @@ -290,7 +290,7 @@ public void ParseValue_Null() var dateType = new DateType(); // act - var literal = dateType.ParseValue(null); + var literal = dateType.CoerceInputValue(null); // assert Assert.Equal(NullValueNode.Default, literal); @@ -384,7 +384,7 @@ public void ParseResult_SerializationException() var exception = Record.Exception(() => dateType.ParseResult(resultValue)); // assert - Assert.IsType(exception); + Assert.IsType(exception); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs index ae35dccacb0..dc848e743e1 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs @@ -12,7 +12,7 @@ public void IsInstanceOfType_FloatLiteral_True() var type = new DecimalType(); // act - var result = type.IsInstanceOfType(CreateExponentialLiteral()); + var result = type.IsValueCompatible(CreateExponentialLiteral()); // assert Assert.True(result); @@ -25,7 +25,7 @@ public void IsInstanceOfType_NullLiteral_True() var type = new DecimalType(); // act - var result = type.IsInstanceOfType(NullValueNode.Default); + var result = type.IsValueCompatible(NullValueNode.Default); // assert Assert.True(result); @@ -38,7 +38,7 @@ public void IsInstanceOfType_IntLiteral_True() var type = new DecimalType(); // act - var result = type.IsInstanceOfType(new IntValueNode(123)); + var result = type.IsValueCompatible(new IntValueNode(123)); // assert Assert.True(result); @@ -51,7 +51,7 @@ public void IsInstanceOfType_StringLiteral_False() var type = new DecimalType(); // act - var result = type.IsInstanceOfType(new StringValueNode("123")); + var result = type.IsValueCompatible(new StringValueNode("123")); // assert Assert.False(result); @@ -66,7 +66,7 @@ public void IsInstanceOfType_Null_Throws() // act // assert Assert.Throws( - () => type.IsInstanceOfType(null!)); + () => type.IsValueCompatible(null!)); } [Fact] @@ -106,7 +106,7 @@ public void Serialize_Wrong_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(input)); } @@ -119,7 +119,7 @@ public void Serialize_MaxValue_Violation() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(value)); } @@ -131,7 +131,7 @@ public void ParseLiteral_FixedPointLiteral() var literal = CreateFixedPointLiteral(); // act - var value = type.ParseLiteral(literal); + var value = type.CoerceInputLiteral(literal); // assert Assert.IsType(value); @@ -146,7 +146,7 @@ public void ParseLiteral_ExponentialLiteral() var literal = CreateExponentialLiteral(); // act - var value = type.ParseLiteral(literal); + var value = type.CoerceInputLiteral(literal); // assert Assert.IsType(value); @@ -161,7 +161,7 @@ public void ParseLiteral_IntLiteral() var literal = new IntValueNode(123); // act - var value = type.ParseLiteral(literal); + var value = type.CoerceInputLiteral(literal); // assert Assert.IsType(value); @@ -175,7 +175,7 @@ public void ParseLiteral_NullValueNode() var type = new DecimalType(); // act - var output = type.ParseLiteral(NullValueNode.Default); + var output = type.CoerceInputLiteral(NullValueNode.Default); // assert Assert.Null(output); @@ -190,8 +190,8 @@ public void ParseLiteral_Wrong_ValueNode_Throws() // act // assert - Assert.Throws( - () => type.ParseLiteral(input)); + Assert.Throws( + () => type.CoerceInputLiteral(input)); } [Fact] @@ -203,7 +203,7 @@ public void ParseLiteral_Null_Throws() // act // assert Assert.Throws( - () => type.ParseLiteral(null!)); + () => type.CoerceInputLiteral(null!)); } [Fact] @@ -231,7 +231,7 @@ public void ParseValue_MaxValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -259,7 +259,7 @@ public void ParseValue_MinValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -271,8 +271,8 @@ public void ParseValue_Wrong_Value_Throws() // act // assert - Assert.Throws( - () => type.ParseValue(value)); + Assert.Throws( + () => type.CoerceInputValue(value)); } [Fact] @@ -283,7 +283,7 @@ public void ParseValue_Null() object input = null!; // act - object output = type.ParseValue(input); + object output = type.CoerceInputValue(input); // assert Assert.IsType(output); @@ -297,7 +297,7 @@ public void ParseValue_Nullable() decimal? input = 123M; // act - var output = (FloatValueNode)type.ParseValue(input); + var output = (FloatValueNode)type.CoerceInputValue(input); // assert Assert.Equal(123M, output.ToDecimal()); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs index 39b5aa5a8e0..0365fcbf2b3 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs @@ -12,7 +12,7 @@ public void IsInstanceOfType_FloatLiteral_True() var type = new FloatType(); // act - var result = type.IsInstanceOfType(CreateExponentialLiteral()); + var result = type.IsValueCompatible(CreateExponentialLiteral()); // assert Assert.True(result); @@ -25,7 +25,7 @@ public void IsInstanceOfType_NullLiteral_True() var type = new FloatType(); // act - var result = type.IsInstanceOfType(NullValueNode.Default); + var result = type.IsValueCompatible(NullValueNode.Default); // assert Assert.True(result); @@ -38,7 +38,7 @@ public void IsInstanceOfType_IntLiteral_True() var type = new FloatType(); // act - var result = type.IsInstanceOfType(new IntValueNode(123)); + var result = type.IsValueCompatible(new IntValueNode(123)); // assert Assert.True(result); @@ -51,7 +51,7 @@ public void IsInstanceOfType_StringLiteral_False() var type = new FloatType(); // act - var result = type.IsInstanceOfType(new StringValueNode("123")); + var result = type.IsValueCompatible(new StringValueNode("123")); // assert Assert.False(result); @@ -66,7 +66,7 @@ public void IsInstanceOfType_Null_Throws() // act // assert Assert.Throws( - () => type.IsInstanceOfType(null!)); + () => type.IsValueCompatible(null!)); } [Fact] @@ -106,7 +106,7 @@ public void Serialize_Wrong_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(input)); } @@ -119,7 +119,7 @@ public void Serialize_MaxValue_Violation() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(value)); } @@ -131,7 +131,7 @@ public void ParseLiteral_FixedPointLiteral() var literal = CreateFixedPointLiteral(); // act - var value = type.ParseLiteral(literal); + var value = type.CoerceInputLiteral(literal); // assert Assert.IsType(value); @@ -146,7 +146,7 @@ public void ParseLiteral_ExponentialLiteral() var literal = CreateExponentialLiteral(); // act - var value = type.ParseLiteral(literal); + var value = type.CoerceInputLiteral(literal); // assert Assert.IsType(value); @@ -161,7 +161,7 @@ public void ParseLiteral_IntLiteral() var literal = new IntValueNode(123); // act - var value = type.ParseLiteral(literal); + var value = type.CoerceInputLiteral(literal); // assert Assert.IsType(value); @@ -175,7 +175,7 @@ public void ParseLiteral_NullValueNode() var type = new FloatType(); // act - var output = type.ParseLiteral(NullValueNode.Default); + var output = type.CoerceInputLiteral(NullValueNode.Default); // assert Assert.Null(output); @@ -190,8 +190,8 @@ public void ParseLiteral_Wrong_ValueNode_Throws() // act // assert - Assert.Throws( - () => type.ParseLiteral(input)); + Assert.Throws( + () => type.CoerceInputLiteral(input)); } [Fact] @@ -203,7 +203,7 @@ public void ParseLiteral_Null_Throws() // act // assert Assert.Throws( - () => type.ParseLiteral(null!)); + () => type.CoerceInputLiteral(null!)); } [Fact] @@ -231,7 +231,7 @@ public void ParseValue_MaxValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -259,7 +259,7 @@ public void ParseValue_MinValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -271,8 +271,8 @@ public void ParseValue_Wrong_Value_Throws() // act // assert - Assert.Throws( - () => type.ParseValue(value)); + Assert.Throws( + () => type.CoerceInputValue(value)); } [Fact] @@ -283,7 +283,7 @@ public void ParseValue_Null() object input = null!; // act - object output = type.ParseValue(input); + object output = type.CoerceInputValue(input); // assert Assert.IsType(output); @@ -297,7 +297,7 @@ public void ParseValue_Nullable() double? input = 123; // act - var output = (FloatValueNode)type.ParseValue(input); + var output = (FloatValueNode)type.CoerceInputValue(input); // assert Assert.Equal(123, output.ToDouble()); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs index 74ac07800b5..b413c61e6a3 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs @@ -59,7 +59,7 @@ public void IsInstanceOfType_StringValueNode() var input = new StringValueNode("123456"); // act - var result = type.IsInstanceOfType(input); + var result = type.IsValueCompatible(input); // assert Assert.True(result); @@ -73,7 +73,7 @@ public void IsInstanceOfType_IntValueNode() var input = new IntValueNode(123456); // act - var result = type.IsInstanceOfType(input); + var result = type.IsValueCompatible(input); // assert Assert.True(result); @@ -87,7 +87,7 @@ public void IsInstanceOfType_NullValueNode() var input = NullValueNode.Default; // act - var result = type.IsInstanceOfType(input); + var result = type.IsValueCompatible(input); // assert Assert.True(result); @@ -101,7 +101,7 @@ public void IsInstanceOfType_Wrong_ValueNode() var input = new FloatValueNode(123456.0); // act - var result = type.IsInstanceOfType(input); + var result = type.IsValueCompatible(input); // assert Assert.False(result); @@ -116,7 +116,7 @@ public void IsInstanceOfType_Null_Throws() // act // assert Assert.Throws( - () => type.IsInstanceOfType(null!)); + () => type.IsValueCompatible(null!)); } [Fact] @@ -222,7 +222,7 @@ public void Serialize_Wrong_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(input)); } @@ -234,7 +234,7 @@ public void ParseLiteral_StringValueNode() var input = new StringValueNode("123456"); // act - var output = type.ParseLiteral(input); + var output = type.CoerceInputLiteral(input); // assert Assert.IsType(output); @@ -249,7 +249,7 @@ public void ParseLiteral_IntValueNode() var input = new IntValueNode(123456); // act - var output = type.ParseLiteral(input); + var output = type.CoerceInputLiteral(input); // assert Assert.IsType(output); @@ -264,7 +264,7 @@ public void ParseLiteral_NullValueNode() var input = NullValueNode.Default; // act - var output = type.ParseLiteral(input); + var output = type.CoerceInputLiteral(input); // assert Assert.Null(output); @@ -279,8 +279,8 @@ public void ParseLiteral_Wrong_ValueNode_Throws() // act // assert - Assert.Throws( - () => type.ParseLiteral(input)); + Assert.Throws( + () => type.CoerceInputLiteral(input)); } [Fact] @@ -292,7 +292,7 @@ public void ParseLiteral_Null_Throws() // act // assert Assert.Throws(() => - type.ParseLiteral(null!)); + type.CoerceInputLiteral(null!)); } [Fact] @@ -304,8 +304,8 @@ public void ParseValue_Wrong_Value_Throws() // act // assert - Assert.Throws( - () => type.ParseValue(input)); + Assert.Throws( + () => type.CoerceInputValue(input)); } [Fact] @@ -316,7 +316,7 @@ public void ParseValue_Null() object input = null!; // act - object output = type.ParseValue(input); + object output = type.CoerceInputValue(input); // assert Assert.IsType(output); @@ -330,7 +330,7 @@ public void ParseValue_String() object input = "hello"; // act - object output = type.ParseValue(input); + object output = type.CoerceInputValue(input); // assert Assert.IsType(output); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs index 37f33245ca2..e86440dba97 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs @@ -12,7 +12,7 @@ public void IsInstanceOfType_FloatLiteral_True() var literal = new IntValueNode(1); // act - var result = type.IsInstanceOfType(literal); + var result = type.IsValueCompatible(literal); // assert Assert.True(result); @@ -25,7 +25,7 @@ public void IsInstanceOfType_NullLiteral_True() var type = new IntType(); // act - var result = type.IsInstanceOfType(NullValueNode.Default); + var result = type.IsValueCompatible(NullValueNode.Default); // assert Assert.True(result); @@ -38,7 +38,7 @@ public void IsInstanceOfType_StringLiteral_False() var type = new IntType(); // act - var result = type.IsInstanceOfType(new FloatValueNode(1M)); + var result = type.IsValueCompatible(new FloatValueNode(1M)); // assert Assert.False(result); @@ -53,7 +53,7 @@ public void IsInstanceOfType_Null_Throws() // act // assert Assert.Throws( - () => type.IsInstanceOfType(null!)); + () => type.IsValueCompatible(null!)); } [Fact] @@ -93,7 +93,7 @@ public void Serialize_Wrong_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(input)); } @@ -106,7 +106,7 @@ public void Serialize_MaxValue_Violation() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(value)); } @@ -118,7 +118,7 @@ public void ParseLiteral_IntLiteral() var literal = new IntValueNode(1); // act - var value = type.ParseLiteral(literal); + var value = type.CoerceInputLiteral(literal); // assert Assert.IsType(value); @@ -132,7 +132,7 @@ public void ParseLiteral_NullValueNode() var type = new IntType(); // act - var output = type.ParseLiteral(NullValueNode.Default); + var output = type.CoerceInputLiteral(NullValueNode.Default); // assert Assert.Null(output); @@ -147,8 +147,8 @@ public void ParseLiteral_Wrong_ValueNode_Throws() // act // assert - Assert.Throws( - () => type.ParseLiteral(input)); + Assert.Throws( + () => type.CoerceInputLiteral(input)); } [Fact] @@ -160,7 +160,7 @@ public void ParseLiteral_Null_Throws() // act // assert Assert.Throws( - () => type.ParseLiteral(null!)); + () => type.CoerceInputLiteral(null!)); } [Fact] @@ -188,7 +188,7 @@ public void ParseValue_MaxValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -216,7 +216,7 @@ public void ParseValue_MinValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -228,8 +228,8 @@ public void ParseValue_Wrong_Value_Throws() // act // assert - Assert.Throws( - () => type.ParseValue(value)); + Assert.Throws( + () => type.CoerceInputValue(value)); } [Fact] @@ -240,7 +240,7 @@ public void ParseValue_Null() object input = null!; // act - object output = type.ParseValue(input); + object output = type.CoerceInputValue(input); // assert Assert.IsType(output); @@ -254,7 +254,7 @@ public void ParseValue_Nullable() int? input = 123; // act - var output = (IntValueNode)type.ParseValue(input); + var output = (IntValueNode)type.CoerceInputValue(input); // assert Assert.Equal(123, output.ToDouble()); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs index 1952f0a1eda..31a9b50917e 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs @@ -63,7 +63,7 @@ public void Serialize_String_Exception() void Action() => localDateTimeType.Serialize("foo"); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -191,7 +191,7 @@ public void ParseLiteral_StringValueNode() var expectedDateTime = new DateTime(2018, 6, 29, 8, 46, 14); // act - var dateTime = (DateTime)localDateTimeType.ParseLiteral(literal)!; + var dateTime = (DateTime)localDateTimeType.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedDateTime, dateTime); @@ -215,7 +215,7 @@ public void ParseLiteral_StringValueNode_DifferentCulture( var expectedDateTime = new DateTime(2018, 6, 29, 8, 46, 14); // act - var dateTime = (DateTime)localDateTimeType.ParseLiteral(literal)!; + var dateTime = (DateTime)localDateTimeType.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedDateTime, dateTime); @@ -229,7 +229,7 @@ public void ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = localDateTimeType.ParseLiteral(literal); + var value = localDateTimeType.CoerceInputLiteral(literal); // assert Assert.Null(value); @@ -258,7 +258,7 @@ public void ParseValue_Null() var localDateTimeType = new LocalDateTimeType(); // act - var literal = localDateTimeType.ParseValue(null); + var literal = localDateTimeType.CoerceInputValue(null); // assert Assert.Equal(NullValueNode.Default, literal); @@ -336,7 +336,7 @@ public void ParseResult_SerializationException() var exception = Record.Exception(() => localDateTimeType.ParseResult(resultValue)); // assert - Assert.IsType(exception); + Assert.IsType(exception); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs index f3451621c0b..016f60655d4 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs @@ -78,7 +78,7 @@ public void Serialize_String_Exception() void Action() => localDateType.Serialize("foo"); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -223,7 +223,7 @@ public void ParseLiteral_StringValueNode() var expectedDateOnly = new DateOnly(2018, 6, 29); // act - var dateOnly = (DateOnly)localDateType.ParseLiteral(literal)!; + var dateOnly = (DateOnly)localDateType.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedDateOnly, dateOnly); @@ -238,7 +238,7 @@ public void ParseLiteral_StringValueNode_Valid(string dateTime, DateOnly result) var literal = new StringValueNode(dateTime); // act - var dateTimeOffset = (DateOnly?)localDateType.ParseLiteral(literal); + var dateTimeOffset = (DateOnly?)localDateType.CoerceInputLiteral(literal); // assert Assert.Equal(result, dateTimeOffset); @@ -255,13 +255,13 @@ public void ParseLiteral_StringValueNode_Invalid(string dateTime) // act void Act() { - localDateType.ParseLiteral(literal); + localDateType.CoerceInputLiteral(literal); } // assert Assert.Equal( "LocalDate cannot parse the given literal of type `StringValueNode`.", - Assert.Throws(Act).Message); + Assert.Throws(Act).Message); } [InlineData("en-US")] @@ -282,7 +282,7 @@ public void ParseLiteral_StringValueNode_DifferentCulture( var expectedDateOnly = new DateOnly(2018, 6, 29); // act - var dateOnly = (DateOnly)localDateType.ParseLiteral(literal)!; + var dateOnly = (DateOnly)localDateType.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedDateOnly, dateOnly); @@ -296,7 +296,7 @@ public void ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = localDateType.ParseLiteral(literal); + var value = localDateType.CoerceInputLiteral(literal); // assert Assert.Null(value); @@ -325,7 +325,7 @@ public void ParseValue_Null() var localDateType = new LocalDateType(); // act - var literal = localDateType.ParseValue(null); + var literal = localDateType.CoerceInputValue(null); // assert Assert.Equal(NullValueNode.Default, literal); @@ -419,7 +419,7 @@ public void ParseResult_SerializationException() var exception = Record.Exception(() => localDateType.ParseResult(resultValue)); // assert - Assert.IsType(exception); + Assert.IsType(exception); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs index 4472b8ed5c5..24b56053724 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs @@ -78,7 +78,7 @@ public void Serialize_String_Exception() void Action() => localTimeType.Serialize("foo"); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -223,7 +223,7 @@ public void ParseLiteral_StringValueNode() var expectedTimeOnly = new TimeOnly(8, 46, 14); // act - var timeOnly = (TimeOnly)localTimeType.ParseLiteral(literal)!; + var timeOnly = (TimeOnly)localTimeType.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedTimeOnly, timeOnly); @@ -247,7 +247,7 @@ public void ParseLiteral_StringValueNode_DifferentCulture( var expectedTimeOnly = new TimeOnly(8, 46, 14); // act - var timeOnly = (TimeOnly)localTimeType.ParseLiteral(literal)!; + var timeOnly = (TimeOnly)localTimeType.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedTimeOnly, timeOnly); @@ -261,7 +261,7 @@ public void ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = localTimeType.ParseLiteral(literal); + var value = localTimeType.CoerceInputLiteral(literal); // assert Assert.Null(value); @@ -290,7 +290,7 @@ public void ParseValue_Null() var localTimeType = new LocalTimeType(); // act - var literal = localTimeType.ParseValue(null); + var literal = localTimeType.CoerceInputValue(null); // assert Assert.Equal(NullValueNode.Default, literal); @@ -384,7 +384,7 @@ public void ParseResult_SerializationException() var exception = Record.Exception(() => localTimeType.ParseResult(resultValue)); // assert - Assert.IsType(exception); + Assert.IsType(exception); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs index 4aa9984c850..38f4e5e6d8c 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs @@ -12,7 +12,7 @@ public void IsInstanceOfType_FloatLiteral_True() var literal = new IntValueNode(1); // act - var result = type.IsInstanceOfType(literal); + var result = type.IsValueCompatible(literal); // assert Assert.True(result); @@ -25,7 +25,7 @@ public void IsInstanceOfType_NullLiteral_True() var type = new LongType(); // act - var result = type.IsInstanceOfType(NullValueNode.Default); + var result = type.IsValueCompatible(NullValueNode.Default); // assert Assert.True(result); @@ -38,7 +38,7 @@ public void IsInstanceOfType_StringLiteral_False() var type = new LongType(); // act - var result = type.IsInstanceOfType(new FloatValueNode(1M)); + var result = type.IsValueCompatible(new FloatValueNode(1M)); // assert Assert.False(result); @@ -53,7 +53,7 @@ public void IsInstanceOfType_Null_Throws() // act // assert Assert.Throws( - () => type.IsInstanceOfType(null!)); + () => type.IsValueCompatible(null!)); } [Fact] @@ -93,7 +93,7 @@ public void Serialize_Wrong_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(input)); } @@ -106,7 +106,7 @@ public void Serialize_MaxValue_Violation() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(value)); } @@ -118,7 +118,7 @@ public void ParseLiteral_IntLiteral() var literal = new IntValueNode(1); // act - var value = type.ParseLiteral(literal); + var value = type.CoerceInputLiteral(literal); // assert Assert.IsType(value); @@ -132,7 +132,7 @@ public void ParseLiteral_NullValueNode() var type = new LongType(); // act - var output = type.ParseLiteral(NullValueNode.Default); + var output = type.CoerceInputLiteral(NullValueNode.Default); // assert Assert.Null(output); @@ -147,8 +147,8 @@ public void ParseLiteral_Wrong_ValueNode_Throws() // act // assert - Assert.Throws( - () => type.ParseLiteral(input)); + Assert.Throws( + () => type.CoerceInputLiteral(input)); } [Fact] @@ -160,7 +160,7 @@ public void ParseLiteral_Null_Throws() // act // assert Assert.Throws( - () => type.ParseLiteral(null!)); + () => type.CoerceInputLiteral(null!)); } [Fact] @@ -188,7 +188,7 @@ public void ParseValue_MaxValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -216,7 +216,7 @@ public void ParseValue_MinValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -228,8 +228,8 @@ public void ParseValue_Wrong_Value_Throws() // act // assert - Assert.Throws( - () => type.ParseValue(value)); + Assert.Throws( + () => type.CoerceInputValue(value)); } [Fact] @@ -240,7 +240,7 @@ public void ParseValue_Null() object input = null!; // act - object output = type.ParseValue(input); + object output = type.CoerceInputValue(input); // assert Assert.IsType(output); @@ -254,7 +254,7 @@ public void ParseValue_Nullable() long? input = 123; // act - var output = (IntValueNode)type.ParseValue(input); + var output = (IntValueNode)type.CoerceInputValue(input); // assert Assert.Equal(123, output.ToDouble()); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs index 34bab5fc6fa..91f754185bd 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs @@ -57,17 +57,17 @@ public ImplicitBindingScalar() { } - public override bool IsInstanceOfType(IValueNode literal) + public override bool IsValueCompatible(IValueNode literal) { throw new NotImplementedException(); } - public override object? ParseLiteral(IValueNode valueSyntax) + public override object? CoerceInputLiteral(IValueNode valueSyntax) { throw new NotImplementedException(); } - public override IValueNode ParseValue(object? value) + public override IValueNode CoerceInputValue(object? value) { throw new NotImplementedException(); } @@ -85,17 +85,17 @@ public ExplicitBindingScalar() { } - public override bool IsInstanceOfType(IValueNode literal) + public override bool IsValueCompatible(IValueNode literal) { throw new NotImplementedException(); } - public override object? ParseLiteral(IValueNode valueSyntax) + public override object? CoerceInputLiteral(IValueNode valueSyntax) { throw new NotImplementedException(); } - public override IValueNode ParseValue(object? value) + public override IValueNode CoerceInputValue(object? value) { throw new NotImplementedException(); } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs index a7a4f7938fd..65636dc8dc1 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs @@ -12,7 +12,7 @@ public void IsInstanceOfType_FloatLiteral_True() var literal = new IntValueNode(1); // act - var result = type.IsInstanceOfType(literal); + var result = type.IsValueCompatible(literal); // assert Assert.True(result); @@ -25,7 +25,7 @@ public void IsInstanceOfType_NullLiteral_True() var type = new ShortType(); // act - var result = type.IsInstanceOfType(NullValueNode.Default); + var result = type.IsValueCompatible(NullValueNode.Default); // assert Assert.True(result); @@ -38,7 +38,7 @@ public void IsInstanceOfType_StringLiteral_False() var type = new ShortType(); // act - var result = type.IsInstanceOfType(new FloatValueNode(1M)); + var result = type.IsValueCompatible(new FloatValueNode(1M)); // assert Assert.False(result); @@ -53,7 +53,7 @@ public void IsInstanceOfType_Null_Throws() // act // assert Assert.Throws( - () => type.IsInstanceOfType(null!)); + () => type.IsValueCompatible(null!)); } [Fact] @@ -93,7 +93,7 @@ public void Serialize_Wrong_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(input)); } @@ -106,7 +106,7 @@ public void Serialize_MaxValue_Violation() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(value)); } @@ -118,7 +118,7 @@ public void ParseLiteral_IntLiteral() var literal = new IntValueNode(1); // act - var value = type.ParseLiteral(literal); + var value = type.CoerceInputLiteral(literal); // assert Assert.IsType(value); @@ -132,7 +132,7 @@ public void ParseLiteral_NullValueNode() var type = new ShortType(); // act - var output = type.ParseLiteral(NullValueNode.Default); + var output = type.CoerceInputLiteral(NullValueNode.Default); // assert Assert.Null(output); @@ -147,8 +147,8 @@ public void ParseLiteral_Wrong_ValueNode_Throws() // act // assert - Assert.Throws( - () => type.ParseLiteral(input)); + Assert.Throws( + () => type.CoerceInputLiteral(input)); } [Fact] @@ -160,7 +160,7 @@ public void ParseLiteral_Null_Throws() // act // assert Assert.Throws( - () => type.ParseLiteral(null!)); + () => type.CoerceInputLiteral(null!)); } [Fact] @@ -188,7 +188,7 @@ public void ParseValue_MaxValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -216,7 +216,7 @@ public void ParseValue_MinValue_Violation() Action action = () => type.ParseValue(input); // assert - Assert.Throws(action); + Assert.Throws(action); } [Fact] @@ -228,8 +228,8 @@ public void ParseValue_Wrong_Value_Throws() // act // assert - Assert.Throws( - () => type.ParseValue(value)); + Assert.Throws( + () => type.CoerceInputValue(value)); } [Fact] @@ -240,7 +240,7 @@ public void ParseValue_Null() object input = null!; // act - object output = type.ParseValue(input); + object output = type.CoerceInputValue(input); // assert Assert.IsType(output); @@ -254,7 +254,7 @@ public void ParseValue_Nullable() short? input = 123; // act - var output = (IntValueNode)type.ParseValue(input); + var output = (IntValueNode)type.CoerceInputValue(input); // assert Assert.Equal(123, output.ToDouble()); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs index d43d1bf2192..4ac26187369 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs @@ -25,7 +25,7 @@ public void IsInstanceOfType_ValueNode() var input = new StringValueNode("123456"); // act - var result = type.IsInstanceOfType(input); + var result = type.IsValueCompatible(input); // assert Assert.True(result); @@ -39,7 +39,7 @@ public void IsInstanceOfType_NullValueNode() var input = NullValueNode.Default; // act - var result = type.IsInstanceOfType(input); + var result = type.IsValueCompatible(input); // assert Assert.True(result); @@ -53,7 +53,7 @@ public void IsInstanceOfType_Wrong_ValueNode() var input = new IntValueNode(123456); // act - var result = type.IsInstanceOfType(input); + var result = type.IsValueCompatible(input); // assert Assert.False(result); @@ -67,7 +67,7 @@ public void IsInstanceOfType_Null_Throws() // act // assert - Assert.Throws(() => type.IsInstanceOfType(null!)); + Assert.Throws(() => type.IsValueCompatible(null!)); } [Fact] @@ -107,7 +107,7 @@ public void Serialize_Wrong_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => type.Serialize(input)); } @@ -119,7 +119,7 @@ public void ParseLiteral_ValueNode() var input = new StringValueNode("123456"); // act - var output = type.ParseLiteral(input); + var output = type.CoerceInputLiteral(input); // assert Assert.IsType(output); @@ -134,7 +134,7 @@ public void ParseLiteral_NullValueNode() var input = NullValueNode.Default; // act - var output = type.ParseLiteral(input); + var output = type.CoerceInputLiteral(input); // assert Assert.Null(output); @@ -149,8 +149,8 @@ public void ParseLiteral_Wrong_ValueNode_Throws() // act // assert - Assert.Throws( - () => type.ParseLiteral(input)); + Assert.Throws( + () => type.CoerceInputLiteral(input)); } [Fact] @@ -161,7 +161,7 @@ public void ParseLiteral_Null_Throws() // act // assert - Assert.Throws(() => type.ParseLiteral(null!)); + Assert.Throws(() => type.CoerceInputLiteral(null!)); } [Fact] @@ -173,8 +173,8 @@ public void ParseValue_Wrong_Value_Throws() // act // assert - Assert.Throws( - () => type.ParseValue(input)); + Assert.Throws( + () => type.CoerceInputValue(input)); } [Fact] @@ -185,7 +185,7 @@ public void ParseValue_Null() object input = null!; // act - object output = type.ParseValue(input); + object output = type.CoerceInputValue(input); // assert Assert.IsType(output); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs index 7b648ec3784..81327aa50e7 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs @@ -93,7 +93,7 @@ public void Serialize_String_Exception() Action a = () => timeSpanType.Serialize("bad"); // assert - Assert.Throws(a); + Assert.Throws(a); } [Theory] @@ -108,7 +108,7 @@ public void ParseLiteral_StringValueNode(TimeSpanFormat format, string literalVa // act var timeSpan = (TimeSpan?)timeSpanType - .ParseLiteral(literal); + .CoerceInputLiteral(literal); // assert Assert.Equal(expectedTimeSpan, timeSpan); @@ -231,7 +231,7 @@ public void ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = timeSpanType.ParseLiteral(literal); + var value = timeSpanType.CoerceInputLiteral(literal); // assert Assert.Null(value); @@ -244,7 +244,7 @@ public void ParseValue_Null() var timeSpanType = new TimeSpanType(); // act - var literal = timeSpanType.ParseValue(null); + var literal = timeSpanType.CoerceInputValue(null); // assert Assert.IsType(literal); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs index a2048d25899..5774f5b2961 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs @@ -24,7 +24,7 @@ public void ParseLiteral_StringValueNode() var literal = new StringValueNode(expected.AbsoluteUri); // act - var actual = (Uri?)urlType.ParseLiteral(literal); + var actual = (Uri?)urlType.CoerceInputLiteral(literal); // assert Assert.Equal(expected, actual); @@ -38,7 +38,7 @@ public void ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = urlType.ParseLiteral(literal); + var value = urlType.CoerceInputLiteral(literal); // assert Assert.Null(value); @@ -53,7 +53,7 @@ public void ParseLiteral_RelativeUrl() var literal = new StringValueNode($"{expected}"); // act - var actual = (Uri?)urlType.ParseLiteral(literal); + var actual = (Uri?)urlType.CoerceInputLiteral(literal); // Assert Assert.Equal(expected, actual); @@ -68,8 +68,8 @@ public void ParseLiteral_Invalid_Url_Throws() // act // assert - Assert.Throws( - () => type.ParseLiteral(input)); + Assert.Throws( + () => type.CoerceInputLiteral(input)); } [Fact] @@ -153,7 +153,7 @@ public void IsInstanceOfType_GivenUriAsStringValueNode_ReturnsTrue() var uri = new Uri("http://domain.test/url"); // Act - var isUrlType = urlType.IsInstanceOfType(new StringValueNode(uri.AbsoluteUri)); + var isUrlType = urlType.IsValueCompatible(new StringValueNode(uri.AbsoluteUri)); // Assert Assert.True(isUrlType); @@ -166,7 +166,7 @@ public void IsInstanceOfType_GivenNullValueNode_ReturnsTrue() var urlType = new UrlType(); // act - var isUrlType = urlType.IsInstanceOfType(new NullValueNode(null)); + var isUrlType = urlType.IsValueCompatible(new NullValueNode(null)); // assert Assert.True(isUrlType); @@ -179,7 +179,7 @@ public void IsInstanceOfType_GivenInvalidUriAsStringLiteral_False() var urlType = new UrlType(); // act - var isUrlType = urlType.IsInstanceOfType( + var isUrlType = urlType.IsValueCompatible( new StringValueNode("$*^domain.test")); // assert @@ -193,7 +193,7 @@ public void IsInstanceOfType_GivenNull_ThrowsArgumentException() var urlType = new UrlType(); // act - Action action = () => urlType.IsInstanceOfType(null!); + Action action = () => urlType.IsValueCompatible(null!); // assert Assert.Throws(action); @@ -207,7 +207,7 @@ public void IsInstanceOfType_GivenNonUrlValueNode_ReturnsFalse() var intValue = new IntValueNode(1); // act - var isUrlType = urlType.IsInstanceOfType(intValue); + var isUrlType = urlType.IsValueCompatible(intValue); // assert Assert.False(isUrlType); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs index e674e02687a..79dc5140c63 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs @@ -26,7 +26,7 @@ public void IsInstanceOfType_NullLiteral() var literal = new NullValueNode(null); // act - var isOfType = uuidType.IsInstanceOfType(literal); + var isOfType = uuidType.IsValueCompatible(literal); // assert Assert.True(isOfType); @@ -40,7 +40,7 @@ public void IsInstanceOfType_IntLiteral() var literal = new IntValueNode(123); // act - var isOfType = uuidType.IsInstanceOfType(literal); + var isOfType = uuidType.IsValueCompatible(literal); // assert Assert.False(isOfType); @@ -53,7 +53,7 @@ public void IsInstanceOfType_Null() var uuidType = new UuidType(); // act - void Action() => uuidType.IsInstanceOfType(null!); + void Action() => uuidType.IsValueCompatible(null!); // assert Assert.Throws(Action); @@ -97,7 +97,7 @@ public void Serialize_Int() void Action() => uuidType.Serialize(value); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -168,8 +168,8 @@ public void ParseLiteral_StringValueNode() var literalB = new StringValueNode(expected.ToString("P")); // act - var runtimeValueA = (Guid)uuidType.ParseLiteral(literalA)!; - var runtimeValueB = (Guid)uuidType.ParseLiteral(literalB)!; + var runtimeValueA = (Guid)uuidType.CoerceInputLiteral(literalA)!; + var runtimeValueB = (Guid)uuidType.CoerceInputLiteral(literalB)!; // assert Assert.Equal(expected, runtimeValueA); @@ -185,10 +185,10 @@ public void ParseLiteral_StringValueNode_Enforce_Format() var literal = new StringValueNode(expected.ToString("N")); // act - void Action() => uuidType.ParseLiteral(literal); + void Action() => uuidType.CoerceInputLiteral(literal); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -199,10 +199,10 @@ public void ParseLiteral_IntValueNode() var literal = new IntValueNode(123); // act - void Action() => uuidType.ParseLiteral(literal); + void Action() => uuidType.CoerceInputLiteral(literal); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -213,7 +213,7 @@ public void ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = uuidType.ParseLiteral(literal); + var value = uuidType.CoerceInputLiteral(literal); // assert Assert.Null(value); @@ -226,7 +226,7 @@ public void ParseLiteral_Null() var uuidType = new UuidType(); // act - void Action() => uuidType.ParseLiteral(null!); + void Action() => uuidType.CoerceInputLiteral(null!); // assert Assert.Throws(Action); @@ -255,7 +255,7 @@ public void ParseValue_Null() Guid? guid = null; // act - var stringLiteral = uuidType.ParseValue(guid); + var stringLiteral = uuidType.CoerceInputValue(guid); // assert Assert.True(stringLiteral is NullValueNode); @@ -270,10 +270,10 @@ public void ParseValue_Int() const int value = 123; // act - void Action() => uuidType.ParseValue(value); + void Action() => uuidType.CoerceInputValue(value); // assert - Assert.Throws(Action); + Assert.Throws(Action); } [Fact] @@ -354,7 +354,7 @@ public void ParseLiteral_With_Format(char format) var literal = new StringValueNode(guid.ToString(format.ToString())); // act - var deserialized = (Guid)uuidType.ParseLiteral(literal)!; + var deserialized = (Guid)uuidType.CoerceInputLiteral(literal)!; // assert Assert.Equal(guid, deserialized); @@ -381,10 +381,10 @@ public void Parse_Guid_String_With_Appended_String(bool enforceFormat) var uuidType = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); // act - void Fail() => uuidType.ParseLiteral(input); + void Fail() => uuidType.CoerceInputLiteral(input); // assert - Assert.Throws(Fail); + Assert.Throws(Fail); } [InlineData(false)] @@ -397,7 +397,7 @@ public void Parse_Guid_Valid_Input(bool enforceFormat) var uuidType = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); // act - var guid = (Guid)uuidType.ParseLiteral(input)!; + var guid = (Guid)uuidType.CoerceInputLiteral(input)!; // assert Assert.Equal(input.Value, guid.ToString("D")); @@ -416,7 +416,7 @@ public void Deserialize_Guid_String_With_Appended_String(bool enforceFormat) void Fail() => uuidType.Deserialize(input); // assert - Assert.Throws(Fail); + Assert.Throws(Fail); } [InlineData(false)] @@ -445,7 +445,7 @@ public void IsInstanceOf_Guid_String_With_Appended_String(bool enforceFormat) var uuidType = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); // act - var result = uuidType.IsInstanceOfType(input); + var result = uuidType.IsValueCompatible(input); // assert Assert.False(result); @@ -461,7 +461,7 @@ public void IsInstanceOf_Guid_Valid_Format(bool enforceFormat) var uuidType = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); // act - var result = uuidType.IsInstanceOfType(input); + var result = uuidType.IsValueCompatible(input); // assert Assert.True(result); diff --git a/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs b/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs index de4191d1c72..36fac03e9f4 100644 --- a/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs +++ b/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs @@ -10,17 +10,17 @@ public InvalidScalar() { } - public override bool IsInstanceOfType(IValueNode literal) + public override bool IsValueCompatible(IValueNode literal) { return false; } - public override object? ParseLiteral(IValueNode valueSyntax) + public override object? CoerceInputLiteral(IValueNode valueSyntax) { throw new InvalidOperationException(); } - public override IValueNode ParseValue(object? value) + public override IValueNode CoerceInputValue(object? value) { throw new InvalidOperationException(); } diff --git a/src/HotChocolate/Data/src/Data/Sorting/SortEnumType.cs b/src/HotChocolate/Data/src/Data/Sorting/SortEnumType.cs index 866a6c301c5..e81bb1ed1d0 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/SortEnumType.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/SortEnumType.cs @@ -78,7 +78,7 @@ protected override bool TryCreateEnumValue( return null; } - throw new SerializationException( + throw new LeafCoercionException( string.Format( CultureInfo.InvariantCulture, DataResources.SortingEnumType_Cannot_ParseLiteral, diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs index 18f481ab633..e8bd71549c6 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs @@ -160,7 +160,7 @@ public bool IsAssignableFrom(ITypeDefinition type) } /// - public bool IsInstanceOfType(IValueNode value) + public bool IsValueCompatible(IValueNode value) { ArgumentNullException.ThrowIfNull(value); diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs index 96a5462d8f6..9afea311c87 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs @@ -1015,17 +1015,17 @@ public InternalScalarType() : base("InternalScalar") public override Type RuntimeType => typeof(string); - public override bool IsInstanceOfType(IValueNode valueSyntax) + public override bool IsValueCompatible(IValueNode valueSyntax) => valueSyntax is StringValueNode; - public override object? ParseLiteral(IValueNode valueSyntax) + public override object? CoerceInputLiteral(IValueNode valueSyntax) => valueSyntax is StringValueNode s ? s.Value : null; - public override IValueNode ParseValue(object? runtimeValue) + public override IValueNode CoerceInputValue(object? runtimeValue) => new StringValueNode(runtimeValue?.ToString() ?? ""); public override IValueNode ParseResult(object? resultValue) - => ParseValue(resultValue); + => CoerceInputValue(resultValue); public override bool TrySerialize(object? runtimeValue, out object? resultValue) { diff --git a/src/HotChocolate/MongoDb/src/Types/BsonType.cs b/src/HotChocolate/MongoDb/src/Types/BsonType.cs index b14c44e6d3e..c3a75b2b74a 100644 --- a/src/HotChocolate/MongoDb/src/Types/BsonType.cs +++ b/src/HotChocolate/MongoDb/src/Types/BsonType.cs @@ -44,7 +44,7 @@ public BsonType() public override Type RuntimeType => typeof(BsonValue); /// - public override bool IsInstanceOfType(IValueNode valueSyntax) + public override bool IsValueCompatible(IValueNode valueSyntax) { ArgumentNullException.ThrowIfNull(valueSyntax); @@ -115,13 +115,13 @@ when double.TryParse(fvn.Value, } /// - public override object? ParseLiteral(IValueNode valueSyntax) + public override object? CoerceInputLiteral(IValueNode valueSyntax) { return ParseLiteralToBson(valueSyntax); } /// - public override IValueNode ParseValue(object? runtimeValue) + public override IValueNode CoerceInputValue(object? runtimeValue) { if (runtimeValue is null) { @@ -175,7 +175,7 @@ public override IValueNode ParseValue(object? runtimeValue) List fields = []; foreach (var field in doc) { - fields.Add(new ObjectFieldNode(field.Name, ParseValue(field.Value))); + fields.Add(new ObjectFieldNode(field.Name, CoerceInputValue(field.Value))); } return new ObjectValueNode(fields); @@ -186,7 +186,7 @@ public override IValueNode ParseValue(object? runtimeValue) List valueList = []; foreach (var element in arr) { - valueList.Add(ParseValue(element)); + valueList.Add(CoerceInputValue(element)); } return new ListValueNode(valueList); @@ -207,7 +207,7 @@ public override IValueNode ParseValue(object? runtimeValue) /// public override IValueNode ParseResult(object? resultValue) => - ParseValue(resultValue); + CoerceInputValue(resultValue); public override bool TrySerialize(object? runtimeValue, out object? resultValue) { @@ -315,7 +315,7 @@ public override bool TrySerialize(object? runtimeValue, out object? resultValue) return false; case IValueNode literal: - resultValue = ParseLiteral(literal); + resultValue = CoerceInputLiteral(literal); return true; default: @@ -370,7 +370,7 @@ public override bool TryDeserialize(object? resultValue, out object? runtimeValu } case IValueNode literal: - runtimeValue = ParseLiteral(literal); + runtimeValue = CoerceInputLiteral(literal); return true; default: diff --git a/src/HotChocolate/MongoDb/src/Types/ObjectIdType.cs b/src/HotChocolate/MongoDb/src/Types/ObjectIdType.cs index af6e6bd4146..a7140839529 100644 --- a/src/HotChocolate/MongoDb/src/Types/ObjectIdType.cs +++ b/src/HotChocolate/MongoDb/src/Types/ObjectIdType.cs @@ -45,5 +45,5 @@ protected override StringValueNode ParseValue(ObjectId runtimeValue) => /// public override IValueNode ParseResult(object? resultValue) => - ParseValue(resultValue); + CoerceInputValue(resultValue); } diff --git a/src/HotChocolate/MongoDb/src/Types/ThrowHelper.cs b/src/HotChocolate/MongoDb/src/Types/ThrowHelper.cs index 8f7acfee534..94d980d69ad 100644 --- a/src/HotChocolate/MongoDb/src/Types/ThrowHelper.cs +++ b/src/HotChocolate/MongoDb/src/Types/ThrowHelper.cs @@ -7,7 +7,7 @@ namespace HotChocolate.Types.MongoDb; internal static class ThrowHelper { - public static SerializationException Bson_CouldNotParseValue( + public static LeafCoercionException Bson_CouldNotParseValue( ScalarType type, object? value) => new( @@ -17,7 +17,7 @@ public static SerializationException Bson_CouldNotParseValue( value?.ToString() ?? "null"), type); - public static SerializationException Bson_CouldNotParseLiteral( + public static LeafCoercionException Bson_CouldNotParseLiteral( ScalarType type, IValueNode literal) => new( diff --git a/src/HotChocolate/MongoDb/test/Types.MongoDb/BsonTypeTests.cs b/src/HotChocolate/MongoDb/test/Types.MongoDb/BsonTypeTests.cs index 8801f8b976a..e9b34419c7b 100644 --- a/src/HotChocolate/MongoDb/test/Types.MongoDb/BsonTypeTests.cs +++ b/src/HotChocolate/MongoDb/test/Types.MongoDb/BsonTypeTests.cs @@ -789,7 +789,7 @@ public void IsInstanceOfType_EnumValue_False() var type = schema.Types.GetType("Bson"); // act - var result = type.IsInstanceOfType(new EnumValueNode("foo")); + var result = type.IsValueCompatible(new EnumValueNode("foo")); // assert Assert.False(result); @@ -812,7 +812,7 @@ public void IsInstanceOfType_ObjectValue_True() var type = schema.Types.GetType("Bson"); // act - var result = type.IsInstanceOfType(new ObjectValueNode([])); + var result = type.IsValueCompatible(new ObjectValueNode([])); // assert Assert.True(result); @@ -835,7 +835,7 @@ public void IsInstanceOfType_ListValue_False() var type = schema.Types.GetType("Bson"); // act - var result = type.IsInstanceOfType(new ListValueNode([])); + var result = type.IsValueCompatible(new ListValueNode([])); // assert Assert.True(result); @@ -858,7 +858,7 @@ public void IsInstanceOfType_StringValue_False() var type = schema.Types.GetType("Bson"); // act - var result = type.IsInstanceOfType(new StringValueNode("foo")); + var result = type.IsValueCompatible(new StringValueNode("foo")); // assert Assert.True(result); @@ -881,7 +881,7 @@ public void IsInstanceOfType_IntValue_False() var type = schema.Types.GetType("Bson"); // act - var result = type.IsInstanceOfType(new IntValueNode(123)); + var result = type.IsValueCompatible(new IntValueNode(123)); // assert Assert.True(result); @@ -904,7 +904,7 @@ public void IsInstanceOfType_FloatValue_False() var type = schema.Types.GetType("Bson"); // act - var result = type.IsInstanceOfType(new FloatValueNode(1.2)); + var result = type.IsValueCompatible(new FloatValueNode(1.2)); // assert Assert.True(result); @@ -927,7 +927,7 @@ public void IsInstanceOfType_BooleanValue_False() var type = schema.Types.GetType("Bson"); // act - var result = type.IsInstanceOfType(new BooleanValueNode(true)); + var result = type.IsValueCompatible(new BooleanValueNode(true)); // assert Assert.True(result); @@ -950,7 +950,7 @@ public void IsInstanceOfType_NullValue_True() var type = schema.Types.GetType("Bson"); // act - var result = type.IsInstanceOfType(NullValueNode.Default); + var result = type.IsValueCompatible(NullValueNode.Default); // assert Assert.True(result); @@ -973,7 +973,7 @@ public void IsInstanceOfType_Null_ArgumentNullException() var type = schema.Types.GetType("Bson"); // act - void Action() => type.IsInstanceOfType(null!); + void Action() => type.IsValueCompatible(null!); // assert Assert.Throws(Action); @@ -1004,7 +1004,7 @@ public void ParseValue_ScalarValues(object value, Type expectedType) var type = schema.Types.GetType("Bson"); // act - var literal = type.ParseValue(value); + var literal = type.CoerceInputValue(value); // assert Assert.IsType(expectedType, literal); @@ -1027,7 +1027,7 @@ public void ParseValue_Decimal() var type = schema.Types.GetType("Bson"); // act - var literal = type.ParseValue((decimal)1); + var literal = type.CoerceInputValue((decimal)1); // assert Assert.IsType(literal); @@ -1050,7 +1050,7 @@ public void ParseValue_List_Of_Object() var type = schema.Types.GetType("Bson"); // act - var literal = type.ParseValue(new List()); + var literal = type.CoerceInputValue(new List()); // assert Assert.IsType(literal); @@ -1073,7 +1073,7 @@ public void ParseValue_List_Of_String() var type = schema.Types.GetType("Bson"); // act - var literal = type.ParseValue(new List()); + var literal = type.CoerceInputValue(new List()); // assert Assert.IsType(literal); @@ -1096,7 +1096,7 @@ public void ParseValue_List_Of_Foo() var type = schema.Types.GetType("Bson"); // act - var literal = type.ParseValue(new List()); + var literal = type.CoerceInputValue(new List()); // assert Assert.IsType(literal); @@ -1119,7 +1119,7 @@ public void ParseValue_Dictionary() var type = schema.Types.GetType("Bson"); // act - var literal = type.ParseValue( + var literal = type.CoerceInputValue( new Dictionary()); // assert diff --git a/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs b/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs index 04fa9ab327b..50fa30dc119 100644 --- a/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs +++ b/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs @@ -116,7 +116,7 @@ public Uri? SpecifiedBy public string? Pattern { get; set; } /// - public bool IsInstanceOfType(IValueNode value) + public bool IsValueCompatible(IValueNode value) { ArgumentNullException.ThrowIfNull(value); return true; diff --git a/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs b/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs index c6452462bee..905efa19c61 100644 --- a/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs +++ b/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs @@ -16,13 +16,13 @@ public GeoJsonCoordinatesType() : base(WellKnownTypeNames.CoordinatesTypeName) Description = Resources.GeoJsonCoordinatesScalar_Description; } - public override bool IsInstanceOfType(IValueNode valueSyntax) + public override bool IsValueCompatible(IValueNode valueSyntax) => GeoJsonCoordinatesSerializer.Default.IsInstanceOfType(this, valueSyntax); - public override object? ParseLiteral(IValueNode valueSyntax) + public override object? CoerceInputLiteral(IValueNode valueSyntax) => GeoJsonCoordinatesSerializer.Default.ParseLiteral(this, valueSyntax); - public override IValueNode ParseValue(object? value) + public override IValueNode CoerceInputValue(object? value) => GeoJsonCoordinatesSerializer.Default.ParseValue(this, value); public override IValueNode ParseResult(object? resultValue) @@ -31,6 +31,6 @@ public override IValueNode ParseResult(object? resultValue) public override bool TryDeserialize(object? serialized, out object? value) => GeoJsonCoordinatesSerializer.Default.TryDeserialize(this, serialized, out value); - public override bool TrySerialize(object? value, out object? serialized) + public override bool TryCoerceOutputValue(object? value, out object? serialized) => GeoJsonCoordinatesSerializer.Default.TrySerialize(this, value, out serialized); } diff --git a/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs b/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs index 0c87f7ef413..70ac6c1234f 100644 --- a/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs +++ b/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs @@ -21,13 +21,13 @@ public GeoJsonPositionType() : base(PositionTypeName) Description = Resources.GeoJsonPositionScalar_Description; } - public override bool IsInstanceOfType(IValueNode valueSyntax) + public override bool IsValueCompatible(IValueNode valueSyntax) => GeoJsonPositionSerializer.Default.IsInstanceOfType(this, valueSyntax); - public override object? ParseLiteral(IValueNode valueSyntax) + public override object? CoerceInputLiteral(IValueNode valueSyntax) => GeoJsonPositionSerializer.Default.ParseLiteral(this, valueSyntax); - public override IValueNode ParseValue(object? value) + public override IValueNode CoerceInputValue(object? value) => GeoJsonPositionSerializer.Default.ParseValue(this, value); public override IValueNode ParseResult(object? resultValue) @@ -36,6 +36,6 @@ public override IValueNode ParseResult(object? resultValue) public override bool TryDeserialize(object? serialized, out object? value) => GeoJsonPositionSerializer.Default.TryDeserialize(this, serialized, out value); - public override bool TrySerialize(object? value, out object? serialized) + public override bool TryCoerceOutputValue(object? value, out object? serialized) => GeoJsonPositionSerializer.Default.TrySerialize(this, value, out serialized); } diff --git a/src/HotChocolate/Spatial/src/Types/GeometryType.cs b/src/HotChocolate/Spatial/src/Types/GeometryType.cs index 624f6d7f6ec..cd8b2872b1c 100644 --- a/src/HotChocolate/Spatial/src/Types/GeometryType.cs +++ b/src/HotChocolate/Spatial/src/Types/GeometryType.cs @@ -26,19 +26,19 @@ public GeometryType() : base(GeometryTypeName) public override object? Deserialize(object? resultValue) => GeoJsonGeometrySerializer.Default.Deserialize(this, resultValue); - public override object? Serialize(object? runtimeValue) + public override object? CoerceOutputValue(object? runtimeValue) => GeoJsonGeometrySerializer.Default.Serialize(this, runtimeValue); - public override bool IsInstanceOfType(IValueNode valueSyntax) + public override bool IsValueCompatible(IValueNode valueSyntax) => GeoJsonGeometrySerializer.Default.IsInstanceOfType(this, valueSyntax); public override bool IsInstanceOfType(object? runtimeValue) => GeoJsonGeometrySerializer.Default.IsInstanceOfType(this, runtimeValue); - public override object? ParseLiteral(IValueNode valueSyntax) + public override object? CoerceInputLiteral(IValueNode valueSyntax) => GeoJsonGeometrySerializer.Default.ParseLiteral(this, valueSyntax); - public override IValueNode ParseValue(object? runtimeValue) + public override IValueNode CoerceInputValue(object? runtimeValue) => GeoJsonGeometrySerializer.Default.ParseValue(this, runtimeValue); public override IValueNode ParseResult(object? resultValue) diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/IGeoJsonSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/IGeoJsonSerializer.cs index 0466396da3f..d681532bd2b 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/IGeoJsonSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/IGeoJsonSerializer.cs @@ -48,7 +48,7 @@ internal interface IGeoJsonSerializer /// /// Returns a result value representation of this type. /// - /// + /// /// Unable to serialize the given . /// object? Serialize(IType type, object? runtimeValue); @@ -126,7 +126,7 @@ bool TrySerialize( /// /// Returns a GraphQL value syntax representation of the . /// - /// + /// /// Unable to parse the given /// into a GraphQL value syntax representation of this type. /// @@ -144,7 +144,7 @@ bool TrySerialize( /// /// Returns a GraphQL value syntax representation of the . /// - /// + /// /// Unable to parse the given /// into a GraphQL value syntax representation of this type. /// diff --git a/src/HotChocolate/Spatial/src/Types/ThrowHelper.cs b/src/HotChocolate/Spatial/src/Types/ThrowHelper.cs index 156172e6a6a..434ddbfa1be 100644 --- a/src/HotChocolate/Spatial/src/Types/ThrowHelper.cs +++ b/src/HotChocolate/Spatial/src/Types/ThrowHelper.cs @@ -6,108 +6,108 @@ namespace HotChocolate.Types.Spatial; internal static class ThrowHelper { - public static SerializationException CoordinatesScalar_InvalidCoordinatesObject(IType type) + public static LeafCoercionException CoordinatesScalar_InvalidCoordinatesObject(IType type) => new(Resources.CoordinatesScalar_InvalidCoordinatesObject, type); - public static SerializationException CoordinatesScalar_CoordinatesCannotBeNull(IType type) + public static LeafCoercionException CoordinatesScalar_CoordinatesCannotBeNull(IType type) => new(Resources.CoordinatesScalar_CoordinatesCannotBeNull, type); - public static SerializationException PositionScalar_InvalidPositionObject(IType type) + public static LeafCoercionException PositionScalar_InvalidPositionObject(IType type) => new(Resources.PositionScalar_InvalidPositionObject, type); - public static SerializationException PositionScalar_CoordinatesCannotBeNull(IType type) + public static LeafCoercionException PositionScalar_CoordinatesCannotBeNull(IType type) => new(Resources.PositionScalar_CoordinatesCannotBeNull, type); public static ArgumentException Resolver_Type_InvalidGeometryType() => new(Resources.Resolver_Type_InvalidGeometryType); - public static SerializationException Serializer_CouldNotSerialize(IType type) + public static LeafCoercionException Serializer_CouldNotSerialize(IType type) => new(Resources.Serializer_CouldNotSerialize, type); - public static SerializationException Serializer_CouldNotDeserialize(IType type) + public static LeafCoercionException Serializer_CouldNotDeserialize(IType type) => new(Resources.Serializer_CouldNotDeserialize, type); - public static SerializationException Serializer_Parse_TypeIsInvalid(IType type) + public static LeafCoercionException Serializer_Parse_TypeIsInvalid(IType type) => new(Resources.Serializer_Parse_TypeIsInvalid, type); - public static SerializationException Serializer_Parse_ValueKindInvalid( + public static LeafCoercionException Serializer_Parse_ValueKindInvalid( IType type, SyntaxKind syntaxKind) => new("Resources.Serializer_Parse_TypeIsInvalid", type); - public static SerializationException Serializer_CoordinatesIsMissing(IType type) + public static LeafCoercionException Serializer_CoordinatesIsMissing(IType type) => new(Resources.Serializer_Parse_CoordinatesIsMissing, type); - public static SerializationException Serializer_TypeIsMissing(IType type) + public static LeafCoercionException Serializer_TypeIsMissing(IType type) => new(Resources.Serializer_Parse_TypeIsMissing, type); - public static SerializationException Serializer_Parse_CoordinatesIsInvalid(IType type) + public static LeafCoercionException Serializer_Parse_CoordinatesIsInvalid(IType type) => new(Resources.Serializer_Parse_CoordinatesIsInvalid, type); - public static SerializationException Serializer_CouldNotParseLiteral(IType type) + public static LeafCoercionException Serializer_CouldNotParseLiteral(IType type) => new(Resources.Serializer_CouldNotParseLiteral, type); - public static SerializationException Serializer_CouldNotParseValue(IType type) + public static LeafCoercionException Serializer_CouldNotParseValue(IType type) => new(Resources.Serializer_CouldNotParseValue, type); - public static SerializationException Geometry_Deserialize_TypeIsUnknown( + public static LeafCoercionException Geometry_Deserialize_TypeIsUnknown( IType type, string typeName) => new(string.Format(Resources.Geometry_Deserialize_TypeIsUnknown, typeName), type); - public static SerializationException Geometry_Deserialize_TypeIsMissing(IType type) + public static LeafCoercionException Geometry_Deserialize_TypeIsMissing(IType type) => new(Resources.Geometry_Deserialize_TypeIsMissing, type); - public static SerializationException Geometry_Serialize_InvalidGeometryType( + public static LeafCoercionException Geometry_Serialize_InvalidGeometryType( IType type, Type runtimeType) => new( string.Format(Resources.Geometry_Serialize_InvalidGeometryType, runtimeType.Name), type); - public static SerializationException Geometry_Parse_InvalidGeometryType( + public static LeafCoercionException Geometry_Parse_InvalidGeometryType( IType type, Type runtimeType) => new( string.Format(Resources.Geometry_Parse_InvalidGeometryType, runtimeType.Name), type); - public static SerializationException Geometry_Serialize_TypeIsUnknown( + public static LeafCoercionException Geometry_Serialize_TypeIsUnknown( IType type, string typeName) => new( string.Format(Resources.Geometry_Serialize_TypeIsUnknown, typeName), type); - public static SerializationException Geometry_Parse_TypeIsUnknown( + public static LeafCoercionException Geometry_Parse_TypeIsUnknown( IType type, string typeName) => new( string.Format(Resources.Geometry_Parse_TypeIsUnknown, typeName), type); - public static SerializationException Geometry_Serializer_NotFound( + public static LeafCoercionException Geometry_Serializer_NotFound( IType type, GeoJsonGeometryType geometryType) => new( string.Format(Resources.Geometry_Serializer_NotFound, geometryType), type); - public static SerializationException Geometry_Serializer_NotFound( + public static LeafCoercionException Geometry_Serializer_NotFound( IType type, string geometryType) => new( string.Format(Resources.Geometry_Serializer_NotFound, geometryType), type); - public static SerializationException Geometry_Parse_InvalidGeometryKind( + public static LeafCoercionException Geometry_Parse_InvalidGeometryKind( IType type, string typeName) => new( string.Format(Resources.Geometry_Parse_InvalidGeometryKind, typeName), type); - public static SerializationException Geometry_Parse_InvalidType(IType type) + public static LeafCoercionException Geometry_Parse_InvalidType(IType type) => new(Resources.Geometry_Parse_InvalidType, type); public static GraphQLException Transformation_UnknownCRS(int srid) => @@ -130,7 +130,7 @@ public static GraphQLException Transformation_CoordinateMNotSupported() => .SetCode(ErrorCodes.Spatial.CoordinateMNotSupported) .Build()); - public static SerializationException Serializer_OperationIsNotSupported( + public static LeafCoercionException Serializer_OperationIsNotSupported( IType type, IGeoJsonSerializer serializer, string method) => diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringInputTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringInputTests.cs index 28974b8f354..fb8e5f20a9a 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringInputTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringInputTests.cs @@ -107,7 +107,7 @@ public void ParseLiteral_LineString_Is_Not_ObjectType_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -120,7 +120,7 @@ public void ParseLiteral_LineString_With_Missing_Fields_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("coordinates", _linestring), @@ -137,7 +137,7 @@ public void ParseLiteral_LineString_With_Empty_Coordinates_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode( @@ -156,7 +156,7 @@ public void ParseLiteral_LineString_With_Wrong_Geometry_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("type", new EnumValueNode("POLYGON")), diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs index 0ad354333e5..defc9c00b8b 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs @@ -65,7 +65,7 @@ public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName // act // assert - Assert.Throws(() => type.Serialize("")); + Assert.Throws(() => type.Serialize("")); } [Theory] @@ -170,7 +170,7 @@ public void ParseLiteral_Should_Throw_When_NotObjectValueNode(string typeName) // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -212,7 +212,7 @@ public void ParseLiteral_Should_Throw_When_NoGeometryType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } [Theory] @@ -229,7 +229,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } [Theory] @@ -309,7 +309,7 @@ public void ParseResult_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatResult("", type)); + Assert.Throws(() => inputFormatter.FormatResult("", type)); } [Theory] @@ -353,7 +353,7 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatValue("", type)); + Assert.Throws(() => inputFormatter.FormatValue("", type)); } [Theory] @@ -408,7 +408,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseResult("", type)); } [Theory] @@ -470,7 +470,7 @@ public void Deserialize_Should_Fail_When_TypeNameIsMissing(string typeName) // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseResult(serialized, type)); } @@ -490,7 +490,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseResult(serialized, type)); } @@ -512,7 +512,7 @@ public void LineString_IsCoordinateValid_Should_Fail_When_LessThanTwoPoint(strin // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(valueNode, type)); } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs index 4152ed8661c..e5b670ae97e 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs @@ -114,7 +114,7 @@ public void ParseLiteral_MultiLineString_Is_Not_ObjectType_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -127,7 +127,7 @@ public void ParseLiteral_MultiLineString_With_Missing_Fields_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("coordinates", _multiLinestring), @@ -144,7 +144,7 @@ public void ParseLiteral_MultiLineString_With_Empty_Coordinates_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode( @@ -163,7 +163,7 @@ public void ParseLiteral_MultiLineString_With_Wrong_Geometry_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("type", new EnumValueNode(GeoJsonGeometryType.Polygon)), diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs index d7878a18a2d..64d59708d7b 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs @@ -117,7 +117,7 @@ public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName // act // assert - Assert.Throws(() => type.Serialize("")); + Assert.Throws(() => type.Serialize("")); } [Theory] @@ -222,7 +222,7 @@ public void ParseLiteral_Should_Throw_When_NotObjectValueNode(string typeName) // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -264,7 +264,7 @@ public void ParseLiteral_Should_Throw_When_NoGeometryType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } [Theory] @@ -281,7 +281,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } [Theory] @@ -361,7 +361,7 @@ public void ParseResult_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatResult("", type)); + Assert.Throws(() => inputFormatter.FormatResult("", type)); } [Theory] @@ -420,7 +420,7 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatValue("", type)); + Assert.Throws(() => inputFormatter.FormatValue("", type)); } [Theory] @@ -475,7 +475,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseResult("", type)); } [Theory] @@ -540,7 +540,7 @@ public void Deserialize_Should_Fail_WhenTypeNameIsMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseResult(serialized, type)); } [Theory] @@ -560,7 +560,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseResult(serialized, type)); } [Theory] @@ -581,7 +581,7 @@ public void MultiLine_IsCoordinateValid_Should_Fail_When_Point(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } private static Schema CreateSchema() diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointInputTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointInputTests.cs index 3ab1d63cd81..2500d81a712 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointInputTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointInputTests.cs @@ -99,7 +99,7 @@ public void ParseLiteral_MultiPoint_Is_Not_ObjectType_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -112,7 +112,7 @@ public void ParseLiteral_MultiPoint_With_Missing_Fields_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("missingType", new StringValueNode("ignored")), @@ -129,7 +129,7 @@ public void ParseLiteral_MultiPoint_With_Empty_Coordinates_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("type", new EnumValueNode("MultiPoint")), @@ -146,7 +146,7 @@ public void ParseLiteral_MultiPoint_With_Wrong_Geometry_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("type", new EnumValueNode(GeoJsonGeometryType.Point)), diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs index 80cf73ca564..06db80d6f20 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs @@ -74,7 +74,7 @@ public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName // act // assert - Assert.Throws(() => type.Serialize("")); + Assert.Throws(() => type.Serialize("")); } [Theory] @@ -179,7 +179,7 @@ public void ParseLiteral_Should_Throw_When_NotObjectValueNode(string typeName) // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -221,7 +221,7 @@ public void ParseLiteral_Should_Throw_When_NoGeometryType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } [Theory] @@ -238,7 +238,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } [Theory] @@ -318,7 +318,7 @@ public void ParseResult_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatResult("", type)); + Assert.Throws(() => inputFormatter.FormatResult("", type)); } [Theory] @@ -362,7 +362,7 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatValue("", type)); + Assert.Throws(() => inputFormatter.FormatValue("", type)); } [Theory] @@ -421,7 +421,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseResult("", type)); } [Theory] @@ -483,7 +483,7 @@ public void Deserialize_Should_Fail_WhentypeNameIsMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseResult(serialized, type)); } [Theory] @@ -502,7 +502,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseResult(serialized, type)); } [Theory] @@ -522,7 +522,7 @@ public void MultiPoint_IsCoordinateValid_Should_Fail_When_Point(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } private Schema CreateSchema() => SchemaBuilder.New() diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonInputTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonInputTests.cs index 41ed24e3ad4..353815a51ca 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonInputTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonInputTests.cs @@ -123,7 +123,7 @@ public void ParseLiteral_MultiPolygon_Is_Not_ObjectType_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -136,7 +136,7 @@ public void ParseLiteral_MultiPolygon_With_Missing_Fields_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("coordinates", _multiPolygon), @@ -153,7 +153,7 @@ public void ParseLiteral_MultiPolygon_With_Empty_Coordinates_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("type", new EnumValueNode("MultiPolygon")), @@ -170,7 +170,7 @@ public void ParseLiteral_MultiPolygon_With_Wrong_Geometry_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("type", new EnumValueNode(GeoJsonGeometryType.Point)), diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs index 244270dec06..13c25a8b1c2 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs @@ -136,7 +136,7 @@ public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName // act // assert - Assert.Throws(() => type.Serialize("")); + Assert.Throws(() => type.Serialize("")); } [Theory] @@ -241,7 +241,7 @@ public void ParseLiteral_Should_Throw_When_NotObjectValueNode(string typeName) // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -282,7 +282,7 @@ public void ParseLiteral_Should_Throw_When_NoGeometryType(string typeName) var valueNode = new ObjectValueNode(coordField, crsField); // act - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(valueNode, type)); } @@ -299,7 +299,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) var valueNode = new ObjectValueNode(typeField, crsField); // act - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(valueNode, type)); } @@ -380,7 +380,7 @@ public void ParseResult_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatResult("", type)); + Assert.Throws(() => inputFormatter.FormatResult("", type)); } [Theory] @@ -439,7 +439,7 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatValue("", type)); + Assert.Throws(() => inputFormatter.FormatValue("", type)); } [Theory] @@ -494,7 +494,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseResult("", type)); } [Theory] @@ -556,7 +556,7 @@ public void Deserialize_Should_Fail_WhenTypeNameIsMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseResult(serialized, type)); } [Theory] @@ -575,7 +575,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseResult(serialized, type)); } [Theory] @@ -593,7 +593,7 @@ public void MultiPolygon_IsCoordinateValid_Should_Fail_When_Point(string typeNam // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } private Schema CreateSchema() => SchemaBuilder.New() diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointInputTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointInputTests.cs index 72cc94f379b..d2f5a9b14f7 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointInputTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointInputTests.cs @@ -42,7 +42,7 @@ public void ParseLiteral_Point_With_Valid_Coordinates_Scalar() var type = CreateScalarType(); // act - var result = type.ParseLiteral( + var result = type.CoerceInputLiteral( new ObjectValueNode( new ObjectFieldNode( "type", @@ -121,7 +121,7 @@ public void ParseLiteral_Point_Is_Not_ObjectType_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -134,7 +134,7 @@ public void ParseLiteral_Point_With_Missing_Fields_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("missingType", new StringValueNode("ignored")), @@ -151,7 +151,7 @@ public void ParseLiteral_Point_With_Empty_Coordinates_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("type", new EnumValueNode(GeoJsonGeometryType.Point)), @@ -168,7 +168,7 @@ public void ParseLiteral_Point_With_Wrong_Geometry_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("type", new EnumValueNode(GeoJsonGeometryType.Polygon)), diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs index c6c84bb6f47..200840b27bb 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs @@ -67,7 +67,7 @@ public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName // act // assert - Assert.Throws(() => type.Serialize("")); + Assert.Throws(() => type.Serialize("")); } [Theory] @@ -156,7 +156,7 @@ public void ParseLiteral_Should_Pass_When_NullValueNode(string typeName) // act // assert - Assert.Null(type.ParseLiteral(NullValueNode.Default)); + Assert.Null(type.CoerceInputLiteral(NullValueNode.Default)); } [Theory] @@ -170,7 +170,7 @@ public void ParseLiteral_Should_Throw_When_NotObjectValueNode(string typeName) // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -212,7 +212,7 @@ public void ParseLiteral_Should_Throw_When_NoGeometryType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } [Theory] @@ -229,7 +229,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } [Theory] @@ -309,7 +309,7 @@ public void ParseResult_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatResult("", type)); + Assert.Throws(() => inputFormatter.FormatResult("", type)); } [Theory] @@ -368,7 +368,7 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatValue("", type)); + Assert.Throws(() => inputFormatter.FormatValue("", type)); } [Theory] @@ -427,7 +427,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseResult("", type)); } [Theory] @@ -489,7 +489,7 @@ public void Deserialize_Should_Fail_WhenTypeNameIsMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseResult(serialized, type)); } [Theory] @@ -508,7 +508,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseResult(serialized, type)); } [Theory] @@ -529,7 +529,7 @@ public void Point_IsCoordinateValid_Should_Fail_When_MultiArray(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } private Schema CreateSchema() => SchemaBuilder.New() diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonInputTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonInputTests.cs index 90c63689c3e..13d82d28498 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonInputTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonInputTests.cs @@ -108,7 +108,7 @@ public void ParseLiteral_Polygon_Is_Not_ObjectType_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -121,7 +121,7 @@ public void ParseLiteral_Polygon_With_Missing_Fields_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("coordinates", _polygon), @@ -138,7 +138,7 @@ public void ParseLiteral_Polygon_With_Empty_Coordinates_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("type", new EnumValueNode(GeoJsonGeometryType.Polygon)), @@ -155,7 +155,7 @@ public void ParseLiteral_Polygon_With_Wrong_Geometry_Type_Throws() // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode("type", new EnumValueNode(GeoJsonGeometryType.Point)), diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs index 5e0a951a520..4e98e1bf73c 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs @@ -115,7 +115,7 @@ public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName // act // assert - Assert.Throws(() => type.Serialize("")); + Assert.Throws(() => type.Serialize("")); } [Theory] @@ -222,7 +222,7 @@ public void ParseLiteral_Should_Throw_When_NotObjectValueNode(string typeName) // act // assert - Assert.Throws( + Assert.Throws( () => inputParser.ParseLiteral(new ListValueNode(), type)); } @@ -264,7 +264,7 @@ public void ParseLiteral_Should_Throw_When_NoGeometryType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } [Theory] @@ -281,7 +281,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } [Theory] @@ -362,7 +362,7 @@ public void ParseResult_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatResult("", type)); + Assert.Throws(() => inputFormatter.FormatResult("", type)); } [Theory] @@ -421,7 +421,7 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputFormatter.FormatValue("", type)); + Assert.Throws(() => inputFormatter.FormatValue("", type)); } [Theory] @@ -480,7 +480,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseResult("", type)); } [Theory] @@ -542,7 +542,7 @@ public void Deserialize_Should_Fail_WhentypeNameIsMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseResult(serialized, type)); } [Theory] @@ -561,7 +561,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseResult(serialized, type)); } [Theory] @@ -581,7 +581,7 @@ public void Polygon_IsCoordinateValid_Should_Fail_When_Point(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); + Assert.Throws(() => inputParser.ParseLiteral(valueNode, type)); } private Schema CreateSchema() => SchemaBuilder.New() diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPositionScalarTest.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPositionScalarTest.cs index 0980816d916..1ebd3055694 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPositionScalarTest.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPositionScalarTest.cs @@ -15,7 +15,7 @@ public void IsInstanceOfType_Valid2ElementCoordinate_True() new FloatValueNode(1.2)); // act - bool? result = type.IsInstanceOfType(coordinate); + bool? result = type.IsValueCompatible(coordinate); // assert Assert.True(result); @@ -32,7 +32,7 @@ public void IsInstanceOfType_Valid3ElementCoordinate_True() new FloatValueNode(3.2)); // act - bool? result = type.IsInstanceOfType(coordinate); + bool? result = type.IsValueCompatible(coordinate); // assert Assert.True(result); @@ -46,7 +46,7 @@ public void IsInstanceOfType_NullType_True() var coordinate = NullValueNode.Default; // act - bool? result = type.IsInstanceOfType(coordinate); + bool? result = type.IsValueCompatible(coordinate); // assert Assert.True(result); @@ -62,7 +62,7 @@ public void IsInstanceOfType_Invalid2ElementCoordinate_False() new FloatValueNode(1.2)); // act - bool? result = type.IsInstanceOfType(coordinate); + bool? result = type.IsValueCompatible(coordinate); // assert Assert.False(result); @@ -79,7 +79,7 @@ public void IsInstanceOfType_Invalid3ElementCoordinate_False() new StringValueNode("2")); // act - bool? result = type.IsInstanceOfType(coordinate); + bool? result = type.IsValueCompatible(coordinate); // assert Assert.False(result); @@ -96,7 +96,7 @@ public void IsInstanceOfType_List2ElementCoordinate_False() new FloatValueNode(1.2))); // act - var result = type.IsInstanceOfType(coordinate); + var result = type.IsValueCompatible(coordinate); // assert Assert.False(result); @@ -116,7 +116,7 @@ public void IsInstanceOfType_2ListElementCoordinate_False() new FloatValueNode(1.2))); // act - var result = type.IsInstanceOfType(coordinate); + var result = type.IsValueCompatible(coordinate); // assert Assert.False(result); @@ -132,7 +132,7 @@ public void IsInstanceOfType_Invalid4ElementCoordinate_False() new IntValueNode(3), new IntValueNode(4)); - bool? result = type.IsInstanceOfType(coordinate); + bool? result = type.IsValueCompatible(coordinate); Assert.False(result); } @@ -143,7 +143,7 @@ public void ParseLiteral_Null_Throws() var type = new GeoJsonPositionType(); IValueNode? coordinate = null; - Assert.Throws(() => type.ParseLiteral(coordinate!)); + Assert.Throws(() => type.CoerceInputLiteral(coordinate!)); } [Fact] @@ -152,7 +152,7 @@ public void ParseLiteral_NullType_Null() var type = new GeoJsonPositionType(); var coordinate = NullValueNode.Default; - var result = type.ParseLiteral(coordinate); + var result = type.CoerceInputLiteral(coordinate); Assert.Null(result); } @@ -166,7 +166,7 @@ public void ParseLiteral_With_2Valid_Coordinates() new IntValueNode(2) ); - var result = type.ParseLiteral(coordinate); + var result = type.CoerceInputLiteral(coordinate); Assert.Equal(1.0, Assert.IsType(result).X); Assert.Equal(2, Assert.IsType(result).Y); @@ -182,7 +182,7 @@ public void ParseLiteral_With_3Valid_Coordinates() new IntValueNode(100) ); - var result = type.ParseLiteral(coordinate); + var result = type.CoerceInputLiteral(coordinate); Assert.Equal(1.0, Assert.IsType(result).X); Assert.Equal(2.2, Assert.IsType(result).Y); @@ -198,7 +198,7 @@ public void ParseLiteral_With_2Invalid_Coordinates_Throws() new StringValueNode("2.2") ); - Assert.Throws(() => type.ParseLiteral(coordinate)); + Assert.Throws(() => type.CoerceInputLiteral(coordinate)); } [Fact] @@ -211,7 +211,7 @@ public void ParseLiteral_With_3Invalid_Coordinates_Throws() new StringValueNode("2.2") ); - Assert.Throws(() => type.ParseLiteral(coordinate)); + Assert.Throws(() => type.CoerceInputLiteral(coordinate)); } [Fact] @@ -220,7 +220,7 @@ public void ParseLiteral_With_Invalid_Coordinates_Throws() var type = new GeoJsonPositionType(); var coordinate = new StringValueNode("2.2"); - Assert.Throws(() => type.ParseLiteral(coordinate)); + Assert.Throws(() => type.CoerceInputLiteral(coordinate)); } [Fact] @@ -229,7 +229,7 @@ public void ParseValue_With_Noncoordinate_Throws() var type = new GeoJsonPositionType(); const string item = "this is not a coordinate"; - Assert.Throws(() => type.ParseValue(item)); + Assert.Throws(() => type.CoerceInputValue(item)); } [Fact] @@ -419,7 +419,7 @@ public void TrySerialize_With_Invalid_Object() var type = new GeoJsonPositionType(); const string input = "not a coordinate"; - var result = type.TrySerialize(input, out var value); + var result = type.TryCoerceOutputValue(input, out var value); Assert.False(result); Assert.Null(value); @@ -431,7 +431,7 @@ public void TrySerialize_With_Valid_2dCoordinate() var type = new GeoJsonPositionType(); var input = new Coordinate(1, 2); - var result = type.TrySerialize(input, out var value); + var result = type.TryCoerceOutputValue(input, out var value); Assert.True(result); Assert.Equal(2, Assert.IsType(value).Length); @@ -444,7 +444,7 @@ public void TrySerialize_With_Valid_3dCoordinate() var type = new GeoJsonPositionType(); var input = new CoordinateZ(1, 2, 100); - var result = type.TrySerialize(input, out var value); + var result = type.TryCoerceOutputValue(input, out var value); Assert.True(result); Assert.Equal(3, Assert.IsType(value).Length); @@ -457,7 +457,7 @@ public void TrySerialize_With_Nan_3dCoordinate() var type = new GeoJsonPositionType(); var input = new CoordinateZ(1, 2, double.NaN); - var result = type.TrySerialize(input, out var value); + var result = type.TryCoerceOutputValue(input, out var value); Assert.True(result); Assert.Equal(2, Assert.IsType(value).Length); diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonTypeSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonTypeSerializerTests.cs index 3e01b50b168..6ef69a02e33 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonTypeSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonTypeSerializerTests.cs @@ -232,7 +232,7 @@ public void ParseValue_Should_Throw_OnInvalidValue() // act // assert - Assert.Throws( + Assert.Throws( () => serializer.ParseValue(type.Object, "")); } @@ -324,7 +324,7 @@ public void ParseResult_Should_Throw_OnInvalidValue() // act // assert - Assert.Throws( + Assert.Throws( () => serializer.ParseResult(type.Object, "")); } From 99527c8bf980583b4e9d7f991abee0615fbf3fd8 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 19 Dec 2025 14:06:04 +0100 Subject: [PATCH 043/144] Refactor scalar type handling and remove deprecated interfaces - Removed the IHasRuntimeType interface and replaced its usage with IRuntimeTypeProvider. - Updated RegisteredType to implement IRuntimeTypeProvider instead of IHasRuntimeType. - Changed method signatures in ILeafType and ScalarType to enforce non-nullable runtime values. - Refactored coercion methods in scalar types to return non-nullable types. - Removed SpecScalarAttribute as it is no longer needed. - Updated error handling in ThrowHelper for scalar coercion exceptions. - Cleaned up unused resources and improved code consistency across scalar types. --- .../src/Abstractions/Types/IHasRuntimeType.cs | 15 -- .../Types/ITypeDefinition.cs | 1 + .../src/Types/Configuration/RegisteredType.cs | 4 +- .../Processing/ValueCompletion.Leaf.cs | 4 +- .../Properties/TypeResources.Designer.cs | 6 - .../src/Types/Properties/TypeResources.resx | 3 - .../Properties/TypeResourcesExtensions.cs | 44 ++---- .../src/Types/Types/Contracts/ILeafType.cs | 33 +++-- .../src/Types/Types/Scalars/BooleanType.cs | 14 +- .../src/Types/Types/Scalars/ByteArrayType.cs | 122 +++++++++------- .../Core/src/Types/Types/Scalars/ByteType.cs | 17 ++- .../src/Types/Types/Scalars/DateTimeType.cs | 130 ++++-------------- .../Core/src/Types/Types/Scalars/DateType.cs | 85 +++--------- .../Scalars/ScalarType.Initialization.cs | 4 +- .../src/Types/Types/Scalars/ScalarType.cs | 31 ++--- .../src/Types/Types/Scalars/ScalarType~1.cs | 46 ++----- .../src/Types/Types/Scalars/ScalarType~2.cs | 55 ++------ .../Types/Scalars/SpecScalarAttribute.cs | 8 -- .../Core/src/Types/Utilities/ThrowHelper.cs | 45 ++++++ 19 files changed, 264 insertions(+), 403 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Abstractions/Types/IHasRuntimeType.cs delete mode 100644 src/HotChocolate/Core/src/Types/Types/Scalars/SpecScalarAttribute.cs diff --git a/src/HotChocolate/Core/src/Abstractions/Types/IHasRuntimeType.cs b/src/HotChocolate/Core/src/Abstractions/Types/IHasRuntimeType.cs deleted file mode 100644 index f3b893db3c1..00000000000 --- a/src/HotChocolate/Core/src/Abstractions/Types/IHasRuntimeType.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace HotChocolate.Types; - -/// -/// The implementor of this interface exposes the type it will have -/// at runtime when manifested in the execution engine. -/// -public interface IHasRuntimeType -{ - /// - /// Gets the runtime type. - /// The runtime type defines of which value the type is when it - /// manifests in the execution engine. - /// - Type RuntimeType { get; } -} diff --git a/src/HotChocolate/Core/src/Types.Abstractions/Types/ITypeDefinition.cs b/src/HotChocolate/Core/src/Types.Abstractions/Types/ITypeDefinition.cs index a76ac150cec..63f0a8980ae 100644 --- a/src/HotChocolate/Core/src/Types.Abstractions/Types/ITypeDefinition.cs +++ b/src/HotChocolate/Core/src/Types.Abstractions/Types/ITypeDefinition.cs @@ -13,6 +13,7 @@ public interface ITypeDefinition , IFeatureProvider , ISyntaxNodeProvider , ISchemaCoordinateProvider + , IRuntimeTypeProvider { /// /// Specifies if this type is an introspection type. diff --git a/src/HotChocolate/Core/src/Types/Configuration/RegisteredType.cs b/src/HotChocolate/Core/src/Types/Configuration/RegisteredType.cs index 6d09be30075..17a8533340e 100644 --- a/src/HotChocolate/Core/src/Types/Configuration/RegisteredType.cs +++ b/src/HotChocolate/Core/src/Types/Configuration/RegisteredType.cs @@ -4,7 +4,7 @@ namespace HotChocolate.Configuration; -internal sealed partial class RegisteredType : IHasRuntimeType +internal sealed partial class RegisteredType : IRuntimeTypeProvider { private readonly TypeRegistry _typeRegistry; private readonly TypeLookup _typeLookup; @@ -47,7 +47,7 @@ public RegisteredType( public TypeKind? Kind { get; } public Type RuntimeType - => Type is IHasRuntimeType hasClrType + => Type is IRuntimeTypeProvider hasClrType ? hasClrType.RuntimeType : typeof(object); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs index b314d6a3139..9022d505adc 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.Leaf.cs @@ -12,14 +12,14 @@ private static void CompleteLeafValue( Selection selection, ILeafType type, ResultElement resultValue, - object? runtimeValue) + object runtimeValue) { var operationContext = context.OperationContext; var resolverContext = context.ResolverContext; try { - var runtimeType = type.ToRuntimeType(); + var runtimeType = type.RuntimeType; if (!runtimeType.IsInstanceOfType(runtimeValue) && operationContext.Converter.TryConvert(runtimeType, runtimeValue, out var c)) diff --git a/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs index df986f14505..834995fdfd2 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs @@ -534,12 +534,6 @@ internal static string ResolverTypeBindingBuilder_FieldNotComplete { } } - internal static string Scalar_Cannot_Deserialize { - get { - return ResourceManager.GetString("Scalar_Cannot_Deserialize", resourceCulture); - } - } - internal static string Scalar_Cannot_CoerceInputLiteral { get { return ResourceManager.GetString("Scalar_Cannot_CoerceInputLiteral", resourceCulture); diff --git a/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx b/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx index e81860474d7..4b784593809 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx +++ b/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx @@ -263,9 +263,6 @@ In some cases, you need to provide options to alter GraphQL's execution behavior The field binding builder is not completed and cannot be added. - - {0} cannot deserialize the given value. - {0} cannot parse the given literal of type `{1}`. diff --git a/src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs b/src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs index f7a043adb79..91802ef3789 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs @@ -1,26 +1,31 @@ using System.Globalization; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Types; namespace HotChocolate.Properties; internal static class TypeResourceHelper { - public static string Scalar_Cannot_ConvertValueToLiteral(Type actualType, string actualValue) + public static string Scalar_Cannot_CoerceInputLiteral(ScalarType scalarType, IValueNode valueLiteral) { return string.Format( CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_Deserialize, - typeName); + TypeResources.Scalar_Cannot_CoerceInputLiteral, + typeName, + literalType.Name); } - public static string Scalar_Cannot_Serialize(string typeName) + public static string Scalar_Cannot_CoerceInputValue(ScalarType scalarType, JsonElement inputValue) { return string.Format( CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_Serialize, - typeName); + TypeResources.Scalar_Cannot_CoerceInputValue, + typeName, + valueKind); } - public static string Scalar_Cannot_Deserialize(string typeName) + public static string Scalar_Cannot_ConvertValueToLiteral(ScalarType scalarType, object runtimeValue) { return string.Format( CultureInfo.InvariantCulture, @@ -28,31 +33,12 @@ public static string Scalar_Cannot_Deserialize(string typeName) typeName); } - public static string Scalar_Cannot_CoerceInputLiteral(string typeName, Type literalType) - { - return string.Format( - CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_CoerceInputLiteral, - typeName, - literalType.Name); - } - - public static string Scalar_Cannot_CoerceInputValue(string typeName, Type valueType) - { - return string.Format( - CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_CoerceInputValue, - typeName, - valueType.FullName); - } - - public static string Scalar_Cannot_ParseResult(string typeName, Type valueType) + public static string Scalar_Cannot_CoerceOutputValue(ScalarType scalarType, object runtimeValue) { return string.Format( CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_CoerceInputValue, - typeName, - valueType.FullName); + TypeResources.Scalar_Cannot_Serialize, + typeName); } public static string Type_Name_IsNotValid(string typeName) diff --git a/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs b/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs index 41bedd1dd3c..861c7114c22 100644 --- a/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs @@ -19,6 +19,9 @@ public interface ILeafType : IInputTypeDefinition, IOutputTypeDefinition /// /// true if the given is compatible with this type. /// + /// + /// is null. + /// bool IsValueCompatible(IValueNode valueLiteral); /// @@ -36,12 +39,15 @@ public interface ILeafType : IInputTypeDefinition, IOutputTypeDefinition /// Determines if the given is an instance of this type. /// /// - /// The runtime value to validate. + /// The runtime value to validate. Must not be null. /// /// /// true if the given is an instance of this type. /// - bool IsInstanceOfType(object? runtimeValue); + /// + /// is null. + /// + bool IsInstanceOfType(object runtimeValue); /// /// Coerces a GraphQL literal (AST value node) into a runtime value. @@ -52,10 +58,13 @@ public interface ILeafType : IInputTypeDefinition, IOutputTypeDefinition /// /// Returns the runtime value representation. /// + /// + /// is null. + /// /// /// Unable to coerce the given into a runtime value. /// - object? CoerceInputLiteral(IValueNode valueLiteral); + object CoerceInputLiteral(IValueNode valueLiteral); /// /// Coerces an external input value (deserialized JSON) into a runtime value. @@ -69,35 +78,43 @@ public interface ILeafType : IInputTypeDefinition, IOutputTypeDefinition /// /// Unable to coerce the given into a runtime value. /// - object? CoerceInputValue(JsonElement inputValue); + object CoerceInputValue(JsonElement inputValue); /// /// Coerces a runtime value into an external output representation /// and writes it to the result. /// /// - /// The runtime value to coerce. + /// The runtime value to coerce. Must not be null; null handling + /// is the responsibility of the caller. /// /// /// The result element to write the output value to. /// + /// + /// is null. + /// /// /// Unable to coerce the given into an output value. /// - void CoerceOutputValue(object? runtimeValue, ResultElement resultValue); + void CoerceOutputValue(object runtimeValue, ResultElement resultValue); /// /// Converts a runtime value into a GraphQL literal (AST value node). /// Used for default value representation in SDL and introspection. /// /// - /// The runtime value to convert. + /// The runtime value to convert. Must not be null; null handling + /// is the responsibility of the caller. /// /// /// Returns a GraphQL literal representation of the runtime value. /// + /// + /// is null. + /// /// /// Unable to convert the given into a literal. /// - IValueNode ValueToLiteral(object? runtimeValue); + IValueNode ValueToLiteral(object runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs index bce932a27df..e853957cd81 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs @@ -13,7 +13,6 @@ namespace HotChocolate.Types; /// https://spec.graphql.org/September2025/#sec-Boolean /// /// -[SpecScalar] public class BooleanType : ScalarType { /// @@ -40,16 +39,15 @@ public BooleanType() { } - public override object? CoerceInputLiteral(BooleanValueNode valueLiteral) + /// + public override object CoerceInputLiteral(BooleanValueNode valueLiteral) => valueLiteral.Value; - public override object? CoerceInputValue(JsonElement inputValue) + /// + public override object CoerceInputValue(JsonElement inputValue) { switch (inputValue.ValueKind) { - case JsonValueKind.Null: - return null; - case JsonValueKind.True: return true; @@ -58,14 +56,16 @@ public BooleanType() default: throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ParseValue(Name, inputValue.ValueKind.ToString()), + TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, inputValue.ValueKind), this); } } + /// public override void CoerceOutputValue(bool runtimeValue, ResultElement resultValue) => resultValue.SetBooleanValue(runtimeValue); + /// public override IValueNode ValueToLiteral(bool runtimeValue) => runtimeValue ? BooleanValueNode.True : BooleanValueNode.False; } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs index 7c2da01cb89..a7e59c8a242 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs @@ -1,5 +1,11 @@ +using System.Buffers; +using System.Buffers.Text; +using System.Runtime.InteropServices; +using System.Text.Json; +using HotChocolate.Buffers; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; namespace HotChocolate.Types; @@ -19,7 +25,6 @@ public ByteArrayType( : base(name, bind) { Description = description; - SerializationType = ScalarSerializationType.String; Pattern = @"^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$"; } @@ -32,77 +37,102 @@ public ByteArrayType() { } - protected override byte[] ParseLiteral(StringValueNode valueSyntax) + public override object CoerceInputLiteral(StringValueNode valueLiteral) { - return Convert.FromBase64String(valueSyntax.Value); - } - - protected override StringValueNode ParseValue(byte[] runtimeValue) - { - return new(Convert.ToBase64String(runtimeValue)); - } + byte[]? rented = null; + var valueSpan = valueLiteral.AsSpan(); + var length = Base64.GetMaxDecodedFromUtf8Length(valueSpan.Length); + var buffer = length <= 256 ? stackalloc byte[length] : rented = ArrayPool.Shared.Rent(length); - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) + try { - return NullValueNode.Default; + Base64.DecodeFromUtf8(valueSpan, buffer, out _, out var bytesWritten); + return buffer[..bytesWritten].ToArray(); } - - if (resultValue is string s) + finally { - return new StringValueNode(s); + if (rented is not null) + { + ArrayPool.Shared.Return(rented); + } } + } - if (resultValue is byte[] b) + public override object CoerceInputValue(JsonElement inputValue) + { + if (inputValue.ValueKind == JsonValueKind.String) { - return ParseValue(b); + byte[]? rented = null; + var valueSpan = JsonMarshal.GetRawUtf8Value(inputValue); + var length = Base64.GetMaxDecodedFromUtf8Length(valueSpan.Length); + var buffer = length <= 256 ? stackalloc byte[length] : rented = ArrayPool.Shared.Rent(length); + + try + { + Base64.DecodeFromUtf8(valueSpan, buffer, out _, out var bytesWritten); + return buffer[..bytesWritten].ToArray(); + } + finally + { + if (rented is not null) + { + ArrayPool.Shared.Return(rented); + } + } } throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), + TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, inputValue.ValueKind), this); } - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + public override void CoerceOutputValue(byte[] runtimeValue, ResultElement resultValue) { - if (runtimeValue is null) + byte[]? rented = null; + var length = Base64.GetMaxEncodedToUtf8Length(runtimeValue.Length); + var buffer = length <= 256 ? stackalloc byte[length] : rented = ArrayPool.Shared.Rent(length); + + try { - resultValue = null; - return true; + Base64.EncodeToUtf8( + runtimeValue, + buffer, + out _, + out var bytesWritten); + resultValue.SetStringValue(buffer[..bytesWritten]); } - - if (runtimeValue is byte[] b) + finally { - resultValue = Convert.ToBase64String(b); - return true; + if (rented is not null) + { + ArrayPool.Shared.Return(rented); + } } - - resultValue = null; - return false; } - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + public override IValueNode ValueToLiteral(byte[] runtimeValue) { - if (resultValue is null) - { - runtimeValue = null; - return true; - } + byte[]? rented = null; + var length = Base64.GetMaxEncodedToUtf8Length(runtimeValue.Length); + var buffer = length <= 256 ? stackalloc byte[length] : rented = ArrayPool.Shared.Rent(length); - if (resultValue is string s) + try { - runtimeValue = Convert.FromBase64String(s); - return true; + Base64.EncodeToUtf8( + runtimeValue, + buffer, + out _, + out var bytesWritten); + var encodedBuffer = buffer[..bytesWritten].ToArray(); + var segment = new ReadOnlyMemorySegment(encodedBuffer); + return new StringValueNode(null, segment, false); } - - if (resultValue is byte[] b) + finally { - runtimeValue = b; - return true; + if (rented is not null) + { + ArrayPool.Shared.Return(rented); + } } - - runtimeValue = null; - return false; } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs index 89803561ff8..9139fb4771a 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs @@ -1,5 +1,7 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; namespace HotChocolate.Types; @@ -34,7 +36,6 @@ public ByteType( : base(name, min, max, bind) { Description = description; - SerializationType = ScalarSerializationType.Int; } /// @@ -46,9 +47,15 @@ public ByteType() { } - protected override byte ParseLiteral(IntValueNode valueSyntax) => - valueSyntax.ToByte(); + public override object CoerceInputLiteral(IntValueNode valueLiteral) + => valueLiteral.ToByte(); - protected override IntValueNode ParseValue(byte runtimeValue) => - new(runtimeValue); + public override object CoerceInputValue(JsonElement inputValue) + => inputValue.GetByte(); + + public override void CoerceOutputValue(byte runtimeValue, ResultElement resultValue) + => resultValue.SetNumberValue(runtimeValue); + + public override IValueNode ValueToLiteral(byte runtimeValue) + => new IntValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs index 5bb6157af90..9dd458bc785 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs @@ -1,8 +1,9 @@ -using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Text.Json; using System.Text.RegularExpressions; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; namespace HotChocolate.Types; @@ -41,7 +42,6 @@ public DateTimeType( : base(name, bind) { Description = description; - SerializationType = ScalarSerializationType.String; Pattern = @"^\d{4}-\d{2}-\d{2}[Tt]\d{2}:\d{2}:\d{2}(?:\.\d{1,7})?(?:[Zz]|[+-]\d{2}:\d{2})$"; SpecifiedBy = new Uri(SpecifiedByUri); _enforceSpecFormat = !disableFormatCheck; @@ -72,134 +72,60 @@ public DateTimeType() { } - protected override DateTimeOffset ParseLiteral(StringValueNode valueSyntax) + public override object CoerceInputLiteral(StringValueNode valueLiteral) { - if (TryDeserializeFromString(valueSyntax.Value, out var value)) + if (TryParseStringValue(valueLiteral.Value, out var value)) { - return value.Value; + return value; } throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueLiteral.GetType()), this); } - protected override StringValueNode ParseValue(DateTimeOffset runtimeValue) + public override object CoerceInputValue(JsonElement inputValue) { - return new(Serialize(runtimeValue)); - } - - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is string s) - { - return new StringValueNode(s); - } - - if (resultValue is DateTimeOffset d) - { - return ParseValue(d); - } - - if (resultValue is DateTime dt) + if (TryParseStringValue(inputValue.GetString()!, out var value)) { - return ParseValue(new DateTimeOffset(dt.ToUniversalTime(), TimeSpan.Zero)); + return value; } throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), + TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, inputValue.ValueKind), this); } - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + public override void CoerceOutputValue(DateTimeOffset runtimeValue, ResultElement resultValue) { - if (runtimeValue is null) + if (runtimeValue.Offset == TimeSpan.Zero) { - resultValue = null; - return true; + resultValue.SetStringValue(runtimeValue.ToString(UtcFormat, CultureInfo.InvariantCulture)); } - - if (runtimeValue is DateTimeOffset dt) + else { - resultValue = Serialize(dt); - return true; + resultValue.SetStringValue(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); } - - if (runtimeValue is DateTime d) - { - resultValue = Serialize(new DateTimeOffset(d.ToUniversalTime(), TimeSpan.Zero)); - return true; - } - - resultValue = null; - return false; } - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + public override IValueNode ValueToLiteral(DateTimeOffset runtimeValue) { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is string s && TryDeserializeFromString(s, out var d)) - { - runtimeValue = d; - return true; - } - - if (resultValue is DateTimeOffset) - { - runtimeValue = resultValue; - return true; - } - - if (resultValue is DateTime dt) + if (runtimeValue.Offset == TimeSpan.Zero) { - runtimeValue = new DateTimeOffset( - dt.ToUniversalTime(), - TimeSpan.Zero); - return true; + return new StringValueNode(runtimeValue.ToString(UtcFormat, CultureInfo.InvariantCulture)); } - - runtimeValue = null; - return false; - } - - private static string Serialize(DateTimeOffset value) - { - if (value.Offset == TimeSpan.Zero) + else { - return value.ToString( - UtcFormat, - CultureInfo.InvariantCulture); + return new StringValueNode(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); } - - return value.ToString( - LocalFormat, - CultureInfo.InvariantCulture); } - private bool TryDeserializeFromString( - string? serialized, - [NotNullWhen(true)] out DateTimeOffset? value) + private bool TryParseStringValue(string serialized, out DateTimeOffset runtimeValue) { - if (serialized is null) - { - value = null; - return false; - } - // Check format. if (_enforceSpecFormat && !s_dateTimeScalarRegex.IsMatch(serialized)) { - value = null; + runtimeValue = default; return false; } @@ -207,21 +133,17 @@ private bool TryDeserializeFromString( // https://scalars.graphql.org/andimarek/date-time.html#sec-Overview.No-Unknown-Local-Offset-Convention- if (serialized.EndsWith("-00:00")) { - value = null; + runtimeValue = default; return false; } - if (DateTimeOffset.TryParse( - serialized, - CultureInfo.InvariantCulture, - DateTimeStyles.None, - out var dt)) + if (DateTimeOffset.TryParse(serialized, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt)) { - value = dt; + runtimeValue = dt; return true; } - value = null; + runtimeValue = default; return false; } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs index 8554dcef57a..01b649a58f5 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs @@ -1,7 +1,10 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -21,7 +24,6 @@ public DateType( : base(name, bind) { Description = description; - SerializationType = ScalarSerializationType.String; Pattern = @"^\d{4}-\d{2}-\d{2}$"; _enforceSpecFormat = !disableFormatCheck; } @@ -46,87 +48,40 @@ public DateType() : this(ScalarNames.Date, TypeResources.DateType_Description) { } - protected override DateOnly ParseLiteral(StringValueNode valueSyntax) + public override object CoerceInputLiteral(StringValueNode valueLiteral) { - if (TryDeserializeFromString(valueSyntax.Value, out var value)) + if (TryParseStringValue(valueLiteral.Value, out var value)) { return value.Value; } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), - this); + throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } - protected override StringValueNode ParseValue(DateOnly runtimeValue) => - new(Serialize(runtimeValue)); - - public override IValueNode ParseResult(object? resultValue) + public override object CoerceInputValue(JsonElement inputValue) { - return resultValue switch + if (TryParseStringValue(inputValue.GetString()!, out var value)) { - null => NullValueNode.Default, - string s => new StringValueNode(s), - DateOnly d => ParseValue(d), - DateTimeOffset o => ParseValue(DateOnly.FromDateTime(o.UtcDateTime)), - DateTime dt => ParseValue(DateOnly.FromDateTime(dt.ToUniversalTime())), - _ => throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this) - }; + return value.Value; + } + + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + public override void CoerceOutputValue(DateOnly runtimeValue, ResultElement resultValue) { - switch (runtimeValue) - { - case null: - resultValue = null; - return true; - case DateOnly d: - resultValue = Serialize(d); - return true; - case DateTimeOffset o: - resultValue = Serialize(o.UtcDateTime); - return true; - case DateTime dt: - resultValue = Serialize(dt.ToUniversalTime()); - return true; - default: - resultValue = null; - return false; - } + var serialized = runtimeValue.ToString(DateFormat, CultureInfo.InvariantCulture); + resultValue.SetStringValue(serialized); } - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + public override IValueNode ValueToLiteral(DateOnly runtimeValue) { - switch (resultValue) - { - case null: - runtimeValue = null; - return true; - case string s when TryDeserializeFromString(s, out var d): - runtimeValue = d; - return true; - case DateOnly d: - runtimeValue = d; - return true; - case DateTimeOffset o: - runtimeValue = DateOnly.FromDateTime(o.UtcDateTime); - return true; - case DateTime dt: - runtimeValue = DateOnly.FromDateTime(dt.ToUniversalTime()); - return true; - default: - runtimeValue = null; - return false; - } + var serialized = runtimeValue.ToString(DateFormat, CultureInfo.InvariantCulture); + return new StringValueNode(serialized); } - private static string Serialize(IFormattable value) => - value.ToString(DateFormat, CultureInfo.InvariantCulture); - - private bool TryDeserializeFromString( - string? serialized, + private bool TryParseStringValue( + string serialized, [NotNullWhen(true)] out DateOnly? value) { if (_enforceSpecFormat) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.Initialization.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.Initialization.cs index 246a4391e20..b120fe5dc8e 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.Initialization.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.Initialization.cs @@ -58,7 +58,9 @@ protected override void OnRegisterDependencies( context.Dependencies.Add(new TypeDependency(specifiedByTypeRef)); } - if (options.ApplySerializeAsToScalars && SerializationType is not ScalarSerializationType.Undefined) + if (options.ApplySerializeAsToScalars + && SerializationType is not ScalarSerializationType.Undefined + && !SpecScalarNames.IsSpecScalar(Name)) { var serializedAsTypeRef = inspector.GetTypeRef(typeof(SerializeAs)); context.Dependencies.Add(new TypeDependency(serializedAsTypeRef)); diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs index 0b57471b532..01d06623556 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs @@ -17,11 +17,7 @@ public abstract partial class ScalarType : TypeSystemObject , IScalarTypeDefinition , ILeafType - , IHasRuntimeType { - private Uri? _specifiedBy; - private string? _pattern; - /// /// Gets the type kind. /// @@ -48,7 +44,7 @@ public abstract partial class ScalarType /// public Uri? SpecifiedBy { - get => _specifiedBy; + get; protected set { if (IsExecutable) @@ -56,7 +52,7 @@ protected set throw new InvalidOperationException( TypeResources.TypeSystem_Immutable); } - _specifiedBy = value; + field = value; } } @@ -66,7 +62,7 @@ protected set /// public string? Pattern { - get => _pattern; + get; protected set { if (IsExecutable) @@ -74,7 +70,7 @@ protected set throw new InvalidOperationException( TypeResources.TypeSystem_Immutable); } - _pattern = value; + field = value; } } @@ -203,27 +199,20 @@ public virtual bool IsValueCompatible(JsonElement inputValue) } /// - public virtual bool IsInstanceOfType(object? runtimeValue) - { - if (runtimeValue is null) - { - return true; - } - - return RuntimeType.IsInstanceOfType(runtimeValue); - } + public virtual bool IsInstanceOfType(object runtimeValue) + => RuntimeType.IsInstanceOfType(runtimeValue); /// - public abstract object? CoerceInputLiteral(IValueNode valueLiteral); + public abstract object CoerceInputLiteral(IValueNode valueLiteral); /// - public abstract object? CoerceInputValue(JsonElement inputValue); + public abstract object CoerceInputValue(JsonElement inputValue); /// - public abstract void CoerceOutputValue(object? runtimeValue, ResultElement resultValue); + public abstract void CoerceOutputValue(object runtimeValue, ResultElement resultValue); /// - public abstract IValueNode ValueToLiteral(object? runtimeValue); + public abstract IValueNode ValueToLiteral(object runtimeValue); /// /// Returns a string that represents the current . diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs index 04e57ab20ad..d47796017ee 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs @@ -1,6 +1,6 @@ using HotChocolate.Language; -using HotChocolate.Properties; using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -12,7 +12,7 @@ namespace HotChocolate.Types; /// /// The .NET runtime type that this scalar represents. /// -public abstract class ScalarType : ScalarType +public abstract class ScalarType : ScalarType where TRuntimeType : notnull { /// protected ScalarType(string name, BindingBehavior bind = BindingBehavior.Explicit) @@ -24,36 +24,19 @@ protected ScalarType(string name, BindingBehavior bind = BindingBehavior.Explici public sealed override Type RuntimeType => typeof(TRuntimeType); /// - public override bool IsInstanceOfType(object? runtimeValue) - { - if (runtimeValue is null) - { - return true; - } - - return RuntimeType.IsInstanceOfType(runtimeValue); - } + public override bool IsInstanceOfType(object runtimeValue) + => RuntimeType.IsInstanceOfType(runtimeValue); /// - public override void CoerceOutputValue(object? runtimeValue, ResultElement resultValue) + public override void CoerceOutputValue(object runtimeValue, ResultElement resultValue) { - if (runtimeValue is null) - { - resultValue.SetNullValue(); - return; - } - if (runtimeValue is TRuntimeType t) { CoerceOutputValue(t, resultValue); return; } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceOutputValue( - runtimeValue.GetType(), - runtimeValue.ToString() ?? "null"), - this); + throw Scalar_Cannot_CoerceOutputValue(this, runtimeValue); } /// @@ -69,26 +52,17 @@ public override void CoerceOutputValue(object? runtimeValue, ResultElement resul /// /// Unable to coerce the given into an output value. /// - public abstract void CoerceOutputValue(TRuntimeType? runtimeValue, ResultElement resultValue); + public abstract void CoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue); /// - public override IValueNode ValueToLiteral(object? runtimeValue) + public override IValueNode ValueToLiteral(object runtimeValue) { - if (runtimeValue is null) - { - return NullValueNode.Default; - } - if (runtimeValue is TRuntimeType runtimeType) { return ValueToLiteral(runtimeType); } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ConvertValueToLiteral( - runtimeValue.GetType(), - runtimeValue.ToString() ?? "null"), - this); + throw Scalar_Cannot_ConvertValueToLiteral(this, runtimeValue); } /// @@ -104,5 +78,5 @@ public override IValueNode ValueToLiteral(object? runtimeValue) /// /// Unable to convert the given into a literal. /// - public abstract IValueNode ValueToLiteral(TRuntimeType? runtimeValue); + public abstract IValueNode ValueToLiteral(TRuntimeType runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs index e1d6b76b42b..6830191240c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs @@ -1,6 +1,6 @@ using System.Text.Json; using HotChocolate.Language; -using HotChocolate.Properties; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -9,7 +9,10 @@ namespace HotChocolate.Types; /// GraphQL responses take the form of a hierarchical tree; /// the leaves on these trees are GraphQL scalars. /// -public abstract class ScalarType : ScalarType where TLiteral : IValueNode +public abstract class ScalarType + : ScalarType + where TRuntimeType : notnull + where TLiteral : IValueNode { /// protected ScalarType(string name, BindingBehavior bind = BindingBehavior.Explicit) @@ -58,30 +61,11 @@ public override ScalarSerializationType SerializationType /// public sealed override bool IsValueCompatible(IValueNode valueSyntax) - { - ArgumentNullException.ThrowIfNull(valueSyntax); - - if (valueSyntax.Kind == SyntaxKind.NullValue) - { - return true; - } - - return valueSyntax is TLiteral; - } + => valueSyntax is TLiteral; /// public override bool IsValueCompatible(JsonElement inputValue) { - if (inputValue.ValueKind == JsonValueKind.Undefined) - { - return false; - } - - if (inputValue.ValueKind == JsonValueKind.Null) - { - return true; - } - if (SerializationType == ScalarSerializationType.String && inputValue.ValueKind == JsonValueKind.String) { @@ -123,15 +107,8 @@ public override bool IsValueCompatible(JsonElement inputValue) } /// - public sealed override object? CoerceInputLiteral(IValueNode valueLiteral) + public sealed override object CoerceInputLiteral(IValueNode valueLiteral) { - ArgumentNullException.ThrowIfNull(valueLiteral); - - if (valueLiteral.Kind is SyntaxKind.NullValue) - { - return null; - } - if (valueLiteral is TLiteral literal) { return CoerceInputLiteral(literal); @@ -140,20 +117,8 @@ public override bool IsValueCompatible(JsonElement inputValue) throw CreateCoerceInputLiteralError(valueLiteral); } - public abstract object? CoerceInputLiteral(TLiteral valueLiteral); - - /// - /// Creates the exception that will be thrown when encountered an - /// invalid - /// - /// - /// The value syntax that should be parsed - /// - /// - /// The created exception that should be thrown - /// + public abstract object CoerceInputLiteral(TLiteral valueLiteral); + protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), - this); + => Scalar_Cannot_CoerceInputLiteral(this, valueSyntax); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/SpecScalarAttribute.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/SpecScalarAttribute.cs deleted file mode 100644 index 1033eb209b2..00000000000 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/SpecScalarAttribute.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace HotChocolate.Types; - -/// -/// Defines that the annotated scalar type is defined -/// in the GraphQL specification. -/// -[AttributeUsage(AttributeTargets.Class, Inherited = false)] -internal sealed class SpecScalarAttribute : Attribute; diff --git a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs index e18d471929c..294e6417ab8 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs @@ -1,7 +1,9 @@ #nullable disable +using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Reflection; +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Types; @@ -607,4 +609,47 @@ public static LeafCoercionException InvalidTypeConversion( return new(builder.Build(), type); } + + public static LeafCoercionException Scalar_Cannot_CoerceInputLiteral( + ScalarType scalarType, + IValueNode valueLiteral) + { + return string.Format( + CultureInfo.InvariantCulture, + TypeResources.Scalar_Cannot_CoerceInputLiteral, + typeName, + literalType.Name); + } + + public static LeafCoercionException Scalar_Cannot_CoerceInputValue( + ScalarType scalarType, + JsonElement inputValue) + { + return string.Format( + CultureInfo.InvariantCulture, + TypeResources.Scalar_Cannot_CoerceInputValue, + typeName, + valueKind); + } + + + public static LeafCoercionException Scalar_Cannot_ConvertValueToLiteral( + ScalarType scalarType, + object runtimeValue) + { + // return string.Format( + // CultureInfo.InvariantCulture, + // TypeResources.Scalar_Cannot_Deserialize, + // typeName); + + throw new InvalidOperationException(); + } + + public static LeafCoercionException Scalar_Cannot_CoerceOutputValue(ScalarType scalarType, object runtimeValue) + { + return string.Format( + CultureInfo.InvariantCulture, + TypeResources.Scalar_Cannot_Serialize, + typeName); + } } From 351572712971ab4c16474fb0c79caf727acddce3 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 19 Dec 2025 16:00:29 +0100 Subject: [PATCH 044/144] Refactor scalar types to improve error handling and method naming consistency --- .../src/Types.Scalars/NegativeFloatType.cs | 4 +- .../src/Types.Scalars/NonNegativeFloatType.cs | 4 +- .../src/Types.Scalars/NonPositiveFloatType.cs | 4 +- .../src/Types/Types/Scalars/BooleanType.cs | 2 +- .../src/Types/Types/Scalars/ByteArrayType.cs | 2 +- .../src/Types/Types/Scalars/DateTimeType.cs | 4 +- .../src/Types/Types/Scalars/DecimalType.cs | 2 +- .../Core/src/Types/Types/Scalars/FloatType.cs | 2 +- .../src/Types/Types/Scalars/FloatTypeBase.cs | 241 +++++++----------- .../Core/src/Types/Types/Scalars/IdType.cs | 145 ++++------- .../src/Types/Types/Scalars/ScalarType~2.cs | 28 ++ 11 files changed, 179 insertions(+), 259 deletions(-) diff --git a/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs index 6564cc96ff1..b332708bd80 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs @@ -42,13 +42,13 @@ protected override bool IsInstanceOfType(IFloatValueLiteral valueSyntax) } /// - protected override LeafCoercionException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.NegativeFloatType_ParseLiteral_IsNotNegative(this); } /// - protected override LeafCoercionException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateCoerceInputValueError(object runtimeValue) { throw ThrowHelper.NegativeFloatType_ParseValue_IsNotNegative(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs index 08b7f3c6822..40740950da4 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs @@ -43,13 +43,13 @@ protected override bool IsInstanceOfType(IFloatValueLiteral valueSyntax) } /// - protected override LeafCoercionException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.NonNegativeFloatType_ParseLiteral_IsNotNonNegative(this); } /// - protected override LeafCoercionException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateCoerceInputValueError(object runtimeValue) { throw ThrowHelper.NonNegativeFloatType_ParseValue_IsNotNonNegative(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs index 055a4e9f2f2..f33237fd9d4 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs @@ -43,13 +43,13 @@ protected override bool IsInstanceOfType(IFloatValueLiteral valueSyntax) } /// - protected override LeafCoercionException CreateParseLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) { throw ThrowHelper.NonPositiveFloatType_ParseLiteral_IsNotNonPositive(this); } /// - protected override LeafCoercionException CreateParseValueError(object runtimeValue) + protected override LeafCoercionException CreateCoerceInputValueError(object runtimeValue) { throw ThrowHelper.NonPositiveFloatType_ParseValue_IsNotNonPositive(this); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs index e853957cd81..d0ccca7efa7 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs @@ -56,7 +56,7 @@ public override object CoerceInputValue(JsonElement inputValue) default: throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, inputValue.ValueKind), + TypeResourceHelper.Scalar_Cannot_CoerceInputValue(this, inputValue), this); } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs index a7e59c8a242..994171233da 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs @@ -82,7 +82,7 @@ public override object CoerceInputValue(JsonElement inputValue) } throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, inputValue.ValueKind), + TypeResourceHelper.Scalar_Cannot_CoerceInputValue(this, inputValue), this); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs index 9dd458bc785..c075aefc9e5 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs @@ -80,7 +80,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueLiteral.GetType()), + TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(this, valueLiteral), this); } @@ -92,7 +92,7 @@ public override object CoerceInputValue(JsonElement inputValue) } throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, inputValue.ValueKind), + TypeResourceHelper.Scalar_Cannot_CoerceInputValue(this, inputValue), this); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs index 53a09eeed68..02bb4267322 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs @@ -47,7 +47,7 @@ public DecimalType() { } - protected override decimal ParseLiteral(IFloatValueLiteral valueSyntax) + protected override decimal OnCoerceInputLiteral(IFloatValueLiteral valueSyntax) => valueSyntax.ToDecimal(); protected override FloatValueNode ParseValue(decimal runtimeValue) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs index 4603efa81cf..dbaa2be83b5 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs @@ -50,7 +50,7 @@ public FloatType() { } - protected override double ParseLiteral(IFloatValueLiteral valueSyntax) => + protected override double OnCoerceInputLiteral(IFloatValueLiteral valueSyntax) => valueSyntax.ToDouble(); protected override FloatValueNode ParseValue(double runtimeValue) => diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs index 462902c6608..0be13693c8b 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs @@ -1,12 +1,35 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; +/// +/// Base class for floating-point scalar types with min/max value constraints. +/// +/// +/// The .NET runtime type that this scalar represents. +/// public abstract class FloatTypeBase : ScalarType where TRuntimeType : IComparable { + /// + /// Initializes a new instance of . + /// + /// + /// The name of the scalar type. + /// + /// + /// The minimum allowed value. + /// + /// + /// The maximum allowed value. + /// + /// + /// The binding behavior of this scalar. + /// protected FloatTypeBase( string name, TRuntimeType min, @@ -18,78 +41,45 @@ protected FloatTypeBase( MaxValue = max; } + /// + public override ScalarSerializationType SerializationType => ScalarSerializationType.Float; + + /// + /// Gets the minimum allowed value for this scalar. + /// public TRuntimeType MinValue { get; } + /// + /// Gets the maximum allowed value for this scalar. + /// public TRuntimeType MaxValue { get; } - public override bool IsValueCompatible(IValueNode valueSyntax) - { - ArgumentNullException.ThrowIfNull(valueSyntax); - - if (valueSyntax is NullValueNode) - { - return true; - } - - if (valueSyntax is FloatValueNode floatLiteral && IsInstanceOfType(floatLiteral)) - { - return true; - } - - // Input coercion rules specify that float values can be coerced - // from IntValueNode and FloatValueNode: - // http://facebook.github.io/graphql/June2018/#sec-Float - if (valueSyntax is IntValueNode intLiteral && IsInstanceOfType(intLiteral)) - { - return true; - } + /// + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral.Kind is SyntaxKind.FloatValue or SyntaxKind.IntValue; - return false; - } + /// + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.Number; /// - public sealed override bool IsInstanceOfType(object? runtimeValue) + public override bool IsInstanceOfType(object runtimeValue) { - if (runtimeValue is null) - { - return true; - } - - if (runtimeValue is TRuntimeType t) + if (runtimeValue is TRuntimeType value) { - return IsInstanceOfType(t); + return value.CompareTo(MinValue) != -1 + && value.CompareTo(MaxValue) != 1; } return false; } - protected virtual bool IsInstanceOfType(IFloatValueLiteral valueSyntax) - { - return IsInstanceOfType(ParseLiteral(valueSyntax)); - } - - protected virtual bool IsInstanceOfType(TRuntimeType value) - { - if (value.CompareTo(MinValue) == -1 || value.CompareTo(MaxValue) == 1) - { - return false; - } - - return true; - } - - public override object? CoerceInputLiteral(IValueNode valueSyntax) + /// + public sealed override object CoerceInputLiteral(IValueNode valueSyntax) { - ArgumentNullException.ThrowIfNull(valueSyntax); - - if (valueSyntax is NullValueNode) - { - return null; - } - if (valueSyntax is FloatValueNode floatLiteral && IsInstanceOfType(floatLiteral)) { - return ParseLiteral(floatLiteral); + return OnCoerceInputLiteral(floatLiteral); } // Input coercion rules specify that float values can be coerced @@ -98,132 +88,73 @@ protected virtual bool IsInstanceOfType(TRuntimeType value) if (valueSyntax is IntValueNode intLiteral && IsInstanceOfType(intLiteral)) { - return ParseLiteral(intLiteral); + return OnCoerceInputLiteral(intLiteral); } - throw CreateParseLiteralError(valueSyntax); + throw CreateCoerceInputLiteralError(valueSyntax); } - protected abstract TRuntimeType ParseLiteral(IFloatValueLiteral valueSyntax); - - public override IValueNode CoerceInputValue(object? runtimeValue) - { - if (runtimeValue is null) - { - return NullValueNode.Default; - } - - if (runtimeValue is TRuntimeType casted && IsInstanceOfType(casted)) - { - return ParseValue(casted); - } - - throw CreateParseValueError(runtimeValue); - } - - protected abstract FloatValueNode ParseValue(TRuntimeType runtimeValue); - - public sealed override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is TRuntimeType casted && IsInstanceOfType(casted)) - { - return ParseValue(casted); - } - - if (TryConvertSerialized(resultValue, ValueKind.Integer, out TRuntimeType c) - && IsInstanceOfType(c)) - { - return ParseValue(c); - } - - throw CreateParseResultError(resultValue); - } - - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) - { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is TRuntimeType casted && IsInstanceOfType(casted)) - { - resultValue = runtimeValue; - return true; - } - - resultValue = null; - return false; - } + /// + /// Coerces a float or int literal into the runtime value. + /// + /// + /// The float or int literal to coerce. + /// + /// + /// Returns the runtime value representation. + /// + protected abstract TRuntimeType OnCoerceInputLiteral(IFloatValueLiteral valueSyntax); - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + /// + public sealed override object CoerceInputValue(JsonElement inputValue) { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is TRuntimeType casted && IsInstanceOfType(casted)) + if (inputValue.ValueKind is JsonValueKind.Number) { - runtimeValue = resultValue; - return true; + var value = OnCoerceInputValue(inputValue); + if (value.CompareTo(MinValue) != -1 + && value.CompareTo(MaxValue) != 1) + { + return value; + } } - if ((TryConvertSerialized(resultValue, ValueKind.Float, out TRuntimeType c) - || TryConvertSerialized(resultValue, ValueKind.Integer, out c)) - && IsInstanceOfType(c)) - { - runtimeValue = c; - return true; - } - - runtimeValue = null; - return false; + throw CreateCoerceInputValueError(inputValue); } /// - /// Creates the exception that will be thrown when - /// encountered an invalid runtime value. + /// Coerces a JSON number into the runtime value. /// - /// - /// The runtime value. + /// + /// The JSON input value to coerce. /// /// - /// The created exception that should be thrown + /// Returns the runtime value representation. /// - protected virtual LeafCoercionException CreateParseValueError(object runtimeValue) - => new(TypeResourceHelper.Scalar_Cannot_ParseResult(Name, runtimeValue.GetType()), this); + protected abstract TRuntimeType OnCoerceInputValue(JsonElement inputValue); /// - /// Creates the exception that will be thrown when encountered an - /// invalid + /// Creates the exception to throw when + /// encounters an incompatible input value. /// - /// - /// The value syntax that should be parsed + /// + /// The input value that could not be coerced. /// /// - /// The created exception that should be thrown + /// Returns the exception to throw. /// - protected virtual LeafCoercionException CreateParseLiteralError(IValueNode valueSyntax) - => new(TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), this); + protected virtual LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => Scalar_Cannot_CoerceInputValue(this, inputValue); /// - /// Creates the exception that will be thrown when encountered an - /// invalid value + /// Creates the exception to throw when + /// encounters an incompatible . /// - /// - /// The runtimeValue that should be parsed + /// + /// The value syntax that could not be coerced. /// /// - /// The created exception that should be thrown + /// Returns the exception to throw. /// - protected virtual LeafCoercionException CreateParseResultError(object runtimeValue) - => new(TypeResourceHelper.Scalar_Cannot_ParseResult(Name, runtimeValue.GetType()), this); + protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode literal) + => new(TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(this, literal), this); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs index fa29b4c83e9..8b9adbd9ca8 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs @@ -1,23 +1,36 @@ +using System.Runtime.InteropServices; +using System.Text; +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; /// +/// /// The ID scalar type represents a unique identifier, often used to refetch /// an object or as the key for a cache. The ID type is serialized in the /// same way as a String; however, it is not intended to be human‐readable. -/// -/// While it is often numeric, it should always serialize as a String. -/// -/// http://facebook.github.io/graphql/June2018/#sec-ID +/// +/// While it is often numeric, it should always serialize as a String. +/// http://facebook.github.io/graphql/June2018/#sec-ID /// -[SpecScalar] public class IdType : ScalarType { /// /// Initializes a new instance of the class. /// + /// + /// The name of the scalar type. + /// + /// + /// The description of the scalar type. + /// + /// + /// The binding behavior of this scalar. + /// public IdType( string name, string? description = null, @@ -35,19 +48,21 @@ public IdType() : this(ScalarNames.ID, TypeResources.IdType_Description) { } + /// + public override ScalarSerializationType SerializationType + => ScalarSerializationType.String | ScalarSerializationType.Int; + + /// public override bool IsValueCompatible(IValueNode literal) - { - ArgumentNullException.ThrowIfNull(literal); + => literal is StringValueNode or IntValueNode; - return literal is StringValueNode - || literal is IntValueNode - || literal is NullValueNode; - } + /// + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.String or JsonValueKind.Number; - public override object? CoerceInputLiteral(IValueNode literal) + /// + public override object CoerceInputLiteral(IValueNode literal) { - ArgumentNullException.ThrowIfNull(literal); - if (literal is StringValueNode stringLiteral) { return stringLiteral.Value; @@ -55,97 +70,43 @@ public override bool IsValueCompatible(IValueNode literal) if (literal is IntValueNode intLiteral) { - return intLiteral.Value; - } - - if (literal is NullValueNode) - { - return null; + return Encoding.UTF8.GetString(intLiteral.AsSpan()); } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, literal.GetType()), - this); + throw Scalar_Cannot_CoerceInputLiteral(this, literal); } - public override IValueNode CoerceInputValue(object? runtimeValue) + /// + /// + /// Accepts JSON strings and integer numbers. Floating-point numbers + /// (containing '.', 'e', or 'E') are rejected. + /// + public override object CoerceInputValue(JsonElement inputValue) { - if (runtimeValue is null) + if (inputValue.ValueKind is JsonValueKind.String) { - return NullValueNode.Default; + return inputValue.GetString()!; } - if (runtimeValue is string s) + if (inputValue.ValueKind is JsonValueKind.Number) { - return new StringValueNode(s); - } - - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, runtimeValue.GetType()), - this); - } + var rawValue = JsonMarshal.GetRawUtf8Value(inputValue); - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is string s) - { - return new StringValueNode(s); + // Only accept integers; reject floating-point numbers + if (rawValue.IndexOfAny((byte)'.', (byte)'e', (byte)'E') == -1) + { + return Encoding.UTF8.GetString(rawValue); + } } - if (resultValue is int i) - { - return new IntValueNode(i); - } - - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), - this); + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) - { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is string) - { - resultValue = runtimeValue; - return true; - } - - resultValue = null; - return false; - } - - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is string) - { - runtimeValue = resultValue; - return true; - } + /// + public override void CoerceOutputValue(string runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue); - if (TryConvertSerialized(resultValue, ValueKind.Integer, out string c)) - { - runtimeValue = c; - return true; - } - - runtimeValue = null; - return false; - } + /// + public override IValueNode ValueToLiteral(string runtimeValue) + => new StringValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs index 6830191240c..07dc0a966c7 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs @@ -9,6 +9,12 @@ namespace HotChocolate.Types; /// GraphQL responses take the form of a hierarchical tree; /// the leaves on these trees are GraphQL scalars. /// +/// +/// The .NET runtime type that this scalar represents. +/// +/// +/// The GraphQL literal (AST value node) type that this scalar accepts. +/// public abstract class ScalarType : ScalarType where TRuntimeType : notnull @@ -117,8 +123,30 @@ public sealed override object CoerceInputLiteral(IValueNode valueLiteral) throw CreateCoerceInputLiteralError(valueLiteral); } + /// + /// Coerces a GraphQL literal into a runtime value. + /// + /// + /// The GraphQL literal to coerce. + /// + /// + /// Returns the runtime value representation. + /// + /// + /// Unable to coerce the given into a runtime value. + /// public abstract object CoerceInputLiteral(TLiteral valueLiteral); + /// + /// Creates the exception to throw when + /// encounters an incompatible . + /// + /// + /// The value syntax that could not be coerced. + /// + /// + /// Returns the exception to throw. + /// protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) => Scalar_Cannot_CoerceInputLiteral(this, valueSyntax); } From e6f233ef7463a66e368715200f80d1afda60604d Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 19 Dec 2025 20:56:32 +0100 Subject: [PATCH 045/144] Refactor scalar types to enhance coercion methods and improve documentation --- .../Core/src/Types/Types/Scalars/IntType.cs | 24 ++- .../Types/Types/Scalars/IntegerTypeBase.cs | 178 ++++++++++-------- .../Types/Types/Scalars/LocalDateTimeType.cs | 104 +++------- .../src/Types/Types/Scalars/LocalDateType.cs | 98 +++------- .../src/Types/Types/Scalars/LocalTimeType.cs | 98 +++------- .../Core/src/Types/Types/Scalars/LongType.cs | 21 ++- .../Core/src/Types/Types/Scalars/ShortType.cs | 25 ++- .../src/Types/Types/Scalars/StringType.cs | 30 ++- .../src/Types/Types/Scalars/TimeSpanType.cs | 124 ++++-------- 9 files changed, 285 insertions(+), 417 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IntType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IntType.cs index 53cb5dc4efd..e31e149c820 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IntType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IntType.cs @@ -1,16 +1,18 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; namespace HotChocolate.Types; /// +/// /// The Int scalar type represents a signed 32‐bit numeric non‐fractional /// value. Response formats that support a 32‐bit integer or a number type /// should use that type to represent this scalar. -/// -/// http://facebook.github.io/graphql/June2018/#sec-Int +/// +/// http://facebook.github.io/graphql/June2018/#sec-Int /// -[SpecScalar] public class IntType : IntegerTypeBase { /// @@ -49,9 +51,19 @@ public IntType() { } - protected override int ParseLiteral(IntValueNode valueSyntax) + /// + protected override int OnCoerceInputLiteral(IntValueNode valueSyntax) => valueSyntax.ToInt32(); - protected override IntValueNode ParseValue(int runtimeValue) - => new(runtimeValue); + /// + protected override int OnCoerceInputValue(JsonElement inputValue) + => inputValue.GetInt32(); + + /// + public override void CoerceOutputValue(int runtimeValue, ResultElement resultValue) + => resultValue.SetNumberValue(runtimeValue); + + /// + public override IValueNode ValueToLiteral(int runtimeValue) + => new IntValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs index 18ea19331a7..87d99c9166c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs @@ -1,127 +1,151 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; +/// +/// Base class for integer scalar types with min/max value constraints. +/// +/// +/// The .NET runtime type that this scalar represents. +/// public abstract class IntegerTypeBase - : ScalarType + : ScalarType where TRuntimeType : IComparable { + /// + /// Initializes a new instance of . + /// + /// + /// The name of the scalar type. + /// + /// + /// The minimum allowed value. + /// + /// + /// The maximum allowed value. + /// + /// + /// The binding behavior of this scalar. + /// protected IntegerTypeBase( string name, TRuntimeType min, TRuntimeType max, BindingBehavior bind = BindingBehavior.Explicit) - : base(name, bind) + : base(name, bind) { MinValue = min; MaxValue = max; } + /// + public override ScalarSerializationType SerializationType => ScalarSerializationType.Int; + + /// + /// Gets the minimum allowed value for this scalar. + /// public TRuntimeType MinValue { get; } + /// + /// Gets the maximum allowed value for this scalar. + /// public TRuntimeType MaxValue { get; } - protected override bool IsInstanceOfType(IntValueNode valueSyntax) - { - try - { - return IsInstanceOfType(ParseLiteral(valueSyntax)); - } - catch (InvalidFormatException) - { - return false; - } - } - - protected override bool IsInstanceOfType(TRuntimeType runtimeValue) - { - if (runtimeValue.CompareTo(MinValue) < 0 || runtimeValue.CompareTo(MaxValue) > 0) - { - return false; - } + /// + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral.Kind is SyntaxKind.IntValue; - return true; - } + /// + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.Number; - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + /// + public override bool IsInstanceOfType(object runtimeValue) { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is TRuntimeType casted && IsInstanceOfType(casted)) + if (runtimeValue is TRuntimeType value) { - resultValue = runtimeValue; - return true; + return value.CompareTo(MinValue) != -1 + && value.CompareTo(MaxValue) != 1; } - resultValue = null; return false; } - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + /// + public sealed override object CoerceInputLiteral(IValueNode valueSyntax) { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is TRuntimeType casted && IsInstanceOfType(casted)) + if (valueSyntax is IntValueNode intLiteral && IsInstanceOfType(intLiteral)) { - runtimeValue = resultValue; - return true; + return OnCoerceInputLiteral(intLiteral); } - if (TryConvertSerialized(resultValue, ValueKind.Integer, out TRuntimeType c) - && IsInstanceOfType(c)) - { - runtimeValue = c; - return true; - } - - runtimeValue = null; - return false; + throw CreateCoerceInputLiteralError(valueSyntax); } - public sealed override IValueNode ParseResult(object? resultValue) + /// + /// Coerces an int literal into the runtime value. + /// + /// + /// The int literal to coerce. + /// + /// + /// Returns the runtime value representation. + /// + protected abstract TRuntimeType OnCoerceInputLiteral(IntValueNode valueSyntax); + + /// + public sealed override object CoerceInputValue(JsonElement inputValue) { - if (resultValue is null) + if (inputValue.ValueKind is JsonValueKind.Number) { - return NullValueNode.Default; + var value = OnCoerceInputValue(inputValue); + if (value.CompareTo(MinValue) != -1 + && value.CompareTo(MaxValue) != 1) + { + return value; + } } - if (resultValue is TRuntimeType casted && IsInstanceOfType(casted)) - { - return ParseValue(casted); - } + throw CreateCoerceInputValueError(inputValue); + } - if (TryConvertSerialized(resultValue, ValueKind.Integer, out TRuntimeType c) - && IsInstanceOfType(c)) - { - return ParseValue(c); - } + /// + /// Coerces a JSON number into the runtime value. + /// + /// + /// The JSON input value to coerce. + /// + /// + /// Returns the runtime value representation. + /// + protected abstract TRuntimeType OnCoerceInputValue(JsonElement inputValue); - throw CreateParseResultError(resultValue); - } + /// + /// Creates the exception to throw when + /// encounters an incompatible input value. + /// + /// + /// The input value that could not be coerced. + /// + /// + /// Returns the exception to throw. + /// + protected virtual LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => Scalar_Cannot_CoerceInputValue(this, inputValue); /// - /// Creates the exception that will be thrown when encountered an - /// invalid value + /// Creates the exception to throw when + /// encounters an incompatible . /// - /// - /// The runtimeValue that should be parsed + /// + /// The value syntax that could not be coerced. /// /// - /// The created exception that should be thrown + /// Returns the exception to throw. /// - protected virtual LeafCoercionException CreateParseResultError(object runtimeValue) - { - return new( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, runtimeValue.GetType()), - this); - } + protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode literal) + => new(TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(this, literal), this); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs index 0a6a0a1504a..1834ca0b045 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs @@ -1,7 +1,9 @@ -using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -23,7 +25,6 @@ public LocalDateTimeType( : base(name, bind) { Description = description; - SerializationType = ScalarSerializationType.String; Pattern = @"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$"; } @@ -38,99 +39,50 @@ public LocalDateTimeType() { } - public override IValueNode ParseResult(object? resultValue) + /// + public override object CoerceInputLiteral(StringValueNode valueLiteral) { - return resultValue switch + if (TryParseStringValue(valueLiteral.Value, out var value)) { - null => NullValueNode.Default, - string s => new StringValueNode(s), - DateTimeOffset o => ParseValue(o.DateTime), - DateTime dt => ParseValue(dt), - _ => throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this) - }; - } - - protected override DateTime ParseLiteral(StringValueNode valueSyntax) - { - if (TryDeserializeFromString(valueSyntax.Value, out var value)) - { - return value.Value; + return value; } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), - this); - } - - protected override StringValueNode ParseValue(DateTime runtimeValue) - { - return new(Serialize(runtimeValue)); + throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + /// + public override object CoerceInputValue(JsonElement inputValue) { - switch (runtimeValue) + if (TryParseStringValue(inputValue.GetString()!, out var value)) { - case null: - resultValue = null; - return true; - case DateTimeOffset o: - resultValue = Serialize(o); - return true; - case DateTime dt: - resultValue = Serialize(dt); - return true; - default: - resultValue = null; - return false; + return value; } - } - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - switch (resultValue) - { - case null: - runtimeValue = null; - return true; - case string s when TryDeserializeFromString(s, out var d): - runtimeValue = d; - return true; - case DateTimeOffset o: - runtimeValue = o.DateTime; - return true; - case DateTime dt: - runtimeValue = dt; - return true; - default: - runtimeValue = null; - return false; - } + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - private static string Serialize(IFormattable value) - { - return value.ToString(LocalFormat, CultureInfo.InvariantCulture); - } + /// + public override void CoerceOutputValue(DateTime runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); + + /// + public override IValueNode ValueToLiteral(DateTime runtimeValue) + => new StringValueNode(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); - private static bool TryDeserializeFromString( - string? serialized, - [NotNullWhen(true)] out DateTime? value) + private static bool TryParseStringValue(string serialized, out DateTime value) { - if (serialized is not null - && DateTime.TryParseExact( - serialized, - LocalFormat, - CultureInfo.InvariantCulture, - DateTimeStyles.None, - out var dateTime)) + if (DateTime.TryParseExact( + serialized, + LocalFormat, + CultureInfo.InvariantCulture, + DateTimeStyles.None, + out var dateTime)) { value = dateTime; return true; } - value = null; + value = default; return false; } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs index dbab98ad9e0..8254833f142 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs @@ -1,7 +1,9 @@ -using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -32,7 +34,6 @@ public LocalDateType( : base(name, bind) { Description = description; - SerializationType = ScalarSerializationType.String; Pattern = @"^\d{4}-\d{2}-\d{2}$"; SpecifiedBy = new Uri(SpecifiedByUri); _enforceSpecFormat = !disableFormatCheck; @@ -61,92 +62,37 @@ public LocalDateType() { } - public override IValueNode ParseResult(object? resultValue) + /// + public override object CoerceInputLiteral(StringValueNode valueLiteral) { - return resultValue switch + if (TryParseStringValue(valueLiteral.Value, out var value)) { - null => NullValueNode.Default, - string s => new StringValueNode(s), - DateOnly d => ParseValue(d), - DateTimeOffset o => ParseValue(DateOnly.FromDateTime(o.DateTime)), - DateTime dt => ParseValue(DateOnly.FromDateTime(dt)), - _ => throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this) - }; - } - - protected override DateOnly ParseLiteral(StringValueNode valueSyntax) - { - if (TryDeserializeFromString(valueSyntax.Value, out var value)) - { - return value.Value; + return value; } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), - this); - } - - protected override StringValueNode ParseValue(DateOnly runtimeValue) - { - return new(Serialize(runtimeValue)); + throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + /// + public override object CoerceInputValue(JsonElement inputValue) { - switch (runtimeValue) + if (TryParseStringValue(inputValue.GetString()!, out var value)) { - case null: - resultValue = null; - return true; - case DateOnly d: - resultValue = Serialize(d); - return true; - case DateTimeOffset o: - resultValue = Serialize(o); - return true; - case DateTime dt: - resultValue = Serialize(dt); - return true; - default: - resultValue = null; - return false; + return value; } - } - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - switch (resultValue) - { - case null: - runtimeValue = null; - return true; - case string s when TryDeserializeFromString(s, out var d): - runtimeValue = d; - return true; - case DateOnly d: - runtimeValue = d; - return true; - case DateTimeOffset o: - runtimeValue = DateOnly.FromDateTime(o.DateTime); - return true; - case DateTime dt: - runtimeValue = DateOnly.FromDateTime(dt); - return true; - default: - runtimeValue = null; - return false; - } + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - private static string Serialize(IFormattable value) - { - return value.ToString(LocalFormat, CultureInfo.InvariantCulture); - } + /// + public override void CoerceOutputValue(DateOnly runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); + + /// + public override IValueNode ValueToLiteral(DateOnly runtimeValue) + => new StringValueNode(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); - private bool TryDeserializeFromString( - string? serialized, - [NotNullWhen(true)] out DateOnly? value) + private bool TryParseStringValue(string serialized, out DateOnly value) { if (_enforceSpecFormat) { @@ -170,7 +116,7 @@ private bool TryDeserializeFromString( return true; } - value = null; + value = default; return false; } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs index 0e68d5a6fe4..40f68d85c88 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs @@ -1,7 +1,9 @@ -using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -25,7 +27,6 @@ public LocalTimeType( : base(name, bind) { Description = description; - SerializationType = ScalarSerializationType.String; Pattern = @"^\d{2}:\d{2}:\d{2}$"; _enforceSpecFormat = !disableFormatCheck; } @@ -53,92 +54,37 @@ public LocalTimeType() { } - public override IValueNode ParseResult(object? resultValue) + /// + public override object CoerceInputLiteral(StringValueNode valueLiteral) { - return resultValue switch + if (TryParseStringValue(valueLiteral.Value, out var value)) { - null => NullValueNode.Default, - string s => new StringValueNode(s), - TimeOnly t => ParseValue(t), - DateTimeOffset d => ParseValue(TimeOnly.FromDateTime(d.DateTime)), - DateTime dt => ParseValue(TimeOnly.FromDateTime(dt)), - _ => throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), this) - }; - } - - protected override TimeOnly ParseLiteral(StringValueNode valueSyntax) - { - if (TryDeserializeFromString(valueSyntax.Value, out var value)) - { - return value.Value; + return value; } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), - this); - } - - protected override StringValueNode ParseValue(TimeOnly runtimeValue) - { - return new(Serialize(runtimeValue)); + throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + /// + public override object CoerceInputValue(JsonElement inputValue) { - switch (runtimeValue) + if (TryParseStringValue(inputValue.GetString()!, out var value)) { - case null: - resultValue = null; - return true; - case TimeOnly t: - resultValue = Serialize(t); - return true; - case DateTimeOffset dt: - resultValue = Serialize(dt); - return true; - case DateTime dt: - resultValue = Serialize(dt); - return true; - default: - resultValue = null; - return false; + return value; } - } - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - switch (resultValue) - { - case null: - runtimeValue = null; - return true; - case string s when TryDeserializeFromString(s, out var t): - runtimeValue = t; - return true; - case TimeOnly t: - runtimeValue = t; - return true; - case DateTimeOffset d: - runtimeValue = TimeOnly.FromDateTime(d.DateTime); - return true; - case DateTime d: - runtimeValue = TimeOnly.FromDateTime(d); - return true; - default: - runtimeValue = null; - return false; - } + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - private static string Serialize(IFormattable value) - { - return value.ToString(LocalFormat, CultureInfo.InvariantCulture); - } + /// + public override void CoerceOutputValue(TimeOnly runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); + + /// + public override IValueNode ValueToLiteral(TimeOnly runtimeValue) + => new StringValueNode(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); - private bool TryDeserializeFromString( - string? serialized, - [NotNullWhen(true)] out TimeOnly? value) + private bool TryParseStringValue(string serialized, out TimeOnly value) { if (_enforceSpecFormat) { @@ -162,7 +108,7 @@ private bool TryDeserializeFromString( return true; } - value = null; + value = default; return false; } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LongType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LongType.cs index 0badfb2a3b4..265f4f44be7 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LongType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LongType.cs @@ -1,5 +1,7 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; namespace HotChocolate.Types; @@ -35,7 +37,6 @@ public LongType( : base(name, min, max, bind) { Description = description; - SerializationType = ScalarSerializationType.Int; } /// @@ -47,9 +48,19 @@ public LongType() { } - protected override long ParseLiteral(IntValueNode valueSyntax) => - valueSyntax.ToInt64(); + /// + protected override long OnCoerceInputLiteral(IntValueNode valueSyntax) + => valueSyntax.ToInt64(); - protected override IntValueNode ParseValue(long runtimeValue) => - new(runtimeValue); + /// + protected override long OnCoerceInputValue(JsonElement inputValue) + => inputValue.GetInt64(); + + /// + public override void CoerceOutputValue(long runtimeValue, ResultElement resultValue) + => resultValue.SetNumberValue(runtimeValue); + + /// + public override IValueNode ValueToLiteral(long runtimeValue) + => new IntValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ShortType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ShortType.cs index 1072f8d0e4c..0d8e9be591c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ShortType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ShortType.cs @@ -1,5 +1,7 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; namespace HotChocolate.Types; @@ -34,7 +36,6 @@ public ShortType( : base(name, min, max, bind) { Description = description; - SerializationType = ScalarSerializationType.Int; } /// @@ -45,13 +46,19 @@ public ShortType() : this(short.MinValue, short.MaxValue) { } - protected override short ParseLiteral(IntValueNode valueSyntax) - { - return valueSyntax.ToInt16(); - } + /// + protected override short OnCoerceInputLiteral(IntValueNode valueSyntax) + => valueSyntax.ToInt16(); - protected override IntValueNode ParseValue(short runtimeValue) - { - return new IntValueNode(runtimeValue); - } + /// + protected override short OnCoerceInputValue(JsonElement inputValue) + => inputValue.GetInt16(); + + /// + public override void CoerceOutputValue(short runtimeValue, ResultElement resultValue) + => resultValue.SetNumberValue(runtimeValue); + + /// + public override IValueNode ValueToLiteral(short runtimeValue) + => new IntValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs index e1c4e4f76f6..87b19c79e13 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs @@ -1,5 +1,8 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -10,7 +13,6 @@ namespace HotChocolate.Types; /// /// http://facebook.github.io/graphql/June2018/#sec-String /// -[SpecScalar] public class StringType : ScalarType { /// @@ -37,12 +39,26 @@ public StringType() { } - protected override string ParseLiteral(StringValueNode valueSyntax) => - valueSyntax.Value; + /// + public override object CoerceInputLiteral(StringValueNode valueLiteral) + => valueLiteral.Value; - protected override StringValueNode ParseValue(string runtimeValue) => - new(runtimeValue); + /// + public override object CoerceInputValue(JsonElement inputValue) + { + if (inputValue.ValueKind is JsonValueKind.String) + { + return inputValue.GetString()!; + } + + throw Scalar_Cannot_CoerceInputValue(this, inputValue); + } + + /// + public override void CoerceOutputValue(string runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue); - public override IValueNode ParseResult(object? resultValue) => - CoerceInputValue(resultValue); + /// + public override IValueNode ValueToLiteral(string runtimeValue) + => new StringValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs index 4e8a413bc63..4059bee94d2 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs @@ -1,6 +1,9 @@ +using System.Text.Json; using System.Xml; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -28,7 +31,6 @@ public TimeSpanType( { Format = format; Description = description; - SerializationType = ScalarSerializationType.String; Pattern = format switch { TimeSpanFormat.Iso8601 @@ -45,122 +47,74 @@ public TimeSpanType() { } - protected override TimeSpan ParseLiteral(StringValueNode valueSyntax) + /// + public override object CoerceInputLiteral(StringValueNode valueLiteral) { - if (TryDeserializeFromString(valueSyntax.Value, Format, out var value) - && value != null) + if (TryParseStringValue(valueLiteral.Value, Format, out var value)) { - return value.Value; + return value; } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), - this); + throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } - protected override StringValueNode ParseValue(TimeSpan runtimeValue) + /// + public override object CoerceInputValue(JsonElement inputValue) { - return Format == TimeSpanFormat.Iso8601 - ? new StringValueNode(XmlConvert.ToString(runtimeValue)) - : new StringValueNode(runtimeValue.ToString("c")); - } - - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is string s - && TryDeserializeFromString(s, Format, out var timeSpan)) - { - return CoerceInputValue(timeSpan); - } - - if (resultValue is TimeSpan ts) + if (TryParseStringValue(inputValue.GetString()!, Format, out var value)) { - return ParseValue(ts); + return value; } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), - this); + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + /// + public override void CoerceOutputValue(TimeSpan runtimeValue, ResultElement resultValue) { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is TimeSpan timeSpan) - { - if (Format == TimeSpanFormat.Iso8601) - { - resultValue = XmlConvert.ToString(timeSpan); - return true; - } - - resultValue = timeSpan.ToString("c"); - return true; - } - - resultValue = null; - return false; + var serialized = Format == TimeSpanFormat.Iso8601 + ? XmlConvert.ToString(runtimeValue) + : runtimeValue.ToString("c"); + resultValue.SetStringValue(serialized); } - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + /// + public override IValueNode ValueToLiteral(TimeSpan runtimeValue) { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is string s - && TryDeserializeFromString(s, Format, out var timeSpan)) - { - runtimeValue = timeSpan; - return true; - } - - if (resultValue is TimeSpan ts) - { - runtimeValue = ts; - return true; - } - - runtimeValue = null; - return false; + return Format == TimeSpanFormat.Iso8601 + ? new StringValueNode(XmlConvert.ToString(runtimeValue)) + : new StringValueNode(runtimeValue.ToString("c")); } - private static bool TryDeserializeFromString( + private static bool TryParseStringValue( string serialized, TimeSpanFormat format, - out TimeSpan? value) + out TimeSpan value) { return format == TimeSpanFormat.Iso8601 - ? TryDeserializeIso8601(serialized, out value) - : TryDeserializeDotNet(serialized, out value); + ? TryParseIso8601(serialized, out value) + : TryParseDotNet(serialized, out value); } - private static bool TryDeserializeIso8601(string serialized, out TimeSpan? value) + private static bool TryParseIso8601(string serialized, out TimeSpan value) { try { - return Iso8601Duration.TryParse(serialized, out value); + if (Iso8601Duration.TryParse(serialized, out var nullable) && nullable.HasValue) + { + value = nullable.Value; + return true; + } } catch (FormatException) { - value = null; - return false; } + + value = default; + return false; } - private static bool TryDeserializeDotNet(string serialized, out TimeSpan? value) + private static bool TryParseDotNet(string serialized, out TimeSpan value) { if (TimeSpan.TryParse(serialized, out var timeSpan)) { @@ -168,7 +122,7 @@ private static bool TryDeserializeDotNet(string serialized, out TimeSpan? value) return true; } - value = null; + value = default; return false; } } From 3b7cee510b608a04446e6277e9b98e9c2b8bd531 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 19 Dec 2025 21:25:41 +0100 Subject: [PATCH 046/144] Enhance scalar type handling by adding RuntimeType to MissingType, updating UrlType and UuidType coercion methods, and improving value compatibility checks in ValueVisitor --- .../Types.Abstractions/Types/MissingType.cs | 3 + .../Core/src/Types/Types/Scalars/UrlType.cs | 112 +++++---------- .../Core/src/Types/Types/Scalars/UuidType.cs | 127 +++++------------- .../Core/src/Validation/Rules/ValueVisitor.cs | 2 +- 4 files changed, 74 insertions(+), 170 deletions(-) diff --git a/src/HotChocolate/Core/src/Types.Abstractions/Types/MissingType.cs b/src/HotChocolate/Core/src/Types.Abstractions/Types/MissingType.cs index 5c9aad87d63..ddfa08f1f4d 100644 --- a/src/HotChocolate/Core/src/Types.Abstractions/Types/MissingType.cs +++ b/src/HotChocolate/Core/src/Types.Abstractions/Types/MissingType.cs @@ -49,6 +49,9 @@ public MissingType(string name) /// public SchemaCoordinate Coordinate => new(Name, ofDirective: false); + /// + public Type RuntimeType => typeof(object); + /// /// Gets the directives annotated to this type. /// diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs index 5ed9829478d..3d641939a22 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs @@ -1,9 +1,15 @@ -using System.Diagnostics.CodeAnalysis; +using System.Text.Json; using HotChocolate.Language; -using HotChocolate.Properties; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; +/// +/// The URL scalar type represents a valid URL as defined by RFC 3986. +/// This type accepts both absolute URIs and relative URIs that start with '/'. +/// The scalar serializes as a string. +/// public class UrlType : ScalarType { private const string SpecifiedByUri = "https://tools.ietf.org/html/rfc3986"; @@ -18,7 +24,6 @@ public UrlType( : base(name, bind) { Description = description; - SerializationType = ScalarSerializationType.String; SpecifiedBy = new Uri(SpecifiedByUri); } @@ -31,106 +36,63 @@ public UrlType() { } - protected override bool IsInstanceOfType(StringValueNode valueSyntax) + /// + public override object CoerceInputLiteral(StringValueNode valueLiteral) { - return TryParseUri(valueSyntax.Value, out _); - } - - protected override Uri ParseLiteral(StringValueNode valueSyntax) - { - if (TryParseUri(valueSyntax.Value, out var uri)) + if (TryParseUri(valueLiteral.Value, out var value)) { - return uri; + return value; } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), - this); + throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } - protected override StringValueNode ParseValue(Uri runtimeValue) + /// + public override object CoerceInputValue(JsonElement inputValue) { - return new(runtimeValue.AbsoluteUri); - } - - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is string s) + if (inputValue.ValueKind is JsonValueKind.String + && TryParseUri(inputValue.GetString()!, out var value)) { - return new StringValueNode(s); + return value; } - if (resultValue is Uri uri) - { - return ParseValue(uri); - } - - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), - this); + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + /// + public override void CoerceOutputValue(Uri runtimeValue, ResultElement resultValue) { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is Uri uri) - { - resultValue = uri.IsAbsoluteUri ? uri.AbsoluteUri : uri.ToString(); - return true; - } - - resultValue = null; - return false; + var serialized = runtimeValue.IsAbsoluteUri + ? runtimeValue.AbsoluteUri + : runtimeValue.ToString(); + resultValue.SetStringValue(serialized); } - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + /// + public override IValueNode ValueToLiteral(Uri runtimeValue) { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is string s && TryParseUri(s, out var uri)) - { - runtimeValue = uri; - return true; - } - - if (resultValue is Uri u) - { - runtimeValue = u; - return true; - } - - runtimeValue = null; - return false; + var value = runtimeValue.IsAbsoluteUri + ? runtimeValue.AbsoluteUri + : runtimeValue.ToString(); + return new StringValueNode(value); } - private bool TryParseUri(string value, [NotNullWhen(true)] out Uri? uri) + private static bool TryParseUri(string value, out Uri uri) { - if (!Uri.TryCreate(value, UriKind.RelativeOrAbsolute, out uri)) + if (!Uri.TryCreate(value, UriKind.RelativeOrAbsolute, out var parsedUri)) { + uri = default!; return false; } // Don't accept a relative URI that does not start with '/' - if (!uri.IsAbsoluteUri && !uri.OriginalString.StartsWith("/")) + if (!parsedUri.IsAbsoluteUri && !parsedUri.OriginalString.StartsWith('/')) { - uri = null; + uri = default!; return false; } + uri = parsedUri; return true; } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs index cb27a900423..c158d3e1b81 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs @@ -1,11 +1,18 @@ using System.Buffers.Text; using System.Diagnostics; using System.Text; +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; +/// +/// The UUID scalar type represents a universally unique identifier (UUID) as defined by RFC 4122. +/// This type supports multiple GUID string formats (N, D, B, P) and serializes as a string. +/// public class UuidType : ScalarType { private const string SpecifiedByUri = "https://tools.ietf.org/html/rfc4122"; @@ -72,7 +79,6 @@ public UuidType( : base(name, bind) { Description = description; - SerializationType = ScalarSerializationType.String; SpecifiedBy = new Uri(SpecifiedByUri); _format = CreateFormatString(defaultFormat); _enforceFormat = enforceFormat; @@ -95,127 +101,60 @@ public UuidType() : this('\0') { } - protected override bool IsInstanceOfType(StringValueNode valueSyntax) + /// + public override object CoerceInputLiteral(StringValueNode valueLiteral) { - if (_enforceFormat) - { - var value = valueSyntax.AsSpan(); - - if (Utf8Parser.TryParse(value, out Guid _, out var consumed, _format[0]) - && consumed == value.Length) - { - return true; - } - } - else if (Guid.TryParse(valueSyntax.Value, out _)) + if (TryParseGuid(valueLiteral.Value, valueLiteral.AsSpan(), out var value)) { - return true; + return value; } - return false; + throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } - protected override Guid ParseLiteral(StringValueNode valueSyntax) + /// + public override object CoerceInputValue(JsonElement inputValue) { - if (_enforceFormat) + if (inputValue.ValueKind is JsonValueKind.String) { - var value = valueSyntax.AsSpan(); + var stringValue = inputValue.GetString()!; + var bytes = Encoding.UTF8.GetBytes(stringValue); - if (Utf8Parser.TryParse(value, out Guid g, out var consumed, _format[0]) - && consumed == value.Length) + if (TryParseGuid(stringValue, bytes, out var value)) { - return g; + return value; } } - else if (Guid.TryParse(valueSyntax.Value, out var g)) - { - return g; - } - - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), - this); - } - - protected override StringValueNode ParseValue(Guid runtimeValue) - { - return new(runtimeValue.ToString(_format)); - } - - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is string s) - { - return new StringValueNode(s); - } - if (resultValue is Guid g) - { - return ParseValue(g); - } - - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, resultValue.GetType()), - this); + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) - { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is Guid guid) - { - resultValue = guid.ToString(_format); - return true; - } + /// + public override void CoerceOutputValue(Guid runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue.ToString(_format)); - resultValue = null; - return false; - } + /// + public override IValueNode ValueToLiteral(Guid runtimeValue) + => new StringValueNode(runtimeValue.ToString(_format)); - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + private bool TryParseGuid(string stringValue, ReadOnlySpan bytes, out Guid value) { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is string s) + if (_enforceFormat) { - var bytes = Encoding.UTF8.GetBytes(s); - - if (_enforceFormat - && Utf8Parser.TryParse(bytes, out Guid guid, out var consumed, _format[0]) + if (Utf8Parser.TryParse(bytes, out Guid guid, out var consumed, _format[0]) && consumed == bytes.Length) { - runtimeValue = guid; - return true; - } - - if (!_enforceFormat && Guid.TryParse(s, out guid)) - { - runtimeValue = guid; + value = guid; return true; } } - - if (resultValue is Guid) + else if (Guid.TryParse(stringValue, out var guid)) { - runtimeValue = resultValue; + value = guid; return true; } - runtimeValue = null; + value = default; return false; } diff --git a/src/HotChocolate/Core/src/Validation/Rules/ValueVisitor.cs b/src/HotChocolate/Core/src/Validation/Rules/ValueVisitor.cs index 5a2259b7fad..de91cb3aead 100644 --- a/src/HotChocolate/Core/src/Validation/Rules/ValueVisitor.cs +++ b/src/HotChocolate/Core/src/Validation/Rules/ValueVisitor.cs @@ -474,7 +474,7 @@ private static bool IsInstanceOfType( if (inputType.IsScalarType()) { - return ((IScalarTypeDefinition)inputType).IsInstanceOfType(value); + return ((IScalarTypeDefinition)inputType).IsValueCompatible(value); } return value.Kind is SyntaxKind.ObjectValue; From 358ccf5ccd3a8801a0ca26447a394cd32c7ceeb1 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 19 Dec 2025 21:34:33 +0100 Subject: [PATCH 047/144] Refactor scalar types to replace IHasRuntimeType with IRuntimeTypeProvider, enhance coercion methods, and improve documentation across multiple files --- .../Composite/Types/FieldSelectionMapType.cs | 127 ++++++++--------- .../Composite/Types/FieldSelectionSetType.cs | 128 ++++++++---------- .../Types/Types/Contracts/IInputFieldInfo.cs | 2 +- .../Types/Types/Contracts/IOutputFieldInfo.cs | 2 +- .../DirectiveTypeConfiguration.cs | 2 +- .../Configurations/ITypeConfiguration.cs | 2 +- .../Descriptors/DirectiveTypeDescriptor~1.cs | 4 +- .../Descriptors/ObjectTypeDescriptorBase~1.cs | 4 +- .../Types/Helpers/FieldDescriptorUtilities.cs | 2 +- .../Core/src/Types/Types/Scalars/ByteType.cs | 4 +- .../Core/src/Types/Types/Scalars/FloatType.cs | 21 ++- .../Types/Types/Scalars/IntegerTypeBase.cs | 10 +- 12 files changed, 145 insertions(+), 163 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs index 44a3642753c..5eb2b3d0694 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs @@ -1,25 +1,45 @@ +using System.Text.Json; using HotChocolate.Fusion.Language; using HotChocolate.Language; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types.Composite; +/// +/// A scalar type that represents a field selection map used in GraphQL Fusion. +/// This type parses and serializes field selection syntax as strings. +/// public sealed class FieldSelectionMapType : ScalarType { + /// + /// Initializes a new instance of the class + /// with the default name "FieldSelectionMap". + /// public FieldSelectionMapType() : this("FieldSelectionMap") { } + /// + /// Initializes a new instance of the class. + /// + /// + /// The name that this scalar shall have. + /// + /// + /// Defines the binding behavior of this scalar type. + /// public FieldSelectionMapType(string name, BindingBehavior bind = BindingBehavior.Explicit) : base(name, bind) { } /// - protected override IValueSelectionNode ParseLiteral(StringValueNode valueSyntax) + public override object CoerceInputLiteral(StringValueNode valueLiteral) { try { - return ParseValueSelection(valueSyntax.Value); + return ParseValueSelection(valueLiteral.Value); } catch (SyntaxException) { @@ -31,90 +51,55 @@ protected override IValueSelectionNode ParseLiteral(StringValueNode valueSyntax) } /// - protected override StringValueNode ParseValue(IValueSelectionNode runtimeValue) - => new(FormatValueSelection(runtimeValue)); - - /// - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is string s) - { - return new StringValueNode(s); - } - - if (resultValue is IValueSelectionNode valueSelection) - { - return new StringValueNode(FormatValueSelection(valueSelection)); - } - - throw new LeafCoercionException( - ErrorBuilder.New() - .SetMessage("The field selection set syntax is invalid.") - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .Build(), - this); - } - - /// - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) - { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is IValueSelectionNode valueSelection) - { - resultValue = FormatValueSelection(valueSelection); - return true; - } - - resultValue = null; - return false; - } - - /// - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + public override object CoerceInputValue(JsonElement inputValue) { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is IValueSelectionNode valueSelection) - { - runtimeValue = valueSelection; - return true; - } - - if (resultValue is string serializedValueSelection) + if (inputValue.ValueKind is JsonValueKind.String) { try { - runtimeValue = ParseValueSelection(serializedValueSelection); - return true; + return ParseValueSelection(inputValue.GetString()!); } catch (SyntaxException) { - runtimeValue = null; - return false; + // Fall through to throw error } } - runtimeValue = null; - return false; + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } + /// + public override void CoerceOutputValue(IValueSelectionNode runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(FormatValueSelection(runtimeValue)); + + /// + public override IValueNode ValueToLiteral(IValueSelectionNode runtimeValue) + => new StringValueNode(FormatValueSelection(runtimeValue)); + + /// + /// Parses a field selection map from a string representation. + /// + /// + /// The source text containing the field selection syntax. + /// + /// + /// An representing the parsed field selection. + /// + /// + /// Thrown when the source text contains invalid field selection syntax. + /// internal static IValueSelectionNode ParseValueSelection(string sourceText) => FieldSelectionMapParser.Parse(sourceText); + /// + /// Formats a field selection node into its string representation. + /// + /// + /// The value selection node to format. + /// + /// + /// A string representation of the field selection. + /// private static string FormatValueSelection(IValueSelectionNode valueSelection) => valueSelection.ToString(); } diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs index 03a4449044d..bd4b00fa7f3 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs @@ -1,24 +1,44 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types.Composite; +/// +/// A scalar type that represents a GraphQL selection set. +/// This type parses and serializes selection set syntax as strings. +/// public sealed class FieldSelectionSetType : ScalarType { + /// + /// Initializes a new instance of the class + /// with the default name "FieldSelectionSet". + /// public FieldSelectionSetType() : this("FieldSelectionSet") { } + /// + /// Initializes a new instance of the class. + /// + /// + /// The name that this scalar shall have. + /// + /// + /// Defines the binding behavior of this scalar type. + /// public FieldSelectionSetType(string name, BindingBehavior bind = BindingBehavior.Explicit) : base(name, bind) { } /// - protected override SelectionSetNode ParseLiteral(StringValueNode valueSyntax) + public override object CoerceInputLiteral(StringValueNode valueLiteral) { try { - return ParseSelectionSet(valueSyntax.Value); + return ParseSelectionSet(valueLiteral.Value); } catch (SyntaxException) { @@ -30,93 +50,59 @@ protected override SelectionSetNode ParseLiteral(StringValueNode valueSyntax) } /// - protected override StringValueNode ParseValue(SelectionSetNode runtimeValue) - => new(SerializeSelectionSet(runtimeValue)); - - /// - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is string s) - { - return new StringValueNode(s); - } - - if (resultValue is SelectionSetNode selectionSet) - { - return new StringValueNode(SerializeSelectionSet(selectionSet)); - } - - throw new LeafCoercionException( - ErrorBuilder.New() - .SetMessage("The field selection set syntax is invalid.") - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .Build(), - this); - } - - /// - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) - { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is SelectionSetNode selectionSet) - { - resultValue = SerializeSelectionSet(selectionSet); - return true; - } - - resultValue = null; - return false; - } - - /// - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + public override object CoerceInputValue(JsonElement inputValue) { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is SelectionSetNode selectionSet) - { - runtimeValue = selectionSet; - return true; - } - - if (resultValue is string serializedSelectionSet) + if (inputValue.ValueKind is JsonValueKind.String) { try { - runtimeValue = ParseSelectionSet(serializedSelectionSet); - return true; + return ParseSelectionSet(inputValue.GetString()!); } catch (SyntaxException) { - runtimeValue = null; - return false; + // Fall through to throw error } } - runtimeValue = null; - return false; + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } + /// + public override void CoerceOutputValue(SelectionSetNode runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(SerializeSelectionSet(runtimeValue)); + + /// + public override IValueNode ValueToLiteral(SelectionSetNode runtimeValue) + => new StringValueNode(SerializeSelectionSet(runtimeValue)); + + /// + /// Parses a GraphQL selection set from a string representation. + /// + /// + /// The source text containing the selection set syntax. + /// Braces are optional and will be added if not present. + /// + /// + /// A representing the parsed selection set. + /// + /// + /// Thrown when the source text contains invalid selection set syntax. + /// internal static SelectionSetNode ParseSelectionSet(string s) { s = $"{{ {s.Trim('{', '}')} }}"; return Utf8GraphQLParser.Syntax.ParseSelectionSet(s); } + /// + /// Serializes a selection set node into its string representation. + /// + /// + /// The selection set node to serialize. + /// + /// + /// A string representation of the selection set without the outer braces. + /// private static string SerializeSelectionSet(SelectionSetNode selectionSet) { var s = selectionSet.ToString(false); diff --git a/src/HotChocolate/Core/src/Types/Types/Contracts/IInputFieldInfo.cs b/src/HotChocolate/Core/src/Types/Types/Contracts/IInputFieldInfo.cs index e014f3c0788..fb34e311338 100644 --- a/src/HotChocolate/Core/src/Types/Types/Contracts/IInputFieldInfo.cs +++ b/src/HotChocolate/Core/src/Types/Types/Contracts/IInputFieldInfo.cs @@ -5,7 +5,7 @@ namespace HotChocolate.Types; /// /// This interface aggregates the most important attributes of an input value definition. /// -public interface IInputValueInfo : INameProvider, ISchemaCoordinateProvider, IHasRuntimeType +public interface IInputValueInfo : INameProvider, ISchemaCoordinateProvider, IRuntimeTypeProvider { /// /// Gets the type of this input field. diff --git a/src/HotChocolate/Core/src/Types/Types/Contracts/IOutputFieldInfo.cs b/src/HotChocolate/Core/src/Types/Types/Contracts/IOutputFieldInfo.cs index ce07f24005e..708e6f05bc2 100644 --- a/src/HotChocolate/Core/src/Types/Types/Contracts/IOutputFieldInfo.cs +++ b/src/HotChocolate/Core/src/Types/Types/Contracts/IOutputFieldInfo.cs @@ -3,7 +3,7 @@ namespace HotChocolate.Types; /// /// This interface aggregates the most important attributes of an output-field definition. /// -public interface IOutputFieldInfo : INameProvider, ISchemaCoordinateProvider, IHasRuntimeType +public interface IOutputFieldInfo : INameProvider, ISchemaCoordinateProvider, IRuntimeTypeProvider { /// /// Gets the return type of this field. diff --git a/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/DirectiveTypeConfiguration.cs b/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/DirectiveTypeConfiguration.cs index aa82fb129e7..2dfdb857cbe 100644 --- a/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/DirectiveTypeConfiguration.cs +++ b/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/DirectiveTypeConfiguration.cs @@ -7,7 +7,7 @@ namespace HotChocolate.Types.Descriptors.Configurations; /// /// Defines the properties of a GraphQL directive. /// -public class DirectiveTypeConfiguration : TypeSystemConfiguration, IHasRuntimeType +public class DirectiveTypeConfiguration : TypeSystemConfiguration, IRuntimeTypeProvider { private Type _clrType = typeof(object); private List? _middlewareComponents; diff --git a/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/ITypeConfiguration.cs b/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/ITypeConfiguration.cs index 08671377256..3614b821694 100644 --- a/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/ITypeConfiguration.cs +++ b/src/HotChocolate/Core/src/Types/Types/Descriptors/Configurations/ITypeConfiguration.cs @@ -7,7 +7,7 @@ namespace HotChocolate.Types.Descriptors.Configurations; /// public interface ITypeConfiguration : ITypeSystemConfiguration - , IHasRuntimeType + , IRuntimeTypeProvider , IDirectiveConfigurationProvider , IExtendsTypeConfiguration { diff --git a/src/HotChocolate/Core/src/Types/Types/Descriptors/DirectiveTypeDescriptor~1.cs b/src/HotChocolate/Core/src/Types/Types/Descriptors/DirectiveTypeDescriptor~1.cs index 32a0dc17730..57adfc4beee 100644 --- a/src/HotChocolate/Core/src/Types/Types/Descriptors/DirectiveTypeDescriptor~1.cs +++ b/src/HotChocolate/Core/src/Types/Types/Descriptors/DirectiveTypeDescriptor~1.cs @@ -11,7 +11,7 @@ namespace HotChocolate.Types.Descriptors; public class DirectiveTypeDescriptor : DirectiveTypeDescriptor , IDirectiveTypeDescriptor - , IHasRuntimeType + , IRuntimeTypeProvider { protected internal DirectiveTypeDescriptor(IDescriptorContext context) : base(context, typeof(T)) @@ -27,7 +27,7 @@ protected internal DirectiveTypeDescriptor( Configuration = definition; } - Type IHasRuntimeType.RuntimeType => Configuration.RuntimeType; + Type IRuntimeTypeProvider.RuntimeType => Configuration.RuntimeType; protected override void OnCompleteArguments( IDictionary arguments, diff --git a/src/HotChocolate/Core/src/Types/Types/Descriptors/ObjectTypeDescriptorBase~1.cs b/src/HotChocolate/Core/src/Types/Types/Descriptors/ObjectTypeDescriptorBase~1.cs index 14cd4046169..af529863f1c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Descriptors/ObjectTypeDescriptorBase~1.cs +++ b/src/HotChocolate/Core/src/Types/Types/Descriptors/ObjectTypeDescriptorBase~1.cs @@ -11,7 +11,7 @@ namespace HotChocolate.Types.Descriptors; public abstract class ObjectTypeDescriptorBase : ObjectTypeDescriptor , IObjectTypeDescriptor - , IHasRuntimeType + , IRuntimeTypeProvider { protected ObjectTypeDescriptorBase( IDescriptorContext context, @@ -27,7 +27,7 @@ protected ObjectTypeDescriptorBase( ObjectTypeConfiguration definition) : base(context, definition) { } - Type IHasRuntimeType.RuntimeType => Configuration.RuntimeType; + Type IRuntimeTypeProvider.RuntimeType => Configuration.RuntimeType; protected override void OnCompleteFields( IDictionary fields, diff --git a/src/HotChocolate/Core/src/Types/Types/Helpers/FieldDescriptorUtilities.cs b/src/HotChocolate/Core/src/Types/Types/Helpers/FieldDescriptorUtilities.cs index 5cf27ed00c7..23c682a6838 100644 --- a/src/HotChocolate/Core/src/Types/Types/Helpers/FieldDescriptorUtilities.cs +++ b/src/HotChocolate/Core/src/Types/Types/Helpers/FieldDescriptorUtilities.cs @@ -35,7 +35,7 @@ public static void AddImplicitFields( Func createdFieldDefinition, IDictionary fields, ISet handledMembers) - where TDescriptor : IHasRuntimeType, IHasDescriptorContext + where TDescriptor : IRuntimeTypeProvider, IHasDescriptorContext where TMember : MemberInfo where TField : FieldConfiguration { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs index 9139fb4771a..9f357a0e60f 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs @@ -47,10 +47,10 @@ public ByteType() { } - public override object CoerceInputLiteral(IntValueNode valueLiteral) + protected override byte OnCoerceInputLiteral(IntValueNode valueLiteral) => valueLiteral.ToByte(); - public override object CoerceInputValue(JsonElement inputValue) + protected override byte OnCoerceInputValue(JsonElement inputValue) => inputValue.GetByte(); public override void CoerceOutputValue(byte runtimeValue, ResultElement resultValue) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs index dbaa2be83b5..c9494adda8a 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs @@ -1,5 +1,7 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; namespace HotChocolate.Types; @@ -11,7 +13,6 @@ namespace HotChocolate.Types; /// /// http://facebook.github.io/graphql/June2018/#sec-Float /// -[SpecScalar] public class FloatType : FloatTypeBase { /// @@ -50,9 +51,19 @@ public FloatType() { } - protected override double OnCoerceInputLiteral(IFloatValueLiteral valueSyntax) => - valueSyntax.ToDouble(); + /// + protected override double OnCoerceInputLiteral(IFloatValueLiteral valueSyntax) + => valueSyntax.ToDouble(); - protected override FloatValueNode ParseValue(double runtimeValue) => - new(runtimeValue); + /// + protected override double OnCoerceInputValue(JsonElement inputValue) + => inputValue.GetDouble(); + + /// + public override void CoerceOutputValue(double runtimeValue, ResultElement resultValue) + => resultValue.SetNumberValue(runtimeValue); + + /// + public override IValueNode ValueToLiteral(double runtimeValue) + => new FloatValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs index 87d99c9166c..a533825d0cb 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs @@ -75,26 +75,26 @@ public override bool IsInstanceOfType(object runtimeValue) } /// - public sealed override object CoerceInputLiteral(IValueNode valueSyntax) + public sealed override object CoerceInputLiteral(IValueNode valueLiteral) { - if (valueSyntax is IntValueNode intLiteral && IsInstanceOfType(intLiteral)) + if (valueLiteral is IntValueNode intLiteral && IsInstanceOfType(intLiteral)) { return OnCoerceInputLiteral(intLiteral); } - throw CreateCoerceInputLiteralError(valueSyntax); + throw CreateCoerceInputLiteralError(valueLiteral); } /// /// Coerces an int literal into the runtime value. /// - /// + /// /// The int literal to coerce. /// /// /// Returns the runtime value representation. /// - protected abstract TRuntimeType OnCoerceInputLiteral(IntValueNode valueSyntax); + protected abstract TRuntimeType OnCoerceInputLiteral(IntValueNode valueLiteral); /// public sealed override object CoerceInputValue(JsonElement inputValue) From fae385c0d2f88786b17e661a7c4455c4d74277e5 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 19 Dec 2025 22:44:35 +0100 Subject: [PATCH 048/144] Refactor scalar types to replace IHasRuntimeType with IRuntimeTypeProvider across multiple files and enhance coercion methods --- .../InputObjectTypeDescriptor~1.cs | 4 +- .../Descriptors/InterfaceTypeDescriptor~1.cs | 4 +- .../Core/src/Types/Types/DirectiveType.cs | 2 +- .../Core/src/Types/Types/EnumType.cs | 158 ++++++------------ .../Core/src/Types/Types/FieldBase.cs | 2 +- .../src/Types/Types/Scalars/DecimalType.cs | 17 +- .../Core/src/Types/Utilities/ThrowHelper.cs | 10 +- 7 files changed, 78 insertions(+), 119 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Types/Descriptors/InputObjectTypeDescriptor~1.cs b/src/HotChocolate/Core/src/Types/Types/Descriptors/InputObjectTypeDescriptor~1.cs index f126a20f439..fa870463525 100644 --- a/src/HotChocolate/Core/src/Types/Types/Descriptors/InputObjectTypeDescriptor~1.cs +++ b/src/HotChocolate/Core/src/Types/Types/Descriptors/InputObjectTypeDescriptor~1.cs @@ -10,7 +10,7 @@ namespace HotChocolate.Types.Descriptors; public class InputObjectTypeDescriptor : InputObjectTypeDescriptor , IInputObjectTypeDescriptor - , IHasRuntimeType + , IRuntimeTypeProvider { protected internal InputObjectTypeDescriptor(IDescriptorContext context) : base(context, typeof(T)) @@ -25,7 +25,7 @@ protected internal InputObjectTypeDescriptor( { } - Type IHasRuntimeType.RuntimeType => Configuration.RuntimeType; + Type IRuntimeTypeProvider.RuntimeType => Configuration.RuntimeType; protected override void OnCompleteFields( IDictionary fields, diff --git a/src/HotChocolate/Core/src/Types/Types/Descriptors/InterfaceTypeDescriptor~1.cs b/src/HotChocolate/Core/src/Types/Types/Descriptors/InterfaceTypeDescriptor~1.cs index c17662c8479..03636aa3deb 100644 --- a/src/HotChocolate/Core/src/Types/Types/Descriptors/InterfaceTypeDescriptor~1.cs +++ b/src/HotChocolate/Core/src/Types/Types/Descriptors/InterfaceTypeDescriptor~1.cs @@ -11,7 +11,7 @@ namespace HotChocolate.Types.Descriptors; public class InterfaceTypeDescriptor : InterfaceTypeDescriptor , IInterfaceTypeDescriptor - , IHasRuntimeType + , IRuntimeTypeProvider { protected internal InterfaceTypeDescriptor(IDescriptorContext context) : base(context, typeof(T)) @@ -26,7 +26,7 @@ protected internal InterfaceTypeDescriptor( { } - Type IHasRuntimeType.RuntimeType => Configuration.RuntimeType; + Type IRuntimeTypeProvider.RuntimeType => Configuration.RuntimeType; protected override void OnCompleteFields( IDictionary fields, diff --git a/src/HotChocolate/Core/src/Types/Types/DirectiveType.cs b/src/HotChocolate/Core/src/Types/Types/DirectiveType.cs index c9553efa136..cf4d3395efc 100644 --- a/src/HotChocolate/Core/src/Types/Types/DirectiveType.cs +++ b/src/HotChocolate/Core/src/Types/Types/DirectiveType.cs @@ -18,7 +18,7 @@ namespace HotChocolate.Types; public partial class DirectiveType : TypeSystemObject , IDirectiveDefinition - , IHasRuntimeType + , IRuntimeTypeProvider , ITypeIdentityProvider { private Action? _configure; diff --git a/src/HotChocolate/Core/src/Types/Types/EnumType.cs b/src/HotChocolate/Core/src/Types/Types/EnumType.cs index 4d60433e75b..262e3bf7cca 100644 --- a/src/HotChocolate/Core/src/Types/Types/EnumType.cs +++ b/src/HotChocolate/Core/src/Types/Types/EnumType.cs @@ -1,8 +1,10 @@ using System.Diagnostics.CodeAnalysis; +using System.Text.Json; using HotChocolate.Language; -using HotChocolate.Properties; +using HotChocolate.Text.Json; using HotChocolate.Types.Descriptors.Configurations; using static HotChocolate.Serialization.SchemaDebugFormatter; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -46,6 +48,18 @@ public partial class EnumType /// protected IReadOnlyDictionary ValueLookup => _valueLookup; + /// + /// Tries to get an enum value by its name. + /// + /// + /// The name of the enum value to retrieve. + /// + /// + /// When this method returns, contains the enum value if found; otherwise, null. + /// + /// + /// true if the enum value was found; otherwise, false. + /// public bool TryGetValue(string name, [NotNullWhen(true)] out EnumValue? value) { ArgumentException.ThrowIfNullOrEmpty(name); @@ -71,21 +85,20 @@ public bool TryGetRuntimeValue(string name, [NotNullWhen(true)] out object? runt /// public bool IsValueCompatible(IValueNode valueSyntax) { - ArgumentNullException.ThrowIfNull(valueSyntax); - - if (valueSyntax is NullValueNode) - { - return true; - } - if (valueSyntax is EnumValueNode ev) { return Values.ContainsName(ev.Value); } - if (valueSyntax is StringValueNode sv) + return false; + } + + /// + public bool IsValueCompatible(JsonElement inputValue) + { + if (inputValue.ValueKind is JsonValueKind.String) { - return Values.ContainsName(sv.Value); + return Values.ContainsName(inputValue.GetString()!); } return false; @@ -93,143 +106,76 @@ public bool IsValueCompatible(IValueNode valueSyntax) /// public bool IsInstanceOfType(object? runtimeValue) - => runtimeValue is null || RuntimeType.IsInstanceOfType(runtimeValue); + => RuntimeType.IsInstanceOfType(runtimeValue); /// - public object? CoerceInputLiteral(IValueNode valueSyntax) + public object CoerceInputLiteral(IValueNode valueLiteral) { - ArgumentNullException.ThrowIfNull(valueSyntax); - - if (valueSyntax is EnumValueNode evn - && Values.TryGetValue(evn.Value, out var ev)) - { - return ev.Value; - } - - if (valueSyntax is StringValueNode svn - && Values.TryGetValue(svn.Value, out ev)) + if (valueLiteral is EnumValueNode enumValueLiteral + && Values.TryGetValue(enumValueLiteral.Value, out var ev)) { return ev.Value; } - if (valueSyntax is NullValueNode) - { - return null; - } - - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, valueSyntax.GetType()), - this); + throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } /// - public IValueNode CoerceInputValue(object? runtimeValue) + public object CoerceInputValue(JsonElement inputValue) { - if (runtimeValue is null) + if (inputValue.ValueKind is JsonValueKind.String + && Values.TryGetValue(inputValue.GetString()!, out var enumValue)) { - return NullValueNode.Default; - } - - if (_valueLookup.TryGetValue(runtimeValue, out var enumValue)) - { - return new EnumValueNode(enumValue.Name); + return enumValue.Value; } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, runtimeValue.GetType()), - this); + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } /// - public IValueNode ParseResult(object? resultValue) + public void CoerceOutputValue(object runtimeValue, ResultElement resultValue) { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is string s - && Values.TryGetValue(s, out var enumValue)) - { - return new EnumValueNode(enumValue.Name); - } - - if (_valueLookup.TryGetValue(resultValue, out enumValue)) - { - return new EnumValueNode(enumValue.Name); - } - - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()), - this); - } - - /// - public object? Serialize(object? runtimeValue) - { - if (runtimeValue is null) - { - return null; - } - if (RuntimeType.IsInstanceOfType(runtimeValue) && _valueLookup.TryGetValue(runtimeValue, out var enumValue)) { - return enumValue.Name; + resultValue.SetStringValue(enumValue.Name); + return; } // schema first unbound enum type - if (RuntimeType == typeof(object)) + else if (RuntimeType == typeof(object)) { var name = _naming.GetEnumValueName(runtimeValue); if (Values.TryGetValue(name, out enumValue)) { - return enumValue.Name; + resultValue.SetStringValue(enumValue.Name); + return; } } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_Serialize(Name), - this); - } - - /// - public object? Deserialize(object? resultValue) - { - if (TryDeserialize(resultValue, out var runtimeValue)) - { - return runtimeValue; - } - - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_Deserialize(Name), - this); + throw Scalar_Cannot_CoerceOutputValue(this, runtimeValue); } /// - public bool TryDeserialize(object? resultValue, out object? runtimeValue) + public IValueNode ValueToLiteral(object runtimeValue) { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is string s - && Values.TryGetValue(s, out var enumValue)) + if (RuntimeType.IsInstanceOfType(runtimeValue) + && _valueLookup.TryGetValue(runtimeValue, out var enumValue)) { - runtimeValue = enumValue.Value; - return true; + return new EnumValueNode(enumValue.Name); } - if (_valueLookup.TryGetValue(resultValue, out enumValue)) + // schema first unbound enum type + else if (RuntimeType == typeof(object)) { - runtimeValue = enumValue.Value; - return true; + var name = _naming.GetEnumValueName(runtimeValue); + if (Values.TryGetValue(name, out enumValue)) + { + return new EnumValueNode(enumValue.Name); + } } - runtimeValue = null; - return false; + throw Scalar_Cannot_CoerceOutputValue(this, runtimeValue); } /// diff --git a/src/HotChocolate/Core/src/Types/Types/FieldBase.cs b/src/HotChocolate/Core/src/Types/Types/FieldBase.cs index 6a33d9a2156..2f8364241ac 100644 --- a/src/HotChocolate/Core/src/Types/Types/FieldBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/FieldBase.cs @@ -12,7 +12,7 @@ public abstract class FieldBase : IFieldDefinition , IFieldCompletion , IFieldIndexProvider - , IHasRuntimeType + , IRuntimeTypeProvider { private FieldConfiguration? _config; private CoreFieldFlags _coreFlags; diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs index 02bb4267322..f8b7d46324b 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs @@ -1,5 +1,7 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; namespace HotChocolate.Types; @@ -35,7 +37,6 @@ public DecimalType( : base(name, min, max, bind) { Description = description; - SerializationType = ScalarSerializationType.Float; } /// @@ -47,9 +48,19 @@ public DecimalType() { } + /// protected override decimal OnCoerceInputLiteral(IFloatValueLiteral valueSyntax) => valueSyntax.ToDecimal(); - protected override FloatValueNode ParseValue(decimal runtimeValue) - => new(runtimeValue); + /// + protected override decimal OnCoerceInputValue(JsonElement inputValue) + => inputValue.GetDecimal(); + + /// + public override void CoerceOutputValue(decimal runtimeValue, ResultElement resultValue) + => resultValue.SetNumberValue(runtimeValue); + + /// + public override IValueNode ValueToLiteral(decimal runtimeValue) + => new FloatValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs index 294e6417ab8..47bab87c820 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs @@ -611,7 +611,7 @@ public static LeafCoercionException InvalidTypeConversion( } public static LeafCoercionException Scalar_Cannot_CoerceInputLiteral( - ScalarType scalarType, + ITypeDefinition scalarType, IValueNode valueLiteral) { return string.Format( @@ -622,7 +622,7 @@ public static LeafCoercionException Scalar_Cannot_CoerceInputLiteral( } public static LeafCoercionException Scalar_Cannot_CoerceInputValue( - ScalarType scalarType, + ITypeDefinition scalarType, JsonElement inputValue) { return string.Format( @@ -634,7 +634,7 @@ public static LeafCoercionException Scalar_Cannot_CoerceInputValue( public static LeafCoercionException Scalar_Cannot_ConvertValueToLiteral( - ScalarType scalarType, + ITypeDefinition scalarType, object runtimeValue) { // return string.Format( @@ -645,7 +645,9 @@ public static LeafCoercionException Scalar_Cannot_ConvertValueToLiteral( throw new InvalidOperationException(); } - public static LeafCoercionException Scalar_Cannot_CoerceOutputValue(ScalarType scalarType, object runtimeValue) + public static LeafCoercionException Scalar_Cannot_CoerceOutputValue( + ITypeDefinition scalarType, + object runtimeValue) { return string.Format( CultureInfo.InvariantCulture, From 06d7f21c6164d19eac2674b87c0062ac8f5447d9 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 19 Dec 2025 22:55:04 +0100 Subject: [PATCH 049/144] Refactor type handling to replace IHasRuntimeType with IRuntimeTypeProvider in multiple files and enhance documentation --- .../Core/src/Types/Types/FieldBase.cs | 113 ++++++++++++++++++ .../Core/src/Types/Types/NamedTypeBase.cs | 1 - .../src/Types/Types/NamedTypeExtensionBase.cs | 2 + .../Serialization/InputObjectCompiler.cs | 6 +- 4 files changed, 118 insertions(+), 4 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Types/FieldBase.cs b/src/HotChocolate/Core/src/Types/Types/FieldBase.cs index 2f8364241ac..773df3e2800 100644 --- a/src/HotChocolate/Core/src/Types/Types/FieldBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/FieldBase.cs @@ -8,6 +8,10 @@ namespace HotChocolate.Types; +/// +/// Represents the base class for all field implementations in the type system. +/// This class provides common functionality for object fields, interface fields, and input fields. +/// public abstract class FieldBase : IFieldDefinition , IFieldCompletion @@ -17,6 +21,15 @@ public abstract class FieldBase private FieldConfiguration? _config; private CoreFieldFlags _coreFlags; + /// + /// Initializes a new instance of the class. + /// + /// + /// The field configuration containing the field's metadata. + /// + /// + /// The index of this field in the declaring type's field collection. + /// protected FieldBase(FieldConfiguration configuration, int index) { _config = configuration ?? throw new ArgumentNullException(nameof(configuration)); @@ -34,6 +47,16 @@ protected FieldBase(FieldConfiguration configuration, int index) Type = null!; } + /// + /// Initializes a new instance of the class by copying + /// from an original field and applying a new type. + /// + /// + /// The original field to copy from. + /// + /// + /// The new type to apply to this field. + /// protected FieldBase(FieldBase original, IType type) { ArgumentNullException.ThrowIfNull(original); @@ -109,6 +132,15 @@ internal CoreFieldFlags Flags /// public IFeatureCollection Features { get; private set; } + /// + /// Completes the field initialization during the type system's completion phase. + /// + /// + /// The type completion context. + /// + /// + /// The type system member that declares this field. + /// internal void CompleteField( ITypeCompletionContext context, ITypeSystemMember declaringMember) @@ -118,6 +150,18 @@ internal void CompleteField( Features = _config!.GetFeatures(); } + /// + /// Called during field completion to allow derived classes to complete field-specific logic. + /// + /// + /// The type completion context. + /// + /// + /// The type system member that declares this field. + /// + /// + /// The field configuration. + /// protected virtual void OnCompleteField( ITypeCompletionContext context, ITypeSystemMember declaringMember, @@ -145,6 +189,15 @@ void IFieldCompletion.CompleteField( ITypeSystemMember declaringMember) => CompleteField(context, declaringMember); + /// + /// Completes the field's metadata (directives) during the type system's completion phase. + /// + /// + /// The type completion context. + /// + /// + /// The type system member that declares this field. + /// private void CompleteMetadata( ITypeCompletionContext context, ITypeSystemMember declaringMember) @@ -153,6 +206,18 @@ private void CompleteMetadata( OnCompleteMetadata(context, declaringMember, _config!); } + /// + /// Called during metadata completion to allow derived classes to complete metadata-specific logic. + /// + /// + /// The type completion context. + /// + /// + /// The type system member that declares this field. + /// + /// + /// The field configuration. + /// protected virtual void OnCompleteMetadata( ITypeCompletionContext context, ITypeSystemMember declaringMember, @@ -170,6 +235,15 @@ void IFieldCompletion.CompleteMetadata( ITypeSystemMember declaringMember) => CompleteMetadata(context, declaringMember); + /// + /// Prepares the field for execution during the type system's completion phase. + /// + /// + /// The type completion context. + /// + /// + /// The type system member that declares this field. + /// private void MakeExecutable( ITypeCompletionContext context, ITypeSystemMember declaringMember) @@ -178,6 +252,18 @@ private void MakeExecutable( OnMakeExecutable(context, declaringMember, _config!); } + /// + /// Called during the make executable phase to allow derived classes to prepare for execution. + /// + /// + /// The type completion context. + /// + /// + /// The type system member that declares this field. + /// + /// + /// The field configuration. + /// protected virtual void OnMakeExecutable( ITypeCompletionContext context, ITypeSystemMember declaringMember, @@ -190,6 +276,15 @@ void IFieldCompletion.MakeExecutable( ITypeSystemMember declaringMember) => MakeExecutable(context, declaringMember); + /// + /// Finalizes the field and seals it from further modifications. + /// + /// + /// The type completion context. + /// + /// + /// The type system member that declares this field. + /// private void FinalizeField( ITypeCompletionContext context, ITypeSystemMember declaringMember) @@ -201,6 +296,18 @@ private void FinalizeField( _coreFlags |= CoreFieldFlags.Sealed; } + /// + /// Called during finalization to allow derived classes to perform final setup before the field is sealed. + /// + /// + /// The type completion context. + /// + /// + /// The type system member that declares this field. + /// + /// + /// The field configuration. + /// protected virtual void OnFinalizeField( ITypeCompletionContext context, ITypeSystemMember declaringMember, @@ -213,6 +320,12 @@ void IFieldCompletion.Finalize( ITypeSystemMember declaringMember) => FinalizeField(context, declaringMember); + /// + /// Asserts that the field is still mutable and has not been sealed. + /// + /// + /// Thrown when the field has already been sealed and cannot be modified. + /// private void AssertMutable() { if ((_coreFlags & CoreFieldFlags.Sealed) == CoreFieldFlags.Sealed) diff --git a/src/HotChocolate/Core/src/Types/Types/NamedTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/NamedTypeBase.cs index 25de2e60edf..5e33c77bc76 100644 --- a/src/HotChocolate/Core/src/Types/Types/NamedTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/NamedTypeBase.cs @@ -13,7 +13,6 @@ namespace HotChocolate.Types; public abstract class NamedTypeBase : TypeSystemObject , ITypeDefinition - , IHasRuntimeType , ITypeIdentityProvider , ITypeConfigurationProvider where TConfiguration : TypeSystemConfiguration, IDirectiveConfigurationProvider, ITypeConfiguration diff --git a/src/HotChocolate/Core/src/Types/Types/NamedTypeExtensionBase.cs b/src/HotChocolate/Core/src/Types/Types/NamedTypeExtensionBase.cs index b796c9d94b8..e8155481ee3 100644 --- a/src/HotChocolate/Core/src/Types/Types/NamedTypeExtensionBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/NamedTypeExtensionBase.cs @@ -29,6 +29,8 @@ IReadOnlyDirectiveCollection IDirectivesProvider.Directives SchemaCoordinate ISchemaCoordinateProvider.Coordinate => throw new NotSupportedException(); + public Type RuntimeType => ExtendsType ?? typeof(object); + protected abstract void Merge( ITypeCompletionContext context, ITypeDefinition type); diff --git a/src/HotChocolate/Core/src/Types/Utilities/Serialization/InputObjectCompiler.cs b/src/HotChocolate/Core/src/Types/Utilities/Serialization/InputObjectCompiler.cs index 1cccf1289a1..0173dca652d 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/Serialization/InputObjectCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/Serialization/InputObjectCompiler.cs @@ -171,7 +171,7 @@ private static Expression CreateInstance( Dictionary fields, ConstructorInfo constructor, Expression fieldValues) - where T : class, IInputValueDefinition, IPropertyProvider, IHasRuntimeType, IFieldIndexProvider + where T : class, IInputValueDefinition, IPropertyProvider, IRuntimeTypeProvider, IFieldIndexProvider => Expression.New( constructor, CompileAssignParameters(fields, constructor, fieldValues)); @@ -180,7 +180,7 @@ private static Expression[] CompileAssignParameters( Dictionary fields, ConstructorInfo constructor, Expression fieldValues) - where T : class, IInputValueDefinition, IPropertyProvider, IHasRuntimeType, IFieldIndexProvider + where T : class, IInputValueDefinition, IPropertyProvider, IRuntimeTypeProvider, IFieldIndexProvider { var parameters = constructor.GetParameters(); @@ -232,7 +232,7 @@ private static void CompileSetProperties( IEnumerable fields, Expression fieldValues, List currentBlock) - where T : IInputValueDefinition, IPropertyProvider, IFieldIndexProvider, IHasRuntimeType + where T : IInputValueDefinition, IPropertyProvider, IFieldIndexProvider, IRuntimeTypeProvider { foreach (var field in fields) { From 33bfeacb9479442df5f7e4818bec76c44c2a3cc9 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Fri, 19 Dec 2025 23:10:48 +0100 Subject: [PATCH 050/144] Refactor JsonType to improve value coercion methods and enhance compatibility checks for JSON elements --- .../Core/src/Types/Types/Scalars/JsonType.cs | 147 +++++++++++------- 1 file changed, 94 insertions(+), 53 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs index b3e2c90c026..93bce01fd3e 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs @@ -3,15 +3,17 @@ using HotChocolate.Buffers; using HotChocolate.Language; using HotChocolate.Language.Visitors; -using HotChocolate.Properties; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; /// +/// /// The JSON scalar type represents a JSON node which can be a string, /// a number a boolean, an array, an object or null. -/// -/// The runtime representation of the JSON scalar is an . +/// +/// The runtime representation of the JSON scalar is an . /// public sealed class JsonType : ScalarType { @@ -21,7 +23,6 @@ public sealed class JsonType : ScalarType public JsonType(string name, BindingBehavior bind = BindingBehavior.Explicit) : base(name, bind) { - SerializationType = ScalarSerializationType.Any; } /// @@ -33,61 +34,101 @@ public JsonType() { } - /// - /// Defines if the specified can be handled by the JSON scalar. - /// - /// - /// The GraphQL value syntax that shall be evaluated. - /// - /// - /// true if the specified can be handled - /// by the JSON scalar; otherwise false. - /// - public override bool IsValueCompatible(IValueNode valueSyntax) - => true; - - /// - /// Parses the specified GraphQL value syntax into a . - /// - /// - /// The GraphQL value syntax that shall be parsed. - /// - /// - /// Returns null or a . - /// - public override object CoerceInputLiteral(IValueNode valueSyntax) - => JsonFormatter.Format(valueSyntax); - - /// - /// Parses the runtime value into GraphQL value syntax. - /// - /// - /// The runtime value. - /// - /// - /// Returns GraphQL value syntax. - /// - public override IValueNode CoerceInputValue(object? runtimeValue) + /// + public override ScalarSerializationType SerializationType + => ScalarSerializationType.Any; + + /// + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral.Kind is + SyntaxKind.ObjectValue or + SyntaxKind.ListValue or + SyntaxKind.StringValue or + SyntaxKind.IntValue or + SyntaxKind.FloatValue or + SyntaxKind.BooleanValue; + + /// + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is + JsonValueKind.Object or + JsonValueKind.Array or + JsonValueKind.String or + JsonValueKind.Number or + JsonValueKind.True or + JsonValueKind.False; + + /// + public override object CoerceInputLiteral(IValueNode valueLiteral) + => JsonFormatter.Format(valueLiteral); + + /// + public override object CoerceInputValue(JsonElement inputValue) + => inputValue.Clone(); + + /// + public override void CoerceOutputValue(JsonElement runtimeValue, ResultElement resultValue) { - if (runtimeValue is null) + switch (runtimeValue.ValueKind) { - return NullValueNode.Default; - } + case JsonValueKind.String: + resultValue.SetStringValue(JsonMarshal.GetRawUtf8Value(runtimeValue)); + break; - if (runtimeValue is JsonElement element) - { - return JsonParser.Parse(element); - } + case JsonValueKind.Number: + resultValue.SetNumberValue(JsonMarshal.GetRawUtf8Value(runtimeValue)); + break; - throw CreateParseValueError(runtimeValue); - } + case JsonValueKind.True: + resultValue.SetBooleanValue(true); + break; + + case JsonValueKind.False: + resultValue.SetBooleanValue(false); + break; + + case JsonValueKind.Null: + resultValue.SetNullValue(); + break; + + case JsonValueKind.Array: + { + var length = runtimeValue.GetArrayLength(); + resultValue.SetArrayValue(length); + + using var enumerator = runtimeValue.EnumerateArray().GetEnumerator(); + + foreach (var element in resultValue.EnumerateArray()) + { + enumerator.MoveNext(); + CoerceOutputValue(enumerator.Current, element); + } + break; + } + + case JsonValueKind.Object: + { + var length = runtimeValue.GetPropertyCount(); + resultValue.SetObjectValue(length); - /// - public override IValueNode ParseResult(object? resultValue) - => CoerceInputValue(resultValue); + using var enumerator = runtimeValue.EnumerateObject().GetEnumerator(); + + foreach (var property in resultValue.EnumerateObject()) + { + enumerator.MoveNext(); + CoerceOutputValue(enumerator.Current.Value, property.Value); + } + break; + } + + default: + throw Scalar_Cannot_CoerceOutputValue(this, runtimeValue); + } + } - private LeafCoercionException CreateParseValueError(object runtimeValue) - => new(TypeResourceHelper.Scalar_Cannot_CoerceInputValue(Name, runtimeValue.GetType()), this); + /// + public override IValueNode ValueToLiteral(JsonElement runtimeValue) + => JsonParser.Parse(runtimeValue); private static class JsonParser { From ee9748030c4cda60f834d1b2e683b3dcd3af348b Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Sun, 21 Dec 2025 11:37:23 +0100 Subject: [PATCH 051/144] Add RuntimeType implementation to various type definitions for improved type handling --- .../src/Fusion.Execution.Types/FusionComplexTypeDefinition.cs | 2 ++ .../src/Fusion.Execution.Types/FusionEnumTypeDefinition.cs | 2 ++ .../Fusion.Execution.Types/FusionInputObjectTypeDefinition.cs | 2 ++ .../src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs | 2 ++ .../src/Fusion.Execution.Types/FusionUnionTypeDefinition.cs | 2 ++ .../Mutable/src/Types.Mutable/MutableComplexTypeDefinition.cs | 2 ++ .../Mutable/src/Types.Mutable/MutableEnumTypeDefinition.cs | 2 ++ .../src/Types.Mutable/MutableInputObjectTypeDefinition.cs | 2 ++ .../Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs | 2 ++ .../Mutable/src/Types.Mutable/MutableUnionTypeDefinition.cs | 2 ++ 10 files changed, 20 insertions(+) diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionComplexTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionComplexTypeDefinition.cs index ecf5166250b..073a86c5cca 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionComplexTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionComplexTypeDefinition.cs @@ -52,6 +52,8 @@ protected FusionComplexTypeDefinition( /// public SchemaCoordinate Coordinate => new(Name, ofDirective: false); + Type IRuntimeTypeProvider.RuntimeType => typeof(object); + /// /// Gets a value indicating whether this type is marked as inaccessible. /// diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumTypeDefinition.cs index a3c1f6be78f..d2c570102f4 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumTypeDefinition.cs @@ -63,6 +63,8 @@ public FusionEnumTypeDefinition( /// public SchemaCoordinate Coordinate => new(Name, ofDirective: false); + Type IRuntimeTypeProvider.RuntimeType => typeof(object); + /// /// Gets a value indicating whether this enum type is marked as inaccessible. /// diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputObjectTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputObjectTypeDefinition.cs index a26cd4a7569..17bf4a8d55f 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputObjectTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputObjectTypeDefinition.cs @@ -54,6 +54,8 @@ public FusionInputObjectTypeDefinition( /// public SchemaCoordinate Coordinate => new(Name, ofDirective: false); + Type IRuntimeTypeProvider.RuntimeType => typeof(object); + /// /// Gets the name of this input object type. /// diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs index e8bd71549c6..976f30f7a49 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs @@ -58,6 +58,8 @@ public FusionScalarTypeDefinition( /// public SchemaCoordinate Coordinate => new(Name, ofDirective: false); + Type IRuntimeTypeProvider.RuntimeType => typeof(object); + /// /// Gets a value indicating whether this scalar type is marked as inaccessible. /// diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionUnionTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionUnionTypeDefinition.cs index 6b0afbbed38..22a917c6772 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionUnionTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionUnionTypeDefinition.cs @@ -55,6 +55,8 @@ public FusionUnionTypeDefinition(string name, string? description, bool isInacce /// public SchemaCoordinate Coordinate => new(Name, ofDirective: false); + Type IRuntimeTypeProvider.RuntimeType => typeof(object); + /// /// Gets a value indicating whether this union type is marked as inaccessible. /// diff --git a/src/HotChocolate/Mutable/src/Types.Mutable/MutableComplexTypeDefinition.cs b/src/HotChocolate/Mutable/src/Types.Mutable/MutableComplexTypeDefinition.cs index 5b9477457da..ca9108775f6 100644 --- a/src/HotChocolate/Mutable/src/Types.Mutable/MutableComplexTypeDefinition.cs +++ b/src/HotChocolate/Mutable/src/Types.Mutable/MutableComplexTypeDefinition.cs @@ -42,6 +42,8 @@ public string Name /// public SchemaCoordinate Coordinate => new(Name, ofDirective: false); + Type IRuntimeTypeProvider.RuntimeType => typeof(object); + /// /// Gets the interfaces that are implemented by this type. /// diff --git a/src/HotChocolate/Mutable/src/Types.Mutable/MutableEnumTypeDefinition.cs b/src/HotChocolate/Mutable/src/Types.Mutable/MutableEnumTypeDefinition.cs index af41a038420..4ac570df53b 100644 --- a/src/HotChocolate/Mutable/src/Types.Mutable/MutableEnumTypeDefinition.cs +++ b/src/HotChocolate/Mutable/src/Types.Mutable/MutableEnumTypeDefinition.cs @@ -39,6 +39,8 @@ public string Name /// public string? Description { get; set; } + Type IRuntimeTypeProvider.RuntimeType => typeof(object); + public DirectiveCollection Directives => _directives ??= []; diff --git a/src/HotChocolate/Mutable/src/Types.Mutable/MutableInputObjectTypeDefinition.cs b/src/HotChocolate/Mutable/src/Types.Mutable/MutableInputObjectTypeDefinition.cs index 8c1259a6366..eb3cea38f35 100644 --- a/src/HotChocolate/Mutable/src/Types.Mutable/MutableInputObjectTypeDefinition.cs +++ b/src/HotChocolate/Mutable/src/Types.Mutable/MutableInputObjectTypeDefinition.cs @@ -43,6 +43,8 @@ public string Name public SchemaCoordinate Coordinate => new(Name, ofDirective: false); + Type IRuntimeTypeProvider.RuntimeType => typeof(object); + /// public DirectiveCollection Directives => _directives ??= []; diff --git a/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs b/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs index 50fa30dc119..48f5bbb7e67 100644 --- a/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs +++ b/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs @@ -39,6 +39,8 @@ public string Name /// public SchemaCoordinate Coordinate => new(Name, ofDirective: false); + Type IRuntimeTypeProvider.RuntimeType => typeof(object); + /// public bool IsIntrospectionType { get; set; } diff --git a/src/HotChocolate/Mutable/src/Types.Mutable/MutableUnionTypeDefinition.cs b/src/HotChocolate/Mutable/src/Types.Mutable/MutableUnionTypeDefinition.cs index 4eb0ceac90a..3042e38cd9d 100644 --- a/src/HotChocolate/Mutable/src/Types.Mutable/MutableUnionTypeDefinition.cs +++ b/src/HotChocolate/Mutable/src/Types.Mutable/MutableUnionTypeDefinition.cs @@ -36,6 +36,8 @@ public string Name /// public string? Description { get; set; } + Type IRuntimeTypeProvider.RuntimeType => typeof(object); + public DirectiveCollection Directives => _directives ??= []; From 983c26ebc8e3661114e4e5c959eaa8a2ae230705 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Sun, 21 Dec 2025 22:04:13 +0100 Subject: [PATCH 052/144] Refactor type handling to replace IHasRuntimeType with IRuntimeTypeProvider in multiple files for improved type management --- .../src/Types/Configuration/TypeRegistrar.cs | 6 +- .../src/Types/Internal/FieldInitHelper.cs | 2 +- src/HotChocolate/Core/src/Types/Schema.cs | 2 +- .../src/Types/Text/Json/ResultDocument.cs | 18 +- .../Types/Types/Extensions/TypeExtensions.cs | 4 +- .../Core/src/Types/Types/Scalars/AnyType.cs | 311 ++++++++++++------ .../Execution/VariableCoercionHelper.cs | 9 +- 7 files changed, 236 insertions(+), 116 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs b/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs index c00a001b1e4..e0ff47b0e11 100644 --- a/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs +++ b/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs @@ -58,15 +58,15 @@ public void Register( RegisterTypeAndResolveReferences(registeredType); - if (obj is not IHasRuntimeType hasRuntimeType - || hasRuntimeType.RuntimeType == typeof(object)) + if (obj is not IRuntimeTypeProvider runtimeTypeProvider + || runtimeTypeProvider.RuntimeType == typeof(object)) { return; } var runtimeTypeRef = _context.TypeInspector.GetTypeRef( - hasRuntimeType.RuntimeType, + runtimeTypeProvider.RuntimeType, SchemaTypeReference.InferTypeContext(obj), scope); diff --git a/src/HotChocolate/Core/src/Types/Internal/FieldInitHelper.cs b/src/HotChocolate/Core/src/Types/Internal/FieldInitHelper.cs index 1059fff59e1..6c3a8b114bf 100644 --- a/src/HotChocolate/Core/src/Types/Internal/FieldInitHelper.cs +++ b/src/HotChocolate/Core/src/Types/Internal/FieldInitHelper.cs @@ -186,7 +186,7 @@ internal static Type CompleteRuntimeType(IType type, Type? runtimeType) internal static Type CompleteRuntimeType(IType type, Type? runtimeType, out bool isOptional) { - runtimeType ??= (type as IHasRuntimeType)?.RuntimeType ?? typeof(object); + runtimeType ??= (type as IRuntimeTypeProvider)?.RuntimeType ?? typeof(object); if (runtimeType.IsGenericType && runtimeType.GetGenericTypeDefinition() == typeof(Optional<>)) diff --git a/src/HotChocolate/Core/src/Types/Schema.cs b/src/HotChocolate/Core/src/Types/Schema.cs index 3f553ddd200..61e1df3dc01 100644 --- a/src/HotChocolate/Core/src/Types/Schema.cs +++ b/src/HotChocolate/Core/src/Types/Schema.cs @@ -193,7 +193,7 @@ public bool TryGetRuntimeType(string typeName, [NotNullWhen(true)] out Type? run ArgumentException.ThrowIfNullOrEmpty(typeName); if (Types.TryGetType(typeName, out var type) - && type is IHasRuntimeType ct + && type is IRuntimeTypeProvider ct && ct.RuntimeType != typeof(object)) { runtimeType = ct.RuntimeType; diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index 857764161b6..f1312d8c414 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -406,9 +406,10 @@ private ReadOnlySpan ReadRawValue(DbRow row) case ElementTokenType.False: return JsonConstants.FalseValue; - case ElementTokenType.PropertyName: + case ElementTokenType.PropertyName when row.OperationReferenceType is OperationReferenceType.Selection: return _operation.GetSelectionById(row.OperationReferenceId).Utf8ResponseName; + case ElementTokenType.PropertyName: case ElementTokenType.String: case ElementTokenType.Number: return ReadLocalData(row.Location, row.SizeOrLength); @@ -521,11 +522,24 @@ internal void AssignStringValue(ResultElement target, ReadOnlySpan value) parentRow: _metaDb.GetParent(target.Cursor)); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void AssignPropertyName(ResultElement target, ReadOnlySpan propertyName) { + var cursor = target.Cursor - 1; + var row = _metaDb.Get(cursor); + Debug.Assert(row.TokenType is ElementTokenType.PropertyName); + Debug.Assert(row.OperationReferenceType is OperationReferenceType.None); + var totalSize = propertyName.Length + 2; var position = ClaimDataSpace(totalSize); - WriteData(position, propertyName, withQuotes: true); + WriteData(position, propertyName, withQuotes: false); + + _metaDb.Replace( + cursor: cursor, + tokenType: ElementTokenType.PropertyName, + location: position, + sizeOrLength: totalSize, + parentRow: row.ParentRow); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs b/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs index d1ce603e430..21a56270335 100644 --- a/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Types/Extensions/TypeExtensions.cs @@ -50,7 +50,7 @@ public static Type ToRuntimeType(this IType type) return ToRuntimeType(type.InnerType()); } - if (type is IHasRuntimeType t) + if (type is IRuntimeTypeProvider t) { return t.RuntimeType; } @@ -60,7 +60,7 @@ public static Type ToRuntimeType(this IType type) private static Type LeafTypeToRuntimeType(IType type) { - if (type.IsLeafType() && type.NamedType() is IHasRuntimeType t) + if (type.IsLeafType() && type.NamedType() is IRuntimeTypeProvider t) { if (!type.IsNonNullType() && t.RuntimeType.IsValueType) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs index a6b3a7c586f..48c9468aff3 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs @@ -1,19 +1,14 @@ -using System.Collections; using System.Globalization; -using HotChocolate.Configuration; +using System.Runtime.InteropServices; +using System.Text.Json; using HotChocolate.Language; -using HotChocolate.Properties; using HotChocolate.Text.Json; -using HotChocolate.Types.Descriptors.Configurations; -using HotChocolate.Utilities; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; public class AnyType : ScalarType { - private readonly ObjectValueToDictionaryConverter _objectValueToDictConverter = new(); - private ObjectToDictionaryConverter _objectToDictConverter = null!; - /// /// Initializes a new instance of the class. /// @@ -24,7 +19,6 @@ public AnyType( : base(name, bind) { Description = description; - SerializationType = ScalarSerializationType.Any; } /// @@ -37,18 +31,10 @@ public AnyType() : this(ScalarNames.Any) public override Type RuntimeType => typeof(object); - protected override void OnCompleteType( - ITypeCompletionContext context, - ScalarTypeConfiguration configuration) - { - base.OnCompleteType(context, configuration); - _objectToDictConverter = new ObjectToDictionaryConverter(Converter); - } + public override ScalarSerializationType SerializationType => ScalarSerializationType.Any; public override bool IsValueCompatible(IValueNode literal) { - ArgumentNullException.ThrowIfNull(literal); - switch (literal) { case StringValueNode: @@ -57,7 +43,6 @@ public override bool IsValueCompatible(IValueNode literal) case BooleanValueNode: case ListValueNode: case ObjectValueNode: - case NullValueNode: return true; default: @@ -65,7 +50,7 @@ public override bool IsValueCompatible(IValueNode literal) } } - public override object? CoerceInputLiteral(IValueNode literal) + public override object CoerceInputLiteral(IValueNode literal) { switch (literal) { @@ -82,111 +67,90 @@ public override bool IsValueCompatible(IValueNode literal) return bvn.Value; case ListValueNode lvn: - return _objectValueToDictConverter.Convert(lvn); + var list = new List(); + foreach (var item in lvn.Items) + { + list.Add(CoerceInputLiteral(item)); + } + return list; case ObjectValueNode ovn: - return _objectValueToDictConverter.Convert(ovn); + var obj = new Dictionary(); + foreach (var field in ovn.Fields) + { + obj[field.Name.Value] = CoerceInputLiteral(field.Value); + } + return obj; case NullValueNode: - return null; + return null!; default: - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(Name, literal.GetType()), - this); + throw Scalar_Cannot_CoerceInputLiteral(this, literal); } } - public override IValueNode CoerceInputValue(object? value) + public override object CoerceInputValue(JsonElement inputValue) { - return value is null - ? NullValueNode.Default - : ParseValue(value, new HashSet(ReferenceEqualityComparer.Instance)); - } - - private IValueNode ParseValue(object? value, HashSet set) - { - if (value is null) + switch (inputValue.ValueKind) { - return NullValueNode.Default; - } + case JsonValueKind.String: + return inputValue.GetString()!; - switch (value) - { - case string s: - return new StringValueNode(s); - case short s: - return new IntValueNode(s); - case int i: - return new IntValueNode(i); - case long l: - return new IntValueNode(l); - case float f: - return new FloatValueNode(f); - case double d: - return new FloatValueNode(d); - case decimal d: - return new FloatValueNode(d); - case bool b: - return new BooleanValueNode(b); - case sbyte s: - return new IntValueNode(s); - case byte b: - return new IntValueNode(b); - } - - var type = value.GetType(); - - if (type.IsValueType && Converter.TryConvert( - type, typeof(string), value, out var converted, out _) - && converted is string c) - { - return new StringValueNode(c); - } + case JsonValueKind.Number: + var rawBytes = JsonMarshal.GetRawUtf8Value(inputValue); - if (set.Add(value)) - { - if (value is IReadOnlyDictionary dict) - { - var fields = new List(); - foreach (var field in dict) + // Check for decimal point (0x2E) or exponent (0x65 'e', 0x45 'E') + if (rawBytes.IndexOfAny((byte)'.', (byte)'e', (byte)'E') >= 0) { - fields.Add(new ObjectFieldNode( - field.Key, - ParseValue(field.Value, set))); + return inputValue.GetDecimal(); } - set.Remove(value); - - return new ObjectValueNode(fields); - } - - if (value is IReadOnlyList list) - { - var valueList = new List(); - foreach (var element in list) + if (inputValue.TryGetInt64(out var longValue)) { - valueList.Add(ParseValue(element, set)); + return longValue; } - set.Remove(value); + // Fallback for numbers outside int64 range + return inputValue.GetDecimal(); - return new ListValueNode(valueList); - } + case JsonValueKind.True: + return true; - var valueNode = ParseValue(_objectToDictConverter.Convert(value), set); + case JsonValueKind.False: + return false; - set.Remove(value); + case JsonValueKind.Null: + return null!; + + case JsonValueKind.Array: + var list = new List(); + foreach (var item in inputValue.EnumerateArray()) + { + list.Add(CoerceInputValue(item)); + } + return list; + + case JsonValueKind.Object: + var obj = new Dictionary(); + foreach (var property in inputValue.EnumerateObject()) + { + obj[property.Name] = CoerceInputValue(property.Value); + } + return obj; - return valueNode; + default: + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } + } - throw new LeafCoercionException( - TypeResources.AnyType_CycleInObjectGraph, - this); + public override void CoerceOutputValue(object runtimeValue, ResultElement resultValue) + { + HashSet? processed = null; + TryCoerceOutputValue(runtimeValue, resultValue, ref processed); } - public override bool TryCoerceOutputValue(object? runtimeValue, ResultElement resultValue) + private static bool TryCoerceOutputValue(object runtimeValue, ResultElement resultValue, ref HashSet? set) { if (runtimeValue is null) { @@ -248,19 +212,154 @@ public override bool TryCoerceOutputValue(object? runtimeValue, ResultElement re resultValue.SetNumberValue(castedULong); return true; - default: - var type = runtimeValue.GetType(); + case List castedList: + { + set ??= new HashSet(ReferenceEqualityComparer.Instance); - if (type.IsValueType - && Converter.TryConvert(type, typeof(string), runtimeValue, out var c, out _) - && c is string casted) + try { - resultValue = casted; + if (!set.Add(castedList)) + { + return false; + } + + using var enumerator = castedList.GetEnumerator(); + + resultValue.SetArrayValue(castedList.Count); + foreach (var element in resultValue.EnumerateArray()) + { + enumerator.MoveNext(); + if (!TryCoerceOutputValue(enumerator.Current!, element, ref set)) + { + element.Invalidate(); + } + } return true; } + finally + { + set?.Remove(castedList); + } + } - resultValue = _objectToDictConverter.Convert(runtimeValue); - return true; + case Dictionary castedObject: + { + set ??= new HashSet(ReferenceEqualityComparer.Instance); + + try + { + if (!set.Add(castedObject)) + { + return false; + } + + using var enumerator = castedObject.GetEnumerator(); + + resultValue.SetObjectValue(castedObject.Count); + foreach (var property in resultValue.EnumerateObject()) + { + enumerator.MoveNext(); + property.Value.SetPropertyName(enumerator.Current.Key); + if (!TryCoerceOutputValue(enumerator.Current.Value!, property.Value, ref set)) + { + property.Value.Invalidate(); + } + } + return true; + } + finally + { + set?.Remove(castedObject); + } + } + + default: + return false; + } + } + + public override IValueNode ValueToLiteral(object runtimeValue) + { + return runtimeValue is null + ? NullValueNode.Default + : ValueToLiteral(runtimeValue, null, this); + } + + private static IValueNode ValueToLiteral(object? value, HashSet? set, AnyType type) + { + if (value is null) + { + return NullValueNode.Default; + } + + switch (value) + { + case string s: + return new StringValueNode(s); + + case short s: + return new IntValueNode(s); + case int i: + return new IntValueNode(i); + case long l: + return new IntValueNode(l); + case byte b: + return new IntValueNode(b); + case sbyte s: + return new IntValueNode(s); + case ushort u: + return new IntValueNode(u); + case uint u: + return new IntValueNode(u); + case ulong u: + return new IntValueNode(u); + + case float f: + return new FloatValueNode(f); + case double d: + return new FloatValueNode(d); + case decimal d: + return new FloatValueNode(d); + + case bool b: + return new BooleanValueNode(b); + } + + // Handle collections with cycle detection + set ??= new HashSet(ReferenceEqualityComparer.Instance); + + if (!set.Add(value)) + { + throw Scalar_Cannot_ConvertValueToLiteral(type, value); + } + + try + { + switch (value) + { + case IReadOnlyList list: + var items = new List(list.Count); + foreach (var item in list) + { + items.Add(ValueToLiteral(item, set, type)); + } + return new ListValueNode(items); + + case IReadOnlyDictionary obj: + var fields = new List(obj.Count); + foreach (var kvp in obj) + { + fields.Add(new ObjectFieldNode(kvp.Key, ValueToLiteral(kvp.Value, set, type))); + } + return new ObjectValueNode(fields); + + default: + throw Scalar_Cannot_ConvertValueToLiteral(type, value); + } + } + finally + { + set.Remove(value); } } } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs index 96e04f61e29..b4affd6b64f 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs @@ -177,6 +177,7 @@ private static bool ValidateValue( if (oneOf && objectValue.Fields.Count is 0) { + // TODO : resources error = ErrorBuilder.New() .SetMessage("The OneOf Input Object `{0}` requires that exactly one field is supplied and that field must not be `null`. OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null.", inputObjectType.Name) .SetCode(ErrorCodes.Execution.OneOfNoFieldSet) @@ -187,6 +188,7 @@ private static bool ValidateValue( if (oneOf && objectValue.Fields.Count > 1) { + // TODO : resources error = ErrorBuilder.New() .SetMessage("More than one field of the OneOf Input Object `{0}` is set. OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null.", inputObjectType.Name) .SetCode(ErrorCodes.Execution.OneOfMoreThanOneFieldSet) @@ -220,6 +222,7 @@ private static bool ValidateValue( var field = objectValue.Fields[i]; if (!inputObjectType.Fields.TryGetField(field.Name.Value, out var fieldDefinition)) { + // TODO : resources error = ErrorBuilder.New() .SetMessage( "The field `{0}` is not defined on the input object type `{1}`.", @@ -232,6 +235,7 @@ private static bool ValidateValue( if (oneOf && field.Value.Kind is SyntaxKind.NullValue) { + // TODO : resources error = ErrorBuilder.New() .SetMessage("`null` was set to the field `{0}`of the OneOf Input Object `{1}`. OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null.", field.Name, inputObjectType.Name) .SetCode(ErrorCodes.Execution.OneOfFieldIsNull) @@ -293,8 +297,9 @@ private static bool ValidateValue( if (type is IScalarTypeDefinition scalarType) { - if (!scalarType.IsInstanceOfType(value)) + if (!scalarType.IsValueCompatible(value)) { + // TODO : resources error = ErrorBuilder.New() .SetMessage( "The value `{0}` is not a valid value for the scalar type `{1}`.", @@ -313,6 +318,7 @@ private static bool ValidateValue( { if (value is not (StringValueNode or EnumValueNode)) { + // TODO : resources error = ErrorBuilder.New() .SetMessage("The value `{0}` is not an enum value.", value.Value ?? "null") .SetExtension("variable", $"{path}") @@ -322,6 +328,7 @@ private static bool ValidateValue( if (!enumType.Values.ContainsName((string)value.Value!)) { + // TODO : resources error = ErrorBuilder.New() .SetMessage("The value `{0}` is not a valid value for the enum type `{1}`.", value.Value ?? "null", enumType.Name) .SetExtension("variable", $"{path}") From 494004f4aeb867f45e4d32759ebed17ec56ae361 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Sun, 21 Dec 2025 23:15:41 +0100 Subject: [PATCH 053/144] Refactor input parsing and error handling in HotChocolate - Updated error messages in TypeResources.resx for better clarity on coercion failures. - Removed TypeResourcesExtensions.cs as it was no longer needed after refactoring. - Modified InputFormatter to improve input value handling and removed unused methods. - Refactored InputParser to accept JsonElement directly for input parsing, enhancing performance and clarity. - Updated scalar types (BooleanType, DateTimeType, JsonType) to utilize new error handling methods. - Adjusted tests across various serializer tests to reflect changes in input parsing methods. - Improved error handling in ThrowHelper to provide more informative messages for coercion failures. --- .../Processing/VariableCoercionHelper.cs | 2 +- .../Properties/TypeResources.Designer.cs | 683 +++++++++--------- .../src/Types/Properties/TypeResources.resx | 19 +- .../Properties/TypeResourcesExtensions.cs | 49 -- .../Core/src/Types/Types/InputFormatter.cs | 151 +--- .../Core/src/Types/Types/InputParser.cs | 86 +-- .../src/Types/Types/Scalars/BooleanType.cs | 5 +- .../src/Types/Types/Scalars/DateTimeType.cs | 9 +- .../Core/src/Types/Types/Scalars/JsonType.cs | 4 + .../InputObjectToDictionaryConverter.cs | 2 +- .../Core/src/Types/Utilities/ThrowHelper.cs | 73 +- .../Types.Tests/Types/InputParserTests.cs | 12 +- .../GeoJsonLineStringSerializerTests.cs | 14 +- .../GeoJsonMultiLineStringInputTests.cs | 2 +- .../GeoJsonMultiLineStringSerializerTests.cs | 14 +- .../GeoJsonMultiPointSerializerTests.cs | 14 +- .../GeoJsonMultiPolygonSerializerTests.cs | 14 +- .../GeoJsonPointSerializerTests.cs | 14 +- .../GeoJsonPolygonSerializerTests.cs | 14 +- 19 files changed, 500 insertions(+), 681 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs index 10461c24ba1..e7947df5636 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs @@ -97,7 +97,7 @@ private VariableValueOrLiteral CoerceVariableValue( } } - var runtimeValue = _inputParser.ParseResult(value, variableType, root); + var runtimeValue = _inputParser.ParseInputValue(value, variableType, root); var literal = _inputFormatter.FormatResult(value, variableType, root); return new VariableValueOrLiteral(variableType, runtimeValue, literal); } diff --git a/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs index 834995fdfd2..903fb96fe36 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs @@ -9,21 +9,21 @@ namespace HotChocolate.Properties { using System; - - + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class TypeResources { - + private static System.Resources.ResourceManager resourceMan; - + private static System.Globalization.CultureInfo resourceCulture; - + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal TypeResources() { } - + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] internal static System.Resources.ResourceManager ResourceManager { get { @@ -34,7 +34,7 @@ internal static System.Resources.ResourceManager ResourceManager { return resourceMan; } } - + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] internal static System.Globalization.CultureInfo Culture { get { @@ -44,1948 +44,1951 @@ internal static System.Globalization.CultureInfo Culture { resourceCulture = value; } } - + internal static string ThrowHelper_MissingDirectiveIfArgument { get { return ResourceManager.GetString("ThrowHelper_MissingDirectiveIfArgument", resourceCulture); } } - + internal static string ArgumentDescriptor_InputTypeViolation { get { return ResourceManager.GetString("ArgumentDescriptor_InputTypeViolation", resourceCulture); } } - + internal static string ArgumentValueBuilder_NonNull { get { return ResourceManager.GetString("ArgumentValueBuilder_NonNull", resourceCulture); } } - + internal static string BooleanType_Description { get { return ResourceManager.GetString("BooleanType_Description", resourceCulture); } } - + internal static string ByteType_Description { get { return ResourceManager.GetString("ByteType_Description", resourceCulture); } } - + internal static string ComplexTypeBindingBuilder_FieldBuilderNotSupported { get { return ResourceManager.GetString("ComplexTypeBindingBuilder_FieldBuilderNotSupported", resourceCulture); } } - + internal static string ComplexTypeBindingBuilder_FieldNotComplete { get { return ResourceManager.GetString("ComplexTypeBindingBuilder_FieldNotComplete", resourceCulture); } } - + internal static string DataLoaderRegistry_KeyNullOrEmpty { get { return ResourceManager.GetString("DataLoaderRegistry_KeyNullOrEmpty", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_RegistryIsNull { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_RegistryIsNull", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_UnableToRegister { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_UnableToRegister", resourceCulture); } } - - /// - /// Looks up a localized string similar to The `DateTime` scalar represents an exact point in time. This point in time is specified by having an offset to UTC and does not use a time zone.. - /// + internal static string DateTimeType_Description { get { return ResourceManager.GetString("DateTimeType_Description", resourceCulture); } } - + internal static string DateType_Description { get { return ResourceManager.GetString("DateType_Description", resourceCulture); } } - + internal static string DecimalType_Description { get { return ResourceManager.GetString("DecimalType_Description", resourceCulture); } } - + internal static string DefaultTypeInspector_MemberInvalid { get { return ResourceManager.GetString("DefaultTypeInspector_MemberInvalid", resourceCulture); } } - + internal static string DependencyDescriptorBase_OnlyTsoIsAllowed { get { return ResourceManager.GetString("DependencyDescriptorBase_OnlyTsoIsAllowed", resourceCulture); } } - + internal static string DirectiveCollection_DirectiveIsUnique { get { return ResourceManager.GetString("DirectiveCollection_DirectiveIsUnique", resourceCulture); } } - + internal static string DirectiveCollection_LocationNotAllowed { get { return ResourceManager.GetString("DirectiveCollection_LocationNotAllowed", resourceCulture); } } - + internal static string DirectiveLocation_ArgumentDefinition { get { return ResourceManager.GetString("DirectiveLocation_ArgumentDefinition", resourceCulture); } } - + internal static string DirectiveLocation_Description { get { return ResourceManager.GetString("DirectiveLocation_Description", resourceCulture); } } - + internal static string DirectiveLocation_Enum { get { return ResourceManager.GetString("DirectiveLocation_Enum", resourceCulture); } } - + internal static string DirectiveLocation_EnumValue { get { return ResourceManager.GetString("DirectiveLocation_EnumValue", resourceCulture); } } - + internal static string DirectiveLocation_Field { get { return ResourceManager.GetString("DirectiveLocation_Field", resourceCulture); } } - + internal static string DirectiveLocation_FieldDefinition { get { return ResourceManager.GetString("DirectiveLocation_FieldDefinition", resourceCulture); } } - + internal static string DirectiveLocation_FragmentDefinition { get { return ResourceManager.GetString("DirectiveLocation_FragmentDefinition", resourceCulture); } } - + internal static string DirectiveLocation_FragmentSpread { get { return ResourceManager.GetString("DirectiveLocation_FragmentSpread", resourceCulture); } } - + internal static string DirectiveLocation_InlineFragment { get { return ResourceManager.GetString("DirectiveLocation_InlineFragment", resourceCulture); } } - + internal static string DirectiveLocation_InputFieldDefinition { get { return ResourceManager.GetString("DirectiveLocation_InputFieldDefinition", resourceCulture); } } - + internal static string DirectiveLocation_InputObject { get { return ResourceManager.GetString("DirectiveLocation_InputObject", resourceCulture); } } - + internal static string DirectiveLocation_Interface { get { return ResourceManager.GetString("DirectiveLocation_Interface", resourceCulture); } } - + internal static string DirectiveLocation_Mutation { get { return ResourceManager.GetString("DirectiveLocation_Mutation", resourceCulture); } } - + internal static string DirectiveLocation_Object { get { return ResourceManager.GetString("DirectiveLocation_Object", resourceCulture); } } - + internal static string DirectiveLocation_Query { get { return ResourceManager.GetString("DirectiveLocation_Query", resourceCulture); } } - + internal static string DirectiveLocation_Scalar { get { return ResourceManager.GetString("DirectiveLocation_Scalar", resourceCulture); } } - + internal static string DirectiveLocation_Schema { get { return ResourceManager.GetString("DirectiveLocation_Schema", resourceCulture); } } - + internal static string DirectiveLocation_Subscription { get { return ResourceManager.GetString("DirectiveLocation_Subscription", resourceCulture); } } - + internal static string DirectiveLocation_Union { get { return ResourceManager.GetString("DirectiveLocation_Union", resourceCulture); } } - + internal static string DirectiveTypeDescriptor_OnlyProperties { get { return ResourceManager.GetString("DirectiveTypeDescriptor_OnlyProperties", resourceCulture); } } - + internal static string DirectiveType_NoLocations { get { return ResourceManager.GetString("DirectiveType_NoLocations", resourceCulture); } } - + internal static string DirectiveType_ReplaceWithUse { get { return ResourceManager.GetString("DirectiveType_ReplaceWithUse", resourceCulture); } } - + internal static string DirectiveType_UnableToConvert { get { return ResourceManager.GetString("DirectiveType_UnableToConvert", resourceCulture); } } - + internal static string Directive_Description { get { return ResourceManager.GetString("Directive_Description", resourceCulture); } } - + internal static string Directive_UseLocation { get { return ResourceManager.GetString("Directive_UseLocation", resourceCulture); } } - + internal static string EnumTypeExtension_CannotMerge { get { return ResourceManager.GetString("EnumTypeExtension_CannotMerge", resourceCulture); } } - + internal static string EnumTypeExtension_ValueTypeInvalid { get { return ResourceManager.GetString("EnumTypeExtension_ValueTypeInvalid", resourceCulture); } } - + internal static string EnumType_NoValues { get { return ResourceManager.GetString("EnumType_NoValues", resourceCulture); } } - + internal static string EnumValue_Description { get { return ResourceManager.GetString("EnumValue_Description", resourceCulture); } } - + internal static string EnumValue_ValueIsNull { get { return ResourceManager.GetString("EnumValue_ValueIsNull", resourceCulture); } } - + internal static string FieldInitHelper_InvalidDefaultValue { get { return ResourceManager.GetString("FieldInitHelper_InvalidDefaultValue", resourceCulture); } } - + internal static string FieldInitHelper_NoFields { get { return ResourceManager.GetString("FieldInitHelper_NoFields", resourceCulture); } } - + internal static string Field_Description { get { return ResourceManager.GetString("Field_Description", resourceCulture); } } - + internal static string FloatType_Description { get { return ResourceManager.GetString("FloatType_Description", resourceCulture); } } - + internal static string IdType_Description { get { return ResourceManager.GetString("IdType_Description", resourceCulture); } } - + internal static string InputField_CannotSetValue { get { return ResourceManager.GetString("InputField_CannotSetValue", resourceCulture); } } - + internal static string InputObjectTypeExtension_CannotMerge { get { return ResourceManager.GetString("InputObjectTypeExtension_CannotMerge", resourceCulture); } } - + internal static string InputObjectType_CannotParseLiteral { get { return ResourceManager.GetString("InputObjectType_CannotParseLiteral", resourceCulture); } } - + internal static string InputObjectType_NoFields { get { return ResourceManager.GetString("InputObjectType_NoFields", resourceCulture); } } - + internal static string InputTypeNonNullCheck_ValueIsNull { get { return ResourceManager.GetString("InputTypeNonNullCheck_ValueIsNull", resourceCulture); } } - + internal static string InputValue_DefaultValue { get { return ResourceManager.GetString("InputValue_DefaultValue", resourceCulture); } } - + internal static string InputValue_Description { get { return ResourceManager.GetString("InputValue_Description", resourceCulture); } } - + internal static string InterfaceImplRule_ArgumentsDoNotMatch { get { return ResourceManager.GetString("InterfaceImplRule_ArgumentsDoNotMatch", resourceCulture); } } - + internal static string InterfaceImplRule_ArgumentsNotImpl { get { return ResourceManager.GetString("InterfaceImplRule_ArgumentsNotImpl", resourceCulture); } } - + internal static string InterfaceImplRule_FieldNotImpl { get { return ResourceManager.GetString("InterfaceImplRule_FieldNotImpl", resourceCulture); } } - + internal static string InterfaceImplRule_FieldTypeInvalid { get { return ResourceManager.GetString("InterfaceImplRule_FieldTypeInvalid", resourceCulture); } } - + internal static string InterfaceImplRule_ReturnTypeInvalid { get { return ResourceManager.GetString("InterfaceImplRule_ReturnTypeInvalid", resourceCulture); } } - + internal static string InterfaceTypeExtension_CannotMerge { get { return ResourceManager.GetString("InterfaceTypeExtension_CannotMerge", resourceCulture); } } - + internal static string IntType_Description { get { return ResourceManager.GetString("IntType_Description", resourceCulture); } } - + internal static string LongType_Description { get { return ResourceManager.GetString("LongType_Description", resourceCulture); } } - + internal static string NameType_Description { get { return ResourceManager.GetString("NameType_Description", resourceCulture); } } - + internal static string Name_Cannot_BeEmpty { get { return ResourceManager.GetString("Name_Cannot_BeEmpty", resourceCulture); } } - + internal static string ObjectFieldDescriptorBase_FieldType { get { return ResourceManager.GetString("ObjectFieldDescriptorBase_FieldType", resourceCulture); } } - + internal static string ObjectTypeDescriptor_InterfaceBaseClass { get { return ResourceManager.GetString("ObjectTypeDescriptor_InterfaceBaseClass", resourceCulture); } } - + internal static string InterfaceTypeDescriptor_InterfaceBaseClass { get { return ResourceManager.GetString("InterfaceTypeDescriptor_InterfaceBaseClass", resourceCulture); } } - + internal static string ObjectTypeDescriptor_MustBePropertyOrMethod { get { return ResourceManager.GetString("ObjectTypeDescriptor_MustBePropertyOrMethod", resourceCulture); } } - + internal static string ObjectTypeDescriptor_ResolveWith_NonAbstract { get { return ResourceManager.GetString("ObjectTypeDescriptor_ResolveWith_NonAbstract", resourceCulture); } } - + internal static string NodeDescriptor_MustBeMethod { get { return ResourceManager.GetString("NodeDescriptor_MustBeMethod", resourceCulture); } } - + internal static string NodeDescriptor_IdMember { get { return ResourceManager.GetString("NodeDescriptor_IdMember", resourceCulture); } } - + internal static string ObjectTypeDescriptor_Resolver_SchemaType { get { return ResourceManager.GetString("ObjectTypeDescriptor_Resolver_SchemaType", resourceCulture); } } - + internal static string Reflection_MemberMust_BeMethodOrProperty { get { return ResourceManager.GetString("Reflection_MemberMust_BeMethodOrProperty", resourceCulture); } } - + internal static string ResolverCompiler_UnknownParameterType { get { return ResourceManager.GetString("ResolverCompiler_UnknownParameterType", resourceCulture); } } - + internal static string ResolverTypeBindingBuilder_FieldBuilderNotSupported { get { return ResourceManager.GetString("ResolverTypeBindingBuilder_FieldBuilderNotSupported", resourceCulture); } } - + internal static string ResolverTypeBindingBuilder_FieldNotComplete { get { return ResourceManager.GetString("ResolverTypeBindingBuilder_FieldNotComplete", resourceCulture); } } - + internal static string Scalar_Cannot_CoerceInputLiteral { get { return ResourceManager.GetString("Scalar_Cannot_CoerceInputLiteral", resourceCulture); } } - + internal static string Scalar_Cannot_CoerceInputValue { get { return ResourceManager.GetString("Scalar_Cannot_CoerceInputValue", resourceCulture); } } - - internal static string Scalar_Cannot_Serialize { + + internal static string Scalar_Cannot_ConvertValueToLiteral { get { - return ResourceManager.GetString("Scalar_Cannot_Serialize", resourceCulture); + return ResourceManager.GetString("Scalar_Cannot_ConvertValueToLiteral", resourceCulture); } } - + + internal static string Scalar_Cannot_CoerceOutputValue { + get { + return ResourceManager.GetString("Scalar_Cannot_CoerceOutputValue", resourceCulture); + } + } + internal static string SchemaBuilderExtensions_DirectiveTypeIsBaseType { get { return ResourceManager.GetString("SchemaBuilderExtensions_DirectiveTypeIsBaseType", resourceCulture); } } - + internal static string SchemaBuilderExtensions_MustBeDirectiveType { get { return ResourceManager.GetString("SchemaBuilderExtensions_MustBeDirectiveType", resourceCulture); } } - + internal static string SchemaBuilder_Binding_CannotBeHandled { get { return ResourceManager.GetString("SchemaBuilder_Binding_CannotBeHandled", resourceCulture); } } - + internal static string SchemaBuilder_Binding_Invalid { get { return ResourceManager.GetString("SchemaBuilder_Binding_Invalid", resourceCulture); } } - + internal static string SchemaBuilder_NoQueryType { get { return ResourceManager.GetString("SchemaBuilder_NoQueryType", resourceCulture); } } - + internal static string SchemaBuilder_RootType_MustBeClass { get { return ResourceManager.GetString("SchemaBuilder_RootType_MustBeClass", resourceCulture); } } - + internal static string SchemaBuilder_RootType_MustBeObjectType { get { return ResourceManager.GetString("SchemaBuilder_RootType_MustBeObjectType", resourceCulture); } } - + internal static string SchemaBuilder_RootType_NonGenericType { get { return ResourceManager.GetString("SchemaBuilder_RootType_NonGenericType", resourceCulture); } } - + internal static string SchemaBuilder_SchemaTypeInvalid { get { return ResourceManager.GetString("SchemaBuilder_SchemaTypeInvalid", resourceCulture); } } - + internal static string SchemaField_Description { get { return ResourceManager.GetString("SchemaField_Description", resourceCulture); } } - + internal static string SchemaSyntaxVisitor_UnknownOperationType { get { return ResourceManager.GetString("SchemaSyntaxVisitor_UnknownOperationType", resourceCulture); } } - + internal static string Schema_Description { get { return ResourceManager.GetString("Schema_Description", resourceCulture); } } - + internal static string Schema_Directives { get { return ResourceManager.GetString("Schema_Directives", resourceCulture); } } - + internal static string Schema_MutationType { get { return ResourceManager.GetString("Schema_MutationType", resourceCulture); } } - + internal static string Schema_QueryType { get { return ResourceManager.GetString("Schema_QueryType", resourceCulture); } } - + internal static string Schema_SubscriptionType { get { return ResourceManager.GetString("Schema_SubscriptionType", resourceCulture); } } - + internal static string Schema_Types { get { return ResourceManager.GetString("Schema_Types", resourceCulture); } } - + internal static string ShortType_Description { get { return ResourceManager.GetString("ShortType_Description", resourceCulture); } } - + internal static string StringType_Description { get { return ResourceManager.GetString("StringType_Description", resourceCulture); } } - + internal static string String_Argument_NullOrEmpty { get { return ResourceManager.GetString("String_Argument_NullOrEmpty", resourceCulture); } } - + internal static string TypeConfiguration_ConfigureIsNull { get { return ResourceManager.GetString("TypeConfiguration_ConfigureIsNull", resourceCulture); } } - + internal static string TypeConfiguration_DefinitionIsNull { get { return ResourceManager.GetString("TypeConfiguration_DefinitionIsNull", resourceCulture); } } - + internal static string TypeDependency_MustBeSchemaType { get { return ResourceManager.GetString("TypeDependency_MustBeSchemaType", resourceCulture); } } - + internal static string TypeExtensions_NoListType { get { return ResourceManager.GetString("TypeExtensions_NoListType", resourceCulture); } } - + internal static string TypeExtensions_TypeIsNotOfT { get { return ResourceManager.GetString("TypeExtensions_TypeIsNotOfT", resourceCulture); } } - + internal static string TypeField_Description { get { return ResourceManager.GetString("TypeField_Description", resourceCulture); } } - + internal static string TypeInitializer_CannotResolveDependency { get { return ResourceManager.GetString("TypeInitializer_CannotResolveDependency", resourceCulture); } } - + internal static string TypeInitializer_CompleteName_Duplicate { get { return ResourceManager.GetString("TypeInitializer_CompleteName_Duplicate", resourceCulture); } } - + internal static string TypeInitializer_Merge_KindDoesNotMatch { get { return ResourceManager.GetString("TypeInitializer_Merge_KindDoesNotMatch", resourceCulture); } } - + internal static string TypeKind_Description { get { return ResourceManager.GetString("TypeKind_Description", resourceCulture); } } - + internal static string TypeKind_Enum { get { return ResourceManager.GetString("TypeKind_Enum", resourceCulture); } } - + internal static string TypeKind_InputObject { get { return ResourceManager.GetString("TypeKind_InputObject", resourceCulture); } } - + internal static string TypeKind_Interface { get { return ResourceManager.GetString("TypeKind_Interface", resourceCulture); } } - + internal static string TypeKind_List { get { return ResourceManager.GetString("TypeKind_List", resourceCulture); } } - + internal static string TypeKind_NonNull { get { return ResourceManager.GetString("TypeKind_NonNull", resourceCulture); } } - + internal static string TypeKind_Object { get { return ResourceManager.GetString("TypeKind_Object", resourceCulture); } } - + internal static string TypeKind_Scalar { get { return ResourceManager.GetString("TypeKind_Scalar", resourceCulture); } } - + internal static string TypeKind_Union { get { return ResourceManager.GetString("TypeKind_Union", resourceCulture); } } - + internal static string TypeNameField_Description { get { return ResourceManager.GetString("TypeNameField_Description", resourceCulture); } } - + internal static string TypeNameHelper_InvalidTypeStructure { get { return ResourceManager.GetString("TypeNameHelper_InvalidTypeStructure", resourceCulture); } } - + internal static string TypeNameHelper_OnlyTypeSystemObjectsAreAllowed { get { return ResourceManager.GetString("TypeNameHelper_OnlyTypeSystemObjectsAreAllowed", resourceCulture); } } - + internal static string Type_Description { get { return ResourceManager.GetString("Type_Description", resourceCulture); } } - + internal static string UnionTypeExtension_CannotMerge { get { return ResourceManager.GetString("UnionTypeExtension_CannotMerge", resourceCulture); } } - + internal static string VariableValueBuilder_InputType { get { return ResourceManager.GetString("VariableValueBuilder_InputType", resourceCulture); } } - + internal static string VariableValueBuilder_InvalidValue { get { return ResourceManager.GetString("VariableValueBuilder_InvalidValue", resourceCulture); } } - + internal static string VariableValueBuilder_NodeKind { get { return ResourceManager.GetString("VariableValueBuilder_NodeKind", resourceCulture); } } - + internal static string VariableValueBuilder_NonNull { get { return ResourceManager.GetString("VariableValueBuilder_NonNull", resourceCulture); } } - + internal static string VariableValueBuilder_NonNull_In_Graph { get { return ResourceManager.GetString("VariableValueBuilder_NonNull_In_Graph", resourceCulture); } } - + internal static string VariableValueBuilder_VarNameEmpty { get { return ResourceManager.GetString("VariableValueBuilder_VarNameEmpty", resourceCulture); } } - + internal static string Argument_TypeIsNull { get { return ResourceManager.GetString("Argument_TypeIsNull", resourceCulture); } } - + internal static string NonNullType_NotAnInputType { get { return ResourceManager.GetString("NonNullType_NotAnInputType", resourceCulture); } } - + internal static string NonNullType_TypeIsNunNullType { get { return ResourceManager.GetString("NonNullType_TypeIsNunNullType", resourceCulture); } } - + internal static string NonNullType_ValueIsNull { get { return ResourceManager.GetString("NonNullType_ValueIsNull", resourceCulture); } } - + internal static string ObjectTypeExtension_CannotMerge { get { return ResourceManager.GetString("ObjectTypeExtension_CannotMerge", resourceCulture); } } - + internal static string TypeSystemObjectBase_DefinitionIsNull { get { return ResourceManager.GetString("TypeSystemObjectBase_DefinitionIsNull", resourceCulture); } } - + internal static string TypeSystemObjectBase_NameIsNull { get { return ResourceManager.GetString("TypeSystemObjectBase_NameIsNull", resourceCulture); } } - + internal static string TypeSystemObject_DescriptionImmutable { get { return ResourceManager.GetString("TypeSystemObject_DescriptionImmutable", resourceCulture); } } - + internal static string TypeSystem_Immutable { get { return ResourceManager.GetString("TypeSystem_Immutable", resourceCulture); } } - + internal static string TypeSystemObject_NameImmutable { get { return ResourceManager.GetString("TypeSystemObject_NameImmutable", resourceCulture); } } - + internal static string UnionType_MustHaveTypes { get { return ResourceManager.GetString("UnionType_MustHaveTypes", resourceCulture); } } - + internal static string UnionType_UnableToResolveType { get { return ResourceManager.GetString("UnionType_UnableToResolveType", resourceCulture); } } - + internal static string SchemaBuilder_MustBeSchemaType { get { return ResourceManager.GetString("SchemaBuilder_MustBeSchemaType", resourceCulture); } } - + internal static string TypeRegistrar_TypesInconsistent { get { return ResourceManager.GetString("TypeRegistrar_TypesInconsistent", resourceCulture); } } - + internal static string TypeConversion_ConvertNotSupported { get { return ResourceManager.GetString("TypeConversion_ConvertNotSupported", resourceCulture); } } - + internal static string SchemaBuilder_Interceptor_NotSupported { get { return ResourceManager.GetString("SchemaBuilder_Interceptor_NotSupported", resourceCulture); } } - + internal static string IdSerializer_UnableToEncode { get { return ResourceManager.GetString("IdSerializer_UnableToEncode", resourceCulture); } } - + internal static string IdSerializer_UnableToDecode { get { return ResourceManager.GetString("IdSerializer_UnableToDecode", resourceCulture); } } - + internal static string SchemaBuilder_Convention_NotSupported { get { return ResourceManager.GetString("SchemaBuilder_Convention_NotSupported", resourceCulture); } } - + internal static string TimeSpanType_Description { get { return ResourceManager.GetString("TimeSpanType_Description", resourceCulture); } } - + internal static string DefaultDataLoaderRegistry_GetOrRegister { get { return ResourceManager.GetString("DefaultDataLoaderRegistry_GetOrRegister", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_CreateDataLoader_AbstractType { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_CreateDataLoader_AbstractType", resourceCulture); } } - + internal static string DataLoaderResolverContextExtensions_CreateDataLoader_UnableToCreate { get { return ResourceManager.GetString("DataLoaderResolverContextExtensions_CreateDataLoader_UnableToCreate", resourceCulture); } } - + internal static string NonNamedType_IsInstanceOfType_NotAnInputType { get { return ResourceManager.GetString("NonNamedType_IsInstanceOfType_NotAnInputType", resourceCulture); } } - + internal static string RegisteredType_CompletionContext_Not_Initialized { get { return ResourceManager.GetString("RegisteredType_CompletionContext_Not_Initialized", resourceCulture); } } - + internal static string RegisteredType_CompletionContext_Already_Set { get { return ResourceManager.GetString("RegisteredType_CompletionContext_Already_Set", resourceCulture); } } - + internal static string DeferDirectiveType_Description { get { return ResourceManager.GetString("DeferDirectiveType_Description", resourceCulture); } } - + internal static string DeferDirectiveType_Label_Description { get { return ResourceManager.GetString("DeferDirectiveType_Label_Description", resourceCulture); } } - + internal static string DeferDirectiveType_If_Description { get { return ResourceManager.GetString("DeferDirectiveType_If_Description", resourceCulture); } } - + internal static string StreamDirectiveType_Description { get { return ResourceManager.GetString("StreamDirectiveType_Description", resourceCulture); } } - + internal static string StreamDirectiveType_Label_Description { get { return ResourceManager.GetString("StreamDirectiveType_Label_Description", resourceCulture); } } - + internal static string StreamDirectiveType_InitialCount_Description { get { return ResourceManager.GetString("StreamDirectiveType_InitialCount_Description", resourceCulture); } } - + internal static string StreamDirectiveType_If_Description { get { return ResourceManager.GetString("StreamDirectiveType_If_Description", resourceCulture); } } - + internal static string SchemaBuilder_AddRootType_TypeAlreadyRegistered { get { return ResourceManager.GetString("SchemaBuilder_AddRootType_TypeAlreadyRegistered", resourceCulture); } } - + internal static string NodeDescriptor_IdField_MustBePropertyOrMethod { get { return ResourceManager.GetString("NodeDescriptor_IdField_MustBePropertyOrMethod", resourceCulture); } } - + internal static string DeprecatedDirectiveType_TypeDescription { get { return ResourceManager.GetString("DeprecatedDirectiveType_TypeDescription", resourceCulture); } } - + internal static string DeprecatedDirectiveType_ReasonDescription { get { return ResourceManager.GetString("DeprecatedDirectiveType_ReasonDescription", resourceCulture); } } - + internal static string IncludeDirectiveType_TypeDescription { get { return ResourceManager.GetString("IncludeDirectiveType_TypeDescription", resourceCulture); } } - + internal static string IncludeDirectiveType_IfDescription { get { return ResourceManager.GetString("IncludeDirectiveType_IfDescription", resourceCulture); } } - + internal static string SkipDirectiveType_TypeDescription { get { return ResourceManager.GetString("SkipDirectiveType_TypeDescription", resourceCulture); } } - + internal static string SkipDirectiveType_IfDescription { get { return ResourceManager.GetString("SkipDirectiveType_IfDescription", resourceCulture); } } - + internal static string SpecifiedByDirectiveType_TypeDescription { get { return ResourceManager.GetString("SpecifiedByDirectiveType_TypeDescription", resourceCulture); } } - + internal static string SpecifiedByDirectiveType_UrlDescription { get { return ResourceManager.GetString("SpecifiedByDirectiveType_UrlDescription", resourceCulture); } } - + internal static string NodeType_TypeDescription { get { return ResourceManager.GetString("NodeType_TypeDescription", resourceCulture); } } - + internal static string AnyType_CycleInObjectGraph { get { return ResourceManager.GetString("AnyType_CycleInObjectGraph", resourceCulture); } } - + internal static string UuidType_FormatUnknown { get { return ResourceManager.GetString("UuidType_FormatUnknown", resourceCulture); } } - + internal static string Directive_GetArgument_ArgumentNameIsInvalid { get { return ResourceManager.GetString("Directive_GetArgument_ArgumentNameIsInvalid", resourceCulture); } } - + internal static string AppliedDirective_Description { get { return ResourceManager.GetString("AppliedDirective_Description", resourceCulture); } } - + internal static string DirectiveArgument_Description { get { return ResourceManager.GetString("DirectiveArgument_Description", resourceCulture); } } - + internal static string ThrowHelper_UsePagingAttribute_NodeTypeUnknown { get { return ResourceManager.GetString("ThrowHelper_UsePagingAttribute_NodeTypeUnknown", resourceCulture); } } - + internal static string ErrorHelper_ObjectField_HasNoResolver { get { return ResourceManager.GetString("ErrorHelper_ObjectField_HasNoResolver", resourceCulture); } } - + internal static string ExtendedTypeReferenceHandler_NonGenericExecutableNotAllowed { get { return ResourceManager.GetString("ExtendedTypeReferenceHandler_NonGenericExecutableNotAllowed", resourceCulture); } } - + internal static string BindingCompiler_AddBinding_BindingCannotBeHandled { get { return ResourceManager.GetString("BindingCompiler_AddBinding_BindingCannotBeHandled", resourceCulture); } } - + internal static string Type_SpecifiedByUrl_Description { get { return ResourceManager.GetString("Type_SpecifiedByUrl_Description", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddObjectType_TIsSchemaType { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddObjectType_TIsSchemaType", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddUnionType_TIsSchemaType { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddUnionType_TIsSchemaType", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddEnumType_TIsSchemaType { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddEnumType_TIsSchemaType", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddInterfaceType_TIsSchemaType { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddInterfaceType_TIsSchemaType", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddInputObjectType_TIsSchemaType { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddInputObjectType_TIsSchemaType", resourceCulture); } } - + internal static string EventMessageParameterExpressionBuilder_MessageNotFound { get { return ResourceManager.GetString("EventMessageParameterExpressionBuilder_MessageNotFound", resourceCulture); } } - + internal static string DefaultResolverCompilerService_CreateResolver_ArgumentValidationError { get { return ResourceManager.GetString("DefaultResolverCompilerService_CreateResolver_ArgumentValidationError", resourceCulture); } } - + internal static string DefaultResolverCompilerService_CompileSubscribe_OnlyMethodsAllowed { get { return ResourceManager.GetString("DefaultResolverCompilerService_CompileSubscribe_OnlyMethodsAllowed", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddResolverConfig_ContextInvalid { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddResolverConfig_ContextInvalid", resourceCulture); } } - + internal static string ExpressionHelper_GetGlobalStateWithDefault_NoDefaults { get { return ResourceManager.GetString("ExpressionHelper_GetGlobalStateWithDefault_NoDefaults", resourceCulture); } } - + internal static string ExpressionHelper_ResolveScopedContextData_KeyDoesNotExist { get { return ResourceManager.GetString("ExpressionHelper_ResolveScopedContextData_KeyDoesNotExist", resourceCulture); } } - + internal static string ExpressionHelper_GetScopedStateWithDefault_NoDefaultValue { get { return ResourceManager.GetString("ExpressionHelper_GetScopedStateWithDefault_NoDefaultValue", resourceCulture); } } - + internal static string ClaimsPrincipalParameterExpressionBuilder_NoClaimsFound { get { return ResourceManager.GetString("ClaimsPrincipalParameterExpressionBuilder_NoClaimsFound", resourceCulture); } } - + internal static string DirectiveLocation_VariableDefinition { get { return ResourceManager.GetString("DirectiveLocation_VariableDefinition", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddResolver_TypeConditionNotMet { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddResolver_TypeConditionNotMet", resourceCulture); } } - + internal static string SchemaBuilderExtensions_AddRootResolver_NeedsToBeClassOrInterface { get { return ResourceManager.GetString("SchemaBuilderExtensions_AddRootResolver_NeedsToBeClassOrInterface", resourceCulture); } } - + internal static string Relay_NodeField_Description { get { return ResourceManager.GetString("Relay_NodeField_Description", resourceCulture); } } - + internal static string Relay_NodeField_Id_Description { get { return ResourceManager.GetString("Relay_NodeField_Id_Description", resourceCulture); } } - + internal static string Relay_NodesField_Description { get { return ResourceManager.GetString("Relay_NodesField_Description", resourceCulture); } } - + internal static string Relay_NodesField_Ids_Description { get { return ResourceManager.GetString("Relay_NodesField_Ids_Description", resourceCulture); } } - + internal static string ErrorHelper_MiddlewareOrderInvalid { get { return ResourceManager.GetString("ErrorHelper_MiddlewareOrderInvalid", resourceCulture); } } - + internal static string ErrorHelper_NoSchemaTypesAllowedAsRuntimeType { get { return ResourceManager.GetString("ErrorHelper_NoSchemaTypesAllowedAsRuntimeType", resourceCulture); } } - + internal static string FieldInitHelper_CompleteFields_MaxFieldCountToSmall { get { return ResourceManager.GetString("FieldInitHelper_CompleteFields_MaxFieldCountToSmall", resourceCulture); } } - + internal static string RegisteredType_Completion_NotYetReady { get { return ResourceManager.GetString("RegisteredType_Completion_NotYetReady", resourceCulture); } } - + internal static string EdgeType_IsInstanceOfType_NonObject { get { return ResourceManager.GetString("EdgeType_IsInstanceOfType_NonObject", resourceCulture); } } - + internal static string EdgeType_Description { get { return ResourceManager.GetString("EdgeType_Description", resourceCulture); } } - + internal static string EdgeType_Cursor_Description { get { return ResourceManager.GetString("EdgeType_Cursor_Description", resourceCulture); } } - + internal static string EdgeType_Node_Description { get { return ResourceManager.GetString("EdgeType_Node_Description", resourceCulture); } } - + internal static string ConnectionType_Description { get { return ResourceManager.GetString("ConnectionType_Description", resourceCulture); } } - + internal static string ConnectionType_PageInfo_Description { get { return ResourceManager.GetString("ConnectionType_PageInfo_Description", resourceCulture); } } - + internal static string ConnectionType_Edges_Description { get { return ResourceManager.GetString("ConnectionType_Edges_Description", resourceCulture); } } - + internal static string ConnectionType_TotalCount_Description { get { return ResourceManager.GetString("ConnectionType_TotalCount_Description", resourceCulture); } } - + internal static string CollectionSegmentType_PageInfo_Description { get { return ResourceManager.GetString("CollectionSegmentType_PageInfo_Description", resourceCulture); } } - + internal static string CollectionSegmentType_Description { get { return ResourceManager.GetString("CollectionSegmentType_Description", resourceCulture); } } - + internal static string CollectionSegmentType_Items_Description { get { return ResourceManager.GetString("CollectionSegmentType_Items_Description", resourceCulture); } } - + internal static string ConnectionType_Nodes_Description { get { return ResourceManager.GetString("ConnectionType_Nodes_Description", resourceCulture); } } - + internal static string ServiceHelper_UseResolverServiceInternal_Order { get { return ResourceManager.GetString("ServiceHelper_UseResolverServiceInternal_Order", resourceCulture); } } - + internal static string DefaultNamingConventions_FormatFieldName_EmptyOrNull { get { return ResourceManager.GetString("DefaultNamingConventions_FormatFieldName_EmptyOrNull", resourceCulture); } } - + internal static string OneOfDirectiveType_Description { get { return ResourceManager.GetString("OneOfDirectiveType_Description", resourceCulture); } } - + internal static string ThrowHelper_OneOfNoFieldSet { get { return ResourceManager.GetString("ThrowHelper_OneOfNoFieldSet", resourceCulture); } } - + internal static string ThrowHelper_OneOfMoreThanOneFieldSet { get { return ResourceManager.GetString("ThrowHelper_OneOfMoreThanOneFieldSet", resourceCulture); } } - + internal static string ThrowHelper_OneOfFieldIsNull { get { return ResourceManager.GetString("ThrowHelper_OneOfFieldIsNull", resourceCulture); } } - + internal static string ReflectionUtils_ExtractMethod_MethodExpected { get { return ResourceManager.GetString("ReflectionUtils_ExtractMethod_MethodExpected", resourceCulture); } } - + internal static string ResolverContextExtensions_ScopedContextData_KeyNotFound { get { return ResourceManager.GetString("ResolverContextExtensions_ScopedContextData_KeyNotFound", resourceCulture); } } - + internal static string ResolverContextExtensions_LocalContextData_KeyNotFound { get { return ResourceManager.GetString("ResolverContextExtensions_LocalContextData_KeyNotFound", resourceCulture); } } - + internal static string ResolverContextExtensions_ContextData_KeyNotFound { get { return ResourceManager.GetString("ResolverContextExtensions_ContextData_KeyNotFound", resourceCulture); } } - + internal static string SchemaTypes_GetType_DoesNotExist { get { return ResourceManager.GetString("SchemaTypes_GetType_DoesNotExist", resourceCulture); } } - + internal static string SchemaTypes_DefinitionInvalid { get { return ResourceManager.GetString("SchemaTypes_DefinitionInvalid", resourceCulture); } } - + internal static string InputObjectTypeDescriptor_OnlyProperties { get { return ResourceManager.GetString("InputObjectTypeDescriptor_OnlyProperties", resourceCulture); } } - + internal static string InterfaceTypeDescriptor_MustBePropertyOrMethod { get { return ResourceManager.GetString("InterfaceTypeDescriptor_MustBePropertyOrMethod", resourceCulture); } } - + internal static string ThrowHelper_FieldBase_Sealed { get { return ResourceManager.GetString("ThrowHelper_FieldBase_Sealed", resourceCulture); } } - + internal static string TypeInitializer_CannotFindType { get { return ResourceManager.GetString("TypeInitializer_CannotFindType", resourceCulture); } } - + internal static string ThrowHelper_RelayIdFieldHelpers_NoFieldType { get { return ResourceManager.GetString("ThrowHelper_RelayIdFieldHelpers_NoFieldType", resourceCulture); } } - + internal static string ThrowHelper_NodeResolver_ObjNoDefinition { get { return ResourceManager.GetString("ThrowHelper_NodeResolver_ObjNoDefinition", resourceCulture); } } - + internal static string ThrowHelper_NodeResolver_ArgumentTypeMissing { get { return ResourceManager.GetString("ThrowHelper_NodeResolver_ArgumentTypeMissing", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_TypeNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_TypeNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_FieldNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_FieldNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_FieldArgNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_FieldArgNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_InvalidCoordinate { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_InvalidCoordinate", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_InputFieldNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_InputFieldNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_EnumValueNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_EnumValueNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_DirectiveNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_DirectiveNotFound", resourceCulture); } } - + internal static string ThrowHelper_Schema_GetMember_DirectiveArgumentNotFound { get { return ResourceManager.GetString("ThrowHelper_Schema_GetMember_DirectiveArgumentNotFound", resourceCulture); } } - + internal static string ThrowHelper_FormatResultLeaf_InvalidSyntaxKind { get { return ResourceManager.GetString("ThrowHelper_FormatResultLeaf_InvalidSyntaxKind", resourceCulture); } } - + internal static string ThrowHelper_FormatResultList_InvalidObjectKind { get { return ResourceManager.GetString("ThrowHelper_FormatResultList_InvalidObjectKind", resourceCulture); } } - + internal static string ThrowHelper_FormatResultObject_InvalidObjectKind { get { return ResourceManager.GetString("ThrowHelper_FormatResultObject_InvalidObjectKind", resourceCulture); } } - + internal static string ThrowHelper_FormatValueList_InvalidObjectKind { get { return ResourceManager.GetString("ThrowHelper_FormatValueList_InvalidObjectKind", resourceCulture); } } - - internal static string ThrowHelper_ParseList_InvalidObjectKind { + + internal static string ThrowHelper_ParseList_InvalidValueKind { get { - return ResourceManager.GetString("ThrowHelper_ParseList_InvalidObjectKind", resourceCulture); + return ResourceManager.GetString("ThrowHelper_ParseList_InvalidValueKind", resourceCulture); } } - + internal static string ThrowHelper_ParseNestedList_InvalidSyntaxKind { get { return ResourceManager.GetString("ThrowHelper_ParseNestedList_InvalidSyntaxKind", resourceCulture); } } - - internal static string ThrowHelper_ParseInputObject_InvalidObjectKind { + + internal static string ThrowHelper_ParseInputObject_InvalidValueKind { get { - return ResourceManager.GetString("ThrowHelper_ParseInputObject_InvalidObjectKind", resourceCulture); + return ResourceManager.GetString("ThrowHelper_ParseInputObject_InvalidValueKind", resourceCulture); } } - + internal static string ThrowHelper_ParseInputObject_InvalidSyntaxKind { get { return ResourceManager.GetString("ThrowHelper_ParseInputObject_InvalidSyntaxKind", resourceCulture); } } - + internal static string ThrowHelper_NonNullInputViolation { get { return ResourceManager.GetString("ThrowHelper_NonNullInputViolation", resourceCulture); } } - + internal static string ThrowHelper_InvalidInputFieldNames { get { return ResourceManager.GetString("ThrowHelper_InvalidInputFieldNames", resourceCulture); } } - + internal static string ThrowHelper_RequiredInputFieldIsMissing { get { return ResourceManager.GetString("ThrowHelper_RequiredInputFieldIsMissing", resourceCulture); } } - + internal static string ThrowHelper_DataLoader_InvalidType { get { return ResourceManager.GetString("ThrowHelper_DataLoader_InvalidType", resourceCulture); } } - + internal static string ThrowHelper_Convention_ConventionCouldNotBeCreated { get { return ResourceManager.GetString("ThrowHelper_Convention_ConventionCouldNotBeCreated", resourceCulture); } } - + internal static string ThrowHelper_Convention_TwoConventionsRegisteredForScope { get { return ResourceManager.GetString("ThrowHelper_Convention_TwoConventionsRegisteredForScope", resourceCulture); } } - + internal static string ThrowHelper_NodeAttribute_IdFieldNotFound { get { return ResourceManager.GetString("ThrowHelper_NodeAttribute_IdFieldNotFound", resourceCulture); } } - + internal static string ThrowHelper_TypeCompletionContext_UnableToResolveType { get { return ResourceManager.GetString("ThrowHelper_TypeCompletionContext_UnableToResolveType", resourceCulture); } } - + internal static string ThrowHelper_TypeRegistrar_CreateInstanceFailed { get { return ResourceManager.GetString("ThrowHelper_TypeRegistrar_CreateInstanceFailed", resourceCulture); } } - + internal static string ThrowHelper_Convention_UnableToCreateConvention { get { return ResourceManager.GetString("ThrowHelper_Convention_UnableToCreateConvention", resourceCulture); } } - + internal static string ThrowHelper_SubscribeAttribute_SubscribeResolverNotFound { get { return ResourceManager.GetString("ThrowHelper_SubscribeAttribute_SubscribeResolverNotFound", resourceCulture); } } - + internal static string ThrowHelper_SubscribeAttribute_TopicTypeUnspecified { get { return ResourceManager.GetString("ThrowHelper_SubscribeAttribute_TopicTypeUnspecified", resourceCulture); } } - + internal static string ThrowHelper_SubscribeAttribute_MessageTypeUnspecified { get { return ResourceManager.GetString("ThrowHelper_SubscribeAttribute_MessageTypeUnspecified", resourceCulture); } } - + internal static string ThrowHelper_EventMessage_NotFound { get { return ResourceManager.GetString("ThrowHelper_EventMessage_NotFound", resourceCulture); } } - + internal static string ThrowHelper_EventMessage_InvalidCast { get { return ResourceManager.GetString("ThrowHelper_EventMessage_InvalidCast", resourceCulture); } } - + internal static string ErrorHelper_NeedsOneAtLeastField { get { return ResourceManager.GetString("ErrorHelper_NeedsOneAtLeastField", resourceCulture); } } - + internal static string ErrorHelper_TwoUnderscoresNotAllowedField { get { return ResourceManager.GetString("ErrorHelper_TwoUnderscoresNotAllowedField", resourceCulture); } } - + internal static string ErrorHelper_TwoUnderscoresNotAllowedOnArgument { get { return ResourceManager.GetString("ErrorHelper_TwoUnderscoresNotAllowedOnArgument", resourceCulture); } } - + internal static string ErrorHelper_TwoUnderscoresNotAllowedOnDirectiveName { get { return ResourceManager.GetString("ErrorHelper_TwoUnderscoresNotAllowedOnDirectiveName", resourceCulture); } } - + internal static string ErrorHelper_NotTransitivelyImplemented { get { return ResourceManager.GetString("ErrorHelper_NotTransitivelyImplemented", resourceCulture); } } - + internal static string ErrorHelper_InvalidFieldDeprecation { get { return ResourceManager.GetString("ErrorHelper_InvalidFieldDeprecation", resourceCulture); } } - + internal static string ErrorHelper_InvalidFieldType { get { return ResourceManager.GetString("ErrorHelper_InvalidFieldType", resourceCulture); } } - + internal static string ErrorHelper_FieldNotImplemented { get { return ResourceManager.GetString("ErrorHelper_FieldNotImplemented", resourceCulture); } } - + internal static string ErrorHelper_InvalidArgumentType { get { return ResourceManager.GetString("ErrorHelper_InvalidArgumentType", resourceCulture); } } - + internal static string ErrorHelper_AdditionalArgumentNotNullable { get { return ResourceManager.GetString("ErrorHelper_AdditionalArgumentNotNullable", resourceCulture); } } - + internal static string ErrorHelper_ArgumentNotImplemented { get { return ResourceManager.GetString("ErrorHelper_ArgumentNotImplemented", resourceCulture); } } - + internal static string ErrorHelper_OneOfInputObjectMustHaveNullableFieldsWithoutDefaults { get { return ResourceManager.GetString("ErrorHelper_OneOfInputObjectMustHaveNullableFieldsWithoutDefaults", resourceCulture); } } - + internal static string ErrorHelper_InputObjectMustNotHaveRecursiveNonNullableReferencesToSelf { get { return ResourceManager.GetString("ErrorHelper_InputObjectMustNotHaveRecursiveNonNullableReferencesToSelf", resourceCulture); } } - + internal static string ErrorHelper_RequiredArgumentCannotBeDeprecated { get { return ResourceManager.GetString("ErrorHelper_RequiredArgumentCannotBeDeprecated", resourceCulture); } } - + internal static string ErrorHelper_RequiredFieldCannotBeDeprecated { get { return ResourceManager.GetString("ErrorHelper_RequiredFieldCannotBeDeprecated", resourceCulture); } } - + internal static string ErrorHelper_InterfaceHasNoImplementation { get { return ResourceManager.GetString("ErrorHelper_InterfaceHasNoImplementation", resourceCulture); } } - + internal static string ErrorHelper_CompleteInterfacesHelper_UnableToResolveInterface { get { return ResourceManager.GetString("ErrorHelper_CompleteInterfacesHelper_UnableToResolveInterface", resourceCulture); } } - + internal static string ErrorHelper_DirectiveCollection_ArgumentDoesNotExist { get { return ResourceManager.GetString("ErrorHelper_DirectiveCollection_ArgumentDoesNotExist", resourceCulture); } } - + internal static string ErrorHelper_DirectiveCollection_ArgumentNonNullViolation { get { return ResourceManager.GetString("ErrorHelper_DirectiveCollection_ArgumentNonNullViolation", resourceCulture); } } - + internal static string ErrorHelper_ObjectType_UnableToInferOrResolveType { get { return ResourceManager.GetString("ErrorHelper_ObjectType_UnableToInferOrResolveType", resourceCulture); } } - + internal static string ErrorHelper_Relay_NoNodeResolver { get { return ResourceManager.GetString("ErrorHelper_Relay_NoNodeResolver", resourceCulture); } } - + internal static string ErrorHelper_NodeResolver_MustHaveExactlyOneIdArg { get { return ResourceManager.GetString("ErrorHelper_NodeResolver_MustHaveExactlyOneIdArg", resourceCulture); } } - + internal static string ErrorHelper_NodeResolver_MustReturnObject { get { return ResourceManager.GetString("ErrorHelper_NodeResolver_MustReturnObject", resourceCulture); } } - + internal static string ErrorHelper_NodeResolver_NodeTypeHasNoId { get { return ResourceManager.GetString("ErrorHelper_NodeResolver_NodeTypeHasNoId", resourceCulture); } } - + internal static string ThrowHelper_InvalidInputFieldNames_Single { get { return ResourceManager.GetString("ThrowHelper_InvalidInputFieldNames_Single", resourceCulture); } } - + internal static string ThrowHelper_MutationDuplicateErrorName { get { return ResourceManager.GetString("ThrowHelper_MutationDuplicateErrorName", resourceCulture); } } - + internal static string ErrorHelper_NodeResolverMissing { get { return ResourceManager.GetString("ErrorHelper_NodeResolverMissing", resourceCulture); } } - + internal static string ThrowHelper_Flags_Enum_Shape_Unknown { get { return ResourceManager.GetString("ThrowHelper_Flags_Enum_Shape_Unknown", resourceCulture); } } - + internal static string ThrowHelper_Flags_Parser_NoSelection { get { return ResourceManager.GetString("ThrowHelper_Flags_Parser_NoSelection", resourceCulture); } } - + internal static string ThrowHelper_Flags_Parser_UnknownSelection { get { return ResourceManager.GetString("ThrowHelper_Flags_Parser_UnknownSelection", resourceCulture); } } - + internal static string ThrowHelper_Flags_IllegalFlagEnumName { get { return ResourceManager.GetString("ThrowHelper_Flags_IllegalFlagEnumName", resourceCulture); } } - + internal static string Directive_GetArgumentValue_UnknownArgument { get { return ResourceManager.GetString("Directive_GetArgumentValue_UnknownArgument", resourceCulture); } } - + internal static string ErrorHelper_DirectiveCollection_ArgumentValueTypeIsWrong { get { return ResourceManager.GetString("ErrorHelper_DirectiveCollection_ArgumentValueTypeIsWrong", resourceCulture); } } - + internal static string TypeDiscoveryInfo_TypeRefKindNotSupported { get { return ResourceManager.GetString("TypeDiscoveryInfo_TypeRefKindNotSupported", resourceCulture); } } - + internal static string ErrorHelper_FetchedToManyNodesAtOnce { get { return ResourceManager.GetString("ErrorHelper_FetchedToManyNodesAtOnce", resourceCulture); } } - + internal static string ThrowHelper_InputTypeExpected_Message { get { return ResourceManager.GetString("ThrowHelper_InputTypeExpected_Message", resourceCulture); } } - + internal static string ThrowHelper_OutputTypeExpected_Message { get { return ResourceManager.GetString("ThrowHelper_OutputTypeExpected_Message", resourceCulture); } } - + internal static string TagDirective_Name_NotValid { get { return ResourceManager.GetString("TagDirective_Name_NotValid", resourceCulture); } } - + internal static string TagDirective_Descriptor_NotSupported { get { return ResourceManager.GetString("TagDirective_Descriptor_NotSupported", resourceCulture); } } - + internal static string ErrorHelper_DuplicateFieldName_Message { get { return ResourceManager.GetString("ErrorHelper_DuplicateFieldName_Message", resourceCulture); } } - + internal static string ErrorHelper_DuplicateDataMiddlewareDetected_Message { get { return ResourceManager.GetString("ErrorHelper_DuplicateDataMiddlewareDetected_Message", resourceCulture); } } - + internal static string SchemaException_UnexpectedError { get { return ResourceManager.GetString("SchemaException_UnexpectedError", resourceCulture); } } - + internal static string SchemaException_ErrorSummaryText { get { return ResourceManager.GetString("SchemaException_ErrorSummaryText", resourceCulture); } } - + internal static string ResolverContextExtensions_IsSelected_FieldNameEmpty { get { return ResourceManager.GetString("ResolverContextExtensions_IsSelected_FieldNameEmpty", resourceCulture); } } - + internal static string ObjectToDictionaryConverter_CycleInObjectGraph { get { return ResourceManager.GetString("ObjectToDictionaryConverter_CycleInObjectGraph", resourceCulture); } } - + internal static string LocalDateTimeType_Description { get { return ResourceManager.GetString("LocalDateTimeType_Description", resourceCulture); } } - + internal static string LocalDateType_Description { get { return ResourceManager.GetString("LocalDateType_Description", resourceCulture); } } - + internal static string LocalTimeType_Description { get { return ResourceManager.GetString("LocalTimeType_Description", resourceCulture); } } - + internal static string SchemaBuilder_BindRuntimeType_ObjectNotAllowed { get { return ResourceManager.GetString("SchemaBuilder_BindRuntimeType_ObjectNotAllowed", resourceCulture); } } - + internal static string TypeExtensions_KindIsNotSupported { get { return ResourceManager.GetString("TypeExtensions_KindIsNotSupported", resourceCulture); } } - + internal static string ThrowHelper_InvalidTypeConversion { get { return ResourceManager.GetString("ThrowHelper_InvalidTypeConversion", resourceCulture); diff --git a/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx b/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx index 4b784593809..dd32ddaace4 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx +++ b/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx @@ -264,13 +264,16 @@ In some cases, you need to provide options to alter GraphQL's execution behavior The field binding builder is not completed and cannot be added. - {0} cannot parse the given literal of type `{1}`. + {0} cannot coerce the given literal of type `{1}` to a runtime value. - {0} cannot parse the given value of type `{1}`. + {0} cannot coerce the given value JSON element of type `{1}` to a runtime value. - - {0} cannot serialize the given value. + + {0} cannot convert the runtime value of type `{1}` to a GraphQL literal. + + + {0} cannot coerce the runtime value of type `{1}` into the result value format. A directive type mustn't be one of the base classes `DirectiveType` or `DirectiveType<T>` but must be a type inheriting from `DirectiveType` or `DirectiveType<T>`. @@ -786,14 +789,14 @@ Type: `{0}` The list runtime value of {0} must implement IEnumerable or IList but is of the type {1}. - - The list `{1}` must to be serialized as `{2}` or as `IList` but not as `{0}`. + + The current JSON element is not a list. The item syntax node for a nested list must be `ListValue` but the parser found `{0}`. - - The input object `{1}` must to be serialized as `{2}` or as `IReadOnlyDictionary<string. object?>` but not as `{0}`. + + The current JSON element is not an object. The syntax node `{0}` is incompatible with the type `{1}`. diff --git a/src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs b/src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs deleted file mode 100644 index 91802ef3789..00000000000 --- a/src/HotChocolate/Core/src/Types/Properties/TypeResourcesExtensions.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Globalization; -using System.Text.Json; -using HotChocolate.Language; -using HotChocolate.Types; - -namespace HotChocolate.Properties; - -internal static class TypeResourceHelper -{ - public static string Scalar_Cannot_CoerceInputLiteral(ScalarType scalarType, IValueNode valueLiteral) - { - return string.Format( - CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_CoerceInputLiteral, - typeName, - literalType.Name); - } - - public static string Scalar_Cannot_CoerceInputValue(ScalarType scalarType, JsonElement inputValue) - { - return string.Format( - CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_CoerceInputValue, - typeName, - valueKind); - } - - public static string Scalar_Cannot_ConvertValueToLiteral(ScalarType scalarType, object runtimeValue) - { - return string.Format( - CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_Deserialize, - typeName); - } - - public static string Scalar_Cannot_CoerceOutputValue(ScalarType scalarType, object runtimeValue) - { - return string.Format( - CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_Serialize, - typeName); - } - - public static string Type_Name_IsNotValid(string typeName) - { - var name = typeName ?? "null"; - return $"`{name}` is not a valid GraphQL type name."; - } -} diff --git a/src/HotChocolate/Core/src/Types/Types/InputFormatter.cs b/src/HotChocolate/Core/src/Types/Types/InputFormatter.cs index 70a80a97f7b..9124d67704a 100644 --- a/src/HotChocolate/Core/src/Types/Types/InputFormatter.cs +++ b/src/HotChocolate/Core/src/Types/Types/InputFormatter.cs @@ -5,9 +5,16 @@ namespace HotChocolate.Types; -public sealed class InputFormatter(ITypeConverter converter) +public sealed class InputFormatter { - private readonly ITypeConverter _converter = converter ?? throw new ArgumentNullException(nameof(converter)); + private readonly ITypeConverter _converter; + + public InputFormatter(ITypeConverter converter) + { + ArgumentNullException.ThrowIfNull(converter); + + _converter = converter; + } public InputFormatter() : this(new DefaultTypeConverter()) { } @@ -121,7 +128,7 @@ private IValueNode FormatValueLeaf(object runtimeValue, ILeafType type, Path pat { try { - var runtimeType = type.ToRuntimeType(); + var runtimeType = type.RuntimeType; if (runtimeValue.GetType() != runtimeType && _converter.TryConvert(runtimeType, runtimeValue, out var converted)) @@ -129,7 +136,7 @@ private IValueNode FormatValueLeaf(object runtimeValue, ILeafType type, Path pat runtimeValue = converted; } - return type.CoerceInputValue(runtimeValue); + return type.ValueToLiteral(runtimeValue); } catch (LeafCoercionException ex) { @@ -176,140 +183,4 @@ void AddField(object? fieldValue, string fieldName, IInputType fieldType, Path f fields.Add(new ArgumentNode(fieldName, value)); } } - - public IValueNode FormatResult(object? resultValue, IType type, Path? path = null) - { - ArgumentNullException.ThrowIfNull(type); - - return FormatResultInternal(resultValue, type, path ?? Path.Root); - } - - private IValueNode FormatResultInternal(object? resultValue, IType type, Path path) - { - if (resultValue is null or NullValueNode) - { - if (type.Kind == TypeKind.NonNull) - { - throw NonNullInputViolation(type, path); - } - - return NullValueNode.Default; - } - - switch (type.Kind) - { - case TypeKind.NonNull: - return FormatResultInternal(resultValue, ((NonNullType)type).NullableType, path); - - case TypeKind.List: - return FormatResultList(resultValue, (ListType)type, path); - - case TypeKind.InputObject: - return FormatResultObject(resultValue, (InputObjectType)type, path); - - case TypeKind.Enum: - case TypeKind.Scalar: - return FormatResultLeaf(resultValue, (ILeafType)type, path); - - default: - throw new NotSupportedException(); - } - } - - private ObjectValueNode FormatResultObject( - object resultValue, - InputObjectType type, - Path path) - { - if (resultValue is IReadOnlyDictionary map) - { - var fields = new List(); - var processed = 0; - - foreach (var field in type.Fields) - { - if (map.TryGetValue(field.Name, out var fieldValue)) - { - var value = FormatResultInternal(fieldValue, field.Type, path); - fields.Add(new ObjectFieldNode(field.Name, value)); - processed++; - } - } - - if (processed < map.Count) - { - var invalidFieldNames = new List(); - - foreach (var item in map) - { - if (!type.Fields.ContainsField(item.Key)) - { - invalidFieldNames.Add(item.Key); - } - } - - throw InvalidInputFieldNames(type, invalidFieldNames, path); - } - - return new ObjectValueNode(fields); - } - - if (resultValue is ObjectValueNode node) - { - return node; - } - - if (type.RuntimeType != typeof(object) - && type.RuntimeType.IsInstanceOfType(resultValue)) - { - return FormatValueObject(resultValue, type, path); - } - - throw FormatResultObject_InvalidObjectKind(type, resultValue.GetType(), path); - } - - private ListValueNode FormatResultList(object resultValue, ListType type, Path path) - { - if (resultValue is IList resultList) - { - var items = new List(); - - for (var i = 0; i < resultList.Count; i++) - { - var newPath = path.Append(i); - items.Add(FormatResultInternal(resultList[i], type.ElementType, newPath)); - } - - return new ListValueNode(items); - } - - if (resultValue is ListValueNode node) - { - return node; - } - - throw FormatResultList_InvalidObjectKind(type, resultValue.GetType(), path); - } - - private static IValueNode FormatResultLeaf(object resultValue, ILeafType type, Path path) - { - if (resultValue is IValueNode node) - { - if (type.IsValueCompatible(node)) - { - return node; - } - - throw FormatResultLeaf_InvalidSyntaxKind(type, node.Kind, path); - } - - try - { - return type.ParseResult(resultValue); - } - catch (LeafCoercionException ex) - { - throw new LeafCoercionException(ex.Errors[0], ex.Type, path); - } - } } diff --git a/src/HotChocolate/Core/src/Types/Types/InputParser.cs b/src/HotChocolate/Core/src/Types/Types/InputParser.cs index 3fd57afca3a..4890b929528 100644 --- a/src/HotChocolate/Core/src/Types/Types/InputParser.cs +++ b/src/HotChocolate/Core/src/Types/Types/InputParser.cs @@ -1,5 +1,6 @@ using System.Buffers; using System.Collections; +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Utilities; using static HotChocolate.Utilities.ThrowHelper; @@ -416,16 +417,16 @@ private object ParseDirective( return type.CreateInstance(fieldValues); } - public object? ParseResult(object? resultValue, IType type, Path? path = null) + public object? ParseInputValue(JsonElement inputValue, IType type, Path? path = null) { ArgumentNullException.ThrowIfNull(type); - return Deserialize(resultValue, type, path ?? s_root, null); + return Deserialize(inputValue, type, path ?? s_root, null); } - private object? Deserialize(object? resultValue, IType type, Path path, InputField? field) + private object? Deserialize(JsonElement inputValue, IType type, Path path, InputField? field) { - if (resultValue is null or NullValueNode) + if (inputValue.ValueKind == JsonValueKind.Null) { if (type.Kind == TypeKind.NonNull) { @@ -443,62 +444,56 @@ private object ParseDirective( switch (type.Kind) { case TypeKind.List: - return DeserializeList(resultValue, (ListType)type, path, field); + return DeserializeList(inputValue, (ListType)type, path, field); case TypeKind.InputObject: - return DeserializeObject( - resultValue, - (InputObjectType)type, - path); + return DeserializeObject(inputValue, (InputObjectType)type, path); case TypeKind.Enum: case TypeKind.Scalar: - return DeserializeLeaf(resultValue, (ILeafType)type, path, field); + return DeserializeLeaf(inputValue, (ILeafType)type, path, field); default: throw new NotSupportedException(); } } - private object DeserializeList( - object resultValue, - ListType type, - Path path, - InputField? field) + private object DeserializeList(JsonElement inputValue, ListType type, Path path, InputField? field) { - if (resultValue is IList serializedList) + if (inputValue.ValueKind is JsonValueKind.Array) { var list = CreateList(type); - for (var i = 0; i < serializedList.Count; i++) + var i = 0; + foreach (var element in inputValue.EnumerateArray()) { - var newPath = path.Append(i); - list.Add(Deserialize(serializedList[i], type.ElementType, newPath, field)); + var newPath = path.Append(i++); + list.Add(Deserialize(element, type.ElementType, newPath, field)); } return list; } - if (resultValue is ListValueNode node) - { - return ParseList(node, type, path, 0, true, field); - } - - throw ParseList_InvalidObjectKind(type, resultValue.GetType(), path); + throw ParseList_InvalidValueKind(type, path); } - private object DeserializeObject(object resultValue, InputObjectType type, Path path) + private object DeserializeObject(JsonElement inputValue, InputObjectType type, Path path) { - if (resultValue is IReadOnlyDictionary map) + if (inputValue.ValueKind is JsonValueKind.Object) { var oneOf = type.IsOneOf; +#if NET9_0_OR_GREATER + var propertyCount = inputValue.GetPropertyCount(); +#else + var propertyCount = inputValue.EnumerateObject().Count(); +#endif - if (oneOf && map.Count is 0) + if (oneOf && propertyCount is 0) { throw OneOfNoFieldSet(type, path); } - if (oneOf && map.Count > 1) + if (oneOf && propertyCount > 1) { throw OneOfMoreThanOneFieldSet(type, path); } @@ -506,15 +501,13 @@ private object DeserializeObject(object resultValue, InputObjectType type, Path var fieldValues = new object?[type.Fields.Count]; var consumed = 0; - for (var i = 0; i < type.Fields.Count; i++) + foreach (var property in inputValue.EnumerateObject()) { - var field = type.Fields[i]; - - if (map.TryGetValue(field.Name, out var fieldValue)) + if (type.Fields.TryGetField(property.Name, out var field)) { var fieldPath = path.Append(field.Name); - if (fieldValue is null) + if (property.Value.ValueKind is JsonValueKind.Null) { if (field.Type.Kind is TypeKind.NonNull) { @@ -527,12 +520,22 @@ private object DeserializeObject(object resultValue, InputObjectType type, Path } } - var value = Deserialize(fieldValue, field.Type, fieldPath, field); + var value = Deserialize(property.Value, field.Type, fieldPath, field); value = FormatAndConvertValue(field, path, null, value, field.IsOptional, true); fieldValues[i] = value; consumed++; } + } + + for (var i = 0; i < type.Fields.Count; i++) + { + var field = type.Fields[i]; + + if (map.TryGetValue(field.Name, out var fieldValue)) + { + + } else { var fieldPath = path.Append(field.Name); @@ -558,18 +561,7 @@ private object DeserializeObject(object resultValue, InputObjectType type, Path return type.CreateInstance(fieldValues); } - if (type.RuntimeType != typeof(object) - && type.RuntimeType.IsInstanceOfType(resultValue)) - { - return resultValue; - } - - if (resultValue is ObjectValueNode node) - { - return ParseObject(node, type, path, 0, true); - } - - throw ParseInputObject_InvalidObjectKind(type, resultValue.GetType(), path); + throw ParseInputObject_InvalidValueKind(type, resultValue.GetType(), path); } private object? DeserializeLeaf( diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs index d0ccca7efa7..9209ab429d5 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs @@ -2,6 +2,7 @@ using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -55,9 +56,7 @@ public override object CoerceInputValue(JsonElement inputValue) return false; default: - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputValue(this, inputValue), - this); + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs index c075aefc9e5..4ddbac55dc9 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs @@ -4,6 +4,7 @@ using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -79,9 +80,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) return value; } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(this, valueLiteral), - this); + throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } public override object CoerceInputValue(JsonElement inputValue) @@ -91,9 +90,7 @@ public override object CoerceInputValue(JsonElement inputValue) return value; } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputValue(this, inputValue), - this); + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } public override void CoerceOutputValue(DateTimeOffset runtimeValue, ResultElement resultValue) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs index 93bce01fd3e..3de06abd016 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs @@ -108,7 +108,11 @@ public override void CoerceOutputValue(JsonElement runtimeValue, ResultElement r case JsonValueKind.Object: { +#if NET9_0_OR_GREATER var length = runtimeValue.GetPropertyCount(); +#else + var length = runtimeValue.EnumerateObject().Count(); +#endif resultValue.SetObjectValue(length); using var enumerator = runtimeValue.EnumerateObject().GetEnumerator(); diff --git a/src/HotChocolate/Core/src/Types/Utilities/InputObjectToDictionaryConverter.cs b/src/HotChocolate/Core/src/Types/Utilities/InputObjectToDictionaryConverter.cs index 3413ab52d4e..d68134dacd9 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/InputObjectToDictionaryConverter.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/InputObjectToDictionaryConverter.cs @@ -96,7 +96,7 @@ private void VisitList( private void VisitLeaf(ILeafType type, object obj, Action setValue) { - if (type is IHasRuntimeType hasClrType) + if (type is IRuntimeTypeProvider hasClrType) { var currentType = obj.GetType(); var normalized = currentType == hasClrType.RuntimeType diff --git a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs index 47bab87c820..4d0304e9d3e 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs @@ -1,6 +1,5 @@ #nullable disable -using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Reflection; using System.Text.Json; @@ -311,17 +310,12 @@ public static LeafCoercionException ParseInputObject_InvalidSyntaxKind( type, path); - public static LeafCoercionException ParseInputObject_InvalidObjectKind( + public static LeafCoercionException ParseInputObject_InvalidValueKind( InputObjectType type, - Type objectType, Path path) => new LeafCoercionException( ErrorBuilder.New() - .SetMessage( - ThrowHelper_ParseInputObject_InvalidObjectKind, - objectType.FullName ?? objectType.Name, - type.Name, - type.RuntimeType.FullName ?? type.RuntimeType.Name) + .SetMessage(ThrowHelper_ParseInputObject_InvalidValueKind) .SetPath(path) .SetExtension(nameof(type), type.Name) .Build(), @@ -345,19 +339,13 @@ public static LeafCoercionException ParseNestedList_InvalidSyntaxKind( type, path); - public static LeafCoercionException ParseList_InvalidObjectKind( + public static LeafCoercionException ParseList_InvalidValueKind( ListType type, - Type listType, Path path) { - var runtimeType = type.ToRuntimeType(); return new LeafCoercionException( ErrorBuilder.New() - .SetMessage( - ThrowHelper_ParseList_InvalidObjectKind, - listType.FullName ?? listType.Name, - type.Print(), - runtimeType.FullName ?? runtimeType.Name) + .SetMessage(ThrowHelper_ParseList_InvalidValueKind) .Build(), type, path); @@ -614,44 +602,55 @@ public static LeafCoercionException Scalar_Cannot_CoerceInputLiteral( ITypeDefinition scalarType, IValueNode valueLiteral) { - return string.Format( - CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_CoerceInputLiteral, - typeName, - literalType.Name); + return new LeafCoercionException( + ErrorBuilder.New() + .SetMessage( + TypeResources.Scalar_Cannot_CoerceInputLiteral, + scalarType.Name, + valueLiteral.Kind) + .Build(), + scalarType); } public static LeafCoercionException Scalar_Cannot_CoerceInputValue( ITypeDefinition scalarType, JsonElement inputValue) { - return string.Format( - CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_CoerceInputValue, - typeName, - valueKind); + return new LeafCoercionException( + ErrorBuilder.New() + .SetMessage( + TypeResources.Scalar_Cannot_CoerceInputValue, + scalarType.Name, + inputValue.ValueKind) + .Build(), + scalarType); } - public static LeafCoercionException Scalar_Cannot_ConvertValueToLiteral( ITypeDefinition scalarType, object runtimeValue) { - // return string.Format( - // CultureInfo.InvariantCulture, - // TypeResources.Scalar_Cannot_Deserialize, - // typeName); - - throw new InvalidOperationException(); + return new LeafCoercionException( + ErrorBuilder.New() + .SetMessage( + TypeResources.Scalar_Cannot_ConvertValueToLiteral, + scalarType.Name, + runtimeValue.GetType().FullName) + .Build(), + scalarType); } public static LeafCoercionException Scalar_Cannot_CoerceOutputValue( ITypeDefinition scalarType, object runtimeValue) { - return string.Format( - CultureInfo.InvariantCulture, - TypeResources.Scalar_Cannot_Serialize, - typeName); + return new LeafCoercionException( + ErrorBuilder.New() + .SetMessage( + TypeResources.Scalar_Cannot_CoerceOutputValue, + scalarType.Name, + runtimeValue.GetType().FullName) + .Build(), + scalarType); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs index ea5d8f8e2f8..5f751e15561 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs @@ -27,7 +27,7 @@ public void Deserialize_InputObject_AllIsSet() // act var parser = new InputParser(new DefaultTypeConverter()); - var runtimeValue = parser.ParseResult(fieldData, type, Path.Root); + var runtimeValue = parser.ParseInputValue(fieldData, type, Path.Root); // assert Assert.IsType(runtimeValue).MatchSnapshot(); @@ -75,7 +75,7 @@ public void Deserialize_InputObject_AllIsSet_ConstructorInit() // act var parser = new InputParser(new DefaultTypeConverter()); - var runtimeValue = parser.ParseResult(fieldData, type, Path.Root); + var runtimeValue = parser.ParseInputValue(fieldData, type, Path.Root); // assert Assert.IsType(runtimeValue).MatchSnapshot(); @@ -122,7 +122,7 @@ public void Deserialize_InputObject_AllIsSet_MissingRequired() // act var parser = new InputParser(new DefaultTypeConverter()); - void Action() => parser.ParseResult(fieldData, type, Path.Root); + void Action() => parser.ParseInputValue(fieldData, type, Path.Root); // assert Assert.Throws(Action).MatchSnapshot(); @@ -171,7 +171,7 @@ public void Deserialize_InputObject_AllIsSet_OneInvalidField() var parser = new InputParser(new DefaultTypeConverter()); void Action() - => parser.ParseResult(fieldData, type, Path.Root.Append("root")); + => parser.ParseInputValue(fieldData, type, Path.Root.Append("root")); // assert Assert.Throws(Action).MatchSnapshot(); @@ -224,7 +224,7 @@ public void Deserialize_InputObject_AllIsSet_TwoInvalidFields() var parser = new InputParser(new DefaultTypeConverter()); void Action() - => parser.ParseResult(fieldData, type, Path.Root.Append("root")); + => parser.ParseInputValue(fieldData, type, Path.Root.Append("root")); // assert Assert.Throws(Action).MatchSnapshot(); @@ -487,7 +487,7 @@ public void Force_NonNull_Struct_To_Be_Optional() // act var parser = new InputParser(new DefaultTypeConverter()); - var runtimeValue = parser.ParseResult(fieldData, type, Path.Root); + var runtimeValue = parser.ParseInputValue(fieldData, type, Path.Root); // assert Assert.IsType(runtimeValue).MatchSnapshot(); diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs index defc9c00b8b..74280fb69a9 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs @@ -363,7 +363,7 @@ public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) { var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - Assert.Null(inputParser.ParseResult(null, type)); + Assert.Null(inputParser.ParseInputValue(null, type)); } [Theory] @@ -391,7 +391,7 @@ public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) var type = CreateInputType(typeName); // act - var result = inputParser.ParseResult(_geometry, type); + var result = inputParser.ParseInputValue(_geometry, type); // assert Assert.Equal(result, _geometry); @@ -408,7 +408,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseInputValue("", type)); } [Theory] @@ -427,7 +427,7 @@ public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result, 26912); @@ -448,7 +448,7 @@ public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result); @@ -471,7 +471,7 @@ public void Deserialize_Should_Fail_When_TypeNameIsMissing(string typeName) // act // assert Assert.Throws( - () => inputParser.ParseResult(serialized, type)); + () => inputParser.ParseInputValue(serialized, type)); } [Theory] @@ -491,7 +491,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert Assert.Throws( - () => inputParser.ParseResult(serialized, type)); + () => inputParser.ParseInputValue(serialized, type)); } [Theory] diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs index e5b670ae97e..e69c0e9f0be 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs @@ -41,7 +41,7 @@ public void ParseLiteral_MultiLineString_With_Valid_Coordinates() var type = CreateInputType(); // act - var result = inputParser.ParseResult( + var result = inputParser.ParseInputValue( new ObjectValueNode( new ObjectFieldNode( "type", diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs index 64d59708d7b..52f50963d98 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs @@ -430,7 +430,7 @@ public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) { var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - Assert.Null(inputParser.ParseResult(null, type)); + Assert.Null(inputParser.ParseInputValue(null, type)); } [Theory] @@ -458,7 +458,7 @@ public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) var type = CreateInputType(typeName); // act - var result = inputParser.ParseResult(_geometry, type); + var result = inputParser.ParseInputValue(_geometry, type); // assert Assert.Equal(result, _geometry); @@ -475,7 +475,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseInputValue("", type)); } [Theory] @@ -495,7 +495,7 @@ public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result, 26912); @@ -517,7 +517,7 @@ public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result); @@ -540,7 +540,7 @@ public void Deserialize_Should_Fail_WhenTypeNameIsMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseInputValue(serialized, type)); } [Theory] @@ -560,7 +560,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseInputValue(serialized, type)); } [Theory] diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs index 06db80d6f20..6c7cea16ad6 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs @@ -376,7 +376,7 @@ public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) // act // assert - Assert.Null(inputParser.ParseResult(null, type)); + Assert.Null(inputParser.ParseInputValue(null, type)); } [Theory] @@ -404,7 +404,7 @@ public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) var type = CreateInputType(typeName); // act - var result = inputParser.ParseResult(_geometry, type); + var result = inputParser.ParseInputValue(_geometry, type); // assert Assert.Equal(result, _geometry); @@ -421,7 +421,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseInputValue("", type)); } [Theory] @@ -440,7 +440,7 @@ public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result, 26912); @@ -461,7 +461,7 @@ public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result); @@ -483,7 +483,7 @@ public void Deserialize_Should_Fail_WhentypeNameIsMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseInputValue(serialized, type)); } [Theory] @@ -502,7 +502,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseInputValue(serialized, type)); } [Theory] diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs index 13c25a8b1c2..2f6867a9650 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs @@ -449,7 +449,7 @@ public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) { var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - Assert.Null(inputParser.ParseResult(null, type)); + Assert.Null(inputParser.ParseInputValue(null, type)); } [Theory] @@ -477,7 +477,7 @@ public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) var type = CreateInputType(typeName); // act - var result = inputParser.ParseResult(_geometry, type); + var result = inputParser.ParseInputValue(_geometry, type); // assert Assert.Equal(result, _geometry); @@ -494,7 +494,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseInputValue("", type)); } [Theory] @@ -513,7 +513,7 @@ public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result, 26912); @@ -534,7 +534,7 @@ public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result); @@ -556,7 +556,7 @@ public void Deserialize_Should_Fail_WhenTypeNameIsMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseInputValue(serialized, type)); } [Theory] @@ -575,7 +575,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseInputValue(serialized, type)); } [Theory] diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs index 200840b27bb..b758ce1f029 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs @@ -382,7 +382,7 @@ public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) // act // assert - Assert.Null(inputParser.ParseResult(null, type)); + Assert.Null(inputParser.ParseInputValue(null, type)); } [Theory] @@ -410,7 +410,7 @@ public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) var type = CreateInputType(typeName); // act - var result = inputParser.ParseResult(_geometry, type); + var result = inputParser.ParseInputValue(_geometry, type); // assert Assert.Equal(result, _geometry); @@ -427,7 +427,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseInputValue("", type)); } [Theory] @@ -446,7 +446,7 @@ public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result, 26912); @@ -467,7 +467,7 @@ public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result); @@ -489,7 +489,7 @@ public void Deserialize_Should_Fail_WhenTypeNameIsMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseInputValue(serialized, type)); } [Theory] @@ -508,7 +508,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseInputValue(serialized, type)); } [Theory] diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs index 4e98e1bf73c..41dc1c01664 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs @@ -435,7 +435,7 @@ public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) // act // assert - Assert.Null(inputParser.ParseResult(null, type)); + Assert.Null(inputParser.ParseInputValue(null, type)); } [Theory] @@ -463,7 +463,7 @@ public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) var type = CreateInputType(typeName); // act - var result = inputParser.ParseResult(_geometry, type); + var result = inputParser.ParseInputValue(_geometry, type); // assert Assert.Equal(result, _geometry); @@ -480,7 +480,7 @@ public void Deserialize_Should_Throw_When_InvalidType(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult("", type)); + Assert.Throws(() => inputParser.ParseInputValue("", type)); } [Theory] @@ -499,7 +499,7 @@ public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result, 26912); @@ -520,7 +520,7 @@ public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) }; // act - var result = inputParser.ParseResult(serialized, type); + var result = inputParser.ParseInputValue(serialized, type); // assert AssertGeometry(result); @@ -542,7 +542,7 @@ public void Deserialize_Should_Fail_WhentypeNameIsMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseInputValue(serialized, type)); } [Theory] @@ -561,7 +561,7 @@ public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) // act // assert - Assert.Throws(() => inputParser.ParseResult(serialized, type)); + Assert.Throws(() => inputParser.ParseInputValue(serialized, type)); } [Theory] From 22b8812159409c71df05fce54a7d9555964c9f64 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Mon, 22 Dec 2025 22:47:27 +0100 Subject: [PATCH 054/144] Add snapshot for Utf8GraphQLRequestParser tests with complex query structure --- ...thorizationTests.Policy_NotAuthorized.snap | 8 +- .../AuthorizationTests.Policy_NotFound.snap | 8 +- ...andlerTests.Authorize_NoDefaultPolicy.snap | 6 - ...tionHandlerTests.Authorize_NotAllowed.snap | 6 - ...ndlerTests.Authorize_NotAuthenticated.snap | 6 - ...HandlerTests.Authorize_PolicyNotFound.snap | 6 - ...rgs_NoClaimsIdentity_NotAuthenticated.snap | 6 - ...ests.DefaultPolicy_Disallow_Anonymous.snap | 6 - ...eDirectives_SecondFails_NotAuthorized.snap | 6 - ...xecuted_After_Resolver_User_Is_Denied.snap | 6 - ...thorizationTests.Policy_NotAuthorized.snap | 6 - .../AuthorizationTests.Policy_NotFound.snap | 6 - ...TheRolesAndMissesPolicy_NotAuthorized.snap | 6 - ...ButIsNotInOneOfTheRoles_NotAuthorized.snap | 6 - ...rHasRoleOrMatchesPolicy_NotAuthorized.snap | 6 - ...s_UserHasDifferentRoles_NotAuthorized.snap | 6 - ...ts.Roles_UserHasNoRoles_NotAuthorized.snap | 6 - ...s_UserHasNoneOfTheRoles_NotAuthorized.snap | 6 - ...orizeSchemaTests.AuthorizeOnExtension.snap | 6 - .../Execution/IOperationRequest.cs | 3 +- .../Execution/OperationRequest.cs | 43 +- .../Execution/OperationRequestBuilder.cs | 203 +- .../Execution/VariableBatchRequest.cs | 23 +- ...ExecutionAbstractionsResources.Designer.cs | 18 + .../ExecutionAbstractionsResources.resx | 9 + .../Extensions/OperationContextExtensions.cs | 6 +- .../Types/Execution/Pipeline/PipelineTools.cs | 7 +- .../Processing/VariableCoercionHelper.cs | 207 +- .../Execution/Processing/VariableRewriter.cs | 6 +- .../Execution/Processing/VariableValue.cs | 27 + .../Processing/VariableValueCollection.cs | 10 +- .../Processing/VariableValueOrLiteral.cs | 26 - .../Core/src/Types/Types/InputParser.cs | 2 +- .../Core/src/Types/Types/Scalars/AnyType.cs | 19 +- .../src/Types/Types/Scalars/ByteArrayType.cs | 6 +- .../src/Types/Types/Scalars/FloatTypeBase.cs | 2 +- .../Types/Types/Scalars/IntegerTypeBase.cs | 3 +- .../Execution/OperationRequestBuilderTests.cs | 2 +- .../Processing/VariableCoercionHelperTests.cs | 66 +- .../src/Language.Web/GraphQLRequest.cs | 10 +- .../src/Language.Web/GraphQLSocketMessage.cs | 6 +- .../Utf8GraphQLRequestParser.Constants.cs | 31 - .../Utf8GraphQLRequestParser.Json.cs | 226 - .../Utf8GraphQLRequestParser.Message.cs | 13 - .../Utf8GraphQLRequestParser.Request.cs | 25 - .../Utf8GraphQLRequestParser.Response.cs | 86 - .../Utf8GraphQLRequestParser.Syntax.cs | 138 - .../Utf8GraphQLRequestParser.Utilities.cs | 264 - .../Utf8GraphQLRequestParser.Values.cs | 244 - .../Language.Web/Utf8GraphQLRequestParser.cs | 606 +- .../Utf8GraphQLSocketMessageParser.cs | 85 + .../Language/test/Directory.Build.props | 2 - .../DirectiveDefinitionNodeTests.cs | 163 +- .../SelectionSetNodeTests.cs | 6 +- .../VariableDefinitionNodeTests.cs | 12 +- ...Tests.DirectiveDefinition_ToString.graphql | 2 + ...veDefinition_WithArgument_ToString.graphql | 2 + .../Parser/KitchenSinkParserTests.cs | 4 +- .../Language.Tests/Parser/QueryParserTests.cs | 12 +- ...ectiveParserTests.ParseQueryDirective.snap | 4 +- .../Language.Web.Tests/StringExtensions.cs | 9 + .../Utf8GraphQLRequestParserTests.cs} | 509 +- .../__resources__/Apollo_AQP_FullRequest.json | 11 + .../Apollo_AQP_QuerySignature_1.json | 10 + .../Apollo_AQP_QuerySignature_2.json | 10 + .../__resources__/BlockString.txt | 3 + .../__resources__/Float.json | 8 + .../__resources__/IntrospectionQuery.graphql | 85 + .../QueryWithIntArgument.graphql | 5 + .../__resources__/QueryWithStringArg.graphql | 17 + .../__resources__/SimpleRequest.json | 3 + .../__resources__/aliases.graphql | 1 + .../__resources__/kitchen-sink.graphql | 63 + .../__resources__/onegraph.graphql | 239529 +++++++++++++++ .../__resources__/russian-literals.graphql | 5 + .../russian_utf8_escape_characters.json | 4 + .../__resources__/schema-kitchen-sink.graphql | 133 + ...serTests.Parse_Apollo_Client_v4_Query.snap | 83 + ...QLRequestParserTests.Parse_Id_As_Name.snap | 1700 + ..._Kitchen_Sink_Query_AllProps_No_Cache.snap | 1721 + ...sts.Parse_Kitchen_Sink_Query_No_Cache.snap | 1700 + ...s.Parse_Kitchen_Sink_Query_With_Cache.snap | 1700 + ...en_Sink_Query_With_Russian_Characters.snap | 125 + ...Query_With_Russian_Escaped_Characters.snap | 125 + ...arserTests.Parse_Skip_Custom_Property.snap | 1700 + ...rTests.Utf8GraphQLRequestParser_Parse.snap | 1700 + 86 files changed, 251522 insertions(+), 2184 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/VariableValue.cs delete mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueOrLiteral.cs delete mode 100644 src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Constants.cs delete mode 100644 src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Json.cs delete mode 100644 src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Message.cs delete mode 100644 src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Request.cs delete mode 100644 src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Response.cs delete mode 100644 src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Syntax.cs delete mode 100644 src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Utilities.cs delete mode 100644 src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Values.cs create mode 100644 src/HotChocolate/Language/src/Language.Web/Utf8GraphQLSocketMessageParser.cs create mode 100644 src/HotChocolate/Language/test/Language.SyntaxTree.Tests/__snapshots__/DirectiveDefinitionNodeTests.DirectiveDefinition_ToString.graphql create mode 100644 src/HotChocolate/Language/test/Language.SyntaxTree.Tests/__snapshots__/DirectiveDefinitionNodeTests.DirectiveDefinition_WithArgument_ToString.graphql create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/StringExtensions.cs rename src/HotChocolate/Language/test/{Language.Tests/Parser/GraphQLRequestParserTests.cs => Language.Web.Tests/Utf8GraphQLRequestParserTests.cs} (67%) create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_FullRequest.json create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_QuerySignature_1.json create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_QuerySignature_2.json create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/BlockString.txt create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Float.json create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/IntrospectionQuery.graphql create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/QueryWithIntArgument.graphql create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/QueryWithStringArg.graphql create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/SimpleRequest.json create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/aliases.graphql create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/kitchen-sink.graphql create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/onegraph.graphql create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/russian-literals.graphql create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/russian_utf8_escape_characters.json create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__resources__/schema-kitchen-sink.graphql create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Id_As_Name.snap create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_AllProps_No_Cache.snap create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_No_Cache.snap create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Cache.snap create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Russian_Characters.snap create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Russian_Escaped_Characters.snap create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Skip_Custom_Property.snap create mode 100644 src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Utf8GraphQLRequestParser_Parse.snap diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Opa.Tests/__snapshots__/AuthorizationTests.Policy_NotAuthorized.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Opa.Tests/__snapshots__/AuthorizationTests.Policy_NotAuthorized.snap index 7290ee0650c..a9075e4d155 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Opa.Tests/__snapshots__/AuthorizationTests.Policy_NotAuthorized.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Opa.Tests/__snapshots__/AuthorizationTests.Policy_NotAuthorized.snap @@ -1,4 +1,4 @@ -{ +{ "ContentType": "application/graphql-response+json; charset=utf-8", "StatusCode": "OK", "Data": { @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "age" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Opa.Tests/__snapshots__/AuthorizationTests.Policy_NotFound.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Opa.Tests/__snapshots__/AuthorizationTests.Policy_NotFound.snap index 7290ee0650c..a9075e4d155 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Opa.Tests/__snapshots__/AuthorizationTests.Policy_NotFound.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Opa.Tests/__snapshots__/AuthorizationTests.Policy_NotFound.snap @@ -1,4 +1,4 @@ -{ +{ "ContentType": "application/graphql-response+json; charset=utf-8", "StatusCode": "OK", "Data": { @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "age" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NoDefaultPolicy.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NoDefaultPolicy.snap index 61d0b593591..d6abcbc3384 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NoDefaultPolicy.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NoDefaultPolicy.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The default authorization policy does not exist.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "bar" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NotAllowed.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NotAllowed.snap index 241cd0dd354..d76221d5004 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NotAllowed.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NotAllowed.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "bar" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NotAuthenticated.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NotAuthenticated.snap index e91bf9450d2..939d7c232a4 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NotAuthenticated.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_NotAuthenticated.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "bar" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_PolicyNotFound.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_PolicyNotFound.snap index ccbc4d7c00d..e2df4f0e32a 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_PolicyNotFound.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationHandlerTests.Authorize_PolicyNotFound.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The `` authorization policy does not exist.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "bar" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Authorize_WithoutArgs_NoClaimsIdentity_NotAuthenticated.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Authorize_WithoutArgs_NoClaimsIdentity_NotAuthenticated.snap index fc8f13971a0..4b3f15cab11 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Authorize_WithoutArgs_NoClaimsIdentity_NotAuthenticated.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Authorize_WithoutArgs_NoClaimsIdentity_NotAuthenticated.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "default" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.DefaultPolicy_Disallow_Anonymous.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.DefaultPolicy_Disallow_Anonymous.snap index fc8f13971a0..4b3f15cab11 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.DefaultPolicy_Disallow_Anonymous.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.DefaultPolicy_Disallow_Anonymous.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "default" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.PipedAuthorizeDirectives_SecondFails_NotAuthorized.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.PipedAuthorizeDirectives_SecondFails_NotAuthorized.snap index 42a6fcfb2e2..da8b00bfa7b 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.PipedAuthorizeDirectives_SecondFails_NotAuthorized.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.PipedAuthorizeDirectives_SecondFails_NotAuthorized.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "piped" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_Is_Executed_After_Resolver_User_Is_Denied.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_Is_Executed_After_Resolver_User_Is_Denied.snap index f1321e2febe..225c636908c 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_Is_Executed_After_Resolver_User_Is_Denied.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_Is_Executed_After_Resolver_User_Is_Denied.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "afterResolver" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_NotAuthorized.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_NotAuthorized.snap index 86c03f033e2..a9075e4d155 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_NotAuthorized.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_NotAuthorized.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "age" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_NotFound.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_NotFound.snap index f5702f9d578..22022951f27 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_NotFound.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Policy_NotFound.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The `HasAgeDefined` authorization policy does not exist.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "age" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserHasOneOfTheRolesAndMissesPolicy_NotAuthorized.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserHasOneOfTheRolesAndMissesPolicy_NotAuthorized.snap index 8d787269b5d..98e68e21eff 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserHasOneOfTheRolesAndMissesPolicy_NotAuthorized.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserHasOneOfTheRolesAndMissesPolicy_NotAuthorized.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "rolesAndPolicy" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserMatchesPolicyButIsNotInOneOfTheRoles_NotAuthorized.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserMatchesPolicyButIsNotInOneOfTheRoles_NotAuthorized.snap index 8d787269b5d..98e68e21eff 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserMatchesPolicyButIsNotInOneOfTheRoles_NotAuthorized.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserMatchesPolicyButIsNotInOneOfTheRoles_NotAuthorized.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "rolesAndPolicy" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserNeitherHasRoleOrMatchesPolicy_NotAuthorized.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserNeitherHasRoleOrMatchesPolicy_NotAuthorized.snap index 8d787269b5d..98e68e21eff 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserNeitherHasRoleOrMatchesPolicy_NotAuthorized.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_And_Policy_UserNeitherHasRoleOrMatchesPolicy_NotAuthorized.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "rolesAndPolicy" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasDifferentRoles_NotAuthorized.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasDifferentRoles_NotAuthorized.snap index 7bc04fe08bc..96475f3839b 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasDifferentRoles_NotAuthorized.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasDifferentRoles_NotAuthorized.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "roles" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasNoRoles_NotAuthorized.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasNoRoles_NotAuthorized.snap index 7bc04fe08bc..96475f3839b 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasNoRoles_NotAuthorized.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasNoRoles_NotAuthorized.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "roles" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasNoneOfTheRoles_NotAuthorized.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasNoneOfTheRoles_NotAuthorized.snap index 1e208d0da77..ded619891c3 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasNoneOfTheRoles_NotAuthorized.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizationTests.Roles_UserHasNoneOfTheRoles_NotAuthorized.snap @@ -7,12 +7,6 @@ "Errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "roles_ab" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizeSchemaTests.AuthorizeOnExtension.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizeSchemaTests.AuthorizeOnExtension.snap index e91bf9450d2..939d7c232a4 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizeSchemaTests.AuthorizeOnExtension.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/__snapshots__/AuthorizeSchemaTests.AuthorizeOnExtension.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "bar" ], diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationRequest.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationRequest.cs index 61e89bea9e8..fca65ff5b69 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationRequest.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationRequest.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; namespace HotChocolate.Execution; @@ -36,7 +37,7 @@ public interface IOperationRequest : IExecutionRequest /// /// Gets the GraphQL request extension data. /// - IReadOnlyDictionary? Extensions { get; } + JsonDocument? Extensions { get; } /// /// GraphQL request flags allow limiting the GraphQL executor capabilities. diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs index dc0add49b74..637147fdfb2 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Features; using HotChocolate.Language; using static HotChocolate.ExecutionAbstractionsResources; @@ -54,8 +55,8 @@ public OperationRequest( OperationDocumentHash? documentHash, string? operationName, ErrorHandlingMode? errorHandlingMode, - IReadOnlyDictionary? variableValues, - IReadOnlyDictionary? extensions, + JsonDocument? variableValues, + JsonDocument? extensions, IReadOnlyDictionary? contextData, IFeatureCollection? features, IServiceProvider? services, @@ -63,7 +64,17 @@ public OperationRequest( { if (document is null && OperationDocumentId.IsNullOrEmpty(documentId)) { - throw new InvalidOperationException(OperationRequest_DocumentOrIdMustBeSet); + throw new ArgumentException(OperationRequest_DocumentOrIdMustBeSet, nameof(document)); + } + + if (variableValues is not null && variableValues.RootElement.ValueKind is not JsonValueKind.Object) + { + throw new ArgumentException(OperationRequest_Variables_Must_Be_Object, nameof(variableValues)); + } + + if (extensions is not null && extensions.RootElement.ValueKind is not JsonValueKind.Object) + { + throw new ArgumentException(OperationRequest_Extensions_Must_Be_Object, nameof(extensions)); } Document = document; @@ -108,12 +119,12 @@ public OperationRequest( /// /// Gets the variable values for the GraphQL request. /// - public IReadOnlyDictionary? VariableValues { get; } + public JsonDocument? VariableValues { get; } /// /// Gets the GraphQL request extension data. /// - public IReadOnlyDictionary? Extensions { get; } + public JsonDocument? Extensions { get; } /// /// Gets the initial request state. @@ -259,7 +270,7 @@ public OperationRequest WithErrorHandlingMode(ErrorHandlingMode errorHandlingMod /// /// Returns a new request with the specified variable values. /// - public OperationRequest WithVariableValues(IReadOnlyDictionary variableValues) + public OperationRequest WithVariableValues(JsonDocument? variableValues) => new OperationRequest( Document, DocumentId, @@ -282,7 +293,7 @@ public OperationRequest WithVariableValues(IReadOnlyDictionary /// /// Returns a new request with the specified extensions. /// - public OperationRequest WithExtensions(IReadOnlyDictionary extensions) + public OperationRequest WithExtensions(JsonDocument? extensions) => new OperationRequest( Document, DocumentId, @@ -305,7 +316,7 @@ public OperationRequest WithExtensions(IReadOnlyDictionary exte /// /// Returns a new request with the specified context data. /// - public OperationRequest WithContextData(IReadOnlyDictionary contextData) + public OperationRequest WithContextData(IReadOnlyDictionary? contextData) => new OperationRequest( Document, DocumentId, @@ -328,7 +339,7 @@ public OperationRequest WithContextData(IReadOnlyDictionary con /// /// Returns a new request with the specified features. /// - public OperationRequest WithFeatures(IFeatureCollection features) + public OperationRequest WithFeatures(IFeatureCollection? features) => new OperationRequest( Document, DocumentId, @@ -351,7 +362,7 @@ public OperationRequest WithFeatures(IFeatureCollection features) /// /// Returns a new request with the specified services. /// - public OperationRequest WithServices(IServiceProvider services) + public OperationRequest WithServices(IServiceProvider? services) => new OperationRequest( Document, DocumentId, @@ -432,8 +443,8 @@ public static OperationRequest FromId( OperationDocumentHash? documentHash = null, string? operationName = null, ErrorHandlingMode? errorHandlingMode = null, - IReadOnlyDictionary? variableValues = null, - IReadOnlyDictionary? extensions = null, + JsonDocument? variableValues = null, + JsonDocument? extensions = null, IReadOnlyDictionary? contextData = null, IFeatureCollection? features = null, IServiceProvider? services = null, @@ -502,8 +513,8 @@ public static OperationRequest FromId( OperationDocumentHash? documentHash = null, string? operationName = null, ErrorHandlingMode? errorHandlingMode = null, - IReadOnlyDictionary? variableValues = null, - IReadOnlyDictionary? extensions = null, + JsonDocument? variableValues = null, + JsonDocument? extensions = null, IReadOnlyDictionary? contextData = null, IFeatureCollection? features = null, IServiceProvider? services = null, @@ -561,8 +572,8 @@ public static OperationRequest FromSourceText( OperationDocumentHash? documentHash = null, string? operationName = null, ErrorHandlingMode? errorHandlingMode = null, - IReadOnlyDictionary? variableValues = null, - IReadOnlyDictionary? extensions = null, + JsonDocument? variableValues = null, + JsonDocument? extensions = null, IReadOnlyDictionary? contextData = null, IFeatureCollection? features = null, IServiceProvider? services = null, diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs index d5c52443506..40324f67237 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs @@ -14,10 +14,9 @@ public sealed class OperationRequestBuilder : IFeatureProvider private OperationDocumentId? _documentId; private OperationDocumentHash? _documentHash; private string? _operationName; + private JsonDocument? _variableValues; + private JsonDocument? _extensions; private ErrorHandlingMode? _errorHandlingMode; - private IReadOnlyList>? _readOnlyVariableValues; - private List>? _variableValues; - private IReadOnlyDictionary? _readOnlyExtensions; private Dictionary? _contextData; private IReadOnlyDictionary? _readOnlyContextData; private IServiceProvider? _services; @@ -128,29 +127,6 @@ public OperationRequestBuilder SetErrorHandlingMode(ErrorHandlingMode? errorHand return this; } - /// - /// Sets the variable values for the GraphQL request. - /// - /// - /// The variable values for the GraphQL request. - /// - /// - /// Returns this instance of for configuration chaining. - /// - public OperationRequestBuilder AddVariableValues( - IReadOnlyDictionary variableValues) - { - if (_readOnlyVariableValues is not null) - { - _variableValues = _readOnlyVariableValues.ToList(); - _readOnlyVariableValues = null; - } - - _variableValues ??= []; - _variableValues!.Add(variableValues); - return this; - } - /// /// Sets the variable values for the GraphQL request. /// @@ -161,37 +137,12 @@ public OperationRequestBuilder AddVariableValues( /// Returns this instance of for configuration chaining. /// public OperationRequestBuilder SetVariableValues( - IReadOnlyDictionary? variableValues) - { - if (variableValues is null) - { - _variableValues = null; - _readOnlyVariableValues = null; - } - else - { - _variableValues = [variableValues]; - _readOnlyVariableValues = null; - } - return this; - } - - /// - /// Sets the variable values for the GraphQL request. - /// - /// - /// The variable values for the GraphQL request. - /// - /// - /// Returns this instance of for configuration chaining. - /// - public OperationRequestBuilder SetVariableValuesJson( [StringSyntax("json")] string variableValues) { ArgumentException.ThrowIfNullOrEmpty(variableValues); using var document = JsonDocument.Parse(variableValues); - return SetVariableValuesJson(document); + return SetVariableValues(document); } /// @@ -203,133 +154,33 @@ public OperationRequestBuilder SetVariableValuesJson( /// /// Returns this instance of for configuration chaining. /// - public OperationRequestBuilder SetVariableValuesJson( - JsonDocument variableValues) + public OperationRequestBuilder SetVariableValues( + JsonDocument? variableValues) { - ArgumentNullException.ThrowIfNull(variableValues); - - if (variableValues.RootElement.ValueKind is not (JsonValueKind.Null or JsonValueKind.Object)) - { - throw new ArgumentException( - "The JSON document must be either null or an array of variable sets.", - nameof(variableValues)); - } - - if (variableValues.RootElement.ValueKind is JsonValueKind.Null) + if (variableValues is null) { + _variableValues?.Dispose(); _variableValues = null; - _readOnlyVariableValues = null; return this; } - var parser = new JsonValueParser(); - var objectValue = (ObjectValueNode)parser.Parse(variableValues.RootElement); - var values = new Dictionary(); - - foreach (var field in objectValue.Fields) - { - values[field.Name.Value] = field.Value; - } - - _variableValues = [values]; - _readOnlyVariableValues = null; - return this; - } - - /// - /// Sets the variable values for the GraphQL request. - /// - /// - /// The variable values for the GraphQL request. - /// - /// - /// Returns this instance of for configuration chaining. - /// - public OperationRequestBuilder SetVariableValuesSet( - IReadOnlyList>? variableValues) - { - if (variableValues is null) - { - _variableValues = null; - _readOnlyVariableValues = null; - } - else + if (variableValues.RootElement.ValueKind is JsonValueKind.Null) { + variableValues.Dispose(); + _variableValues?.Dispose(); _variableValues = null; - _readOnlyVariableValues = variableValues; + return this; } - return this; - } - - /// - /// Sets the variable values for the GraphQL request. - /// - /// - /// The variable values for the GraphQL request. - /// - /// - /// Returns this instance of for configuration chaining. - /// - public OperationRequestBuilder SetVariableValuesSetJson([StringSyntax("json")] string variableValues) - { - ArgumentException.ThrowIfNullOrEmpty(variableValues); - - using var document = JsonDocument.Parse(variableValues); - return SetVariableValuesSetJson(document); - } - /// - /// Sets the variable values for the GraphQL request. - /// - /// - /// The variable values for the GraphQL request. - /// - /// - /// Returns this instance of for configuration chaining. - /// - public OperationRequestBuilder SetVariableValuesSetJson(JsonDocument variableValues) - { - ArgumentNullException.ThrowIfNull(variableValues); - - if (variableValues.RootElement.ValueKind is not (JsonValueKind.Null or JsonValueKind.Array)) + if (variableValues.RootElement.ValueKind is not (JsonValueKind.Object or JsonValueKind.Array)) { throw new ArgumentException( "The JSON document must be either null or an array of variable sets.", nameof(variableValues)); } - if (variableValues.RootElement.ValueKind is JsonValueKind.Null) - { - _variableValues = null; - _readOnlyVariableValues = null; - return this; - } - - var parser = new JsonValueParser(); - var sets = new List>(); - - foreach (var element in variableValues.RootElement.EnumerateArray()) - { - if (element.ValueKind != JsonValueKind.Object) - { - throw new ArgumentException( - "Each variable set must be a JSON object.", - nameof(variableValues)); - } - - var objectValue = (ObjectValueNode)parser.Parse(element); - var values = new Dictionary(); - - foreach (var field in objectValue.Fields) - { - values[field.Name.Value] = field.Value; - } - - sets.Add(values); - } - - _variableValues = sets; - _readOnlyVariableValues = null; + _variableValues?.Dispose(); + _variableValues = variableValues; return this; } @@ -545,7 +396,6 @@ public IOperationRequest Build() { IOperationRequest? request; - var variableSet = GetVariableValues(); var features = _features; if (features is null || features.IsEmpty) @@ -553,7 +403,7 @@ public IOperationRequest Build() features = FeatureCollection.Empty; } - if (variableSet is { Count: > 1 }) + if (_variableValues?.RootElement.ValueKind is JsonValueKind.Array) { request = new VariableBatchRequest( document: _document, @@ -561,8 +411,8 @@ public IOperationRequest Build() documentHash: _documentHash, operationName: _operationName, errorHandlingMode: _errorHandlingMode, - variableValues: variableSet, - extensions: _readOnlyExtensions, + variableValues: _variableValues, + extensions: _extensions, contextData: _readOnlyContextData ?? _contextData, features: features, services: _services, @@ -577,10 +427,8 @@ public IOperationRequest Build() documentHash: _documentHash, operationName: _operationName, errorHandlingMode: _errorHandlingMode, - variableValues: variableSet is { Count: 1 } - ? variableSet[0] - : null, - extensions: _readOnlyExtensions, + variableValues: _variableValues, + extensions: _variableValues, contextData: _readOnlyContextData ?? _contextData, features: features, services: _services, @@ -590,9 +438,6 @@ public IOperationRequest Build() return request; } - private IReadOnlyList>? GetVariableValues() - => _variableValues ?? _readOnlyVariableValues; - /// /// Creates a new instance of . /// @@ -620,9 +465,9 @@ VariableBatchRequest batch _documentHash = batch.DocumentHash, _operationName = batch.OperationName, _errorHandlingMode = batch.ErrorHandlingMode, - _readOnlyVariableValues = batch.VariableValues, + _variableValues = batch.VariableValues, _readOnlyContextData = batch.ContextData, - _readOnlyExtensions = batch.Extensions, + _extensions = batch.Extensions, _services = batch.Services, _flags = batch.Flags }, @@ -634,11 +479,9 @@ OperationRequest operation _documentHash = operation.DocumentHash, _operationName = operation.OperationName, _errorHandlingMode = operation.ErrorHandlingMode, - _readOnlyVariableValues = operation.VariableValues is not null - ? new List>(1) { operation.VariableValues } - : null, + _variableValues = operation.VariableValues, _readOnlyContextData = operation.ContextData, - _readOnlyExtensions = operation.Extensions, + _extensions = operation.Extensions, _services = operation.Services, _flags = operation.Flags }, diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs index 9dcc4d1694a..4558abd2a2d 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Features; using HotChocolate.Language; using static HotChocolate.ExecutionAbstractionsResources; @@ -54,8 +55,8 @@ public VariableBatchRequest( OperationDocumentHash? documentHash, string? operationName, ErrorHandlingMode? errorHandlingMode, - IReadOnlyList>? variableValues, - IReadOnlyDictionary? extensions, + JsonDocument? variableValues, + JsonDocument? extensions, IReadOnlyDictionary? contextData, IFeatureCollection? features, IServiceProvider? services, @@ -66,6 +67,16 @@ public VariableBatchRequest( throw new InvalidOperationException(OperationRequest_DocumentOrIdMustBeSet); } + if (variableValues is not null && variableValues.RootElement.ValueKind is not JsonValueKind.Array) + { + throw new ArgumentException(VariableBatchRequest_Variables_Must_Be_Array, nameof(variableValues)); + } + + if (extensions is not null && extensions.RootElement.ValueKind is not JsonValueKind.Object) + { + throw new ArgumentException(OperationRequest_Extensions_Must_Be_Object, nameof(extensions)); + } + Document = document; DocumentId = documentId ?? OperationDocumentId.Empty; DocumentHash = documentHash ?? OperationDocumentHash.Empty; @@ -108,12 +119,12 @@ public VariableBatchRequest( /// /// Gets a list of variable values for the GraphQL request. /// - public IReadOnlyList>? VariableValues { get; } + public JsonDocument? VariableValues { get; } /// /// Gets the GraphQL request extension data. /// - public IReadOnlyDictionary? Extensions { get; } + public JsonDocument? Extensions { get; } /// /// Gets the initial request state. @@ -144,7 +155,7 @@ public VariableBatchRequest( /// /// Returns a new request with the specified services. /// - public VariableBatchRequest WithServices(IServiceProvider services) + public VariableBatchRequest WithServices(IServiceProvider? services) => new( Document, DocumentId, @@ -167,7 +178,7 @@ public VariableBatchRequest WithServices(IServiceProvider services) /// /// Returns a new request with the specified features. /// - public VariableBatchRequest WithFeatures(IFeatureCollection features) + public VariableBatchRequest WithFeatures(IFeatureCollection? features) => new( Document, DocumentId, diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.Designer.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.Designer.cs index f1d745238df..a71c66948f0 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.Designer.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.Designer.cs @@ -104,5 +104,23 @@ internal static string SubscriptionResult_ReadOnlyOnce { return ResourceManager.GetString("SubscriptionResult_ReadOnlyOnce", resourceCulture); } } + + internal static string OperationRequest_Variables_Must_Be_Object { + get { + return ResourceManager.GetString("OperationRequest_Variables_Must_Be_Object", resourceCulture); + } + } + + internal static string OperationRequest_Extensions_Must_Be_Object { + get { + return ResourceManager.GetString("OperationRequest_Extensions_Must_Be_Object", resourceCulture); + } + } + + internal static string VariableBatchRequest_Variables_Must_Be_Array { + get { + return ResourceManager.GetString("VariableBatchRequest_Variables_Must_Be_Array", resourceCulture); + } + } } } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.resx b/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.resx index 8f4e037fc2d..ad1835cdf0e 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.resx +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.resx @@ -48,4 +48,13 @@ You can only read a response stream once. + + Variables must be a JSON Object. + + + Extensions must be a JSON Object. + + + VariableValues must be a JSON array or objects. + diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs index eaa7d29fffe..cd5a5a66ac6 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs @@ -80,9 +80,9 @@ public OperationResult BuildResult() if (resultBuilder.Path is not null || resultBuilder.HasNext.HasValue - || resultBuilder.Pending is not null - || resultBuilder.Incremental is not null - || resultBuilder.Completed is not null) + || !resultBuilder.Pending.IsEmpty + || !resultBuilder.Incremental.IsEmpty + || !resultBuilder.Completed.IsEmpty) { result.Features.Set( new IncrementalDataFeature diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs index bca4b16fd16..bfc7360fc7f 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs @@ -33,7 +33,8 @@ public static string CreateCacheId(this RequestContext context) return $"{context.Schema.Name}-{context.ExecutorVersion}-{operationId}"; } - public static void CoerceVariables(RequestContext context, + public static void CoerceVariables( + RequestContext context, VariableCoercionHelper coercionHelper, IReadOnlyList variableDefinitions, IExecutionDiagnosticEvents diagnosticEvents) @@ -53,7 +54,7 @@ public static void CoerceVariables(RequestContext context, { using (diagnosticEvents.CoerceVariables(context)) { - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); coercionHelper.CoerceVariableValues( context.Schema, @@ -77,7 +78,7 @@ public static void CoerceVariables(RequestContext context, for (var i = 0; i < variableSetCount; i++) { - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); coercionHelper.CoerceVariableValues( schema, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs index e7947df5636..eb5878cf05e 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; using HotChocolate.Types; @@ -5,45 +6,49 @@ namespace HotChocolate.Execution.Processing; internal sealed class VariableCoercionHelper { - private readonly InputFormatter _inputFormatter; private readonly InputParser _inputParser; + private readonly InputFormatter _inputFormatter; - public VariableCoercionHelper(InputFormatter inputFormatter, InputParser inputParser) + public VariableCoercionHelper(InputParser inputParser, InputFormatter inputFormatter) { - ArgumentNullException.ThrowIfNull(inputFormatter); ArgumentNullException.ThrowIfNull(inputParser); + ArgumentNullException.ThrowIfNull(inputFormatter); - _inputFormatter = inputFormatter; _inputParser = inputParser; + _inputFormatter = inputFormatter; } public void CoerceVariableValues( ISchemaDefinition schema, IReadOnlyList variableDefinitions, - IReadOnlyDictionary values, - IDictionary coercedValues) + JsonElement variableValues, + Dictionary coercedValues) { ArgumentNullException.ThrowIfNull(schema); ArgumentNullException.ThrowIfNull(variableDefinitions); - ArgumentNullException.ThrowIfNull(values); ArgumentNullException.ThrowIfNull(coercedValues); + if (variableValues.ValueKind is JsonValueKind.Object) + { + throw new ArgumentException("variables must be a JSON Object", nameof(variableValues)); + } + for (var i = 0; i < variableDefinitions.Count; i++) { var variableDefinition = variableDefinitions[i]; var variableName = variableDefinition.Variable.Name.Value; var variableType = AssertInputType(schema, variableDefinition); - VariableValueOrLiteral coercedVariable; - var hasValue = values.TryGetValue(variableName, out var value); + var hasValue = variableValues.TryGetProperty(variableName, out var propertyValue); - if (!hasValue && variableDefinition.DefaultValue is { } defaultValue) + if (!hasValue && variableDefinition.DefaultValue is { Kind: not SyntaxKind.NullValue } defaultValue) { - value = defaultValue.Kind is SyntaxKind.NullValue ? null : defaultValue; - hasValue = true; + var runtimeValue = _inputParser.ParseLiteral(defaultValue, variableType); + coercedValues[variableName] = new VariableValue(variableName, variableType, runtimeValue, defaultValue); + continue; } - if (!hasValue || value is null || value is NullValueNode) + if (!hasValue) { if (variableType.IsNonNullType()) { @@ -57,49 +62,43 @@ public void CoerceVariableValues( continue; } - coercedVariable = new(variableType, null, NullValueNode.Default); + coercedValues[variableName] = + new VariableValue( + variableName, + variableType, + null, + NullValueNode.Default); } else { - coercedVariable = CoerceVariableValue(variableDefinition, variableType, value); + coercedValues[variableName] = CoerceVariableValue(variableDefinition, variableType, propertyValue); } - - coercedValues[variableName] = coercedVariable; } } - private VariableValueOrLiteral CoerceVariableValue( + private VariableValue CoerceVariableValue( VariableDefinitionNode variableDefinition, IInputType variableType, - object value) + JsonElement inputValue) { var root = Path.Root.Append(variableDefinition.Variable.Name.Value); - if (value is IValueNode valueLiteral) + try { - try - { - // we are ensuring here that enum values are correctly specified. - valueLiteral = Rewrite(variableType, valueLiteral); - - return new VariableValueOrLiteral( - variableType, - _inputParser.ParseLiteral(valueLiteral, variableType, root), - valueLiteral); - } - catch (GraphQLException) - { - throw; - } - catch (Exception ex) - { - throw ThrowHelper.VariableValueInvalidType(variableDefinition, ex); - } + return new VariableValue( + variableDefinition.Variable.Name.Value, + variableType, + _inputParser.ParseInputValue(inputValue, variableType, root), + _inputFormatter.FormatValue(inputValue, variableType, root)); + } + catch (GraphQLException) + { + throw; + } + catch (Exception ex) + { + throw ThrowHelper.VariableValueInvalidType(variableDefinition, ex); } - - var runtimeValue = _inputParser.ParseInputValue(value, variableType, root); - var literal = _inputFormatter.FormatResult(value, variableType, root); - return new VariableValueOrLiteral(variableType, runtimeValue, literal); } private static IInputType AssertInputType( @@ -113,128 +112,4 @@ private static IInputType AssertInputType( throw ThrowHelper.VariableIsNotAnInputType(variableDefinition); } - - private static IValueNode Rewrite( - IType inputType, - IValueNode node) - { - switch (node) - { - case ObjectValueNode ov: - return Rewrite(inputType, ov); - - case ListValueNode lv: - return Rewrite(inputType, lv); - - case StringValueNode sv when inputType.IsEnumType(): - return new EnumValueNode(sv.Location, sv.Value); - - default: - return node; - } - } - - private static ObjectValueNode Rewrite( - IType inputType, - ObjectValueNode node) - { - if (inputType.NamedType() is not InputObjectType inputObjectType) - { - // if the node type is not an input object, we will just return the node - // as if and the deserialization will produce a proper error. - return node; - } - - List? fields = null; - - for (var i = 0; i < node.Fields.Count; i++) - { - var current = node.Fields[i]; - - if (!inputObjectType.Fields.TryGetField(current.Name.Value, out var field)) - { - // if we do not find a field on the type we also skip this error and let - // the deserialization produce a proper error on this. - fields?.Add(current); - continue; - } - - var rewritten = Rewrite(field.Type, current.Value); - - // we try initially just to traverse the input graph, only if we detect a change - // will we create a new input object. In this case if the fields list is initialized - // we know that we have already collected at least one change. In this case - // all further field nodes have to be added as well even if they do not have - // a changed value since we need to produce a complete new input object value node. - if (fields is not null) - { - fields.Add(current.WithValue(rewritten)); - } - - // if we did not so far detect any rewritten field value we will compare if the - // field value node changed. Since, all syntax nodes are immutable we can just - // check if the reference is not the same. - else if (!ReferenceEquals(current.Value, rewritten)) - { - // if we detect a reference change we will create the fields list - // that contains all previous field values plus the changed field value. - fields = []; - - for (var j = 0; j < i; j++) - { - fields.Add(node.Fields[j]); - } - - fields.Add(current.WithValue(rewritten)); - } - } - - return fields is not null ? node.WithFields(fields) : node; - } - - private static ListValueNode Rewrite(IType inputType, ListValueNode node) - { - if (!inputType.IsListType()) - { - return node; - } - - var elementType = inputType.ListType().ElementType; - List? values = null; - - for (var i = 0; i < node.Items.Count; i++) - { - var current = node.Items[i]; - var value = Rewrite(elementType, current); - - // we try initially just to traverse the list graph, only if we detect a change - // will we create a new list object. In this case if values list is initialized - // we know that we have already collected at least one change. In this case - // all further value nodes have to be added as well even if they do not have - // a changed value since we need to produce a complete new list value node. - if (values is not null) - { - values.Add(value); - } - - // if we did not so far detect any rewritten value we will compare if the - // value node changed. Since, all syntax nodes are immutable we can just - // check if the reference is not the same. - else if (!ReferenceEquals(current, value)) - { - // if we detect a reference change we will create the values list - // that contains all previous list values plus the changed list value. - values = []; - - for (var j = 0; j < i; j++) - { - values.Add(node.Items[j]); - } - - values.Add(value); - } - } - - return values is not null ? node.WithItems(values) : node; - } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableRewriter.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableRewriter.cs index 269da9af9a2..29972854d61 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableRewriter.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableRewriter.cs @@ -273,8 +273,6 @@ private static bool TryRewriteValue( private static IValueNode Rewrite( VariableNode node, IValueNode defaultValue, - IVariableValueCollection variableValues) => - variableValues.TryGetValue(node.Name.Value, out IValueNode? value) - ? value ?? NullValueNode.Default - : defaultValue; + IVariableValueCollection variableValues) + => variableValues.TryGetValue(node.Name.Value, out IValueNode? value) ? value : defaultValue; } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValue.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValue.cs new file mode 100644 index 00000000000..91ec032ddfe --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValue.cs @@ -0,0 +1,27 @@ +using HotChocolate.Language; +using HotChocolate.Types; + +namespace HotChocolate.Execution.Processing; + +internal readonly struct VariableValue +{ + public VariableValue(string name, IInputType type, object? runtimeValue, IValueNode valueLiteral) + { + ArgumentException.ThrowIfNullOrEmpty(name); + ArgumentNullException.ThrowIfNull(type); + ArgumentNullException.ThrowIfNull(valueLiteral); + + Name = name; + Type = type ?? throw new ArgumentNullException(nameof(type)); + RuntimeValue = runtimeValue; + ValueLiteral = valueLiteral; + } + + public string Name { get; } + + public IInputType Type { get; } + + public object? RuntimeValue { get; } + + public IValueNode ValueLiteral { get; } +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueCollection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueCollection.cs index d1d2205ab6e..aece5e12c91 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueCollection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueCollection.cs @@ -5,7 +5,7 @@ namespace HotChocolate.Execution.Processing; internal sealed class VariableValueCollection( - Dictionary coercedValues) + Dictionary coercedValues) : IVariableValueCollection { public static VariableValueCollection Empty { get; } = new([]); @@ -40,13 +40,11 @@ public bool TryGetValue(string name, [NotNullWhen(true)] out T? value) where return false; } - public IEnumerator GetEnumerator() + public IEnumerator GetEnumerator() { - foreach (var item in coercedValues) + foreach (var (_, value) in coercedValues) { - var type = item.Value.Type; - var value = item.Value.ValueLiteral; - yield return new VariableValue(item.Key, type, value); + yield return new Execution.VariableValue(value.Name, value.Type, value.ValueLiteral); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueOrLiteral.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueOrLiteral.cs deleted file mode 100644 index 61844bacb3e..00000000000 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableValueOrLiteral.cs +++ /dev/null @@ -1,26 +0,0 @@ -using HotChocolate.Language; -using HotChocolate.Types; -using static HotChocolate.Properties.Resources; - -namespace HotChocolate.Execution.Processing; - -internal readonly struct VariableValueOrLiteral -{ - public VariableValueOrLiteral(IInputType type, object? value, IValueNode valueLiteral) - { - if (value is null && valueLiteral.Kind != SyntaxKind.NullValue) - { - throw new ArgumentException(VariableValueOrLiteral_NullNotAllowed); - } - - Type = type ?? throw new ArgumentNullException(nameof(type)); - Value = value; - ValueLiteral = valueLiteral; - } - - public IInputType Type { get; } - - public object? Value { get; } - - public IValueNode ValueLiteral { get; } -} diff --git a/src/HotChocolate/Core/src/Types/Types/InputParser.cs b/src/HotChocolate/Core/src/Types/Types/InputParser.cs index 4890b929528..9a8f634d48a 100644 --- a/src/HotChocolate/Core/src/Types/Types/InputParser.cs +++ b/src/HotChocolate/Core/src/Types/Types/InputParser.cs @@ -523,7 +523,7 @@ private object DeserializeObject(JsonElement inputValue, InputObjectType type, P var value = Deserialize(property.Value, field.Type, fieldPath, field); value = FormatAndConvertValue(field, path, null, value, field.IsOptional, true); - fieldValues[i] = value; + fieldValues[field.Index] = value; consumed++; } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs index 48c9468aff3..bcaac0a44bc 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs @@ -150,7 +150,7 @@ public override void CoerceOutputValue(object runtimeValue, ResultElement result TryCoerceOutputValue(runtimeValue, resultValue, ref processed); } - private static bool TryCoerceOutputValue(object runtimeValue, ResultElement resultValue, ref HashSet? set) + private static bool TryCoerceOutputValue(object? runtimeValue, ResultElement resultValue, ref HashSet? set) { if (runtimeValue is null) { @@ -229,7 +229,7 @@ private static bool TryCoerceOutputValue(object runtimeValue, ResultElement resu foreach (var element in resultValue.EnumerateArray()) { enumerator.MoveNext(); - if (!TryCoerceOutputValue(enumerator.Current!, element, ref set)) + if (!TryCoerceOutputValue(enumerator.Current, element, ref set)) { element.Invalidate(); } @@ -260,7 +260,7 @@ private static bool TryCoerceOutputValue(object runtimeValue, ResultElement resu { enumerator.MoveNext(); property.Value.SetPropertyName(enumerator.Current.Key); - if (!TryCoerceOutputValue(enumerator.Current.Value!, property.Value, ref set)) + if (!TryCoerceOutputValue(enumerator.Current.Value, property.Value, ref set)) { property.Value.Invalidate(); } @@ -280,12 +280,11 @@ private static bool TryCoerceOutputValue(object runtimeValue, ResultElement resu public override IValueNode ValueToLiteral(object runtimeValue) { - return runtimeValue is null - ? NullValueNode.Default - : ValueToLiteral(runtimeValue, null, this); + HashSet? processed = null; + return ValueToLiteral(runtimeValue, ref processed, this); } - private static IValueNode ValueToLiteral(object? value, HashSet? set, AnyType type) + private static IValueNode ValueToLiteral(object? value, ref HashSet? set, AnyType type) { if (value is null) { @@ -341,7 +340,7 @@ private static IValueNode ValueToLiteral(object? value, HashSet? set, An var items = new List(list.Count); foreach (var item in list) { - items.Add(ValueToLiteral(item, set, type)); + items.Add(ValueToLiteral(item, ref set, type)); } return new ListValueNode(items); @@ -349,7 +348,7 @@ private static IValueNode ValueToLiteral(object? value, HashSet? set, An var fields = new List(obj.Count); foreach (var kvp in obj) { - fields.Add(new ObjectFieldNode(kvp.Key, ValueToLiteral(kvp.Value, set, type))); + fields.Add(new ObjectFieldNode(kvp.Key, ValueToLiteral(kvp.Value, ref set, type))); } return new ObjectValueNode(fields); @@ -359,7 +358,7 @@ private static IValueNode ValueToLiteral(object? value, HashSet? set, An } finally { - set.Remove(value); + set?.Remove(value); } } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs index 994171233da..66cca51174b 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs @@ -4,8 +4,8 @@ using System.Text.Json; using HotChocolate.Buffers; using HotChocolate.Language; -using HotChocolate.Properties; using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -81,9 +81,7 @@ public override object CoerceInputValue(JsonElement inputValue) } } - throw new LeafCoercionException( - TypeResourceHelper.Scalar_Cannot_CoerceInputValue(this, inputValue), - this); + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } public override void CoerceOutputValue(byte[] runtimeValue, ResultElement resultValue) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs index 0be13693c8b..01c50b9c642 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs @@ -156,5 +156,5 @@ protected virtual LeafCoercionException CreateCoerceInputValueError(JsonElement /// Returns the exception to throw. /// protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode literal) - => new(TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(this, literal), this); + => Scalar_Cannot_CoerceInputLiteral(this, literal); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs index a533825d0cb..f47520fcbf7 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs @@ -1,6 +1,5 @@ using System.Text.Json; using HotChocolate.Language; -using HotChocolate.Properties; using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -147,5 +146,5 @@ protected virtual LeafCoercionException CreateCoerceInputValueError(JsonElement /// Returns the exception to throw. /// protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode literal) - => new(TypeResourceHelper.Scalar_Cannot_CoerceInputLiteral(this, literal), this); + => Scalar_Cannot_CoerceInputLiteral(this, literal); } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs index 74b03670d25..3fe81c22274 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs @@ -95,7 +95,7 @@ public void BuildRequest_QueryAndSetNewVariableJson_RequestIsCreated() foo } """) - .SetVariableValuesJson( + .SetVariableValues( """ { "one": "bar" diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs index 06cf0cf459d..6855ed838e7 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs @@ -24,7 +24,7 @@ public void VariableCoercionHelper_Schema_Is_Null() }; var variableValues = new Dictionary(); - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); @@ -42,7 +42,7 @@ public void VariableCoercionHelper_VariableDefinitions_Is_Null() // arrange var schema = SchemaBuilder.New().AddStarWarsTypes().Create(); var variableValues = new Dictionary(); - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -70,7 +70,7 @@ public void VariableCoercionHelper_VariableValues_Is_Null() Array.Empty()) }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -128,7 +128,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Value_Is_Not_Prov }; var variableValues = new Dictionary(); - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); @@ -141,7 +141,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Value_Is_Not_Prov { Assert.Equal("abc", t.Key); Assert.Equal("String", Assert.IsType(t.Value.Type).Name); - Assert.Equal("def", t.Value.Value); + Assert.Equal("def", t.Value.RuntimeValue); Assert.Equal("def", Assert.IsType(t.Value.ValueLiteral).Value); }); } @@ -164,7 +164,7 @@ public void Coerce_Nullable_String_Variable_Where_Value_Is_Not_Provided() }; var variableValues = new Dictionary(); - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); @@ -197,7 +197,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Value_Is_Provided {"abc", new StringValueNode("xyz")} }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); @@ -210,7 +210,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Value_Is_Provided { Assert.Equal("abc", t.Key); Assert.Equal("String", Assert.IsType(t.Value.Type).Name); - Assert.Equal("xyz", t.Value.Value); + Assert.Equal("xyz", t.Value.RuntimeValue); Assert.Equal("xyz", Assert.IsType(t.Value.ValueLiteral).Value); }); } @@ -237,7 +237,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Plain_Value_Is_Pr {"abc", "xyz"} }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); @@ -250,7 +250,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Plain_Value_Is_Pr { Assert.Equal("abc", t.Key); Assert.Equal("String", Assert.IsType(t.Value.Type).Name); - Assert.Equal("xyz", t.Value.Value); + Assert.Equal("xyz", t.Value.RuntimeValue); t.Value.ValueLiteral.ToString().MatchSnapshot(); }); } @@ -277,7 +277,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Null_Is_Provided( {"abc", NullValueNode.Default} }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -289,7 +289,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Null_Is_Provided( { Assert.Equal("abc", t.Key); Assert.Equal("String", Assert.IsType(t.Value.Type).Name); - Assert.Null(t.Value.Value); + Assert.Null(t.Value.RuntimeValue); Assert.IsType(t.Value.ValueLiteral); }); } @@ -316,7 +316,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Plain_Null_Is_Pro {"abc", null} }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -328,7 +328,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Plain_Null_Is_Pro { Assert.Equal("abc", t.Key); Assert.Equal("String", Assert.IsType(t.Value.Type).Name); - Assert.Null(t.Value.Value); + Assert.Null(t.Value.RuntimeValue); Assert.IsType(t.Value.ValueLiteral); }); } @@ -355,7 +355,7 @@ public void Coerce_Nullable_ReviewInput_Variable_With_Object_Literal() {"abc", new ObjectValueNode(new ObjectFieldNode("stars", 5))} }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -367,7 +367,7 @@ public void Coerce_Nullable_ReviewInput_Variable_With_Object_Literal() { Assert.Equal("abc", t.Key); Assert.Equal("ReviewInput", Assert.IsType(t.Value.Type).Name); - Assert.Equal(5, Assert.IsType(t.Value.Value).Stars); + Assert.Equal(5, Assert.IsType(t.Value.RuntimeValue).Stars); Assert.IsType(t.Value.ValueLiteral); }); } @@ -394,7 +394,7 @@ public void Coerce_Nullable_ReviewInput_Variable_With_Dictionary() {"abc", new Dictionary { {"stars", 5} }} }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -406,7 +406,7 @@ public void Coerce_Nullable_ReviewInput_Variable_With_Dictionary() { Assert.Equal("abc", t.Key); Assert.Equal("ReviewInput", Assert.IsType(t.Value.Type).Name); - Assert.Equal(5, Assert.IsType(t.Value.Value).Stars); + Assert.Equal(5, Assert.IsType(t.Value.RuntimeValue).Stars); t.Value.ValueLiteral.ToString().MatchSnapshot(); }); } @@ -433,7 +433,7 @@ public void Coerce_Nullable_ReviewInput_Variable_With_Review_Object() { "abc", new Review(stars: 5) } }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -445,7 +445,7 @@ public void Coerce_Nullable_ReviewInput_Variable_With_Review_Object() { Assert.Equal("abc", t.Key); Assert.Equal("ReviewInput", Assert.IsType(t.Value.Type).Name); - Assert.Equal(5, Assert.IsType(t.Value.Value).Stars); + Assert.Equal(5, Assert.IsType(t.Value.RuntimeValue).Stars); t.Value.ValueLiteral.ToString().MatchSnapshot(); }); } @@ -472,7 +472,7 @@ public void Error_When_Value_Is_Null_On_Non_Null_Variable() {"abc", NullValueNode.Default} }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -505,7 +505,7 @@ public void Error_When_PlainValue_Is_Null_On_Non_Null_Variable() {"abc", null} }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -538,7 +538,7 @@ public void Error_When_Value_Type_Does_Not_Match_Variable_Type() {"abc", new IntValueNode(1)} }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -573,7 +573,7 @@ public void Error_When_PlainValue_Type_Does_Not_Match_Variable_Type() { "abc", 1 } }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -605,7 +605,7 @@ public void Variable_Type_Is_Not_An_Input_Type() { "abc", 1 } }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -637,7 +637,7 @@ public void Error_When_Input_Field_Has_Different_Properties_Than_Defined() { "abc", new ObjectValueNode(new ObjectFieldNode("abc", "def")) } }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -695,7 +695,7 @@ enum TestEnum { } }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -757,7 +757,7 @@ enum TestEnum { } }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -818,7 +818,7 @@ enum TestEnum { } }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -877,7 +877,7 @@ enum TestEnum { } }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -939,7 +939,7 @@ enum TestEnum { } }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -1005,7 +1005,7 @@ enum TestEnum { } }; - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act @@ -1044,7 +1044,7 @@ public void Variable_Is_Nullable_And_Not_Set() }; var variableValues = new Dictionary(); - var coercedValues = new Dictionary(); + var coercedValues = new Dictionary(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); diff --git a/src/HotChocolate/Language/src/Language.Web/GraphQLRequest.cs b/src/HotChocolate/Language/src/Language.Web/GraphQLRequest.cs index 6f8dd6dd909..83482fed59e 100644 --- a/src/HotChocolate/Language/src/Language.Web/GraphQLRequest.cs +++ b/src/HotChocolate/Language/src/Language.Web/GraphQLRequest.cs @@ -1,3 +1,5 @@ +using System.Text.Json; + namespace HotChocolate.Language; /// @@ -39,8 +41,8 @@ public GraphQLRequest( OperationDocumentHash? documentHash = null, string? operationName = null, ErrorHandlingMode? errorHandlingMode = null, - IReadOnlyList>? variables = null, - IReadOnlyDictionary? extensions = null) + JsonDocument? variables = null, + JsonDocument? extensions = null) { if (document is null && documentId?.IsEmpty is not false) { @@ -87,10 +89,10 @@ public GraphQLRequest( /// Gets a list of variables for the operation. /// For a standard GraphQL request this list will contain a single variable set or be null. /// - public IReadOnlyList>? Variables { get; } + public JsonDocument? Variables { get; } /// /// Gets the GraphQL request extensions map. /// - public IReadOnlyDictionary? Extensions { get; } + public JsonDocument? Extensions { get; } } diff --git a/src/HotChocolate/Language/src/Language.Web/GraphQLSocketMessage.cs b/src/HotChocolate/Language/src/Language.Web/GraphQLSocketMessage.cs index 901403ee077..a3222a02ecf 100644 --- a/src/HotChocolate/Language/src/Language.Web/GraphQLSocketMessage.cs +++ b/src/HotChocolate/Language/src/Language.Web/GraphQLSocketMessage.cs @@ -2,16 +2,16 @@ namespace HotChocolate.Language; public readonly ref struct GraphQLSocketMessage { - public GraphQLSocketMessage(string type, string? id, ReadOnlySpan payload) + public GraphQLSocketMessage(string? type, string? id, ReadOnlySpan payload) { - Type = type ?? throw new ArgumentNullException(nameof(type)); + Type = type; Id = id; Payload = payload; } public string? Id { get; } - public string Type { get; } + public string? Type { get; } public ReadOnlySpan Payload { get; } } diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Constants.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Constants.cs deleted file mode 100644 index 9849166fff6..00000000000 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Constants.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace HotChocolate.Language; - -public ref partial struct Utf8GraphQLRequestParser -{ - private const byte D = (byte)'d'; - private const byte O = (byte)'o'; - private const byte Q = (byte)'q'; - private const byte V = (byte)'v'; - private const byte E = (byte)'e'; - private const byte T = (byte)'t'; - private const byte I = (byte)'i'; - private const byte P = (byte)'p'; - - private static ReadOnlySpan OperationNameProperty => "operationName"u8; - - private static ReadOnlySpan QueryProperty => "query"u8; - - private static ReadOnlySpan VariablesProperty => "variables"u8; - - private static ReadOnlySpan ExtensionsProperty => "extensions"u8; - - private static ReadOnlySpan TypeProperty => "type"u8; - - private static ReadOnlySpan IdProperty => "id"u8; - - private static ReadOnlySpan DocumentIdProperty => "documentId"u8; - - private static ReadOnlySpan PayloadProperty => "payload"u8; - - private static ReadOnlySpan OnErrorProperty => "onError"u8; -} diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Json.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Json.cs deleted file mode 100644 index 6107833a80a..00000000000 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Json.cs +++ /dev/null @@ -1,226 +0,0 @@ -using System.Buffers; -using static HotChocolate.Language.Properties.LangWebResources; - -namespace HotChocolate.Language; - -public ref partial struct Utf8GraphQLRequestParser -{ - public static unsafe object? ParseJson( - string sourceText, - ParserOptions? options = null) - { - if (string.IsNullOrEmpty(sourceText)) - { - throw new ArgumentException( - SourceText_Empty, - nameof(sourceText)); - } - - options ??= ParserOptions.Default; - - var length = checked(sourceText.Length * 4); - byte[]? source = null; - - var sourceSpan = length <= GraphQLConstants.StackallocThreshold - ? stackalloc byte[length] - : source = ArrayPool.Shared.Rent(length); - - try - { - Utf8GraphQLParser.ConvertToBytes(sourceText, ref sourceSpan); - return ParseJson(sourceSpan, options); - } - finally - { - if (source != null) - { - sourceSpan.Clear(); - ArrayPool.Shared.Return(source); - } - } - } - - public static object? ParseJson( - ReadOnlySpan sourceText, - ParserOptions? options = null) - { - options ??= ParserOptions.Default; - return new Utf8GraphQLRequestParser(sourceText, options).ParseJson(); - } - - public static unsafe IReadOnlyDictionary? ParseJsonObject( - string sourceText, - ParserOptions? options = null) - { - if (string.IsNullOrEmpty(sourceText)) - { - throw new ArgumentException(SourceText_Empty, nameof(sourceText)); - } - - options ??= ParserOptions.Default; - - var length = checked(sourceText.Length * 4); - byte[]? source = null; - - var sourceSpan = length <= GraphQLConstants.StackallocThreshold - ? stackalloc byte[length] - : source = ArrayPool.Shared.Rent(length); - - try - { - Utf8GraphQLParser.ConvertToBytes(sourceText, ref sourceSpan); - return ParseJsonObject(sourceSpan, options); - } - finally - { - if (source != null) - { - sourceSpan.Clear(); - ArrayPool.Shared.Return(source); - } - } - } - - public static IReadOnlyDictionary? ParseJsonObject( - ReadOnlySpan sourceText, - ParserOptions? options = null) - { - options ??= ParserOptions.Default; - - var parser = new Utf8GraphQLRequestParser(sourceText, options); - parser._reader.Expect(TokenKind.StartOfFile); - return parser.ParseObjectOrNull(); - } - - public static unsafe IReadOnlyList>? ParseVariables( - string sourceText, - ParserOptions? options = null) - { - if (string.IsNullOrEmpty(sourceText)) - { - throw new ArgumentException(SourceText_Empty, nameof(sourceText)); - } - - options ??= ParserOptions.Default; - - var length = checked(sourceText.Length * 4); - byte[]? source = null; - - var sourceSpan = length <= GraphQLConstants.StackallocThreshold - ? stackalloc byte[length] - : source = ArrayPool.Shared.Rent(length); - - try - { - Utf8GraphQLParser.ConvertToBytes(sourceText, ref sourceSpan); - return ParseVariables(sourceSpan, options); - } - finally - { - if (source != null) - { - sourceSpan.Clear(); - ArrayPool.Shared.Return(source); - } - } - } - - public static IReadOnlyList>? ParseVariables( - ReadOnlySpan sourceText, - ParserOptions? options = null) - { - options ??= ParserOptions.Default; - - var parser = new Utf8GraphQLRequestParser(sourceText, options); - parser._reader.Expect(TokenKind.StartOfFile); - return parser.ParseVariables(); - } - - public static unsafe IReadOnlyDictionary? ParseResponse( - string sourceText, - ParserOptions? options = null) - { - if (string.IsNullOrEmpty(sourceText)) - { - throw new ArgumentException(SourceText_Empty, nameof(sourceText)); - } - - options ??= ParserOptions.Default; - - var length = checked(sourceText.Length * 4); - byte[]? source = null; - - var sourceSpan = length <= GraphQLConstants.StackallocThreshold - ? stackalloc byte[length] - : source = ArrayPool.Shared.Rent(length); - - try - { - Utf8GraphQLParser.ConvertToBytes(sourceText, ref sourceSpan); - return ParseResponse(sourceSpan, options); - } - finally - { - if (source != null) - { - sourceSpan.Clear(); - ArrayPool.Shared.Return(source); - } - } - } - - public static IReadOnlyDictionary? ParseResponse( - ReadOnlySpan sourceText, - ParserOptions? options = null) - { - options ??= ParserOptions.Default; - - var parser = new Utf8GraphQLRequestParser(sourceText, options); - parser._reader.Expect(TokenKind.StartOfFile); - return parser.ParseResponse(); - } - - public static unsafe IReadOnlyList? ParseBatchResponse( - string sourceText, - ParserOptions? options = null) - { - if (string.IsNullOrEmpty(sourceText)) - { - throw new ArgumentException(SourceText_Empty, nameof(sourceText)); - } - - options ??= ParserOptions.Default; - - var length = checked(sourceText.Length * 4); - byte[]? source = null; - - var sourceSpan = length <= GraphQLConstants.StackallocThreshold - ? stackalloc byte[length] - : source = ArrayPool.Shared.Rent(length); - - try - { - Utf8GraphQLParser.ConvertToBytes(sourceText, ref sourceSpan); - return ParseBatchResponse(sourceSpan, options); - } - finally - { - if (source != null) - { - sourceSpan.Clear(); - ArrayPool.Shared.Return(source); - } - } - } - - public static IReadOnlyList? ParseBatchResponse( - ReadOnlySpan sourceText, - ParserOptions? options = null) - { - options ??= ParserOptions.Default; - - var parser = new Utf8GraphQLRequestParser(sourceText, options); - parser._reader.Expect(TokenKind.StartOfFile); - return parser.ParseBatchResponse(); - } -} diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Message.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Message.cs deleted file mode 100644 index 8971c89e5e9..00000000000 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Message.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace HotChocolate.Language; - -public ref partial struct Utf8GraphQLRequestParser -{ - private ref struct Message - { - public string? Id { get; set; } - - public string? Type { get; set; } - - public ReadOnlySpan Payload { get; set; } - } -} diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Request.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Request.cs deleted file mode 100644 index 30535812c4f..00000000000 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Request.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace HotChocolate.Language; - -public ref partial struct Utf8GraphQLRequestParser -{ - internal ref struct Request - { - public string? OperationName { get; set; } - - public OperationDocumentId? DocumentId { get; set; } - - public OperationDocumentHash? DocumentHash { get; set; } - - public ReadOnlySpan DocumentBody { get; set; } - - public bool ContainsDocument { get; set; } - - public ErrorHandlingMode? ErrorHandlingMode { get; set; } - - public IReadOnlyList>? Variables { get; set; } - - public IReadOnlyDictionary? Extensions { get; set; } - - public DocumentNode? Document { get; set; } - } -} diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Response.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Response.cs deleted file mode 100644 index 1e762321ac2..00000000000 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Response.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Runtime.CompilerServices; -using static HotChocolate.Language.Properties.LangWebResources; - -namespace HotChocolate.Language; - -public ref partial struct Utf8GraphQLRequestParser -{ - private object ParseResponseValue() - { - return _reader.Kind switch - { - TokenKind.LeftBracket => ParseResponseList(), - TokenKind.LeftBrace => ParseResponseObject(), - TokenKind.String => ParseScalarSyntax(), - TokenKind.Integer => ParseScalarSyntax(), - TokenKind.Float => ParseScalarSyntax(), - TokenKind.Name => ParseScalarSyntax(), - _ => throw ThrowHelper.UnexpectedToken(_reader) - }; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private Dictionary ParseResponseObject() - { - _reader.Expect(TokenKind.LeftBrace); - - var fields = new Dictionary(); - - while (_reader.Kind != TokenKind.RightBrace) - { - ParseResponseObjectFieldSyntax(fields); - } - - // skip closing token - _reader.Expect(TokenKind.RightBrace); - - return fields; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void ParseResponseObjectFieldSyntax( - Dictionary fields) - { - if (_reader.Kind != TokenKind.String) - { - throw new SyntaxException(_reader, - ParseMany_InvalidOpenToken, - TokenKind.String, - TokenPrinter.Print(ref _reader)); - } - - var name = _reader.GetString(); - _reader.MoveNext(); - _reader.Expect(TokenKind.Colon); - var value = ParseResponseValue(); - - fields[name] = value; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private List ParseResponseList() - { - if (_reader.Kind != TokenKind.LeftBracket) - { - throw new SyntaxException(_reader, - ParseMany_InvalidOpenToken, - TokenKind.LeftBracket, - TokenPrinter.Print(ref _reader)); - } - - var list = new List(); - - // skip opening token - _reader.MoveNext(); - - while (_reader.Kind != TokenKind.RightBracket) - { - list.Add(ParseResponseValue()); - } - - // skip closing token - _reader.Expect(TokenKind.RightBracket); - - return list; - } -} diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Syntax.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Syntax.cs deleted file mode 100644 index 92d617d745d..00000000000 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Syntax.cs +++ /dev/null @@ -1,138 +0,0 @@ -using static HotChocolate.Language.Properties.LangWebResources; - -namespace HotChocolate.Language; - -public ref partial struct Utf8GraphQLRequestParser -{ - private IValueNode ParseValueSyntax() - { - return _reader.Kind switch - { - TokenKind.LeftBracket => ParseListSyntax(), - TokenKind.LeftBrace => ParseObjectSyntax(), - TokenKind.String => ParseScalarSyntax(), - TokenKind.Integer => ParseScalarSyntax(), - TokenKind.Float => ParseScalarSyntax(), - TokenKind.Name => ParseScalarSyntax(), - _ => throw ThrowHelper.UnexpectedToken(_reader) - }; - } - - private ObjectValueNode ParseObjectSyntax() - { - _reader.Expect(TokenKind.LeftBrace); - - var fields = new List(); - - while (_reader.Kind != TokenKind.RightBrace) - { - fields.Add(ParseObjectFieldSyntax()); - } - - // skip closing token - _reader.Expect(TokenKind.RightBrace); - - return new ObjectValueNode(fields); - } - - private ObjectFieldNode ParseObjectFieldSyntax() - { - if (_reader.Kind != TokenKind.String) - { - throw new SyntaxException(_reader, - ParseMany_InvalidOpenToken, - TokenKind.String, - TokenPrinter.Print(ref _reader)); - } - - var name = _reader.GetString(); - _reader.MoveNext(); - _reader.Expect(TokenKind.Colon); - var value = ParseValueSyntax(); - - return new ObjectFieldNode(name, value); - } - - private ListValueNode ParseListSyntax() - { - if (_reader.Kind != TokenKind.LeftBracket) - { - throw new SyntaxException(_reader, - ParseMany_InvalidOpenToken, - TokenKind.LeftBracket, - TokenPrinter.Print(ref _reader)); - } - - var list = new List(); - - // skip opening token - _reader.MoveNext(); - - while (_reader.Kind != TokenKind.RightBracket) - { - list.Add(ParseValueSyntax()); - } - - // skip closing token - _reader.Expect(TokenKind.RightBracket); - - return new ListValueNode(list); - } - - private IValueNode ParseScalarSyntax() - { - switch (_reader.Kind) - { - case TokenKind.String: - { - _memory ??= new Utf8MemoryBuilder(); - var index = _memory.NextIndex; - var length = _reader.GetRawString(_memory); - var value = _memory.GetMemorySegment(index, length); - _reader.MoveNext(); - return new StringValueNode(null, value, block: false); - } - - case TokenKind.Integer: - { - _memory ??= new Utf8MemoryBuilder(); - var value = _memory.Write(_reader.Value); - _reader.MoveNext(); - return new IntValueNode(null, value); - } - - case TokenKind.Float: - { - _memory ??= new Utf8MemoryBuilder(); - var value = _memory.Write(_reader.Value); - var format = _reader.FloatFormat; - _reader.MoveNext(); - return new FloatValueNode(null, value, format ?? FloatFormat.FixedPoint); - } - - case TokenKind.Name: - if (_reader.Value.SequenceEqual(GraphQLKeywords.True)) - { - _reader.MoveNext(); - return BooleanValueNode.True; - } - - if (_reader.Value.SequenceEqual(GraphQLKeywords.False)) - { - _reader.MoveNext(); - return BooleanValueNode.False; - } - - if (_reader.Value.SequenceEqual(GraphQLKeywords.Null)) - { - _reader.MoveNext(); - return NullValueNode.Default; - } - - throw ThrowHelper.UnexpectedToken(_reader); - - default: - throw ThrowHelper.UnexpectedToken(_reader); - } - } -} diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Utilities.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Utilities.cs deleted file mode 100644 index 7d8027631df..00000000000 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Utilities.cs +++ /dev/null @@ -1,264 +0,0 @@ -using System.Buffers; -using System.Diagnostics.CodeAnalysis; -using static HotChocolate.Language.Properties.LangWebResources; - -namespace HotChocolate.Language; - -public ref partial struct Utf8GraphQLRequestParser -{ - private OperationDocumentId? ParseOperationId() - { - switch (_reader.Kind) - { - case TokenKind.String: - if (_reader.Value.Length == 0) - { - _reader.MoveNext(); - return null; - } - - byte[]? rawStringBuffer = null; - var length = _reader.Value.Length; - - var rawString = length <= GraphQLConstants.StackallocThreshold - ? stackalloc byte[length] - : rawStringBuffer = ArrayPool.Shared.Rent(length); - - try - { - if (!Utf8GraphQLReader.TryGetRawString(_reader.Value, false, rawString, out var written)) - { - throw new OperationIdFormatException(_reader); - } - - if (written == 0) - { - _reader.MoveNext(); - return null; - } - - rawString = rawString.Slice(0, written); - - if (!OperationDocumentId.IsValidId(rawString)) - { - throw new OperationIdFormatException(_reader); - } - - _reader.MoveNext(); - return new OperationDocumentId(Utf8GraphQLReader.GetString(rawString)); - } - finally - { - if (rawStringBuffer != null) - { - rawString.Clear(); - ArrayPool.Shared.Return(rawStringBuffer); - } - } - - case TokenKind.Name when _reader.Value.SequenceEqual(GraphQLKeywords.Null): - _reader.MoveNext(); - return null; - - default: - throw ThrowHelper.ExpectedStringOrNull(_reader); - } - } - - private string? ParseStringOrNull() - { - switch (_reader.Kind) - { - case TokenKind.String: - if (_reader.Value.Length == 0) - { - _reader.MoveNext(); - return null; - } - - var value = _reader.GetString(); - _reader.MoveNext(); - return value; - - case TokenKind.Name when _reader.Value.SequenceEqual(GraphQLKeywords.Null): - _reader.MoveNext(); - return null; - - default: - throw ThrowHelper.ExpectedStringOrNull(_reader); - } - } - - private IReadOnlyDictionary? ParseObjectOrNull() - { - switch (_reader.Kind) - { - case TokenKind.LeftBrace: - return ParseObject(); - - case TokenKind.Name when _reader.Value.SequenceEqual(GraphQLKeywords.Null): - _reader.MoveNext(); - return null; - - default: - throw ThrowHelper.ExpectedObjectOrNull(_reader); - } - } - - private IReadOnlyList>? ParseVariables() - { - switch (_reader.Kind) - { - case TokenKind.LeftBrace: - return new[] { ParseVariablesObject() }; - - case TokenKind.LeftBracket: - var list = new List>(); - _reader.Expect(TokenKind.LeftBracket); - - while (_reader.Kind != TokenKind.RightBracket) - { - list.Add(ParseObject()); - } - - _reader.Expect(TokenKind.RightBracket); - - return list; - - case TokenKind.Name when _reader.Value.SequenceEqual(GraphQLKeywords.Null): - _reader.MoveNext(); - return null; - - default: - throw ThrowHelper.ExpectedObjectOrNull(_reader); - } - } - - private IReadOnlyDictionary ParseVariablesObject() - { - switch (_reader.Kind) - { - case TokenKind.LeftBrace: - _reader.Expect(TokenKind.LeftBrace); - - var obj = new Dictionary(); - - while (_reader.Kind != TokenKind.RightBrace) - { - if (_reader.Kind != TokenKind.String) - { - throw new SyntaxException( - _reader, - ParseMany_InvalidOpenToken, - TokenKind.String, - TokenPrinter.Print(ref _reader)); - } - - var name = _reader.GetString(); - _reader.MoveNext(); - _reader.Expect(TokenKind.Colon); - var value = ParseValueSyntax(); - obj.Add(name, value); - } - - // skip closing token - _reader.Expect(TokenKind.RightBrace); - - return obj; - - default: - throw ThrowHelper.ExpectedObjectOrNull(_reader); - } - } - - private IReadOnlyList? ParseBatchResponse() - { - switch (_reader.Kind) - { - case TokenKind.LeftBracket: - var list = new List(); - _reader.Expect(TokenKind.LeftBracket); - - while (_reader.Kind != TokenKind.RightBracket) - { - list.Add(ParseResponse()); - } - - return list; - - case TokenKind.Name when _reader.Value.SequenceEqual(GraphQLKeywords.Null): - _reader.MoveNext(); - return null; - - default: - throw ThrowHelper.ExpectedObjectOrNull(_reader); - } - } - - private IReadOnlyDictionary? ParseResponse() - { - switch (_reader.Kind) - { - case TokenKind.LeftBrace: - _reader.Expect(TokenKind.LeftBrace); - - var obj = new Dictionary(); - - while (_reader.Kind != TokenKind.RightBrace) - { - if (_reader.Kind != TokenKind.String) - { - throw new SyntaxException( - _reader, - ParseMany_InvalidOpenToken, - TokenKind.String, - TokenPrinter.Print(ref _reader)); - } - - var name = _reader.GetString(); - _reader.MoveNext(); - _reader.Expect(TokenKind.Colon); - var value = ParseResponseValue(); - obj.Add(name, value); - } - - // skip closing token - _reader.Expect(TokenKind.RightBrace); - - return obj; - - case TokenKind.Name when _reader.Value.SequenceEqual(GraphQLKeywords.Null): - _reader.MoveNext(); - return null; - - default: - throw ThrowHelper.ExpectedObjectOrNull(_reader); - } - } - - private bool IsNullToken() - { - return _reader.Kind == TokenKind.Name - && _reader.Value.SequenceEqual(GraphQLKeywords.Null); - } - - public static bool TryExtractHash( - IReadOnlyDictionary? extensions, - IDocumentHashProvider? hashProvider, - [NotNullWhen(true)] out string? hash) - { - if (extensions is not null - && hashProvider is not null - && extensions.TryGetValue(PersistedQuery, out var obj) - && obj is IReadOnlyDictionary persistedQuery - && persistedQuery.TryGetValue(hashProvider.Name, out obj) - && obj is string h) - { - hash = h; - return true; - } - - hash = null; - return false; - } -} diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Values.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Values.cs deleted file mode 100644 index e9298e1bcdb..00000000000 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.Values.cs +++ /dev/null @@ -1,244 +0,0 @@ -using System.Globalization; -using System.Runtime.CompilerServices; -using static HotChocolate.Language.Properties.LangWebResources; - -namespace HotChocolate.Language; - -public ref partial struct Utf8GraphQLRequestParser -{ - private object? ParseValue() - { - return _reader.Kind switch - { - TokenKind.LeftBracket => ParseList(), - TokenKind.LeftBrace => ParseObject(), - TokenKind.String => ParseScalar(), - TokenKind.Integer => ParseScalar(), - TokenKind.Float => ParseScalar(), - TokenKind.Name => ParseScalar(), - _ => throw ThrowHelper.UnexpectedToken(_reader) - }; - } - - private int SkipValue() - { - return _reader.Kind switch - { - TokenKind.LeftBracket => SkipList(), - TokenKind.LeftBrace => SkipObject(), - TokenKind.String => SkipScalar(), - TokenKind.Integer => SkipScalar(), - TokenKind.Float => SkipScalar(), - TokenKind.Name => SkipScalar(), - _ => throw ThrowHelper.UnexpectedToken(_reader) - }; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private IReadOnlyDictionary ParseObject() - { - _reader.Expect(TokenKind.LeftBrace); - - var obj = new Dictionary(); - - while (_reader.Kind != TokenKind.RightBrace) - { - ParseObjectField(obj); - } - - // skip closing token - _reader.Expect(TokenKind.RightBrace); - - return obj; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private int SkipObject() - { - _reader.Expect(TokenKind.LeftBrace); - - while (_reader.Kind != TokenKind.RightBrace) - { - SkipObjectField(); - } - - // skip closing token - var end = _reader.End; - _reader.Expect(TokenKind.RightBrace); - return end; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void ParseObjectField(IDictionary obj) - { - if (_reader.Kind != TokenKind.String) - { - throw new SyntaxException( - _reader, - ParseMany_InvalidOpenToken, - TokenKind.String, - TokenPrinter.Print(ref _reader)); - } - - var name = _reader.GetString(); - _reader.MoveNext(); - _reader.Expect(TokenKind.Colon); - var value = ParseValue(); - obj.Add(name, value); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void SkipObjectField() - { - if (_reader.Kind != TokenKind.String) - { - throw new SyntaxException( - _reader, - ParseMany_InvalidOpenToken, - TokenKind.String, - TokenPrinter.Print(ref _reader)); - } - - _reader.MoveNext(); - _reader.Expect(TokenKind.Colon); - SkipValue(); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private IReadOnlyList ParseList() - { - if (_reader.Kind != TokenKind.LeftBracket) - { - throw new SyntaxException( - _reader, - ParseMany_InvalidOpenToken, - TokenKind.LeftBracket, - TokenPrinter.Print(ref _reader)); - } - - var list = new List(); - - // skip opening token - _reader.MoveNext(); - - while (_reader.Kind != TokenKind.RightBracket) - { - list.Add(ParseValue()); - } - - // skip closing token - _reader.Expect(TokenKind.RightBracket); - - return list; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private int SkipList() - { - // skip opening token - _reader.MoveNext(); - - while (_reader.Kind != TokenKind.RightBracket) - { - SkipValue(); - } - - // skip closing token - var end = _reader.End; - _reader.Expect(TokenKind.RightBracket); - return end; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private object? ParseScalar() - { - string? value; - - switch (_reader.Kind) - { - case TokenKind.String: - value = _reader.GetString(); - _reader.MoveNext(); - return value; - - case TokenKind.Integer: - value = _reader.GetScalarValue(); - _reader.MoveNext(); - return long.Parse(value, CultureInfo.InvariantCulture); - - case TokenKind.Float: - value = _reader.GetScalarValue(); - _reader.MoveNext(); - return decimal.Parse(value, NumberStyles.Float, CultureInfo.InvariantCulture); - - case TokenKind.Name: - if (_reader.Value.SequenceEqual(GraphQLKeywords.True)) - { - _reader.MoveNext(); - return true; - } - - if (_reader.Value.SequenceEqual(GraphQLKeywords.False)) - { - _reader.MoveNext(); - return false; - } - - if (_reader.Value.SequenceEqual(GraphQLKeywords.Null)) - { - _reader.MoveNext(); - return null; - } - - throw ThrowHelper.UnexpectedToken(_reader); - - default: - throw ThrowHelper.UnexpectedToken(_reader); - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private int SkipScalar() - { - var end = _reader.End; - - switch (_reader.Kind) - { - case TokenKind.String: - _reader.MoveNext(); - return end; - - case TokenKind.Integer: - _reader.MoveNext(); - return end; - - case TokenKind.Float: - _reader.MoveNext(); - return end; - - case TokenKind.Name: - if (_reader.Value.SequenceEqual(GraphQLKeywords.True)) - { - _reader.MoveNext(); - return end; - } - - if (_reader.Value.SequenceEqual(GraphQLKeywords.False)) - { - _reader.MoveNext(); - return end; - } - - if (_reader.Value.SequenceEqual(GraphQLKeywords.Null)) - { - _reader.MoveNext(); - return end; - } - - throw ThrowHelper.UnexpectedToken(_reader); - - default: - throw ThrowHelper.UnexpectedToken(_reader); - } - } -} diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs index 8c17d54d2f0..9dab2edbc9c 100644 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs +++ b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs @@ -1,17 +1,24 @@ using System.Buffers; -using static HotChocolate.Language.Properties.LangWebResources; +using System.Text.Json; namespace HotChocolate.Language; public ref partial struct Utf8GraphQLRequestParser { private const string PersistedQuery = "persistedQuery"; + private static readonly JsonReaderOptions s_jsonOptions = new() + { + AllowTrailingCommas = true, + CommentHandling = JsonCommentHandling.Skip + }; + private static readonly ArrayPool s_requestPool = ArrayPool.Shared; + private static readonly ArrayPool s_bytePool = ArrayPool.Shared; + + private readonly ReadOnlySpan _requestData; private readonly IDocumentHashProvider? _hashProvider; private readonly IDocumentCache? _cache; private readonly bool _useCache; private readonly ParserOptions _options; - private Utf8GraphQLReader _reader; - private Utf8MemoryBuilder? _memory; public Utf8GraphQLRequestParser( ReadOnlySpan requestData, @@ -19,423 +26,376 @@ public Utf8GraphQLRequestParser( IDocumentCache? cache = null, IDocumentHashProvider? hashProvider = null) { - _reader = new Utf8GraphQLReader(requestData); + _requestData = requestData; _options = options ?? ParserOptions.Default; _cache = cache; _hashProvider = hashProvider; _useCache = cache is not null; } - public GraphQLRequest ParsePersistedOperation(string operationId, string? operationName) + public readonly IReadOnlyList Parse() { try { - _reader.MoveNext(); + var reader = new Utf8JsonReader(_requestData, s_jsonOptions); - if (_reader.Kind == TokenKind.LeftBrace) + if (!reader.Read()) { - var request = ParseMutableRequest(operationId); - - return new GraphQLRequest - ( - null, - request.DocumentId, - null, - operationName ?? request.OperationName, - request.ErrorHandlingMode, - request.Variables, - request.Extensions - ); + throw new ArgumentException("Empty JSON document.", nameof(_requestData)); } - } - catch - { - _memory?.Abandon(); - _memory = null; - throw; - } - finally - { - _memory?.Seal(); - _memory = null; - } - throw ThrowHelper.InvalidRequestStructure(_reader); - } - - public IReadOnlyList Parse() - { - try - { - _reader.MoveNext(); - - if (_reader.Kind == TokenKind.LeftBrace) - { - var singleRequest = ParseRequest(); - return [singleRequest]; - } - - if (_reader.Kind == TokenKind.LeftBracket) + return reader.TokenType switch { - return ParseBatchRequest(); - } + JsonTokenType.StartObject => [ParseRequest(ref reader)], + JsonTokenType.StartArray => ParseBatchRequest(ref reader), + _ => throw new InvalidOperationException("Invalid request structure. Expected object or array.") + }; } - catch + catch (JsonException ex) { - _memory?.Abandon(); - _memory = null; - throw; + throw new ArgumentException("Invalid JSON document.", nameof(_requestData), ex); } - finally - { - _memory?.Seal(); - _memory = null; - } - - throw ThrowHelper.InvalidRequestStructure(_reader); } - public GraphQLSocketMessage ParseMessage() + private readonly GraphQLRequest[] ParseBatchRequest(ref Utf8JsonReader reader) { - var message = new Message(); + const int initialCapacity = 16; + var rentedArray = s_requestPool.Rent(initialCapacity); + var count = 0; try { - _reader.MoveNext(); - _reader.Expect(TokenKind.LeftBrace); - - while (_reader.Kind != TokenKind.RightBrace) + while (reader.Read() && reader.TokenType != JsonTokenType.EndArray) { - ParseMessageProperty(ref message); - } - } - catch - { - _memory?.Abandon(); - _memory = null; - throw; - } - finally - { - _memory?.Seal(); - _memory = null; - } + if (reader.TokenType == JsonTokenType.StartObject) + { + // Expand array if needed + if (count == rentedArray.Length) + { + var newArray = s_requestPool.Rent(rentedArray.Length * 2); + Array.Copy(rentedArray, newArray, count); + s_requestPool.Return(rentedArray, clearArray: true); + rentedArray = newArray; + } - if (message.Type is null) - { - throw new InvalidOperationException( - "The GraphQL socket message had no type property specified."); - } + rentedArray[count++] = ParseRequest(ref reader); + } + } - return new GraphQLSocketMessage - ( - message.Type, - message.Id, - message.Payload - ); - } + if (count == 0) + { + return []; + } - public object? ParseJson() - { - try - { - _reader.MoveNext(); - return ParseValue(); - } - catch - { - _memory?.Abandon(); - _memory = null; - throw; + var result = new GraphQLRequest[count]; + Array.Copy(rentedArray, result, count); + return result; } finally { - _memory?.Seal(); - _memory = null; + s_requestPool.Return(rentedArray, clearArray: true); } } - private IReadOnlyList ParseBatchRequest() + private readonly GraphQLRequest ParseRequest(ref Utf8JsonReader reader) { - var batch = new List(); - - _reader.Expect(TokenKind.LeftBracket); - - while (_reader.Kind != TokenKind.RightBracket) + DocumentNode? document = null; + OperationDocumentId? documentId = null; + OperationDocumentHash? documentHash = null; + string? operationName = null; + ErrorHandlingMode? errorHandlingMode = null; + JsonDocument? variables = null; + JsonDocument? extensions = null; + var documentBody = default(ReadOnlySpan); + var documentSequence = default(ReadOnlySequence); + var containsDocument = false; + var isDocumentEscaped = false; + var hasDocumentSequence = false; + + while (reader.Read() && reader.TokenType != JsonTokenType.EndObject) { - batch.Add(ParseRequest()); - _reader.MoveNext(); - } - - return batch; - } - - private GraphQLRequest ParseRequest() - { - var request = ParseMutableRequest(); - - return new GraphQLRequest - ( - request.Document, - request.DocumentId, - request.DocumentHash, - request.OperationName, - request.ErrorHandlingMode, - request.Variables, - request.Extensions - ); - } - - private Request ParseMutableRequest(string? documentId = null) - { - var request = new Request(); - - _reader.Expect(TokenKind.LeftBrace); - - while (_reader.Kind != TokenKind.RightBrace) - { - ParseRequestProperty(ref request); - } - - if (documentId is not null) - { - request.DocumentId = documentId; - } - - if (!request.ContainsDocument && request.DocumentId is null) - { - if (_useCache && TryExtractHash(request.Extensions, _hashProvider, out var hash)) - { - request.DocumentId = hash; - request.DocumentHash = new OperationDocumentHash(hash, _hashProvider!.Name, _hashProvider.Format); - } - else + if (reader.TokenType != JsonTokenType.PropertyName) { - throw ThrowHelper.NoIdAndNoQuery(_reader); + continue; } - } - - if (request.ContainsDocument) - { - ParseDocument(ref request); - } - - if (request.Document is null && request.DocumentId is null) - { - throw ThrowHelper.NoIdAndNoQuery(_reader); - } - - return request; - } - private void ParseRequestProperty(ref Request request) - { - var fieldName = _reader.Expect(TokenKind.String); - _reader.Expect(TokenKind.Colon); - - switch (fieldName[0]) - { - case I when fieldName.SequenceEqual(IdProperty): - case D when fieldName.SequenceEqual(DocumentIdProperty): - request.DocumentId = ParseOperationId(); - break; - - case Q when fieldName.SequenceEqual(QueryProperty): - var isNullOrEmpty = IsNullToken() || _reader.Value.Length == 0; - request.ContainsDocument = !isNullOrEmpty; - - if (request.ContainsDocument && _reader.Kind != TokenKind.String) + if (reader.ValueTextEquals("query"u8)) + { + reader.Read(); + if (reader.TokenType == JsonTokenType.String) { - throw ThrowHelper.QueryMustBeStringOrNull(_reader); + // Optimized path: check if we need unescaping or sequence handling + if (reader.ValueIsEscaped || reader.HasValueSequence) + { + // Rare case: needs unescaping or sequence consolidation + containsDocument = true; + isDocumentEscaped = reader.ValueIsEscaped; + hasDocumentSequence = reader.HasValueSequence; + + if (reader.HasValueSequence) + { + documentSequence = reader.ValueSequence; + } + else + { + documentBody = reader.ValueSpan; + } + } + else if (reader.ValueSpan.Length > 0) + { + // Fast path: no escaping needed, use ValueSpan directly + containsDocument = true; + documentBody = reader.ValueSpan; + } } - - request.DocumentBody = _reader.Value; - _reader.MoveNext(); - break; - - case O when fieldName.SequenceEqual(OperationNameProperty): - request.OperationName = ParseStringOrNull(); - break; - - case O when fieldName.SequenceEqual(OnErrorProperty): - var rawErrorHandlingMode = ParseStringOrNull(); - - if (rawErrorHandlingMode is not null) + } + else if (reader.ValueTextEquals("id"u8) || reader.ValueTextEquals("documentId"u8)) + { + reader.Read(); + if (reader.TokenType == JsonTokenType.String) { - if (rawErrorHandlingMode.Equals("PROPAGATE", StringComparison.OrdinalIgnoreCase)) + var id = reader.GetString(); + if (!string.IsNullOrEmpty(id)) { - request.ErrorHandlingMode = ErrorHandlingMode.Propagate; + documentId = new OperationDocumentId(id); } - else if (rawErrorHandlingMode.Equals("NULL", StringComparison.OrdinalIgnoreCase)) + } + } + else if (reader.ValueTextEquals("operationName"u8)) + { + reader.Read(); + if (reader.TokenType == JsonTokenType.String) + { + var name = reader.GetString(); + if (!string.IsNullOrEmpty(name)) { - request.ErrorHandlingMode = ErrorHandlingMode.Null; + operationName = name; } - else if (rawErrorHandlingMode.Equals("HALT", StringComparison.OrdinalIgnoreCase)) + } + } + else if (reader.ValueTextEquals("onError"u8)) + { + reader.Read(); + if (reader.TokenType == JsonTokenType.String) + { + var mode = reader.GetString(); + errorHandlingMode = mode?.ToUpperInvariant() switch { - request.ErrorHandlingMode = ErrorHandlingMode.Halt; - } + "PROPAGATE" => ErrorHandlingMode.Propagate, + "NULL" => ErrorHandlingMode.Null, + "HALT" => ErrorHandlingMode.Halt, + _ => null + }; } - - break; - - case V when fieldName.SequenceEqual(VariablesProperty): - request.Variables = ParseVariables(); - break; - - case E when fieldName.SequenceEqual(ExtensionsProperty): - request.Extensions = ParseObjectOrNull(); - break; - - default: - SkipValue(); - break; - } - } - - private void ParseMessageProperty(ref Message message) - { - var fieldName = _reader.Expect(TokenKind.String); - _reader.Expect(TokenKind.Colon); - - switch (fieldName[0]) - { - case T: - if (fieldName.SequenceEqual(TypeProperty)) + } + else if (reader.ValueTextEquals("variables"u8)) + { + reader.Read(); + if (reader.TokenType == JsonTokenType.StartObject) { - message.Type = ParseStringOrNull(); + variables = JsonDocument.ParseValue(ref reader); } - - break; - - case I: - if (fieldName.SequenceEqual(IdProperty)) + else if (reader.TokenType == JsonTokenType.Null) { - message.Id = ParseStringOrNull(); + variables = null; } - - break; - - case P: - if (fieldName.SequenceEqual(PayloadProperty)) + else + { + reader.Skip(); + } + } + else if (reader.ValueTextEquals("extensions"u8)) + { + reader.Read(); + if (reader.TokenType == JsonTokenType.StartObject) { - var start = _reader.Start; - var hasPayload = !IsNullToken(); - var end = SkipValue(); - message.Payload = hasPayload - ? _reader.SourceText.Slice(start, end - start) - : default; + extensions = JsonDocument.ParseValue(ref reader); } + else if (reader.TokenType == JsonTokenType.Null) + { + extensions = null; + } + else + { + reader.Skip(); + } + } + else + { + reader.Read(); + reader.Skip(); + } + } - break; + // Handle persisted queries via extensions + if (!containsDocument + && documentId is null + && _useCache + && extensions is not null + && TryExtractHash(extensions, out var hash)) + { + documentId = new OperationDocumentId(hash); + documentHash = new OperationDocumentHash(hash, _hashProvider!.Name, _hashProvider.Format); + } - default: - throw ThrowHelper.UnexpectedProperty(_reader, fieldName); + // Parse the GraphQL document if provided + if (containsDocument) + { + ParseDocument( + documentBody, + documentSequence, + isDocumentEscaped, + hasDocumentSequence, + documentId, + ref document, + ref documentHash, + ref documentId); } - } - private void ParseDocument(ref Request request) - { - var length = request.DocumentBody.Length; + // Validation + if (document is null && documentId is null) + { + throw new InvalidOperationException("Request must contain either a query or a document id."); + } - byte[]? unescapedArray = null; + return new GraphQLRequest( + document, + documentId, + documentHash, + operationName, + errorHandlingMode, + variables, + extensions); + } - var unescapedSpan = length <= GraphQLConstants.StackallocThreshold - ? stackalloc byte[length] - : (unescapedArray = ArrayPool.Shared.Rent(length)); + private readonly void ParseDocument( + ReadOnlySpan documentBody, + ReadOnlySequence documentSequence, + bool isEscaped, + bool hasSequence, + OperationDocumentId? requestDocumentId, + ref DocumentNode? document, + ref OperationDocumentHash? documentHash, + ref OperationDocumentId? documentId) + { + ReadOnlySpan queryBytes; + byte[]? rentedBuffer = null; try { - Utf8Helper.Unescape(request.DocumentBody, ref unescapedSpan, false); - DocumentNode? document; + // Handle the 4 possible scenarios + if (!isEscaped && !hasSequence) + { + // Scenario 1: No escapes, no sequence (COMMON - ~99%) + // Zero allocations - use documentBody directly + queryBytes = documentBody; + } + else if (isEscaped && !hasSequence) + { + // Scenario 2: Has escapes, no sequence (RARE) + // Allocate buffer and unescape + var maxLength = documentBody.Length; + rentedBuffer = s_bytePool.Rent(maxLength); + var unescapedSpan = rentedBuffer.AsSpan(); + Utf8Helper.Unescape(documentBody, ref unescapedSpan, isBlockString: false); + queryBytes = unescapedSpan; + } + else if (!isEscaped && hasSequence) + { + // Scenario 3: No escapes, has sequence (VERY RARE) + // Copy sequence to contiguous buffer + var totalLength = (int)documentSequence.Length; + rentedBuffer = s_bytePool.Rent(totalLength); + documentSequence.CopyTo(rentedBuffer); + queryBytes = rentedBuffer.AsSpan(0, totalLength); + } + else // isEscaped && hasSequence + { + // Scenario 4: Has escapes AND sequence (ULTRA RARE) + // Copy sequence first, then unescape + var totalLength = (int)documentSequence.Length; + var tempBuffer = s_bytePool.Rent(totalLength); + try + { + documentSequence.CopyTo(tempBuffer); + var escapedSpan = tempBuffer.AsSpan(0, totalLength); + + rentedBuffer = s_bytePool.Rent(totalLength); + var unescapedSpan = rentedBuffer.AsSpan(); + Utf8Helper.Unescape(escapedSpan, ref unescapedSpan, isBlockString: false); + queryBytes = unescapedSpan; + } + finally + { + s_bytePool.Return(tempBuffer); + } + } + // Now use queryBytes for parsing and caching (same as before) if (_useCache) { - if (request.DocumentId.HasValue - && _cache!.TryGetDocument(request.DocumentId.Value.Value, out var cachedDocument)) + if (requestDocumentId.HasValue + && _cache!.TryGetDocument(requestDocumentId.Value.Value, out var cachedDocument)) { document = cachedDocument.Body; - request.DocumentHash = cachedDocument.Hash; + documentHash = cachedDocument.Hash; } else { - var hash = _hashProvider!.ComputeHash(unescapedSpan); - request.DocumentHash = hash; + var hash = _hashProvider!.ComputeHash(queryBytes); + documentHash = hash; + if (_cache!.TryGetDocument(hash.Value, out cachedDocument)) { document = cachedDocument.Body; } else { - document = unescapedSpan.Length == 0 ? null : Utf8GraphQLParser.Parse(unescapedSpan, _options); + document = queryBytes.Length == 0 + ? null + : Utf8GraphQLParser.Parse(queryBytes, _options); } - if (!request.DocumentId.HasValue) + if (!requestDocumentId.HasValue) { - request.DocumentId = hash.Value; + documentId = new OperationDocumentId(hash.Value); } } } else { - document = Utf8GraphQLParser.Parse(unescapedSpan, _options); - } - - if (document is not null) - { - request.Document = document; + document = Utf8GraphQLParser.Parse(queryBytes, _options); } } finally { - if (unescapedArray != null) + if (rentedBuffer != null) { - unescapedSpan.Clear(); - ArrayPool.Shared.Return(unescapedArray); + s_bytePool.Return(rentedBuffer); } } } - public static IReadOnlyList Parse( - ReadOnlySpan requestData, - ParserOptions? options = null, - IDocumentCache? cache = null, - IDocumentHashProvider? hashProvider = null) => - new Utf8GraphQLRequestParser(requestData, options, cache, hashProvider).Parse(); - - public static unsafe IReadOnlyList Parse( - string sourceText, - ParserOptions? options = null, - IDocumentCache? cache = null, - IDocumentHashProvider? hashProvider = null) + private readonly bool TryExtractHash(JsonDocument extensions, out string hash) { - if (string.IsNullOrEmpty(sourceText)) + if (extensions.RootElement.TryGetProperty(PersistedQuery, out var persistedQuery) + && persistedQuery.ValueKind == JsonValueKind.Object + && _hashProvider is not null + && persistedQuery.TryGetProperty(_hashProvider.Name, out var hashElement) + && hashElement.ValueKind == JsonValueKind.String) { - throw new ArgumentException(SourceText_Empty, nameof(sourceText)); + hash = hashElement.GetString()!; + return true; } - var length = checked(sourceText.Length * 4); - byte[]? source = null; - - var sourceSpan = length <= GraphQLConstants.StackallocThreshold - ? stackalloc byte[length] - : source = ArrayPool.Shared.Rent(length); - - try - { - Utf8GraphQLParser.ConvertToBytes(sourceText, ref sourceSpan); - var parser = new Utf8GraphQLRequestParser(sourceSpan, options, cache, hashProvider); - return parser.Parse(); - } - finally - { - if (source != null) - { - sourceSpan.Clear(); - ArrayPool.Shared.Return(source); - } - } + hash = string.Empty; + return false; } - public static GraphQLSocketMessage ParseMessage(ReadOnlySpan messageData) - => new Utf8GraphQLRequestParser(messageData).ParseMessage(); + public static IReadOnlyList Parse( + ReadOnlySpan requestData, + ParserOptions? options = null, + IDocumentCache? cache = null, + IDocumentHashProvider? hashProvider = null) + => new Utf8GraphQLRequestParser(requestData, options, cache, hashProvider).Parse(); } diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLSocketMessageParser.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLSocketMessageParser.cs new file mode 100644 index 00000000000..9efdd722d95 --- /dev/null +++ b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLSocketMessageParser.cs @@ -0,0 +1,85 @@ +using System.Text.Json; + +namespace HotChocolate.Language; + +public ref partial struct Utf8GraphQLSocketMessageParser +{ + private static readonly JsonReaderOptions s_jsonOptions = new() + { + AllowTrailingCommas = true, + CommentHandling = JsonCommentHandling.Skip + }; + + private readonly ReadOnlySpan _messageData; + + public Utf8GraphQLSocketMessageParser(ReadOnlySpan messageData) + { + _messageData = messageData; + } + + public readonly GraphQLSocketMessage ParseMessage() + { + var reader = new Utf8JsonReader(_messageData, s_jsonOptions); + + if (!reader.Read() || reader.TokenType != JsonTokenType.StartObject) + { + throw new InvalidOperationException("Expected JSON object for socket message."); + } + + string? type = null; + string? id = null; + var payload = default(ReadOnlySpan); + + while (reader.Read() && reader.TokenType != JsonTokenType.EndObject) + { + if (reader.TokenType != JsonTokenType.PropertyName) + { + continue; + } + + if (reader.ValueTextEquals("type"u8)) + { + reader.Read(); + if (reader.TokenType == JsonTokenType.String) + { + type = reader.GetString(); + } + } + else if (reader.ValueTextEquals("id"u8)) + { + reader.Read(); + if (reader.TokenType == JsonTokenType.String) + { + id = reader.GetString(); + } + else if (reader.TokenType == JsonTokenType.Null) + { + id = null; + } + } + else if (reader.ValueTextEquals("payload"u8)) + { + reader.Read(); + if (reader.TokenType != JsonTokenType.Null) + { + // Capture the raw bytes of the payload value + var start = (int)reader.TokenStartIndex; + reader.Skip(); + var end = (int)reader.TokenStartIndex; + payload = _messageData.Slice(start, end - start); + } + } + else + { + // Skip unknown properties + reader.Read(); + reader.Skip(); + } + } + + return new GraphQLSocketMessage(type, id, payload); + } + + public static GraphQLSocketMessage ParseMessage(ReadOnlySpan messageData) + => new Utf8GraphQLSocketMessageParser(messageData).ParseMessage(); +} diff --git a/src/HotChocolate/Language/test/Directory.Build.props b/src/HotChocolate/Language/test/Directory.Build.props index 7b5e79f43f8..7ab10565328 100644 --- a/src/HotChocolate/Language/test/Directory.Build.props +++ b/src/HotChocolate/Language/test/Directory.Build.props @@ -8,13 +8,11 @@ - - diff --git a/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/DirectiveDefinitionNodeTests.cs b/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/DirectiveDefinitionNodeTests.cs index 35608add6d8..16b0db8f51a 100644 --- a/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/DirectiveDefinitionNodeTests.cs +++ b/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/DirectiveDefinitionNodeTests.cs @@ -15,9 +15,14 @@ public void CreateDirectiveDefinitionWithLocation(bool isRepeatable) var locations = new List(); // act - var directiveDefinition = new DirectiveDefinitionNode( - location, name, description, isRepeatable, - arguments, locations); + var directiveDefinition = + new DirectiveDefinitionNode( + location, + name, + description, + isRepeatable, + arguments, + locations); // assert Assert.Equal(SyntaxKind.DirectiveDefinition, directiveDefinition.Kind); @@ -39,13 +44,17 @@ public void CreateDirectiveDefinition() var locations = new List(); // act - var directiveDefinition = new DirectiveDefinitionNode( - null, name, description, true, - arguments, locations); + var directiveDefinition = + new DirectiveDefinitionNode( + null, + name, + description, + isRepeatable: true, + arguments, + locations); // assert - Assert.Equal(SyntaxKind.DirectiveDefinition, - directiveDefinition.Kind); + Assert.Equal(SyntaxKind.DirectiveDefinition, directiveDefinition.Kind); Assert.Null(directiveDefinition.Location); Assert.Equal(name, directiveDefinition.Name); Assert.Equal(description, directiveDefinition.Description); @@ -63,16 +72,20 @@ public void WithName() var arguments = new List(); var locations = new List { new(DirectiveLocation.Field.ToString()) }; - var directiveDefinition = new DirectiveDefinitionNode( - null, name, description, true, - arguments, locations); + var directiveDefinition = + new DirectiveDefinitionNode( + null, + name, + description, + isRepeatable: true, + arguments, + locations); // act - directiveDefinition = directiveDefinition - .WithName(new NameNode("bar")); + directiveDefinition = directiveDefinition.WithName(new NameNode("bar")); // assert - directiveDefinition.MatchSnapshot(); + directiveDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -84,16 +97,20 @@ public void WithDescription() var arguments = new List(); var locations = new List { new(DirectiveLocation.Field.ToString()) }; - var directiveDefinition = new DirectiveDefinitionNode( - null, name, description, true, - arguments, locations); + var directiveDefinition = + new DirectiveDefinitionNode( + null, + name, + description, + isRepeatable: true, + arguments, + locations); // act - directiveDefinition = directiveDefinition - .WithDescription(new StringValueNode("qux")); + directiveDefinition = directiveDefinition.WithDescription(new StringValueNode("qux")); // assert - directiveDefinition.MatchSnapshot(); + directiveDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -113,19 +130,19 @@ public void WithArguments() directiveDefinition = directiveDefinition .WithArguments(new List { - new InputValueDefinitionNode - ( - null, - new NameNode("arg"), - null, - new NamedTypeNode(new NameNode("type")), - NullValueNode.Default, - Array.Empty() - ) + new InputValueDefinitionNode + ( + null, + new NameNode("arg"), + null, + new NamedTypeNode(new NameNode("type")), + NullValueNode.Default, + Array.Empty() + ) }); // assert - directiveDefinition.MatchSnapshot(); + directiveDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -146,7 +163,7 @@ public void WithLocations() .WithLocations(new List { new NameNode("BAR") }); // assert - directiveDefinition.MatchSnapshot(); + directiveDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -158,16 +175,21 @@ public void WithLocation() var arguments = new List(); var locations = new List { new(DirectiveLocation.Field.ToString()) }; - var directiveDefinition = new DirectiveDefinitionNode( - null, name, description, true, - arguments, locations); + var directiveDefinition = + new DirectiveDefinitionNode( + null, + name, + description, + isRepeatable: true, + arguments, + locations); // act directiveDefinition = directiveDefinition .WithLocation(AstTestHelper.CreateDummyLocation()); // assert - directiveDefinition.MatchSnapshot(); + directiveDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -179,15 +201,20 @@ public void AsUnique() var arguments = new List(); var locations = new List { new(DirectiveLocation.Field.ToString()) }; - var directiveDefinition = new DirectiveDefinitionNode( - null, name, description, true, - arguments, locations); + var directiveDefinition = + new DirectiveDefinitionNode( + null, + name, + description, + isRepeatable: true, + arguments, + locations); // act directiveDefinition = directiveDefinition.AsRepeatable(false); // assert - directiveDefinition.MatchSnapshot(); + directiveDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -199,15 +226,20 @@ public void AsRepeatable() var arguments = new List(); var locations = new List { new(DirectiveLocation.Field.ToString()) }; - var directiveDefinition = new DirectiveDefinitionNode( - null, name, description, false, - arguments, locations); + var directiveDefinition = + new DirectiveDefinitionNode( + null, + name, + description, + isRepeatable: false, + arguments, + locations); // act directiveDefinition = directiveDefinition.AsRepeatable(); // assert - directiveDefinition.MatchSnapshot(); + directiveDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -220,12 +252,17 @@ public void DirectiveDefinition_ToString() var locations = new List { new(DirectiveLocation.Field.ToString()) }; // act - var directiveDefinition = new DirectiveDefinitionNode( - null, name, description, true, - arguments, locations); + var directiveDefinition = + new DirectiveDefinitionNode( + null, + name, + description, + isRepeatable: true, + arguments, + locations); // assert - directiveDefinition.ToString().MatchSnapshot(); + directiveDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -236,25 +273,31 @@ public void DirectiveDefinition_WithArgument_ToString() var description = new StringValueNode("bar"); var arguments = new List { - new(null, + new InputValueDefinitionNode( + null, new NameNode("abc"), new StringValueNode("def"), new NamedTypeNode("efg"), null, - Array.Empty()) + []) }; var locations = new List { - new(DirectiveLocation.Field.ToString()) + new NameNode(DirectiveLocation.Field.ToString()) }; // act - var directiveDefinition = new DirectiveDefinitionNode( - null, name, description, true, - arguments, locations); + var directiveDefinition = + new DirectiveDefinitionNode( + null, + name, + description, + isRepeatable: true, + arguments, + locations); // assert - directiveDefinition.ToString().MatchSnapshot(); + directiveDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -263,17 +306,18 @@ public void Equals_With_Same_Location() // arrange var arguments = new List { - new(null, + new InputValueDefinitionNode( + null, new NameNode("abc"), new StringValueNode("def"), new NamedTypeNode("efg"), null, - Array.Empty()) + []) }; var locations = new List { - new(DirectiveLocation.Field.ToString()) + new NameNode(DirectiveLocation.Field.ToString()) }; var a = new DirectiveDefinitionNode( @@ -317,12 +361,13 @@ public void Equals_With_Different_Location() // arrange var arguments = new List { - new(null, + new InputValueDefinitionNode( + null, new NameNode("abc"), new StringValueNode("def"), new NamedTypeNode("efg"), null, - Array.Empty()) + []) }; var locations = new List diff --git a/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/SelectionSetNodeTests.cs b/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/SelectionSetNodeTests.cs index 4c6188c957a..80db5a61366 100644 --- a/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/SelectionSetNodeTests.cs +++ b/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/SelectionSetNodeTests.cs @@ -172,7 +172,7 @@ public void CreateSelectionSet() ); // assert - selectionSet.MatchSnapshot(); + selectionSet.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -203,7 +203,7 @@ public void WithLocation() selectionSet = selectionSet.WithLocation(location); // assert - selectionSet.MatchSnapshot(); + selectionSet.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -246,6 +246,6 @@ public void WithSelections() }); // assert - selectionSet.MatchSnapshot(); + selectionSet.ToString().MatchSnapshot(extension: ".graphql"); } } diff --git a/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/VariableDefinitionNodeTests.cs b/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/VariableDefinitionNodeTests.cs index 65a4d0084a4..8a5d67d1f79 100644 --- a/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/VariableDefinitionNodeTests.cs +++ b/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/VariableDefinitionNodeTests.cs @@ -194,7 +194,7 @@ public void Create_ArgumentsArePassedCorrectly() new List { new("qux") }); // assert - variableDefinition.MatchSnapshot(); + variableDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -215,7 +215,7 @@ public void WithLocation() new Location(6, 7, 8, 9)); // assert - variableDefinition.MatchSnapshot(); + variableDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -239,7 +239,7 @@ public void WithVariable() new VariableNode(new NameNode("quux"))); // assert - variableDefinition.MatchSnapshot(); + variableDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -282,7 +282,7 @@ public void WithType() new NamedTypeNode(new NameNode("quux"))); // assert - variableDefinition.MatchSnapshot(); + variableDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -325,7 +325,7 @@ public void WithDefaultValue() new StringValueNode("quux")); // assert - variableDefinition.MatchSnapshot(); + variableDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -346,7 +346,7 @@ public void WithDirectives() new List { new("quux") }); // assert - variableDefinition.MatchSnapshot(); + variableDefinition.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] diff --git a/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/__snapshots__/DirectiveDefinitionNodeTests.DirectiveDefinition_ToString.graphql b/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/__snapshots__/DirectiveDefinitionNodeTests.DirectiveDefinition_ToString.graphql new file mode 100644 index 00000000000..1c4545b9074 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/__snapshots__/DirectiveDefinitionNodeTests.DirectiveDefinition_ToString.graphql @@ -0,0 +1,2 @@ +"bar" +directive @foo repeatable on FIELD diff --git a/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/__snapshots__/DirectiveDefinitionNodeTests.DirectiveDefinition_WithArgument_ToString.graphql b/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/__snapshots__/DirectiveDefinitionNodeTests.DirectiveDefinition_WithArgument_ToString.graphql new file mode 100644 index 00000000000..0c1af1ee452 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.SyntaxTree.Tests/__snapshots__/DirectiveDefinitionNodeTests.DirectiveDefinition_WithArgument_ToString.graphql @@ -0,0 +1,2 @@ +"bar" +directive @foo("def" abc: efg) repeatable on FIELD diff --git a/src/HotChocolate/Language/test/Language.Tests/Parser/KitchenSinkParserTests.cs b/src/HotChocolate/Language/test/Language.Tests/Parser/KitchenSinkParserTests.cs index 241ec0a6dae..4ce072b458b 100644 --- a/src/HotChocolate/Language/test/Language.Tests/Parser/KitchenSinkParserTests.cs +++ b/src/HotChocolate/Language/test/Language.Tests/Parser/KitchenSinkParserTests.cs @@ -20,7 +20,7 @@ public void ParseFacebookKitchenSinkSchema() // assert var snapshot = new Snapshot(); - snapshot.Add(document, "SDL:"); + snapshot.Add(document.ToString(), "SDL:"); snapshot.Add(document, "AST:", Json); snapshot.Match(); } @@ -40,7 +40,7 @@ public void ParseFacebookKitchenSinkQuery() // assert var snapshot = new Snapshot(); - snapshot.Add(document, "SDL:"); + snapshot.Add(document.ToString(), "SDL:"); snapshot.Add(document, "AST:", Json); snapshot.Match(); } diff --git a/src/HotChocolate/Language/test/Language.Tests/Parser/QueryParserTests.cs b/src/HotChocolate/Language/test/Language.Tests/Parser/QueryParserTests.cs index cdee4acca5c..e513837a1f2 100644 --- a/src/HotChocolate/Language/test/Language.Tests/Parser/QueryParserTests.cs +++ b/src/HotChocolate/Language/test/Language.Tests/Parser/QueryParserTests.cs @@ -213,7 +213,7 @@ public void QueryWithComments() // assert var snapshot = new Snapshot(); - snapshot.Add(document, "Query"); + snapshot.Add(document.ToString(), "Query"); snapshot.Add(document, "AST", Json); snapshot.Match(); } @@ -232,7 +232,7 @@ public void IntrospectionQuery() var document = parser.Parse(); // assert - document.MatchSnapshot(); + document.ToString().MatchSnapshot(extension: ".graphql");; } [Fact] @@ -249,7 +249,7 @@ public void KitchenSinkQueryQuery() var document = parser.Parse(); // assert - document.MatchSnapshot(); + document.ToString().MatchSnapshot(extension: ".graphql");; } [Fact] @@ -266,7 +266,7 @@ public void QueryWithStringArg() var document = parser.Parse(); // assert - document.MatchSnapshot(); + document.ToString().MatchSnapshot(extension: ".graphql"); } [Fact] @@ -478,7 +478,7 @@ public void RussianLiterals() var document = parser.Parse(); // assert - document.MatchSnapshot(); + document.ToString().MatchSnapshot(extension: ".graphql");; } [Fact(Skip = "Implement Parse Variable Directives")] @@ -493,6 +493,6 @@ public void ParseVariablesWithDirective() var document = parser.Parse(); // assert - document.MatchSnapshot(); + document.ToString().MatchSnapshot(extension: ".graphql");; } } diff --git a/src/HotChocolate/Language/test/Language.Tests/Parser/__snapshots__/DirectiveParserTests.ParseQueryDirective.snap b/src/HotChocolate/Language/test/Language.Tests/Parser/__snapshots__/DirectiveParserTests.ParseQueryDirective.snap index 764419e590c..97ec4655544 100644 --- a/src/HotChocolate/Language/test/Language.Tests/Parser/__snapshots__/DirectiveParserTests.ParseQueryDirective.snap +++ b/src/HotChocolate/Language/test/Language.Tests/Parser/__snapshots__/DirectiveParserTests.ParseQueryDirective.snap @@ -1,4 +1,4 @@ -{ +{ "Kind": "Document", "Location": { "Start": 0, @@ -16,6 +16,7 @@ "Column": 17 }, "Name": null, + "Description": null, "Operation": "Query", "VariableDefinitions": [ { @@ -45,6 +46,7 @@ "Value": "var" } }, + "Description": null, "Type": { "Kind": "NamedType", "Location": { diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/StringExtensions.cs b/src/HotChocolate/Language/test/Language.Web.Tests/StringExtensions.cs new file mode 100644 index 00000000000..b60e0a5d692 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/StringExtensions.cs @@ -0,0 +1,9 @@ +namespace HotChocolate.Language; + +internal static class StringExtensions +{ + public static string NormalizeLineBreaks(this string s) + { + return s.Replace("\r\n", "\n").Replace("\r", "\n"); + } +} diff --git a/src/HotChocolate/Language/test/Language.Tests/Parser/GraphQLRequestParserTests.cs b/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs similarity index 67% rename from src/HotChocolate/Language/test/Language.Tests/Parser/GraphQLRequestParserTests.cs rename to src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs index 4361a47d93c..3dafa594de3 100644 --- a/src/HotChocolate/Language/test/Language.Tests/Parser/GraphQLRequestParserTests.cs +++ b/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs @@ -1,11 +1,12 @@ using System.Diagnostics.CodeAnalysis; using System.Security.Cryptography; using System.Text; +using System.Text.Json; using Newtonsoft.Json; namespace HotChocolate.Language; -public class GraphQLRequestParserTests +public class Utf8GraphQLRequestParserTests { [Fact] public void Utf8GraphQLRequestParser_Parse() @@ -33,74 +34,6 @@ public void Utf8GraphQLRequestParser_Parse() }); } - [Fact] - public void Utf8GraphQLRequestParser_ParseJson() - { - // arrange - var source = Encoding.UTF8.GetBytes( - JsonConvert.SerializeObject( - new GraphQLRequestDto( - query: FileResource.Open("kitchen-sink.graphql").NormalizeLineBreaks())) - .NormalizeLineBreaks()); - - // act - var obj = Utf8GraphQLRequestParser.ParseJson(source); - - // assert - obj.MatchSnapshot(); - } - - [Fact] - public void Utf8GraphQLRequestParser_ParseJson_FromString() - { - // arrange - var json = JsonConvert.SerializeObject( - new GraphQLRequestDto( - query: FileResource.Open("kitchen-sink.graphql").NormalizeLineBreaks())) - .NormalizeLineBreaks(); - - // act - var obj = Utf8GraphQLRequestParser.ParseJson(json); - - // assert - obj.MatchSnapshot(); - } - - [Fact] - public void Utf8GraphQLRequestParser_ParseJsonObject() - { - // arrange - var source = Encoding.UTF8.GetBytes( - JsonConvert.SerializeObject( - new GraphQLRequestDto( - query: FileResource.Open("kitchen-sink.graphql").NormalizeLineBreaks())) - .NormalizeLineBreaks()); - - // act - var obj = - Utf8GraphQLRequestParser.ParseJsonObject(source); - - // assert - obj.MatchSnapshot(); - } - - [Fact] - public void Utf8GraphQLRequestParser_ParseJsonObject_FromString() - { - // arrange - var json = JsonConvert.SerializeObject( - new GraphQLRequestDto( - query: FileResource.Open("kitchen-sink.graphql").NormalizeLineBreaks())) - .NormalizeLineBreaks(); - - // act - var obj = - Utf8GraphQLRequestParser.ParseJsonObject(json); - - // assert - obj.MatchSnapshot(); - } - [Fact] public void Parse_Kitchen_Sink_Query_No_Cache() { @@ -296,7 +229,7 @@ public void Parse_Id_As_Name() var buffer = Encoding.UTF8.GetBytes(request.Query); var expectedHash = Convert.ToBase64String( - SHA1.Create().ComputeHash(buffer)) + SHA1.HashData(buffer)) .Replace("/", "_") .Replace("+", "-") .TrimEnd('='); @@ -446,72 +379,6 @@ public void Parse_Kitchen_Sink_Query_AllProps_No_Cache() snapshot.Match(); } - [Fact] - public void Parse_Json() - { - // arrange - var source = Encoding.UTF8.GetBytes( - JsonConvert.SerializeObject( - new GraphQLRequestDto( - query: FileResource.Open("kitchen-sink.graphql").NormalizeLineBreaks(), - id: "ABC", - operationName: "DEF", - variables: new Dictionary - { - { "a", "b" }, - { - "b", - new Dictionary - { - { "a", "b" }, - { "b", true }, - { "c", 1 }, - { "d", 1.1 } - } - }, - { - "c", - new List - { - new Dictionary - { - { "a", "b" } - } - } - } - }, - extensions: new Dictionary - { - { "aa", "bb" }, - { - "bb", - new Dictionary - { - { "aa", "bb" }, - { "bb", true }, - { "cc", 1 }, - { "df", 1.1 } - } - }, - { - "cc", - new List - { - new Dictionary - { - { "aa", "bb" } - } - } - } - })).NormalizeLineBreaks()); - - // act - var parsed = Utf8GraphQLRequestParser.ParseJson(source); - - // assert - parsed.MatchSnapshot(); - } - [Fact] public void Parse_Socket_Message() { @@ -555,15 +422,12 @@ public void Parse_Socket_Message() // act var message = - Utf8GraphQLRequestParser.ParseMessage(source); + Utf8GraphQLSocketMessageParser.ParseMessage(source); // assert Assert.Equal("foo", message.Type); Assert.Equal("bar", message.Id); - - File.WriteAllBytes("Foo.json", message.Payload.ToArray()); - - Utf8GraphQLRequestParser.ParseJson(message.Payload).MatchSnapshot(); + Assert.False(message.Payload.IsEmpty); } [Fact] @@ -608,7 +472,7 @@ public void Parse_Apollo_AQP_SignatureQuery() Assert.Equal("MyQuery", request.OperationName); Assert.Equal("hashOfQuery", request.DocumentId?.Value); Assert.Null(request.Variables); - Assert.True(request.Extensions!.ContainsKey("persistedQuery")); + Assert.True(request.Extensions!.RootElement.TryGetProperty("persistedQuery", out _)); Assert.Null(request.Document); Assert.Equal("hashOfQuery", request.DocumentHash?.Value); Assert.Equal("sha256Hash", request.DocumentHash?.AlgorithmName); @@ -637,8 +501,9 @@ public void Parse_Apollo_AQP_SignatureQuery_Variables_Without_Values() { Assert.Null(r.OperationName); Assert.Equal("hashOfQuery", r.DocumentId?.Value); - Assert.Collection(r.Variables!, Assert.Empty); - Assert.True(r.Extensions!.ContainsKey("persistedQuery")); + Assert.NotNull(r.Variables); + Assert.Empty(r.Variables.RootElement.EnumerateObject()); + Assert.True(r.Extensions!.RootElement.TryGetProperty("persistedQuery", out _)); Assert.Null(r.Document); Assert.Equal("hashOfQuery", r.DocumentHash?.Value); }); @@ -666,40 +531,26 @@ public void Parse_Apollo_AQP_FullRequest_And_Verify_Hash() r => { Assert.Null(r.OperationName); - Assert.Collection(r.Variables!, Assert.Empty); - Assert.True(r.Extensions!.ContainsKey("persistedQuery")); + Assert.NotNull(r.Variables); + Assert.Empty(r.Variables.RootElement.EnumerateObject()); + Assert.True(r.Extensions!.RootElement.TryGetProperty("persistedQuery", out _)); Assert.NotNull(r.Document); - if (r.Extensions.TryGetValue("persistedQuery", out var o) - && o is IReadOnlyDictionary persistedQuery - && persistedQuery.TryGetValue("sha256Hash", out o) - && o is string hash) + if (r.Extensions.RootElement.TryGetProperty("persistedQuery", out var persistedQuery) + && persistedQuery.ValueKind == JsonValueKind.Object + && persistedQuery.TryGetProperty("sha256Hash", out var hashElement) + && hashElement.ValueKind == JsonValueKind.String) { - Assert.Equal(hash, r.DocumentHash?.Value); + Assert.Equal(hashElement.GetString(), r.DocumentHash?.Value); } }); } - [Fact] - public void Parse_Float_Exponent_Format() - { - // arrange - var source = Encoding.UTF8.GetBytes( - FileResource.Open("Float.json") - .NormalizeLineBreaks()); - - // act - var obj = Utf8GraphQLRequestParser.ParseJson(source); - - // assert - obj.MatchSnapshot(); - } - [Fact] public void Parse_Invalid_Query() { // assert - Assert.Throws( + Assert.Throws( () => { // arrange @@ -746,7 +597,7 @@ public void Parse_Empty_OperationName() public void Parse_Empty_Json() { // assert - Assert.Throws( + Assert.Throws( () => { // arrange @@ -789,7 +640,7 @@ public void Parse_Empty_String() public void Parse_Space_String() { // assert - Assert.Throws( + Assert.Throws( () => { // arrange @@ -806,6 +657,326 @@ public void Parse_Space_String() }); } + [Fact] + public void Parse_Batch_Empty() + { + // arrange + var source = "[]"u8.ToArray(); + + // act + var batch = Utf8GraphQLRequestParser.Parse(source); + + // assert + Assert.Empty(batch); + } + + [Fact] + public void Parse_Batch_Single_Request() + { + // arrange + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject( + new[] + { + new GraphQLRequestDto(query: "{ __typename }") + })); + + // act + var batch = Utf8GraphQLRequestParser.Parse(source); + + // assert + Assert.Single(batch); + Assert.NotNull(batch[0].Document); + } + + [Fact] + public void Parse_Batch_Multiple_Requests() + { + // arrange + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject( + new[] + { + new GraphQLRequestDto(query: "{ __typename }", operationName: "A"), + new GraphQLRequestDto(query: "{ __schema { queryType { name } } }", operationName: "B"), + new GraphQLRequestDto(query: "{ __type(name: \"Query\") { name } }", operationName: "C") + })); + + // act + var batch = Utf8GraphQLRequestParser.Parse(source); + + // assert + Assert.Equal(3, batch.Count); + Assert.Equal("A", batch[0].OperationName); + Assert.Equal("B", batch[1].OperationName); + Assert.Equal("C", batch[2].OperationName); + Assert.All(batch, r => Assert.NotNull(r.Document)); + } + + [Fact] + public void Parse_Batch_Large_Requires_Array_Expansion() + { + // arrange - create more than 16 requests to test array expansion + var requests = new GraphQLRequestDto[20]; + for (var i = 0; i < 20; i++) + { + requests[i] = new GraphQLRequestDto(query: "{ __typename }", operationName: $"Op{i}"); + } + var source = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(requests)); + + // act + var batch = Utf8GraphQLRequestParser.Parse(source); + + // assert + Assert.Equal(20, batch.Count); + for (var i = 0; i < 20; i++) + { + Assert.Equal($"Op{i}", batch[i].OperationName); + Assert.NotNull(batch[i].Document); + } + } + + [Fact] + public void Parse_Query_With_Newline_Escape() + { + // arrange + const string query = "query { user(name: \"John\\nDoe\") { id } }"; + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject(new GraphQLRequestDto(query: query))); + + // act + var batch = Utf8GraphQLRequestParser.Parse(source); + + // assert + var request = Assert.Single(batch); + Assert.NotNull(request.Document); + // Verify the document was parsed correctly - formatted GraphQL will have escaped newline + Assert.Contains("John\\nDoe", request.Document.ToString()); + } + + [Fact] + public void Parse_Query_With_Tab_Escape() + { + // arrange + const string query = "query { user(name: \"John\\tDoe\") { id } }"; + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject(new GraphQLRequestDto(query: query))); + + // act + var batch = Utf8GraphQLRequestParser.Parse(source); + + // assert + var request = Assert.Single(batch); + Assert.NotNull(request.Document); + // Formatted GraphQL will have escaped tab + Assert.Contains("John\\tDoe", request.Document.ToString()); + } + + [Fact] + public void Parse_Query_With_Quote_Escape() + { + // arrange + const string query = "query { user(name: \"John \\\"The Boss\\\" Doe\") { id } }"; + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject(new GraphQLRequestDto(query: query))); + + // act + var batch = Utf8GraphQLRequestParser.Parse(source); + + // assert + var request = Assert.Single(batch); + Assert.NotNull(request.Document); + // ReSharper disable once GrammarMistakeInComment + // The formatted GraphQL will have escaped quotes: \" + Assert.Contains("John \\\"The Boss\\\" Doe", request.Document.ToString()); + } + + [Fact] + public void Parse_Query_With_Backslash_Escape() + { + // arrange + const string query = "query { user(path: \"C:\\\\Users\\\\Admin\") { id } }"; + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject(new GraphQLRequestDto(query: query))); + + // act + var batch = Utf8GraphQLRequestParser.Parse(source); + + // assert + var request = Assert.Single(batch); + Assert.NotNull(request.Document); + // The formatted GraphQL will have escaped backslashes: \\ + Assert.Contains("C:\\\\Users\\\\Admin", request.Document.ToString()); + } + + [Fact] + public void Parse_Query_With_Unicode_Escape() + { + // arrange + const string query = "query { user(name: \"\\u0043\\u006C\\u0061\\u0075\\u0064\\u0065\") { id } }"; + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject(new GraphQLRequestDto(query: query))); + + // act + var batch = Utf8GraphQLRequestParser.Parse(source); + + // assert + var request = Assert.Single(batch); + Assert.NotNull(request.Document); + // \u0043\u006C\u0061\u0075\u0064\u0065 = "Claude" + Assert.Contains("Claude", request.Document.ToString()); + } + + [Fact] + public void Parse_Query_With_Mixed_Escapes() + { + // arrange + const string query = "query { user(data: \"Line1\\nTab\\tQuote\\\"Backslash\\\\Unicode\\u0041\") { id } }"; + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject(new GraphQLRequestDto(query: query))); + + // act + var batch = Utf8GraphQLRequestParser.Parse(source); + + // assert + var request = Assert.Single(batch); + Assert.NotNull(request.Document); + var docString = request.Document.ToString(); + // The formatted GraphQL will have properly escaped special characters + Assert.Contains("Line1\\n", docString); // \n becomes \\n in GraphQL syntax + Assert.Contains("Tab\\t", docString); // \t becomes \\t in GraphQL syntax + Assert.Contains("Quote\\\"", docString); // \" becomes \\\" in GraphQL syntax + Assert.Contains("Backslash\\\\", docString); // \\ becomes \\\\ in GraphQL syntax + Assert.Contains("UnicodeA", docString); // \u0041 = 'A' - actual character + } + + [Fact] + public void Parse_Socket_Message_Missing_Type() + { + // arrange + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject( + new Dictionary + { + { "id", "123" }, + { "payload", new Dictionary { { "query", "{ __typename }" } } } + })); + + // act + var message = Utf8GraphQLSocketMessageParser.ParseMessage(source); + + // assert + Assert.Null(message.Type); + Assert.Equal("123", message.Id); + Assert.False(message.Payload.IsEmpty); + } + + [Fact] + public void Parse_Socket_Message_Missing_Id() + { + // arrange + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject( + new Dictionary + { + { "type", "subscribe" }, + { "payload", new Dictionary { { "query", "{ __typename }" } } } + })); + + // act + var message = Utf8GraphQLSocketMessageParser.ParseMessage(source); + + // assert + Assert.Equal("subscribe", message.Type); + Assert.Null(message.Id); + Assert.False(message.Payload.IsEmpty); + } + + [Fact] + public void Parse_Socket_Message_Missing_Payload() + { + // arrange + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject( + new Dictionary + { + { "type", "connection_ack" }, + { "id", "456" } + })); + + // act + var message = Utf8GraphQLSocketMessageParser.ParseMessage(source); + + // assert + Assert.Equal("connection_ack", message.Type); + Assert.Equal("456", message.Id); + Assert.True(message.Payload.IsEmpty); + } + + [Fact] + public void Parse_Socket_Message_Null_Type() + { + // arrange + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject( + new Dictionary + { + { "type", null }, + { "id", "789" }, + { "payload", new Dictionary { { "query", "{ __typename }" } } } + })); + + // act + var message = Utf8GraphQLSocketMessageParser.ParseMessage(source); + + // assert + Assert.Null(message.Type); + Assert.Equal("789", message.Id); + } + + [Fact] + public void Parse_Socket_Message_Null_Id() + { + // arrange + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject( + new Dictionary + { + { "type", "ping" }, + { "id", null }, + { "payload", new Dictionary { { "query", "{ __typename }" } } } + })); + + // act + var message = Utf8GraphQLSocketMessageParser.ParseMessage(source); + + // assert + Assert.Equal("ping", message.Type); + Assert.Null(message.Id); + } + + [Fact] + public void Parse_Socket_Message_Empty_Payload_Object() + { + // arrange + var source = Encoding.UTF8.GetBytes( + JsonConvert.SerializeObject( + new Dictionary + { + { "type", "complete" }, + { "id", "abc" }, + { "payload", new Dictionary() } + })); + + // act + var message = Utf8GraphQLSocketMessageParser.ParseMessage(source); + + // assert + Assert.Equal("complete", message.Type); + Assert.Equal("abc", message.Id); + Assert.False(message.Payload.IsEmpty); + } + private class GraphQLRequestDto( string query, string? id = null, diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_FullRequest.json b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_FullRequest.json new file mode 100644 index 00000000000..003455bbd56 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_FullRequest.json @@ -0,0 +1,11 @@ +{ + "operationName": null, + "variables": {}, + "extensions": { + "persistedQuery": { + "version": 1, + "sha256Hash": "0f1dbd90e1cf63cc96c4ebb3d0a9813ee387be56bc291704d8b46d68283d0847" + } + }, + "query": "{\n Services {\n id\n name\n domain\n poc\n owner\n description\n tags\n versions {\n notes\n version\n state\n url\n dependencies {\n id\n name\n domain\n poc\n owner\n description\n __typename\n }\n __typename\n }\n __typename\n }\n}\n" +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_QuerySignature_1.json b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_QuerySignature_1.json new file mode 100644 index 00000000000..8eaf194a129 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_QuerySignature_1.json @@ -0,0 +1,10 @@ +{ + "operationName": "MyQuery", + "variables": null, + "extensions": { + "persistedQuery": { + "version": 1, + "sha256Hash": "hashOfQuery" + } + } +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_QuerySignature_2.json b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_QuerySignature_2.json new file mode 100644 index 00000000000..36968bfe16a --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Apollo_AQP_QuerySignature_2.json @@ -0,0 +1,10 @@ +{ + "operationName": null, + "variables": {}, + "extensions": { + "persistedQuery": { + "version": 1, + "sha256Hash": "hashOfQuery" + } + } +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/BlockString.txt b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/BlockString.txt new file mode 100644 index 00000000000..5d88387112f --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/BlockString.txt @@ -0,0 +1,3 @@ + + block string uses \"""""" + block string uses \"""""" diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Float.json b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Float.json new file mode 100644 index 00000000000..650b226bc46 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/Float.json @@ -0,0 +1,8 @@ +{ + "node": { + "a": -5.71, + "b": 8.6E-05, + "c": 933.510417, + "d": 0.08 + } +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/IntrospectionQuery.graphql b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/IntrospectionQuery.graphql new file mode 100644 index 00000000000..5a85fdbd377 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/IntrospectionQuery.graphql @@ -0,0 +1,85 @@ +query IntrospectionQuery { + __schema { + queryType { + name + } + mutationType { + name + } + subscriptionType { + name + } + types { + ...FullType + } + directives { + name + description + args { + ...InputValue + } + onOperation + onFragment + onField + } + } +} + +fragment FullType on __Type { + kind + name + description + fields(includeDeprecated: true) { + name + description + args { + ...InputValue + } + type { + ...TypeRef + } + isDeprecated + deprecationReason + } + inputFields { + ...InputValue + } + interfaces { + ...TypeRef + } + enumValues(includeDeprecated: true) { + name + description + isDeprecated + deprecationReason + } + possibleTypes { + ...TypeRef + } +} + +fragment InputValue on __InputValue { + name + description + type { + ...TypeRef + } + defaultValue +} + +fragment TypeRef on __Type { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + } + } + } +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/QueryWithIntArgument.graphql b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/QueryWithIntArgument.graphql new file mode 100644 index 00000000000..96818bf473a --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/QueryWithIntArgument.graphql @@ -0,0 +1,5 @@ +{ + first: changeTheNumber(newNumber: 1) { + theNumber + } +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/QueryWithStringArg.graphql b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/QueryWithStringArg.graphql new file mode 100644 index 00000000000..575b51803e3 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/QueryWithStringArg.graphql @@ -0,0 +1,17 @@ +{ + customer(id: "Q3VzdG9tZXIteDE=") { + name + consultant { + name + } + contracts { + id + ... on LifeInsuranceContract { + premium + } + ... on SomeOtherContract { + expiryDate + } + } + } +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/SimpleRequest.json b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/SimpleRequest.json new file mode 100644 index 00000000000..d48570f733b --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/SimpleRequest.json @@ -0,0 +1,3 @@ +{ + "query": "{ a { b } }" +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/aliases.graphql b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/aliases.graphql new file mode 100644 index 00000000000..6a9b482ef7e --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/aliases.graphql @@ -0,0 +1 @@ + query queryalias {alias0: __typename, alias1: __typename, alias2: __typename, alias3: __typename, alias4: __typename, alias5: __typename, alias6: __typename, alias7: __typename, alias8: __typename, alias9: __typename, alias10: __typename, alias11: __typename, alias12: __typename, alias13: __typename, alias14: __typename, alias15: __typename, alias16: __typename, alias17: __typename, alias18: __typename, alias19: __typename, alias20: __typename, alias21: __typename, alias22: __typename, alias23: __typename, alias24: __typename, alias25: __typename, alias26: __typename, alias27: __typename, alias28: __typename, alias29: __typename, alias30: __typename, alias31: __typename, alias32: __typename, alias33: __typename, alias34: __typename, alias35: __typename, alias36: __typename, alias37: __typename, alias38: __typename, alias39: __typename, alias40: __typename, alias41: __typename, alias42: __typename, alias43: __typename, alias44: __typename, alias45: __typename, alias46: __typename, alias47: __typename, alias48: __typename, alias49: __typename, alias50: __typename, alias51: __typename, alias52: __typename, alias53: __typename, alias54: __typename, alias55: __typename, alias56: __typename, alias57: __typename, alias58: __typename, alias59: __typename, alias60: __typename, alias61: __typename, alias62: __typename, alias63: __typename, alias64: __typename, alias65: __typename, alias66: __typename, alias67: __typename, alias68: __typename, alias69: __typename, alias70: __typename, alias71: __typename, alias72: __typename, alias73: __typename, alias74: __typename, alias75: __typename, alias76: __typename, alias77: __typename, alias78: __typename, alias79: __typename, alias80: __typename, alias81: __typename, alias82: __typename, alias83: __typename, alias84: __typename, alias85: __typename, alias86: __typename, alias87: __typename, alias88: __typename, alias89: __typename, alias90: __typename, alias91: __typename, alias92: __typename, alias93: __typename, alias94: __typename, alias95: __typename, alias96: __typename, alias97: __typename, alias98: __typename, alias99: __typename, alias100: __typename, alias101: __typename, alias102: __typename, alias103: __typename, alias104: __typename, alias105: __typename, alias106: __typename, alias107: __typename, alias108: __typename, alias109: __typename, alias110: __typename, alias111: __typename, alias112: __typename, alias113: __typename, alias114: __typename, alias115: __typename, alias116: __typename, alias117: __typename, alias118: __typename, alias119: __typename, alias120: __typename, alias121: __typename, alias122: __typename, alias123: __typename, alias124: __typename, alias125: __typename, alias126: __typename, alias127: __typename, alias128: __typename, alias129: __typename, alias130: __typename, alias131: __typename, alias132: __typename, alias133: __typename, alias134: __typename, alias135: __typename, alias136: __typename, alias137: __typename, alias138: __typename, alias139: __typename, alias140: __typename, alias141: __typename, alias142: __typename, alias143: __typename, alias144: __typename, alias145: __typename, alias146: __typename, alias147: __typename, alias148: __typename, alias149: __typename, alias150: __typename, alias151: __typename, alias152: __typename, alias153: __typename, alias154: __typename, alias155: __typename, alias156: __typename, alias157: __typename, alias158: __typename, alias159: __typename, alias160: __typename, alias161: __typename, alias162: __typename, alias163: __typename, alias164: __typename, alias165: __typename, alias166: __typename, alias167: __typename, alias168: __typename, alias169: __typename, alias170: __typename, alias171: __typename, alias172: __typename, alias173: __typename, alias174: __typename, alias175: __typename, alias176: __typename, alias177: __typename, alias178: __typename, alias179: __typename, alias180: __typename, alias181: __typename, alias182: __typename, alias183: __typename, alias184: __typename, alias185: __typename, alias186: __typename, alias187: __typename, alias188: __typename, alias189: __typename, alias190: __typename, alias191: __typename, alias192: __typename, alias193: __typename, alias194: __typename, alias195: __typename, alias196: __typename, alias197: __typename, alias198: __typename, alias199: __typename, alias200: __typename, alias201: __typename, alias202: __typename, alias203: __typename, alias204: __typename, alias205: __typename, alias206: __typename, alias207: __typename, alias208: __typename, alias209: __typename, alias210: __typename, alias211: __typename, alias212: __typename, alias213: __typename, alias214: __typename, alias215: __typename, alias216: __typename, alias217: __typename, alias218: __typename, alias219: __typename, alias220: __typename, alias221: __typename, alias222: __typename, alias223: __typename, alias224: __typename, alias225: __typename, alias226: __typename, alias227: __typename, alias228: __typename, alias229: __typename, alias230: __typename, alias231: __typename, alias232: __typename, alias233: __typename, alias234: __typename, alias235: __typename, alias236: __typename, alias237: __typename, alias238: __typename, alias239: __typename, alias240: __typename, alias241: __typename, alias242: __typename, alias243: __typename, alias244: __typename, alias245: __typename, alias246: __typename, alias247: __typename, alias248: __typename, alias249: __typename, alias250: __typename, alias251: __typename, alias252: __typename, alias253: __typename, alias254: __typename, alias255: __typename, alias256: __typename, alias257: __typename, alias258: __typename, alias259: __typename, alias260: __typename, alias261: __typename, alias262: __typename, alias263: __typename, alias264: __typename, alias265: __typename, alias266: __typename, alias267: __typename, alias268: __typename, alias269: __typename, alias270: __typename, alias271: __typename, alias272: __typename, alias273: __typename, alias274: __typename, alias275: __typename, alias276: __typename, alias277: __typename, alias278: __typename, alias279: __typename, alias280: __typename, alias281: __typename, alias282: __typename, alias283: __typename, alias284: __typename, alias285: __typename, alias286: __typename, alias287: __typename, alias288: __typename, alias289: __typename, alias290: __typename, alias291: __typename, alias292: __typename, alias293: __typename, alias294: __typename, alias295: __typename, alias296: __typename, alias297: __typename, alias298: __typename, alias299: __typename, alias300: __typename, alias301: __typename, alias302: __typename, alias303: __typename, alias304: __typename, alias305: __typename, alias306: __typename, alias307: __typename, alias308: __typename, alias309: __typename, alias310: __typename, alias311: __typename, alias312: __typename, alias313: __typename, alias314: __typename, alias315: __typename, alias316: __typename, alias317: __typename, alias318: __typename, alias319: __typename, alias320: __typename, alias321: __typename, alias322: __typename, alias323: __typename, alias324: __typename, alias325: __typename, alias326: __typename, alias327: __typename, alias328: __typename, alias329: __typename, alias330: __typename, alias331: __typename, alias332: __typename, alias333: __typename, alias334: __typename, alias335: __typename, alias336: __typename, alias337: __typename, alias338: __typename, alias339: __typename, alias340: __typename, alias341: __typename, alias342: __typename, alias343: __typename, alias344: __typename, alias345: __typename, alias346: __typename, alias347: __typename, alias348: __typename, alias349: __typename, alias350: __typename, alias351: __typename, alias352: __typename, alias353: __typename, alias354: __typename, alias355: __typename, alias356: __typename, alias357: __typename, alias358: __typename, alias359: __typename, alias360: __typename, alias361: __typename, alias362: __typename, alias363: __typename, alias364: __typename, alias365: __typename, alias366: __typename, alias367: __typename, alias368: __typename, alias369: __typename, alias370: __typename, alias371: __typename, alias372: __typename, alias373: __typename, alias374: __typename, alias375: __typename, alias376: __typename, alias377: __typename, alias378: __typename, alias379: __typename, alias380: __typename, alias381: __typename, alias382: __typename, alias383: __typename, alias384: __typename, alias385: __typename, alias386: __typename, alias387: __typename, alias388: __typename, alias389: __typename, alias390: __typename, alias391: __typename, alias392: __typename, alias393: __typename, alias394: __typename, alias395: __typename, alias396: __typename, alias397: __typename, alias398: __typename, alias399: __typename, alias400: __typename, alias401: __typename, alias402: __typename, alias403: __typename, alias404: __typename, alias405: __typename, alias406: __typename, alias407: __typename, alias408: __typename, alias409: __typename, alias410: __typename, alias411: __typename, alias412: __typename, alias413: __typename, alias414: __typename, alias415: __typename, alias416: __typename, alias417: __typename, alias418: __typename, alias419: __typename, alias420: __typename, alias421: __typename, alias422: __typename, alias423: __typename, alias424: __typename, alias425: __typename, alias426: __typename, alias427: __typename, alias428: __typename, alias429: __typename, alias430: __typename, alias431: __typename, alias432: __typename, alias433: __typename, alias434: __typename, alias435: __typename, alias436: __typename, alias437: __typename, alias438: __typename, alias439: __typename, alias440: __typename, alias441: __typename, alias442: __typename, alias443: __typename, alias444: __typename, alias445: __typename, alias446: __typename, alias447: __typename, alias448: __typename, alias449: __typename, alias450: __typename, alias451: __typename, alias452: __typename, alias453: __typename, alias454: __typename, alias455: __typename, alias456: __typename, alias457: __typename, alias458: __typename, alias459: __typename, alias460: __typename, alias461: __typename, alias462: __typename, alias463: __typename, alias464: __typename, alias465: __typename, alias466: __typename, alias467: __typename, alias468: __typename, alias469: __typename, alias470: __typename, alias471: __typename, alias472: __typename, alias473: __typename, alias474: __typename, alias475: __typename, alias476: __typename, alias477: __typename, alias478: __typename, alias479: __typename, alias480: __typename, alias481: __typename, alias482: __typename, alias483: __typename, alias484: __typename, alias485: __typename, alias486: __typename, alias487: __typename, alias488: __typename, alias489: __typename, alias490: __typename, alias491: __typename, alias492: __typename, alias493: __typename, alias494: __typename, alias495: __typename, alias496: __typename, alias497: __typename, alias498: __typename, alias499: __typename, alias500: __typename, alias501: __typename, alias502: __typename, alias503: __typename, alias504: __typename, alias505: __typename, alias506: __typename, alias507: __typename, alias508: __typename, alias509: __typename, alias510: __typename, alias511: __typename, alias512: __typename, alias513: __typename, alias514: __typename, alias515: __typename, alias516: __typename, alias517: __typename, alias518: __typename, alias519: __typename, alias520: __typename, alias521: __typename, alias522: __typename, alias523: __typename, alias524: __typename, alias525: __typename, alias526: __typename, alias527: __typename, alias528: __typename, alias529: __typename, alias530: __typename, alias531: __typename, alias532: __typename, alias533: __typename, alias534: __typename, alias535: __typename, alias536: __typename, alias537: __typename, alias538: __typename, alias539: __typename, alias540: __typename, alias541: __typename, alias542: __typename, alias543: __typename, alias544: __typename, alias545: __typename, alias546: __typename, alias547: __typename, alias548: __typename, alias549: __typename, alias550: __typename, alias551: __typename, alias552: __typename, alias553: __typename, alias554: __typename, alias555: __typename, alias556: __typename, alias557: __typename, alias558: __typename, alias559: __typename, alias560: __typename, alias561: __typename, alias562: __typename, alias563: __typename, alias564: __typename, alias565: __typename, alias566: __typename, alias567: __typename, alias568: __typename, alias569: __typename, alias570: __typename, alias571: __typename, alias572: __typename, alias573: __typename, alias574: __typename, alias575: __typename, alias576: __typename, alias577: __typename, alias578: __typename, alias579: __typename, alias580: __typename, alias581: __typename, alias582: __typename, alias583: __typename, alias584: __typename, alias585: __typename, alias586: __typename, alias587: __typename, alias588: __typename, alias589: __typename, alias590: __typename, alias591: __typename, alias592: __typename, alias593: __typename, alias594: __typename, alias595: __typename, alias596: __typename, alias597: __typename, alias598: __typename, alias599: __typename, alias600: __typename, alias601: __typename, alias602: __typename, alias603: __typename, alias604: __typename, alias605: __typename, alias606: __typename, alias607: __typename, alias608: __typename, alias609: __typename, alias610: __typename, alias611: __typename, alias612: __typename, alias613: __typename, alias614: __typename, alias615: __typename, alias616: __typename, alias617: __typename, alias618: __typename, alias619: __typename, alias620: __typename, alias621: __typename, alias622: __typename, alias623: __typename, alias624: __typename, alias625: __typename, alias626: __typename, alias627: __typename, alias628: __typename, alias629: __typename, alias630: __typename, alias631: __typename, alias632: __typename, alias633: __typename, alias634: __typename, alias635: __typename, alias636: __typename, alias637: __typename, alias638: __typename, alias639: __typename, alias640: __typename, alias641: __typename, alias642: __typename, alias643: __typename, alias644: __typename, alias645: __typename, alias646: __typename, alias647: __typename, alias648: __typename, alias649: __typename, alias650: __typename, alias651: __typename, alias652: __typename, alias653: __typename, alias654: __typename, alias655: __typename, alias656: __typename, alias657: __typename, alias658: __typename, alias659: __typename, alias660: __typename, alias661: __typename, alias662: __typename, alias663: __typename, alias664: __typename, alias665: __typename, alias666: __typename, alias667: __typename, alias668: __typename, alias669: __typename, alias670: __typename, alias671: __typename, alias672: __typename, alias673: __typename, alias674: __typename, alias675: __typename, alias676: __typename, alias677: __typename, alias678: __typename, alias679: __typename, alias680: __typename, alias681: __typename, alias682: __typename, alias683: __typename, alias684: __typename, alias685: __typename, alias686: __typename, alias687: __typename, alias688: __typename, alias689: __typename, alias690: __typename, alias691: __typename, alias692: __typename, alias693: __typename, alias694: __typename, alias695: __typename, alias696: __typename, alias697: __typename, alias698: __typename, alias699: __typename, alias700: __typename, alias701: __typename, alias702: __typename, alias703: __typename, alias704: __typename, alias705: __typename, alias706: __typename, alias707: __typename, alias708: __typename, alias709: __typename, alias710: __typename, alias711: __typename, alias712: __typename, alias713: __typename, alias714: __typename, alias715: __typename, alias716: __typename, alias717: __typename, alias718: __typename, alias719: __typename, alias720: __typename, alias721: __typename, alias722: __typename, alias723: __typename, alias724: __typename, alias725: __typename, alias726: __typename, alias727: __typename, alias728: __typename, alias729: __typename, alias730: __typename, alias731: __typename, alias732: __typename, alias733: __typename, alias734: __typename, alias735: __typename, alias736: __typename, alias737: __typename, alias738: __typename, alias739: __typename, alias740: __typename, alias741: __typename, alias742: __typename, alias743: __typename, alias744: __typename, alias745: __typename, alias746: __typename, alias747: __typename, alias748: __typename, alias749: __typename, alias750: __typename, alias751: __typename, alias752: __typename, alias753: __typename, alias754: __typename, alias755: __typename, alias756: __typename, alias757: __typename, alias758: __typename, alias759: __typename, alias760: __typename, alias761: __typename, alias762: __typename, alias763: __typename, alias764: __typename, alias765: __typename, alias766: __typename, alias767: __typename, alias768: __typename, alias769: __typename, alias770: __typename, alias771: __typename, alias772: __typename, alias773: __typename, alias774: __typename, alias775: __typename, alias776: __typename, alias777: __typename, alias778: __typename, alias779: __typename, alias780: __typename, alias781: __typename, alias782: __typename, alias783: __typename, alias784: __typename, alias785: __typename, alias786: __typename, alias787: __typename, alias788: __typename, alias789: __typename, alias790: __typename, alias791: __typename, alias792: __typename, alias793: __typename, alias794: __typename, alias795: __typename, alias796: __typename, alias797: __typename, alias798: __typename, alias799: __typename, alias800: __typename, alias801: __typename, alias802: __typename, alias803: __typename, alias804: __typename, alias805: __typename, alias806: __typename, alias807: __typename, alias808: __typename, alias809: __typename, alias810: __typename, alias811: __typename, alias812: __typename, alias813: __typename, alias814: __typename, alias815: __typename, alias816: __typename, alias817: __typename, alias818: __typename, alias819: __typename, alias820: __typename, alias821: __typename, alias822: __typename, alias823: __typename, alias824: __typename, alias825: __typename, alias826: __typename, alias827: __typename, alias828: __typename, alias829: __typename, alias830: __typename, alias831: __typename, alias832: __typename, alias833: __typename, alias834: __typename, alias835: __typename, alias836: __typename, alias837: __typename, alias838: __typename, alias839: __typename, alias840: __typename, alias841: __typename, alias842: __typename, alias843: __typename, alias844: __typename, alias845: __typename, alias846: __typename, alias847: __typename, alias848: __typename, alias849: __typename, alias850: __typename, alias851: __typename, alias852: __typename, alias853: __typename, alias854: __typename, alias855: __typename, alias856: __typename, alias857: __typename, alias858: __typename, alias859: __typename, alias860: __typename, alias861: __typename, alias862: __typename, alias863: __typename, alias864: __typename, alias865: __typename, alias866: __typename, alias867: __typename, alias868: __typename, alias869: __typename, alias870: __typename, alias871: __typename, alias872: __typename, alias873: __typename, alias874: __typename, alias875: __typename, alias876: __typename, alias877: __typename, alias878: __typename, alias879: __typename, alias880: __typename, alias881: __typename, alias882: __typename, alias883: __typename, alias884: __typename, alias885: __typename, alias886: __typename, alias887: __typename, alias888: __typename, alias889: __typename, alias890: __typename, alias891: __typename, alias892: __typename, alias893: __typename, alias894: __typename, alias895: __typename, alias896: __typename, alias897: __typename, alias898: __typename, alias899: __typename, alias900: __typename, alias901: __typename, alias902: __typename, alias903: __typename, alias904: __typename, alias905: __typename, alias906: __typename, alias907: __typename, alias908: __typename, alias909: __typename, alias910: __typename, alias911: __typename, alias912: __typename, alias913: __typename, alias914: __typename, alias915: __typename, alias916: __typename, alias917: __typename, alias918: __typename, alias919: __typename, alias920: __typename, alias921: __typename, alias922: __typename, alias923: __typename, alias924: __typename, alias925: __typename, alias926: __typename, alias927: __typename, alias928: __typename, alias929: __typename, alias930: __typename, alias931: __typename, alias932: __typename, alias933: __typename, alias934: __typename, alias935: __typename, alias936: __typename, alias937: __typename, alias938: __typename, alias939: __typename, alias940: __typename, alias941: __typename, alias942: __typename, alias943: __typename, alias944: __typename, alias945: __typename, alias946: __typename, alias947: __typename, alias948: __typename, alias949: __typename, alias950: __typename, alias951: __typename, alias952: __typename, alias953: __typename, alias954: __typename, alias955: __typename, alias956: __typename, alias957: __typename, alias958: __typename, alias959: __typename, alias960: __typename, alias961: __typename, alias962: __typename, alias963: __typename, alias964: __typename, alias965: __typename, alias966: __typename, alias967: __typename, alias968: __typename, alias969: __typename, alias970: __typename, alias971: __typename, alias972: __typename, alias973: __typename, alias974: __typename, alias975: __typename, alias976: __typename, alias977: __typename, alias978: __typename, alias979: __typename, alias980: __typename, alias981: __typename, alias982: __typename, alias983: __typename, alias984: __typename, alias985: __typename, alias986: __typename, alias987: __typename, alias988: __typename, alias989: __typename, alias990: __typename, alias991: __typename, alias992: __typename, alias993: __typename, alias994: __typename, alias995: __typename, alias996: __typename, alias997: __typename, alias998: __typename, alias999: __typename, alias1000: __typename, alias1001: __typename, alias1002: __typename, alias1003: __typename, alias1004: __typename, alias1005: __typename, alias1006: __typename, alias1007: __typename, alias1008: __typename, alias1009: __typename, alias1010: __typename, alias1011: __typename, alias1012: __typename, alias1013: __typename, alias1014: __typename, alias1015: __typename, alias1016: __typename, alias1017: __typename, alias1018: __typename, alias1019: __typename, alias1020: __typename, alias1021: __typename, alias1022: __typename, alias1023: __typename, alias1024: __typename, alias1025: __typename, alias1026: __typename, alias1027: __typename, alias1028: __typename, alias1029: __typename, alias1030: __typename, alias1031: __typename, alias1032: __typename, alias1033: __typename, alias1034: __typename, alias1035: __typename, alias1036: __typename, alias1037: __typename, alias1038: __typename, alias1039: __typename, alias1040: __typename, alias1041: __typename, alias1042: __typename, alias1043: __typename, alias1044: __typename, alias1045: __typename, alias1046: __typename, alias1047: __typename, alias1048: __typename, alias1049: __typename, alias1050: __typename, alias1051: __typename, alias1052: __typename, alias1053: __typename, alias1054: __typename, alias1055: __typename, alias1056: __typename, alias1057: __typename, alias1058: __typename, alias1059: __typename, alias1060: __typename, alias1061: __typename, alias1062: __typename, alias1063: __typename, alias1064: __typename, alias1065: __typename, alias1066: __typename, alias1067: __typename, alias1068: __typename, alias1069: __typename, alias1070: __typename, alias1071: __typename, alias1072: __typename, alias1073: __typename, alias1074: __typename, alias1075: __typename, alias1076: __typename, alias1077: __typename, alias1078: __typename, alias1079: __typename, alias1080: __typename, alias1081: __typename, alias1082: __typename, alias1083: __typename, alias1084: __typename, alias1085: __typename, alias1086: __typename, alias1087: __typename, alias1088: __typename, alias1089: __typename, alias1090: __typename, alias1091: __typename, alias1092: __typename, alias1093: __typename, alias1094: __typename, alias1095: __typename, alias1096: __typename, alias1097: __typename, alias1098: __typename, alias1099: __typename, alias1100: __typename, alias1101: __typename, alias1102: __typename, alias1103: __typename, alias1104: __typename, alias1105: __typename, alias1106: __typename, alias1107: __typename, alias1108: __typename, alias1109: __typename, alias1110: __typename, alias1111: __typename, alias1112: __typename, alias1113: __typename, alias1114: __typename, alias1115: __typename, alias1116: __typename, alias1117: __typename, alias1118: __typename, alias1119: __typename, alias1120: __typename, alias1121: __typename, alias1122: __typename, alias1123: __typename, alias1124: __typename, alias1125: __typename, alias1126: __typename, alias1127: __typename, alias1128: __typename, alias1129: __typename, alias1130: __typename, alias1131: __typename, alias1132: __typename, alias1133: __typename, alias1134: __typename, alias1135: __typename, alias1136: __typename, alias1137: __typename, alias1138: __typename, alias1139: __typename, alias1140: __typename, alias1141: __typename, alias1142: __typename, alias1143: __typename, alias1144: __typename, alias1145: __typename, alias1146: __typename, alias1147: __typename, alias1148: __typename, alias1149: __typename, alias1150: __typename, alias1151: __typename, alias1152: __typename, alias1153: __typename, alias1154: __typename, alias1155: __typename, alias1156: __typename, alias1157: __typename, alias1158: __typename, alias1159: __typename, alias1160: __typename, alias1161: __typename, alias1162: __typename, alias1163: __typename, alias1164: __typename, alias1165: __typename, alias1166: __typename, alias1167: __typename, alias1168: __typename, alias1169: __typename, alias1170: __typename, alias1171: __typename, alias1172: __typename, alias1173: __typename, alias1174: __typename, alias1175: __typename, alias1176: __typename, alias1177: __typename, alias1178: __typename, alias1179: __typename, alias1180: __typename, alias1181: __typename, alias1182: __typename, alias1183: __typename, alias1184: __typename, alias1185: __typename, alias1186: __typename, alias1187: __typename, alias1188: __typename, alias1189: __typename, alias1190: __typename, alias1191: __typename, alias1192: __typename, alias1193: __typename, alias1194: __typename, alias1195: __typename, alias1196: __typename, alias1197: __typename, alias1198: __typename, alias1199: __typename, alias1200: __typename, alias1201: __typename, alias1202: __typename, alias1203: __typename, alias1204: __typename, alias1205: __typename, alias1206: __typename, alias1207: __typename, alias1208: __typename, alias1209: __typename, alias1210: __typename, alias1211: __typename, alias1212: __typename, alias1213: __typename, alias1214: __typename, alias1215: __typename, alias1216: __typename, alias1217: __typename, alias1218: __typename, alias1219: __typename, alias1220: __typename, alias1221: __typename, alias1222: __typename, alias1223: __typename, alias1224: __typename, alias1225: __typename, alias1226: __typename, alias1227: __typename, alias1228: __typename, alias1229: __typename, alias1230: __typename, alias1231: __typename, alias1232: __typename, alias1233: __typename, alias1234: __typename, alias1235: __typename, alias1236: __typename, alias1237: __typename, alias1238: __typename, alias1239: __typename, alias1240: __typename, alias1241: __typename, alias1242: __typename, alias1243: __typename, alias1244: __typename, alias1245: __typename, alias1246: __typename, alias1247: __typename, alias1248: __typename, alias1249: __typename, alias1250: __typename, alias1251: __typename, alias1252: __typename, alias1253: __typename, alias1254: __typename, alias1255: __typename, alias1256: __typename, alias1257: __typename, alias1258: __typename, alias1259: __typename, alias1260: __typename, alias1261: __typename, alias1262: __typename, alias1263: __typename, alias1264: __typename, alias1265: __typename, alias1266: __typename, alias1267: __typename, alias1268: __typename, alias1269: __typename, alias1270: __typename, alias1271: __typename, alias1272: __typename, alias1273: __typename, alias1274: __typename, alias1275: __typename, alias1276: __typename, alias1277: __typename, alias1278: __typename, alias1279: __typename, alias1280: __typename, alias1281: __typename, alias1282: __typename, alias1283: __typename, alias1284: __typename, alias1285: __typename, alias1286: __typename, alias1287: __typename, alias1288: __typename, alias1289: __typename, alias1290: __typename, alias1291: __typename, alias1292: __typename, alias1293: __typename, alias1294: __typename, alias1295: __typename, alias1296: __typename, alias1297: __typename, alias1298: __typename, alias1299: __typename, alias1300: __typename, alias1301: __typename, alias1302: __typename, alias1303: __typename, alias1304: __typename, alias1305: __typename, alias1306: __typename, alias1307: __typename, alias1308: __typename, alias1309: __typename, alias1310: __typename, alias1311: __typename, alias1312: __typename, alias1313: __typename, alias1314: __typename, alias1315: __typename, alias1316: __typename, alias1317: __typename, alias1318: __typename, alias1319: __typename, alias1320: __typename, alias1321: __typename, alias1322: __typename, alias1323: __typename, alias1324: __typename, alias1325: __typename, alias1326: __typename, alias1327: __typename, alias1328: __typename, alias1329: __typename, alias1330: __typename, alias1331: __typename, alias1332: __typename, alias1333: __typename, alias1334: __typename, alias1335: __typename, alias1336: __typename, alias1337: __typename, alias1338: __typename, alias1339: __typename, alias1340: __typename, alias1341: __typename, alias1342: __typename, alias1343: __typename, alias1344: __typename, alias1345: __typename, alias1346: __typename, alias1347: __typename, alias1348: __typename, alias1349: __typename, alias1350: __typename, alias1351: __typename, alias1352: __typename, alias1353: __typename, alias1354: __typename, alias1355: __typename, alias1356: __typename, alias1357: __typename, alias1358: __typename, alias1359: __typename, alias1360: __typename, alias1361: __typename, alias1362: __typename, alias1363: __typename, alias1364: __typename, alias1365: __typename, alias1366: __typename, alias1367: __typename, alias1368: __typename, alias1369: __typename, alias1370: __typename, alias1371: __typename, alias1372: __typename, alias1373: __typename, alias1374: __typename, alias1375: __typename, alias1376: __typename, alias1377: __typename, alias1378: __typename, alias1379: __typename, alias1380: __typename, alias1381: __typename, alias1382: __typename, alias1383: __typename, alias1384: __typename, alias1385: __typename, alias1386: __typename, alias1387: __typename, alias1388: __typename, alias1389: __typename, alias1390: __typename, alias1391: __typename, alias1392: __typename, alias1393: __typename, alias1394: __typename, alias1395: __typename, alias1396: __typename, alias1397: __typename, alias1398: __typename, alias1399: __typename, alias1400: __typename, alias1401: __typename, alias1402: __typename, alias1403: __typename, alias1404: __typename, alias1405: __typename, alias1406: __typename, alias1407: __typename, alias1408: __typename, alias1409: __typename, alias1410: __typename, alias1411: __typename, alias1412: __typename, alias1413: __typename, alias1414: __typename, alias1415: __typename, alias1416: __typename, alias1417: __typename, alias1418: __typename, alias1419: __typename, alias1420: __typename, alias1421: __typename, alias1422: __typename, alias1423: __typename, alias1424: __typename, alias1425: __typename, alias1426: __typename, alias1427: __typename, alias1428: __typename, alias1429: __typename, alias1430: __typename, alias1431: __typename, alias1432: __typename, alias1433: __typename, alias1434: __typename, alias1435: __typename, alias1436: __typename, alias1437: __typename, alias1438: __typename, alias1439: __typename, alias1440: __typename, alias1441: __typename, alias1442: __typename, alias1443: __typename, alias1444: __typename, alias1445: __typename, alias1446: __typename, alias1447: __typename, alias1448: __typename, alias1449: __typename, alias1450: __typename, alias1451: __typename, alias1452: __typename, alias1453: __typename, alias1454: __typename, alias1455: __typename, alias1456: __typename, alias1457: __typename, alias1458: __typename, alias1459: __typename, alias1460: __typename, alias1461: __typename, alias1462: __typename, alias1463: __typename, alias1464: __typename, alias1465: __typename, alias1466: __typename, alias1467: __typename, alias1468: __typename, alias1469: __typename, alias1470: __typename, alias1471: __typename, alias1472: __typename, alias1473: __typename, alias1474: __typename, alias1475: __typename, alias1476: __typename, alias1477: __typename, alias1478: __typename, alias1479: __typename, alias1480: __typename, alias1481: __typename, alias1482: __typename, alias1483: __typename, alias1484: __typename, alias1485: __typename, alias1486: __typename, alias1487: __typename, alias1488: __typename, alias1489: __typename, alias1490: __typename, alias1491: __typename, alias1492: __typename, alias1493: __typename, alias1494: __typename, alias1495: __typename, alias1496: __typename, alias1497: __typename, alias1498: __typename, alias1499: __typename, alias1500: __typename, alias1501: __typename, alias1502: __typename, alias1503: __typename, alias1504: __typename, alias1505: __typename, alias1506: __typename, alias1507: __typename, alias1508: __typename, alias1509: __typename, alias1510: __typename, alias1511: __typename, alias1512: __typename, alias1513: __typename, alias1514: __typename, alias1515: __typename, alias1516: __typename, alias1517: __typename, alias1518: __typename, alias1519: __typename, alias1520: __typename, alias1521: __typename, alias1522: __typename, alias1523: __typename, alias1524: __typename, alias1525: __typename, alias1526: __typename, alias1527: __typename, alias1528: __typename, alias1529: __typename, alias1530: __typename, alias1531: __typename, alias1532: __typename, alias1533: __typename, alias1534: __typename, alias1535: __typename, alias1536: __typename, alias1537: __typename, alias1538: __typename, alias1539: __typename, alias1540: __typename, alias1541: __typename, alias1542: __typename, alias1543: __typename, alias1544: __typename, alias1545: __typename, alias1546: __typename, alias1547: __typename, alias1548: __typename, alias1549: __typename, alias1550: __typename, alias1551: __typename, alias1552: __typename, alias1553: __typename, alias1554: __typename, alias1555: __typename, alias1556: __typename, alias1557: __typename, alias1558: __typename, alias1559: __typename, alias1560: __typename, alias1561: __typename, alias1562: __typename, alias1563: __typename, alias1564: __typename, alias1565: __typename, alias1566: __typename, alias1567: __typename, alias1568: __typename, alias1569: __typename, alias1570: __typename, alias1571: __typename, alias1572: __typename, alias1573: __typename, alias1574: __typename, alias1575: __typename, alias1576: __typename, alias1577: __typename, alias1578: __typename, alias1579: __typename, alias1580: __typename, alias1581: __typename, alias1582: __typename, alias1583: __typename, alias1584: __typename, alias1585: __typename, alias1586: __typename, alias1587: __typename, alias1588: __typename, alias1589: __typename, alias1590: __typename, alias1591: __typename, alias1592: __typename, alias1593: __typename, alias1594: __typename, alias1595: __typename, alias1596: __typename, alias1597: __typename, alias1598: __typename, alias1599: __typename, alias1600: __typename, alias1601: __typename, alias1602: __typename, alias1603: __typename, alias1604: __typename, alias1605: __typename, alias1606: __typename, alias1607: __typename, alias1608: __typename, alias1609: __typename, alias1610: __typename, alias1611: __typename, alias1612: __typename, alias1613: __typename, alias1614: __typename, alias1615: __typename, alias1616: __typename, alias1617: __typename, alias1618: __typename, alias1619: __typename, alias1620: __typename, alias1621: __typename, alias1622: __typename, alias1623: __typename, alias1624: __typename, alias1625: __typename, alias1626: __typename, alias1627: __typename, alias1628: __typename, alias1629: __typename, alias1630: __typename, alias1631: __typename, alias1632: __typename, alias1633: __typename, alias1634: __typename, alias1635: __typename, alias1636: __typename, alias1637: __typename, alias1638: __typename, alias1639: __typename, alias1640: __typename, alias1641: __typename, alias1642: __typename, alias1643: __typename, alias1644: __typename, alias1645: __typename, alias1646: __typename, alias1647: __typename, alias1648: __typename, alias1649: __typename, alias1650: __typename, alias1651: __typename, alias1652: __typename, alias1653: __typename, alias1654: __typename, alias1655: __typename, alias1656: __typename, alias1657: __typename, alias1658: __typename, alias1659: __typename, alias1660: __typename, alias1661: __typename, alias1662: __typename, alias1663: __typename, alias1664: __typename, alias1665: __typename, alias1666: __typename, alias1667: __typename, alias1668: __typename, alias1669: __typename, alias1670: __typename, alias1671: __typename, alias1672: __typename, alias1673: __typename, alias1674: __typename, alias1675: __typename, alias1676: __typename, alias1677: __typename, alias1678: __typename, alias1679: __typename, alias1680: __typename, alias1681: __typename, alias1682: __typename, alias1683: __typename, alias1684: __typename, alias1685: __typename, alias1686: __typename, alias1687: __typename, alias1688: __typename, alias1689: __typename, alias1690: __typename, alias1691: __typename, alias1692: __typename, alias1693: __typename, alias1694: __typename, alias1695: __typename, alias1696: __typename, alias1697: __typename, alias1698: __typename, alias1699: __typename, alias1700: __typename, alias1701: __typename, alias1702: __typename, alias1703: __typename, alias1704: __typename, alias1705: __typename, alias1706: __typename, alias1707: __typename, alias1708: __typename, alias1709: __typename, alias1710: __typename, alias1711: __typename, alias1712: __typename, alias1713: __typename, alias1714: __typename, alias1715: __typename, alias1716: __typename, alias1717: __typename, alias1718: __typename, alias1719: __typename, alias1720: __typename, alias1721: __typename, alias1722: __typename, alias1723: __typename, alias1724: __typename, alias1725: __typename, alias1726: __typename, alias1727: __typename, alias1728: __typename, alias1729: __typename, alias1730: __typename, alias1731: __typename, alias1732: __typename, alias1733: __typename, alias1734: __typename, alias1735: __typename, alias1736: __typename, alias1737: __typename, alias1738: __typename, alias1739: __typename, alias1740: __typename, alias1741: __typename, alias1742: __typename, alias1743: __typename, alias1744: __typename, alias1745: __typename, alias1746: __typename, alias1747: __typename, alias1748: __typename, alias1749: __typename, alias1750: __typename, alias1751: __typename, alias1752: __typename, alias1753: __typename, alias1754: __typename, alias1755: __typename, alias1756: __typename, alias1757: __typename, alias1758: __typename, alias1759: __typename, alias1760: __typename, alias1761: __typename, alias1762: __typename, alias1763: __typename, alias1764: __typename, alias1765: __typename, alias1766: __typename, alias1767: __typename, alias1768: __typename, alias1769: __typename, alias1770: __typename, alias1771: __typename, alias1772: __typename, alias1773: __typename, alias1774: __typename, alias1775: __typename, alias1776: __typename, alias1777: __typename, alias1778: __typename, alias1779: __typename, alias1780: __typename, alias1781: __typename, alias1782: __typename, alias1783: __typename, alias1784: __typename, alias1785: __typename, alias1786: __typename, alias1787: __typename, alias1788: __typename, alias1789: __typename, alias1790: __typename, alias1791: __typename, alias1792: __typename, alias1793: __typename, alias1794: __typename, alias1795: __typename, alias1796: __typename, alias1797: __typename, alias1798: __typename, alias1799: __typename, alias1800: __typename, alias1801: __typename, alias1802: __typename, alias1803: __typename, alias1804: __typename, alias1805: __typename, alias1806: __typename, alias1807: __typename, alias1808: __typename, alias1809: __typename, alias1810: __typename, alias1811: __typename, alias1812: __typename, alias1813: __typename, alias1814: __typename, alias1815: __typename, alias1816: __typename, alias1817: __typename, alias1818: __typename, alias1819: __typename, alias1820: __typename, alias1821: __typename, alias1822: __typename, alias1823: __typename, alias1824: __typename, alias1825: __typename, alias1826: __typename, alias1827: __typename, alias1828: __typename, alias1829: __typename, alias1830: __typename, alias1831: __typename, alias1832: __typename, alias1833: __typename, alias1834: __typename, alias1835: __typename, alias1836: __typename, alias1837: __typename, alias1838: __typename, alias1839: __typename, alias1840: __typename, alias1841: __typename, alias1842: __typename, alias1843: __typename, alias1844: __typename, alias1845: __typename, alias1846: __typename, alias1847: __typename, alias1848: __typename, alias1849: __typename, alias1850: __typename, alias1851: __typename, alias1852: __typename, alias1853: __typename, alias1854: __typename, alias1855: __typename, alias1856: __typename, alias1857: __typename, alias1858: __typename, alias1859: __typename, alias1860: __typename, alias1861: __typename, alias1862: __typename, alias1863: __typename, alias1864: __typename, alias1865: __typename, alias1866: __typename, alias1867: __typename, alias1868: __typename, alias1869: __typename, alias1870: __typename, alias1871: __typename, alias1872: __typename, alias1873: __typename, alias1874: __typename, alias1875: __typename, alias1876: __typename, alias1877: __typename, alias1878: __typename, alias1879: __typename, alias1880: __typename, alias1881: __typename, alias1882: __typename, alias1883: __typename, alias1884: __typename, alias1885: __typename, alias1886: __typename, alias1887: __typename, alias1888: __typename, alias1889: __typename, alias1890: __typename, alias1891: __typename, alias1892: __typename, alias1893: __typename, alias1894: __typename, alias1895: __typename, alias1896: __typename, alias1897: __typename, alias1898: __typename, alias1899: __typename, alias1900: __typename, alias1901: __typename, alias1902: __typename, alias1903: __typename, alias1904: __typename, alias1905: __typename, alias1906: __typename, alias1907: __typename, alias1908: __typename, alias1909: __typename, alias1910: __typename, alias1911: __typename, alias1912: __typename, alias1913: __typename, alias1914: __typename, alias1915: __typename, alias1916: __typename, alias1917: __typename, alias1918: __typename, alias1919: __typename, alias1920: __typename, alias1921: __typename, alias1922: __typename, alias1923: __typename, alias1924: __typename, alias1925: __typename, alias1926: __typename, alias1927: __typename, alias1928: __typename, alias1929: __typename, alias1930: __typename, alias1931: __typename, alias1932: __typename, alias1933: __typename, alias1934: __typename, alias1935: __typename, alias1936: __typename, alias1937: __typename, alias1938: __typename, alias1939: __typename, alias1940: __typename, alias1941: __typename, alias1942: __typename, alias1943: __typename, alias1944: __typename, alias1945: __typename, alias1946: __typename, alias1947: __typename, alias1948: __typename, alias1949: __typename, alias1950: __typename, alias1951: __typename, alias1952: __typename, alias1953: __typename, alias1954: __typename, alias1955: __typename, alias1956: __typename, alias1957: __typename, alias1958: __typename, alias1959: __typename, alias1960: __typename, alias1961: __typename, alias1962: __typename, alias1963: __typename, alias1964: __typename, alias1965: __typename, alias1966: __typename, alias1967: __typename, alias1968: __typename, alias1969: __typename, alias1970: __typename, alias1971: __typename, alias1972: __typename, alias1973: __typename, alias1974: __typename, alias1975: __typename, alias1976: __typename, alias1977: __typename, alias1978: __typename, alias1979: __typename, alias1980: __typename, alias1981: __typename, alias1982: __typename, alias1983: __typename, alias1984: __typename, alias1985: __typename, alias1986: __typename, alias1987: __typename, alias1988: __typename, alias1989: __typename, alias1990: __typename, alias1991: __typename, alias1992: __typename, alias1993: __typename, alias1994: __typename, alias1995: __typename, alias1996: __typename, alias1997: __typename, alias1998: __typename, alias1999: __typename, alias2000: __typename, alias2001: __typename, alias2002: __typename, alias2003: __typename, alias2004: __typename, alias2005: __typename, alias2006: __typename, alias2007: __typename, alias2008: __typename, alias2009: __typename, alias2010: __typename, alias2011: __typename, alias2012: __typename, alias2013: __typename, alias2014: __typename, alias2015: __typename, alias2016: __typename, alias2017: __typename, alias2018: __typename, alias2019: __typename, alias2020: __typename, alias2021: __typename, alias2022: __typename, alias2023: __typename, alias2024: __typename, alias2025: __typename, alias2026: __typename, alias2027: __typename, alias2028: __typename, alias2029: __typename, alias2030: __typename, alias2031: __typename, alias2032: __typename, alias2033: __typename, alias2034: __typename, alias2035: __typename, alias2036: __typename, alias2037: __typename, alias2038: __typename, alias2039: __typename, alias2040: __typename, alias2041: __typename, alias2042: __typename, alias2043: __typename, alias2044: __typename, alias2045: __typename, alias2046: __typename, alias2047: __typename, alias2048: __typename, alias2049: __typename, alias2050: __typename, alias2051: __typename, alias2052: __typename, alias2053: __typename, alias2054: __typename, alias2055: __typename, alias2056: __typename, alias2057: __typename, alias2058: __typename, alias2059: __typename, alias2060: __typename, alias2061: __typename, alias2062: __typename, alias2063: __typename, alias2064: __typename, alias2065: __typename, alias2066: __typename, alias2067: __typename, alias2068: __typename, alias2069: __typename, alias2070: __typename, alias2071: __typename, alias2072: __typename, alias2073: __typename, alias2074: __typename, alias2075: __typename, alias2076: __typename, alias2077: __typename, alias2078: __typename, alias2079: __typename, alias2080: __typename, alias2081: __typename, alias2082: __typename, alias2083: __typename, alias2084: __typename, alias2085: __typename, alias2086: __typename, alias2087: __typename, alias2088: __typename, alias2089: __typename, alias2090: __typename, alias2091: __typename, alias2092: __typename, alias2093: __typename, alias2094: __typename, alias2095: __typename, alias2096: __typename, alias2097: __typename, alias2098: __typename, alias2099: __typename, alias2100: __typename, alias2101: __typename, alias2102: __typename, alias2103: __typename, alias2104: __typename, alias2105: __typename, alias2106: __typename, alias2107: __typename, alias2108: __typename, alias2109: __typename, alias2110: __typename, alias2111: __typename, alias2112: __typename, alias2113: __typename, alias2114: __typename, alias2115: __typename, alias2116: __typename, alias2117: __typename, alias2118: __typename, alias2119: __typename, alias2120: __typename, alias2121: __typename, alias2122: __typename, alias2123: __typename, alias2124: __typename, alias2125: __typename, alias2126: __typename, alias2127: __typename, alias2128: __typename, alias2129: __typename, alias2130: __typename, alias2131: __typename, alias2132: __typename, alias2133: __typename, alias2134: __typename, alias2135: __typename, alias2136: __typename, alias2137: __typename, alias2138: __typename, alias2139: __typename, alias2140: __typename, alias2141: __typename, alias2142: __typename, alias2143: __typename, alias2144: __typename, alias2145: __typename, alias2146: __typename, alias2147: __typename, alias2148: __typename, alias2149: __typename, alias2150: __typename, alias2151: __typename, alias2152: __typename, alias2153: __typename, alias2154: __typename, alias2155: __typename, alias2156: __typename, alias2157: __typename, alias2158: __typename, alias2159: __typename, alias2160: __typename, alias2161: __typename, alias2162: __typename, alias2163: __typename, alias2164: __typename, alias2165: __typename, alias2166: __typename, alias2167: __typename, alias2168: __typename, alias2169: __typename, alias2170: __typename, alias2171: __typename, alias2172: __typename, alias2173: __typename, alias2174: __typename, alias2175: __typename, alias2176: __typename, alias2177: __typename, alias2178: __typename, alias2179: __typename, alias2180: __typename, alias2181: __typename, alias2182: __typename, alias2183: __typename, alias2184: __typename, alias2185: __typename, alias2186: __typename, alias2187: __typename, alias2188: __typename, alias2189: __typename, alias2190: __typename, alias2191: __typename, alias2192: __typename, alias2193: __typename, alias2194: __typename, alias2195: __typename, alias2196: __typename, alias2197: __typename, alias2198: __typename, alias2199: __typename, alias2200: __typename, alias2201: __typename, alias2202: __typename, alias2203: __typename, alias2204: __typename, alias2205: __typename, alias2206: __typename, alias2207: __typename, alias2208: __typename, alias2209: __typename, alias2210: __typename, alias2211: __typename, alias2212: __typename, alias2213: __typename, alias2214: __typename, alias2215: __typename, alias2216: __typename, alias2217: __typename, alias2218: __typename, alias2219: __typename, alias2220: __typename, alias2221: __typename, alias2222: __typename, alias2223: __typename, alias2224: __typename, alias2225: __typename, alias2226: __typename, alias2227: __typename, alias2228: __typename, alias2229: __typename, alias2230: __typename, alias2231: __typename, alias2232: __typename, alias2233: __typename, alias2234: __typename, alias2235: __typename, alias2236: __typename, alias2237: __typename, alias2238: __typename, alias2239: __typename, alias2240: __typename, alias2241: __typename, alias2242: __typename, alias2243: __typename, alias2244: __typename, alias2245: __typename, alias2246: __typename, alias2247: __typename, alias2248: __typename, alias2249: __typename, alias2250: __typename, alias2251: __typename, alias2252: __typename, alias2253: __typename, alias2254: __typename, alias2255: __typename, alias2256: __typename, alias2257: __typename, alias2258: __typename, alias2259: __typename, alias2260: __typename, alias2261: __typename, alias2262: __typename, alias2263: __typename, alias2264: __typename, alias2265: __typename, alias2266: __typename, alias2267: __typename, alias2268: __typename, alias2269: __typename, alias2270: __typename, alias2271: __typename, alias2272: __typename, alias2273: __typename, alias2274: __typename, alias2275: __typename, alias2276: __typename, alias2277: __typename, alias2278: __typename, alias2279: __typename, alias2280: __typename, alias2281: __typename, alias2282: __typename, alias2283: __typename, alias2284: __typename, alias2285: __typename, alias2286: __typename, alias2287: __typename, alias2288: __typename, alias2289: __typename, alias2290: __typename, alias2291: __typename, alias2292: __typename, alias2293: __typename, alias2294: __typename, alias2295: __typename, alias2296: __typename, alias2297: __typename, alias2298: __typename, alias2299: __typename, alias2300: __typename, alias2301: __typename, alias2302: __typename, alias2303: __typename, alias2304: __typename, alias2305: __typename, alias2306: __typename, alias2307: __typename, alias2308: __typename, alias2309: __typename, alias2310: __typename, alias2311: __typename, alias2312: __typename, alias2313: __typename, alias2314: __typename, alias2315: __typename, alias2316: __typename, alias2317: __typename, alias2318: __typename, alias2319: __typename, alias2320: __typename, alias2321: __typename, alias2322: __typename, alias2323: __typename, alias2324: __typename, alias2325: __typename, alias2326: __typename, alias2327: __typename, alias2328: __typename, alias2329: __typename, alias2330: __typename, alias2331: __typename, alias2332: __typename, alias2333: __typename, alias2334: __typename, alias2335: __typename, alias2336: __typename, alias2337: __typename, alias2338: __typename, alias2339: __typename, alias2340: __typename, alias2341: __typename, alias2342: __typename, alias2343: __typename, alias2344: __typename, alias2345: __typename, alias2346: __typename, alias2347: __typename, alias2348: __typename, alias2349: __typename, alias2350: __typename, alias2351: __typename, alias2352: __typename, alias2353: __typename, alias2354: __typename, alias2355: __typename, alias2356: __typename, alias2357: __typename, alias2358: __typename, alias2359: __typename, alias2360: __typename, alias2361: __typename, alias2362: __typename, alias2363: __typename, alias2364: __typename, alias2365: __typename, alias2366: __typename, alias2367: __typename, alias2368: __typename, alias2369: __typename, alias2370: __typename, alias2371: __typename, alias2372: __typename, alias2373: __typename, alias2374: __typename, alias2375: __typename, alias2376: __typename, alias2377: __typename, alias2378: __typename, alias2379: __typename, alias2380: __typename, alias2381: __typename, alias2382: __typename, alias2383: __typename, alias2384: __typename, alias2385: __typename, alias2386: __typename, alias2387: __typename, alias2388: __typename, alias2389: __typename, alias2390: __typename, alias2391: __typename, alias2392: __typename, alias2393: __typename, alias2394: __typename, alias2395: __typename, alias2396: __typename, alias2397: __typename, alias2398: __typename, alias2399: __typename, alias2400: __typename, alias2401: __typename, alias2402: __typename, alias2403: __typename, alias2404: __typename, alias2405: __typename, alias2406: __typename, alias2407: __typename, alias2408: __typename, alias2409: __typename, alias2410: __typename, alias2411: __typename, alias2412: __typename, alias2413: __typename, alias2414: __typename, alias2415: __typename, alias2416: __typename, alias2417: __typename, alias2418: __typename, alias2419: __typename, alias2420: __typename, alias2421: __typename, alias2422: __typename, alias2423: __typename, alias2424: __typename, alias2425: __typename, alias2426: __typename, alias2427: __typename, alias2428: __typename, alias2429: __typename, alias2430: __typename, alias2431: __typename, alias2432: __typename, alias2433: __typename, alias2434: __typename, alias2435: __typename, alias2436: __typename, alias2437: __typename, alias2438: __typename, alias2439: __typename, alias2440: __typename, alias2441: __typename, alias2442: __typename, alias2443: __typename, alias2444: __typename, alias2445: __typename, alias2446: __typename, alias2447: __typename, alias2448: __typename, alias2449: __typename, alias2450: __typename, alias2451: __typename, alias2452: __typename, alias2453: __typename, alias2454: __typename, alias2455: __typename, alias2456: __typename, alias2457: __typename, alias2458: __typename, alias2459: __typename, alias2460: __typename, alias2461: __typename, alias2462: __typename, alias2463: __typename, alias2464: __typename, alias2465: __typename, alias2466: __typename, alias2467: __typename, alias2468: __typename, alias2469: __typename, alias2470: __typename, alias2471: __typename, alias2472: __typename, alias2473: __typename, alias2474: __typename, alias2475: __typename, alias2476: __typename, alias2477: __typename, alias2478: __typename, alias2479: __typename, alias2480: __typename, alias2481: __typename, alias2482: __typename, alias2483: __typename, alias2484: __typename, alias2485: __typename, alias2486: __typename, alias2487: __typename, alias2488: __typename, alias2489: __typename, alias2490: __typename, alias2491: __typename, alias2492: __typename, alias2493: __typename, alias2494: __typename, alias2495: __typename, alias2496: __typename, alias2497: __typename, alias2498: __typename, alias2499: __typename, alias2500: __typename, alias2501: __typename, alias2502: __typename, alias2503: __typename, alias2504: __typename, alias2505: __typename, alias2506: __typename, alias2507: __typename, alias2508: __typename, alias2509: __typename, alias2510: __typename, alias2511: __typename, alias2512: __typename, alias2513: __typename, alias2514: __typename, alias2515: __typename, alias2516: __typename, alias2517: __typename, alias2518: __typename, alias2519: __typename, alias2520: __typename, alias2521: __typename, alias2522: __typename, alias2523: __typename, alias2524: __typename, alias2525: __typename, alias2526: __typename, alias2527: __typename, alias2528: __typename, alias2529: __typename, alias2530: __typename, alias2531: __typename, alias2532: __typename, alias2533: __typename, alias2534: __typename, alias2535: __typename, alias2536: __typename, alias2537: __typename, alias2538: __typename, alias2539: __typename, alias2540: __typename, alias2541: __typename, alias2542: __typename, alias2543: __typename, alias2544: __typename, alias2545: __typename, alias2546: __typename, alias2547: __typename, alias2548: __typename, alias2549: __typename, alias2550: __typename, alias2551: __typename, alias2552: __typename, alias2553: __typename, alias2554: __typename, alias2555: __typename, alias2556: __typename, alias2557: __typename, alias2558: __typename, alias2559: __typename, alias2560: __typename, alias2561: __typename, alias2562: __typename, alias2563: __typename, alias2564: __typename, alias2565: __typename, alias2566: __typename, alias2567: __typename, alias2568: __typename, alias2569: __typename, alias2570: __typename, alias2571: __typename, alias2572: __typename, alias2573: __typename, alias2574: __typename, alias2575: __typename, alias2576: __typename, alias2577: __typename, alias2578: __typename, alias2579: __typename, alias2580: __typename, alias2581: __typename, alias2582: __typename, alias2583: __typename, alias2584: __typename, alias2585: __typename, alias2586: __typename, alias2587: __typename, alias2588: __typename, alias2589: __typename, alias2590: __typename, alias2591: __typename, alias2592: __typename, alias2593: __typename, alias2594: __typename, alias2595: __typename, alias2596: __typename, alias2597: __typename, alias2598: __typename, alias2599: __typename, alias2600: __typename, alias2601: __typename, alias2602: __typename, alias2603: __typename, alias2604: __typename, alias2605: __typename, alias2606: __typename, alias2607: __typename, alias2608: __typename, alias2609: __typename, alias2610: __typename, alias2611: __typename, alias2612: __typename, alias2613: __typename, alias2614: __typename, alias2615: __typename, alias2616: __typename, alias2617: __typename, alias2618: __typename, alias2619: __typename, alias2620: __typename, alias2621: __typename, alias2622: __typename, alias2623: __typename, alias2624: __typename, alias2625: __typename, alias2626: __typename, alias2627: __typename, alias2628: __typename, alias2629: __typename, alias2630: __typename, alias2631: __typename, alias2632: __typename, alias2633: __typename, alias2634: __typename, alias2635: __typename, alias2636: __typename, alias2637: __typename, alias2638: __typename, alias2639: __typename, alias2640: __typename, alias2641: __typename, alias2642: __typename, alias2643: __typename, alias2644: __typename, alias2645: __typename, alias2646: __typename, alias2647: __typename, alias2648: __typename, alias2649: __typename, alias2650: __typename, alias2651: __typename, alias2652: __typename, alias2653: __typename, alias2654: __typename, alias2655: __typename, alias2656: __typename, alias2657: __typename, alias2658: __typename, alias2659: __typename, alias2660: __typename, alias2661: __typename, alias2662: __typename, alias2663: __typename, alias2664: __typename, alias2665: __typename, alias2666: __typename, alias2667: __typename, alias2668: __typename, alias2669: __typename, alias2670: __typename, alias2671: __typename, alias2672: __typename, alias2673: __typename, alias2674: __typename, alias2675: __typename, alias2676: __typename, alias2677: __typename, alias2678: __typename, alias2679: __typename, alias2680: __typename, alias2681: __typename, alias2682: __typename, alias2683: __typename, alias2684: __typename, alias2685: __typename, alias2686: __typename, alias2687: __typename, alias2688: __typename, alias2689: __typename, alias2690: __typename, alias2691: __typename, alias2692: __typename, alias2693: __typename, alias2694: __typename, alias2695: __typename, alias2696: __typename, alias2697: __typename, alias2698: __typename, alias2699: __typename, alias2700: __typename, alias2701: __typename, alias2702: __typename, alias2703: __typename, alias2704: __typename, alias2705: __typename, alias2706: __typename, alias2707: __typename, alias2708: __typename, alias2709: __typename, alias2710: __typename, alias2711: __typename, alias2712: __typename, alias2713: __typename, alias2714: __typename, alias2715: __typename, alias2716: __typename, alias2717: __typename, alias2718: __typename, alias2719: __typename, alias2720: __typename, alias2721: __typename, alias2722: __typename, alias2723: __typename, alias2724: __typename, alias2725: __typename, alias2726: __typename, alias2727: __typename, alias2728: __typename, alias2729: __typename, alias2730: __typename, alias2731: __typename, alias2732: __typename, alias2733: __typename, alias2734: __typename, alias2735: __typename, alias2736: __typename, alias2737: __typename, alias2738: __typename, alias2739: __typename, alias2740: __typename, alias2741: __typename, alias2742: __typename, alias2743: __typename, alias2744: __typename, alias2745: __typename, alias2746: __typename, alias2747: __typename, alias2748: __typename, alias2749: __typename, alias2750: __typename, alias2751: __typename, alias2752: __typename, alias2753: __typename, alias2754: __typename, alias2755: __typename, alias2756: __typename, alias2757: __typename, alias2758: __typename, alias2759: __typename, alias2760: __typename, alias2761: __typename, alias2762: __typename, alias2763: __typename, alias2764: __typename, alias2765: __typename, alias2766: __typename, alias2767: __typename, alias2768: __typename, alias2769: __typename, alias2770: __typename, alias2771: __typename, alias2772: __typename, alias2773: __typename, alias2774: __typename, alias2775: __typename, alias2776: __typename, alias2777: __typename, alias2778: __typename, alias2779: __typename, alias2780: __typename, alias2781: __typename, alias2782: __typename, alias2783: __typename, alias2784: __typename, alias2785: __typename, alias2786: __typename, alias2787: __typename, alias2788: __typename, alias2789: __typename, alias2790: __typename, alias2791: __typename, alias2792: __typename, alias2793: __typename, alias2794: __typename, alias2795: __typename, alias2796: __typename, alias2797: __typename, alias2798: __typename, alias2799: __typename, alias2800: __typename, alias2801: __typename, alias2802: __typename, alias2803: __typename, alias2804: __typename, alias2805: __typename, alias2806: __typename, alias2807: __typename, alias2808: __typename, alias2809: __typename, alias2810: __typename, alias2811: __typename, alias2812: __typename, alias2813: __typename, alias2814: __typename, alias2815: __typename, alias2816: __typename, alias2817: __typename, alias2818: __typename, alias2819: __typename, alias2820: __typename, alias2821: __typename, alias2822: __typename, alias2823: __typename, alias2824: __typename, alias2825: __typename, alias2826: __typename, alias2827: __typename, alias2828: __typename, alias2829: __typename, alias2830: __typename, alias2831: __typename, alias2832: __typename, alias2833: __typename, alias2834: __typename, alias2835: __typename, alias2836: __typename, alias2837: __typename, alias2838: __typename, alias2839: __typename, alias2840: __typename, alias2841: __typename, alias2842: __typename, alias2843: __typename, alias2844: __typename, alias2845: __typename, alias2846: __typename, alias2847: __typename, alias2848: __typename, alias2849: __typename, alias2850: __typename, alias2851: __typename, alias2852: __typename, alias2853: __typename, alias2854: __typename, alias2855: __typename, alias2856: __typename, alias2857: __typename, alias2858: __typename, alias2859: __typename, alias2860: __typename, alias2861: __typename, alias2862: __typename, alias2863: __typename, alias2864: __typename, alias2865: __typename, alias2866: __typename, alias2867: __typename, alias2868: __typename, alias2869: __typename, alias2870: __typename, alias2871: __typename, alias2872: __typename, alias2873: __typename, alias2874: __typename, alias2875: __typename, alias2876: __typename, alias2877: __typename, alias2878: __typename, alias2879: __typename, alias2880: __typename, alias2881: __typename, alias2882: __typename, alias2883: __typename, alias2884: __typename, alias2885: __typename, alias2886: __typename, alias2887: __typename, alias2888: __typename, alias2889: __typename, alias2890: __typename, alias2891: __typename, alias2892: __typename, alias2893: __typename, alias2894: __typename, alias2895: __typename, alias2896: __typename, alias2897: __typename, alias2898: __typename, alias2899: __typename, alias2900: __typename, alias2901: __typename, alias2902: __typename, alias2903: __typename, alias2904: __typename, alias2905: __typename, alias2906: __typename, alias2907: __typename, alias2908: __typename, alias2909: __typename, alias2910: __typename, alias2911: __typename, alias2912: __typename, alias2913: __typename, alias2914: __typename, alias2915: __typename, alias2916: __typename, alias2917: __typename, alias2918: __typename, alias2919: __typename, alias2920: __typename, alias2921: __typename, alias2922: __typename, alias2923: __typename, alias2924: __typename, alias2925: __typename, alias2926: __typename, alias2927: __typename, alias2928: __typename, alias2929: __typename, alias2930: __typename, alias2931: __typename, alias2932: __typename, alias2933: __typename, alias2934: __typename, alias2935: __typename, alias2936: __typename, alias2937: __typename, alias2938: __typename, alias2939: __typename, alias2940: __typename, alias2941: __typename, alias2942: __typename, alias2943: __typename, alias2944: __typename, alias2945: __typename, alias2946: __typename, alias2947: __typename, alias2948: __typename, alias2949: __typename, alias2950: __typename, alias2951: __typename, alias2952: __typename, alias2953: __typename, alias2954: __typename, alias2955: __typename, alias2956: __typename, alias2957: __typename, alias2958: __typename, alias2959: __typename, alias2960: __typename, alias2961: __typename, alias2962: __typename, alias2963: __typename, alias2964: __typename, alias2965: __typename, alias2966: __typename, alias2967: __typename, alias2968: __typename, alias2969: __typename, alias2970: __typename, alias2971: __typename, alias2972: __typename, alias2973: __typename, alias2974: __typename, alias2975: __typename, alias2976: __typename, alias2977: __typename, alias2978: __typename, alias2979: __typename, alias2980: __typename, alias2981: __typename, alias2982: __typename, alias2983: __typename, alias2984: __typename, alias2985: __typename, alias2986: __typename, alias2987: __typename, alias2988: __typename, alias2989: __typename, alias2990: __typename, alias2991: __typename, alias2992: __typename, alias2993: __typename, alias2994: __typename, alias2995: __typename, alias2996: __typename, alias2997: __typename, alias2998: __typename, alias2999: __typename, alias3000: __typename, alias3001: __typename, alias3002: __typename, alias3003: __typename, alias3004: __typename, alias3005: __typename, alias3006: __typename, alias3007: __typename, alias3008: __typename, alias3009: __typename, alias3010: __typename, alias3011: __typename, alias3012: __typename, alias3013: __typename, alias3014: __typename, alias3015: __typename, alias3016: __typename, alias3017: __typename, alias3018: __typename, alias3019: __typename, alias3020: __typename, alias3021: __typename, alias3022: __typename, alias3023: __typename, alias3024: __typename, alias3025: __typename, alias3026: __typename, alias3027: __typename, alias3028: __typename, alias3029: __typename, alias3030: __typename, alias3031: __typename, alias3032: __typename, alias3033: __typename, alias3034: __typename, alias3035: __typename, alias3036: __typename, alias3037: __typename, alias3038: __typename, alias3039: __typename, alias3040: __typename, alias3041: __typename, alias3042: __typename, alias3043: __typename, alias3044: __typename, alias3045: __typename, alias3046: __typename, alias3047: __typename, alias3048: __typename, alias3049: __typename, alias3050: __typename, alias3051: __typename, alias3052: __typename, alias3053: __typename, alias3054: __typename, alias3055: __typename, alias3056: __typename, alias3057: __typename, alias3058: __typename, alias3059: __typename, alias3060: __typename, alias3061: __typename, alias3062: __typename, alias3063: __typename, alias3064: __typename, alias3065: __typename, alias3066: __typename, alias3067: __typename, alias3068: __typename, alias3069: __typename, alias3070: __typename, alias3071: __typename, alias3072: __typename, alias3073: __typename, alias3074: __typename, alias3075: __typename, alias3076: __typename, alias3077: __typename, alias3078: __typename, alias3079: __typename, alias3080: __typename, alias3081: __typename, alias3082: __typename, alias3083: __typename, alias3084: __typename, alias3085: __typename, alias3086: __typename, alias3087: __typename, alias3088: __typename, alias3089: __typename, alias3090: __typename, alias3091: __typename, alias3092: __typename, alias3093: __typename, alias3094: __typename, alias3095: __typename, alias3096: __typename, alias3097: __typename, alias3098: __typename, alias3099: __typename, alias3100: __typename, alias3101: __typename, alias3102: __typename, alias3103: __typename, alias3104: __typename, alias3105: __typename, alias3106: __typename, alias3107: __typename, alias3108: __typename, alias3109: __typename, alias3110: __typename, alias3111: __typename, alias3112: __typename, alias3113: __typename, alias3114: __typename, alias3115: __typename, alias3116: __typename, alias3117: __typename, alias3118: __typename, alias3119: __typename, alias3120: __typename, alias3121: __typename, alias3122: __typename, alias3123: __typename, alias3124: __typename, alias3125: __typename, alias3126: __typename, alias3127: __typename, alias3128: __typename, alias3129: __typename, alias3130: __typename, alias3131: __typename, alias3132: __typename, alias3133: __typename, alias3134: __typename, alias3135: __typename, alias3136: __typename, alias3137: __typename, alias3138: __typename, alias3139: __typename, alias3140: __typename, alias3141: __typename, alias3142: __typename, alias3143: __typename, alias3144: __typename, alias3145: __typename, alias3146: __typename, alias3147: __typename, alias3148: __typename, alias3149: __typename, alias3150: __typename, alias3151: __typename, alias3152: __typename, alias3153: __typename, alias3154: __typename, alias3155: __typename, alias3156: __typename, alias3157: __typename, alias3158: __typename, alias3159: __typename, alias3160: __typename, alias3161: __typename, alias3162: __typename, alias3163: __typename, alias3164: __typename, alias3165: __typename, alias3166: __typename, alias3167: __typename, alias3168: __typename, alias3169: __typename, alias3170: __typename, alias3171: __typename, alias3172: __typename, alias3173: __typename, alias3174: __typename, alias3175: __typename, alias3176: __typename, alias3177: __typename, alias3178: __typename, alias3179: __typename, alias3180: __typename, alias3181: __typename, alias3182: __typename, alias3183: __typename, alias3184: __typename, alias3185: __typename, alias3186: __typename, alias3187: __typename, alias3188: __typename, alias3189: __typename, alias3190: __typename, alias3191: __typename, alias3192: __typename, alias3193: __typename, alias3194: __typename, alias3195: __typename, alias3196: __typename, alias3197: __typename, alias3198: __typename, alias3199: __typename, alias3200: __typename, alias3201: __typename, alias3202: __typename, alias3203: __typename, alias3204: __typename, alias3205: __typename, alias3206: __typename, alias3207: __typename, alias3208: __typename, alias3209: __typename, alias3210: __typename, alias3211: __typename, alias3212: __typename, alias3213: __typename, alias3214: __typename, alias3215: __typename, alias3216: __typename, alias3217: __typename, alias3218: __typename, alias3219: __typename, alias3220: __typename, alias3221: __typename, alias3222: __typename, alias3223: __typename, alias3224: __typename, alias3225: __typename, alias3226: __typename, alias3227: __typename, alias3228: __typename, alias3229: __typename, alias3230: __typename, alias3231: __typename, alias3232: __typename, alias3233: __typename, alias3234: __typename, alias3235: __typename, alias3236: __typename, alias3237: __typename, alias3238: __typename, alias3239: __typename, alias3240: __typename, alias3241: __typename, alias3242: __typename, alias3243: __typename, alias3244: __typename, alias3245: __typename, alias3246: __typename, alias3247: __typename, alias3248: __typename, alias3249: __typename, alias3250: __typename, alias3251: __typename, alias3252: __typename, alias3253: __typename, alias3254: __typename, alias3255: __typename, alias3256: __typename, alias3257: __typename, alias3258: __typename, alias3259: __typename, alias3260: __typename, alias3261: __typename, alias3262: __typename, alias3263: __typename, alias3264: __typename, alias3265: __typename, alias3266: __typename, alias3267: __typename, alias3268: __typename, alias3269: __typename, alias3270: __typename, alias3271: __typename, alias3272: __typename, alias3273: __typename, alias3274: __typename, alias3275: __typename, alias3276: __typename, alias3277: __typename, alias3278: __typename, alias3279: __typename, alias3280: __typename, alias3281: __typename, alias3282: __typename, alias3283: __typename, alias3284: __typename, alias3285: __typename, alias3286: __typename, alias3287: __typename, alias3288: __typename, alias3289: __typename, alias3290: __typename, alias3291: __typename, alias3292: __typename, alias3293: __typename, alias3294: __typename, alias3295: __typename, alias3296: __typename, alias3297: __typename, alias3298: __typename, alias3299: __typename, alias3300: __typename, alias3301: __typename, alias3302: __typename, alias3303: __typename, alias3304: __typename, alias3305: __typename, alias3306: __typename, alias3307: __typename, alias3308: __typename, alias3309: __typename, alias3310: __typename, alias3311: __typename, alias3312: __typename, alias3313: __typename, alias3314: __typename, alias3315: __typename, alias3316: __typename, alias3317: __typename, alias3318: __typename, alias3319: __typename, alias3320: __typename, alias3321: __typename, alias3322: __typename, alias3323: __typename, alias3324: __typename, alias3325: __typename, alias3326: __typename, alias3327: __typename, alias3328: __typename, alias3329: __typename, alias3330: __typename, alias3331: __typename, alias3332: __typename, alias3333: __typename, alias3334: __typename, alias3335: __typename, alias3336: __typename, alias3337: __typename, alias3338: __typename, alias3339: __typename, alias3340: __typename, alias3341: __typename, alias3342: __typename, alias3343: __typename, alias3344: __typename, alias3345: __typename, alias3346: __typename, alias3347: __typename, alias3348: __typename, alias3349: __typename, alias3350: __typename, alias3351: __typename, alias3352: __typename, alias3353: __typename, alias3354: __typename, alias3355: __typename, alias3356: __typename, alias3357: __typename, alias3358: __typename, alias3359: __typename, alias3360: __typename, alias3361: __typename, alias3362: __typename, alias3363: __typename, alias3364: __typename, alias3365: __typename, alias3366: __typename, alias3367: __typename, alias3368: __typename, alias3369: __typename, alias3370: __typename, alias3371: __typename, alias3372: __typename, alias3373: __typename, alias3374: __typename, alias3375: __typename, alias3376: __typename, alias3377: __typename, alias3378: __typename, alias3379: __typename, alias3380: __typename, alias3381: __typename, alias3382: __typename, alias3383: __typename, alias3384: __typename, alias3385: __typename, alias3386: __typename, alias3387: __typename, alias3388: __typename, alias3389: __typename, alias3390: __typename, alias3391: __typename, alias3392: __typename, alias3393: __typename, alias3394: __typename, alias3395: __typename, alias3396: __typename, alias3397: __typename, alias3398: __typename, alias3399: __typename, alias3400: __typename, alias3401: __typename, alias3402: __typename, alias3403: __typename, alias3404: __typename, alias3405: __typename, alias3406: __typename, alias3407: __typename, alias3408: __typename, alias3409: __typename, alias3410: __typename, alias3411: __typename, alias3412: __typename, alias3413: __typename, alias3414: __typename, alias3415: __typename, alias3416: __typename, alias3417: __typename, alias3418: __typename, alias3419: __typename, alias3420: __typename, alias3421: __typename, alias3422: __typename, alias3423: __typename, alias3424: __typename, alias3425: __typename, alias3426: __typename, alias3427: __typename, alias3428: __typename, alias3429: __typename, alias3430: __typename, alias3431: __typename, alias3432: __typename, alias3433: __typename, alias3434: __typename, alias3435: __typename, alias3436: __typename, alias3437: __typename, alias3438: __typename, alias3439: __typename, alias3440: __typename, alias3441: __typename, alias3442: __typename, alias3443: __typename, alias3444: __typename, alias3445: __typename, alias3446: __typename, alias3447: __typename, alias3448: __typename, alias3449: __typename, alias3450: __typename, alias3451: __typename, alias3452: __typename, alias3453: __typename, alias3454: __typename, alias3455: __typename, alias3456: __typename, alias3457: __typename, alias3458: __typename, alias3459: __typename, alias3460: __typename, alias3461: __typename, alias3462: __typename, alias3463: __typename, alias3464: __typename, alias3465: __typename, alias3466: __typename, alias3467: __typename, alias3468: __typename, alias3469: __typename, alias3470: __typename, alias3471: __typename, alias3472: __typename, alias3473: __typename, alias3474: __typename, alias3475: __typename, alias3476: __typename, alias3477: __typename, alias3478: __typename, alias3479: __typename, alias3480: __typename, alias3481: __typename, alias3482: __typename, alias3483: __typename, alias3484: __typename, alias3485: __typename, alias3486: __typename, alias3487: __typename, alias3488: __typename, alias3489: __typename, alias3490: __typename, alias3491: __typename, alias3492: __typename, alias3493: __typename, alias3494: __typename, alias3495: __typename, alias3496: __typename, alias3497: __typename, alias3498: __typename, alias3499: __typename, alias3500: __typename, alias3501: __typename, alias3502: __typename, alias3503: __typename, alias3504: __typename, alias3505: __typename, alias3506: __typename, alias3507: __typename, alias3508: __typename, alias3509: __typename, alias3510: __typename, alias3511: __typename, alias3512: __typename, alias3513: __typename, alias3514: __typename, alias3515: __typename, alias3516: __typename, alias3517: __typename, alias3518: __typename, alias3519: __typename, alias3520: __typename, alias3521: __typename, alias3522: __typename, alias3523: __typename, alias3524: __typename, alias3525: __typename, alias3526: __typename, alias3527: __typename, alias3528: __typename, alias3529: __typename, alias3530: __typename, alias3531: __typename, alias3532: __typename, alias3533: __typename, alias3534: __typename, alias3535: __typename, alias3536: __typename, alias3537: __typename, alias3538: __typename, alias3539: __typename, alias3540: __typename, alias3541: __typename, alias3542: __typename, alias3543: __typename, alias3544: __typename, alias3545: __typename, alias3546: __typename, alias3547: __typename, alias3548: __typename, alias3549: __typename, alias3550: __typename, alias3551: __typename, alias3552: __typename, alias3553: __typename, alias3554: __typename, alias3555: __typename, alias3556: __typename, alias3557: __typename, alias3558: __typename, alias3559: __typename, alias3560: __typename, alias3561: __typename, alias3562: __typename, alias3563: __typename, alias3564: __typename, alias3565: __typename, alias3566: __typename, alias3567: __typename, alias3568: __typename, alias3569: __typename, alias3570: __typename, alias3571: __typename, alias3572: __typename, alias3573: __typename, alias3574: __typename, alias3575: __typename, alias3576: __typename, alias3577: __typename, alias3578: __typename, alias3579: __typename, alias3580: __typename, alias3581: __typename, alias3582: __typename, alias3583: __typename, alias3584: __typename, alias3585: __typename, alias3586: __typename, alias3587: __typename, alias3588: __typename, alias3589: __typename, alias3590: __typename, alias3591: __typename, alias3592: __typename, alias3593: __typename, alias3594: __typename, alias3595: __typename, alias3596: __typename, alias3597: __typename, alias3598: __typename, alias3599: __typename, alias3600: __typename, alias3601: __typename, alias3602: __typename, alias3603: __typename, alias3604: __typename, alias3605: __typename, alias3606: __typename, alias3607: __typename, alias3608: __typename, alias3609: __typename, alias3610: __typename, alias3611: __typename, alias3612: __typename, alias3613: __typename, alias3614: __typename, alias3615: __typename, alias3616: __typename, alias3617: __typename, alias3618: __typename, alias3619: __typename, alias3620: __typename, alias3621: __typename, alias3622: __typename, alias3623: __typename, alias3624: __typename, alias3625: __typename, alias3626: __typename, alias3627: __typename, alias3628: __typename, alias3629: __typename, alias3630: __typename, alias3631: __typename, alias3632: __typename, alias3633: __typename, alias3634: __typename, alias3635: __typename, alias3636: __typename, alias3637: __typename, alias3638: __typename, alias3639: __typename, alias3640: __typename, alias3641: __typename, alias3642: __typename, alias3643: __typename, alias3644: __typename, alias3645: __typename, alias3646: __typename, alias3647: __typename, alias3648: __typename, alias3649: __typename, alias3650: __typename, alias3651: __typename, alias3652: __typename, alias3653: __typename, alias3654: __typename, alias3655: __typename, alias3656: __typename, alias3657: __typename, alias3658: __typename, alias3659: __typename, alias3660: __typename, alias3661: __typename, alias3662: __typename, alias3663: __typename, alias3664: __typename, alias3665: __typename, alias3666: __typename, alias3667: __typename, alias3668: __typename, alias3669: __typename, alias3670: __typename, alias3671: __typename, alias3672: __typename, alias3673: __typename, alias3674: __typename, alias3675: __typename, alias3676: __typename, alias3677: __typename, alias3678: __typename, alias3679: __typename, alias3680: __typename, alias3681: __typename, alias3682: __typename, alias3683: __typename, alias3684: __typename, alias3685: __typename, alias3686: __typename, alias3687: __typename, alias3688: __typename, alias3689: __typename, alias3690: __typename, alias3691: __typename, alias3692: __typename, alias3693: __typename, alias3694: __typename, alias3695: __typename, alias3696: __typename, alias3697: __typename, alias3698: __typename, alias3699: __typename, alias3700: __typename, alias3701: __typename, alias3702: __typename, alias3703: __typename, alias3704: __typename, alias3705: __typename, alias3706: __typename, alias3707: __typename, alias3708: __typename, alias3709: __typename, alias3710: __typename, alias3711: __typename, alias3712: __typename, alias3713: __typename, alias3714: __typename, alias3715: __typename, alias3716: __typename, alias3717: __typename, alias3718: __typename, alias3719: __typename, alias3720: __typename, alias3721: __typename, alias3722: __typename, alias3723: __typename, alias3724: __typename, alias3725: __typename, alias3726: __typename, alias3727: __typename, alias3728: __typename, alias3729: __typename, alias3730: __typename, alias3731: __typename, alias3732: __typename, alias3733: __typename, alias3734: __typename, alias3735: __typename, alias3736: __typename, alias3737: __typename, alias3738: __typename, alias3739: __typename, alias3740: __typename, alias3741: __typename, alias3742: __typename, alias3743: __typename, alias3744: __typename, alias3745: __typename, alias3746: __typename, alias3747: __typename, alias3748: __typename, alias3749: __typename, alias3750: __typename, alias3751: __typename, alias3752: __typename, alias3753: __typename, alias3754: __typename, alias3755: __typename, alias3756: __typename, alias3757: __typename, alias3758: __typename, alias3759: __typename, alias3760: __typename, alias3761: __typename, alias3762: __typename, alias3763: __typename, alias3764: __typename, alias3765: __typename, alias3766: __typename, alias3767: __typename, alias3768: __typename, alias3769: __typename, alias3770: __typename, alias3771: __typename, alias3772: __typename, alias3773: __typename, alias3774: __typename, alias3775: __typename, alias3776: __typename, alias3777: __typename, alias3778: __typename, alias3779: __typename, alias3780: __typename, alias3781: __typename, alias3782: __typename, alias3783: __typename, alias3784: __typename, alias3785: __typename, alias3786: __typename, alias3787: __typename, alias3788: __typename, alias3789: __typename, alias3790: __typename, alias3791: __typename, alias3792: __typename, alias3793: __typename, alias3794: __typename, alias3795: __typename, alias3796: __typename, alias3797: __typename, alias3798: __typename, alias3799: __typename, alias3800: __typename, alias3801: __typename, alias3802: __typename, alias3803: __typename, alias3804: __typename, alias3805: __typename, alias3806: __typename, alias3807: __typename, alias3808: __typename, alias3809: __typename, alias3810: __typename, alias3811: __typename, alias3812: __typename, alias3813: __typename, alias3814: __typename, alias3815: __typename, alias3816: __typename, alias3817: __typename, alias3818: __typename, alias3819: __typename, alias3820: __typename, alias3821: __typename, alias3822: __typename, alias3823: __typename, alias3824: __typename, alias3825: __typename, alias3826: __typename, alias3827: __typename, alias3828: __typename, alias3829: __typename, alias3830: __typename, alias3831: __typename, alias3832: __typename, alias3833: __typename, alias3834: __typename, alias3835: __typename, alias3836: __typename, alias3837: __typename, alias3838: __typename, alias3839: __typename, alias3840: __typename, alias3841: __typename, alias3842: __typename, alias3843: __typename, alias3844: __typename, alias3845: __typename, alias3846: __typename, alias3847: __typename, alias3848: __typename, alias3849: __typename, alias3850: __typename, alias3851: __typename, alias3852: __typename, alias3853: __typename, alias3854: __typename, alias3855: __typename, alias3856: __typename, alias3857: __typename, alias3858: __typename, alias3859: __typename, alias3860: __typename, alias3861: __typename, alias3862: __typename, alias3863: __typename, alias3864: __typename, alias3865: __typename, alias3866: __typename, alias3867: __typename, alias3868: __typename, alias3869: __typename, alias3870: __typename, alias3871: __typename, alias3872: __typename, alias3873: __typename, alias3874: __typename, alias3875: __typename, alias3876: __typename, alias3877: __typename, alias3878: __typename, alias3879: __typename, alias3880: __typename, alias3881: __typename, alias3882: __typename, alias3883: __typename, alias3884: __typename, alias3885: __typename, alias3886: __typename, alias3887: __typename, alias3888: __typename, alias3889: __typename, alias3890: __typename, alias3891: __typename, alias3892: __typename, alias3893: __typename, alias3894: __typename, alias3895: __typename, alias3896: __typename, alias3897: __typename, alias3898: __typename, alias3899: __typename, alias3900: __typename, alias3901: __typename, alias3902: __typename, alias3903: __typename, alias3904: __typename, alias3905: __typename, alias3906: __typename, alias3907: __typename, alias3908: __typename, alias3909: __typename, alias3910: __typename, alias3911: __typename, alias3912: __typename, alias3913: __typename, alias3914: __typename, alias3915: __typename, alias3916: __typename, alias3917: __typename, alias3918: __typename, alias3919: __typename, alias3920: __typename, alias3921: __typename, alias3922: __typename, alias3923: __typename, alias3924: __typename, alias3925: __typename, alias3926: __typename, alias3927: __typename, alias3928: __typename, alias3929: __typename, alias3930: __typename, alias3931: __typename, alias3932: __typename, alias3933: __typename, alias3934: __typename, alias3935: __typename, alias3936: __typename, alias3937: __typename, alias3938: __typename, alias3939: __typename, alias3940: __typename, alias3941: __typename, alias3942: __typename, alias3943: __typename, alias3944: __typename, alias3945: __typename, alias3946: __typename, alias3947: __typename, alias3948: __typename, alias3949: __typename, alias3950: __typename, alias3951: __typename, alias3952: __typename, alias3953: __typename, alias3954: __typename, alias3955: __typename, alias3956: __typename, alias3957: __typename, alias3958: __typename, alias3959: __typename, alias3960: __typename, alias3961: __typename, alias3962: __typename, alias3963: __typename, alias3964: __typename, alias3965: __typename, alias3966: __typename, alias3967: __typename, alias3968: __typename, alias3969: __typename, alias3970: __typename, alias3971: __typename, alias3972: __typename, alias3973: __typename, alias3974: __typename, alias3975: __typename, alias3976: __typename, alias3977: __typename, alias3978: __typename, alias3979: __typename, alias3980: __typename, alias3981: __typename, alias3982: __typename, alias3983: __typename, alias3984: __typename, alias3985: __typename, alias3986: __typename, alias3987: __typename, alias3988: __typename, alias3989: __typename, alias3990: __typename, alias3991: __typename, alias3992: __typename, alias3993: __typename, alias3994: __typename, alias3995: __typename, alias3996: __typename, alias3997: __typename, alias3998: __typename, alias3999: __typename, alias4000: __typename, alias4001: __typename, alias4002: __typename, alias4003: __typename, alias4004: __typename, alias4005: __typename, alias4006: __typename, alias4007: __typename, alias4008: __typename, alias4009: __typename, alias4010: __typename, alias4011: __typename, alias4012: __typename, alias4013: __typename, alias4014: __typename, alias4015: __typename, alias4016: __typename, alias4017: __typename, alias4018: __typename, alias4019: __typename, alias4020: __typename, alias4021: __typename, alias4022: __typename, alias4023: __typename, alias4024: __typename, alias4025: __typename, alias4026: __typename, alias4027: __typename, alias4028: __typename, alias4029: __typename, alias4030: __typename, alias4031: __typename, alias4032: __typename, alias4033: __typename, alias4034: __typename, alias4035: __typename, alias4036: __typename, alias4037: __typename, alias4038: __typename, alias4039: __typename, alias4040: __typename, alias4041: __typename, alias4042: __typename, alias4043: __typename, alias4044: __typename, alias4045: __typename, alias4046: __typename, alias4047: __typename, alias4048: __typename, alias4049: __typename, alias4050: __typename, alias4051: __typename, alias4052: __typename, alias4053: __typename, alias4054: __typename, alias4055: __typename, alias4056: __typename, alias4057: __typename, alias4058: __typename, alias4059: __typename, alias4060: __typename, alias4061: __typename, alias4062: __typename, alias4063: __typename, alias4064: __typename, alias4065: __typename, alias4066: __typename, alias4067: __typename, alias4068: __typename, alias4069: __typename, alias4070: __typename, alias4071: __typename, alias4072: __typename, alias4073: __typename, alias4074: __typename, alias4075: __typename, alias4076: __typename, alias4077: __typename, alias4078: __typename, alias4079: __typename, alias4080: __typename, alias4081: __typename, alias4082: __typename, alias4083: __typename, alias4084: __typename, alias4085: __typename, alias4086: __typename, alias4087: __typename, alias4088: __typename, alias4089: __typename, alias4090: __typename, alias4091: __typename, alias4092: __typename, alias4093: __typename, alias4094: __typename, alias4095: __typename, alias4096: __typename, alias4097: __typename, alias4098: __typename, alias4099: __typename, alias4100: __typename, alias4101: __typename, alias4102: __typename, alias4103: __typename, alias4104: __typename, alias4105: __typename, alias4106: __typename, alias4107: __typename, alias4108: __typename, alias4109: __typename, alias4110: __typename, alias4111: __typename, alias4112: __typename, alias4113: __typename, alias4114: __typename, alias4115: __typename, alias4116: __typename, alias4117: __typename, alias4118: __typename, alias4119: __typename, alias4120: __typename, alias4121: __typename, alias4122: __typename, alias4123: __typename, alias4124: __typename, alias4125: __typename, alias4126: __typename, alias4127: __typename, alias4128: __typename, alias4129: __typename, alias4130: __typename, alias4131: __typename, alias4132: __typename, alias4133: __typename, alias4134: __typename, alias4135: __typename, alias4136: __typename, alias4137: __typename, alias4138: __typename, alias4139: __typename, alias4140: __typename, alias4141: __typename, alias4142: __typename, alias4143: __typename, alias4144: __typename, alias4145: __typename, alias4146: __typename, alias4147: __typename, alias4148: __typename, alias4149: __typename, alias4150: __typename, alias4151: __typename, alias4152: __typename, alias4153: __typename, alias4154: __typename, alias4155: __typename, alias4156: __typename, alias4157: __typename, alias4158: __typename, alias4159: __typename, alias4160: __typename, alias4161: __typename, alias4162: __typename, alias4163: __typename, alias4164: __typename, alias4165: __typename, alias4166: __typename, alias4167: __typename, alias4168: __typename, alias4169: __typename, alias4170: __typename, alias4171: __typename, alias4172: __typename, alias4173: __typename, alias4174: __typename, alias4175: __typename, alias4176: __typename, alias4177: __typename, alias4178: __typename, alias4179: __typename, alias4180: __typename, alias4181: __typename, alias4182: __typename, alias4183: __typename, alias4184: __typename, alias4185: __typename, alias4186: __typename, alias4187: __typename, alias4188: __typename, alias4189: __typename, alias4190: __typename, alias4191: __typename, alias4192: __typename, alias4193: __typename, alias4194: __typename, alias4195: __typename, alias4196: __typename, alias4197: __typename, alias4198: __typename, alias4199: __typename, alias4200: __typename, alias4201: __typename, alias4202: __typename, alias4203: __typename, alias4204: __typename, alias4205: __typename, alias4206: __typename, alias4207: __typename, alias4208: __typename, alias4209: __typename, alias4210: __typename, alias4211: __typename, alias4212: __typename, alias4213: __typename, alias4214: __typename, alias4215: __typename, alias4216: __typename, alias4217: __typename, alias4218: __typename, alias4219: __typename, alias4220: __typename, alias4221: __typename, alias4222: __typename, alias4223: __typename, alias4224: __typename, alias4225: __typename, alias4226: __typename, alias4227: __typename, alias4228: __typename, alias4229: __typename, alias4230: __typename, alias4231: __typename, alias4232: __typename, alias4233: __typename, alias4234: __typename, alias4235: __typename, alias4236: __typename, alias4237: __typename, alias4238: __typename, alias4239: __typename, alias4240: __typename, alias4241: __typename, alias4242: __typename, alias4243: __typename, alias4244: __typename, alias4245: __typename, alias4246: __typename, alias4247: __typename, alias4248: __typename, alias4249: __typename, alias4250: __typename, alias4251: __typename, alias4252: __typename, alias4253: __typename, alias4254: __typename, alias4255: __typename, alias4256: __typename, alias4257: __typename, alias4258: __typename, alias4259: __typename, alias4260: __typename, alias4261: __typename, alias4262: __typename, alias4263: __typename, alias4264: __typename, alias4265: __typename, alias4266: __typename, alias4267: __typename, alias4268: __typename, alias4269: __typename, alias4270: __typename, alias4271: __typename, alias4272: __typename, alias4273: __typename, alias4274: __typename, alias4275: __typename, alias4276: __typename, alias4277: __typename, alias4278: __typename, alias4279: __typename, alias4280: __typename, alias4281: __typename, alias4282: __typename, alias4283: __typename, alias4284: __typename, alias4285: __typename, alias4286: __typename, alias4287: __typename, alias4288: __typename, alias4289: __typename, alias4290: __typename, alias4291: __typename, alias4292: __typename, alias4293: __typename, alias4294: __typename, alias4295: __typename, alias4296: __typename, alias4297: __typename, alias4298: __typename, alias4299: __typename, alias4300: __typename, alias4301: __typename, alias4302: __typename, alias4303: __typename, alias4304: __typename, alias4305: __typename, alias4306: __typename, alias4307: __typename, alias4308: __typename, alias4309: __typename, alias4310: __typename, alias4311: __typename, alias4312: __typename, alias4313: __typename, alias4314: __typename, alias4315: __typename, alias4316: __typename, alias4317: __typename, alias4318: __typename, alias4319: __typename, alias4320: __typename, alias4321: __typename, alias4322: __typename, alias4323: __typename, alias4324: __typename, alias4325: __typename, alias4326: __typename, alias4327: __typename, alias4328: __typename, alias4329: __typename, alias4330: __typename, alias4331: __typename, alias4332: __typename, alias4333: __typename, alias4334: __typename, alias4335: __typename, alias4336: __typename, alias4337: __typename, alias4338: __typename, alias4339: __typename, alias4340: __typename, alias4341: __typename, alias4342: __typename, alias4343: __typename, alias4344: __typename, alias4345: __typename, alias4346: __typename, alias4347: __typename, alias4348: __typename, alias4349: __typename, alias4350: __typename, alias4351: __typename, alias4352: __typename, alias4353: __typename, alias4354: __typename, alias4355: __typename, alias4356: __typename, alias4357: __typename, alias4358: __typename, alias4359: __typename, alias4360: __typename, alias4361: __typename, alias4362: __typename, alias4363: __typename, alias4364: __typename, alias4365: __typename, alias4366: __typename, alias4367: __typename, alias4368: __typename, alias4369: __typename, alias4370: __typename, alias4371: __typename, alias4372: __typename, alias4373: __typename, alias4374: __typename, alias4375: __typename, alias4376: __typename, alias4377: __typename, alias4378: __typename, alias4379: __typename, alias4380: __typename, alias4381: __typename, alias4382: __typename, alias4383: __typename, alias4384: __typename, alias4385: __typename, alias4386: __typename, alias4387: __typename, alias4388: __typename, alias4389: __typename, alias4390: __typename, alias4391: __typename, alias4392: __typename, alias4393: __typename, alias4394: __typename, alias4395: __typename, alias4396: __typename, alias4397: __typename, alias4398: __typename, alias4399: __typename, alias4400: __typename, alias4401: __typename, alias4402: __typename, alias4403: __typename, alias4404: __typename, alias4405: __typename, alias4406: __typename, alias4407: __typename, alias4408: __typename, alias4409: __typename, alias4410: __typename, alias4411: __typename, alias4412: __typename, alias4413: __typename, alias4414: __typename, alias4415: __typename, alias4416: __typename, alias4417: __typename, alias4418: __typename, alias4419: __typename, alias4420: __typename, alias4421: __typename, alias4422: __typename, alias4423: __typename, alias4424: __typename, alias4425: __typename, alias4426: __typename, alias4427: __typename, alias4428: __typename, alias4429: __typename, alias4430: __typename, alias4431: __typename, alias4432: __typename, alias4433: __typename, alias4434: __typename, alias4435: __typename, alias4436: __typename, alias4437: __typename, alias4438: __typename, alias4439: __typename, alias4440: __typename, alias4441: __typename, alias4442: __typename, alias4443: __typename, alias4444: __typename, alias4445: __typename, alias4446: __typename, alias4447: __typename, alias4448: __typename, alias4449: __typename, alias4450: __typename, alias4451: __typename, alias4452: __typename, alias4453: __typename, alias4454: __typename, alias4455: __typename, alias4456: __typename, alias4457: __typename, alias4458: __typename, alias4459: __typename, alias4460: __typename, alias4461: __typename, alias4462: __typename, alias4463: __typename, alias4464: __typename, alias4465: __typename, alias4466: __typename, alias4467: __typename, alias4468: __typename, alias4469: __typename, alias4470: __typename, alias4471: __typename, alias4472: __typename, alias4473: __typename, alias4474: __typename, alias4475: __typename, alias4476: __typename, alias4477: __typename, alias4478: __typename, alias4479: __typename, alias4480: __typename, alias4481: __typename, alias4482: __typename, alias4483: __typename, alias4484: __typename, alias4485: __typename, alias4486: __typename, alias4487: __typename, alias4488: __typename, alias4489: __typename, alias4490: __typename, alias4491: __typename, alias4492: __typename, alias4493: __typename, alias4494: __typename, alias4495: __typename, alias4496: __typename, alias4497: __typename, alias4498: __typename, alias4499: __typename, alias4500: __typename, alias4501: __typename, alias4502: __typename, alias4503: __typename, alias4504: __typename, alias4505: __typename, alias4506: __typename, alias4507: __typename, alias4508: __typename, alias4509: __typename, alias4510: __typename, alias4511: __typename, alias4512: __typename, alias4513: __typename, alias4514: __typename, alias4515: __typename, alias4516: __typename, alias4517: __typename, alias4518: __typename, alias4519: __typename, alias4520: __typename, alias4521: __typename, alias4522: __typename, alias4523: __typename, alias4524: __typename, alias4525: __typename, alias4526: __typename, alias4527: __typename, alias4528: __typename, alias4529: __typename, alias4530: __typename, alias4531: __typename, alias4532: __typename, alias4533: __typename, alias4534: __typename, alias4535: __typename, alias4536: __typename, alias4537: __typename, alias4538: __typename, alias4539: __typename, alias4540: __typename, alias4541: __typename, alias4542: __typename, alias4543: __typename, alias4544: __typename, alias4545: __typename, alias4546: __typename, alias4547: __typename, alias4548: __typename, alias4549: __typename, alias4550: __typename, alias4551: __typename, alias4552: __typename, alias4553: __typename, alias4554: __typename, alias4555: __typename, alias4556: __typename, alias4557: __typename, alias4558: __typename, alias4559: __typename, alias4560: __typename, alias4561: __typename, alias4562: __typename, alias4563: __typename, alias4564: __typename, alias4565: __typename, alias4566: __typename, alias4567: __typename, alias4568: __typename, alias4569: __typename, alias4570: __typename, alias4571: __typename, alias4572: __typename, alias4573: __typename, alias4574: __typename, alias4575: __typename, alias4576: __typename, alias4577: __typename, alias4578: __typename, alias4579: __typename, alias4580: __typename, alias4581: __typename, alias4582: __typename, alias4583: __typename, alias4584: __typename, alias4585: __typename, alias4586: __typename, alias4587: __typename, alias4588: __typename, alias4589: __typename, alias4590: __typename, alias4591: __typename, alias4592: __typename, alias4593: __typename, alias4594: __typename, alias4595: __typename, alias4596: __typename, alias4597: __typename, alias4598: __typename, alias4599: __typename, alias4600: __typename, alias4601: __typename, alias4602: __typename, alias4603: __typename, alias4604: __typename, alias4605: __typename, alias4606: __typename, alias4607: __typename, alias4608: __typename, alias4609: __typename, alias4610: __typename, alias4611: __typename, alias4612: __typename, alias4613: __typename, alias4614: __typename, alias4615: __typename, alias4616: __typename, alias4617: __typename, alias4618: __typename, alias4619: __typename, alias4620: __typename, alias4621: __typename, alias4622: __typename, alias4623: __typename, alias4624: __typename, alias4625: __typename, alias4626: __typename, alias4627: __typename, alias4628: __typename, alias4629: __typename, alias4630: __typename, alias4631: __typename, alias4632: __typename, alias4633: __typename, alias4634: __typename, alias4635: __typename, alias4636: __typename, alias4637: __typename, alias4638: __typename, alias4639: __typename, alias4640: __typename, alias4641: __typename, alias4642: __typename, alias4643: __typename, alias4644: __typename, alias4645: __typename, alias4646: __typename, alias4647: __typename, alias4648: __typename, alias4649: __typename, alias4650: __typename, alias4651: __typename, alias4652: __typename, alias4653: __typename, alias4654: __typename, alias4655: __typename, alias4656: __typename, alias4657: __typename, alias4658: __typename, alias4659: __typename, alias4660: __typename, alias4661: __typename, alias4662: __typename, alias4663: __typename, alias4664: __typename, alias4665: __typename, alias4666: __typename, alias4667: __typename, alias4668: __typename, alias4669: __typename, alias4670: __typename, alias4671: __typename, alias4672: __typename, alias4673: __typename, alias4674: __typename, alias4675: __typename, alias4676: __typename, alias4677: __typename, alias4678: __typename, alias4679: __typename, alias4680: __typename, alias4681: __typename, alias4682: __typename, alias4683: __typename, alias4684: __typename, alias4685: __typename, alias4686: __typename, alias4687: __typename, alias4688: __typename, alias4689: __typename, alias4690: __typename, alias4691: __typename, alias4692: __typename, alias4693: __typename, alias4694: __typename, alias4695: __typename, alias4696: __typename, alias4697: __typename, alias4698: __typename, alias4699: __typename, alias4700: __typename, alias4701: __typename, alias4702: __typename, alias4703: __typename, alias4704: __typename, alias4705: __typename, alias4706: __typename, alias4707: __typename, alias4708: __typename, alias4709: __typename, alias4710: __typename, alias4711: __typename, alias4712: __typename, alias4713: __typename, alias4714: __typename, alias4715: __typename, alias4716: __typename, alias4717: __typename, alias4718: __typename, alias4719: __typename, alias4720: __typename, alias4721: __typename, alias4722: __typename, alias4723: __typename, alias4724: __typename, alias4725: __typename, alias4726: __typename, alias4727: __typename, alias4728: __typename, alias4729: __typename, alias4730: __typename, alias4731: __typename, alias4732: __typename, alias4733: __typename, alias4734: __typename, alias4735: __typename, alias4736: __typename, alias4737: __typename, alias4738: __typename, alias4739: __typename, alias4740: __typename, alias4741: __typename, alias4742: __typename, alias4743: __typename, alias4744: __typename, alias4745: __typename, alias4746: __typename, alias4747: __typename, alias4748: __typename, alias4749: __typename, alias4750: __typename, alias4751: __typename, alias4752: __typename, alias4753: __typename, alias4754: __typename, alias4755: __typename, alias4756: __typename, alias4757: __typename, alias4758: __typename, alias4759: __typename, alias4760: __typename, alias4761: __typename, alias4762: __typename, alias4763: __typename, alias4764: __typename, alias4765: __typename, alias4766: __typename, alias4767: __typename, alias4768: __typename, alias4769: __typename, alias4770: __typename, alias4771: __typename, alias4772: __typename, alias4773: __typename, alias4774: __typename, alias4775: __typename, alias4776: __typename, alias4777: __typename, alias4778: __typename, alias4779: __typename, alias4780: __typename, alias4781: __typename, alias4782: __typename, alias4783: __typename, alias4784: __typename, alias4785: __typename, alias4786: __typename, alias4787: __typename, alias4788: __typename, alias4789: __typename, alias4790: __typename, alias4791: __typename, alias4792: __typename, alias4793: __typename, alias4794: __typename, alias4795: __typename, alias4796: __typename, alias4797: __typename, alias4798: __typename, alias4799: __typename, alias4800: __typename, alias4801: __typename, alias4802: __typename, alias4803: __typename, alias4804: __typename, alias4805: __typename, alias4806: __typename, alias4807: __typename, alias4808: __typename, alias4809: __typename, alias4810: __typename, alias4811: __typename, alias4812: __typename, alias4813: __typename, alias4814: __typename, alias4815: __typename, alias4816: __typename, alias4817: __typename, alias4818: __typename, alias4819: __typename, alias4820: __typename, alias4821: __typename, alias4822: __typename, alias4823: __typename, alias4824: __typename, alias4825: __typename, alias4826: __typename, alias4827: __typename, alias4828: __typename, alias4829: __typename, alias4830: __typename, alias4831: __typename, alias4832: __typename, alias4833: __typename, alias4834: __typename, alias4835: __typename, alias4836: __typename, alias4837: __typename, alias4838: __typename, alias4839: __typename, alias4840: __typename, alias4841: __typename, alias4842: __typename, alias4843: __typename, alias4844: __typename, alias4845: __typename, alias4846: __typename, alias4847: __typename, alias4848: __typename, alias4849: __typename, alias4850: __typename, alias4851: __typename, alias4852: __typename, alias4853: __typename, alias4854: __typename, alias4855: __typename, alias4856: __typename, alias4857: __typename, alias4858: __typename, alias4859: __typename, alias4860: __typename, alias4861: __typename, alias4862: __typename, alias4863: __typename, alias4864: __typename, alias4865: __typename, alias4866: __typename, alias4867: __typename, alias4868: __typename, alias4869: __typename, alias4870: __typename, alias4871: __typename, alias4872: __typename, alias4873: __typename, alias4874: __typename, alias4875: __typename, alias4876: __typename, alias4877: __typename, alias4878: __typename, alias4879: __typename, alias4880: __typename, alias4881: __typename, alias4882: __typename, alias4883: __typename, alias4884: __typename, alias4885: __typename, alias4886: __typename, alias4887: __typename, alias4888: __typename, alias4889: __typename, alias4890: __typename, alias4891: __typename, alias4892: __typename, alias4893: __typename, alias4894: __typename, alias4895: __typename, alias4896: __typename, alias4897: __typename, alias4898: __typename, alias4899: __typename, alias4900: __typename, alias4901: __typename, alias4902: __typename, alias4903: __typename, alias4904: __typename, alias4905: __typename, alias4906: __typename, alias4907: __typename, alias4908: __typename, alias4909: __typename, alias4910: __typename, alias4911: __typename, alias4912: __typename, alias4913: __typename, alias4914: __typename, alias4915: __typename, alias4916: __typename, alias4917: __typename, alias4918: __typename, alias4919: __typename, alias4920: __typename, alias4921: __typename, alias4922: __typename, alias4923: __typename, alias4924: __typename, alias4925: __typename, alias4926: __typename, alias4927: __typename, alias4928: __typename, alias4929: __typename, alias4930: __typename, alias4931: __typename, alias4932: __typename, alias4933: __typename, alias4934: __typename, alias4935: __typename, alias4936: __typename, alias4937: __typename, alias4938: __typename, alias4939: __typename, alias4940: __typename, alias4941: __typename, alias4942: __typename, alias4943: __typename, alias4944: __typename, alias4945: __typename, alias4946: __typename, alias4947: __typename, alias4948: __typename, alias4949: __typename, alias4950: __typename, alias4951: __typename, alias4952: __typename, alias4953: __typename, alias4954: __typename, alias4955: __typename, alias4956: __typename, alias4957: __typename, alias4958: __typename, alias4959: __typename, alias4960: __typename, alias4961: __typename, alias4962: __typename, alias4963: __typename, alias4964: __typename, alias4965: __typename, alias4966: __typename, alias4967: __typename, alias4968: __typename, alias4969: __typename, alias4970: __typename, alias4971: __typename, alias4972: __typename, alias4973: __typename, alias4974: __typename, alias4975: __typename, alias4976: __typename, alias4977: __typename, alias4978: __typename, alias4979: __typename, alias4980: __typename, alias4981: __typename, alias4982: __typename, alias4983: __typename, alias4984: __typename, alias4985: __typename, alias4986: __typename, alias4987: __typename, alias4988: __typename, alias4989: __typename, alias4990: __typename, alias4991: __typename, alias4992: __typename, alias4993: __typename, alias4994: __typename, alias4995: __typename, alias4996: __typename, alias4997: __typename, alias4998: __typename, alias4999: __typename, alias5000: __typename, alias5001: __typename, alias5002: __typename, alias5003: __typename, alias5004: __typename, alias5005: __typename, alias5006: __typename, alias5007: __typename, alias5008: __typename, alias5009: __typename, alias5010: __typename, alias5011: __typename, alias5012: __typename, alias5013: __typename, alias5014: __typename, alias5015: __typename, alias5016: __typename, alias5017: __typename, alias5018: __typename, alias5019: __typename, alias5020: __typename, alias5021: __typename, alias5022: __typename, alias5023: __typename, alias5024: __typename, alias5025: __typename, alias5026: __typename, alias5027: __typename, alias5028: __typename, alias5029: __typename, alias5030: __typename, alias5031: __typename, alias5032: __typename, alias5033: __typename, alias5034: __typename, alias5035: __typename, alias5036: __typename, alias5037: __typename, alias5038: __typename, alias5039: __typename, alias5040: __typename, alias5041: __typename, alias5042: __typename, alias5043: __typename, alias5044: __typename, alias5045: __typename, alias5046: __typename, alias5047: __typename, alias5048: __typename, alias5049: __typename, alias5050: __typename, alias5051: __typename, alias5052: __typename, alias5053: __typename, alias5054: __typename, alias5055: __typename, alias5056: __typename, alias5057: __typename, alias5058: __typename, alias5059: __typename, alias5060: __typename, alias5061: __typename, alias5062: __typename, alias5063: __typename, alias5064: __typename, alias5065: __typename, alias5066: __typename, alias5067: __typename, alias5068: __typename, alias5069: __typename, alias5070: __typename, alias5071: __typename, alias5072: __typename, alias5073: __typename, alias5074: __typename, alias5075: __typename, alias5076: __typename, alias5077: __typename, alias5078: __typename, alias5079: __typename, alias5080: __typename, alias5081: __typename, alias5082: __typename, alias5083: __typename, alias5084: __typename, alias5085: __typename, alias5086: __typename, alias5087: __typename, alias5088: __typename, alias5089: __typename, alias5090: __typename, alias5091: __typename, alias5092: __typename, alias5093: __typename, alias5094: __typename, alias5095: __typename, alias5096: __typename, alias5097: __typename, alias5098: __typename, alias5099: __typename, alias5100: __typename, alias5101: __typename, alias5102: __typename, alias5103: __typename, alias5104: __typename, alias5105: __typename, alias5106: __typename, alias5107: __typename, alias5108: __typename, alias5109: __typename, alias5110: __typename, alias5111: __typename, alias5112: __typename, alias5113: __typename, alias5114: __typename, alias5115: __typename, alias5116: __typename, alias5117: __typename, alias5118: __typename, alias5119: __typename, alias5120: __typename, alias5121: __typename, alias5122: __typename, alias5123: __typename, alias5124: __typename, alias5125: __typename, alias5126: __typename, alias5127: __typename, alias5128: __typename, alias5129: __typename, alias5130: __typename, alias5131: __typename, alias5132: __typename, alias5133: __typename, alias5134: __typename, alias5135: __typename, alias5136: __typename, alias5137: __typename, alias5138: __typename, alias5139: __typename, alias5140: __typename, alias5141: __typename, alias5142: __typename, alias5143: __typename, alias5144: __typename, alias5145: __typename, alias5146: __typename, alias5147: __typename, alias5148: __typename, alias5149: __typename, alias5150: __typename, alias5151: __typename, alias5152: __typename, alias5153: __typename, alias5154: __typename, alias5155: __typename, alias5156: __typename, alias5157: __typename, alias5158: __typename, alias5159: __typename, alias5160: __typename, alias5161: __typename, alias5162: __typename, alias5163: __typename, alias5164: __typename, alias5165: __typename, alias5166: __typename, alias5167: __typename, alias5168: __typename, alias5169: __typename, alias5170: __typename, alias5171: __typename, alias5172: __typename, alias5173: __typename, alias5174: __typename, alias5175: __typename, alias5176: __typename, alias5177: __typename, alias5178: __typename, alias5179: __typename, alias5180: __typename, alias5181: __typename, alias5182: __typename, alias5183: __typename, alias5184: __typename, alias5185: __typename, alias5186: __typename, alias5187: __typename, alias5188: __typename, alias5189: __typename, alias5190: __typename, alias5191: __typename, alias5192: __typename, alias5193: __typename, alias5194: __typename, alias5195: __typename, alias5196: __typename, alias5197: __typename, alias5198: __typename, alias5199: __typename, alias5200: __typename, alias5201: __typename, alias5202: __typename, alias5203: __typename, alias5204: __typename, alias5205: __typename, alias5206: __typename, alias5207: __typename, alias5208: __typename, alias5209: __typename, alias5210: __typename, alias5211: __typename, alias5212: __typename, alias5213: __typename, alias5214: __typename, alias5215: __typename, alias5216: __typename, alias5217: __typename, alias5218: __typename, alias5219: __typename, alias5220: __typename, alias5221: __typename, alias5222: __typename, alias5223: __typename, alias5224: __typename, alias5225: __typename, alias5226: __typename, alias5227: __typename, alias5228: __typename, alias5229: __typename, alias5230: __typename, alias5231: __typename, alias5232: __typename, alias5233: __typename, alias5234: __typename, alias5235: __typename, alias5236: __typename, alias5237: __typename, alias5238: __typename, alias5239: __typename, alias5240: __typename, alias5241: __typename, alias5242: __typename, alias5243: __typename, alias5244: __typename, alias5245: __typename, alias5246: __typename, alias5247: __typename, alias5248: __typename, alias5249: __typename, alias5250: __typename, alias5251: __typename, alias5252: __typename, alias5253: __typename, alias5254: __typename, alias5255: __typename, alias5256: __typename, alias5257: __typename, alias5258: __typename, alias5259: __typename, alias5260: __typename, alias5261: __typename, alias5262: __typename, alias5263: __typename, alias5264: __typename, alias5265: __typename, alias5266: __typename, alias5267: __typename, alias5268: __typename, alias5269: __typename, alias5270: __typename, alias5271: __typename, alias5272: __typename, alias5273: __typename, alias5274: __typename, alias5275: __typename, alias5276: __typename, alias5277: __typename, alias5278: __typename, alias5279: __typename, alias5280: __typename, alias5281: __typename, alias5282: __typename, alias5283: __typename, alias5284: __typename, alias5285: __typename, alias5286: __typename, alias5287: __typename, alias5288: __typename, alias5289: __typename, alias5290: __typename, alias5291: __typename, alias5292: __typename, alias5293: __typename, alias5294: __typename, alias5295: __typename, alias5296: __typename, alias5297: __typename, alias5298: __typename, alias5299: __typename, alias5300: __typename, alias5301: __typename, alias5302: __typename, alias5303: __typename, alias5304: __typename, alias5305: __typename, alias5306: __typename, alias5307: __typename, alias5308: __typename, alias5309: __typename, alias5310: __typename, alias5311: __typename, alias5312: __typename, alias5313: __typename, alias5314: __typename, alias5315: __typename, alias5316: __typename, alias5317: __typename, alias5318: __typename, alias5319: __typename, alias5320: __typename, alias5321: __typename, alias5322: __typename, alias5323: __typename, alias5324: __typename, alias5325: __typename, alias5326: __typename, alias5327: __typename, alias5328: __typename, alias5329: __typename, alias5330: __typename, alias5331: __typename, alias5332: __typename, alias5333: __typename, alias5334: __typename, alias5335: __typename, alias5336: __typename, alias5337: __typename, alias5338: __typename, alias5339: __typename, alias5340: __typename, alias5341: __typename, alias5342: __typename, alias5343: __typename, alias5344: __typename, alias5345: __typename, alias5346: __typename, alias5347: __typename, alias5348: __typename, alias5349: __typename, alias5350: __typename, alias5351: __typename, alias5352: __typename, alias5353: __typename, alias5354: __typename, alias5355: __typename, alias5356: __typename, alias5357: __typename, alias5358: __typename, alias5359: __typename, alias5360: __typename, alias5361: __typename, alias5362: __typename, alias5363: __typename, alias5364: __typename, alias5365: __typename, alias5366: __typename, alias5367: __typename, alias5368: __typename, alias5369: __typename, alias5370: __typename, alias5371: __typename, alias5372: __typename, alias5373: __typename, alias5374: __typename, alias5375: __typename, alias5376: __typename, alias5377: __typename, alias5378: __typename, alias5379: __typename, alias5380: __typename, alias5381: __typename, alias5382: __typename, alias5383: __typename, alias5384: __typename, alias5385: __typename, alias5386: __typename, alias5387: __typename, alias5388: __typename, alias5389: __typename, alias5390: __typename, alias5391: __typename, alias5392: __typename, alias5393: __typename, alias5394: __typename, alias5395: __typename, alias5396: __typename, alias5397: __typename, alias5398: __typename, alias5399: __typename, alias5400: __typename, alias5401: __typename, alias5402: __typename, alias5403: __typename, alias5404: __typename, alias5405: __typename, alias5406: __typename, alias5407: __typename, alias5408: __typename, alias5409: __typename, alias5410: __typename, alias5411: __typename, alias5412: __typename, alias5413: __typename, alias5414: __typename, alias5415: __typename, alias5416: __typename, alias5417: __typename, alias5418: __typename, alias5419: __typename, alias5420: __typename, alias5421: __typename, alias5422: __typename, alias5423: __typename, alias5424: __typename, alias5425: __typename, alias5426: __typename, alias5427: __typename, alias5428: __typename, alias5429: __typename, alias5430: __typename, alias5431: __typename, alias5432: __typename, alias5433: __typename, alias5434: __typename, alias5435: __typename, alias5436: __typename, alias5437: __typename, alias5438: __typename, alias5439: __typename, alias5440: __typename, alias5441: __typename, alias5442: __typename, alias5443: __typename, alias5444: __typename, alias5445: __typename, alias5446: __typename, alias5447: __typename, alias5448: __typename, alias5449: __typename, alias5450: __typename, alias5451: __typename, alias5452: __typename, alias5453: __typename, alias5454: __typename, alias5455: __typename, alias5456: __typename, alias5457: __typename, alias5458: __typename, alias5459: __typename, alias5460: __typename, alias5461: __typename, alias5462: __typename, alias5463: __typename, alias5464: __typename, alias5465: __typename, alias5466: __typename, alias5467: __typename, alias5468: __typename, alias5469: __typename, alias5470: __typename, alias5471: __typename, alias5472: __typename, alias5473: __typename, alias5474: __typename, alias5475: __typename, alias5476: __typename, alias5477: __typename, alias5478: __typename, alias5479: __typename, alias5480: __typename, alias5481: __typename, alias5482: __typename, alias5483: __typename, alias5484: __typename, alias5485: __typename, alias5486: __typename, alias5487: __typename, alias5488: __typename, alias5489: __typename, alias5490: __typename, alias5491: __typename, alias5492: __typename, alias5493: __typename, alias5494: __typename, alias5495: __typename, alias5496: __typename, alias5497: __typename, alias5498: __typename, alias5499: __typename, alias5500: __typename, alias5501: __typename, alias5502: __typename, alias5503: __typename, alias5504: __typename, alias5505: __typename, alias5506: __typename, alias5507: __typename, alias5508: __typename, alias5509: __typename, alias5510: __typename, alias5511: __typename, alias5512: __typename, alias5513: __typename, alias5514: __typename, alias5515: __typename, alias5516: __typename, alias5517: __typename, alias5518: __typename, alias5519: __typename, alias5520: __typename, alias5521: __typename, alias5522: __typename, alias5523: __typename, alias5524: __typename, alias5525: __typename, alias5526: __typename, alias5527: __typename, alias5528: __typename, alias5529: __typename, alias5530: __typename, alias5531: __typename, alias5532: __typename, alias5533: __typename, alias5534: __typename, alias5535: __typename, alias5536: __typename, alias5537: __typename, alias5538: __typename, alias5539: __typename, alias5540: __typename, alias5541: __typename, alias5542: __typename, alias5543: __typename, alias5544: __typename, alias5545: __typename, alias5546: __typename, alias5547: __typename, alias5548: __typename, alias5549: __typename, alias5550: __typename, alias5551: __typename, alias5552: __typename, alias5553: __typename, alias5554: __typename, alias5555: __typename, alias5556: __typename, alias5557: __typename, alias5558: __typename, alias5559: __typename, alias5560: __typename, alias5561: __typename, alias5562: __typename, alias5563: __typename, alias5564: __typename, alias5565: __typename, alias5566: __typename, alias5567: __typename, alias5568: __typename, alias5569: __typename, alias5570: __typename, alias5571: __typename, alias5572: __typename, alias5573: __typename, alias5574: __typename, alias5575: __typename, alias5576: __typename, alias5577: __typename, alias5578: __typename, alias5579: __typename, alias5580: __typename, alias5581: __typename, alias5582: __typename, alias5583: __typename, alias5584: __typename, alias5585: __typename, alias5586: __typename, alias5587: __typename, alias5588: __typename, alias5589: __typename, alias5590: __typename, alias5591: __typename, alias5592: __typename, alias5593: __typename, alias5594: __typename, alias5595: __typename, alias5596: __typename, alias5597: __typename, alias5598: __typename, alias5599: __typename, alias5600: __typename, alias5601: __typename, alias5602: __typename, alias5603: __typename, alias5604: __typename, alias5605: __typename, alias5606: __typename, alias5607: __typename, alias5608: __typename, alias5609: __typename, alias5610: __typename, alias5611: __typename, alias5612: __typename, alias5613: __typename, alias5614: __typename, alias5615: __typename, alias5616: __typename, alias5617: __typename, alias5618: __typename, alias5619: __typename, alias5620: __typename, alias5621: __typename, alias5622: __typename, alias5623: __typename, alias5624: __typename, alias5625: __typename, alias5626: __typename, alias5627: __typename, alias5628: __typename, alias5629: __typename, alias5630: __typename, alias5631: __typename, alias5632: __typename, alias5633: __typename, alias5634: __typename, alias5635: __typename, alias5636: __typename, alias5637: __typename, alias5638: __typename, alias5639: __typename, alias5640: __typename, alias5641: __typename, alias5642: __typename, alias5643: __typename, alias5644: __typename, alias5645: __typename, alias5646: __typename, alias5647: __typename, alias5648: __typename, alias5649: __typename, alias5650: __typename, alias5651: __typename, alias5652: __typename, alias5653: __typename, alias5654: __typename, alias5655: __typename, alias5656: __typename, alias5657: __typename, alias5658: __typename, alias5659: __typename, alias5660: __typename, alias5661: __typename, alias5662: __typename, alias5663: __typename, alias5664: __typename, alias5665: __typename, alias5666: __typename, alias5667: __typename, alias5668: __typename, alias5669: __typename, alias5670: __typename, alias5671: __typename, alias5672: __typename, alias5673: __typename, alias5674: __typename, alias5675: __typename, alias5676: __typename, alias5677: __typename, alias5678: __typename, alias5679: __typename, alias5680: __typename, alias5681: __typename, alias5682: __typename, alias5683: __typename, alias5684: __typename, alias5685: __typename, alias5686: __typename, alias5687: __typename, alias5688: __typename, alias5689: __typename, alias5690: __typename, alias5691: __typename, alias5692: __typename, alias5693: __typename, alias5694: __typename, alias5695: __typename, alias5696: __typename, alias5697: __typename, alias5698: __typename, alias5699: __typename, alias5700: __typename, alias5701: __typename, alias5702: __typename, alias5703: __typename, alias5704: __typename, alias5705: __typename, alias5706: __typename, alias5707: __typename, alias5708: __typename, alias5709: __typename, alias5710: __typename, alias5711: __typename, alias5712: __typename, alias5713: __typename, alias5714: __typename, alias5715: __typename, alias5716: __typename, alias5717: __typename, alias5718: __typename, alias5719: __typename, alias5720: __typename, alias5721: __typename, alias5722: __typename, alias5723: __typename, alias5724: __typename, alias5725: __typename, alias5726: __typename, alias5727: __typename, alias5728: __typename, alias5729: __typename, alias5730: __typename, alias5731: __typename, alias5732: __typename, alias5733: __typename, alias5734: __typename, alias5735: __typename, alias5736: __typename, alias5737: __typename, alias5738: __typename, alias5739: __typename, alias5740: __typename, alias5741: __typename, alias5742: __typename, alias5743: __typename, alias5744: __typename, alias5745: __typename, alias5746: __typename, alias5747: __typename, alias5748: __typename, alias5749: __typename, alias5750: __typename, alias5751: __typename, alias5752: __typename, alias5753: __typename, alias5754: __typename, alias5755: __typename, alias5756: __typename, alias5757: __typename, alias5758: __typename, alias5759: __typename, alias5760: __typename, alias5761: __typename, alias5762: __typename, alias5763: __typename, alias5764: __typename, alias5765: __typename, alias5766: __typename, alias5767: __typename, alias5768: __typename, alias5769: __typename, alias5770: __typename, alias5771: __typename, alias5772: __typename, alias5773: __typename, alias5774: __typename, alias5775: __typename, alias5776: __typename, alias5777: __typename, alias5778: __typename, alias5779: __typename, alias5780: __typename, alias5781: __typename, alias5782: __typename, alias5783: __typename, alias5784: __typename, alias5785: __typename, alias5786: __typename, alias5787: __typename, alias5788: __typename, alias5789: __typename, alias5790: __typename, alias5791: __typename, alias5792: __typename, alias5793: __typename, alias5794: __typename, alias5795: __typename, alias5796: __typename, alias5797: __typename, alias5798: __typename, alias5799: __typename, alias5800: __typename, alias5801: __typename, alias5802: __typename, alias5803: __typename, alias5804: __typename, alias5805: __typename, alias5806: __typename, alias5807: __typename, alias5808: __typename, alias5809: __typename, alias5810: __typename, alias5811: __typename, alias5812: __typename, alias5813: __typename, alias5814: __typename, alias5815: __typename, alias5816: __typename, alias5817: __typename, alias5818: __typename, alias5819: __typename, alias5820: __typename, alias5821: __typename, alias5822: __typename, alias5823: __typename, alias5824: __typename, alias5825: __typename, alias5826: __typename, alias5827: __typename, alias5828: __typename, alias5829: __typename, alias5830: __typename, alias5831: __typename, alias5832: __typename, alias5833: __typename, alias5834: __typename, alias5835: __typename, alias5836: __typename, alias5837: __typename, alias5838: __typename, alias5839: __typename, alias5840: __typename, alias5841: __typename, alias5842: __typename, alias5843: __typename, alias5844: __typename, alias5845: __typename, alias5846: __typename, alias5847: __typename, alias5848: __typename, alias5849: __typename, alias5850: __typename, alias5851: __typename, alias5852: __typename, alias5853: __typename, alias5854: __typename, alias5855: __typename, alias5856: __typename, alias5857: __typename, alias5858: __typename, alias5859: __typename, alias5860: __typename, alias5861: __typename, alias5862: __typename, alias5863: __typename, alias5864: __typename, alias5865: __typename, alias5866: __typename, alias5867: __typename, alias5868: __typename, alias5869: __typename, alias5870: __typename, alias5871: __typename, alias5872: __typename, alias5873: __typename, alias5874: __typename, alias5875: __typename, alias5876: __typename, alias5877: __typename, alias5878: __typename, alias5879: __typename, alias5880: __typename, alias5881: __typename, alias5882: __typename, alias5883: __typename, alias5884: __typename, alias5885: __typename, alias5886: __typename, alias5887: __typename, alias5888: __typename, alias5889: __typename, alias5890: __typename, alias5891: __typename, alias5892: __typename, alias5893: __typename, alias5894: __typename, alias5895: __typename, alias5896: __typename, alias5897: __typename, alias5898: __typename, alias5899: __typename, alias5900: __typename, alias5901: __typename, alias5902: __typename, alias5903: __typename, alias5904: __typename, alias5905: __typename, alias5906: __typename, alias5907: __typename, alias5908: __typename, alias5909: __typename, alias5910: __typename, alias5911: __typename, alias5912: __typename, alias5913: __typename, alias5914: __typename, alias5915: __typename, alias5916: __typename, alias5917: __typename, alias5918: __typename, alias5919: __typename, alias5920: __typename, alias5921: __typename, alias5922: __typename, alias5923: __typename, alias5924: __typename, alias5925: __typename, alias5926: __typename, alias5927: __typename, alias5928: __typename, alias5929: __typename, alias5930: __typename, alias5931: __typename, alias5932: __typename, alias5933: __typename, alias5934: __typename, alias5935: __typename, alias5936: __typename, alias5937: __typename, alias5938: __typename, alias5939: __typename, alias5940: __typename, alias5941: __typename, alias5942: __typename, alias5943: __typename, alias5944: __typename, alias5945: __typename, alias5946: __typename, alias5947: __typename, alias5948: __typename, alias5949: __typename, alias5950: __typename, alias5951: __typename, alias5952: __typename, alias5953: __typename, alias5954: __typename, alias5955: __typename, alias5956: __typename, alias5957: __typename, alias5958: __typename, alias5959: __typename, alias5960: __typename, alias5961: __typename, alias5962: __typename, alias5963: __typename, alias5964: __typename, alias5965: __typename, alias5966: __typename, alias5967: __typename, alias5968: __typename, alias5969: __typename, alias5970: __typename, alias5971: __typename, alias5972: __typename, alias5973: __typename, alias5974: __typename, alias5975: __typename, alias5976: __typename, alias5977: __typename, alias5978: __typename, alias5979: __typename, alias5980: __typename, alias5981: __typename, alias5982: __typename, alias5983: __typename, alias5984: __typename, alias5985: __typename, alias5986: __typename, alias5987: __typename, alias5988: __typename, alias5989: __typename, alias5990: __typename, alias5991: __typename, alias5992: __typename, alias5993: __typename, alias5994: __typename, alias5995: __typename, alias5996: __typename, alias5997: __typename, alias5998: __typename, alias5999: __typename, alias6000: __typename, alias6001: __typename, alias6002: __typename, alias6003: __typename, alias6004: __typename, alias6005: __typename, alias6006: __typename, alias6007: __typename, alias6008: __typename, alias6009: __typename, alias6010: __typename, alias6011: __typename, alias6012: __typename, alias6013: __typename, alias6014: __typename, alias6015: __typename, alias6016: __typename, alias6017: __typename, alias6018: __typename, alias6019: __typename, alias6020: __typename, alias6021: __typename, alias6022: __typename, alias6023: __typename, alias6024: __typename, alias6025: __typename, alias6026: __typename, alias6027: __typename, alias6028: __typename, alias6029: __typename, alias6030: __typename, alias6031: __typename, alias6032: __typename, alias6033: __typename, alias6034: __typename, alias6035: __typename, alias6036: __typename, alias6037: __typename, alias6038: __typename, alias6039: __typename, alias6040: __typename, alias6041: __typename, alias6042: __typename, alias6043: __typename, alias6044: __typename, alias6045: __typename, alias6046: __typename, alias6047: __typename, alias6048: __typename, alias6049: __typename, alias6050: __typename, alias6051: __typename, alias6052: __typename, alias6053: __typename, alias6054: __typename, alias6055: __typename, alias6056: __typename, alias6057: __typename, alias6058: __typename, alias6059: __typename, alias6060: __typename, alias6061: __typename, alias6062: __typename, alias6063: __typename, alias6064: __typename, alias6065: __typename, alias6066: __typename, alias6067: __typename, alias6068: __typename, alias6069: __typename, alias6070: __typename, alias6071: __typename, alias6072: __typename, alias6073: __typename, alias6074: __typename, alias6075: __typename, alias6076: __typename, alias6077: __typename, alias6078: __typename, alias6079: __typename, alias6080: __typename, alias6081: __typename, alias6082: __typename, alias6083: __typename, alias6084: __typename, alias6085: __typename, alias6086: __typename, alias6087: __typename, alias6088: __typename, alias6089: __typename, alias6090: __typename, alias6091: __typename, alias6092: __typename, alias6093: __typename, alias6094: __typename, alias6095: __typename, alias6096: __typename, alias6097: __typename, alias6098: __typename, alias6099: __typename, alias6100: __typename, alias6101: __typename, alias6102: __typename, alias6103: __typename, alias6104: __typename, alias6105: __typename, alias6106: __typename, alias6107: __typename, alias6108: __typename, alias6109: __typename, alias6110: __typename, alias6111: __typename, alias6112: __typename, alias6113: __typename, alias6114: __typename, alias6115: __typename, alias6116: __typename, alias6117: __typename, alias6118: __typename, alias6119: __typename, alias6120: __typename, alias6121: __typename, alias6122: __typename, alias6123: __typename, alias6124: __typename, alias6125: __typename, alias6126: __typename, alias6127: __typename, alias6128: __typename, alias6129: __typename, alias6130: __typename, alias6131: __typename, alias6132: __typename, alias6133: __typename, alias6134: __typename, alias6135: __typename, alias6136: __typename, alias6137: __typename, alias6138: __typename, alias6139: __typename, alias6140: __typename, alias6141: __typename, alias6142: __typename, alias6143: __typename, alias6144: __typename, alias6145: __typename, alias6146: __typename, alias6147: __typename, alias6148: __typename, alias6149: __typename, alias6150: __typename, alias6151: __typename, alias6152: __typename, alias6153: __typename, alias6154: __typename, alias6155: __typename, alias6156: __typename, alias6157: __typename, alias6158: __typename, alias6159: __typename, alias6160: __typename, alias6161: __typename, alias6162: __typename, alias6163: __typename, alias6164: __typename, alias6165: __typename, alias6166: __typename, alias6167: __typename, alias6168: __typename, alias6169: __typename, alias6170: __typename, alias6171: __typename, alias6172: __typename, alias6173: __typename, alias6174: __typename, alias6175: __typename, alias6176: __typename, alias6177: __typename, alias6178: __typename, alias6179: __typename, alias6180: __typename, alias6181: __typename, alias6182: __typename, alias6183: __typename, alias6184: __typename, alias6185: __typename, alias6186: __typename, alias6187: __typename, alias6188: __typename, alias6189: __typename, alias6190: __typename, alias6191: __typename, alias6192: __typename, alias6193: __typename, alias6194: __typename, alias6195: __typename, alias6196: __typename, alias6197: __typename, alias6198: __typename, alias6199: __typename, alias6200: __typename, alias6201: __typename, alias6202: __typename, alias6203: __typename, alias6204: __typename, alias6205: __typename, alias6206: __typename, alias6207: __typename, alias6208: __typename, alias6209: __typename, alias6210: __typename, alias6211: __typename, alias6212: __typename, alias6213: __typename, alias6214: __typename, alias6215: __typename, alias6216: __typename, alias6217: __typename, alias6218: __typename, alias6219: __typename, alias6220: __typename, alias6221: __typename, alias6222: __typename, alias6223: __typename, alias6224: __typename, alias6225: __typename, alias6226: __typename, alias6227: __typename, alias6228: __typename, alias6229: __typename, alias6230: __typename, alias6231: __typename, alias6232: __typename, alias6233: __typename, alias6234: __typename, alias6235: __typename, alias6236: __typename, alias6237: __typename, alias6238: __typename, alias6239: __typename, alias6240: __typename, alias6241: __typename, alias6242: __typename, alias6243: __typename, alias6244: __typename, alias6245: __typename, alias6246: __typename, alias6247: __typename, alias6248: __typename, alias6249: __typename, alias6250: __typename, alias6251: __typename, alias6252: __typename, alias6253: __typename, alias6254: __typename, alias6255: __typename, alias6256: __typename, alias6257: __typename, alias6258: __typename, alias6259: __typename, alias6260: __typename, alias6261: __typename, alias6262: __typename, alias6263: __typename, alias6264: __typename, alias6265: __typename, alias6266: __typename, alias6267: __typename, alias6268: __typename, alias6269: __typename, alias6270: __typename, alias6271: __typename, alias6272: __typename, alias6273: __typename, alias6274: __typename, alias6275: __typename, alias6276: __typename, alias6277: __typename, alias6278: __typename, alias6279: __typename, alias6280: __typename, alias6281: __typename, alias6282: __typename, alias6283: __typename, alias6284: __typename, alias6285: __typename, alias6286: __typename, alias6287: __typename, alias6288: __typename, alias6289: __typename, alias6290: __typename, alias6291: __typename, alias6292: __typename, alias6293: __typename, alias6294: __typename, alias6295: __typename, alias6296: __typename, alias6297: __typename, alias6298: __typename, alias6299: __typename, alias6300: __typename, alias6301: __typename, alias6302: __typename, alias6303: __typename, alias6304: __typename, alias6305: __typename, alias6306: __typename, alias6307: __typename, alias6308: __typename, alias6309: __typename, alias6310: __typename, alias6311: __typename, alias6312: __typename, alias6313: __typename, alias6314: __typename, alias6315: __typename, alias6316: __typename, alias6317: __typename, alias6318: __typename, alias6319: __typename, alias6320: __typename, alias6321: __typename, alias6322: __typename, alias6323: __typename, alias6324: __typename, alias6325: __typename, alias6326: __typename, alias6327: __typename, alias6328: __typename, alias6329: __typename, alias6330: __typename, alias6331: __typename, alias6332: __typename, alias6333: __typename, alias6334: __typename, alias6335: __typename, alias6336: __typename, alias6337: __typename, alias6338: __typename, alias6339: __typename, alias6340: __typename, alias6341: __typename, alias6342: __typename, alias6343: __typename, alias6344: __typename, alias6345: __typename, alias6346: __typename, alias6347: __typename, alias6348: __typename, alias6349: __typename, alias6350: __typename, alias6351: __typename, alias6352: __typename, alias6353: __typename, alias6354: __typename, alias6355: __typename, alias6356: __typename, alias6357: __typename, alias6358: __typename, alias6359: __typename, alias6360: __typename, alias6361: __typename, alias6362: __typename, alias6363: __typename, alias6364: __typename, alias6365: __typename, alias6366: __typename, alias6367: __typename, alias6368: __typename, alias6369: __typename, alias6370: __typename, alias6371: __typename, alias6372: __typename, alias6373: __typename, alias6374: __typename, alias6375: __typename, alias6376: __typename, alias6377: __typename, alias6378: __typename, alias6379: __typename, alias6380: __typename, alias6381: __typename, alias6382: __typename, alias6383: __typename, alias6384: __typename, alias6385: __typename, alias6386: __typename, alias6387: __typename, alias6388: __typename, alias6389: __typename, alias6390: __typename, alias6391: __typename, alias6392: __typename, alias6393: __typename, alias6394: __typename, alias6395: __typename, alias6396: __typename, alias6397: __typename, alias6398: __typename, alias6399: __typename, alias6400: __typename, alias6401: __typename, alias6402: __typename, alias6403: __typename, alias6404: __typename, alias6405: __typename, alias6406: __typename, alias6407: __typename, alias6408: __typename, alias6409: __typename, alias6410: __typename, alias6411: __typename, alias6412: __typename, alias6413: __typename, alias6414: __typename, alias6415: __typename, alias6416: __typename, alias6417: __typename, alias6418: __typename, alias6419: __typename, alias6420: __typename, alias6421: __typename, alias6422: __typename, alias6423: __typename, alias6424: __typename, alias6425: __typename, alias6426: __typename, alias6427: __typename, alias6428: __typename, alias6429: __typename, alias6430: __typename, alias6431: __typename, alias6432: __typename, alias6433: __typename, alias6434: __typename, alias6435: __typename, alias6436: __typename, alias6437: __typename, alias6438: __typename, alias6439: __typename, alias6440: __typename, alias6441: __typename, alias6442: __typename, alias6443: __typename, alias6444: __typename, alias6445: __typename, alias6446: __typename, alias6447: __typename, alias6448: __typename, alias6449: __typename, alias6450: __typename, alias6451: __typename, alias6452: __typename, alias6453: __typename, alias6454: __typename, alias6455: __typename, alias6456: __typename, alias6457: __typename, alias6458: __typename, alias6459: __typename, alias6460: __typename, alias6461: __typename, alias6462: __typename, alias6463: __typename, alias6464: __typename, alias6465: __typename, alias6466: __typename, alias6467: __typename, alias6468: __typename, alias6469: __typename, alias6470: __typename, alias6471: __typename, alias6472: __typename, alias6473: __typename, alias6474: __typename, alias6475: __typename, alias6476: __typename, alias6477: __typename, alias6478: __typename, alias6479: __typename, alias6480: __typename, alias6481: __typename, alias6482: __typename, alias6483: __typename, alias6484: __typename, alias6485: __typename, alias6486: __typename, alias6487: __typename, alias6488: __typename, alias6489: __typename, alias6490: __typename, alias6491: __typename, alias6492: __typename, alias6493: __typename, alias6494: __typename, alias6495: __typename, alias6496: __typename, alias6497: __typename, alias6498: __typename, alias6499: __typename, alias6500: __typename, alias6501: __typename, alias6502: __typename, alias6503: __typename, alias6504: __typename, alias6505: __typename, alias6506: __typename, alias6507: __typename, alias6508: __typename, alias6509: __typename, alias6510: __typename, alias6511: __typename, alias6512: __typename, alias6513: __typename, alias6514: __typename, alias6515: __typename, alias6516: __typename, alias6517: __typename, alias6518: __typename, alias6519: __typename, alias6520: __typename, alias6521: __typename, alias6522: __typename, alias6523: __typename, alias6524: __typename, alias6525: __typename, alias6526: __typename, alias6527: __typename, alias6528: __typename, alias6529: __typename, alias6530: __typename, alias6531: __typename, alias6532: __typename, alias6533: __typename, alias6534: __typename, alias6535: __typename, alias6536: __typename, alias6537: __typename, alias6538: __typename, alias6539: __typename, alias6540: __typename, alias6541: __typename, alias6542: __typename, alias6543: __typename, alias6544: __typename, alias6545: __typename, alias6546: __typename, alias6547: __typename, alias6548: __typename, alias6549: __typename, alias6550: __typename, alias6551: __typename, alias6552: __typename, alias6553: __typename, alias6554: __typename, alias6555: __typename, alias6556: __typename, alias6557: __typename, alias6558: __typename, alias6559: __typename, alias6560: __typename, alias6561: __typename, alias6562: __typename, alias6563: __typename, alias6564: __typename, alias6565: __typename, alias6566: __typename, alias6567: __typename, alias6568: __typename, alias6569: __typename, alias6570: __typename, alias6571: __typename, alias6572: __typename, alias6573: __typename, alias6574: __typename, alias6575: __typename, alias6576: __typename, alias6577: __typename, alias6578: __typename, alias6579: __typename, alias6580: __typename, alias6581: __typename, alias6582: __typename, alias6583: __typename, alias6584: __typename, alias6585: __typename, alias6586: __typename, alias6587: __typename, alias6588: __typename, alias6589: __typename, alias6590: __typename, alias6591: __typename, alias6592: __typename, alias6593: __typename, alias6594: __typename, alias6595: __typename, alias6596: __typename, alias6597: __typename, alias6598: __typename, alias6599: __typename, alias6600: __typename, alias6601: __typename, alias6602: __typename, alias6603: __typename, alias6604: __typename, alias6605: __typename, alias6606: __typename, alias6607: __typename, alias6608: __typename, alias6609: __typename, alias6610: __typename, alias6611: __typename, alias6612: __typename, alias6613: __typename, alias6614: __typename, alias6615: __typename, alias6616: __typename, alias6617: __typename, alias6618: __typename, alias6619: __typename, alias6620: __typename, alias6621: __typename, alias6622: __typename, alias6623: __typename, alias6624: __typename, alias6625: __typename, alias6626: __typename, alias6627: __typename, alias6628: __typename, alias6629: __typename, alias6630: __typename, alias6631: __typename, alias6632: __typename, alias6633: __typename, alias6634: __typename, alias6635: __typename, alias6636: __typename, alias6637: __typename, alias6638: __typename, alias6639: __typename, alias6640: __typename, alias6641: __typename, alias6642: __typename, alias6643: __typename, alias6644: __typename, alias6645: __typename, alias6646: __typename, alias6647: __typename, alias6648: __typename, alias6649: __typename, alias6650: __typename, alias6651: __typename, alias6652: __typename, alias6653: __typename, alias6654: __typename, alias6655: __typename, alias6656: __typename, alias6657: __typename, alias6658: __typename, alias6659: __typename, alias6660: __typename, alias6661: __typename, alias6662: __typename, alias6663: __typename, alias6664: __typename, alias6665: __typename, alias6666: __typename, alias6667: __typename, alias6668: __typename, alias6669: __typename, alias6670: __typename, alias6671: __typename, alias6672: __typename, alias6673: __typename, alias6674: __typename, alias6675: __typename, alias6676: __typename, alias6677: __typename, alias6678: __typename, alias6679: __typename, alias6680: __typename, alias6681: __typename, alias6682: __typename, alias6683: __typename, alias6684: __typename, alias6685: __typename, alias6686: __typename, alias6687: __typename, alias6688: __typename, alias6689: __typename, alias6690: __typename, alias6691: __typename, alias6692: __typename, alias6693: __typename, alias6694: __typename, alias6695: __typename, alias6696: __typename, alias6697: __typename, alias6698: __typename, alias6699: __typename, alias6700: __typename, alias6701: __typename, alias6702: __typename, alias6703: __typename, alias6704: __typename, alias6705: __typename, alias6706: __typename, alias6707: __typename, alias6708: __typename, alias6709: __typename, alias6710: __typename, alias6711: __typename, alias6712: __typename, alias6713: __typename, alias6714: __typename, alias6715: __typename, alias6716: __typename, alias6717: __typename, alias6718: __typename, alias6719: __typename, alias6720: __typename, alias6721: __typename, alias6722: __typename, alias6723: __typename, alias6724: __typename, alias6725: __typename, alias6726: __typename, alias6727: __typename, alias6728: __typename, alias6729: __typename, alias6730: __typename, alias6731: __typename, alias6732: __typename, alias6733: __typename, alias6734: __typename, alias6735: __typename, alias6736: __typename, alias6737: __typename, alias6738: __typename, alias6739: __typename, alias6740: __typename, alias6741: __typename, alias6742: __typename, alias6743: __typename, alias6744: __typename, alias6745: __typename, alias6746: __typename, alias6747: __typename, alias6748: __typename, alias6749: __typename, alias6750: __typename, alias6751: __typename, alias6752: __typename, alias6753: __typename, alias6754: __typename, alias6755: __typename, alias6756: __typename, alias6757: __typename, alias6758: __typename, alias6759: __typename, alias6760: __typename, alias6761: __typename, alias6762: __typename, alias6763: __typename, alias6764: __typename, alias6765: __typename, alias6766: __typename, alias6767: __typename, alias6768: __typename, alias6769: __typename, alias6770: __typename, alias6771: __typename, alias6772: __typename, alias6773: __typename, alias6774: __typename, alias6775: __typename, alias6776: __typename, alias6777: __typename, alias6778: __typename, alias6779: __typename, alias6780: __typename, alias6781: __typename, alias6782: __typename, alias6783: __typename, alias6784: __typename, alias6785: __typename, alias6786: __typename, alias6787: __typename, alias6788: __typename, alias6789: __typename, alias6790: __typename, alias6791: __typename, alias6792: __typename, alias6793: __typename, alias6794: __typename, alias6795: __typename, alias6796: __typename, alias6797: __typename, alias6798: __typename, alias6799: __typename, alias6800: __typename, alias6801: __typename, alias6802: __typename, alias6803: __typename, alias6804: __typename, alias6805: __typename, alias6806: __typename, alias6807: __typename, alias6808: __typename, alias6809: __typename, alias6810: __typename, alias6811: __typename, alias6812: __typename, alias6813: __typename, alias6814: __typename, alias6815: __typename, alias6816: __typename, alias6817: __typename, alias6818: __typename, alias6819: __typename, alias6820: __typename, alias6821: __typename, alias6822: __typename, alias6823: __typename, alias6824: __typename, alias6825: __typename, alias6826: __typename, alias6827: __typename, alias6828: __typename, alias6829: __typename, alias6830: __typename, alias6831: __typename, alias6832: __typename, alias6833: __typename, alias6834: __typename, alias6835: __typename, alias6836: __typename, alias6837: __typename, alias6838: __typename, alias6839: __typename, alias6840: __typename, alias6841: __typename, alias6842: __typename, alias6843: __typename, alias6844: __typename, alias6845: __typename, alias6846: __typename, alias6847: __typename, alias6848: __typename, alias6849: __typename, alias6850: __typename, alias6851: __typename, alias6852: __typename, alias6853: __typename, alias6854: __typename, alias6855: __typename, alias6856: __typename, alias6857: __typename, alias6858: __typename, alias6859: __typename, alias6860: __typename, alias6861: __typename, alias6862: __typename, alias6863: __typename, alias6864: __typename, alias6865: __typename, alias6866: __typename, alias6867: __typename, alias6868: __typename, alias6869: __typename, alias6870: __typename, alias6871: __typename, alias6872: __typename, alias6873: __typename, alias6874: __typename, alias6875: __typename, alias6876: __typename, alias6877: __typename, alias6878: __typename, alias6879: __typename, alias6880: __typename, alias6881: __typename, alias6882: __typename, alias6883: __typename, alias6884: __typename, alias6885: __typename, alias6886: __typename, alias6887: __typename, alias6888: __typename, alias6889: __typename, alias6890: __typename, alias6891: __typename, alias6892: __typename, alias6893: __typename, alias6894: __typename, alias6895: __typename, alias6896: __typename, alias6897: __typename, alias6898: __typename, alias6899: __typename, alias6900: __typename, alias6901: __typename, alias6902: __typename, alias6903: __typename, alias6904: __typename, alias6905: __typename, alias6906: __typename, alias6907: __typename, alias6908: __typename, alias6909: __typename, alias6910: __typename, alias6911: __typename, alias6912: __typename, alias6913: __typename, alias6914: __typename, alias6915: __typename, alias6916: __typename, alias6917: __typename, alias6918: __typename, alias6919: __typename, alias6920: __typename, alias6921: __typename, alias6922: __typename, alias6923: __typename, alias6924: __typename, alias6925: __typename, alias6926: __typename, alias6927: __typename, alias6928: __typename, alias6929: __typename, alias6930: __typename, alias6931: __typename, alias6932: __typename, alias6933: __typename, alias6934: __typename, alias6935: __typename, alias6936: __typename, alias6937: __typename, alias6938: __typename, alias6939: __typename, alias6940: __typename, alias6941: __typename, alias6942: __typename, alias6943: __typename, alias6944: __typename, alias6945: __typename, alias6946: __typename, alias6947: __typename, alias6948: __typename, alias6949: __typename, alias6950: __typename, alias6951: __typename, alias6952: __typename, alias6953: __typename, alias6954: __typename, alias6955: __typename, alias6956: __typename, alias6957: __typename, alias6958: __typename, alias6959: __typename, alias6960: __typename, alias6961: __typename, alias6962: __typename, alias6963: __typename, alias6964: __typename, alias6965: __typename, alias6966: __typename, alias6967: __typename, alias6968: __typename, alias6969: __typename, alias6970: __typename, alias6971: __typename, alias6972: __typename, alias6973: __typename, alias6974: __typename, alias6975: __typename, alias6976: __typename, alias6977: __typename, alias6978: __typename, alias6979: __typename, alias6980: __typename, alias6981: __typename, alias6982: __typename, alias6983: __typename, alias6984: __typename, alias6985: __typename, alias6986: __typename, alias6987: __typename, alias6988: __typename, alias6989: __typename, alias6990: __typename, alias6991: __typename, alias6992: __typename, alias6993: __typename, alias6994: __typename, alias6995: __typename, alias6996: __typename, alias6997: __typename, alias6998: __typename, alias6999: __typename, alias7000: __typename, alias7001: __typename, alias7002: __typename, alias7003: __typename, alias7004: __typename, alias7005: __typename, alias7006: __typename, alias7007: __typename, alias7008: __typename, alias7009: __typename, alias7010: __typename, alias7011: __typename, alias7012: __typename, alias7013: __typename, alias7014: __typename, alias7015: __typename, alias7016: __typename, alias7017: __typename, alias7018: __typename, alias7019: __typename, alias7020: __typename, alias7021: __typename, alias7022: __typename, alias7023: __typename, alias7024: __typename, alias7025: __typename, alias7026: __typename, alias7027: __typename, alias7028: __typename, alias7029: __typename, alias7030: __typename, alias7031: __typename, alias7032: __typename, alias7033: __typename, alias7034: __typename, alias7035: __typename, alias7036: __typename, alias7037: __typename, alias7038: __typename, alias7039: __typename, alias7040: __typename, alias7041: __typename, alias7042: __typename, alias7043: __typename, alias7044: __typename, alias7045: __typename, alias7046: __typename, alias7047: __typename, alias7048: __typename, alias7049: __typename, alias7050: __typename, alias7051: __typename, alias7052: __typename, alias7053: __typename, alias7054: __typename, alias7055: __typename, alias7056: __typename, alias7057: __typename, alias7058: __typename, alias7059: __typename, alias7060: __typename, alias7061: __typename, alias7062: __typename, alias7063: __typename, alias7064: __typename, alias7065: __typename, alias7066: __typename, alias7067: __typename, alias7068: __typename, alias7069: __typename, alias7070: __typename, alias7071: __typename, alias7072: __typename, alias7073: __typename, alias7074: __typename, alias7075: __typename, alias7076: __typename, alias7077: __typename, alias7078: __typename, alias7079: __typename, alias7080: __typename, alias7081: __typename, alias7082: __typename, alias7083: __typename, alias7084: __typename, alias7085: __typename, alias7086: __typename, alias7087: __typename, alias7088: __typename, alias7089: __typename, alias7090: __typename, alias7091: __typename, alias7092: __typename, alias7093: __typename, alias7094: __typename, alias7095: __typename, alias7096: __typename, alias7097: __typename, alias7098: __typename, alias7099: __typename, alias7100: __typename, alias7101: __typename, alias7102: __typename, alias7103: __typename, alias7104: __typename, alias7105: __typename, alias7106: __typename, alias7107: __typename, alias7108: __typename, alias7109: __typename, alias7110: __typename, alias7111: __typename, alias7112: __typename, alias7113: __typename, alias7114: __typename, alias7115: __typename, alias7116: __typename, alias7117: __typename, alias7118: __typename, alias7119: __typename, alias7120: __typename, alias7121: __typename, alias7122: __typename, alias7123: __typename, alias7124: __typename, alias7125: __typename, alias7126: __typename, alias7127: __typename, alias7128: __typename, alias7129: __typename, alias7130: __typename, alias7131: __typename, alias7132: __typename, alias7133: __typename, alias7134: __typename, alias7135: __typename, alias7136: __typename, alias7137: __typename, alias7138: __typename, alias7139: __typename, alias7140: __typename, alias7141: __typename, alias7142: __typename, alias7143: __typename, alias7144: __typename, alias7145: __typename, alias7146: __typename, alias7147: __typename, alias7148: __typename, alias7149: __typename, alias7150: __typename, alias7151: __typename, alias7152: __typename, alias7153: __typename, alias7154: __typename, alias7155: __typename, alias7156: __typename, alias7157: __typename, alias7158: __typename, alias7159: __typename, alias7160: __typename, alias7161: __typename, alias7162: __typename, alias7163: __typename, alias7164: __typename, alias7165: __typename, alias7166: __typename, alias7167: __typename, alias7168: __typename, alias7169: __typename, alias7170: __typename, alias7171: __typename, alias7172: __typename, alias7173: __typename, alias7174: __typename, alias7175: __typename, alias7176: __typename, alias7177: __typename, alias7178: __typename, alias7179: __typename, alias7180: __typename, alias7181: __typename, alias7182: __typename, alias7183: __typename, alias7184: __typename, alias7185: __typename, alias7186: __typename, alias7187: __typename, alias7188: __typename, alias7189: __typename, alias7190: __typename, alias7191: __typename, alias7192: __typename, alias7193: __typename, alias7194: __typename, alias7195: __typename, alias7196: __typename, alias7197: __typename, alias7198: __typename, alias7199: __typename, alias7200: __typename, alias7201: __typename, alias7202: __typename, alias7203: __typename, alias7204: __typename, alias7205: __typename, alias7206: __typename, alias7207: __typename, alias7208: __typename, alias7209: __typename, alias7210: __typename, alias7211: __typename, alias7212: __typename, alias7213: __typename, alias7214: __typename, alias7215: __typename, alias7216: __typename, alias7217: __typename, alias7218: __typename, alias7219: __typename, alias7220: __typename, alias7221: __typename, alias7222: __typename, alias7223: __typename, alias7224: __typename, alias7225: __typename, alias7226: __typename, alias7227: __typename, alias7228: __typename, alias7229: __typename, alias7230: __typename, alias7231: __typename, alias7232: __typename, alias7233: __typename, alias7234: __typename, alias7235: __typename, alias7236: __typename, alias7237: __typename, alias7238: __typename, alias7239: __typename, alias7240: __typename, alias7241: __typename, alias7242: __typename, alias7243: __typename, alias7244: __typename, alias7245: __typename, alias7246: __typename, alias7247: __typename, alias7248: __typename, alias7249: __typename, alias7250: __typename, alias7251: __typename, alias7252: __typename, alias7253: __typename, alias7254: __typename, alias7255: __typename, alias7256: __typename, alias7257: __typename, alias7258: __typename, alias7259: __typename, alias7260: __typename, alias7261: __typename, alias7262: __typename, alias7263: __typename, alias7264: __typename, alias7265: __typename, alias7266: __typename, alias7267: __typename, alias7268: __typename, alias7269: __typename, alias7270: __typename, alias7271: __typename, alias7272: __typename, alias7273: __typename, alias7274: __typename, alias7275: __typename, alias7276: __typename, alias7277: __typename, alias7278: __typename, alias7279: __typename, alias7280: __typename, alias7281: __typename, alias7282: __typename, alias7283: __typename, alias7284: __typename, alias7285: __typename, alias7286: __typename, alias7287: __typename, alias7288: __typename, alias7289: __typename, alias7290: __typename, alias7291: __typename, alias7292: __typename, alias7293: __typename, alias7294: __typename, alias7295: __typename, alias7296: __typename, alias7297: __typename, alias7298: __typename, alias7299: __typename, alias7300: __typename, alias7301: __typename, alias7302: __typename, alias7303: __typename, alias7304: __typename, alias7305: __typename, alias7306: __typename, alias7307: __typename, alias7308: __typename, alias7309: __typename, alias7310: __typename, alias7311: __typename, alias7312: __typename, alias7313: __typename, alias7314: __typename, alias7315: __typename, alias7316: __typename, alias7317: __typename, alias7318: __typename, alias7319: __typename, alias7320: __typename, alias7321: __typename, alias7322: __typename, alias7323: __typename, alias7324: __typename, alias7325: __typename, alias7326: __typename, alias7327: __typename, alias7328: __typename, alias7329: __typename, alias7330: __typename, alias7331: __typename, alias7332: __typename, alias7333: __typename, alias7334: __typename, alias7335: __typename, alias7336: __typename, alias7337: __typename, alias7338: __typename, alias7339: __typename, alias7340: __typename, alias7341: __typename, alias7342: __typename, alias7343: __typename, alias7344: __typename, alias7345: __typename, alias7346: __typename, alias7347: __typename, alias7348: __typename, alias7349: __typename, alias7350: __typename, alias7351: __typename, alias7352: __typename, alias7353: __typename, alias7354: __typename, alias7355: __typename, alias7356: __typename, alias7357: __typename, alias7358: __typename, alias7359: __typename, alias7360: __typename, alias7361: __typename, alias7362: __typename, alias7363: __typename, alias7364: __typename, alias7365: __typename, alias7366: __typename, alias7367: __typename, alias7368: __typename, alias7369: __typename, alias7370: __typename, alias7371: __typename, alias7372: __typename, alias7373: __typename, alias7374: __typename, alias7375: __typename, alias7376: __typename, alias7377: __typename, alias7378: __typename, alias7379: __typename, alias7380: __typename, alias7381: __typename, alias7382: __typename, alias7383: __typename, alias7384: __typename, alias7385: __typename, alias7386: __typename, alias7387: __typename, alias7388: __typename, alias7389: __typename, alias7390: __typename, alias7391: __typename, alias7392: __typename, alias7393: __typename, alias7394: __typename, alias7395: __typename, alias7396: __typename, alias7397: __typename, alias7398: __typename, alias7399: __typename, alias7400: __typename, alias7401: __typename, alias7402: __typename, alias7403: __typename, alias7404: __typename, alias7405: __typename, alias7406: __typename, alias7407: __typename, alias7408: __typename, alias7409: __typename, alias7410: __typename, alias7411: __typename, alias7412: __typename, alias7413: __typename, alias7414: __typename, alias7415: __typename, alias7416: __typename, alias7417: __typename, alias7418: __typename, alias7419: __typename, alias7420: __typename, alias7421: __typename, alias7422: __typename, alias7423: __typename, alias7424: __typename, alias7425: __typename, alias7426: __typename, alias7427: __typename, alias7428: __typename, alias7429: __typename, alias7430: __typename, alias7431: __typename, alias7432: __typename, alias7433: __typename, alias7434: __typename, alias7435: __typename, alias7436: __typename, alias7437: __typename, alias7438: __typename, alias7439: __typename, alias7440: __typename, alias7441: __typename, alias7442: __typename, alias7443: __typename, alias7444: __typename, alias7445: __typename, alias7446: __typename, alias7447: __typename, alias7448: __typename, alias7449: __typename, alias7450: __typename, alias7451: __typename, alias7452: __typename, alias7453: __typename, alias7454: __typename, alias7455: __typename, alias7456: __typename, alias7457: __typename, alias7458: __typename, alias7459: __typename, alias7460: __typename, alias7461: __typename, alias7462: __typename, alias7463: __typename, alias7464: __typename, alias7465: __typename, alias7466: __typename, alias7467: __typename, alias7468: __typename, alias7469: __typename, alias7470: __typename, alias7471: __typename, alias7472: __typename, alias7473: __typename, alias7474: __typename, alias7475: __typename, alias7476: __typename, alias7477: __typename, alias7478: __typename, alias7479: __typename, alias7480: __typename, alias7481: __typename, alias7482: __typename, alias7483: __typename, alias7484: __typename, alias7485: __typename, alias7486: __typename, alias7487: __typename, alias7488: __typename, alias7489: __typename, alias7490: __typename, alias7491: __typename, alias7492: __typename, alias7493: __typename, alias7494: __typename, alias7495: __typename, alias7496: __typename, alias7497: __typename, alias7498: __typename, alias7499: __typename, alias7500: __typename, alias7501: __typename, alias7502: __typename, alias7503: __typename, alias7504: __typename, alias7505: __typename, alias7506: __typename, alias7507: __typename, alias7508: __typename, alias7509: __typename, alias7510: __typename, alias7511: __typename, alias7512: __typename, alias7513: __typename, alias7514: __typename, alias7515: __typename, alias7516: __typename, alias7517: __typename, alias7518: __typename, alias7519: __typename, alias7520: __typename, alias7521: __typename, alias7522: __typename, alias7523: __typename, alias7524: __typename, alias7525: __typename, alias7526: __typename, alias7527: __typename, alias7528: __typename, alias7529: __typename, alias7530: __typename, alias7531: __typename, alias7532: __typename, alias7533: __typename, alias7534: __typename, alias7535: __typename, alias7536: __typename, alias7537: __typename, alias7538: __typename, alias7539: __typename, alias7540: __typename, alias7541: __typename, alias7542: __typename, alias7543: __typename, alias7544: __typename, alias7545: __typename, alias7546: __typename, alias7547: __typename, alias7548: __typename, alias7549: __typename, alias7550: __typename, alias7551: __typename, alias7552: __typename, alias7553: __typename, alias7554: __typename, alias7555: __typename, alias7556: __typename, alias7557: __typename, alias7558: __typename, alias7559: __typename, alias7560: __typename, alias7561: __typename, alias7562: __typename, alias7563: __typename, alias7564: __typename, alias7565: __typename, alias7566: __typename, alias7567: __typename, alias7568: __typename, alias7569: __typename, alias7570: __typename, alias7571: __typename, alias7572: __typename, alias7573: __typename, alias7574: __typename, alias7575: __typename, alias7576: __typename, alias7577: __typename, alias7578: __typename, alias7579: __typename, alias7580: __typename, alias7581: __typename, alias7582: __typename, alias7583: __typename, alias7584: __typename, alias7585: __typename, alias7586: __typename, alias7587: __typename, alias7588: __typename, alias7589: __typename, alias7590: __typename, alias7591: __typename, alias7592: __typename, alias7593: __typename, alias7594: __typename, alias7595: __typename, alias7596: __typename, alias7597: __typename, alias7598: __typename, alias7599: __typename, alias7600: __typename, alias7601: __typename, alias7602: __typename, alias7603: __typename, alias7604: __typename, alias7605: __typename, alias7606: __typename, alias7607: __typename, alias7608: __typename, alias7609: __typename, alias7610: __typename, alias7611: __typename, alias7612: __typename, alias7613: __typename, alias7614: __typename, alias7615: __typename, alias7616: __typename, alias7617: __typename, alias7618: __typename, alias7619: __typename, alias7620: __typename, alias7621: __typename, alias7622: __typename, alias7623: __typename, alias7624: __typename, alias7625: __typename, alias7626: __typename, alias7627: __typename, alias7628: __typename, alias7629: __typename, alias7630: __typename, alias7631: __typename, alias7632: __typename, alias7633: __typename, alias7634: __typename, alias7635: __typename, alias7636: __typename, alias7637: __typename, alias7638: __typename, alias7639: __typename, alias7640: __typename, alias7641: __typename, alias7642: __typename, alias7643: __typename, alias7644: __typename, alias7645: __typename, alias7646: __typename, alias7647: __typename, alias7648: __typename, alias7649: __typename, alias7650: __typename, alias7651: __typename, alias7652: __typename, alias7653: __typename, alias7654: __typename, alias7655: __typename, alias7656: __typename, alias7657: __typename, alias7658: __typename, alias7659: __typename, alias7660: __typename, alias7661: __typename, alias7662: __typename, alias7663: __typename, alias7664: __typename, alias7665: __typename, alias7666: __typename, alias7667: __typename, alias7668: __typename, alias7669: __typename, alias7670: __typename, alias7671: __typename, alias7672: __typename, alias7673: __typename, alias7674: __typename, alias7675: __typename, alias7676: __typename, alias7677: __typename, alias7678: __typename, alias7679: __typename, alias7680: __typename, alias7681: __typename, alias7682: __typename, alias7683: __typename, alias7684: __typename, alias7685: __typename, alias7686: __typename, alias7687: __typename, alias7688: __typename, alias7689: __typename, alias7690: __typename, alias7691: __typename, alias7692: __typename, alias7693: __typename, alias7694: __typename, alias7695: __typename, alias7696: __typename, alias7697: __typename, alias7698: __typename, alias7699: __typename, alias7700: __typename, alias7701: __typename, alias7702: __typename, alias7703: __typename, alias7704: __typename, alias7705: __typename, alias7706: __typename, alias7707: __typename, alias7708: __typename, alias7709: __typename, alias7710: __typename, alias7711: __typename, alias7712: __typename, alias7713: __typename, alias7714: __typename, alias7715: __typename, alias7716: __typename, alias7717: __typename, alias7718: __typename, alias7719: __typename, alias7720: __typename, alias7721: __typename, alias7722: __typename, alias7723: __typename, alias7724: __typename, alias7725: __typename, alias7726: __typename, alias7727: __typename, alias7728: __typename, alias7729: __typename, alias7730: __typename, alias7731: __typename, alias7732: __typename, alias7733: __typename, alias7734: __typename, alias7735: __typename, alias7736: __typename, alias7737: __typename, alias7738: __typename, alias7739: __typename, alias7740: __typename, alias7741: __typename, alias7742: __typename, alias7743: __typename, alias7744: __typename, alias7745: __typename, alias7746: __typename, alias7747: __typename, alias7748: __typename, alias7749: __typename, alias7750: __typename, alias7751: __typename, alias7752: __typename, alias7753: __typename, alias7754: __typename, alias7755: __typename, alias7756: __typename, alias7757: __typename, alias7758: __typename, alias7759: __typename, alias7760: __typename, alias7761: __typename, alias7762: __typename, alias7763: __typename, alias7764: __typename, alias7765: __typename, alias7766: __typename, alias7767: __typename, alias7768: __typename, alias7769: __typename, alias7770: __typename, alias7771: __typename, alias7772: __typename, alias7773: __typename, alias7774: __typename, alias7775: __typename, alias7776: __typename, alias7777: __typename, alias7778: __typename, alias7779: __typename, alias7780: __typename, alias7781: __typename, alias7782: __typename, alias7783: __typename, alias7784: __typename, alias7785: __typename, alias7786: __typename, alias7787: __typename, alias7788: __typename, alias7789: __typename, alias7790: __typename, alias7791: __typename, alias7792: __typename, alias7793: __typename, alias7794: __typename, alias7795: __typename, alias7796: __typename, alias7797: __typename, alias7798: __typename, alias7799: __typename, alias7800: __typename, alias7801: __typename, alias7802: __typename, alias7803: __typename, alias7804: __typename, alias7805: __typename, alias7806: __typename, alias7807: __typename, alias7808: __typename, alias7809: __typename, alias7810: __typename, alias7811: __typename, alias7812: __typename, alias7813: __typename, alias7814: __typename, alias7815: __typename, alias7816: __typename, alias7817: __typename, alias7818: __typename, alias7819: __typename, alias7820: __typename, alias7821: __typename, alias7822: __typename, alias7823: __typename, alias7824: __typename, alias7825: __typename, alias7826: __typename, alias7827: __typename, alias7828: __typename, alias7829: __typename, alias7830: __typename, alias7831: __typename, alias7832: __typename, alias7833: __typename, alias7834: __typename, alias7835: __typename, alias7836: __typename, alias7837: __typename, alias7838: __typename, alias7839: __typename, alias7840: __typename, alias7841: __typename, alias7842: __typename, alias7843: __typename, alias7844: __typename, alias7845: __typename, alias7846: __typename, alias7847: __typename, alias7848: __typename, alias7849: __typename, alias7850: __typename, alias7851: __typename, alias7852: __typename, alias7853: __typename, alias7854: __typename, alias7855: __typename, alias7856: __typename, alias7857: __typename, alias7858: __typename, alias7859: __typename, alias7860: __typename, alias7861: __typename, alias7862: __typename, alias7863: __typename, alias7864: __typename, alias7865: __typename, alias7866: __typename, alias7867: __typename, alias7868: __typename, alias7869: __typename, alias7870: __typename, alias7871: __typename, alias7872: __typename, alias7873: __typename, alias7874: __typename, alias7875: __typename, alias7876: __typename, alias7877: __typename, alias7878: __typename, alias7879: __typename, alias7880: __typename, alias7881: __typename, alias7882: __typename, alias7883: __typename, alias7884: __typename, alias7885: __typename, alias7886: __typename, alias7887: __typename, alias7888: __typename, alias7889: __typename, alias7890: __typename, alias7891: __typename, alias7892: __typename, alias7893: __typename, alias7894: __typename, alias7895: __typename, alias7896: __typename, alias7897: __typename, alias7898: __typename, alias7899: __typename, alias7900: __typename, alias7901: __typename, alias7902: __typename, alias7903: __typename, alias7904: __typename, alias7905: __typename, alias7906: __typename, alias7907: __typename, alias7908: __typename, alias7909: __typename, alias7910: __typename, alias7911: __typename, alias7912: __typename, alias7913: __typename, alias7914: __typename, alias7915: __typename, alias7916: __typename, alias7917: __typename, alias7918: __typename, alias7919: __typename, alias7920: __typename, alias7921: __typename, alias7922: __typename, alias7923: __typename, alias7924: __typename, alias7925: __typename, alias7926: __typename, alias7927: __typename, alias7928: __typename, alias7929: __typename, alias7930: __typename, alias7931: __typename, alias7932: __typename, alias7933: __typename, alias7934: __typename, alias7935: __typename, alias7936: __typename, alias7937: __typename, alias7938: __typename, alias7939: __typename, alias7940: __typename, alias7941: __typename, alias7942: __typename, alias7943: __typename, alias7944: __typename, alias7945: __typename, alias7946: __typename, alias7947: __typename, alias7948: __typename, alias7949: __typename, alias7950: __typename, alias7951: __typename, alias7952: __typename, alias7953: __typename, alias7954: __typename, alias7955: __typename, alias7956: __typename, alias7957: __typename, alias7958: __typename, alias7959: __typename, alias7960: __typename, alias7961: __typename, alias7962: __typename, alias7963: __typename, alias7964: __typename, alias7965: __typename, alias7966: __typename, alias7967: __typename, alias7968: __typename, alias7969: __typename, alias7970: __typename, alias7971: __typename, alias7972: __typename, alias7973: __typename, alias7974: __typename, alias7975: __typename, alias7976: __typename, alias7977: __typename, alias7978: __typename, alias7979: __typename, alias7980: __typename, alias7981: __typename, alias7982: __typename, alias7983: __typename, alias7984: __typename, alias7985: __typename, alias7986: __typename, alias7987: __typename, alias7988: __typename, alias7989: __typename, alias7990: __typename, alias7991: __typename, alias7992: __typename, alias7993: __typename, alias7994: __typename, alias7995: __typename, alias7996: __typename, alias7997: __typename, alias7998: __typename, alias7999: __typename, alias8000: __typename, alias8001: __typename, alias8002: __typename, alias8003: __typename, alias8004: __typename, alias8005: __typename, alias8006: __typename, alias8007: __typename, alias8008: __typename, alias8009: __typename, alias8010: __typename, alias8011: __typename, alias8012: __typename, alias8013: __typename, alias8014: __typename, alias8015: __typename, alias8016: __typename, alias8017: __typename, alias8018: __typename, alias8019: __typename, alias8020: __typename, alias8021: __typename, alias8022: __typename, alias8023: __typename, alias8024: __typename, alias8025: __typename, alias8026: __typename, alias8027: __typename, alias8028: __typename, alias8029: __typename, alias8030: __typename, alias8031: __typename, alias8032: __typename, alias8033: __typename, alias8034: __typename, alias8035: __typename, alias8036: __typename, alias8037: __typename, alias8038: __typename, alias8039: __typename, alias8040: __typename, alias8041: __typename, alias8042: __typename, alias8043: __typename, alias8044: __typename, alias8045: __typename, alias8046: __typename, alias8047: __typename, alias8048: __typename, alias8049: __typename, alias8050: __typename, alias8051: __typename, alias8052: __typename, alias8053: __typename, alias8054: __typename, alias8055: __typename, alias8056: __typename, alias8057: __typename, alias8058: __typename, alias8059: __typename, alias8060: __typename, alias8061: __typename, alias8062: __typename, alias8063: __typename, alias8064: __typename, alias8065: __typename, alias8066: __typename, alias8067: __typename, alias8068: __typename, alias8069: __typename, alias8070: __typename, alias8071: __typename, alias8072: __typename, alias8073: __typename, alias8074: __typename, alias8075: __typename, alias8076: __typename, alias8077: __typename, alias8078: __typename, alias8079: __typename, alias8080: __typename, alias8081: __typename, alias8082: __typename, alias8083: __typename, alias8084: __typename, alias8085: __typename, alias8086: __typename, alias8087: __typename, alias8088: __typename, alias8089: __typename, alias8090: __typename, alias8091: __typename, alias8092: __typename, alias8093: __typename, alias8094: __typename, alias8095: __typename, alias8096: __typename, alias8097: __typename, alias8098: __typename, alias8099: __typename, alias8100: __typename, alias8101: __typename, alias8102: __typename, alias8103: __typename, alias8104: __typename, alias8105: __typename, alias8106: __typename, alias8107: __typename, alias8108: __typename, alias8109: __typename, alias8110: __typename, alias8111: __typename, alias8112: __typename, alias8113: __typename, alias8114: __typename, alias8115: __typename, alias8116: __typename, alias8117: __typename, alias8118: __typename, alias8119: __typename, alias8120: __typename, alias8121: __typename, alias8122: __typename, alias8123: __typename, alias8124: __typename, alias8125: __typename, alias8126: __typename, alias8127: __typename, alias8128: __typename, alias8129: __typename, alias8130: __typename, alias8131: __typename, alias8132: __typename, alias8133: __typename, alias8134: __typename, alias8135: __typename, alias8136: __typename, alias8137: __typename, alias8138: __typename, alias8139: __typename, alias8140: __typename, alias8141: __typename, alias8142: __typename, alias8143: __typename, alias8144: __typename, alias8145: __typename, alias8146: __typename, alias8147: __typename, alias8148: __typename, alias8149: __typename, alias8150: __typename, alias8151: __typename, alias8152: __typename, alias8153: __typename, alias8154: __typename, alias8155: __typename, alias8156: __typename, alias8157: __typename, alias8158: __typename, alias8159: __typename, alias8160: __typename, alias8161: __typename, alias8162: __typename, alias8163: __typename, alias8164: __typename, alias8165: __typename, alias8166: __typename, alias8167: __typename, alias8168: __typename, alias8169: __typename, alias8170: __typename, alias8171: __typename, alias8172: __typename, alias8173: __typename, alias8174: __typename, alias8175: __typename, alias8176: __typename, alias8177: __typename, alias8178: __typename, alias8179: __typename, alias8180: __typename, alias8181: __typename, alias8182: __typename, alias8183: __typename, alias8184: __typename, alias8185: __typename, alias8186: __typename, alias8187: __typename, alias8188: __typename, alias8189: __typename, alias8190: __typename, alias8191: __typename, alias8192: __typename, alias8193: __typename, alias8194: __typename, alias8195: __typename, alias8196: __typename, alias8197: __typename, alias8198: __typename, alias8199: __typename, alias8200: __typename, alias8201: __typename, alias8202: __typename, alias8203: __typename, alias8204: __typename, alias8205: __typename, alias8206: __typename, alias8207: __typename, alias8208: __typename, alias8209: __typename, alias8210: __typename, alias8211: __typename, alias8212: __typename, alias8213: __typename, alias8214: __typename, alias8215: __typename, alias8216: __typename, alias8217: __typename, alias8218: __typename, alias8219: __typename, alias8220: __typename, alias8221: __typename, alias8222: __typename, alias8223: __typename, alias8224: __typename, alias8225: __typename, alias8226: __typename, alias8227: __typename, alias8228: __typename, alias8229: __typename, alias8230: __typename, alias8231: __typename, alias8232: __typename, alias8233: __typename, alias8234: __typename, alias8235: __typename, alias8236: __typename, alias8237: __typename, alias8238: __typename, alias8239: __typename, alias8240: __typename, alias8241: __typename, alias8242: __typename, alias8243: __typename, alias8244: __typename, alias8245: __typename, alias8246: __typename, alias8247: __typename, alias8248: __typename, alias8249: __typename, alias8250: __typename, alias8251: __typename, alias8252: __typename, alias8253: __typename, alias8254: __typename, alias8255: __typename, alias8256: __typename, alias8257: __typename, alias8258: __typename, alias8259: __typename, alias8260: __typename, alias8261: __typename, alias8262: __typename, alias8263: __typename, alias8264: __typename, alias8265: __typename, alias8266: __typename, alias8267: __typename, alias8268: __typename, alias8269: __typename, alias8270: __typename, alias8271: __typename, alias8272: __typename, alias8273: __typename, alias8274: __typename, alias8275: __typename, alias8276: __typename, alias8277: __typename, alias8278: __typename, alias8279: __typename, alias8280: __typename, alias8281: __typename, alias8282: __typename, alias8283: __typename, alias8284: __typename, alias8285: __typename, alias8286: __typename, alias8287: __typename, alias8288: __typename, alias8289: __typename, alias8290: __typename, alias8291: __typename, alias8292: __typename, alias8293: __typename, alias8294: __typename, alias8295: __typename, alias8296: __typename, alias8297: __typename, alias8298: __typename, alias8299: __typename, alias8300: __typename, alias8301: __typename, alias8302: __typename, alias8303: __typename, alias8304: __typename, alias8305: __typename, alias8306: __typename, alias8307: __typename, alias8308: __typename, alias8309: __typename, alias8310: __typename, alias8311: __typename, alias8312: __typename, alias8313: __typename, alias8314: __typename, alias8315: __typename, alias8316: __typename, alias8317: __typename, alias8318: __typename, alias8319: __typename, alias8320: __typename, alias8321: __typename, alias8322: __typename, alias8323: __typename, alias8324: __typename, alias8325: __typename, alias8326: __typename, alias8327: __typename, alias8328: __typename, alias8329: __typename, alias8330: __typename, alias8331: __typename, alias8332: __typename, alias8333: __typename, alias8334: __typename, alias8335: __typename, alias8336: __typename, alias8337: __typename, alias8338: __typename, alias8339: __typename, alias8340: __typename, alias8341: __typename, alias8342: __typename, alias8343: __typename, alias8344: __typename, alias8345: __typename, alias8346: __typename, alias8347: __typename, alias8348: __typename, alias8349: __typename, alias8350: __typename, alias8351: __typename, alias8352: __typename, alias8353: __typename, alias8354: __typename, alias8355: __typename, alias8356: __typename, alias8357: __typename, alias8358: __typename, alias8359: __typename, alias8360: __typename, alias8361: __typename, alias8362: __typename, alias8363: __typename, alias8364: __typename, alias8365: __typename, alias8366: __typename, alias8367: __typename, alias8368: __typename, alias8369: __typename, alias8370: __typename, alias8371: __typename, alias8372: __typename, alias8373: __typename, alias8374: __typename, alias8375: __typename, alias8376: __typename, alias8377: __typename, alias8378: __typename, alias8379: __typename, alias8380: __typename, alias8381: __typename, alias8382: __typename, alias8383: __typename, alias8384: __typename, alias8385: __typename, alias8386: __typename, alias8387: __typename, alias8388: __typename, alias8389: __typename, alias8390: __typename, alias8391: __typename, alias8392: __typename, alias8393: __typename, alias8394: __typename, alias8395: __typename, alias8396: __typename, alias8397: __typename, alias8398: __typename, alias8399: __typename, alias8400: __typename, alias8401: __typename, alias8402: __typename, alias8403: __typename, alias8404: __typename, alias8405: __typename, alias8406: __typename, alias8407: __typename, alias8408: __typename, alias8409: __typename, alias8410: __typename, alias8411: __typename, alias8412: __typename, alias8413: __typename, alias8414: __typename, alias8415: __typename, alias8416: __typename, alias8417: __typename, alias8418: __typename, alias8419: __typename, alias8420: __typename, alias8421: __typename, alias8422: __typename, alias8423: __typename, alias8424: __typename, alias8425: __typename, alias8426: __typename, alias8427: __typename, alias8428: __typename, alias8429: __typename, alias8430: __typename, alias8431: __typename, alias8432: __typename, alias8433: __typename, alias8434: __typename, alias8435: __typename, alias8436: __typename, alias8437: __typename, alias8438: __typename, alias8439: __typename, alias8440: __typename, alias8441: __typename, alias8442: __typename, alias8443: __typename, alias8444: __typename, alias8445: __typename, alias8446: __typename, alias8447: __typename, alias8448: __typename, alias8449: __typename, alias8450: __typename, alias8451: __typename, alias8452: __typename, alias8453: __typename, alias8454: __typename, alias8455: __typename, alias8456: __typename, alias8457: __typename, alias8458: __typename, alias8459: __typename, alias8460: __typename, alias8461: __typename, alias8462: __typename, alias8463: __typename, alias8464: __typename, alias8465: __typename, alias8466: __typename, alias8467: __typename, alias8468: __typename, alias8469: __typename, alias8470: __typename, alias8471: __typename, alias8472: __typename, alias8473: __typename, alias8474: __typename, alias8475: __typename, alias8476: __typename, alias8477: __typename, alias8478: __typename, alias8479: __typename, alias8480: __typename, alias8481: __typename, alias8482: __typename, alias8483: __typename, alias8484: __typename, alias8485: __typename, alias8486: __typename, alias8487: __typename, alias8488: __typename, alias8489: __typename, alias8490: __typename, alias8491: __typename, alias8492: __typename, alias8493: __typename, alias8494: __typename, alias8495: __typename, alias8496: __typename, alias8497: __typename, alias8498: __typename, alias8499: __typename, alias8500: __typename, alias8501: __typename, alias8502: __typename, alias8503: __typename, alias8504: __typename, alias8505: __typename, alias8506: __typename, alias8507: __typename, alias8508: __typename, alias8509: __typename, alias8510: __typename, alias8511: __typename, alias8512: __typename, alias8513: __typename, alias8514: __typename, alias8515: __typename, alias8516: __typename, alias8517: __typename, alias8518: __typename, alias8519: __typename, alias8520: __typename, alias8521: __typename, alias8522: __typename, alias8523: __typename, alias8524: __typename, alias8525: __typename, alias8526: __typename, alias8527: __typename, alias8528: __typename, alias8529: __typename, alias8530: __typename, alias8531: __typename, alias8532: __typename, alias8533: __typename, alias8534: __typename, alias8535: __typename, alias8536: __typename, alias8537: __typename, alias8538: __typename, alias8539: __typename, alias8540: __typename, alias8541: __typename, alias8542: __typename, alias8543: __typename, alias8544: __typename, alias8545: __typename, alias8546: __typename, alias8547: __typename, alias8548: __typename, alias8549: __typename, alias8550: __typename, alias8551: __typename, alias8552: __typename, alias8553: __typename, alias8554: __typename, alias8555: __typename, alias8556: __typename, alias8557: __typename, alias8558: __typename, alias8559: __typename, alias8560: __typename, alias8561: __typename, alias8562: __typename, alias8563: __typename, alias8564: __typename, alias8565: __typename, alias8566: __typename, alias8567: __typename, alias8568: __typename, alias8569: __typename, alias8570: __typename, alias8571: __typename, alias8572: __typename, alias8573: __typename, alias8574: __typename, alias8575: __typename, alias8576: __typename, alias8577: __typename, alias8578: __typename, alias8579: __typename, alias8580: __typename, alias8581: __typename, alias8582: __typename, alias8583: __typename, alias8584: __typename, alias8585: __typename, alias8586: __typename, alias8587: __typename, alias8588: __typename, alias8589: __typename, alias8590: __typename, alias8591: __typename, alias8592: __typename, alias8593: __typename, alias8594: __typename, alias8595: __typename, alias8596: __typename, alias8597: __typename, alias8598: __typename, alias8599: __typename, alias8600: __typename, alias8601: __typename, alias8602: __typename, alias8603: __typename, alias8604: __typename, alias8605: __typename, alias8606: __typename, alias8607: __typename, alias8608: __typename, alias8609: __typename, alias8610: __typename, alias8611: __typename, alias8612: __typename, alias8613: __typename, alias8614: __typename, alias8615: __typename, alias8616: __typename, alias8617: __typename, alias8618: __typename, alias8619: __typename, alias8620: __typename, alias8621: __typename, alias8622: __typename, alias8623: __typename, alias8624: __typename, alias8625: __typename, alias8626: __typename, alias8627: __typename, alias8628: __typename, alias8629: __typename, alias8630: __typename, alias8631: __typename, alias8632: __typename, alias8633: __typename, alias8634: __typename, alias8635: __typename, alias8636: __typename, alias8637: __typename, alias8638: __typename, alias8639: __typename, alias8640: __typename, alias8641: __typename, alias8642: __typename, alias8643: __typename, alias8644: __typename, alias8645: __typename, alias8646: __typename, alias8647: __typename, alias8648: __typename, alias8649: __typename, alias8650: __typename, alias8651: __typename, alias8652: __typename, alias8653: __typename, alias8654: __typename, alias8655: __typename, alias8656: __typename, alias8657: __typename, alias8658: __typename, alias8659: __typename, alias8660: __typename, alias8661: __typename, alias8662: __typename, alias8663: __typename, alias8664: __typename, alias8665: __typename, alias8666: __typename, alias8667: __typename, alias8668: __typename, alias8669: __typename, alias8670: __typename, alias8671: __typename, alias8672: __typename, alias8673: __typename, alias8674: __typename, alias8675: __typename, alias8676: __typename, alias8677: __typename, alias8678: __typename, alias8679: __typename, alias8680: __typename, alias8681: __typename, alias8682: __typename, alias8683: __typename, alias8684: __typename, alias8685: __typename, alias8686: __typename, alias8687: __typename, alias8688: __typename, alias8689: __typename, alias8690: __typename, alias8691: __typename, alias8692: __typename, alias8693: __typename, alias8694: __typename, alias8695: __typename, alias8696: __typename, alias8697: __typename, alias8698: __typename, alias8699: __typename, alias8700: __typename, alias8701: __typename, alias8702: __typename, alias8703: __typename, alias8704: __typename, alias8705: __typename, alias8706: __typename, alias8707: __typename, alias8708: __typename, alias8709: __typename, alias8710: __typename, alias8711: __typename, alias8712: __typename, alias8713: __typename, alias8714: __typename, alias8715: __typename, alias8716: __typename, alias8717: __typename, alias8718: __typename, alias8719: __typename, alias8720: __typename, alias8721: __typename, alias8722: __typename, alias8723: __typename, alias8724: __typename, alias8725: __typename, alias8726: __typename, alias8727: __typename, alias8728: __typename, alias8729: __typename, alias8730: __typename, alias8731: __typename, alias8732: __typename, alias8733: __typename, alias8734: __typename, alias8735: __typename, alias8736: __typename, alias8737: __typename, alias8738: __typename, alias8739: __typename, alias8740: __typename, alias8741: __typename, alias8742: __typename, alias8743: __typename, alias8744: __typename, alias8745: __typename, alias8746: __typename, alias8747: __typename, alias8748: __typename, alias8749: __typename, alias8750: __typename, alias8751: __typename, alias8752: __typename, alias8753: __typename, alias8754: __typename, alias8755: __typename, alias8756: __typename, alias8757: __typename, alias8758: __typename, alias8759: __typename, alias8760: __typename, alias8761: __typename, alias8762: __typename, alias8763: __typename, alias8764: __typename, alias8765: __typename, alias8766: __typename, alias8767: __typename, alias8768: __typename, alias8769: __typename, alias8770: __typename, alias8771: __typename, alias8772: __typename, alias8773: __typename, alias8774: __typename, alias8775: __typename, alias8776: __typename, alias8777: __typename, alias8778: __typename, alias8779: __typename, alias8780: __typename, alias8781: __typename, alias8782: __typename, alias8783: __typename, alias8784: __typename, alias8785: __typename, alias8786: __typename, alias8787: __typename, alias8788: __typename, alias8789: __typename, alias8790: __typename, alias8791: __typename, alias8792: __typename, alias8793: __typename, alias8794: __typename, alias8795: __typename, alias8796: __typename, alias8797: __typename, alias8798: __typename, alias8799: __typename, alias8800: __typename, alias8801: __typename, alias8802: __typename, alias8803: __typename, alias8804: __typename, alias8805: __typename, alias8806: __typename, alias8807: __typename, alias8808: __typename, alias8809: __typename, alias8810: __typename, alias8811: __typename, alias8812: __typename, alias8813: __typename, alias8814: __typename, alias8815: __typename, alias8816: __typename, alias8817: __typename, alias8818: __typename, alias8819: __typename, alias8820: __typename, alias8821: __typename, alias8822: __typename, alias8823: __typename, alias8824: __typename, alias8825: __typename, alias8826: __typename, alias8827: __typename, alias8828: __typename, alias8829: __typename, alias8830: __typename, alias8831: __typename, alias8832: __typename, alias8833: __typename, alias8834: __typename, alias8835: __typename, alias8836: __typename, alias8837: __typename, alias8838: __typename, alias8839: __typename, alias8840: __typename, alias8841: __typename, alias8842: __typename, alias8843: __typename, alias8844: __typename, alias8845: __typename, alias8846: __typename, alias8847: __typename, alias8848: __typename, alias8849: __typename, alias8850: __typename, alias8851: __typename, alias8852: __typename, alias8853: __typename, alias8854: __typename, alias8855: __typename, alias8856: __typename, alias8857: __typename, alias8858: __typename, alias8859: __typename, alias8860: __typename, alias8861: __typename, alias8862: __typename, alias8863: __typename, alias8864: __typename, alias8865: __typename, alias8866: __typename, alias8867: __typename, alias8868: __typename, alias8869: __typename, alias8870: __typename, alias8871: __typename, alias8872: __typename, alias8873: __typename, alias8874: __typename, alias8875: __typename, alias8876: __typename, alias8877: __typename, alias8878: __typename, alias8879: __typename, alias8880: __typename, alias8881: __typename, alias8882: __typename, alias8883: __typename, alias8884: __typename, alias8885: __typename, alias8886: __typename, alias8887: __typename, alias8888: __typename, alias8889: __typename, alias8890: __typename, alias8891: __typename, alias8892: __typename, alias8893: __typename, alias8894: __typename, alias8895: __typename, alias8896: __typename, alias8897: __typename, alias8898: __typename, alias8899: __typename, alias8900: __typename, alias8901: __typename, alias8902: __typename, alias8903: __typename, alias8904: __typename, alias8905: __typename, alias8906: __typename, alias8907: __typename, alias8908: __typename, alias8909: __typename, alias8910: __typename, alias8911: __typename, alias8912: __typename, alias8913: __typename, alias8914: __typename, alias8915: __typename, alias8916: __typename, alias8917: __typename, alias8918: __typename, alias8919: __typename, alias8920: __typename, alias8921: __typename, alias8922: __typename, alias8923: __typename, alias8924: __typename, alias8925: __typename, alias8926: __typename, alias8927: __typename, alias8928: __typename, alias8929: __typename, alias8930: __typename, alias8931: __typename, alias8932: __typename, alias8933: __typename, alias8934: __typename, alias8935: __typename, alias8936: __typename, alias8937: __typename, alias8938: __typename, alias8939: __typename, alias8940: __typename, alias8941: __typename, alias8942: __typename, alias8943: __typename, alias8944: __typename, alias8945: __typename, alias8946: __typename, alias8947: __typename, alias8948: __typename, alias8949: __typename, alias8950: __typename, alias8951: __typename, alias8952: __typename, alias8953: __typename, alias8954: __typename, alias8955: __typename, alias8956: __typename, alias8957: __typename, alias8958: __typename, alias8959: __typename, alias8960: __typename, alias8961: __typename, alias8962: __typename, alias8963: __typename, alias8964: __typename, alias8965: __typename, alias8966: __typename, alias8967: __typename, alias8968: __typename, alias8969: __typename, alias8970: __typename, alias8971: __typename, alias8972: __typename, alias8973: __typename, alias8974: __typename, alias8975: __typename, alias8976: __typename, alias8977: __typename, alias8978: __typename, alias8979: __typename, alias8980: __typename, alias8981: __typename, alias8982: __typename, alias8983: __typename, alias8984: __typename, alias8985: __typename, alias8986: __typename, alias8987: __typename, alias8988: __typename, alias8989: __typename, alias8990: __typename, alias8991: __typename, alias8992: __typename, alias8993: __typename, alias8994: __typename, alias8995: __typename, alias8996: __typename, alias8997: __typename, alias8998: __typename, alias8999: __typename, alias9000: __typename, alias9001: __typename, alias9002: __typename, alias9003: __typename, alias9004: __typename, alias9005: __typename, alias9006: __typename, alias9007: __typename, alias9008: __typename, alias9009: __typename, alias9010: __typename, alias9011: __typename, alias9012: __typename, alias9013: __typename, alias9014: __typename, alias9015: __typename, alias9016: __typename, alias9017: __typename, alias9018: __typename, alias9019: __typename, alias9020: __typename, alias9021: __typename, alias9022: __typename, alias9023: __typename, alias9024: __typename, alias9025: __typename, alias9026: __typename, alias9027: __typename, alias9028: __typename, alias9029: __typename, alias9030: __typename, alias9031: __typename, alias9032: __typename, alias9033: __typename, alias9034: __typename, alias9035: __typename, alias9036: __typename, alias9037: __typename, alias9038: __typename, alias9039: __typename, alias9040: __typename, alias9041: __typename, alias9042: __typename, alias9043: __typename, alias9044: __typename, alias9045: __typename, alias9046: __typename, alias9047: __typename, alias9048: __typename, alias9049: __typename, alias9050: __typename, alias9051: __typename, alias9052: __typename, alias9053: __typename, alias9054: __typename, alias9055: __typename, alias9056: __typename, alias9057: __typename, alias9058: __typename, alias9059: __typename, alias9060: __typename, alias9061: __typename, alias9062: __typename, alias9063: __typename, alias9064: __typename, alias9065: __typename, alias9066: __typename, alias9067: __typename, alias9068: __typename, alias9069: __typename, alias9070: __typename, alias9071: __typename, alias9072: __typename, alias9073: __typename, alias9074: __typename, alias9075: __typename, alias9076: __typename, alias9077: __typename, alias9078: __typename, alias9079: __typename, alias9080: __typename, alias9081: __typename, alias9082: __typename, alias9083: __typename, alias9084: __typename, alias9085: __typename, alias9086: __typename, alias9087: __typename, alias9088: __typename, alias9089: __typename, alias9090: __typename, alias9091: __typename, alias9092: __typename, alias9093: __typename, alias9094: __typename, alias9095: __typename, alias9096: __typename, alias9097: __typename, alias9098: __typename, alias9099: __typename, alias9100: __typename, alias9101: __typename, alias9102: __typename, alias9103: __typename, alias9104: __typename, alias9105: __typename, alias9106: __typename, alias9107: __typename, alias9108: __typename, alias9109: __typename, alias9110: __typename, alias9111: __typename, alias9112: __typename, alias9113: __typename, alias9114: __typename, alias9115: __typename, alias9116: __typename, alias9117: __typename, alias9118: __typename, alias9119: __typename, alias9120: __typename, alias9121: __typename, alias9122: __typename, alias9123: __typename, alias9124: __typename, alias9125: __typename, alias9126: __typename, alias9127: __typename, alias9128: __typename, alias9129: __typename, alias9130: __typename, alias9131: __typename, alias9132: __typename, alias9133: __typename, alias9134: __typename, alias9135: __typename, alias9136: __typename, alias9137: __typename, alias9138: __typename, alias9139: __typename, alias9140: __typename, alias9141: __typename, alias9142: __typename, alias9143: __typename, alias9144: __typename, alias9145: __typename, alias9146: __typename, alias9147: __typename, alias9148: __typename, alias9149: __typename, alias9150: __typename, alias9151: __typename, alias9152: __typename, alias9153: __typename, alias9154: __typename, alias9155: __typename, alias9156: __typename, alias9157: __typename, alias9158: __typename, alias9159: __typename, alias9160: __typename, alias9161: __typename, alias9162: __typename, alias9163: __typename, alias9164: __typename, alias9165: __typename, alias9166: __typename, alias9167: __typename, alias9168: __typename, alias9169: __typename, alias9170: __typename, alias9171: __typename, alias9172: __typename, alias9173: __typename, alias9174: __typename, alias9175: __typename, alias9176: __typename, alias9177: __typename, alias9178: __typename, alias9179: __typename, alias9180: __typename, alias9181: __typename, alias9182: __typename, alias9183: __typename, alias9184: __typename, alias9185: __typename, alias9186: __typename, alias9187: __typename, alias9188: __typename, alias9189: __typename, alias9190: __typename, alias9191: __typename, alias9192: __typename, alias9193: __typename, alias9194: __typename, alias9195: __typename, alias9196: __typename, alias9197: __typename, alias9198: __typename, alias9199: __typename, alias9200: __typename, alias9201: __typename, alias9202: __typename, alias9203: __typename, alias9204: __typename, alias9205: __typename, alias9206: __typename, alias9207: __typename, alias9208: __typename, alias9209: __typename, alias9210: __typename, alias9211: __typename, alias9212: __typename, alias9213: __typename, alias9214: __typename, alias9215: __typename, alias9216: __typename, alias9217: __typename, alias9218: __typename, alias9219: __typename, alias9220: __typename, alias9221: __typename, alias9222: __typename, alias9223: __typename, alias9224: __typename, alias9225: __typename, alias9226: __typename, alias9227: __typename, alias9228: __typename, alias9229: __typename, alias9230: __typename, alias9231: __typename, alias9232: __typename, alias9233: __typename, alias9234: __typename, alias9235: __typename, alias9236: __typename, alias9237: __typename, alias9238: __typename, alias9239: __typename, alias9240: __typename, alias9241: __typename, alias9242: __typename, alias9243: __typename, alias9244: __typename, alias9245: __typename, alias9246: __typename, alias9247: __typename, alias9248: __typename, alias9249: __typename, alias9250: __typename, alias9251: __typename, alias9252: __typename, alias9253: __typename, alias9254: __typename, alias9255: __typename, alias9256: __typename, alias9257: __typename, alias9258: __typename, alias9259: __typename, alias9260: __typename, alias9261: __typename, alias9262: __typename, alias9263: __typename, alias9264: __typename, alias9265: __typename, alias9266: __typename, alias9267: __typename, alias9268: __typename, alias9269: __typename, alias9270: __typename, alias9271: __typename, alias9272: __typename, alias9273: __typename, alias9274: __typename, alias9275: __typename, alias9276: __typename, alias9277: __typename, alias9278: __typename, alias9279: __typename, alias9280: __typename, alias9281: __typename, alias9282: __typename, alias9283: __typename, alias9284: __typename, alias9285: __typename, alias9286: __typename, alias9287: __typename, alias9288: __typename, alias9289: __typename, alias9290: __typename, alias9291: __typename, alias9292: __typename, alias9293: __typename, alias9294: __typename, alias9295: __typename, alias9296: __typename, alias9297: __typename, alias9298: __typename, alias9299: __typename, alias9300: __typename, alias9301: __typename, alias9302: __typename, alias9303: __typename, alias9304: __typename, alias9305: __typename, alias9306: __typename, alias9307: __typename, alias9308: __typename, alias9309: __typename, alias9310: __typename, alias9311: __typename, alias9312: __typename, alias9313: __typename, alias9314: __typename, alias9315: __typename, alias9316: __typename, alias9317: __typename, alias9318: __typename, alias9319: __typename, alias9320: __typename, alias9321: __typename, alias9322: __typename, alias9323: __typename, alias9324: __typename, alias9325: __typename, alias9326: __typename, alias9327: __typename, alias9328: __typename, alias9329: __typename, alias9330: __typename, alias9331: __typename, alias9332: __typename, alias9333: __typename, alias9334: __typename, alias9335: __typename, alias9336: __typename, alias9337: __typename, alias9338: __typename, alias9339: __typename, alias9340: __typename, alias9341: __typename, alias9342: __typename, alias9343: __typename, alias9344: __typename, alias9345: __typename, alias9346: __typename, alias9347: __typename, alias9348: __typename, alias9349: __typename, alias9350: __typename, alias9351: __typename, alias9352: __typename, alias9353: __typename, alias9354: __typename, alias9355: __typename, alias9356: __typename, alias9357: __typename, alias9358: __typename, alias9359: __typename, alias9360: __typename, alias9361: __typename, alias9362: __typename, alias9363: __typename, alias9364: __typename, alias9365: __typename, alias9366: __typename, alias9367: __typename, alias9368: __typename, alias9369: __typename, alias9370: __typename, alias9371: __typename, alias9372: __typename, alias9373: __typename, alias9374: __typename, alias9375: __typename, alias9376: __typename, alias9377: __typename, alias9378: __typename, alias9379: __typename, alias9380: __typename, alias9381: __typename, alias9382: __typename, alias9383: __typename, alias9384: __typename, alias9385: __typename, alias9386: __typename, alias9387: __typename, alias9388: __typename, alias9389: __typename, alias9390: __typename, alias9391: __typename, alias9392: __typename, alias9393: __typename, alias9394: __typename, alias9395: __typename, alias9396: __typename, alias9397: __typename, alias9398: __typename, alias9399: __typename, alias9400: __typename, alias9401: __typename, alias9402: __typename, alias9403: __typename, alias9404: __typename, alias9405: __typename, alias9406: __typename, alias9407: __typename, alias9408: __typename, alias9409: __typename, alias9410: __typename, alias9411: __typename, alias9412: __typename, alias9413: __typename, alias9414: __typename, alias9415: __typename, alias9416: __typename, alias9417: __typename, alias9418: __typename, alias9419: __typename, alias9420: __typename, alias9421: __typename, alias9422: __typename, alias9423: __typename, alias9424: __typename, alias9425: __typename, alias9426: __typename, alias9427: __typename, alias9428: __typename, alias9429: __typename, alias9430: __typename, alias9431: __typename, alias9432: __typename, alias9433: __typename, alias9434: __typename, alias9435: __typename, alias9436: __typename, alias9437: __typename, alias9438: __typename, alias9439: __typename, alias9440: __typename, alias9441: __typename, alias9442: __typename, alias9443: __typename, alias9444: __typename, alias9445: __typename, alias9446: __typename, alias9447: __typename, alias9448: __typename, alias9449: __typename, alias9450: __typename, alias9451: __typename, alias9452: __typename, alias9453: __typename, alias9454: __typename, alias9455: __typename, alias9456: __typename, alias9457: __typename, alias9458: __typename, alias9459: __typename, alias9460: __typename, alias9461: __typename, alias9462: __typename, alias9463: __typename, alias9464: __typename, alias9465: __typename, alias9466: __typename, alias9467: __typename, alias9468: __typename, alias9469: __typename, alias9470: __typename, alias9471: __typename, alias9472: __typename, alias9473: __typename, alias9474: __typename, alias9475: __typename, alias9476: __typename, alias9477: __typename, alias9478: __typename, alias9479: __typename, alias9480: __typename, alias9481: __typename, alias9482: __typename, alias9483: __typename, alias9484: __typename, alias9485: __typename, alias9486: __typename, alias9487: __typename, alias9488: __typename, alias9489: __typename, alias9490: __typename, alias9491: __typename, alias9492: __typename, alias9493: __typename, alias9494: __typename, alias9495: __typename, alias9496: __typename, alias9497: __typename, alias9498: __typename, alias9499: __typename, alias9500: __typename, alias9501: __typename, alias9502: __typename, alias9503: __typename, alias9504: __typename, alias9505: __typename, alias9506: __typename, alias9507: __typename, alias9508: __typename, alias9509: __typename, alias9510: __typename, alias9511: __typename, alias9512: __typename, alias9513: __typename, alias9514: __typename, alias9515: __typename, alias9516: __typename, alias9517: __typename, alias9518: __typename, alias9519: __typename, alias9520: __typename, alias9521: __typename, alias9522: __typename, alias9523: __typename, alias9524: __typename, alias9525: __typename, alias9526: __typename, alias9527: __typename, alias9528: __typename, alias9529: __typename, alias9530: __typename, alias9531: __typename, alias9532: __typename, alias9533: __typename, alias9534: __typename, alias9535: __typename, alias9536: __typename, alias9537: __typename, alias9538: __typename, alias9539: __typename, alias9540: __typename, alias9541: __typename, alias9542: __typename, alias9543: __typename, alias9544: __typename, alias9545: __typename, alias9546: __typename, alias9547: __typename, alias9548: __typename, alias9549: __typename, alias9550: __typename, alias9551: __typename, alias9552: __typename, alias9553: __typename, alias9554: __typename, alias9555: __typename, alias9556: __typename, alias9557: __typename, alias9558: __typename, alias9559: __typename, alias9560: __typename, alias9561: __typename, alias9562: __typename, alias9563: __typename, alias9564: __typename, alias9565: __typename, alias9566: __typename, alias9567: __typename, alias9568: __typename, alias9569: __typename, alias9570: __typename, alias9571: __typename, alias9572: __typename, alias9573: __typename, alias9574: __typename, alias9575: __typename, alias9576: __typename, alias9577: __typename, alias9578: __typename, alias9579: __typename, alias9580: __typename, alias9581: __typename, alias9582: __typename, alias9583: __typename, alias9584: __typename, alias9585: __typename, alias9586: __typename, alias9587: __typename, alias9588: __typename, alias9589: __typename, alias9590: __typename, alias9591: __typename, alias9592: __typename, alias9593: __typename, alias9594: __typename, alias9595: __typename, alias9596: __typename, alias9597: __typename, alias9598: __typename, alias9599: __typename, alias9600: __typename, alias9601: __typename, alias9602: __typename, alias9603: __typename, alias9604: __typename, alias9605: __typename, alias9606: __typename, alias9607: __typename, alias9608: __typename, alias9609: __typename, alias9610: __typename, alias9611: __typename, alias9612: __typename, alias9613: __typename, alias9614: __typename, alias9615: __typename, alias9616: __typename, alias9617: __typename, alias9618: __typename, alias9619: __typename, alias9620: __typename, alias9621: __typename, alias9622: __typename, alias9623: __typename, alias9624: __typename, alias9625: __typename, alias9626: __typename, alias9627: __typename, alias9628: __typename, alias9629: __typename, alias9630: __typename, alias9631: __typename, alias9632: __typename, alias9633: __typename, alias9634: __typename, alias9635: __typename, alias9636: __typename, alias9637: __typename, alias9638: __typename, alias9639: __typename, alias9640: __typename, alias9641: __typename, alias9642: __typename, alias9643: __typename, alias9644: __typename, alias9645: __typename, alias9646: __typename, alias9647: __typename, alias9648: __typename, alias9649: __typename, alias9650: __typename, alias9651: __typename, alias9652: __typename, alias9653: __typename, alias9654: __typename, alias9655: __typename, alias9656: __typename, alias9657: __typename, alias9658: __typename, alias9659: __typename, alias9660: __typename, alias9661: __typename, alias9662: __typename, alias9663: __typename, alias9664: __typename, alias9665: __typename, alias9666: __typename, alias9667: __typename, alias9668: __typename, alias9669: __typename, alias9670: __typename, alias9671: __typename, alias9672: __typename, alias9673: __typename, alias9674: __typename, alias9675: __typename, alias9676: __typename, alias9677: __typename, alias9678: __typename, alias9679: __typename, alias9680: __typename, alias9681: __typename, alias9682: __typename, alias9683: __typename, alias9684: __typename, alias9685: __typename, alias9686: __typename, alias9687: __typename, alias9688: __typename, alias9689: __typename, alias9690: __typename, alias9691: __typename, alias9692: __typename, alias9693: __typename, alias9694: __typename, alias9695: __typename, alias9696: __typename, alias9697: __typename, alias9698: __typename, alias9699: __typename, alias9700: __typename, alias9701: __typename, alias9702: __typename, alias9703: __typename, alias9704: __typename, alias9705: __typename, alias9706: __typename, alias9707: __typename, alias9708: __typename, alias9709: __typename, alias9710: __typename, alias9711: __typename, alias9712: __typename, alias9713: __typename, alias9714: __typename, alias9715: __typename, alias9716: __typename, alias9717: __typename, alias9718: __typename, alias9719: __typename, alias9720: __typename, alias9721: __typename, alias9722: __typename, alias9723: __typename, alias9724: __typename, alias9725: __typename, alias9726: __typename, alias9727: __typename, alias9728: __typename, alias9729: __typename, alias9730: __typename, alias9731: __typename, alias9732: __typename, alias9733: __typename, alias9734: __typename, alias9735: __typename, alias9736: __typename, alias9737: __typename, alias9738: __typename, alias9739: __typename, alias9740: __typename, alias9741: __typename, alias9742: __typename, alias9743: __typename, alias9744: __typename, alias9745: __typename, alias9746: __typename, alias9747: __typename, alias9748: __typename, alias9749: __typename, alias9750: __typename, alias9751: __typename, alias9752: __typename, alias9753: __typename, alias9754: __typename, alias9755: __typename, alias9756: __typename, alias9757: __typename, alias9758: __typename, alias9759: __typename, alias9760: __typename, alias9761: __typename, alias9762: __typename, alias9763: __typename, alias9764: __typename, alias9765: __typename, alias9766: __typename, alias9767: __typename, alias9768: __typename, alias9769: __typename, alias9770: __typename, alias9771: __typename, alias9772: __typename, alias9773: __typename, alias9774: __typename, alias9775: __typename, alias9776: __typename, alias9777: __typename, alias9778: __typename, alias9779: __typename, alias9780: __typename, alias9781: __typename, alias9782: __typename, alias9783: __typename, alias9784: __typename, alias9785: __typename, alias9786: __typename, alias9787: __typename, alias9788: __typename, alias9789: __typename, alias9790: __typename, alias9791: __typename, alias9792: __typename, alias9793: __typename, alias9794: __typename, alias9795: __typename, alias9796: __typename, alias9797: __typename, alias9798: __typename, alias9799: __typename, alias9800: __typename, alias9801: __typename, alias9802: __typename, alias9803: __typename, alias9804: __typename, alias9805: __typename, alias9806: __typename, alias9807: __typename, alias9808: __typename, alias9809: __typename, alias9810: __typename, alias9811: __typename, alias9812: __typename, alias9813: __typename, alias9814: __typename, alias9815: __typename, alias9816: __typename, alias9817: __typename, alias9818: __typename, alias9819: __typename, alias9820: __typename, alias9821: __typename, alias9822: __typename, alias9823: __typename, alias9824: __typename, alias9825: __typename, alias9826: __typename, alias9827: __typename, alias9828: __typename, alias9829: __typename, alias9830: __typename, alias9831: __typename, alias9832: __typename, alias9833: __typename, alias9834: __typename, alias9835: __typename, alias9836: __typename, alias9837: __typename, alias9838: __typename, alias9839: __typename, alias9840: __typename, alias9841: __typename, alias9842: __typename, alias9843: __typename, alias9844: __typename, alias9845: __typename, alias9846: __typename, alias9847: __typename, alias9848: __typename, alias9849: __typename, alias9850: __typename, alias9851: __typename, alias9852: __typename, alias9853: __typename, alias9854: __typename, alias9855: __typename, alias9856: __typename, alias9857: __typename, alias9858: __typename, alias9859: __typename, alias9860: __typename, alias9861: __typename, alias9862: __typename, alias9863: __typename, alias9864: __typename, alias9865: __typename, alias9866: __typename, alias9867: __typename, alias9868: __typename, alias9869: __typename, alias9870: __typename, alias9871: __typename, alias9872: __typename, alias9873: __typename, alias9874: __typename, alias9875: __typename, alias9876: __typename, alias9877: __typename, alias9878: __typename, alias9879: __typename, alias9880: __typename, alias9881: __typename, alias9882: __typename, alias9883: __typename, alias9884: __typename, alias9885: __typename, alias9886: __typename, alias9887: __typename, alias9888: __typename, alias9889: __typename, alias9890: __typename, alias9891: __typename, alias9892: __typename, alias9893: __typename, alias9894: __typename, alias9895: __typename, alias9896: __typename, alias9897: __typename, alias9898: __typename, alias9899: __typename, alias9900: __typename, alias9901: __typename, alias9902: __typename, alias9903: __typename, alias9904: __typename, alias9905: __typename, alias9906: __typename, alias9907: __typename, alias9908: __typename, alias9909: __typename, alias9910: __typename, alias9911: __typename, alias9912: __typename, alias9913: __typename, alias9914: __typename, alias9915: __typename, alias9916: __typename, alias9917: __typename, alias9918: __typename, alias9919: __typename, alias9920: __typename, alias9921: __typename, alias9922: __typename, alias9923: __typename, alias9924: __typename, alias9925: __typename, alias9926: __typename, alias9927: __typename, alias9928: __typename, alias9929: __typename, alias9930: __typename, alias9931: __typename, alias9932: __typename, alias9933: __typename, alias9934: __typename, alias9935: __typename, alias9936: __typename, alias9937: __typename, alias9938: __typename, alias9939: __typename, alias9940: __typename, alias9941: __typename, alias9942: __typename, alias9943: __typename, alias9944: __typename, alias9945: __typename, alias9946: __typename, alias9947: __typename, alias9948: __typename, alias9949: __typename, alias9950: __typename, alias9951: __typename, alias9952: __typename, alias9953: __typename, alias9954: __typename, alias9955: __typename, alias9956: __typename, alias9957: __typename, alias9958: __typename, alias9959: __typename, alias9960: __typename, alias9961: __typename, alias9962: __typename, alias9963: __typename, alias9964: __typename, alias9965: __typename, alias9966: __typename, alias9967: __typename, alias9968: __typename, alias9969: __typename, alias9970: __typename, alias9971: __typename, alias9972: __typename, alias9973: __typename, alias9974: __typename, alias9975: __typename, alias9976: __typename, alias9977: __typename, alias9978: __typename, alias9979: __typename, alias9980: __typename, alias9981: __typename, alias9982: __typename, alias9983: __typename, alias9984: __typename, alias9985: __typename, alias9986: __typename, alias9987: __typename, alias9988: __typename, alias9989: __typename, alias9990: __typename, alias9991: __typename, alias9992: __typename, alias9993: __typename, alias9994: __typename, alias9995: __typename, alias9996: __typename, alias9997: __typename, alias9998: __typename, alias9999: __typename, alias10000: __typename, alias10001: __typename, alias10002: __typename, alias10003: __typename, alias10004: __typename, alias10005: __typename, alias10006: __typename, alias10007: __typename, alias10008: __typename, alias10009: __typename, alias10010: __typename, alias10011: __typename, alias10012: __typename, alias10013: __typename, alias10014: __typename, alias10015: __typename, alias10016: __typename, alias10017: __typename, alias10018: __typename, alias10019: __typename, alias10020: __typename, alias10021: __typename, alias10022: __typename, alias10023: __typename, alias10024: __typename, alias10025: __typename, alias10026: __typename, alias10027: __typename, alias10028: __typename, alias10029: __typename, alias10030: __typename, alias10031: __typename, alias10032: __typename, alias10033: __typename, alias10034: __typename, alias10035: __typename, alias10036: __typename, alias10037: __typename, alias10038: __typename, alias10039: __typename, alias10040: __typename, alias10041: __typename, alias10042: __typename, alias10043: __typename, alias10044: __typename, alias10045: __typename, alias10046: __typename, alias10047: __typename, alias10048: __typename, alias10049: __typename, alias10050: __typename, alias10051: __typename, alias10052: __typename, alias10053: __typename, alias10054: __typename, alias10055: __typename, alias10056: __typename, alias10057: __typename, alias10058: __typename, alias10059: __typename, alias10060: __typename, alias10061: __typename, alias10062: __typename, alias10063: __typename, alias10064: __typename, alias10065: __typename, alias10066: __typename, alias10067: __typename, alias10068: __typename, alias10069: __typename, alias10070: __typename, alias10071: __typename, alias10072: __typename, alias10073: __typename, alias10074: __typename, alias10075: __typename, alias10076: __typename, alias10077: __typename, alias10078: __typename, alias10079: __typename, alias10080: __typename, alias10081: __typename, alias10082: __typename, alias10083: __typename, alias10084: __typename, alias10085: __typename, alias10086: __typename, alias10087: __typename, alias10088: __typename, alias10089: __typename, alias10090: __typename, alias10091: __typename, alias10092: __typename, alias10093: __typename, alias10094: __typename, alias10095: __typename, alias10096: __typename, alias10097: __typename, alias10098: __typename, alias10099: __typename, alias10100: __typename, alias10101: __typename, alias10102: __typename, alias10103: __typename, alias10104: __typename, alias10105: __typename, alias10106: __typename, alias10107: __typename, alias10108: __typename, alias10109: __typename, alias10110: __typename, alias10111: __typename, alias10112: __typename, alias10113: __typename, alias10114: __typename, alias10115: __typename, alias10116: __typename, alias10117: __typename, alias10118: __typename, alias10119: __typename, alias10120: __typename, alias10121: __typename, alias10122: __typename, alias10123: __typename, alias10124: __typename, alias10125: __typename, alias10126: __typename, alias10127: __typename, alias10128: __typename, alias10129: __typename, alias10130: __typename, alias10131: __typename, alias10132: __typename, alias10133: __typename, alias10134: __typename, alias10135: __typename, alias10136: __typename, alias10137: __typename, alias10138: __typename, alias10139: __typename, alias10140: __typename, alias10141: __typename, alias10142: __typename, alias10143: __typename, alias10144: __typename, alias10145: __typename, alias10146: __typename, alias10147: __typename, alias10148: __typename, alias10149: __typename, alias10150: __typename, alias10151: __typename, alias10152: __typename, alias10153: __typename, alias10154: __typename, alias10155: __typename, alias10156: __typename, alias10157: __typename, alias10158: __typename, alias10159: __typename, alias10160: __typename, alias10161: __typename, alias10162: __typename, alias10163: __typename, alias10164: __typename, alias10165: __typename, alias10166: __typename, alias10167: __typename, alias10168: __typename, alias10169: __typename, alias10170: __typename, alias10171: __typename, alias10172: __typename, alias10173: __typename, alias10174: __typename, alias10175: __typename, alias10176: __typename, alias10177: __typename, alias10178: __typename, alias10179: __typename, alias10180: __typename, alias10181: __typename, alias10182: __typename, alias10183: __typename, alias10184: __typename, alias10185: __typename, alias10186: __typename, alias10187: __typename, alias10188: __typename, alias10189: __typename, alias10190: __typename, alias10191: __typename, alias10192: __typename, alias10193: __typename, alias10194: __typename, alias10195: __typename, alias10196: __typename, alias10197: __typename, alias10198: __typename, alias10199: __typename, alias10200: __typename, alias10201: __typename, alias10202: __typename, alias10203: __typename, alias10204: __typename, alias10205: __typename, alias10206: __typename, alias10207: __typename, alias10208: __typename, alias10209: __typename, alias10210: __typename, alias10211: __typename, alias10212: __typename, alias10213: __typename, alias10214: __typename, alias10215: __typename, alias10216: __typename, alias10217: __typename, alias10218: __typename, alias10219: __typename, alias10220: __typename, alias10221: __typename, alias10222: __typename, alias10223: __typename, alias10224: __typename, alias10225: __typename, alias10226: __typename, alias10227: __typename, alias10228: __typename, alias10229: __typename, alias10230: __typename, alias10231: __typename, alias10232: __typename, alias10233: __typename, alias10234: __typename, alias10235: __typename, alias10236: __typename, alias10237: __typename, alias10238: __typename, alias10239: __typename, alias10240: __typename, alias10241: __typename, alias10242: __typename, alias10243: __typename, alias10244: __typename, alias10245: __typename, alias10246: __typename, alias10247: __typename, alias10248: __typename, alias10249: __typename, alias10250: __typename, alias10251: __typename, alias10252: __typename, alias10253: __typename, alias10254: __typename, alias10255: __typename, alias10256: __typename, alias10257: __typename, alias10258: __typename, alias10259: __typename, alias10260: __typename, alias10261: __typename, alias10262: __typename, alias10263: __typename, alias10264: __typename, alias10265: __typename, alias10266: __typename, alias10267: __typename, alias10268: __typename, alias10269: __typename, alias10270: __typename, alias10271: __typename, alias10272: __typename, alias10273: __typename, alias10274: __typename, alias10275: __typename, alias10276: __typename, alias10277: __typename, alias10278: __typename, alias10279: __typename, alias10280: __typename, alias10281: __typename, alias10282: __typename, alias10283: __typename, alias10284: __typename, alias10285: __typename, alias10286: __typename, alias10287: __typename, alias10288: __typename, alias10289: __typename, alias10290: __typename, alias10291: __typename, alias10292: __typename, alias10293: __typename, alias10294: __typename, alias10295: __typename, alias10296: __typename, alias10297: __typename, alias10298: __typename, alias10299: __typename, alias10300: __typename, alias10301: __typename, alias10302: __typename, alias10303: __typename, alias10304: __typename, alias10305: __typename, alias10306: __typename, alias10307: __typename, alias10308: __typename, alias10309: __typename, alias10310: __typename, alias10311: __typename, alias10312: __typename, alias10313: __typename, alias10314: __typename, alias10315: __typename, alias10316: __typename, alias10317: __typename, alias10318: __typename, alias10319: __typename, alias10320: __typename, alias10321: __typename, alias10322: __typename, alias10323: __typename, alias10324: __typename, alias10325: __typename, alias10326: __typename, alias10327: __typename, alias10328: __typename, alias10329: __typename, alias10330: __typename, alias10331: __typename, alias10332: __typename, alias10333: __typename, alias10334: __typename, alias10335: __typename, alias10336: __typename, alias10337: __typename, alias10338: __typename, alias10339: __typename, alias10340: __typename, alias10341: __typename, alias10342: __typename, alias10343: __typename, alias10344: __typename, alias10345: __typename, alias10346: __typename, alias10347: __typename, alias10348: __typename, alias10349: __typename, alias10350: __typename, alias10351: __typename, alias10352: __typename, alias10353: __typename, alias10354: __typename, alias10355: __typename, alias10356: __typename, alias10357: __typename, alias10358: __typename, alias10359: __typename, alias10360: __typename, alias10361: __typename, alias10362: __typename, alias10363: __typename, alias10364: __typename, alias10365: __typename, alias10366: __typename, alias10367: __typename, alias10368: __typename, alias10369: __typename, alias10370: __typename, alias10371: __typename, alias10372: __typename, alias10373: __typename, alias10374: __typename, alias10375: __typename, alias10376: __typename, alias10377: __typename, alias10378: __typename, alias10379: __typename, alias10380: __typename, alias10381: __typename, alias10382: __typename, alias10383: __typename, alias10384: __typename, alias10385: __typename, alias10386: __typename, alias10387: __typename, alias10388: __typename, alias10389: __typename, alias10390: __typename, alias10391: __typename, alias10392: __typename, alias10393: __typename, alias10394: __typename, alias10395: __typename, alias10396: __typename, alias10397: __typename, alias10398: __typename, alias10399: __typename, alias10400: __typename, alias10401: __typename, alias10402: __typename, alias10403: __typename, alias10404: __typename, alias10405: __typename, alias10406: __typename, alias10407: __typename, alias10408: __typename, alias10409: __typename, alias10410: __typename, alias10411: __typename, alias10412: __typename, alias10413: __typename, alias10414: __typename, alias10415: __typename, alias10416: __typename, alias10417: __typename, alias10418: __typename, alias10419: __typename, alias10420: __typename, alias10421: __typename, alias10422: __typename, alias10423: __typename, alias10424: __typename, alias10425: __typename, alias10426: __typename, alias10427: __typename, alias10428: __typename, alias10429: __typename, alias10430: __typename, alias10431: __typename, alias10432: __typename, alias10433: __typename, alias10434: __typename, alias10435: __typename, alias10436: __typename, alias10437: __typename, alias10438: __typename, alias10439: __typename, alias10440: __typename, alias10441: __typename, alias10442: __typename, alias10443: __typename, alias10444: __typename, alias10445: __typename, alias10446: __typename, alias10447: __typename, alias10448: __typename, alias10449: __typename, alias10450: __typename, alias10451: __typename, alias10452: __typename, alias10453: __typename, alias10454: __typename, alias10455: __typename, alias10456: __typename, alias10457: __typename, alias10458: __typename, alias10459: __typename, alias10460: __typename, alias10461: __typename, alias10462: __typename, alias10463: __typename, alias10464: __typename, alias10465: __typename, alias10466: __typename, alias10467: __typename, alias10468: __typename, alias10469: __typename, alias10470: __typename, alias10471: __typename, alias10472: __typename, alias10473: __typename, alias10474: __typename, alias10475: __typename, alias10476: __typename, alias10477: __typename, alias10478: __typename, alias10479: __typename, alias10480: __typename, alias10481: __typename, alias10482: __typename, alias10483: __typename, alias10484: __typename, alias10485: __typename, alias10486: __typename, alias10487: __typename, alias10488: __typename, alias10489: __typename, alias10490: __typename, alias10491: __typename, alias10492: __typename, alias10493: __typename, alias10494: __typename, alias10495: __typename, alias10496: __typename, alias10497: __typename, alias10498: __typename, alias10499: __typename, alias10500: __typename, alias10501: __typename, alias10502: __typename, alias10503: __typename, alias10504: __typename, alias10505: __typename, alias10506: __typename, alias10507: __typename, alias10508: __typename, alias10509: __typename, alias10510: __typename, alias10511: __typename, alias10512: __typename, alias10513: __typename, alias10514: __typename, alias10515: __typename, alias10516: __typename, alias10517: __typename, alias10518: __typename, alias10519: __typename, alias10520: __typename, alias10521: __typename, alias10522: __typename, alias10523: __typename, alias10524: __typename, alias10525: __typename, alias10526: __typename, alias10527: __typename, alias10528: __typename, alias10529: __typename, alias10530: __typename, alias10531: __typename, alias10532: __typename, alias10533: __typename, alias10534: __typename, alias10535: __typename, alias10536: __typename, alias10537: __typename, alias10538: __typename, alias10539: __typename, alias10540: __typename, alias10541: __typename, alias10542: __typename, alias10543: __typename, alias10544: __typename, alias10545: __typename, alias10546: __typename, alias10547: __typename, alias10548: __typename, alias10549: __typename, alias10550: __typename, alias10551: __typename, alias10552: __typename, alias10553: __typename, alias10554: __typename, alias10555: __typename, alias10556: __typename, alias10557: __typename, alias10558: __typename, alias10559: __typename, alias10560: __typename, alias10561: __typename, alias10562: __typename, alias10563: __typename, alias10564: __typename, alias10565: __typename, alias10566: __typename, alias10567: __typename, alias10568: __typename, alias10569: __typename, alias10570: __typename, alias10571: __typename, alias10572: __typename, alias10573: __typename, alias10574: __typename, alias10575: __typename, alias10576: __typename, alias10577: __typename, alias10578: __typename, alias10579: __typename, alias10580: __typename, alias10581: __typename, alias10582: __typename, alias10583: __typename, alias10584: __typename, alias10585: __typename, alias10586: __typename, alias10587: __typename, alias10588: __typename, alias10589: __typename, alias10590: __typename, alias10591: __typename, alias10592: __typename, alias10593: __typename, alias10594: __typename, alias10595: __typename, alias10596: __typename, alias10597: __typename, alias10598: __typename, alias10599: __typename, alias10600: __typename, alias10601: __typename, alias10602: __typename, alias10603: __typename, alias10604: __typename, alias10605: __typename, alias10606: __typename, alias10607: __typename, alias10608: __typename, alias10609: __typename, alias10610: __typename, alias10611: __typename, alias10612: __typename, alias10613: __typename, alias10614: __typename, alias10615: __typename, alias10616: __typename, alias10617: __typename, alias10618: __typename, alias10619: __typename, alias10620: __typename, alias10621: __typename, alias10622: __typename, alias10623: __typename, alias10624: __typename, alias10625: __typename, alias10626: __typename, alias10627: __typename, alias10628: __typename, alias10629: __typename, alias10630: __typename, alias10631: __typename, alias10632: __typename, alias10633: __typename, alias10634: __typename, alias10635: __typename, alias10636: __typename, alias10637: __typename, alias10638: __typename, alias10639: __typename, alias10640: __typename, alias10641: __typename, alias10642: __typename, alias10643: __typename, alias10644: __typename, alias10645: __typename, alias10646: __typename, alias10647: __typename, alias10648: __typename, alias10649: __typename, alias10650: __typename, alias10651: __typename, alias10652: __typename, alias10653: __typename, alias10654: __typename, alias10655: __typename, alias10656: __typename, alias10657: __typename, alias10658: __typename, alias10659: __typename, alias10660: __typename, alias10661: __typename, alias10662: __typename, alias10663: __typename, alias10664: __typename, alias10665: __typename, alias10666: __typename, alias10667: __typename, alias10668: __typename, alias10669: __typename, alias10670: __typename, alias10671: __typename, alias10672: __typename, alias10673: __typename, alias10674: __typename, alias10675: __typename, alias10676: __typename, alias10677: __typename, alias10678: __typename, alias10679: __typename, alias10680: __typename, alias10681: __typename, alias10682: __typename, alias10683: __typename, alias10684: __typename, alias10685: __typename, alias10686: __typename, alias10687: __typename, alias10688: __typename, alias10689: __typename, alias10690: __typename, alias10691: __typename, alias10692: __typename, alias10693: __typename, alias10694: __typename, alias10695: __typename, alias10696: __typename, alias10697: __typename, alias10698: __typename, alias10699: __typename, alias10700: __typename, alias10701: __typename, alias10702: __typename, alias10703: __typename, alias10704: __typename, alias10705: __typename, alias10706: __typename, alias10707: __typename, alias10708: __typename, alias10709: __typename, alias10710: __typename, alias10711: __typename, alias10712: __typename, alias10713: __typename, alias10714: __typename, alias10715: __typename, alias10716: __typename, alias10717: __typename, alias10718: __typename, alias10719: __typename, alias10720: __typename, alias10721: __typename, alias10722: __typename, alias10723: __typename, alias10724: __typename, alias10725: __typename, alias10726: __typename, alias10727: __typename, alias10728: __typename, alias10729: __typename, alias10730: __typename, alias10731: __typename, alias10732: __typename, alias10733: __typename, alias10734: __typename, alias10735: __typename, alias10736: __typename, alias10737: __typename, alias10738: __typename, alias10739: __typename, alias10740: __typename, alias10741: __typename, alias10742: __typename, alias10743: __typename, alias10744: __typename, alias10745: __typename, alias10746: __typename, alias10747: __typename, alias10748: __typename, alias10749: __typename, alias10750: __typename, alias10751: __typename, alias10752: __typename, alias10753: __typename, alias10754: __typename, alias10755: __typename, alias10756: __typename, alias10757: __typename, alias10758: __typename, alias10759: __typename, alias10760: __typename, alias10761: __typename, alias10762: __typename, alias10763: __typename, alias10764: __typename, alias10765: __typename, alias10766: __typename, alias10767: __typename, alias10768: __typename, alias10769: __typename, alias10770: __typename, alias10771: __typename, alias10772: __typename, alias10773: __typename, alias10774: __typename, alias10775: __typename, alias10776: __typename, alias10777: __typename, alias10778: __typename, alias10779: __typename, alias10780: __typename, alias10781: __typename, alias10782: __typename, alias10783: __typename, alias10784: __typename, alias10785: __typename, alias10786: __typename, alias10787: __typename, alias10788: __typename, alias10789: __typename, alias10790: __typename, alias10791: __typename, alias10792: __typename, alias10793: __typename, alias10794: __typename, alias10795: __typename, alias10796: __typename, alias10797: __typename, alias10798: __typename, alias10799: __typename, alias10800: __typename, alias10801: __typename, alias10802: __typename, alias10803: __typename, alias10804: __typename, alias10805: __typename, alias10806: __typename, alias10807: __typename, alias10808: __typename, alias10809: __typename, alias10810: __typename, alias10811: __typename, alias10812: __typename, alias10813: __typename, alias10814: __typename, alias10815: __typename, alias10816: __typename, alias10817: __typename, alias10818: __typename, alias10819: __typename, alias10820: __typename, alias10821: __typename, alias10822: __typename, alias10823: __typename, alias10824: __typename, alias10825: __typename, alias10826: __typename, alias10827: __typename, alias10828: __typename, alias10829: __typename, alias10830: __typename, alias10831: __typename, alias10832: __typename, alias10833: __typename, alias10834: __typename, alias10835: __typename, alias10836: __typename, alias10837: __typename, alias10838: __typename, alias10839: __typename, alias10840: __typename, alias10841: __typename, alias10842: __typename, alias10843: __typename, alias10844: __typename, alias10845: __typename, alias10846: __typename, alias10847: __typename, alias10848: __typename, alias10849: __typename, alias10850: __typename, alias10851: __typename, alias10852: __typename, alias10853: __typename, alias10854: __typename, alias10855: __typename, alias10856: __typename, alias10857: __typename, alias10858: __typename, alias10859: __typename, alias10860: __typename, alias10861: __typename, alias10862: __typename, alias10863: __typename, alias10864: __typename, alias10865: __typename, alias10866: __typename, alias10867: __typename, alias10868: __typename, alias10869: __typename, alias10870: __typename, alias10871: __typename, alias10872: __typename, alias10873: __typename, alias10874: __typename, alias10875: __typename, alias10876: __typename, alias10877: __typename, alias10878: __typename, alias10879: __typename, alias10880: __typename, alias10881: __typename, alias10882: __typename, alias10883: __typename, alias10884: __typename, alias10885: __typename, alias10886: __typename, alias10887: __typename, alias10888: __typename, alias10889: __typename, alias10890: __typename, alias10891: __typename, alias10892: __typename, alias10893: __typename, alias10894: __typename, alias10895: __typename, alias10896: __typename, alias10897: __typename, alias10898: __typename, alias10899: __typename, alias10900: __typename, alias10901: __typename, alias10902: __typename, alias10903: __typename, alias10904: __typename, alias10905: __typename, alias10906: __typename, alias10907: __typename, alias10908: __typename, alias10909: __typename, alias10910: __typename, alias10911: __typename, alias10912: __typename, alias10913: __typename, alias10914: __typename, alias10915: __typename, alias10916: __typename, alias10917: __typename, alias10918: __typename, alias10919: __typename, alias10920: __typename, alias10921: __typename, alias10922: __typename, alias10923: __typename, alias10924: __typename, alias10925: __typename, alias10926: __typename, alias10927: __typename, alias10928: __typename, alias10929: __typename, alias10930: __typename, alias10931: __typename, alias10932: __typename, alias10933: __typename, alias10934: __typename, alias10935: __typename, alias10936: __typename, alias10937: __typename, alias10938: __typename, alias10939: __typename, alias10940: __typename, alias10941: __typename, alias10942: __typename, alias10943: __typename, alias10944: __typename, alias10945: __typename, alias10946: __typename, alias10947: __typename, alias10948: __typename, alias10949: __typename, alias10950: __typename, alias10951: __typename, alias10952: __typename, alias10953: __typename, alias10954: __typename, alias10955: __typename, alias10956: __typename, alias10957: __typename, alias10958: __typename, alias10959: __typename, alias10960: __typename, alias10961: __typename, alias10962: __typename, alias10963: __typename, alias10964: __typename, alias10965: __typename, alias10966: __typename, alias10967: __typename, alias10968: __typename, alias10969: __typename, alias10970: __typename, alias10971: __typename, alias10972: __typename, alias10973: __typename, alias10974: __typename, alias10975: __typename, alias10976: __typename, alias10977: __typename, alias10978: __typename, alias10979: __typename, alias10980: __typename, alias10981: __typename, alias10982: __typename, alias10983: __typename, alias10984: __typename, alias10985: __typename, alias10986: __typename, alias10987: __typename, alias10988: __typename, alias10989: __typename, alias10990: __typename, alias10991: __typename, alias10992: __typename, alias10993: __typename, alias10994: __typename, alias10995: __typename, alias10996: __typename, alias10997: __typename, alias10998: __typename, alias10999: __typename, alias11000: __typename, alias11001: __typename, alias11002: __typename, alias11003: __typename, alias11004: __typename, alias11005: __typename, alias11006: __typename, alias11007: __typename, alias11008: __typename, alias11009: __typename, alias11010: __typename, alias11011: __typename, alias11012: __typename, alias11013: __typename, alias11014: __typename, alias11015: __typename, alias11016: __typename, alias11017: __typename, alias11018: __typename, alias11019: __typename, alias11020: __typename, alias11021: __typename, alias11022: __typename, alias11023: __typename, alias11024: __typename, alias11025: __typename, alias11026: __typename, alias11027: __typename, alias11028: __typename, alias11029: __typename, alias11030: __typename, alias11031: __typename, alias11032: __typename, alias11033: __typename, alias11034: __typename, alias11035: __typename, alias11036: __typename, alias11037: __typename, alias11038: __typename, alias11039: __typename, alias11040: __typename, alias11041: __typename, alias11042: __typename, alias11043: __typename, alias11044: __typename, alias11045: __typename, alias11046: __typename, alias11047: __typename, alias11048: __typename, alias11049: __typename, alias11050: __typename, alias11051: __typename, alias11052: __typename, alias11053: __typename, alias11054: __typename, alias11055: __typename, alias11056: __typename, alias11057: __typename, alias11058: __typename, alias11059: __typename, alias11060: __typename, alias11061: __typename, alias11062: __typename, alias11063: __typename, alias11064: __typename, alias11065: __typename, alias11066: __typename, alias11067: __typename, alias11068: __typename, alias11069: __typename, alias11070: __typename, alias11071: __typename, alias11072: __typename, alias11073: __typename, alias11074: __typename, alias11075: __typename, alias11076: __typename, alias11077: __typename, alias11078: __typename, alias11079: __typename, alias11080: __typename, alias11081: __typename, alias11082: __typename, alias11083: __typename, alias11084: __typename, alias11085: __typename, alias11086: __typename, alias11087: __typename, alias11088: __typename, alias11089: __typename, alias11090: __typename, alias11091: __typename, alias11092: __typename, alias11093: __typename, alias11094: __typename, alias11095: __typename, alias11096: __typename, alias11097: __typename, alias11098: __typename, alias11099: __typename, alias11100: __typename, alias11101: __typename, alias11102: __typename, alias11103: __typename, alias11104: __typename, alias11105: __typename, alias11106: __typename, alias11107: __typename, alias11108: __typename, alias11109: __typename, alias11110: __typename, alias11111: __typename, alias11112: __typename, alias11113: __typename, alias11114: __typename, alias11115: __typename, alias11116: __typename, alias11117: __typename, alias11118: __typename, alias11119: __typename, alias11120: __typename, alias11121: __typename, alias11122: __typename, alias11123: __typename, alias11124: __typename, alias11125: __typename, alias11126: __typename, alias11127: __typename, alias11128: __typename, alias11129: __typename, alias11130: __typename, alias11131: __typename, alias11132: __typename, alias11133: __typename, alias11134: __typename, alias11135: __typename, alias11136: __typename, alias11137: __typename, alias11138: __typename, alias11139: __typename, alias11140: __typename, alias11141: __typename, alias11142: __typename, alias11143: __typename, alias11144: __typename, alias11145: __typename, alias11146: __typename, alias11147: __typename, alias11148: __typename, alias11149: __typename, alias11150: __typename, alias11151: __typename, alias11152: __typename, alias11153: __typename, alias11154: __typename, alias11155: __typename, alias11156: __typename, alias11157: __typename, alias11158: __typename, alias11159: __typename, alias11160: __typename, alias11161: __typename, alias11162: __typename, alias11163: __typename, alias11164: __typename, alias11165: __typename, alias11166: __typename, alias11167: __typename, alias11168: __typename, alias11169: __typename, alias11170: __typename, alias11171: __typename, alias11172: __typename, alias11173: __typename, alias11174: __typename, alias11175: __typename, alias11176: __typename, alias11177: __typename, alias11178: __typename, alias11179: __typename, alias11180: __typename, alias11181: __typename, alias11182: __typename, alias11183: __typename, alias11184: __typename, alias11185: __typename, alias11186: __typename, alias11187: __typename, alias11188: __typename, alias11189: __typename, alias11190: __typename, alias11191: __typename, alias11192: __typename, alias11193: __typename, alias11194: __typename, alias11195: __typename, alias11196: __typename, alias11197: __typename, alias11198: __typename, alias11199: __typename, alias11200: __typename, alias11201: __typename, alias11202: __typename, alias11203: __typename, alias11204: __typename, alias11205: __typename, alias11206: __typename, alias11207: __typename, alias11208: __typename, alias11209: __typename, alias11210: __typename, alias11211: __typename, alias11212: __typename, alias11213: __typename, alias11214: __typename, alias11215: __typename, alias11216: __typename, alias11217: __typename, alias11218: __typename, alias11219: __typename, alias11220: __typename, alias11221: __typename, alias11222: __typename, alias11223: __typename, alias11224: __typename, alias11225: __typename, alias11226: __typename, alias11227: __typename, alias11228: __typename, alias11229: __typename, alias11230: __typename, alias11231: __typename, alias11232: __typename, alias11233: __typename, alias11234: __typename, alias11235: __typename, alias11236: __typename, alias11237: __typename, alias11238: __typename, alias11239: __typename, alias11240: __typename, alias11241: __typename, alias11242: __typename, alias11243: __typename, alias11244: __typename, alias11245: __typename, alias11246: __typename, alias11247: __typename, alias11248: __typename, alias11249: __typename, alias11250: __typename, alias11251: __typename, alias11252: __typename, alias11253: __typename, alias11254: __typename, alias11255: __typename, alias11256: __typename, alias11257: __typename, alias11258: __typename, alias11259: __typename, alias11260: __typename, alias11261: __typename, alias11262: __typename, alias11263: __typename, alias11264: __typename, alias11265: __typename, alias11266: __typename, alias11267: __typename, alias11268: __typename, alias11269: __typename, alias11270: __typename, alias11271: __typename, alias11272: __typename, alias11273: __typename, alias11274: __typename, alias11275: __typename, alias11276: __typename, alias11277: __typename, alias11278: __typename, alias11279: __typename, alias11280: __typename, alias11281: __typename, alias11282: __typename, alias11283: __typename, alias11284: __typename, alias11285: __typename, alias11286: __typename, alias11287: __typename, alias11288: __typename, alias11289: __typename, alias11290: __typename, alias11291: __typename, alias11292: __typename, alias11293: __typename, alias11294: __typename, alias11295: __typename, alias11296: __typename, alias11297: __typename, alias11298: __typename, alias11299: __typename, alias11300: __typename, alias11301: __typename, alias11302: __typename, alias11303: __typename, alias11304: __typename, alias11305: __typename, alias11306: __typename, alias11307: __typename, alias11308: __typename, alias11309: __typename, alias11310: __typename, alias11311: __typename, alias11312: __typename, alias11313: __typename, alias11314: __typename, alias11315: __typename, alias11316: __typename, alias11317: __typename, alias11318: __typename, alias11319: __typename, alias11320: __typename, alias11321: __typename, alias11322: __typename, alias11323: __typename, alias11324: __typename, alias11325: __typename, alias11326: __typename, alias11327: __typename, alias11328: __typename, alias11329: __typename, alias11330: __typename, alias11331: __typename, alias11332: __typename, alias11333: __typename, alias11334: __typename, alias11335: __typename, alias11336: __typename, alias11337: __typename, alias11338: __typename, alias11339: __typename, alias11340: __typename, alias11341: __typename, alias11342: __typename, alias11343: __typename, alias11344: __typename, alias11345: __typename, alias11346: __typename, alias11347: __typename, alias11348: __typename, alias11349: __typename, alias11350: __typename, alias11351: __typename, alias11352: __typename, alias11353: __typename, alias11354: __typename, alias11355: __typename, alias11356: __typename, alias11357: __typename, alias11358: __typename, alias11359: __typename, alias11360: __typename, alias11361: __typename, alias11362: __typename, alias11363: __typename, alias11364: __typename, alias11365: __typename, alias11366: __typename, alias11367: __typename, alias11368: __typename, alias11369: __typename, alias11370: __typename, alias11371: __typename, alias11372: __typename, alias11373: __typename, alias11374: __typename, alias11375: __typename, alias11376: __typename, alias11377: __typename, alias11378: __typename, alias11379: __typename, alias11380: __typename, alias11381: __typename, alias11382: __typename, alias11383: __typename, alias11384: __typename, alias11385: __typename, alias11386: __typename, alias11387: __typename, alias11388: __typename, alias11389: __typename, alias11390: __typename, alias11391: __typename, alias11392: __typename, alias11393: __typename, alias11394: __typename, alias11395: __typename, alias11396: __typename, alias11397: __typename, alias11398: __typename, alias11399: __typename, alias11400: __typename, alias11401: __typename, alias11402: __typename, alias11403: __typename, alias11404: __typename, alias11405: __typename, alias11406: __typename, alias11407: __typename, alias11408: __typename, alias11409: __typename, alias11410: __typename, alias11411: __typename, alias11412: __typename, alias11413: __typename, alias11414: __typename, alias11415: __typename, alias11416: __typename, alias11417: __typename, alias11418: __typename, alias11419: __typename, alias11420: __typename, alias11421: __typename, alias11422: __typename, alias11423: __typename, alias11424: __typename, alias11425: __typename, alias11426: __typename, alias11427: __typename, alias11428: __typename, alias11429: __typename, alias11430: __typename, alias11431: __typename, alias11432: __typename, alias11433: __typename, alias11434: __typename, alias11435: __typename, alias11436: __typename, alias11437: __typename, alias11438: __typename, alias11439: __typename, alias11440: __typename, alias11441: __typename, alias11442: __typename, alias11443: __typename, alias11444: __typename, alias11445: __typename, alias11446: __typename, alias11447: __typename, alias11448: __typename, alias11449: __typename, alias11450: __typename, alias11451: __typename, alias11452: __typename, alias11453: __typename, alias11454: __typename, alias11455: __typename, alias11456: __typename, alias11457: __typename, alias11458: __typename, alias11459: __typename, alias11460: __typename, alias11461: __typename, alias11462: __typename, alias11463: __typename, alias11464: __typename, alias11465: __typename, alias11466: __typename, alias11467: __typename, alias11468: __typename, alias11469: __typename, alias11470: __typename, alias11471: __typename, alias11472: __typename, alias11473: __typename, alias11474: __typename, alias11475: __typename, alias11476: __typename, alias11477: __typename, alias11478: __typename, alias11479: __typename, alias11480: __typename, alias11481: __typename, alias11482: __typename, alias11483: __typename, alias11484: __typename, alias11485: __typename, alias11486: __typename, alias11487: __typename, alias11488: __typename, alias11489: __typename, alias11490: __typename, alias11491: __typename, alias11492: __typename, alias11493: __typename, alias11494: __typename, alias11495: __typename, alias11496: __typename, alias11497: __typename, alias11498: __typename, alias11499: __typename, alias11500: __typename, alias11501: __typename, alias11502: __typename, alias11503: __typename, alias11504: __typename, alias11505: __typename, alias11506: __typename, alias11507: __typename, alias11508: __typename, alias11509: __typename, alias11510: __typename, alias11511: __typename, alias11512: __typename, alias11513: __typename, alias11514: __typename, alias11515: __typename, alias11516: __typename, alias11517: __typename, alias11518: __typename, alias11519: __typename, alias11520: __typename, alias11521: __typename, alias11522: __typename, alias11523: __typename, alias11524: __typename, alias11525: __typename, alias11526: __typename, alias11527: __typename, alias11528: __typename, alias11529: __typename, alias11530: __typename, alias11531: __typename, alias11532: __typename, alias11533: __typename, alias11534: __typename, alias11535: __typename, alias11536: __typename, alias11537: __typename, alias11538: __typename, alias11539: __typename, alias11540: __typename, alias11541: __typename, alias11542: __typename, alias11543: __typename, alias11544: __typename, alias11545: __typename, alias11546: __typename, alias11547: __typename, alias11548: __typename, alias11549: __typename, alias11550: __typename, alias11551: __typename, alias11552: __typename, alias11553: __typename, alias11554: __typename, alias11555: __typename, alias11556: __typename, alias11557: __typename, alias11558: __typename, alias11559: __typename, alias11560: __typename, alias11561: __typename, alias11562: __typename, alias11563: __typename, alias11564: __typename, alias11565: __typename, alias11566: __typename, alias11567: __typename, alias11568: __typename, alias11569: __typename, alias11570: __typename, alias11571: __typename, alias11572: __typename, alias11573: __typename, alias11574: __typename, alias11575: __typename, alias11576: __typename, alias11577: __typename, alias11578: __typename, alias11579: __typename, alias11580: __typename, alias11581: __typename, alias11582: __typename, alias11583: __typename, alias11584: __typename, alias11585: __typename, alias11586: __typename, alias11587: __typename, alias11588: __typename, alias11589: __typename, alias11590: __typename, alias11591: __typename, alias11592: __typename, alias11593: __typename, alias11594: __typename, alias11595: __typename, alias11596: __typename, alias11597: __typename, alias11598: __typename, alias11599: __typename, alias11600: __typename, alias11601: __typename, alias11602: __typename, alias11603: __typename, alias11604: __typename, alias11605: __typename, alias11606: __typename, alias11607: __typename, alias11608: __typename, alias11609: __typename, alias11610: __typename, alias11611: __typename, alias11612: __typename, alias11613: __typename, alias11614: __typename, alias11615: __typename, alias11616: __typename, alias11617: __typename, alias11618: __typename, alias11619: __typename, alias11620: __typename, alias11621: __typename, alias11622: __typename, alias11623: __typename, alias11624: __typename, alias11625: __typename, alias11626: __typename, alias11627: __typename, alias11628: __typename, alias11629: __typename, alias11630: __typename, alias11631: __typename, alias11632: __typename, alias11633: __typename, alias11634: __typename, alias11635: __typename, alias11636: __typename, alias11637: __typename, alias11638: __typename, alias11639: __typename, alias11640: __typename, alias11641: __typename, alias11642: __typename, alias11643: __typename, alias11644: __typename, alias11645: __typename, alias11646: __typename, alias11647: __typename, alias11648: __typename, alias11649: __typename, alias11650: __typename, alias11651: __typename, alias11652: __typename, alias11653: __typename, alias11654: __typename, alias11655: __typename, alias11656: __typename, alias11657: __typename, alias11658: __typename, alias11659: __typename, alias11660: __typename, alias11661: __typename, alias11662: __typename, alias11663: __typename, alias11664: __typename, alias11665: __typename, alias11666: __typename, alias11667: __typename, alias11668: __typename, alias11669: __typename, alias11670: __typename, alias11671: __typename, alias11672: __typename, alias11673: __typename, alias11674: __typename, alias11675: __typename, alias11676: __typename, alias11677: __typename, alias11678: __typename, alias11679: __typename, alias11680: __typename, alias11681: __typename, alias11682: __typename, alias11683: __typename, alias11684: __typename, alias11685: __typename, alias11686: __typename, alias11687: __typename, alias11688: __typename, alias11689: __typename, alias11690: __typename, alias11691: __typename, alias11692: __typename, alias11693: __typename, alias11694: __typename, alias11695: __typename, alias11696: __typename, alias11697: __typename, alias11698: __typename, alias11699: __typename, alias11700: __typename, alias11701: __typename, alias11702: __typename, alias11703: __typename, alias11704: __typename, alias11705: __typename, alias11706: __typename, alias11707: __typename, alias11708: __typename, alias11709: __typename, alias11710: __typename, alias11711: __typename, alias11712: __typename, alias11713: __typename, alias11714: __typename, alias11715: __typename, alias11716: __typename, alias11717: __typename, alias11718: __typename, alias11719: __typename, alias11720: __typename, alias11721: __typename, alias11722: __typename, alias11723: __typename, alias11724: __typename, alias11725: __typename, alias11726: __typename, alias11727: __typename, alias11728: __typename, alias11729: __typename, alias11730: __typename, alias11731: __typename, alias11732: __typename, alias11733: __typename, alias11734: __typename, alias11735: __typename, alias11736: __typename, alias11737: __typename, alias11738: __typename, alias11739: __typename, alias11740: __typename, alias11741: __typename, alias11742: __typename, alias11743: __typename, alias11744: __typename, alias11745: __typename, alias11746: __typename, alias11747: __typename, alias11748: __typename, alias11749: __typename, alias11750: __typename, alias11751: __typename, alias11752: __typename, alias11753: __typename, alias11754: __typename, alias11755: __typename, alias11756: __typename, alias11757: __typename, alias11758: __typename, alias11759: __typename, alias11760: __typename, alias11761: __typename, alias11762: __typename, alias11763: __typename, alias11764: __typename, alias11765: __typename, alias11766: __typename, alias11767: __typename, alias11768: __typename, alias11769: __typename, alias11770: __typename, alias11771: __typename, alias11772: __typename, alias11773: __typename, alias11774: __typename, alias11775: __typename, alias11776: __typename, alias11777: __typename, alias11778: __typename, alias11779: __typename, alias11780: __typename, alias11781: __typename, alias11782: __typename, alias11783: __typename, alias11784: __typename, alias11785: __typename, alias11786: __typename, alias11787: __typename, alias11788: __typename, alias11789: __typename, alias11790: __typename, alias11791: __typename, alias11792: __typename, alias11793: __typename, alias11794: __typename, alias11795: __typename, alias11796: __typename, alias11797: __typename, alias11798: __typename, alias11799: __typename, alias11800: __typename, alias11801: __typename, alias11802: __typename, alias11803: __typename, alias11804: __typename, alias11805: __typename, alias11806: __typename, alias11807: __typename, alias11808: __typename, alias11809: __typename, alias11810: __typename, alias11811: __typename, alias11812: __typename, alias11813: __typename, alias11814: __typename, alias11815: __typename, alias11816: __typename, alias11817: __typename, alias11818: __typename, alias11819: __typename, alias11820: __typename, alias11821: __typename, alias11822: __typename, alias11823: __typename, alias11824: __typename, alias11825: __typename, alias11826: __typename, alias11827: __typename, alias11828: __typename, alias11829: __typename, alias11830: __typename, alias11831: __typename, alias11832: __typename, alias11833: __typename, alias11834: __typename, alias11835: __typename, alias11836: __typename, alias11837: __typename, alias11838: __typename, alias11839: __typename, alias11840: __typename, alias11841: __typename, alias11842: __typename, alias11843: __typename, alias11844: __typename, alias11845: __typename, alias11846: __typename, alias11847: __typename, alias11848: __typename, alias11849: __typename, alias11850: __typename, alias11851: __typename, alias11852: __typename, alias11853: __typename, alias11854: __typename, alias11855: __typename, alias11856: __typename, alias11857: __typename, alias11858: __typename, alias11859: __typename, alias11860: __typename, alias11861: __typename, alias11862: __typename, alias11863: __typename, alias11864: __typename, alias11865: __typename, alias11866: __typename, alias11867: __typename, alias11868: __typename, alias11869: __typename, alias11870: __typename, alias11871: __typename, alias11872: __typename, alias11873: __typename, alias11874: __typename, alias11875: __typename, alias11876: __typename, alias11877: __typename, alias11878: __typename, alias11879: __typename, alias11880: __typename, alias11881: __typename, alias11882: __typename, alias11883: __typename, alias11884: __typename, alias11885: __typename, alias11886: __typename, alias11887: __typename, alias11888: __typename, alias11889: __typename, alias11890: __typename, alias11891: __typename, alias11892: __typename, alias11893: __typename, alias11894: __typename, alias11895: __typename, alias11896: __typename, alias11897: __typename, alias11898: __typename, alias11899: __typename, alias11900: __typename, alias11901: __typename, alias11902: __typename, alias11903: __typename, alias11904: __typename, alias11905: __typename, alias11906: __typename, alias11907: __typename, alias11908: __typename, alias11909: __typename, alias11910: __typename, alias11911: __typename, alias11912: __typename, alias11913: __typename, alias11914: __typename, alias11915: __typename, alias11916: __typename, alias11917: __typename, alias11918: __typename, alias11919: __typename, alias11920: __typename, alias11921: __typename, alias11922: __typename, alias11923: __typename, alias11924: __typename, alias11925: __typename, alias11926: __typename, alias11927: __typename, alias11928: __typename, alias11929: __typename, alias11930: __typename, alias11931: __typename, alias11932: __typename, alias11933: __typename, alias11934: __typename, alias11935: __typename, alias11936: __typename, alias11937: __typename, alias11938: __typename, alias11939: __typename, alias11940: __typename, alias11941: __typename, alias11942: __typename, alias11943: __typename, alias11944: __typename, alias11945: __typename, alias11946: __typename, alias11947: __typename, alias11948: __typename, alias11949: __typename, alias11950: __typename, alias11951: __typename, alias11952: __typename, alias11953: __typename, alias11954: __typename, alias11955: __typename, alias11956: __typename, alias11957: __typename, alias11958: __typename, alias11959: __typename, alias11960: __typename, alias11961: __typename, alias11962: __typename, alias11963: __typename, alias11964: __typename, alias11965: __typename, alias11966: __typename, alias11967: __typename, alias11968: __typename, alias11969: __typename, alias11970: __typename, alias11971: __typename, alias11972: __typename, alias11973: __typename, alias11974: __typename, alias11975: __typename, alias11976: __typename, alias11977: __typename, alias11978: __typename, alias11979: __typename, alias11980: __typename, alias11981: __typename, alias11982: __typename, alias11983: __typename, alias11984: __typename, alias11985: __typename, alias11986: __typename, alias11987: __typename, alias11988: __typename, alias11989: __typename, alias11990: __typename, alias11991: __typename, alias11992: __typename, alias11993: __typename, alias11994: __typename, alias11995: __typename, alias11996: __typename, alias11997: __typename, alias11998: __typename, alias11999: __typename, alias12000: __typename, alias12001: __typename, alias12002: __typename, alias12003: __typename, alias12004: __typename, alias12005: __typename, alias12006: __typename, alias12007: __typename, alias12008: __typename, alias12009: __typename, alias12010: __typename, alias12011: __typename, alias12012: __typename, alias12013: __typename, alias12014: __typename, alias12015: __typename, alias12016: __typename, alias12017: __typename, alias12018: __typename, alias12019: __typename, alias12020: __typename, alias12021: __typename, alias12022: __typename, alias12023: __typename, alias12024: __typename, alias12025: __typename, alias12026: __typename, alias12027: __typename, alias12028: __typename, alias12029: __typename, alias12030: __typename, alias12031: __typename, alias12032: __typename, alias12033: __typename, alias12034: __typename, alias12035: __typename, alias12036: __typename, alias12037: __typename, alias12038: __typename, alias12039: __typename, alias12040: __typename, alias12041: __typename, alias12042: __typename, alias12043: __typename, alias12044: __typename, alias12045: __typename, alias12046: __typename, alias12047: __typename, alias12048: __typename, alias12049: __typename, alias12050: __typename, alias12051: __typename, alias12052: __typename, alias12053: __typename, alias12054: __typename, alias12055: __typename, alias12056: __typename, alias12057: __typename, alias12058: __typename, alias12059: __typename, alias12060: __typename, alias12061: __typename, alias12062: __typename, alias12063: __typename, alias12064: __typename, alias12065: __typename, alias12066: __typename, alias12067: __typename, alias12068: __typename, alias12069: __typename, alias12070: __typename, alias12071: __typename, alias12072: __typename, alias12073: __typename, alias12074: __typename, alias12075: __typename, alias12076: __typename, alias12077: __typename, alias12078: __typename, alias12079: __typename, alias12080: __typename, alias12081: __typename, alias12082: __typename, alias12083: __typename, alias12084: __typename, alias12085: __typename, alias12086: __typename, alias12087: __typename, alias12088: __typename, alias12089: __typename, alias12090: __typename, alias12091: __typename, alias12092: __typename, alias12093: __typename, alias12094: __typename, alias12095: __typename, alias12096: __typename, alias12097: __typename, alias12098: __typename, alias12099: __typename, alias12100: __typename, alias12101: __typename, alias12102: __typename, alias12103: __typename, alias12104: __typename, alias12105: __typename, alias12106: __typename, alias12107: __typename, alias12108: __typename, alias12109: __typename, alias12110: __typename, alias12111: __typename, alias12112: __typename, alias12113: __typename, alias12114: __typename, alias12115: __typename, alias12116: __typename, alias12117: __typename, alias12118: __typename, alias12119: __typename, alias12120: __typename, alias12121: __typename, alias12122: __typename, alias12123: __typename, alias12124: __typename, alias12125: __typename, alias12126: __typename, alias12127: __typename, alias12128: __typename, alias12129: __typename, alias12130: __typename, alias12131: __typename, alias12132: __typename, alias12133: __typename, alias12134: __typename, alias12135: __typename, alias12136: __typename, alias12137: __typename, alias12138: __typename, alias12139: __typename, alias12140: __typename, alias12141: __typename, alias12142: __typename, alias12143: __typename, alias12144: __typename, alias12145: __typename, alias12146: __typename, alias12147: __typename, alias12148: __typename, alias12149: __typename, alias12150: __typename, alias12151: __typename, alias12152: __typename, alias12153: __typename, alias12154: __typename, alias12155: __typename, alias12156: __typename, alias12157: __typename, alias12158: __typename, alias12159: __typename, alias12160: __typename, alias12161: __typename, alias12162: __typename, alias12163: __typename, alias12164: __typename, alias12165: __typename, alias12166: __typename, alias12167: __typename, alias12168: __typename, alias12169: __typename, alias12170: __typename, alias12171: __typename, alias12172: __typename, alias12173: __typename, alias12174: __typename, alias12175: __typename, alias12176: __typename, alias12177: __typename, alias12178: __typename, alias12179: __typename, alias12180: __typename, alias12181: __typename, alias12182: __typename, alias12183: __typename, alias12184: __typename, alias12185: __typename, alias12186: __typename, alias12187: __typename, alias12188: __typename, alias12189: __typename, alias12190: __typename, alias12191: __typename, alias12192: __typename, alias12193: __typename, alias12194: __typename, alias12195: __typename, alias12196: __typename, alias12197: __typename, alias12198: __typename, alias12199: __typename, alias12200: __typename, alias12201: __typename, alias12202: __typename, alias12203: __typename, alias12204: __typename, alias12205: __typename, alias12206: __typename, alias12207: __typename, alias12208: __typename, alias12209: __typename, alias12210: __typename, alias12211: __typename, alias12212: __typename, alias12213: __typename, alias12214: __typename, alias12215: __typename, alias12216: __typename, alias12217: __typename, alias12218: __typename, alias12219: __typename, alias12220: __typename, alias12221: __typename, alias12222: __typename, alias12223: __typename, alias12224: __typename, alias12225: __typename, alias12226: __typename, alias12227: __typename, alias12228: __typename, alias12229: __typename, alias12230: __typename, alias12231: __typename, alias12232: __typename, alias12233: __typename, alias12234: __typename, alias12235: __typename, alias12236: __typename, alias12237: __typename, alias12238: __typename, alias12239: __typename, alias12240: __typename, alias12241: __typename, alias12242: __typename, alias12243: __typename, alias12244: __typename, alias12245: __typename, alias12246: __typename, alias12247: __typename, alias12248: __typename, alias12249: __typename, alias12250: __typename, alias12251: __typename, alias12252: __typename, alias12253: __typename, alias12254: __typename, alias12255: __typename, alias12256: __typename, alias12257: __typename, alias12258: __typename, alias12259: __typename, alias12260: __typename, alias12261: __typename, alias12262: __typename, alias12263: __typename, alias12264: __typename, alias12265: __typename, alias12266: __typename, alias12267: __typename, alias12268: __typename, alias12269: __typename, alias12270: __typename, alias12271: __typename, alias12272: __typename, alias12273: __typename, alias12274: __typename, alias12275: __typename, alias12276: __typename, alias12277: __typename, alias12278: __typename, alias12279: __typename, alias12280: __typename, alias12281: __typename, alias12282: __typename, alias12283: __typename, alias12284: __typename, alias12285: __typename, alias12286: __typename, alias12287: __typename, alias12288: __typename, alias12289: __typename, alias12290: __typename, alias12291: __typename, alias12292: __typename, alias12293: __typename, alias12294: __typename, alias12295: __typename, alias12296: __typename, alias12297: __typename, alias12298: __typename, alias12299: __typename, alias12300: __typename, alias12301: __typename, alias12302: __typename, alias12303: __typename, alias12304: __typename, alias12305: __typename, alias12306: __typename, alias12307: __typename, alias12308: __typename, alias12309: __typename, alias12310: __typename, alias12311: __typename, alias12312: __typename, alias12313: __typename, alias12314: __typename, alias12315: __typename, alias12316: __typename, alias12317: __typename, alias12318: __typename, alias12319: __typename, alias12320: __typename, alias12321: __typename, alias12322: __typename, alias12323: __typename, alias12324: __typename, alias12325: __typename, alias12326: __typename, alias12327: __typename, alias12328: __typename, alias12329: __typename, alias12330: __typename, alias12331: __typename, alias12332: __typename, alias12333: __typename, alias12334: __typename, alias12335: __typename, alias12336: __typename, alias12337: __typename, alias12338: __typename, alias12339: __typename, alias12340: __typename, alias12341: __typename, alias12342: __typename, alias12343: __typename, alias12344: __typename, alias12345: __typename, alias12346: __typename, alias12347: __typename, alias12348: __typename, alias12349: __typename, alias12350: __typename, alias12351: __typename, alias12352: __typename, alias12353: __typename, alias12354: __typename, alias12355: __typename, alias12356: __typename, alias12357: __typename, alias12358: __typename, alias12359: __typename, alias12360: __typename, alias12361: __typename, alias12362: __typename, alias12363: __typename, alias12364: __typename, alias12365: __typename, alias12366: __typename, alias12367: __typename, alias12368: __typename, alias12369: __typename, alias12370: __typename, alias12371: __typename, alias12372: __typename, alias12373: __typename, alias12374: __typename, alias12375: __typename, alias12376: __typename, alias12377: __typename, alias12378: __typename, alias12379: __typename, alias12380: __typename, alias12381: __typename, alias12382: __typename, alias12383: __typename, alias12384: __typename, alias12385: __typename, alias12386: __typename, alias12387: __typename, alias12388: __typename, alias12389: __typename, alias12390: __typename, alias12391: __typename, alias12392: __typename, alias12393: __typename, alias12394: __typename, alias12395: __typename, alias12396: __typename, alias12397: __typename, alias12398: __typename, alias12399: __typename, alias12400: __typename, alias12401: __typename, alias12402: __typename, alias12403: __typename, alias12404: __typename, alias12405: __typename, alias12406: __typename, alias12407: __typename, alias12408: __typename, alias12409: __typename, alias12410: __typename, alias12411: __typename, alias12412: __typename, alias12413: __typename, alias12414: __typename, alias12415: __typename, alias12416: __typename, alias12417: __typename, alias12418: __typename, alias12419: __typename, alias12420: __typename, alias12421: __typename, alias12422: __typename, alias12423: __typename, alias12424: __typename, alias12425: __typename, alias12426: __typename, alias12427: __typename, alias12428: __typename, alias12429: __typename, alias12430: __typename, alias12431: __typename, alias12432: __typename, alias12433: __typename, alias12434: __typename, alias12435: __typename, alias12436: __typename, alias12437: __typename, alias12438: __typename, alias12439: __typename, alias12440: __typename, alias12441: __typename, alias12442: __typename, alias12443: __typename, alias12444: __typename, alias12445: __typename, alias12446: __typename, alias12447: __typename, alias12448: __typename, alias12449: __typename, alias12450: __typename, alias12451: __typename, alias12452: __typename, alias12453: __typename, alias12454: __typename, alias12455: __typename, alias12456: __typename, alias12457: __typename, alias12458: __typename, alias12459: __typename, alias12460: __typename, alias12461: __typename, alias12462: __typename, alias12463: __typename, alias12464: __typename, alias12465: __typename, alias12466: __typename, alias12467: __typename, alias12468: __typename, alias12469: __typename, alias12470: __typename, alias12471: __typename, alias12472: __typename, alias12473: __typename, alias12474: __typename, alias12475: __typename, alias12476: __typename, alias12477: __typename, alias12478: __typename, alias12479: __typename, alias12480: __typename, alias12481: __typename, alias12482: __typename, alias12483: __typename, alias12484: __typename, alias12485: __typename, alias12486: __typename, alias12487: __typename, alias12488: __typename, alias12489: __typename, alias12490: __typename, alias12491: __typename, alias12492: __typename, alias12493: __typename, alias12494: __typename, alias12495: __typename, alias12496: __typename, alias12497: __typename, alias12498: __typename, alias12499: __typename, alias12500: __typename, alias12501: __typename, alias12502: __typename, alias12503: __typename, alias12504: __typename, alias12505: __typename, alias12506: __typename, alias12507: __typename, alias12508: __typename, alias12509: __typename, alias12510: __typename, alias12511: __typename, alias12512: __typename, alias12513: __typename, alias12514: __typename, alias12515: __typename, alias12516: __typename, alias12517: __typename, alias12518: __typename, alias12519: __typename, alias12520: __typename, alias12521: __typename, alias12522: __typename, alias12523: __typename, alias12524: __typename, alias12525: __typename, alias12526: __typename, alias12527: __typename, alias12528: __typename, alias12529: __typename, alias12530: __typename, alias12531: __typename, alias12532: __typename, alias12533: __typename, alias12534: __typename, alias12535: __typename, alias12536: __typename, alias12537: __typename, alias12538: __typename, alias12539: __typename, alias12540: __typename, alias12541: __typename, alias12542: __typename, alias12543: __typename, alias12544: __typename, alias12545: __typename, alias12546: __typename, alias12547: __typename, alias12548: __typename, alias12549: __typename, alias12550: __typename, alias12551: __typename, alias12552: __typename, alias12553: __typename, alias12554: __typename, alias12555: __typename, alias12556: __typename, alias12557: __typename, alias12558: __typename, alias12559: __typename, alias12560: __typename, alias12561: __typename, alias12562: __typename, alias12563: __typename, alias12564: __typename, alias12565: __typename, alias12566: __typename, alias12567: __typename, alias12568: __typename, alias12569: __typename, alias12570: __typename, alias12571: __typename, alias12572: __typename, alias12573: __typename, alias12574: __typename, alias12575: __typename, alias12576: __typename, alias12577: __typename, alias12578: __typename, alias12579: __typename, alias12580: __typename, alias12581: __typename, alias12582: __typename, alias12583: __typename, alias12584: __typename, alias12585: __typename, alias12586: __typename, alias12587: __typename, alias12588: __typename, alias12589: __typename, alias12590: __typename, alias12591: __typename, alias12592: __typename, alias12593: __typename, alias12594: __typename, alias12595: __typename, alias12596: __typename, alias12597: __typename, alias12598: __typename, alias12599: __typename, alias12600: __typename, alias12601: __typename, alias12602: __typename, alias12603: __typename, alias12604: __typename, alias12605: __typename, alias12606: __typename, alias12607: __typename, alias12608: __typename, alias12609: __typename, alias12610: __typename, alias12611: __typename, alias12612: __typename, alias12613: __typename, alias12614: __typename, alias12615: __typename, alias12616: __typename, alias12617: __typename, alias12618: __typename, alias12619: __typename, alias12620: __typename, alias12621: __typename, alias12622: __typename, alias12623: __typename, alias12624: __typename, alias12625: __typename, alias12626: __typename, alias12627: __typename, alias12628: __typename, alias12629: __typename, alias12630: __typename, alias12631: __typename, alias12632: __typename, alias12633: __typename, alias12634: __typename, alias12635: __typename, alias12636: __typename, alias12637: __typename, alias12638: __typename, alias12639: __typename, alias12640: __typename, alias12641: __typename, alias12642: __typename, alias12643: __typename, alias12644: __typename, alias12645: __typename, alias12646: __typename, alias12647: __typename, alias12648: __typename, alias12649: __typename, alias12650: __typename, alias12651: __typename, alias12652: __typename, alias12653: __typename, alias12654: __typename, alias12655: __typename, alias12656: __typename, alias12657: __typename, alias12658: __typename, alias12659: __typename, alias12660: __typename, alias12661: __typename, alias12662: __typename, alias12663: __typename, alias12664: __typename, alias12665: __typename, alias12666: __typename, alias12667: __typename, alias12668: __typename, alias12669: __typename, alias12670: __typename, alias12671: __typename, alias12672: __typename, alias12673: __typename, alias12674: __typename, alias12675: __typename, alias12676: __typename, alias12677: __typename, alias12678: __typename, alias12679: __typename, alias12680: __typename, alias12681: __typename, alias12682: __typename, alias12683: __typename, alias12684: __typename, alias12685: __typename, alias12686: __typename, alias12687: __typename, alias12688: __typename, alias12689: __typename, alias12690: __typename, alias12691: __typename, alias12692: __typename, alias12693: __typename, alias12694: __typename, alias12695: __typename, alias12696: __typename, alias12697: __typename, alias12698: __typename, alias12699: __typename, alias12700: __typename, alias12701: __typename, alias12702: __typename, alias12703: __typename, alias12704: __typename, alias12705: __typename, alias12706: __typename, alias12707: __typename, alias12708: __typename, alias12709: __typename, alias12710: __typename, alias12711: __typename, alias12712: __typename, alias12713: __typename, alias12714: __typename, alias12715: __typename, alias12716: __typename, alias12717: __typename, alias12718: __typename, alias12719: __typename, alias12720: __typename, alias12721: __typename, alias12722: __typename, alias12723: __typename, alias12724: __typename, alias12725: __typename, alias12726: __typename, alias12727: __typename, alias12728: __typename, alias12729: __typename, alias12730: __typename, alias12731: __typename, alias12732: __typename, alias12733: __typename, alias12734: __typename, alias12735: __typename, alias12736: __typename, alias12737: __typename, alias12738: __typename, alias12739: __typename, alias12740: __typename, alias12741: __typename, alias12742: __typename, alias12743: __typename, alias12744: __typename, alias12745: __typename, alias12746: __typename, alias12747: __typename, alias12748: __typename, alias12749: __typename, alias12750: __typename, alias12751: __typename, alias12752: __typename, alias12753: __typename, alias12754: __typename, alias12755: __typename, alias12756: __typename, alias12757: __typename, alias12758: __typename, alias12759: __typename, alias12760: __typename, alias12761: __typename, alias12762: __typename, alias12763: __typename, alias12764: __typename, alias12765: __typename, alias12766: __typename, alias12767: __typename, alias12768: __typename, alias12769: __typename, alias12770: __typename, alias12771: __typename, alias12772: __typename, alias12773: __typename, alias12774: __typename, alias12775: __typename, alias12776: __typename, alias12777: __typename, alias12778: __typename, alias12779: __typename, alias12780: __typename, alias12781: __typename, alias12782: __typename, alias12783: __typename, alias12784: __typename, alias12785: __typename, alias12786: __typename, alias12787: __typename, alias12788: __typename, alias12789: __typename, alias12790: __typename, alias12791: __typename, alias12792: __typename, alias12793: __typename, alias12794: __typename, alias12795: __typename, alias12796: __typename, alias12797: __typename, alias12798: __typename, alias12799: __typename, alias12800: __typename, alias12801: __typename, alias12802: __typename, alias12803: __typename, alias12804: __typename, alias12805: __typename, alias12806: __typename, alias12807: __typename, alias12808: __typename, alias12809: __typename, alias12810: __typename, alias12811: __typename, alias12812: __typename, alias12813: __typename, alias12814: __typename, alias12815: __typename, alias12816: __typename, alias12817: __typename, alias12818: __typename, alias12819: __typename, alias12820: __typename, alias12821: __typename, alias12822: __typename, alias12823: __typename, alias12824: __typename, alias12825: __typename, alias12826: __typename, alias12827: __typename, alias12828: __typename, alias12829: __typename, alias12830: __typename, alias12831: __typename, alias12832: __typename, alias12833: __typename, alias12834: __typename, alias12835: __typename, alias12836: __typename, alias12837: __typename, alias12838: __typename, alias12839: __typename, alias12840: __typename, alias12841: __typename, alias12842: __typename, alias12843: __typename, alias12844: __typename, alias12845: __typename, alias12846: __typename, alias12847: __typename, alias12848: __typename, alias12849: __typename, alias12850: __typename, alias12851: __typename, alias12852: __typename, alias12853: __typename, alias12854: __typename, alias12855: __typename, alias12856: __typename, alias12857: __typename, alias12858: __typename, alias12859: __typename, alias12860: __typename, alias12861: __typename, alias12862: __typename, alias12863: __typename, alias12864: __typename, alias12865: __typename, alias12866: __typename, alias12867: __typename, alias12868: __typename, alias12869: __typename, alias12870: __typename, alias12871: __typename, alias12872: __typename, alias12873: __typename, alias12874: __typename, alias12875: __typename, alias12876: __typename, alias12877: __typename, alias12878: __typename, alias12879: __typename, alias12880: __typename, alias12881: __typename, alias12882: __typename, alias12883: __typename, alias12884: __typename, alias12885: __typename, alias12886: __typename, alias12887: __typename, alias12888: __typename, alias12889: __typename, alias12890: __typename, alias12891: __typename, alias12892: __typename, alias12893: __typename, alias12894: __typename, alias12895: __typename, alias12896: __typename, alias12897: __typename, alias12898: __typename, alias12899: __typename, alias12900: __typename, alias12901: __typename, alias12902: __typename, alias12903: __typename, alias12904: __typename, alias12905: __typename, alias12906: __typename, alias12907: __typename, alias12908: __typename, alias12909: __typename, alias12910: __typename, alias12911: __typename, alias12912: __typename, alias12913: __typename, alias12914: __typename, alias12915: __typename, alias12916: __typename, alias12917: __typename, alias12918: __typename, alias12919: __typename, alias12920: __typename, alias12921: __typename, alias12922: __typename, alias12923: __typename, alias12924: __typename, alias12925: __typename, alias12926: __typename, alias12927: __typename, alias12928: __typename, alias12929: __typename, alias12930: __typename, alias12931: __typename, alias12932: __typename, alias12933: __typename, alias12934: __typename, alias12935: __typename, alias12936: __typename, alias12937: __typename, alias12938: __typename, alias12939: __typename, alias12940: __typename, alias12941: __typename, alias12942: __typename, alias12943: __typename, alias12944: __typename, alias12945: __typename, alias12946: __typename, alias12947: __typename, alias12948: __typename, alias12949: __typename, alias12950: __typename, alias12951: __typename, alias12952: __typename, alias12953: __typename, alias12954: __typename, alias12955: __typename, alias12956: __typename, alias12957: __typename, alias12958: __typename, alias12959: __typename, alias12960: __typename, alias12961: __typename, alias12962: __typename, alias12963: __typename, alias12964: __typename, alias12965: __typename, alias12966: __typename, alias12967: __typename, alias12968: __typename, alias12969: __typename, alias12970: __typename, alias12971: __typename, alias12972: __typename, alias12973: __typename, alias12974: __typename, alias12975: __typename, alias12976: __typename, alias12977: __typename, alias12978: __typename, alias12979: __typename, alias12980: __typename, alias12981: __typename, alias12982: __typename, alias12983: __typename, alias12984: __typename, alias12985: __typename, alias12986: __typename, alias12987: __typename, alias12988: __typename, alias12989: __typename, alias12990: __typename, alias12991: __typename, alias12992: __typename, alias12993: __typename, alias12994: __typename, alias12995: __typename, alias12996: __typename, alias12997: __typename, alias12998: __typename, alias12999: __typename, alias13000: __typename, alias13001: __typename, alias13002: __typename, alias13003: __typename, alias13004: __typename, alias13005: __typename, alias13006: __typename, alias13007: __typename, alias13008: __typename, alias13009: __typename, alias13010: __typename, alias13011: __typename, alias13012: __typename, alias13013: __typename, alias13014: __typename, alias13015: __typename, alias13016: __typename, alias13017: __typename, alias13018: __typename, alias13019: __typename, alias13020: __typename, alias13021: __typename, alias13022: __typename, alias13023: __typename, alias13024: __typename, alias13025: __typename, alias13026: __typename, alias13027: __typename, alias13028: __typename, alias13029: __typename, alias13030: __typename, alias13031: __typename, alias13032: __typename, alias13033: __typename, alias13034: __typename, alias13035: __typename, alias13036: __typename, alias13037: __typename, alias13038: __typename, alias13039: __typename, alias13040: __typename, alias13041: __typename, alias13042: __typename, alias13043: __typename, alias13044: __typename, alias13045: __typename, alias13046: __typename, alias13047: __typename, alias13048: __typename, alias13049: __typename, alias13050: __typename, alias13051: __typename, alias13052: __typename, alias13053: __typename, alias13054: __typename, alias13055: __typename, alias13056: __typename, alias13057: __typename, alias13058: __typename, alias13059: __typename, alias13060: __typename, alias13061: __typename, alias13062: __typename, alias13063: __typename, alias13064: __typename, alias13065: __typename, alias13066: __typename, alias13067: __typename, alias13068: __typename, alias13069: __typename, alias13070: __typename, alias13071: __typename, alias13072: __typename, alias13073: __typename, alias13074: __typename, alias13075: __typename, alias13076: __typename, alias13077: __typename, alias13078: __typename, alias13079: __typename, alias13080: __typename, alias13081: __typename, alias13082: __typename, alias13083: __typename, alias13084: __typename, alias13085: __typename, alias13086: __typename, alias13087: __typename, alias13088: __typename, alias13089: __typename, alias13090: __typename, alias13091: __typename, alias13092: __typename, alias13093: __typename, alias13094: __typename, alias13095: __typename, alias13096: __typename, alias13097: __typename, alias13098: __typename, alias13099: __typename, alias13100: __typename, alias13101: __typename, alias13102: __typename, alias13103: __typename, alias13104: __typename, alias13105: __typename, alias13106: __typename, alias13107: __typename, alias13108: __typename, alias13109: __typename, alias13110: __typename, alias13111: __typename, alias13112: __typename, alias13113: __typename, alias13114: __typename, alias13115: __typename, alias13116: __typename, alias13117: __typename, alias13118: __typename, alias13119: __typename, alias13120: __typename, alias13121: __typename, alias13122: __typename, alias13123: __typename, alias13124: __typename, alias13125: __typename, alias13126: __typename, alias13127: __typename, alias13128: __typename, alias13129: __typename, alias13130: __typename, alias13131: __typename, alias13132: __typename, alias13133: __typename, alias13134: __typename, alias13135: __typename, alias13136: __typename, alias13137: __typename, alias13138: __typename, alias13139: __typename, alias13140: __typename, alias13141: __typename, alias13142: __typename, alias13143: __typename, alias13144: __typename, alias13145: __typename, alias13146: __typename, alias13147: __typename, alias13148: __typename, alias13149: __typename, alias13150: __typename, alias13151: __typename, alias13152: __typename, alias13153: __typename, alias13154: __typename, alias13155: __typename, alias13156: __typename, alias13157: __typename, alias13158: __typename, alias13159: __typename, alias13160: __typename, alias13161: __typename, alias13162: __typename, alias13163: __typename, alias13164: __typename, alias13165: __typename, alias13166: __typename, alias13167: __typename, alias13168: __typename, alias13169: __typename, alias13170: __typename, alias13171: __typename, alias13172: __typename, alias13173: __typename, alias13174: __typename, alias13175: __typename, alias13176: __typename, alias13177: __typename, alias13178: __typename, alias13179: __typename, alias13180: __typename, alias13181: __typename, alias13182: __typename, alias13183: __typename, alias13184: __typename, alias13185: __typename, alias13186: __typename, alias13187: __typename, alias13188: __typename, alias13189: __typename, alias13190: __typename, alias13191: __typename, alias13192: __typename, alias13193: __typename, alias13194: __typename, alias13195: __typename, alias13196: __typename, alias13197: __typename, alias13198: __typename, alias13199: __typename, alias13200: __typename, alias13201: __typename, alias13202: __typename, alias13203: __typename, alias13204: __typename, alias13205: __typename, alias13206: __typename, alias13207: __typename, alias13208: __typename, alias13209: __typename, alias13210: __typename, alias13211: __typename, alias13212: __typename, alias13213: __typename, alias13214: __typename, alias13215: __typename, alias13216: __typename, alias13217: __typename, alias13218: __typename, alias13219: __typename, alias13220: __typename, alias13221: __typename, alias13222: __typename, alias13223: __typename, alias13224: __typename, alias13225: __typename, alias13226: __typename, alias13227: __typename, alias13228: __typename, alias13229: __typename, alias13230: __typename, alias13231: __typename, alias13232: __typename, alias13233: __typename, alias13234: __typename, alias13235: __typename, alias13236: __typename, alias13237: __typename, alias13238: __typename, alias13239: __typename, alias13240: __typename, alias13241: __typename, alias13242: __typename, alias13243: __typename, alias13244: __typename, alias13245: __typename, alias13246: __typename, alias13247: __typename, alias13248: __typename, alias13249: __typename, alias13250: __typename, alias13251: __typename, alias13252: __typename, alias13253: __typename, alias13254: __typename, alias13255: __typename, alias13256: __typename, alias13257: __typename, alias13258: __typename, alias13259: __typename, alias13260: __typename, alias13261: __typename, alias13262: __typename, alias13263: __typename, alias13264: __typename, alias13265: __typename, alias13266: __typename, alias13267: __typename, alias13268: __typename, alias13269: __typename, alias13270: __typename, alias13271: __typename, alias13272: __typename, alias13273: __typename, alias13274: __typename, alias13275: __typename, alias13276: __typename, alias13277: __typename, alias13278: __typename, alias13279: __typename, alias13280: __typename, alias13281: __typename, alias13282: __typename, alias13283: __typename, alias13284: __typename, alias13285: __typename, alias13286: __typename, alias13287: __typename, alias13288: __typename, alias13289: __typename, alias13290: __typename, alias13291: __typename, alias13292: __typename, alias13293: __typename, alias13294: __typename, alias13295: __typename, alias13296: __typename, alias13297: __typename, alias13298: __typename, alias13299: __typename, alias13300: __typename, alias13301: __typename, alias13302: __typename, alias13303: __typename, alias13304: __typename, alias13305: __typename, alias13306: __typename, alias13307: __typename, alias13308: __typename, alias13309: __typename, alias13310: __typename, alias13311: __typename, alias13312: __typename, alias13313: __typename, alias13314: __typename, alias13315: __typename, alias13316: __typename, alias13317: __typename, alias13318: __typename, alias13319: __typename, alias13320: __typename, alias13321: __typename, alias13322: __typename, alias13323: __typename, alias13324: __typename, alias13325: __typename, alias13326: __typename, alias13327: __typename, alias13328: __typename, alias13329: __typename, alias13330: __typename, alias13331: __typename, alias13332: __typename, alias13333: __typename, alias13334: __typename, alias13335: __typename, alias13336: __typename, alias13337: __typename, alias13338: __typename, alias13339: __typename, alias13340: __typename, alias13341: __typename, alias13342: __typename, alias13343: __typename, alias13344: __typename, alias13345: __typename, alias13346: __typename, alias13347: __typename, alias13348: __typename, alias13349: __typename, alias13350: __typename, alias13351: __typename, alias13352: __typename, alias13353: __typename, alias13354: __typename, alias13355: __typename, alias13356: __typename, alias13357: __typename, alias13358: __typename, alias13359: __typename, alias13360: __typename, alias13361: __typename, alias13362: __typename, alias13363: __typename, alias13364: __typename, alias13365: __typename, alias13366: __typename, alias13367: __typename, alias13368: __typename, alias13369: __typename, alias13370: __typename, alias13371: __typename, alias13372: __typename, alias13373: __typename, alias13374: __typename, alias13375: __typename, alias13376: __typename, alias13377: __typename, alias13378: __typename, alias13379: __typename, alias13380: __typename, alias13381: __typename, alias13382: __typename, alias13383: __typename, alias13384: __typename, alias13385: __typename, alias13386: __typename, alias13387: __typename, alias13388: __typename, alias13389: __typename, alias13390: __typename, alias13391: __typename, alias13392: __typename, alias13393: __typename, alias13394: __typename, alias13395: __typename, alias13396: __typename, alias13397: __typename, alias13398: __typename, alias13399: __typename, alias13400: __typename, alias13401: __typename, alias13402: __typename, alias13403: __typename, alias13404: __typename, alias13405: __typename, alias13406: __typename, alias13407: __typename, alias13408: __typename, alias13409: __typename, alias13410: __typename, alias13411: __typename, alias13412: __typename, alias13413: __typename, alias13414: __typename, alias13415: __typename, alias13416: __typename, alias13417: __typename, alias13418: __typename, alias13419: __typename, alias13420: __typename, alias13421: __typename, alias13422: __typename, alias13423: __typename, alias13424: __typename, alias13425: __typename, alias13426: __typename, alias13427: __typename, alias13428: __typename, alias13429: __typename, alias13430: __typename, alias13431: __typename, alias13432: __typename, alias13433: __typename, alias13434: __typename, alias13435: __typename, alias13436: __typename, alias13437: __typename, alias13438: __typename, alias13439: __typename, alias13440: __typename, alias13441: __typename, alias13442: __typename, alias13443: __typename, alias13444: __typename, alias13445: __typename, alias13446: __typename, alias13447: __typename, alias13448: __typename, alias13449: __typename, alias13450: __typename, alias13451: __typename, alias13452: __typename, alias13453: __typename, alias13454: __typename, alias13455: __typename, alias13456: __typename, alias13457: __typename, alias13458: __typename, alias13459: __typename, alias13460: __typename, alias13461: __typename, alias13462: __typename, alias13463: __typename, alias13464: __typename, alias13465: __typename, alias13466: __typename, alias13467: __typename, alias13468: __typename, alias13469: __typename, alias13470: __typename, alias13471: __typename, alias13472: __typename, alias13473: __typename, alias13474: __typename, alias13475: __typename, alias13476: __typename, alias13477: __typename, alias13478: __typename, alias13479: __typename, alias13480: __typename, alias13481: __typename, alias13482: __typename, alias13483: __typename, alias13484: __typename, alias13485: __typename, alias13486: __typename, alias13487: __typename, alias13488: __typename, alias13489: __typename, alias13490: __typename, alias13491: __typename, alias13492: __typename, alias13493: __typename, alias13494: __typename, alias13495: __typename, alias13496: __typename, alias13497: __typename, alias13498: __typename, alias13499: __typename, alias13500: __typename, alias13501: __typename, alias13502: __typename, alias13503: __typename, alias13504: __typename, alias13505: __typename, alias13506: __typename, alias13507: __typename, alias13508: __typename, alias13509: __typename, alias13510: __typename, alias13511: __typename, alias13512: __typename, alias13513: __typename, alias13514: __typename, alias13515: __typename, alias13516: __typename, alias13517: __typename, alias13518: __typename, alias13519: __typename, alias13520: __typename, alias13521: __typename, alias13522: __typename, alias13523: __typename, alias13524: __typename, alias13525: __typename, alias13526: __typename, alias13527: __typename, alias13528: __typename, alias13529: __typename, alias13530: __typename, alias13531: __typename, alias13532: __typename, alias13533: __typename, alias13534: __typename, alias13535: __typename, alias13536: __typename, alias13537: __typename, alias13538: __typename, alias13539: __typename, alias13540: __typename, alias13541: __typename, alias13542: __typename, alias13543: __typename, alias13544: __typename, alias13545: __typename, alias13546: __typename, alias13547: __typename, alias13548: __typename, alias13549: __typename, alias13550: __typename, alias13551: __typename, alias13552: __typename, alias13553: __typename, alias13554: __typename, alias13555: __typename, alias13556: __typename, alias13557: __typename, alias13558: __typename, alias13559: __typename, alias13560: __typename, alias13561: __typename, alias13562: __typename, alias13563: __typename, alias13564: __typename, alias13565: __typename, alias13566: __typename, alias13567: __typename, alias13568: __typename, alias13569: __typename, alias13570: __typename, alias13571: __typename, alias13572: __typename, alias13573: __typename, alias13574: __typename, alias13575: __typename, alias13576: __typename, alias13577: __typename, alias13578: __typename, alias13579: __typename, alias13580: __typename, alias13581: __typename, alias13582: __typename, alias13583: __typename, alias13584: __typename, alias13585: __typename, alias13586: __typename, alias13587: __typename, alias13588: __typename, alias13589: __typename, alias13590: __typename, alias13591: __typename, alias13592: __typename, alias13593: __typename, alias13594: __typename, alias13595: __typename, alias13596: __typename, alias13597: __typename, alias13598: __typename, alias13599: __typename, alias13600: __typename, alias13601: __typename, alias13602: __typename, alias13603: __typename, alias13604: __typename, alias13605: __typename, alias13606: __typename, alias13607: __typename, alias13608: __typename, alias13609: __typename, alias13610: __typename, alias13611: __typename, alias13612: __typename, alias13613: __typename, alias13614: __typename, alias13615: __typename, alias13616: __typename, alias13617: __typename, alias13618: __typename, alias13619: __typename, alias13620: __typename, alias13621: __typename, alias13622: __typename, alias13623: __typename, alias13624: __typename, alias13625: __typename, alias13626: __typename, alias13627: __typename, alias13628: __typename, alias13629: __typename, alias13630: __typename, alias13631: __typename, alias13632: __typename, alias13633: __typename, alias13634: __typename, alias13635: __typename, alias13636: __typename, alias13637: __typename, alias13638: __typename, alias13639: __typename, alias13640: __typename, alias13641: __typename, alias13642: __typename, alias13643: __typename, alias13644: __typename, alias13645: __typename, alias13646: __typename, alias13647: __typename, alias13648: __typename, alias13649: __typename, alias13650: __typename, alias13651: __typename, alias13652: __typename, alias13653: __typename, alias13654: __typename, alias13655: __typename, alias13656: __typename, alias13657: __typename, alias13658: __typename, alias13659: __typename, alias13660: __typename, alias13661: __typename, alias13662: __typename, alias13663: __typename, alias13664: __typename, alias13665: __typename, alias13666: __typename, alias13667: __typename, alias13668: __typename, alias13669: __typename, alias13670: __typename, alias13671: __typename, alias13672: __typename, alias13673: __typename, alias13674: __typename, alias13675: __typename, alias13676: __typename, alias13677: __typename, alias13678: __typename, alias13679: __typename, alias13680: __typename, alias13681: __typename, alias13682: __typename, alias13683: __typename, alias13684: __typename, alias13685: __typename, alias13686: __typename, alias13687: __typename, alias13688: __typename, alias13689: __typename, alias13690: __typename, alias13691: __typename, alias13692: __typename, alias13693: __typename, alias13694: __typename, alias13695: __typename, alias13696: __typename, alias13697: __typename, alias13698: __typename, alias13699: __typename, alias13700: __typename, alias13701: __typename, alias13702: __typename, alias13703: __typename, alias13704: __typename, alias13705: __typename, alias13706: __typename, alias13707: __typename, alias13708: __typename, alias13709: __typename, alias13710: __typename, alias13711: __typename, alias13712: __typename, alias13713: __typename, alias13714: __typename, alias13715: __typename, alias13716: __typename, alias13717: __typename, alias13718: __typename, alias13719: __typename, alias13720: __typename, alias13721: __typename, alias13722: __typename, alias13723: __typename, alias13724: __typename, alias13725: __typename, alias13726: __typename, alias13727: __typename, alias13728: __typename, alias13729: __typename, alias13730: __typename, alias13731: __typename, alias13732: __typename, alias13733: __typename, alias13734: __typename, alias13735: __typename, alias13736: __typename, alias13737: __typename, alias13738: __typename, alias13739: __typename, alias13740: __typename, alias13741: __typename, alias13742: __typename, alias13743: __typename, alias13744: __typename, alias13745: __typename, alias13746: __typename, alias13747: __typename, alias13748: __typename, alias13749: __typename, alias13750: __typename, alias13751: __typename, alias13752: __typename, alias13753: __typename, alias13754: __typename, alias13755: __typename, alias13756: __typename, alias13757: __typename, alias13758: __typename, alias13759: __typename, alias13760: __typename, alias13761: __typename, alias13762: __typename, alias13763: __typename, alias13764: __typename, alias13765: __typename, alias13766: __typename, alias13767: __typename, alias13768: __typename, alias13769: __typename, alias13770: __typename, alias13771: __typename, alias13772: __typename, alias13773: __typename, alias13774: __typename, alias13775: __typename, alias13776: __typename, alias13777: __typename, alias13778: __typename, alias13779: __typename, alias13780: __typename, alias13781: __typename, alias13782: __typename, alias13783: __typename, alias13784: __typename, alias13785: __typename, alias13786: __typename, alias13787: __typename, alias13788: __typename, alias13789: __typename, alias13790: __typename, alias13791: __typename, alias13792: __typename, alias13793: __typename, alias13794: __typename, alias13795: __typename, alias13796: __typename, alias13797: __typename, alias13798: __typename, alias13799: __typename, alias13800: __typename, alias13801: __typename, alias13802: __typename, alias13803: __typename, alias13804: __typename, alias13805: __typename, alias13806: __typename, alias13807: __typename, alias13808: __typename, alias13809: __typename, alias13810: __typename, alias13811: __typename, alias13812: __typename, alias13813: __typename, alias13814: __typename, alias13815: __typename, alias13816: __typename, alias13817: __typename, alias13818: __typename, alias13819: __typename, alias13820: __typename, alias13821: __typename, alias13822: __typename, alias13823: __typename, alias13824: __typename, alias13825: __typename, alias13826: __typename, alias13827: __typename, alias13828: __typename, alias13829: __typename, alias13830: __typename, alias13831: __typename, alias13832: __typename, alias13833: __typename, alias13834: __typename, alias13835: __typename, alias13836: __typename, alias13837: __typename, alias13838: __typename, alias13839: __typename, alias13840: __typename, alias13841: __typename, alias13842: __typename, alias13843: __typename, alias13844: __typename, alias13845: __typename, alias13846: __typename, alias13847: __typename, alias13848: __typename, alias13849: __typename, alias13850: __typename, alias13851: __typename, alias13852: __typename, alias13853: __typename, alias13854: __typename, alias13855: __typename, alias13856: __typename, alias13857: __typename, alias13858: __typename, alias13859: __typename, alias13860: __typename, alias13861: __typename, alias13862: __typename, alias13863: __typename, alias13864: __typename, alias13865: __typename, alias13866: __typename, alias13867: __typename, alias13868: __typename, alias13869: __typename, alias13870: __typename, alias13871: __typename, alias13872: __typename, alias13873: __typename, alias13874: __typename, alias13875: __typename, alias13876: __typename, alias13877: __typename, alias13878: __typename, alias13879: __typename, alias13880: __typename, alias13881: __typename, alias13882: __typename, alias13883: __typename, alias13884: __typename, alias13885: __typename, alias13886: __typename, alias13887: __typename, alias13888: __typename, alias13889: __typename, alias13890: __typename, alias13891: __typename, alias13892: __typename, alias13893: __typename, alias13894: __typename, alias13895: __typename, alias13896: __typename, alias13897: __typename, alias13898: __typename, alias13899: __typename, alias13900: __typename, alias13901: __typename, alias13902: __typename, alias13903: __typename, alias13904: __typename, alias13905: __typename, alias13906: __typename, alias13907: __typename, alias13908: __typename, alias13909: __typename, alias13910: __typename, alias13911: __typename, alias13912: __typename, alias13913: __typename, alias13914: __typename, alias13915: __typename, alias13916: __typename, alias13917: __typename, alias13918: __typename, alias13919: __typename, alias13920: __typename, alias13921: __typename, alias13922: __typename, alias13923: __typename, alias13924: __typename, alias13925: __typename, alias13926: __typename, alias13927: __typename, alias13928: __typename, alias13929: __typename, alias13930: __typename, alias13931: __typename, alias13932: __typename, alias13933: __typename, alias13934: __typename, alias13935: __typename, alias13936: __typename, alias13937: __typename, alias13938: __typename, alias13939: __typename, alias13940: __typename, alias13941: __typename, alias13942: __typename, alias13943: __typename, alias13944: __typename, alias13945: __typename, alias13946: __typename, alias13947: __typename, alias13948: __typename, alias13949: __typename, alias13950: __typename, alias13951: __typename, alias13952: __typename, alias13953: __typename, alias13954: __typename, alias13955: __typename, alias13956: __typename, alias13957: __typename, alias13958: __typename, alias13959: __typename, alias13960: __typename, alias13961: __typename, alias13962: __typename, alias13963: __typename, alias13964: __typename, alias13965: __typename, alias13966: __typename, alias13967: __typename, alias13968: __typename, alias13969: __typename, alias13970: __typename, alias13971: __typename, alias13972: __typename, alias13973: __typename, alias13974: __typename, alias13975: __typename, alias13976: __typename, alias13977: __typename, alias13978: __typename, alias13979: __typename, alias13980: __typename, alias13981: __typename, alias13982: __typename, alias13983: __typename, alias13984: __typename, alias13985: __typename, alias13986: __typename, alias13987: __typename, alias13988: __typename, alias13989: __typename, alias13990: __typename, alias13991: __typename, alias13992: __typename, alias13993: __typename, alias13994: __typename, alias13995: __typename, alias13996: __typename, alias13997: __typename, alias13998: __typename, alias13999: __typename, alias14000: __typename, alias14001: __typename, alias14002: __typename, alias14003: __typename, alias14004: __typename, alias14005: __typename, alias14006: __typename, alias14007: __typename, alias14008: __typename, alias14009: __typename, alias14010: __typename, alias14011: __typename, alias14012: __typename, alias14013: __typename, alias14014: __typename, alias14015: __typename, alias14016: __typename, alias14017: __typename, alias14018: __typename, alias14019: __typename, alias14020: __typename, alias14021: __typename, alias14022: __typename, alias14023: __typename, alias14024: __typename, alias14025: __typename, alias14026: __typename, alias14027: __typename, alias14028: __typename, alias14029: __typename, alias14030: __typename, alias14031: __typename, alias14032: __typename, alias14033: __typename, alias14034: __typename, alias14035: __typename, alias14036: __typename, alias14037: __typename, alias14038: __typename, alias14039: __typename, alias14040: __typename, alias14041: __typename, alias14042: __typename, alias14043: __typename, alias14044: __typename, alias14045: __typename, alias14046: __typename, alias14047: __typename, alias14048: __typename, alias14049: __typename, alias14050: __typename, alias14051: __typename, alias14052: __typename, alias14053: __typename, alias14054: __typename, alias14055: __typename, alias14056: __typename, alias14057: __typename, alias14058: __typename, alias14059: __typename, alias14060: __typename, alias14061: __typename, alias14062: __typename, alias14063: __typename, alias14064: __typename, alias14065: __typename, alias14066: __typename, alias14067: __typename, alias14068: __typename, alias14069: __typename, alias14070: __typename, alias14071: __typename, alias14072: __typename, alias14073: __typename, alias14074: __typename, alias14075: __typename, alias14076: __typename, alias14077: __typename, alias14078: __typename, alias14079: __typename, alias14080: __typename, alias14081: __typename, alias14082: __typename, alias14083: __typename, alias14084: __typename, alias14085: __typename, alias14086: __typename, alias14087: __typename, alias14088: __typename, alias14089: __typename, alias14090: __typename, alias14091: __typename, alias14092: __typename, alias14093: __typename, alias14094: __typename, alias14095: __typename, alias14096: __typename, alias14097: __typename, alias14098: __typename, alias14099: __typename, alias14100: __typename, alias14101: __typename, alias14102: __typename, alias14103: __typename, alias14104: __typename, alias14105: __typename, alias14106: __typename, alias14107: __typename, alias14108: __typename, alias14109: __typename, alias14110: __typename, alias14111: __typename, alias14112: __typename, alias14113: __typename, alias14114: __typename, alias14115: __typename, alias14116: __typename, alias14117: __typename, alias14118: __typename, alias14119: __typename, alias14120: __typename, alias14121: __typename, alias14122: __typename, alias14123: __typename, alias14124: __typename, alias14125: __typename, alias14126: __typename, alias14127: __typename, alias14128: __typename, alias14129: __typename, alias14130: __typename, alias14131: __typename, alias14132: __typename, alias14133: __typename, alias14134: __typename, alias14135: __typename, alias14136: __typename, alias14137: __typename, alias14138: __typename, alias14139: __typename, alias14140: __typename, alias14141: __typename, alias14142: __typename, alias14143: __typename, alias14144: __typename, alias14145: __typename, alias14146: __typename, alias14147: __typename, alias14148: __typename, alias14149: __typename, alias14150: __typename, alias14151: __typename, alias14152: __typename, alias14153: __typename, alias14154: __typename, alias14155: __typename, alias14156: __typename, alias14157: __typename, alias14158: __typename, alias14159: __typename, alias14160: __typename, alias14161: __typename, alias14162: __typename, alias14163: __typename, alias14164: __typename, alias14165: __typename, alias14166: __typename, alias14167: __typename, alias14168: __typename, alias14169: __typename, alias14170: __typename, alias14171: __typename, alias14172: __typename, alias14173: __typename, alias14174: __typename, alias14175: __typename, alias14176: __typename, alias14177: __typename, alias14178: __typename, alias14179: __typename, alias14180: __typename, alias14181: __typename, alias14182: __typename, alias14183: __typename, alias14184: __typename, alias14185: __typename, alias14186: __typename, alias14187: __typename, alias14188: __typename, alias14189: __typename, alias14190: __typename, alias14191: __typename, alias14192: __typename, alias14193: __typename, alias14194: __typename, alias14195: __typename, alias14196: __typename, alias14197: __typename, alias14198: __typename, alias14199: __typename, alias14200: __typename, alias14201: __typename, alias14202: __typename, alias14203: __typename, alias14204: __typename, alias14205: __typename, alias14206: __typename, alias14207: __typename, alias14208: __typename, alias14209: __typename, alias14210: __typename, alias14211: __typename, alias14212: __typename, alias14213: __typename, alias14214: __typename, alias14215: __typename, alias14216: __typename, alias14217: __typename, alias14218: __typename, alias14219: __typename, alias14220: __typename, alias14221: __typename, alias14222: __typename, alias14223: __typename, alias14224: __typename, alias14225: __typename, alias14226: __typename, alias14227: __typename, alias14228: __typename, alias14229: __typename, alias14230: __typename, alias14231: __typename, alias14232: __typename, alias14233: __typename, alias14234: __typename, alias14235: __typename, alias14236: __typename, alias14237: __typename, alias14238: __typename, alias14239: __typename, alias14240: __typename, alias14241: __typename, alias14242: __typename, alias14243: __typename, alias14244: __typename, alias14245: __typename, alias14246: __typename, alias14247: __typename, alias14248: __typename, alias14249: __typename, alias14250: __typename, alias14251: __typename, alias14252: __typename, alias14253: __typename, alias14254: __typename, alias14255: __typename, alias14256: __typename, alias14257: __typename, alias14258: __typename, alias14259: __typename, alias14260: __typename, alias14261: __typename, alias14262: __typename, alias14263: __typename, alias14264: __typename, alias14265: __typename, alias14266: __typename, alias14267: __typename, alias14268: __typename, alias14269: __typename, alias14270: __typename, alias14271: __typename, alias14272: __typename, alias14273: __typename, alias14274: __typename, alias14275: __typename, alias14276: __typename, alias14277: __typename, alias14278: __typename, alias14279: __typename, alias14280: __typename, alias14281: __typename, alias14282: __typename, alias14283: __typename, alias14284: __typename, alias14285: __typename, alias14286: __typename, alias14287: __typename, alias14288: __typename, alias14289: __typename, alias14290: __typename, alias14291: __typename, alias14292: __typename, alias14293: __typename, alias14294: __typename, alias14295: __typename, alias14296: __typename, alias14297: __typename, alias14298: __typename, alias14299: __typename, alias14300: __typename, alias14301: __typename, alias14302: __typename, alias14303: __typename, alias14304: __typename, alias14305: __typename, alias14306: __typename, alias14307: __typename, alias14308: __typename, alias14309: __typename, alias14310: __typename, alias14311: __typename, alias14312: __typename, alias14313: __typename, alias14314: __typename, alias14315: __typename, alias14316: __typename, alias14317: __typename, alias14318: __typename, alias14319: __typename, alias14320: __typename, alias14321: __typename, alias14322: __typename, alias14323: __typename, alias14324: __typename, alias14325: __typename, alias14326: __typename, alias14327: __typename, alias14328: __typename, alias14329: __typename, alias14330: __typename, alias14331: __typename, alias14332: __typename, alias14333: __typename, alias14334: __typename, alias14335: __typename, alias14336: __typename, alias14337: __typename, alias14338: __typename, alias14339: __typename, alias14340: __typename, alias14341: __typename, alias14342: __typename, alias14343: __typename, alias14344: __typename, alias14345: __typename, alias14346: __typename, alias14347: __typename, alias14348: __typename, alias14349: __typename, alias14350: __typename, alias14351: __typename, alias14352: __typename, alias14353: __typename, alias14354: __typename, alias14355: __typename, alias14356: __typename, alias14357: __typename, alias14358: __typename, alias14359: __typename, alias14360: __typename, alias14361: __typename, alias14362: __typename, alias14363: __typename, alias14364: __typename, alias14365: __typename, alias14366: __typename, alias14367: __typename, alias14368: __typename, alias14369: __typename, alias14370: __typename, alias14371: __typename, alias14372: __typename, alias14373: __typename, alias14374: __typename, alias14375: __typename, alias14376: __typename, alias14377: __typename, alias14378: __typename, alias14379: __typename, alias14380: __typename, alias14381: __typename, alias14382: __typename, alias14383: __typename, alias14384: __typename, alias14385: __typename, alias14386: __typename, alias14387: __typename, alias14388: __typename, alias14389: __typename, alias14390: __typename, alias14391: __typename, alias14392: __typename, alias14393: __typename, alias14394: __typename, alias14395: __typename, alias14396: __typename, alias14397: __typename, alias14398: __typename, alias14399: __typename, alias14400: __typename, alias14401: __typename, alias14402: __typename, alias14403: __typename, alias14404: __typename, alias14405: __typename, alias14406: __typename, alias14407: __typename, alias14408: __typename, alias14409: __typename, alias14410: __typename, alias14411: __typename, alias14412: __typename, alias14413: __typename, alias14414: __typename, alias14415: __typename, alias14416: __typename, alias14417: __typename, alias14418: __typename, alias14419: __typename, alias14420: __typename, alias14421: __typename, alias14422: __typename, alias14423: __typename, alias14424: __typename, alias14425: __typename, alias14426: __typename, alias14427: __typename, alias14428: __typename, alias14429: __typename, alias14430: __typename, alias14431: __typename, alias14432: __typename, alias14433: __typename, alias14434: __typename, alias14435: __typename, alias14436: __typename, alias14437: __typename, alias14438: __typename, alias14439: __typename, alias14440: __typename, alias14441: __typename, alias14442: __typename, alias14443: __typename, alias14444: __typename, alias14445: __typename, alias14446: __typename, alias14447: __typename, alias14448: __typename, alias14449: __typename, alias14450: __typename, alias14451: __typename, alias14452: __typename, alias14453: __typename, alias14454: __typename, alias14455: __typename, alias14456: __typename, alias14457: __typename, alias14458: __typename, alias14459: __typename, alias14460: __typename, alias14461: __typename, alias14462: __typename, alias14463: __typename, alias14464: __typename, alias14465: __typename, alias14466: __typename, alias14467: __typename, alias14468: __typename, alias14469: __typename, alias14470: __typename, alias14471: __typename, alias14472: __typename, alias14473: __typename, alias14474: __typename, alias14475: __typename, alias14476: __typename, alias14477: __typename, alias14478: __typename, alias14479: __typename, alias14480: __typename, alias14481: __typename, alias14482: __typename, alias14483: __typename, alias14484: __typename, alias14485: __typename, alias14486: __typename, alias14487: __typename, alias14488: __typename, alias14489: __typename, alias14490: __typename, alias14491: __typename, alias14492: __typename, alias14493: __typename, alias14494: __typename, alias14495: __typename, alias14496: __typename, alias14497: __typename, alias14498: __typename, alias14499: __typename, alias14500: __typename, alias14501: __typename, alias14502: __typename, alias14503: __typename, alias14504: __typename, alias14505: __typename, alias14506: __typename, alias14507: __typename, alias14508: __typename, alias14509: __typename, alias14510: __typename, alias14511: __typename, alias14512: __typename, alias14513: __typename, alias14514: __typename, alias14515: __typename, alias14516: __typename, alias14517: __typename, alias14518: __typename, alias14519: __typename, alias14520: __typename, alias14521: __typename, alias14522: __typename, alias14523: __typename, alias14524: __typename, alias14525: __typename, alias14526: __typename, alias14527: __typename, alias14528: __typename, alias14529: __typename, alias14530: __typename, alias14531: __typename, alias14532: __typename, alias14533: __typename, alias14534: __typename, alias14535: __typename, alias14536: __typename, alias14537: __typename, alias14538: __typename, alias14539: __typename, alias14540: __typename, alias14541: __typename, alias14542: __typename, alias14543: __typename, alias14544: __typename, alias14545: __typename, alias14546: __typename, alias14547: __typename, alias14548: __typename, alias14549: __typename, alias14550: __typename, alias14551: __typename, alias14552: __typename, alias14553: __typename, alias14554: __typename, alias14555: __typename, alias14556: __typename, alias14557: __typename, alias14558: __typename, alias14559: __typename, alias14560: __typename, alias14561: __typename, alias14562: __typename, alias14563: __typename, alias14564: __typename, alias14565: __typename, alias14566: __typename, alias14567: __typename, alias14568: __typename, alias14569: __typename, alias14570: __typename, alias14571: __typename, alias14572: __typename, alias14573: __typename, alias14574: __typename, alias14575: __typename, alias14576: __typename, alias14577: __typename, alias14578: __typename, alias14579: __typename, alias14580: __typename, alias14581: __typename, alias14582: __typename, alias14583: __typename, alias14584: __typename, alias14585: __typename, alias14586: __typename, alias14587: __typename, alias14588: __typename, alias14589: __typename, alias14590: __typename, alias14591: __typename, alias14592: __typename, alias14593: __typename, alias14594: __typename, alias14595: __typename, alias14596: __typename, alias14597: __typename, alias14598: __typename, alias14599: __typename, alias14600: __typename, alias14601: __typename, alias14602: __typename, alias14603: __typename, alias14604: __typename, alias14605: __typename, alias14606: __typename, alias14607: __typename, alias14608: __typename, alias14609: __typename, alias14610: __typename, alias14611: __typename, alias14612: __typename, alias14613: __typename, alias14614: __typename, alias14615: __typename, alias14616: __typename, alias14617: __typename, alias14618: __typename, alias14619: __typename, alias14620: __typename, alias14621: __typename, alias14622: __typename, alias14623: __typename, alias14624: __typename, alias14625: __typename, alias14626: __typename, alias14627: __typename, alias14628: __typename, alias14629: __typename, alias14630: __typename, alias14631: __typename, alias14632: __typename, alias14633: __typename, alias14634: __typename, alias14635: __typename, alias14636: __typename, alias14637: __typename, alias14638: __typename, alias14639: __typename, alias14640: __typename, alias14641: __typename, alias14642: __typename, alias14643: __typename, alias14644: __typename, alias14645: __typename, alias14646: __typename, alias14647: __typename, alias14648: __typename, alias14649: __typename, alias14650: __typename, alias14651: __typename, alias14652: __typename, alias14653: __typename, alias14654: __typename, alias14655: __typename, alias14656: __typename, alias14657: __typename, alias14658: __typename, alias14659: __typename, alias14660: __typename, alias14661: __typename, alias14662: __typename, alias14663: __typename, alias14664: __typename, alias14665: __typename, alias14666: __typename, alias14667: __typename, alias14668: __typename, alias14669: __typename, alias14670: __typename, alias14671: __typename, alias14672: __typename, alias14673: __typename, alias14674: __typename, alias14675: __typename, alias14676: __typename, alias14677: __typename, alias14678: __typename, alias14679: __typename, alias14680: __typename, alias14681: __typename, alias14682: __typename, alias14683: __typename, alias14684: __typename, alias14685: __typename, alias14686: __typename, alias14687: __typename, alias14688: __typename, alias14689: __typename, alias14690: __typename, alias14691: __typename, alias14692: __typename, alias14693: __typename, alias14694: __typename, alias14695: __typename, alias14696: __typename, alias14697: __typename, alias14698: __typename, alias14699: __typename, alias14700: __typename, alias14701: __typename, alias14702: __typename, alias14703: __typename, alias14704: __typename, alias14705: __typename, alias14706: __typename, alias14707: __typename, alias14708: __typename, alias14709: __typename, alias14710: __typename, alias14711: __typename, alias14712: __typename, alias14713: __typename, alias14714: __typename, alias14715: __typename, alias14716: __typename, alias14717: __typename, alias14718: __typename, alias14719: __typename, alias14720: __typename, alias14721: __typename, alias14722: __typename, alias14723: __typename, alias14724: __typename, alias14725: __typename, alias14726: __typename, alias14727: __typename, alias14728: __typename, alias14729: __typename, alias14730: __typename, alias14731: __typename, alias14732: __typename, alias14733: __typename, alias14734: __typename, alias14735: __typename, alias14736: __typename, alias14737: __typename, alias14738: __typename, alias14739: __typename, alias14740: __typename, alias14741: __typename, alias14742: __typename, alias14743: __typename, alias14744: __typename, alias14745: __typename, alias14746: __typename, alias14747: __typename, alias14748: __typename, alias14749: __typename, alias14750: __typename, alias14751: __typename, alias14752: __typename, alias14753: __typename, alias14754: __typename, alias14755: __typename, alias14756: __typename, alias14757: __typename, alias14758: __typename, alias14759: __typename, alias14760: __typename, alias14761: __typename, alias14762: __typename, alias14763: __typename, alias14764: __typename, alias14765: __typename, alias14766: __typename, alias14767: __typename, alias14768: __typename, alias14769: __typename, alias14770: __typename, alias14771: __typename, alias14772: __typename, alias14773: __typename, alias14774: __typename, alias14775: __typename, alias14776: __typename, alias14777: __typename, alias14778: __typename, alias14779: __typename, alias14780: __typename, alias14781: __typename, alias14782: __typename, alias14783: __typename, alias14784: __typename, alias14785: __typename, alias14786: __typename, alias14787: __typename, alias14788: __typename, alias14789: __typename, alias14790: __typename, alias14791: __typename, alias14792: __typename, alias14793: __typename, alias14794: __typename, alias14795: __typename, alias14796: __typename, alias14797: __typename, alias14798: __typename, alias14799: __typename, alias14800: __typename, alias14801: __typename, alias14802: __typename, alias14803: __typename, alias14804: __typename, alias14805: __typename, alias14806: __typename, alias14807: __typename, alias14808: __typename, alias14809: __typename, alias14810: __typename, alias14811: __typename, alias14812: __typename, alias14813: __typename, alias14814: __typename, alias14815: __typename, alias14816: __typename, alias14817: __typename, alias14818: __typename, alias14819: __typename, alias14820: __typename, alias14821: __typename, alias14822: __typename, alias14823: __typename, alias14824: __typename, alias14825: __typename, alias14826: __typename, alias14827: __typename, alias14828: __typename, alias14829: __typename, alias14830: __typename, alias14831: __typename, alias14832: __typename, alias14833: __typename, alias14834: __typename, alias14835: __typename, alias14836: __typename, alias14837: __typename, alias14838: __typename, alias14839: __typename, alias14840: __typename, alias14841: __typename, alias14842: __typename, alias14843: __typename, alias14844: __typename, alias14845: __typename, alias14846: __typename, alias14847: __typename, alias14848: __typename, alias14849: __typename, alias14850: __typename, alias14851: __typename, alias14852: __typename, alias14853: __typename, alias14854: __typename, alias14855: __typename, alias14856: __typename, alias14857: __typename, alias14858: __typename, alias14859: __typename, alias14860: __typename, alias14861: __typename, alias14862: __typename, alias14863: __typename, alias14864: __typename, alias14865: __typename, alias14866: __typename, alias14867: __typename, alias14868: __typename, alias14869: __typename, alias14870: __typename, alias14871: __typename, alias14872: __typename, alias14873: __typename, alias14874: __typename, alias14875: __typename, alias14876: __typename, alias14877: __typename, alias14878: __typename, alias14879: __typename, alias14880: __typename, alias14881: __typename, alias14882: __typename, alias14883: __typename, alias14884: __typename, alias14885: __typename, alias14886: __typename, alias14887: __typename, alias14888: __typename, alias14889: __typename, alias14890: __typename, alias14891: __typename, alias14892: __typename, alias14893: __typename, alias14894: __typename, alias14895: __typename, alias14896: __typename, alias14897: __typename, alias14898: __typename, alias14899: __typename, alias14900: __typename, alias14901: __typename, alias14902: __typename, alias14903: __typename, alias14904: __typename, alias14905: __typename, alias14906: __typename, alias14907: __typename, alias14908: __typename, alias14909: __typename, alias14910: __typename, alias14911: __typename, alias14912: __typename, alias14913: __typename, alias14914: __typename, alias14915: __typename, alias14916: __typename, alias14917: __typename, alias14918: __typename, alias14919: __typename, alias14920: __typename, alias14921: __typename, alias14922: __typename, alias14923: __typename, alias14924: __typename, alias14925: __typename, alias14926: __typename, alias14927: __typename, alias14928: __typename, alias14929: __typename, alias14930: __typename, alias14931: __typename, alias14932: __typename, alias14933: __typename, alias14934: __typename, alias14935: __typename, alias14936: __typename, alias14937: __typename, alias14938: __typename, alias14939: __typename, alias14940: __typename, alias14941: __typename, alias14942: __typename, alias14943: __typename, alias14944: __typename, alias14945: __typename, alias14946: __typename, alias14947: __typename, alias14948: __typename, alias14949: __typename, alias14950: __typename, alias14951: __typename, alias14952: __typename, alias14953: __typename, alias14954: __typename, alias14955: __typename, alias14956: __typename, alias14957: __typename, alias14958: __typename, alias14959: __typename, alias14960: __typename, alias14961: __typename, alias14962: __typename, alias14963: __typename, alias14964: __typename, alias14965: __typename, alias14966: __typename, alias14967: __typename, alias14968: __typename, alias14969: __typename, alias14970: __typename, alias14971: __typename, alias14972: __typename, alias14973: __typename, alias14974: __typename, alias14975: __typename, alias14976: __typename, alias14977: __typename, alias14978: __typename, alias14979: __typename, alias14980: __typename, alias14981: __typename, alias14982: __typename, alias14983: __typename, alias14984: __typename, alias14985: __typename, alias14986: __typename, alias14987: __typename, alias14988: __typename, alias14989: __typename, alias14990: __typename, alias14991: __typename, alias14992: __typename, alias14993: __typename, alias14994: __typename, alias14995: __typename, alias14996: __typename, alias14997: __typename, alias14998: __typename, alias14999: __typename, alias15000: __typename, alias15001: __typename, alias15002: __typename, alias15003: __typename, alias15004: __typename, alias15005: __typename, alias15006: __typename, alias15007: __typename, alias15008: __typename, alias15009: __typename, alias15010: __typename, alias15011: __typename, alias15012: __typename, alias15013: __typename, alias15014: __typename, alias15015: __typename, alias15016: __typename, alias15017: __typename, alias15018: __typename, alias15019: __typename, alias15020: __typename, alias15021: __typename, alias15022: __typename, alias15023: __typename, alias15024: __typename, alias15025: __typename, alias15026: __typename, alias15027: __typename, alias15028: __typename, alias15029: __typename, alias15030: __typename, alias15031: __typename, alias15032: __typename, alias15033: __typename, alias15034: __typename, alias15035: __typename, alias15036: __typename, alias15037: __typename, alias15038: __typename, alias15039: __typename, alias15040: __typename, alias15041: __typename, alias15042: __typename, alias15043: __typename, alias15044: __typename, alias15045: __typename, alias15046: __typename, alias15047: __typename, alias15048: __typename, alias15049: __typename, alias15050: __typename, alias15051: __typename, alias15052: __typename, alias15053: __typename, alias15054: __typename, alias15055: __typename, alias15056: __typename, alias15057: __typename, alias15058: __typename, alias15059: __typename, alias15060: __typename, alias15061: __typename, alias15062: __typename, alias15063: __typename, alias15064: __typename, alias15065: __typename, alias15066: __typename, alias15067: __typename, alias15068: __typename, alias15069: __typename, alias15070: __typename, alias15071: __typename, alias15072: __typename, alias15073: __typename, alias15074: __typename, alias15075: __typename, alias15076: __typename, alias15077: __typename, alias15078: __typename, alias15079: __typename, alias15080: __typename, alias15081: __typename, alias15082: __typename, alias15083: __typename, alias15084: __typename, alias15085: __typename, alias15086: __typename, alias15087: __typename, alias15088: __typename, alias15089: __typename, alias15090: __typename, alias15091: __typename, alias15092: __typename, alias15093: __typename, alias15094: __typename, alias15095: __typename, alias15096: __typename, alias15097: __typename, alias15098: __typename, alias15099: __typename, alias15100: __typename, alias15101: __typename, alias15102: __typename, alias15103: __typename, alias15104: __typename, alias15105: __typename, alias15106: __typename, alias15107: __typename, alias15108: __typename, alias15109: __typename, alias15110: __typename, alias15111: __typename, alias15112: __typename, alias15113: __typename, alias15114: __typename, alias15115: __typename, alias15116: __typename, alias15117: __typename, alias15118: __typename, alias15119: __typename, alias15120: __typename, alias15121: __typename, alias15122: __typename, alias15123: __typename, alias15124: __typename, alias15125: __typename, alias15126: __typename, alias15127: __typename, alias15128: __typename, alias15129: __typename, alias15130: __typename, alias15131: __typename, alias15132: __typename, alias15133: __typename, alias15134: __typename, alias15135: __typename, alias15136: __typename, alias15137: __typename, alias15138: __typename, alias15139: __typename, alias15140: __typename, alias15141: __typename, alias15142: __typename, alias15143: __typename, alias15144: __typename, alias15145: __typename, alias15146: __typename, alias15147: __typename, alias15148: __typename, alias15149: __typename, alias15150: __typename, alias15151: __typename, alias15152: __typename, alias15153: __typename, alias15154: __typename, alias15155: __typename, alias15156: __typename, alias15157: __typename, alias15158: __typename, alias15159: __typename, alias15160: __typename, alias15161: __typename, alias15162: __typename, alias15163: __typename, alias15164: __typename, alias15165: __typename, alias15166: __typename, alias15167: __typename, alias15168: __typename, alias15169: __typename, alias15170: __typename, alias15171: __typename, alias15172: __typename, alias15173: __typename, alias15174: __typename, alias15175: __typename, alias15176: __typename, alias15177: __typename, alias15178: __typename, alias15179: __typename, alias15180: __typename, alias15181: __typename, alias15182: __typename, alias15183: __typename, alias15184: __typename, alias15185: __typename, alias15186: __typename, alias15187: __typename, alias15188: __typename, alias15189: __typename, alias15190: __typename, alias15191: __typename, alias15192: __typename, alias15193: __typename, alias15194: __typename, alias15195: __typename, alias15196: __typename, alias15197: __typename, alias15198: __typename, alias15199: __typename, alias15200: __typename, alias15201: __typename, alias15202: __typename, alias15203: __typename, alias15204: __typename, alias15205: __typename, alias15206: __typename, alias15207: __typename, alias15208: __typename, alias15209: __typename, alias15210: __typename, alias15211: __typename, alias15212: __typename, alias15213: __typename, alias15214: __typename, alias15215: __typename, alias15216: __typename, alias15217: __typename, alias15218: __typename, alias15219: __typename, alias15220: __typename, alias15221: __typename, alias15222: __typename, alias15223: __typename, alias15224: __typename, alias15225: __typename, alias15226: __typename, alias15227: __typename, alias15228: __typename, alias15229: __typename, alias15230: __typename, alias15231: __typename, alias15232: __typename, alias15233: __typename, alias15234: __typename, alias15235: __typename, alias15236: __typename, alias15237: __typename, alias15238: __typename, alias15239: __typename, alias15240: __typename, alias15241: __typename, alias15242: __typename, alias15243: __typename, alias15244: __typename, alias15245: __typename, alias15246: __typename, alias15247: __typename, alias15248: __typename, alias15249: __typename, alias15250: __typename, alias15251: __typename, alias15252: __typename, alias15253: __typename, alias15254: __typename, alias15255: __typename, alias15256: __typename, alias15257: __typename, alias15258: __typename, alias15259: __typename, alias15260: __typename, alias15261: __typename, alias15262: __typename, alias15263: __typename, alias15264: __typename, alias15265: __typename, alias15266: __typename, alias15267: __typename, alias15268: __typename, alias15269: __typename, alias15270: __typename, alias15271: __typename, alias15272: __typename, alias15273: __typename, alias15274: __typename, alias15275: __typename, alias15276: __typename, alias15277: __typename, alias15278: __typename, alias15279: __typename, alias15280: __typename, alias15281: __typename, alias15282: __typename, alias15283: __typename, alias15284: __typename, alias15285: __typename, alias15286: __typename, alias15287: __typename, alias15288: __typename, alias15289: __typename, alias15290: __typename, alias15291: __typename, alias15292: __typename, alias15293: __typename, alias15294: __typename, alias15295: __typename, alias15296: __typename, alias15297: __typename, alias15298: __typename, alias15299: __typename, alias15300: __typename, alias15301: __typename, alias15302: __typename, alias15303: __typename, alias15304: __typename, alias15305: __typename, alias15306: __typename, alias15307: __typename, alias15308: __typename, alias15309: __typename, alias15310: __typename, alias15311: __typename, alias15312: __typename, alias15313: __typename, alias15314: __typename, alias15315: __typename, alias15316: __typename, alias15317: __typename, alias15318: __typename, alias15319: __typename, alias15320: __typename, alias15321: __typename, alias15322: __typename, alias15323: __typename, alias15324: __typename, alias15325: __typename, alias15326: __typename, alias15327: __typename, alias15328: __typename, alias15329: __typename, alias15330: __typename, alias15331: __typename, alias15332: __typename, alias15333: __typename, alias15334: __typename, alias15335: __typename, alias15336: __typename, alias15337: __typename, alias15338: __typename, alias15339: __typename, alias15340: __typename, alias15341: __typename, alias15342: __typename, alias15343: __typename, alias15344: __typename, alias15345: __typename, alias15346: __typename, alias15347: __typename, alias15348: __typename, alias15349: __typename, alias15350: __typename, alias15351: __typename, alias15352: __typename, alias15353: __typename, alias15354: __typename, alias15355: __typename, alias15356: __typename, alias15357: __typename, alias15358: __typename, alias15359: __typename, alias15360: __typename, alias15361: __typename, alias15362: __typename, alias15363: __typename, alias15364: __typename, alias15365: __typename, alias15366: __typename, alias15367: __typename, alias15368: __typename, alias15369: __typename, alias15370: __typename, alias15371: __typename, alias15372: __typename, alias15373: __typename, alias15374: __typename, alias15375: __typename, alias15376: __typename, alias15377: __typename, alias15378: __typename, alias15379: __typename, alias15380: __typename, alias15381: __typename, alias15382: __typename, alias15383: __typename, alias15384: __typename, alias15385: __typename, alias15386: __typename, alias15387: __typename, alias15388: __typename, alias15389: __typename, alias15390: __typename, alias15391: __typename, alias15392: __typename, alias15393: __typename, alias15394: __typename, alias15395: __typename, alias15396: __typename, alias15397: __typename, alias15398: __typename, alias15399: __typename, alias15400: __typename, alias15401: __typename, alias15402: __typename, alias15403: __typename, alias15404: __typename, alias15405: __typename, alias15406: __typename, alias15407: __typename, alias15408: __typename, alias15409: __typename, alias15410: __typename, alias15411: __typename, alias15412: __typename, alias15413: __typename, alias15414: __typename, alias15415: __typename, alias15416: __typename, alias15417: __typename, alias15418: __typename, alias15419: __typename, alias15420: __typename, alias15421: __typename, alias15422: __typename, alias15423: __typename, alias15424: __typename, alias15425: __typename, alias15426: __typename, alias15427: __typename, alias15428: __typename, alias15429: __typename, alias15430: __typename, alias15431: __typename, alias15432: __typename, alias15433: __typename, alias15434: __typename, alias15435: __typename, alias15436: __typename, alias15437: __typename, alias15438: __typename, alias15439: __typename, alias15440: __typename, alias15441: __typename, alias15442: __typename, alias15443: __typename, alias15444: __typename, alias15445: __typename, alias15446: __typename, alias15447: __typename, alias15448: __typename, alias15449: __typename, alias15450: __typename, alias15451: __typename, alias15452: __typename, alias15453: __typename, alias15454: __typename, alias15455: __typename, alias15456: __typename, alias15457: __typename, alias15458: __typename, alias15459: __typename, alias15460: __typename, alias15461: __typename, alias15462: __typename, alias15463: __typename, alias15464: __typename, alias15465: __typename, alias15466: __typename, alias15467: __typename, alias15468: __typename, alias15469: __typename, alias15470: __typename, alias15471: __typename, alias15472: __typename, alias15473: __typename, alias15474: __typename, alias15475: __typename, alias15476: __typename, alias15477: __typename, alias15478: __typename, alias15479: __typename, alias15480: __typename, alias15481: __typename, alias15482: __typename, alias15483: __typename, alias15484: __typename, alias15485: __typename, alias15486: __typename, alias15487: __typename, alias15488: __typename, alias15489: __typename, alias15490: __typename, alias15491: __typename, alias15492: __typename, alias15493: __typename, alias15494: __typename, alias15495: __typename, alias15496: __typename, alias15497: __typename, alias15498: __typename, alias15499: __typename, alias15500: __typename, alias15501: __typename, alias15502: __typename, alias15503: __typename, alias15504: __typename, alias15505: __typename, alias15506: __typename, alias15507: __typename, alias15508: __typename, alias15509: __typename, alias15510: __typename, alias15511: __typename, alias15512: __typename, alias15513: __typename, alias15514: __typename, alias15515: __typename, alias15516: __typename, alias15517: __typename, alias15518: __typename, alias15519: __typename, alias15520: __typename, alias15521: __typename, alias15522: __typename, alias15523: __typename, alias15524: __typename, alias15525: __typename, alias15526: __typename, alias15527: __typename, alias15528: __typename, alias15529: __typename, alias15530: __typename, alias15531: __typename, alias15532: __typename, alias15533: __typename, alias15534: __typename, alias15535: __typename, alias15536: __typename, alias15537: __typename, alias15538: __typename, alias15539: __typename, alias15540: __typename, alias15541: __typename, alias15542: __typename, alias15543: __typename, alias15544: __typename, alias15545: __typename, alias15546: __typename, alias15547: __typename, alias15548: __typename, alias15549: __typename, alias15550: __typename, alias15551: __typename, alias15552: __typename, alias15553: __typename, alias15554: __typename, alias15555: __typename, alias15556: __typename, alias15557: __typename, alias15558: __typename, alias15559: __typename, alias15560: __typename, alias15561: __typename, alias15562: __typename, alias15563: __typename, alias15564: __typename, alias15565: __typename, alias15566: __typename, alias15567: __typename, alias15568: __typename, alias15569: __typename, alias15570: __typename, alias15571: __typename, alias15572: __typename, alias15573: __typename, alias15574: __typename, alias15575: __typename, alias15576: __typename, alias15577: __typename, alias15578: __typename, alias15579: __typename, alias15580: __typename, alias15581: __typename, alias15582: __typename, alias15583: __typename, alias15584: __typename, alias15585: __typename, alias15586: __typename, alias15587: __typename, alias15588: __typename, alias15589: __typename, alias15590: __typename, alias15591: __typename, alias15592: __typename, alias15593: __typename, alias15594: __typename, alias15595: __typename, alias15596: __typename, alias15597: __typename, alias15598: __typename, alias15599: __typename, alias15600: __typename, alias15601: __typename, alias15602: __typename, alias15603: __typename, alias15604: __typename, alias15605: __typename, alias15606: __typename, alias15607: __typename, alias15608: __typename, alias15609: __typename, alias15610: __typename, alias15611: __typename, alias15612: __typename, alias15613: __typename, alias15614: __typename, alias15615: __typename, alias15616: __typename, alias15617: __typename, alias15618: __typename, alias15619: __typename, alias15620: __typename, alias15621: __typename, alias15622: __typename, alias15623: __typename, alias15624: __typename, alias15625: __typename, alias15626: __typename, alias15627: __typename, alias15628: __typename, alias15629: __typename, alias15630: __typename, alias15631: __typename, alias15632: __typename, alias15633: __typename, alias15634: __typename, alias15635: __typename, alias15636: __typename, alias15637: __typename, alias15638: __typename, alias15639: __typename, alias15640: __typename, alias15641: __typename, alias15642: __typename, alias15643: __typename, alias15644: __typename, alias15645: __typename, alias15646: __typename, alias15647: __typename, alias15648: __typename, alias15649: __typename, alias15650: __typename, alias15651: __typename, alias15652: __typename, alias15653: __typename, alias15654: __typename, alias15655: __typename, alias15656: __typename, alias15657: __typename, alias15658: __typename, alias15659: __typename, alias15660: __typename, alias15661: __typename, alias15662: __typename, alias15663: __typename, alias15664: __typename, alias15665: __typename, alias15666: __typename, alias15667: __typename, alias15668: __typename, alias15669: __typename, alias15670: __typename, alias15671: __typename, alias15672: __typename, alias15673: __typename, alias15674: __typename, alias15675: __typename, alias15676: __typename, alias15677: __typename, alias15678: __typename, alias15679: __typename, alias15680: __typename, alias15681: __typename, alias15682: __typename, alias15683: __typename, alias15684: __typename, alias15685: __typename, alias15686: __typename, alias15687: __typename, alias15688: __typename, alias15689: __typename, alias15690: __typename, alias15691: __typename, alias15692: __typename, alias15693: __typename, alias15694: __typename, alias15695: __typename, alias15696: __typename, alias15697: __typename, alias15698: __typename, alias15699: __typename, alias15700: __typename, alias15701: __typename, alias15702: __typename, alias15703: __typename, alias15704: __typename, alias15705: __typename, alias15706: __typename, alias15707: __typename, alias15708: __typename, alias15709: __typename, alias15710: __typename, alias15711: __typename, alias15712: __typename, alias15713: __typename, alias15714: __typename, alias15715: __typename, alias15716: __typename, alias15717: __typename, alias15718: __typename, alias15719: __typename, alias15720: __typename, alias15721: __typename, alias15722: __typename, alias15723: __typename, alias15724: __typename, alias15725: __typename, alias15726: __typename, alias15727: __typename, alias15728: __typename, alias15729: __typename, alias15730: __typename, alias15731: __typename, alias15732: __typename, alias15733: __typename, alias15734: __typename, alias15735: __typename, alias15736: __typename, alias15737: __typename, alias15738: __typename, alias15739: __typename, alias15740: __typename, alias15741: __typename, alias15742: __typename, alias15743: __typename, alias15744: __typename, alias15745: __typename, alias15746: __typename, alias15747: __typename, alias15748: __typename, alias15749: __typename, alias15750: __typename, alias15751: __typename, alias15752: __typename, alias15753: __typename, alias15754: __typename, alias15755: __typename, alias15756: __typename, alias15757: __typename, alias15758: __typename, alias15759: __typename, alias15760: __typename, alias15761: __typename, alias15762: __typename, alias15763: __typename, alias15764: __typename, alias15765: __typename, alias15766: __typename, alias15767: __typename, alias15768: __typename, alias15769: __typename, alias15770: __typename, alias15771: __typename, alias15772: __typename, alias15773: __typename, alias15774: __typename, alias15775: __typename, alias15776: __typename, alias15777: __typename, alias15778: __typename, alias15779: __typename, alias15780: __typename, alias15781: __typename, alias15782: __typename, alias15783: __typename, alias15784: __typename, alias15785: __typename, alias15786: __typename, alias15787: __typename, alias15788: __typename, alias15789: __typename, alias15790: __typename, alias15791: __typename, alias15792: __typename, alias15793: __typename, alias15794: __typename, alias15795: __typename, alias15796: __typename, alias15797: __typename, alias15798: __typename, alias15799: __typename, alias15800: __typename, alias15801: __typename, alias15802: __typename, alias15803: __typename, alias15804: __typename, alias15805: __typename, alias15806: __typename, alias15807: __typename, alias15808: __typename, alias15809: __typename, alias15810: __typename, alias15811: __typename, alias15812: __typename, alias15813: __typename, alias15814: __typename, alias15815: __typename, alias15816: __typename, alias15817: __typename, alias15818: __typename, alias15819: __typename, alias15820: __typename, alias15821: __typename, alias15822: __typename, alias15823: __typename, alias15824: __typename, alias15825: __typename, alias15826: __typename, alias15827: __typename, alias15828: __typename, alias15829: __typename, alias15830: __typename, alias15831: __typename, alias15832: __typename, alias15833: __typename, alias15834: __typename, alias15835: __typename, alias15836: __typename, alias15837: __typename, alias15838: __typename, alias15839: __typename, alias15840: __typename, alias15841: __typename, alias15842: __typename, alias15843: __typename, alias15844: __typename, alias15845: __typename, alias15846: __typename, alias15847: __typename, alias15848: __typename, alias15849: __typename, alias15850: __typename, alias15851: __typename, alias15852: __typename, alias15853: __typename, alias15854: __typename, alias15855: __typename, alias15856: __typename, alias15857: __typename, alias15858: __typename, alias15859: __typename, alias15860: __typename, alias15861: __typename, alias15862: __typename, alias15863: __typename, alias15864: __typename, alias15865: __typename, alias15866: __typename, alias15867: __typename, alias15868: __typename, alias15869: __typename, alias15870: __typename, alias15871: __typename, alias15872: __typename, alias15873: __typename, alias15874: __typename, alias15875: __typename, alias15876: __typename, alias15877: __typename, alias15878: __typename, alias15879: __typename, alias15880: __typename, alias15881: __typename, alias15882: __typename, alias15883: __typename, alias15884: __typename, alias15885: __typename, alias15886: __typename, alias15887: __typename, alias15888: __typename, alias15889: __typename, alias15890: __typename, alias15891: __typename, alias15892: __typename, alias15893: __typename, alias15894: __typename, alias15895: __typename, alias15896: __typename, alias15897: __typename, alias15898: __typename, alias15899: __typename, alias15900: __typename, alias15901: __typename, alias15902: __typename, alias15903: __typename, alias15904: __typename, alias15905: __typename, alias15906: __typename, alias15907: __typename, alias15908: __typename, alias15909: __typename, alias15910: __typename, alias15911: __typename, alias15912: __typename, alias15913: __typename, alias15914: __typename, alias15915: __typename, alias15916: __typename, alias15917: __typename, alias15918: __typename, alias15919: __typename, alias15920: __typename, alias15921: __typename, alias15922: __typename, alias15923: __typename, alias15924: __typename, alias15925: __typename, alias15926: __typename, alias15927: __typename, alias15928: __typename, alias15929: __typename, alias15930: __typename, alias15931: __typename, alias15932: __typename, alias15933: __typename, alias15934: __typename, alias15935: __typename, alias15936: __typename, alias15937: __typename, alias15938: __typename, alias15939: __typename, alias15940: __typename, alias15941: __typename, alias15942: __typename, alias15943: __typename, alias15944: __typename, alias15945: __typename, alias15946: __typename, alias15947: __typename, alias15948: __typename, alias15949: __typename, alias15950: __typename, alias15951: __typename, alias15952: __typename, alias15953: __typename, alias15954: __typename, alias15955: __typename, alias15956: __typename, alias15957: __typename, alias15958: __typename, alias15959: __typename, alias15960: __typename, alias15961: __typename, alias15962: __typename, alias15963: __typename, alias15964: __typename, alias15965: __typename, alias15966: __typename, alias15967: __typename, alias15968: __typename, alias15969: __typename, alias15970: __typename, alias15971: __typename, alias15972: __typename, alias15973: __typename, alias15974: __typename, alias15975: __typename, alias15976: __typename, alias15977: __typename, alias15978: __typename, alias15979: __typename, alias15980: __typename, alias15981: __typename, alias15982: __typename, alias15983: __typename, alias15984: __typename, alias15985: __typename, alias15986: __typename, alias15987: __typename, alias15988: __typename, alias15989: __typename, alias15990: __typename, alias15991: __typename, alias15992: __typename, alias15993: __typename, alias15994: __typename, alias15995: __typename, alias15996: __typename, alias15997: __typename, alias15998: __typename, alias15999: __typename, alias16000: __typename, alias16001: __typename, alias16002: __typename, alias16003: __typename, alias16004: __typename, alias16005: __typename, alias16006: __typename, alias16007: __typename, alias16008: __typename, alias16009: __typename, alias16010: __typename, alias16011: __typename, alias16012: __typename, alias16013: __typename, alias16014: __typename, alias16015: __typename, alias16016: __typename, alias16017: __typename, alias16018: __typename, alias16019: __typename, alias16020: __typename, alias16021: __typename, alias16022: __typename, alias16023: __typename, alias16024: __typename, alias16025: __typename, alias16026: __typename, alias16027: __typename, alias16028: __typename, alias16029: __typename, alias16030: __typename, alias16031: __typename, alias16032: __typename, alias16033: __typename, alias16034: __typename, alias16035: __typename, alias16036: __typename, alias16037: __typename, alias16038: __typename, alias16039: __typename, alias16040: __typename, alias16041: __typename, alias16042: __typename, alias16043: __typename, alias16044: __typename, alias16045: __typename, alias16046: __typename, alias16047: __typename, alias16048: __typename, alias16049: __typename, alias16050: __typename, alias16051: __typename, alias16052: __typename, alias16053: __typename, alias16054: __typename, alias16055: __typename, alias16056: __typename, alias16057: __typename, alias16058: __typename, alias16059: __typename, alias16060: __typename, alias16061: __typename, alias16062: __typename, alias16063: __typename, alias16064: __typename, alias16065: __typename, alias16066: __typename, alias16067: __typename, alias16068: __typename, alias16069: __typename, alias16070: __typename, alias16071: __typename, alias16072: __typename, alias16073: __typename, alias16074: __typename, alias16075: __typename, alias16076: __typename, alias16077: __typename, alias16078: __typename, alias16079: __typename, alias16080: __typename, alias16081: __typename, alias16082: __typename, alias16083: __typename, alias16084: __typename, alias16085: __typename, alias16086: __typename, alias16087: __typename, alias16088: __typename, alias16089: __typename, alias16090: __typename, alias16091: __typename, alias16092: __typename, alias16093: __typename, alias16094: __typename, alias16095: __typename, alias16096: __typename, alias16097: __typename, alias16098: __typename, alias16099: __typename, alias16100: __typename, alias16101: __typename, alias16102: __typename, alias16103: __typename, alias16104: __typename, alias16105: __typename, alias16106: __typename, alias16107: __typename, alias16108: __typename, alias16109: __typename, alias16110: __typename, alias16111: __typename, alias16112: __typename, alias16113: __typename, alias16114: __typename, alias16115: __typename, alias16116: __typename, alias16117: __typename, alias16118: __typename, alias16119: __typename, alias16120: __typename, alias16121: __typename, alias16122: __typename, alias16123: __typename, alias16124: __typename, alias16125: __typename, alias16126: __typename, alias16127: __typename, alias16128: __typename, alias16129: __typename, alias16130: __typename, alias16131: __typename, alias16132: __typename, alias16133: __typename, alias16134: __typename, alias16135: __typename, alias16136: __typename, alias16137: __typename, alias16138: __typename, alias16139: __typename, alias16140: __typename, alias16141: __typename, alias16142: __typename, alias16143: __typename, alias16144: __typename, alias16145: __typename, alias16146: __typename, alias16147: __typename, alias16148: __typename, alias16149: __typename, alias16150: __typename, alias16151: __typename, alias16152: __typename, alias16153: __typename, alias16154: __typename, alias16155: __typename, alias16156: __typename, alias16157: __typename, alias16158: __typename, alias16159: __typename, alias16160: __typename, alias16161: __typename, alias16162: __typename, alias16163: __typename, alias16164: __typename, alias16165: __typename, alias16166: __typename, alias16167: __typename, alias16168: __typename, alias16169: __typename, alias16170: __typename, alias16171: __typename, alias16172: __typename, alias16173: __typename, alias16174: __typename, alias16175: __typename, alias16176: __typename, alias16177: __typename, alias16178: __typename, alias16179: __typename, alias16180: __typename, alias16181: __typename, alias16182: __typename, alias16183: __typename, alias16184: __typename, alias16185: __typename, alias16186: __typename, alias16187: __typename, alias16188: __typename, alias16189: __typename, alias16190: __typename, alias16191: __typename, alias16192: __typename, alias16193: __typename, alias16194: __typename, alias16195: __typename, alias16196: __typename, alias16197: __typename, alias16198: __typename, alias16199: __typename, alias16200: __typename, alias16201: __typename, alias16202: __typename, alias16203: __typename, alias16204: __typename, alias16205: __typename, alias16206: __typename, alias16207: __typename, alias16208: __typename, alias16209: __typename, alias16210: __typename, alias16211: __typename, alias16212: __typename, alias16213: __typename, alias16214: __typename, alias16215: __typename, alias16216: __typename, alias16217: __typename, alias16218: __typename, alias16219: __typename, alias16220: __typename, alias16221: __typename, alias16222: __typename, alias16223: __typename, alias16224: __typename, alias16225: __typename, alias16226: __typename, alias16227: __typename, alias16228: __typename, alias16229: __typename, alias16230: __typename, alias16231: __typename, alias16232: __typename, alias16233: __typename, alias16234: __typename, alias16235: __typename, alias16236: __typename, alias16237: __typename, alias16238: __typename, alias16239: __typename, alias16240: __typename, alias16241: __typename, alias16242: __typename, alias16243: __typename, alias16244: __typename, alias16245: __typename, alias16246: __typename, alias16247: __typename, alias16248: __typename, alias16249: __typename, alias16250: __typename, alias16251: __typename, alias16252: __typename, alias16253: __typename, alias16254: __typename, alias16255: __typename, alias16256: __typename, alias16257: __typename, alias16258: __typename, alias16259: __typename, alias16260: __typename, alias16261: __typename, alias16262: __typename, alias16263: __typename, alias16264: __typename, alias16265: __typename, alias16266: __typename, alias16267: __typename, alias16268: __typename, alias16269: __typename, alias16270: __typename, alias16271: __typename, alias16272: __typename, alias16273: __typename, alias16274: __typename, alias16275: __typename, alias16276: __typename, alias16277: __typename, alias16278: __typename, alias16279: __typename, alias16280: __typename, alias16281: __typename, alias16282: __typename, alias16283: __typename, alias16284: __typename, alias16285: __typename, alias16286: __typename, alias16287: __typename, alias16288: __typename, alias16289: __typename, alias16290: __typename, alias16291: __typename, alias16292: __typename, alias16293: __typename, alias16294: __typename, alias16295: __typename, alias16296: __typename, alias16297: __typename, alias16298: __typename, alias16299: __typename, alias16300: __typename, alias16301: __typename, alias16302: __typename, alias16303: __typename, alias16304: __typename, alias16305: __typename, alias16306: __typename, alias16307: __typename, alias16308: __typename, alias16309: __typename, alias16310: __typename, alias16311: __typename, alias16312: __typename, alias16313: __typename, alias16314: __typename, alias16315: __typename, alias16316: __typename, alias16317: __typename, alias16318: __typename, alias16319: __typename, alias16320: __typename, alias16321: __typename, alias16322: __typename, alias16323: __typename, alias16324: __typename, alias16325: __typename, alias16326: __typename, alias16327: __typename, alias16328: __typename, alias16329: __typename, alias16330: __typename, alias16331: __typename, alias16332: __typename, alias16333: __typename, alias16334: __typename, alias16335: __typename, alias16336: __typename, alias16337: __typename, alias16338: __typename, alias16339: __typename, alias16340: __typename, alias16341: __typename, alias16342: __typename, alias16343: __typename, alias16344: __typename, alias16345: __typename, alias16346: __typename, alias16347: __typename, alias16348: __typename, alias16349: __typename, alias16350: __typename, alias16351: __typename, alias16352: __typename, alias16353: __typename, alias16354: __typename, alias16355: __typename, alias16356: __typename, alias16357: __typename, alias16358: __typename, alias16359: __typename, alias16360: __typename, alias16361: __typename, alias16362: __typename, alias16363: __typename, alias16364: __typename, alias16365: __typename, alias16366: __typename, alias16367: __typename, alias16368: __typename, alias16369: __typename, alias16370: __typename, alias16371: __typename, alias16372: __typename, alias16373: __typename, alias16374: __typename, alias16375: __typename, alias16376: __typename, alias16377: __typename, alias16378: __typename, alias16379: __typename, alias16380: __typename, alias16381: __typename, alias16382: __typename, alias16383: __typename, alias16384: __typename, alias16385: __typename, alias16386: __typename, alias16387: __typename, alias16388: __typename, alias16389: __typename, alias16390: __typename, alias16391: __typename, alias16392: __typename, alias16393: __typename, alias16394: __typename, alias16395: __typename, alias16396: __typename, alias16397: __typename, alias16398: __typename, alias16399: __typename, alias16400: __typename, alias16401: __typename, alias16402: __typename, alias16403: __typename, alias16404: __typename, alias16405: __typename, alias16406: __typename, alias16407: __typename, alias16408: __typename, alias16409: __typename, alias16410: __typename, alias16411: __typename, alias16412: __typename, alias16413: __typename, alias16414: __typename, alias16415: __typename, alias16416: __typename, alias16417: __typename, alias16418: __typename, alias16419: __typename, alias16420: __typename, alias16421: __typename, alias16422: __typename, alias16423: __typename, alias16424: __typename, alias16425: __typename, alias16426: __typename, alias16427: __typename, alias16428: __typename, alias16429: __typename, alias16430: __typename, alias16431: __typename, alias16432: __typename, alias16433: __typename, alias16434: __typename, alias16435: __typename, alias16436: __typename, alias16437: __typename, alias16438: __typename, alias16439: __typename, alias16440: __typename, alias16441: __typename, alias16442: __typename, alias16443: __typename, alias16444: __typename, alias16445: __typename, alias16446: __typename, alias16447: __typename, alias16448: __typename, alias16449: __typename, alias16450: __typename, alias16451: __typename, alias16452: __typename, alias16453: __typename, alias16454: __typename, alias16455: __typename, alias16456: __typename, alias16457: __typename, alias16458: __typename, alias16459: __typename, alias16460: __typename, alias16461: __typename, alias16462: __typename, alias16463: __typename, alias16464: __typename, alias16465: __typename, alias16466: __typename, alias16467: __typename, alias16468: __typename, alias16469: __typename, alias16470: __typename, alias16471: __typename, alias16472: __typename, alias16473: __typename, alias16474: __typename, alias16475: __typename, alias16476: __typename, alias16477: __typename, alias16478: __typename, alias16479: __typename, alias16480: __typename, alias16481: __typename, alias16482: __typename, alias16483: __typename, alias16484: __typename, alias16485: __typename, alias16486: __typename, alias16487: __typename, alias16488: __typename, alias16489: __typename, alias16490: __typename, alias16491: __typename, alias16492: __typename, alias16493: __typename, alias16494: __typename, alias16495: __typename, alias16496: __typename, alias16497: __typename, alias16498: __typename, alias16499: __typename, alias16500: __typename, alias16501: __typename, alias16502: __typename, alias16503: __typename, alias16504: __typename, alias16505: __typename, alias16506: __typename, alias16507: __typename, alias16508: __typename, alias16509: __typename, alias16510: __typename, alias16511: __typename, alias16512: __typename, alias16513: __typename, alias16514: __typename, alias16515: __typename, alias16516: __typename, alias16517: __typename, alias16518: __typename, alias16519: __typename, alias16520: __typename, alias16521: __typename, alias16522: __typename, alias16523: __typename, alias16524: __typename, alias16525: __typename, alias16526: __typename, alias16527: __typename, alias16528: __typename, alias16529: __typename, alias16530: __typename, alias16531: __typename, alias16532: __typename, alias16533: __typename, alias16534: __typename, alias16535: __typename, alias16536: __typename, alias16537: __typename, alias16538: __typename, alias16539: __typename, alias16540: __typename, alias16541: __typename, alias16542: __typename, alias16543: __typename, alias16544: __typename, alias16545: __typename, alias16546: __typename, alias16547: __typename, alias16548: __typename, alias16549: __typename, alias16550: __typename, alias16551: __typename, alias16552: __typename, alias16553: __typename, alias16554: __typename, alias16555: __typename, alias16556: __typename, alias16557: __typename, alias16558: __typename, alias16559: __typename, alias16560: __typename, alias16561: __typename, alias16562: __typename, alias16563: __typename, alias16564: __typename, alias16565: __typename, alias16566: __typename, alias16567: __typename, alias16568: __typename, alias16569: __typename, alias16570: __typename, alias16571: __typename, alias16572: __typename, alias16573: __typename, alias16574: __typename, alias16575: __typename, alias16576: __typename, alias16577: __typename, alias16578: __typename, alias16579: __typename, alias16580: __typename, alias16581: __typename, alias16582: __typename, alias16583: __typename, alias16584: __typename, alias16585: __typename, alias16586: __typename, alias16587: __typename, alias16588: __typename, alias16589: __typename, alias16590: __typename, alias16591: __typename, alias16592: __typename, alias16593: __typename, alias16594: __typename, alias16595: __typename, alias16596: __typename, alias16597: __typename, alias16598: __typename, alias16599: __typename, alias16600: __typename, alias16601: __typename, alias16602: __typename, alias16603: __typename, alias16604: __typename, alias16605: __typename, alias16606: __typename, alias16607: __typename, alias16608: __typename, alias16609: __typename, alias16610: __typename, alias16611: __typename, alias16612: __typename, alias16613: __typename, alias16614: __typename, alias16615: __typename, alias16616: __typename, alias16617: __typename, alias16618: __typename, alias16619: __typename, alias16620: __typename, alias16621: __typename, alias16622: __typename, alias16623: __typename, alias16624: __typename, alias16625: __typename, alias16626: __typename, alias16627: __typename, alias16628: __typename, alias16629: __typename, alias16630: __typename, alias16631: __typename, alias16632: __typename, alias16633: __typename, alias16634: __typename, alias16635: __typename, alias16636: __typename, alias16637: __typename, alias16638: __typename, alias16639: __typename, alias16640: __typename, alias16641: __typename, alias16642: __typename, alias16643: __typename, alias16644: __typename, alias16645: __typename, alias16646: __typename, alias16647: __typename, alias16648: __typename, alias16649: __typename, alias16650: __typename, alias16651: __typename, alias16652: __typename, alias16653: __typename, alias16654: __typename, alias16655: __typename, alias16656: __typename, alias16657: __typename, alias16658: __typename, alias16659: __typename, alias16660: __typename, alias16661: __typename, alias16662: __typename, alias16663: __typename, alias16664: __typename, alias16665: __typename, alias16666: __typename, alias16667: __typename, alias16668: __typename, alias16669: __typename, alias16670: __typename, alias16671: __typename, alias16672: __typename, alias16673: __typename, alias16674: __typename, alias16675: __typename, alias16676: __typename, alias16677: __typename, alias16678: __typename, alias16679: __typename, alias16680: __typename, alias16681: __typename, alias16682: __typename, alias16683: __typename, alias16684: __typename, alias16685: __typename, alias16686: __typename, alias16687: __typename, alias16688: __typename, alias16689: __typename, alias16690: __typename, alias16691: __typename, alias16692: __typename, alias16693: __typename, alias16694: __typename, alias16695: __typename, alias16696: __typename, alias16697: __typename, alias16698: __typename, alias16699: __typename, alias16700: __typename, alias16701: __typename, alias16702: __typename, alias16703: __typename, alias16704: __typename, alias16705: __typename, alias16706: __typename, alias16707: __typename, alias16708: __typename, alias16709: __typename, alias16710: __typename, alias16711: __typename, alias16712: __typename, alias16713: __typename, alias16714: __typename, alias16715: __typename, alias16716: __typename, alias16717: __typename, alias16718: __typename, alias16719: __typename, alias16720: __typename, alias16721: __typename, alias16722: __typename, alias16723: __typename, alias16724: __typename, alias16725: __typename, alias16726: __typename, alias16727: __typename, alias16728: __typename, alias16729: __typename, alias16730: __typename, alias16731: __typename, alias16732: __typename, alias16733: __typename, alias16734: __typename, alias16735: __typename, alias16736: __typename, alias16737: __typename, alias16738: __typename, alias16739: __typename, alias16740: __typename, alias16741: __typename, alias16742: __typename, alias16743: __typename, alias16744: __typename, alias16745: __typename, alias16746: __typename, alias16747: __typename, alias16748: __typename, alias16749: __typename, alias16750: __typename, alias16751: __typename, alias16752: __typename, alias16753: __typename, alias16754: __typename, alias16755: __typename, alias16756: __typename, alias16757: __typename, alias16758: __typename, alias16759: __typename, alias16760: __typename, alias16761: __typename, alias16762: __typename, alias16763: __typename, alias16764: __typename, alias16765: __typename, alias16766: __typename, alias16767: __typename, alias16768: __typename, alias16769: __typename, alias16770: __typename, alias16771: __typename, alias16772: __typename, alias16773: __typename, alias16774: __typename, alias16775: __typename, alias16776: __typename, alias16777: __typename, alias16778: __typename, alias16779: __typename, alias16780: __typename, alias16781: __typename, alias16782: __typename, alias16783: __typename, alias16784: __typename, alias16785: __typename, alias16786: __typename, alias16787: __typename, alias16788: __typename, alias16789: __typename, alias16790: __typename, alias16791: __typename, alias16792: __typename, alias16793: __typename, alias16794: __typename, alias16795: __typename, alias16796: __typename, alias16797: __typename, alias16798: __typename, alias16799: __typename, alias16800: __typename, alias16801: __typename, alias16802: __typename, alias16803: __typename, alias16804: __typename, alias16805: __typename, alias16806: __typename, alias16807: __typename, alias16808: __typename, alias16809: __typename, alias16810: __typename, alias16811: __typename, alias16812: __typename, alias16813: __typename, alias16814: __typename, alias16815: __typename, alias16816: __typename, alias16817: __typename, alias16818: __typename, alias16819: __typename, alias16820: __typename, alias16821: __typename, alias16822: __typename, alias16823: __typename, alias16824: __typename, alias16825: __typename, alias16826: __typename, alias16827: __typename, alias16828: __typename, alias16829: __typename, alias16830: __typename, alias16831: __typename, alias16832: __typename, alias16833: __typename, alias16834: __typename, alias16835: __typename, alias16836: __typename, alias16837: __typename, alias16838: __typename, alias16839: __typename, alias16840: __typename, alias16841: __typename, alias16842: __typename, alias16843: __typename, alias16844: __typename, alias16845: __typename, alias16846: __typename, alias16847: __typename, alias16848: __typename, alias16849: __typename, alias16850: __typename, alias16851: __typename, alias16852: __typename, alias16853: __typename, alias16854: __typename, alias16855: __typename, alias16856: __typename, alias16857: __typename, alias16858: __typename, alias16859: __typename, alias16860: __typename, alias16861: __typename, alias16862: __typename, alias16863: __typename, alias16864: __typename, alias16865: __typename, alias16866: __typename, alias16867: __typename, alias16868: __typename, alias16869: __typename, alias16870: __typename, alias16871: __typename, alias16872: __typename, alias16873: __typename, alias16874: __typename, alias16875: __typename, alias16876: __typename, alias16877: __typename, alias16878: __typename, alias16879: __typename, alias16880: __typename, alias16881: __typename, alias16882: __typename, alias16883: __typename, alias16884: __typename, alias16885: __typename, alias16886: __typename, alias16887: __typename, alias16888: __typename, alias16889: __typename, alias16890: __typename, alias16891: __typename, alias16892: __typename, alias16893: __typename, alias16894: __typename, alias16895: __typename, alias16896: __typename, alias16897: __typename, alias16898: __typename, alias16899: __typename, alias16900: __typename, alias16901: __typename, alias16902: __typename, alias16903: __typename, alias16904: __typename, alias16905: __typename, alias16906: __typename, alias16907: __typename, alias16908: __typename, alias16909: __typename, alias16910: __typename, alias16911: __typename, alias16912: __typename, alias16913: __typename, alias16914: __typename, alias16915: __typename, alias16916: __typename, alias16917: __typename, alias16918: __typename, alias16919: __typename, alias16920: __typename, alias16921: __typename, alias16922: __typename, alias16923: __typename, alias16924: __typename, alias16925: __typename, alias16926: __typename, alias16927: __typename, alias16928: __typename, alias16929: __typename, alias16930: __typename, alias16931: __typename, alias16932: __typename, alias16933: __typename, alias16934: __typename, alias16935: __typename, alias16936: __typename, alias16937: __typename, alias16938: __typename, alias16939: __typename, alias16940: __typename, alias16941: __typename, alias16942: __typename, alias16943: __typename, alias16944: __typename, alias16945: __typename, alias16946: __typename, alias16947: __typename, alias16948: __typename, alias16949: __typename, alias16950: __typename, alias16951: __typename, alias16952: __typename, alias16953: __typename, alias16954: __typename, alias16955: __typename, alias16956: __typename, alias16957: __typename, alias16958: __typename, alias16959: __typename, alias16960: __typename, alias16961: __typename, alias16962: __typename, alias16963: __typename, alias16964: __typename, alias16965: __typename, alias16966: __typename, alias16967: __typename, alias16968: __typename, alias16969: __typename, alias16970: __typename, alias16971: __typename, alias16972: __typename, alias16973: __typename, alias16974: __typename, alias16975: __typename, alias16976: __typename, alias16977: __typename, alias16978: __typename, alias16979: __typename, alias16980: __typename, alias16981: __typename, alias16982: __typename, alias16983: __typename, alias16984: __typename, alias16985: __typename, alias16986: __typename, alias16987: __typename, alias16988: __typename, alias16989: __typename, alias16990: __typename, alias16991: __typename, alias16992: __typename, alias16993: __typename, alias16994: __typename, alias16995: __typename, alias16996: __typename, alias16997: __typename, alias16998: __typename, alias16999: __typename, alias17000: __typename, alias17001: __typename, alias17002: __typename, alias17003: __typename, alias17004: __typename, alias17005: __typename, alias17006: __typename, alias17007: __typename, alias17008: __typename, alias17009: __typename, alias17010: __typename, alias17011: __typename, alias17012: __typename, alias17013: __typename, alias17014: __typename, alias17015: __typename, alias17016: __typename, alias17017: __typename, alias17018: __typename, alias17019: __typename, alias17020: __typename, alias17021: __typename, alias17022: __typename, alias17023: __typename, alias17024: __typename, alias17025: __typename, alias17026: __typename, alias17027: __typename, alias17028: __typename, alias17029: __typename, alias17030: __typename, alias17031: __typename, alias17032: __typename, alias17033: __typename, alias17034: __typename, alias17035: __typename, alias17036: __typename, alias17037: __typename, alias17038: __typename, alias17039: __typename, alias17040: __typename, alias17041: __typename, alias17042: __typename, alias17043: __typename, alias17044: __typename, alias17045: __typename, alias17046: __typename, alias17047: __typename, alias17048: __typename, alias17049: __typename, alias17050: __typename, alias17051: __typename, alias17052: __typename, alias17053: __typename, alias17054: __typename, alias17055: __typename, alias17056: __typename, alias17057: __typename, alias17058: __typename, alias17059: __typename, alias17060: __typename, alias17061: __typename, alias17062: __typename, alias17063: __typename, alias17064: __typename, alias17065: __typename, alias17066: __typename, alias17067: __typename, alias17068: __typename, alias17069: __typename, alias17070: __typename, alias17071: __typename, alias17072: __typename, alias17073: __typename, alias17074: __typename, alias17075: __typename, alias17076: __typename, alias17077: __typename, alias17078: __typename, alias17079: __typename, alias17080: __typename, alias17081: __typename, alias17082: __typename, alias17083: __typename, alias17084: __typename, alias17085: __typename, alias17086: __typename, alias17087: __typename, alias17088: __typename, alias17089: __typename, alias17090: __typename, alias17091: __typename, alias17092: __typename, alias17093: __typename, alias17094: __typename, alias17095: __typename, alias17096: __typename, alias17097: __typename, alias17098: __typename, alias17099: __typename, alias17100: __typename, alias17101: __typename, alias17102: __typename, alias17103: __typename, alias17104: __typename, alias17105: __typename, alias17106: __typename, alias17107: __typename, alias17108: __typename, alias17109: __typename, alias17110: __typename, alias17111: __typename, alias17112: __typename, alias17113: __typename, alias17114: __typename, alias17115: __typename, alias17116: __typename, alias17117: __typename, alias17118: __typename, alias17119: __typename, alias17120: __typename, alias17121: __typename, alias17122: __typename, alias17123: __typename, alias17124: __typename, alias17125: __typename, alias17126: __typename, alias17127: __typename, alias17128: __typename, alias17129: __typename, alias17130: __typename, alias17131: __typename, alias17132: __typename, alias17133: __typename, alias17134: __typename, alias17135: __typename, alias17136: __typename, alias17137: __typename, alias17138: __typename, alias17139: __typename, alias17140: __typename, alias17141: __typename, alias17142: __typename, alias17143: __typename, alias17144: __typename, alias17145: __typename, alias17146: __typename, alias17147: __typename, alias17148: __typename, alias17149: __typename, alias17150: __typename, alias17151: __typename, alias17152: __typename, alias17153: __typename, alias17154: __typename, alias17155: __typename, alias17156: __typename, alias17157: __typename, alias17158: __typename, alias17159: __typename, alias17160: __typename, alias17161: __typename, alias17162: __typename, alias17163: __typename, alias17164: __typename, alias17165: __typename, alias17166: __typename, alias17167: __typename, alias17168: __typename, alias17169: __typename, alias17170: __typename, alias17171: __typename, alias17172: __typename, alias17173: __typename, alias17174: __typename, alias17175: __typename, alias17176: __typename, alias17177: __typename, alias17178: __typename, alias17179: __typename, alias17180: __typename, alias17181: __typename, alias17182: __typename, alias17183: __typename, alias17184: __typename, alias17185: __typename, alias17186: __typename, alias17187: __typename, alias17188: __typename, alias17189: __typename, alias17190: __typename, alias17191: __typename, alias17192: __typename, alias17193: __typename, alias17194: __typename, alias17195: __typename, alias17196: __typename, alias17197: __typename, alias17198: __typename, alias17199: __typename, alias17200: __typename, alias17201: __typename, alias17202: __typename, alias17203: __typename, alias17204: __typename, alias17205: __typename, alias17206: __typename, alias17207: __typename, alias17208: __typename, alias17209: __typename, alias17210: __typename, alias17211: __typename, alias17212: __typename, alias17213: __typename, alias17214: __typename, alias17215: __typename, alias17216: __typename, alias17217: __typename, alias17218: __typename, alias17219: __typename, alias17220: __typename, alias17221: __typename, alias17222: __typename, alias17223: __typename, alias17224: __typename, alias17225: __typename, alias17226: __typename, alias17227: __typename, alias17228: __typename, alias17229: __typename, alias17230: __typename, alias17231: __typename, alias17232: __typename, alias17233: __typename, alias17234: __typename, alias17235: __typename, alias17236: __typename, alias17237: __typename, alias17238: __typename, alias17239: __typename, alias17240: __typename, alias17241: __typename, alias17242: __typename, alias17243: __typename, alias17244: __typename, alias17245: __typename, alias17246: __typename, alias17247: __typename, alias17248: __typename, alias17249: __typename, alias17250: __typename, alias17251: __typename, alias17252: __typename, alias17253: __typename, alias17254: __typename, alias17255: __typename, alias17256: __typename, alias17257: __typename, alias17258: __typename, alias17259: __typename, alias17260: __typename, alias17261: __typename, alias17262: __typename, alias17263: __typename, alias17264: __typename, alias17265: __typename, alias17266: __typename, alias17267: __typename, alias17268: __typename, alias17269: __typename, alias17270: __typename, alias17271: __typename, alias17272: __typename, alias17273: __typename, alias17274: __typename, alias17275: __typename, alias17276: __typename, alias17277: __typename, alias17278: __typename, alias17279: __typename, alias17280: __typename, alias17281: __typename, alias17282: __typename, alias17283: __typename, alias17284: __typename, alias17285: __typename, alias17286: __typename, alias17287: __typename, alias17288: __typename, alias17289: __typename, alias17290: __typename, alias17291: __typename, alias17292: __typename, alias17293: __typename, alias17294: __typename, alias17295: __typename, alias17296: __typename, alias17297: __typename, alias17298: __typename, alias17299: __typename, alias17300: __typename, alias17301: __typename, alias17302: __typename, alias17303: __typename, alias17304: __typename, alias17305: __typename, alias17306: __typename, alias17307: __typename, alias17308: __typename, alias17309: __typename, alias17310: __typename, alias17311: __typename, alias17312: __typename, alias17313: __typename, alias17314: __typename, alias17315: __typename, alias17316: __typename, alias17317: __typename, alias17318: __typename, alias17319: __typename, alias17320: __typename, alias17321: __typename, alias17322: __typename, alias17323: __typename, alias17324: __typename, alias17325: __typename, alias17326: __typename, alias17327: __typename, alias17328: __typename, alias17329: __typename, alias17330: __typename, alias17331: __typename, alias17332: __typename, alias17333: __typename, alias17334: __typename, alias17335: __typename, alias17336: __typename, alias17337: __typename, alias17338: __typename, alias17339: __typename, alias17340: __typename, alias17341: __typename, alias17342: __typename, alias17343: __typename, alias17344: __typename, alias17345: __typename, alias17346: __typename, alias17347: __typename, alias17348: __typename, alias17349: __typename, alias17350: __typename, alias17351: __typename, alias17352: __typename, alias17353: __typename, alias17354: __typename, alias17355: __typename, alias17356: __typename, alias17357: __typename, alias17358: __typename, alias17359: __typename, alias17360: __typename, alias17361: __typename, alias17362: __typename, alias17363: __typename, alias17364: __typename, alias17365: __typename, alias17366: __typename, alias17367: __typename, alias17368: __typename, alias17369: __typename, alias17370: __typename, alias17371: __typename, alias17372: __typename, alias17373: __typename, alias17374: __typename, alias17375: __typename, alias17376: __typename, alias17377: __typename, alias17378: __typename, alias17379: __typename, alias17380: __typename, alias17381: __typename, alias17382: __typename, alias17383: __typename, alias17384: __typename, alias17385: __typename, alias17386: __typename, alias17387: __typename, alias17388: __typename, alias17389: __typename, alias17390: __typename, alias17391: __typename, alias17392: __typename, alias17393: __typename, alias17394: __typename, alias17395: __typename, alias17396: __typename, alias17397: __typename, alias17398: __typename, alias17399: __typename, alias17400: __typename, alias17401: __typename, alias17402: __typename, alias17403: __typename, alias17404: __typename, alias17405: __typename, alias17406: __typename, alias17407: __typename, alias17408: __typename, alias17409: __typename, alias17410: __typename, alias17411: __typename, alias17412: __typename, alias17413: __typename, alias17414: __typename, alias17415: __typename, alias17416: __typename, alias17417: __typename, alias17418: __typename, alias17419: __typename, alias17420: __typename, alias17421: __typename, alias17422: __typename, alias17423: __typename, alias17424: __typename, alias17425: __typename, alias17426: __typename, alias17427: __typename, alias17428: __typename, alias17429: __typename, alias17430: __typename, alias17431: __typename, alias17432: __typename, alias17433: __typename, alias17434: __typename, alias17435: __typename, alias17436: __typename, alias17437: __typename, alias17438: __typename, alias17439: __typename, alias17440: __typename, alias17441: __typename, alias17442: __typename, alias17443: __typename, alias17444: __typename, alias17445: __typename, alias17446: __typename, alias17447: __typename, alias17448: __typename, alias17449: __typename, alias17450: __typename, alias17451: __typename, alias17452: __typename, alias17453: __typename, alias17454: __typename, alias17455: __typename, alias17456: __typename, alias17457: __typename, alias17458: __typename, alias17459: __typename, alias17460: __typename, alias17461: __typename, alias17462: __typename, alias17463: __typename, alias17464: __typename, alias17465: __typename, alias17466: __typename, alias17467: __typename, alias17468: __typename, alias17469: __typename, alias17470: __typename, alias17471: __typename, alias17472: __typename, alias17473: __typename, alias17474: __typename, alias17475: __typename, alias17476: __typename, alias17477: __typename, alias17478: __typename, alias17479: __typename, alias17480: __typename, alias17481: __typename, alias17482: __typename, alias17483: __typename, alias17484: __typename, alias17485: __typename, alias17486: __typename, alias17487: __typename, alias17488: __typename, alias17489: __typename, alias17490: __typename, alias17491: __typename, alias17492: __typename, alias17493: __typename, alias17494: __typename, alias17495: __typename, alias17496: __typename, alias17497: __typename, alias17498: __typename, alias17499: __typename, alias17500: __typename, alias17501: __typename, alias17502: __typename, alias17503: __typename, alias17504: __typename, alias17505: __typename, alias17506: __typename, alias17507: __typename, alias17508: __typename, alias17509: __typename, alias17510: __typename, alias17511: __typename, alias17512: __typename, alias17513: __typename, alias17514: __typename, alias17515: __typename, alias17516: __typename, alias17517: __typename, alias17518: __typename, alias17519: __typename, alias17520: __typename, alias17521: __typename, alias17522: __typename, alias17523: __typename, alias17524: __typename, alias17525: __typename, alias17526: __typename, alias17527: __typename, alias17528: __typename, alias17529: __typename, alias17530: __typename, alias17531: __typename, alias17532: __typename, alias17533: __typename, alias17534: __typename, alias17535: __typename, alias17536: __typename, alias17537: __typename, alias17538: __typename, alias17539: __typename, alias17540: __typename, alias17541: __typename, alias17542: __typename, alias17543: __typename, alias17544: __typename, alias17545: __typename, alias17546: __typename, alias17547: __typename, alias17548: __typename, alias17549: __typename, alias17550: __typename, alias17551: __typename, alias17552: __typename, alias17553: __typename, alias17554: __typename, alias17555: __typename, alias17556: __typename, alias17557: __typename, alias17558: __typename, alias17559: __typename, alias17560: __typename, alias17561: __typename, alias17562: __typename, alias17563: __typename, alias17564: __typename, alias17565: __typename, alias17566: __typename, alias17567: __typename, alias17568: __typename, alias17569: __typename, alias17570: __typename, alias17571: __typename, alias17572: __typename, alias17573: __typename, alias17574: __typename, alias17575: __typename, alias17576: __typename, alias17577: __typename, alias17578: __typename, alias17579: __typename, alias17580: __typename, alias17581: __typename, alias17582: __typename, alias17583: __typename, alias17584: __typename, alias17585: __typename, alias17586: __typename, alias17587: __typename, alias17588: __typename, alias17589: __typename, alias17590: __typename, alias17591: __typename, alias17592: __typename, alias17593: __typename, alias17594: __typename, alias17595: __typename, alias17596: __typename, alias17597: __typename, alias17598: __typename, alias17599: __typename, alias17600: __typename, alias17601: __typename, alias17602: __typename, alias17603: __typename, alias17604: __typename, alias17605: __typename, alias17606: __typename, alias17607: __typename, alias17608: __typename, alias17609: __typename, alias17610: __typename, alias17611: __typename, alias17612: __typename, alias17613: __typename, alias17614: __typename, alias17615: __typename, alias17616: __typename, alias17617: __typename, alias17618: __typename, alias17619: __typename, alias17620: __typename, alias17621: __typename, alias17622: __typename, alias17623: __typename, alias17624: __typename, alias17625: __typename, alias17626: __typename, alias17627: __typename, alias17628: __typename, alias17629: __typename, alias17630: __typename, alias17631: __typename, alias17632: __typename, alias17633: __typename, alias17634: __typename, alias17635: __typename, alias17636: __typename, alias17637: __typename, alias17638: __typename, alias17639: __typename, alias17640: __typename, alias17641: __typename, alias17642: __typename, alias17643: __typename, alias17644: __typename, alias17645: __typename, alias17646: __typename, alias17647: __typename, alias17648: __typename, alias17649: __typename, alias17650: __typename, alias17651: __typename, alias17652: __typename, alias17653: __typename, alias17654: __typename, alias17655: __typename, alias17656: __typename, alias17657: __typename, alias17658: __typename, alias17659: __typename, alias17660: __typename, alias17661: __typename, alias17662: __typename, alias17663: __typename, alias17664: __typename, alias17665: __typename, alias17666: __typename, alias17667: __typename, alias17668: __typename, alias17669: __typename, alias17670: __typename, alias17671: __typename, alias17672: __typename, alias17673: __typename, alias17674: __typename, alias17675: __typename, alias17676: __typename, alias17677: __typename, alias17678: __typename, alias17679: __typename, alias17680: __typename, alias17681: __typename, alias17682: __typename, alias17683: __typename, alias17684: __typename, alias17685: __typename, alias17686: __typename, alias17687: __typename, alias17688: __typename, alias17689: __typename, alias17690: __typename, alias17691: __typename, alias17692: __typename, alias17693: __typename, alias17694: __typename, alias17695: __typename, alias17696: __typename, alias17697: __typename, alias17698: __typename, alias17699: __typename, alias17700: __typename, alias17701: __typename, alias17702: __typename, alias17703: __typename, alias17704: __typename, alias17705: __typename, alias17706: __typename, alias17707: __typename, alias17708: __typename, alias17709: __typename, alias17710: __typename, alias17711: __typename, alias17712: __typename, alias17713: __typename, alias17714: __typename, alias17715: __typename, alias17716: __typename, alias17717: __typename, alias17718: __typename, alias17719: __typename, alias17720: __typename, alias17721: __typename, alias17722: __typename, alias17723: __typename, alias17724: __typename, alias17725: __typename, alias17726: __typename, alias17727: __typename, alias17728: __typename, alias17729: __typename, alias17730: __typename, alias17731: __typename, alias17732: __typename, alias17733: __typename, alias17734: __typename, alias17735: __typename, alias17736: __typename, alias17737: __typename, alias17738: __typename, alias17739: __typename, alias17740: __typename, alias17741: __typename, alias17742: __typename, alias17743: __typename, alias17744: __typename, alias17745: __typename, alias17746: __typename, alias17747: __typename, alias17748: __typename, alias17749: __typename, alias17750: __typename, alias17751: __typename, alias17752: __typename, alias17753: __typename, alias17754: __typename, alias17755: __typename, alias17756: __typename, alias17757: __typename, alias17758: __typename, alias17759: __typename, alias17760: __typename, alias17761: __typename, alias17762: __typename, alias17763: __typename, alias17764: __typename, alias17765: __typename, alias17766: __typename, alias17767: __typename, alias17768: __typename, alias17769: __typename, alias17770: __typename, alias17771: __typename, alias17772: __typename, alias17773: __typename, alias17774: __typename, alias17775: __typename, alias17776: __typename, alias17777: __typename, alias17778: __typename, alias17779: __typename, alias17780: __typename, alias17781: __typename, alias17782: __typename, alias17783: __typename, alias17784: __typename, alias17785: __typename, alias17786: __typename, alias17787: __typename, alias17788: __typename, alias17789: __typename, alias17790: __typename, alias17791: __typename, alias17792: __typename, alias17793: __typename, alias17794: __typename, alias17795: __typename, alias17796: __typename, alias17797: __typename, alias17798: __typename, alias17799: __typename, alias17800: __typename, alias17801: __typename, alias17802: __typename, alias17803: __typename, alias17804: __typename, alias17805: __typename, alias17806: __typename, alias17807: __typename, alias17808: __typename, alias17809: __typename, alias17810: __typename, alias17811: __typename, alias17812: __typename, alias17813: __typename, alias17814: __typename, alias17815: __typename, alias17816: __typename, alias17817: __typename, alias17818: __typename, alias17819: __typename, alias17820: __typename, alias17821: __typename, alias17822: __typename, alias17823: __typename, alias17824: __typename, alias17825: __typename, alias17826: __typename, alias17827: __typename, alias17828: __typename, alias17829: __typename, alias17830: __typename, alias17831: __typename, alias17832: __typename, alias17833: __typename, alias17834: __typename, alias17835: __typename, alias17836: __typename, alias17837: __typename, alias17838: __typename, alias17839: __typename, alias17840: __typename, alias17841: __typename, alias17842: __typename, alias17843: __typename, alias17844: __typename, alias17845: __typename, alias17846: __typename, alias17847: __typename, alias17848: __typename, alias17849: __typename, alias17850: __typename, alias17851: __typename, alias17852: __typename, alias17853: __typename, alias17854: __typename, alias17855: __typename, alias17856: __typename, alias17857: __typename, alias17858: __typename, alias17859: __typename, alias17860: __typename, alias17861: __typename, alias17862: __typename, alias17863: __typename, alias17864: __typename, alias17865: __typename, alias17866: __typename, alias17867: __typename, alias17868: __typename, alias17869: __typename, alias17870: __typename, alias17871: __typename, alias17872: __typename, alias17873: __typename, alias17874: __typename, alias17875: __typename, alias17876: __typename, alias17877: __typename, alias17878: __typename, alias17879: __typename, alias17880: __typename, alias17881: __typename, alias17882: __typename, alias17883: __typename, alias17884: __typename, alias17885: __typename, alias17886: __typename, alias17887: __typename, alias17888: __typename, alias17889: __typename, alias17890: __typename, alias17891: __typename, alias17892: __typename, alias17893: __typename, alias17894: __typename, alias17895: __typename, alias17896: __typename, alias17897: __typename, alias17898: __typename, alias17899: __typename, alias17900: __typename, alias17901: __typename, alias17902: __typename, alias17903: __typename, alias17904: __typename, alias17905: __typename, alias17906: __typename, alias17907: __typename, alias17908: __typename, alias17909: __typename, alias17910: __typename, alias17911: __typename, alias17912: __typename, alias17913: __typename, alias17914: __typename, alias17915: __typename, alias17916: __typename, alias17917: __typename, alias17918: __typename, alias17919: __typename, alias17920: __typename, alias17921: __typename, alias17922: __typename, alias17923: __typename, alias17924: __typename, alias17925: __typename, alias17926: __typename, alias17927: __typename, alias17928: __typename, alias17929: __typename, alias17930: __typename, alias17931: __typename, alias17932: __typename, alias17933: __typename, alias17934: __typename, alias17935: __typename, alias17936: __typename, alias17937: __typename, alias17938: __typename, alias17939: __typename, alias17940: __typename, alias17941: __typename, alias17942: __typename, alias17943: __typename, alias17944: __typename, alias17945: __typename, alias17946: __typename, alias17947: __typename, alias17948: __typename, alias17949: __typename, alias17950: __typename, alias17951: __typename, alias17952: __typename, alias17953: __typename, alias17954: __typename, alias17955: __typename, alias17956: __typename, alias17957: __typename, alias17958: __typename, alias17959: __typename, alias17960: __typename, alias17961: __typename, alias17962: __typename, alias17963: __typename, alias17964: __typename, alias17965: __typename, alias17966: __typename, alias17967: __typename, alias17968: __typename, alias17969: __typename, alias17970: __typename, alias17971: __typename, alias17972: __typename, alias17973: __typename, alias17974: __typename, alias17975: __typename, alias17976: __typename, alias17977: __typename, alias17978: __typename, alias17979: __typename, alias17980: __typename, alias17981: __typename, alias17982: __typename, alias17983: __typename, alias17984: __typename, alias17985: __typename, alias17986: __typename, alias17987: __typename, alias17988: __typename, alias17989: __typename, alias17990: __typename, alias17991: __typename, alias17992: __typename, alias17993: __typename, alias17994: __typename, alias17995: __typename, alias17996: __typename, alias17997: __typename, alias17998: __typename, alias17999: __typename, alias18000: __typename, alias18001: __typename, alias18002: __typename, alias18003: __typename, alias18004: __typename, alias18005: __typename, alias18006: __typename, alias18007: __typename, alias18008: __typename, alias18009: __typename, alias18010: __typename, alias18011: __typename, alias18012: __typename, alias18013: __typename, alias18014: __typename, alias18015: __typename, alias18016: __typename, alias18017: __typename, alias18018: __typename, alias18019: __typename, alias18020: __typename, alias18021: __typename, alias18022: __typename, alias18023: __typename, alias18024: __typename, alias18025: __typename, alias18026: __typename, alias18027: __typename, alias18028: __typename, alias18029: __typename, alias18030: __typename, alias18031: __typename, alias18032: __typename, alias18033: __typename, alias18034: __typename, alias18035: __typename, alias18036: __typename, alias18037: __typename, alias18038: __typename, alias18039: __typename, alias18040: __typename, alias18041: __typename, alias18042: __typename, alias18043: __typename, alias18044: __typename, alias18045: __typename, alias18046: __typename, alias18047: __typename, alias18048: __typename, alias18049: __typename, alias18050: __typename, alias18051: __typename, alias18052: __typename, alias18053: __typename, alias18054: __typename, alias18055: __typename, alias18056: __typename, alias18057: __typename, alias18058: __typename, alias18059: __typename, alias18060: __typename, alias18061: __typename, alias18062: __typename, alias18063: __typename, alias18064: __typename, alias18065: __typename, alias18066: __typename, alias18067: __typename, alias18068: __typename, alias18069: __typename, alias18070: __typename, alias18071: __typename, alias18072: __typename, alias18073: __typename, alias18074: __typename, alias18075: __typename, alias18076: __typename, alias18077: __typename, alias18078: __typename, alias18079: __typename, alias18080: __typename, alias18081: __typename, alias18082: __typename, alias18083: __typename, alias18084: __typename, alias18085: __typename, alias18086: __typename, alias18087: __typename, alias18088: __typename, alias18089: __typename, alias18090: __typename, alias18091: __typename, alias18092: __typename, alias18093: __typename, alias18094: __typename, alias18095: __typename, alias18096: __typename, alias18097: __typename, alias18098: __typename, alias18099: __typename, alias18100: __typename, alias18101: __typename, alias18102: __typename, alias18103: __typename, alias18104: __typename, alias18105: __typename, alias18106: __typename, alias18107: __typename, alias18108: __typename, alias18109: __typename, alias18110: __typename, alias18111: __typename, alias18112: __typename, alias18113: __typename, alias18114: __typename, alias18115: __typename, alias18116: __typename, alias18117: __typename, alias18118: __typename, alias18119: __typename, alias18120: __typename, alias18121: __typename, alias18122: __typename, alias18123: __typename, alias18124: __typename, alias18125: __typename, alias18126: __typename, alias18127: __typename, alias18128: __typename, alias18129: __typename, alias18130: __typename, alias18131: __typename, alias18132: __typename, alias18133: __typename, alias18134: __typename, alias18135: __typename, alias18136: __typename, alias18137: __typename, alias18138: __typename, alias18139: __typename, alias18140: __typename, alias18141: __typename, alias18142: __typename, alias18143: __typename, alias18144: __typename, alias18145: __typename, alias18146: __typename, alias18147: __typename, alias18148: __typename, alias18149: __typename, alias18150: __typename, alias18151: __typename, alias18152: __typename, alias18153: __typename, alias18154: __typename, alias18155: __typename, alias18156: __typename, alias18157: __typename, alias18158: __typename, alias18159: __typename, alias18160: __typename, alias18161: __typename, alias18162: __typename, alias18163: __typename, alias18164: __typename, alias18165: __typename, alias18166: __typename, alias18167: __typename, alias18168: __typename, alias18169: __typename, alias18170: __typename, alias18171: __typename, alias18172: __typename, alias18173: __typename, alias18174: __typename, alias18175: __typename, alias18176: __typename, alias18177: __typename, alias18178: __typename, alias18179: __typename, alias18180: __typename, alias18181: __typename, alias18182: __typename, alias18183: __typename, alias18184: __typename, alias18185: __typename, alias18186: __typename, alias18187: __typename, alias18188: __typename, alias18189: __typename, alias18190: __typename, alias18191: __typename, alias18192: __typename, alias18193: __typename, alias18194: __typename, alias18195: __typename, alias18196: __typename, alias18197: __typename, alias18198: __typename, alias18199: __typename, alias18200: __typename, alias18201: __typename, alias18202: __typename, alias18203: __typename, alias18204: __typename, alias18205: __typename, alias18206: __typename, alias18207: __typename, alias18208: __typename, alias18209: __typename, alias18210: __typename, alias18211: __typename, alias18212: __typename, alias18213: __typename, alias18214: __typename, alias18215: __typename, alias18216: __typename, alias18217: __typename, alias18218: __typename, alias18219: __typename, alias18220: __typename, alias18221: __typename, alias18222: __typename, alias18223: __typename, alias18224: __typename, alias18225: __typename, alias18226: __typename, alias18227: __typename, alias18228: __typename, alias18229: __typename, alias18230: __typename, alias18231: __typename, alias18232: __typename, alias18233: __typename, alias18234: __typename, alias18235: __typename, alias18236: __typename, alias18237: __typename, alias18238: __typename, alias18239: __typename, alias18240: __typename, alias18241: __typename, alias18242: __typename, alias18243: __typename, alias18244: __typename, alias18245: __typename, alias18246: __typename, alias18247: __typename, alias18248: __typename, alias18249: __typename, alias18250: __typename, alias18251: __typename, alias18252: __typename, alias18253: __typename, alias18254: __typename, alias18255: __typename, alias18256: __typename, alias18257: __typename, alias18258: __typename, alias18259: __typename, alias18260: __typename, alias18261: __typename, alias18262: __typename, alias18263: __typename, alias18264: __typename, alias18265: __typename, alias18266: __typename, alias18267: __typename, alias18268: __typename, alias18269: __typename, alias18270: __typename, alias18271: __typename, alias18272: __typename, alias18273: __typename, alias18274: __typename, alias18275: __typename, alias18276: __typename, alias18277: __typename, alias18278: __typename, alias18279: __typename, alias18280: __typename, alias18281: __typename, alias18282: __typename, alias18283: __typename, alias18284: __typename, alias18285: __typename, alias18286: __typename, alias18287: __typename, alias18288: __typename, alias18289: __typename, alias18290: __typename, alias18291: __typename, alias18292: __typename, alias18293: __typename, alias18294: __typename, alias18295: __typename, alias18296: __typename, alias18297: __typename, alias18298: __typename, alias18299: __typename, alias18300: __typename, alias18301: __typename, alias18302: __typename, alias18303: __typename, alias18304: __typename, alias18305: __typename, alias18306: __typename, alias18307: __typename, alias18308: __typename, alias18309: __typename, alias18310: __typename, alias18311: __typename, alias18312: __typename, alias18313: __typename, alias18314: __typename, alias18315: __typename, alias18316: __typename, alias18317: __typename, alias18318: __typename, alias18319: __typename, alias18320: __typename, alias18321: __typename, alias18322: __typename, alias18323: __typename, alias18324: __typename, alias18325: __typename, alias18326: __typename, alias18327: __typename, alias18328: __typename, alias18329: __typename, alias18330: __typename, alias18331: __typename, alias18332: __typename, alias18333: __typename, alias18334: __typename, alias18335: __typename, alias18336: __typename, alias18337: __typename, alias18338: __typename, alias18339: __typename, alias18340: __typename, alias18341: __typename, alias18342: __typename, alias18343: __typename, alias18344: __typename, alias18345: __typename, alias18346: __typename, alias18347: __typename, alias18348: __typename, alias18349: __typename, alias18350: __typename, alias18351: __typename, alias18352: __typename, alias18353: __typename, alias18354: __typename, alias18355: __typename, alias18356: __typename, alias18357: __typename, alias18358: __typename, alias18359: __typename, alias18360: __typename, alias18361: __typename, alias18362: __typename, alias18363: __typename, alias18364: __typename, alias18365: __typename, alias18366: __typename, alias18367: __typename, alias18368: __typename, alias18369: __typename, alias18370: __typename, alias18371: __typename, alias18372: __typename, alias18373: __typename, alias18374: __typename, alias18375: __typename, alias18376: __typename, alias18377: __typename, alias18378: __typename, alias18379: __typename, alias18380: __typename, alias18381: __typename, alias18382: __typename, alias18383: __typename, alias18384: __typename, alias18385: __typename, alias18386: __typename, alias18387: __typename, alias18388: __typename, alias18389: __typename, alias18390: __typename, alias18391: __typename, alias18392: __typename, alias18393: __typename, alias18394: __typename, alias18395: __typename, alias18396: __typename, alias18397: __typename, alias18398: __typename, alias18399: __typename, alias18400: __typename, alias18401: __typename, alias18402: __typename, alias18403: __typename, alias18404: __typename, alias18405: __typename, alias18406: __typename, alias18407: __typename, alias18408: __typename, alias18409: __typename, alias18410: __typename, alias18411: __typename, alias18412: __typename, alias18413: __typename, alias18414: __typename, alias18415: __typename, alias18416: __typename, alias18417: __typename, alias18418: __typename, alias18419: __typename, alias18420: __typename, alias18421: __typename, alias18422: __typename, alias18423: __typename, alias18424: __typename, alias18425: __typename, alias18426: __typename, alias18427: __typename, alias18428: __typename, alias18429: __typename, alias18430: __typename, alias18431: __typename, alias18432: __typename, alias18433: __typename, alias18434: __typename, alias18435: __typename, alias18436: __typename, alias18437: __typename, alias18438: __typename, alias18439: __typename, alias18440: __typename, alias18441: __typename, alias18442: __typename, alias18443: __typename, alias18444: __typename, alias18445: __typename, alias18446: __typename, alias18447: __typename, alias18448: __typename, alias18449: __typename, alias18450: __typename, alias18451: __typename, alias18452: __typename, alias18453: __typename, alias18454: __typename, alias18455: __typename, alias18456: __typename, alias18457: __typename, alias18458: __typename, alias18459: __typename, alias18460: __typename, alias18461: __typename, alias18462: __typename, alias18463: __typename, alias18464: __typename, alias18465: __typename, alias18466: __typename, alias18467: __typename, alias18468: __typename, alias18469: __typename, alias18470: __typename, alias18471: __typename, alias18472: __typename, alias18473: __typename, alias18474: __typename, alias18475: __typename, alias18476: __typename, alias18477: __typename, alias18478: __typename, alias18479: __typename, alias18480: __typename, alias18481: __typename, alias18482: __typename, alias18483: __typename, alias18484: __typename, alias18485: __typename, alias18486: __typename, alias18487: __typename, alias18488: __typename, alias18489: __typename, alias18490: __typename, alias18491: __typename, alias18492: __typename, alias18493: __typename, alias18494: __typename, alias18495: __typename, alias18496: __typename, alias18497: __typename, alias18498: __typename, alias18499: __typename, alias18500: __typename, alias18501: __typename, alias18502: __typename, alias18503: __typename, alias18504: __typename, alias18505: __typename, alias18506: __typename, alias18507: __typename, alias18508: __typename, alias18509: __typename, alias18510: __typename, alias18511: __typename, alias18512: __typename, alias18513: __typename, alias18514: __typename, alias18515: __typename, alias18516: __typename, alias18517: __typename, alias18518: __typename, alias18519: __typename, alias18520: __typename, alias18521: __typename, alias18522: __typename, alias18523: __typename, alias18524: __typename, alias18525: __typename, alias18526: __typename, alias18527: __typename, alias18528: __typename, alias18529: __typename, alias18530: __typename, alias18531: __typename, alias18532: __typename, alias18533: __typename, alias18534: __typename, alias18535: __typename, alias18536: __typename, alias18537: __typename, alias18538: __typename, alias18539: __typename, alias18540: __typename, alias18541: __typename, alias18542: __typename, alias18543: __typename, alias18544: __typename, alias18545: __typename, alias18546: __typename, alias18547: __typename, alias18548: __typename, alias18549: __typename, alias18550: __typename, alias18551: __typename, alias18552: __typename, alias18553: __typename, alias18554: __typename, alias18555: __typename, alias18556: __typename, alias18557: __typename, alias18558: __typename, alias18559: __typename, alias18560: __typename, alias18561: __typename, alias18562: __typename, alias18563: __typename, alias18564: __typename, alias18565: __typename, alias18566: __typename, alias18567: __typename, alias18568: __typename, alias18569: __typename, alias18570: __typename, alias18571: __typename, alias18572: __typename, alias18573: __typename, alias18574: __typename, alias18575: __typename, alias18576: __typename, alias18577: __typename, alias18578: __typename, alias18579: __typename, alias18580: __typename, alias18581: __typename, alias18582: __typename, alias18583: __typename, alias18584: __typename, alias18585: __typename, alias18586: __typename, alias18587: __typename, alias18588: __typename, alias18589: __typename, alias18590: __typename, alias18591: __typename, alias18592: __typename, alias18593: __typename, alias18594: __typename, alias18595: __typename, alias18596: __typename, alias18597: __typename, alias18598: __typename, alias18599: __typename, alias18600: __typename, alias18601: __typename, alias18602: __typename, alias18603: __typename, alias18604: __typename, alias18605: __typename, alias18606: __typename, alias18607: __typename, alias18608: __typename, alias18609: __typename, alias18610: __typename, alias18611: __typename, alias18612: __typename, alias18613: __typename, alias18614: __typename, alias18615: __typename, alias18616: __typename, alias18617: __typename, alias18618: __typename, alias18619: __typename, alias18620: __typename, alias18621: __typename, alias18622: __typename, alias18623: __typename, alias18624: __typename, alias18625: __typename, alias18626: __typename, alias18627: __typename, alias18628: __typename, alias18629: __typename, alias18630: __typename, alias18631: __typename, alias18632: __typename, alias18633: __typename, alias18634: __typename, alias18635: __typename, alias18636: __typename, alias18637: __typename, alias18638: __typename, alias18639: __typename, alias18640: __typename, alias18641: __typename, alias18642: __typename, alias18643: __typename, alias18644: __typename, alias18645: __typename, alias18646: __typename, alias18647: __typename, alias18648: __typename, alias18649: __typename, alias18650: __typename, alias18651: __typename, alias18652: __typename, alias18653: __typename, alias18654: __typename, alias18655: __typename, alias18656: __typename, alias18657: __typename, alias18658: __typename, alias18659: __typename, alias18660: __typename, alias18661: __typename, alias18662: __typename, alias18663: __typename, alias18664: __typename, alias18665: __typename, alias18666: __typename, alias18667: __typename, alias18668: __typename, alias18669: __typename, alias18670: __typename, alias18671: __typename, alias18672: __typename, alias18673: __typename, alias18674: __typename, alias18675: __typename, alias18676: __typename, alias18677: __typename, alias18678: __typename, alias18679: __typename, alias18680: __typename, alias18681: __typename, alias18682: __typename, alias18683: __typename, alias18684: __typename, alias18685: __typename, alias18686: __typename, alias18687: __typename, alias18688: __typename, alias18689: __typename, alias18690: __typename, alias18691: __typename, alias18692: __typename, alias18693: __typename, alias18694: __typename, alias18695: __typename, alias18696: __typename, alias18697: __typename, alias18698: __typename, alias18699: __typename, alias18700: __typename, alias18701: __typename, alias18702: __typename, alias18703: __typename, alias18704: __typename, alias18705: __typename, alias18706: __typename, alias18707: __typename, alias18708: __typename, alias18709: __typename, alias18710: __typename, alias18711: __typename, alias18712: __typename, alias18713: __typename, alias18714: __typename, alias18715: __typename, alias18716: __typename, alias18717: __typename, alias18718: __typename, alias18719: __typename, alias18720: __typename, alias18721: __typename, alias18722: __typename, alias18723: __typename, alias18724: __typename, alias18725: __typename, alias18726: __typename, alias18727: __typename, alias18728: __typename, alias18729: __typename, alias18730: __typename, alias18731: __typename, alias18732: __typename, alias18733: __typename, alias18734: __typename, alias18735: __typename, alias18736: __typename, alias18737: __typename, alias18738: __typename, alias18739: __typename, alias18740: __typename, alias18741: __typename, alias18742: __typename, alias18743: __typename, alias18744: __typename, alias18745: __typename, alias18746: __typename, alias18747: __typename, alias18748: __typename, alias18749: __typename, alias18750: __typename, alias18751: __typename, alias18752: __typename, alias18753: __typename, alias18754: __typename, alias18755: __typename, alias18756: __typename, alias18757: __typename, alias18758: __typename, alias18759: __typename, alias18760: __typename, alias18761: __typename, alias18762: __typename, alias18763: __typename, alias18764: __typename, alias18765: __typename, alias18766: __typename, alias18767: __typename, alias18768: __typename, alias18769: __typename, alias18770: __typename, alias18771: __typename, alias18772: __typename, alias18773: __typename, alias18774: __typename, alias18775: __typename, alias18776: __typename, alias18777: __typename, alias18778: __typename, alias18779: __typename, alias18780: __typename, alias18781: __typename, alias18782: __typename, alias18783: __typename, alias18784: __typename, alias18785: __typename, alias18786: __typename, alias18787: __typename, alias18788: __typename, alias18789: __typename, alias18790: __typename, alias18791: __typename, alias18792: __typename, alias18793: __typename, alias18794: __typename, alias18795: __typename, alias18796: __typename, alias18797: __typename, alias18798: __typename, alias18799: __typename, alias18800: __typename, alias18801: __typename, alias18802: __typename, alias18803: __typename, alias18804: __typename, alias18805: __typename, alias18806: __typename, alias18807: __typename, alias18808: __typename, alias18809: __typename, alias18810: __typename, alias18811: __typename, alias18812: __typename, alias18813: __typename, alias18814: __typename, alias18815: __typename, alias18816: __typename, alias18817: __typename, alias18818: __typename, alias18819: __typename, alias18820: __typename, alias18821: __typename, alias18822: __typename, alias18823: __typename, alias18824: __typename, alias18825: __typename, alias18826: __typename, alias18827: __typename, alias18828: __typename, alias18829: __typename, alias18830: __typename, alias18831: __typename, alias18832: __typename, alias18833: __typename, alias18834: __typename, alias18835: __typename, alias18836: __typename, alias18837: __typename, alias18838: __typename, alias18839: __typename, alias18840: __typename, alias18841: __typename, alias18842: __typename, alias18843: __typename, alias18844: __typename, alias18845: __typename, alias18846: __typename, alias18847: __typename, alias18848: __typename, alias18849: __typename, alias18850: __typename, alias18851: __typename, alias18852: __typename, alias18853: __typename, alias18854: __typename, alias18855: __typename, alias18856: __typename, alias18857: __typename, alias18858: __typename, alias18859: __typename, alias18860: __typename, alias18861: __typename, alias18862: __typename, alias18863: __typename, alias18864: __typename, alias18865: __typename, alias18866: __typename, alias18867: __typename, alias18868: __typename, alias18869: __typename, alias18870: __typename, alias18871: __typename, alias18872: __typename, alias18873: __typename, alias18874: __typename, alias18875: __typename, alias18876: __typename, alias18877: __typename, alias18878: __typename, alias18879: __typename, alias18880: __typename, alias18881: __typename, alias18882: __typename, alias18883: __typename, alias18884: __typename, alias18885: __typename, alias18886: __typename, alias18887: __typename, alias18888: __typename, alias18889: __typename, alias18890: __typename, alias18891: __typename, alias18892: __typename, alias18893: __typename, alias18894: __typename, alias18895: __typename, alias18896: __typename, alias18897: __typename, alias18898: __typename, alias18899: __typename, alias18900: __typename, alias18901: __typename, alias18902: __typename, alias18903: __typename, alias18904: __typename, alias18905: __typename, alias18906: __typename, alias18907: __typename, alias18908: __typename, alias18909: __typename, alias18910: __typename, alias18911: __typename, alias18912: __typename, alias18913: __typename, alias18914: __typename, alias18915: __typename, alias18916: __typename, alias18917: __typename, alias18918: __typename, alias18919: __typename, alias18920: __typename, alias18921: __typename, alias18922: __typename, alias18923: __typename, alias18924: __typename, alias18925: __typename, alias18926: __typename, alias18927: __typename, alias18928: __typename, alias18929: __typename, alias18930: __typename, alias18931: __typename, alias18932: __typename, alias18933: __typename, alias18934: __typename, alias18935: __typename, alias18936: __typename, alias18937: __typename, alias18938: __typename, alias18939: __typename, alias18940: __typename, alias18941: __typename, alias18942: __typename, alias18943: __typename, alias18944: __typename, alias18945: __typename, alias18946: __typename, alias18947: __typename, alias18948: __typename, alias18949: __typename, alias18950: __typename, alias18951: __typename, alias18952: __typename, alias18953: __typename, alias18954: __typename, alias18955: __typename, alias18956: __typename, alias18957: __typename, alias18958: __typename, alias18959: __typename, alias18960: __typename, alias18961: __typename, alias18962: __typename, alias18963: __typename, alias18964: __typename, alias18965: __typename, alias18966: __typename, alias18967: __typename, alias18968: __typename, alias18969: __typename, alias18970: __typename, alias18971: __typename, alias18972: __typename, alias18973: __typename, alias18974: __typename, alias18975: __typename, alias18976: __typename, alias18977: __typename, alias18978: __typename, alias18979: __typename, alias18980: __typename, alias18981: __typename, alias18982: __typename, alias18983: __typename, alias18984: __typename, alias18985: __typename, alias18986: __typename, alias18987: __typename, alias18988: __typename, alias18989: __typename, alias18990: __typename, alias18991: __typename, alias18992: __typename, alias18993: __typename, alias18994: __typename, alias18995: __typename, alias18996: __typename, alias18997: __typename, alias18998: __typename, alias18999: __typename, alias19000: __typename, alias19001: __typename, alias19002: __typename, alias19003: __typename, alias19004: __typename, alias19005: __typename, alias19006: __typename, alias19007: __typename, alias19008: __typename, alias19009: __typename, alias19010: __typename, alias19011: __typename, alias19012: __typename, alias19013: __typename, alias19014: __typename, alias19015: __typename, alias19016: __typename, alias19017: __typename, alias19018: __typename, alias19019: __typename, alias19020: __typename, alias19021: __typename, alias19022: __typename, alias19023: __typename, alias19024: __typename, alias19025: __typename, alias19026: __typename, alias19027: __typename, alias19028: __typename, alias19029: __typename, alias19030: __typename, alias19031: __typename, alias19032: __typename, alias19033: __typename, alias19034: __typename, alias19035: __typename, alias19036: __typename, alias19037: __typename, alias19038: __typename, alias19039: __typename, alias19040: __typename, alias19041: __typename, alias19042: __typename, alias19043: __typename, alias19044: __typename, alias19045: __typename, alias19046: __typename, alias19047: __typename, alias19048: __typename, alias19049: __typename, alias19050: __typename, alias19051: __typename, alias19052: __typename, alias19053: __typename, alias19054: __typename, alias19055: __typename, alias19056: __typename, alias19057: __typename, alias19058: __typename, alias19059: __typename, alias19060: __typename, alias19061: __typename, alias19062: __typename, alias19063: __typename, alias19064: __typename, alias19065: __typename, alias19066: __typename, alias19067: __typename, alias19068: __typename, alias19069: __typename, alias19070: __typename, alias19071: __typename, alias19072: __typename, alias19073: __typename, alias19074: __typename, alias19075: __typename, alias19076: __typename, alias19077: __typename, alias19078: __typename, alias19079: __typename, alias19080: __typename, alias19081: __typename, alias19082: __typename, alias19083: __typename, alias19084: __typename, alias19085: __typename, alias19086: __typename, alias19087: __typename, alias19088: __typename, alias19089: __typename, alias19090: __typename, alias19091: __typename, alias19092: __typename, alias19093: __typename, alias19094: __typename, alias19095: __typename, alias19096: __typename, alias19097: __typename, alias19098: __typename, alias19099: __typename, alias19100: __typename, alias19101: __typename, alias19102: __typename, alias19103: __typename, alias19104: __typename, alias19105: __typename, alias19106: __typename, alias19107: __typename, alias19108: __typename, alias19109: __typename, alias19110: __typename, alias19111: __typename, alias19112: __typename, alias19113: __typename, alias19114: __typename, alias19115: __typename, alias19116: __typename, alias19117: __typename, alias19118: __typename, alias19119: __typename, alias19120: __typename, alias19121: __typename, alias19122: __typename, alias19123: __typename, alias19124: __typename, alias19125: __typename, alias19126: __typename, alias19127: __typename, alias19128: __typename, alias19129: __typename, alias19130: __typename, alias19131: __typename, alias19132: __typename, alias19133: __typename, alias19134: __typename, alias19135: __typename, alias19136: __typename, alias19137: __typename, alias19138: __typename, alias19139: __typename, alias19140: __typename, alias19141: __typename, alias19142: __typename, alias19143: __typename, alias19144: __typename, alias19145: __typename, alias19146: __typename, alias19147: __typename, alias19148: __typename, alias19149: __typename, alias19150: __typename, alias19151: __typename, alias19152: __typename, alias19153: __typename, alias19154: __typename, alias19155: __typename, alias19156: __typename, alias19157: __typename, alias19158: __typename, alias19159: __typename, alias19160: __typename, alias19161: __typename, alias19162: __typename, alias19163: __typename, alias19164: __typename, alias19165: __typename, alias19166: __typename, alias19167: __typename, alias19168: __typename, alias19169: __typename, alias19170: __typename, alias19171: __typename, alias19172: __typename, alias19173: __typename, alias19174: __typename, alias19175: __typename, alias19176: __typename, alias19177: __typename, alias19178: __typename, alias19179: __typename, alias19180: __typename, alias19181: __typename, alias19182: __typename, alias19183: __typename, alias19184: __typename, alias19185: __typename, alias19186: __typename, alias19187: __typename, alias19188: __typename, alias19189: __typename, alias19190: __typename, alias19191: __typename, alias19192: __typename, alias19193: __typename, alias19194: __typename, alias19195: __typename, alias19196: __typename, alias19197: __typename, alias19198: __typename, alias19199: __typename, alias19200: __typename, alias19201: __typename, alias19202: __typename, alias19203: __typename, alias19204: __typename, alias19205: __typename, alias19206: __typename, alias19207: __typename, alias19208: __typename, alias19209: __typename, alias19210: __typename, alias19211: __typename, alias19212: __typename, alias19213: __typename, alias19214: __typename, alias19215: __typename, alias19216: __typename, alias19217: __typename, alias19218: __typename, alias19219: __typename, alias19220: __typename, alias19221: __typename, alias19222: __typename, alias19223: __typename, alias19224: __typename, alias19225: __typename, alias19226: __typename, alias19227: __typename, alias19228: __typename, alias19229: __typename, alias19230: __typename, alias19231: __typename, alias19232: __typename, alias19233: __typename, alias19234: __typename, alias19235: __typename, alias19236: __typename, alias19237: __typename, alias19238: __typename, alias19239: __typename, alias19240: __typename, alias19241: __typename, alias19242: __typename, alias19243: __typename, alias19244: __typename, alias19245: __typename, alias19246: __typename, alias19247: __typename, alias19248: __typename, alias19249: __typename, alias19250: __typename, alias19251: __typename, alias19252: __typename, alias19253: __typename, alias19254: __typename, alias19255: __typename, alias19256: __typename, alias19257: __typename, alias19258: __typename, alias19259: __typename, alias19260: __typename, alias19261: __typename, alias19262: __typename, alias19263: __typename, alias19264: __typename, alias19265: __typename, alias19266: __typename, alias19267: __typename, alias19268: __typename, alias19269: __typename, alias19270: __typename, alias19271: __typename, alias19272: __typename, alias19273: __typename, alias19274: __typename, alias19275: __typename, alias19276: __typename, alias19277: __typename, alias19278: __typename, alias19279: __typename, alias19280: __typename, alias19281: __typename, alias19282: __typename, alias19283: __typename, alias19284: __typename, alias19285: __typename, alias19286: __typename, alias19287: __typename, alias19288: __typename, alias19289: __typename, alias19290: __typename, alias19291: __typename, alias19292: __typename, alias19293: __typename, alias19294: __typename, alias19295: __typename, alias19296: __typename, alias19297: __typename, alias19298: __typename, alias19299: __typename, alias19300: __typename, alias19301: __typename, alias19302: __typename, alias19303: __typename, alias19304: __typename, alias19305: __typename, alias19306: __typename, alias19307: __typename, alias19308: __typename, alias19309: __typename, alias19310: __typename, alias19311: __typename, alias19312: __typename, alias19313: __typename, alias19314: __typename, alias19315: __typename, alias19316: __typename, alias19317: __typename, alias19318: __typename, alias19319: __typename, alias19320: __typename, alias19321: __typename, alias19322: __typename, alias19323: __typename, alias19324: __typename, alias19325: __typename, alias19326: __typename, alias19327: __typename, alias19328: __typename, alias19329: __typename, alias19330: __typename, alias19331: __typename, alias19332: __typename, alias19333: __typename, alias19334: __typename, alias19335: __typename, alias19336: __typename, alias19337: __typename, alias19338: __typename, alias19339: __typename, alias19340: __typename, alias19341: __typename, alias19342: __typename, alias19343: __typename, alias19344: __typename, alias19345: __typename, alias19346: __typename, alias19347: __typename, alias19348: __typename, alias19349: __typename, alias19350: __typename, alias19351: __typename, alias19352: __typename, alias19353: __typename, alias19354: __typename, alias19355: __typename, alias19356: __typename, alias19357: __typename, alias19358: __typename, alias19359: __typename, alias19360: __typename, alias19361: __typename, alias19362: __typename, alias19363: __typename, alias19364: __typename, alias19365: __typename, alias19366: __typename, alias19367: __typename, alias19368: __typename, alias19369: __typename, alias19370: __typename, alias19371: __typename, alias19372: __typename, alias19373: __typename, alias19374: __typename, alias19375: __typename, alias19376: __typename, alias19377: __typename, alias19378: __typename, alias19379: __typename, alias19380: __typename, alias19381: __typename, alias19382: __typename, alias19383: __typename, alias19384: __typename, alias19385: __typename, alias19386: __typename, alias19387: __typename, alias19388: __typename, alias19389: __typename, alias19390: __typename, alias19391: __typename, alias19392: __typename, alias19393: __typename, alias19394: __typename, alias19395: __typename, alias19396: __typename, alias19397: __typename, alias19398: __typename, alias19399: __typename, alias19400: __typename, alias19401: __typename, alias19402: __typename, alias19403: __typename, alias19404: __typename, alias19405: __typename, alias19406: __typename, alias19407: __typename, alias19408: __typename, alias19409: __typename, alias19410: __typename, alias19411: __typename, alias19412: __typename, alias19413: __typename, alias19414: __typename, alias19415: __typename, alias19416: __typename, alias19417: __typename, alias19418: __typename, alias19419: __typename, alias19420: __typename, alias19421: __typename, alias19422: __typename, alias19423: __typename, alias19424: __typename, alias19425: __typename, alias19426: __typename, alias19427: __typename, alias19428: __typename, alias19429: __typename, alias19430: __typename, alias19431: __typename, alias19432: __typename, alias19433: __typename, alias19434: __typename, alias19435: __typename, alias19436: __typename, alias19437: __typename, alias19438: __typename, alias19439: __typename, alias19440: __typename, alias19441: __typename, alias19442: __typename, alias19443: __typename, alias19444: __typename, alias19445: __typename, alias19446: __typename, alias19447: __typename, alias19448: __typename, alias19449: __typename, alias19450: __typename, alias19451: __typename, alias19452: __typename, alias19453: __typename, alias19454: __typename, alias19455: __typename, alias19456: __typename, alias19457: __typename, alias19458: __typename, alias19459: __typename, alias19460: __typename, alias19461: __typename, alias19462: __typename, alias19463: __typename, alias19464: __typename, alias19465: __typename, alias19466: __typename, alias19467: __typename, alias19468: __typename, alias19469: __typename, alias19470: __typename, alias19471: __typename, alias19472: __typename, alias19473: __typename, alias19474: __typename, alias19475: __typename, alias19476: __typename, alias19477: __typename, alias19478: __typename, alias19479: __typename, alias19480: __typename, alias19481: __typename, alias19482: __typename, alias19483: __typename, alias19484: __typename, alias19485: __typename, alias19486: __typename, alias19487: __typename, alias19488: __typename, alias19489: __typename, alias19490: __typename, alias19491: __typename, alias19492: __typename, alias19493: __typename, alias19494: __typename, alias19495: __typename, alias19496: __typename, alias19497: __typename, alias19498: __typename, alias19499: __typename, alias19500: __typename, alias19501: __typename, alias19502: __typename, alias19503: __typename, alias19504: __typename, alias19505: __typename, alias19506: __typename, alias19507: __typename, alias19508: __typename, alias19509: __typename, alias19510: __typename, alias19511: __typename, alias19512: __typename, alias19513: __typename, alias19514: __typename, alias19515: __typename, alias19516: __typename, alias19517: __typename, alias19518: __typename, alias19519: __typename, alias19520: __typename, alias19521: __typename, alias19522: __typename, alias19523: __typename, alias19524: __typename, alias19525: __typename, alias19526: __typename, alias19527: __typename, alias19528: __typename, alias19529: __typename, alias19530: __typename, alias19531: __typename, alias19532: __typename, alias19533: __typename, alias19534: __typename, alias19535: __typename, alias19536: __typename, alias19537: __typename, alias19538: __typename, alias19539: __typename, alias19540: __typename, alias19541: __typename, alias19542: __typename, alias19543: __typename, alias19544: __typename, alias19545: __typename, alias19546: __typename, alias19547: __typename, alias19548: __typename, alias19549: __typename, alias19550: __typename, alias19551: __typename, alias19552: __typename, alias19553: __typename, alias19554: __typename, alias19555: __typename, alias19556: __typename, alias19557: __typename, alias19558: __typename, alias19559: __typename, alias19560: __typename, alias19561: __typename, alias19562: __typename, alias19563: __typename, alias19564: __typename, alias19565: __typename, alias19566: __typename, alias19567: __typename, alias19568: __typename, alias19569: __typename, alias19570: __typename, alias19571: __typename, alias19572: __typename, alias19573: __typename, alias19574: __typename, alias19575: __typename, alias19576: __typename, alias19577: __typename, alias19578: __typename, alias19579: __typename, alias19580: __typename, alias19581: __typename, alias19582: __typename, alias19583: __typename, alias19584: __typename, alias19585: __typename, alias19586: __typename, alias19587: __typename, alias19588: __typename, alias19589: __typename, alias19590: __typename, alias19591: __typename, alias19592: __typename, alias19593: __typename, alias19594: __typename, alias19595: __typename, alias19596: __typename, alias19597: __typename, alias19598: __typename, alias19599: __typename, alias19600: __typename, alias19601: __typename, alias19602: __typename, alias19603: __typename, alias19604: __typename, alias19605: __typename, alias19606: __typename, alias19607: __typename, alias19608: __typename, alias19609: __typename, alias19610: __typename, alias19611: __typename, alias19612: __typename, alias19613: __typename, alias19614: __typename, alias19615: __typename, alias19616: __typename, alias19617: __typename, alias19618: __typename, alias19619: __typename, alias19620: __typename, alias19621: __typename, alias19622: __typename, alias19623: __typename, alias19624: __typename, alias19625: __typename, alias19626: __typename, alias19627: __typename, alias19628: __typename, alias19629: __typename, alias19630: __typename, alias19631: __typename, alias19632: __typename, alias19633: __typename, alias19634: __typename, alias19635: __typename, alias19636: __typename, alias19637: __typename, alias19638: __typename, alias19639: __typename, alias19640: __typename, alias19641: __typename, alias19642: __typename, alias19643: __typename, alias19644: __typename, alias19645: __typename, alias19646: __typename, alias19647: __typename, alias19648: __typename, alias19649: __typename, alias19650: __typename, alias19651: __typename, alias19652: __typename, alias19653: __typename, alias19654: __typename, alias19655: __typename, alias19656: __typename, alias19657: __typename, alias19658: __typename, alias19659: __typename, alias19660: __typename, alias19661: __typename, alias19662: __typename, alias19663: __typename, alias19664: __typename, alias19665: __typename, alias19666: __typename, alias19667: __typename, alias19668: __typename, alias19669: __typename, alias19670: __typename, alias19671: __typename, alias19672: __typename, alias19673: __typename, alias19674: __typename, alias19675: __typename, alias19676: __typename, alias19677: __typename, alias19678: __typename, alias19679: __typename, alias19680: __typename, alias19681: __typename, alias19682: __typename, alias19683: __typename, alias19684: __typename, alias19685: __typename, alias19686: __typename, alias19687: __typename, alias19688: __typename, alias19689: __typename, alias19690: __typename, alias19691: __typename, alias19692: __typename, alias19693: __typename, alias19694: __typename, alias19695: __typename, alias19696: __typename, alias19697: __typename, alias19698: __typename, alias19699: __typename, alias19700: __typename, alias19701: __typename, alias19702: __typename, alias19703: __typename, alias19704: __typename, alias19705: __typename, alias19706: __typename, alias19707: __typename, alias19708: __typename, alias19709: __typename, alias19710: __typename, alias19711: __typename, alias19712: __typename, alias19713: __typename, alias19714: __typename, alias19715: __typename, alias19716: __typename, alias19717: __typename, alias19718: __typename, alias19719: __typename, alias19720: __typename, alias19721: __typename, alias19722: __typename, alias19723: __typename, alias19724: __typename, alias19725: __typename, alias19726: __typename, alias19727: __typename, alias19728: __typename, alias19729: __typename, alias19730: __typename, alias19731: __typename, alias19732: __typename, alias19733: __typename, alias19734: __typename, alias19735: __typename, alias19736: __typename, alias19737: __typename, alias19738: __typename, alias19739: __typename, alias19740: __typename, alias19741: __typename, alias19742: __typename, alias19743: __typename, alias19744: __typename, alias19745: __typename, alias19746: __typename, alias19747: __typename, alias19748: __typename, alias19749: __typename, alias19750: __typename, alias19751: __typename, alias19752: __typename, alias19753: __typename, alias19754: __typename, alias19755: __typename, alias19756: __typename, alias19757: __typename, alias19758: __typename, alias19759: __typename, alias19760: __typename, alias19761: __typename, alias19762: __typename, alias19763: __typename, alias19764: __typename, alias19765: __typename, alias19766: __typename, alias19767: __typename, alias19768: __typename, alias19769: __typename, alias19770: __typename, alias19771: __typename, alias19772: __typename, alias19773: __typename, alias19774: __typename, alias19775: __typename, alias19776: __typename, alias19777: __typename, alias19778: __typename, alias19779: __typename, alias19780: __typename, alias19781: __typename, alias19782: __typename, alias19783: __typename, alias19784: __typename, alias19785: __typename, alias19786: __typename, alias19787: __typename, alias19788: __typename, alias19789: __typename, alias19790: __typename, alias19791: __typename, alias19792: __typename, alias19793: __typename, alias19794: __typename, alias19795: __typename, alias19796: __typename, alias19797: __typename, alias19798: __typename, alias19799: __typename, alias19800: __typename, alias19801: __typename, alias19802: __typename, alias19803: __typename, alias19804: __typename, alias19805: __typename, alias19806: __typename, alias19807: __typename, alias19808: __typename, alias19809: __typename, alias19810: __typename, alias19811: __typename, alias19812: __typename, alias19813: __typename, alias19814: __typename, alias19815: __typename, alias19816: __typename, alias19817: __typename, alias19818: __typename, alias19819: __typename, alias19820: __typename, alias19821: __typename, alias19822: __typename, alias19823: __typename, alias19824: __typename, alias19825: __typename, alias19826: __typename, alias19827: __typename, alias19828: __typename, alias19829: __typename, alias19830: __typename, alias19831: __typename, alias19832: __typename, alias19833: __typename, alias19834: __typename, alias19835: __typename, alias19836: __typename, alias19837: __typename, alias19838: __typename, alias19839: __typename, alias19840: __typename, alias19841: __typename, alias19842: __typename, alias19843: __typename, alias19844: __typename, alias19845: __typename, alias19846: __typename, alias19847: __typename, alias19848: __typename, alias19849: __typename, alias19850: __typename, alias19851: __typename, alias19852: __typename, alias19853: __typename, alias19854: __typename, alias19855: __typename, alias19856: __typename, alias19857: __typename, alias19858: __typename, alias19859: __typename, alias19860: __typename, alias19861: __typename, alias19862: __typename, alias19863: __typename, alias19864: __typename, alias19865: __typename, alias19866: __typename, alias19867: __typename, alias19868: __typename, alias19869: __typename, alias19870: __typename, alias19871: __typename, alias19872: __typename, alias19873: __typename, alias19874: __typename, alias19875: __typename, alias19876: __typename, alias19877: __typename, alias19878: __typename, alias19879: __typename, alias19880: __typename, alias19881: __typename, alias19882: __typename, alias19883: __typename, alias19884: __typename, alias19885: __typename, alias19886: __typename, alias19887: __typename, alias19888: __typename, alias19889: __typename, alias19890: __typename, alias19891: __typename, alias19892: __typename, alias19893: __typename, alias19894: __typename, alias19895: __typename, alias19896: __typename, alias19897: __typename, alias19898: __typename, alias19899: __typename, alias19900: __typename, alias19901: __typename, alias19902: __typename, alias19903: __typename, alias19904: __typename, alias19905: __typename, alias19906: __typename, alias19907: __typename, alias19908: __typename, alias19909: __typename, alias19910: __typename, alias19911: __typename, alias19912: __typename, alias19913: __typename, alias19914: __typename, alias19915: __typename, alias19916: __typename, alias19917: __typename, alias19918: __typename, alias19919: __typename, alias19920: __typename, alias19921: __typename, alias19922: __typename, alias19923: __typename, alias19924: __typename, alias19925: __typename, alias19926: __typename, alias19927: __typename, alias19928: __typename, alias19929: __typename, alias19930: __typename, alias19931: __typename, alias19932: __typename, alias19933: __typename, alias19934: __typename, alias19935: __typename, alias19936: __typename, alias19937: __typename, alias19938: __typename, alias19939: __typename, alias19940: __typename, alias19941: __typename, alias19942: __typename, alias19943: __typename, alias19944: __typename, alias19945: __typename, alias19946: __typename, alias19947: __typename, alias19948: __typename, alias19949: __typename, alias19950: __typename, alias19951: __typename, alias19952: __typename, alias19953: __typename, alias19954: __typename, alias19955: __typename, alias19956: __typename, alias19957: __typename, alias19958: __typename, alias19959: __typename, alias19960: __typename, alias19961: __typename, alias19962: __typename, alias19963: __typename, alias19964: __typename, alias19965: __typename, alias19966: __typename, alias19967: __typename, alias19968: __typename, alias19969: __typename, alias19970: __typename, alias19971: __typename, alias19972: __typename, alias19973: __typename, alias19974: __typename, alias19975: __typename, alias19976: __typename, alias19977: __typename, alias19978: __typename, alias19979: __typename, alias19980: __typename, alias19981: __typename, alias19982: __typename, alias19983: __typename, alias19984: __typename, alias19985: __typename, alias19986: __typename, alias19987: __typename, alias19988: __typename, alias19989: __typename, alias19990: __typename, alias19991: __typename, alias19992: __typename, alias19993: __typename, alias19994: __typename, alias19995: __typename, alias19996: __typename, alias19997: __typename, alias19998: __typename, alias19999: __typename, alias20000: __typename, alias20001: __typename, alias20002: __typename, alias20003: __typename, alias20004: __typename, alias20005: __typename, alias20006: __typename, alias20007: __typename, alias20008: __typename, alias20009: __typename, alias20010: __typename, alias20011: __typename, alias20012: __typename, alias20013: __typename, alias20014: __typename, alias20015: __typename, alias20016: __typename, alias20017: __typename, alias20018: __typename, alias20019: __typename, alias20020: __typename, alias20021: __typename, alias20022: __typename, alias20023: __typename, alias20024: __typename, alias20025: __typename, alias20026: __typename, alias20027: __typename, alias20028: __typename, alias20029: __typename, alias20030: __typename, alias20031: __typename, alias20032: __typename, alias20033: __typename, alias20034: __typename, alias20035: __typename, alias20036: __typename, alias20037: __typename, alias20038: __typename, alias20039: __typename, alias20040: __typename, alias20041: __typename, alias20042: __typename, alias20043: __typename, alias20044: __typename, alias20045: __typename, alias20046: __typename, alias20047: __typename, alias20048: __typename, alias20049: __typename, alias20050: __typename, alias20051: __typename, alias20052: __typename, alias20053: __typename, alias20054: __typename, alias20055: __typename, alias20056: __typename, alias20057: __typename, alias20058: __typename, alias20059: __typename, alias20060: __typename, alias20061: __typename, alias20062: __typename, alias20063: __typename, alias20064: __typename, alias20065: __typename, alias20066: __typename, alias20067: __typename, alias20068: __typename, alias20069: __typename, alias20070: __typename, alias20071: __typename, alias20072: __typename, alias20073: __typename, alias20074: __typename, alias20075: __typename, alias20076: __typename, alias20077: __typename, alias20078: __typename, alias20079: __typename, alias20080: __typename, alias20081: __typename, alias20082: __typename, alias20083: __typename, alias20084: __typename, alias20085: __typename, alias20086: __typename, alias20087: __typename, alias20088: __typename, alias20089: __typename, alias20090: __typename, alias20091: __typename, alias20092: __typename, alias20093: __typename, alias20094: __typename, alias20095: __typename, alias20096: __typename, alias20097: __typename, alias20098: __typename, alias20099: __typename, alias20100: __typename, alias20101: __typename, alias20102: __typename, alias20103: __typename, alias20104: __typename, alias20105: __typename, alias20106: __typename, alias20107: __typename, alias20108: __typename, alias20109: __typename, alias20110: __typename, alias20111: __typename, alias20112: __typename, alias20113: __typename, alias20114: __typename, alias20115: __typename, alias20116: __typename, alias20117: __typename, alias20118: __typename, alias20119: __typename, alias20120: __typename, alias20121: __typename, alias20122: __typename, alias20123: __typename, alias20124: __typename, alias20125: __typename, alias20126: __typename, alias20127: __typename, alias20128: __typename, alias20129: __typename, alias20130: __typename, alias20131: __typename, alias20132: __typename, alias20133: __typename, alias20134: __typename, alias20135: __typename, alias20136: __typename, alias20137: __typename, alias20138: __typename, alias20139: __typename, alias20140: __typename, alias20141: __typename, alias20142: __typename, alias20143: __typename, alias20144: __typename, alias20145: __typename, alias20146: __typename, alias20147: __typename, alias20148: __typename, alias20149: __typename, alias20150: __typename, alias20151: __typename, alias20152: __typename, alias20153: __typename, alias20154: __typename, alias20155: __typename, alias20156: __typename, alias20157: __typename, alias20158: __typename, alias20159: __typename, alias20160: __typename, alias20161: __typename, alias20162: __typename, alias20163: __typename, alias20164: __typename, alias20165: __typename, alias20166: __typename, alias20167: __typename, alias20168: __typename, alias20169: __typename, alias20170: __typename, alias20171: __typename, alias20172: __typename, alias20173: __typename, alias20174: __typename, alias20175: __typename, alias20176: __typename, alias20177: __typename, alias20178: __typename, alias20179: __typename, alias20180: __typename, alias20181: __typename, alias20182: __typename, alias20183: __typename, alias20184: __typename, alias20185: __typename, alias20186: __typename, alias20187: __typename, alias20188: __typename, alias20189: __typename, alias20190: __typename, alias20191: __typename, alias20192: __typename, alias20193: __typename, alias20194: __typename, alias20195: __typename, alias20196: __typename, alias20197: __typename, alias20198: __typename, alias20199: __typename, alias20200: __typename, alias20201: __typename, alias20202: __typename, alias20203: __typename, alias20204: __typename, alias20205: __typename, alias20206: __typename, alias20207: __typename, alias20208: __typename, alias20209: __typename, alias20210: __typename, alias20211: __typename, alias20212: __typename, alias20213: __typename, alias20214: __typename, alias20215: __typename, alias20216: __typename, alias20217: __typename, alias20218: __typename, alias20219: __typename, alias20220: __typename, alias20221: __typename, alias20222: __typename, alias20223: __typename, alias20224: __typename, alias20225: __typename, alias20226: __typename, alias20227: __typename, alias20228: __typename, alias20229: __typename, alias20230: __typename, alias20231: __typename, alias20232: __typename, alias20233: __typename, alias20234: __typename, alias20235: __typename, alias20236: __typename, alias20237: __typename, alias20238: __typename, alias20239: __typename, alias20240: __typename, alias20241: __typename, alias20242: __typename, alias20243: __typename, alias20244: __typename, alias20245: __typename, alias20246: __typename, alias20247: __typename, alias20248: __typename, alias20249: __typename, alias20250: __typename, alias20251: __typename, alias20252: __typename, alias20253: __typename, alias20254: __typename, alias20255: __typename, alias20256: __typename, alias20257: __typename, alias20258: __typename, alias20259: __typename, alias20260: __typename, alias20261: __typename, alias20262: __typename, alias20263: __typename, alias20264: __typename, alias20265: __typename, alias20266: __typename, alias20267: __typename, alias20268: __typename, alias20269: __typename, alias20270: __typename, alias20271: __typename, alias20272: __typename, alias20273: __typename, alias20274: __typename, alias20275: __typename, alias20276: __typename, alias20277: __typename, alias20278: __typename, alias20279: __typename, alias20280: __typename, alias20281: __typename, alias20282: __typename, alias20283: __typename, alias20284: __typename, alias20285: __typename, alias20286: __typename, alias20287: __typename, alias20288: __typename, alias20289: __typename, alias20290: __typename, alias20291: __typename, alias20292: __typename, alias20293: __typename, alias20294: __typename, alias20295: __typename, alias20296: __typename, alias20297: __typename, alias20298: __typename, alias20299: __typename, alias20300: __typename, alias20301: __typename, alias20302: __typename, alias20303: __typename, alias20304: __typename, alias20305: __typename, alias20306: __typename, alias20307: __typename, alias20308: __typename, alias20309: __typename, alias20310: __typename, alias20311: __typename, alias20312: __typename, alias20313: __typename, alias20314: __typename, alias20315: __typename, alias20316: __typename, alias20317: __typename, alias20318: __typename, alias20319: __typename, alias20320: __typename, alias20321: __typename, alias20322: __typename, alias20323: __typename, alias20324: __typename, alias20325: __typename, alias20326: __typename, alias20327: __typename, alias20328: __typename, alias20329: __typename, alias20330: __typename, alias20331: __typename, alias20332: __typename, alias20333: __typename, alias20334: __typename, alias20335: __typename, alias20336: __typename, alias20337: __typename, alias20338: __typename, alias20339: __typename, alias20340: __typename, alias20341: __typename, alias20342: __typename, alias20343: __typename, alias20344: __typename, alias20345: __typename, alias20346: __typename, alias20347: __typename, alias20348: __typename, alias20349: __typename, alias20350: __typename, alias20351: __typename, alias20352: __typename, alias20353: __typename, alias20354: __typename, alias20355: __typename, alias20356: __typename, alias20357: __typename, alias20358: __typename, alias20359: __typename, alias20360: __typename, alias20361: __typename, alias20362: __typename, alias20363: __typename, alias20364: __typename, alias20365: __typename, alias20366: __typename, alias20367: __typename, alias20368: __typename, alias20369: __typename, alias20370: __typename, alias20371: __typename, alias20372: __typename, alias20373: __typename, alias20374: __typename, alias20375: __typename, alias20376: __typename, alias20377: __typename, alias20378: __typename, alias20379: __typename, alias20380: __typename, alias20381: __typename, alias20382: __typename, alias20383: __typename, alias20384: __typename, alias20385: __typename, alias20386: __typename, alias20387: __typename, alias20388: __typename, alias20389: __typename, alias20390: __typename, alias20391: __typename, alias20392: __typename, alias20393: __typename, alias20394: __typename, alias20395: __typename, alias20396: __typename, alias20397: __typename, alias20398: __typename, alias20399: __typename, alias20400: __typename, alias20401: __typename, alias20402: __typename, alias20403: __typename, alias20404: __typename, alias20405: __typename, alias20406: __typename, alias20407: __typename, alias20408: __typename, alias20409: __typename, alias20410: __typename, alias20411: __typename, alias20412: __typename, alias20413: __typename, alias20414: __typename, alias20415: __typename, alias20416: __typename, alias20417: __typename, alias20418: __typename, alias20419: __typename, alias20420: __typename, alias20421: __typename, alias20422: __typename, alias20423: __typename, alias20424: __typename, alias20425: __typename, alias20426: __typename, alias20427: __typename, alias20428: __typename, alias20429: __typename, alias20430: __typename, alias20431: __typename, alias20432: __typename, alias20433: __typename, alias20434: __typename, alias20435: __typename, alias20436: __typename, alias20437: __typename, alias20438: __typename, alias20439: __typename, alias20440: __typename, alias20441: __typename, alias20442: __typename, alias20443: __typename, alias20444: __typename, alias20445: __typename, alias20446: __typename, alias20447: __typename, alias20448: __typename, alias20449: __typename, alias20450: __typename, alias20451: __typename, alias20452: __typename, alias20453: __typename, alias20454: __typename, alias20455: __typename, alias20456: __typename, alias20457: __typename, alias20458: __typename, alias20459: __typename, alias20460: __typename, alias20461: __typename, alias20462: __typename, alias20463: __typename, alias20464: __typename, alias20465: __typename, alias20466: __typename, alias20467: __typename, alias20468: __typename, alias20469: __typename, alias20470: __typename, alias20471: __typename, alias20472: __typename, alias20473: __typename, alias20474: __typename, alias20475: __typename, alias20476: __typename, alias20477: __typename, alias20478: __typename, alias20479: __typename, alias20480: __typename, alias20481: __typename, alias20482: __typename, alias20483: __typename, alias20484: __typename, alias20485: __typename, alias20486: __typename, alias20487: __typename, alias20488: __typename, alias20489: __typename, alias20490: __typename, alias20491: __typename, alias20492: __typename, alias20493: __typename, alias20494: __typename, alias20495: __typename, alias20496: __typename, alias20497: __typename, alias20498: __typename, alias20499: __typename, alias20500: __typename, alias20501: __typename, alias20502: __typename, alias20503: __typename, alias20504: __typename, alias20505: __typename, alias20506: __typename, alias20507: __typename, alias20508: __typename, alias20509: __typename, alias20510: __typename, alias20511: __typename, alias20512: __typename, alias20513: __typename, alias20514: __typename, alias20515: __typename, alias20516: __typename, alias20517: __typename, alias20518: __typename, alias20519: __typename, alias20520: __typename, alias20521: __typename, alias20522: __typename, alias20523: __typename, alias20524: __typename, alias20525: __typename, alias20526: __typename, alias20527: __typename, alias20528: __typename, alias20529: __typename, alias20530: __typename, alias20531: __typename, alias20532: __typename, alias20533: __typename, alias20534: __typename, alias20535: __typename, alias20536: __typename, alias20537: __typename, alias20538: __typename, alias20539: __typename, alias20540: __typename, alias20541: __typename, alias20542: __typename, alias20543: __typename, alias20544: __typename, alias20545: __typename, alias20546: __typename, alias20547: __typename, alias20548: __typename, alias20549: __typename, alias20550: __typename, alias20551: __typename, alias20552: __typename, alias20553: __typename, alias20554: __typename, alias20555: __typename, alias20556: __typename, alias20557: __typename, alias20558: __typename, alias20559: __typename, alias20560: __typename, alias20561: __typename, alias20562: __typename, alias20563: __typename, alias20564: __typename, alias20565: __typename, alias20566: __typename, alias20567: __typename, alias20568: __typename, alias20569: __typename, alias20570: __typename, alias20571: __typename, alias20572: __typename, alias20573: __typename, alias20574: __typename, alias20575: __typename, alias20576: __typename, alias20577: __typename, alias20578: __typename, alias20579: __typename, alias20580: __typename, alias20581: __typename, alias20582: __typename, alias20583: __typename, alias20584: __typename, alias20585: __typename, alias20586: __typename, alias20587: __typename, alias20588: __typename, alias20589: __typename, alias20590: __typename, alias20591: __typename, alias20592: __typename, alias20593: __typename, alias20594: __typename, alias20595: __typename, alias20596: __typename, alias20597: __typename, alias20598: __typename, alias20599: __typename, alias20600: __typename, alias20601: __typename, alias20602: __typename, alias20603: __typename, alias20604: __typename, alias20605: __typename, alias20606: __typename, alias20607: __typename, alias20608: __typename, alias20609: __typename, alias20610: __typename, alias20611: __typename, alias20612: __typename, alias20613: __typename, alias20614: __typename, alias20615: __typename, alias20616: __typename, alias20617: __typename, alias20618: __typename, alias20619: __typename, alias20620: __typename, alias20621: __typename, alias20622: __typename, alias20623: __typename, alias20624: __typename, alias20625: __typename, alias20626: __typename, alias20627: __typename, alias20628: __typename, alias20629: __typename, alias20630: __typename, alias20631: __typename, alias20632: __typename, alias20633: __typename, alias20634: __typename, alias20635: __typename, alias20636: __typename, alias20637: __typename, alias20638: __typename, alias20639: __typename, alias20640: __typename, alias20641: __typename, alias20642: __typename, alias20643: __typename, alias20644: __typename, alias20645: __typename, alias20646: __typename, alias20647: __typename, alias20648: __typename, alias20649: __typename, alias20650: __typename, alias20651: __typename, alias20652: __typename, alias20653: __typename, alias20654: __typename, alias20655: __typename, alias20656: __typename, alias20657: __typename, alias20658: __typename, alias20659: __typename, alias20660: __typename, alias20661: __typename, alias20662: __typename, alias20663: __typename, alias20664: __typename, alias20665: __typename, alias20666: __typename, alias20667: __typename, alias20668: __typename, alias20669: __typename, alias20670: __typename, alias20671: __typename, alias20672: __typename, alias20673: __typename, alias20674: __typename, alias20675: __typename, alias20676: __typename, alias20677: __typename, alias20678: __typename, alias20679: __typename, alias20680: __typename, alias20681: __typename, alias20682: __typename, alias20683: __typename, alias20684: __typename, alias20685: __typename, alias20686: __typename, alias20687: __typename, alias20688: __typename, alias20689: __typename, alias20690: __typename, alias20691: __typename, alias20692: __typename, alias20693: __typename, alias20694: __typename, alias20695: __typename, alias20696: __typename, alias20697: __typename, alias20698: __typename, alias20699: __typename, alias20700: __typename, alias20701: __typename, alias20702: __typename, alias20703: __typename, alias20704: __typename, alias20705: __typename, alias20706: __typename, alias20707: __typename, alias20708: __typename, alias20709: __typename, alias20710: __typename, alias20711: __typename, alias20712: __typename, alias20713: __typename, alias20714: __typename, alias20715: __typename, alias20716: __typename, alias20717: __typename, alias20718: __typename, alias20719: __typename, alias20720: __typename, alias20721: __typename, alias20722: __typename, alias20723: __typename, alias20724: __typename, alias20725: __typename, alias20726: __typename, alias20727: __typename, alias20728: __typename, alias20729: __typename, alias20730: __typename, alias20731: __typename, alias20732: __typename, alias20733: __typename, alias20734: __typename, alias20735: __typename, alias20736: __typename, alias20737: __typename, alias20738: __typename, alias20739: __typename, alias20740: __typename, alias20741: __typename, alias20742: __typename, alias20743: __typename, alias20744: __typename, alias20745: __typename, alias20746: __typename, alias20747: __typename, alias20748: __typename, alias20749: __typename, alias20750: __typename, alias20751: __typename, alias20752: __typename, alias20753: __typename, alias20754: __typename, alias20755: __typename, alias20756: __typename, alias20757: __typename, alias20758: __typename, alias20759: __typename, alias20760: __typename, alias20761: __typename, alias20762: __typename, alias20763: __typename, alias20764: __typename, alias20765: __typename, alias20766: __typename, alias20767: __typename, alias20768: __typename, alias20769: __typename, alias20770: __typename, alias20771: __typename, alias20772: __typename, alias20773: __typename, alias20774: __typename, alias20775: __typename, alias20776: __typename, alias20777: __typename, alias20778: __typename, alias20779: __typename, alias20780: __typename, alias20781: __typename, alias20782: __typename, alias20783: __typename, alias20784: __typename, alias20785: __typename, alias20786: __typename, alias20787: __typename, alias20788: __typename, alias20789: __typename, alias20790: __typename, alias20791: __typename, alias20792: __typename, alias20793: __typename, alias20794: __typename, alias20795: __typename, alias20796: __typename, alias20797: __typename, alias20798: __typename, alias20799: __typename, alias20800: __typename, alias20801: __typename, alias20802: __typename, alias20803: __typename, alias20804: __typename, alias20805: __typename, alias20806: __typename, alias20807: __typename, alias20808: __typename, alias20809: __typename, alias20810: __typename, alias20811: __typename, alias20812: __typename, alias20813: __typename, alias20814: __typename, alias20815: __typename, alias20816: __typename, alias20817: __typename, alias20818: __typename, alias20819: __typename, alias20820: __typename, alias20821: __typename, alias20822: __typename, alias20823: __typename, alias20824: __typename, alias20825: __typename, alias20826: __typename, alias20827: __typename, alias20828: __typename, alias20829: __typename, alias20830: __typename, alias20831: __typename, alias20832: __typename, alias20833: __typename, alias20834: __typename, alias20835: __typename, alias20836: __typename, alias20837: __typename, alias20838: __typename, alias20839: __typename, alias20840: __typename, alias20841: __typename, alias20842: __typename, alias20843: __typename, alias20844: __typename, alias20845: __typename, alias20846: __typename, alias20847: __typename, alias20848: __typename, alias20849: __typename, alias20850: __typename, alias20851: __typename, alias20852: __typename, alias20853: __typename, alias20854: __typename, alias20855: __typename, alias20856: __typename, alias20857: __typename, alias20858: __typename, alias20859: __typename, alias20860: __typename, alias20861: __typename, alias20862: __typename, alias20863: __typename, alias20864: __typename, alias20865: __typename, alias20866: __typename, alias20867: __typename, alias20868: __typename, alias20869: __typename, alias20870: __typename, alias20871: __typename, alias20872: __typename, alias20873: __typename, alias20874: __typename, alias20875: __typename, alias20876: __typename, alias20877: __typename, alias20878: __typename, alias20879: __typename, alias20880: __typename, alias20881: __typename, alias20882: __typename, alias20883: __typename, alias20884: __typename, alias20885: __typename, alias20886: __typename, alias20887: __typename, alias20888: __typename, alias20889: __typename, alias20890: __typename, alias20891: __typename, alias20892: __typename, alias20893: __typename, alias20894: __typename, alias20895: __typename, alias20896: __typename, alias20897: __typename, alias20898: __typename, alias20899: __typename, alias20900: __typename, alias20901: __typename, alias20902: __typename, alias20903: __typename, alias20904: __typename, alias20905: __typename, alias20906: __typename, alias20907: __typename, alias20908: __typename, alias20909: __typename, alias20910: __typename, alias20911: __typename, alias20912: __typename, alias20913: __typename, alias20914: __typename, alias20915: __typename, alias20916: __typename, alias20917: __typename, alias20918: __typename, alias20919: __typename, alias20920: __typename, alias20921: __typename, alias20922: __typename, alias20923: __typename, alias20924: __typename, alias20925: __typename, alias20926: __typename, alias20927: __typename, alias20928: __typename, alias20929: __typename, alias20930: __typename, alias20931: __typename, alias20932: __typename, alias20933: __typename, alias20934: __typename, alias20935: __typename, alias20936: __typename, alias20937: __typename, alias20938: __typename, alias20939: __typename, alias20940: __typename, alias20941: __typename, alias20942: __typename, alias20943: __typename, alias20944: __typename, alias20945: __typename, alias20946: __typename, alias20947: __typename, alias20948: __typename, alias20949: __typename, alias20950: __typename, alias20951: __typename, alias20952: __typename, alias20953: __typename, alias20954: __typename, alias20955: __typename, alias20956: __typename, alias20957: __typename, alias20958: __typename, alias20959: __typename, alias20960: __typename, alias20961: __typename, alias20962: __typename, alias20963: __typename, alias20964: __typename, alias20965: __typename, alias20966: __typename, alias20967: __typename, alias20968: __typename, alias20969: __typename, alias20970: __typename, alias20971: __typename, alias20972: __typename, alias20973: __typename, alias20974: __typename, alias20975: __typename, alias20976: __typename, alias20977: __typename, alias20978: __typename, alias20979: __typename, alias20980: __typename, alias20981: __typename, alias20982: __typename, alias20983: __typename, alias20984: __typename, alias20985: __typename, alias20986: __typename, alias20987: __typename, alias20988: __typename, alias20989: __typename, alias20990: __typename, alias20991: __typename, alias20992: __typename, alias20993: __typename, alias20994: __typename, alias20995: __typename, alias20996: __typename, alias20997: __typename, alias20998: __typename, alias20999: __typename, alias21000: __typename, alias21001: __typename, alias21002: __typename, alias21003: __typename, alias21004: __typename, alias21005: __typename, alias21006: __typename, alias21007: __typename, alias21008: __typename, alias21009: __typename, alias21010: __typename, alias21011: __typename, alias21012: __typename, alias21013: __typename, alias21014: __typename, alias21015: __typename, alias21016: __typename, alias21017: __typename, alias21018: __typename, alias21019: __typename, alias21020: __typename, alias21021: __typename, alias21022: __typename, alias21023: __typename, alias21024: __typename, alias21025: __typename, alias21026: __typename, alias21027: __typename, alias21028: __typename, alias21029: __typename, alias21030: __typename, alias21031: __typename, alias21032: __typename, alias21033: __typename, alias21034: __typename, alias21035: __typename, alias21036: __typename, alias21037: __typename, alias21038: __typename, alias21039: __typename, alias21040: __typename, alias21041: __typename, alias21042: __typename, alias21043: __typename, alias21044: __typename, alias21045: __typename, alias21046: __typename, alias21047: __typename, alias21048: __typename, alias21049: __typename, alias21050: __typename, alias21051: __typename, alias21052: __typename, alias21053: __typename, alias21054: __typename, alias21055: __typename, alias21056: __typename, alias21057: __typename, alias21058: __typename, alias21059: __typename, alias21060: __typename, alias21061: __typename, alias21062: __typename, alias21063: __typename, alias21064: __typename, alias21065: __typename, alias21066: __typename, alias21067: __typename, alias21068: __typename, alias21069: __typename, alias21070: __typename, alias21071: __typename, alias21072: __typename, alias21073: __typename, alias21074: __typename, alias21075: __typename, alias21076: __typename, alias21077: __typename, alias21078: __typename, alias21079: __typename, alias21080: __typename, alias21081: __typename, alias21082: __typename, alias21083: __typename, alias21084: __typename, alias21085: __typename, alias21086: __typename, alias21087: __typename, alias21088: __typename, alias21089: __typename, alias21090: __typename, alias21091: __typename, alias21092: __typename, alias21093: __typename, alias21094: __typename, alias21095: __typename, alias21096: __typename, alias21097: __typename, alias21098: __typename, alias21099: __typename, alias21100: __typename, alias21101: __typename, alias21102: __typename, alias21103: __typename, alias21104: __typename, alias21105: __typename, alias21106: __typename, alias21107: __typename, alias21108: __typename, alias21109: __typename, alias21110: __typename, alias21111: __typename, alias21112: __typename, alias21113: __typename, alias21114: __typename, alias21115: __typename, alias21116: __typename, alias21117: __typename, alias21118: __typename, alias21119: __typename, alias21120: __typename, alias21121: __typename, alias21122: __typename, alias21123: __typename, alias21124: __typename, alias21125: __typename, alias21126: __typename, alias21127: __typename, alias21128: __typename, alias21129: __typename, alias21130: __typename, alias21131: __typename, alias21132: __typename, alias21133: __typename, alias21134: __typename, alias21135: __typename, alias21136: __typename, alias21137: __typename, alias21138: __typename, alias21139: __typename, alias21140: __typename, alias21141: __typename, alias21142: __typename, alias21143: __typename, alias21144: __typename, alias21145: __typename, alias21146: __typename, alias21147: __typename, alias21148: __typename, alias21149: __typename, alias21150: __typename, alias21151: __typename, alias21152: __typename, alias21153: __typename, alias21154: __typename, alias21155: __typename, alias21156: __typename, alias21157: __typename, alias21158: __typename, alias21159: __typename, alias21160: __typename, alias21161: __typename, alias21162: __typename, alias21163: __typename, alias21164: __typename, alias21165: __typename, alias21166: __typename, alias21167: __typename, alias21168: __typename, alias21169: __typename, alias21170: __typename, alias21171: __typename, alias21172: __typename, alias21173: __typename, alias21174: __typename, alias21175: __typename, alias21176: __typename, alias21177: __typename, alias21178: __typename, alias21179: __typename, alias21180: __typename, alias21181: __typename, alias21182: __typename, alias21183: __typename, alias21184: __typename, alias21185: __typename, alias21186: __typename, alias21187: __typename, alias21188: __typename, alias21189: __typename, alias21190: __typename, alias21191: __typename, alias21192: __typename, alias21193: __typename, alias21194: __typename, alias21195: __typename, alias21196: __typename, alias21197: __typename, alias21198: __typename, alias21199: __typename, alias21200: __typename, alias21201: __typename, alias21202: __typename, alias21203: __typename, alias21204: __typename, alias21205: __typename, alias21206: __typename, alias21207: __typename, alias21208: __typename, alias21209: __typename, alias21210: __typename, alias21211: __typename, alias21212: __typename, alias21213: __typename, alias21214: __typename, alias21215: __typename, alias21216: __typename, alias21217: __typename, alias21218: __typename, alias21219: __typename, alias21220: __typename, alias21221: __typename, alias21222: __typename, alias21223: __typename, alias21224: __typename, alias21225: __typename, alias21226: __typename, alias21227: __typename, alias21228: __typename, alias21229: __typename, alias21230: __typename, alias21231: __typename, alias21232: __typename, alias21233: __typename, alias21234: __typename, alias21235: __typename, alias21236: __typename, alias21237: __typename, alias21238: __typename, alias21239: __typename, alias21240: __typename, alias21241: __typename, alias21242: __typename, alias21243: __typename, alias21244: __typename, alias21245: __typename, alias21246: __typename, alias21247: __typename, alias21248: __typename, alias21249: __typename, alias21250: __typename, alias21251: __typename, alias21252: __typename, alias21253: __typename, alias21254: __typename, alias21255: __typename, alias21256: __typename, alias21257: __typename, alias21258: __typename, alias21259: __typename, alias21260: __typename, alias21261: __typename, alias21262: __typename, alias21263: __typename, alias21264: __typename, alias21265: __typename, alias21266: __typename, alias21267: __typename, alias21268: __typename, alias21269: __typename, alias21270: __typename, alias21271: __typename, alias21272: __typename, alias21273: __typename, alias21274: __typename, alias21275: __typename, alias21276: __typename, alias21277: __typename, alias21278: __typename, alias21279: __typename, alias21280: __typename, alias21281: __typename, alias21282: __typename, alias21283: __typename, alias21284: __typename, alias21285: __typename, alias21286: __typename, alias21287: __typename, alias21288: __typename, alias21289: __typename, alias21290: __typename, alias21291: __typename, alias21292: __typename, alias21293: __typename, alias21294: __typename, alias21295: __typename, alias21296: __typename, alias21297: __typename, alias21298: __typename, alias21299: __typename, alias21300: __typename, alias21301: __typename, alias21302: __typename, alias21303: __typename, alias21304: __typename, alias21305: __typename, alias21306: __typename, alias21307: __typename, alias21308: __typename, alias21309: __typename, alias21310: __typename, alias21311: __typename, alias21312: __typename, alias21313: __typename, alias21314: __typename, alias21315: __typename, alias21316: __typename, alias21317: __typename, alias21318: __typename, alias21319: __typename, alias21320: __typename, alias21321: __typename, alias21322: __typename, alias21323: __typename, alias21324: __typename, alias21325: __typename, alias21326: __typename, alias21327: __typename, alias21328: __typename, alias21329: __typename, alias21330: __typename, alias21331: __typename, alias21332: __typename, alias21333: __typename, alias21334: __typename, alias21335: __typename, alias21336: __typename, alias21337: __typename, alias21338: __typename, alias21339: __typename, alias21340: __typename, alias21341: __typename, alias21342: __typename, alias21343: __typename, alias21344: __typename, alias21345: __typename, alias21346: __typename, alias21347: __typename, alias21348: __typename, alias21349: __typename, alias21350: __typename, alias21351: __typename, alias21352: __typename, alias21353: __typename, alias21354: __typename, alias21355: __typename, alias21356: __typename, alias21357: __typename, alias21358: __typename, alias21359: __typename, alias21360: __typename, alias21361: __typename, alias21362: __typename, alias21363: __typename, alias21364: __typename, alias21365: __typename, alias21366: __typename, alias21367: __typename, alias21368: __typename, alias21369: __typename, alias21370: __typename, alias21371: __typename, alias21372: __typename, alias21373: __typename, alias21374: __typename, alias21375: __typename, alias21376: __typename, alias21377: __typename, alias21378: __typename, alias21379: __typename, alias21380: __typename, alias21381: __typename, alias21382: __typename, alias21383: __typename, alias21384: __typename, alias21385: __typename, alias21386: __typename, alias21387: __typename, alias21388: __typename, alias21389: __typename, alias21390: __typename, alias21391: __typename, alias21392: __typename, alias21393: __typename, alias21394: __typename, alias21395: __typename, alias21396: __typename, alias21397: __typename, alias21398: __typename, alias21399: __typename, alias21400: __typename, alias21401: __typename, alias21402: __typename, alias21403: __typename, alias21404: __typename, alias21405: __typename, alias21406: __typename, alias21407: __typename, alias21408: __typename, alias21409: __typename, alias21410: __typename, alias21411: __typename, alias21412: __typename, alias21413: __typename, alias21414: __typename, alias21415: __typename, alias21416: __typename, alias21417: __typename, alias21418: __typename, alias21419: __typename, alias21420: __typename, alias21421: __typename, alias21422: __typename, alias21423: __typename, alias21424: __typename, alias21425: __typename, alias21426: __typename, alias21427: __typename, alias21428: __typename, alias21429: __typename, alias21430: __typename, alias21431: __typename, alias21432: __typename, alias21433: __typename, alias21434: __typename, alias21435: __typename, alias21436: __typename, alias21437: __typename, alias21438: __typename, alias21439: __typename, alias21440: __typename, alias21441: __typename, alias21442: __typename, alias21443: __typename, alias21444: __typename, alias21445: __typename, alias21446: __typename, alias21447: __typename, alias21448: __typename, alias21449: __typename, alias21450: __typename, alias21451: __typename, alias21452: __typename, alias21453: __typename, alias21454: __typename, alias21455: __typename, alias21456: __typename, alias21457: __typename, alias21458: __typename, alias21459: __typename, alias21460: __typename, alias21461: __typename, alias21462: __typename, alias21463: __typename, alias21464: __typename, alias21465: __typename, alias21466: __typename, alias21467: __typename, alias21468: __typename, alias21469: __typename, alias21470: __typename, alias21471: __typename, alias21472: __typename, alias21473: __typename, alias21474: __typename, alias21475: __typename, alias21476: __typename, alias21477: __typename, alias21478: __typename, alias21479: __typename, alias21480: __typename, alias21481: __typename, alias21482: __typename, alias21483: __typename, alias21484: __typename, alias21485: __typename, alias21486: __typename, alias21487: __typename, alias21488: __typename, alias21489: __typename, alias21490: __typename, alias21491: __typename, alias21492: __typename, alias21493: __typename, alias21494: __typename, alias21495: __typename, alias21496: __typename, alias21497: __typename, alias21498: __typename, alias21499: __typename, alias21500: __typename, alias21501: __typename, alias21502: __typename, alias21503: __typename, alias21504: __typename, alias21505: __typename, alias21506: __typename, alias21507: __typename, alias21508: __typename, alias21509: __typename, alias21510: __typename, alias21511: __typename, alias21512: __typename, alias21513: __typename, alias21514: __typename, alias21515: __typename, alias21516: __typename, alias21517: __typename, alias21518: __typename, alias21519: __typename, alias21520: __typename, alias21521: __typename, alias21522: __typename, alias21523: __typename, alias21524: __typename, alias21525: __typename, alias21526: __typename, alias21527: __typename, alias21528: __typename, alias21529: __typename, alias21530: __typename, alias21531: __typename, alias21532: __typename, alias21533: __typename, alias21534: __typename, alias21535: __typename, alias21536: __typename, alias21537: __typename, alias21538: __typename, alias21539: __typename, alias21540: __typename, alias21541: __typename, alias21542: __typename, alias21543: __typename, alias21544: __typename, alias21545: __typename, alias21546: __typename, alias21547: __typename, alias21548: __typename, alias21549: __typename, alias21550: __typename, alias21551: __typename, alias21552: __typename, alias21553: __typename, alias21554: __typename, alias21555: __typename, alias21556: __typename, alias21557: __typename, alias21558: __typename, alias21559: __typename, alias21560: __typename, alias21561: __typename, alias21562: __typename, alias21563: __typename, alias21564: __typename, alias21565: __typename, alias21566: __typename, alias21567: __typename, alias21568: __typename, alias21569: __typename, alias21570: __typename, alias21571: __typename, alias21572: __typename, alias21573: __typename, alias21574: __typename, alias21575: __typename, alias21576: __typename, alias21577: __typename, alias21578: __typename, alias21579: __typename, alias21580: __typename, alias21581: __typename, alias21582: __typename, alias21583: __typename, alias21584: __typename, alias21585: __typename, alias21586: __typename, alias21587: __typename, alias21588: __typename, alias21589: __typename, alias21590: __typename, alias21591: __typename, alias21592: __typename, alias21593: __typename, alias21594: __typename, alias21595: __typename, alias21596: __typename, alias21597: __typename, alias21598: __typename, alias21599: __typename, alias21600: __typename, alias21601: __typename, alias21602: __typename, alias21603: __typename, alias21604: __typename, alias21605: __typename, alias21606: __typename, alias21607: __typename, alias21608: __typename, alias21609: __typename, alias21610: __typename, alias21611: __typename, alias21612: __typename, alias21613: __typename, alias21614: __typename, alias21615: __typename, alias21616: __typename, alias21617: __typename, alias21618: __typename, alias21619: __typename, alias21620: __typename, alias21621: __typename, alias21622: __typename, alias21623: __typename, alias21624: __typename, alias21625: __typename, alias21626: __typename, alias21627: __typename, alias21628: __typename, alias21629: __typename, alias21630: __typename, alias21631: __typename, alias21632: __typename, alias21633: __typename, alias21634: __typename, alias21635: __typename, alias21636: __typename, alias21637: __typename, alias21638: __typename, alias21639: __typename, alias21640: __typename, alias21641: __typename, alias21642: __typename, alias21643: __typename, alias21644: __typename, alias21645: __typename, alias21646: __typename, alias21647: __typename, alias21648: __typename, alias21649: __typename, alias21650: __typename, alias21651: __typename, alias21652: __typename, alias21653: __typename, alias21654: __typename, alias21655: __typename, alias21656: __typename, alias21657: __typename, alias21658: __typename, alias21659: __typename, alias21660: __typename, alias21661: __typename, alias21662: __typename, alias21663: __typename, alias21664: __typename, alias21665: __typename, alias21666: __typename, alias21667: __typename, alias21668: __typename, alias21669: __typename, alias21670: __typename, alias21671: __typename, alias21672: __typename, alias21673: __typename, alias21674: __typename, alias21675: __typename, alias21676: __typename, alias21677: __typename, alias21678: __typename, alias21679: __typename, alias21680: __typename, alias21681: __typename, alias21682: __typename, alias21683: __typename, alias21684: __typename, alias21685: __typename, alias21686: __typename, alias21687: __typename, alias21688: __typename, alias21689: __typename, alias21690: __typename, alias21691: __typename, alias21692: __typename, alias21693: __typename, alias21694: __typename, alias21695: __typename, alias21696: __typename, alias21697: __typename, alias21698: __typename, alias21699: __typename, alias21700: __typename, alias21701: __typename, alias21702: __typename, alias21703: __typename, alias21704: __typename, alias21705: __typename, alias21706: __typename, alias21707: __typename, alias21708: __typename, alias21709: __typename, alias21710: __typename, alias21711: __typename, alias21712: __typename, alias21713: __typename, alias21714: __typename, alias21715: __typename, alias21716: __typename, alias21717: __typename, alias21718: __typename, alias21719: __typename, alias21720: __typename, alias21721: __typename, alias21722: __typename, alias21723: __typename, alias21724: __typename, alias21725: __typename, alias21726: __typename, alias21727: __typename, alias21728: __typename, alias21729: __typename, alias21730: __typename, alias21731: __typename, alias21732: __typename, alias21733: __typename, alias21734: __typename, alias21735: __typename, alias21736: __typename, alias21737: __typename, alias21738: __typename, alias21739: __typename, alias21740: __typename, alias21741: __typename, alias21742: __typename, alias21743: __typename, alias21744: __typename, alias21745: __typename, alias21746: __typename, alias21747: __typename, alias21748: __typename, alias21749: __typename, alias21750: __typename, alias21751: __typename, alias21752: __typename, alias21753: __typename, alias21754: __typename, alias21755: __typename, alias21756: __typename, alias21757: __typename, alias21758: __typename, alias21759: __typename, alias21760: __typename, alias21761: __typename, alias21762: __typename, alias21763: __typename, alias21764: __typename, alias21765: __typename, alias21766: __typename, alias21767: __typename, alias21768: __typename, alias21769: __typename, alias21770: __typename, alias21771: __typename, alias21772: __typename, alias21773: __typename, alias21774: __typename, alias21775: __typename, alias21776: __typename, alias21777: __typename, alias21778: __typename, alias21779: __typename, alias21780: __typename, alias21781: __typename, alias21782: __typename, alias21783: __typename, alias21784: __typename, alias21785: __typename, alias21786: __typename, alias21787: __typename, alias21788: __typename, alias21789: __typename, alias21790: __typename, alias21791: __typename, alias21792: __typename, alias21793: __typename, alias21794: __typename, alias21795: __typename, alias21796: __typename, alias21797: __typename, alias21798: __typename, alias21799: __typename, alias21800: __typename, alias21801: __typename, alias21802: __typename, alias21803: __typename, alias21804: __typename, alias21805: __typename, alias21806: __typename, alias21807: __typename, alias21808: __typename, alias21809: __typename, alias21810: __typename, alias21811: __typename, alias21812: __typename, alias21813: __typename, alias21814: __typename, alias21815: __typename, alias21816: __typename, alias21817: __typename, alias21818: __typename, alias21819: __typename, alias21820: __typename, alias21821: __typename, alias21822: __typename, alias21823: __typename, alias21824: __typename, alias21825: __typename, alias21826: __typename, alias21827: __typename, alias21828: __typename, alias21829: __typename, alias21830: __typename, alias21831: __typename, alias21832: __typename, alias21833: __typename, alias21834: __typename, alias21835: __typename, alias21836: __typename, alias21837: __typename, alias21838: __typename, alias21839: __typename, alias21840: __typename, alias21841: __typename, alias21842: __typename, alias21843: __typename, alias21844: __typename, alias21845: __typename, alias21846: __typename, alias21847: __typename, alias21848: __typename, alias21849: __typename, alias21850: __typename, alias21851: __typename, alias21852: __typename, alias21853: __typename, alias21854: __typename, alias21855: __typename, alias21856: __typename, alias21857: __typename, alias21858: __typename, alias21859: __typename, alias21860: __typename, alias21861: __typename, alias21862: __typename, alias21863: __typename, alias21864: __typename, alias21865: __typename, alias21866: __typename, alias21867: __typename, alias21868: __typename, alias21869: __typename, alias21870: __typename, alias21871: __typename, alias21872: __typename, alias21873: __typename, alias21874: __typename, alias21875: __typename, alias21876: __typename, alias21877: __typename, alias21878: __typename, alias21879: __typename, alias21880: __typename, alias21881: __typename, alias21882: __typename, alias21883: __typename, alias21884: __typename, alias21885: __typename, alias21886: __typename, alias21887: __typename, alias21888: __typename, alias21889: __typename, alias21890: __typename, alias21891: __typename, alias21892: __typename, alias21893: __typename, alias21894: __typename, alias21895: __typename, alias21896: __typename, alias21897: __typename, alias21898: __typename, alias21899: __typename, alias21900: __typename, alias21901: __typename, alias21902: __typename, alias21903: __typename, alias21904: __typename, alias21905: __typename, alias21906: __typename, alias21907: __typename, alias21908: __typename, alias21909: __typename, alias21910: __typename, alias21911: __typename, alias21912: __typename, alias21913: __typename, alias21914: __typename, alias21915: __typename, alias21916: __typename, alias21917: __typename, alias21918: __typename, alias21919: __typename, alias21920: __typename, alias21921: __typename, alias21922: __typename, alias21923: __typename, alias21924: __typename, alias21925: __typename, alias21926: __typename, alias21927: __typename, alias21928: __typename, alias21929: __typename, alias21930: __typename, alias21931: __typename, alias21932: __typename, alias21933: __typename, alias21934: __typename, alias21935: __typename, alias21936: __typename, alias21937: __typename, alias21938: __typename, alias21939: __typename, alias21940: __typename, alias21941: __typename, alias21942: __typename, alias21943: __typename, alias21944: __typename, alias21945: __typename, alias21946: __typename, alias21947: __typename, alias21948: __typename, alias21949: __typename, alias21950: __typename, alias21951: __typename, alias21952: __typename, alias21953: __typename, alias21954: __typename, alias21955: __typename, alias21956: __typename, alias21957: __typename, alias21958: __typename, alias21959: __typename, alias21960: __typename, alias21961: __typename, alias21962: __typename, alias21963: __typename, alias21964: __typename, alias21965: __typename, alias21966: __typename, alias21967: __typename, alias21968: __typename, alias21969: __typename, alias21970: __typename, alias21971: __typename, alias21972: __typename, alias21973: __typename, alias21974: __typename, alias21975: __typename, alias21976: __typename, alias21977: __typename, alias21978: __typename, alias21979: __typename, alias21980: __typename, alias21981: __typename, alias21982: __typename, alias21983: __typename, alias21984: __typename, alias21985: __typename, alias21986: __typename, alias21987: __typename, alias21988: __typename, alias21989: __typename, alias21990: __typename, alias21991: __typename, alias21992: __typename, alias21993: __typename, alias21994: __typename, alias21995: __typename, alias21996: __typename, alias21997: __typename, alias21998: __typename, alias21999: __typename, alias22000: __typename, alias22001: __typename, alias22002: __typename, alias22003: __typename, alias22004: __typename, alias22005: __typename, alias22006: __typename, alias22007: __typename, alias22008: __typename, alias22009: __typename, alias22010: __typename, alias22011: __typename, alias22012: __typename, alias22013: __typename, alias22014: __typename, alias22015: __typename, alias22016: __typename, alias22017: __typename, alias22018: __typename, alias22019: __typename, alias22020: __typename, alias22021: __typename, alias22022: __typename, alias22023: __typename, alias22024: __typename, alias22025: __typename, alias22026: __typename, alias22027: __typename, alias22028: __typename, alias22029: __typename, alias22030: __typename, alias22031: __typename, alias22032: __typename, alias22033: __typename, alias22034: __typename, alias22035: __typename, alias22036: __typename, alias22037: __typename, alias22038: __typename, alias22039: __typename, alias22040: __typename, alias22041: __typename, alias22042: __typename, alias22043: __typename, alias22044: __typename, alias22045: __typename, alias22046: __typename, alias22047: __typename, alias22048: __typename, alias22049: __typename, alias22050: __typename, alias22051: __typename, alias22052: __typename, alias22053: __typename, alias22054: __typename, alias22055: __typename, alias22056: __typename, alias22057: __typename, alias22058: __typename, alias22059: __typename, alias22060: __typename, alias22061: __typename, alias22062: __typename, alias22063: __typename, alias22064: __typename, alias22065: __typename, alias22066: __typename, alias22067: __typename, alias22068: __typename, alias22069: __typename, alias22070: __typename, alias22071: __typename, alias22072: __typename, alias22073: __typename, alias22074: __typename, alias22075: __typename, alias22076: __typename, alias22077: __typename, alias22078: __typename, alias22079: __typename, alias22080: __typename, alias22081: __typename, alias22082: __typename, alias22083: __typename, alias22084: __typename, alias22085: __typename, alias22086: __typename, alias22087: __typename, alias22088: __typename, alias22089: __typename, alias22090: __typename, alias22091: __typename, alias22092: __typename, alias22093: __typename, alias22094: __typename, alias22095: __typename, alias22096: __typename, alias22097: __typename, alias22098: __typename, alias22099: __typename, alias22100: __typename, alias22101: __typename, alias22102: __typename, alias22103: __typename, alias22104: __typename, alias22105: __typename, alias22106: __typename, alias22107: __typename, alias22108: __typename, alias22109: __typename, alias22110: __typename, alias22111: __typename, alias22112: __typename, alias22113: __typename, alias22114: __typename, alias22115: __typename, alias22116: __typename, alias22117: __typename, alias22118: __typename, alias22119: __typename, alias22120: __typename, alias22121: __typename, alias22122: __typename, alias22123: __typename, alias22124: __typename, alias22125: __typename, alias22126: __typename, alias22127: __typename, alias22128: __typename, alias22129: __typename, alias22130: __typename, alias22131: __typename, alias22132: __typename, alias22133: __typename, alias22134: __typename, alias22135: __typename, alias22136: __typename, alias22137: __typename, alias22138: __typename, alias22139: __typename, alias22140: __typename, alias22141: __typename, alias22142: __typename, alias22143: __typename, alias22144: __typename, alias22145: __typename, alias22146: __typename, alias22147: __typename, alias22148: __typename, alias22149: __typename, alias22150: __typename, alias22151: __typename, alias22152: __typename, alias22153: __typename, alias22154: __typename, alias22155: __typename, alias22156: __typename, alias22157: __typename, alias22158: __typename, alias22159: __typename, alias22160: __typename, alias22161: __typename, alias22162: __typename, alias22163: __typename, alias22164: __typename, alias22165: __typename, alias22166: __typename, alias22167: __typename, alias22168: __typename, alias22169: __typename, alias22170: __typename, alias22171: __typename, alias22172: __typename, alias22173: __typename, alias22174: __typename, alias22175: __typename, alias22176: __typename, alias22177: __typename, alias22178: __typename, alias22179: __typename, alias22180: __typename, alias22181: __typename, alias22182: __typename, alias22183: __typename, alias22184: __typename, alias22185: __typename, alias22186: __typename, alias22187: __typename, alias22188: __typename, alias22189: __typename, alias22190: __typename, alias22191: __typename, alias22192: __typename, alias22193: __typename, alias22194: __typename, alias22195: __typename, alias22196: __typename, alias22197: __typename, alias22198: __typename, alias22199: __typename, alias22200: __typename, alias22201: __typename, alias22202: __typename, alias22203: __typename, alias22204: __typename, alias22205: __typename, alias22206: __typename, alias22207: __typename, alias22208: __typename, alias22209: __typename, alias22210: __typename, alias22211: __typename, alias22212: __typename, alias22213: __typename, alias22214: __typename, alias22215: __typename, alias22216: __typename, alias22217: __typename, alias22218: __typename, alias22219: __typename, alias22220: __typename, alias22221: __typename, alias22222: __typename, alias22223: __typename, alias22224: __typename, alias22225: __typename, alias22226: __typename, alias22227: __typename, alias22228: __typename, alias22229: __typename, alias22230: __typename, alias22231: __typename, alias22232: __typename, alias22233: __typename, alias22234: __typename, alias22235: __typename, alias22236: __typename, alias22237: __typename, alias22238: __typename, alias22239: __typename, alias22240: __typename, alias22241: __typename, alias22242: __typename, alias22243: __typename, alias22244: __typename, alias22245: __typename, alias22246: __typename, alias22247: __typename, alias22248: __typename, alias22249: __typename, alias22250: __typename, alias22251: __typename, alias22252: __typename, alias22253: __typename, alias22254: __typename, alias22255: __typename, alias22256: __typename, alias22257: __typename, alias22258: __typename, alias22259: __typename, alias22260: __typename, alias22261: __typename, alias22262: __typename, alias22263: __typename, alias22264: __typename, alias22265: __typename, alias22266: __typename, alias22267: __typename, alias22268: __typename, alias22269: __typename, alias22270: __typename, alias22271: __typename, alias22272: __typename, alias22273: __typename, alias22274: __typename, alias22275: __typename, alias22276: __typename, alias22277: __typename, alias22278: __typename, alias22279: __typename, alias22280: __typename, alias22281: __typename, alias22282: __typename, alias22283: __typename, alias22284: __typename, alias22285: __typename, alias22286: __typename, alias22287: __typename, alias22288: __typename, alias22289: __typename, alias22290: __typename, alias22291: __typename, alias22292: __typename, alias22293: __typename, alias22294: __typename, alias22295: __typename, alias22296: __typename, alias22297: __typename, alias22298: __typename, alias22299: __typename, alias22300: __typename, alias22301: __typename, alias22302: __typename, alias22303: __typename, alias22304: __typename, alias22305: __typename, alias22306: __typename, alias22307: __typename, alias22308: __typename, alias22309: __typename, alias22310: __typename, alias22311: __typename, alias22312: __typename, alias22313: __typename, alias22314: __typename, alias22315: __typename, alias22316: __typename, alias22317: __typename, alias22318: __typename, alias22319: __typename, alias22320: __typename, alias22321: __typename, alias22322: __typename, alias22323: __typename, alias22324: __typename, alias22325: __typename, alias22326: __typename, alias22327: __typename, alias22328: __typename, alias22329: __typename, alias22330: __typename, alias22331: __typename, alias22332: __typename, alias22333: __typename, alias22334: __typename, alias22335: __typename, alias22336: __typename, alias22337: __typename, alias22338: __typename, alias22339: __typename, alias22340: __typename, alias22341: __typename, alias22342: __typename, alias22343: __typename, alias22344: __typename, alias22345: __typename, alias22346: __typename, alias22347: __typename, alias22348: __typename, alias22349: __typename, alias22350: __typename, alias22351: __typename, alias22352: __typename, alias22353: __typename, alias22354: __typename, alias22355: __typename, alias22356: __typename, alias22357: __typename, alias22358: __typename, alias22359: __typename, alias22360: __typename, alias22361: __typename, alias22362: __typename, alias22363: __typename, alias22364: __typename, alias22365: __typename, alias22366: __typename, alias22367: __typename, alias22368: __typename, alias22369: __typename, alias22370: __typename, alias22371: __typename, alias22372: __typename, alias22373: __typename, alias22374: __typename, alias22375: __typename, alias22376: __typename, alias22377: __typename, alias22378: __typename, alias22379: __typename, alias22380: __typename, alias22381: __typename, alias22382: __typename, alias22383: __typename, alias22384: __typename, alias22385: __typename, alias22386: __typename, alias22387: __typename, alias22388: __typename, alias22389: __typename, alias22390: __typename, alias22391: __typename, alias22392: __typename, alias22393: __typename, alias22394: __typename, alias22395: __typename, alias22396: __typename, alias22397: __typename, alias22398: __typename, alias22399: __typename, alias22400: __typename, alias22401: __typename, alias22402: __typename, alias22403: __typename, alias22404: __typename, alias22405: __typename, alias22406: __typename, alias22407: __typename, alias22408: __typename, alias22409: __typename, alias22410: __typename, alias22411: __typename, alias22412: __typename, alias22413: __typename, alias22414: __typename, alias22415: __typename, alias22416: __typename, alias22417: __typename, alias22418: __typename, alias22419: __typename, alias22420: __typename, alias22421: __typename, alias22422: __typename, alias22423: __typename, alias22424: __typename, alias22425: __typename, alias22426: __typename, alias22427: __typename, alias22428: __typename, alias22429: __typename, alias22430: __typename, alias22431: __typename, alias22432: __typename, alias22433: __typename, alias22434: __typename, alias22435: __typename, alias22436: __typename, alias22437: __typename, alias22438: __typename, alias22439: __typename, alias22440: __typename, alias22441: __typename, alias22442: __typename, alias22443: __typename, alias22444: __typename, alias22445: __typename, alias22446: __typename, alias22447: __typename, alias22448: __typename, alias22449: __typename, alias22450: __typename, alias22451: __typename, alias22452: __typename, alias22453: __typename, alias22454: __typename, alias22455: __typename, alias22456: __typename, alias22457: __typename, alias22458: __typename, alias22459: __typename, alias22460: __typename, alias22461: __typename, alias22462: __typename, alias22463: __typename, alias22464: __typename, alias22465: __typename, alias22466: __typename, alias22467: __typename, alias22468: __typename, alias22469: __typename, alias22470: __typename, alias22471: __typename, alias22472: __typename, alias22473: __typename, alias22474: __typename, alias22475: __typename, alias22476: __typename, alias22477: __typename, alias22478: __typename, alias22479: __typename, alias22480: __typename, alias22481: __typename, alias22482: __typename, alias22483: __typename, alias22484: __typename, alias22485: __typename, alias22486: __typename, alias22487: __typename, alias22488: __typename, alias22489: __typename, alias22490: __typename, alias22491: __typename, alias22492: __typename, alias22493: __typename, alias22494: __typename, alias22495: __typename, alias22496: __typename, alias22497: __typename, alias22498: __typename, alias22499: __typename, alias22500: __typename, alias22501: __typename, alias22502: __typename, alias22503: __typename, alias22504: __typename, alias22505: __typename, alias22506: __typename, alias22507: __typename, alias22508: __typename, alias22509: __typename, alias22510: __typename, alias22511: __typename, alias22512: __typename, alias22513: __typename, alias22514: __typename, alias22515: __typename, alias22516: __typename, alias22517: __typename, alias22518: __typename, alias22519: __typename, alias22520: __typename, alias22521: __typename, alias22522: __typename, alias22523: __typename, alias22524: __typename, alias22525: __typename, alias22526: __typename, alias22527: __typename, alias22528: __typename, alias22529: __typename, alias22530: __typename, alias22531: __typename, alias22532: __typename, alias22533: __typename, alias22534: __typename, alias22535: __typename, alias22536: __typename, alias22537: __typename, alias22538: __typename, alias22539: __typename, alias22540: __typename, alias22541: __typename, alias22542: __typename, alias22543: __typename, alias22544: __typename, alias22545: __typename, alias22546: __typename, alias22547: __typename, alias22548: __typename, alias22549: __typename, alias22550: __typename, alias22551: __typename, alias22552: __typename, alias22553: __typename, alias22554: __typename, alias22555: __typename, alias22556: __typename, alias22557: __typename, alias22558: __typename, alias22559: __typename, alias22560: __typename, alias22561: __typename, alias22562: __typename, alias22563: __typename, alias22564: __typename, alias22565: __typename, alias22566: __typename, alias22567: __typename, alias22568: __typename, alias22569: __typename, alias22570: __typename, alias22571: __typename, alias22572: __typename, alias22573: __typename, alias22574: __typename, alias22575: __typename, alias22576: __typename, alias22577: __typename, alias22578: __typename, alias22579: __typename, alias22580: __typename, alias22581: __typename, alias22582: __typename, alias22583: __typename, alias22584: __typename, alias22585: __typename, alias22586: __typename, alias22587: __typename, alias22588: __typename, alias22589: __typename, alias22590: __typename, alias22591: __typename, alias22592: __typename, alias22593: __typename, alias22594: __typename, alias22595: __typename, alias22596: __typename, alias22597: __typename, alias22598: __typename, alias22599: __typename, alias22600: __typename, alias22601: __typename, alias22602: __typename, alias22603: __typename, alias22604: __typename, alias22605: __typename, alias22606: __typename, alias22607: __typename, alias22608: __typename, alias22609: __typename, alias22610: __typename, alias22611: __typename, alias22612: __typename, alias22613: __typename, alias22614: __typename, alias22615: __typename, alias22616: __typename, alias22617: __typename, alias22618: __typename, alias22619: __typename, alias22620: __typename, alias22621: __typename, alias22622: __typename, alias22623: __typename, alias22624: __typename, alias22625: __typename, alias22626: __typename, alias22627: __typename, alias22628: __typename, alias22629: __typename, alias22630: __typename, alias22631: __typename, alias22632: __typename, alias22633: __typename, alias22634: __typename, alias22635: __typename, alias22636: __typename, alias22637: __typename, alias22638: __typename, alias22639: __typename, alias22640: __typename, alias22641: __typename, alias22642: __typename, alias22643: __typename, alias22644: __typename, alias22645: __typename, alias22646: __typename, alias22647: __typename, alias22648: __typename, alias22649: __typename, alias22650: __typename, alias22651: __typename, alias22652: __typename, alias22653: __typename, alias22654: __typename, alias22655: __typename, alias22656: __typename, alias22657: __typename, alias22658: __typename, alias22659: __typename, alias22660: __typename, alias22661: __typename, alias22662: __typename, alias22663: __typename, alias22664: __typename, alias22665: __typename, alias22666: __typename, alias22667: __typename, alias22668: __typename, alias22669: __typename, alias22670: __typename, alias22671: __typename, alias22672: __typename, alias22673: __typename, alias22674: __typename, alias22675: __typename, alias22676: __typename, alias22677: __typename, alias22678: __typename, alias22679: __typename, alias22680: __typename, alias22681: __typename, alias22682: __typename, alias22683: __typename, alias22684: __typename, alias22685: __typename, alias22686: __typename, alias22687: __typename, alias22688: __typename, alias22689: __typename, alias22690: __typename, alias22691: __typename, alias22692: __typename, alias22693: __typename, alias22694: __typename, alias22695: __typename, alias22696: __typename, alias22697: __typename, alias22698: __typename, alias22699: __typename, alias22700: __typename, alias22701: __typename, alias22702: __typename, alias22703: __typename, alias22704: __typename, alias22705: __typename, alias22706: __typename, alias22707: __typename, alias22708: __typename, alias22709: __typename, alias22710: __typename, alias22711: __typename, alias22712: __typename, alias22713: __typename, alias22714: __typename, alias22715: __typename, alias22716: __typename, alias22717: __typename, alias22718: __typename, alias22719: __typename, alias22720: __typename, alias22721: __typename, alias22722: __typename, alias22723: __typename, alias22724: __typename, alias22725: __typename, alias22726: __typename, alias22727: __typename, alias22728: __typename, alias22729: __typename, alias22730: __typename, alias22731: __typename, alias22732: __typename, alias22733: __typename, alias22734: __typename, alias22735: __typename, alias22736: __typename, alias22737: __typename, alias22738: __typename, alias22739: __typename, alias22740: __typename, alias22741: __typename, alias22742: __typename, alias22743: __typename, alias22744: __typename, alias22745: __typename, alias22746: __typename, alias22747: __typename, alias22748: __typename, alias22749: __typename, alias22750: __typename, alias22751: __typename, alias22752: __typename, alias22753: __typename, alias22754: __typename, alias22755: __typename, alias22756: __typename, alias22757: __typename, alias22758: __typename, alias22759: __typename, alias22760: __typename, alias22761: __typename, alias22762: __typename, alias22763: __typename, alias22764: __typename, alias22765: __typename, alias22766: __typename, alias22767: __typename, alias22768: __typename, alias22769: __typename, alias22770: __typename, alias22771: __typename, alias22772: __typename, alias22773: __typename, alias22774: __typename, alias22775: __typename, alias22776: __typename, alias22777: __typename, alias22778: __typename, alias22779: __typename, alias22780: __typename, alias22781: __typename, alias22782: __typename, alias22783: __typename, alias22784: __typename, alias22785: __typename, alias22786: __typename, alias22787: __typename, alias22788: __typename, alias22789: __typename, alias22790: __typename, alias22791: __typename, alias22792: __typename, alias22793: __typename, alias22794: __typename, alias22795: __typename, alias22796: __typename, alias22797: __typename, alias22798: __typename, alias22799: __typename, alias22800: __typename, alias22801: __typename, alias22802: __typename, alias22803: __typename, alias22804: __typename, alias22805: __typename, alias22806: __typename, alias22807: __typename, alias22808: __typename, alias22809: __typename, alias22810: __typename, alias22811: __typename, alias22812: __typename, alias22813: __typename, alias22814: __typename, alias22815: __typename, alias22816: __typename, alias22817: __typename, alias22818: __typename, alias22819: __typename, alias22820: __typename, alias22821: __typename, alias22822: __typename, alias22823: __typename, alias22824: __typename, alias22825: __typename, alias22826: __typename, alias22827: __typename, alias22828: __typename, alias22829: __typename, alias22830: __typename, alias22831: __typename, alias22832: __typename, alias22833: __typename, alias22834: __typename, alias22835: __typename, alias22836: __typename, alias22837: __typename, alias22838: __typename, alias22839: __typename, alias22840: __typename, alias22841: __typename, alias22842: __typename, alias22843: __typename, alias22844: __typename, alias22845: __typename, alias22846: __typename, alias22847: __typename, alias22848: __typename, alias22849: __typename, alias22850: __typename, alias22851: __typename, alias22852: __typename, alias22853: __typename, alias22854: __typename, alias22855: __typename, alias22856: __typename, alias22857: __typename, alias22858: __typename, alias22859: __typename, alias22860: __typename, alias22861: __typename, alias22862: __typename, alias22863: __typename, alias22864: __typename, alias22865: __typename, alias22866: __typename, alias22867: __typename, alias22868: __typename, alias22869: __typename, alias22870: __typename, alias22871: __typename, alias22872: __typename, alias22873: __typename, alias22874: __typename, alias22875: __typename, alias22876: __typename, alias22877: __typename, alias22878: __typename, alias22879: __typename, alias22880: __typename, alias22881: __typename, alias22882: __typename, alias22883: __typename, alias22884: __typename, alias22885: __typename, alias22886: __typename, alias22887: __typename, alias22888: __typename, alias22889: __typename, alias22890: __typename, alias22891: __typename, alias22892: __typename, alias22893: __typename, alias22894: __typename, alias22895: __typename, alias22896: __typename, alias22897: __typename, alias22898: __typename, alias22899: __typename, alias22900: __typename, alias22901: __typename, alias22902: __typename, alias22903: __typename, alias22904: __typename, alias22905: __typename, alias22906: __typename, alias22907: __typename, alias22908: __typename, alias22909: __typename, alias22910: __typename, alias22911: __typename, alias22912: __typename, alias22913: __typename, alias22914: __typename, alias22915: __typename, alias22916: __typename, alias22917: __typename, alias22918: __typename, alias22919: __typename, alias22920: __typename, alias22921: __typename, alias22922: __typename, alias22923: __typename, alias22924: __typename, alias22925: __typename, alias22926: __typename, alias22927: __typename, alias22928: __typename, alias22929: __typename, alias22930: __typename, alias22931: __typename, alias22932: __typename, alias22933: __typename, alias22934: __typename, alias22935: __typename, alias22936: __typename, alias22937: __typename, alias22938: __typename, alias22939: __typename, alias22940: __typename, alias22941: __typename, alias22942: __typename, alias22943: __typename, alias22944: __typename, alias22945: __typename, alias22946: __typename, alias22947: __typename, alias22948: __typename, alias22949: __typename, alias22950: __typename, alias22951: __typename, alias22952: __typename, alias22953: __typename, alias22954: __typename, alias22955: __typename, alias22956: __typename, alias22957: __typename, alias22958: __typename, alias22959: __typename, alias22960: __typename, alias22961: __typename, alias22962: __typename, alias22963: __typename, alias22964: __typename, alias22965: __typename, alias22966: __typename, alias22967: __typename, alias22968: __typename, alias22969: __typename, alias22970: __typename, alias22971: __typename, alias22972: __typename, alias22973: __typename, alias22974: __typename, alias22975: __typename, alias22976: __typename, alias22977: __typename, alias22978: __typename, alias22979: __typename, alias22980: __typename, alias22981: __typename, alias22982: __typename, alias22983: __typename, alias22984: __typename, alias22985: __typename, alias22986: __typename, alias22987: __typename, alias22988: __typename, alias22989: __typename, alias22990: __typename, alias22991: __typename, alias22992: __typename, alias22993: __typename, alias22994: __typename, alias22995: __typename, alias22996: __typename, alias22997: __typename, alias22998: __typename, alias22999: __typename, alias23000: __typename, alias23001: __typename, alias23002: __typename, alias23003: __typename, alias23004: __typename, alias23005: __typename, alias23006: __typename, alias23007: __typename, alias23008: __typename, alias23009: __typename, alias23010: __typename, alias23011: __typename, alias23012: __typename, alias23013: __typename, alias23014: __typename, alias23015: __typename, alias23016: __typename, alias23017: __typename, alias23018: __typename, alias23019: __typename, alias23020: __typename, alias23021: __typename, alias23022: __typename, alias23023: __typename, alias23024: __typename, alias23025: __typename, alias23026: __typename, alias23027: __typename, alias23028: __typename, alias23029: __typename, alias23030: __typename, alias23031: __typename, alias23032: __typename, alias23033: __typename, alias23034: __typename, alias23035: __typename, alias23036: __typename, alias23037: __typename, alias23038: __typename, alias23039: __typename, alias23040: __typename, alias23041: __typename, alias23042: __typename, alias23043: __typename, alias23044: __typename, alias23045: __typename, alias23046: __typename, alias23047: __typename, alias23048: __typename, alias23049: __typename, alias23050: __typename, alias23051: __typename, alias23052: __typename, alias23053: __typename, alias23054: __typename, alias23055: __typename, alias23056: __typename, alias23057: __typename, alias23058: __typename, alias23059: __typename, alias23060: __typename, alias23061: __typename, alias23062: __typename, alias23063: __typename, alias23064: __typename, alias23065: __typename, alias23066: __typename, alias23067: __typename, alias23068: __typename, alias23069: __typename, alias23070: __typename, alias23071: __typename, alias23072: __typename, alias23073: __typename, alias23074: __typename, alias23075: __typename, alias23076: __typename, alias23077: __typename, alias23078: __typename, alias23079: __typename, alias23080: __typename, alias23081: __typename, alias23082: __typename, alias23083: __typename, alias23084: __typename, alias23085: __typename, alias23086: __typename, alias23087: __typename, alias23088: __typename, alias23089: __typename, alias23090: __typename, alias23091: __typename, alias23092: __typename, alias23093: __typename, alias23094: __typename, alias23095: __typename, alias23096: __typename, alias23097: __typename, alias23098: __typename, alias23099: __typename, alias23100: __typename, alias23101: __typename, alias23102: __typename, alias23103: __typename, alias23104: __typename, alias23105: __typename, alias23106: __typename, alias23107: __typename, alias23108: __typename, alias23109: __typename, alias23110: __typename, alias23111: __typename, alias23112: __typename, alias23113: __typename, alias23114: __typename, alias23115: __typename, alias23116: __typename, alias23117: __typename, alias23118: __typename, alias23119: __typename, alias23120: __typename, alias23121: __typename, alias23122: __typename, alias23123: __typename, alias23124: __typename, alias23125: __typename, alias23126: __typename, alias23127: __typename, alias23128: __typename, alias23129: __typename, alias23130: __typename, alias23131: __typename, alias23132: __typename, alias23133: __typename, alias23134: __typename, alias23135: __typename, alias23136: __typename, alias23137: __typename, alias23138: __typename, alias23139: __typename, alias23140: __typename, alias23141: __typename, alias23142: __typename, alias23143: __typename, alias23144: __typename, alias23145: __typename, alias23146: __typename, alias23147: __typename, alias23148: __typename, alias23149: __typename, alias23150: __typename, alias23151: __typename, alias23152: __typename, alias23153: __typename, alias23154: __typename, alias23155: __typename, alias23156: __typename, alias23157: __typename, alias23158: __typename, alias23159: __typename, alias23160: __typename, alias23161: __typename, alias23162: __typename, alias23163: __typename, alias23164: __typename, alias23165: __typename, alias23166: __typename, alias23167: __typename, alias23168: __typename, alias23169: __typename, alias23170: __typename, alias23171: __typename, alias23172: __typename, alias23173: __typename, alias23174: __typename, alias23175: __typename, alias23176: __typename, alias23177: __typename, alias23178: __typename, alias23179: __typename, alias23180: __typename, alias23181: __typename, alias23182: __typename, alias23183: __typename, alias23184: __typename, alias23185: __typename, alias23186: __typename, alias23187: __typename, alias23188: __typename, alias23189: __typename, alias23190: __typename, alias23191: __typename, alias23192: __typename, alias23193: __typename, alias23194: __typename, alias23195: __typename, alias23196: __typename, alias23197: __typename, alias23198: __typename, alias23199: __typename, alias23200: __typename, alias23201: __typename, alias23202: __typename, alias23203: __typename, alias23204: __typename, alias23205: __typename, alias23206: __typename, alias23207: __typename, alias23208: __typename, alias23209: __typename, alias23210: __typename, alias23211: __typename, alias23212: __typename, alias23213: __typename, alias23214: __typename, alias23215: __typename, alias23216: __typename, alias23217: __typename, alias23218: __typename, alias23219: __typename, alias23220: __typename, alias23221: __typename, alias23222: __typename, alias23223: __typename, alias23224: __typename, alias23225: __typename, alias23226: __typename, alias23227: __typename, alias23228: __typename, alias23229: __typename, alias23230: __typename, alias23231: __typename, alias23232: __typename, alias23233: __typename, alias23234: __typename, alias23235: __typename, alias23236: __typename, alias23237: __typename, alias23238: __typename, alias23239: __typename, alias23240: __typename, alias23241: __typename, alias23242: __typename, alias23243: __typename, alias23244: __typename, alias23245: __typename, alias23246: __typename, alias23247: __typename, alias23248: __typename, alias23249: __typename, alias23250: __typename, alias23251: __typename, alias23252: __typename, alias23253: __typename, alias23254: __typename, alias23255: __typename, alias23256: __typename, alias23257: __typename, alias23258: __typename, alias23259: __typename, alias23260: __typename, alias23261: __typename, alias23262: __typename, alias23263: __typename, alias23264: __typename, alias23265: __typename, alias23266: __typename, alias23267: __typename, alias23268: __typename, alias23269: __typename, alias23270: __typename, alias23271: __typename, alias23272: __typename, alias23273: __typename, alias23274: __typename, alias23275: __typename, alias23276: __typename, alias23277: __typename, alias23278: __typename, alias23279: __typename, alias23280: __typename, alias23281: __typename, alias23282: __typename, alias23283: __typename, alias23284: __typename, alias23285: __typename, alias23286: __typename, alias23287: __typename, alias23288: __typename, alias23289: __typename, alias23290: __typename, alias23291: __typename, alias23292: __typename, alias23293: __typename, alias23294: __typename, alias23295: __typename, alias23296: __typename, alias23297: __typename, alias23298: __typename, alias23299: __typename, alias23300: __typename, alias23301: __typename, alias23302: __typename, alias23303: __typename, alias23304: __typename, alias23305: __typename, alias23306: __typename, alias23307: __typename, alias23308: __typename, alias23309: __typename, alias23310: __typename, alias23311: __typename, alias23312: __typename, alias23313: __typename, alias23314: __typename, alias23315: __typename, alias23316: __typename, alias23317: __typename, alias23318: __typename, alias23319: __typename, alias23320: __typename, alias23321: __typename, alias23322: __typename, alias23323: __typename, alias23324: __typename, alias23325: __typename, alias23326: __typename, alias23327: __typename, alias23328: __typename, alias23329: __typename, alias23330: __typename, alias23331: __typename, alias23332: __typename, alias23333: __typename, alias23334: __typename, alias23335: __typename, alias23336: __typename, alias23337: __typename, alias23338: __typename, alias23339: __typename, alias23340: __typename, alias23341: __typename, alias23342: __typename, alias23343: __typename, alias23344: __typename, alias23345: __typename, alias23346: __typename, alias23347: __typename, alias23348: __typename, alias23349: __typename, alias23350: __typename, alias23351: __typename, alias23352: __typename, alias23353: __typename, alias23354: __typename, alias23355: __typename, alias23356: __typename, alias23357: __typename, alias23358: __typename, alias23359: __typename, alias23360: __typename, alias23361: __typename, alias23362: __typename, alias23363: __typename, alias23364: __typename, alias23365: __typename, alias23366: __typename, alias23367: __typename, alias23368: __typename, alias23369: __typename, alias23370: __typename, alias23371: __typename, alias23372: __typename, alias23373: __typename, alias23374: __typename, alias23375: __typename, alias23376: __typename, alias23377: __typename, alias23378: __typename, alias23379: __typename, alias23380: __typename, alias23381: __typename, alias23382: __typename, alias23383: __typename, alias23384: __typename, alias23385: __typename, alias23386: __typename, alias23387: __typename, alias23388: __typename, alias23389: __typename, alias23390: __typename, alias23391: __typename, alias23392: __typename, alias23393: __typename, alias23394: __typename, alias23395: __typename, alias23396: __typename, alias23397: __typename, alias23398: __typename, alias23399: __typename, alias23400: __typename, alias23401: __typename, alias23402: __typename, alias23403: __typename, alias23404: __typename, alias23405: __typename, alias23406: __typename, alias23407: __typename, alias23408: __typename, alias23409: __typename, alias23410: __typename, alias23411: __typename, alias23412: __typename, alias23413: __typename, alias23414: __typename, alias23415: __typename, alias23416: __typename, alias23417: __typename, alias23418: __typename, alias23419: __typename, alias23420: __typename, alias23421: __typename, alias23422: __typename, alias23423: __typename, alias23424: __typename, alias23425: __typename, alias23426: __typename, alias23427: __typename, alias23428: __typename, alias23429: __typename, alias23430: __typename, alias23431: __typename, alias23432: __typename, alias23433: __typename, alias23434: __typename, alias23435: __typename, alias23436: __typename, alias23437: __typename, alias23438: __typename, alias23439: __typename, alias23440: __typename, alias23441: __typename, alias23442: __typename, alias23443: __typename, alias23444: __typename, alias23445: __typename, alias23446: __typename, alias23447: __typename, alias23448: __typename, alias23449: __typename, alias23450: __typename, alias23451: __typename, alias23452: __typename, alias23453: __typename, alias23454: __typename, alias23455: __typename, alias23456: __typename, alias23457: __typename, alias23458: __typename, alias23459: __typename, alias23460: __typename, alias23461: __typename, alias23462: __typename, alias23463: __typename, alias23464: __typename, alias23465: __typename, alias23466: __typename, alias23467: __typename, alias23468: __typename, alias23469: __typename, alias23470: __typename, alias23471: __typename, alias23472: __typename, alias23473: __typename, alias23474: __typename, alias23475: __typename, alias23476: __typename, alias23477: __typename, alias23478: __typename, alias23479: __typename, alias23480: __typename, alias23481: __typename, alias23482: __typename, alias23483: __typename, alias23484: __typename, alias23485: __typename, alias23486: __typename, alias23487: __typename, alias23488: __typename, alias23489: __typename, alias23490: __typename, alias23491: __typename, alias23492: __typename, alias23493: __typename, alias23494: __typename, alias23495: __typename, alias23496: __typename, alias23497: __typename, alias23498: __typename, alias23499: __typename, alias23500: __typename, alias23501: __typename, alias23502: __typename, alias23503: __typename, alias23504: __typename, alias23505: __typename, alias23506: __typename, alias23507: __typename, alias23508: __typename, alias23509: __typename, alias23510: __typename, alias23511: __typename, alias23512: __typename, alias23513: __typename, alias23514: __typename, alias23515: __typename, alias23516: __typename, alias23517: __typename, alias23518: __typename, alias23519: __typename, alias23520: __typename, alias23521: __typename, alias23522: __typename, alias23523: __typename, alias23524: __typename, alias23525: __typename, alias23526: __typename, alias23527: __typename, alias23528: __typename, alias23529: __typename, alias23530: __typename, alias23531: __typename, alias23532: __typename, alias23533: __typename, alias23534: __typename, alias23535: __typename, alias23536: __typename, alias23537: __typename, alias23538: __typename, alias23539: __typename, alias23540: __typename, alias23541: __typename, alias23542: __typename, alias23543: __typename, alias23544: __typename, alias23545: __typename, alias23546: __typename, alias23547: __typename, alias23548: __typename, alias23549: __typename, alias23550: __typename, alias23551: __typename, alias23552: __typename, alias23553: __typename, alias23554: __typename, alias23555: __typename, alias23556: __typename, alias23557: __typename, alias23558: __typename, alias23559: __typename, alias23560: __typename, alias23561: __typename, alias23562: __typename, alias23563: __typename, alias23564: __typename, alias23565: __typename, alias23566: __typename, alias23567: __typename, alias23568: __typename, alias23569: __typename, alias23570: __typename, alias23571: __typename, alias23572: __typename, alias23573: __typename, alias23574: __typename, alias23575: __typename, alias23576: __typename, alias23577: __typename, alias23578: __typename, alias23579: __typename, alias23580: __typename, alias23581: __typename, alias23582: __typename, alias23583: __typename, alias23584: __typename, alias23585: __typename, alias23586: __typename, alias23587: __typename, alias23588: __typename, alias23589: __typename, alias23590: __typename, alias23591: __typename, alias23592: __typename, alias23593: __typename, alias23594: __typename, alias23595: __typename, alias23596: __typename, alias23597: __typename, alias23598: __typename, alias23599: __typename, alias23600: __typename, alias23601: __typename, alias23602: __typename, alias23603: __typename, alias23604: __typename, alias23605: __typename, alias23606: __typename, alias23607: __typename, alias23608: __typename, alias23609: __typename, alias23610: __typename, alias23611: __typename, alias23612: __typename, alias23613: __typename, alias23614: __typename, alias23615: __typename, alias23616: __typename, alias23617: __typename, alias23618: __typename, alias23619: __typename, alias23620: __typename, alias23621: __typename, alias23622: __typename, alias23623: __typename, alias23624: __typename, alias23625: __typename, alias23626: __typename, alias23627: __typename, alias23628: __typename, alias23629: __typename, alias23630: __typename, alias23631: __typename, alias23632: __typename, alias23633: __typename, alias23634: __typename, alias23635: __typename, alias23636: __typename, alias23637: __typename, alias23638: __typename, alias23639: __typename, alias23640: __typename, alias23641: __typename, alias23642: __typename, alias23643: __typename, alias23644: __typename, alias23645: __typename, alias23646: __typename, alias23647: __typename, alias23648: __typename, alias23649: __typename, alias23650: __typename, alias23651: __typename, alias23652: __typename, alias23653: __typename, alias23654: __typename, alias23655: __typename, alias23656: __typename, alias23657: __typename, alias23658: __typename, alias23659: __typename, alias23660: __typename, alias23661: __typename, alias23662: __typename, alias23663: __typename, alias23664: __typename, alias23665: __typename, alias23666: __typename, alias23667: __typename, alias23668: __typename, alias23669: __typename, alias23670: __typename, alias23671: __typename, alias23672: __typename, alias23673: __typename, alias23674: __typename, alias23675: __typename, alias23676: __typename, alias23677: __typename, alias23678: __typename, alias23679: __typename, alias23680: __typename, alias23681: __typename, alias23682: __typename, alias23683: __typename, alias23684: __typename, alias23685: __typename, alias23686: __typename, alias23687: __typename, alias23688: __typename, alias23689: __typename, alias23690: __typename, alias23691: __typename, alias23692: __typename, alias23693: __typename, alias23694: __typename, alias23695: __typename, alias23696: __typename, alias23697: __typename, alias23698: __typename, alias23699: __typename, alias23700: __typename, alias23701: __typename, alias23702: __typename, alias23703: __typename, alias23704: __typename, alias23705: __typename, alias23706: __typename, alias23707: __typename, alias23708: __typename, alias23709: __typename, alias23710: __typename, alias23711: __typename, alias23712: __typename, alias23713: __typename, alias23714: __typename, alias23715: __typename, alias23716: __typename, alias23717: __typename, alias23718: __typename, alias23719: __typename, alias23720: __typename, alias23721: __typename, alias23722: __typename, alias23723: __typename, alias23724: __typename, alias23725: __typename, alias23726: __typename, alias23727: __typename, alias23728: __typename, alias23729: __typename, alias23730: __typename, alias23731: __typename, alias23732: __typename, alias23733: __typename, alias23734: __typename, alias23735: __typename, alias23736: __typename, alias23737: __typename, alias23738: __typename, alias23739: __typename, alias23740: __typename, alias23741: __typename, alias23742: __typename, alias23743: __typename, alias23744: __typename, alias23745: __typename, alias23746: __typename, alias23747: __typename, alias23748: __typename, alias23749: __typename, alias23750: __typename, alias23751: __typename, alias23752: __typename, alias23753: __typename, alias23754: __typename, alias23755: __typename, alias23756: __typename, alias23757: __typename, alias23758: __typename, alias23759: __typename, alias23760: __typename, alias23761: __typename, alias23762: __typename, alias23763: __typename, alias23764: __typename, alias23765: __typename, alias23766: __typename, alias23767: __typename, alias23768: __typename, alias23769: __typename, alias23770: __typename, alias23771: __typename, alias23772: __typename, alias23773: __typename, alias23774: __typename, alias23775: __typename, alias23776: __typename, alias23777: __typename, alias23778: __typename, alias23779: __typename, alias23780: __typename, alias23781: __typename, alias23782: __typename, alias23783: __typename, alias23784: __typename, alias23785: __typename, alias23786: __typename, alias23787: __typename, alias23788: __typename, alias23789: __typename, alias23790: __typename, alias23791: __typename, alias23792: __typename, alias23793: __typename, alias23794: __typename, alias23795: __typename, alias23796: __typename, alias23797: __typename, alias23798: __typename, alias23799: __typename, alias23800: __typename, alias23801: __typename, alias23802: __typename, alias23803: __typename, alias23804: __typename, alias23805: __typename, alias23806: __typename, alias23807: __typename, alias23808: __typename, alias23809: __typename, alias23810: __typename, alias23811: __typename, alias23812: __typename, alias23813: __typename, alias23814: __typename, alias23815: __typename, alias23816: __typename, alias23817: __typename, alias23818: __typename, alias23819: __typename, alias23820: __typename, alias23821: __typename, alias23822: __typename, alias23823: __typename, alias23824: __typename, alias23825: __typename, alias23826: __typename, alias23827: __typename, alias23828: __typename, alias23829: __typename, alias23830: __typename, alias23831: __typename, alias23832: __typename, alias23833: __typename, alias23834: __typename, alias23835: __typename, alias23836: __typename, alias23837: __typename, alias23838: __typename, alias23839: __typename, alias23840: __typename, alias23841: __typename, alias23842: __typename, alias23843: __typename, alias23844: __typename, alias23845: __typename, alias23846: __typename, alias23847: __typename, alias23848: __typename, alias23849: __typename, alias23850: __typename, alias23851: __typename, alias23852: __typename, alias23853: __typename, alias23854: __typename, alias23855: __typename, alias23856: __typename, alias23857: __typename, alias23858: __typename, alias23859: __typename, alias23860: __typename, alias23861: __typename, alias23862: __typename, alias23863: __typename, alias23864: __typename, alias23865: __typename, alias23866: __typename, alias23867: __typename, alias23868: __typename, alias23869: __typename, alias23870: __typename, alias23871: __typename, alias23872: __typename, alias23873: __typename, alias23874: __typename, alias23875: __typename, alias23876: __typename, alias23877: __typename, alias23878: __typename, alias23879: __typename, alias23880: __typename, alias23881: __typename, alias23882: __typename, alias23883: __typename, alias23884: __typename, alias23885: __typename, alias23886: __typename, alias23887: __typename, alias23888: __typename, alias23889: __typename, alias23890: __typename, alias23891: __typename, alias23892: __typename, alias23893: __typename, alias23894: __typename, alias23895: __typename, alias23896: __typename, alias23897: __typename, alias23898: __typename, alias23899: __typename, alias23900: __typename, alias23901: __typename, alias23902: __typename, alias23903: __typename, alias23904: __typename, alias23905: __typename, alias23906: __typename, alias23907: __typename, alias23908: __typename, alias23909: __typename, alias23910: __typename, alias23911: __typename, alias23912: __typename, alias23913: __typename, alias23914: __typename, alias23915: __typename, alias23916: __typename, alias23917: __typename, alias23918: __typename, alias23919: __typename, alias23920: __typename, alias23921: __typename, alias23922: __typename, alias23923: __typename, alias23924: __typename, alias23925: __typename, alias23926: __typename, alias23927: __typename, alias23928: __typename, alias23929: __typename, alias23930: __typename, alias23931: __typename, alias23932: __typename, alias23933: __typename, alias23934: __typename, alias23935: __typename, alias23936: __typename, alias23937: __typename, alias23938: __typename, alias23939: __typename, alias23940: __typename, alias23941: __typename, alias23942: __typename, alias23943: __typename, alias23944: __typename, alias23945: __typename, alias23946: __typename, alias23947: __typename, alias23948: __typename, alias23949: __typename, alias23950: __typename, alias23951: __typename, alias23952: __typename, alias23953: __typename, alias23954: __typename, alias23955: __typename, alias23956: __typename, alias23957: __typename, alias23958: __typename, alias23959: __typename, alias23960: __typename, alias23961: __typename, alias23962: __typename, alias23963: __typename, alias23964: __typename, alias23965: __typename, alias23966: __typename, alias23967: __typename, alias23968: __typename, alias23969: __typename, alias23970: __typename, alias23971: __typename, alias23972: __typename, alias23973: __typename, alias23974: __typename, alias23975: __typename, alias23976: __typename, alias23977: __typename, alias23978: __typename, alias23979: __typename, alias23980: __typename, alias23981: __typename, alias23982: __typename, alias23983: __typename, alias23984: __typename, alias23985: __typename, alias23986: __typename, alias23987: __typename, alias23988: __typename, alias23989: __typename, alias23990: __typename, alias23991: __typename, alias23992: __typename, alias23993: __typename, alias23994: __typename, alias23995: __typename, alias23996: __typename, alias23997: __typename, alias23998: __typename, alias23999: __typename, alias24000: __typename, alias24001: __typename, alias24002: __typename, alias24003: __typename, alias24004: __typename, alias24005: __typename, alias24006: __typename, alias24007: __typename, alias24008: __typename, alias24009: __typename, alias24010: __typename, alias24011: __typename, alias24012: __typename, alias24013: __typename, alias24014: __typename, alias24015: __typename, alias24016: __typename, alias24017: __typename, alias24018: __typename, alias24019: __typename, alias24020: __typename, alias24021: __typename, alias24022: __typename, alias24023: __typename, alias24024: __typename, alias24025: __typename, alias24026: __typename, alias24027: __typename, alias24028: __typename, alias24029: __typename, alias24030: __typename, alias24031: __typename, alias24032: __typename, alias24033: __typename, alias24034: __typename, alias24035: __typename, alias24036: __typename, alias24037: __typename, alias24038: __typename, alias24039: __typename, alias24040: __typename, alias24041: __typename, alias24042: __typename, alias24043: __typename, alias24044: __typename, alias24045: __typename, alias24046: __typename, alias24047: __typename, alias24048: __typename, alias24049: __typename, alias24050: __typename, alias24051: __typename, alias24052: __typename, alias24053: __typename, alias24054: __typename, alias24055: __typename, alias24056: __typename, alias24057: __typename, alias24058: __typename, alias24059: __typename, alias24060: __typename, alias24061: __typename, alias24062: __typename, alias24063: __typename, alias24064: __typename, alias24065: __typename, alias24066: __typename, alias24067: __typename, alias24068: __typename, alias24069: __typename, alias24070: __typename, alias24071: __typename, alias24072: __typename, alias24073: __typename, alias24074: __typename, alias24075: __typename, alias24076: __typename, alias24077: __typename, alias24078: __typename, alias24079: __typename, alias24080: __typename, alias24081: __typename, alias24082: __typename, alias24083: __typename, alias24084: __typename, alias24085: __typename, alias24086: __typename, alias24087: __typename, alias24088: __typename, alias24089: __typename, alias24090: __typename, alias24091: __typename, alias24092: __typename, alias24093: __typename, alias24094: __typename, alias24095: __typename, alias24096: __typename, alias24097: __typename, alias24098: __typename, alias24099: __typename, alias24100: __typename, alias24101: __typename, alias24102: __typename, alias24103: __typename, alias24104: __typename, alias24105: __typename, alias24106: __typename, alias24107: __typename, alias24108: __typename, alias24109: __typename, alias24110: __typename, alias24111: __typename, alias24112: __typename, alias24113: __typename, alias24114: __typename, alias24115: __typename, alias24116: __typename, alias24117: __typename, alias24118: __typename, alias24119: __typename, alias24120: __typename, alias24121: __typename, alias24122: __typename, alias24123: __typename, alias24124: __typename, alias24125: __typename, alias24126: __typename, alias24127: __typename, alias24128: __typename, alias24129: __typename, alias24130: __typename, alias24131: __typename, alias24132: __typename, alias24133: __typename, alias24134: __typename, alias24135: __typename, alias24136: __typename, alias24137: __typename, alias24138: __typename, alias24139: __typename, alias24140: __typename, alias24141: __typename, alias24142: __typename, alias24143: __typename, alias24144: __typename, alias24145: __typename, alias24146: __typename, alias24147: __typename, alias24148: __typename, alias24149: __typename, alias24150: __typename, alias24151: __typename, alias24152: __typename, alias24153: __typename, alias24154: __typename, alias24155: __typename, alias24156: __typename, alias24157: __typename, alias24158: __typename, alias24159: __typename, alias24160: __typename, alias24161: __typename, alias24162: __typename, alias24163: __typename, alias24164: __typename, alias24165: __typename, alias24166: __typename, alias24167: __typename, alias24168: __typename, alias24169: __typename, alias24170: __typename, alias24171: __typename, alias24172: __typename, alias24173: __typename, alias24174: __typename, alias24175: __typename, alias24176: __typename, alias24177: __typename, alias24178: __typename, alias24179: __typename, alias24180: __typename, alias24181: __typename, alias24182: __typename, alias24183: __typename, alias24184: __typename, alias24185: __typename, alias24186: __typename, alias24187: __typename, alias24188: __typename, alias24189: __typename, alias24190: __typename, alias24191: __typename, alias24192: __typename, alias24193: __typename, alias24194: __typename, alias24195: __typename, alias24196: __typename, alias24197: __typename, alias24198: __typename, alias24199: __typename, alias24200: __typename, alias24201: __typename, alias24202: __typename, alias24203: __typename, alias24204: __typename, alias24205: __typename, alias24206: __typename, alias24207: __typename, alias24208: __typename, alias24209: __typename, alias24210: __typename, alias24211: __typename, alias24212: __typename, alias24213: __typename, alias24214: __typename, alias24215: __typename, alias24216: __typename, alias24217: __typename, alias24218: __typename, alias24219: __typename, alias24220: __typename, alias24221: __typename, alias24222: __typename, alias24223: __typename, alias24224: __typename, alias24225: __typename, alias24226: __typename, alias24227: __typename, alias24228: __typename, alias24229: __typename, alias24230: __typename, alias24231: __typename, alias24232: __typename, alias24233: __typename, alias24234: __typename, alias24235: __typename, alias24236: __typename, alias24237: __typename, alias24238: __typename, alias24239: __typename, alias24240: __typename, alias24241: __typename, alias24242: __typename, alias24243: __typename, alias24244: __typename, alias24245: __typename, alias24246: __typename, alias24247: __typename, alias24248: __typename, alias24249: __typename, alias24250: __typename, alias24251: __typename, alias24252: __typename, alias24253: __typename, alias24254: __typename, alias24255: __typename, alias24256: __typename, alias24257: __typename, alias24258: __typename, alias24259: __typename, alias24260: __typename, alias24261: __typename, alias24262: __typename, alias24263: __typename, alias24264: __typename, alias24265: __typename, alias24266: __typename, alias24267: __typename, alias24268: __typename, alias24269: __typename, alias24270: __typename, alias24271: __typename, alias24272: __typename, alias24273: __typename, alias24274: __typename, alias24275: __typename, alias24276: __typename, alias24277: __typename, alias24278: __typename, alias24279: __typename, alias24280: __typename, alias24281: __typename, alias24282: __typename, alias24283: __typename, alias24284: __typename, alias24285: __typename, alias24286: __typename, alias24287: __typename, alias24288: __typename, alias24289: __typename, alias24290: __typename, alias24291: __typename, alias24292: __typename, alias24293: __typename, alias24294: __typename, alias24295: __typename, alias24296: __typename, alias24297: __typename, alias24298: __typename, alias24299: __typename, alias24300: __typename, alias24301: __typename, alias24302: __typename, alias24303: __typename, alias24304: __typename, alias24305: __typename, alias24306: __typename, alias24307: __typename, alias24308: __typename, alias24309: __typename, alias24310: __typename, alias24311: __typename, alias24312: __typename, alias24313: __typename, alias24314: __typename, alias24315: __typename, alias24316: __typename, alias24317: __typename, alias24318: __typename, alias24319: __typename, alias24320: __typename, alias24321: __typename, alias24322: __typename, alias24323: __typename, alias24324: __typename, alias24325: __typename, alias24326: __typename, alias24327: __typename, alias24328: __typename, alias24329: __typename, alias24330: __typename, alias24331: __typename, alias24332: __typename, alias24333: __typename, alias24334: __typename, alias24335: __typename, alias24336: __typename, alias24337: __typename, alias24338: __typename, alias24339: __typename, alias24340: __typename, alias24341: __typename, alias24342: __typename, alias24343: __typename, alias24344: __typename, alias24345: __typename, alias24346: __typename, alias24347: __typename, alias24348: __typename, alias24349: __typename, alias24350: __typename, alias24351: __typename, alias24352: __typename, alias24353: __typename, alias24354: __typename, alias24355: __typename, alias24356: __typename, alias24357: __typename, alias24358: __typename, alias24359: __typename, alias24360: __typename, alias24361: __typename, alias24362: __typename, alias24363: __typename, alias24364: __typename, alias24365: __typename, alias24366: __typename, alias24367: __typename, alias24368: __typename, alias24369: __typename, alias24370: __typename, alias24371: __typename, alias24372: __typename, alias24373: __typename, alias24374: __typename, alias24375: __typename, alias24376: __typename, alias24377: __typename, alias24378: __typename, alias24379: __typename, alias24380: __typename, alias24381: __typename, alias24382: __typename, alias24383: __typename, alias24384: __typename, alias24385: __typename, alias24386: __typename, alias24387: __typename, alias24388: __typename, alias24389: __typename, alias24390: __typename, alias24391: __typename, alias24392: __typename, alias24393: __typename, alias24394: __typename, alias24395: __typename, alias24396: __typename, alias24397: __typename, alias24398: __typename, alias24399: __typename, alias24400: __typename, alias24401: __typename, alias24402: __typename, alias24403: __typename, alias24404: __typename, alias24405: __typename, alias24406: __typename, alias24407: __typename, alias24408: __typename, alias24409: __typename, alias24410: __typename, alias24411: __typename, alias24412: __typename, alias24413: __typename, alias24414: __typename, alias24415: __typename, alias24416: __typename, alias24417: __typename, alias24418: __typename, alias24419: __typename, alias24420: __typename, alias24421: __typename, alias24422: __typename, alias24423: __typename, alias24424: __typename, alias24425: __typename, alias24426: __typename, alias24427: __typename, alias24428: __typename, alias24429: __typename, alias24430: __typename, alias24431: __typename, alias24432: __typename, alias24433: __typename, alias24434: __typename, alias24435: __typename, alias24436: __typename, alias24437: __typename, alias24438: __typename, alias24439: __typename, alias24440: __typename, alias24441: __typename, alias24442: __typename, alias24443: __typename, alias24444: __typename, alias24445: __typename, alias24446: __typename, alias24447: __typename, alias24448: __typename, alias24449: __typename, alias24450: __typename, alias24451: __typename, alias24452: __typename, alias24453: __typename, alias24454: __typename, alias24455: __typename, alias24456: __typename, alias24457: __typename, alias24458: __typename, alias24459: __typename, alias24460: __typename, alias24461: __typename, alias24462: __typename, alias24463: __typename, alias24464: __typename, alias24465: __typename, alias24466: __typename, alias24467: __typename, alias24468: __typename, alias24469: __typename, alias24470: __typename, alias24471: __typename, alias24472: __typename, alias24473: __typename, alias24474: __typename, alias24475: __typename, alias24476: __typename, alias24477: __typename, alias24478: __typename, alias24479: __typename, alias24480: __typename, alias24481: __typename, alias24482: __typename, alias24483: __typename, alias24484: __typename, alias24485: __typename, alias24486: __typename, alias24487: __typename, alias24488: __typename, alias24489: __typename, alias24490: __typename, alias24491: __typename, alias24492: __typename, alias24493: __typename, alias24494: __typename, alias24495: __typename, alias24496: __typename, alias24497: __typename, alias24498: __typename, alias24499: __typename, alias24500: __typename, alias24501: __typename, alias24502: __typename, alias24503: __typename, alias24504: __typename, alias24505: __typename, alias24506: __typename, alias24507: __typename, alias24508: __typename, alias24509: __typename, alias24510: __typename, alias24511: __typename, alias24512: __typename, alias24513: __typename, alias24514: __typename, alias24515: __typename, alias24516: __typename, alias24517: __typename, alias24518: __typename, alias24519: __typename, alias24520: __typename, alias24521: __typename, alias24522: __typename, alias24523: __typename, alias24524: __typename, alias24525: __typename, alias24526: __typename, alias24527: __typename, alias24528: __typename, alias24529: __typename, alias24530: __typename, alias24531: __typename, alias24532: __typename, alias24533: __typename, alias24534: __typename, alias24535: __typename, alias24536: __typename, alias24537: __typename, alias24538: __typename, alias24539: __typename, alias24540: __typename, alias24541: __typename, alias24542: __typename, alias24543: __typename, alias24544: __typename, alias24545: __typename, alias24546: __typename, alias24547: __typename, alias24548: __typename, alias24549: __typename, alias24550: __typename, alias24551: __typename, alias24552: __typename, alias24553: __typename, alias24554: __typename, alias24555: __typename, alias24556: __typename, alias24557: __typename, alias24558: __typename, alias24559: __typename, alias24560: __typename, alias24561: __typename, alias24562: __typename, alias24563: __typename, alias24564: __typename, alias24565: __typename, alias24566: __typename, alias24567: __typename, alias24568: __typename, alias24569: __typename, alias24570: __typename, alias24571: __typename, alias24572: __typename, alias24573: __typename, alias24574: __typename, alias24575: __typename, alias24576: __typename, alias24577: __typename, alias24578: __typename, alias24579: __typename, alias24580: __typename, alias24581: __typename, alias24582: __typename, alias24583: __typename, alias24584: __typename, alias24585: __typename, alias24586: __typename, alias24587: __typename, alias24588: __typename, alias24589: __typename, alias24590: __typename, alias24591: __typename, alias24592: __typename, alias24593: __typename, alias24594: __typename, alias24595: __typename, alias24596: __typename, alias24597: __typename, alias24598: __typename, alias24599: __typename, alias24600: __typename, alias24601: __typename, alias24602: __typename, alias24603: __typename, alias24604: __typename, alias24605: __typename, alias24606: __typename, alias24607: __typename, alias24608: __typename, alias24609: __typename, alias24610: __typename, alias24611: __typename, alias24612: __typename, alias24613: __typename, alias24614: __typename, alias24615: __typename, alias24616: __typename, alias24617: __typename, alias24618: __typename, alias24619: __typename, alias24620: __typename, alias24621: __typename, alias24622: __typename, alias24623: __typename, alias24624: __typename, alias24625: __typename, alias24626: __typename, alias24627: __typename, alias24628: __typename, alias24629: __typename, alias24630: __typename, alias24631: __typename, alias24632: __typename, alias24633: __typename, alias24634: __typename, alias24635: __typename, alias24636: __typename, alias24637: __typename, alias24638: __typename, alias24639: __typename, alias24640: __typename, alias24641: __typename, alias24642: __typename, alias24643: __typename, alias24644: __typename, alias24645: __typename, alias24646: __typename, alias24647: __typename, alias24648: __typename, alias24649: __typename, alias24650: __typename, alias24651: __typename, alias24652: __typename, alias24653: __typename, alias24654: __typename, alias24655: __typename, alias24656: __typename, alias24657: __typename, alias24658: __typename, alias24659: __typename, alias24660: __typename, alias24661: __typename, alias24662: __typename, alias24663: __typename, alias24664: __typename, alias24665: __typename, alias24666: __typename, alias24667: __typename, alias24668: __typename, alias24669: __typename, alias24670: __typename, alias24671: __typename, alias24672: __typename, alias24673: __typename, alias24674: __typename, alias24675: __typename, alias24676: __typename, alias24677: __typename, alias24678: __typename, alias24679: __typename, alias24680: __typename, alias24681: __typename, alias24682: __typename, alias24683: __typename, alias24684: __typename, alias24685: __typename, alias24686: __typename, alias24687: __typename, alias24688: __typename, alias24689: __typename, alias24690: __typename, alias24691: __typename, alias24692: __typename, alias24693: __typename, alias24694: __typename, alias24695: __typename, alias24696: __typename, alias24697: __typename, alias24698: __typename, alias24699: __typename, alias24700: __typename, alias24701: __typename, alias24702: __typename, alias24703: __typename, alias24704: __typename, alias24705: __typename, alias24706: __typename, alias24707: __typename, alias24708: __typename, alias24709: __typename, alias24710: __typename, alias24711: __typename, alias24712: __typename, alias24713: __typename, alias24714: __typename, alias24715: __typename, alias24716: __typename, alias24717: __typename, alias24718: __typename, alias24719: __typename, alias24720: __typename, alias24721: __typename, alias24722: __typename, alias24723: __typename, alias24724: __typename, alias24725: __typename, alias24726: __typename, alias24727: __typename, alias24728: __typename, alias24729: __typename, alias24730: __typename, alias24731: __typename, alias24732: __typename, alias24733: __typename, alias24734: __typename, alias24735: __typename, alias24736: __typename, alias24737: __typename, alias24738: __typename, alias24739: __typename, alias24740: __typename, alias24741: __typename, alias24742: __typename, alias24743: __typename, alias24744: __typename, alias24745: __typename, alias24746: __typename, alias24747: __typename, alias24748: __typename, alias24749: __typename, alias24750: __typename, alias24751: __typename, alias24752: __typename, alias24753: __typename, alias24754: __typename, alias24755: __typename, alias24756: __typename, alias24757: __typename, alias24758: __typename, alias24759: __typename, alias24760: __typename, alias24761: __typename, alias24762: __typename, alias24763: __typename, alias24764: __typename, alias24765: __typename, alias24766: __typename, alias24767: __typename, alias24768: __typename, alias24769: __typename, alias24770: __typename, alias24771: __typename, alias24772: __typename, alias24773: __typename, alias24774: __typename, alias24775: __typename, alias24776: __typename, alias24777: __typename, alias24778: __typename, alias24779: __typename, alias24780: __typename, alias24781: __typename, alias24782: __typename, alias24783: __typename, alias24784: __typename, alias24785: __typename, alias24786: __typename, alias24787: __typename, alias24788: __typename, alias24789: __typename, alias24790: __typename, alias24791: __typename, alias24792: __typename, alias24793: __typename, alias24794: __typename, alias24795: __typename, alias24796: __typename, alias24797: __typename, alias24798: __typename, alias24799: __typename, alias24800: __typename, alias24801: __typename, alias24802: __typename, alias24803: __typename, alias24804: __typename, alias24805: __typename, alias24806: __typename, alias24807: __typename, alias24808: __typename, alias24809: __typename, alias24810: __typename, alias24811: __typename, alias24812: __typename, alias24813: __typename, alias24814: __typename, alias24815: __typename, alias24816: __typename, alias24817: __typename, alias24818: __typename, alias24819: __typename, alias24820: __typename, alias24821: __typename, alias24822: __typename, alias24823: __typename, alias24824: __typename, alias24825: __typename, alias24826: __typename, alias24827: __typename, alias24828: __typename, alias24829: __typename, alias24830: __typename, alias24831: __typename, alias24832: __typename, alias24833: __typename, alias24834: __typename, alias24835: __typename, alias24836: __typename, alias24837: __typename, alias24838: __typename, alias24839: __typename, alias24840: __typename, alias24841: __typename, alias24842: __typename, alias24843: __typename, alias24844: __typename, alias24845: __typename, alias24846: __typename, alias24847: __typename, alias24848: __typename, alias24849: __typename, alias24850: __typename, alias24851: __typename, alias24852: __typename, alias24853: __typename, alias24854: __typename, alias24855: __typename, alias24856: __typename, alias24857: __typename, alias24858: __typename, alias24859: __typename, alias24860: __typename, alias24861: __typename, alias24862: __typename, alias24863: __typename, alias24864: __typename, alias24865: __typename, alias24866: __typename, alias24867: __typename, alias24868: __typename, alias24869: __typename, alias24870: __typename, alias24871: __typename, alias24872: __typename, alias24873: __typename, alias24874: __typename, alias24875: __typename, alias24876: __typename, alias24877: __typename, alias24878: __typename, alias24879: __typename, alias24880: __typename, alias24881: __typename, alias24882: __typename, alias24883: __typename, alias24884: __typename, alias24885: __typename, alias24886: __typename, alias24887: __typename, alias24888: __typename, alias24889: __typename, alias24890: __typename, alias24891: __typename, alias24892: __typename, alias24893: __typename, alias24894: __typename, alias24895: __typename, alias24896: __typename, alias24897: __typename, alias24898: __typename, alias24899: __typename, alias24900: __typename, alias24901: __typename, alias24902: __typename, alias24903: __typename, alias24904: __typename, alias24905: __typename, alias24906: __typename, alias24907: __typename, alias24908: __typename, alias24909: __typename, alias24910: __typename, alias24911: __typename, alias24912: __typename, alias24913: __typename, alias24914: __typename, alias24915: __typename, alias24916: __typename, alias24917: __typename, alias24918: __typename, alias24919: __typename, alias24920: __typename, alias24921: __typename, alias24922: __typename, alias24923: __typename, alias24924: __typename, alias24925: __typename, alias24926: __typename, alias24927: __typename, alias24928: __typename, alias24929: __typename, alias24930: __typename, alias24931: __typename, alias24932: __typename, alias24933: __typename, alias24934: __typename, alias24935: __typename, alias24936: __typename, alias24937: __typename, alias24938: __typename, alias24939: __typename, alias24940: __typename, alias24941: __typename, alias24942: __typename, alias24943: __typename, alias24944: __typename, alias24945: __typename, alias24946: __typename, alias24947: __typename, alias24948: __typename, alias24949: __typename, alias24950: __typename, alias24951: __typename, alias24952: __typename, alias24953: __typename, alias24954: __typename, alias24955: __typename, alias24956: __typename, alias24957: __typename, alias24958: __typename, alias24959: __typename, alias24960: __typename, alias24961: __typename, alias24962: __typename, alias24963: __typename, alias24964: __typename, alias24965: __typename, alias24966: __typename, alias24967: __typename, alias24968: __typename, alias24969: __typename, alias24970: __typename, alias24971: __typename, alias24972: __typename, alias24973: __typename, alias24974: __typename, alias24975: __typename, alias24976: __typename, alias24977: __typename, alias24978: __typename, alias24979: __typename, alias24980: __typename, alias24981: __typename, alias24982: __typename, alias24983: __typename, alias24984: __typename, alias24985: __typename, alias24986: __typename, alias24987: __typename, alias24988: __typename, alias24989: __typename, alias24990: __typename, alias24991: __typename, alias24992: __typename, alias24993: __typename, alias24994: __typename, alias24995: __typename, alias24996: __typename, alias24997: __typename, alias24998: __typename, alias24999: __typename, alias25000: __typename, alias25001: __typename, alias25002: __typename, alias25003: __typename, alias25004: __typename, alias25005: __typename, alias25006: __typename, alias25007: __typename, alias25008: __typename, alias25009: __typename, alias25010: __typename, alias25011: __typename, alias25012: __typename, alias25013: __typename, alias25014: __typename, alias25015: __typename, alias25016: __typename, alias25017: __typename, alias25018: __typename, alias25019: __typename, alias25020: __typename, alias25021: __typename, alias25022: __typename, alias25023: __typename, alias25024: __typename, alias25025: __typename, alias25026: __typename, alias25027: __typename, alias25028: __typename, alias25029: __typename, alias25030: __typename, alias25031: __typename, alias25032: __typename, alias25033: __typename, alias25034: __typename, alias25035: __typename, alias25036: __typename, alias25037: __typename, alias25038: __typename, alias25039: __typename, alias25040: __typename, alias25041: __typename, alias25042: __typename, alias25043: __typename, alias25044: __typename, alias25045: __typename, alias25046: __typename, alias25047: __typename, alias25048: __typename, alias25049: __typename, alias25050: __typename, alias25051: __typename, alias25052: __typename, alias25053: __typename, alias25054: __typename, alias25055: __typename, alias25056: __typename, alias25057: __typename, alias25058: __typename, alias25059: __typename, alias25060: __typename, alias25061: __typename, alias25062: __typename, alias25063: __typename, alias25064: __typename, alias25065: __typename, alias25066: __typename, alias25067: __typename, alias25068: __typename, alias25069: __typename, alias25070: __typename, alias25071: __typename, alias25072: __typename, alias25073: __typename, alias25074: __typename, alias25075: __typename, alias25076: __typename, alias25077: __typename, alias25078: __typename, alias25079: __typename, alias25080: __typename, alias25081: __typename, alias25082: __typename, alias25083: __typename, alias25084: __typename, alias25085: __typename, alias25086: __typename, alias25087: __typename, alias25088: __typename, alias25089: __typename, alias25090: __typename, alias25091: __typename, alias25092: __typename, alias25093: __typename, alias25094: __typename, alias25095: __typename, alias25096: __typename, alias25097: __typename, alias25098: __typename, alias25099: __typename, alias25100: __typename, alias25101: __typename, alias25102: __typename, alias25103: __typename, alias25104: __typename, alias25105: __typename, alias25106: __typename, alias25107: __typename, alias25108: __typename, alias25109: __typename, alias25110: __typename, alias25111: __typename, alias25112: __typename, alias25113: __typename, alias25114: __typename, alias25115: __typename, alias25116: __typename, alias25117: __typename, alias25118: __typename, alias25119: __typename, alias25120: __typename, alias25121: __typename, alias25122: __typename, alias25123: __typename, alias25124: __typename, alias25125: __typename, alias25126: __typename, alias25127: __typename, alias25128: __typename, alias25129: __typename, alias25130: __typename, alias25131: __typename, alias25132: __typename, alias25133: __typename, alias25134: __typename, alias25135: __typename, alias25136: __typename, alias25137: __typename, alias25138: __typename, alias25139: __typename, alias25140: __typename, alias25141: __typename, alias25142: __typename, alias25143: __typename, alias25144: __typename, alias25145: __typename, alias25146: __typename, alias25147: __typename, alias25148: __typename, alias25149: __typename, alias25150: __typename, alias25151: __typename, alias25152: __typename, alias25153: __typename, alias25154: __typename, alias25155: __typename, alias25156: __typename, alias25157: __typename, alias25158: __typename, alias25159: __typename, alias25160: __typename, alias25161: __typename, alias25162: __typename, alias25163: __typename, alias25164: __typename, alias25165: __typename, alias25166: __typename, alias25167: __typename, alias25168: __typename, alias25169: __typename, alias25170: __typename, alias25171: __typename, alias25172: __typename, alias25173: __typename, alias25174: __typename, alias25175: __typename, alias25176: __typename, alias25177: __typename, alias25178: __typename, alias25179: __typename, alias25180: __typename, alias25181: __typename, alias25182: __typename, alias25183: __typename, alias25184: __typename, alias25185: __typename, alias25186: __typename, alias25187: __typename, alias25188: __typename, alias25189: __typename, alias25190: __typename, alias25191: __typename, alias25192: __typename, alias25193: __typename, alias25194: __typename, alias25195: __typename, alias25196: __typename, alias25197: __typename, alias25198: __typename, alias25199: __typename, alias25200: __typename, alias25201: __typename, alias25202: __typename, alias25203: __typename, alias25204: __typename, alias25205: __typename, alias25206: __typename, alias25207: __typename, alias25208: __typename, alias25209: __typename, alias25210: __typename, alias25211: __typename, alias25212: __typename, alias25213: __typename, alias25214: __typename, alias25215: __typename, alias25216: __typename, alias25217: __typename, alias25218: __typename, alias25219: __typename, alias25220: __typename, alias25221: __typename, alias25222: __typename, alias25223: __typename, alias25224: __typename, alias25225: __typename, alias25226: __typename, alias25227: __typename, alias25228: __typename, alias25229: __typename, alias25230: __typename, alias25231: __typename, alias25232: __typename, alias25233: __typename, alias25234: __typename, alias25235: __typename, alias25236: __typename, alias25237: __typename, alias25238: __typename, alias25239: __typename, alias25240: __typename, alias25241: __typename, alias25242: __typename, alias25243: __typename, alias25244: __typename, alias25245: __typename, alias25246: __typename, alias25247: __typename, alias25248: __typename, alias25249: __typename, alias25250: __typename, alias25251: __typename, alias25252: __typename, alias25253: __typename, alias25254: __typename, alias25255: __typename, alias25256: __typename, alias25257: __typename, alias25258: __typename, alias25259: __typename, alias25260: __typename, alias25261: __typename, alias25262: __typename, alias25263: __typename, alias25264: __typename, alias25265: __typename, alias25266: __typename, alias25267: __typename, alias25268: __typename, alias25269: __typename, alias25270: __typename, alias25271: __typename, alias25272: __typename, alias25273: __typename, alias25274: __typename, alias25275: __typename, alias25276: __typename, alias25277: __typename, alias25278: __typename, alias25279: __typename, alias25280: __typename, alias25281: __typename, alias25282: __typename, alias25283: __typename, alias25284: __typename, alias25285: __typename, alias25286: __typename, alias25287: __typename, alias25288: __typename, alias25289: __typename, alias25290: __typename, alias25291: __typename, alias25292: __typename, alias25293: __typename, alias25294: __typename, alias25295: __typename, alias25296: __typename, alias25297: __typename, alias25298: __typename, alias25299: __typename, alias25300: __typename, alias25301: __typename, alias25302: __typename, alias25303: __typename, alias25304: __typename, alias25305: __typename, alias25306: __typename, alias25307: __typename, alias25308: __typename, alias25309: __typename, alias25310: __typename, alias25311: __typename, alias25312: __typename, alias25313: __typename, alias25314: __typename, alias25315: __typename, alias25316: __typename, alias25317: __typename, alias25318: __typename, alias25319: __typename, alias25320: __typename, alias25321: __typename, alias25322: __typename, alias25323: __typename, alias25324: __typename, alias25325: __typename, alias25326: __typename, alias25327: __typename, alias25328: __typename, alias25329: __typename, alias25330: __typename, alias25331: __typename, alias25332: __typename, alias25333: __typename, alias25334: __typename, alias25335: __typename, alias25336: __typename, alias25337: __typename, alias25338: __typename, alias25339: __typename, alias25340: __typename, alias25341: __typename, alias25342: __typename, alias25343: __typename, alias25344: __typename, alias25345: __typename, alias25346: __typename, alias25347: __typename, alias25348: __typename, alias25349: __typename, alias25350: __typename, alias25351: __typename, alias25352: __typename, alias25353: __typename, alias25354: __typename, alias25355: __typename, alias25356: __typename, alias25357: __typename, alias25358: __typename, alias25359: __typename, alias25360: __typename, alias25361: __typename, alias25362: __typename, alias25363: __typename, alias25364: __typename, alias25365: __typename, alias25366: __typename, alias25367: __typename, alias25368: __typename, alias25369: __typename, alias25370: __typename, alias25371: __typename, alias25372: __typename, alias25373: __typename, alias25374: __typename, alias25375: __typename, alias25376: __typename, alias25377: __typename, alias25378: __typename, alias25379: __typename, alias25380: __typename, alias25381: __typename, alias25382: __typename, alias25383: __typename, alias25384: __typename, alias25385: __typename, alias25386: __typename, alias25387: __typename, alias25388: __typename, alias25389: __typename, alias25390: __typename, alias25391: __typename, alias25392: __typename, alias25393: __typename, alias25394: __typename, alias25395: __typename, alias25396: __typename, alias25397: __typename, alias25398: __typename, alias25399: __typename, alias25400: __typename, alias25401: __typename, alias25402: __typename, alias25403: __typename, alias25404: __typename, alias25405: __typename, alias25406: __typename, alias25407: __typename, alias25408: __typename, alias25409: __typename, alias25410: __typename, alias25411: __typename, alias25412: __typename, alias25413: __typename, alias25414: __typename, alias25415: __typename, alias25416: __typename, alias25417: __typename, alias25418: __typename, alias25419: __typename, alias25420: __typename, alias25421: __typename, alias25422: __typename, alias25423: __typename, alias25424: __typename, alias25425: __typename, alias25426: __typename, alias25427: __typename, alias25428: __typename, alias25429: __typename, alias25430: __typename, alias25431: __typename, alias25432: __typename, alias25433: __typename, alias25434: __typename, alias25435: __typename, alias25436: __typename, alias25437: __typename, alias25438: __typename, alias25439: __typename, alias25440: __typename, alias25441: __typename, alias25442: __typename, alias25443: __typename, alias25444: __typename, alias25445: __typename, alias25446: __typename, alias25447: __typename, alias25448: __typename, alias25449: __typename, alias25450: __typename, alias25451: __typename, alias25452: __typename, alias25453: __typename, alias25454: __typename, alias25455: __typename, alias25456: __typename, alias25457: __typename, alias25458: __typename, alias25459: __typename, alias25460: __typename, alias25461: __typename, alias25462: __typename, alias25463: __typename, alias25464: __typename, alias25465: __typename, alias25466: __typename, alias25467: __typename, alias25468: __typename, alias25469: __typename, alias25470: __typename, alias25471: __typename, alias25472: __typename, alias25473: __typename, alias25474: __typename, alias25475: __typename, alias25476: __typename, alias25477: __typename, alias25478: __typename, alias25479: __typename, alias25480: __typename, alias25481: __typename, alias25482: __typename, alias25483: __typename, alias25484: __typename, alias25485: __typename, alias25486: __typename, alias25487: __typename, alias25488: __typename, alias25489: __typename, alias25490: __typename, alias25491: __typename, alias25492: __typename, alias25493: __typename, alias25494: __typename, alias25495: __typename, alias25496: __typename, alias25497: __typename, alias25498: __typename, alias25499: __typename, alias25500: __typename, alias25501: __typename, alias25502: __typename, alias25503: __typename, alias25504: __typename, alias25505: __typename, alias25506: __typename, alias25507: __typename, alias25508: __typename, alias25509: __typename, alias25510: __typename, alias25511: __typename, alias25512: __typename, alias25513: __typename, alias25514: __typename, alias25515: __typename, alias25516: __typename, alias25517: __typename, alias25518: __typename, alias25519: __typename, alias25520: __typename, alias25521: __typename, alias25522: __typename, alias25523: __typename, alias25524: __typename, alias25525: __typename, alias25526: __typename, alias25527: __typename, alias25528: __typename, alias25529: __typename, alias25530: __typename, alias25531: __typename, alias25532: __typename, alias25533: __typename, alias25534: __typename, alias25535: __typename, alias25536: __typename, alias25537: __typename, alias25538: __typename, alias25539: __typename, alias25540: __typename, alias25541: __typename, alias25542: __typename, alias25543: __typename, alias25544: __typename, alias25545: __typename, alias25546: __typename, alias25547: __typename, alias25548: __typename, alias25549: __typename, alias25550: __typename, alias25551: __typename, alias25552: __typename, alias25553: __typename, alias25554: __typename, alias25555: __typename, alias25556: __typename, alias25557: __typename, alias25558: __typename, alias25559: __typename, alias25560: __typename, alias25561: __typename, alias25562: __typename, alias25563: __typename, alias25564: __typename, alias25565: __typename, alias25566: __typename, alias25567: __typename, alias25568: __typename, alias25569: __typename, alias25570: __typename, alias25571: __typename, alias25572: __typename, alias25573: __typename, alias25574: __typename, alias25575: __typename, alias25576: __typename, alias25577: __typename, alias25578: __typename, alias25579: __typename, alias25580: __typename, alias25581: __typename, alias25582: __typename, alias25583: __typename, alias25584: __typename, alias25585: __typename, alias25586: __typename, alias25587: __typename, alias25588: __typename, alias25589: __typename, alias25590: __typename, alias25591: __typename, alias25592: __typename, alias25593: __typename, alias25594: __typename, alias25595: __typename, alias25596: __typename, alias25597: __typename, alias25598: __typename, alias25599: __typename, alias25600: __typename, alias25601: __typename, alias25602: __typename, alias25603: __typename, alias25604: __typename, alias25605: __typename, alias25606: __typename, alias25607: __typename, alias25608: __typename, alias25609: __typename, alias25610: __typename, alias25611: __typename, alias25612: __typename, alias25613: __typename, alias25614: __typename, alias25615: __typename, alias25616: __typename, alias25617: __typename, alias25618: __typename, alias25619: __typename, alias25620: __typename, alias25621: __typename, alias25622: __typename, alias25623: __typename, alias25624: __typename, alias25625: __typename, alias25626: __typename, alias25627: __typename, alias25628: __typename, alias25629: __typename, alias25630: __typename, alias25631: __typename, alias25632: __typename, alias25633: __typename, alias25634: __typename, alias25635: __typename, alias25636: __typename, alias25637: __typename, alias25638: __typename, alias25639: __typename, alias25640: __typename, alias25641: __typename, alias25642: __typename, alias25643: __typename, alias25644: __typename, alias25645: __typename, alias25646: __typename, alias25647: __typename, alias25648: __typename, alias25649: __typename, alias25650: __typename, alias25651: __typename, alias25652: __typename, alias25653: __typename, alias25654: __typename, alias25655: __typename, alias25656: __typename, alias25657: __typename, alias25658: __typename, alias25659: __typename, alias25660: __typename, alias25661: __typename, alias25662: __typename, alias25663: __typename, alias25664: __typename, alias25665: __typename, alias25666: __typename, alias25667: __typename, alias25668: __typename, alias25669: __typename, alias25670: __typename, alias25671: __typename, alias25672: __typename, alias25673: __typename, alias25674: __typename, alias25675: __typename, alias25676: __typename, alias25677: __typename, alias25678: __typename, alias25679: __typename, alias25680: __typename, alias25681: __typename, alias25682: __typename, alias25683: __typename, alias25684: __typename, alias25685: __typename, alias25686: __typename, alias25687: __typename, alias25688: __typename, alias25689: __typename, alias25690: __typename, alias25691: __typename, alias25692: __typename, alias25693: __typename, alias25694: __typename, alias25695: __typename, alias25696: __typename, alias25697: __typename, alias25698: __typename, alias25699: __typename, alias25700: __typename, alias25701: __typename, alias25702: __typename, alias25703: __typename, alias25704: __typename, alias25705: __typename, alias25706: __typename, alias25707: __typename, alias25708: __typename, alias25709: __typename, alias25710: __typename, alias25711: __typename, alias25712: __typename, alias25713: __typename, alias25714: __typename, alias25715: __typename, alias25716: __typename, alias25717: __typename, alias25718: __typename, alias25719: __typename, alias25720: __typename, alias25721: __typename, alias25722: __typename, alias25723: __typename, alias25724: __typename, alias25725: __typename, alias25726: __typename, alias25727: __typename, alias25728: __typename, alias25729: __typename, alias25730: __typename, alias25731: __typename, alias25732: __typename, alias25733: __typename, alias25734: __typename, alias25735: __typename, alias25736: __typename, alias25737: __typename, alias25738: __typename, alias25739: __typename, alias25740: __typename, alias25741: __typename, alias25742: __typename, alias25743: __typename, alias25744: __typename, alias25745: __typename, alias25746: __typename, alias25747: __typename, alias25748: __typename, alias25749: __typename, alias25750: __typename, alias25751: __typename, alias25752: __typename, alias25753: __typename, alias25754: __typename, alias25755: __typename, alias25756: __typename, alias25757: __typename, alias25758: __typename, alias25759: __typename, alias25760: __typename, alias25761: __typename, alias25762: __typename, alias25763: __typename, alias25764: __typename, alias25765: __typename, alias25766: __typename, alias25767: __typename, alias25768: __typename, alias25769: __typename, alias25770: __typename, alias25771: __typename, alias25772: __typename, alias25773: __typename, alias25774: __typename, alias25775: __typename, alias25776: __typename, alias25777: __typename, alias25778: __typename, alias25779: __typename, alias25780: __typename, alias25781: __typename, alias25782: __typename, alias25783: __typename, alias25784: __typename, alias25785: __typename, alias25786: __typename, alias25787: __typename, alias25788: __typename, alias25789: __typename, alias25790: __typename, alias25791: __typename, alias25792: __typename, alias25793: __typename, alias25794: __typename, alias25795: __typename, alias25796: __typename, alias25797: __typename, alias25798: __typename, alias25799: __typename, alias25800: __typename, alias25801: __typename, alias25802: __typename, alias25803: __typename, alias25804: __typename, alias25805: __typename, alias25806: __typename, alias25807: __typename, alias25808: __typename, alias25809: __typename, alias25810: __typename, alias25811: __typename, alias25812: __typename, alias25813: __typename, alias25814: __typename, alias25815: __typename, alias25816: __typename, alias25817: __typename, alias25818: __typename, alias25819: __typename, alias25820: __typename, alias25821: __typename, alias25822: __typename, alias25823: __typename, alias25824: __typename, alias25825: __typename, alias25826: __typename, alias25827: __typename, alias25828: __typename, alias25829: __typename, alias25830: __typename, alias25831: __typename, alias25832: __typename, alias25833: __typename, alias25834: __typename, alias25835: __typename, alias25836: __typename, alias25837: __typename, alias25838: __typename, alias25839: __typename, alias25840: __typename, alias25841: __typename, alias25842: __typename, alias25843: __typename, alias25844: __typename, alias25845: __typename, alias25846: __typename, alias25847: __typename, alias25848: __typename, alias25849: __typename, alias25850: __typename, alias25851: __typename, alias25852: __typename, alias25853: __typename, alias25854: __typename, alias25855: __typename, alias25856: __typename, alias25857: __typename, alias25858: __typename, alias25859: __typename, alias25860: __typename, alias25861: __typename, alias25862: __typename, alias25863: __typename, alias25864: __typename, alias25865: __typename, alias25866: __typename, alias25867: __typename, alias25868: __typename, alias25869: __typename, alias25870: __typename, alias25871: __typename, alias25872: __typename, alias25873: __typename, alias25874: __typename, alias25875: __typename, alias25876: __typename, alias25877: __typename, alias25878: __typename, alias25879: __typename, alias25880: __typename, alias25881: __typename, alias25882: __typename, alias25883: __typename, alias25884: __typename, alias25885: __typename, alias25886: __typename, alias25887: __typename, alias25888: __typename, alias25889: __typename, alias25890: __typename, alias25891: __typename, alias25892: __typename, alias25893: __typename, alias25894: __typename, alias25895: __typename, alias25896: __typename, alias25897: __typename, alias25898: __typename, alias25899: __typename, alias25900: __typename, alias25901: __typename, alias25902: __typename, alias25903: __typename, alias25904: __typename, alias25905: __typename, alias25906: __typename, alias25907: __typename, alias25908: __typename, alias25909: __typename, alias25910: __typename, alias25911: __typename, alias25912: __typename, alias25913: __typename, alias25914: __typename, alias25915: __typename, alias25916: __typename, alias25917: __typename, alias25918: __typename, alias25919: __typename, alias25920: __typename, alias25921: __typename, alias25922: __typename, alias25923: __typename, alias25924: __typename, alias25925: __typename, alias25926: __typename, alias25927: __typename, alias25928: __typename, alias25929: __typename, alias25930: __typename, alias25931: __typename, alias25932: __typename, alias25933: __typename, alias25934: __typename, alias25935: __typename, alias25936: __typename, alias25937: __typename, alias25938: __typename, alias25939: __typename, alias25940: __typename, alias25941: __typename, alias25942: __typename, alias25943: __typename, alias25944: __typename, alias25945: __typename, alias25946: __typename, alias25947: __typename, alias25948: __typename, alias25949: __typename, alias25950: __typename, alias25951: __typename, alias25952: __typename, alias25953: __typename, alias25954: __typename, alias25955: __typename, alias25956: __typename, alias25957: __typename, alias25958: __typename, alias25959: __typename, alias25960: __typename, alias25961: __typename, alias25962: __typename, alias25963: __typename, alias25964: __typename, alias25965: __typename, alias25966: __typename, alias25967: __typename, alias25968: __typename, alias25969: __typename, alias25970: __typename, alias25971: __typename, alias25972: __typename, alias25973: __typename, alias25974: __typename, alias25975: __typename, alias25976: __typename, alias25977: __typename, alias25978: __typename, alias25979: __typename, alias25980: __typename, alias25981: __typename, alias25982: __typename, alias25983: __typename, alias25984: __typename, alias25985: __typename, alias25986: __typename, alias25987: __typename, alias25988: __typename, alias25989: __typename, alias25990: __typename, alias25991: __typename, alias25992: __typename, alias25993: __typename, alias25994: __typename, alias25995: __typename, alias25996: __typename, alias25997: __typename, alias25998: __typename, alias25999: __typename, alias26000: __typename, alias26001: __typename, alias26002: __typename, alias26003: __typename, alias26004: __typename, alias26005: __typename, alias26006: __typename, alias26007: __typename, alias26008: __typename, alias26009: __typename, alias26010: __typename, alias26011: __typename, alias26012: __typename, alias26013: __typename, alias26014: __typename, alias26015: __typename, alias26016: __typename, alias26017: __typename, alias26018: __typename, alias26019: __typename, alias26020: __typename, alias26021: __typename, alias26022: __typename, alias26023: __typename, alias26024: __typename, alias26025: __typename, alias26026: __typename, alias26027: __typename, alias26028: __typename, alias26029: __typename, alias26030: __typename, alias26031: __typename, alias26032: __typename, alias26033: __typename, alias26034: __typename, alias26035: __typename, alias26036: __typename, alias26037: __typename, alias26038: __typename, alias26039: __typename, alias26040: __typename, alias26041: __typename, alias26042: __typename, alias26043: __typename, alias26044: __typename, alias26045: __typename, alias26046: __typename, alias26047: __typename, alias26048: __typename, alias26049: __typename, alias26050: __typename, alias26051: __typename, alias26052: __typename, alias26053: __typename, alias26054: __typename, alias26055: __typename, alias26056: __typename, alias26057: __typename, alias26058: __typename, alias26059: __typename, alias26060: __typename, alias26061: __typename, alias26062: __typename, alias26063: __typename, alias26064: __typename, alias26065: __typename, alias26066: __typename, alias26067: __typename, alias26068: __typename, alias26069: __typename, alias26070: __typename, alias26071: __typename, alias26072: __typename, alias26073: __typename, alias26074: __typename, alias26075: __typename, alias26076: __typename, alias26077: __typename, alias26078: __typename, alias26079: __typename, alias26080: __typename, alias26081: __typename, alias26082: __typename, alias26083: __typename, alias26084: __typename, alias26085: __typename, alias26086: __typename, alias26087: __typename, alias26088: __typename, alias26089: __typename, alias26090: __typename, alias26091: __typename, alias26092: __typename, alias26093: __typename, alias26094: __typename, alias26095: __typename, alias26096: __typename, alias26097: __typename, alias26098: __typename, alias26099: __typename, alias26100: __typename, alias26101: __typename, alias26102: __typename, alias26103: __typename, alias26104: __typename, alias26105: __typename, alias26106: __typename, alias26107: __typename, alias26108: __typename, alias26109: __typename, alias26110: __typename, alias26111: __typename, alias26112: __typename, alias26113: __typename, alias26114: __typename, alias26115: __typename, alias26116: __typename, alias26117: __typename, alias26118: __typename, alias26119: __typename, alias26120: __typename, alias26121: __typename, alias26122: __typename, alias26123: __typename, alias26124: __typename, alias26125: __typename, alias26126: __typename, alias26127: __typename, alias26128: __typename, alias26129: __typename, alias26130: __typename, alias26131: __typename, alias26132: __typename, alias26133: __typename, alias26134: __typename, alias26135: __typename, alias26136: __typename, alias26137: __typename, alias26138: __typename, alias26139: __typename, alias26140: __typename, alias26141: __typename, alias26142: __typename, alias26143: __typename, alias26144: __typename, alias26145: __typename, alias26146: __typename, alias26147: __typename, alias26148: __typename, alias26149: __typename, alias26150: __typename, alias26151: __typename, alias26152: __typename, alias26153: __typename, alias26154: __typename, alias26155: __typename, alias26156: __typename, alias26157: __typename, alias26158: __typename, alias26159: __typename, alias26160: __typename, alias26161: __typename, alias26162: __typename, alias26163: __typename, alias26164: __typename, alias26165: __typename, alias26166: __typename, alias26167: __typename, alias26168: __typename, alias26169: __typename, alias26170: __typename, alias26171: __typename, alias26172: __typename, alias26173: __typename, alias26174: __typename, alias26175: __typename, alias26176: __typename, alias26177: __typename, alias26178: __typename, alias26179: __typename, alias26180: __typename, alias26181: __typename, alias26182: __typename, alias26183: __typename, alias26184: __typename, alias26185: __typename, alias26186: __typename, alias26187: __typename, alias26188: __typename, alias26189: __typename, alias26190: __typename, alias26191: __typename, alias26192: __typename, alias26193: __typename, alias26194: __typename, alias26195: __typename, alias26196: __typename, alias26197: __typename, alias26198: __typename, alias26199: __typename, alias26200: __typename, alias26201: __typename, alias26202: __typename, alias26203: __typename, alias26204: __typename, alias26205: __typename, alias26206: __typename, alias26207: __typename, alias26208: __typename, alias26209: __typename, alias26210: __typename, alias26211: __typename, alias26212: __typename, alias26213: __typename, alias26214: __typename, alias26215: __typename, alias26216: __typename, alias26217: __typename, alias26218: __typename, alias26219: __typename, alias26220: __typename, alias26221: __typename, alias26222: __typename, alias26223: __typename, alias26224: __typename, alias26225: __typename, alias26226: __typename, alias26227: __typename, alias26228: __typename, alias26229: __typename, alias26230: __typename, alias26231: __typename, alias26232: __typename, alias26233: __typename, alias26234: __typename, alias26235: __typename, alias26236: __typename, alias26237: __typename, alias26238: __typename, alias26239: __typename, alias26240: __typename, alias26241: __typename, alias26242: __typename, alias26243: __typename, alias26244: __typename, alias26245: __typename, alias26246: __typename, alias26247: __typename, alias26248: __typename, alias26249: __typename, alias26250: __typename, alias26251: __typename, alias26252: __typename, alias26253: __typename, alias26254: __typename, alias26255: __typename, alias26256: __typename, alias26257: __typename, alias26258: __typename, alias26259: __typename, alias26260: __typename, alias26261: __typename, alias26262: __typename, alias26263: __typename, alias26264: __typename, alias26265: __typename, alias26266: __typename, alias26267: __typename, alias26268: __typename, alias26269: __typename, alias26270: __typename, alias26271: __typename, alias26272: __typename, alias26273: __typename, alias26274: __typename, alias26275: __typename, alias26276: __typename, alias26277: __typename, alias26278: __typename, alias26279: __typename, alias26280: __typename, alias26281: __typename, alias26282: __typename, alias26283: __typename, alias26284: __typename, alias26285: __typename, alias26286: __typename, alias26287: __typename, alias26288: __typename, alias26289: __typename, alias26290: __typename, alias26291: __typename, alias26292: __typename, alias26293: __typename, alias26294: __typename, alias26295: __typename, alias26296: __typename, alias26297: __typename, alias26298: __typename, alias26299: __typename, alias26300: __typename, alias26301: __typename, alias26302: __typename, alias26303: __typename, alias26304: __typename, alias26305: __typename, alias26306: __typename, alias26307: __typename, alias26308: __typename, alias26309: __typename, alias26310: __typename, alias26311: __typename, alias26312: __typename, alias26313: __typename, alias26314: __typename, alias26315: __typename, alias26316: __typename, alias26317: __typename, alias26318: __typename, alias26319: __typename, alias26320: __typename, alias26321: __typename, alias26322: __typename, alias26323: __typename, alias26324: __typename, alias26325: __typename, alias26326: __typename, alias26327: __typename, alias26328: __typename, alias26329: __typename, alias26330: __typename, alias26331: __typename, alias26332: __typename, alias26333: __typename, alias26334: __typename, alias26335: __typename, alias26336: __typename, alias26337: __typename, alias26338: __typename, alias26339: __typename, alias26340: __typename, alias26341: __typename, alias26342: __typename, alias26343: __typename, alias26344: __typename, alias26345: __typename, alias26346: __typename, alias26347: __typename, alias26348: __typename, alias26349: __typename, alias26350: __typename, alias26351: __typename, alias26352: __typename, alias26353: __typename, alias26354: __typename, alias26355: __typename, alias26356: __typename, alias26357: __typename, alias26358: __typename, alias26359: __typename, alias26360: __typename, alias26361: __typename, alias26362: __typename, alias26363: __typename, alias26364: __typename, alias26365: __typename, alias26366: __typename, alias26367: __typename, alias26368: __typename, alias26369: __typename, alias26370: __typename, alias26371: __typename, alias26372: __typename, alias26373: __typename, alias26374: __typename, alias26375: __typename, alias26376: __typename, alias26377: __typename, alias26378: __typename, alias26379: __typename, alias26380: __typename, alias26381: __typename, alias26382: __typename, alias26383: __typename, alias26384: __typename, alias26385: __typename, alias26386: __typename, alias26387: __typename, alias26388: __typename, alias26389: __typename, alias26390: __typename, alias26391: __typename, alias26392: __typename, alias26393: __typename, alias26394: __typename, alias26395: __typename, alias26396: __typename, alias26397: __typename, alias26398: __typename, alias26399: __typename, alias26400: __typename, alias26401: __typename, alias26402: __typename, alias26403: __typename, alias26404: __typename, alias26405: __typename, alias26406: __typename, alias26407: __typename, alias26408: __typename, alias26409: __typename, alias26410: __typename, alias26411: __typename, alias26412: __typename, alias26413: __typename, alias26414: __typename, alias26415: __typename, alias26416: __typename, alias26417: __typename, alias26418: __typename, alias26419: __typename, alias26420: __typename, alias26421: __typename, alias26422: __typename, alias26423: __typename, alias26424: __typename, alias26425: __typename, alias26426: __typename, alias26427: __typename, alias26428: __typename, alias26429: __typename, alias26430: __typename, alias26431: __typename, alias26432: __typename, alias26433: __typename, alias26434: __typename, alias26435: __typename, alias26436: __typename, alias26437: __typename, alias26438: __typename, alias26439: __typename, alias26440: __typename, alias26441: __typename, alias26442: __typename, alias26443: __typename, alias26444: __typename, alias26445: __typename, alias26446: __typename, alias26447: __typename, alias26448: __typename, alias26449: __typename, alias26450: __typename, alias26451: __typename, alias26452: __typename, alias26453: __typename, alias26454: __typename, alias26455: __typename, alias26456: __typename, alias26457: __typename, alias26458: __typename, alias26459: __typename, alias26460: __typename, alias26461: __typename, alias26462: __typename, alias26463: __typename, alias26464: __typename, alias26465: __typename, alias26466: __typename, alias26467: __typename, alias26468: __typename, alias26469: __typename, alias26470: __typename, alias26471: __typename, alias26472: __typename, alias26473: __typename, alias26474: __typename, alias26475: __typename, alias26476: __typename, alias26477: __typename, alias26478: __typename, alias26479: __typename, alias26480: __typename, alias26481: __typename, alias26482: __typename, alias26483: __typename, alias26484: __typename, alias26485: __typename, alias26486: __typename, alias26487: __typename, alias26488: __typename, alias26489: __typename, alias26490: __typename, alias26491: __typename, alias26492: __typename, alias26493: __typename, alias26494: __typename, alias26495: __typename, alias26496: __typename, alias26497: __typename, alias26498: __typename, alias26499: __typename, alias26500: __typename, alias26501: __typename, alias26502: __typename, alias26503: __typename, alias26504: __typename, alias26505: __typename, alias26506: __typename, alias26507: __typename, alias26508: __typename, alias26509: __typename, alias26510: __typename, alias26511: __typename, alias26512: __typename, alias26513: __typename, alias26514: __typename, alias26515: __typename, alias26516: __typename, alias26517: __typename, alias26518: __typename, alias26519: __typename, alias26520: __typename, alias26521: __typename, alias26522: __typename, alias26523: __typename, alias26524: __typename, alias26525: __typename, alias26526: __typename, alias26527: __typename, alias26528: __typename, alias26529: __typename, alias26530: __typename, alias26531: __typename, alias26532: __typename, alias26533: __typename, alias26534: __typename, alias26535: __typename, alias26536: __typename, alias26537: __typename, alias26538: __typename, alias26539: __typename, alias26540: __typename, alias26541: __typename, alias26542: __typename, alias26543: __typename, alias26544: __typename, alias26545: __typename, alias26546: __typename, alias26547: __typename, alias26548: __typename, alias26549: __typename, alias26550: __typename, alias26551: __typename, alias26552: __typename, alias26553: __typename, alias26554: __typename, alias26555: __typename, alias26556: __typename, alias26557: __typename, alias26558: __typename, alias26559: __typename, alias26560: __typename, alias26561: __typename, alias26562: __typename, alias26563: __typename, alias26564: __typename, alias26565: __typename, alias26566: __typename, alias26567: __typename, alias26568: __typename, alias26569: __typename, alias26570: __typename, alias26571: __typename, alias26572: __typename, alias26573: __typename, alias26574: __typename, alias26575: __typename, alias26576: __typename, alias26577: __typename, alias26578: __typename, alias26579: __typename, alias26580: __typename, alias26581: __typename, alias26582: __typename, alias26583: __typename, alias26584: __typename, alias26585: __typename, alias26586: __typename, alias26587: __typename, alias26588: __typename, alias26589: __typename, alias26590: __typename, alias26591: __typename, alias26592: __typename, alias26593: __typename, alias26594: __typename, alias26595: __typename, alias26596: __typename, alias26597: __typename, alias26598: __typename, alias26599: __typename, alias26600: __typename, alias26601: __typename, alias26602: __typename, alias26603: __typename, alias26604: __typename, alias26605: __typename, alias26606: __typename, alias26607: __typename, alias26608: __typename, alias26609: __typename, alias26610: __typename, alias26611: __typename, alias26612: __typename, alias26613: __typename, alias26614: __typename, alias26615: __typename, alias26616: __typename, alias26617: __typename, alias26618: __typename, alias26619: __typename, alias26620: __typename, alias26621: __typename, alias26622: __typename, alias26623: __typename, alias26624: __typename, alias26625: __typename, alias26626: __typename, alias26627: __typename, alias26628: __typename, alias26629: __typename, alias26630: __typename, alias26631: __typename, alias26632: __typename, alias26633: __typename, alias26634: __typename, alias26635: __typename, alias26636: __typename, alias26637: __typename, alias26638: __typename, alias26639: __typename, alias26640: __typename, alias26641: __typename, alias26642: __typename, alias26643: __typename, alias26644: __typename, alias26645: __typename, alias26646: __typename, alias26647: __typename, alias26648: __typename, alias26649: __typename, alias26650: __typename, alias26651: __typename, alias26652: __typename, alias26653: __typename, alias26654: __typename, alias26655: __typename, alias26656: __typename, alias26657: __typename, alias26658: __typename, alias26659: __typename, alias26660: __typename, alias26661: __typename, alias26662: __typename, alias26663: __typename, alias26664: __typename, alias26665: __typename, alias26666: __typename, alias26667: __typename, alias26668: __typename, alias26669: __typename, alias26670: __typename, alias26671: __typename, alias26672: __typename, alias26673: __typename, alias26674: __typename, alias26675: __typename, alias26676: __typename, alias26677: __typename, alias26678: __typename, alias26679: __typename, alias26680: __typename, alias26681: __typename, alias26682: __typename, alias26683: __typename, alias26684: __typename, alias26685: __typename, alias26686: __typename, alias26687: __typename, alias26688: __typename, alias26689: __typename, alias26690: __typename, alias26691: __typename, alias26692: __typename, alias26693: __typename, alias26694: __typename, alias26695: __typename, alias26696: __typename, alias26697: __typename, alias26698: __typename, alias26699: __typename, alias26700: __typename, alias26701: __typename, alias26702: __typename, alias26703: __typename, alias26704: __typename, alias26705: __typename, alias26706: __typename, alias26707: __typename, alias26708: __typename, alias26709: __typename, alias26710: __typename, alias26711: __typename, alias26712: __typename, alias26713: __typename, alias26714: __typename, alias26715: __typename, alias26716: __typename, alias26717: __typename, alias26718: __typename, alias26719: __typename, alias26720: __typename, alias26721: __typename, alias26722: __typename, alias26723: __typename, alias26724: __typename, alias26725: __typename, alias26726: __typename, alias26727: __typename, alias26728: __typename, alias26729: __typename, alias26730: __typename, alias26731: __typename, alias26732: __typename, alias26733: __typename, alias26734: __typename, alias26735: __typename, alias26736: __typename, alias26737: __typename, alias26738: __typename, alias26739: __typename, alias26740: __typename, alias26741: __typename, alias26742: __typename, alias26743: __typename, alias26744: __typename, alias26745: __typename, alias26746: __typename, alias26747: __typename, alias26748: __typename, alias26749: __typename, alias26750: __typename, alias26751: __typename, alias26752: __typename, alias26753: __typename, alias26754: __typename, alias26755: __typename, alias26756: __typename, alias26757: __typename, alias26758: __typename, alias26759: __typename, alias26760: __typename, alias26761: __typename, alias26762: __typename, alias26763: __typename, alias26764: __typename, alias26765: __typename, alias26766: __typename, alias26767: __typename, alias26768: __typename, alias26769: __typename, alias26770: __typename, alias26771: __typename, alias26772: __typename, alias26773: __typename, alias26774: __typename, alias26775: __typename, alias26776: __typename, alias26777: __typename, alias26778: __typename, alias26779: __typename, alias26780: __typename, alias26781: __typename, alias26782: __typename, alias26783: __typename, alias26784: __typename, alias26785: __typename, alias26786: __typename, alias26787: __typename, alias26788: __typename, alias26789: __typename, alias26790: __typename, alias26791: __typename, alias26792: __typename, alias26793: __typename, alias26794: __typename, alias26795: __typename, alias26796: __typename, alias26797: __typename, alias26798: __typename, alias26799: __typename, alias26800: __typename, alias26801: __typename, alias26802: __typename, alias26803: __typename, alias26804: __typename, alias26805: __typename, alias26806: __typename, alias26807: __typename, alias26808: __typename, alias26809: __typename, alias26810: __typename, alias26811: __typename, alias26812: __typename, alias26813: __typename, alias26814: __typename, alias26815: __typename, alias26816: __typename, alias26817: __typename, alias26818: __typename, alias26819: __typename, alias26820: __typename, alias26821: __typename, alias26822: __typename, alias26823: __typename, alias26824: __typename, alias26825: __typename, alias26826: __typename, alias26827: __typename, alias26828: __typename, alias26829: __typename, alias26830: __typename, alias26831: __typename, alias26832: __typename, alias26833: __typename, alias26834: __typename, alias26835: __typename, alias26836: __typename, alias26837: __typename, alias26838: __typename, alias26839: __typename, alias26840: __typename, alias26841: __typename, alias26842: __typename, alias26843: __typename, alias26844: __typename, alias26845: __typename, alias26846: __typename, alias26847: __typename, alias26848: __typename, alias26849: __typename, alias26850: __typename, alias26851: __typename, alias26852: __typename, alias26853: __typename, alias26854: __typename, alias26855: __typename, alias26856: __typename, alias26857: __typename, alias26858: __typename, alias26859: __typename, alias26860: __typename, alias26861: __typename, alias26862: __typename, alias26863: __typename, alias26864: __typename, alias26865: __typename, alias26866: __typename, alias26867: __typename, alias26868: __typename, alias26869: __typename, alias26870: __typename, alias26871: __typename, alias26872: __typename, alias26873: __typename, alias26874: __typename, alias26875: __typename, alias26876: __typename, alias26877: __typename, alias26878: __typename, alias26879: __typename, alias26880: __typename, alias26881: __typename, alias26882: __typename, alias26883: __typename, alias26884: __typename, alias26885: __typename, alias26886: __typename, alias26887: __typename, alias26888: __typename, alias26889: __typename, alias26890: __typename, alias26891: __typename, alias26892: __typename, alias26893: __typename, alias26894: __typename, alias26895: __typename, alias26896: __typename, alias26897: __typename, alias26898: __typename, alias26899: __typename, alias26900: __typename, alias26901: __typename, alias26902: __typename, alias26903: __typename, alias26904: __typename, alias26905: __typename, alias26906: __typename, alias26907: __typename, alias26908: __typename, alias26909: __typename, alias26910: __typename, alias26911: __typename, alias26912: __typename, alias26913: __typename, alias26914: __typename, alias26915: __typename, alias26916: __typename, alias26917: __typename, alias26918: __typename, alias26919: __typename, alias26920: __typename, alias26921: __typename, alias26922: __typename, alias26923: __typename, alias26924: __typename, alias26925: __typename, alias26926: __typename, alias26927: __typename, alias26928: __typename, alias26929: __typename, alias26930: __typename, alias26931: __typename, alias26932: __typename, alias26933: __typename, alias26934: __typename, alias26935: __typename, alias26936: __typename, alias26937: __typename, alias26938: __typename, alias26939: __typename, alias26940: __typename, alias26941: __typename, alias26942: __typename, alias26943: __typename, alias26944: __typename, alias26945: __typename, alias26946: __typename, alias26947: __typename, alias26948: __typename, alias26949: __typename, alias26950: __typename, alias26951: __typename, alias26952: __typename, alias26953: __typename, alias26954: __typename, alias26955: __typename, alias26956: __typename, alias26957: __typename, alias26958: __typename, alias26959: __typename, alias26960: __typename, alias26961: __typename, alias26962: __typename, alias26963: __typename, alias26964: __typename, alias26965: __typename, alias26966: __typename, alias26967: __typename, alias26968: __typename, alias26969: __typename, alias26970: __typename, alias26971: __typename, alias26972: __typename, alias26973: __typename, alias26974: __typename, alias26975: __typename, alias26976: __typename, alias26977: __typename, alias26978: __typename, alias26979: __typename, alias26980: __typename, alias26981: __typename, alias26982: __typename, alias26983: __typename, alias26984: __typename, alias26985: __typename, alias26986: __typename, alias26987: __typename, alias26988: __typename, alias26989: __typename, alias26990: __typename, alias26991: __typename, alias26992: __typename, alias26993: __typename, alias26994: __typename, alias26995: __typename, alias26996: __typename, alias26997: __typename, alias26998: __typename, alias26999: __typename, alias27000: __typename, alias27001: __typename, alias27002: __typename, alias27003: __typename, alias27004: __typename, alias27005: __typename, alias27006: __typename, alias27007: __typename, alias27008: __typename, alias27009: __typename, alias27010: __typename, alias27011: __typename, alias27012: __typename, alias27013: __typename, alias27014: __typename, alias27015: __typename, alias27016: __typename, alias27017: __typename, alias27018: __typename, alias27019: __typename, alias27020: __typename, alias27021: __typename, alias27022: __typename, alias27023: __typename, alias27024: __typename, alias27025: __typename, alias27026: __typename, alias27027: __typename, alias27028: __typename, alias27029: __typename, alias27030: __typename, alias27031: __typename, alias27032: __typename, alias27033: __typename, alias27034: __typename, alias27035: __typename, alias27036: __typename, alias27037: __typename, alias27038: __typename, alias27039: __typename, alias27040: __typename, alias27041: __typename, alias27042: __typename, alias27043: __typename, alias27044: __typename, alias27045: __typename, alias27046: __typename, alias27047: __typename, alias27048: __typename, alias27049: __typename, alias27050: __typename, alias27051: __typename, alias27052: __typename, alias27053: __typename, alias27054: __typename, alias27055: __typename, alias27056: __typename, alias27057: __typename, alias27058: __typename, alias27059: __typename, alias27060: __typename, alias27061: __typename, alias27062: __typename, alias27063: __typename, alias27064: __typename, alias27065: __typename, alias27066: __typename, alias27067: __typename, alias27068: __typename, alias27069: __typename, alias27070: __typename, alias27071: __typename, alias27072: __typename, alias27073: __typename, alias27074: __typename, alias27075: __typename, alias27076: __typename, alias27077: __typename, alias27078: __typename, alias27079: __typename, alias27080: __typename, alias27081: __typename, alias27082: __typename, alias27083: __typename, alias27084: __typename, alias27085: __typename, alias27086: __typename, alias27087: __typename, alias27088: __typename, alias27089: __typename, alias27090: __typename, alias27091: __typename, alias27092: __typename, alias27093: __typename, alias27094: __typename, alias27095: __typename, alias27096: __typename, alias27097: __typename, alias27098: __typename, alias27099: __typename, alias27100: __typename, alias27101: __typename, alias27102: __typename, alias27103: __typename, alias27104: __typename, alias27105: __typename, alias27106: __typename, alias27107: __typename, alias27108: __typename, alias27109: __typename, alias27110: __typename, alias27111: __typename, alias27112: __typename, alias27113: __typename, alias27114: __typename, alias27115: __typename, alias27116: __typename, alias27117: __typename, alias27118: __typename, alias27119: __typename, alias27120: __typename, alias27121: __typename, alias27122: __typename, alias27123: __typename, alias27124: __typename, alias27125: __typename, alias27126: __typename, alias27127: __typename, alias27128: __typename, alias27129: __typename, alias27130: __typename, alias27131: __typename, alias27132: __typename, alias27133: __typename, alias27134: __typename, alias27135: __typename, alias27136: __typename, alias27137: __typename, alias27138: __typename, alias27139: __typename, alias27140: __typename, alias27141: __typename, alias27142: __typename, alias27143: __typename, alias27144: __typename, alias27145: __typename, alias27146: __typename, alias27147: __typename, alias27148: __typename, alias27149: __typename, alias27150: __typename, alias27151: __typename, alias27152: __typename, alias27153: __typename, alias27154: __typename, alias27155: __typename, alias27156: __typename, alias27157: __typename, alias27158: __typename, alias27159: __typename, alias27160: __typename, alias27161: __typename, alias27162: __typename, alias27163: __typename, alias27164: __typename, alias27165: __typename, alias27166: __typename, alias27167: __typename, alias27168: __typename, alias27169: __typename, alias27170: __typename, alias27171: __typename, alias27172: __typename, alias27173: __typename, alias27174: __typename, alias27175: __typename, alias27176: __typename, alias27177: __typename, alias27178: __typename, alias27179: __typename, alias27180: __typename, alias27181: __typename, alias27182: __typename, alias27183: __typename, alias27184: __typename, alias27185: __typename, alias27186: __typename, alias27187: __typename, alias27188: __typename, alias27189: __typename, alias27190: __typename, alias27191: __typename, alias27192: __typename, alias27193: __typename, alias27194: __typename, alias27195: __typename, alias27196: __typename, alias27197: __typename, alias27198: __typename, alias27199: __typename, alias27200: __typename, alias27201: __typename, alias27202: __typename, alias27203: __typename, alias27204: __typename, alias27205: __typename, alias27206: __typename, alias27207: __typename, alias27208: __typename, alias27209: __typename, alias27210: __typename, alias27211: __typename, alias27212: __typename, alias27213: __typename, alias27214: __typename, alias27215: __typename, alias27216: __typename, alias27217: __typename, alias27218: __typename, alias27219: __typename, alias27220: __typename, alias27221: __typename, alias27222: __typename, alias27223: __typename, alias27224: __typename, alias27225: __typename, alias27226: __typename, alias27227: __typename, alias27228: __typename, alias27229: __typename, alias27230: __typename, alias27231: __typename, alias27232: __typename, alias27233: __typename, alias27234: __typename, alias27235: __typename, alias27236: __typename, alias27237: __typename, alias27238: __typename, alias27239: __typename, alias27240: __typename, alias27241: __typename, alias27242: __typename, alias27243: __typename, alias27244: __typename, alias27245: __typename, alias27246: __typename, alias27247: __typename, alias27248: __typename, alias27249: __typename, alias27250: __typename, alias27251: __typename, alias27252: __typename, alias27253: __typename, alias27254: __typename, alias27255: __typename, alias27256: __typename, alias27257: __typename, alias27258: __typename, alias27259: __typename, alias27260: __typename, alias27261: __typename, alias27262: __typename, alias27263: __typename, alias27264: __typename, alias27265: __typename, alias27266: __typename, alias27267: __typename, alias27268: __typename, alias27269: __typename, alias27270: __typename, alias27271: __typename, alias27272: __typename, alias27273: __typename, alias27274: __typename, alias27275: __typename, alias27276: __typename, alias27277: __typename, alias27278: __typename, alias27279: __typename, alias27280: __typename, alias27281: __typename, alias27282: __typename, alias27283: __typename, alias27284: __typename, alias27285: __typename, alias27286: __typename, alias27287: __typename, alias27288: __typename, alias27289: __typename, alias27290: __typename, alias27291: __typename, alias27292: __typename, alias27293: __typename, alias27294: __typename, alias27295: __typename, alias27296: __typename, alias27297: __typename, alias27298: __typename, alias27299: __typename, alias27300: __typename, alias27301: __typename, alias27302: __typename, alias27303: __typename, alias27304: __typename, alias27305: __typename, alias27306: __typename, alias27307: __typename, alias27308: __typename, alias27309: __typename, alias27310: __typename, alias27311: __typename, alias27312: __typename, alias27313: __typename, alias27314: __typename, alias27315: __typename, alias27316: __typename, alias27317: __typename, alias27318: __typename, alias27319: __typename, alias27320: __typename, alias27321: __typename, alias27322: __typename, alias27323: __typename, alias27324: __typename, alias27325: __typename, alias27326: __typename, alias27327: __typename, alias27328: __typename, alias27329: __typename, alias27330: __typename, alias27331: __typename, alias27332: __typename, alias27333: __typename, alias27334: __typename, alias27335: __typename, alias27336: __typename, alias27337: __typename, alias27338: __typename, alias27339: __typename, alias27340: __typename, alias27341: __typename, alias27342: __typename, alias27343: __typename, alias27344: __typename, alias27345: __typename, alias27346: __typename, alias27347: __typename, alias27348: __typename, alias27349: __typename, alias27350: __typename, alias27351: __typename, alias27352: __typename, alias27353: __typename, alias27354: __typename, alias27355: __typename, alias27356: __typename, alias27357: __typename, alias27358: __typename, alias27359: __typename, alias27360: __typename, alias27361: __typename, alias27362: __typename, alias27363: __typename, alias27364: __typename, alias27365: __typename, alias27366: __typename, alias27367: __typename, alias27368: __typename, alias27369: __typename, alias27370: __typename, alias27371: __typename, alias27372: __typename, alias27373: __typename, alias27374: __typename, alias27375: __typename, alias27376: __typename, alias27377: __typename, alias27378: __typename, alias27379: __typename, alias27380: __typename, alias27381: __typename, alias27382: __typename, alias27383: __typename, alias27384: __typename, alias27385: __typename, alias27386: __typename, alias27387: __typename, alias27388: __typename, alias27389: __typename, alias27390: __typename, alias27391: __typename, alias27392: __typename, alias27393: __typename, alias27394: __typename, alias27395: __typename, alias27396: __typename, alias27397: __typename, alias27398: __typename, alias27399: __typename, alias27400: __typename, alias27401: __typename, alias27402: __typename, alias27403: __typename, alias27404: __typename, alias27405: __typename, alias27406: __typename, alias27407: __typename, alias27408: __typename, alias27409: __typename, alias27410: __typename, alias27411: __typename, alias27412: __typename, alias27413: __typename, alias27414: __typename, alias27415: __typename, alias27416: __typename, alias27417: __typename, alias27418: __typename, alias27419: __typename, alias27420: __typename, alias27421: __typename, alias27422: __typename, alias27423: __typename, alias27424: __typename, alias27425: __typename, alias27426: __typename, alias27427: __typename, alias27428: __typename, alias27429: __typename, alias27430: __typename, alias27431: __typename, alias27432: __typename, alias27433: __typename, alias27434: __typename, alias27435: __typename, alias27436: __typename, alias27437: __typename, alias27438: __typename, alias27439: __typename, alias27440: __typename, alias27441: __typename, alias27442: __typename, alias27443: __typename, alias27444: __typename, alias27445: __typename, alias27446: __typename, alias27447: __typename, alias27448: __typename, alias27449: __typename, alias27450: __typename, alias27451: __typename, alias27452: __typename, alias27453: __typename, alias27454: __typename, alias27455: __typename, alias27456: __typename, alias27457: __typename, alias27458: __typename, alias27459: __typename, alias27460: __typename, alias27461: __typename, alias27462: __typename, alias27463: __typename, alias27464: __typename, alias27465: __typename, alias27466: __typename, alias27467: __typename, alias27468: __typename, alias27469: __typename, alias27470: __typename, alias27471: __typename, alias27472: __typename, alias27473: __typename, alias27474: __typename, alias27475: __typename, alias27476: __typename, alias27477: __typename, alias27478: __typename, alias27479: __typename, alias27480: __typename, alias27481: __typename, alias27482: __typename, alias27483: __typename, alias27484: __typename, alias27485: __typename, alias27486: __typename, alias27487: __typename, alias27488: __typename, alias27489: __typename, alias27490: __typename, alias27491: __typename, alias27492: __typename, alias27493: __typename, alias27494: __typename, alias27495: __typename, alias27496: __typename, alias27497: __typename, alias27498: __typename, alias27499: __typename, alias27500: __typename, alias27501: __typename, alias27502: __typename, alias27503: __typename, alias27504: __typename, alias27505: __typename, alias27506: __typename, alias27507: __typename, alias27508: __typename, alias27509: __typename, alias27510: __typename, alias27511: __typename, alias27512: __typename, alias27513: __typename, alias27514: __typename, alias27515: __typename, alias27516: __typename, alias27517: __typename, alias27518: __typename, alias27519: __typename, alias27520: __typename, alias27521: __typename, alias27522: __typename, alias27523: __typename, alias27524: __typename, alias27525: __typename, alias27526: __typename, alias27527: __typename, alias27528: __typename, alias27529: __typename, alias27530: __typename, alias27531: __typename, alias27532: __typename, alias27533: __typename, alias27534: __typename, alias27535: __typename, alias27536: __typename, alias27537: __typename, alias27538: __typename, alias27539: __typename, alias27540: __typename, alias27541: __typename, alias27542: __typename, alias27543: __typename, alias27544: __typename, alias27545: __typename, alias27546: __typename, alias27547: __typename, alias27548: __typename, alias27549: __typename, alias27550: __typename, alias27551: __typename, alias27552: __typename, alias27553: __typename, alias27554: __typename, alias27555: __typename, alias27556: __typename, alias27557: __typename, alias27558: __typename, alias27559: __typename, alias27560: __typename, alias27561: __typename, alias27562: __typename, alias27563: __typename, alias27564: __typename, alias27565: __typename, alias27566: __typename, alias27567: __typename, alias27568: __typename, alias27569: __typename, alias27570: __typename, alias27571: __typename, alias27572: __typename, alias27573: __typename, alias27574: __typename, alias27575: __typename, alias27576: __typename, alias27577: __typename, alias27578: __typename, alias27579: __typename, alias27580: __typename, alias27581: __typename, alias27582: __typename, alias27583: __typename, alias27584: __typename, alias27585: __typename, alias27586: __typename, alias27587: __typename, alias27588: __typename, alias27589: __typename, alias27590: __typename, alias27591: __typename, alias27592: __typename, alias27593: __typename, alias27594: __typename, alias27595: __typename, alias27596: __typename, alias27597: __typename, alias27598: __typename, alias27599: __typename, alias27600: __typename, alias27601: __typename, alias27602: __typename, alias27603: __typename, alias27604: __typename, alias27605: __typename, alias27606: __typename, alias27607: __typename, alias27608: __typename, alias27609: __typename, alias27610: __typename, alias27611: __typename, alias27612: __typename, alias27613: __typename, alias27614: __typename, alias27615: __typename, alias27616: __typename, alias27617: __typename, alias27618: __typename, alias27619: __typename, alias27620: __typename, alias27621: __typename, alias27622: __typename, alias27623: __typename, alias27624: __typename, alias27625: __typename, alias27626: __typename, alias27627: __typename, alias27628: __typename, alias27629: __typename, alias27630: __typename, alias27631: __typename, alias27632: __typename, alias27633: __typename, alias27634: __typename, alias27635: __typename, alias27636: __typename, alias27637: __typename, alias27638: __typename, alias27639: __typename, alias27640: __typename, alias27641: __typename, alias27642: __typename, alias27643: __typename, alias27644: __typename, alias27645: __typename, alias27646: __typename, alias27647: __typename, alias27648: __typename, alias27649: __typename, alias27650: __typename, alias27651: __typename, alias27652: __typename, alias27653: __typename, alias27654: __typename, alias27655: __typename, alias27656: __typename, alias27657: __typename, alias27658: __typename, alias27659: __typename, alias27660: __typename, alias27661: __typename, alias27662: __typename, alias27663: __typename, alias27664: __typename, alias27665: __typename, alias27666: __typename, alias27667: __typename, alias27668: __typename, alias27669: __typename, alias27670: __typename, alias27671: __typename, alias27672: __typename, alias27673: __typename, alias27674: __typename, alias27675: __typename, alias27676: __typename, alias27677: __typename, alias27678: __typename, alias27679: __typename, alias27680: __typename, alias27681: __typename, alias27682: __typename, alias27683: __typename, alias27684: __typename, alias27685: __typename, alias27686: __typename, alias27687: __typename, alias27688: __typename, alias27689: __typename, alias27690: __typename, alias27691: __typename, alias27692: __typename, alias27693: __typename, alias27694: __typename, alias27695: __typename, alias27696: __typename, alias27697: __typename, alias27698: __typename, alias27699: __typename, alias27700: __typename, alias27701: __typename, alias27702: __typename, alias27703: __typename, alias27704: __typename, alias27705: __typename, alias27706: __typename, alias27707: __typename, alias27708: __typename, alias27709: __typename, alias27710: __typename, alias27711: __typename, alias27712: __typename, alias27713: __typename, alias27714: __typename, alias27715: __typename, alias27716: __typename, alias27717: __typename, alias27718: __typename, alias27719: __typename, alias27720: __typename, alias27721: __typename, alias27722: __typename, alias27723: __typename, alias27724: __typename, alias27725: __typename, alias27726: __typename, alias27727: __typename, alias27728: __typename, alias27729: __typename, alias27730: __typename, alias27731: __typename, alias27732: __typename, alias27733: __typename, alias27734: __typename, alias27735: __typename, alias27736: __typename, alias27737: __typename, alias27738: __typename, alias27739: __typename, alias27740: __typename, alias27741: __typename, alias27742: __typename, alias27743: __typename, alias27744: __typename, alias27745: __typename, alias27746: __typename, alias27747: __typename, alias27748: __typename, alias27749: __typename, alias27750: __typename, alias27751: __typename, alias27752: __typename, alias27753: __typename, alias27754: __typename, alias27755: __typename, alias27756: __typename, alias27757: __typename, alias27758: __typename, alias27759: __typename, alias27760: __typename, alias27761: __typename, alias27762: __typename, alias27763: __typename, alias27764: __typename, alias27765: __typename, alias27766: __typename, alias27767: __typename, alias27768: __typename, alias27769: __typename, alias27770: __typename, alias27771: __typename, alias27772: __typename, alias27773: __typename, alias27774: __typename, alias27775: __typename, alias27776: __typename, alias27777: __typename, alias27778: __typename, alias27779: __typename, alias27780: __typename, alias27781: __typename, alias27782: __typename, alias27783: __typename, alias27784: __typename, alias27785: __typename, alias27786: __typename, alias27787: __typename, alias27788: __typename, alias27789: __typename, alias27790: __typename, alias27791: __typename, alias27792: __typename, alias27793: __typename, alias27794: __typename, alias27795: __typename, alias27796: __typename, alias27797: __typename, alias27798: __typename, alias27799: __typename, alias27800: __typename, alias27801: __typename, alias27802: __typename, alias27803: __typename, alias27804: __typename, alias27805: __typename, alias27806: __typename, alias27807: __typename, alias27808: __typename, alias27809: __typename, alias27810: __typename, alias27811: __typename, alias27812: __typename, alias27813: __typename, alias27814: __typename, alias27815: __typename, alias27816: __typename, alias27817: __typename, alias27818: __typename, alias27819: __typename, alias27820: __typename, alias27821: __typename, alias27822: __typename, alias27823: __typename, alias27824: __typename, alias27825: __typename, alias27826: __typename, alias27827: __typename, alias27828: __typename, alias27829: __typename, alias27830: __typename, alias27831: __typename, alias27832: __typename, alias27833: __typename, alias27834: __typename, alias27835: __typename, alias27836: __typename, alias27837: __typename, alias27838: __typename, alias27839: __typename, alias27840: __typename, alias27841: __typename, alias27842: __typename, alias27843: __typename, alias27844: __typename, alias27845: __typename, alias27846: __typename, alias27847: __typename, alias27848: __typename, alias27849: __typename, alias27850: __typename, alias27851: __typename, alias27852: __typename, alias27853: __typename, alias27854: __typename, alias27855: __typename, alias27856: __typename, alias27857: __typename, alias27858: __typename, alias27859: __typename, alias27860: __typename, alias27861: __typename, alias27862: __typename, alias27863: __typename, alias27864: __typename, alias27865: __typename, alias27866: __typename, alias27867: __typename, alias27868: __typename, alias27869: __typename, alias27870: __typename, alias27871: __typename, alias27872: __typename, alias27873: __typename, alias27874: __typename, alias27875: __typename, alias27876: __typename, alias27877: __typename, alias27878: __typename, alias27879: __typename, alias27880: __typename, alias27881: __typename, alias27882: __typename, alias27883: __typename, alias27884: __typename, alias27885: __typename, alias27886: __typename, alias27887: __typename, alias27888: __typename, alias27889: __typename, alias27890: __typename, alias27891: __typename, alias27892: __typename, alias27893: __typename, alias27894: __typename, alias27895: __typename, alias27896: __typename, alias27897: __typename, alias27898: __typename, alias27899: __typename, alias27900: __typename, alias27901: __typename, alias27902: __typename, alias27903: __typename, alias27904: __typename, alias27905: __typename, alias27906: __typename, alias27907: __typename, alias27908: __typename, alias27909: __typename, alias27910: __typename, alias27911: __typename, alias27912: __typename, alias27913: __typename, alias27914: __typename, alias27915: __typename, alias27916: __typename, alias27917: __typename, alias27918: __typename, alias27919: __typename, alias27920: __typename, alias27921: __typename, alias27922: __typename, alias27923: __typename, alias27924: __typename, alias27925: __typename, alias27926: __typename, alias27927: __typename, alias27928: __typename, alias27929: __typename, alias27930: __typename, alias27931: __typename, alias27932: __typename, alias27933: __typename, alias27934: __typename, alias27935: __typename, alias27936: __typename, alias27937: __typename, alias27938: __typename, alias27939: __typename, alias27940: __typename, alias27941: __typename, alias27942: __typename, alias27943: __typename, alias27944: __typename, alias27945: __typename, alias27946: __typename, alias27947: __typename, alias27948: __typename, alias27949: __typename, alias27950: __typename, alias27951: __typename, alias27952: __typename, alias27953: __typename, alias27954: __typename, alias27955: __typename, alias27956: __typename, alias27957: __typename, alias27958: __typename, alias27959: __typename, alias27960: __typename, alias27961: __typename, alias27962: __typename, alias27963: __typename, alias27964: __typename, alias27965: __typename, alias27966: __typename, alias27967: __typename, alias27968: __typename, alias27969: __typename, alias27970: __typename, alias27971: __typename, alias27972: __typename, alias27973: __typename, alias27974: __typename, alias27975: __typename, alias27976: __typename, alias27977: __typename, alias27978: __typename, alias27979: __typename, alias27980: __typename, alias27981: __typename, alias27982: __typename, alias27983: __typename, alias27984: __typename, alias27985: __typename, alias27986: __typename, alias27987: __typename, alias27988: __typename, alias27989: __typename, alias27990: __typename, alias27991: __typename, alias27992: __typename, alias27993: __typename, alias27994: __typename, alias27995: __typename, alias27996: __typename, alias27997: __typename, alias27998: __typename, alias27999: __typename, alias28000: __typename, alias28001: __typename, alias28002: __typename, alias28003: __typename, alias28004: __typename, alias28005: __typename, alias28006: __typename, alias28007: __typename, alias28008: __typename, alias28009: __typename, alias28010: __typename, alias28011: __typename, alias28012: __typename, alias28013: __typename, alias28014: __typename, alias28015: __typename, alias28016: __typename, alias28017: __typename, alias28018: __typename, alias28019: __typename, alias28020: __typename, alias28021: __typename, alias28022: __typename, alias28023: __typename, alias28024: __typename, alias28025: __typename, alias28026: __typename, alias28027: __typename, alias28028: __typename, alias28029: __typename, alias28030: __typename, alias28031: __typename, alias28032: __typename, alias28033: __typename, alias28034: __typename, alias28035: __typename, alias28036: __typename, alias28037: __typename, alias28038: __typename, alias28039: __typename, alias28040: __typename, alias28041: __typename, alias28042: __typename, alias28043: __typename, alias28044: __typename, alias28045: __typename, alias28046: __typename, alias28047: __typename, alias28048: __typename, alias28049: __typename, alias28050: __typename, alias28051: __typename, alias28052: __typename, alias28053: __typename, alias28054: __typename, alias28055: __typename, alias28056: __typename, alias28057: __typename, alias28058: __typename, alias28059: __typename, alias28060: __typename, alias28061: __typename, alias28062: __typename, alias28063: __typename, alias28064: __typename, alias28065: __typename, alias28066: __typename, alias28067: __typename, alias28068: __typename, alias28069: __typename, alias28070: __typename, alias28071: __typename, alias28072: __typename, alias28073: __typename, alias28074: __typename, alias28075: __typename, alias28076: __typename, alias28077: __typename, alias28078: __typename, alias28079: __typename, alias28080: __typename, alias28081: __typename, alias28082: __typename, alias28083: __typename, alias28084: __typename, alias28085: __typename, alias28086: __typename, alias28087: __typename, alias28088: __typename, alias28089: __typename, alias28090: __typename, alias28091: __typename, alias28092: __typename, alias28093: __typename, alias28094: __typename, alias28095: __typename, alias28096: __typename, alias28097: __typename, alias28098: __typename, alias28099: __typename, alias28100: __typename, alias28101: __typename, alias28102: __typename, alias28103: __typename, alias28104: __typename, alias28105: __typename, alias28106: __typename, alias28107: __typename, alias28108: __typename, alias28109: __typename, alias28110: __typename, alias28111: __typename, alias28112: __typename, alias28113: __typename, alias28114: __typename, alias28115: __typename, alias28116: __typename, alias28117: __typename, alias28118: __typename, alias28119: __typename, alias28120: __typename, alias28121: __typename, alias28122: __typename, alias28123: __typename, alias28124: __typename, alias28125: __typename, alias28126: __typename, alias28127: __typename, alias28128: __typename, alias28129: __typename, alias28130: __typename, alias28131: __typename, alias28132: __typename, alias28133: __typename, alias28134: __typename, alias28135: __typename, alias28136: __typename, alias28137: __typename, alias28138: __typename, alias28139: __typename, alias28140: __typename, alias28141: __typename, alias28142: __typename, alias28143: __typename, alias28144: __typename, alias28145: __typename, alias28146: __typename, alias28147: __typename, alias28148: __typename, alias28149: __typename, alias28150: __typename, alias28151: __typename, alias28152: __typename, alias28153: __typename, alias28154: __typename, alias28155: __typename, alias28156: __typename, alias28157: __typename, alias28158: __typename, alias28159: __typename, alias28160: __typename, alias28161: __typename, alias28162: __typename, alias28163: __typename, alias28164: __typename, alias28165: __typename, alias28166: __typename, alias28167: __typename, alias28168: __typename, alias28169: __typename, alias28170: __typename, alias28171: __typename, alias28172: __typename, alias28173: __typename, alias28174: __typename, alias28175: __typename, alias28176: __typename, alias28177: __typename, alias28178: __typename, alias28179: __typename, alias28180: __typename, alias28181: __typename, alias28182: __typename, alias28183: __typename, alias28184: __typename, alias28185: __typename, alias28186: __typename, alias28187: __typename, alias28188: __typename, alias28189: __typename, alias28190: __typename, alias28191: __typename, alias28192: __typename, alias28193: __typename, alias28194: __typename, alias28195: __typename, alias28196: __typename, alias28197: __typename, alias28198: __typename, alias28199: __typename, alias28200: __typename, alias28201: __typename, alias28202: __typename, alias28203: __typename, alias28204: __typename, alias28205: __typename, alias28206: __typename, alias28207: __typename, alias28208: __typename, alias28209: __typename, alias28210: __typename, alias28211: __typename, alias28212: __typename, alias28213: __typename, alias28214: __typename, alias28215: __typename, alias28216: __typename, alias28217: __typename, alias28218: __typename, alias28219: __typename, alias28220: __typename, alias28221: __typename, alias28222: __typename, alias28223: __typename, alias28224: __typename, alias28225: __typename, alias28226: __typename, alias28227: __typename, alias28228: __typename, alias28229: __typename, alias28230: __typename, alias28231: __typename, alias28232: __typename, alias28233: __typename, alias28234: __typename, alias28235: __typename, alias28236: __typename, alias28237: __typename, alias28238: __typename, alias28239: __typename, alias28240: __typename, alias28241: __typename, alias28242: __typename, alias28243: __typename, alias28244: __typename, alias28245: __typename, alias28246: __typename, alias28247: __typename, alias28248: __typename, alias28249: __typename, alias28250: __typename, alias28251: __typename, alias28252: __typename, alias28253: __typename, alias28254: __typename, alias28255: __typename, alias28256: __typename, alias28257: __typename, alias28258: __typename, alias28259: __typename, alias28260: __typename, alias28261: __typename, alias28262: __typename, alias28263: __typename, alias28264: __typename, alias28265: __typename, alias28266: __typename, alias28267: __typename, alias28268: __typename, alias28269: __typename, alias28270: __typename, alias28271: __typename, alias28272: __typename, alias28273: __typename, alias28274: __typename, alias28275: __typename, alias28276: __typename, alias28277: __typename, alias28278: __typename, alias28279: __typename, alias28280: __typename, alias28281: __typename, alias28282: __typename, alias28283: __typename, alias28284: __typename, alias28285: __typename, alias28286: __typename, alias28287: __typename, alias28288: __typename, alias28289: __typename, alias28290: __typename, alias28291: __typename, alias28292: __typename, alias28293: __typename, alias28294: __typename, alias28295: __typename, alias28296: __typename, alias28297: __typename, alias28298: __typename, alias28299: __typename, alias28300: __typename, alias28301: __typename, alias28302: __typename, alias28303: __typename, alias28304: __typename, alias28305: __typename, alias28306: __typename, alias28307: __typename, alias28308: __typename, alias28309: __typename, alias28310: __typename, alias28311: __typename, alias28312: __typename, alias28313: __typename, alias28314: __typename, alias28315: __typename, alias28316: __typename, alias28317: __typename, alias28318: __typename, alias28319: __typename, alias28320: __typename, alias28321: __typename, alias28322: __typename, alias28323: __typename, alias28324: __typename, alias28325: __typename, alias28326: __typename, alias28327: __typename, alias28328: __typename, alias28329: __typename, alias28330: __typename, alias28331: __typename, alias28332: __typename, alias28333: __typename, alias28334: __typename, alias28335: __typename, alias28336: __typename, alias28337: __typename, alias28338: __typename, alias28339: __typename, alias28340: __typename, alias28341: __typename, alias28342: __typename, alias28343: __typename, alias28344: __typename, alias28345: __typename, alias28346: __typename, alias28347: __typename, alias28348: __typename, alias28349: __typename, alias28350: __typename, alias28351: __typename, alias28352: __typename, alias28353: __typename, alias28354: __typename, alias28355: __typename, alias28356: __typename, alias28357: __typename, alias28358: __typename, alias28359: __typename, alias28360: __typename, alias28361: __typename, alias28362: __typename, alias28363: __typename, alias28364: __typename, alias28365: __typename, alias28366: __typename, alias28367: __typename, alias28368: __typename, alias28369: __typename, alias28370: __typename, alias28371: __typename, alias28372: __typename, alias28373: __typename, alias28374: __typename, alias28375: __typename, alias28376: __typename, alias28377: __typename, alias28378: __typename, alias28379: __typename, alias28380: __typename, alias28381: __typename, alias28382: __typename, alias28383: __typename, alias28384: __typename, alias28385: __typename, alias28386: __typename, alias28387: __typename, alias28388: __typename, alias28389: __typename, alias28390: __typename, alias28391: __typename, alias28392: __typename, alias28393: __typename, alias28394: __typename, alias28395: __typename, alias28396: __typename, alias28397: __typename, alias28398: __typename, alias28399: __typename, alias28400: __typename, alias28401: __typename, alias28402: __typename, alias28403: __typename, alias28404: __typename, alias28405: __typename, alias28406: __typename, alias28407: __typename, alias28408: __typename, alias28409: __typename, alias28410: __typename, alias28411: __typename, alias28412: __typename, alias28413: __typename, alias28414: __typename, alias28415: __typename, alias28416: __typename, alias28417: __typename, alias28418: __typename, alias28419: __typename, alias28420: __typename, alias28421: __typename, alias28422: __typename, alias28423: __typename, alias28424: __typename, alias28425: __typename, alias28426: __typename, alias28427: __typename, alias28428: __typename, alias28429: __typename, alias28430: __typename, alias28431: __typename, alias28432: __typename, alias28433: __typename, alias28434: __typename, alias28435: __typename, alias28436: __typename, alias28437: __typename, alias28438: __typename, alias28439: __typename, alias28440: __typename, alias28441: __typename, alias28442: __typename, alias28443: __typename, alias28444: __typename, alias28445: __typename, alias28446: __typename, alias28447: __typename, alias28448: __typename, alias28449: __typename, alias28450: __typename, alias28451: __typename, alias28452: __typename, alias28453: __typename, alias28454: __typename, alias28455: __typename, alias28456: __typename, alias28457: __typename, alias28458: __typename, alias28459: __typename, alias28460: __typename, alias28461: __typename, alias28462: __typename, alias28463: __typename, alias28464: __typename, alias28465: __typename, alias28466: __typename, alias28467: __typename, alias28468: __typename, alias28469: __typename, alias28470: __typename, alias28471: __typename, alias28472: __typename, alias28473: __typename, alias28474: __typename, alias28475: __typename, alias28476: __typename, alias28477: __typename, alias28478: __typename, alias28479: __typename, alias28480: __typename, alias28481: __typename, alias28482: __typename, alias28483: __typename, alias28484: __typename, alias28485: __typename, alias28486: __typename, alias28487: __typename, alias28488: __typename, alias28489: __typename, alias28490: __typename, alias28491: __typename, alias28492: __typename, alias28493: __typename, alias28494: __typename, alias28495: __typename, alias28496: __typename, alias28497: __typename, alias28498: __typename, alias28499: __typename, alias28500: __typename, alias28501: __typename, alias28502: __typename, alias28503: __typename, alias28504: __typename, alias28505: __typename, alias28506: __typename, alias28507: __typename, alias28508: __typename, alias28509: __typename, alias28510: __typename, alias28511: __typename, alias28512: __typename, alias28513: __typename, alias28514: __typename, alias28515: __typename, alias28516: __typename, alias28517: __typename, alias28518: __typename, alias28519: __typename, alias28520: __typename, alias28521: __typename, alias28522: __typename, alias28523: __typename, alias28524: __typename, alias28525: __typename, alias28526: __typename, alias28527: __typename, alias28528: __typename, alias28529: __typename, alias28530: __typename, alias28531: __typename, alias28532: __typename, alias28533: __typename, alias28534: __typename, alias28535: __typename, alias28536: __typename, alias28537: __typename, alias28538: __typename, alias28539: __typename, alias28540: __typename, alias28541: __typename, alias28542: __typename, alias28543: __typename, alias28544: __typename, alias28545: __typename, alias28546: __typename, alias28547: __typename, alias28548: __typename, alias28549: __typename, alias28550: __typename, alias28551: __typename, alias28552: __typename, alias28553: __typename, alias28554: __typename, alias28555: __typename, alias28556: __typename, alias28557: __typename, alias28558: __typename, alias28559: __typename, alias28560: __typename, alias28561: __typename, alias28562: __typename, alias28563: __typename, alias28564: __typename, alias28565: __typename, alias28566: __typename, alias28567: __typename, alias28568: __typename, alias28569: __typename, alias28570: __typename, alias28571: __typename, alias28572: __typename, alias28573: __typename, alias28574: __typename, alias28575: __typename, alias28576: __typename, alias28577: __typename, alias28578: __typename, alias28579: __typename, alias28580: __typename, alias28581: __typename, alias28582: __typename, alias28583: __typename, alias28584: __typename, alias28585: __typename, alias28586: __typename, alias28587: __typename, alias28588: __typename, alias28589: __typename, alias28590: __typename, alias28591: __typename, alias28592: __typename, alias28593: __typename, alias28594: __typename, alias28595: __typename, alias28596: __typename, alias28597: __typename, alias28598: __typename, alias28599: __typename, alias28600: __typename, alias28601: __typename, alias28602: __typename, alias28603: __typename, alias28604: __typename, alias28605: __typename, alias28606: __typename, alias28607: __typename, alias28608: __typename, alias28609: __typename, alias28610: __typename, alias28611: __typename, alias28612: __typename, alias28613: __typename, alias28614: __typename, alias28615: __typename, alias28616: __typename, alias28617: __typename, alias28618: __typename, alias28619: __typename, alias28620: __typename, alias28621: __typename, alias28622: __typename, alias28623: __typename, alias28624: __typename, alias28625: __typename, alias28626: __typename, alias28627: __typename, alias28628: __typename, alias28629: __typename, alias28630: __typename, alias28631: __typename, alias28632: __typename, alias28633: __typename, alias28634: __typename, alias28635: __typename, alias28636: __typename, alias28637: __typename, alias28638: __typename, alias28639: __typename, alias28640: __typename, alias28641: __typename, alias28642: __typename, alias28643: __typename, alias28644: __typename, alias28645: __typename, alias28646: __typename, alias28647: __typename, alias28648: __typename, alias28649: __typename, alias28650: __typename, alias28651: __typename, alias28652: __typename, alias28653: __typename, alias28654: __typename, alias28655: __typename, alias28656: __typename, alias28657: __typename, alias28658: __typename, alias28659: __typename, alias28660: __typename, alias28661: __typename, alias28662: __typename, alias28663: __typename, alias28664: __typename, alias28665: __typename, alias28666: __typename, alias28667: __typename, alias28668: __typename, alias28669: __typename, alias28670: __typename, alias28671: __typename, alias28672: __typename, alias28673: __typename, alias28674: __typename, alias28675: __typename, alias28676: __typename, alias28677: __typename, alias28678: __typename, alias28679: __typename, alias28680: __typename, alias28681: __typename, alias28682: __typename, alias28683: __typename, alias28684: __typename, alias28685: __typename, alias28686: __typename, alias28687: __typename, alias28688: __typename, alias28689: __typename, alias28690: __typename, alias28691: __typename, alias28692: __typename, alias28693: __typename, alias28694: __typename, alias28695: __typename, alias28696: __typename, alias28697: __typename, alias28698: __typename, alias28699: __typename, alias28700: __typename, alias28701: __typename, alias28702: __typename, alias28703: __typename, alias28704: __typename, alias28705: __typename, alias28706: __typename, alias28707: __typename, alias28708: __typename, alias28709: __typename, alias28710: __typename, alias28711: __typename, alias28712: __typename, alias28713: __typename, alias28714: __typename, alias28715: __typename, alias28716: __typename, alias28717: __typename, alias28718: __typename, alias28719: __typename, alias28720: __typename, alias28721: __typename, alias28722: __typename, alias28723: __typename, alias28724: __typename, alias28725: __typename, alias28726: __typename, alias28727: __typename, alias28728: __typename, alias28729: __typename, alias28730: __typename, alias28731: __typename, alias28732: __typename, alias28733: __typename, alias28734: __typename, alias28735: __typename, alias28736: __typename, alias28737: __typename, alias28738: __typename, alias28739: __typename, alias28740: __typename, alias28741: __typename, alias28742: __typename, alias28743: __typename, alias28744: __typename, alias28745: __typename, alias28746: __typename, alias28747: __typename, alias28748: __typename, alias28749: __typename, alias28750: __typename, alias28751: __typename, alias28752: __typename, alias28753: __typename, alias28754: __typename, alias28755: __typename, alias28756: __typename, alias28757: __typename, alias28758: __typename, alias28759: __typename, alias28760: __typename, alias28761: __typename, alias28762: __typename, alias28763: __typename, alias28764: __typename, alias28765: __typename, alias28766: __typename, alias28767: __typename, alias28768: __typename, alias28769: __typename, alias28770: __typename, alias28771: __typename, alias28772: __typename, alias28773: __typename, alias28774: __typename, alias28775: __typename, alias28776: __typename, alias28777: __typename, alias28778: __typename, alias28779: __typename, alias28780: __typename, alias28781: __typename, alias28782: __typename, alias28783: __typename, alias28784: __typename, alias28785: __typename, alias28786: __typename, alias28787: __typename, alias28788: __typename, alias28789: __typename, alias28790: __typename, alias28791: __typename, alias28792: __typename, alias28793: __typename, alias28794: __typename, alias28795: __typename, alias28796: __typename, alias28797: __typename, alias28798: __typename, alias28799: __typename, alias28800: __typename, alias28801: __typename, alias28802: __typename, alias28803: __typename, alias28804: __typename, alias28805: __typename, alias28806: __typename, alias28807: __typename, alias28808: __typename, alias28809: __typename, alias28810: __typename, alias28811: __typename, alias28812: __typename, alias28813: __typename, alias28814: __typename, alias28815: __typename, alias28816: __typename, alias28817: __typename, alias28818: __typename, alias28819: __typename, alias28820: __typename, alias28821: __typename, alias28822: __typename, alias28823: __typename, alias28824: __typename, alias28825: __typename, alias28826: __typename, alias28827: __typename, alias28828: __typename, alias28829: __typename, alias28830: __typename, alias28831: __typename, alias28832: __typename, alias28833: __typename, alias28834: __typename, alias28835: __typename, alias28836: __typename, alias28837: __typename, alias28838: __typename, alias28839: __typename, alias28840: __typename, alias28841: __typename, alias28842: __typename, alias28843: __typename, alias28844: __typename, alias28845: __typename, alias28846: __typename, alias28847: __typename, alias28848: __typename, alias28849: __typename, alias28850: __typename, alias28851: __typename, alias28852: __typename, alias28853: __typename, alias28854: __typename, alias28855: __typename, alias28856: __typename, alias28857: __typename, alias28858: __typename, alias28859: __typename, alias28860: __typename, alias28861: __typename, alias28862: __typename, alias28863: __typename, alias28864: __typename, alias28865: __typename, alias28866: __typename, alias28867: __typename, alias28868: __typename, alias28869: __typename, alias28870: __typename, alias28871: __typename, alias28872: __typename, alias28873: __typename, alias28874: __typename, alias28875: __typename, alias28876: __typename, alias28877: __typename, alias28878: __typename, alias28879: __typename, alias28880: __typename, alias28881: __typename, alias28882: __typename, alias28883: __typename, alias28884: __typename, alias28885: __typename, alias28886: __typename, alias28887: __typename, alias28888: __typename, alias28889: __typename, alias28890: __typename, alias28891: __typename, alias28892: __typename, alias28893: __typename, alias28894: __typename, alias28895: __typename, alias28896: __typename, alias28897: __typename, alias28898: __typename, alias28899: __typename, alias28900: __typename, alias28901: __typename, alias28902: __typename, alias28903: __typename, alias28904: __typename, alias28905: __typename, alias28906: __typename, alias28907: __typename, alias28908: __typename, alias28909: __typename, alias28910: __typename, alias28911: __typename, alias28912: __typename, alias28913: __typename, alias28914: __typename, alias28915: __typename, alias28916: __typename, alias28917: __typename, alias28918: __typename, alias28919: __typename, alias28920: __typename, alias28921: __typename, alias28922: __typename, alias28923: __typename, alias28924: __typename, alias28925: __typename, alias28926: __typename, alias28927: __typename, alias28928: __typename, alias28929: __typename, alias28930: __typename, alias28931: __typename, alias28932: __typename, alias28933: __typename, alias28934: __typename, alias28935: __typename, alias28936: __typename, alias28937: __typename, alias28938: __typename, alias28939: __typename, alias28940: __typename, alias28941: __typename, alias28942: __typename, alias28943: __typename, alias28944: __typename, alias28945: __typename, alias28946: __typename, alias28947: __typename, alias28948: __typename, alias28949: __typename, alias28950: __typename, alias28951: __typename, alias28952: __typename, alias28953: __typename, alias28954: __typename, alias28955: __typename, alias28956: __typename, alias28957: __typename, alias28958: __typename, alias28959: __typename, alias28960: __typename, alias28961: __typename, alias28962: __typename, alias28963: __typename, alias28964: __typename, alias28965: __typename, alias28966: __typename, alias28967: __typename, alias28968: __typename, alias28969: __typename, alias28970: __typename, alias28971: __typename, alias28972: __typename, alias28973: __typename, alias28974: __typename, alias28975: __typename, alias28976: __typename, alias28977: __typename, alias28978: __typename, alias28979: __typename, alias28980: __typename, alias28981: __typename, alias28982: __typename, alias28983: __typename, alias28984: __typename, alias28985: __typename, alias28986: __typename, alias28987: __typename, alias28988: __typename, alias28989: __typename, alias28990: __typename, alias28991: __typename, alias28992: __typename, alias28993: __typename, alias28994: __typename, alias28995: __typename, alias28996: __typename, alias28997: __typename, alias28998: __typename, alias28999: __typename, alias29000: __typename, alias29001: __typename, alias29002: __typename, alias29003: __typename, alias29004: __typename, alias29005: __typename, alias29006: __typename, alias29007: __typename, alias29008: __typename, alias29009: __typename, alias29010: __typename, alias29011: __typename, alias29012: __typename, alias29013: __typename, alias29014: __typename, alias29015: __typename, alias29016: __typename, alias29017: __typename, alias29018: __typename, alias29019: __typename, alias29020: __typename, alias29021: __typename, alias29022: __typename, alias29023: __typename, alias29024: __typename, alias29025: __typename, alias29026: __typename, alias29027: __typename, alias29028: __typename, alias29029: __typename, alias29030: __typename, alias29031: __typename, alias29032: __typename, alias29033: __typename, alias29034: __typename, alias29035: __typename, alias29036: __typename, alias29037: __typename, alias29038: __typename, alias29039: __typename, alias29040: __typename, alias29041: __typename, alias29042: __typename, alias29043: __typename, alias29044: __typename, alias29045: __typename, alias29046: __typename, alias29047: __typename, alias29048: __typename, alias29049: __typename, alias29050: __typename, alias29051: __typename, alias29052: __typename, alias29053: __typename, alias29054: __typename, alias29055: __typename, alias29056: __typename, alias29057: __typename, alias29058: __typename, alias29059: __typename, alias29060: __typename, alias29061: __typename, alias29062: __typename, alias29063: __typename, alias29064: __typename, alias29065: __typename, alias29066: __typename, alias29067: __typename, alias29068: __typename, alias29069: __typename, alias29070: __typename, alias29071: __typename, alias29072: __typename, alias29073: __typename, alias29074: __typename, alias29075: __typename, alias29076: __typename, alias29077: __typename, alias29078: __typename, alias29079: __typename, alias29080: __typename, alias29081: __typename, alias29082: __typename, alias29083: __typename, alias29084: __typename, alias29085: __typename, alias29086: __typename, alias29087: __typename, alias29088: __typename, alias29089: __typename, alias29090: __typename, alias29091: __typename, alias29092: __typename, alias29093: __typename, alias29094: __typename, alias29095: __typename, alias29096: __typename, alias29097: __typename, alias29098: __typename, alias29099: __typename, alias29100: __typename, alias29101: __typename, alias29102: __typename, alias29103: __typename, alias29104: __typename, alias29105: __typename, alias29106: __typename, alias29107: __typename, alias29108: __typename, alias29109: __typename, alias29110: __typename, alias29111: __typename, alias29112: __typename, alias29113: __typename, alias29114: __typename, alias29115: __typename, alias29116: __typename, alias29117: __typename, alias29118: __typename, alias29119: __typename, alias29120: __typename, alias29121: __typename, alias29122: __typename, alias29123: __typename, alias29124: __typename, alias29125: __typename, alias29126: __typename, alias29127: __typename, alias29128: __typename, alias29129: __typename, alias29130: __typename, alias29131: __typename, alias29132: __typename, alias29133: __typename, alias29134: __typename, alias29135: __typename, alias29136: __typename, alias29137: __typename, alias29138: __typename, alias29139: __typename, alias29140: __typename, alias29141: __typename, alias29142: __typename, alias29143: __typename, alias29144: __typename, alias29145: __typename, alias29146: __typename, alias29147: __typename, alias29148: __typename, alias29149: __typename, alias29150: __typename, alias29151: __typename, alias29152: __typename, alias29153: __typename, alias29154: __typename, alias29155: __typename, alias29156: __typename, alias29157: __typename, alias29158: __typename, alias29159: __typename, alias29160: __typename, alias29161: __typename, alias29162: __typename, alias29163: __typename, alias29164: __typename, alias29165: __typename, alias29166: __typename, alias29167: __typename, alias29168: __typename, alias29169: __typename, alias29170: __typename, alias29171: __typename, alias29172: __typename, alias29173: __typename, alias29174: __typename, alias29175: __typename, alias29176: __typename, alias29177: __typename, alias29178: __typename, alias29179: __typename, alias29180: __typename, alias29181: __typename, alias29182: __typename, alias29183: __typename, alias29184: __typename, alias29185: __typename, alias29186: __typename, alias29187: __typename, alias29188: __typename, alias29189: __typename, alias29190: __typename, alias29191: __typename, alias29192: __typename, alias29193: __typename, alias29194: __typename, alias29195: __typename, alias29196: __typename, alias29197: __typename, alias29198: __typename, alias29199: __typename, alias29200: __typename, alias29201: __typename, alias29202: __typename, alias29203: __typename, alias29204: __typename, alias29205: __typename, alias29206: __typename, alias29207: __typename, alias29208: __typename, alias29209: __typename, alias29210: __typename, alias29211: __typename, alias29212: __typename, alias29213: __typename, alias29214: __typename, alias29215: __typename, alias29216: __typename, alias29217: __typename, alias29218: __typename, alias29219: __typename, alias29220: __typename, alias29221: __typename, alias29222: __typename, alias29223: __typename, alias29224: __typename, alias29225: __typename, alias29226: __typename, alias29227: __typename, alias29228: __typename, alias29229: __typename, alias29230: __typename, alias29231: __typename, alias29232: __typename, alias29233: __typename, alias29234: __typename, alias29235: __typename, alias29236: __typename, alias29237: __typename, alias29238: __typename, alias29239: __typename, alias29240: __typename, alias29241: __typename, alias29242: __typename, alias29243: __typename, alias29244: __typename, alias29245: __typename, alias29246: __typename, alias29247: __typename, alias29248: __typename, alias29249: __typename, alias29250: __typename, alias29251: __typename, alias29252: __typename, alias29253: __typename, alias29254: __typename, alias29255: __typename, alias29256: __typename, alias29257: __typename, alias29258: __typename, alias29259: __typename, alias29260: __typename, alias29261: __typename, alias29262: __typename, alias29263: __typename, alias29264: __typename, alias29265: __typename, alias29266: __typename, alias29267: __typename, alias29268: __typename, alias29269: __typename, alias29270: __typename, alias29271: __typename, alias29272: __typename, alias29273: __typename, alias29274: __typename, alias29275: __typename, alias29276: __typename, alias29277: __typename, alias29278: __typename, alias29279: __typename, alias29280: __typename, alias29281: __typename, alias29282: __typename, alias29283: __typename, alias29284: __typename, alias29285: __typename, alias29286: __typename, alias29287: __typename, alias29288: __typename, alias29289: __typename, alias29290: __typename, alias29291: __typename, alias29292: __typename, alias29293: __typename, alias29294: __typename, alias29295: __typename, alias29296: __typename, alias29297: __typename, alias29298: __typename, alias29299: __typename, alias29300: __typename, alias29301: __typename, alias29302: __typename, alias29303: __typename, alias29304: __typename, alias29305: __typename, alias29306: __typename, alias29307: __typename, alias29308: __typename, alias29309: __typename, alias29310: __typename, alias29311: __typename, alias29312: __typename, alias29313: __typename, alias29314: __typename, alias29315: __typename, alias29316: __typename, alias29317: __typename, alias29318: __typename, alias29319: __typename, alias29320: __typename, alias29321: __typename, alias29322: __typename, alias29323: __typename, alias29324: __typename, alias29325: __typename, alias29326: __typename, alias29327: __typename, alias29328: __typename, alias29329: __typename, alias29330: __typename, alias29331: __typename, alias29332: __typename, alias29333: __typename, alias29334: __typename, alias29335: __typename, alias29336: __typename, alias29337: __typename, alias29338: __typename, alias29339: __typename, alias29340: __typename, alias29341: __typename, alias29342: __typename, alias29343: __typename, alias29344: __typename, alias29345: __typename, alias29346: __typename, alias29347: __typename, alias29348: __typename, alias29349: __typename, alias29350: __typename, alias29351: __typename, alias29352: __typename, alias29353: __typename, alias29354: __typename, alias29355: __typename, alias29356: __typename, alias29357: __typename, alias29358: __typename, alias29359: __typename, alias29360: __typename, alias29361: __typename, alias29362: __typename, alias29363: __typename, alias29364: __typename, alias29365: __typename, alias29366: __typename, alias29367: __typename, alias29368: __typename, alias29369: __typename, alias29370: __typename, alias29371: __typename, alias29372: __typename, alias29373: __typename, alias29374: __typename, alias29375: __typename, alias29376: __typename, alias29377: __typename, alias29378: __typename, alias29379: __typename, alias29380: __typename, alias29381: __typename, alias29382: __typename, alias29383: __typename, alias29384: __typename, alias29385: __typename, alias29386: __typename, alias29387: __typename, alias29388: __typename, alias29389: __typename, alias29390: __typename, alias29391: __typename, alias29392: __typename, alias29393: __typename, alias29394: __typename, alias29395: __typename, alias29396: __typename, alias29397: __typename, alias29398: __typename, alias29399: __typename, alias29400: __typename, alias29401: __typename, alias29402: __typename, alias29403: __typename, alias29404: __typename, alias29405: __typename, alias29406: __typename, alias29407: __typename, alias29408: __typename, alias29409: __typename, alias29410: __typename, alias29411: __typename, alias29412: __typename, alias29413: __typename, alias29414: __typename, alias29415: __typename, alias29416: __typename, alias29417: __typename, alias29418: __typename, alias29419: __typename, alias29420: __typename, alias29421: __typename, alias29422: __typename, alias29423: __typename, alias29424: __typename, alias29425: __typename, alias29426: __typename, alias29427: __typename, alias29428: __typename, alias29429: __typename, alias29430: __typename, alias29431: __typename, alias29432: __typename, alias29433: __typename, alias29434: __typename, alias29435: __typename, alias29436: __typename, alias29437: __typename, alias29438: __typename, alias29439: __typename, alias29440: __typename, alias29441: __typename, alias29442: __typename, alias29443: __typename, alias29444: __typename, alias29445: __typename, alias29446: __typename, alias29447: __typename, alias29448: __typename, alias29449: __typename, alias29450: __typename, alias29451: __typename, alias29452: __typename, alias29453: __typename, alias29454: __typename, alias29455: __typename, alias29456: __typename, alias29457: __typename, alias29458: __typename, alias29459: __typename, alias29460: __typename, alias29461: __typename, alias29462: __typename, alias29463: __typename, alias29464: __typename, alias29465: __typename, alias29466: __typename, alias29467: __typename, alias29468: __typename, alias29469: __typename, alias29470: __typename, alias29471: __typename, alias29472: __typename, alias29473: __typename, alias29474: __typename, alias29475: __typename, alias29476: __typename, alias29477: __typename, alias29478: __typename, alias29479: __typename, alias29480: __typename, alias29481: __typename, alias29482: __typename, alias29483: __typename, alias29484: __typename, alias29485: __typename, alias29486: __typename, alias29487: __typename, alias29488: __typename, alias29489: __typename, alias29490: __typename, alias29491: __typename, alias29492: __typename, alias29493: __typename, alias29494: __typename, alias29495: __typename, alias29496: __typename, alias29497: __typename, alias29498: __typename, alias29499: __typename, alias29500: __typename, alias29501: __typename, alias29502: __typename, alias29503: __typename, alias29504: __typename, alias29505: __typename, alias29506: __typename, alias29507: __typename, alias29508: __typename, alias29509: __typename, alias29510: __typename, alias29511: __typename, alias29512: __typename, alias29513: __typename, alias29514: __typename, alias29515: __typename, alias29516: __typename, alias29517: __typename, alias29518: __typename, alias29519: __typename, alias29520: __typename, alias29521: __typename, alias29522: __typename, alias29523: __typename, alias29524: __typename, alias29525: __typename, alias29526: __typename, alias29527: __typename, alias29528: __typename, alias29529: __typename, alias29530: __typename, alias29531: __typename, alias29532: __typename, alias29533: __typename, alias29534: __typename, alias29535: __typename, alias29536: __typename, alias29537: __typename, alias29538: __typename, alias29539: __typename, alias29540: __typename, alias29541: __typename, alias29542: __typename, alias29543: __typename, alias29544: __typename, alias29545: __typename, alias29546: __typename, alias29547: __typename, alias29548: __typename, alias29549: __typename, alias29550: __typename, alias29551: __typename, alias29552: __typename, alias29553: __typename, alias29554: __typename, alias29555: __typename, alias29556: __typename, alias29557: __typename, alias29558: __typename, alias29559: __typename, alias29560: __typename, alias29561: __typename, alias29562: __typename, alias29563: __typename, alias29564: __typename, alias29565: __typename, alias29566: __typename, alias29567: __typename, alias29568: __typename, alias29569: __typename, alias29570: __typename, alias29571: __typename, alias29572: __typename, alias29573: __typename, alias29574: __typename, alias29575: __typename, alias29576: __typename, alias29577: __typename, alias29578: __typename, alias29579: __typename, alias29580: __typename, alias29581: __typename, alias29582: __typename, alias29583: __typename, alias29584: __typename, alias29585: __typename, alias29586: __typename, alias29587: __typename, alias29588: __typename, alias29589: __typename, alias29590: __typename, alias29591: __typename, alias29592: __typename, alias29593: __typename, alias29594: __typename, alias29595: __typename, alias29596: __typename, alias29597: __typename, alias29598: __typename, alias29599: __typename, alias29600: __typename, alias29601: __typename, alias29602: __typename, alias29603: __typename, alias29604: __typename, alias29605: __typename, alias29606: __typename, alias29607: __typename, alias29608: __typename, alias29609: __typename, alias29610: __typename, alias29611: __typename, alias29612: __typename, alias29613: __typename, alias29614: __typename, alias29615: __typename, alias29616: __typename, alias29617: __typename, alias29618: __typename, alias29619: __typename, alias29620: __typename, alias29621: __typename, alias29622: __typename, alias29623: __typename, alias29624: __typename, alias29625: __typename, alias29626: __typename, alias29627: __typename, alias29628: __typename, alias29629: __typename, alias29630: __typename, alias29631: __typename, alias29632: __typename, alias29633: __typename, alias29634: __typename, alias29635: __typename, alias29636: __typename, alias29637: __typename, alias29638: __typename, alias29639: __typename, alias29640: __typename, alias29641: __typename, alias29642: __typename, alias29643: __typename, alias29644: __typename, alias29645: __typename, alias29646: __typename, alias29647: __typename, alias29648: __typename, alias29649: __typename, alias29650: __typename, alias29651: __typename, alias29652: __typename, alias29653: __typename, alias29654: __typename, alias29655: __typename, alias29656: __typename, alias29657: __typename, alias29658: __typename, alias29659: __typename, alias29660: __typename, alias29661: __typename, alias29662: __typename, alias29663: __typename, alias29664: __typename, alias29665: __typename, alias29666: __typename, alias29667: __typename, alias29668: __typename, alias29669: __typename, alias29670: __typename, alias29671: __typename, alias29672: __typename, alias29673: __typename, alias29674: __typename, alias29675: __typename, alias29676: __typename, alias29677: __typename, alias29678: __typename, alias29679: __typename, alias29680: __typename, alias29681: __typename, alias29682: __typename, alias29683: __typename, alias29684: __typename, alias29685: __typename, alias29686: __typename, alias29687: __typename, alias29688: __typename, alias29689: __typename, alias29690: __typename, alias29691: __typename, alias29692: __typename, alias29693: __typename, alias29694: __typename, alias29695: __typename, alias29696: __typename, alias29697: __typename, alias29698: __typename, alias29699: __typename, alias29700: __typename, alias29701: __typename, alias29702: __typename, alias29703: __typename, alias29704: __typename, alias29705: __typename, alias29706: __typename, alias29707: __typename, alias29708: __typename, alias29709: __typename, alias29710: __typename, alias29711: __typename, alias29712: __typename, alias29713: __typename, alias29714: __typename, alias29715: __typename, alias29716: __typename, alias29717: __typename, alias29718: __typename, alias29719: __typename, alias29720: __typename, alias29721: __typename, alias29722: __typename, alias29723: __typename, alias29724: __typename, alias29725: __typename, alias29726: __typename, alias29727: __typename, alias29728: __typename, alias29729: __typename, alias29730: __typename, alias29731: __typename, alias29732: __typename, alias29733: __typename, alias29734: __typename, alias29735: __typename, alias29736: __typename, alias29737: __typename, alias29738: __typename, alias29739: __typename, alias29740: __typename, alias29741: __typename, alias29742: __typename, alias29743: __typename, alias29744: __typename, alias29745: __typename, alias29746: __typename, alias29747: __typename, alias29748: __typename, alias29749: __typename, alias29750: __typename, alias29751: __typename, alias29752: __typename, alias29753: __typename, alias29754: __typename, alias29755: __typename, alias29756: __typename, alias29757: __typename, alias29758: __typename, alias29759: __typename, alias29760: __typename, alias29761: __typename, alias29762: __typename, alias29763: __typename, alias29764: __typename, alias29765: __typename, alias29766: __typename, alias29767: __typename, alias29768: __typename, alias29769: __typename, alias29770: __typename, alias29771: __typename, alias29772: __typename, alias29773: __typename, alias29774: __typename, alias29775: __typename, alias29776: __typename, alias29777: __typename, alias29778: __typename, alias29779: __typename, alias29780: __typename, alias29781: __typename, alias29782: __typename, alias29783: __typename, alias29784: __typename, alias29785: __typename, alias29786: __typename, alias29787: __typename, alias29788: __typename, alias29789: __typename, alias29790: __typename, alias29791: __typename, alias29792: __typename, alias29793: __typename, alias29794: __typename, alias29795: __typename, alias29796: __typename, alias29797: __typename, alias29798: __typename, alias29799: __typename, alias29800: __typename, alias29801: __typename, alias29802: __typename, alias29803: __typename, alias29804: __typename, alias29805: __typename, alias29806: __typename, alias29807: __typename, alias29808: __typename, alias29809: __typename, alias29810: __typename, alias29811: __typename, alias29812: __typename, alias29813: __typename, alias29814: __typename, alias29815: __typename, alias29816: __typename, alias29817: __typename, alias29818: __typename, alias29819: __typename, alias29820: __typename, alias29821: __typename, alias29822: __typename, alias29823: __typename, alias29824: __typename, alias29825: __typename, alias29826: __typename, alias29827: __typename, alias29828: __typename, alias29829: __typename, alias29830: __typename, alias29831: __typename, alias29832: __typename, alias29833: __typename, alias29834: __typename, alias29835: __typename, alias29836: __typename, alias29837: __typename, alias29838: __typename, alias29839: __typename, alias29840: __typename, alias29841: __typename, alias29842: __typename, alias29843: __typename, alias29844: __typename, alias29845: __typename, alias29846: __typename, alias29847: __typename, alias29848: __typename, alias29849: __typename, alias29850: __typename, alias29851: __typename, alias29852: __typename, alias29853: __typename, alias29854: __typename, alias29855: __typename, alias29856: __typename, alias29857: __typename, alias29858: __typename, alias29859: __typename, alias29860: __typename, alias29861: __typename, alias29862: __typename, alias29863: __typename, alias29864: __typename, alias29865: __typename, alias29866: __typename, alias29867: __typename, alias29868: __typename, alias29869: __typename, alias29870: __typename, alias29871: __typename, alias29872: __typename, alias29873: __typename, alias29874: __typename, alias29875: __typename, alias29876: __typename, alias29877: __typename, alias29878: __typename, alias29879: __typename, alias29880: __typename, alias29881: __typename, alias29882: __typename, alias29883: __typename, alias29884: __typename, alias29885: __typename, alias29886: __typename, alias29887: __typename, alias29888: __typename, alias29889: __typename, alias29890: __typename, alias29891: __typename, alias29892: __typename, alias29893: __typename, alias29894: __typename, alias29895: __typename, alias29896: __typename, alias29897: __typename, alias29898: __typename, alias29899: __typename, alias29900: __typename, alias29901: __typename, alias29902: __typename, alias29903: __typename, alias29904: __typename, alias29905: __typename, alias29906: __typename, alias29907: __typename, alias29908: __typename, alias29909: __typename, alias29910: __typename, alias29911: __typename, alias29912: __typename, alias29913: __typename, alias29914: __typename, alias29915: __typename, alias29916: __typename, alias29917: __typename, alias29918: __typename, alias29919: __typename, alias29920: __typename, alias29921: __typename, alias29922: __typename, alias29923: __typename, alias29924: __typename, alias29925: __typename, alias29926: __typename, alias29927: __typename, alias29928: __typename, alias29929: __typename, alias29930: __typename, alias29931: __typename, alias29932: __typename, alias29933: __typename, alias29934: __typename, alias29935: __typename, alias29936: __typename, alias29937: __typename, alias29938: __typename, alias29939: __typename, alias29940: __typename, alias29941: __typename, alias29942: __typename, alias29943: __typename, alias29944: __typename, alias29945: __typename, alias29946: __typename, alias29947: __typename, alias29948: __typename, alias29949: __typename, alias29950: __typename, alias29951: __typename, alias29952: __typename, alias29953: __typename, alias29954: __typename, alias29955: __typename, alias29956: __typename, alias29957: __typename, alias29958: __typename, alias29959: __typename, alias29960: __typename, alias29961: __typename, alias29962: __typename, alias29963: __typename, alias29964: __typename, alias29965: __typename, alias29966: __typename, alias29967: __typename, alias29968: __typename, alias29969: __typename, alias29970: __typename, alias29971: __typename, alias29972: __typename, alias29973: __typename, alias29974: __typename, alias29975: __typename, alias29976: __typename, alias29977: __typename, alias29978: __typename, alias29979: __typename, alias29980: __typename, alias29981: __typename, alias29982: __typename, alias29983: __typename, alias29984: __typename, alias29985: __typename, alias29986: __typename, alias29987: __typename, alias29988: __typename, alias29989: __typename, alias29990: __typename, alias29991: __typename, alias29992: __typename, alias29993: __typename, alias29994: __typename, alias29995: __typename, alias29996: __typename, alias29997: __typename, alias29998: __typename, alias29999: __typename, alias30000: __typename, alias30001: __typename, alias30002: __typename, alias30003: __typename, alias30004: __typename, alias30005: __typename, alias30006: __typename, alias30007: __typename, alias30008: __typename, alias30009: __typename, alias30010: __typename, alias30011: __typename, alias30012: __typename, alias30013: __typename, alias30014: __typename, alias30015: __typename, alias30016: __typename, alias30017: __typename, alias30018: __typename, alias30019: __typename, alias30020: __typename, alias30021: __typename, alias30022: __typename, alias30023: __typename, alias30024: __typename, alias30025: __typename, alias30026: __typename, alias30027: __typename, alias30028: __typename, alias30029: __typename, alias30030: __typename, alias30031: __typename, alias30032: __typename, alias30033: __typename, alias30034: __typename, alias30035: __typename, alias30036: __typename, alias30037: __typename, alias30038: __typename, alias30039: __typename, alias30040: __typename, alias30041: __typename, alias30042: __typename, alias30043: __typename, alias30044: __typename, alias30045: __typename, alias30046: __typename, alias30047: __typename, alias30048: __typename, alias30049: __typename, alias30050: __typename, alias30051: __typename, alias30052: __typename, alias30053: __typename, alias30054: __typename, alias30055: __typename, alias30056: __typename, alias30057: __typename, alias30058: __typename, alias30059: __typename, alias30060: __typename, alias30061: __typename, alias30062: __typename, alias30063: __typename, alias30064: __typename, alias30065: __typename, alias30066: __typename, alias30067: __typename, alias30068: __typename, alias30069: __typename, alias30070: __typename, alias30071: __typename, alias30072: __typename, alias30073: __typename, alias30074: __typename, alias30075: __typename, alias30076: __typename, alias30077: __typename, alias30078: __typename, alias30079: __typename, alias30080: __typename, alias30081: __typename, alias30082: __typename, alias30083: __typename, alias30084: __typename, alias30085: __typename, alias30086: __typename, alias30087: __typename, alias30088: __typename, alias30089: __typename, alias30090: __typename, alias30091: __typename, alias30092: __typename, alias30093: __typename, alias30094: __typename, alias30095: __typename, alias30096: __typename, alias30097: __typename, alias30098: __typename, alias30099: __typename, alias30100: __typename, alias30101: __typename, alias30102: __typename, alias30103: __typename, alias30104: __typename, alias30105: __typename, alias30106: __typename, alias30107: __typename, alias30108: __typename, alias30109: __typename, alias30110: __typename, alias30111: __typename, alias30112: __typename, alias30113: __typename, alias30114: __typename, alias30115: __typename, alias30116: __typename, alias30117: __typename, alias30118: __typename, alias30119: __typename, alias30120: __typename, alias30121: __typename, alias30122: __typename, alias30123: __typename, alias30124: __typename, alias30125: __typename, alias30126: __typename, alias30127: __typename, alias30128: __typename, alias30129: __typename, alias30130: __typename, alias30131: __typename, alias30132: __typename, alias30133: __typename, alias30134: __typename, alias30135: __typename, alias30136: __typename, alias30137: __typename, alias30138: __typename, alias30139: __typename, alias30140: __typename, alias30141: __typename, alias30142: __typename, alias30143: __typename, alias30144: __typename, alias30145: __typename, alias30146: __typename, alias30147: __typename, alias30148: __typename, alias30149: __typename, alias30150: __typename, alias30151: __typename, alias30152: __typename, alias30153: __typename, alias30154: __typename, alias30155: __typename, alias30156: __typename, alias30157: __typename, alias30158: __typename, alias30159: __typename, alias30160: __typename, alias30161: __typename, alias30162: __typename, alias30163: __typename, alias30164: __typename, alias30165: __typename, alias30166: __typename, alias30167: __typename, alias30168: __typename, alias30169: __typename, alias30170: __typename, alias30171: __typename, alias30172: __typename, alias30173: __typename, alias30174: __typename, alias30175: __typename, alias30176: __typename, alias30177: __typename, alias30178: __typename, alias30179: __typename, alias30180: __typename, alias30181: __typename, alias30182: __typename, alias30183: __typename, alias30184: __typename, alias30185: __typename, alias30186: __typename, alias30187: __typename, alias30188: __typename, alias30189: __typename, alias30190: __typename, alias30191: __typename, alias30192: __typename, alias30193: __typename, alias30194: __typename, alias30195: __typename, alias30196: __typename, alias30197: __typename, alias30198: __typename, alias30199: __typename, alias30200: __typename, alias30201: __typename, alias30202: __typename, alias30203: __typename, alias30204: __typename, alias30205: __typename, alias30206: __typename, alias30207: __typename, alias30208: __typename, alias30209: __typename, alias30210: __typename, alias30211: __typename, alias30212: __typename, alias30213: __typename, alias30214: __typename, alias30215: __typename, alias30216: __typename, alias30217: __typename, alias30218: __typename, alias30219: __typename, alias30220: __typename, alias30221: __typename, alias30222: __typename, alias30223: __typename, alias30224: __typename, alias30225: __typename, alias30226: __typename, alias30227: __typename, alias30228: __typename, alias30229: __typename, alias30230: __typename, alias30231: __typename, alias30232: __typename, alias30233: __typename, alias30234: __typename, alias30235: __typename, alias30236: __typename, alias30237: __typename, alias30238: __typename, alias30239: __typename, alias30240: __typename, alias30241: __typename, alias30242: __typename, alias30243: __typename, alias30244: __typename, alias30245: __typename, alias30246: __typename, alias30247: __typename, alias30248: __typename, alias30249: __typename, alias30250: __typename, alias30251: __typename, alias30252: __typename, alias30253: __typename, alias30254: __typename, alias30255: __typename, alias30256: __typename, alias30257: __typename, alias30258: __typename, alias30259: __typename, alias30260: __typename, alias30261: __typename, alias30262: __typename, alias30263: __typename, alias30264: __typename, alias30265: __typename, alias30266: __typename, alias30267: __typename, alias30268: __typename, alias30269: __typename, alias30270: __typename, alias30271: __typename, alias30272: __typename, alias30273: __typename, alias30274: __typename, alias30275: __typename, alias30276: __typename, alias30277: __typename, alias30278: __typename, alias30279: __typename, alias30280: __typename, alias30281: __typename, alias30282: __typename, alias30283: __typename, alias30284: __typename, alias30285: __typename, alias30286: __typename, alias30287: __typename, alias30288: __typename, alias30289: __typename, alias30290: __typename, alias30291: __typename, alias30292: __typename, alias30293: __typename, alias30294: __typename, alias30295: __typename, alias30296: __typename, alias30297: __typename, alias30298: __typename, alias30299: __typename, alias30300: __typename, alias30301: __typename, alias30302: __typename, alias30303: __typename, alias30304: __typename, alias30305: __typename, alias30306: __typename, alias30307: __typename, alias30308: __typename, alias30309: __typename, alias30310: __typename, alias30311: __typename, alias30312: __typename, alias30313: __typename, alias30314: __typename, alias30315: __typename, alias30316: __typename, alias30317: __typename, alias30318: __typename, alias30319: __typename, alias30320: __typename, alias30321: __typename, alias30322: __typename, alias30323: __typename, alias30324: __typename, alias30325: __typename, alias30326: __typename, alias30327: __typename, alias30328: __typename, alias30329: __typename, alias30330: __typename, alias30331: __typename, alias30332: __typename, alias30333: __typename, alias30334: __typename, alias30335: __typename, alias30336: __typename, alias30337: __typename, alias30338: __typename, alias30339: __typename, alias30340: __typename, alias30341: __typename, alias30342: __typename, alias30343: __typename, alias30344: __typename, alias30345: __typename, alias30346: __typename, alias30347: __typename, alias30348: __typename, alias30349: __typename, alias30350: __typename, alias30351: __typename, alias30352: __typename, alias30353: __typename, alias30354: __typename, alias30355: __typename, alias30356: __typename, alias30357: __typename, alias30358: __typename, alias30359: __typename, alias30360: __typename, alias30361: __typename, alias30362: __typename, alias30363: __typename, alias30364: __typename, alias30365: __typename, alias30366: __typename, alias30367: __typename, alias30368: __typename, alias30369: __typename, alias30370: __typename, alias30371: __typename, alias30372: __typename, alias30373: __typename, alias30374: __typename, alias30375: __typename, alias30376: __typename, alias30377: __typename, alias30378: __typename, alias30379: __typename, alias30380: __typename, alias30381: __typename, alias30382: __typename, alias30383: __typename, alias30384: __typename, alias30385: __typename, alias30386: __typename, alias30387: __typename, alias30388: __typename, alias30389: __typename, alias30390: __typename, alias30391: __typename, alias30392: __typename, alias30393: __typename, alias30394: __typename, alias30395: __typename, alias30396: __typename, alias30397: __typename, alias30398: __typename, alias30399: __typename, alias30400: __typename, alias30401: __typename, alias30402: __typename, alias30403: __typename, alias30404: __typename, alias30405: __typename, alias30406: __typename, alias30407: __typename, alias30408: __typename, alias30409: __typename, alias30410: __typename, alias30411: __typename, alias30412: __typename, alias30413: __typename, alias30414: __typename, alias30415: __typename, alias30416: __typename, alias30417: __typename, alias30418: __typename, alias30419: __typename, alias30420: __typename, alias30421: __typename, alias30422: __typename, alias30423: __typename, alias30424: __typename, alias30425: __typename, alias30426: __typename, alias30427: __typename, alias30428: __typename, alias30429: __typename, alias30430: __typename, alias30431: __typename, alias30432: __typename, alias30433: __typename, alias30434: __typename, alias30435: __typename, alias30436: __typename, alias30437: __typename, alias30438: __typename, alias30439: __typename, alias30440: __typename, alias30441: __typename, alias30442: __typename, alias30443: __typename, alias30444: __typename, alias30445: __typename, alias30446: __typename, alias30447: __typename, alias30448: __typename, alias30449: __typename, alias30450: __typename, alias30451: __typename, alias30452: __typename, alias30453: __typename, alias30454: __typename, alias30455: __typename, alias30456: __typename, alias30457: __typename, alias30458: __typename, alias30459: __typename, alias30460: __typename, alias30461: __typename, alias30462: __typename, alias30463: __typename, alias30464: __typename, alias30465: __typename, alias30466: __typename, alias30467: __typename, alias30468: __typename, alias30469: __typename, alias30470: __typename, alias30471: __typename, alias30472: __typename, alias30473: __typename, alias30474: __typename, alias30475: __typename, alias30476: __typename, alias30477: __typename, alias30478: __typename, alias30479: __typename, alias30480: __typename, alias30481: __typename, alias30482: __typename, alias30483: __typename, alias30484: __typename, alias30485: __typename, alias30486: __typename, alias30487: __typename, alias30488: __typename, alias30489: __typename, alias30490: __typename, alias30491: __typename, alias30492: __typename, alias30493: __typename, alias30494: __typename, alias30495: __typename, alias30496: __typename, alias30497: __typename, alias30498: __typename, alias30499: __typename, alias30500: __typename, alias30501: __typename, alias30502: __typename, alias30503: __typename, alias30504: __typename, alias30505: __typename, alias30506: __typename, alias30507: __typename, alias30508: __typename, alias30509: __typename, alias30510: __typename, alias30511: __typename, alias30512: __typename, alias30513: __typename, alias30514: __typename, alias30515: __typename, alias30516: __typename, alias30517: __typename, alias30518: __typename, alias30519: __typename, alias30520: __typename, alias30521: __typename, alias30522: __typename, alias30523: __typename, alias30524: __typename, alias30525: __typename, alias30526: __typename, alias30527: __typename, alias30528: __typename, alias30529: __typename, alias30530: __typename, alias30531: __typename, alias30532: __typename, alias30533: __typename, alias30534: __typename, alias30535: __typename, alias30536: __typename, alias30537: __typename, alias30538: __typename, alias30539: __typename, alias30540: __typename, alias30541: __typename, alias30542: __typename, alias30543: __typename, alias30544: __typename, alias30545: __typename, alias30546: __typename, alias30547: __typename, alias30548: __typename, alias30549: __typename, alias30550: __typename, alias30551: __typename, alias30552: __typename, alias30553: __typename, alias30554: __typename, alias30555: __typename, alias30556: __typename, alias30557: __typename, alias30558: __typename, alias30559: __typename, alias30560: __typename, alias30561: __typename, alias30562: __typename, alias30563: __typename, alias30564: __typename, alias30565: __typename, alias30566: __typename, alias30567: __typename, alias30568: __typename, alias30569: __typename, alias30570: __typename, alias30571: __typename, alias30572: __typename, alias30573: __typename, alias30574: __typename, alias30575: __typename, alias30576: __typename, alias30577: __typename, alias30578: __typename, alias30579: __typename, alias30580: __typename, alias30581: __typename, alias30582: __typename, alias30583: __typename, alias30584: __typename, alias30585: __typename, alias30586: __typename, alias30587: __typename, alias30588: __typename, alias30589: __typename, alias30590: __typename, alias30591: __typename, alias30592: __typename, alias30593: __typename, alias30594: __typename, alias30595: __typename, alias30596: __typename, alias30597: __typename, alias30598: __typename, alias30599: __typename, alias30600: __typename, alias30601: __typename, alias30602: __typename, alias30603: __typename, alias30604: __typename, alias30605: __typename, alias30606: __typename, alias30607: __typename, alias30608: __typename, alias30609: __typename, alias30610: __typename, alias30611: __typename, alias30612: __typename, alias30613: __typename, alias30614: __typename, alias30615: __typename, alias30616: __typename, alias30617: __typename, alias30618: __typename, alias30619: __typename, alias30620: __typename, alias30621: __typename, alias30622: __typename, alias30623: __typename, alias30624: __typename, alias30625: __typename, alias30626: __typename, alias30627: __typename, alias30628: __typename, alias30629: __typename, alias30630: __typename, alias30631: __typename, alias30632: __typename, alias30633: __typename, alias30634: __typename, alias30635: __typename, alias30636: __typename, alias30637: __typename, alias30638: __typename, alias30639: __typename, alias30640: __typename, alias30641: __typename, alias30642: __typename, alias30643: __typename, alias30644: __typename, alias30645: __typename, alias30646: __typename, alias30647: __typename, alias30648: __typename, alias30649: __typename, alias30650: __typename, alias30651: __typename, alias30652: __typename, alias30653: __typename, alias30654: __typename, alias30655: __typename, alias30656: __typename, alias30657: __typename, alias30658: __typename, alias30659: __typename, alias30660: __typename, alias30661: __typename, alias30662: __typename, alias30663: __typename, alias30664: __typename, alias30665: __typename, alias30666: __typename, alias30667: __typename, alias30668: __typename, alias30669: __typename, alias30670: __typename, alias30671: __typename, alias30672: __typename, alias30673: __typename, alias30674: __typename, alias30675: __typename, alias30676: __typename, alias30677: __typename, alias30678: __typename, alias30679: __typename, alias30680: __typename, alias30681: __typename, alias30682: __typename, alias30683: __typename, alias30684: __typename, alias30685: __typename, alias30686: __typename, alias30687: __typename, alias30688: __typename, alias30689: __typename, alias30690: __typename, alias30691: __typename, alias30692: __typename, alias30693: __typename, alias30694: __typename, alias30695: __typename, alias30696: __typename, alias30697: __typename, alias30698: __typename, alias30699: __typename, alias30700: __typename, alias30701: __typename, alias30702: __typename, alias30703: __typename, alias30704: __typename, alias30705: __typename, alias30706: __typename, alias30707: __typename, alias30708: __typename, alias30709: __typename, alias30710: __typename, alias30711: __typename, alias30712: __typename, alias30713: __typename, alias30714: __typename, alias30715: __typename, alias30716: __typename, alias30717: __typename, alias30718: __typename, alias30719: __typename, alias30720: __typename, alias30721: __typename, alias30722: __typename, alias30723: __typename, alias30724: __typename, alias30725: __typename, alias30726: __typename, alias30727: __typename, alias30728: __typename, alias30729: __typename, alias30730: __typename, alias30731: __typename, alias30732: __typename, alias30733: __typename, alias30734: __typename, alias30735: __typename, alias30736: __typename, alias30737: __typename, alias30738: __typename, alias30739: __typename, alias30740: __typename, alias30741: __typename, alias30742: __typename, alias30743: __typename, alias30744: __typename, alias30745: __typename, alias30746: __typename, alias30747: __typename, alias30748: __typename, alias30749: __typename, alias30750: __typename, alias30751: __typename, alias30752: __typename, alias30753: __typename, alias30754: __typename, alias30755: __typename, alias30756: __typename, alias30757: __typename, alias30758: __typename, alias30759: __typename, alias30760: __typename, alias30761: __typename, alias30762: __typename, alias30763: __typename, alias30764: __typename, alias30765: __typename, alias30766: __typename, alias30767: __typename, alias30768: __typename, alias30769: __typename, alias30770: __typename, alias30771: __typename, alias30772: __typename, alias30773: __typename, alias30774: __typename, alias30775: __typename, alias30776: __typename, alias30777: __typename, alias30778: __typename, alias30779: __typename, alias30780: __typename, alias30781: __typename, alias30782: __typename, alias30783: __typename, alias30784: __typename, alias30785: __typename, alias30786: __typename, alias30787: __typename, alias30788: __typename, alias30789: __typename, alias30790: __typename, alias30791: __typename, alias30792: __typename, alias30793: __typename, alias30794: __typename, alias30795: __typename, alias30796: __typename, alias30797: __typename, alias30798: __typename, alias30799: __typename, alias30800: __typename, alias30801: __typename, alias30802: __typename, alias30803: __typename, alias30804: __typename, alias30805: __typename, alias30806: __typename, alias30807: __typename, alias30808: __typename, alias30809: __typename, alias30810: __typename, alias30811: __typename, alias30812: __typename, alias30813: __typename, alias30814: __typename, alias30815: __typename, alias30816: __typename, alias30817: __typename, alias30818: __typename, alias30819: __typename, alias30820: __typename, alias30821: __typename, alias30822: __typename, alias30823: __typename, alias30824: __typename, alias30825: __typename, alias30826: __typename, alias30827: __typename, alias30828: __typename, alias30829: __typename, alias30830: __typename, alias30831: __typename, alias30832: __typename, alias30833: __typename, alias30834: __typename, alias30835: __typename, alias30836: __typename, alias30837: __typename, alias30838: __typename, alias30839: __typename, alias30840: __typename, alias30841: __typename, alias30842: __typename, alias30843: __typename, alias30844: __typename, alias30845: __typename, alias30846: __typename, alias30847: __typename, alias30848: __typename, alias30849: __typename, alias30850: __typename, alias30851: __typename, alias30852: __typename, alias30853: __typename, alias30854: __typename, alias30855: __typename, alias30856: __typename, alias30857: __typename, alias30858: __typename, alias30859: __typename, alias30860: __typename, alias30861: __typename, alias30862: __typename, alias30863: __typename, alias30864: __typename, alias30865: __typename, alias30866: __typename, alias30867: __typename, alias30868: __typename, alias30869: __typename, alias30870: __typename, alias30871: __typename, alias30872: __typename, alias30873: __typename, alias30874: __typename, alias30875: __typename, alias30876: __typename, alias30877: __typename, alias30878: __typename, alias30879: __typename, alias30880: __typename, alias30881: __typename, alias30882: __typename, alias30883: __typename, alias30884: __typename, alias30885: __typename, alias30886: __typename, alias30887: __typename, alias30888: __typename, alias30889: __typename, alias30890: __typename, alias30891: __typename, alias30892: __typename, alias30893: __typename, alias30894: __typename, alias30895: __typename, alias30896: __typename, alias30897: __typename, alias30898: __typename, alias30899: __typename, alias30900: __typename, alias30901: __typename, alias30902: __typename, alias30903: __typename, alias30904: __typename, alias30905: __typename, alias30906: __typename, alias30907: __typename, alias30908: __typename, alias30909: __typename, alias30910: __typename, alias30911: __typename, alias30912: __typename, alias30913: __typename, alias30914: __typename, alias30915: __typename, alias30916: __typename, alias30917: __typename, alias30918: __typename, alias30919: __typename, alias30920: __typename, alias30921: __typename, alias30922: __typename, alias30923: __typename, alias30924: __typename, alias30925: __typename, alias30926: __typename, alias30927: __typename, alias30928: __typename, alias30929: __typename, alias30930: __typename, alias30931: __typename, alias30932: __typename, alias30933: __typename, alias30934: __typename, alias30935: __typename, alias30936: __typename, alias30937: __typename, alias30938: __typename, alias30939: __typename, alias30940: __typename, alias30941: __typename, alias30942: __typename, alias30943: __typename, alias30944: __typename, alias30945: __typename, alias30946: __typename, alias30947: __typename, alias30948: __typename, alias30949: __typename, alias30950: __typename, alias30951: __typename, alias30952: __typename, alias30953: __typename, alias30954: __typename, alias30955: __typename, alias30956: __typename, alias30957: __typename, alias30958: __typename, alias30959: __typename, alias30960: __typename, alias30961: __typename, alias30962: __typename, alias30963: __typename, alias30964: __typename, alias30965: __typename, alias30966: __typename, alias30967: __typename, alias30968: __typename, alias30969: __typename, alias30970: __typename, alias30971: __typename, alias30972: __typename, alias30973: __typename, alias30974: __typename, alias30975: __typename, alias30976: __typename, alias30977: __typename, alias30978: __typename, alias30979: __typename, alias30980: __typename, alias30981: __typename, alias30982: __typename, alias30983: __typename, alias30984: __typename, alias30985: __typename, alias30986: __typename, alias30987: __typename, alias30988: __typename, alias30989: __typename, alias30990: __typename, alias30991: __typename, alias30992: __typename, alias30993: __typename, alias30994: __typename, alias30995: __typename, alias30996: __typename, alias30997: __typename, alias30998: __typename, alias30999: __typename, alias31000: __typename, alias31001: __typename, alias31002: __typename, alias31003: __typename, alias31004: __typename, alias31005: __typename, alias31006: __typename, alias31007: __typename, alias31008: __typename, alias31009: __typename, alias31010: __typename, alias31011: __typename, alias31012: __typename, alias31013: __typename, alias31014: __typename, alias31015: __typename, alias31016: __typename, alias31017: __typename, alias31018: __typename, alias31019: __typename, alias31020: __typename, alias31021: __typename, alias31022: __typename, alias31023: __typename, alias31024: __typename, alias31025: __typename, alias31026: __typename, alias31027: __typename, alias31028: __typename, alias31029: __typename, alias31030: __typename, alias31031: __typename, alias31032: __typename, alias31033: __typename, alias31034: __typename, alias31035: __typename, alias31036: __typename, alias31037: __typename, alias31038: __typename, alias31039: __typename, alias31040: __typename, alias31041: __typename, alias31042: __typename, alias31043: __typename, alias31044: __typename, alias31045: __typename, alias31046: __typename, alias31047: __typename, alias31048: __typename, alias31049: __typename, alias31050: __typename, alias31051: __typename, alias31052: __typename, alias31053: __typename, alias31054: __typename, alias31055: __typename, alias31056: __typename, alias31057: __typename, alias31058: __typename, alias31059: __typename, alias31060: __typename, alias31061: __typename, alias31062: __typename, alias31063: __typename, alias31064: __typename, alias31065: __typename, alias31066: __typename, alias31067: __typename, alias31068: __typename, alias31069: __typename, alias31070: __typename, alias31071: __typename, alias31072: __typename, alias31073: __typename, alias31074: __typename, alias31075: __typename, alias31076: __typename, alias31077: __typename, alias31078: __typename, alias31079: __typename, alias31080: __typename, alias31081: __typename, alias31082: __typename, alias31083: __typename, alias31084: __typename, alias31085: __typename, alias31086: __typename, alias31087: __typename, alias31088: __typename, alias31089: __typename, alias31090: __typename, alias31091: __typename, alias31092: __typename, alias31093: __typename, alias31094: __typename, alias31095: __typename, alias31096: __typename, alias31097: __typename, alias31098: __typename, alias31099: __typename, alias31100: __typename, alias31101: __typename, alias31102: __typename, alias31103: __typename, alias31104: __typename, alias31105: __typename, alias31106: __typename, alias31107: __typename, alias31108: __typename, alias31109: __typename, alias31110: __typename, alias31111: __typename, alias31112: __typename, alias31113: __typename, alias31114: __typename, alias31115: __typename, alias31116: __typename, alias31117: __typename, alias31118: __typename, alias31119: __typename, alias31120: __typename, alias31121: __typename, alias31122: __typename, alias31123: __typename, alias31124: __typename, alias31125: __typename, alias31126: __typename, alias31127: __typename, alias31128: __typename, alias31129: __typename, alias31130: __typename, alias31131: __typename, alias31132: __typename, alias31133: __typename, alias31134: __typename, alias31135: __typename, alias31136: __typename, alias31137: __typename, alias31138: __typename, alias31139: __typename, alias31140: __typename, alias31141: __typename, alias31142: __typename, alias31143: __typename, alias31144: __typename, alias31145: __typename, alias31146: __typename, alias31147: __typename, alias31148: __typename, alias31149: __typename, alias31150: __typename, alias31151: __typename, alias31152: __typename, alias31153: __typename, alias31154: __typename, alias31155: __typename, alias31156: __typename, alias31157: __typename, alias31158: __typename, alias31159: __typename, alias31160: __typename, alias31161: __typename, alias31162: __typename, alias31163: __typename, alias31164: __typename, alias31165: __typename, alias31166: __typename, alias31167: __typename, alias31168: __typename, alias31169: __typename, alias31170: __typename, alias31171: __typename, alias31172: __typename, alias31173: __typename, alias31174: __typename, alias31175: __typename, alias31176: __typename, alias31177: __typename, alias31178: __typename, alias31179: __typename, alias31180: __typename, alias31181: __typename, alias31182: __typename, alias31183: __typename, alias31184: __typename, alias31185: __typename, alias31186: __typename, alias31187: __typename, alias31188: __typename, alias31189: __typename, alias31190: __typename, alias31191: __typename, alias31192: __typename, alias31193: __typename, alias31194: __typename, alias31195: __typename, alias31196: __typename, alias31197: __typename, alias31198: __typename, alias31199: __typename, alias31200: __typename, alias31201: __typename, alias31202: __typename, alias31203: __typename, alias31204: __typename, alias31205: __typename, alias31206: __typename, alias31207: __typename, alias31208: __typename, alias31209: __typename, alias31210: __typename, alias31211: __typename, alias31212: __typename, alias31213: __typename, alias31214: __typename, alias31215: __typename, alias31216: __typename, alias31217: __typename, alias31218: __typename, alias31219: __typename, alias31220: __typename, alias31221: __typename, alias31222: __typename, alias31223: __typename, alias31224: __typename, alias31225: __typename, alias31226: __typename, alias31227: __typename, alias31228: __typename, alias31229: __typename, alias31230: __typename, alias31231: __typename, alias31232: __typename, alias31233: __typename, alias31234: __typename, alias31235: __typename, alias31236: __typename, alias31237: __typename, alias31238: __typename, alias31239: __typename, alias31240: __typename, alias31241: __typename, alias31242: __typename, alias31243: __typename, alias31244: __typename, alias31245: __typename, alias31246: __typename, alias31247: __typename, alias31248: __typename, alias31249: __typename, alias31250: __typename, alias31251: __typename, alias31252: __typename, alias31253: __typename, alias31254: __typename, alias31255: __typename, alias31256: __typename, alias31257: __typename, alias31258: __typename, alias31259: __typename, alias31260: __typename, alias31261: __typename, alias31262: __typename, alias31263: __typename, alias31264: __typename, alias31265: __typename, alias31266: __typename, alias31267: __typename, alias31268: __typename, alias31269: __typename, alias31270: __typename, alias31271: __typename, alias31272: __typename, alias31273: __typename, alias31274: __typename, alias31275: __typename, alias31276: __typename, alias31277: __typename, alias31278: __typename, alias31279: __typename, alias31280: __typename, alias31281: __typename, alias31282: __typename, alias31283: __typename, alias31284: __typename, alias31285: __typename, alias31286: __typename, alias31287: __typename, alias31288: __typename, alias31289: __typename, alias31290: __typename, alias31291: __typename, alias31292: __typename, alias31293: __typename, alias31294: __typename, alias31295: __typename, alias31296: __typename, alias31297: __typename, alias31298: __typename, alias31299: __typename, alias31300: __typename, alias31301: __typename, alias31302: __typename, alias31303: __typename, alias31304: __typename, alias31305: __typename, alias31306: __typename, alias31307: __typename, alias31308: __typename, alias31309: __typename, alias31310: __typename, alias31311: __typename, alias31312: __typename, alias31313: __typename, alias31314: __typename, alias31315: __typename, alias31316: __typename, alias31317: __typename, alias31318: __typename, alias31319: __typename, alias31320: __typename, alias31321: __typename, alias31322: __typename, alias31323: __typename, alias31324: __typename, alias31325: __typename, alias31326: __typename, alias31327: __typename, alias31328: __typename, alias31329: __typename, alias31330: __typename, alias31331: __typename, alias31332: __typename, alias31333: __typename, alias31334: __typename, alias31335: __typename, alias31336: __typename, alias31337: __typename, alias31338: __typename, alias31339: __typename, alias31340: __typename, alias31341: __typename, alias31342: __typename, alias31343: __typename, alias31344: __typename, alias31345: __typename, alias31346: __typename, alias31347: __typename, alias31348: __typename, alias31349: __typename, alias31350: __typename, alias31351: __typename, alias31352: __typename, alias31353: __typename, alias31354: __typename, alias31355: __typename, alias31356: __typename, alias31357: __typename, alias31358: __typename, alias31359: __typename, alias31360: __typename, alias31361: __typename, alias31362: __typename, alias31363: __typename, alias31364: __typename, alias31365: __typename, alias31366: __typename, alias31367: __typename, alias31368: __typename, alias31369: __typename, alias31370: __typename, alias31371: __typename, alias31372: __typename, alias31373: __typename, alias31374: __typename, alias31375: __typename, alias31376: __typename, alias31377: __typename, alias31378: __typename, alias31379: __typename, alias31380: __typename, alias31381: __typename, alias31382: __typename, alias31383: __typename, alias31384: __typename, alias31385: __typename, alias31386: __typename, alias31387: __typename, alias31388: __typename, alias31389: __typename, alias31390: __typename, alias31391: __typename, alias31392: __typename, alias31393: __typename, alias31394: __typename, alias31395: __typename, alias31396: __typename, alias31397: __typename, alias31398: __typename, alias31399: __typename, alias31400: __typename, alias31401: __typename, alias31402: __typename, alias31403: __typename, alias31404: __typename, alias31405: __typename, alias31406: __typename, alias31407: __typename, alias31408: __typename, alias31409: __typename, alias31410: __typename, alias31411: __typename, alias31412: __typename, alias31413: __typename, alias31414: __typename, alias31415: __typename, alias31416: __typename, alias31417: __typename, alias31418: __typename, alias31419: __typename, alias31420: __typename, alias31421: __typename, alias31422: __typename, alias31423: __typename, alias31424: __typename, alias31425: __typename, alias31426: __typename, alias31427: __typename, alias31428: __typename, alias31429: __typename, alias31430: __typename, alias31431: __typename, alias31432: __typename, alias31433: __typename, alias31434: __typename, alias31435: __typename, alias31436: __typename, alias31437: __typename, alias31438: __typename, alias31439: __typename, alias31440: __typename, alias31441: __typename, alias31442: __typename, alias31443: __typename, alias31444: __typename, alias31445: __typename, alias31446: __typename, alias31447: __typename, alias31448: __typename, alias31449: __typename, alias31450: __typename, alias31451: __typename, alias31452: __typename, alias31453: __typename, alias31454: __typename, alias31455: __typename, alias31456: __typename, alias31457: __typename, alias31458: __typename, alias31459: __typename, alias31460: __typename, alias31461: __typename, alias31462: __typename, alias31463: __typename, alias31464: __typename, alias31465: __typename, alias31466: __typename, alias31467: __typename, alias31468: __typename, alias31469: __typename, alias31470: __typename, alias31471: __typename, alias31472: __typename, alias31473: __typename, alias31474: __typename, alias31475: __typename, alias31476: __typename, alias31477: __typename, alias31478: __typename, alias31479: __typename, alias31480: __typename, alias31481: __typename, alias31482: __typename, alias31483: __typename, alias31484: __typename, alias31485: __typename, alias31486: __typename, alias31487: __typename, alias31488: __typename, alias31489: __typename, alias31490: __typename, alias31491: __typename, alias31492: __typename, alias31493: __typename, alias31494: __typename, alias31495: __typename, alias31496: __typename, alias31497: __typename, alias31498: __typename, alias31499: __typename, alias31500: __typename, alias31501: __typename, alias31502: __typename, alias31503: __typename, alias31504: __typename, alias31505: __typename, alias31506: __typename, alias31507: __typename, alias31508: __typename, alias31509: __typename, alias31510: __typename, alias31511: __typename, alias31512: __typename, alias31513: __typename, alias31514: __typename, alias31515: __typename, alias31516: __typename, alias31517: __typename, alias31518: __typename, alias31519: __typename, alias31520: __typename, alias31521: __typename, alias31522: __typename, alias31523: __typename, alias31524: __typename, alias31525: __typename, alias31526: __typename, alias31527: __typename, alias31528: __typename, alias31529: __typename, alias31530: __typename, alias31531: __typename, alias31532: __typename, alias31533: __typename, alias31534: __typename, alias31535: __typename, alias31536: __typename, alias31537: __typename, alias31538: __typename, alias31539: __typename, alias31540: __typename, alias31541: __typename, alias31542: __typename, alias31543: __typename, alias31544: __typename, alias31545: __typename, alias31546: __typename, alias31547: __typename, alias31548: __typename, alias31549: __typename, alias31550: __typename, alias31551: __typename, alias31552: __typename, alias31553: __typename, alias31554: __typename, alias31555: __typename, alias31556: __typename, alias31557: __typename, alias31558: __typename, alias31559: __typename, alias31560: __typename, alias31561: __typename, alias31562: __typename, alias31563: __typename, alias31564: __typename, alias31565: __typename, alias31566: __typename, alias31567: __typename, alias31568: __typename, alias31569: __typename, alias31570: __typename, alias31571: __typename, alias31572: __typename, alias31573: __typename, alias31574: __typename, alias31575: __typename, alias31576: __typename, alias31577: __typename, alias31578: __typename, alias31579: __typename, alias31580: __typename, alias31581: __typename, alias31582: __typename, alias31583: __typename, alias31584: __typename, alias31585: __typename, alias31586: __typename, alias31587: __typename, alias31588: __typename, alias31589: __typename, alias31590: __typename, alias31591: __typename, alias31592: __typename, alias31593: __typename, alias31594: __typename, alias31595: __typename, alias31596: __typename, alias31597: __typename, alias31598: __typename, alias31599: __typename, alias31600: __typename, alias31601: __typename, alias31602: __typename, alias31603: __typename, alias31604: __typename, alias31605: __typename, alias31606: __typename, alias31607: __typename, alias31608: __typename, alias31609: __typename, alias31610: __typename, alias31611: __typename, alias31612: __typename, alias31613: __typename, alias31614: __typename, alias31615: __typename, alias31616: __typename, alias31617: __typename, alias31618: __typename, alias31619: __typename, alias31620: __typename, alias31621: __typename, alias31622: __typename, alias31623: __typename, alias31624: __typename, alias31625: __typename, alias31626: __typename, alias31627: __typename, alias31628: __typename, alias31629: __typename, alias31630: __typename, alias31631: __typename, alias31632: __typename, alias31633: __typename, alias31634: __typename, alias31635: __typename, alias31636: __typename, alias31637: __typename, alias31638: __typename, alias31639: __typename, alias31640: __typename, alias31641: __typename, alias31642: __typename, alias31643: __typename, alias31644: __typename, alias31645: __typename, alias31646: __typename, alias31647: __typename, alias31648: __typename, alias31649: __typename, alias31650: __typename, alias31651: __typename, alias31652: __typename, alias31653: __typename, alias31654: __typename, alias31655: __typename, alias31656: __typename, alias31657: __typename, alias31658: __typename, alias31659: __typename, alias31660: __typename, alias31661: __typename, alias31662: __typename, alias31663: __typename, alias31664: __typename, alias31665: __typename, alias31666: __typename, alias31667: __typename, alias31668: __typename, alias31669: __typename, alias31670: __typename, alias31671: __typename, alias31672: __typename, alias31673: __typename, alias31674: __typename, alias31675: __typename, alias31676: __typename, alias31677: __typename, alias31678: __typename, alias31679: __typename, alias31680: __typename, alias31681: __typename, alias31682: __typename, alias31683: __typename, alias31684: __typename, alias31685: __typename, alias31686: __typename, alias31687: __typename, alias31688: __typename, alias31689: __typename, alias31690: __typename, alias31691: __typename, alias31692: __typename, alias31693: __typename, alias31694: __typename, alias31695: __typename, alias31696: __typename, alias31697: __typename, alias31698: __typename, alias31699: __typename, alias31700: __typename, alias31701: __typename, alias31702: __typename, alias31703: __typename, alias31704: __typename, alias31705: __typename, alias31706: __typename, alias31707: __typename, alias31708: __typename, alias31709: __typename, alias31710: __typename, alias31711: __typename, alias31712: __typename, alias31713: __typename, alias31714: __typename, alias31715: __typename, alias31716: __typename, alias31717: __typename, alias31718: __typename, alias31719: __typename, alias31720: __typename, alias31721: __typename, alias31722: __typename, alias31723: __typename, alias31724: __typename, alias31725: __typename, alias31726: __typename, alias31727: __typename, alias31728: __typename, alias31729: __typename, alias31730: __typename, alias31731: __typename, alias31732: __typename, alias31733: __typename, alias31734: __typename, alias31735: __typename, alias31736: __typename, alias31737: __typename, alias31738: __typename, alias31739: __typename, alias31740: __typename, alias31741: __typename, alias31742: __typename, alias31743: __typename, alias31744: __typename, alias31745: __typename, alias31746: __typename, alias31747: __typename, alias31748: __typename, alias31749: __typename, alias31750: __typename, alias31751: __typename, alias31752: __typename, alias31753: __typename, alias31754: __typename, alias31755: __typename, alias31756: __typename, alias31757: __typename, alias31758: __typename, alias31759: __typename, alias31760: __typename, alias31761: __typename, alias31762: __typename, alias31763: __typename, alias31764: __typename, alias31765: __typename, alias31766: __typename, alias31767: __typename, alias31768: __typename, alias31769: __typename, alias31770: __typename, alias31771: __typename, alias31772: __typename, alias31773: __typename, alias31774: __typename, alias31775: __typename, alias31776: __typename, alias31777: __typename, alias31778: __typename, alias31779: __typename, alias31780: __typename, alias31781: __typename, alias31782: __typename, alias31783: __typename, alias31784: __typename, alias31785: __typename, alias31786: __typename, alias31787: __typename, alias31788: __typename, alias31789: __typename, alias31790: __typename, alias31791: __typename, alias31792: __typename, alias31793: __typename, alias31794: __typename, alias31795: __typename, alias31796: __typename, alias31797: __typename, alias31798: __typename, alias31799: __typename, alias31800: __typename, alias31801: __typename, alias31802: __typename, alias31803: __typename, alias31804: __typename, alias31805: __typename, alias31806: __typename, alias31807: __typename, alias31808: __typename, alias31809: __typename, alias31810: __typename, alias31811: __typename, alias31812: __typename, alias31813: __typename, alias31814: __typename, alias31815: __typename, alias31816: __typename, alias31817: __typename, alias31818: __typename, alias31819: __typename, alias31820: __typename, alias31821: __typename, alias31822: __typename, alias31823: __typename, alias31824: __typename, alias31825: __typename, alias31826: __typename, alias31827: __typename, alias31828: __typename, alias31829: __typename, alias31830: __typename, alias31831: __typename, alias31832: __typename, alias31833: __typename, alias31834: __typename, alias31835: __typename, alias31836: __typename, alias31837: __typename, alias31838: __typename, alias31839: __typename, alias31840: __typename, alias31841: __typename, alias31842: __typename, alias31843: __typename, alias31844: __typename, alias31845: __typename, alias31846: __typename, alias31847: __typename, alias31848: __typename, alias31849: __typename, alias31850: __typename, alias31851: __typename, alias31852: __typename, alias31853: __typename, alias31854: __typename, alias31855: __typename, alias31856: __typename, alias31857: __typename, alias31858: __typename, alias31859: __typename, alias31860: __typename, alias31861: __typename, alias31862: __typename, alias31863: __typename, alias31864: __typename, alias31865: __typename, alias31866: __typename, alias31867: __typename, alias31868: __typename, alias31869: __typename, alias31870: __typename, alias31871: __typename, alias31872: __typename, alias31873: __typename, alias31874: __typename, alias31875: __typename, alias31876: __typename, alias31877: __typename, alias31878: __typename, alias31879: __typename, alias31880: __typename, alias31881: __typename, alias31882: __typename, alias31883: __typename, alias31884: __typename, alias31885: __typename, alias31886: __typename, alias31887: __typename, alias31888: __typename, alias31889: __typename, alias31890: __typename, alias31891: __typename, alias31892: __typename, alias31893: __typename, alias31894: __typename, alias31895: __typename, alias31896: __typename, alias31897: __typename, alias31898: __typename, alias31899: __typename, alias31900: __typename, alias31901: __typename, alias31902: __typename, alias31903: __typename, alias31904: __typename, alias31905: __typename, alias31906: __typename, alias31907: __typename, alias31908: __typename, alias31909: __typename, alias31910: __typename, alias31911: __typename, alias31912: __typename, alias31913: __typename, alias31914: __typename, alias31915: __typename, alias31916: __typename, alias31917: __typename, alias31918: __typename, alias31919: __typename, alias31920: __typename, alias31921: __typename, alias31922: __typename, alias31923: __typename, alias31924: __typename, alias31925: __typename, alias31926: __typename, alias31927: __typename, alias31928: __typename, alias31929: __typename, alias31930: __typename, alias31931: __typename, alias31932: __typename, alias31933: __typename, alias31934: __typename, alias31935: __typename, alias31936: __typename, alias31937: __typename, alias31938: __typename, alias31939: __typename, alias31940: __typename, alias31941: __typename, alias31942: __typename, alias31943: __typename, alias31944: __typename, alias31945: __typename, alias31946: __typename, alias31947: __typename, alias31948: __typename, alias31949: __typename, alias31950: __typename, alias31951: __typename, alias31952: __typename, alias31953: __typename, alias31954: __typename, alias31955: __typename, alias31956: __typename, alias31957: __typename, alias31958: __typename, alias31959: __typename, alias31960: __typename, alias31961: __typename, alias31962: __typename, alias31963: __typename, alias31964: __typename, alias31965: __typename, alias31966: __typename, alias31967: __typename, alias31968: __typename, alias31969: __typename, alias31970: __typename, alias31971: __typename, alias31972: __typename, alias31973: __typename, alias31974: __typename, alias31975: __typename, alias31976: __typename, alias31977: __typename, alias31978: __typename, alias31979: __typename, alias31980: __typename, alias31981: __typename, alias31982: __typename, alias31983: __typename, alias31984: __typename, alias31985: __typename, alias31986: __typename, alias31987: __typename, alias31988: __typename, alias31989: __typename, alias31990: __typename, alias31991: __typename, alias31992: __typename, alias31993: __typename, alias31994: __typename, alias31995: __typename, alias31996: __typename, alias31997: __typename, alias31998: __typename, alias31999: __typename, alias32000: __typename, alias32001: __typename, alias32002: __typename, alias32003: __typename, alias32004: __typename, alias32005: __typename, alias32006: __typename, alias32007: __typename, alias32008: __typename, alias32009: __typename, alias32010: __typename, alias32011: __typename, alias32012: __typename, alias32013: __typename, alias32014: __typename, alias32015: __typename, alias32016: __typename, alias32017: __typename, alias32018: __typename, alias32019: __typename, alias32020: __typename, alias32021: __typename, alias32022: __typename, alias32023: __typename, alias32024: __typename, alias32025: __typename, alias32026: __typename, alias32027: __typename, alias32028: __typename, alias32029: __typename, alias32030: __typename, alias32031: __typename, alias32032: __typename, alias32033: __typename, alias32034: __typename, alias32035: __typename, alias32036: __typename, alias32037: __typename, alias32038: __typename, alias32039: __typename, alias32040: __typename, alias32041: __typename, alias32042: __typename, alias32043: __typename, alias32044: __typename, alias32045: __typename, alias32046: __typename, alias32047: __typename, alias32048: __typename, alias32049: __typename, alias32050: __typename, alias32051: __typename, alias32052: __typename, alias32053: __typename, alias32054: __typename, alias32055: __typename, alias32056: __typename, alias32057: __typename, alias32058: __typename, alias32059: __typename, alias32060: __typename, alias32061: __typename, alias32062: __typename, alias32063: __typename, alias32064: __typename, alias32065: __typename, alias32066: __typename, alias32067: __typename, alias32068: __typename, alias32069: __typename, alias32070: __typename, alias32071: __typename, alias32072: __typename, alias32073: __typename, alias32074: __typename, alias32075: __typename, alias32076: __typename, alias32077: __typename, alias32078: __typename, alias32079: __typename, alias32080: __typename, alias32081: __typename, alias32082: __typename, alias32083: __typename, alias32084: __typename, alias32085: __typename, alias32086: __typename, alias32087: __typename, alias32088: __typename, alias32089: __typename, alias32090: __typename, alias32091: __typename, alias32092: __typename, alias32093: __typename, alias32094: __typename, alias32095: __typename, alias32096: __typename, alias32097: __typename, alias32098: __typename, alias32099: __typename, alias32100: __typename, alias32101: __typename, alias32102: __typename, alias32103: __typename, alias32104: __typename, alias32105: __typename, alias32106: __typename, alias32107: __typename, alias32108: __typename, alias32109: __typename, alias32110: __typename, alias32111: __typename, alias32112: __typename, alias32113: __typename, alias32114: __typename, alias32115: __typename, alias32116: __typename, alias32117: __typename, alias32118: __typename, alias32119: __typename, alias32120: __typename, alias32121: __typename, alias32122: __typename, alias32123: __typename, alias32124: __typename, alias32125: __typename, alias32126: __typename, alias32127: __typename, alias32128: __typename, alias32129: __typename, alias32130: __typename, alias32131: __typename, alias32132: __typename, alias32133: __typename, alias32134: __typename, alias32135: __typename, alias32136: __typename, alias32137: __typename, alias32138: __typename, alias32139: __typename, alias32140: __typename, alias32141: __typename, alias32142: __typename, alias32143: __typename, alias32144: __typename, alias32145: __typename, alias32146: __typename, alias32147: __typename, alias32148: __typename, alias32149: __typename, alias32150: __typename, alias32151: __typename, alias32152: __typename, alias32153: __typename, alias32154: __typename, alias32155: __typename, alias32156: __typename, alias32157: __typename, alias32158: __typename, alias32159: __typename, alias32160: __typename, alias32161: __typename, alias32162: __typename, alias32163: __typename, alias32164: __typename, alias32165: __typename, alias32166: __typename, alias32167: __typename, alias32168: __typename, alias32169: __typename, alias32170: __typename, alias32171: __typename, alias32172: __typename, alias32173: __typename, alias32174: __typename, alias32175: __typename, alias32176: __typename, alias32177: __typename, alias32178: __typename, alias32179: __typename, alias32180: __typename, alias32181: __typename, alias32182: __typename, alias32183: __typename, alias32184: __typename, alias32185: __typename, alias32186: __typename, alias32187: __typename, alias32188: __typename, alias32189: __typename, alias32190: __typename, alias32191: __typename, alias32192: __typename, alias32193: __typename, alias32194: __typename, alias32195: __typename, alias32196: __typename, alias32197: __typename, alias32198: __typename, alias32199: __typename, alias32200: __typename, alias32201: __typename, alias32202: __typename, alias32203: __typename, alias32204: __typename, alias32205: __typename, alias32206: __typename, alias32207: __typename, alias32208: __typename, alias32209: __typename, alias32210: __typename, alias32211: __typename, alias32212: __typename, alias32213: __typename, alias32214: __typename, alias32215: __typename, alias32216: __typename, alias32217: __typename, alias32218: __typename, alias32219: __typename, alias32220: __typename, alias32221: __typename, alias32222: __typename, alias32223: __typename, alias32224: __typename, alias32225: __typename, alias32226: __typename, alias32227: __typename, alias32228: __typename, alias32229: __typename, alias32230: __typename, alias32231: __typename, alias32232: __typename, alias32233: __typename, alias32234: __typename, alias32235: __typename, alias32236: __typename, alias32237: __typename, alias32238: __typename, alias32239: __typename, alias32240: __typename, alias32241: __typename, alias32242: __typename, alias32243: __typename, alias32244: __typename, alias32245: __typename, alias32246: __typename, alias32247: __typename, alias32248: __typename, alias32249: __typename, alias32250: __typename, alias32251: __typename, alias32252: __typename, alias32253: __typename, alias32254: __typename, alias32255: __typename, alias32256: __typename, alias32257: __typename, alias32258: __typename, alias32259: __typename, alias32260: __typename, alias32261: __typename, alias32262: __typename, alias32263: __typename, alias32264: __typename, alias32265: __typename, alias32266: __typename, alias32267: __typename, alias32268: __typename, alias32269: __typename, alias32270: __typename, alias32271: __typename, alias32272: __typename, alias32273: __typename, alias32274: __typename, alias32275: __typename, alias32276: __typename, alias32277: __typename, alias32278: __typename, alias32279: __typename, alias32280: __typename, alias32281: __typename, alias32282: __typename, alias32283: __typename, alias32284: __typename, alias32285: __typename, alias32286: __typename, alias32287: __typename, alias32288: __typename, alias32289: __typename, alias32290: __typename, alias32291: __typename, alias32292: __typename, alias32293: __typename, alias32294: __typename, alias32295: __typename, alias32296: __typename, alias32297: __typename, alias32298: __typename, alias32299: __typename, alias32300: __typename, alias32301: __typename, alias32302: __typename, alias32303: __typename, alias32304: __typename, alias32305: __typename, alias32306: __typename, alias32307: __typename, alias32308: __typename, alias32309: __typename, alias32310: __typename, alias32311: __typename, alias32312: __typename, alias32313: __typename, alias32314: __typename, alias32315: __typename, alias32316: __typename, alias32317: __typename, alias32318: __typename, alias32319: __typename, alias32320: __typename, alias32321: __typename, alias32322: __typename, alias32323: __typename, alias32324: __typename, alias32325: __typename, alias32326: __typename, alias32327: __typename, alias32328: __typename, alias32329: __typename, alias32330: __typename, alias32331: __typename, alias32332: __typename, alias32333: __typename, alias32334: __typename, alias32335: __typename, alias32336: __typename, alias32337: __typename, alias32338: __typename, alias32339: __typename, alias32340: __typename, alias32341: __typename, alias32342: __typename, alias32343: __typename, alias32344: __typename, alias32345: __typename, alias32346: __typename, alias32347: __typename, alias32348: __typename, alias32349: __typename, alias32350: __typename, alias32351: __typename, alias32352: __typename, alias32353: __typename, alias32354: __typename, alias32355: __typename, alias32356: __typename, alias32357: __typename, alias32358: __typename, alias32359: __typename, alias32360: __typename, alias32361: __typename, alias32362: __typename, alias32363: __typename, alias32364: __typename, alias32365: __typename, alias32366: __typename, alias32367: __typename, alias32368: __typename, alias32369: __typename, alias32370: __typename, alias32371: __typename, alias32372: __typename, alias32373: __typename, alias32374: __typename, alias32375: __typename, alias32376: __typename, alias32377: __typename, alias32378: __typename, alias32379: __typename, alias32380: __typename, alias32381: __typename, alias32382: __typename, alias32383: __typename, alias32384: __typename, alias32385: __typename, alias32386: __typename, alias32387: __typename, alias32388: __typename, alias32389: __typename, alias32390: __typename, alias32391: __typename, alias32392: __typename, alias32393: __typename, alias32394: __typename, alias32395: __typename, alias32396: __typename, alias32397: __typename, alias32398: __typename, alias32399: __typename, alias32400: __typename, alias32401: __typename, alias32402: __typename, alias32403: __typename, alias32404: __typename, alias32405: __typename, alias32406: __typename, alias32407: __typename, alias32408: __typename, alias32409: __typename, alias32410: __typename, alias32411: __typename, alias32412: __typename, alias32413: __typename, alias32414: __typename, alias32415: __typename, alias32416: __typename, alias32417: __typename, alias32418: __typename, alias32419: __typename, alias32420: __typename, alias32421: __typename, alias32422: __typename, alias32423: __typename, alias32424: __typename, alias32425: __typename, alias32426: __typename, alias32427: __typename, alias32428: __typename, alias32429: __typename, alias32430: __typename, alias32431: __typename, alias32432: __typename, alias32433: __typename, alias32434: __typename, alias32435: __typename, alias32436: __typename, alias32437: __typename, alias32438: __typename, alias32439: __typename, alias32440: __typename, alias32441: __typename, alias32442: __typename, alias32443: __typename, alias32444: __typename, alias32445: __typename, alias32446: __typename, alias32447: __typename, alias32448: __typename, alias32449: __typename, alias32450: __typename, alias32451: __typename, alias32452: __typename, alias32453: __typename, alias32454: __typename, alias32455: __typename, alias32456: __typename, alias32457: __typename, alias32458: __typename, alias32459: __typename, alias32460: __typename, alias32461: __typename, alias32462: __typename, alias32463: __typename, alias32464: __typename, alias32465: __typename, alias32466: __typename, alias32467: __typename, alias32468: __typename, alias32469: __typename, alias32470: __typename, alias32471: __typename, alias32472: __typename, alias32473: __typename, alias32474: __typename, alias32475: __typename, alias32476: __typename, alias32477: __typename, alias32478: __typename, alias32479: __typename, alias32480: __typename, alias32481: __typename, alias32482: __typename, alias32483: __typename, alias32484: __typename, alias32485: __typename, alias32486: __typename, alias32487: __typename, alias32488: __typename, alias32489: __typename, alias32490: __typename, alias32491: __typename, alias32492: __typename, alias32493: __typename, alias32494: __typename, alias32495: __typename, alias32496: __typename, alias32497: __typename, alias32498: __typename, alias32499: __typename, alias32500: __typename, alias32501: __typename, alias32502: __typename, alias32503: __typename, alias32504: __typename, alias32505: __typename, alias32506: __typename, alias32507: __typename, alias32508: __typename, alias32509: __typename, alias32510: __typename, alias32511: __typename, alias32512: __typename, alias32513: __typename, alias32514: __typename, alias32515: __typename, alias32516: __typename, alias32517: __typename, alias32518: __typename, alias32519: __typename, alias32520: __typename, alias32521: __typename, alias32522: __typename, alias32523: __typename, alias32524: __typename, alias32525: __typename, alias32526: __typename, alias32527: __typename, alias32528: __typename, alias32529: __typename, alias32530: __typename, alias32531: __typename, alias32532: __typename, alias32533: __typename, alias32534: __typename, alias32535: __typename, alias32536: __typename, alias32537: __typename, alias32538: __typename, alias32539: __typename, alias32540: __typename, alias32541: __typename, alias32542: __typename, alias32543: __typename, alias32544: __typename, alias32545: __typename, alias32546: __typename, alias32547: __typename, alias32548: __typename, alias32549: __typename, alias32550: __typename, alias32551: __typename, alias32552: __typename, alias32553: __typename, alias32554: __typename, alias32555: __typename, alias32556: __typename, alias32557: __typename, alias32558: __typename, alias32559: __typename, alias32560: __typename, alias32561: __typename, alias32562: __typename, alias32563: __typename, alias32564: __typename, alias32565: __typename, alias32566: __typename, alias32567: __typename, alias32568: __typename, alias32569: __typename, alias32570: __typename, alias32571: __typename, alias32572: __typename, alias32573: __typename, alias32574: __typename, alias32575: __typename, alias32576: __typename, alias32577: __typename, alias32578: __typename, alias32579: __typename, alias32580: __typename, alias32581: __typename, alias32582: __typename, alias32583: __typename, alias32584: __typename, alias32585: __typename, alias32586: __typename, alias32587: __typename, alias32588: __typename, alias32589: __typename, alias32590: __typename, alias32591: __typename, alias32592: __typename, alias32593: __typename, alias32594: __typename, alias32595: __typename, alias32596: __typename, alias32597: __typename, alias32598: __typename, alias32599: __typename, alias32600: __typename, alias32601: __typename, alias32602: __typename, alias32603: __typename, alias32604: __typename, alias32605: __typename, alias32606: __typename, alias32607: __typename, alias32608: __typename, alias32609: __typename, alias32610: __typename, alias32611: __typename, alias32612: __typename, alias32613: __typename, alias32614: __typename, alias32615: __typename, alias32616: __typename, alias32617: __typename, alias32618: __typename, alias32619: __typename, alias32620: __typename, alias32621: __typename, alias32622: __typename, alias32623: __typename, alias32624: __typename, alias32625: __typename, alias32626: __typename, alias32627: __typename, alias32628: __typename, alias32629: __typename, alias32630: __typename, alias32631: __typename, alias32632: __typename, alias32633: __typename, alias32634: __typename, alias32635: __typename, alias32636: __typename, alias32637: __typename, alias32638: __typename, alias32639: __typename, alias32640: __typename, alias32641: __typename, alias32642: __typename, alias32643: __typename, alias32644: __typename, alias32645: __typename, alias32646: __typename, alias32647: __typename, alias32648: __typename, alias32649: __typename, alias32650: __typename, alias32651: __typename, alias32652: __typename, alias32653: __typename, alias32654: __typename, alias32655: __typename, alias32656: __typename, alias32657: __typename, alias32658: __typename, alias32659: __typename, alias32660: __typename, alias32661: __typename, alias32662: __typename, alias32663: __typename, alias32664: __typename, alias32665: __typename, alias32666: __typename, alias32667: __typename, alias32668: __typename, alias32669: __typename, alias32670: __typename, alias32671: __typename, alias32672: __typename, alias32673: __typename, alias32674: __typename, alias32675: __typename, alias32676: __typename, alias32677: __typename, alias32678: __typename, alias32679: __typename, alias32680: __typename, alias32681: __typename, alias32682: __typename, alias32683: __typename, alias32684: __typename, alias32685: __typename, alias32686: __typename, alias32687: __typename, alias32688: __typename, alias32689: __typename, alias32690: __typename, alias32691: __typename, alias32692: __typename, alias32693: __typename, alias32694: __typename, alias32695: __typename, alias32696: __typename, alias32697: __typename, alias32698: __typename, alias32699: __typename, alias32700: __typename, alias32701: __typename, alias32702: __typename, alias32703: __typename, alias32704: __typename, alias32705: __typename, alias32706: __typename, alias32707: __typename, alias32708: __typename, alias32709: __typename, alias32710: __typename, alias32711: __typename, alias32712: __typename, alias32713: __typename, alias32714: __typename, alias32715: __typename, alias32716: __typename, alias32717: __typename, alias32718: __typename, alias32719: __typename, alias32720: __typename, alias32721: __typename, alias32722: __typename, alias32723: __typename, alias32724: __typename, alias32725: __typename, alias32726: __typename, alias32727: __typename, alias32728: __typename, alias32729: __typename, alias32730: __typename, alias32731: __typename, alias32732: __typename, alias32733: __typename, alias32734: __typename, alias32735: __typename, alias32736: __typename, alias32737: __typename, alias32738: __typename, alias32739: __typename, alias32740: __typename, alias32741: __typename, alias32742: __typename, alias32743: __typename, alias32744: __typename, alias32745: __typename, alias32746: __typename, alias32747: __typename, alias32748: __typename, alias32749: __typename, alias32750: __typename, alias32751: __typename, alias32752: __typename, alias32753: __typename, alias32754: __typename, alias32755: __typename, alias32756: __typename, alias32757: __typename, alias32758: __typename, alias32759: __typename, alias32760: __typename, alias32761: __typename, alias32762: __typename, alias32763: __typename, alias32764: __typename, alias32765: __typename, alias32766: __typename, alias32767: __typename, alias32768: __typename, alias32769: __typename, alias32770: __typename, alias32771: __typename, alias32772: __typename, alias32773: __typename, alias32774: __typename, alias32775: __typename, alias32776: __typename, alias32777: __typename, alias32778: __typename, alias32779: __typename, alias32780: __typename, alias32781: __typename, alias32782: __typename, alias32783: __typename, alias32784: __typename, alias32785: __typename, alias32786: __typename, alias32787: __typename, alias32788: __typename, alias32789: __typename, alias32790: __typename, alias32791: __typename, alias32792: __typename, alias32793: __typename, alias32794: __typename, alias32795: __typename, alias32796: __typename, alias32797: __typename, alias32798: __typename, alias32799: __typename, alias32800: __typename, alias32801: __typename, alias32802: __typename, alias32803: __typename, alias32804: __typename, alias32805: __typename, alias32806: __typename, alias32807: __typename, alias32808: __typename, alias32809: __typename, alias32810: __typename, alias32811: __typename, alias32812: __typename, alias32813: __typename, alias32814: __typename, alias32815: __typename, alias32816: __typename, alias32817: __typename, alias32818: __typename, alias32819: __typename, alias32820: __typename, alias32821: __typename, alias32822: __typename, alias32823: __typename, alias32824: __typename, alias32825: __typename, alias32826: __typename, alias32827: __typename, alias32828: __typename, alias32829: __typename, alias32830: __typename, alias32831: __typename, alias32832: __typename, alias32833: __typename, alias32834: __typename, alias32835: __typename, alias32836: __typename, alias32837: __typename, alias32838: __typename, alias32839: __typename, alias32840: __typename, alias32841: __typename, alias32842: __typename, alias32843: __typename, alias32844: __typename, alias32845: __typename, alias32846: __typename, alias32847: __typename, alias32848: __typename, alias32849: __typename, alias32850: __typename, alias32851: __typename, alias32852: __typename, alias32853: __typename, alias32854: __typename, alias32855: __typename, alias32856: __typename, alias32857: __typename, alias32858: __typename, alias32859: __typename, alias32860: __typename, alias32861: __typename, alias32862: __typename, alias32863: __typename, alias32864: __typename, alias32865: __typename, alias32866: __typename, alias32867: __typename, alias32868: __typename, alias32869: __typename, alias32870: __typename, alias32871: __typename, alias32872: __typename, alias32873: __typename, alias32874: __typename, alias32875: __typename, alias32876: __typename, alias32877: __typename, alias32878: __typename, alias32879: __typename, alias32880: __typename, alias32881: __typename, alias32882: __typename, alias32883: __typename, alias32884: __typename, alias32885: __typename, alias32886: __typename, alias32887: __typename, alias32888: __typename, alias32889: __typename, alias32890: __typename, alias32891: __typename, alias32892: __typename, alias32893: __typename, alias32894: __typename, alias32895: __typename, alias32896: __typename, alias32897: __typename, alias32898: __typename, alias32899: __typename, alias32900: __typename, alias32901: __typename, alias32902: __typename, alias32903: __typename, alias32904: __typename, alias32905: __typename, alias32906: __typename, alias32907: __typename, alias32908: __typename, alias32909: __typename, alias32910: __typename, alias32911: __typename, alias32912: __typename, alias32913: __typename, alias32914: __typename, alias32915: __typename, alias32916: __typename, alias32917: __typename, alias32918: __typename, alias32919: __typename, alias32920: __typename, alias32921: __typename, alias32922: __typename, alias32923: __typename, alias32924: __typename, alias32925: __typename, alias32926: __typename, alias32927: __typename, alias32928: __typename, alias32929: __typename, alias32930: __typename, alias32931: __typename, alias32932: __typename, alias32933: __typename, alias32934: __typename, alias32935: __typename, alias32936: __typename, alias32937: __typename, alias32938: __typename, alias32939: __typename, alias32940: __typename, alias32941: __typename, alias32942: __typename, alias32943: __typename, alias32944: __typename, alias32945: __typename, alias32946: __typename, alias32947: __typename, alias32948: __typename, alias32949: __typename, alias32950: __typename, alias32951: __typename, alias32952: __typename, alias32953: __typename, alias32954: __typename, alias32955: __typename, alias32956: __typename, alias32957: __typename, alias32958: __typename, alias32959: __typename, alias32960: __typename, alias32961: __typename, alias32962: __typename, alias32963: __typename, alias32964: __typename, alias32965: __typename, alias32966: __typename, alias32967: __typename, alias32968: __typename, alias32969: __typename, alias32970: __typename, alias32971: __typename, alias32972: __typename, alias32973: __typename, alias32974: __typename, alias32975: __typename, alias32976: __typename, alias32977: __typename, alias32978: __typename, alias32979: __typename, alias32980: __typename, alias32981: __typename, alias32982: __typename, alias32983: __typename, alias32984: __typename, alias32985: __typename, alias32986: __typename, alias32987: __typename, alias32988: __typename, alias32989: __typename, alias32990: __typename, alias32991: __typename, alias32992: __typename, alias32993: __typename, alias32994: __typename, alias32995: __typename, alias32996: __typename, alias32997: __typename, alias32998: __typename, alias32999: __typename, alias33000: __typename, alias33001: __typename, alias33002: __typename, alias33003: __typename, alias33004: __typename, alias33005: __typename, alias33006: __typename, alias33007: __typename, alias33008: __typename, alias33009: __typename, alias33010: __typename, alias33011: __typename, alias33012: __typename, alias33013: __typename, alias33014: __typename, alias33015: __typename, alias33016: __typename, alias33017: __typename, alias33018: __typename, alias33019: __typename, alias33020: __typename, alias33021: __typename, alias33022: __typename, alias33023: __typename, alias33024: __typename, alias33025: __typename, alias33026: __typename, alias33027: __typename, alias33028: __typename, alias33029: __typename, alias33030: __typename, alias33031: __typename, alias33032: __typename, alias33033: __typename, alias33034: __typename, alias33035: __typename, alias33036: __typename, alias33037: __typename, alias33038: __typename, alias33039: __typename, alias33040: __typename, alias33041: __typename, alias33042: __typename, alias33043: __typename, alias33044: __typename, alias33045: __typename, alias33046: __typename, alias33047: __typename, alias33048: __typename, alias33049: __typename, alias33050: __typename, alias33051: __typename, alias33052: __typename, alias33053: __typename, alias33054: __typename, alias33055: __typename, alias33056: __typename, alias33057: __typename, alias33058: __typename, alias33059: __typename, alias33060: __typename, alias33061: __typename, alias33062: __typename, alias33063: __typename, alias33064: __typename, alias33065: __typename, alias33066: __typename, alias33067: __typename, alias33068: __typename, alias33069: __typename, alias33070: __typename, alias33071: __typename, alias33072: __typename, alias33073: __typename, alias33074: __typename, alias33075: __typename, alias33076: __typename, alias33077: __typename, alias33078: __typename, alias33079: __typename, alias33080: __typename, alias33081: __typename, alias33082: __typename, alias33083: __typename, alias33084: __typename, alias33085: __typename, alias33086: __typename, alias33087: __typename, alias33088: __typename, alias33089: __typename, alias33090: __typename, alias33091: __typename, alias33092: __typename, alias33093: __typename, alias33094: __typename, alias33095: __typename, alias33096: __typename, alias33097: __typename, alias33098: __typename, alias33099: __typename, alias33100: __typename, alias33101: __typename, alias33102: __typename, alias33103: __typename, alias33104: __typename, alias33105: __typename, alias33106: __typename, alias33107: __typename, alias33108: __typename, alias33109: __typename, alias33110: __typename, alias33111: __typename, alias33112: __typename, alias33113: __typename, alias33114: __typename, alias33115: __typename, alias33116: __typename, alias33117: __typename, alias33118: __typename, alias33119: __typename, alias33120: __typename, alias33121: __typename, alias33122: __typename, alias33123: __typename, alias33124: __typename, alias33125: __typename, alias33126: __typename, alias33127: __typename, alias33128: __typename, alias33129: __typename, alias33130: __typename, alias33131: __typename, alias33132: __typename, alias33133: __typename, alias33134: __typename, alias33135: __typename, alias33136: __typename, alias33137: __typename, alias33138: __typename, alias33139: __typename, alias33140: __typename, alias33141: __typename, alias33142: __typename, alias33143: __typename, alias33144: __typename, alias33145: __typename, alias33146: __typename, alias33147: __typename, alias33148: __typename, alias33149: __typename, alias33150: __typename, alias33151: __typename, alias33152: __typename, alias33153: __typename, alias33154: __typename, alias33155: __typename, alias33156: __typename, alias33157: __typename, alias33158: __typename, alias33159: __typename, alias33160: __typename, alias33161: __typename, alias33162: __typename, alias33163: __typename, alias33164: __typename, alias33165: __typename, alias33166: __typename, alias33167: __typename, alias33168: __typename, alias33169: __typename, alias33170: __typename, alias33171: __typename, alias33172: __typename, alias33173: __typename, alias33174: __typename, alias33175: __typename, alias33176: __typename, alias33177: __typename, alias33178: __typename, alias33179: __typename, alias33180: __typename, alias33181: __typename, alias33182: __typename, alias33183: __typename, alias33184: __typename, alias33185: __typename, alias33186: __typename, alias33187: __typename, alias33188: __typename, alias33189: __typename, alias33190: __typename, alias33191: __typename, alias33192: __typename, alias33193: __typename, alias33194: __typename, alias33195: __typename, alias33196: __typename, alias33197: __typename, alias33198: __typename, alias33199: __typename, alias33200: __typename, alias33201: __typename, alias33202: __typename, alias33203: __typename, alias33204: __typename, alias33205: __typename, alias33206: __typename, alias33207: __typename, alias33208: __typename, alias33209: __typename, alias33210: __typename, alias33211: __typename, alias33212: __typename, alias33213: __typename, alias33214: __typename, alias33215: __typename, alias33216: __typename, alias33217: __typename, alias33218: __typename, alias33219: __typename, alias33220: __typename, alias33221: __typename, alias33222: __typename, alias33223: __typename, alias33224: __typename, alias33225: __typename, alias33226: __typename, alias33227: __typename, alias33228: __typename, alias33229: __typename, alias33230: __typename, alias33231: __typename, alias33232: __typename, alias33233: __typename, alias33234: __typename, alias33235: __typename, alias33236: __typename, alias33237: __typename, alias33238: __typename, alias33239: __typename, alias33240: __typename, alias33241: __typename, alias33242: __typename, alias33243: __typename, alias33244: __typename, alias33245: __typename, alias33246: __typename, alias33247: __typename, alias33248: __typename, alias33249: __typename, alias33250: __typename, alias33251: __typename, alias33252: __typename, alias33253: __typename, alias33254: __typename, alias33255: __typename, alias33256: __typename, alias33257: __typename, alias33258: __typename, alias33259: __typename, alias33260: __typename, alias33261: __typename, alias33262: __typename, alias33263: __typename, alias33264: __typename, alias33265: __typename, alias33266: __typename, alias33267: __typename, alias33268: __typename, alias33269: __typename, alias33270: __typename, alias33271: __typename, alias33272: __typename, alias33273: __typename, alias33274: __typename, alias33275: __typename, alias33276: __typename, alias33277: __typename, alias33278: __typename, alias33279: __typename, alias33280: __typename, alias33281: __typename, alias33282: __typename, alias33283: __typename, alias33284: __typename, alias33285: __typename, alias33286: __typename, alias33287: __typename, alias33288: __typename, alias33289: __typename, alias33290: __typename, alias33291: __typename, alias33292: __typename, alias33293: __typename, alias33294: __typename, alias33295: __typename, alias33296: __typename, alias33297: __typename, alias33298: __typename, alias33299: __typename, alias33300: __typename, alias33301: __typename, alias33302: __typename, alias33303: __typename, alias33304: __typename, alias33305: __typename, alias33306: __typename, alias33307: __typename, alias33308: __typename, alias33309: __typename, alias33310: __typename, alias33311: __typename, alias33312: __typename, alias33313: __typename, alias33314: __typename, alias33315: __typename, alias33316: __typename, alias33317: __typename, alias33318: __typename, alias33319: __typename, alias33320: __typename, alias33321: __typename, alias33322: __typename, alias33323: __typename, alias33324: __typename, alias33325: __typename, alias33326: __typename, alias33327: __typename, alias33328: __typename, alias33329: __typename, alias33330: __typename, alias33331: __typename, alias33332: __typename, alias33333: __typename, alias33334: __typename, alias33335: __typename, alias33336: __typename, alias33337: __typename, alias33338: __typename, alias33339: __typename, alias33340: __typename, alias33341: __typename, alias33342: __typename, alias33343: __typename, alias33344: __typename, alias33345: __typename, alias33346: __typename, alias33347: __typename, alias33348: __typename, alias33349: __typename, alias33350: __typename, alias33351: __typename, alias33352: __typename, alias33353: __typename, alias33354: __typename, alias33355: __typename, alias33356: __typename, alias33357: __typename, alias33358: __typename, alias33359: __typename, alias33360: __typename, alias33361: __typename, alias33362: __typename, alias33363: __typename, alias33364: __typename, alias33365: __typename, alias33366: __typename, alias33367: __typename, alias33368: __typename, alias33369: __typename, alias33370: __typename, alias33371: __typename, alias33372: __typename, alias33373: __typename, alias33374: __typename, alias33375: __typename, alias33376: __typename, alias33377: __typename, alias33378: __typename, alias33379: __typename, alias33380: __typename, alias33381: __typename, alias33382: __typename, alias33383: __typename, alias33384: __typename, alias33385: __typename, alias33386: __typename, alias33387: __typename, alias33388: __typename, alias33389: __typename, alias33390: __typename, alias33391: __typename, alias33392: __typename, alias33393: __typename, alias33394: __typename, alias33395: __typename, alias33396: __typename, alias33397: __typename, alias33398: __typename, alias33399: __typename, alias33400: __typename, alias33401: __typename, alias33402: __typename, alias33403: __typename, alias33404: __typename, alias33405: __typename, alias33406: __typename, alias33407: __typename, alias33408: __typename, alias33409: __typename, alias33410: __typename, alias33411: __typename, alias33412: __typename, alias33413: __typename, alias33414: __typename, alias33415: __typename, alias33416: __typename, alias33417: __typename, alias33418: __typename, alias33419: __typename, alias33420: __typename, alias33421: __typename, alias33422: __typename, alias33423: __typename, alias33424: __typename, alias33425: __typename, alias33426: __typename, alias33427: __typename, alias33428: __typename, alias33429: __typename, alias33430: __typename, alias33431: __typename, alias33432: __typename, alias33433: __typename, alias33434: __typename, alias33435: __typename, alias33436: __typename, alias33437: __typename, alias33438: __typename, alias33439: __typename, alias33440: __typename, alias33441: __typename, alias33442: __typename, alias33443: __typename, alias33444: __typename, alias33445: __typename, alias33446: __typename, alias33447: __typename, alias33448: __typename, alias33449: __typename, alias33450: __typename, alias33451: __typename, alias33452: __typename, alias33453: __typename, alias33454: __typename, alias33455: __typename, alias33456: __typename, alias33457: __typename, alias33458: __typename, alias33459: __typename, alias33460: __typename, alias33461: __typename, alias33462: __typename, alias33463: __typename, alias33464: __typename, alias33465: __typename, alias33466: __typename, alias33467: __typename, alias33468: __typename, alias33469: __typename, alias33470: __typename, alias33471: __typename, alias33472: __typename, alias33473: __typename, alias33474: __typename, alias33475: __typename, alias33476: __typename, alias33477: __typename, alias33478: __typename, alias33479: __typename, alias33480: __typename, alias33481: __typename, alias33482: __typename, alias33483: __typename, alias33484: __typename, alias33485: __typename, alias33486: __typename, alias33487: __typename, alias33488: __typename, alias33489: __typename, alias33490: __typename, alias33491: __typename, alias33492: __typename, alias33493: __typename, alias33494: __typename, alias33495: __typename, alias33496: __typename, alias33497: __typename, alias33498: __typename, alias33499: __typename, alias33500: __typename, alias33501: __typename, alias33502: __typename, alias33503: __typename, alias33504: __typename, alias33505: __typename, alias33506: __typename, alias33507: __typename, alias33508: __typename, alias33509: __typename, alias33510: __typename, alias33511: __typename, alias33512: __typename, alias33513: __typename, alias33514: __typename, alias33515: __typename, alias33516: __typename, alias33517: __typename, alias33518: __typename, alias33519: __typename, alias33520: __typename, alias33521: __typename, alias33522: __typename, alias33523: __typename, alias33524: __typename, alias33525: __typename, alias33526: __typename, alias33527: __typename, alias33528: __typename, alias33529: __typename, alias33530: __typename, alias33531: __typename, alias33532: __typename, alias33533: __typename, alias33534: __typename, alias33535: __typename, alias33536: __typename, alias33537: __typename, alias33538: __typename, alias33539: __typename, alias33540: __typename, alias33541: __typename, alias33542: __typename, alias33543: __typename, alias33544: __typename, alias33545: __typename, alias33546: __typename, alias33547: __typename, alias33548: __typename, alias33549: __typename, alias33550: __typename, alias33551: __typename, alias33552: __typename, alias33553: __typename, alias33554: __typename, alias33555: __typename, alias33556: __typename, alias33557: __typename, alias33558: __typename, alias33559: __typename, alias33560: __typename, alias33561: __typename, alias33562: __typename, alias33563: __typename, alias33564: __typename, alias33565: __typename, alias33566: __typename, alias33567: __typename, alias33568: __typename, alias33569: __typename, alias33570: __typename, alias33571: __typename, alias33572: __typename, alias33573: __typename, alias33574: __typename, alias33575: __typename, alias33576: __typename, alias33577: __typename, alias33578: __typename, alias33579: __typename, alias33580: __typename, alias33581: __typename, alias33582: __typename, alias33583: __typename, alias33584: __typename, alias33585: __typename, alias33586: __typename, alias33587: __typename, alias33588: __typename, alias33589: __typename, alias33590: __typename, alias33591: __typename, alias33592: __typename, alias33593: __typename, alias33594: __typename, alias33595: __typename, alias33596: __typename, alias33597: __typename, alias33598: __typename, alias33599: __typename, alias33600: __typename, alias33601: __typename, alias33602: __typename, alias33603: __typename, alias33604: __typename, alias33605: __typename, alias33606: __typename, alias33607: __typename, alias33608: __typename, alias33609: __typename, alias33610: __typename, alias33611: __typename, alias33612: __typename, alias33613: __typename, alias33614: __typename, alias33615: __typename, alias33616: __typename, alias33617: __typename, alias33618: __typename, alias33619: __typename, alias33620: __typename, alias33621: __typename, alias33622: __typename, alias33623: __typename, alias33624: __typename, alias33625: __typename, alias33626: __typename, alias33627: __typename, alias33628: __typename, alias33629: __typename, alias33630: __typename, alias33631: __typename, alias33632: __typename, alias33633: __typename, alias33634: __typename, alias33635: __typename, alias33636: __typename, alias33637: __typename, alias33638: __typename, alias33639: __typename, alias33640: __typename, alias33641: __typename, alias33642: __typename, alias33643: __typename, alias33644: __typename, alias33645: __typename, alias33646: __typename, alias33647: __typename, alias33648: __typename, alias33649: __typename, alias33650: __typename, alias33651: __typename, alias33652: __typename, alias33653: __typename, alias33654: __typename, alias33655: __typename, alias33656: __typename, alias33657: __typename, alias33658: __typename, alias33659: __typename, alias33660: __typename, alias33661: __typename, alias33662: __typename, alias33663: __typename, alias33664: __typename, alias33665: __typename, alias33666: __typename, alias33667: __typename, alias33668: __typename, alias33669: __typename, alias33670: __typename, alias33671: __typename, alias33672: __typename, alias33673: __typename, alias33674: __typename, alias33675: __typename, alias33676: __typename, alias33677: __typename, alias33678: __typename, alias33679: __typename, alias33680: __typename, alias33681: __typename, alias33682: __typename, alias33683: __typename, alias33684: __typename, alias33685: __typename, alias33686: __typename, alias33687: __typename, alias33688: __typename, alias33689: __typename, alias33690: __typename, alias33691: __typename, alias33692: __typename, alias33693: __typename, alias33694: __typename, alias33695: __typename, alias33696: __typename, alias33697: __typename, alias33698: __typename, alias33699: __typename, alias33700: __typename, alias33701: __typename, alias33702: __typename, alias33703: __typename, alias33704: __typename, alias33705: __typename, alias33706: __typename, alias33707: __typename, alias33708: __typename, alias33709: __typename, alias33710: __typename, alias33711: __typename, alias33712: __typename, alias33713: __typename, alias33714: __typename, alias33715: __typename, alias33716: __typename, alias33717: __typename, alias33718: __typename, alias33719: __typename, alias33720: __typename, alias33721: __typename, alias33722: __typename, alias33723: __typename, alias33724: __typename, alias33725: __typename, alias33726: __typename, alias33727: __typename, alias33728: __typename, alias33729: __typename, alias33730: __typename, alias33731: __typename, alias33732: __typename, alias33733: __typename, alias33734: __typename, alias33735: __typename, alias33736: __typename, alias33737: __typename, alias33738: __typename, alias33739: __typename, alias33740: __typename, alias33741: __typename, alias33742: __typename, alias33743: __typename, alias33744: __typename, alias33745: __typename, alias33746: __typename, alias33747: __typename, alias33748: __typename, alias33749: __typename, alias33750: __typename, alias33751: __typename, alias33752: __typename, alias33753: __typename, alias33754: __typename, alias33755: __typename, alias33756: __typename, alias33757: __typename, alias33758: __typename, alias33759: __typename, alias33760: __typename, alias33761: __typename, alias33762: __typename, alias33763: __typename, alias33764: __typename, alias33765: __typename, alias33766: __typename, alias33767: __typename, alias33768: __typename, alias33769: __typename, alias33770: __typename, alias33771: __typename, alias33772: __typename, alias33773: __typename, alias33774: __typename, alias33775: __typename, alias33776: __typename, alias33777: __typename, alias33778: __typename, alias33779: __typename, alias33780: __typename, alias33781: __typename, alias33782: __typename, alias33783: __typename, alias33784: __typename, alias33785: __typename, alias33786: __typename, alias33787: __typename, alias33788: __typename, alias33789: __typename, alias33790: __typename, alias33791: __typename, alias33792: __typename, alias33793: __typename, alias33794: __typename, alias33795: __typename, alias33796: __typename, alias33797: __typename, alias33798: __typename, alias33799: __typename, alias33800: __typename, alias33801: __typename, alias33802: __typename, alias33803: __typename, alias33804: __typename, alias33805: __typename, alias33806: __typename, alias33807: __typename, alias33808: __typename, alias33809: __typename, alias33810: __typename, alias33811: __typename, alias33812: __typename, alias33813: __typename, alias33814: __typename, alias33815: __typename, alias33816: __typename, alias33817: __typename, alias33818: __typename, alias33819: __typename, alias33820: __typename, alias33821: __typename, alias33822: __typename, alias33823: __typename, alias33824: __typename, alias33825: __typename, alias33826: __typename, alias33827: __typename, alias33828: __typename, alias33829: __typename, alias33830: __typename, alias33831: __typename, alias33832: __typename, alias33833: __typename, alias33834: __typename, alias33835: __typename, alias33836: __typename, alias33837: __typename, alias33838: __typename, alias33839: __typename, alias33840: __typename, alias33841: __typename, alias33842: __typename, alias33843: __typename, alias33844: __typename, alias33845: __typename, alias33846: __typename, alias33847: __typename, alias33848: __typename, alias33849: __typename, alias33850: __typename, alias33851: __typename, alias33852: __typename, alias33853: __typename, alias33854: __typename, alias33855: __typename, alias33856: __typename, alias33857: __typename, alias33858: __typename, alias33859: __typename, alias33860: __typename, alias33861: __typename, alias33862: __typename, alias33863: __typename, alias33864: __typename, alias33865: __typename, alias33866: __typename, alias33867: __typename, alias33868: __typename, alias33869: __typename, alias33870: __typename, alias33871: __typename, alias33872: __typename, alias33873: __typename, alias33874: __typename, alias33875: __typename, alias33876: __typename, alias33877: __typename, alias33878: __typename, alias33879: __typename, alias33880: __typename, alias33881: __typename, alias33882: __typename, alias33883: __typename, alias33884: __typename, alias33885: __typename, alias33886: __typename, alias33887: __typename, alias33888: __typename, alias33889: __typename, alias33890: __typename, alias33891: __typename, alias33892: __typename, alias33893: __typename, alias33894: __typename, alias33895: __typename, alias33896: __typename, alias33897: __typename, alias33898: __typename, alias33899: __typename, alias33900: __typename, alias33901: __typename, alias33902: __typename, alias33903: __typename, alias33904: __typename, alias33905: __typename, alias33906: __typename, alias33907: __typename, alias33908: __typename, alias33909: __typename, alias33910: __typename, alias33911: __typename, alias33912: __typename, alias33913: __typename, alias33914: __typename, alias33915: __typename, alias33916: __typename, alias33917: __typename, alias33918: __typename, alias33919: __typename, alias33920: __typename, alias33921: __typename, alias33922: __typename, alias33923: __typename, alias33924: __typename, alias33925: __typename, alias33926: __typename, alias33927: __typename, alias33928: __typename, alias33929: __typename, alias33930: __typename, alias33931: __typename, alias33932: __typename, alias33933: __typename, alias33934: __typename, alias33935: __typename, alias33936: __typename, alias33937: __typename, alias33938: __typename, alias33939: __typename, alias33940: __typename, alias33941: __typename, alias33942: __typename, alias33943: __typename, alias33944: __typename, alias33945: __typename, alias33946: __typename, alias33947: __typename, alias33948: __typename, alias33949: __typename, alias33950: __typename, alias33951: __typename, alias33952: __typename, alias33953: __typename, alias33954: __typename, alias33955: __typename, alias33956: __typename, alias33957: __typename, alias33958: __typename, alias33959: __typename, alias33960: __typename, alias33961: __typename, alias33962: __typename, alias33963: __typename, alias33964: __typename, alias33965: __typename, alias33966: __typename, alias33967: __typename, alias33968: __typename, alias33969: __typename, alias33970: __typename, alias33971: __typename, alias33972: __typename, alias33973: __typename, alias33974: __typename, alias33975: __typename, alias33976: __typename, alias33977: __typename, alias33978: __typename, alias33979: __typename, alias33980: __typename, alias33981: __typename, alias33982: __typename, alias33983: __typename, alias33984: __typename, alias33985: __typename, alias33986: __typename, alias33987: __typename, alias33988: __typename, alias33989: __typename, alias33990: __typename, alias33991: __typename, alias33992: __typename, alias33993: __typename, alias33994: __typename, alias33995: __typename, alias33996: __typename, alias33997: __typename, alias33998: __typename, alias33999: __typename, alias34000: __typename, alias34001: __typename, alias34002: __typename, alias34003: __typename, alias34004: __typename, alias34005: __typename, alias34006: __typename, alias34007: __typename, alias34008: __typename, alias34009: __typename, alias34010: __typename, alias34011: __typename, alias34012: __typename, alias34013: __typename, alias34014: __typename, alias34015: __typename, alias34016: __typename, alias34017: __typename, alias34018: __typename, alias34019: __typename, alias34020: __typename, alias34021: __typename, alias34022: __typename, alias34023: __typename, alias34024: __typename, alias34025: __typename, alias34026: __typename, alias34027: __typename, alias34028: __typename, alias34029: __typename, alias34030: __typename, alias34031: __typename, alias34032: __typename, alias34033: __typename, alias34034: __typename, alias34035: __typename, alias34036: __typename, alias34037: __typename, alias34038: __typename, alias34039: __typename, alias34040: __typename, alias34041: __typename, alias34042: __typename, alias34043: __typename, alias34044: __typename, alias34045: __typename, alias34046: __typename, alias34047: __typename, alias34048: __typename, alias34049: __typename, alias34050: __typename, alias34051: __typename, alias34052: __typename, alias34053: __typename, alias34054: __typename, alias34055: __typename, alias34056: __typename, alias34057: __typename, alias34058: __typename, alias34059: __typename, alias34060: __typename, alias34061: __typename, alias34062: __typename, alias34063: __typename, alias34064: __typename, alias34065: __typename, alias34066: __typename, alias34067: __typename, alias34068: __typename, alias34069: __typename, alias34070: __typename, alias34071: __typename, alias34072: __typename, alias34073: __typename, alias34074: __typename, alias34075: __typename, alias34076: __typename, alias34077: __typename, alias34078: __typename, alias34079: __typename, alias34080: __typename, alias34081: __typename, alias34082: __typename, alias34083: __typename, alias34084: __typename, alias34085: __typename, alias34086: __typename, alias34087: __typename, alias34088: __typename, alias34089: __typename, alias34090: __typename, alias34091: __typename, alias34092: __typename, alias34093: __typename, alias34094: __typename, alias34095: __typename, alias34096: __typename, alias34097: __typename, alias34098: __typename, alias34099: __typename, alias34100: __typename, alias34101: __typename, alias34102: __typename, alias34103: __typename, alias34104: __typename, alias34105: __typename, alias34106: __typename, alias34107: __typename, alias34108: __typename, alias34109: __typename, alias34110: __typename, alias34111: __typename, alias34112: __typename, alias34113: __typename, alias34114: __typename, alias34115: __typename, alias34116: __typename, alias34117: __typename, alias34118: __typename, alias34119: __typename, alias34120: __typename, alias34121: __typename, alias34122: __typename, alias34123: __typename, alias34124: __typename, alias34125: __typename, alias34126: __typename, alias34127: __typename, alias34128: __typename, alias34129: __typename, alias34130: __typename, alias34131: __typename, alias34132: __typename, alias34133: __typename, alias34134: __typename, alias34135: __typename, alias34136: __typename, alias34137: __typename, alias34138: __typename, alias34139: __typename, alias34140: __typename, alias34141: __typename, alias34142: __typename, alias34143: __typename, alias34144: __typename, alias34145: __typename, alias34146: __typename, alias34147: __typename, alias34148: __typename, alias34149: __typename, alias34150: __typename, alias34151: __typename, alias34152: __typename, alias34153: __typename, alias34154: __typename, alias34155: __typename, alias34156: __typename, alias34157: __typename, alias34158: __typename, alias34159: __typename, alias34160: __typename, alias34161: __typename, alias34162: __typename, alias34163: __typename, alias34164: __typename, alias34165: __typename, alias34166: __typename, alias34167: __typename, alias34168: __typename, alias34169: __typename, alias34170: __typename, alias34171: __typename, alias34172: __typename, alias34173: __typename, alias34174: __typename, alias34175: __typename, alias34176: __typename, alias34177: __typename, alias34178: __typename, alias34179: __typename, alias34180: __typename, alias34181: __typename, alias34182: __typename, alias34183: __typename, alias34184: __typename, alias34185: __typename, alias34186: __typename, alias34187: __typename, alias34188: __typename, alias34189: __typename, alias34190: __typename, alias34191: __typename, alias34192: __typename, alias34193: __typename, alias34194: __typename, alias34195: __typename, alias34196: __typename, alias34197: __typename, alias34198: __typename, alias34199: __typename, alias34200: __typename, alias34201: __typename, alias34202: __typename, alias34203: __typename, alias34204: __typename, alias34205: __typename, alias34206: __typename, alias34207: __typename, alias34208: __typename, alias34209: __typename, alias34210: __typename, alias34211: __typename, alias34212: __typename, alias34213: __typename, alias34214: __typename, alias34215: __typename, alias34216: __typename, alias34217: __typename, alias34218: __typename, alias34219: __typename, alias34220: __typename, alias34221: __typename, alias34222: __typename, alias34223: __typename, alias34224: __typename, alias34225: __typename, alias34226: __typename, alias34227: __typename, alias34228: __typename, alias34229: __typename, alias34230: __typename, alias34231: __typename, alias34232: __typename, alias34233: __typename, alias34234: __typename, alias34235: __typename, alias34236: __typename, alias34237: __typename, alias34238: __typename, alias34239: __typename, alias34240: __typename, alias34241: __typename, alias34242: __typename, alias34243: __typename, alias34244: __typename, alias34245: __typename, alias34246: __typename, alias34247: __typename, alias34248: __typename, alias34249: __typename, alias34250: __typename, alias34251: __typename, alias34252: __typename, alias34253: __typename, alias34254: __typename, alias34255: __typename, alias34256: __typename, alias34257: __typename, alias34258: __typename, alias34259: __typename, alias34260: __typename, alias34261: __typename, alias34262: __typename, alias34263: __typename, alias34264: __typename, alias34265: __typename, alias34266: __typename, alias34267: __typename, alias34268: __typename, alias34269: __typename, alias34270: __typename, alias34271: __typename, alias34272: __typename, alias34273: __typename, alias34274: __typename, alias34275: __typename, alias34276: __typename, alias34277: __typename, alias34278: __typename, alias34279: __typename, alias34280: __typename, alias34281: __typename, alias34282: __typename, alias34283: __typename, alias34284: __typename, alias34285: __typename, alias34286: __typename, alias34287: __typename, alias34288: __typename, alias34289: __typename, alias34290: __typename, alias34291: __typename, alias34292: __typename, alias34293: __typename, alias34294: __typename, alias34295: __typename, alias34296: __typename, alias34297: __typename, alias34298: __typename, alias34299: __typename, alias34300: __typename, alias34301: __typename, alias34302: __typename, alias34303: __typename, alias34304: __typename, alias34305: __typename, alias34306: __typename, alias34307: __typename, alias34308: __typename, alias34309: __typename, alias34310: __typename, alias34311: __typename, alias34312: __typename, alias34313: __typename, alias34314: __typename, alias34315: __typename, alias34316: __typename, alias34317: __typename, alias34318: __typename, alias34319: __typename, alias34320: __typename, alias34321: __typename, alias34322: __typename, alias34323: __typename, alias34324: __typename, alias34325: __typename, alias34326: __typename, alias34327: __typename, alias34328: __typename, alias34329: __typename, alias34330: __typename, alias34331: __typename, alias34332: __typename, alias34333: __typename, alias34334: __typename, alias34335: __typename, alias34336: __typename, alias34337: __typename, alias34338: __typename, alias34339: __typename, alias34340: __typename, alias34341: __typename, alias34342: __typename, alias34343: __typename, alias34344: __typename, alias34345: __typename, alias34346: __typename, alias34347: __typename, alias34348: __typename, alias34349: __typename, alias34350: __typename, alias34351: __typename, alias34352: __typename, alias34353: __typename, alias34354: __typename, alias34355: __typename, alias34356: __typename, alias34357: __typename, alias34358: __typename, alias34359: __typename, alias34360: __typename, alias34361: __typename, alias34362: __typename, alias34363: __typename, alias34364: __typename, alias34365: __typename, alias34366: __typename, alias34367: __typename, alias34368: __typename, alias34369: __typename, alias34370: __typename, alias34371: __typename, alias34372: __typename, alias34373: __typename, alias34374: __typename, alias34375: __typename, alias34376: __typename, alias34377: __typename, alias34378: __typename, alias34379: __typename, alias34380: __typename, alias34381: __typename, alias34382: __typename, alias34383: __typename, alias34384: __typename, alias34385: __typename, alias34386: __typename, alias34387: __typename, alias34388: __typename, alias34389: __typename, alias34390: __typename, alias34391: __typename, alias34392: __typename, alias34393: __typename, alias34394: __typename, alias34395: __typename, alias34396: __typename, alias34397: __typename, alias34398: __typename, alias34399: __typename, alias34400: __typename, alias34401: __typename, alias34402: __typename, alias34403: __typename, alias34404: __typename, alias34405: __typename, alias34406: __typename, alias34407: __typename, alias34408: __typename, alias34409: __typename, alias34410: __typename, alias34411: __typename, alias34412: __typename, alias34413: __typename, alias34414: __typename, alias34415: __typename, alias34416: __typename, alias34417: __typename, alias34418: __typename, alias34419: __typename, alias34420: __typename, alias34421: __typename, alias34422: __typename, alias34423: __typename, alias34424: __typename, alias34425: __typename, alias34426: __typename, alias34427: __typename, alias34428: __typename, alias34429: __typename, alias34430: __typename, alias34431: __typename, alias34432: __typename, alias34433: __typename, alias34434: __typename, alias34435: __typename, alias34436: __typename, alias34437: __typename, alias34438: __typename, alias34439: __typename, alias34440: __typename, alias34441: __typename, alias34442: __typename, alias34443: __typename, alias34444: __typename, alias34445: __typename, alias34446: __typename, alias34447: __typename, alias34448: __typename, alias34449: __typename, alias34450: __typename, alias34451: __typename, alias34452: __typename, alias34453: __typename, alias34454: __typename, alias34455: __typename, alias34456: __typename, alias34457: __typename, alias34458: __typename, alias34459: __typename, alias34460: __typename, alias34461: __typename, alias34462: __typename, alias34463: __typename, alias34464: __typename, alias34465: __typename, alias34466: __typename, alias34467: __typename, alias34468: __typename, alias34469: __typename, alias34470: __typename, alias34471: __typename, alias34472: __typename, alias34473: __typename, alias34474: __typename, alias34475: __typename, alias34476: __typename, alias34477: __typename, alias34478: __typename, alias34479: __typename, alias34480: __typename, alias34481: __typename, alias34482: __typename, alias34483: __typename, alias34484: __typename, alias34485: __typename, alias34486: __typename, alias34487: __typename, alias34488: __typename, alias34489: __typename, alias34490: __typename, alias34491: __typename, alias34492: __typename, alias34493: __typename, alias34494: __typename, alias34495: __typename, alias34496: __typename, alias34497: __typename, alias34498: __typename, alias34499: __typename, alias34500: __typename, alias34501: __typename, alias34502: __typename, alias34503: __typename, alias34504: __typename, alias34505: __typename, alias34506: __typename, alias34507: __typename, alias34508: __typename, alias34509: __typename, alias34510: __typename, alias34511: __typename, alias34512: __typename, alias34513: __typename, alias34514: __typename, alias34515: __typename, alias34516: __typename, alias34517: __typename, alias34518: __typename, alias34519: __typename, alias34520: __typename, alias34521: __typename, alias34522: __typename, alias34523: __typename, alias34524: __typename, alias34525: __typename, alias34526: __typename, alias34527: __typename, alias34528: __typename, alias34529: __typename, alias34530: __typename, alias34531: __typename, alias34532: __typename, alias34533: __typename, alias34534: __typename, alias34535: __typename, alias34536: __typename, alias34537: __typename, alias34538: __typename, alias34539: __typename, alias34540: __typename, alias34541: __typename, alias34542: __typename, alias34543: __typename, alias34544: __typename, alias34545: __typename, alias34546: __typename, alias34547: __typename, alias34548: __typename, alias34549: __typename, alias34550: __typename, alias34551: __typename, alias34552: __typename, alias34553: __typename, alias34554: __typename, alias34555: __typename, alias34556: __typename, alias34557: __typename, alias34558: __typename, alias34559: __typename, alias34560: __typename, alias34561: __typename, alias34562: __typename, alias34563: __typename, alias34564: __typename, alias34565: __typename, alias34566: __typename, alias34567: __typename, alias34568: __typename, alias34569: __typename, alias34570: __typename, alias34571: __typename, alias34572: __typename, alias34573: __typename, alias34574: __typename, alias34575: __typename, alias34576: __typename, alias34577: __typename, alias34578: __typename, alias34579: __typename, alias34580: __typename, alias34581: __typename, alias34582: __typename, alias34583: __typename, alias34584: __typename, alias34585: __typename, alias34586: __typename, alias34587: __typename, alias34588: __typename, alias34589: __typename, alias34590: __typename, alias34591: __typename, alias34592: __typename, alias34593: __typename, alias34594: __typename, alias34595: __typename, alias34596: __typename, alias34597: __typename, alias34598: __typename, alias34599: __typename, alias34600: __typename, alias34601: __typename, alias34602: __typename, alias34603: __typename, alias34604: __typename, alias34605: __typename, alias34606: __typename, alias34607: __typename, alias34608: __typename, alias34609: __typename, alias34610: __typename, alias34611: __typename, alias34612: __typename, alias34613: __typename, alias34614: __typename, alias34615: __typename, alias34616: __typename, alias34617: __typename, alias34618: __typename, alias34619: __typename, alias34620: __typename, alias34621: __typename, alias34622: __typename, alias34623: __typename, alias34624: __typename, alias34625: __typename, alias34626: __typename, alias34627: __typename, alias34628: __typename, alias34629: __typename, alias34630: __typename, alias34631: __typename, alias34632: __typename, alias34633: __typename, alias34634: __typename, alias34635: __typename, alias34636: __typename, alias34637: __typename, alias34638: __typename, alias34639: __typename, alias34640: __typename, alias34641: __typename, alias34642: __typename, alias34643: __typename, alias34644: __typename, alias34645: __typename, alias34646: __typename, alias34647: __typename, alias34648: __typename, alias34649: __typename, alias34650: __typename, alias34651: __typename, alias34652: __typename, alias34653: __typename, alias34654: __typename, alias34655: __typename, alias34656: __typename, alias34657: __typename, alias34658: __typename, alias34659: __typename, alias34660: __typename, alias34661: __typename, alias34662: __typename, alias34663: __typename, alias34664: __typename, alias34665: __typename, alias34666: __typename, alias34667: __typename, alias34668: __typename, alias34669: __typename, alias34670: __typename, alias34671: __typename, alias34672: __typename, alias34673: __typename, alias34674: __typename, alias34675: __typename, alias34676: __typename, alias34677: __typename, alias34678: __typename, alias34679: __typename, alias34680: __typename, alias34681: __typename, alias34682: __typename, alias34683: __typename, alias34684: __typename, alias34685: __typename, alias34686: __typename, alias34687: __typename, alias34688: __typename, alias34689: __typename, alias34690: __typename, alias34691: __typename, alias34692: __typename, alias34693: __typename, alias34694: __typename, alias34695: __typename, alias34696: __typename, alias34697: __typename, alias34698: __typename, alias34699: __typename, alias34700: __typename, alias34701: __typename, alias34702: __typename, alias34703: __typename, alias34704: __typename, alias34705: __typename, alias34706: __typename, alias34707: __typename, alias34708: __typename, alias34709: __typename, alias34710: __typename, alias34711: __typename, alias34712: __typename, alias34713: __typename, alias34714: __typename, alias34715: __typename, alias34716: __typename, alias34717: __typename, alias34718: __typename, alias34719: __typename, alias34720: __typename, alias34721: __typename, alias34722: __typename, alias34723: __typename, alias34724: __typename, alias34725: __typename, alias34726: __typename, alias34727: __typename, alias34728: __typename, alias34729: __typename, alias34730: __typename, alias34731: __typename, alias34732: __typename, alias34733: __typename, alias34734: __typename, alias34735: __typename, alias34736: __typename, alias34737: __typename, alias34738: __typename, alias34739: __typename, alias34740: __typename, alias34741: __typename, alias34742: __typename, alias34743: __typename, alias34744: __typename, alias34745: __typename, alias34746: __typename, alias34747: __typename, alias34748: __typename, alias34749: __typename, alias34750: __typename, alias34751: __typename, alias34752: __typename, alias34753: __typename, alias34754: __typename, alias34755: __typename, alias34756: __typename, alias34757: __typename, alias34758: __typename, alias34759: __typename, alias34760: __typename, alias34761: __typename, alias34762: __typename, alias34763: __typename, alias34764: __typename, alias34765: __typename, alias34766: __typename, alias34767: __typename, alias34768: __typename, alias34769: __typename, alias34770: __typename, alias34771: __typename, alias34772: __typename, alias34773: __typename, alias34774: __typename, alias34775: __typename, alias34776: __typename, alias34777: __typename, alias34778: __typename, alias34779: __typename, alias34780: __typename, alias34781: __typename, alias34782: __typename, alias34783: __typename, alias34784: __typename, alias34785: __typename, alias34786: __typename, alias34787: __typename, alias34788: __typename, alias34789: __typename, alias34790: __typename, alias34791: __typename, alias34792: __typename, alias34793: __typename, alias34794: __typename, alias34795: __typename, alias34796: __typename, alias34797: __typename, alias34798: __typename, alias34799: __typename, alias34800: __typename, alias34801: __typename, alias34802: __typename, alias34803: __typename, alias34804: __typename, alias34805: __typename, alias34806: __typename, alias34807: __typename, alias34808: __typename, alias34809: __typename, alias34810: __typename, alias34811: __typename, alias34812: __typename, alias34813: __typename, alias34814: __typename, alias34815: __typename, alias34816: __typename, alias34817: __typename, alias34818: __typename, alias34819: __typename, alias34820: __typename, alias34821: __typename, alias34822: __typename, alias34823: __typename, alias34824: __typename, alias34825: __typename, alias34826: __typename, alias34827: __typename, alias34828: __typename, alias34829: __typename, alias34830: __typename, alias34831: __typename, alias34832: __typename, alias34833: __typename, alias34834: __typename, alias34835: __typename, alias34836: __typename, alias34837: __typename, alias34838: __typename, alias34839: __typename, alias34840: __typename, alias34841: __typename, alias34842: __typename, alias34843: __typename, alias34844: __typename, alias34845: __typename, alias34846: __typename, alias34847: __typename, alias34848: __typename, alias34849: __typename, alias34850: __typename, alias34851: __typename, alias34852: __typename, alias34853: __typename, alias34854: __typename, alias34855: __typename, alias34856: __typename, alias34857: __typename, alias34858: __typename, alias34859: __typename, alias34860: __typename, alias34861: __typename, alias34862: __typename, alias34863: __typename, alias34864: __typename, alias34865: __typename, alias34866: __typename, alias34867: __typename, alias34868: __typename, alias34869: __typename, alias34870: __typename, alias34871: __typename, alias34872: __typename, alias34873: __typename, alias34874: __typename, alias34875: __typename, alias34876: __typename, alias34877: __typename, alias34878: __typename, alias34879: __typename, alias34880: __typename, alias34881: __typename, alias34882: __typename, alias34883: __typename, alias34884: __typename, alias34885: __typename, alias34886: __typename, alias34887: __typename, alias34888: __typename, alias34889: __typename, alias34890: __typename, alias34891: __typename, alias34892: __typename, alias34893: __typename, alias34894: __typename, alias34895: __typename, alias34896: __typename, alias34897: __typename, alias34898: __typename, alias34899: __typename, alias34900: __typename, alias34901: __typename, alias34902: __typename, alias34903: __typename, alias34904: __typename, alias34905: __typename, alias34906: __typename, alias34907: __typename, alias34908: __typename, alias34909: __typename, alias34910: __typename, alias34911: __typename, alias34912: __typename, alias34913: __typename, alias34914: __typename, alias34915: __typename, alias34916: __typename, alias34917: __typename, alias34918: __typename, alias34919: __typename, alias34920: __typename, alias34921: __typename, alias34922: __typename, alias34923: __typename, alias34924: __typename, alias34925: __typename, alias34926: __typename, alias34927: __typename, alias34928: __typename, alias34929: __typename, alias34930: __typename, alias34931: __typename, alias34932: __typename, alias34933: __typename, alias34934: __typename, alias34935: __typename, alias34936: __typename, alias34937: __typename, alias34938: __typename, alias34939: __typename, alias34940: __typename, alias34941: __typename, alias34942: __typename, alias34943: __typename, alias34944: __typename, alias34945: __typename, alias34946: __typename, alias34947: __typename, alias34948: __typename, alias34949: __typename, alias34950: __typename, alias34951: __typename, alias34952: __typename, alias34953: __typename, alias34954: __typename, alias34955: __typename, alias34956: __typename, alias34957: __typename, alias34958: __typename, alias34959: __typename, alias34960: __typename, alias34961: __typename, alias34962: __typename, alias34963: __typename, alias34964: __typename, alias34965: __typename, alias34966: __typename, alias34967: __typename, alias34968: __typename, alias34969: __typename, alias34970: __typename, alias34971: __typename, alias34972: __typename, alias34973: __typename, alias34974: __typename, alias34975: __typename, alias34976: __typename, alias34977: __typename, alias34978: __typename, alias34979: __typename, alias34980: __typename, alias34981: __typename, alias34982: __typename, alias34983: __typename, alias34984: __typename, alias34985: __typename, alias34986: __typename, alias34987: __typename, alias34988: __typename, alias34989: __typename, alias34990: __typename, alias34991: __typename, alias34992: __typename, alias34993: __typename, alias34994: __typename, alias34995: __typename, alias34996: __typename, alias34997: __typename, alias34998: __typename, alias34999: __typename, alias35000: __typename, alias35001: __typename, alias35002: __typename, alias35003: __typename, alias35004: __typename, alias35005: __typename, alias35006: __typename, alias35007: __typename, alias35008: __typename, alias35009: __typename, alias35010: __typename, alias35011: __typename, alias35012: __typename, alias35013: __typename, alias35014: __typename, alias35015: __typename, alias35016: __typename, alias35017: __typename, alias35018: __typename, alias35019: __typename, alias35020: __typename, alias35021: __typename, alias35022: __typename, alias35023: __typename, alias35024: __typename, alias35025: __typename, alias35026: __typename, alias35027: __typename, alias35028: __typename, alias35029: __typename, alias35030: __typename, alias35031: __typename, alias35032: __typename, alias35033: __typename, alias35034: __typename, alias35035: __typename, alias35036: __typename, alias35037: __typename, alias35038: __typename, alias35039: __typename, alias35040: __typename, alias35041: __typename, alias35042: __typename, alias35043: __typename, alias35044: __typename, alias35045: __typename, alias35046: __typename, alias35047: __typename, alias35048: __typename, alias35049: __typename, alias35050: __typename, alias35051: __typename, alias35052: __typename, alias35053: __typename, alias35054: __typename, alias35055: __typename, alias35056: __typename, alias35057: __typename, alias35058: __typename, alias35059: __typename, alias35060: __typename, alias35061: __typename, alias35062: __typename, alias35063: __typename, alias35064: __typename, alias35065: __typename, alias35066: __typename, alias35067: __typename, alias35068: __typename, alias35069: __typename, alias35070: __typename, alias35071: __typename, alias35072: __typename, alias35073: __typename, alias35074: __typename, alias35075: __typename, alias35076: __typename, alias35077: __typename, alias35078: __typename, alias35079: __typename, alias35080: __typename, alias35081: __typename, alias35082: __typename, alias35083: __typename, alias35084: __typename, alias35085: __typename, alias35086: __typename, alias35087: __typename, alias35088: __typename, alias35089: __typename, alias35090: __typename, alias35091: __typename, alias35092: __typename, alias35093: __typename, alias35094: __typename, alias35095: __typename, alias35096: __typename, alias35097: __typename, alias35098: __typename, alias35099: __typename, alias35100: __typename, alias35101: __typename, alias35102: __typename, alias35103: __typename, alias35104: __typename, alias35105: __typename, alias35106: __typename, alias35107: __typename, alias35108: __typename, alias35109: __typename, alias35110: __typename, alias35111: __typename, alias35112: __typename, alias35113: __typename, alias35114: __typename, alias35115: __typename, alias35116: __typename, alias35117: __typename, alias35118: __typename, alias35119: __typename, alias35120: __typename, alias35121: __typename, alias35122: __typename, alias35123: __typename, alias35124: __typename, alias35125: __typename, alias35126: __typename, alias35127: __typename, alias35128: __typename, alias35129: __typename, alias35130: __typename, alias35131: __typename, alias35132: __typename, alias35133: __typename, alias35134: __typename, alias35135: __typename, alias35136: __typename, alias35137: __typename, alias35138: __typename, alias35139: __typename, alias35140: __typename, alias35141: __typename, alias35142: __typename, alias35143: __typename, alias35144: __typename, alias35145: __typename, alias35146: __typename, alias35147: __typename, alias35148: __typename, alias35149: __typename, alias35150: __typename, alias35151: __typename, alias35152: __typename, alias35153: __typename, alias35154: __typename, alias35155: __typename, alias35156: __typename, alias35157: __typename, alias35158: __typename, alias35159: __typename, alias35160: __typename, alias35161: __typename, alias35162: __typename, alias35163: __typename, alias35164: __typename, alias35165: __typename, alias35166: __typename, alias35167: __typename, alias35168: __typename, alias35169: __typename, alias35170: __typename, alias35171: __typename, alias35172: __typename, alias35173: __typename, alias35174: __typename, alias35175: __typename, alias35176: __typename, alias35177: __typename, alias35178: __typename, alias35179: __typename, alias35180: __typename, alias35181: __typename, alias35182: __typename, alias35183: __typename, alias35184: __typename, alias35185: __typename, alias35186: __typename, alias35187: __typename, alias35188: __typename, alias35189: __typename, alias35190: __typename, alias35191: __typename, alias35192: __typename, alias35193: __typename, alias35194: __typename, alias35195: __typename, alias35196: __typename, alias35197: __typename, alias35198: __typename, alias35199: __typename, alias35200: __typename, alias35201: __typename, alias35202: __typename, alias35203: __typename, alias35204: __typename, alias35205: __typename, alias35206: __typename, alias35207: __typename, alias35208: __typename, alias35209: __typename, alias35210: __typename, alias35211: __typename, alias35212: __typename, alias35213: __typename, alias35214: __typename, alias35215: __typename, alias35216: __typename, alias35217: __typename, alias35218: __typename, alias35219: __typename, alias35220: __typename, alias35221: __typename, alias35222: __typename, alias35223: __typename, alias35224: __typename, alias35225: __typename, alias35226: __typename, alias35227: __typename, alias35228: __typename, alias35229: __typename, alias35230: __typename, alias35231: __typename, alias35232: __typename, alias35233: __typename, alias35234: __typename, alias35235: __typename, alias35236: __typename, alias35237: __typename, alias35238: __typename, alias35239: __typename, alias35240: __typename, alias35241: __typename, alias35242: __typename, alias35243: __typename, alias35244: __typename, alias35245: __typename, alias35246: __typename, alias35247: __typename, alias35248: __typename, alias35249: __typename, alias35250: __typename, alias35251: __typename, alias35252: __typename, alias35253: __typename, alias35254: __typename, alias35255: __typename, alias35256: __typename, alias35257: __typename, alias35258: __typename, alias35259: __typename, alias35260: __typename, alias35261: __typename, alias35262: __typename, alias35263: __typename, alias35264: __typename, alias35265: __typename, alias35266: __typename, alias35267: __typename, alias35268: __typename, alias35269: __typename, alias35270: __typename, alias35271: __typename, alias35272: __typename, alias35273: __typename, alias35274: __typename, alias35275: __typename, alias35276: __typename, alias35277: __typename, alias35278: __typename, alias35279: __typename, alias35280: __typename, alias35281: __typename, alias35282: __typename, alias35283: __typename, alias35284: __typename, alias35285: __typename, alias35286: __typename, alias35287: __typename, alias35288: __typename, alias35289: __typename, alias35290: __typename, alias35291: __typename, alias35292: __typename, alias35293: __typename, alias35294: __typename, alias35295: __typename, alias35296: __typename, alias35297: __typename, alias35298: __typename, alias35299: __typename, alias35300: __typename, alias35301: __typename, alias35302: __typename, alias35303: __typename, alias35304: __typename, alias35305: __typename, alias35306: __typename, alias35307: __typename, alias35308: __typename, alias35309: __typename, alias35310: __typename, alias35311: __typename, alias35312: __typename, alias35313: __typename, alias35314: __typename, alias35315: __typename, alias35316: __typename, alias35317: __typename, alias35318: __typename, alias35319: __typename, alias35320: __typename, alias35321: __typename, alias35322: __typename, alias35323: __typename, alias35324: __typename, alias35325: __typename, alias35326: __typename, alias35327: __typename, alias35328: __typename, alias35329: __typename, alias35330: __typename, alias35331: __typename, alias35332: __typename, alias35333: __typename, alias35334: __typename, alias35335: __typename, alias35336: __typename, alias35337: __typename, alias35338: __typename, alias35339: __typename, alias35340: __typename, alias35341: __typename, alias35342: __typename, alias35343: __typename, alias35344: __typename, alias35345: __typename, alias35346: __typename, alias35347: __typename, alias35348: __typename, alias35349: __typename, alias35350: __typename, alias35351: __typename, alias35352: __typename, alias35353: __typename, alias35354: __typename, alias35355: __typename, alias35356: __typename, alias35357: __typename, alias35358: __typename, alias35359: __typename, alias35360: __typename, alias35361: __typename, alias35362: __typename, alias35363: __typename, alias35364: __typename, alias35365: __typename, alias35366: __typename, alias35367: __typename, alias35368: __typename, alias35369: __typename, alias35370: __typename, alias35371: __typename, alias35372: __typename, alias35373: __typename, alias35374: __typename, alias35375: __typename, alias35376: __typename, alias35377: __typename, alias35378: __typename, alias35379: __typename, alias35380: __typename, alias35381: __typename, alias35382: __typename, alias35383: __typename, alias35384: __typename, alias35385: __typename, alias35386: __typename, alias35387: __typename, alias35388: __typename, alias35389: __typename, alias35390: __typename, alias35391: __typename, alias35392: __typename, alias35393: __typename, alias35394: __typename, alias35395: __typename, alias35396: __typename, alias35397: __typename, alias35398: __typename, alias35399: __typename, alias35400: __typename, alias35401: __typename, alias35402: __typename, alias35403: __typename, alias35404: __typename, alias35405: __typename, alias35406: __typename, alias35407: __typename, alias35408: __typename, alias35409: __typename, alias35410: __typename, alias35411: __typename, alias35412: __typename, alias35413: __typename, alias35414: __typename, alias35415: __typename, alias35416: __typename, alias35417: __typename, alias35418: __typename, alias35419: __typename, alias35420: __typename, alias35421: __typename, alias35422: __typename, alias35423: __typename, alias35424: __typename, alias35425: __typename, alias35426: __typename, alias35427: __typename, alias35428: __typename, alias35429: __typename, alias35430: __typename, alias35431: __typename, alias35432: __typename, alias35433: __typename, alias35434: __typename, alias35435: __typename, alias35436: __typename, alias35437: __typename, alias35438: __typename, alias35439: __typename, alias35440: __typename, alias35441: __typename, alias35442: __typename, alias35443: __typename, alias35444: __typename, alias35445: __typename, alias35446: __typename, alias35447: __typename, alias35448: __typename, alias35449: __typename, alias35450: __typename, alias35451: __typename, alias35452: __typename, alias35453: __typename, alias35454: __typename, alias35455: __typename, alias35456: __typename, alias35457: __typename, alias35458: __typename, alias35459: __typename, alias35460: __typename, alias35461: __typename, alias35462: __typename, alias35463: __typename, alias35464: __typename, alias35465: __typename, alias35466: __typename, alias35467: __typename, alias35468: __typename, alias35469: __typename, alias35470: __typename, alias35471: __typename, alias35472: __typename, alias35473: __typename, alias35474: __typename, alias35475: __typename, alias35476: __typename, alias35477: __typename, alias35478: __typename, alias35479: __typename, alias35480: __typename, alias35481: __typename, alias35482: __typename, alias35483: __typename, alias35484: __typename, alias35485: __typename, alias35486: __typename, alias35487: __typename, alias35488: __typename, alias35489: __typename, alias35490: __typename, alias35491: __typename, alias35492: __typename, alias35493: __typename, alias35494: __typename, alias35495: __typename, alias35496: __typename, alias35497: __typename, alias35498: __typename, alias35499: __typename, alias35500: __typename, alias35501: __typename, alias35502: __typename, alias35503: __typename, alias35504: __typename, alias35505: __typename, alias35506: __typename, alias35507: __typename, alias35508: __typename, alias35509: __typename, alias35510: __typename, alias35511: __typename, alias35512: __typename, alias35513: __typename, alias35514: __typename, alias35515: __typename, alias35516: __typename, alias35517: __typename, alias35518: __typename, alias35519: __typename, alias35520: __typename, alias35521: __typename, alias35522: __typename, alias35523: __typename, alias35524: __typename, alias35525: __typename, alias35526: __typename, alias35527: __typename, alias35528: __typename, alias35529: __typename, alias35530: __typename, alias35531: __typename, alias35532: __typename, alias35533: __typename, alias35534: __typename, alias35535: __typename, alias35536: __typename, alias35537: __typename, alias35538: __typename, alias35539: __typename, alias35540: __typename, alias35541: __typename, alias35542: __typename, alias35543: __typename, alias35544: __typename, alias35545: __typename, alias35546: __typename, alias35547: __typename, alias35548: __typename, alias35549: __typename, alias35550: __typename, alias35551: __typename, alias35552: __typename, alias35553: __typename, alias35554: __typename, alias35555: __typename, alias35556: __typename, alias35557: __typename, alias35558: __typename, alias35559: __typename, alias35560: __typename, alias35561: __typename, alias35562: __typename, alias35563: __typename, alias35564: __typename, alias35565: __typename, alias35566: __typename, alias35567: __typename, alias35568: __typename, alias35569: __typename, alias35570: __typename, alias35571: __typename, alias35572: __typename, alias35573: __typename, alias35574: __typename, alias35575: __typename, alias35576: __typename, alias35577: __typename, alias35578: __typename, alias35579: __typename, alias35580: __typename, alias35581: __typename, alias35582: __typename, alias35583: __typename, alias35584: __typename, alias35585: __typename, alias35586: __typename, alias35587: __typename, alias35588: __typename, alias35589: __typename, alias35590: __typename, alias35591: __typename, alias35592: __typename, alias35593: __typename, alias35594: __typename, alias35595: __typename, alias35596: __typename, alias35597: __typename, alias35598: __typename, alias35599: __typename, alias35600: __typename, alias35601: __typename, alias35602: __typename, alias35603: __typename, alias35604: __typename, alias35605: __typename, alias35606: __typename, alias35607: __typename, alias35608: __typename, alias35609: __typename, alias35610: __typename, alias35611: __typename, alias35612: __typename, alias35613: __typename, alias35614: __typename, alias35615: __typename, alias35616: __typename, alias35617: __typename, alias35618: __typename, alias35619: __typename, alias35620: __typename, alias35621: __typename, alias35622: __typename, alias35623: __typename, alias35624: __typename, alias35625: __typename, alias35626: __typename, alias35627: __typename, alias35628: __typename, alias35629: __typename, alias35630: __typename, alias35631: __typename, alias35632: __typename, alias35633: __typename, alias35634: __typename, alias35635: __typename, alias35636: __typename, alias35637: __typename, alias35638: __typename, alias35639: __typename, alias35640: __typename, alias35641: __typename, alias35642: __typename, alias35643: __typename, alias35644: __typename, alias35645: __typename, alias35646: __typename, alias35647: __typename, alias35648: __typename, alias35649: __typename, alias35650: __typename, alias35651: __typename, alias35652: __typename, alias35653: __typename, alias35654: __typename, alias35655: __typename, alias35656: __typename, alias35657: __typename, alias35658: __typename, alias35659: __typename, alias35660: __typename, alias35661: __typename, alias35662: __typename, alias35663: __typename, alias35664: __typename, alias35665: __typename, alias35666: __typename, alias35667: __typename, alias35668: __typename, alias35669: __typename, alias35670: __typename, alias35671: __typename, alias35672: __typename, alias35673: __typename, alias35674: __typename, alias35675: __typename, alias35676: __typename, alias35677: __typename, alias35678: __typename, alias35679: __typename, alias35680: __typename, alias35681: __typename, alias35682: __typename, alias35683: __typename, alias35684: __typename, alias35685: __typename, alias35686: __typename, alias35687: __typename, alias35688: __typename, alias35689: __typename, alias35690: __typename, alias35691: __typename, alias35692: __typename, alias35693: __typename, alias35694: __typename, alias35695: __typename, alias35696: __typename, alias35697: __typename, alias35698: __typename, alias35699: __typename, alias35700: __typename, alias35701: __typename, alias35702: __typename, alias35703: __typename, alias35704: __typename, alias35705: __typename, alias35706: __typename, alias35707: __typename, alias35708: __typename, alias35709: __typename, alias35710: __typename, alias35711: __typename, alias35712: __typename, alias35713: __typename, alias35714: __typename, alias35715: __typename, alias35716: __typename, alias35717: __typename, alias35718: __typename, alias35719: __typename, alias35720: __typename, alias35721: __typename, alias35722: __typename, alias35723: __typename, alias35724: __typename, alias35725: __typename, alias35726: __typename, alias35727: __typename, alias35728: __typename, alias35729: __typename, alias35730: __typename, alias35731: __typename, alias35732: __typename, alias35733: __typename, alias35734: __typename, alias35735: __typename, alias35736: __typename, alias35737: __typename, alias35738: __typename, alias35739: __typename, alias35740: __typename, alias35741: __typename, alias35742: __typename, alias35743: __typename, alias35744: __typename, alias35745: __typename, alias35746: __typename, alias35747: __typename, alias35748: __typename, alias35749: __typename, alias35750: __typename, alias35751: __typename, alias35752: __typename, alias35753: __typename, alias35754: __typename, alias35755: __typename, alias35756: __typename, alias35757: __typename, alias35758: __typename, alias35759: __typename, alias35760: __typename, alias35761: __typename, alias35762: __typename, alias35763: __typename, alias35764: __typename, alias35765: __typename, alias35766: __typename, alias35767: __typename, alias35768: __typename, alias35769: __typename, alias35770: __typename, alias35771: __typename, alias35772: __typename, alias35773: __typename, alias35774: __typename, alias35775: __typename, alias35776: __typename, alias35777: __typename, alias35778: __typename, alias35779: __typename, alias35780: __typename, alias35781: __typename, alias35782: __typename, alias35783: __typename, alias35784: __typename, alias35785: __typename, alias35786: __typename, alias35787: __typename, alias35788: __typename, alias35789: __typename, alias35790: __typename, alias35791: __typename, alias35792: __typename, alias35793: __typename, alias35794: __typename, alias35795: __typename, alias35796: __typename, alias35797: __typename, alias35798: __typename, alias35799: __typename, alias35800: __typename, alias35801: __typename, alias35802: __typename, alias35803: __typename, alias35804: __typename, alias35805: __typename, alias35806: __typename, alias35807: __typename, alias35808: __typename, alias35809: __typename, alias35810: __typename, alias35811: __typename, alias35812: __typename, alias35813: __typename, alias35814: __typename, alias35815: __typename, alias35816: __typename, alias35817: __typename, alias35818: __typename, alias35819: __typename, alias35820: __typename, alias35821: __typename, alias35822: __typename, alias35823: __typename, alias35824: __typename, alias35825: __typename, alias35826: __typename, alias35827: __typename, alias35828: __typename, alias35829: __typename, alias35830: __typename, alias35831: __typename, alias35832: __typename, alias35833: __typename, alias35834: __typename, alias35835: __typename, alias35836: __typename, alias35837: __typename, alias35838: __typename, alias35839: __typename, alias35840: __typename, alias35841: __typename, alias35842: __typename, alias35843: __typename, alias35844: __typename, alias35845: __typename, alias35846: __typename, alias35847: __typename, alias35848: __typename, alias35849: __typename, alias35850: __typename, alias35851: __typename, alias35852: __typename, alias35853: __typename, alias35854: __typename, alias35855: __typename, alias35856: __typename, alias35857: __typename, alias35858: __typename, alias35859: __typename, alias35860: __typename, alias35861: __typename, alias35862: __typename, alias35863: __typename, alias35864: __typename, alias35865: __typename, alias35866: __typename, alias35867: __typename, alias35868: __typename, alias35869: __typename, alias35870: __typename, alias35871: __typename, alias35872: __typename, alias35873: __typename, alias35874: __typename, alias35875: __typename, alias35876: __typename, alias35877: __typename, alias35878: __typename, alias35879: __typename, alias35880: __typename, alias35881: __typename, alias35882: __typename, alias35883: __typename, alias35884: __typename, alias35885: __typename, alias35886: __typename, alias35887: __typename, alias35888: __typename, alias35889: __typename, alias35890: __typename, alias35891: __typename, alias35892: __typename, alias35893: __typename, alias35894: __typename, alias35895: __typename, alias35896: __typename, alias35897: __typename, alias35898: __typename, alias35899: __typename, alias35900: __typename, alias35901: __typename, alias35902: __typename, alias35903: __typename, alias35904: __typename, alias35905: __typename, alias35906: __typename, alias35907: __typename, alias35908: __typename, alias35909: __typename, alias35910: __typename, alias35911: __typename, alias35912: __typename, alias35913: __typename, alias35914: __typename, alias35915: __typename, alias35916: __typename, alias35917: __typename, alias35918: __typename, alias35919: __typename, alias35920: __typename, alias35921: __typename, alias35922: __typename, alias35923: __typename, alias35924: __typename, alias35925: __typename, alias35926: __typename, alias35927: __typename, alias35928: __typename, alias35929: __typename, alias35930: __typename, alias35931: __typename, alias35932: __typename, alias35933: __typename, alias35934: __typename, alias35935: __typename, alias35936: __typename, alias35937: __typename, alias35938: __typename, alias35939: __typename, alias35940: __typename, alias35941: __typename, alias35942: __typename, alias35943: __typename, alias35944: __typename, alias35945: __typename, alias35946: __typename, alias35947: __typename, alias35948: __typename, alias35949: __typename, alias35950: __typename, alias35951: __typename, alias35952: __typename, alias35953: __typename, alias35954: __typename, alias35955: __typename, alias35956: __typename, alias35957: __typename, alias35958: __typename, alias35959: __typename, alias35960: __typename, alias35961: __typename, alias35962: __typename, alias35963: __typename, alias35964: __typename, alias35965: __typename, alias35966: __typename, alias35967: __typename, alias35968: __typename, alias35969: __typename, alias35970: __typename, alias35971: __typename, alias35972: __typename, alias35973: __typename, alias35974: __typename, alias35975: __typename, alias35976: __typename, alias35977: __typename, alias35978: __typename, alias35979: __typename, alias35980: __typename, alias35981: __typename, alias35982: __typename, alias35983: __typename, alias35984: __typename, alias35985: __typename, alias35986: __typename, alias35987: __typename, alias35988: __typename, alias35989: __typename, alias35990: __typename, alias35991: __typename, alias35992: __typename, alias35993: __typename, alias35994: __typename, alias35995: __typename, alias35996: __typename, alias35997: __typename, alias35998: __typename, alias35999: __typename, alias36000: __typename, alias36001: __typename, alias36002: __typename, alias36003: __typename, alias36004: __typename, alias36005: __typename, alias36006: __typename, alias36007: __typename, alias36008: __typename, alias36009: __typename, alias36010: __typename, alias36011: __typename, alias36012: __typename, alias36013: __typename, alias36014: __typename, alias36015: __typename, alias36016: __typename, alias36017: __typename, alias36018: __typename, alias36019: __typename, alias36020: __typename, alias36021: __typename, alias36022: __typename, alias36023: __typename, alias36024: __typename, alias36025: __typename, alias36026: __typename, alias36027: __typename, alias36028: __typename, alias36029: __typename, alias36030: __typename, alias36031: __typename, alias36032: __typename, alias36033: __typename, alias36034: __typename, alias36035: __typename, alias36036: __typename, alias36037: __typename, alias36038: __typename, alias36039: __typename, alias36040: __typename, alias36041: __typename, alias36042: __typename, alias36043: __typename, alias36044: __typename, alias36045: __typename, alias36046: __typename, alias36047: __typename, alias36048: __typename, alias36049: __typename, alias36050: __typename, alias36051: __typename, alias36052: __typename, alias36053: __typename, alias36054: __typename, alias36055: __typename, alias36056: __typename, alias36057: __typename, alias36058: __typename, alias36059: __typename, alias36060: __typename, alias36061: __typename, alias36062: __typename, alias36063: __typename, alias36064: __typename, alias36065: __typename, alias36066: __typename, alias36067: __typename, alias36068: __typename, alias36069: __typename, alias36070: __typename, alias36071: __typename, alias36072: __typename, alias36073: __typename, alias36074: __typename, alias36075: __typename, alias36076: __typename, alias36077: __typename, alias36078: __typename, alias36079: __typename, alias36080: __typename, alias36081: __typename, alias36082: __typename, alias36083: __typename, alias36084: __typename, alias36085: __typename, alias36086: __typename, alias36087: __typename, alias36088: __typename, alias36089: __typename, alias36090: __typename, alias36091: __typename, alias36092: __typename, alias36093: __typename, alias36094: __typename, alias36095: __typename, alias36096: __typename, alias36097: __typename, alias36098: __typename, alias36099: __typename, alias36100: __typename, alias36101: __typename, alias36102: __typename, alias36103: __typename, alias36104: __typename, alias36105: __typename, alias36106: __typename, alias36107: __typename, alias36108: __typename, alias36109: __typename, alias36110: __typename, alias36111: __typename, alias36112: __typename, alias36113: __typename, alias36114: __typename, alias36115: __typename, alias36116: __typename, alias36117: __typename, alias36118: __typename, alias36119: __typename, alias36120: __typename, alias36121: __typename, alias36122: __typename, alias36123: __typename, alias36124: __typename, alias36125: __typename, alias36126: __typename, alias36127: __typename, alias36128: __typename, alias36129: __typename, alias36130: __typename, alias36131: __typename, alias36132: __typename, alias36133: __typename, alias36134: __typename, alias36135: __typename, alias36136: __typename, alias36137: __typename, alias36138: __typename, alias36139: __typename, alias36140: __typename, alias36141: __typename, alias36142: __typename, alias36143: __typename, alias36144: __typename, alias36145: __typename, alias36146: __typename, alias36147: __typename, alias36148: __typename, alias36149: __typename, alias36150: __typename, alias36151: __typename, alias36152: __typename, alias36153: __typename, alias36154: __typename, alias36155: __typename, alias36156: __typename, alias36157: __typename, alias36158: __typename, alias36159: __typename, alias36160: __typename, alias36161: __typename, alias36162: __typename, alias36163: __typename, alias36164: __typename, alias36165: __typename, alias36166: __typename, alias36167: __typename, alias36168: __typename, alias36169: __typename, alias36170: __typename, alias36171: __typename, alias36172: __typename, alias36173: __typename, alias36174: __typename, alias36175: __typename, alias36176: __typename, alias36177: __typename, alias36178: __typename, alias36179: __typename, alias36180: __typename, alias36181: __typename, alias36182: __typename, alias36183: __typename, alias36184: __typename, alias36185: __typename, alias36186: __typename, alias36187: __typename, alias36188: __typename, alias36189: __typename, alias36190: __typename, alias36191: __typename, alias36192: __typename, alias36193: __typename, alias36194: __typename, alias36195: __typename, alias36196: __typename, alias36197: __typename, alias36198: __typename, alias36199: __typename, alias36200: __typename, alias36201: __typename, alias36202: __typename, alias36203: __typename, alias36204: __typename, alias36205: __typename, alias36206: __typename, alias36207: __typename, alias36208: __typename, alias36209: __typename, alias36210: __typename, alias36211: __typename, alias36212: __typename, alias36213: __typename, alias36214: __typename, alias36215: __typename, alias36216: __typename, alias36217: __typename, alias36218: __typename, alias36219: __typename, alias36220: __typename, alias36221: __typename, alias36222: __typename, alias36223: __typename, alias36224: __typename, alias36225: __typename, alias36226: __typename, alias36227: __typename, alias36228: __typename, alias36229: __typename, alias36230: __typename, alias36231: __typename, alias36232: __typename, alias36233: __typename, alias36234: __typename, alias36235: __typename, alias36236: __typename, alias36237: __typename, alias36238: __typename, alias36239: __typename, alias36240: __typename, alias36241: __typename, alias36242: __typename, alias36243: __typename, alias36244: __typename, alias36245: __typename, alias36246: __typename, alias36247: __typename, alias36248: __typename, alias36249: __typename, alias36250: __typename, alias36251: __typename, alias36252: __typename, alias36253: __typename, alias36254: __typename, alias36255: __typename, alias36256: __typename, alias36257: __typename, alias36258: __typename, alias36259: __typename, alias36260: __typename, alias36261: __typename, alias36262: __typename, alias36263: __typename, alias36264: __typename, alias36265: __typename, alias36266: __typename, alias36267: __typename, alias36268: __typename, alias36269: __typename, alias36270: __typename, alias36271: __typename, alias36272: __typename, alias36273: __typename, alias36274: __typename, alias36275: __typename, alias36276: __typename, alias36277: __typename, alias36278: __typename, alias36279: __typename, alias36280: __typename, alias36281: __typename, alias36282: __typename, alias36283: __typename, alias36284: __typename, alias36285: __typename, alias36286: __typename, alias36287: __typename, alias36288: __typename, alias36289: __typename, alias36290: __typename, alias36291: __typename, alias36292: __typename, alias36293: __typename, alias36294: __typename, alias36295: __typename, alias36296: __typename, alias36297: __typename, alias36298: __typename, alias36299: __typename, alias36300: __typename, alias36301: __typename, alias36302: __typename, alias36303: __typename, alias36304: __typename, alias36305: __typename, alias36306: __typename, alias36307: __typename, alias36308: __typename, alias36309: __typename, alias36310: __typename, alias36311: __typename, alias36312: __typename, alias36313: __typename, alias36314: __typename, alias36315: __typename, alias36316: __typename, alias36317: __typename, alias36318: __typename, alias36319: __typename, alias36320: __typename, alias36321: __typename, alias36322: __typename, alias36323: __typename, alias36324: __typename, alias36325: __typename, alias36326: __typename, alias36327: __typename, alias36328: __typename, alias36329: __typename, alias36330: __typename, alias36331: __typename, alias36332: __typename, alias36333: __typename, alias36334: __typename, alias36335: __typename, alias36336: __typename, alias36337: __typename, alias36338: __typename, alias36339: __typename, alias36340: __typename, alias36341: __typename, alias36342: __typename, alias36343: __typename, alias36344: __typename, alias36345: __typename, alias36346: __typename, alias36347: __typename, alias36348: __typename, alias36349: __typename, alias36350: __typename, alias36351: __typename, alias36352: __typename, alias36353: __typename, alias36354: __typename, alias36355: __typename, alias36356: __typename, alias36357: __typename, alias36358: __typename, alias36359: __typename, alias36360: __typename, alias36361: __typename, alias36362: __typename, alias36363: __typename, alias36364: __typename, alias36365: __typename, alias36366: __typename, alias36367: __typename, alias36368: __typename, alias36369: __typename, alias36370: __typename, alias36371: __typename, alias36372: __typename, alias36373: __typename, alias36374: __typename, alias36375: __typename, alias36376: __typename, alias36377: __typename, alias36378: __typename, alias36379: __typename, alias36380: __typename, alias36381: __typename, alias36382: __typename, alias36383: __typename, alias36384: __typename, alias36385: __typename, alias36386: __typename, alias36387: __typename, alias36388: __typename, alias36389: __typename, alias36390: __typename, alias36391: __typename, alias36392: __typename, alias36393: __typename, alias36394: __typename, alias36395: __typename, alias36396: __typename, alias36397: __typename, alias36398: __typename, alias36399: __typename, alias36400: __typename, alias36401: __typename, alias36402: __typename, alias36403: __typename, alias36404: __typename, alias36405: __typename, alias36406: __typename, alias36407: __typename, alias36408: __typename, alias36409: __typename, alias36410: __typename, alias36411: __typename, alias36412: __typename, alias36413: __typename, alias36414: __typename, alias36415: __typename, alias36416: __typename, alias36417: __typename, alias36418: __typename, alias36419: __typename, alias36420: __typename, alias36421: __typename, alias36422: __typename, alias36423: __typename, alias36424: __typename, alias36425: __typename, alias36426: __typename, alias36427: __typename, alias36428: __typename, alias36429: __typename, alias36430: __typename, alias36431: __typename, alias36432: __typename, alias36433: __typename, alias36434: __typename, alias36435: __typename, alias36436: __typename, alias36437: __typename, alias36438: __typename, alias36439: __typename, alias36440: __typename, alias36441: __typename, alias36442: __typename, alias36443: __typename, alias36444: __typename, alias36445: __typename, alias36446: __typename, alias36447: __typename, alias36448: __typename, alias36449: __typename, alias36450: __typename, alias36451: __typename, alias36452: __typename, alias36453: __typename, alias36454: __typename, alias36455: __typename, alias36456: __typename, alias36457: __typename, alias36458: __typename, alias36459: __typename, alias36460: __typename, alias36461: __typename, alias36462: __typename, alias36463: __typename, alias36464: __typename, alias36465: __typename, alias36466: __typename, alias36467: __typename, alias36468: __typename, alias36469: __typename, alias36470: __typename, alias36471: __typename, alias36472: __typename, alias36473: __typename, alias36474: __typename, alias36475: __typename, alias36476: __typename, alias36477: __typename, alias36478: __typename, alias36479: __typename, alias36480: __typename, alias36481: __typename, alias36482: __typename, alias36483: __typename, alias36484: __typename, alias36485: __typename, alias36486: __typename, alias36487: __typename, alias36488: __typename, alias36489: __typename, alias36490: __typename, alias36491: __typename, alias36492: __typename, alias36493: __typename, alias36494: __typename, alias36495: __typename, alias36496: __typename, alias36497: __typename, alias36498: __typename, alias36499: __typename, alias36500: __typename, alias36501: __typename, alias36502: __typename, alias36503: __typename, alias36504: __typename, alias36505: __typename, alias36506: __typename, alias36507: __typename, alias36508: __typename, alias36509: __typename, alias36510: __typename, alias36511: __typename, alias36512: __typename, alias36513: __typename, alias36514: __typename, alias36515: __typename, alias36516: __typename, alias36517: __typename, alias36518: __typename, alias36519: __typename, alias36520: __typename, alias36521: __typename, alias36522: __typename, alias36523: __typename, alias36524: __typename, alias36525: __typename, alias36526: __typename, alias36527: __typename, alias36528: __typename, alias36529: __typename, alias36530: __typename, alias36531: __typename, alias36532: __typename, alias36533: __typename, alias36534: __typename, alias36535: __typename, alias36536: __typename, alias36537: __typename, alias36538: __typename, alias36539: __typename, alias36540: __typename, alias36541: __typename, alias36542: __typename, alias36543: __typename, alias36544: __typename, alias36545: __typename, alias36546: __typename, alias36547: __typename, alias36548: __typename, alias36549: __typename, alias36550: __typename, alias36551: __typename, alias36552: __typename, alias36553: __typename, alias36554: __typename, alias36555: __typename, alias36556: __typename, alias36557: __typename, alias36558: __typename, alias36559: __typename, alias36560: __typename, alias36561: __typename, alias36562: __typename, alias36563: __typename, alias36564: __typename, alias36565: __typename, alias36566: __typename, alias36567: __typename, alias36568: __typename, alias36569: __typename, alias36570: __typename, alias36571: __typename, alias36572: __typename, alias36573: __typename, alias36574: __typename, alias36575: __typename, alias36576: __typename, alias36577: __typename, alias36578: __typename, alias36579: __typename, alias36580: __typename, alias36581: __typename, alias36582: __typename, alias36583: __typename, alias36584: __typename, alias36585: __typename, alias36586: __typename, alias36587: __typename, alias36588: __typename, alias36589: __typename, alias36590: __typename, alias36591: __typename, alias36592: __typename, alias36593: __typename, alias36594: __typename, alias36595: __typename, alias36596: __typename, alias36597: __typename, alias36598: __typename, alias36599: __typename, alias36600: __typename, alias36601: __typename, alias36602: __typename, alias36603: __typename, alias36604: __typename, alias36605: __typename, alias36606: __typename, alias36607: __typename, alias36608: __typename, alias36609: __typename, alias36610: __typename, alias36611: __typename, alias36612: __typename, alias36613: __typename, alias36614: __typename, alias36615: __typename, alias36616: __typename, alias36617: __typename, alias36618: __typename, alias36619: __typename, alias36620: __typename, alias36621: __typename, alias36622: __typename, alias36623: __typename, alias36624: __typename, alias36625: __typename, alias36626: __typename, alias36627: __typename, alias36628: __typename, alias36629: __typename, alias36630: __typename, alias36631: __typename, alias36632: __typename, alias36633: __typename, alias36634: __typename, alias36635: __typename, alias36636: __typename, alias36637: __typename, alias36638: __typename, alias36639: __typename, alias36640: __typename, alias36641: __typename, alias36642: __typename, alias36643: __typename, alias36644: __typename, alias36645: __typename, alias36646: __typename, alias36647: __typename, alias36648: __typename, alias36649: __typename, alias36650: __typename, alias36651: __typename, alias36652: __typename, alias36653: __typename, alias36654: __typename, alias36655: __typename, alias36656: __typename, alias36657: __typename, alias36658: __typename, alias36659: __typename, alias36660: __typename, alias36661: __typename, alias36662: __typename, alias36663: __typename, alias36664: __typename, alias36665: __typename, alias36666: __typename, alias36667: __typename, alias36668: __typename, alias36669: __typename, alias36670: __typename, alias36671: __typename, alias36672: __typename, alias36673: __typename, alias36674: __typename, alias36675: __typename, alias36676: __typename, alias36677: __typename, alias36678: __typename, alias36679: __typename, alias36680: __typename, alias36681: __typename, alias36682: __typename, alias36683: __typename, alias36684: __typename, alias36685: __typename, alias36686: __typename, alias36687: __typename, alias36688: __typename, alias36689: __typename, alias36690: __typename, alias36691: __typename, alias36692: __typename, alias36693: __typename, alias36694: __typename, alias36695: __typename, alias36696: __typename, alias36697: __typename, alias36698: __typename, alias36699: __typename, alias36700: __typename, alias36701: __typename, alias36702: __typename, alias36703: __typename, alias36704: __typename, alias36705: __typename, alias36706: __typename, alias36707: __typename, alias36708: __typename, alias36709: __typename, alias36710: __typename, alias36711: __typename, alias36712: __typename, alias36713: __typename, alias36714: __typename, alias36715: __typename, alias36716: __typename, alias36717: __typename, alias36718: __typename, alias36719: __typename, alias36720: __typename, alias36721: __typename, alias36722: __typename, alias36723: __typename, alias36724: __typename, alias36725: __typename, alias36726: __typename, alias36727: __typename, alias36728: __typename, alias36729: __typename, alias36730: __typename, alias36731: __typename, alias36732: __typename, alias36733: __typename, alias36734: __typename, alias36735: __typename, alias36736: __typename, alias36737: __typename, alias36738: __typename, alias36739: __typename, alias36740: __typename, alias36741: __typename, alias36742: __typename, alias36743: __typename, alias36744: __typename, alias36745: __typename, alias36746: __typename, alias36747: __typename, alias36748: __typename, alias36749: __typename, alias36750: __typename, alias36751: __typename, alias36752: __typename, alias36753: __typename, alias36754: __typename, alias36755: __typename, alias36756: __typename, alias36757: __typename, alias36758: __typename, alias36759: __typename, alias36760: __typename, alias36761: __typename, alias36762: __typename, alias36763: __typename, alias36764: __typename, alias36765: __typename, alias36766: __typename, alias36767: __typename, alias36768: __typename, alias36769: __typename, alias36770: __typename, alias36771: __typename, alias36772: __typename, alias36773: __typename, alias36774: __typename, alias36775: __typename, alias36776: __typename, alias36777: __typename, alias36778: __typename, alias36779: __typename, alias36780: __typename, alias36781: __typename, alias36782: __typename, alias36783: __typename, alias36784: __typename, alias36785: __typename, alias36786: __typename, alias36787: __typename, alias36788: __typename, alias36789: __typename, alias36790: __typename, alias36791: __typename, alias36792: __typename, alias36793: __typename, alias36794: __typename, alias36795: __typename, alias36796: __typename, alias36797: __typename, alias36798: __typename, alias36799: __typename, alias36800: __typename, alias36801: __typename, alias36802: __typename, alias36803: __typename, alias36804: __typename, alias36805: __typename, alias36806: __typename, alias36807: __typename, alias36808: __typename, alias36809: __typename, alias36810: __typename, alias36811: __typename, alias36812: __typename, alias36813: __typename, alias36814: __typename, alias36815: __typename, alias36816: __typename, alias36817: __typename, alias36818: __typename, alias36819: __typename, alias36820: __typename, alias36821: __typename, alias36822: __typename, alias36823: __typename, alias36824: __typename, alias36825: __typename, alias36826: __typename, alias36827: __typename, alias36828: __typename, alias36829: __typename, alias36830: __typename, alias36831: __typename, alias36832: __typename, alias36833: __typename, alias36834: __typename, alias36835: __typename, alias36836: __typename, alias36837: __typename, alias36838: __typename, alias36839: __typename, alias36840: __typename, alias36841: __typename, alias36842: __typename, alias36843: __typename, alias36844: __typename, alias36845: __typename, alias36846: __typename, alias36847: __typename, alias36848: __typename, alias36849: __typename, alias36850: __typename, alias36851: __typename, alias36852: __typename, alias36853: __typename, alias36854: __typename, alias36855: __typename, alias36856: __typename, alias36857: __typename, alias36858: __typename, alias36859: __typename, alias36860: __typename, alias36861: __typename, alias36862: __typename, alias36863: __typename, alias36864: __typename, alias36865: __typename, alias36866: __typename, alias36867: __typename, alias36868: __typename, alias36869: __typename, alias36870: __typename, alias36871: __typename, alias36872: __typename, alias36873: __typename, alias36874: __typename, alias36875: __typename, alias36876: __typename, alias36877: __typename, alias36878: __typename, alias36879: __typename, alias36880: __typename, alias36881: __typename, alias36882: __typename, alias36883: __typename, alias36884: __typename, alias36885: __typename, alias36886: __typename, alias36887: __typename, alias36888: __typename, alias36889: __typename, alias36890: __typename, alias36891: __typename, alias36892: __typename, alias36893: __typename, alias36894: __typename, alias36895: __typename, alias36896: __typename, alias36897: __typename, alias36898: __typename, alias36899: __typename, alias36900: __typename, alias36901: __typename, alias36902: __typename, alias36903: __typename, alias36904: __typename, alias36905: __typename, alias36906: __typename, alias36907: __typename, alias36908: __typename, alias36909: __typename, alias36910: __typename, alias36911: __typename, alias36912: __typename, alias36913: __typename, alias36914: __typename, alias36915: __typename, alias36916: __typename, alias36917: __typename, alias36918: __typename, alias36919: __typename, alias36920: __typename, alias36921: __typename, alias36922: __typename, alias36923: __typename, alias36924: __typename, alias36925: __typename, alias36926: __typename, alias36927: __typename, alias36928: __typename, alias36929: __typename, alias36930: __typename, alias36931: __typename, alias36932: __typename, alias36933: __typename, alias36934: __typename, alias36935: __typename, alias36936: __typename, alias36937: __typename, alias36938: __typename, alias36939: __typename, alias36940: __typename, alias36941: __typename, alias36942: __typename, alias36943: __typename, alias36944: __typename, alias36945: __typename, alias36946: __typename, alias36947: __typename, alias36948: __typename, alias36949: __typename, alias36950: __typename, alias36951: __typename, alias36952: __typename, alias36953: __typename, alias36954: __typename, alias36955: __typename, alias36956: __typename, alias36957: __typename, alias36958: __typename, alias36959: __typename, alias36960: __typename, alias36961: __typename, alias36962: __typename, alias36963: __typename, alias36964: __typename, alias36965: __typename, alias36966: __typename, alias36967: __typename, alias36968: __typename, alias36969: __typename, alias36970: __typename, alias36971: __typename, alias36972: __typename, alias36973: __typename, alias36974: __typename, alias36975: __typename, alias36976: __typename, alias36977: __typename, alias36978: __typename, alias36979: __typename, alias36980: __typename, alias36981: __typename, alias36982: __typename, alias36983: __typename, alias36984: __typename, alias36985: __typename, alias36986: __typename, alias36987: __typename, alias36988: __typename, alias36989: __typename, alias36990: __typename, alias36991: __typename, alias36992: __typename, alias36993: __typename, alias36994: __typename, alias36995: __typename, alias36996: __typename, alias36997: __typename, alias36998: __typename, alias36999: __typename, alias37000: __typename, alias37001: __typename, alias37002: __typename, alias37003: __typename, alias37004: __typename, alias37005: __typename, alias37006: __typename, alias37007: __typename, alias37008: __typename, alias37009: __typename, alias37010: __typename, alias37011: __typename, alias37012: __typename, alias37013: __typename, alias37014: __typename, alias37015: __typename, alias37016: __typename, alias37017: __typename, alias37018: __typename, alias37019: __typename, alias37020: __typename, alias37021: __typename, alias37022: __typename, alias37023: __typename, alias37024: __typename, alias37025: __typename, alias37026: __typename, alias37027: __typename, alias37028: __typename, alias37029: __typename, alias37030: __typename, alias37031: __typename, alias37032: __typename, alias37033: __typename, alias37034: __typename, alias37035: __typename, alias37036: __typename, alias37037: __typename, alias37038: __typename, alias37039: __typename, alias37040: __typename, alias37041: __typename, alias37042: __typename, alias37043: __typename, alias37044: __typename, alias37045: __typename, alias37046: __typename, alias37047: __typename, alias37048: __typename, alias37049: __typename, alias37050: __typename, alias37051: __typename, alias37052: __typename, alias37053: __typename, alias37054: __typename, alias37055: __typename, alias37056: __typename, alias37057: __typename, alias37058: __typename, alias37059: __typename, alias37060: __typename, alias37061: __typename, alias37062: __typename, alias37063: __typename, alias37064: __typename, alias37065: __typename, alias37066: __typename, alias37067: __typename, alias37068: __typename, alias37069: __typename, alias37070: __typename, alias37071: __typename, alias37072: __typename, alias37073: __typename, alias37074: __typename, alias37075: __typename, alias37076: __typename, alias37077: __typename, alias37078: __typename, alias37079: __typename, alias37080: __typename, alias37081: __typename, alias37082: __typename, alias37083: __typename, alias37084: __typename, alias37085: __typename, alias37086: __typename, alias37087: __typename, alias37088: __typename, alias37089: __typename, alias37090: __typename, alias37091: __typename, alias37092: __typename, alias37093: __typename, alias37094: __typename, alias37095: __typename, alias37096: __typename, alias37097: __typename, alias37098: __typename, alias37099: __typename, alias37100: __typename, alias37101: __typename, alias37102: __typename, alias37103: __typename, alias37104: __typename, alias37105: __typename, alias37106: __typename, alias37107: __typename, alias37108: __typename, alias37109: __typename, alias37110: __typename, alias37111: __typename, alias37112: __typename, alias37113: __typename, alias37114: __typename, alias37115: __typename, alias37116: __typename, alias37117: __typename, alias37118: __typename, alias37119: __typename, alias37120: __typename, alias37121: __typename, alias37122: __typename, alias37123: __typename, alias37124: __typename, alias37125: __typename, alias37126: __typename, alias37127: __typename, alias37128: __typename, alias37129: __typename, alias37130: __typename, alias37131: __typename, alias37132: __typename, alias37133: __typename, alias37134: __typename, alias37135: __typename, alias37136: __typename, alias37137: __typename, alias37138: __typename, alias37139: __typename, alias37140: __typename, alias37141: __typename, alias37142: __typename, alias37143: __typename, alias37144: __typename, alias37145: __typename, alias37146: __typename, alias37147: __typename, alias37148: __typename, alias37149: __typename, alias37150: __typename, alias37151: __typename, alias37152: __typename, alias37153: __typename, alias37154: __typename, alias37155: __typename, alias37156: __typename, alias37157: __typename, alias37158: __typename, alias37159: __typename, alias37160: __typename, alias37161: __typename, alias37162: __typename, alias37163: __typename, alias37164: __typename, alias37165: __typename, alias37166: __typename, alias37167: __typename, alias37168: __typename, alias37169: __typename, alias37170: __typename, alias37171: __typename, alias37172: __typename, alias37173: __typename, alias37174: __typename, alias37175: __typename, alias37176: __typename, alias37177: __typename, alias37178: __typename, alias37179: __typename, alias37180: __typename, alias37181: __typename, alias37182: __typename, alias37183: __typename, alias37184: __typename, alias37185: __typename, alias37186: __typename, alias37187: __typename, alias37188: __typename, alias37189: __typename, alias37190: __typename, alias37191: __typename, alias37192: __typename, alias37193: __typename, alias37194: __typename, alias37195: __typename, alias37196: __typename, alias37197: __typename, alias37198: __typename, alias37199: __typename, alias37200: __typename, alias37201: __typename, alias37202: __typename, alias37203: __typename, alias37204: __typename, alias37205: __typename, alias37206: __typename, alias37207: __typename, alias37208: __typename, alias37209: __typename, alias37210: __typename, alias37211: __typename, alias37212: __typename, alias37213: __typename, alias37214: __typename, alias37215: __typename, alias37216: __typename, alias37217: __typename, alias37218: __typename, alias37219: __typename, alias37220: __typename, alias37221: __typename, alias37222: __typename, alias37223: __typename, alias37224: __typename, alias37225: __typename, alias37226: __typename, alias37227: __typename, alias37228: __typename, alias37229: __typename, alias37230: __typename, alias37231: __typename, alias37232: __typename, alias37233: __typename, alias37234: __typename, alias37235: __typename, alias37236: __typename, alias37237: __typename, alias37238: __typename, alias37239: __typename, alias37240: __typename, alias37241: __typename, alias37242: __typename, alias37243: __typename, alias37244: __typename, alias37245: __typename, alias37246: __typename, alias37247: __typename, alias37248: __typename, alias37249: __typename, alias37250: __typename, alias37251: __typename, alias37252: __typename, alias37253: __typename, alias37254: __typename, alias37255: __typename, alias37256: __typename, alias37257: __typename, alias37258: __typename, alias37259: __typename, alias37260: __typename, alias37261: __typename, alias37262: __typename, alias37263: __typename, alias37264: __typename, alias37265: __typename, alias37266: __typename, alias37267: __typename, alias37268: __typename, alias37269: __typename, alias37270: __typename, alias37271: __typename, alias37272: __typename, alias37273: __typename, alias37274: __typename, alias37275: __typename, alias37276: __typename, alias37277: __typename, alias37278: __typename, alias37279: __typename, alias37280: __typename, alias37281: __typename, alias37282: __typename, alias37283: __typename, alias37284: __typename, alias37285: __typename, alias37286: __typename, alias37287: __typename, alias37288: __typename, alias37289: __typename, alias37290: __typename, alias37291: __typename, alias37292: __typename, alias37293: __typename, alias37294: __typename, alias37295: __typename, alias37296: __typename, alias37297: __typename, alias37298: __typename, alias37299: __typename, alias37300: __typename, alias37301: __typename, alias37302: __typename, alias37303: __typename, alias37304: __typename, alias37305: __typename, alias37306: __typename, alias37307: __typename, alias37308: __typename, alias37309: __typename, alias37310: __typename, alias37311: __typename, alias37312: __typename, alias37313: __typename, alias37314: __typename, alias37315: __typename, alias37316: __typename, alias37317: __typename, alias37318: __typename, alias37319: __typename, alias37320: __typename, alias37321: __typename, alias37322: __typename, alias37323: __typename, alias37324: __typename, alias37325: __typename, alias37326: __typename, alias37327: __typename, alias37328: __typename, alias37329: __typename, alias37330: __typename, alias37331: __typename, alias37332: __typename, alias37333: __typename, alias37334: __typename, alias37335: __typename, alias37336: __typename, alias37337: __typename, alias37338: __typename, alias37339: __typename, alias37340: __typename, alias37341: __typename, alias37342: __typename, alias37343: __typename, alias37344: __typename, alias37345: __typename, alias37346: __typename, alias37347: __typename, alias37348: __typename, alias37349: __typename, alias37350: __typename, alias37351: __typename, alias37352: __typename, alias37353: __typename, alias37354: __typename, alias37355: __typename, alias37356: __typename, alias37357: __typename, alias37358: __typename, alias37359: __typename, alias37360: __typename, alias37361: __typename, alias37362: __typename, alias37363: __typename, alias37364: __typename, alias37365: __typename, alias37366: __typename, alias37367: __typename, alias37368: __typename, alias37369: __typename, alias37370: __typename, alias37371: __typename, alias37372: __typename, alias37373: __typename, alias37374: __typename, alias37375: __typename, alias37376: __typename, alias37377: __typename, alias37378: __typename, alias37379: __typename, alias37380: __typename, alias37381: __typename, alias37382: __typename, alias37383: __typename, alias37384: __typename, alias37385: __typename, alias37386: __typename, alias37387: __typename, alias37388: __typename, alias37389: __typename, alias37390: __typename, alias37391: __typename, alias37392: __typename, alias37393: __typename, alias37394: __typename, alias37395: __typename, alias37396: __typename, alias37397: __typename, alias37398: __typename, alias37399: __typename, alias37400: __typename, alias37401: __typename, alias37402: __typename, alias37403: __typename, alias37404: __typename, alias37405: __typename, alias37406: __typename, alias37407: __typename, alias37408: __typename, alias37409: __typename, alias37410: __typename, alias37411: __typename, alias37412: __typename, alias37413: __typename, alias37414: __typename, alias37415: __typename, alias37416: __typename, alias37417: __typename, alias37418: __typename, alias37419: __typename, alias37420: __typename, alias37421: __typename, alias37422: __typename, alias37423: __typename, alias37424: __typename, alias37425: __typename, alias37426: __typename, alias37427: __typename, alias37428: __typename, alias37429: __typename, alias37430: __typename, alias37431: __typename, alias37432: __typename, alias37433: __typename, alias37434: __typename, alias37435: __typename, alias37436: __typename, alias37437: __typename, alias37438: __typename, alias37439: __typename, alias37440: __typename, alias37441: __typename, alias37442: __typename, alias37443: __typename, alias37444: __typename, alias37445: __typename, alias37446: __typename, alias37447: __typename, alias37448: __typename, alias37449: __typename, alias37450: __typename, alias37451: __typename, alias37452: __typename, alias37453: __typename, alias37454: __typename, alias37455: __typename, alias37456: __typename, alias37457: __typename, alias37458: __typename, alias37459: __typename, alias37460: __typename, alias37461: __typename, alias37462: __typename, alias37463: __typename, alias37464: __typename, alias37465: __typename, alias37466: __typename, alias37467: __typename, alias37468: __typename, alias37469: __typename, alias37470: __typename, alias37471: __typename, alias37472: __typename, alias37473: __typename, alias37474: __typename, alias37475: __typename, alias37476: __typename, alias37477: __typename, alias37478: __typename, alias37479: __typename, alias37480: __typename, alias37481: __typename, alias37482: __typename, alias37483: __typename, alias37484: __typename, alias37485: __typename, alias37486: __typename, alias37487: __typename, alias37488: __typename, alias37489: __typename, alias37490: __typename, alias37491: __typename, alias37492: __typename, alias37493: __typename, alias37494: __typename, alias37495: __typename, alias37496: __typename, alias37497: __typename, alias37498: __typename, alias37499: __typename, alias37500: __typename, alias37501: __typename, alias37502: __typename, alias37503: __typename, alias37504: __typename, alias37505: __typename, alias37506: __typename, alias37507: __typename, alias37508: __typename, alias37509: __typename, alias37510: __typename, alias37511: __typename, alias37512: __typename, alias37513: __typename, alias37514: __typename, alias37515: __typename, alias37516: __typename, alias37517: __typename, alias37518: __typename, alias37519: __typename, alias37520: __typename, alias37521: __typename, alias37522: __typename, alias37523: __typename, alias37524: __typename, alias37525: __typename, alias37526: __typename, alias37527: __typename, alias37528: __typename, alias37529: __typename, alias37530: __typename, alias37531: __typename, alias37532: __typename, alias37533: __typename, alias37534: __typename, alias37535: __typename, alias37536: __typename, alias37537: __typename, alias37538: __typename, alias37539: __typename, alias37540: __typename, alias37541: __typename, alias37542: __typename, alias37543: __typename, alias37544: __typename, alias37545: __typename, alias37546: __typename, alias37547: __typename, alias37548: __typename, alias37549: __typename, alias37550: __typename, alias37551: __typename, alias37552: __typename, alias37553: __typename, alias37554: __typename, alias37555: __typename, alias37556: __typename, alias37557: __typename, alias37558: __typename, alias37559: __typename, alias37560: __typename, alias37561: __typename, alias37562: __typename, alias37563: __typename, alias37564: __typename, alias37565: __typename, alias37566: __typename, alias37567: __typename, alias37568: __typename, alias37569: __typename, alias37570: __typename, alias37571: __typename, alias37572: __typename, alias37573: __typename, alias37574: __typename, alias37575: __typename, alias37576: __typename, alias37577: __typename, alias37578: __typename, alias37579: __typename, alias37580: __typename, alias37581: __typename, alias37582: __typename, alias37583: __typename, alias37584: __typename, alias37585: __typename, alias37586: __typename, alias37587: __typename, alias37588: __typename, alias37589: __typename, alias37590: __typename, alias37591: __typename, alias37592: __typename, alias37593: __typename, alias37594: __typename, alias37595: __typename, alias37596: __typename, alias37597: __typename, alias37598: __typename, alias37599: __typename, alias37600: __typename, alias37601: __typename, alias37602: __typename, alias37603: __typename, alias37604: __typename, alias37605: __typename, alias37606: __typename, alias37607: __typename, alias37608: __typename, alias37609: __typename, alias37610: __typename, alias37611: __typename, alias37612: __typename, alias37613: __typename, alias37614: __typename, alias37615: __typename, alias37616: __typename, alias37617: __typename, alias37618: __typename, alias37619: __typename, alias37620: __typename, alias37621: __typename, alias37622: __typename, alias37623: __typename, alias37624: __typename, alias37625: __typename, alias37626: __typename, alias37627: __typename, alias37628: __typename, alias37629: __typename, alias37630: __typename, alias37631: __typename, alias37632: __typename, alias37633: __typename, alias37634: __typename, alias37635: __typename, alias37636: __typename, alias37637: __typename, alias37638: __typename, alias37639: __typename, alias37640: __typename, alias37641: __typename, alias37642: __typename, alias37643: __typename, alias37644: __typename, alias37645: __typename, alias37646: __typename, alias37647: __typename, alias37648: __typename, alias37649: __typename, alias37650: __typename, alias37651: __typename, alias37652: __typename, alias37653: __typename, alias37654: __typename, alias37655: __typename, alias37656: __typename, alias37657: __typename, alias37658: __typename, alias37659: __typename, alias37660: __typename, alias37661: __typename, alias37662: __typename, alias37663: __typename, alias37664: __typename, alias37665: __typename, alias37666: __typename, alias37667: __typename, alias37668: __typename, alias37669: __typename, alias37670: __typename, alias37671: __typename, alias37672: __typename, alias37673: __typename, alias37674: __typename, alias37675: __typename, alias37676: __typename, alias37677: __typename, alias37678: __typename, alias37679: __typename, alias37680: __typename, alias37681: __typename, alias37682: __typename, alias37683: __typename, alias37684: __typename, alias37685: __typename, alias37686: __typename, alias37687: __typename, alias37688: __typename, alias37689: __typename, alias37690: __typename, alias37691: __typename, alias37692: __typename, alias37693: __typename, alias37694: __typename, alias37695: __typename, alias37696: __typename, alias37697: __typename, alias37698: __typename, alias37699: __typename, alias37700: __typename, alias37701: __typename, alias37702: __typename, alias37703: __typename, alias37704: __typename, alias37705: __typename, alias37706: __typename, alias37707: __typename, alias37708: __typename, alias37709: __typename, alias37710: __typename, alias37711: __typename, alias37712: __typename, alias37713: __typename, alias37714: __typename, alias37715: __typename, alias37716: __typename, alias37717: __typename, alias37718: __typename, alias37719: __typename, alias37720: __typename, alias37721: __typename, alias37722: __typename, alias37723: __typename, alias37724: __typename, alias37725: __typename, alias37726: __typename, alias37727: __typename, alias37728: __typename, alias37729: __typename, alias37730: __typename, alias37731: __typename, alias37732: __typename, alias37733: __typename, alias37734: __typename, alias37735: __typename, alias37736: __typename, alias37737: __typename, alias37738: __typename, alias37739: __typename, alias37740: __typename, alias37741: __typename, alias37742: __typename, alias37743: __typename, alias37744: __typename, alias37745: __typename, alias37746: __typename, alias37747: __typename, alias37748: __typename, alias37749: __typename, alias37750: __typename, alias37751: __typename, alias37752: __typename, alias37753: __typename, alias37754: __typename, alias37755: __typename, alias37756: __typename, alias37757: __typename, alias37758: __typename, alias37759: __typename, alias37760: __typename, alias37761: __typename, alias37762: __typename, alias37763: __typename, alias37764: __typename, alias37765: __typename, alias37766: __typename, alias37767: __typename, alias37768: __typename, alias37769: __typename, alias37770: __typename, alias37771: __typename, alias37772: __typename, alias37773: __typename, alias37774: __typename, alias37775: __typename, alias37776: __typename, alias37777: __typename, alias37778: __typename, alias37779: __typename, alias37780: __typename, alias37781: __typename, alias37782: __typename, alias37783: __typename, alias37784: __typename, alias37785: __typename, alias37786: __typename, alias37787: __typename, alias37788: __typename, alias37789: __typename, alias37790: __typename, alias37791: __typename, alias37792: __typename, alias37793: __typename, alias37794: __typename, alias37795: __typename, alias37796: __typename, alias37797: __typename, alias37798: __typename, alias37799: __typename, alias37800: __typename, alias37801: __typename, alias37802: __typename, alias37803: __typename, alias37804: __typename, alias37805: __typename, alias37806: __typename, alias37807: __typename, alias37808: __typename, alias37809: __typename, alias37810: __typename, alias37811: __typename, alias37812: __typename, alias37813: __typename, alias37814: __typename, alias37815: __typename, alias37816: __typename, alias37817: __typename, alias37818: __typename, alias37819: __typename, alias37820: __typename, alias37821: __typename, alias37822: __typename, alias37823: __typename, alias37824: __typename, alias37825: __typename, alias37826: __typename, alias37827: __typename, alias37828: __typename, alias37829: __typename, alias37830: __typename, alias37831: __typename, alias37832: __typename, alias37833: __typename, alias37834: __typename, alias37835: __typename, alias37836: __typename, alias37837: __typename, alias37838: __typename, alias37839: __typename, alias37840: __typename, alias37841: __typename, alias37842: __typename, alias37843: __typename, alias37844: __typename, alias37845: __typename, alias37846: __typename, alias37847: __typename, alias37848: __typename, alias37849: __typename, alias37850: __typename, alias37851: __typename, alias37852: __typename, alias37853: __typename, alias37854: __typename, alias37855: __typename, alias37856: __typename, alias37857: __typename, alias37858: __typename, alias37859: __typename, alias37860: __typename, alias37861: __typename, alias37862: __typename, alias37863: __typename, alias37864: __typename, alias37865: __typename, alias37866: __typename, alias37867: __typename, alias37868: __typename, alias37869: __typename, alias37870: __typename, alias37871: __typename, alias37872: __typename, alias37873: __typename, alias37874: __typename, alias37875: __typename, alias37876: __typename, alias37877: __typename, alias37878: __typename, alias37879: __typename, alias37880: __typename, alias37881: __typename, alias37882: __typename, alias37883: __typename, alias37884: __typename, alias37885: __typename, alias37886: __typename, alias37887: __typename, alias37888: __typename, alias37889: __typename, alias37890: __typename, alias37891: __typename, alias37892: __typename, alias37893: __typename, alias37894: __typename, alias37895: __typename, alias37896: __typename, alias37897: __typename, alias37898: __typename, alias37899: __typename, alias37900: __typename, alias37901: __typename, alias37902: __typename, alias37903: __typename, alias37904: __typename, alias37905: __typename, alias37906: __typename, alias37907: __typename, alias37908: __typename, alias37909: __typename, alias37910: __typename, alias37911: __typename, alias37912: __typename, alias37913: __typename, alias37914: __typename, alias37915: __typename, alias37916: __typename, alias37917: __typename, alias37918: __typename, alias37919: __typename, alias37920: __typename, alias37921: __typename, alias37922: __typename, alias37923: __typename, alias37924: __typename, alias37925: __typename, alias37926: __typename, alias37927: __typename, alias37928: __typename, alias37929: __typename, alias37930: __typename, alias37931: __typename, alias37932: __typename, alias37933: __typename, alias37934: __typename, alias37935: __typename, alias37936: __typename, alias37937: __typename, alias37938: __typename, alias37939: __typename, alias37940: __typename, alias37941: __typename, alias37942: __typename, alias37943: __typename, alias37944: __typename, alias37945: __typename, alias37946: __typename, alias37947: __typename, alias37948: __typename, alias37949: __typename, alias37950: __typename, alias37951: __typename, alias37952: __typename, alias37953: __typename, alias37954: __typename, alias37955: __typename, alias37956: __typename, alias37957: __typename, alias37958: __typename, alias37959: __typename, alias37960: __typename, alias37961: __typename, alias37962: __typename, alias37963: __typename, alias37964: __typename, alias37965: __typename, alias37966: __typename, alias37967: __typename, alias37968: __typename, alias37969: __typename, alias37970: __typename, alias37971: __typename, alias37972: __typename, alias37973: __typename, alias37974: __typename, alias37975: __typename, alias37976: __typename, alias37977: __typename, alias37978: __typename, alias37979: __typename, alias37980: __typename, alias37981: __typename, alias37982: __typename, alias37983: __typename, alias37984: __typename, alias37985: __typename, alias37986: __typename, alias37987: __typename, alias37988: __typename, alias37989: __typename, alias37990: __typename, alias37991: __typename, alias37992: __typename, alias37993: __typename, alias37994: __typename, alias37995: __typename, alias37996: __typename, alias37997: __typename, alias37998: __typename, alias37999: __typename, alias38000: __typename, alias38001: __typename, alias38002: __typename, alias38003: __typename, alias38004: __typename, alias38005: __typename, alias38006: __typename, alias38007: __typename, alias38008: __typename, alias38009: __typename, alias38010: __typename, alias38011: __typename, alias38012: __typename, alias38013: __typename, alias38014: __typename, alias38015: __typename, alias38016: __typename, alias38017: __typename, alias38018: __typename, alias38019: __typename, alias38020: __typename, alias38021: __typename, alias38022: __typename, alias38023: __typename, alias38024: __typename, alias38025: __typename, alias38026: __typename, alias38027: __typename, alias38028: __typename, alias38029: __typename, alias38030: __typename, alias38031: __typename, alias38032: __typename, alias38033: __typename, alias38034: __typename, alias38035: __typename, alias38036: __typename, alias38037: __typename, alias38038: __typename, alias38039: __typename, alias38040: __typename, alias38041: __typename, alias38042: __typename, alias38043: __typename, alias38044: __typename, alias38045: __typename, alias38046: __typename, alias38047: __typename, alias38048: __typename, alias38049: __typename, alias38050: __typename, alias38051: __typename, alias38052: __typename, alias38053: __typename, alias38054: __typename, alias38055: __typename, alias38056: __typename, alias38057: __typename, alias38058: __typename, alias38059: __typename, alias38060: __typename, alias38061: __typename, alias38062: __typename, alias38063: __typename, alias38064: __typename, alias38065: __typename, alias38066: __typename, alias38067: __typename, alias38068: __typename, alias38069: __typename, alias38070: __typename, alias38071: __typename, alias38072: __typename, alias38073: __typename, alias38074: __typename, alias38075: __typename, alias38076: __typename, alias38077: __typename, alias38078: __typename, alias38079: __typename, alias38080: __typename, alias38081: __typename, alias38082: __typename, alias38083: __typename, alias38084: __typename, alias38085: __typename, alias38086: __typename, alias38087: __typename, alias38088: __typename, alias38089: __typename, alias38090: __typename, alias38091: __typename, alias38092: __typename, alias38093: __typename, alias38094: __typename, alias38095: __typename, alias38096: __typename, alias38097: __typename, alias38098: __typename, alias38099: __typename, alias38100: __typename, alias38101: __typename, alias38102: __typename, alias38103: __typename, alias38104: __typename, alias38105: __typename, alias38106: __typename, alias38107: __typename, alias38108: __typename, alias38109: __typename, alias38110: __typename, alias38111: __typename, alias38112: __typename, alias38113: __typename, alias38114: __typename, alias38115: __typename, alias38116: __typename, alias38117: __typename, alias38118: __typename, alias38119: __typename, alias38120: __typename, alias38121: __typename, alias38122: __typename, alias38123: __typename, alias38124: __typename, alias38125: __typename, alias38126: __typename, alias38127: __typename, alias38128: __typename, alias38129: __typename, alias38130: __typename, alias38131: __typename, alias38132: __typename, alias38133: __typename, alias38134: __typename, alias38135: __typename, alias38136: __typename, alias38137: __typename, alias38138: __typename, alias38139: __typename, alias38140: __typename, alias38141: __typename, alias38142: __typename, alias38143: __typename, alias38144: __typename, alias38145: __typename, alias38146: __typename, alias38147: __typename, alias38148: __typename, alias38149: __typename, alias38150: __typename, alias38151: __typename, alias38152: __typename, alias38153: __typename, alias38154: __typename, alias38155: __typename, alias38156: __typename, alias38157: __typename, alias38158: __typename, alias38159: __typename, alias38160: __typename, alias38161: __typename, alias38162: __typename, alias38163: __typename, alias38164: __typename, alias38165: __typename, alias38166: __typename, alias38167: __typename, alias38168: __typename, alias38169: __typename, alias38170: __typename, alias38171: __typename, alias38172: __typename, alias38173: __typename, alias38174: __typename, alias38175: __typename, alias38176: __typename, alias38177: __typename, alias38178: __typename, alias38179: __typename, alias38180: __typename, alias38181: __typename, alias38182: __typename, alias38183: __typename, alias38184: __typename, alias38185: __typename, alias38186: __typename, alias38187: __typename, alias38188: __typename, alias38189: __typename, alias38190: __typename, alias38191: __typename, alias38192: __typename, alias38193: __typename, alias38194: __typename, alias38195: __typename, alias38196: __typename, alias38197: __typename, alias38198: __typename, alias38199: __typename, alias38200: __typename, alias38201: __typename, alias38202: __typename, alias38203: __typename, alias38204: __typename, alias38205: __typename, alias38206: __typename, alias38207: __typename, alias38208: __typename, alias38209: __typename, alias38210: __typename, alias38211: __typename, alias38212: __typename, alias38213: __typename, alias38214: __typename, alias38215: __typename, alias38216: __typename, alias38217: __typename, alias38218: __typename, alias38219: __typename, alias38220: __typename, alias38221: __typename, alias38222: __typename, alias38223: __typename, alias38224: __typename, alias38225: __typename, alias38226: __typename, alias38227: __typename, alias38228: __typename, alias38229: __typename, alias38230: __typename, alias38231: __typename, alias38232: __typename, alias38233: __typename, alias38234: __typename, alias38235: __typename, alias38236: __typename, alias38237: __typename, alias38238: __typename, alias38239: __typename, alias38240: __typename, alias38241: __typename, alias38242: __typename, alias38243: __typename, alias38244: __typename, alias38245: __typename, alias38246: __typename, alias38247: __typename, alias38248: __typename, alias38249: __typename, alias38250: __typename, alias38251: __typename, alias38252: __typename, alias38253: __typename, alias38254: __typename, alias38255: __typename, alias38256: __typename, alias38257: __typename, alias38258: __typename, alias38259: __typename, alias38260: __typename, alias38261: __typename, alias38262: __typename, alias38263: __typename, alias38264: __typename, alias38265: __typename, alias38266: __typename, alias38267: __typename, alias38268: __typename, alias38269: __typename, alias38270: __typename, alias38271: __typename, alias38272: __typename, alias38273: __typename, alias38274: __typename, alias38275: __typename, alias38276: __typename, alias38277: __typename, alias38278: __typename, alias38279: __typename, alias38280: __typename, alias38281: __typename, alias38282: __typename, alias38283: __typename, alias38284: __typename, alias38285: __typename, alias38286: __typename, alias38287: __typename, alias38288: __typename, alias38289: __typename, alias38290: __typename, alias38291: __typename, alias38292: __typename, alias38293: __typename, alias38294: __typename, alias38295: __typename, alias38296: __typename, alias38297: __typename, alias38298: __typename, alias38299: __typename, alias38300: __typename, alias38301: __typename, alias38302: __typename, alias38303: __typename, alias38304: __typename, alias38305: __typename, alias38306: __typename, alias38307: __typename, alias38308: __typename, alias38309: __typename, alias38310: __typename, alias38311: __typename, alias38312: __typename, alias38313: __typename, alias38314: __typename, alias38315: __typename, alias38316: __typename, alias38317: __typename, alias38318: __typename, alias38319: __typename, alias38320: __typename, alias38321: __typename, alias38322: __typename, alias38323: __typename, alias38324: __typename, alias38325: __typename, alias38326: __typename, alias38327: __typename, alias38328: __typename, alias38329: __typename, alias38330: __typename, alias38331: __typename, alias38332: __typename, alias38333: __typename, alias38334: __typename, alias38335: __typename, alias38336: __typename, alias38337: __typename, alias38338: __typename, alias38339: __typename, alias38340: __typename, alias38341: __typename, alias38342: __typename, alias38343: __typename, alias38344: __typename, alias38345: __typename, alias38346: __typename, alias38347: __typename, alias38348: __typename, alias38349: __typename, alias38350: __typename, alias38351: __typename, alias38352: __typename, alias38353: __typename, alias38354: __typename, alias38355: __typename, alias38356: __typename, alias38357: __typename, alias38358: __typename, alias38359: __typename, alias38360: __typename, alias38361: __typename, alias38362: __typename, alias38363: __typename, alias38364: __typename, alias38365: __typename, alias38366: __typename, alias38367: __typename, alias38368: __typename, alias38369: __typename, alias38370: __typename, alias38371: __typename, alias38372: __typename, alias38373: __typename, alias38374: __typename, alias38375: __typename, alias38376: __typename, alias38377: __typename, alias38378: __typename, alias38379: __typename, alias38380: __typename, alias38381: __typename, alias38382: __typename, alias38383: __typename, alias38384: __typename, alias38385: __typename, alias38386: __typename, alias38387: __typename, alias38388: __typename, alias38389: __typename, alias38390: __typename, alias38391: __typename, alias38392: __typename, alias38393: __typename, alias38394: __typename, alias38395: __typename, alias38396: __typename, alias38397: __typename, alias38398: __typename, alias38399: __typename, alias38400: __typename, alias38401: __typename, alias38402: __typename, alias38403: __typename, alias38404: __typename, alias38405: __typename, alias38406: __typename, alias38407: __typename, alias38408: __typename, alias38409: __typename, alias38410: __typename, alias38411: __typename, alias38412: __typename, alias38413: __typename, alias38414: __typename, alias38415: __typename, alias38416: __typename, alias38417: __typename, alias38418: __typename, alias38419: __typename, alias38420: __typename, alias38421: __typename, alias38422: __typename, alias38423: __typename, alias38424: __typename, alias38425: __typename, alias38426: __typename, alias38427: __typename, alias38428: __typename, alias38429: __typename, alias38430: __typename, alias38431: __typename, alias38432: __typename, alias38433: __typename, alias38434: __typename, alias38435: __typename, alias38436: __typename, alias38437: __typename, alias38438: __typename, alias38439: __typename, alias38440: __typename, alias38441: __typename, alias38442: __typename, alias38443: __typename, alias38444: __typename, alias38445: __typename, alias38446: __typename, alias38447: __typename, alias38448: __typename, alias38449: __typename, alias38450: __typename, alias38451: __typename, alias38452: __typename, alias38453: __typename, alias38454: __typename, alias38455: __typename, alias38456: __typename, alias38457: __typename, alias38458: __typename, alias38459: __typename, alias38460: __typename, alias38461: __typename, alias38462: __typename, alias38463: __typename, alias38464: __typename, alias38465: __typename, alias38466: __typename, alias38467: __typename, alias38468: __typename, alias38469: __typename, alias38470: __typename, alias38471: __typename, alias38472: __typename, alias38473: __typename, alias38474: __typename, alias38475: __typename, alias38476: __typename, alias38477: __typename, alias38478: __typename, alias38479: __typename, alias38480: __typename, alias38481: __typename, alias38482: __typename, alias38483: __typename, alias38484: __typename, alias38485: __typename, alias38486: __typename, alias38487: __typename, alias38488: __typename, alias38489: __typename, alias38490: __typename, alias38491: __typename, alias38492: __typename, alias38493: __typename, alias38494: __typename, alias38495: __typename, alias38496: __typename, alias38497: __typename, alias38498: __typename, alias38499: __typename, alias38500: __typename, alias38501: __typename, alias38502: __typename, alias38503: __typename, alias38504: __typename, alias38505: __typename, alias38506: __typename, alias38507: __typename, alias38508: __typename, alias38509: __typename, alias38510: __typename, alias38511: __typename, alias38512: __typename, alias38513: __typename, alias38514: __typename, alias38515: __typename, alias38516: __typename, alias38517: __typename, alias38518: __typename, alias38519: __typename, alias38520: __typename, alias38521: __typename, alias38522: __typename, alias38523: __typename, alias38524: __typename, alias38525: __typename, alias38526: __typename, alias38527: __typename, alias38528: __typename, alias38529: __typename, alias38530: __typename, alias38531: __typename, alias38532: __typename, alias38533: __typename, alias38534: __typename, alias38535: __typename, alias38536: __typename, alias38537: __typename, alias38538: __typename, alias38539: __typename, alias38540: __typename, alias38541: __typename, alias38542: __typename, alias38543: __typename, alias38544: __typename, alias38545: __typename, alias38546: __typename, alias38547: __typename, alias38548: __typename, alias38549: __typename, alias38550: __typename, alias38551: __typename, alias38552: __typename, alias38553: __typename, alias38554: __typename, alias38555: __typename, alias38556: __typename, alias38557: __typename, alias38558: __typename, alias38559: __typename, alias38560: __typename, alias38561: __typename, alias38562: __typename, alias38563: __typename, alias38564: __typename, alias38565: __typename, alias38566: __typename, alias38567: __typename, alias38568: __typename, alias38569: __typename, alias38570: __typename, alias38571: __typename, alias38572: __typename, alias38573: __typename, alias38574: __typename, alias38575: __typename, alias38576: __typename, alias38577: __typename, alias38578: __typename, alias38579: __typename, alias38580: __typename, alias38581: __typename, alias38582: __typename, alias38583: __typename, alias38584: __typename, alias38585: __typename, alias38586: __typename, alias38587: __typename, alias38588: __typename, alias38589: __typename, alias38590: __typename, alias38591: __typename, alias38592: __typename, alias38593: __typename, alias38594: __typename, alias38595: __typename, alias38596: __typename, alias38597: __typename, alias38598: __typename, alias38599: __typename, alias38600: __typename, alias38601: __typename, alias38602: __typename, alias38603: __typename, alias38604: __typename, alias38605: __typename, alias38606: __typename, alias38607: __typename, alias38608: __typename, alias38609: __typename, alias38610: __typename, alias38611: __typename, alias38612: __typename, alias38613: __typename, alias38614: __typename, alias38615: __typename, alias38616: __typename, alias38617: __typename, alias38618: __typename, alias38619: __typename, alias38620: __typename, alias38621: __typename, alias38622: __typename, alias38623: __typename, alias38624: __typename, alias38625: __typename, alias38626: __typename, alias38627: __typename, alias38628: __typename, alias38629: __typename, alias38630: __typename, alias38631: __typename, alias38632: __typename, alias38633: __typename, alias38634: __typename, alias38635: __typename, alias38636: __typename, alias38637: __typename, alias38638: __typename, alias38639: __typename, alias38640: __typename, alias38641: __typename, alias38642: __typename, alias38643: __typename, alias38644: __typename, alias38645: __typename, alias38646: __typename, alias38647: __typename, alias38648: __typename, alias38649: __typename, alias38650: __typename, alias38651: __typename, alias38652: __typename, alias38653: __typename, alias38654: __typename, alias38655: __typename, alias38656: __typename, alias38657: __typename, alias38658: __typename, alias38659: __typename, alias38660: __typename, alias38661: __typename, alias38662: __typename, alias38663: __typename, alias38664: __typename, alias38665: __typename, alias38666: __typename, alias38667: __typename, alias38668: __typename, alias38669: __typename, alias38670: __typename, alias38671: __typename, alias38672: __typename, alias38673: __typename, alias38674: __typename, alias38675: __typename, alias38676: __typename, alias38677: __typename, alias38678: __typename, alias38679: __typename, alias38680: __typename, alias38681: __typename, alias38682: __typename, alias38683: __typename, alias38684: __typename, alias38685: __typename, alias38686: __typename, alias38687: __typename, alias38688: __typename, alias38689: __typename, alias38690: __typename, alias38691: __typename, alias38692: __typename, alias38693: __typename, alias38694: __typename, alias38695: __typename, alias38696: __typename, alias38697: __typename, alias38698: __typename, alias38699: __typename, alias38700: __typename, alias38701: __typename, alias38702: __typename, alias38703: __typename, alias38704: __typename, alias38705: __typename, alias38706: __typename, alias38707: __typename, alias38708: __typename, alias38709: __typename, alias38710: __typename, alias38711: __typename, alias38712: __typename, alias38713: __typename, alias38714: __typename, alias38715: __typename, alias38716: __typename, alias38717: __typename, alias38718: __typename, alias38719: __typename, alias38720: __typename, alias38721: __typename, alias38722: __typename, alias38723: __typename, alias38724: __typename, alias38725: __typename, alias38726: __typename, alias38727: __typename, alias38728: __typename, alias38729: __typename, alias38730: __typename, alias38731: __typename, alias38732: __typename, alias38733: __typename, alias38734: __typename, alias38735: __typename, alias38736: __typename, alias38737: __typename, alias38738: __typename, alias38739: __typename, alias38740: __typename, alias38741: __typename, alias38742: __typename, alias38743: __typename, alias38744: __typename, alias38745: __typename, alias38746: __typename, alias38747: __typename, alias38748: __typename, alias38749: __typename, alias38750: __typename, alias38751: __typename, alias38752: __typename, alias38753: __typename, alias38754: __typename, alias38755: __typename, alias38756: __typename, alias38757: __typename, alias38758: __typename, alias38759: __typename, alias38760: __typename, alias38761: __typename, alias38762: __typename, alias38763: __typename, alias38764: __typename, alias38765: __typename, alias38766: __typename, alias38767: __typename, alias38768: __typename, alias38769: __typename, alias38770: __typename, alias38771: __typename, alias38772: __typename, alias38773: __typename, alias38774: __typename, alias38775: __typename, alias38776: __typename, alias38777: __typename, alias38778: __typename, alias38779: __typename, alias38780: __typename, alias38781: __typename, alias38782: __typename, alias38783: __typename, alias38784: __typename, alias38785: __typename, alias38786: __typename, alias38787: __typename, alias38788: __typename, alias38789: __typename, alias38790: __typename, alias38791: __typename, alias38792: __typename, alias38793: __typename, alias38794: __typename, alias38795: __typename, alias38796: __typename, alias38797: __typename, alias38798: __typename, alias38799: __typename, alias38800: __typename, alias38801: __typename, alias38802: __typename, alias38803: __typename, alias38804: __typename, alias38805: __typename, alias38806: __typename, alias38807: __typename, alias38808: __typename, alias38809: __typename, alias38810: __typename, alias38811: __typename, alias38812: __typename, alias38813: __typename, alias38814: __typename, alias38815: __typename, alias38816: __typename, alias38817: __typename, alias38818: __typename, alias38819: __typename, alias38820: __typename, alias38821: __typename, alias38822: __typename, alias38823: __typename, alias38824: __typename, alias38825: __typename, alias38826: __typename, alias38827: __typename, alias38828: __typename, alias38829: __typename, alias38830: __typename, alias38831: __typename, alias38832: __typename, alias38833: __typename, alias38834: __typename, alias38835: __typename, alias38836: __typename, alias38837: __typename, alias38838: __typename, alias38839: __typename, alias38840: __typename, alias38841: __typename, alias38842: __typename, alias38843: __typename, alias38844: __typename, alias38845: __typename, alias38846: __typename, alias38847: __typename, alias38848: __typename, alias38849: __typename, alias38850: __typename, alias38851: __typename, alias38852: __typename, alias38853: __typename, alias38854: __typename, alias38855: __typename, alias38856: __typename, alias38857: __typename, alias38858: __typename, alias38859: __typename, alias38860: __typename, alias38861: __typename, alias38862: __typename, alias38863: __typename, alias38864: __typename, alias38865: __typename, alias38866: __typename, alias38867: __typename, alias38868: __typename, alias38869: __typename, alias38870: __typename, alias38871: __typename, alias38872: __typename, alias38873: __typename, alias38874: __typename, alias38875: __typename, alias38876: __typename, alias38877: __typename, alias38878: __typename, alias38879: __typename, alias38880: __typename, alias38881: __typename, alias38882: __typename, alias38883: __typename, alias38884: __typename, alias38885: __typename, alias38886: __typename, alias38887: __typename, alias38888: __typename, alias38889: __typename, alias38890: __typename, alias38891: __typename, alias38892: __typename, alias38893: __typename, alias38894: __typename, alias38895: __typename, alias38896: __typename, alias38897: __typename, alias38898: __typename, alias38899: __typename, alias38900: __typename, alias38901: __typename, alias38902: __typename, alias38903: __typename, alias38904: __typename, alias38905: __typename, alias38906: __typename, alias38907: __typename, alias38908: __typename, alias38909: __typename, alias38910: __typename, alias38911: __typename, alias38912: __typename, alias38913: __typename, alias38914: __typename, alias38915: __typename, alias38916: __typename, alias38917: __typename, alias38918: __typename, alias38919: __typename, alias38920: __typename, alias38921: __typename, alias38922: __typename, alias38923: __typename, alias38924: __typename, alias38925: __typename, alias38926: __typename, alias38927: __typename, alias38928: __typename, alias38929: __typename, alias38930: __typename, alias38931: __typename, alias38932: __typename, alias38933: __typename, alias38934: __typename, alias38935: __typename, alias38936: __typename, alias38937: __typename, alias38938: __typename, alias38939: __typename, alias38940: __typename, alias38941: __typename, alias38942: __typename, alias38943: __typename, alias38944: __typename, alias38945: __typename, alias38946: __typename, alias38947: __typename, alias38948: __typename, alias38949: __typename, alias38950: __typename, alias38951: __typename, alias38952: __typename, alias38953: __typename, alias38954: __typename, alias38955: __typename, alias38956: __typename, alias38957: __typename, alias38958: __typename, alias38959: __typename, alias38960: __typename, alias38961: __typename, alias38962: __typename, alias38963: __typename, alias38964: __typename, alias38965: __typename, alias38966: __typename, alias38967: __typename, alias38968: __typename, alias38969: __typename, alias38970: __typename, alias38971: __typename, alias38972: __typename, alias38973: __typename, alias38974: __typename, alias38975: __typename, alias38976: __typename, alias38977: __typename, alias38978: __typename, alias38979: __typename, alias38980: __typename, alias38981: __typename, alias38982: __typename, alias38983: __typename, alias38984: __typename, alias38985: __typename, alias38986: __typename, alias38987: __typename, alias38988: __typename, alias38989: __typename, alias38990: __typename, alias38991: __typename, alias38992: __typename, alias38993: __typename, alias38994: __typename, alias38995: __typename, alias38996: __typename, alias38997: __typename, alias38998: __typename, alias38999: __typename, alias39000: __typename, alias39001: __typename, alias39002: __typename, alias39003: __typename, alias39004: __typename, alias39005: __typename, alias39006: __typename, alias39007: __typename, alias39008: __typename, alias39009: __typename, alias39010: __typename, alias39011: __typename, alias39012: __typename, alias39013: __typename, alias39014: __typename, alias39015: __typename, alias39016: __typename, alias39017: __typename, alias39018: __typename, alias39019: __typename, alias39020: __typename, alias39021: __typename, alias39022: __typename, alias39023: __typename, alias39024: __typename, alias39025: __typename, alias39026: __typename, alias39027: __typename, alias39028: __typename, alias39029: __typename, alias39030: __typename, alias39031: __typename, alias39032: __typename, alias39033: __typename, alias39034: __typename, alias39035: __typename, alias39036: __typename, alias39037: __typename, alias39038: __typename, alias39039: __typename, alias39040: __typename, alias39041: __typename, alias39042: __typename, alias39043: __typename, alias39044: __typename, alias39045: __typename, alias39046: __typename, alias39047: __typename, alias39048: __typename, alias39049: __typename, alias39050: __typename, alias39051: __typename, alias39052: __typename, alias39053: __typename, alias39054: __typename, alias39055: __typename, alias39056: __typename, alias39057: __typename, alias39058: __typename, alias39059: __typename, alias39060: __typename, alias39061: __typename, alias39062: __typename, alias39063: __typename, alias39064: __typename, alias39065: __typename, alias39066: __typename, alias39067: __typename, alias39068: __typename, alias39069: __typename, alias39070: __typename, alias39071: __typename, alias39072: __typename, alias39073: __typename, alias39074: __typename, alias39075: __typename, alias39076: __typename, alias39077: __typename, alias39078: __typename, alias39079: __typename, alias39080: __typename, alias39081: __typename, alias39082: __typename, alias39083: __typename, alias39084: __typename, alias39085: __typename, alias39086: __typename, alias39087: __typename, alias39088: __typename, alias39089: __typename, alias39090: __typename, alias39091: __typename, alias39092: __typename, alias39093: __typename, alias39094: __typename, alias39095: __typename, alias39096: __typename, alias39097: __typename, alias39098: __typename, alias39099: __typename, alias39100: __typename, alias39101: __typename, alias39102: __typename, alias39103: __typename, alias39104: __typename, alias39105: __typename, alias39106: __typename, alias39107: __typename, alias39108: __typename, alias39109: __typename, alias39110: __typename, alias39111: __typename, alias39112: __typename, alias39113: __typename, alias39114: __typename, alias39115: __typename, alias39116: __typename, alias39117: __typename, alias39118: __typename, alias39119: __typename, alias39120: __typename, alias39121: __typename, alias39122: __typename, alias39123: __typename, alias39124: __typename, alias39125: __typename, alias39126: __typename, alias39127: __typename, alias39128: __typename, alias39129: __typename, alias39130: __typename, alias39131: __typename, alias39132: __typename, alias39133: __typename, alias39134: __typename, alias39135: __typename, alias39136: __typename, alias39137: __typename, alias39138: __typename, alias39139: __typename, alias39140: __typename, alias39141: __typename, alias39142: __typename, alias39143: __typename, alias39144: __typename, alias39145: __typename, alias39146: __typename, alias39147: __typename, alias39148: __typename, alias39149: __typename, alias39150: __typename, alias39151: __typename, alias39152: __typename, alias39153: __typename, alias39154: __typename, alias39155: __typename, alias39156: __typename, alias39157: __typename, alias39158: __typename, alias39159: __typename, alias39160: __typename, alias39161: __typename, alias39162: __typename, alias39163: __typename, alias39164: __typename, alias39165: __typename, alias39166: __typename, alias39167: __typename, alias39168: __typename, alias39169: __typename, alias39170: __typename, alias39171: __typename, alias39172: __typename, alias39173: __typename, alias39174: __typename, alias39175: __typename, alias39176: __typename, alias39177: __typename, alias39178: __typename, alias39179: __typename, alias39180: __typename, alias39181: __typename, alias39182: __typename, alias39183: __typename, alias39184: __typename, alias39185: __typename, alias39186: __typename, alias39187: __typename, alias39188: __typename, alias39189: __typename, alias39190: __typename, alias39191: __typename, alias39192: __typename, alias39193: __typename, alias39194: __typename, alias39195: __typename, alias39196: __typename, alias39197: __typename, alias39198: __typename, alias39199: __typename, alias39200: __typename, alias39201: __typename, alias39202: __typename, alias39203: __typename, alias39204: __typename, alias39205: __typename, alias39206: __typename, alias39207: __typename, alias39208: __typename, alias39209: __typename, alias39210: __typename, alias39211: __typename, alias39212: __typename, alias39213: __typename, alias39214: __typename, alias39215: __typename, alias39216: __typename, alias39217: __typename, alias39218: __typename, alias39219: __typename, alias39220: __typename, alias39221: __typename, alias39222: __typename, alias39223: __typename, alias39224: __typename, alias39225: __typename, alias39226: __typename, alias39227: __typename, alias39228: __typename, alias39229: __typename, alias39230: __typename, alias39231: __typename, alias39232: __typename, alias39233: __typename, alias39234: __typename, alias39235: __typename, alias39236: __typename, alias39237: __typename, alias39238: __typename, alias39239: __typename, alias39240: __typename, alias39241: __typename, alias39242: __typename, alias39243: __typename, alias39244: __typename, alias39245: __typename, alias39246: __typename, alias39247: __typename, alias39248: __typename, alias39249: __typename, alias39250: __typename, alias39251: __typename, alias39252: __typename, alias39253: __typename, alias39254: __typename, alias39255: __typename, alias39256: __typename, alias39257: __typename, alias39258: __typename, alias39259: __typename, alias39260: __typename, alias39261: __typename, alias39262: __typename, alias39263: __typename, alias39264: __typename, alias39265: __typename, alias39266: __typename, alias39267: __typename, alias39268: __typename, alias39269: __typename, alias39270: __typename, alias39271: __typename, alias39272: __typename, alias39273: __typename, alias39274: __typename, alias39275: __typename, alias39276: __typename, alias39277: __typename, alias39278: __typename, alias39279: __typename, alias39280: __typename, alias39281: __typename, alias39282: __typename, alias39283: __typename, alias39284: __typename, alias39285: __typename, alias39286: __typename, alias39287: __typename, alias39288: __typename, alias39289: __typename, alias39290: __typename, alias39291: __typename, alias39292: __typename, alias39293: __typename, alias39294: __typename, alias39295: __typename, alias39296: __typename, alias39297: __typename, alias39298: __typename, alias39299: __typename, alias39300: __typename, alias39301: __typename, alias39302: __typename, alias39303: __typename, alias39304: __typename, alias39305: __typename, alias39306: __typename, alias39307: __typename, alias39308: __typename, alias39309: __typename, alias39310: __typename, alias39311: __typename, alias39312: __typename, alias39313: __typename, alias39314: __typename, alias39315: __typename, alias39316: __typename, alias39317: __typename, alias39318: __typename, alias39319: __typename, alias39320: __typename, alias39321: __typename, alias39322: __typename, alias39323: __typename, alias39324: __typename, alias39325: __typename, alias39326: __typename, alias39327: __typename, alias39328: __typename, alias39329: __typename, alias39330: __typename, alias39331: __typename, alias39332: __typename, alias39333: __typename, alias39334: __typename, alias39335: __typename, alias39336: __typename, alias39337: __typename, alias39338: __typename, alias39339: __typename, alias39340: __typename, alias39341: __typename, alias39342: __typename, alias39343: __typename, alias39344: __typename, alias39345: __typename, alias39346: __typename, alias39347: __typename, alias39348: __typename, alias39349: __typename, alias39350: __typename, alias39351: __typename, alias39352: __typename, alias39353: __typename, alias39354: __typename, alias39355: __typename, alias39356: __typename, alias39357: __typename, alias39358: __typename, alias39359: __typename, alias39360: __typename, alias39361: __typename, alias39362: __typename, alias39363: __typename, alias39364: __typename, alias39365: __typename, alias39366: __typename, alias39367: __typename, alias39368: __typename, alias39369: __typename, alias39370: __typename, alias39371: __typename, alias39372: __typename, alias39373: __typename, alias39374: __typename, alias39375: __typename, alias39376: __typename, alias39377: __typename, alias39378: __typename, alias39379: __typename, alias39380: __typename, alias39381: __typename, alias39382: __typename, alias39383: __typename, alias39384: __typename, alias39385: __typename, alias39386: __typename, alias39387: __typename, alias39388: __typename, alias39389: __typename, alias39390: __typename, alias39391: __typename, alias39392: __typename, alias39393: __typename, alias39394: __typename, alias39395: __typename, alias39396: __typename, alias39397: __typename, alias39398: __typename, alias39399: __typename, alias39400: __typename, alias39401: __typename, alias39402: __typename, alias39403: __typename, alias39404: __typename, alias39405: __typename, alias39406: __typename, alias39407: __typename, alias39408: __typename, alias39409: __typename, alias39410: __typename, alias39411: __typename, alias39412: __typename, alias39413: __typename, alias39414: __typename, alias39415: __typename, alias39416: __typename, alias39417: __typename, alias39418: __typename, alias39419: __typename, alias39420: __typename, alias39421: __typename, alias39422: __typename, alias39423: __typename, alias39424: __typename, alias39425: __typename, alias39426: __typename, alias39427: __typename, alias39428: __typename, alias39429: __typename, alias39430: __typename, alias39431: __typename, alias39432: __typename, alias39433: __typename, alias39434: __typename, alias39435: __typename, alias39436: __typename, alias39437: __typename, alias39438: __typename, alias39439: __typename, alias39440: __typename, alias39441: __typename, alias39442: __typename, alias39443: __typename, alias39444: __typename, alias39445: __typename, alias39446: __typename, alias39447: __typename, alias39448: __typename, alias39449: __typename, alias39450: __typename, alias39451: __typename, alias39452: __typename, alias39453: __typename, alias39454: __typename, alias39455: __typename, alias39456: __typename, alias39457: __typename, alias39458: __typename, alias39459: __typename, alias39460: __typename, alias39461: __typename, alias39462: __typename, alias39463: __typename, alias39464: __typename, alias39465: __typename, alias39466: __typename, alias39467: __typename, alias39468: __typename, alias39469: __typename, alias39470: __typename, alias39471: __typename, alias39472: __typename, alias39473: __typename, alias39474: __typename, alias39475: __typename, alias39476: __typename, alias39477: __typename, alias39478: __typename, alias39479: __typename, alias39480: __typename, alias39481: __typename, alias39482: __typename, alias39483: __typename, alias39484: __typename, alias39485: __typename, alias39486: __typename, alias39487: __typename, alias39488: __typename, alias39489: __typename, alias39490: __typename, alias39491: __typename, alias39492: __typename, alias39493: __typename, alias39494: __typename, alias39495: __typename, alias39496: __typename, alias39497: __typename, alias39498: __typename, alias39499: __typename, alias39500: __typename, alias39501: __typename, alias39502: __typename, alias39503: __typename, alias39504: __typename, alias39505: __typename, alias39506: __typename, alias39507: __typename, alias39508: __typename, alias39509: __typename, alias39510: __typename, alias39511: __typename, alias39512: __typename, alias39513: __typename, alias39514: __typename, alias39515: __typename, alias39516: __typename, alias39517: __typename, alias39518: __typename, alias39519: __typename, alias39520: __typename, alias39521: __typename, alias39522: __typename, alias39523: __typename, alias39524: __typename, alias39525: __typename, alias39526: __typename, alias39527: __typename, alias39528: __typename, alias39529: __typename, alias39530: __typename, alias39531: __typename, alias39532: __typename, alias39533: __typename, alias39534: __typename, alias39535: __typename, alias39536: __typename, alias39537: __typename, alias39538: __typename, alias39539: __typename, alias39540: __typename, alias39541: __typename, alias39542: __typename, alias39543: __typename, alias39544: __typename, alias39545: __typename, alias39546: __typename, alias39547: __typename, alias39548: __typename, alias39549: __typename, alias39550: __typename, alias39551: __typename, alias39552: __typename, alias39553: __typename, alias39554: __typename, alias39555: __typename, alias39556: __typename, alias39557: __typename, alias39558: __typename, alias39559: __typename, alias39560: __typename, alias39561: __typename, alias39562: __typename, alias39563: __typename, alias39564: __typename, alias39565: __typename, alias39566: __typename, alias39567: __typename, alias39568: __typename, alias39569: __typename, alias39570: __typename, alias39571: __typename, alias39572: __typename, alias39573: __typename, alias39574: __typename, alias39575: __typename, alias39576: __typename, alias39577: __typename, alias39578: __typename, alias39579: __typename, alias39580: __typename, alias39581: __typename, alias39582: __typename, alias39583: __typename, alias39584: __typename, alias39585: __typename, alias39586: __typename, alias39587: __typename, alias39588: __typename, alias39589: __typename, alias39590: __typename, alias39591: __typename, alias39592: __typename, alias39593: __typename, alias39594: __typename, alias39595: __typename, alias39596: __typename, alias39597: __typename, alias39598: __typename, alias39599: __typename, alias39600: __typename, alias39601: __typename, alias39602: __typename, alias39603: __typename, alias39604: __typename, alias39605: __typename, alias39606: __typename, alias39607: __typename, alias39608: __typename, alias39609: __typename, alias39610: __typename, alias39611: __typename, alias39612: __typename, alias39613: __typename, alias39614: __typename, alias39615: __typename, alias39616: __typename, alias39617: __typename, alias39618: __typename, alias39619: __typename, alias39620: __typename, alias39621: __typename, alias39622: __typename, alias39623: __typename, alias39624: __typename, alias39625: __typename, alias39626: __typename, alias39627: __typename, alias39628: __typename, alias39629: __typename, alias39630: __typename, alias39631: __typename, alias39632: __typename, alias39633: __typename, alias39634: __typename, alias39635: __typename, alias39636: __typename, alias39637: __typename, alias39638: __typename, alias39639: __typename, alias39640: __typename, alias39641: __typename, alias39642: __typename, alias39643: __typename, alias39644: __typename, alias39645: __typename, alias39646: __typename, alias39647: __typename, alias39648: __typename, alias39649: __typename, alias39650: __typename, alias39651: __typename, alias39652: __typename, alias39653: __typename, alias39654: __typename, alias39655: __typename, alias39656: __typename, alias39657: __typename, alias39658: __typename, alias39659: __typename, alias39660: __typename, alias39661: __typename, alias39662: __typename, alias39663: __typename, alias39664: __typename, alias39665: __typename, alias39666: __typename, alias39667: __typename, alias39668: __typename, alias39669: __typename, alias39670: __typename, alias39671: __typename, alias39672: __typename, alias39673: __typename, alias39674: __typename, alias39675: __typename, alias39676: __typename, alias39677: __typename, alias39678: __typename, alias39679: __typename, alias39680: __typename, alias39681: __typename, alias39682: __typename, alias39683: __typename, alias39684: __typename, alias39685: __typename, alias39686: __typename, alias39687: __typename, alias39688: __typename, alias39689: __typename, alias39690: __typename, alias39691: __typename, alias39692: __typename, alias39693: __typename, alias39694: __typename, alias39695: __typename, alias39696: __typename, alias39697: __typename, alias39698: __typename, alias39699: __typename, alias39700: __typename, alias39701: __typename, alias39702: __typename, alias39703: __typename, alias39704: __typename, alias39705: __typename, alias39706: __typename, alias39707: __typename, alias39708: __typename, alias39709: __typename, alias39710: __typename, alias39711: __typename, alias39712: __typename, alias39713: __typename, alias39714: __typename, alias39715: __typename, alias39716: __typename, alias39717: __typename, alias39718: __typename, alias39719: __typename, alias39720: __typename, alias39721: __typename, alias39722: __typename, alias39723: __typename, alias39724: __typename, alias39725: __typename, alias39726: __typename, alias39727: __typename, alias39728: __typename, alias39729: __typename, alias39730: __typename, alias39731: __typename, alias39732: __typename, alias39733: __typename, alias39734: __typename, alias39735: __typename, alias39736: __typename, alias39737: __typename, alias39738: __typename, alias39739: __typename, alias39740: __typename, alias39741: __typename, alias39742: __typename, alias39743: __typename, alias39744: __typename, alias39745: __typename, alias39746: __typename, alias39747: __typename, alias39748: __typename, alias39749: __typename, alias39750: __typename, alias39751: __typename, alias39752: __typename, alias39753: __typename, alias39754: __typename, alias39755: __typename, alias39756: __typename, alias39757: __typename, alias39758: __typename, alias39759: __typename, alias39760: __typename, alias39761: __typename, alias39762: __typename, alias39763: __typename, alias39764: __typename, alias39765: __typename, alias39766: __typename, alias39767: __typename, alias39768: __typename, alias39769: __typename, alias39770: __typename, alias39771: __typename, alias39772: __typename, alias39773: __typename, alias39774: __typename, alias39775: __typename, alias39776: __typename, alias39777: __typename, alias39778: __typename, alias39779: __typename, alias39780: __typename, alias39781: __typename, alias39782: __typename, alias39783: __typename, alias39784: __typename, alias39785: __typename, alias39786: __typename, alias39787: __typename, alias39788: __typename, alias39789: __typename, alias39790: __typename, alias39791: __typename, alias39792: __typename, alias39793: __typename, alias39794: __typename, alias39795: __typename, alias39796: __typename, alias39797: __typename, alias39798: __typename, alias39799: __typename, alias39800: __typename, alias39801: __typename, alias39802: __typename, alias39803: __typename, alias39804: __typename, alias39805: __typename, alias39806: __typename, alias39807: __typename, alias39808: __typename, alias39809: __typename, alias39810: __typename, alias39811: __typename, alias39812: __typename, alias39813: __typename, alias39814: __typename, alias39815: __typename, alias39816: __typename, alias39817: __typename, alias39818: __typename, alias39819: __typename, alias39820: __typename, alias39821: __typename, alias39822: __typename, alias39823: __typename, alias39824: __typename, alias39825: __typename, alias39826: __typename, alias39827: __typename, alias39828: __typename, alias39829: __typename, alias39830: __typename, alias39831: __typename, alias39832: __typename, alias39833: __typename, alias39834: __typename, alias39835: __typename, alias39836: __typename, alias39837: __typename, alias39838: __typename, alias39839: __typename, alias39840: __typename, alias39841: __typename, alias39842: __typename, alias39843: __typename, alias39844: __typename, alias39845: __typename, alias39846: __typename, alias39847: __typename, alias39848: __typename, alias39849: __typename, alias39850: __typename, alias39851: __typename, alias39852: __typename, alias39853: __typename, alias39854: __typename, alias39855: __typename, alias39856: __typename, alias39857: __typename, alias39858: __typename, alias39859: __typename, alias39860: __typename, alias39861: __typename, alias39862: __typename, alias39863: __typename, alias39864: __typename, alias39865: __typename, alias39866: __typename, alias39867: __typename, alias39868: __typename, alias39869: __typename, alias39870: __typename, alias39871: __typename, alias39872: __typename, alias39873: __typename, alias39874: __typename, alias39875: __typename, alias39876: __typename, alias39877: __typename, alias39878: __typename, alias39879: __typename, alias39880: __typename, alias39881: __typename, alias39882: __typename, alias39883: __typename, alias39884: __typename, alias39885: __typename, alias39886: __typename, alias39887: __typename, alias39888: __typename, alias39889: __typename, alias39890: __typename, alias39891: __typename, alias39892: __typename, alias39893: __typename, alias39894: __typename, alias39895: __typename, alias39896: __typename, alias39897: __typename, alias39898: __typename, alias39899: __typename, alias39900: __typename, alias39901: __typename, alias39902: __typename, alias39903: __typename, alias39904: __typename, alias39905: __typename, alias39906: __typename, alias39907: __typename, alias39908: __typename, alias39909: __typename, alias39910: __typename, alias39911: __typename, alias39912: __typename, alias39913: __typename, alias39914: __typename, alias39915: __typename, alias39916: __typename, alias39917: __typename, alias39918: __typename, alias39919: __typename, alias39920: __typename, alias39921: __typename, alias39922: __typename, alias39923: __typename, alias39924: __typename, alias39925: __typename, alias39926: __typename, alias39927: __typename, alias39928: __typename, alias39929: __typename, alias39930: __typename, alias39931: __typename, alias39932: __typename, alias39933: __typename, alias39934: __typename, alias39935: __typename, alias39936: __typename, alias39937: __typename, alias39938: __typename, alias39939: __typename, alias39940: __typename, alias39941: __typename, alias39942: __typename, alias39943: __typename, alias39944: __typename, alias39945: __typename, alias39946: __typename, alias39947: __typename, alias39948: __typename, alias39949: __typename, alias39950: __typename, alias39951: __typename, alias39952: __typename, alias39953: __typename, alias39954: __typename, alias39955: __typename, alias39956: __typename, alias39957: __typename, alias39958: __typename, alias39959: __typename, alias39960: __typename, alias39961: __typename, alias39962: __typename, alias39963: __typename, alias39964: __typename, alias39965: __typename, alias39966: __typename, alias39967: __typename, alias39968: __typename, alias39969: __typename, alias39970: __typename, alias39971: __typename, alias39972: __typename, alias39973: __typename, alias39974: __typename, alias39975: __typename, alias39976: __typename, alias39977: __typename, alias39978: __typename, alias39979: __typename, alias39980: __typename, alias39981: __typename, alias39982: __typename, alias39983: __typename, alias39984: __typename, alias39985: __typename, alias39986: __typename, alias39987: __typename, alias39988: __typename, alias39989: __typename, alias39990: __typename, alias39991: __typename, alias39992: __typename, alias39993: __typename, alias39994: __typename, alias39995: __typename, alias39996: __typename, alias39997: __typename, alias39998: __typename, alias39999: __typename} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/kitchen-sink.graphql b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/kitchen-sink.graphql new file mode 100644 index 00000000000..2c28b8aacfa --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/kitchen-sink.graphql @@ -0,0 +1,63 @@ +# Copyright (c) 2015-present, Facebook, Inc. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +"Query description" +query queryName("$foo description" $foo: ComplexType, "$site description" $site: Site = MOBILE) { + whoever123is: node(id: [123, 456]) { + id , + ... on User @defer { + field2 { + id , + alias: field1(first:10, after:$foo,) @include(if: $foo) { + id, + ...frag + } + } + } + ... @skip(unless: $foo) { + id + } + ... { + id + } + } +} + +"Mutation description" +mutation likeStory { + like(story: 123) @defer { + story { + id + } + } +} + +"Subscription description" +subscription StoryLikeSubscription("$input description" $input: StoryLikeSubscribeInput) { + storyLikeSubscribe(input: $input) { + story { + likers { + count + } + likeSentence { + text + } + } + } +} + +"Fragment description" +fragment frag on Friend { + foo(size: $size, bar: $b, obj: {key: "value", block: """ + + block string uses \""" + + """}) +} + +{ + unnamed(truthy: true, falsey: false, nullish: null), + query +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/onegraph.graphql b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/onegraph.graphql new file mode 100644 index 00000000000..ec02799b290 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/onegraph.graphql @@ -0,0 +1,239529 @@ +input GitHubIssuesEventSubscriptionInput { + """The owner of the repo, the `octocat` in `octocat/Hello-World`.""" + repoOwner: String! + + """The name of the repo, the `Hello-World` in `octocat/Hello-World`.""" + repoName: String! +} + +"""Shallow version of the issue object when the issue has been deleted.""" +type GitHubIssuesEventSubscriptionDeletedIssue { + """""" + url: String + + """""" + repositoryUrl: String + + """""" + databaseId: Int! + + """""" + id: ID! + + """""" + number: Int! + + """""" + title: String + + """""" + state: String + + """""" + locked: Boolean + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + closedAt: String + + """""" + authorAssociation: String + + """""" + body: String +} + +type GitHubIssuesEventSubscriptionTitleChanges { + """The previous version of the title if the action was `EDITED`.""" + from: String +} + +type GitHubIssuesEventSubscriptionChanges { + """The changes to the title if the action was `EDITED`""" + title: GitHubIssuesEventSubscriptionTitleChanges + + """The changes to the body if the action was `EDITED`""" + body: GitHubIssuesEventSubscriptionBodyChanges +} + +"""The action that was performed that triggered an issues event.""" +enum GitHubIssuesEventSubscriptionActionEnum { + OPENED + EDITED + DELETED + PINNED + UNPINNED + CLOSED + REOPENED + ASSIGNED + UNASSIGNED + LABELED + UNLABELED + LOCKED + UNLOCKED + TRANSFERRED + MILESTONED + DEMILESTONED +} + +type GitHubIssuesEventSubscriptionPayload { + """The action that was performed.""" + action: GitHubIssuesEventSubscriptionActionEnum + + """The changes to the issue if the action was `EDITED`.""" + changes: GitHubIssuesEventSubscriptionChanges + + """The optional user who was assigned or unassigned from the issue.""" + assignee: GitHubUser + + """The optional label that was added or removed from the issue.""" + label: GitHubLabel + + """The issue itself.""" + issue: GitHubIssue + + """A shallow version of the issue, if the issue was deleted.""" + deletedIssue: GitHubIssuesEventSubscriptionDeletedIssue + + """The raw body of the event from GitHub in JSON format.""" + raw: JSON! + + """The repository for the event.""" + repository: GitHubRepository + + """The actor that triggered the event.""" + sender: GitHubActor +} + +input GitHubIssueCommentEventSubscriptionInput { + """The owner of the repo, the `octocat` in `octocat/Hello-World`.""" + repoOwner: String! + + """The name of the repo, the `Hello-World` in `octocat/Hello-World`.""" + repoName: String! +} + +""" +Shallow version of the comment object when the comment has been deleted. +""" +type GitHubIssuesEventSubscriptionDeletedIssueComment { + """""" + databaseId: Int! + + """""" + id: ID! + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + authorAssociation: String + + """""" + body: String +} + +type GitHubIssuesEventSubscriptionBodyChanges { + """The previous version of the body if the action was `EDITED`.""" + from: String +} + +type GitHubIssueCommentEventSubscriptionChanges { + """The changes to the body if the action was `EDITED`""" + body: GitHubIssuesEventSubscriptionBodyChanges +} + +"""The action that was performed that triggered an issue_comment event.""" +enum GitHubIssueCommentEventSubscriptionActionEnum { + CREATED + EDITED + DELETED +} + +type GitHubIssueCommentEventSubscriptionPayload { + """The action that was performed.""" + action: GitHubIssueCommentEventSubscriptionActionEnum + + """The changes to the issue if the action was `EDITED`.""" + changes: GitHubIssueCommentEventSubscriptionChanges + + """The issue the comment belongs to.""" + issue: GitHubIssue + + """ + The pull request the comment belongs to, if this is a comment on a pull request + """ + pullRequest: GitHubIssue + + """The comment itself.""" + comment: GitHubIssueComment + + """A shallow version of the comment, if the issue was deleted.""" + deletedComment: GitHubIssuesEventSubscriptionDeletedIssueComment + + """The raw body of the event from GitHub in JSON format.""" + raw: JSON! + + """The repository for the event.""" + repository: GitHubRepository + + """The actor that triggered the event.""" + sender: GitHubActor +} + +"""Namespace for GitHub subscriptions.""" +type GithubSubscriptionRoot { + """Subscribe to comments on issues.""" + issueCommentEvent(input: GitHubIssueCommentEventSubscriptionInput!): GitHubIssueCommentEventSubscriptionPayload! + + """Subscribe to issues.""" + issuesEvent(input: GitHubIssuesEventSubscriptionInput!): GitHubIssuesEventSubscriptionPayload! +} + +type SalesforceUserUpdatedSubscriptionPayload { + """The User that was updated.""" + user: SalesforceUser! +} + +type SalesforceUserUndeletedSubscriptionPayload { + """The User that was resurrected.""" + user: SalesforceUser! +} + +type SalesforceUserProvisioningRequestUpdatedSubscriptionPayload { + """The UserProvisioningRequest that was updated.""" + userProvisioningRequest: SalesforceUserProvisioningRequest! +} + +type SalesforceUserProvisioningRequestUndeletedSubscriptionPayload { + """The UserProvisioningRequest that was resurrected.""" + userProvisioningRequest: SalesforceUserProvisioningRequest! +} + +type SalesforceUserProvisioningRequestDeletedSubscriptionPayload { + """The UserProvisioningRequest that was deleted.""" + userProvisioningRequest: SalesforceUserProvisioningRequest! +} + +type SalesforceUserProvisioningRequestCreatedSubscriptionPayload { + """The UserProvisioningRequest that was created.""" + userProvisioningRequest: SalesforceUserProvisioningRequest! +} + +type SalesforceUserProvisioningLogUpdatedSubscriptionPayload { + """The UserProvisioningLog that was updated.""" + userProvisioningLog: SalesforceUserProvisioningLog! +} + +type SalesforceUserProvisioningLogUndeletedSubscriptionPayload { + """The UserProvisioningLog that was resurrected.""" + userProvisioningLog: SalesforceUserProvisioningLog! +} + +type SalesforceUserProvisioningLogDeletedSubscriptionPayload { + """The UserProvisioningLog that was deleted.""" + userProvisioningLog: SalesforceUserProvisioningLog! +} + +type SalesforceUserProvisioningLogCreatedSubscriptionPayload { + """The UserProvisioningLog that was created.""" + userProvisioningLog: SalesforceUserProvisioningLog! +} + +type SalesforceUserProvMockTargetUpdatedSubscriptionPayload { + """The UserProvMockTarget that was updated.""" + userProvMockTarget: SalesforceUserProvMockTarget! +} + +type SalesforceUserProvMockTargetUndeletedSubscriptionPayload { + """The UserProvMockTarget that was resurrected.""" + userProvMockTarget: SalesforceUserProvMockTarget! +} + +type SalesforceUserProvMockTargetDeletedSubscriptionPayload { + """The UserProvMockTarget that was deleted.""" + userProvMockTarget: SalesforceUserProvMockTarget! +} + +type SalesforceUserProvMockTargetCreatedSubscriptionPayload { + """The UserProvMockTarget that was created.""" + userProvMockTarget: SalesforceUserProvMockTarget! +} + +type SalesforceUserProvAccountUpdatedSubscriptionPayload { + """The UserProvAccount that was updated.""" + userProvAccount: SalesforceUserProvAccount! +} + +type SalesforceUserProvAccountUndeletedSubscriptionPayload { + """The UserProvAccount that was resurrected.""" + userProvAccount: SalesforceUserProvAccount! +} + +type SalesforceUserProvAccountStagingUpdatedSubscriptionPayload { + """The UserProvAccountStaging that was updated.""" + userProvAccountStaging: SalesforceUserProvAccountStaging! +} + +type SalesforceUserProvAccountStagingUndeletedSubscriptionPayload { + """The UserProvAccountStaging that was resurrected.""" + userProvAccountStaging: SalesforceUserProvAccountStaging! +} + +type SalesforceUserProvAccountStagingDeletedSubscriptionPayload { + """The UserProvAccountStaging that was deleted.""" + userProvAccountStaging: SalesforceUserProvAccountStaging! +} + +type SalesforceUserProvAccountStagingCreatedSubscriptionPayload { + """The UserProvAccountStaging that was created.""" + userProvAccountStaging: SalesforceUserProvAccountStaging! +} + +type SalesforceUserProvAccountDeletedSubscriptionPayload { + """The UserProvAccount that was deleted.""" + userProvAccount: SalesforceUserProvAccount! +} + +type SalesforceUserProvAccountCreatedSubscriptionPayload { + """The UserProvAccount that was created.""" + userProvAccount: SalesforceUserProvAccount! +} + +type SalesforceUserDeletedSubscriptionPayload { + """The User that was deleted.""" + user: SalesforceUser! +} + +type SalesforceUserCreatedSubscriptionPayload { + """The User that was created.""" + user: SalesforceUser! +} + +type SalesforceTopicUpdatedSubscriptionPayload { + """The Topic that was updated.""" + topic: SalesforceTopic! +} + +type SalesforceTopicUndeletedSubscriptionPayload { + """The Topic that was resurrected.""" + topic: SalesforceTopic! +} + +type SalesforceTopicDeletedSubscriptionPayload { + """The Topic that was deleted.""" + topic: SalesforceTopic! +} + +type SalesforceTopicCreatedSubscriptionPayload { + """The Topic that was created.""" + topic: SalesforceTopic! +} + +type SalesforceTopicAssignmentUpdatedSubscriptionPayload { + """The TopicAssignment that was updated.""" + topicAssignment: SalesforceTopicAssignment! +} + +type SalesforceTopicAssignmentUndeletedSubscriptionPayload { + """The TopicAssignment that was resurrected.""" + topicAssignment: SalesforceTopicAssignment! +} + +type SalesforceTopicAssignmentDeletedSubscriptionPayload { + """The TopicAssignment that was deleted.""" + topicAssignment: SalesforceTopicAssignment! +} + +type SalesforceTopicAssignmentCreatedSubscriptionPayload { + """The TopicAssignment that was created.""" + topicAssignment: SalesforceTopicAssignment! +} + +type SalesforceTaskUpdatedSubscriptionPayload { + """The Task that was updated.""" + task: SalesforceTask! +} + +type SalesforceTaskUndeletedSubscriptionPayload { + """The Task that was resurrected.""" + task: SalesforceTask! +} + +type SalesforceTaskDeletedSubscriptionPayload { + """The Task that was deleted.""" + task: SalesforceTask! +} + +type SalesforceTaskCreatedSubscriptionPayload { + """The Task that was created.""" + task: SalesforceTask! +} + +type SalesforceStreamingChannelUpdatedSubscriptionPayload { + """The StreamingChannel that was updated.""" + streamingChannel: SalesforceStreamingChannel! +} + +type SalesforceStreamingChannelUndeletedSubscriptionPayload { + """The StreamingChannel that was resurrected.""" + streamingChannel: SalesforceStreamingChannel! +} + +type SalesforceStreamingChannelDeletedSubscriptionPayload { + """The StreamingChannel that was deleted.""" + streamingChannel: SalesforceStreamingChannel! +} + +type SalesforceStreamingChannelCreatedSubscriptionPayload { + """The StreamingChannel that was created.""" + streamingChannel: SalesforceStreamingChannel! +} + +type SalesforceSolutionUpdatedSubscriptionPayload { + """The Solution that was updated.""" + solution: SalesforceSolution! +} + +type SalesforceSolutionUndeletedSubscriptionPayload { + """The Solution that was resurrected.""" + solution: SalesforceSolution! +} + +type SalesforceSolutionDeletedSubscriptionPayload { + """The Solution that was deleted.""" + solution: SalesforceSolution! +} + +type SalesforceSolutionCreatedSubscriptionPayload { + """The Solution that was created.""" + solution: SalesforceSolution! +} + +type SalesforceQuickTextUpdatedSubscriptionPayload { + """The QuickText that was updated.""" + quickText: SalesforceQuickText! +} + +type SalesforceQuickTextUndeletedSubscriptionPayload { + """The QuickText that was resurrected.""" + quickText: SalesforceQuickText! +} + +type SalesforceQuickTextDeletedSubscriptionPayload { + """The QuickText that was deleted.""" + quickText: SalesforceQuickText! +} + +type SalesforceQuickTextCreatedSubscriptionPayload { + """The QuickText that was created.""" + quickText: SalesforceQuickText! +} + +type SalesforceProduct2UpdatedSubscriptionPayload { + """The Product2 that was updated.""" + product2: SalesforceProduct2! +} + +type SalesforceProduct2UndeletedSubscriptionPayload { + """The Product2 that was resurrected.""" + product2: SalesforceProduct2! +} + +type SalesforceProduct2DeletedSubscriptionPayload { + """The Product2 that was deleted.""" + product2: SalesforceProduct2! +} + +type SalesforceProduct2CreatedSubscriptionPayload { + """The Product2 that was created.""" + product2: SalesforceProduct2! +} + +type SalesforcePricebook2UpdatedSubscriptionPayload { + """The Pricebook2 that was updated.""" + pricebook2: SalesforcePricebook2! +} + +type SalesforcePricebook2UndeletedSubscriptionPayload { + """The Pricebook2 that was resurrected.""" + pricebook2: SalesforcePricebook2! +} + +type SalesforcePricebook2DeletedSubscriptionPayload { + """The Pricebook2 that was deleted.""" + pricebook2: SalesforcePricebook2! +} + +type SalesforcePricebook2CreatedSubscriptionPayload { + """The Pricebook2 that was created.""" + pricebook2: SalesforcePricebook2! +} + +type SalesforcePartnerUpdatedSubscriptionPayload { + """The Partner that was updated.""" + partner: SalesforcePartner! +} + +type SalesforcePartnerUndeletedSubscriptionPayload { + """The Partner that was resurrected.""" + partner: SalesforcePartner! +} + +type SalesforcePartnerDeletedSubscriptionPayload { + """The Partner that was deleted.""" + partner: SalesforcePartner! +} + +type SalesforcePartnerCreatedSubscriptionPayload { + """The Partner that was created.""" + partner: SalesforcePartner! +} + +type SalesforceOrgLifecycleNotificationUpdatedSubscriptionPayload { + """The OrgLifecycleNotification that was updated.""" + orgLifecycleNotification: SalesforceOrgLifecycleNotification! +} + +type SalesforceOrgLifecycleNotificationUndeletedSubscriptionPayload { + """The OrgLifecycleNotification that was resurrected.""" + orgLifecycleNotification: SalesforceOrgLifecycleNotification! +} + +type SalesforceOrgLifecycleNotificationDeletedSubscriptionPayload { + """The OrgLifecycleNotification that was deleted.""" + orgLifecycleNotification: SalesforceOrgLifecycleNotification! +} + +"""Org Lifecycle Notification""" +type SalesforceOrgLifecycleNotification { + """Replay ID""" + replayId: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Lifecycle Request Type""" + lifecycleRequestType: String + + """Lifecycle Request ID""" + lifecycleRequestId: String + + """Org ID""" + orgId: String + + """Status""" + status: String + + """Status Code""" + statusCode: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! +} + +type SalesforceOrgLifecycleNotificationCreatedSubscriptionPayload { + """The OrgLifecycleNotification that was created.""" + orgLifecycleNotification: SalesforceOrgLifecycleNotification! +} + +type SalesforceOrgDeleteRequestUpdatedSubscriptionPayload { + """The OrgDeleteRequest that was updated.""" + orgDeleteRequest: SalesforceOrgDeleteRequest! +} + +type SalesforceOrgDeleteRequestUndeletedSubscriptionPayload { + """The OrgDeleteRequest that was resurrected.""" + orgDeleteRequest: SalesforceOrgDeleteRequest! +} + +type SalesforceOrgDeleteRequestDeletedSubscriptionPayload { + """The OrgDeleteRequest that was deleted.""" + orgDeleteRequest: SalesforceOrgDeleteRequest! +} + +type SalesforceOrgDeleteRequestCreatedSubscriptionPayload { + """The OrgDeleteRequest that was created.""" + orgDeleteRequest: SalesforceOrgDeleteRequest! +} + +type SalesforceOrderUpdatedSubscriptionPayload { + """The Order that was updated.""" + order: SalesforceOrder! +} + +type SalesforceOrderUndeletedSubscriptionPayload { + """The Order that was resurrected.""" + order: SalesforceOrder! +} + +type SalesforceOrderItemUpdatedSubscriptionPayload { + """The OrderItem that was updated.""" + orderItem: SalesforceOrderItem! +} + +type SalesforceOrderItemUndeletedSubscriptionPayload { + """The OrderItem that was resurrected.""" + orderItem: SalesforceOrderItem! +} + +type SalesforceOrderItemDeletedSubscriptionPayload { + """The OrderItem that was deleted.""" + orderItem: SalesforceOrderItem! +} + +type SalesforceOrderItemCreatedSubscriptionPayload { + """The OrderItem that was created.""" + orderItem: SalesforceOrderItem! +} + +type SalesforceOrderDeletedSubscriptionPayload { + """The Order that was deleted.""" + order: SalesforceOrder! +} + +type SalesforceOrderCreatedSubscriptionPayload { + """The Order that was created.""" + order: SalesforceOrder! +} + +type SalesforceOpportunityUpdatedSubscriptionPayload { + """The Opportunity that was updated.""" + opportunity: SalesforceOpportunity! +} + +type SalesforceOpportunityUndeletedSubscriptionPayload { + """The Opportunity that was resurrected.""" + opportunity: SalesforceOpportunity! +} + +type SalesforceOpportunityLineItemUpdatedSubscriptionPayload { + """The OpportunityLineItem that was updated.""" + opportunityLineItem: SalesforceOpportunityLineItem! +} + +type SalesforceOpportunityLineItemUndeletedSubscriptionPayload { + """The OpportunityLineItem that was resurrected.""" + opportunityLineItem: SalesforceOpportunityLineItem! +} + +type SalesforceOpportunityLineItemDeletedSubscriptionPayload { + """The OpportunityLineItem that was deleted.""" + opportunityLineItem: SalesforceOpportunityLineItem! +} + +type SalesforceOpportunityLineItemCreatedSubscriptionPayload { + """The OpportunityLineItem that was created.""" + opportunityLineItem: SalesforceOpportunityLineItem! +} + +type SalesforceOpportunityDeletedSubscriptionPayload { + """The Opportunity that was deleted.""" + opportunity: SalesforceOpportunity! +} + +type SalesforceOpportunityCreatedSubscriptionPayload { + """The Opportunity that was created.""" + opportunity: SalesforceOpportunity! +} + +type SalesforceNoteUpdatedSubscriptionPayload { + """The Note that was updated.""" + note: SalesforceNote! +} + +type SalesforceNoteUndeletedSubscriptionPayload { + """The Note that was resurrected.""" + note: SalesforceNote! +} + +type SalesforceNoteDeletedSubscriptionPayload { + """The Note that was deleted.""" + note: SalesforceNote! +} + +type SalesforceNoteCreatedSubscriptionPayload { + """The Note that was created.""" + note: SalesforceNote! +} + +type SalesforceMacroUpdatedSubscriptionPayload { + """The Macro that was updated.""" + macro: SalesforceMacro! +} + +type SalesforceMacroUndeletedSubscriptionPayload { + """The Macro that was resurrected.""" + macro: SalesforceMacro! +} + +type SalesforceMacroDeletedSubscriptionPayload { + """The Macro that was deleted.""" + macro: SalesforceMacro! +} + +type SalesforceMacroCreatedSubscriptionPayload { + """The Macro that was created.""" + macro: SalesforceMacro! +} + +type SalesforceLeadUpdatedSubscriptionPayload { + """The Lead that was updated.""" + lead: SalesforceLead! +} + +type SalesforceLeadUndeletedSubscriptionPayload { + """The Lead that was resurrected.""" + lead: SalesforceLead! +} + +type SalesforceLeadDeletedSubscriptionPayload { + """The Lead that was deleted.""" + lead: SalesforceLead! +} + +type SalesforceLeadCreatedSubscriptionPayload { + """The Lead that was created.""" + lead: SalesforceLead! +} + +type SalesforceIdeaUpdatedSubscriptionPayload { + """The Idea that was updated.""" + idea: SalesforceIdea! +} + +type SalesforceIdeaUndeletedSubscriptionPayload { + """The Idea that was resurrected.""" + idea: SalesforceIdea! +} + +type SalesforceIdeaDeletedSubscriptionPayload { + """The Idea that was deleted.""" + idea: SalesforceIdea! +} + +type SalesforceIdeaCreatedSubscriptionPayload { + """The Idea that was created.""" + idea: SalesforceIdea! +} + +type SalesforceIdeaCommentUpdatedSubscriptionPayload { + """The IdeaComment that was updated.""" + ideaComment: SalesforceIdeaComment! +} + +type SalesforceIdeaCommentUndeletedSubscriptionPayload { + """The IdeaComment that was resurrected.""" + ideaComment: SalesforceIdeaComment! +} + +type SalesforceIdeaCommentDeletedSubscriptionPayload { + """The IdeaComment that was deleted.""" + ideaComment: SalesforceIdeaComment! +} + +type SalesforceIdeaCommentCreatedSubscriptionPayload { + """The IdeaComment that was created.""" + ideaComment: SalesforceIdeaComment! +} + +type SalesforceFeedItemUpdatedSubscriptionPayload { + """The FeedItem that was updated.""" + feedItem: SalesforceFeedItem! +} + +type SalesforceFeedItemUndeletedSubscriptionPayload { + """The FeedItem that was resurrected.""" + feedItem: SalesforceFeedItem! +} + +type SalesforceFeedItemDeletedSubscriptionPayload { + """The FeedItem that was deleted.""" + feedItem: SalesforceFeedItem! +} + +type SalesforceFeedItemCreatedSubscriptionPayload { + """The FeedItem that was created.""" + feedItem: SalesforceFeedItem! +} + +type SalesforceFeedCommentUpdatedSubscriptionPayload { + """The FeedComment that was updated.""" + feedComment: SalesforceFeedComment! +} + +type SalesforceFeedCommentUndeletedSubscriptionPayload { + """The FeedComment that was resurrected.""" + feedComment: SalesforceFeedComment! +} + +type SalesforceFeedCommentDeletedSubscriptionPayload { + """The FeedComment that was deleted.""" + feedComment: SalesforceFeedComment! +} + +type SalesforceFeedCommentCreatedSubscriptionPayload { + """The FeedComment that was created.""" + feedComment: SalesforceFeedComment! +} + +type SalesforceEventUpdatedSubscriptionPayload { + """The Event that was updated.""" + event: SalesforceEvent! +} + +type SalesforceEventUndeletedSubscriptionPayload { + """The Event that was resurrected.""" + event: SalesforceEvent! +} + +type SalesforceEventDeletedSubscriptionPayload { + """The Event that was deleted.""" + event: SalesforceEvent! +} + +type SalesforceEventCreatedSubscriptionPayload { + """The Event that was created.""" + event: SalesforceEvent! +} + +type SalesforceEmailMessageUpdatedSubscriptionPayload { + """The EmailMessage that was updated.""" + emailMessage: SalesforceEmailMessage! +} + +type SalesforceEmailMessageUndeletedSubscriptionPayload { + """The EmailMessage that was resurrected.""" + emailMessage: SalesforceEmailMessage! +} + +type SalesforceEmailMessageDeletedSubscriptionPayload { + """The EmailMessage that was deleted.""" + emailMessage: SalesforceEmailMessage! +} + +type SalesforceEmailMessageCreatedSubscriptionPayload { + """The EmailMessage that was created.""" + emailMessage: SalesforceEmailMessage! +} + +type SalesforceDuplicateRecordSetUpdatedSubscriptionPayload { + """The DuplicateRecordSet that was updated.""" + duplicateRecordSet: SalesforceDuplicateRecordSet! +} + +type SalesforceDuplicateRecordSetUndeletedSubscriptionPayload { + """The DuplicateRecordSet that was resurrected.""" + duplicateRecordSet: SalesforceDuplicateRecordSet! +} + +type SalesforceDuplicateRecordSetDeletedSubscriptionPayload { + """The DuplicateRecordSet that was deleted.""" + duplicateRecordSet: SalesforceDuplicateRecordSet! +} + +type SalesforceDuplicateRecordSetCreatedSubscriptionPayload { + """The DuplicateRecordSet that was created.""" + duplicateRecordSet: SalesforceDuplicateRecordSet! +} + +type SalesforceDuplicateRecordItemUpdatedSubscriptionPayload { + """The DuplicateRecordItem that was updated.""" + duplicateRecordItem: SalesforceDuplicateRecordItem! +} + +type SalesforceDuplicateRecordItemUndeletedSubscriptionPayload { + """The DuplicateRecordItem that was resurrected.""" + duplicateRecordItem: SalesforceDuplicateRecordItem! +} + +type SalesforceDuplicateRecordItemDeletedSubscriptionPayload { + """The DuplicateRecordItem that was deleted.""" + duplicateRecordItem: SalesforceDuplicateRecordItem! +} + +type SalesforceDuplicateRecordItemCreatedSubscriptionPayload { + """The DuplicateRecordItem that was created.""" + duplicateRecordItem: SalesforceDuplicateRecordItem! +} + +type SalesforceDandBCompanyUpdatedSubscriptionPayload { + """The DandBCompany that was updated.""" + dandBCompany: SalesforceDandBCompany! +} + +type SalesforceDandBCompanyUndeletedSubscriptionPayload { + """The DandBCompany that was resurrected.""" + dandBCompany: SalesforceDandBCompany! +} + +type SalesforceDandBCompanyDeletedSubscriptionPayload { + """The DandBCompany that was deleted.""" + dandBCompany: SalesforceDandBCompany! +} + +type SalesforceDandBCompanyCreatedSubscriptionPayload { + """The DandBCompany that was created.""" + dandBCompany: SalesforceDandBCompany! +} + +type SalesforceContractUpdatedSubscriptionPayload { + """The Contract that was updated.""" + contract: SalesforceContract! +} + +type SalesforceContractUndeletedSubscriptionPayload { + """The Contract that was resurrected.""" + contract: SalesforceContract! +} + +type SalesforceContractDeletedSubscriptionPayload { + """The Contract that was deleted.""" + contract: SalesforceContract! +} + +type SalesforceContractCreatedSubscriptionPayload { + """The Contract that was created.""" + contract: SalesforceContract! +} + +type SalesforceContentVersionUpdatedSubscriptionPayload { + """The ContentVersion that was updated.""" + contentVersion: SalesforceContentVersion! +} + +type SalesforceContentVersionUndeletedSubscriptionPayload { + """The ContentVersion that was resurrected.""" + contentVersion: SalesforceContentVersion! +} + +type SalesforceContentVersionDeletedSubscriptionPayload { + """The ContentVersion that was deleted.""" + contentVersion: SalesforceContentVersion! +} + +type SalesforceContentVersionCreatedSubscriptionPayload { + """The ContentVersion that was created.""" + contentVersion: SalesforceContentVersion! +} + +type SalesforceContentDocumentUpdatedSubscriptionPayload { + """The ContentDocument that was updated.""" + contentDocument: SalesforceContentDocument! +} + +type SalesforceContentDocumentUndeletedSubscriptionPayload { + """The ContentDocument that was resurrected.""" + contentDocument: SalesforceContentDocument! +} + +type SalesforceContentDocumentLinkUpdatedSubscriptionPayload { + """The ContentDocumentLink that was updated.""" + contentDocumentLink: SalesforceContentDocumentLink! +} + +type SalesforceContentDocumentLinkUndeletedSubscriptionPayload { + """The ContentDocumentLink that was resurrected.""" + contentDocumentLink: SalesforceContentDocumentLink! +} + +type SalesforceContentDocumentLinkDeletedSubscriptionPayload { + """The ContentDocumentLink that was deleted.""" + contentDocumentLink: SalesforceContentDocumentLink! +} + +type SalesforceContentDocumentLinkCreatedSubscriptionPayload { + """The ContentDocumentLink that was created.""" + contentDocumentLink: SalesforceContentDocumentLink! +} + +type SalesforceContentDocumentDeletedSubscriptionPayload { + """The ContentDocument that was deleted.""" + contentDocument: SalesforceContentDocument! +} + +type SalesforceContentDocumentCreatedSubscriptionPayload { + """The ContentDocument that was created.""" + contentDocument: SalesforceContentDocument! +} + +type SalesforceContentDistributionUpdatedSubscriptionPayload { + """The ContentDistribution that was updated.""" + contentDistribution: SalesforceContentDistribution! +} + +type SalesforceContentDistributionUndeletedSubscriptionPayload { + """The ContentDistribution that was resurrected.""" + contentDistribution: SalesforceContentDistribution! +} + +type SalesforceContentDistributionDeletedSubscriptionPayload { + """The ContentDistribution that was deleted.""" + contentDistribution: SalesforceContentDistribution! +} + +type SalesforceContentDistributionCreatedSubscriptionPayload { + """The ContentDistribution that was created.""" + contentDistribution: SalesforceContentDistribution! +} + +type SalesforceContactUpdatedSubscriptionPayload { + """The Contact that was updated.""" + contact: SalesforceContact! +} + +type SalesforceContactUndeletedSubscriptionPayload { + """The Contact that was resurrected.""" + contact: SalesforceContact! +} + +type SalesforceContactDeletedSubscriptionPayload { + """The Contact that was deleted.""" + contact: SalesforceContact! +} + +type SalesforceContactCreatedSubscriptionPayload { + """The Contact that was created.""" + contact: SalesforceContact! +} + +type SalesforceCollaborationGroupUpdatedSubscriptionPayload { + """The CollaborationGroup that was updated.""" + collaborationGroup: SalesforceCollaborationGroup! +} + +type SalesforceCollaborationGroupUndeletedSubscriptionPayload { + """The CollaborationGroup that was resurrected.""" + collaborationGroup: SalesforceCollaborationGroup! +} + +type SalesforceCollaborationGroupRecordUpdatedSubscriptionPayload { + """The CollaborationGroupRecord that was updated.""" + collaborationGroupRecord: SalesforceCollaborationGroupRecord! +} + +type SalesforceCollaborationGroupRecordUndeletedSubscriptionPayload { + """The CollaborationGroupRecord that was resurrected.""" + collaborationGroupRecord: SalesforceCollaborationGroupRecord! +} + +type SalesforceCollaborationGroupRecordDeletedSubscriptionPayload { + """The CollaborationGroupRecord that was deleted.""" + collaborationGroupRecord: SalesforceCollaborationGroupRecord! +} + +type SalesforceCollaborationGroupRecordCreatedSubscriptionPayload { + """The CollaborationGroupRecord that was created.""" + collaborationGroupRecord: SalesforceCollaborationGroupRecord! +} + +type SalesforceCollaborationGroupMemberUpdatedSubscriptionPayload { + """The CollaborationGroupMember that was updated.""" + collaborationGroupMember: SalesforceCollaborationGroupMember! +} + +type SalesforceCollaborationGroupMemberUndeletedSubscriptionPayload { + """The CollaborationGroupMember that was resurrected.""" + collaborationGroupMember: SalesforceCollaborationGroupMember! +} + +type SalesforceCollaborationGroupMemberDeletedSubscriptionPayload { + """The CollaborationGroupMember that was deleted.""" + collaborationGroupMember: SalesforceCollaborationGroupMember! +} + +type SalesforceCollaborationGroupMemberCreatedSubscriptionPayload { + """The CollaborationGroupMember that was created.""" + collaborationGroupMember: SalesforceCollaborationGroupMember! +} + +type SalesforceCollaborationGroupDeletedSubscriptionPayload { + """The CollaborationGroup that was deleted.""" + collaborationGroup: SalesforceCollaborationGroup! +} + +type SalesforceCollaborationGroupCreatedSubscriptionPayload { + """The CollaborationGroup that was created.""" + collaborationGroup: SalesforceCollaborationGroup! +} + +type SalesforceCaseUpdatedSubscriptionPayload { + """The Case that was updated.""" + case: SalesforceCase! +} + +type SalesforceCaseUndeletedSubscriptionPayload { + """The Case that was resurrected.""" + case: SalesforceCase! +} + +type SalesforceCaseDeletedSubscriptionPayload { + """The Case that was deleted.""" + case: SalesforceCase! +} + +type SalesforceCaseCreatedSubscriptionPayload { + """The Case that was created.""" + case: SalesforceCase! +} + +type SalesforceCaseCommentUpdatedSubscriptionPayload { + """The CaseComment that was updated.""" + caseComment: SalesforceCaseComment! +} + +type SalesforceCaseCommentUndeletedSubscriptionPayload { + """The CaseComment that was resurrected.""" + caseComment: SalesforceCaseComment! +} + +type SalesforceCaseCommentDeletedSubscriptionPayload { + """The CaseComment that was deleted.""" + caseComment: SalesforceCaseComment! +} + +type SalesforceCaseCommentCreatedSubscriptionPayload { + """The CaseComment that was created.""" + caseComment: SalesforceCaseComment! +} + +type SalesforceCampaignUpdatedSubscriptionPayload { + """The Campaign that was updated.""" + campaign: SalesforceCampaign! +} + +type SalesforceCampaignUndeletedSubscriptionPayload { + """The Campaign that was resurrected.""" + campaign: SalesforceCampaign! +} + +type SalesforceCampaignMemberUpdatedSubscriptionPayload { + """The CampaignMember that was updated.""" + campaignMember: SalesforceCampaignMember! +} + +type SalesforceCampaignMemberUndeletedSubscriptionPayload { + """The CampaignMember that was resurrected.""" + campaignMember: SalesforceCampaignMember! +} + +type SalesforceCampaignMemberDeletedSubscriptionPayload { + """The CampaignMember that was deleted.""" + campaignMember: SalesforceCampaignMember! +} + +type SalesforceCampaignMemberCreatedSubscriptionPayload { + """The CampaignMember that was created.""" + campaignMember: SalesforceCampaignMember! +} + +type SalesforceCampaignDeletedSubscriptionPayload { + """The Campaign that was deleted.""" + campaign: SalesforceCampaign! +} + +type SalesforceCampaignCreatedSubscriptionPayload { + """The Campaign that was created.""" + campaign: SalesforceCampaign! +} + +type SalesforceAttachmentUpdatedSubscriptionPayload { + """The Attachment that was updated.""" + attachment: SalesforceAttachment! +} + +type SalesforceAttachmentUndeletedSubscriptionPayload { + """The Attachment that was resurrected.""" + attachment: SalesforceAttachment! +} + +type SalesforceAttachmentDeletedSubscriptionPayload { + """The Attachment that was deleted.""" + attachment: SalesforceAttachment! +} + +type SalesforceAttachmentCreatedSubscriptionPayload { + """The Attachment that was created.""" + attachment: SalesforceAttachment! +} + +type SalesforceAssetUpdatedSubscriptionPayload { + """The Asset that was updated.""" + asset: SalesforceAsset! +} + +type SalesforceAssetUndeletedSubscriptionPayload { + """The Asset that was resurrected.""" + asset: SalesforceAsset! +} + +type SalesforceAssetTokenEventUpdatedSubscriptionPayload { + """The AssetTokenEvent that was updated.""" + assetTokenEvent: SalesforceAssetTokenEvent! +} + +type SalesforceAssetTokenEventUndeletedSubscriptionPayload { + """The AssetTokenEvent that was resurrected.""" + assetTokenEvent: SalesforceAssetTokenEvent! +} + +type SalesforceAssetTokenEventDeletedSubscriptionPayload { + """The AssetTokenEvent that was deleted.""" + assetTokenEvent: SalesforceAssetTokenEvent! +} + +"""Asset Token Event""" +type SalesforceAssetTokenEvent { + """Replay ID""" + replayId: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Connected App ID""" + connectedAppId: String + + """Connected App ID""" + connectedApp: SalesforceConnectedApplication + + """User ID""" + userId: String + + """User ID""" + user: SalesforceUser + + """Asset ID""" + assetId: String + + """Asset ID""" + asset: SalesforceAsset + + """Name""" + name: String + + """Device ID""" + deviceId: String + + """Device Key""" + deviceKey: String + + """Expiration""" + expiration: String + + """Asset Serial Number""" + assetSerialNumber: String + + """Asset Name""" + assetName: String + + """Actor Token Payload""" + actorTokenPayload: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! +} + +type SalesforceAssetTokenEventCreatedSubscriptionPayload { + """The AssetTokenEvent that was created.""" + assetTokenEvent: SalesforceAssetTokenEvent! +} + +type SalesforceAssetRelationshipUpdatedSubscriptionPayload { + """The AssetRelationship that was updated.""" + assetRelationship: SalesforceAssetRelationship! +} + +type SalesforceAssetRelationshipUndeletedSubscriptionPayload { + """The AssetRelationship that was resurrected.""" + assetRelationship: SalesforceAssetRelationship! +} + +type SalesforceAssetRelationshipDeletedSubscriptionPayload { + """The AssetRelationship that was deleted.""" + assetRelationship: SalesforceAssetRelationship! +} + +type SalesforceAssetRelationshipCreatedSubscriptionPayload { + """The AssetRelationship that was created.""" + assetRelationship: SalesforceAssetRelationship! +} + +type SalesforceAssetDeletedSubscriptionPayload { + """The Asset that was deleted.""" + asset: SalesforceAsset! +} + +type SalesforceAssetCreatedSubscriptionPayload { + """The Asset that was created.""" + asset: SalesforceAsset! +} + +type SalesforceAccountUpdatedSubscriptionPayload { + """The Account that was updated.""" + account: SalesforceAccount! +} + +type SalesforceAccountUndeletedSubscriptionPayload { + """The Account that was resurrected.""" + account: SalesforceAccount! +} + +type SalesforceAccountDeletedSubscriptionPayload { + """The Account that was deleted.""" + account: SalesforceAccount! +} + +type SalesforceAccountCreatedSubscriptionPayload { + """The Account that was created.""" + account: SalesforceAccount! +} + +"""Namespace for Salesforce subscriptions.""" +type SalesforceSubscriptionRoot { + """Get notified when a Account is created.""" + accountCreated: SalesforceAccountCreatedSubscriptionPayload! + + """Get notified when a Account is deleted.""" + accountDeleted: SalesforceAccountDeletedSubscriptionPayload! + + """Get notified when a Account is resurrected.""" + accountUndeleted: SalesforceAccountUndeletedSubscriptionPayload! + + """Get notified when a Account is updated.""" + accountUpdated: SalesforceAccountUpdatedSubscriptionPayload! + + """Get notified when a Asset is created.""" + assetCreated: SalesforceAssetCreatedSubscriptionPayload! + + """Get notified when a Asset is deleted.""" + assetDeleted: SalesforceAssetDeletedSubscriptionPayload! + + """Get notified when a AssetRelationship is created.""" + assetRelationshipCreated: SalesforceAssetRelationshipCreatedSubscriptionPayload! + + """Get notified when a AssetRelationship is deleted.""" + assetRelationshipDeleted: SalesforceAssetRelationshipDeletedSubscriptionPayload! + + """Get notified when a AssetRelationship is resurrected.""" + assetRelationshipUndeleted: SalesforceAssetRelationshipUndeletedSubscriptionPayload! + + """Get notified when a AssetRelationship is updated.""" + assetRelationshipUpdated: SalesforceAssetRelationshipUpdatedSubscriptionPayload! + + """Get notified when a AssetTokenEvent is created.""" + assetTokenEventCreated: SalesforceAssetTokenEventCreatedSubscriptionPayload! + + """Get notified when a AssetTokenEvent is deleted.""" + assetTokenEventDeleted: SalesforceAssetTokenEventDeletedSubscriptionPayload! + + """Get notified when a AssetTokenEvent is resurrected.""" + assetTokenEventUndeleted: SalesforceAssetTokenEventUndeletedSubscriptionPayload! + + """Get notified when a AssetTokenEvent is updated.""" + assetTokenEventUpdated: SalesforceAssetTokenEventUpdatedSubscriptionPayload! + + """Get notified when a Asset is resurrected.""" + assetUndeleted: SalesforceAssetUndeletedSubscriptionPayload! + + """Get notified when a Asset is updated.""" + assetUpdated: SalesforceAssetUpdatedSubscriptionPayload! + + """Get notified when a Attachment is created.""" + attachmentCreated: SalesforceAttachmentCreatedSubscriptionPayload! + + """Get notified when a Attachment is deleted.""" + attachmentDeleted: SalesforceAttachmentDeletedSubscriptionPayload! + + """Get notified when a Attachment is resurrected.""" + attachmentUndeleted: SalesforceAttachmentUndeletedSubscriptionPayload! + + """Get notified when a Attachment is updated.""" + attachmentUpdated: SalesforceAttachmentUpdatedSubscriptionPayload! + + """Get notified when a Campaign is created.""" + campaignCreated: SalesforceCampaignCreatedSubscriptionPayload! + + """Get notified when a Campaign is deleted.""" + campaignDeleted: SalesforceCampaignDeletedSubscriptionPayload! + + """Get notified when a CampaignMember is created.""" + campaignMemberCreated: SalesforceCampaignMemberCreatedSubscriptionPayload! + + """Get notified when a CampaignMember is deleted.""" + campaignMemberDeleted: SalesforceCampaignMemberDeletedSubscriptionPayload! + + """Get notified when a CampaignMember is resurrected.""" + campaignMemberUndeleted: SalesforceCampaignMemberUndeletedSubscriptionPayload! + + """Get notified when a CampaignMember is updated.""" + campaignMemberUpdated: SalesforceCampaignMemberUpdatedSubscriptionPayload! + + """Get notified when a Campaign is resurrected.""" + campaignUndeleted: SalesforceCampaignUndeletedSubscriptionPayload! + + """Get notified when a Campaign is updated.""" + campaignUpdated: SalesforceCampaignUpdatedSubscriptionPayload! + + """Get notified when a CaseComment is created.""" + caseCommentCreated: SalesforceCaseCommentCreatedSubscriptionPayload! + + """Get notified when a CaseComment is deleted.""" + caseCommentDeleted: SalesforceCaseCommentDeletedSubscriptionPayload! + + """Get notified when a CaseComment is resurrected.""" + caseCommentUndeleted: SalesforceCaseCommentUndeletedSubscriptionPayload! + + """Get notified when a CaseComment is updated.""" + caseCommentUpdated: SalesforceCaseCommentUpdatedSubscriptionPayload! + + """Get notified when a Case is created.""" + caseCreated: SalesforceCaseCreatedSubscriptionPayload! + + """Get notified when a Case is deleted.""" + caseDeleted: SalesforceCaseDeletedSubscriptionPayload! + + """Get notified when a Case is resurrected.""" + caseUndeleted: SalesforceCaseUndeletedSubscriptionPayload! + + """Get notified when a Case is updated.""" + caseUpdated: SalesforceCaseUpdatedSubscriptionPayload! + + """Get notified when a CollaborationGroup is created.""" + collaborationGroupCreated: SalesforceCollaborationGroupCreatedSubscriptionPayload! + + """Get notified when a CollaborationGroup is deleted.""" + collaborationGroupDeleted: SalesforceCollaborationGroupDeletedSubscriptionPayload! + + """Get notified when a CollaborationGroupMember is created.""" + collaborationGroupMemberCreated: SalesforceCollaborationGroupMemberCreatedSubscriptionPayload! + + """Get notified when a CollaborationGroupMember is deleted.""" + collaborationGroupMemberDeleted: SalesforceCollaborationGroupMemberDeletedSubscriptionPayload! + + """Get notified when a CollaborationGroupMember is resurrected.""" + collaborationGroupMemberUndeleted: SalesforceCollaborationGroupMemberUndeletedSubscriptionPayload! + + """Get notified when a CollaborationGroupMember is updated.""" + collaborationGroupMemberUpdated: SalesforceCollaborationGroupMemberUpdatedSubscriptionPayload! + + """Get notified when a CollaborationGroupRecord is created.""" + collaborationGroupRecordCreated: SalesforceCollaborationGroupRecordCreatedSubscriptionPayload! + + """Get notified when a CollaborationGroupRecord is deleted.""" + collaborationGroupRecordDeleted: SalesforceCollaborationGroupRecordDeletedSubscriptionPayload! + + """Get notified when a CollaborationGroupRecord is resurrected.""" + collaborationGroupRecordUndeleted: SalesforceCollaborationGroupRecordUndeletedSubscriptionPayload! + + """Get notified when a CollaborationGroupRecord is updated.""" + collaborationGroupRecordUpdated: SalesforceCollaborationGroupRecordUpdatedSubscriptionPayload! + + """Get notified when a CollaborationGroup is resurrected.""" + collaborationGroupUndeleted: SalesforceCollaborationGroupUndeletedSubscriptionPayload! + + """Get notified when a CollaborationGroup is updated.""" + collaborationGroupUpdated: SalesforceCollaborationGroupUpdatedSubscriptionPayload! + + """Get notified when a Contact is created.""" + contactCreated: SalesforceContactCreatedSubscriptionPayload! + + """Get notified when a Contact is deleted.""" + contactDeleted: SalesforceContactDeletedSubscriptionPayload! + + """Get notified when a Contact is resurrected.""" + contactUndeleted: SalesforceContactUndeletedSubscriptionPayload! + + """Get notified when a Contact is updated.""" + contactUpdated: SalesforceContactUpdatedSubscriptionPayload! + + """Get notified when a ContentDistribution is created.""" + contentDistributionCreated: SalesforceContentDistributionCreatedSubscriptionPayload! + + """Get notified when a ContentDistribution is deleted.""" + contentDistributionDeleted: SalesforceContentDistributionDeletedSubscriptionPayload! + + """Get notified when a ContentDistribution is resurrected.""" + contentDistributionUndeleted: SalesforceContentDistributionUndeletedSubscriptionPayload! + + """Get notified when a ContentDistribution is updated.""" + contentDistributionUpdated: SalesforceContentDistributionUpdatedSubscriptionPayload! + + """Get notified when a ContentDocument is created.""" + contentDocumentCreated: SalesforceContentDocumentCreatedSubscriptionPayload! + + """Get notified when a ContentDocument is deleted.""" + contentDocumentDeleted: SalesforceContentDocumentDeletedSubscriptionPayload! + + """Get notified when a ContentDocumentLink is created.""" + contentDocumentLinkCreated: SalesforceContentDocumentLinkCreatedSubscriptionPayload! + + """Get notified when a ContentDocumentLink is deleted.""" + contentDocumentLinkDeleted: SalesforceContentDocumentLinkDeletedSubscriptionPayload! + + """Get notified when a ContentDocumentLink is resurrected.""" + contentDocumentLinkUndeleted: SalesforceContentDocumentLinkUndeletedSubscriptionPayload! + + """Get notified when a ContentDocumentLink is updated.""" + contentDocumentLinkUpdated: SalesforceContentDocumentLinkUpdatedSubscriptionPayload! + + """Get notified when a ContentDocument is resurrected.""" + contentDocumentUndeleted: SalesforceContentDocumentUndeletedSubscriptionPayload! + + """Get notified when a ContentDocument is updated.""" + contentDocumentUpdated: SalesforceContentDocumentUpdatedSubscriptionPayload! + + """Get notified when a ContentVersion is created.""" + contentVersionCreated: SalesforceContentVersionCreatedSubscriptionPayload! + + """Get notified when a ContentVersion is deleted.""" + contentVersionDeleted: SalesforceContentVersionDeletedSubscriptionPayload! + + """Get notified when a ContentVersion is resurrected.""" + contentVersionUndeleted: SalesforceContentVersionUndeletedSubscriptionPayload! + + """Get notified when a ContentVersion is updated.""" + contentVersionUpdated: SalesforceContentVersionUpdatedSubscriptionPayload! + + """Get notified when a Contract is created.""" + contractCreated: SalesforceContractCreatedSubscriptionPayload! + + """Get notified when a Contract is deleted.""" + contractDeleted: SalesforceContractDeletedSubscriptionPayload! + + """Get notified when a Contract is resurrected.""" + contractUndeleted: SalesforceContractUndeletedSubscriptionPayload! + + """Get notified when a Contract is updated.""" + contractUpdated: SalesforceContractUpdatedSubscriptionPayload! + + """Get notified when a DandBCompany is created.""" + dandBCompanyCreated: SalesforceDandBCompanyCreatedSubscriptionPayload! + + """Get notified when a DandBCompany is deleted.""" + dandBCompanyDeleted: SalesforceDandBCompanyDeletedSubscriptionPayload! + + """Get notified when a DandBCompany is resurrected.""" + dandBCompanyUndeleted: SalesforceDandBCompanyUndeletedSubscriptionPayload! + + """Get notified when a DandBCompany is updated.""" + dandBCompanyUpdated: SalesforceDandBCompanyUpdatedSubscriptionPayload! + + """Get notified when a DuplicateRecordItem is created.""" + duplicateRecordItemCreated: SalesforceDuplicateRecordItemCreatedSubscriptionPayload! + + """Get notified when a DuplicateRecordItem is deleted.""" + duplicateRecordItemDeleted: SalesforceDuplicateRecordItemDeletedSubscriptionPayload! + + """Get notified when a DuplicateRecordItem is resurrected.""" + duplicateRecordItemUndeleted: SalesforceDuplicateRecordItemUndeletedSubscriptionPayload! + + """Get notified when a DuplicateRecordItem is updated.""" + duplicateRecordItemUpdated: SalesforceDuplicateRecordItemUpdatedSubscriptionPayload! + + """Get notified when a DuplicateRecordSet is created.""" + duplicateRecordSetCreated: SalesforceDuplicateRecordSetCreatedSubscriptionPayload! + + """Get notified when a DuplicateRecordSet is deleted.""" + duplicateRecordSetDeleted: SalesforceDuplicateRecordSetDeletedSubscriptionPayload! + + """Get notified when a DuplicateRecordSet is resurrected.""" + duplicateRecordSetUndeleted: SalesforceDuplicateRecordSetUndeletedSubscriptionPayload! + + """Get notified when a DuplicateRecordSet is updated.""" + duplicateRecordSetUpdated: SalesforceDuplicateRecordSetUpdatedSubscriptionPayload! + + """Get notified when a EmailMessage is created.""" + emailMessageCreated: SalesforceEmailMessageCreatedSubscriptionPayload! + + """Get notified when a EmailMessage is deleted.""" + emailMessageDeleted: SalesforceEmailMessageDeletedSubscriptionPayload! + + """Get notified when a EmailMessage is resurrected.""" + emailMessageUndeleted: SalesforceEmailMessageUndeletedSubscriptionPayload! + + """Get notified when a EmailMessage is updated.""" + emailMessageUpdated: SalesforceEmailMessageUpdatedSubscriptionPayload! + + """Get notified when a Event is created.""" + eventCreated: SalesforceEventCreatedSubscriptionPayload! + + """Get notified when a Event is deleted.""" + eventDeleted: SalesforceEventDeletedSubscriptionPayload! + + """Get notified when a Event is resurrected.""" + eventUndeleted: SalesforceEventUndeletedSubscriptionPayload! + + """Get notified when a Event is updated.""" + eventUpdated: SalesforceEventUpdatedSubscriptionPayload! + + """Get notified when a FeedComment is created.""" + feedCommentCreated: SalesforceFeedCommentCreatedSubscriptionPayload! + + """Get notified when a FeedComment is deleted.""" + feedCommentDeleted: SalesforceFeedCommentDeletedSubscriptionPayload! + + """Get notified when a FeedComment is resurrected.""" + feedCommentUndeleted: SalesforceFeedCommentUndeletedSubscriptionPayload! + + """Get notified when a FeedComment is updated.""" + feedCommentUpdated: SalesforceFeedCommentUpdatedSubscriptionPayload! + + """Get notified when a FeedItem is created.""" + feedItemCreated: SalesforceFeedItemCreatedSubscriptionPayload! + + """Get notified when a FeedItem is deleted.""" + feedItemDeleted: SalesforceFeedItemDeletedSubscriptionPayload! + + """Get notified when a FeedItem is resurrected.""" + feedItemUndeleted: SalesforceFeedItemUndeletedSubscriptionPayload! + + """Get notified when a FeedItem is updated.""" + feedItemUpdated: SalesforceFeedItemUpdatedSubscriptionPayload! + + """Get notified when a IdeaComment is created.""" + ideaCommentCreated: SalesforceIdeaCommentCreatedSubscriptionPayload! + + """Get notified when a IdeaComment is deleted.""" + ideaCommentDeleted: SalesforceIdeaCommentDeletedSubscriptionPayload! + + """Get notified when a IdeaComment is resurrected.""" + ideaCommentUndeleted: SalesforceIdeaCommentUndeletedSubscriptionPayload! + + """Get notified when a IdeaComment is updated.""" + ideaCommentUpdated: SalesforceIdeaCommentUpdatedSubscriptionPayload! + + """Get notified when a Idea is created.""" + ideaCreated: SalesforceIdeaCreatedSubscriptionPayload! + + """Get notified when a Idea is deleted.""" + ideaDeleted: SalesforceIdeaDeletedSubscriptionPayload! + + """Get notified when a Idea is resurrected.""" + ideaUndeleted: SalesforceIdeaUndeletedSubscriptionPayload! + + """Get notified when a Idea is updated.""" + ideaUpdated: SalesforceIdeaUpdatedSubscriptionPayload! + + """Get notified when a Lead is created.""" + leadCreated: SalesforceLeadCreatedSubscriptionPayload! + + """Get notified when a Lead is deleted.""" + leadDeleted: SalesforceLeadDeletedSubscriptionPayload! + + """Get notified when a Lead is resurrected.""" + leadUndeleted: SalesforceLeadUndeletedSubscriptionPayload! + + """Get notified when a Lead is updated.""" + leadUpdated: SalesforceLeadUpdatedSubscriptionPayload! + + """Get notified when a Macro is created.""" + macroCreated: SalesforceMacroCreatedSubscriptionPayload! + + """Get notified when a Macro is deleted.""" + macroDeleted: SalesforceMacroDeletedSubscriptionPayload! + + """Get notified when a Macro is resurrected.""" + macroUndeleted: SalesforceMacroUndeletedSubscriptionPayload! + + """Get notified when a Macro is updated.""" + macroUpdated: SalesforceMacroUpdatedSubscriptionPayload! + + """Get notified when a Note is created.""" + noteCreated: SalesforceNoteCreatedSubscriptionPayload! + + """Get notified when a Note is deleted.""" + noteDeleted: SalesforceNoteDeletedSubscriptionPayload! + + """Get notified when a Note is resurrected.""" + noteUndeleted: SalesforceNoteUndeletedSubscriptionPayload! + + """Get notified when a Note is updated.""" + noteUpdated: SalesforceNoteUpdatedSubscriptionPayload! + + """Get notified when a Opportunity is created.""" + opportunityCreated: SalesforceOpportunityCreatedSubscriptionPayload! + + """Get notified when a Opportunity is deleted.""" + opportunityDeleted: SalesforceOpportunityDeletedSubscriptionPayload! + + """Get notified when a OpportunityLineItem is created.""" + opportunityLineItemCreated: SalesforceOpportunityLineItemCreatedSubscriptionPayload! + + """Get notified when a OpportunityLineItem is deleted.""" + opportunityLineItemDeleted: SalesforceOpportunityLineItemDeletedSubscriptionPayload! + + """Get notified when a OpportunityLineItem is resurrected.""" + opportunityLineItemUndeleted: SalesforceOpportunityLineItemUndeletedSubscriptionPayload! + + """Get notified when a OpportunityLineItem is updated.""" + opportunityLineItemUpdated: SalesforceOpportunityLineItemUpdatedSubscriptionPayload! + + """Get notified when a Opportunity is resurrected.""" + opportunityUndeleted: SalesforceOpportunityUndeletedSubscriptionPayload! + + """Get notified when a Opportunity is updated.""" + opportunityUpdated: SalesforceOpportunityUpdatedSubscriptionPayload! + + """Get notified when a Order is created.""" + orderCreated: SalesforceOrderCreatedSubscriptionPayload! + + """Get notified when a Order is deleted.""" + orderDeleted: SalesforceOrderDeletedSubscriptionPayload! + + """Get notified when a OrderItem is created.""" + orderItemCreated: SalesforceOrderItemCreatedSubscriptionPayload! + + """Get notified when a OrderItem is deleted.""" + orderItemDeleted: SalesforceOrderItemDeletedSubscriptionPayload! + + """Get notified when a OrderItem is resurrected.""" + orderItemUndeleted: SalesforceOrderItemUndeletedSubscriptionPayload! + + """Get notified when a OrderItem is updated.""" + orderItemUpdated: SalesforceOrderItemUpdatedSubscriptionPayload! + + """Get notified when a Order is resurrected.""" + orderUndeleted: SalesforceOrderUndeletedSubscriptionPayload! + + """Get notified when a Order is updated.""" + orderUpdated: SalesforceOrderUpdatedSubscriptionPayload! + + """Get notified when a OrgDeleteRequest is created.""" + orgDeleteRequestCreated: SalesforceOrgDeleteRequestCreatedSubscriptionPayload! + + """Get notified when a OrgDeleteRequest is deleted.""" + orgDeleteRequestDeleted: SalesforceOrgDeleteRequestDeletedSubscriptionPayload! + + """Get notified when a OrgDeleteRequest is resurrected.""" + orgDeleteRequestUndeleted: SalesforceOrgDeleteRequestUndeletedSubscriptionPayload! + + """Get notified when a OrgDeleteRequest is updated.""" + orgDeleteRequestUpdated: SalesforceOrgDeleteRequestUpdatedSubscriptionPayload! + + """Get notified when a OrgLifecycleNotification is created.""" + orgLifecycleNotificationCreated: SalesforceOrgLifecycleNotificationCreatedSubscriptionPayload! + + """Get notified when a OrgLifecycleNotification is deleted.""" + orgLifecycleNotificationDeleted: SalesforceOrgLifecycleNotificationDeletedSubscriptionPayload! + + """Get notified when a OrgLifecycleNotification is resurrected.""" + orgLifecycleNotificationUndeleted: SalesforceOrgLifecycleNotificationUndeletedSubscriptionPayload! + + """Get notified when a OrgLifecycleNotification is updated.""" + orgLifecycleNotificationUpdated: SalesforceOrgLifecycleNotificationUpdatedSubscriptionPayload! + + """Get notified when a Partner is created.""" + partnerCreated: SalesforcePartnerCreatedSubscriptionPayload! + + """Get notified when a Partner is deleted.""" + partnerDeleted: SalesforcePartnerDeletedSubscriptionPayload! + + """Get notified when a Partner is resurrected.""" + partnerUndeleted: SalesforcePartnerUndeletedSubscriptionPayload! + + """Get notified when a Partner is updated.""" + partnerUpdated: SalesforcePartnerUpdatedSubscriptionPayload! + + """Get notified when a Pricebook2 is created.""" + pricebook2Created: SalesforcePricebook2CreatedSubscriptionPayload! + + """Get notified when a Pricebook2 is deleted.""" + pricebook2Deleted: SalesforcePricebook2DeletedSubscriptionPayload! + + """Get notified when a Pricebook2 is resurrected.""" + pricebook2Undeleted: SalesforcePricebook2UndeletedSubscriptionPayload! + + """Get notified when a Pricebook2 is updated.""" + pricebook2Updated: SalesforcePricebook2UpdatedSubscriptionPayload! + + """Get notified when a Product2 is created.""" + product2Created: SalesforceProduct2CreatedSubscriptionPayload! + + """Get notified when a Product2 is deleted.""" + product2Deleted: SalesforceProduct2DeletedSubscriptionPayload! + + """Get notified when a Product2 is resurrected.""" + product2Undeleted: SalesforceProduct2UndeletedSubscriptionPayload! + + """Get notified when a Product2 is updated.""" + product2Updated: SalesforceProduct2UpdatedSubscriptionPayload! + + """Get notified when a QuickText is created.""" + quickTextCreated: SalesforceQuickTextCreatedSubscriptionPayload! + + """Get notified when a QuickText is deleted.""" + quickTextDeleted: SalesforceQuickTextDeletedSubscriptionPayload! + + """Get notified when a QuickText is resurrected.""" + quickTextUndeleted: SalesforceQuickTextUndeletedSubscriptionPayload! + + """Get notified when a QuickText is updated.""" + quickTextUpdated: SalesforceQuickTextUpdatedSubscriptionPayload! + + """Get notified when a Solution is created.""" + solutionCreated: SalesforceSolutionCreatedSubscriptionPayload! + + """Get notified when a Solution is deleted.""" + solutionDeleted: SalesforceSolutionDeletedSubscriptionPayload! + + """Get notified when a Solution is resurrected.""" + solutionUndeleted: SalesforceSolutionUndeletedSubscriptionPayload! + + """Get notified when a Solution is updated.""" + solutionUpdated: SalesforceSolutionUpdatedSubscriptionPayload! + + """Get notified when a StreamingChannel is created.""" + streamingChannelCreated: SalesforceStreamingChannelCreatedSubscriptionPayload! + + """Get notified when a StreamingChannel is deleted.""" + streamingChannelDeleted: SalesforceStreamingChannelDeletedSubscriptionPayload! + + """Get notified when a StreamingChannel is resurrected.""" + streamingChannelUndeleted: SalesforceStreamingChannelUndeletedSubscriptionPayload! + + """Get notified when a StreamingChannel is updated.""" + streamingChannelUpdated: SalesforceStreamingChannelUpdatedSubscriptionPayload! + + """Get notified when a Task is created.""" + taskCreated: SalesforceTaskCreatedSubscriptionPayload! + + """Get notified when a Task is deleted.""" + taskDeleted: SalesforceTaskDeletedSubscriptionPayload! + + """Get notified when a Task is resurrected.""" + taskUndeleted: SalesforceTaskUndeletedSubscriptionPayload! + + """Get notified when a Task is updated.""" + taskUpdated: SalesforceTaskUpdatedSubscriptionPayload! + + """Get notified when a TopicAssignment is created.""" + topicAssignmentCreated: SalesforceTopicAssignmentCreatedSubscriptionPayload! + + """Get notified when a TopicAssignment is deleted.""" + topicAssignmentDeleted: SalesforceTopicAssignmentDeletedSubscriptionPayload! + + """Get notified when a TopicAssignment is resurrected.""" + topicAssignmentUndeleted: SalesforceTopicAssignmentUndeletedSubscriptionPayload! + + """Get notified when a TopicAssignment is updated.""" + topicAssignmentUpdated: SalesforceTopicAssignmentUpdatedSubscriptionPayload! + + """Get notified when a Topic is created.""" + topicCreated: SalesforceTopicCreatedSubscriptionPayload! + + """Get notified when a Topic is deleted.""" + topicDeleted: SalesforceTopicDeletedSubscriptionPayload! + + """Get notified when a Topic is resurrected.""" + topicUndeleted: SalesforceTopicUndeletedSubscriptionPayload! + + """Get notified when a Topic is updated.""" + topicUpdated: SalesforceTopicUpdatedSubscriptionPayload! + + """Get notified when a User is created.""" + userCreated: SalesforceUserCreatedSubscriptionPayload! + + """Get notified when a User is deleted.""" + userDeleted: SalesforceUserDeletedSubscriptionPayload! + + """Get notified when a UserProvAccount is created.""" + userProvAccountCreated: SalesforceUserProvAccountCreatedSubscriptionPayload! + + """Get notified when a UserProvAccount is deleted.""" + userProvAccountDeleted: SalesforceUserProvAccountDeletedSubscriptionPayload! + + """Get notified when a UserProvAccountStaging is created.""" + userProvAccountStagingCreated: SalesforceUserProvAccountStagingCreatedSubscriptionPayload! + + """Get notified when a UserProvAccountStaging is deleted.""" + userProvAccountStagingDeleted: SalesforceUserProvAccountStagingDeletedSubscriptionPayload! + + """Get notified when a UserProvAccountStaging is resurrected.""" + userProvAccountStagingUndeleted: SalesforceUserProvAccountStagingUndeletedSubscriptionPayload! + + """Get notified when a UserProvAccountStaging is updated.""" + userProvAccountStagingUpdated: SalesforceUserProvAccountStagingUpdatedSubscriptionPayload! + + """Get notified when a UserProvAccount is resurrected.""" + userProvAccountUndeleted: SalesforceUserProvAccountUndeletedSubscriptionPayload! + + """Get notified when a UserProvAccount is updated.""" + userProvAccountUpdated: SalesforceUserProvAccountUpdatedSubscriptionPayload! + + """Get notified when a UserProvMockTarget is created.""" + userProvMockTargetCreated: SalesforceUserProvMockTargetCreatedSubscriptionPayload! + + """Get notified when a UserProvMockTarget is deleted.""" + userProvMockTargetDeleted: SalesforceUserProvMockTargetDeletedSubscriptionPayload! + + """Get notified when a UserProvMockTarget is resurrected.""" + userProvMockTargetUndeleted: SalesforceUserProvMockTargetUndeletedSubscriptionPayload! + + """Get notified when a UserProvMockTarget is updated.""" + userProvMockTargetUpdated: SalesforceUserProvMockTargetUpdatedSubscriptionPayload! + + """Get notified when a UserProvisioningLog is created.""" + userProvisioningLogCreated: SalesforceUserProvisioningLogCreatedSubscriptionPayload! + + """Get notified when a UserProvisioningLog is deleted.""" + userProvisioningLogDeleted: SalesforceUserProvisioningLogDeletedSubscriptionPayload! + + """Get notified when a UserProvisioningLog is resurrected.""" + userProvisioningLogUndeleted: SalesforceUserProvisioningLogUndeletedSubscriptionPayload! + + """Get notified when a UserProvisioningLog is updated.""" + userProvisioningLogUpdated: SalesforceUserProvisioningLogUpdatedSubscriptionPayload! + + """Get notified when a UserProvisioningRequest is created.""" + userProvisioningRequestCreated: SalesforceUserProvisioningRequestCreatedSubscriptionPayload! + + """Get notified when a UserProvisioningRequest is deleted.""" + userProvisioningRequestDeleted: SalesforceUserProvisioningRequestDeletedSubscriptionPayload! + + """Get notified when a UserProvisioningRequest is resurrected.""" + userProvisioningRequestUndeleted: SalesforceUserProvisioningRequestUndeletedSubscriptionPayload! + + """Get notified when a UserProvisioningRequest is updated.""" + userProvisioningRequestUpdated: SalesforceUserProvisioningRequestUpdatedSubscriptionPayload! + + """Get notified when a User is resurrected.""" + userUndeleted: SalesforceUserUndeletedSubscriptionPayload! + + """Get notified when a User is updated.""" + userUpdated: SalesforceUserUpdatedSubscriptionPayload! +} + +input NpmPackagePublishedArg { + """ + The names of packages to be notified about when published, e.g. ["graphql", "express", "fela"] + """ + names: [String!]! +} + +type NpmNewPackagePublishedSubscriptionPayload { + """Package being published""" + package: NpmPackage! +} + +"""Namespace for Npm subscriptions.""" +type NpmSubscriptionRoot { + """Get notified when *any* package is published or updated on npm""" + allPublishActivity: NpmNewPackagePublishedSubscriptionPayload + + """Get notified when a package is published or updated on npm""" + packagePublished(input: NpmPackagePublishedArg!): NpmNewPackagePublishedSubscriptionPayload +} + +type IntercomNewUserSubscriptionPayload { + """Intercom user that was created""" + user: IntercomUser! +} + +"""Namespace for Intercom subscriptions.""" +type IntercomSubscriptionRoot { + """Get notified with a new user is created""" + newUser: IntercomNewUserSubscriptionPayload! +} + +input TwilioIncomingSMSArg { + """The number you want to be notified when someone sends it a message.""" + to: String! +} + +type TwilioNewSMSSubscriptionPayload { + """SMS that was received""" + sms: TwilioMessage! +} + +"""Namespace for Twilio subscriptions.""" +type TwilioSubscriptionRoot { + """Get notified when a number receives an incoming sms""" + incomingSMS(input: TwilioIncomingSMSArg!): TwilioNewSMSSubscriptionPayload! +} + +input TrelloNewListSubscriptionInput { + """ + The member that you want to subscribe to new lists on. Only provide one of `boardId`, `organizationId`, or `memberId`. + """ + memberId: String + + """ + The board that you want to subscribe to new lists on. Only provide one of `boardId`, `organizationId`, or `memberId`. + """ + boardId: String + + """ + The organization that you want to subscribe to new lists on. Only provide one of `boardId`, `organizationId`, or `memberId`. + """ + organizationId: String +} + +type TrelloNewListSubscriptionPayload { + """list that was created""" + list: TrelloList! + + """Action associated with the list creation.""" + action: TrelloAction! +} + +input TrelloNewCardSubscriptionInput { + """ + The member that you want to subscribe to new cards on. Only provide one of `boardId`, `listId`, `organizationId`, or `memberId`. + """ + memberId: String + + """ + The board that you want to subscribe to new cards on. Only provide one of `boardId`, `listId`, `organizationId`, or `memberId`. + """ + boardId: String + + """ + The list that you want to subscribe to new cards on. Only provide one of `boardId`, `listId`, `organizationId`, or `memberId`. + """ + listId: String + + """ + The organization that you want to subscribe to new cards on. Only provide one of `boardId`, `listId`, `organizationId`, or `memberId`. + """ + organizationId: String +} + +type TrelloNewCardSubscriptionPayload { + """Card that was created""" + card: TrelloCard! + + """Action associated with the card creation.""" + action: TrelloAction! +} + +input TrelloNewBoardSubscriptionInput { + """ + The member that you want to subscribe to new boards on. Only provide one of `memberId` or `organizationId`. + """ + memberId: String + + """ + The organization that you want to subscribe to new boards on. Only provide one of `memberId` or `organizationId`. + """ + organizationId: String +} + +type TrelloNewBoardSubscriptionPayload { + """Board that was created""" + board: TrelloBoard! + + """Action associated with the board creation.""" + action: TrelloAction! +} + +input TrelloNewActionSubscriptionInput { + """ + The board that you want to subscribe to new actions on. Only provide one of `cardId`, `listId`, `memberId`, `organizationId`, or `boardId`. + """ + boardId: String + + """ + The card that you want to subscribe to new actions on. Only provide one of `cardId`, `listId`, `memberId`, `organizationId`, or `boardId`. + """ + cardId: String + + """ + The list that you want to subscribe to new actions on. Only provide one of `cardId`, `listId`, `memberId`, `organizationId`, or `boardId`. + """ + listId: String + + """ + The member that you want to subscribe to new actions on. Only provide one of `cardId`, `listId`, `memberId`, `organizationId`, or `boardId`. + """ + memberId: String + + """ + The organization that you want to subscribe to new actions on. Only provide one of `cardId`, `listId`, `memberId`, `organizationId`, or `boardId`. + """ + organizationId: String +} + +type TrelloNewActionSubscriptionPayload { + """Action""" + action: TrelloAction! +} + +"""Namespace for Trello subscriptions.""" +type TrelloSubscriptionRoot { + """Get notified with a new action is created""" + newAction(input: TrelloNewActionSubscriptionInput!): TrelloNewActionSubscriptionPayload! + + """Get notified with a new board is created""" + newBoard(input: TrelloNewBoardSubscriptionInput!): TrelloNewBoardSubscriptionPayload! + + """Get notified with a new card is created""" + newCard(input: TrelloNewCardSubscriptionInput!): TrelloNewCardSubscriptionPayload! + + """Get notified with a new list is created""" + newList(input: TrelloNewListSubscriptionInput!): TrelloNewListSubscriptionPayload! +} + +input OneGraphSubscriptionSecretInput { + """ + A hex-encoded key that will be used to sign all webhooks sent from this subscription. + + You can use the signature to validate that the subscription was sent from OneGraph. + + The signature will be sent in the `X-OneGraph-Signature` header of the webhook. The header will contain two parts, a signature and a timestamp (in seconds since the epoch), in the following format: + + ``` + X-OneGraph-Signature: t=1582852002,hmac_sha256=7d797ecd431e1a98aaba2f387f2c43241a13c1f093fd9d7e661758963744549a + ``` + + To verify the signature: + 1. Extract the timestamp (1582852002 above) + 2. Extract the signature (7d797ecd431e1a98aaba2f387f2c43241a13c1f093fd9d7e661758963744549a above) + 3. Concatenate the timestamp and the request body, separeted by a period (e.g. `t + '.' + requestBody`) + 4. Compute the hmac_sha256 hash of (3) + 5. Compare the hash with the provided signature using a constant-time comparison function (e.g. crypto.timingSafeEqual in Node) + 6. Reject the request if the hash you computed does not match the provided signature or if the timestamp is too far in the past (typically, 5 minutes) + + Example for validating the body in Node.js: + + ```js + const SECRET = 'your hmacSha256Key'; + const signature = res.get('X-OneGraph-Signature'); + if (!signature) { + throw new Error('Missing signature'); + } + + const sig = {}; + for (const pair of signature.split(',')) { + const [k, v] = pair.split('='); + sig[k] = v; + } + + if (!sig.t || !sig.hmac_sha256) { + throw new Error('Invalid signature header'); + } + + const hash = crypto + .createHmac('sha256', SECRET) + .update(sig.t) + .update('.') + .update(res.body) + .digest('hex'); + + if ( + !crypto.timingSafeEqual( + Buffer.from(hash, 'hex'), + Buffer.from(sig.hmac_sha256, 'hex'), + ) + ) { + throw new Error('Invalid signature'); + } + + if (parseInt(sig.t, 10) < Date.now() / 1000 - 300 /* 5 minutes */) { + throw new Error('Request is too old'); + } + + // Signature is valid + ``` + + Examples for creating the key: + + Cli: + ```cli + $ openssl rand -hex 32 + ``` + + Node: + ```js + require('crypto').randomBytes(32).toString('hex'); + ``` + + Ruby: + ```ruby + ruby -rsecurerandom -e 'puts SecureRandom.hex(32)' + ``` + """ + hmacSha256Key: String +} + +"""Optional auth arg if not using OneGraph's built-in authentication""" +input OneGraphSubscriptionAuthArg { + twilio: OneGraphTwilioAuth + + """ + + Optional authentication for making requests to the Gmail API if you want + to use a custom gmail app instead of OneGraph's built-in app. + + Subscriptions are long-lived, so a refresh token must also be provided. + + If you use this arg, make sure you've updated OneGraph to use your OAuth credentials in the dashboard. + + """ + gmail: OneGraphSubscriptionGmailAuthArg +} + +"""Namespace for Gmail subscriptions.""" +type GmailSubscriptionRoot { + newMessage: GmailMessage! +} + +""" + +Optional authentication for making requests to the Gmail API if you want +to use a custom gmail app instead of OneGraph's built-in app. + +Subscriptions are long-lived, so a refresh token must also be provided. + +If you use this arg, make sure you've updated OneGraph to use your OAuth credentials in the dashboard. + +""" +input OneGraphSubscriptionGmailAuthArg { + refreshToken: String! + accessToken: String! +} + +type Subscription { + gmailNewMessage( + """ + + Optional authentication for making requests to the Gmail API if you want + to use a custom gmail app instead of OneGraph's built-in app. + + Subscriptions are long-lived, so a refresh token must also be provided. + + If you use this arg, make sure you've updated OneGraph to use your OAuth credentials in the dashboard. + + """ + gmailAuth: OneGraphSubscriptionGmailAuthArg + + """ + Webhook URL that will receive a POST request every time there is new data for the subscription. The endpoint should return a 200 within 30 seconds to be considered successful. If the request does not succeed, it will be retried. + """ + webhookUrl: String! + ): GmailMessage! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + gmail( + secret: OneGraphSubscriptionSecretInput + auth: OneGraphSubscriptionAuthArg + + """ + Webhook URL that will receive a POST request every time there is new data for the subscription. The endpoint should return a 200 within 30 seconds to be considered successful. If the request does not succeed, it will be retried. + """ + webhookUrl: String + ): GmailSubscriptionRoot! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + trello( + secret: OneGraphSubscriptionSecretInput + auth: OneGraphSubscriptionAuthArg + + """ + Webhook URL that will receive a POST request every time there is new data for the subscription. The endpoint should return a 200 within 30 seconds to be considered successful. If the request does not succeed, it will be retried. + """ + webhookUrl: String + ): TrelloSubscriptionRoot! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + twilio( + secret: OneGraphSubscriptionSecretInput + auth: OneGraphSubscriptionAuthArg + + """ + Webhook URL that will receive a POST request every time there is new data for the subscription. The endpoint should return a 200 within 30 seconds to be considered successful. If the request does not succeed, it will be retried. + """ + webhookUrl: String + ): TwilioSubscriptionRoot! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + intercom( + secret: OneGraphSubscriptionSecretInput + auth: OneGraphSubscriptionAuthArg + + """ + Webhook URL that will receive a POST request every time there is new data for the subscription. The endpoint should return a 200 within 30 seconds to be considered successful. If the request does not succeed, it will be retried. + """ + webhookUrl: String + ): IntercomSubscriptionRoot! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + npm( + secret: OneGraphSubscriptionSecretInput + auth: OneGraphSubscriptionAuthArg + + """ + Webhook URL that will receive a POST request every time there is new data for the subscription. The endpoint should return a 200 within 30 seconds to be considered successful. If the request does not succeed, it will be retried. + """ + webhookUrl: String + ): NpmSubscriptionRoot! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + salesforce( + secret: OneGraphSubscriptionSecretInput + auth: OneGraphSubscriptionAuthArg + + """ + Webhook URL that will receive a POST request every time there is new data for the subscription. The endpoint should return a 200 within 30 seconds to be considered successful. If the request does not succeed, it will be retried. + """ + webhookUrl: String + ): SalesforceSubscriptionRoot! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + github( + secret: OneGraphSubscriptionSecretInput + auth: OneGraphSubscriptionAuthArg + + """ + Webhook URL that will receive a POST request every time there is new data for the subscription. The endpoint should return a 200 within 30 seconds to be considered successful. If the request does not succeed, it will be retried. + """ + webhookUrl: String + ): GithubSubscriptionRoot! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") +} + +input SignoutServicesData { + services: [OneGraphServiceEnum!]! +} + +input OneGraphSignoutServiceUserInput { + """ + Foreign user id for the user you want to sign out. You can find the foreignUser id through me.serviceMetadata.loggedInServices + """ + foreignUserId: String! + + """Service that you want to sign out of.""" + service: OneGraphServiceEnum! +} + +type SignoutServicesResponsePayload { + me: Viewer! +} + +"""Autogenerated input type of UserFollowUndo""" +input ProductHuntUserFollowUndoInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the User to stop following.""" + userId: ID! +} + +"""Autogenerated return type of UserFollowUndo""" +type ProductHuntUserFollowUndoPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """""" + errors: [ProductHuntError!]! + + """""" + node: ProductHuntUser +} + +"""Autogenerated input type of UserFollow""" +input ProductHuntUserFollowInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the User to follow.""" + userId: ID! +} + +"""Autogenerated return type of UserFollow""" +type ProductHuntUserFollowPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """""" + errors: [ProductHuntError!]! + + """""" + node: ProductHuntUser +} + +"""Autogenerated input type of GoalUpdate""" +input ProductHuntGoalUpdateInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Set the title of the Goal. Accepts a non empty string. Maximum length is 80 characters. + """ + title: String + + """ + Set the date and time when the Goal is due in future. Pass null to make the Goal never due. + """ + dueAt: String + + """ + ID of the MakerGroup(space) to set on the Goal. Cannot be null. Viewer should be accepted member of the MakerGroup. + """ + groupId: ID + + """ + ID of the MakerProject to set on the Goal. Pass null to remove MakerProject from Goal. MakerProject should be created by Viewer. + """ + projectId: ID + + """ID of the Goal to update.""" + goalId: ID! +} + +"""Autogenerated return type of GoalUpdate""" +type ProductHuntGoalUpdatePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """""" + errors: [ProductHuntError!]! + + """""" + node: ProductHuntGoal +} + +"""Autogenerated input type of GoalMarkAsIncomplete""" +input ProductHuntGoalMarkAsIncompleteInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the Goal to mark complete.""" + goalId: ID! +} + +"""Autogenerated return type of GoalMarkAsIncomplete""" +type ProductHuntGoalMarkAsIncompletePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """""" + errors: [ProductHuntError!]! + + """""" + node: ProductHuntGoal +} + +"""Autogenerated input type of GoalMarkAsComplete""" +input ProductHuntGoalMarkAsCompleteInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the goal to mark complete.""" + goalId: ID! +} + +"""Autogenerated return type of GoalMarkAsComplete""" +type ProductHuntGoalMarkAsCompletePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """""" + errors: [ProductHuntError!]! + + """""" + node: ProductHuntGoal +} + +"""Autogenerated input type of GoalCreate""" +input ProductHuntGoalCreateInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Set the title of the Goal. Accepts a non empty string. Maximum length is 80 characters. + """ + title: String! + + """ + Set the date and time when the Goal is due in future. Pass null to make Goal never due. + """ + dueAt: String + + """ + ID of the MakerGroup(space) to set on the Goal. Viewer should be accepted member of the MakerGroup. + """ + groupId: ID + + """ + ID of the MakerProject to set on the Goal. Pass null to remove MakerProject from Goal. MakerProject should be created by Viewer. + """ + projectId: ID +} + +"""Autogenerated return type of GoalCreate""" +type ProductHuntGoalCreatePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """""" + errors: [ProductHuntError!]! + + """""" + node: ProductHuntGoal +} + +"""Autogenerated input type of GoalCheerUndo""" +input ProductHuntGoalCheerUndoInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the Goal to cheer.""" + goalId: ID! +} + +"""Autogenerated return type of GoalCheerUndo""" +type ProductHuntGoalCheerUndoPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """""" + errors: [ProductHuntError!]! + + """""" + node: ProductHuntGoal +} + +"""Autogenerated input type of GoalCheer""" +input ProductHuntGoalCheerInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the Goal to cheer.""" + goalId: ID! +} + +"""""" +type ProductHuntError { + """Field for which the error occurred.""" + field: String! + + """Error message.""" + message: String! +} + +"""Autogenerated return type of GoalCheer""" +type ProductHuntGoalCheerPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """""" + errors: [ProductHuntError!]! + + """""" + node: ProductHuntGoal +} + +"""""" +type ProductHuntMutation { + """Cheer a Goal as Viewer. Returns the cheered Goal""" + goalCheer(input: ProductHuntGoalCheerInput!): ProductHuntGoalCheerPayload! + + """Cheer a Goal as Viewer. Returns the cheered Goal""" + goalCheerUndo(input: ProductHuntGoalCheerUndoInput!): ProductHuntGoalCheerUndoPayload! + + """Create a Goal for Viewer. Returns the created Goal.""" + goalCreate(input: ProductHuntGoalCreateInput!): ProductHuntGoalCreatePayload! + + """Marks a Goal as complete. Returns the updated Goal""" + goalMarkAsComplete(input: ProductHuntGoalMarkAsCompleteInput!): ProductHuntGoalMarkAsCompletePayload! + + """Marks a Goal as incomplete. Returns the updated Goal.""" + goalMarkAsIncomplete(input: ProductHuntGoalMarkAsIncompleteInput!): ProductHuntGoalMarkAsIncompletePayload! + + """ + Update a Goal's `due_at`, `title`, `project` or `group` fields. Returns the updated Goal. + """ + goalUpdate(input: ProductHuntGoalUpdateInput!): ProductHuntGoalUpdatePayload! + + """Follow a User as Viewer. Returns the followed User.""" + userFollow(input: ProductHuntUserFollowInput!): ProductHuntUserFollowPayload! + + """Stop following a User as Viewer. Returns the un-followed User.""" + userFollowUndo(input: ProductHuntUserFollowUndoInput!): ProductHuntUserFollowUndoPayload! +} + +""" +Make a REST API call to the GitHub API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type GithubPassthroughMutation { + """ + Make a POST request to the GitHub API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + post( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PUT request to the GitHub API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + put( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PATCH request to the GitHub API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + patch( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a DELETE request to the GitHub API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + delete( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +input GitHubMergePullRequest_oneGraphInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Merge method to use. Possible values are merge, squash or rebase. Default is merge + """ + mergeMethod: String + + """ + SHA that pull request head must match to allow merge. You can find the sha under the `headRef.oid` field of the Pull Request + """ + sha: String! + + """Extra detail to append to automatic commit message.""" + commitMessage: String + + """Title for the automatic commit message.""" + commitTitle: String! + + """The pull request number to merge""" + number: Int! + + """The name of the repository.""" + repoName: String! + + """The login field of a user or organization.""" + repoOwner: String! +} + +type GitHubMergePullRequest_oneGraphResponsePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + pullRequest: GitHubPullRequest! +} + +input GitHubCreateFork_oneGraphInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Optional parameter to specify the organization name if forking into an organization. By default a fork will be created under the currently authenticated user. + """ + organization: String + + """The name of the repository.""" + repoName: String! + + """The login field of a user or organization.""" + repoOwner: String! +} + +type GitHubCreateFork_oneGraphResponsePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + repository: GitHubRepository! +} + +input GitHubCreatePullRequest_oneGraphInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """Indicates whether maintainers can modify the pull request.""" + maintainerCanModify: Boolean + + """The contents of the pull request.""" + body: String + + """ + The name of the branch you want the changes pulled into. This should be an existing branch on the current repository. You cannot submit a pull request to one repository that requests a merge to a base of another repository. + """ + destinationBranch: String + + """ + The name of the branch where your changes are implemented. For cross-repository pull requests in the same network, namespace `head` with a user like this: `username:branch`. + """ + sourceBranch: String! + + """The title of the pull request.""" + title: String! + + """The name of the repository.""" + repoName: String! + + """The login field of a user or organization.""" + repoOwner: String! +} + +type GitHubCreatePullRequest_oneGraphResponsePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + pullRequest: GitHubPullRequest! +} + +input GitHubCreateOrUpdateFileContent_oneGraphCommitterInput { + """The name of the author or committer of the commit.""" + name: String + + """The email of the author or committer of the commit.""" + email: String +} + +input GitHubCreateOrUpdateFileContent_oneGraphInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The commit author.""" + author: GitHubCreateOrUpdateFileContent_oneGraphCommitterInput + + """ + The updated content encoded in base64 of the file. This argument cannot be used with `plainContent`. + """ + base64Content: String + + """ + The updated content in plain-text of the file. This argument cannot be used with `base64Content`. + """ + plainContent: String + + """The commit message to use when updating this file.""" + message: String! + + """ + The sha of the file to be updated (if updating a file). If this doesn't match, the update mutation will be rejected to prevent updating the wrong version of the file. + """ + existingFileSha: String + + """The name of the branch to update the file on, must already exist.""" + branchName: String + + """ + The path to the file to create or update (without a leading slash), e.g. `README.md`. + """ + path: String! + + """The name of the repository.""" + repoName: String! + + """The login field of a user or organization.""" + repoOwner: String! +} + +type GitHubCreateOrUpdateFileContent_oneGraphResponsePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + commit: GitHubCommit! +} + +input GitHubCreateBranch_oneGraphInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The sha of the commit to create the branch from. If omitted, will default to the current sha of the `master` branch + """ + sha: String + + """The name of the branch to create.""" + branchName: String! + + """ + The existing branch to create the new branch from, defaults to `master`. + """ + from: String + + """The name of the repository.""" + repoName: String! + + """The login field of a user or organization.""" + repoOwner: String! +} + +type GitHubCreateBranch_oneGraphResponsePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + ref: GitHubRef! +} + +input GitHubDeleteMilestone_oneGraphInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the milestone to delete.""" + milestoneId: String! +} + +type GitHubDeleteMilestone_oneGraphResponsePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + repository: GitHubRepository! +} + +input GitHubUpdateMilestone_oneGraphInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The milestone due date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`. + """ + dueOn: String + + """A description of the milestone.""" + description: String + + """ + The state of the milestone. Either `OPEN` or `CLOSED`. Default: OPEN + + """ + state: GitHubMilestoneState_oneGraph + + """The title of the milestone.""" + title: String + + """The ID of the milestone to update.""" + milestoneId: String! +} + +type GitHubUpdateMilestone_oneGraphResponsePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + milestone: GitHubMilestone! +} + +"""Identifies the state of the milestone.""" +enum GitHubMilestoneState_oneGraph { + """A milestone that is still open.""" + OPEN + + """A milestone that has been closed.""" + CLOSED +} + +input GitHubCreateMilestone_oneGraphInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The milestone due date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`. + """ + dueOn: String + + """A description of the milestone.""" + description: String + + """ + The state of the milestone. Either `OPEN` or `CLOSED`. Default: OPEN + + """ + state: GitHubMilestoneState_oneGraph + + """The title of the milestone.""" + title: String! + + """The name of the repository.""" + repoName: String! + + """The login field of a user or organization.""" + repoOwner: String! +} + +type GitHubCreateMilestone_oneGraphResponsePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + milestone: GitHubMilestone! +} + +input GitHubCreateIssueTempInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Logins for Users to assign to this issue. NOTE: Only users with push access can set assignees for new issues. Assignees are silently dropped otherwise. + """ + assignees: [String!] + + """ + Labels to associate with this issue. NOTE: Only users with push access can set labels for new issues. Labels are silently dropped otherwise. + """ + labels: [String!] + + """ + The number of the milestone to associate this issue with. NOTE: Only users with push access can set the milestone for new issues. The milestone is silently dropped otherwise. + """ + milestone: Int + + """The contents of the issue.""" + body: String + + """The title of the issue.""" + title: String! + + """The name of the repository.""" + repoName: String! + + """The login field of a user or organization.""" + repoOwner: String! +} + +type GitHubCreateIssueTempResponsePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + issue: GitHubIssue! +} + +input GitHubCreateRepositoryTempInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The description of the repository.""" + description: String + + """The name of the repository.""" + repoName: String! +} + +type GitHubCreateRepositoryTempResponsePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + repository: GitHubRepository! +} + +"""Autogenerated input type of UpdateTopics""" +input GitHubUpdateTopicsInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """An array of topic names.""" + topicNames: [String!]! + + """The Node ID of the repository.""" + repositoryId: ID! +} + +"""Autogenerated return type of UpdateTopics""" +type GitHubUpdateTopicsPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """Names of the provided topics that are not valid.""" + invalidTopicNames: [String!] + + """The updated repository.""" + repository: GitHubRepository +} + +"""Autogenerated input type of UpdateTeamDiscussionComment""" +input GitHubUpdateTeamDiscussionCommentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The current version of the body content.""" + bodyVersion: String + + """The updated text of the comment.""" + body: String! + + """The ID of the comment to modify.""" + id: ID! +} + +"""Autogenerated return type of UpdateTeamDiscussionComment""" +type GitHubUpdateTeamDiscussionCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated comment.""" + teamDiscussionComment: GitHubTeamDiscussionComment +} + +"""Autogenerated input type of UpdateTeamDiscussion""" +input GitHubUpdateTeamDiscussionInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """If provided, sets the pinned state of the updated discussion.""" + pinned: Boolean + + """ + The current version of the body content. If provided, this update operation will be rejected if the given version does not match the latest version on the server. + """ + bodyVersion: String + + """The updated text of the discussion.""" + body: String + + """The updated title of the discussion.""" + title: String + + """The Node ID of the discussion to modify.""" + id: ID! +} + +"""Autogenerated return type of UpdateTeamDiscussion""" +type GitHubUpdateTeamDiscussionPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated discussion.""" + teamDiscussion: GitHubTeamDiscussion +} + +"""Autogenerated input type of UpdateSubscription""" +input GitHubUpdateSubscriptionInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The new state of the subscription.""" + state: GitHubSubscriptionState! + + """The Node ID of the subscribable object to modify.""" + subscribableId: ID! +} + +"""Autogenerated return type of UpdateSubscription""" +type GitHubUpdateSubscriptionPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The input subscribable entity.""" + subscribable: GitHubSubscribable +} + +"""Autogenerated input type of UpdateRepository""" +input GitHubUpdateRepositoryInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Indicates if the repository should have the project boards feature enabled. + """ + hasProjectsEnabled: Boolean + + """Indicates if the repository should have the issues feature enabled.""" + hasIssuesEnabled: Boolean + + """Indicates if the repository should have the wiki feature enabled.""" + hasWikiEnabled: Boolean + + """ + The URL for a web page about this repository. Pass an empty string to erase the existing URL. + """ + homepageUrl: String + + """ + Whether this repository should be marked as a template such that anyone who can access it can create new repositories with the same files and directory structure. + """ + template: Boolean + + """ + A new description for the repository. Pass an empty string to erase the existing description. + """ + description: String + + """The new name of the repository.""" + name: String + + """The ID of the repository to update.""" + repositoryId: ID! +} + +"""Autogenerated return type of UpdateRepository""" +type GitHubUpdateRepositoryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated repository.""" + repository: GitHubRepository +} + +"""Autogenerated input type of UpdateRef""" +input GitHubUpdateRefInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """Permit updates of branch Refs that are not fast-forwards?""" + force: Boolean + + """The GitObjectID that the Ref shall be updated to target.""" + oid: String! + + """The Node ID of the Ref to be updated.""" + refId: ID! +} + +"""Autogenerated return type of UpdateRef""" +type GitHubUpdateRefPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated Ref.""" + ref: GitHubRef +} + +"""Autogenerated input type of UpdatePullRequestReviewComment""" +input GitHubUpdatePullRequestReviewCommentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The text of the comment.""" + body: String! + + """The Node ID of the comment to modify.""" + pullRequestReviewCommentId: ID! +} + +"""Autogenerated return type of UpdatePullRequestReviewComment""" +type GitHubUpdatePullRequestReviewCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated comment.""" + pullRequestReviewComment: GitHubPullRequestReviewComment +} + +"""Autogenerated input type of UpdatePullRequestReview""" +input GitHubUpdatePullRequestReviewInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The contents of the pull request review body.""" + body: String! + + """The Node ID of the pull request review to modify.""" + pullRequestReviewId: ID! +} + +"""Autogenerated return type of UpdatePullRequestReview""" +type GitHubUpdatePullRequestReviewPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated pull request review.""" + pullRequestReview: GitHubPullRequestReview +} + +enum GitHubPullRequestUpdateState { + """A pull request that is still open.""" + OPEN + + """A pull request that has been closed without being merged.""" + CLOSED +} + +"""Autogenerated input type of UpdatePullRequest""" +input GitHubUpdatePullRequestInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """An array of Node IDs for projects associated with this pull request.""" + projectIds: [ID!] + + """An array of Node IDs of labels for this pull request.""" + labelIds: [ID!] + + """The Node ID of the milestone for this pull request.""" + milestoneId: ID + + """An array of Node IDs of users for this pull request.""" + assigneeIds: [ID!] + + """Indicates whether maintainers can modify the pull request.""" + maintainerCanModify: Boolean + + """The target state of the pull request.""" + state: GitHubPullRequestUpdateState + + """The contents of the pull request.""" + body: String + + """The title of the pull request.""" + title: String + + """ + The name of the branch you want your changes pulled into. This should be an existing branch + on the current repository. + + """ + baseRefName: String + + """The Node ID of the pull request.""" + pullRequestId: ID! +} + +"""Autogenerated return type of UpdatePullRequest""" +type GitHubUpdatePullRequestPayload { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated pull request.""" + pullRequest: GitHubPullRequest +} + +"""Autogenerated input type of UpdateProjectColumn""" +input GitHubUpdateProjectColumnInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The name of project column.""" + name: String! + + """The ProjectColumn ID to update.""" + projectColumnId: ID! +} + +"""Autogenerated return type of UpdateProjectColumn""" +type GitHubUpdateProjectColumnPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated project column.""" + projectColumn: GitHubProjectColumn +} + +"""Autogenerated input type of UpdateProjectCard""" +input GitHubUpdateProjectCardInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The note of ProjectCard.""" + note: String + + """Whether or not the ProjectCard should be archived""" + isArchived: Boolean + + """The ProjectCard ID to update.""" + projectCardId: ID! +} + +"""Autogenerated return type of UpdateProjectCard""" +type GitHubUpdateProjectCardPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated ProjectCard.""" + projectCard: GitHubProjectCard +} + +"""Autogenerated input type of UpdateProject""" +input GitHubUpdateProjectInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """Whether the project is public or not.""" + public: Boolean + + """Whether the project is open or closed.""" + state: GitHubProjectState + + """The description of project.""" + body: String + + """The name of project.""" + name: String + + """The Project ID to update.""" + projectId: ID! +} + +"""Autogenerated return type of UpdateProject""" +type GitHubUpdateProjectPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated project.""" + project: GitHubProject +} + +"""Autogenerated input type of UpdateIssueComment""" +input GitHubUpdateIssueCommentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated text of the comment.""" + body: String! + + """The ID of the IssueComment to modify.""" + id: ID! +} + +"""Autogenerated return type of UpdateIssueComment""" +type GitHubUpdateIssueCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated comment.""" + issueComment: GitHubIssueComment +} + +"""Autogenerated input type of UpdateIssue""" +input GitHubUpdateIssueInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """An array of Node IDs for projects associated with this issue.""" + projectIds: [ID!] + + """The desired issue state.""" + state: GitHubIssueState + + """An array of Node IDs of labels for this issue.""" + labelIds: [ID!] + + """The Node ID of the milestone for this issue.""" + milestoneId: ID + + """An array of Node IDs of users for this issue.""" + assigneeIds: [ID!] + + """The body for the issue description.""" + body: String + + """The title for the issue.""" + title: String + + """The ID of the Issue to modify.""" + id: ID! +} + +"""Autogenerated return type of UpdateIssue""" +type GitHubUpdateIssuePayload { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The issue.""" + issue: GitHubIssue +} + +"""Autogenerated input type of UpdateIpAllowListEntry""" +input GitHubUpdateIpAllowListEntryInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Whether the IP allow list entry is active when an IP allow list is enabled. + """ + isActive: Boolean! + + """An optional name for the IP allow list entry.""" + name: String + + """An IP address or range of addresses in CIDR notation.""" + allowListValue: String! + + """The ID of the IP allow list entry to update.""" + ipAllowListEntryId: ID! +} + +"""Autogenerated return type of UpdateIpAllowListEntry""" +type GitHubUpdateIpAllowListEntryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The IP allow list entry that was updated.""" + ipAllowListEntry: GitHubIpAllowListEntry +} + +"""Autogenerated input type of UpdateIpAllowListEnabledSetting""" +input GitHubUpdateIpAllowListEnabledSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The value for the IP allow list enabled setting.""" + settingValue: GitHubIpAllowListEnabledSettingValue! + + """The ID of the owner on which to set the IP allow list enabled setting.""" + ownerId: ID! +} + +"""Autogenerated return type of UpdateIpAllowListEnabledSetting""" +type GitHubUpdateIpAllowListEnabledSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The IP allow list owner on which the setting was updated.""" + owner: GitHubIpAllowListOwner +} + +""" +Autogenerated input type of UpdateEnterpriseTwoFactorAuthenticationRequiredSetting +""" +input GitHubUpdateEnterpriseTwoFactorAuthenticationRequiredSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The value for the two factor authentication required setting on the enterprise. + """ + settingValue: GitHubEnterpriseEnabledSettingValue! + + """ + The ID of the enterprise on which to set the two factor authentication required setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseTwoFactorAuthenticationRequiredSetting +""" +type GitHubUpdateEnterpriseTwoFactorAuthenticationRequiredSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The enterprise with the updated two factor authentication required setting. + """ + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the two factor authentication required setting. + """ + message: String +} + +"""Autogenerated input type of UpdateEnterpriseTeamDiscussionsSetting""" +input GitHubUpdateEnterpriseTeamDiscussionsSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The value for the team discussions setting on the enterprise.""" + settingValue: GitHubEnterpriseEnabledDisabledSettingValue! + + """The ID of the enterprise on which to set the team discussions setting.""" + enterpriseId: ID! +} + +"""Autogenerated return type of UpdateEnterpriseTeamDiscussionsSetting""" +type GitHubUpdateEnterpriseTeamDiscussionsSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The enterprise with the updated team discussions setting.""" + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the team discussions setting. + """ + message: String +} + +"""Autogenerated input type of UpdateEnterpriseRepositoryProjectsSetting""" +input GitHubUpdateEnterpriseRepositoryProjectsSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The value for the repository projects setting on the enterprise.""" + settingValue: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + The ID of the enterprise on which to set the repository projects setting. + """ + enterpriseId: ID! +} + +"""Autogenerated return type of UpdateEnterpriseRepositoryProjectsSetting""" +type GitHubUpdateEnterpriseRepositoryProjectsSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The enterprise with the updated repository projects setting.""" + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the repository projects setting. + """ + message: String +} + +"""Autogenerated input type of UpdateEnterpriseProfile""" +input GitHubUpdateEnterpriseProfileInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The location of the enterprise.""" + location: String + + """The URL of the enterprise's website.""" + websiteUrl: String + + """The description of the enterprise.""" + description: String + + """The name of the enterprise.""" + name: String + + """The Enterprise ID to update.""" + enterpriseId: ID! +} + +"""Autogenerated return type of UpdateEnterpriseProfile""" +type GitHubUpdateEnterpriseProfilePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated enterprise.""" + enterprise: GitHubEnterprise +} + +""" +Autogenerated input type of UpdateEnterpriseOrganizationProjectsSetting +""" +input GitHubUpdateEnterpriseOrganizationProjectsSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The value for the organization projects setting on the enterprise.""" + settingValue: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + The ID of the enterprise on which to set the organization projects setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseOrganizationProjectsSetting +""" +type GitHubUpdateEnterpriseOrganizationProjectsSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The enterprise with the updated organization projects setting.""" + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the organization projects setting. + """ + message: String +} + +""" +Autogenerated input type of UpdateEnterpriseMembersCanViewDependencyInsightsSetting +""" +input GitHubUpdateEnterpriseMembersCanViewDependencyInsightsSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The value for the members can view dependency insights setting on the enterprise. + """ + settingValue: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + The ID of the enterprise on which to set the members can view dependency insights setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseMembersCanViewDependencyInsightsSetting +""" +type GitHubUpdateEnterpriseMembersCanViewDependencyInsightsSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The enterprise with the updated members can view dependency insights setting. + """ + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the members can view dependency insights setting. + """ + message: String +} + +""" +Autogenerated input type of UpdateEnterpriseMembersCanUpdateProtectedBranchesSetting +""" +input GitHubUpdateEnterpriseMembersCanUpdateProtectedBranchesSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The value for the members can update protected branches setting on the enterprise. + """ + settingValue: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + The ID of the enterprise on which to set the members can update protected branches setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseMembersCanUpdateProtectedBranchesSetting +""" +type GitHubUpdateEnterpriseMembersCanUpdateProtectedBranchesSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The enterprise with the updated members can update protected branches setting. + """ + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the members can update protected branches setting. + """ + message: String +} + +""" +Autogenerated input type of UpdateEnterpriseMembersCanMakePurchasesSetting +""" +input GitHubUpdateEnterpriseMembersCanMakePurchasesSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The value for the members can make purchases setting on the enterprise. + """ + settingValue: GitHubEnterpriseMembersCanMakePurchasesSettingValue! + + """ + The ID of the enterprise on which to set the members can make purchases setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseMembersCanMakePurchasesSetting +""" +type GitHubUpdateEnterpriseMembersCanMakePurchasesSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The enterprise with the updated members can make purchases setting.""" + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the members can make purchases setting. + """ + message: String +} + +""" +Autogenerated input type of UpdateEnterpriseMembersCanInviteCollaboratorsSetting +""" +input GitHubUpdateEnterpriseMembersCanInviteCollaboratorsSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The value for the members can invite collaborators setting on the enterprise. + """ + settingValue: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + The ID of the enterprise on which to set the members can invite collaborators setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseMembersCanInviteCollaboratorsSetting +""" +type GitHubUpdateEnterpriseMembersCanInviteCollaboratorsSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The enterprise with the updated members can invite collaborators setting. + """ + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the members can invite collaborators setting. + """ + message: String +} + +""" +Autogenerated input type of UpdateEnterpriseMembersCanDeleteRepositoriesSetting +""" +input GitHubUpdateEnterpriseMembersCanDeleteRepositoriesSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The value for the members can delete repositories setting on the enterprise. + """ + settingValue: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + The ID of the enterprise on which to set the members can delete repositories setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseMembersCanDeleteRepositoriesSetting +""" +type GitHubUpdateEnterpriseMembersCanDeleteRepositoriesSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The enterprise with the updated members can delete repositories setting. + """ + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the members can delete repositories setting. + """ + message: String +} + +""" +Autogenerated input type of UpdateEnterpriseMembersCanDeleteIssuesSetting +""" +input GitHubUpdateEnterpriseMembersCanDeleteIssuesSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The value for the members can delete issues setting on the enterprise.""" + settingValue: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + The ID of the enterprise on which to set the members can delete issues setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseMembersCanDeleteIssuesSetting +""" +type GitHubUpdateEnterpriseMembersCanDeleteIssuesSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The enterprise with the updated members can delete issues setting.""" + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the members can delete issues setting. + """ + message: String +} + +""" +Autogenerated input type of UpdateEnterpriseMembersCanCreateRepositoriesSetting +""" +input GitHubUpdateEnterpriseMembersCanCreateRepositoriesSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Allow members to create internal repositories. Defaults to current value. + """ + membersCanCreateInternalRepositories: Boolean + + """ + Allow members to create private repositories. Defaults to current value. + """ + membersCanCreatePrivateRepositories: Boolean + + """ + Allow members to create public repositories. Defaults to current value. + """ + membersCanCreatePublicRepositories: Boolean + + """ + When false, allow member organizations to set their own repository creation member privileges. + """ + membersCanCreateRepositoriesPolicyEnabled: Boolean + + """ + Value for the members can create repositories setting on the enterprise. This or the granular public/private/internal allowed fields (but not both) must be provided. + """ + settingValue: GitHubEnterpriseMembersCanCreateRepositoriesSettingValue + + """ + The ID of the enterprise on which to set the members can create repositories setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseMembersCanCreateRepositoriesSetting +""" +type GitHubUpdateEnterpriseMembersCanCreateRepositoriesSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The enterprise with the updated members can create repositories setting. + """ + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the members can create repositories setting. + """ + message: String +} + +""" +Autogenerated input type of UpdateEnterpriseMembersCanChangeRepositoryVisibilitySetting +""" +input GitHubUpdateEnterpriseMembersCanChangeRepositoryVisibilitySettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The value for the members can change repository visibility setting on the enterprise. + """ + settingValue: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + The ID of the enterprise on which to set the members can change repository visibility setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseMembersCanChangeRepositoryVisibilitySetting +""" +type GitHubUpdateEnterpriseMembersCanChangeRepositoryVisibilitySettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The enterprise with the updated members can change repository visibility setting. + """ + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the members can change repository visibility setting. + """ + message: String +} + +""" +Autogenerated input type of UpdateEnterpriseDefaultRepositoryPermissionSetting +""" +input GitHubUpdateEnterpriseDefaultRepositoryPermissionSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The value for the default repository permission setting on the enterprise. + """ + settingValue: GitHubEnterpriseDefaultRepositoryPermissionSettingValue! + + """ + The ID of the enterprise on which to set the default repository permission setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseDefaultRepositoryPermissionSetting +""" +type GitHubUpdateEnterpriseDefaultRepositoryPermissionSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The enterprise with the updated default repository permission setting.""" + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the default repository permission setting. + """ + message: String +} + +""" +Autogenerated input type of UpdateEnterpriseAllowPrivateRepositoryForkingSetting +""" +input GitHubUpdateEnterpriseAllowPrivateRepositoryForkingSettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The value for the allow private repository forking setting on the enterprise. + """ + settingValue: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + The ID of the enterprise on which to set the allow private repository forking setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseAllowPrivateRepositoryForkingSetting +""" +type GitHubUpdateEnterpriseAllowPrivateRepositoryForkingSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The enterprise with the updated allow private repository forking setting. + """ + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the allow private repository forking setting. + """ + message: String +} + +"""Autogenerated input type of UpdateEnterpriseAdministratorRole""" +input GitHubUpdateEnterpriseAdministratorRoleInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The new role for the Enterprise administrator.""" + role: GitHubEnterpriseAdministratorRole! + + """The login of a administrator whose role is being changed.""" + login: String! + + """The ID of the Enterprise which the admin belongs to.""" + enterpriseId: ID! +} + +"""Autogenerated return type of UpdateEnterpriseAdministratorRole""" +type GitHubUpdateEnterpriseAdministratorRolePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """A message confirming the result of changing the administrator's role.""" + message: String +} + +enum GitHubActionExecutionCapabilitySetting { + """All action executions are disabled.""" + DISABLED + + """All action executions are enabled.""" + ALL_ACTIONS + + """Only actions defined within the repo are allowed.""" + LOCAL_ACTIONS_ONLY + + """Organization administrators action execution capabilities.""" + NO_POLICY +} + +""" +Autogenerated input type of UpdateEnterpriseActionExecutionCapabilitySetting +""" +input GitHubUpdateEnterpriseActionExecutionCapabilitySettingInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The value for the action execution capability setting on the enterprise. + """ + capability: GitHubActionExecutionCapabilitySetting! + + """ + The ID of the enterprise on which to set the members can create repositories setting. + """ + enterpriseId: ID! +} + +""" +Autogenerated return type of UpdateEnterpriseActionExecutionCapabilitySetting +""" +type GitHubUpdateEnterpriseActionExecutionCapabilitySettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The enterprise with the updated action execution capability setting.""" + enterprise: GitHubEnterprise + + """ + A message confirming the result of updating the action execution capability setting. + """ + message: String +} + +"""Autogenerated input type of UpdateBranchProtectionRule""" +input GitHubUpdateBranchProtectionRuleInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + List of required status check contexts that must pass for commits to be accepted to matching branches. + """ + requiredStatusCheckContexts: [String!] + + """A list of User, Team or App IDs allowed to push to matching branches.""" + pushActorIds: [ID!] + + """Is pushing to matching branches restricted.""" + restrictsPushes: Boolean + + """ + A list of User or Team IDs allowed to dismiss reviews on pull requests targeting matching branches. + """ + reviewDismissalActorIds: [ID!] + + """Is dismissal of pull request reviews restricted.""" + restrictsReviewDismissals: Boolean + + """ + Will new commits pushed to matching branches dismiss pull request review approvals. + """ + dismissesStaleReviews: Boolean + + """Are reviews from code owners required to update matching branches.""" + requiresCodeOwnerReviews: Boolean + + """Are branches required to be up to date before merging.""" + requiresStrictStatusChecks: Boolean + + """Are status checks required to update matching branches.""" + requiresStatusChecks: Boolean + + """Can admins overwrite branch protection.""" + isAdminEnforced: Boolean + + """Are commits required to be signed.""" + requiresCommitSignatures: Boolean + + """Number of approving reviews required to update matching branches.""" + requiredApprovingReviewCount: Int + + """Are approving reviews required to update matching branches.""" + requiresApprovingReviews: Boolean + + """The glob-like pattern used to determine matching branches.""" + pattern: String + + """The global relay id of the branch protection rule to be updated.""" + branchProtectionRuleId: ID! +} + +"""Autogenerated return type of UpdateBranchProtectionRule""" +type GitHubUpdateBranchProtectionRulePayload { + """The newly created BranchProtectionRule.""" + branchProtectionRule: GitHubBranchProtectionRule + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated input type of UnresolveReviewThread""" +input GitHubUnresolveReviewThreadInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the thread to unresolve""" + threadId: ID! +} + +"""Autogenerated return type of UnresolveReviewThread""" +type GitHubUnresolveReviewThreadPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The thread to resolve.""" + thread: GitHubPullRequestReviewThread +} + +"""Autogenerated input type of UnminimizeComment""" +input GitHubUnminimizeCommentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The Node ID of the subject to modify.""" + subjectId: ID! +} + +"""Autogenerated return type of UnminimizeComment""" +type GitHubUnminimizeCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The comment that was unminimized.""" + unminimizedComment: GitHubMinimizable +} + +"""Autogenerated input type of UnmarkIssueAsDuplicate""" +input GitHubUnmarkIssueAsDuplicateInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + ID of the issue or pull request currently considered canonical/authoritative/original. + """ + canonicalId: ID! + + """ID of the issue or pull request currently marked as a duplicate.""" + duplicateId: ID! +} + +"""Autogenerated return type of UnmarkIssueAsDuplicate""" +type GitHubUnmarkIssueAsDuplicatePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The issue or pull request that was marked as a duplicate.""" + duplicate: GitHubIssueOrPullRequest +} + +"""Autogenerated input type of UnlockLockable""" +input GitHubUnlockLockableInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the issue or pull request to be unlocked.""" + lockableId: ID! +} + +"""Autogenerated return type of UnlockLockable""" +type GitHubUnlockLockablePayload { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The item that was unlocked.""" + unlockedRecord: GitHubLockable +} + +"""Autogenerated input type of UnlinkRepositoryFromProject""" +input GitHubUnlinkRepositoryFromProjectInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the Repository linked to the Project.""" + repositoryId: ID! + + """The ID of the Project linked to the Repository.""" + projectId: ID! +} + +"""Autogenerated return type of UnlinkRepositoryFromProject""" +type GitHubUnlinkRepositoryFromProjectPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The linked Project.""" + project: GitHubProject + + """The linked Repository.""" + repository: GitHubRepository +} + +"""Autogenerated input type of UnfollowUser""" +input GitHubUnfollowUserInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the user to unfollow.""" + userId: ID! +} + +"""Autogenerated return type of UnfollowUser""" +type GitHubUnfollowUserPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The user that was unfollowed.""" + user: GitHubUser +} + +"""Autogenerated input type of UnarchiveRepository""" +input GitHubUnarchiveRepositoryInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the repository to unarchive.""" + repositoryId: ID! +} + +"""Autogenerated return type of UnarchiveRepository""" +type GitHubUnarchiveRepositoryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The repository that was unarchived.""" + repository: GitHubRepository +} + +"""Autogenerated input type of TransferIssue""" +input GitHubTransferIssueInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The Node ID of the repository the issue should be transferred to""" + repositoryId: ID! + + """The Node ID of the issue to be transferred""" + issueId: ID! +} + +"""Autogenerated return type of TransferIssue""" +type GitHubTransferIssuePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The issue that was transferred""" + issue: GitHubIssue +} + +"""Autogenerated input type of SubmitPullRequestReview""" +input GitHubSubmitPullRequestReviewInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The text field to set on the Pull Request Review.""" + body: String + + """The event to send to the Pull Request Review.""" + event: GitHubPullRequestReviewEvent! + + """The Pull Request Review ID to submit.""" + pullRequestReviewId: ID + + """The Pull Request ID to submit any pending reviews.""" + pullRequestId: ID +} + +"""Autogenerated return type of SubmitPullRequestReview""" +type GitHubSubmitPullRequestReviewPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The submitted pull request review.""" + pullRequestReview: GitHubPullRequestReview +} + +"""Autogenerated input type of SetEnterpriseIdentityProvider""" +input GitHubSetEnterpriseIdentityProviderInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + The digest algorithm used to sign SAML requests for the identity provider. + """ + digestMethod: GitHubSamlDigestAlgorithm! + + """ + The signature algorithm used to sign SAML requests for the identity provider. + """ + signatureMethod: GitHubSamlSignatureAlgorithm! + + """ + The x509 certificate used by the identity provider to sign assertions and responses. + """ + idpCertificate: String! + + """The Issuer Entity ID for the SAML identity provider""" + issuer: String + + """The URL endpoint for the identity provider's SAML SSO.""" + ssoUrl: String! + + """The ID of the enterprise on which to set an identity provider.""" + enterpriseId: ID! +} + +"""Autogenerated return type of SetEnterpriseIdentityProvider""" +type GitHubSetEnterpriseIdentityProviderPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The identity provider for the enterprise.""" + identityProvider: GitHubEnterpriseIdentityProvider +} + +"""Autogenerated input type of ResolveReviewThread""" +input GitHubResolveReviewThreadInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the thread to resolve""" + threadId: ID! +} + +"""Autogenerated return type of ResolveReviewThread""" +type GitHubResolveReviewThreadPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The thread to resolve.""" + thread: GitHubPullRequestReviewThread +} + +"""Autogenerated input type of RequestReviews""" +input GitHubRequestReviewsInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """Add users to the set rather than replace.""" + union: Boolean + + """The Node IDs of the team to request.""" + teamIds: [ID!] + + """The Node IDs of the user to request.""" + userIds: [ID!] + + """The Node ID of the pull request to modify.""" + pullRequestId: ID! +} + +"""Autogenerated return type of RequestReviews""" +type GitHubRequestReviewsPayload { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The pull request that is getting requests.""" + pullRequest: GitHubPullRequest + + """The edge from the pull request to the requested reviewers.""" + requestedReviewersEdge: GitHubUserEdge +} + +"""Autogenerated input type of ReopenPullRequest""" +input GitHubReopenPullRequestInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the pull request to be reopened.""" + pullRequestId: ID! +} + +"""Autogenerated return type of ReopenPullRequest""" +type GitHubReopenPullRequestPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The pull request that was reopened.""" + pullRequest: GitHubPullRequest +} + +"""Autogenerated input type of ReopenIssue""" +input GitHubReopenIssueInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the issue to be opened.""" + issueId: ID! +} + +"""Autogenerated return type of ReopenIssue""" +type GitHubReopenIssuePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The issue that was opened.""" + issue: GitHubIssue +} + +"""Autogenerated input type of RemoveStar""" +input GitHubRemoveStarInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The Starrable ID to unstar.""" + starrableId: ID! +} + +"""Autogenerated return type of RemoveStar""" +type GitHubRemoveStarPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The starrable.""" + starrable: GitHubStarrable +} + +"""Autogenerated input type of RemoveReaction""" +input GitHubRemoveReactionInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The name of the emoji reaction to remove.""" + content: GitHubReactionContent! + + """The Node ID of the subject to modify.""" + subjectId: ID! +} + +"""Autogenerated return type of RemoveReaction""" +type GitHubRemoveReactionPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The reaction object.""" + reaction: GitHubReaction + + """The reactable subject.""" + subject: GitHubReactable +} + +"""Autogenerated input type of RemoveOutsideCollaborator""" +input GitHubRemoveOutsideCollaboratorInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the organization to remove the outside collaborator from.""" + organizationId: ID! + + """The ID of the outside collaborator to remove.""" + userId: ID! +} + +"""Autogenerated return type of RemoveOutsideCollaborator""" +type GitHubRemoveOutsideCollaboratorPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The user that was removed as an outside collaborator.""" + removedUser: GitHubUser +} + +"""Autogenerated input type of RemoveLabelsFromLabelable""" +input GitHubRemoveLabelsFromLabelableInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ids of labels to remove.""" + labelIds: [ID!]! + + """The id of the Labelable to remove labels from.""" + labelableId: ID! +} + +"""Autogenerated return type of RemoveLabelsFromLabelable""" +type GitHubRemoveLabelsFromLabelablePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The Labelable the labels were removed from.""" + labelable: GitHubLabelable +} + +"""Autogenerated input type of RemoveEnterpriseOrganization""" +input GitHubRemoveEnterpriseOrganizationInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the organization to remove from the enterprise.""" + organizationId: ID! + + """ + The ID of the enterprise from which the organization should be removed. + """ + enterpriseId: ID! +} + +"""Autogenerated return type of RemoveEnterpriseOrganization""" +type GitHubRemoveEnterpriseOrganizationPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated enterprise.""" + enterprise: GitHubEnterprise + + """The organization that was removed from the enterprise.""" + organization: GitHubOrganization + + """The viewer performing the mutation.""" + viewer: GitHubUser +} + +"""Autogenerated input type of RemoveEnterpriseIdentityProvider""" +input GitHubRemoveEnterpriseIdentityProviderInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the enterprise from which to remove the identity provider.""" + enterpriseId: ID! +} + +"""Autogenerated return type of RemoveEnterpriseIdentityProvider""" +type GitHubRemoveEnterpriseIdentityProviderPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The identity provider that was removed from the enterprise.""" + identityProvider: GitHubEnterpriseIdentityProvider +} + +"""Autogenerated input type of RemoveEnterpriseAdmin""" +input GitHubRemoveEnterpriseAdminInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The login of the user to remove as an administrator.""" + login: String! + + """The Enterprise ID from which to remove the administrator.""" + enterpriseId: ID! +} + +"""Autogenerated return type of RemoveEnterpriseAdmin""" +type GitHubRemoveEnterpriseAdminPayload { + """The user who was removed as an administrator.""" + admin: GitHubUser + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated enterprise.""" + enterprise: GitHubEnterprise + + """A message confirming the result of removing an administrator.""" + message: String + + """The viewer performing the mutation.""" + viewer: GitHubUser +} + +"""Autogenerated input type of RemoveAssigneesFromAssignable""" +input GitHubRemoveAssigneesFromAssignableInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The id of users to remove as assignees.""" + assigneeIds: [ID!]! + + """The id of the assignable object to remove assignees from.""" + assignableId: ID! +} + +"""Autogenerated return type of RemoveAssigneesFromAssignable""" +type GitHubRemoveAssigneesFromAssignablePayload { + """The item that was unassigned.""" + assignable: GitHubAssignable + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +""" +Autogenerated input type of RegenerateEnterpriseIdentityProviderRecoveryCodes +""" +input GitHubRegenerateEnterpriseIdentityProviderRecoveryCodesInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the enterprise on which to set an identity provider.""" + enterpriseId: ID! +} + +""" +Autogenerated return type of RegenerateEnterpriseIdentityProviderRecoveryCodes +""" +type GitHubRegenerateEnterpriseIdentityProviderRecoveryCodesPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The identity provider for the enterprise.""" + identityProvider: GitHubEnterpriseIdentityProvider +} + +"""Autogenerated input type of MoveProjectColumn""" +input GitHubMoveProjectColumnInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Place the new column after the column with this id. Pass null to place it at the front. + """ + afterColumnId: ID + + """The id of the column to move.""" + columnId: ID! +} + +"""Autogenerated return type of MoveProjectColumn""" +type GitHubMoveProjectColumnPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The new edge of the moved column.""" + columnEdge: GitHubProjectColumnEdge +} + +"""Autogenerated input type of MoveProjectCard""" +input GitHubMoveProjectCardInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Place the new card after the card with this id. Pass null to place it at the top. + """ + afterCardId: ID + + """The id of the column to move it into.""" + columnId: ID! + + """The id of the card to move.""" + cardId: ID! +} + +"""Autogenerated return type of MoveProjectCard""" +type GitHubMoveProjectCardPayload { + """The new edge of the moved card.""" + cardEdge: GitHubProjectCardEdge + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +enum GitHubReportedContentClassifiers { + """A spammy piece of content""" + SPAM + + """An abusive or harassing piece of content""" + ABUSE + + """An irrelevant piece of content""" + OFF_TOPIC + + """An outdated piece of content""" + OUTDATED + + """A duplicated piece of content""" + DUPLICATE + + """The content has been resolved""" + RESOLVED +} + +"""Autogenerated input type of MinimizeComment""" +input GitHubMinimizeCommentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The classification of comment""" + classifier: GitHubReportedContentClassifiers! + + """The Node ID of the subject to modify.""" + subjectId: ID! +} + +"""Autogenerated return type of MinimizeComment""" +type GitHubMinimizeCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The comment that was minimized.""" + minimizedComment: GitHubMinimizable +} + +enum GitHubPullRequestMergeMethod { + """ + Add all commits from the head branch to the base branch with a merge commit. + """ + MERGE + + """ + Combine all commits from the head branch into a single commit in the base branch. + """ + SQUASH + + """ + Add all commits from the head branch onto the base branch individually. + """ + REBASE +} + +"""Autogenerated input type of MergePullRequest""" +input GitHubMergePullRequestInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The merge method to use. If omitted, defaults to 'MERGE'""" + mergeMethod: GitHubPullRequestMergeMethod + + """ + OID that the pull request head ref must match to allow merge; if omitted, no check is performed. + """ + expectedHeadOid: String + + """ + Commit body to use for the merge commit; if omitted, a default message will be used + """ + commitBody: String + + """ + Commit headline to use for the merge commit; if omitted, a default message will be used. + """ + commitHeadline: String + + """ID of the pull request to be merged.""" + pullRequestId: ID! +} + +"""Autogenerated return type of MergePullRequest""" +type GitHubMergePullRequestPayload { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The pull request that was merged.""" + pullRequest: GitHubPullRequest +} + +"""Autogenerated input type of MergeBranch""" +input GitHubMergeBranchInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Message to use for the merge commit. If omitted, a default will be used. + """ + commitMessage: String + + """ + The head to merge into the base branch. This can be a branch name or a commit GitObjectID. + """ + head: String! + + """ + The name of the base branch that the provided head will be merged into. + """ + base: String! + + """ + The Node ID of the Repository containing the base branch that will be modified. + """ + repositoryId: ID! +} + +"""Autogenerated return type of MergeBranch""" +type GitHubMergeBranchPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The resulting merge Commit.""" + mergeCommit: GitHubCommit +} + +"""Autogenerated input type of MarkPullRequestReadyForReview""" +input GitHubMarkPullRequestReadyForReviewInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the pull request to be marked as ready for review.""" + pullRequestId: ID! +} + +"""Autogenerated return type of MarkPullRequestReadyForReview""" +type GitHubMarkPullRequestReadyForReviewPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The pull request that is ready for review.""" + pullRequest: GitHubPullRequest +} + +"""Autogenerated input type of LockLockable""" +input GitHubLockLockableInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """A reason for why the issue or pull request will be locked.""" + lockReason: GitHubLockReason + + """ID of the issue or pull request to be locked.""" + lockableId: ID! +} + +"""Autogenerated return type of LockLockable""" +type GitHubLockLockablePayload { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The item that was locked.""" + lockedRecord: GitHubLockable +} + +"""Autogenerated input type of LinkRepositoryToProject""" +input GitHubLinkRepositoryToProjectInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the Repository to link to a Project.""" + repositoryId: ID! + + """The ID of the Project to link to a Repository""" + projectId: ID! +} + +"""Autogenerated return type of LinkRepositoryToProject""" +type GitHubLinkRepositoryToProjectPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The linked Project.""" + project: GitHubProject + + """The linked Repository.""" + repository: GitHubRepository +} + +"""Autogenerated input type of InviteEnterpriseAdmin""" +input GitHubInviteEnterpriseAdminInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The role of the administrator.""" + role: GitHubEnterpriseAdministratorRole + + """The email of the person to invite as an administrator.""" + email: String + + """The login of a user to invite as an administrator.""" + invitee: String + + """The ID of the enterprise to which you want to invite an administrator.""" + enterpriseId: ID! +} + +"""Autogenerated return type of InviteEnterpriseAdmin""" +type GitHubInviteEnterpriseAdminPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The created enterprise administrator invitation.""" + invitation: GitHubEnterpriseAdministratorInvitation +} + +"""Autogenerated input type of FollowUser""" +input GitHubFollowUserInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the user to follow.""" + userId: ID! +} + +"""Autogenerated return type of FollowUser""" +type GitHubFollowUserPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The user that was followed.""" + user: GitHubUser +} + +"""Autogenerated input type of DismissPullRequestReview""" +input GitHubDismissPullRequestReviewInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The contents of the pull request review dismissal message.""" + message: String! + + """The Node ID of the pull request review to modify.""" + pullRequestReviewId: ID! +} + +"""Autogenerated return type of DismissPullRequestReview""" +type GitHubDismissPullRequestReviewPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The dismissed pull request review.""" + pullRequestReview: GitHubPullRequestReview +} + +"""Autogenerated input type of DeleteTeamDiscussionComment""" +input GitHubDeleteTeamDiscussionCommentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the comment to delete.""" + id: ID! +} + +"""Autogenerated return type of DeleteTeamDiscussionComment""" +type GitHubDeleteTeamDiscussionCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated input type of DeleteTeamDiscussion""" +input GitHubDeleteTeamDiscussionInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The discussion ID to delete.""" + id: ID! +} + +"""Autogenerated return type of DeleteTeamDiscussion""" +type GitHubDeleteTeamDiscussionPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated input type of DeleteRef""" +input GitHubDeleteRefInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The Node ID of the Ref to be deleted.""" + refId: ID! +} + +"""Autogenerated return type of DeleteRef""" +type GitHubDeleteRefPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated input type of DeletePullRequestReviewComment""" +input GitHubDeletePullRequestReviewCommentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the comment to delete.""" + id: ID! +} + +"""Autogenerated return type of DeletePullRequestReviewComment""" +type GitHubDeletePullRequestReviewCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The pull request review the deleted comment belonged to.""" + pullRequestReview: GitHubPullRequestReview +} + +"""Autogenerated input type of DeletePullRequestReview""" +input GitHubDeletePullRequestReviewInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The Node ID of the pull request review to delete.""" + pullRequestReviewId: ID! +} + +"""Autogenerated return type of DeletePullRequestReview""" +type GitHubDeletePullRequestReviewPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The deleted pull request review.""" + pullRequestReview: GitHubPullRequestReview +} + +"""Autogenerated input type of DeleteProjectColumn""" +input GitHubDeleteProjectColumnInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The id of the column to delete.""" + columnId: ID! +} + +"""Autogenerated return type of DeleteProjectColumn""" +type GitHubDeleteProjectColumnPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The deleted column ID.""" + deletedColumnId: ID + + """The project the deleted column was in.""" + project: GitHubProject +} + +"""Autogenerated input type of DeleteProjectCard""" +input GitHubDeleteProjectCardInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The id of the card to delete.""" + cardId: ID! +} + +"""Autogenerated return type of DeleteProjectCard""" +type GitHubDeleteProjectCardPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The column the deleted card was in.""" + column: GitHubProjectColumn + + """The deleted card ID.""" + deletedCardId: ID +} + +"""Autogenerated input type of DeleteProject""" +input GitHubDeleteProjectInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The Project ID to update.""" + projectId: ID! +} + +"""Autogenerated return type of DeleteProject""" +type GitHubDeleteProjectPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The repository or organization the project was removed from.""" + owner: GitHubProjectOwner +} + +"""Autogenerated input type of DeleteIssueComment""" +input GitHubDeleteIssueCommentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the comment to delete.""" + id: ID! +} + +"""Autogenerated return type of DeleteIssueComment""" +type GitHubDeleteIssueCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated input type of DeleteIssue""" +input GitHubDeleteIssueInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the issue to delete.""" + issueId: ID! +} + +"""Autogenerated return type of DeleteIssue""" +type GitHubDeleteIssuePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The repository the issue belonged to""" + repository: GitHubRepository +} + +"""Autogenerated input type of DeleteIpAllowListEntry""" +input GitHubDeleteIpAllowListEntryInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the IP allow list entry to delete.""" + ipAllowListEntryId: ID! +} + +"""Autogenerated return type of DeleteIpAllowListEntry""" +type GitHubDeleteIpAllowListEntryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The IP allow list entry that was deleted.""" + ipAllowListEntry: GitHubIpAllowListEntry +} + +"""Autogenerated input type of DeleteDeployment""" +input GitHubDeleteDeploymentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The Node ID of the deployment to be deleted.""" + id: ID! +} + +"""Autogenerated return type of DeleteDeployment""" +type GitHubDeleteDeploymentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated input type of DeleteBranchProtectionRule""" +input GitHubDeleteBranchProtectionRuleInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The global relay id of the branch protection rule to be deleted.""" + branchProtectionRuleId: ID! +} + +"""Autogenerated return type of DeleteBranchProtectionRule""" +type GitHubDeleteBranchProtectionRulePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +enum GitHubTopicSuggestionDeclineReason { + """The suggested topic is not relevant to the repository.""" + NOT_RELEVANT + + """ + The suggested topic is too specific for the repository (e.g. #ruby-on-rails-version-4-2-1). + """ + TOO_SPECIFIC + + """The viewer does not like the suggested topic.""" + PERSONAL_PREFERENCE + + """The suggested topic is too general for the repository.""" + TOO_GENERAL +} + +"""Autogenerated input type of DeclineTopicSuggestion""" +input GitHubDeclineTopicSuggestionInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The reason why the suggested topic is declined.""" + reason: GitHubTopicSuggestionDeclineReason! + + """The name of the suggested topic.""" + name: String! + + """The Node ID of the repository.""" + repositoryId: ID! +} + +"""Autogenerated return type of DeclineTopicSuggestion""" +type GitHubDeclineTopicSuggestionPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The declined topic.""" + topic: GitHubTopic +} + +"""Autogenerated input type of CreateTeamDiscussionComment""" +input GitHubCreateTeamDiscussionCommentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The content of the comment.""" + body: String! + + """The ID of the discussion to which the comment belongs.""" + discussionId: ID! +} + +"""Autogenerated return type of CreateTeamDiscussionComment""" +type GitHubCreateTeamDiscussionCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The new comment.""" + teamDiscussionComment: GitHubTeamDiscussionComment +} + +"""Autogenerated input type of CreateTeamDiscussion""" +input GitHubCreateTeamDiscussionInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + If true, restricts the visiblity of this discussion to team members and organization admins. If false or not specified, allows any organization member to view this discussion. + """ + private: Boolean + + """The content of the discussion.""" + body: String! + + """The title of the discussion.""" + title: String! + + """The ID of the team to which the discussion belongs.""" + teamId: ID! +} + +"""Autogenerated return type of CreateTeamDiscussion""" +type GitHubCreateTeamDiscussionPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The new discussion.""" + teamDiscussion: GitHubTeamDiscussion +} + +"""Autogenerated input type of CreateRepository""" +input GitHubCreateRepositoryInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + When an organization is specified as the owner, this ID identifies the team that should be granted access to the new repository. + """ + teamId: ID + + """Indicates if the repository should have the issues feature enabled.""" + hasIssuesEnabled: Boolean + + """Indicates if the repository should have the wiki feature enabled.""" + hasWikiEnabled: Boolean + + """The URL for a web page about this repository.""" + homepageUrl: String + + """ + Whether this repository should be marked as a template such that anyone who can access it can create new repositories with the same files and directory structure. + """ + template: Boolean + + """Indicates the repository's visibility level.""" + visibility: GitHubRepositoryVisibility! + + """A short description of the new repository.""" + description: String + + """The ID of the owner for the new repository.""" + ownerId: ID + + """The name of the new repository.""" + name: String! +} + +"""Autogenerated return type of CreateRepository""" +type GitHubCreateRepositoryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The new repository.""" + repository: GitHubRepository +} + +"""Autogenerated input type of CreateRef""" +input GitHubCreateRefInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The GitObjectID that the new Ref shall target. Must point to a commit.""" + oid: String! + + """ + The fully qualified name of the new Ref (ie: `refs/heads/my_new_branch`). + """ + name: String! + + """The Node ID of the Repository to create the Ref in.""" + repositoryId: ID! +} + +"""Autogenerated return type of CreateRef""" +type GitHubCreateRefPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The newly created ref.""" + ref: GitHubRef +} + +"""Autogenerated input type of CreatePullRequest""" +input GitHubCreatePullRequestInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """Indicates whether this pull request should be a draft.""" + draft: Boolean + + """Indicates whether maintainers can modify the pull request.""" + maintainerCanModify: Boolean + + """The contents of the pull request.""" + body: String + + """The title of the pull request.""" + title: String! + + """ + The name of the branch where your changes are implemented. For cross-repository pull requests + in the same network, namespace `head_ref_name` with a user like this: `username:branch`. + + """ + headRefName: String! + + """ + The name of the branch you want your changes pulled into. This should be an existing branch + on the current repository. You cannot update the base branch on a pull request to point + to another repository. + + """ + baseRefName: String! + + """The Node ID of the repository.""" + repositoryId: ID! +} + +"""Autogenerated return type of CreatePullRequest""" +type GitHubCreatePullRequestPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The new pull request.""" + pullRequest: GitHubPullRequest +} + +enum GitHubProjectTemplate { + """Create a board with columns for To do, In progress and Done.""" + BASIC_KANBAN + + """ + Create a board with v2 triggers to automatically move cards across To do, In progress and Done columns. + """ + AUTOMATED_KANBAN_V2 + + """ + Create a board with triggers to automatically move cards across columns with review automation. + """ + AUTOMATED_REVIEWS_KANBAN + + """ + Create a board to triage and prioritize bugs with To do, priority, and Done columns. + """ + BUG_TRIAGE +} + +"""Autogenerated input type of CreateProject""" +input GitHubCreateProjectInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + A list of repository IDs to create as linked repositories for the project + """ + repositoryIds: [ID!] + + """The name of the GitHub-provided template.""" + template: GitHubProjectTemplate + + """The description of project.""" + body: String + + """The name of project.""" + name: String! + + """The owner ID to create the project under.""" + ownerId: ID! +} + +"""Autogenerated return type of CreateProject""" +type GitHubCreateProjectPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The new project.""" + project: GitHubProject +} + +"""Autogenerated input type of CreateIssue""" +input GitHubCreateIssueInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """An array of Node IDs for projects associated with this issue.""" + projectIds: [ID!] + + """An array of Node IDs of labels for this issue.""" + labelIds: [ID!] + + """The Node ID of the milestone for this issue.""" + milestoneId: ID + + """The Node ID for the user assignee for this issue.""" + assigneeIds: [ID!] + + """The body for the issue description.""" + body: String + + """The title for the issue.""" + title: String! + + """The Node ID of the repository.""" + repositoryId: ID! +} + +"""Autogenerated return type of CreateIssue""" +type GitHubCreateIssuePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The new issue.""" + issue: GitHubIssue +} + +"""Autogenerated input type of CreateIpAllowListEntry""" +input GitHubCreateIpAllowListEntryInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + Whether the IP allow list entry is active when an IP allow list is enabled. + """ + isActive: Boolean! + + """An optional name for the IP allow list entry.""" + name: String + + """An IP address or range of addresses in CIDR notation.""" + allowListValue: String! + + """The ID of the owner for which to create the new IP allow list entry.""" + ownerId: ID! +} + +"""Autogenerated return type of CreateIpAllowListEntry""" +type GitHubCreateIpAllowListEntryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The IP allow list entry that was created.""" + ipAllowListEntry: GitHubIpAllowListEntry +} + +"""Autogenerated input type of CreateEnterpriseOrganization""" +input GitHubCreateEnterpriseOrganizationInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The logins for the administrators of the new organization.""" + adminLogins: [String!]! + + """The email used for sending billing receipts.""" + billingEmail: String! + + """The profile name of the new organization.""" + profileName: String! + + """The login of the new organization.""" + login: String! + + """The ID of the enterprise owning the new organization.""" + enterpriseId: ID! +} + +"""Autogenerated return type of CreateEnterpriseOrganization""" +type GitHubCreateEnterpriseOrganizationPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The enterprise that owns the created organization.""" + enterprise: GitHubEnterprise + + """The organization that was created.""" + organization: GitHubOrganization +} + +"""Autogenerated input type of CreateBranchProtectionRule""" +input GitHubCreateBranchProtectionRuleInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ + List of required status check contexts that must pass for commits to be accepted to matching branches. + """ + requiredStatusCheckContexts: [String!] + + """A list of User, Team or App IDs allowed to push to matching branches.""" + pushActorIds: [ID!] + + """Is pushing to matching branches restricted.""" + restrictsPushes: Boolean + + """ + A list of User or Team IDs allowed to dismiss reviews on pull requests targeting matching branches. + """ + reviewDismissalActorIds: [ID!] + + """Is dismissal of pull request reviews restricted.""" + restrictsReviewDismissals: Boolean + + """ + Will new commits pushed to matching branches dismiss pull request review approvals. + """ + dismissesStaleReviews: Boolean + + """Are reviews from code owners required to update matching branches.""" + requiresCodeOwnerReviews: Boolean + + """Are branches required to be up to date before merging.""" + requiresStrictStatusChecks: Boolean + + """Are status checks required to update matching branches.""" + requiresStatusChecks: Boolean + + """Can admins overwrite branch protection.""" + isAdminEnforced: Boolean + + """Are commits required to be signed.""" + requiresCommitSignatures: Boolean + + """Number of approving reviews required to update matching branches.""" + requiredApprovingReviewCount: Int + + """Are approving reviews required to update matching branches.""" + requiresApprovingReviews: Boolean + + """The glob-like pattern used to determine matching branches.""" + pattern: String! + + """ + The global relay id of the repository in which a new branch protection rule should be created in. + """ + repositoryId: ID! +} + +"""Autogenerated return type of CreateBranchProtectionRule""" +type GitHubCreateBranchProtectionRulePayload { + """The newly created BranchProtectionRule.""" + branchProtectionRule: GitHubBranchProtectionRule + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated input type of ConvertProjectCardNoteToIssue""" +input GitHubConvertProjectCardNoteToIssueInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The body of the newly created issue.""" + body: String + + """ + The title of the newly created issue. Defaults to the card's note text. + """ + title: String + + """The ID of the repository to create the issue in.""" + repositoryId: ID! + + """The ProjectCard ID to convert.""" + projectCardId: ID! +} + +"""Autogenerated return type of ConvertProjectCardNoteToIssue""" +type GitHubConvertProjectCardNoteToIssuePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated ProjectCard.""" + projectCard: GitHubProjectCard +} + +"""Autogenerated input type of ClosePullRequest""" +input GitHubClosePullRequestInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the pull request to be closed.""" + pullRequestId: ID! +} + +"""Autogenerated return type of ClosePullRequest""" +type GitHubClosePullRequestPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The pull request that was closed.""" + pullRequest: GitHubPullRequest +} + +"""Autogenerated input type of CloseIssue""" +input GitHubCloseIssueInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """ID of the issue to be closed.""" + issueId: ID! +} + +"""Autogenerated return type of CloseIssue""" +type GitHubCloseIssuePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The issue that was closed.""" + issue: GitHubIssue +} + +"""Autogenerated input type of CloneTemplateRepository""" +input GitHubCloneTemplateRepositoryInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """Indicates the repository's visibility level.""" + visibility: GitHubRepositoryVisibility! + + """A short description of the new repository.""" + description: String + + """The ID of the owner for the new repository.""" + ownerId: ID! + + """The name of the new repository.""" + name: String! + + """The Node ID of the template repository.""" + repositoryId: ID! +} + +"""Autogenerated return type of CloneTemplateRepository""" +type GitHubCloneTemplateRepositoryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The new repository.""" + repository: GitHubRepository +} + +"""Autogenerated input type of CloneProject""" +input GitHubCloneProjectInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The visibility of the project, defaults to false (private).""" + public: Boolean + + """The description of the project.""" + body: String + + """The name of the project.""" + name: String! + + """Whether or not to clone the source project's workflows.""" + includeWorkflows: Boolean! + + """The source project to clone.""" + sourceId: ID! + + """The owner ID to create the project under.""" + targetOwnerId: ID! +} + +"""Autogenerated return type of CloneProject""" +type GitHubCloneProjectPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The id of the JobStatus for populating cloned fields.""" + jobStatusId: String + + """The new cloned project.""" + project: GitHubProject +} + +"""Autogenerated input type of ClearLabelsFromLabelable""" +input GitHubClearLabelsFromLabelableInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The id of the labelable object to clear the labels from.""" + labelableId: ID! +} + +"""Autogenerated return type of ClearLabelsFromLabelable""" +type GitHubClearLabelsFromLabelablePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The item that was unlabeled.""" + labelable: GitHubLabelable +} + +"""Autogenerated input type of ChangeUserStatus""" +input GitHubChangeUserStatusInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """If set, the user status will not be shown after this date.""" + expiresAt: String + + """ + Whether this status should indicate you are not fully available on GitHub, e.g., you are away. + """ + limitedAvailability: Boolean + + """ + The ID of the organization whose members will be allowed to see the status. If omitted, the status will be publicly visible. + """ + organizationId: ID + + """A short description of your current status.""" + message: String + + """ + The emoji to represent your status. Can either be a native Unicode emoji or an emoji name with colons, e.g., :grinning:. + """ + emoji: String +} + +"""Autogenerated return type of ChangeUserStatus""" +type GitHubChangeUserStatusPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """Your updated status.""" + status: GitHubUserStatus +} + +"""Autogenerated input type of CancelEnterpriseAdminInvitation""" +input GitHubCancelEnterpriseAdminInvitationInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The Node ID of the pending enterprise administrator invitation.""" + invitationId: ID! +} + +"""Autogenerated return type of CancelEnterpriseAdminInvitation""" +type GitHubCancelEnterpriseAdminInvitationPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The invitation that was canceled.""" + invitation: GitHubEnterpriseAdministratorInvitation + + """ + A message confirming the result of canceling an administrator invitation. + """ + message: String +} + +"""Autogenerated input type of ArchiveRepository""" +input GitHubArchiveRepositoryInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ID of the repository to mark as archived.""" + repositoryId: ID! +} + +"""Autogenerated return type of ArchiveRepository""" +type GitHubArchiveRepositoryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The repository that was marked as archived.""" + repository: GitHubRepository +} + +"""Autogenerated input type of AddStar""" +input GitHubAddStarInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The Starrable ID to star.""" + starrableId: ID! +} + +"""Autogenerated return type of AddStar""" +type GitHubAddStarPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The starrable.""" + starrable: GitHubStarrable +} + +"""Autogenerated input type of AddReaction""" +input GitHubAddReactionInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The name of the emoji to react with.""" + content: GitHubReactionContent! + + """The Node ID of the subject to modify.""" + subjectId: ID! +} + +"""Autogenerated return type of AddReaction""" +type GitHubAddReactionPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The reaction object.""" + reaction: GitHubReaction + + """The reactable subject.""" + subject: GitHubReactable +} + +"""Autogenerated input type of AddPullRequestReviewThread""" +input GitHubAddPullRequestReviewThreadInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The side of the diff on which the start line resides.""" + startSide: GitHubDiffSide + + """The first line of the range to which the comment refers.""" + startLine: Int + + """ + The side of the diff on which the line resides. For multi-line comments, this is the side for the end of the line range. + """ + side: GitHubDiffSide + + """ + The line of the blob to which the thread refers. The end of the line range for multi-line comments. + """ + line: Int! + + """The Node ID of the review to modify.""" + pullRequestReviewId: ID! + + """Body of the thread's first comment.""" + body: String! + + """Path to the file being commented on.""" + path: String! +} + +"""Autogenerated return type of AddPullRequestReviewThread""" +type GitHubAddPullRequestReviewThreadPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The newly created thread.""" + thread: GitHubPullRequestReviewThread +} + +"""Autogenerated input type of AddPullRequestReviewComment""" +input GitHubAddPullRequestReviewCommentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The comment id to reply to.""" + inReplyTo: ID + + """The line index in the diff to comment on.""" + position: Int + + """The relative path of the file to comment on.""" + path: String + + """The text of the comment.""" + body: String! + + """The SHA of the commit to comment on.""" + commitOID: String + + """The Node ID of the review to modify.""" + pullRequestReviewId: ID + + """The node ID of the pull request reviewing""" + pullRequestId: ID +} + +"""Autogenerated return type of AddPullRequestReviewComment""" +type GitHubAddPullRequestReviewCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The newly created comment.""" + comment: GitHubPullRequestReviewComment + + """The edge from the review's comment connection.""" + commentEdge: GitHubPullRequestReviewCommentEdge +} + +""" +Specifies a review comment thread to be left with a Pull Request Review. +""" +input GitHubDraftPullRequestReviewThread { + """Body of the comment to leave.""" + body: String! + + """The side of the diff on which the start line resides.""" + startSide: GitHubDiffSide + + """The first line of the range to which the comment refers.""" + startLine: Int + + """ + The side of the diff on which the line resides. For multi-line comments, this is the side for the end of the line range. + """ + side: GitHubDiffSide + + """ + The line of the blob to which the thread refers. The end of the line range for multi-line comments. + """ + line: Int! + + """Path to the file being commented on.""" + path: String! +} + +"""Specifies a review comment to be left with a Pull Request Review.""" +input GitHubDraftPullRequestReviewComment { + """Body of the comment to leave.""" + body: String! + + """Position in the file to leave a comment on.""" + position: Int! + + """Path to the file being commented on.""" + path: String! +} + +enum GitHubPullRequestReviewEvent { + """Submit general feedback without explicit approval.""" + COMMENT + + """Submit feedback and approve merging these changes.""" + APPROVE + + """Submit feedback that must be addressed before merging.""" + REQUEST_CHANGES + + """Dismiss review so it now longer effects merging.""" + DISMISS +} + +"""Autogenerated input type of AddPullRequestReview""" +input GitHubAddPullRequestReviewInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The review line comment threads.""" + threads: [GitHubDraftPullRequestReviewThread] + + """The review line comments.""" + comments: [GitHubDraftPullRequestReviewComment] + + """The event to perform on the pull request review.""" + event: GitHubPullRequestReviewEvent + + """The contents of the review body comment.""" + body: String + + """The commit OID the review pertains to.""" + commitOID: String + + """The Node ID of the pull request to modify.""" + pullRequestId: ID! +} + +"""Autogenerated return type of AddPullRequestReview""" +type GitHubAddPullRequestReviewPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The newly created pull request review.""" + pullRequestReview: GitHubPullRequestReview + + """The edge from the pull request's review connection.""" + reviewEdge: GitHubPullRequestReviewEdge +} + +"""Autogenerated input type of AddProjectColumn""" +input GitHubAddProjectColumnInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The name of the column.""" + name: String! + + """The Node ID of the project.""" + projectId: ID! +} + +"""Autogenerated return type of AddProjectColumn""" +type GitHubAddProjectColumnPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The edge from the project's column connection.""" + columnEdge: GitHubProjectColumnEdge + + """The project""" + project: GitHubProject +} + +"""Autogenerated input type of AddProjectCard""" +input GitHubAddProjectCardInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The note on the card.""" + note: String + + """The content of the card. Must be a member of the ProjectCardItem union""" + contentId: ID + + """The Node ID of the ProjectColumn.""" + projectColumnId: ID! +} + +"""Autogenerated return type of AddProjectCard""" +type GitHubAddProjectCardPayload { + """The edge from the ProjectColumn's card connection.""" + cardEdge: GitHubProjectCardEdge + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ProjectColumn""" + projectColumn: GitHubProjectColumn +} + +"""Autogenerated input type of AddLabelsToLabelable""" +input GitHubAddLabelsToLabelableInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The ids of the labels to add.""" + labelIds: [ID!]! + + """The id of the labelable object to add labels to.""" + labelableId: ID! +} + +"""Autogenerated return type of AddLabelsToLabelable""" +type GitHubAddLabelsToLabelablePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The item that was labeled.""" + labelable: GitHubLabelable +} + +"""Autogenerated input type of AddComment""" +input GitHubAddCommentInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The contents of the comment.""" + body: String! + + """The Node ID of the subject to modify.""" + subjectId: ID! +} + +"""Autogenerated return type of AddComment""" +type GitHubAddCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The edge from the subject's comment connection.""" + commentEdge: GitHubIssueCommentEdge + + """The subject""" + subject: GitHubNode + + """The edge from the subject's timeline connection.""" + timelineEdge: GitHubIssueTimelineItemEdge +} + +"""Autogenerated input type of AddAssigneesToAssignable""" +input GitHubAddAssigneesToAssignableInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The id of users to add as assignees.""" + assigneeIds: [ID!]! + + """The id of the assignable object to add assignees to.""" + assignableId: ID! +} + +"""Autogenerated return type of AddAssigneesToAssignable""" +type GitHubAddAssigneesToAssignablePayload { + """The item that was assigned.""" + assignable: GitHubAssignable + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated input type of AcceptTopicSuggestion""" +input GitHubAcceptTopicSuggestionInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The name of the suggested topic.""" + name: String! + + """The Node ID of the repository.""" + repositoryId: ID! +} + +"""Autogenerated return type of AcceptTopicSuggestion""" +type GitHubAcceptTopicSuggestionPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The accepted topic.""" + topic: GitHubTopic +} + +"""Autogenerated input type of AcceptEnterpriseAdministratorInvitation""" +input GitHubAcceptEnterpriseAdministratorInvitationInput { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The id of the invitation being accepted""" + invitationId: ID! +} + +"""Autogenerated return type of AcceptEnterpriseAdministratorInvitation""" +type GitHubAcceptEnterpriseAdministratorInvitationPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The invitation that was accepted.""" + invitation: GitHubEnterpriseAdministratorInvitation + + """ + A message confirming the result of accepting an administrator invitation. + """ + message: String +} + +"""The root query for implementing GraphQL mutations.""" +type GitHubMutation { + """ + Accepts a pending invitation for a user to become an administrator of an enterprise. + """ + acceptEnterpriseAdministratorInvitation(input: GitHubAcceptEnterpriseAdministratorInvitationInput!): GitHubAcceptEnterpriseAdministratorInvitationPayload + + """Applies a suggested topic to the repository.""" + acceptTopicSuggestion(input: GitHubAcceptTopicSuggestionInput!): GitHubAcceptTopicSuggestionPayload + + """Adds assignees to an assignable object.""" + addAssigneesToAssignable(input: GitHubAddAssigneesToAssignableInput!): GitHubAddAssigneesToAssignablePayload + + """Adds a comment to an Issue or Pull Request.""" + addComment(input: GitHubAddCommentInput!): GitHubAddCommentPayload + + """Adds labels to a labelable object.""" + addLabelsToLabelable(input: GitHubAddLabelsToLabelableInput!): GitHubAddLabelsToLabelablePayload + + """ + Adds a card to a ProjectColumn. Either `contentId` or `note` must be provided but **not** both. + """ + addProjectCard(input: GitHubAddProjectCardInput!): GitHubAddProjectCardPayload + + """Adds a column to a Project.""" + addProjectColumn(input: GitHubAddProjectColumnInput!): GitHubAddProjectColumnPayload + + """Adds a review to a Pull Request.""" + addPullRequestReview(input: GitHubAddPullRequestReviewInput!): GitHubAddPullRequestReviewPayload + + """Adds a comment to a review.""" + addPullRequestReviewComment(input: GitHubAddPullRequestReviewCommentInput!): GitHubAddPullRequestReviewCommentPayload + + """Adds a new thread to a pending Pull Request Review.""" + addPullRequestReviewThread(input: GitHubAddPullRequestReviewThreadInput!): GitHubAddPullRequestReviewThreadPayload + + """Adds a reaction to a subject.""" + addReaction(input: GitHubAddReactionInput!): GitHubAddReactionPayload + + """Adds a star to a Starrable.""" + addStar(input: GitHubAddStarInput!): GitHubAddStarPayload + + """Marks a repository as archived.""" + archiveRepository(input: GitHubArchiveRepositoryInput!): GitHubArchiveRepositoryPayload + + """ + Cancels a pending invitation for an administrator to join an enterprise. + """ + cancelEnterpriseAdminInvitation(input: GitHubCancelEnterpriseAdminInvitationInput!): GitHubCancelEnterpriseAdminInvitationPayload + + """Update your status on GitHub.""" + changeUserStatus(input: GitHubChangeUserStatusInput!): GitHubChangeUserStatusPayload + + """Clears all labels from a labelable object.""" + clearLabelsFromLabelable(input: GitHubClearLabelsFromLabelableInput!): GitHubClearLabelsFromLabelablePayload + + """ + Creates a new project by cloning configuration from an existing project. + """ + cloneProject(input: GitHubCloneProjectInput!): GitHubCloneProjectPayload + + """ + Create a new repository with the same files and directory structure as a template repository. + """ + cloneTemplateRepository(input: GitHubCloneTemplateRepositoryInput!): GitHubCloneTemplateRepositoryPayload + + """Close an issue.""" + closeIssue(input: GitHubCloseIssueInput!): GitHubCloseIssuePayload + + """Close a pull request.""" + closePullRequest(input: GitHubClosePullRequestInput!): GitHubClosePullRequestPayload + + """ + Convert a project note card to one associated with a newly created issue. + """ + convertProjectCardNoteToIssue(input: GitHubConvertProjectCardNoteToIssueInput!): GitHubConvertProjectCardNoteToIssuePayload + + """Create a new branch protection rule""" + createBranchProtectionRule(input: GitHubCreateBranchProtectionRuleInput!): GitHubCreateBranchProtectionRulePayload + + """Creates an organization as part of an enterprise account.""" + createEnterpriseOrganization(input: GitHubCreateEnterpriseOrganizationInput!): GitHubCreateEnterpriseOrganizationPayload + + """Creates a new IP allow list entry.""" + createIpAllowListEntry(input: GitHubCreateIpAllowListEntryInput!): GitHubCreateIpAllowListEntryPayload + + """Creates a new issue.""" + createIssue(input: GitHubCreateIssueInput!): GitHubCreateIssuePayload + + """Creates a new project.""" + createProject(input: GitHubCreateProjectInput!): GitHubCreateProjectPayload + + """Create a new pull request""" + createPullRequest(input: GitHubCreatePullRequestInput!): GitHubCreatePullRequestPayload + + """Create a new Git Ref.""" + createRef(input: GitHubCreateRefInput!): GitHubCreateRefPayload + + """Create a new repository.""" + createRepository(input: GitHubCreateRepositoryInput!): GitHubCreateRepositoryPayload + + """Creates a new team discussion.""" + createTeamDiscussion(input: GitHubCreateTeamDiscussionInput!): GitHubCreateTeamDiscussionPayload + + """Creates a new team discussion comment.""" + createTeamDiscussionComment(input: GitHubCreateTeamDiscussionCommentInput!): GitHubCreateTeamDiscussionCommentPayload + + """Rejects a suggested topic for the repository.""" + declineTopicSuggestion(input: GitHubDeclineTopicSuggestionInput!): GitHubDeclineTopicSuggestionPayload + + """Delete a branch protection rule""" + deleteBranchProtectionRule(input: GitHubDeleteBranchProtectionRuleInput!): GitHubDeleteBranchProtectionRulePayload + + """Deletes a deployment.""" + deleteDeployment(input: GitHubDeleteDeploymentInput!): GitHubDeleteDeploymentPayload + + """Deletes an IP allow list entry.""" + deleteIpAllowListEntry(input: GitHubDeleteIpAllowListEntryInput!): GitHubDeleteIpAllowListEntryPayload + + """Deletes an Issue object.""" + deleteIssue(input: GitHubDeleteIssueInput!): GitHubDeleteIssuePayload + + """Deletes an IssueComment object.""" + deleteIssueComment(input: GitHubDeleteIssueCommentInput!): GitHubDeleteIssueCommentPayload + + """Deletes a project.""" + deleteProject(input: GitHubDeleteProjectInput!): GitHubDeleteProjectPayload + + """Deletes a project card.""" + deleteProjectCard(input: GitHubDeleteProjectCardInput!): GitHubDeleteProjectCardPayload + + """Deletes a project column.""" + deleteProjectColumn(input: GitHubDeleteProjectColumnInput!): GitHubDeleteProjectColumnPayload + + """Deletes a pull request review.""" + deletePullRequestReview(input: GitHubDeletePullRequestReviewInput!): GitHubDeletePullRequestReviewPayload + + """Deletes a pull request review comment.""" + deletePullRequestReviewComment(input: GitHubDeletePullRequestReviewCommentInput!): GitHubDeletePullRequestReviewCommentPayload + + """Delete a Git Ref.""" + deleteRef(input: GitHubDeleteRefInput!): GitHubDeleteRefPayload + + """Deletes a team discussion.""" + deleteTeamDiscussion(input: GitHubDeleteTeamDiscussionInput!): GitHubDeleteTeamDiscussionPayload + + """Deletes a team discussion comment.""" + deleteTeamDiscussionComment(input: GitHubDeleteTeamDiscussionCommentInput!): GitHubDeleteTeamDiscussionCommentPayload + + """Dismisses an approved or rejected pull request review.""" + dismissPullRequestReview(input: GitHubDismissPullRequestReviewInput!): GitHubDismissPullRequestReviewPayload + + """Follow a user.""" + followUser(input: GitHubFollowUserInput!): GitHubFollowUserPayload + + """Invite someone to become an administrator of the enterprise.""" + inviteEnterpriseAdmin(input: GitHubInviteEnterpriseAdminInput!): GitHubInviteEnterpriseAdminPayload + + """Creates a repository link for a project.""" + linkRepositoryToProject(input: GitHubLinkRepositoryToProjectInput!): GitHubLinkRepositoryToProjectPayload + + """Lock a lockable object""" + lockLockable(input: GitHubLockLockableInput!): GitHubLockLockablePayload + + """Marks a pull request ready for review.""" + markPullRequestReadyForReview(input: GitHubMarkPullRequestReadyForReviewInput!): GitHubMarkPullRequestReadyForReviewPayload + + """Merge a head into a branch.""" + mergeBranch(input: GitHubMergeBranchInput!): GitHubMergeBranchPayload + + """Merge a pull request.""" + mergePullRequest(input: GitHubMergePullRequestInput!): GitHubMergePullRequestPayload + + """Minimizes a comment on an Issue, Commit, Pull Request, or Gist""" + minimizeComment(input: GitHubMinimizeCommentInput!): GitHubMinimizeCommentPayload + + """Moves a project card to another place.""" + moveProjectCard(input: GitHubMoveProjectCardInput!): GitHubMoveProjectCardPayload + + """Moves a project column to another place.""" + moveProjectColumn(input: GitHubMoveProjectColumnInput!): GitHubMoveProjectColumnPayload + + """Regenerates the identity provider recovery codes for an enterprise""" + regenerateEnterpriseIdentityProviderRecoveryCodes(input: GitHubRegenerateEnterpriseIdentityProviderRecoveryCodesInput!): GitHubRegenerateEnterpriseIdentityProviderRecoveryCodesPayload + + """Removes assignees from an assignable object.""" + removeAssigneesFromAssignable(input: GitHubRemoveAssigneesFromAssignableInput!): GitHubRemoveAssigneesFromAssignablePayload + + """Removes an administrator from the enterprise.""" + removeEnterpriseAdmin(input: GitHubRemoveEnterpriseAdminInput!): GitHubRemoveEnterpriseAdminPayload + + """Removes the identity provider from an enterprise""" + removeEnterpriseIdentityProvider(input: GitHubRemoveEnterpriseIdentityProviderInput!): GitHubRemoveEnterpriseIdentityProviderPayload + + """Removes an organization from the enterprise""" + removeEnterpriseOrganization(input: GitHubRemoveEnterpriseOrganizationInput!): GitHubRemoveEnterpriseOrganizationPayload + + """Removes labels from a Labelable object.""" + removeLabelsFromLabelable(input: GitHubRemoveLabelsFromLabelableInput!): GitHubRemoveLabelsFromLabelablePayload + + """Removes outside collaborator from all repositories in an organization.""" + removeOutsideCollaborator(input: GitHubRemoveOutsideCollaboratorInput!): GitHubRemoveOutsideCollaboratorPayload + + """Removes a reaction from a subject.""" + removeReaction(input: GitHubRemoveReactionInput!): GitHubRemoveReactionPayload + + """Removes a star from a Starrable.""" + removeStar(input: GitHubRemoveStarInput!): GitHubRemoveStarPayload + + """Reopen a issue.""" + reopenIssue(input: GitHubReopenIssueInput!): GitHubReopenIssuePayload + + """Reopen a pull request.""" + reopenPullRequest(input: GitHubReopenPullRequestInput!): GitHubReopenPullRequestPayload + + """Set review requests on a pull request.""" + requestReviews(input: GitHubRequestReviewsInput!): GitHubRequestReviewsPayload + + """Marks a review thread as resolved.""" + resolveReviewThread(input: GitHubResolveReviewThreadInput!): GitHubResolveReviewThreadPayload + + """Creates or updates the identity provider for an enterprise.""" + setEnterpriseIdentityProvider(input: GitHubSetEnterpriseIdentityProviderInput!): GitHubSetEnterpriseIdentityProviderPayload + + """Submits a pending pull request review.""" + submitPullRequestReview(input: GitHubSubmitPullRequestReviewInput!): GitHubSubmitPullRequestReviewPayload + + """Transfer an issue to a different repository""" + transferIssue(input: GitHubTransferIssueInput!): GitHubTransferIssuePayload + + """Unarchives a repository.""" + unarchiveRepository(input: GitHubUnarchiveRepositoryInput!): GitHubUnarchiveRepositoryPayload + + """Unfollow a user.""" + unfollowUser(input: GitHubUnfollowUserInput!): GitHubUnfollowUserPayload + + """Deletes a repository link from a project.""" + unlinkRepositoryFromProject(input: GitHubUnlinkRepositoryFromProjectInput!): GitHubUnlinkRepositoryFromProjectPayload + + """Unlock a lockable object""" + unlockLockable(input: GitHubUnlockLockableInput!): GitHubUnlockLockablePayload + + """Unmark an issue as a duplicate of another issue.""" + unmarkIssueAsDuplicate(input: GitHubUnmarkIssueAsDuplicateInput!): GitHubUnmarkIssueAsDuplicatePayload + + """Unminimizes a comment on an Issue, Commit, Pull Request, or Gist""" + unminimizeComment(input: GitHubUnminimizeCommentInput!): GitHubUnminimizeCommentPayload + + """Marks a review thread as unresolved.""" + unresolveReviewThread(input: GitHubUnresolveReviewThreadInput!): GitHubUnresolveReviewThreadPayload + + """Create a new branch protection rule""" + updateBranchProtectionRule(input: GitHubUpdateBranchProtectionRuleInput!): GitHubUpdateBranchProtectionRulePayload + + """Sets the action execution capability setting for an enterprise.""" + updateEnterpriseActionExecutionCapabilitySetting(input: GitHubUpdateEnterpriseActionExecutionCapabilitySettingInput!): GitHubUpdateEnterpriseActionExecutionCapabilitySettingPayload + + """Updates the role of an enterprise administrator.""" + updateEnterpriseAdministratorRole(input: GitHubUpdateEnterpriseAdministratorRoleInput!): GitHubUpdateEnterpriseAdministratorRolePayload + + """Sets whether private repository forks are enabled for an enterprise.""" + updateEnterpriseAllowPrivateRepositoryForkingSetting(input: GitHubUpdateEnterpriseAllowPrivateRepositoryForkingSettingInput!): GitHubUpdateEnterpriseAllowPrivateRepositoryForkingSettingPayload + + """ + Sets the default repository permission for organizations in an enterprise. + """ + updateEnterpriseDefaultRepositoryPermissionSetting(input: GitHubUpdateEnterpriseDefaultRepositoryPermissionSettingInput!): GitHubUpdateEnterpriseDefaultRepositoryPermissionSettingPayload + + """ + Sets whether organization members with admin permissions on a repository can change repository visibility. + """ + updateEnterpriseMembersCanChangeRepositoryVisibilitySetting(input: GitHubUpdateEnterpriseMembersCanChangeRepositoryVisibilitySettingInput!): GitHubUpdateEnterpriseMembersCanChangeRepositoryVisibilitySettingPayload + + """Sets the members can create repositories setting for an enterprise.""" + updateEnterpriseMembersCanCreateRepositoriesSetting(input: GitHubUpdateEnterpriseMembersCanCreateRepositoriesSettingInput!): GitHubUpdateEnterpriseMembersCanCreateRepositoriesSettingPayload + + """Sets the members can delete issues setting for an enterprise.""" + updateEnterpriseMembersCanDeleteIssuesSetting(input: GitHubUpdateEnterpriseMembersCanDeleteIssuesSettingInput!): GitHubUpdateEnterpriseMembersCanDeleteIssuesSettingPayload + + """Sets the members can delete repositories setting for an enterprise.""" + updateEnterpriseMembersCanDeleteRepositoriesSetting(input: GitHubUpdateEnterpriseMembersCanDeleteRepositoriesSettingInput!): GitHubUpdateEnterpriseMembersCanDeleteRepositoriesSettingPayload + + """ + Sets whether members can invite collaborators are enabled for an enterprise. + """ + updateEnterpriseMembersCanInviteCollaboratorsSetting(input: GitHubUpdateEnterpriseMembersCanInviteCollaboratorsSettingInput!): GitHubUpdateEnterpriseMembersCanInviteCollaboratorsSettingPayload + + """Sets whether or not an organization admin can make purchases.""" + updateEnterpriseMembersCanMakePurchasesSetting(input: GitHubUpdateEnterpriseMembersCanMakePurchasesSettingInput!): GitHubUpdateEnterpriseMembersCanMakePurchasesSettingPayload + + """ + Sets the members can update protected branches setting for an enterprise. + """ + updateEnterpriseMembersCanUpdateProtectedBranchesSetting(input: GitHubUpdateEnterpriseMembersCanUpdateProtectedBranchesSettingInput!): GitHubUpdateEnterpriseMembersCanUpdateProtectedBranchesSettingPayload + + """Sets the members can view dependency insights for an enterprise.""" + updateEnterpriseMembersCanViewDependencyInsightsSetting(input: GitHubUpdateEnterpriseMembersCanViewDependencyInsightsSettingInput!): GitHubUpdateEnterpriseMembersCanViewDependencyInsightsSettingPayload + + """Sets whether organization projects are enabled for an enterprise.""" + updateEnterpriseOrganizationProjectsSetting(input: GitHubUpdateEnterpriseOrganizationProjectsSettingInput!): GitHubUpdateEnterpriseOrganizationProjectsSettingPayload + + """Updates an enterprise's profile.""" + updateEnterpriseProfile(input: GitHubUpdateEnterpriseProfileInput!): GitHubUpdateEnterpriseProfilePayload + + """Sets whether repository projects are enabled for a enterprise.""" + updateEnterpriseRepositoryProjectsSetting(input: GitHubUpdateEnterpriseRepositoryProjectsSettingInput!): GitHubUpdateEnterpriseRepositoryProjectsSettingPayload + + """Sets whether team discussions are enabled for an enterprise.""" + updateEnterpriseTeamDiscussionsSetting(input: GitHubUpdateEnterpriseTeamDiscussionsSettingInput!): GitHubUpdateEnterpriseTeamDiscussionsSettingPayload + + """ + Sets whether two factor authentication is required for all users in an enterprise. + """ + updateEnterpriseTwoFactorAuthenticationRequiredSetting(input: GitHubUpdateEnterpriseTwoFactorAuthenticationRequiredSettingInput!): GitHubUpdateEnterpriseTwoFactorAuthenticationRequiredSettingPayload + + """Sets whether an IP allow list is enabled on an owner.""" + updateIpAllowListEnabledSetting(input: GitHubUpdateIpAllowListEnabledSettingInput!): GitHubUpdateIpAllowListEnabledSettingPayload + + """Updates an IP allow list entry.""" + updateIpAllowListEntry(input: GitHubUpdateIpAllowListEntryInput!): GitHubUpdateIpAllowListEntryPayload + + """Updates an Issue.""" + updateIssue(input: GitHubUpdateIssueInput!): GitHubUpdateIssuePayload + + """Updates an IssueComment object.""" + updateIssueComment(input: GitHubUpdateIssueCommentInput!): GitHubUpdateIssueCommentPayload + + """Updates an existing project.""" + updateProject(input: GitHubUpdateProjectInput!): GitHubUpdateProjectPayload + + """Updates an existing project card.""" + updateProjectCard(input: GitHubUpdateProjectCardInput!): GitHubUpdateProjectCardPayload + + """Updates an existing project column.""" + updateProjectColumn(input: GitHubUpdateProjectColumnInput!): GitHubUpdateProjectColumnPayload + + """Update a pull request""" + updatePullRequest(input: GitHubUpdatePullRequestInput!): GitHubUpdatePullRequestPayload + + """Updates the body of a pull request review.""" + updatePullRequestReview(input: GitHubUpdatePullRequestReviewInput!): GitHubUpdatePullRequestReviewPayload + + """Updates a pull request review comment.""" + updatePullRequestReviewComment(input: GitHubUpdatePullRequestReviewCommentInput!): GitHubUpdatePullRequestReviewCommentPayload + + """Update a Git Ref.""" + updateRef(input: GitHubUpdateRefInput!): GitHubUpdateRefPayload + + """Update information about a repository.""" + updateRepository(input: GitHubUpdateRepositoryInput!): GitHubUpdateRepositoryPayload + + """Updates the state for subscribable subjects.""" + updateSubscription(input: GitHubUpdateSubscriptionInput!): GitHubUpdateSubscriptionPayload + + """Updates a team discussion.""" + updateTeamDiscussion(input: GitHubUpdateTeamDiscussionInput!): GitHubUpdateTeamDiscussionPayload + + """Updates a discussion comment.""" + updateTeamDiscussionComment(input: GitHubUpdateTeamDiscussionCommentInput!): GitHubUpdateTeamDiscussionCommentPayload + + """Replaces the repository's topics with the given topics.""" + updateTopics(input: GitHubUpdateTopicsInput!): GitHubUpdateTopicsPayload + + """Create an Repository""" + createRepositoryTemp(input: GitHubCreateRepositoryTempInput!): GitHubCreateRepositoryTempResponsePayload! @deprecated(reason: "Use `mutation.gitHub.createRepository`.") + + """Create an Issue""" + createIssueTemp(input: GitHubCreateIssueTempInput!): GitHubCreateIssueTempResponsePayload! @deprecated(reason: "Temporary mutation until GitHub implemements their own createIssue mutation.") + + """Create a milestone""" + createMilestone_oneGraph(input: GitHubCreateMilestone_oneGraphInput!): GitHubCreateMilestone_oneGraphResponsePayload! @deprecated(reason: "Temporary mutation until GitHub implemements their own createMilestone mutation.") + + """Update a milestone""" + updateMilestone_oneGraph(input: GitHubUpdateMilestone_oneGraphInput!): GitHubUpdateMilestone_oneGraphResponsePayload! @deprecated(reason: "Temporary mutation until GitHub implemements their own updateMilestone mutation.") + + """Delete a milestone""" + deleteMilestone_oneGraph(input: GitHubDeleteMilestone_oneGraphInput!): GitHubDeleteMilestone_oneGraphResponsePayload! @deprecated(reason: "Temporary mutation until GitHub implemements their own deleteMilestone mutation.") + + """Create a branch""" + createBranch_oneGraph(input: GitHubCreateBranch_oneGraphInput!): GitHubCreateBranch_oneGraphResponsePayload! @deprecated(reason: "Temporary mutation until GitHub implemements their own createBranch mutation.") + + """Create a commit updating a single file""" + createOrUpdateFileContent_oneGraph(input: GitHubCreateOrUpdateFileContent_oneGraphInput!): GitHubCreateOrUpdateFileContent_oneGraphResponsePayload! @deprecated(reason: "Temporary mutation until GitHub implemements their own updatefileContent mutation.") + + """Create a pull request""" + createPullRequest_oneGraph(input: GitHubCreatePullRequest_oneGraphInput!): GitHubCreatePullRequest_oneGraphResponsePayload! @deprecated(reason: "Temporary mutation until GitHub implemements their own createPullRequest mutation.") + + """Create a fork""" + createFork_oneGraph(input: GitHubCreateFork_oneGraphInput!): GitHubCreateFork_oneGraphResponsePayload! @deprecated(reason: "Temporary mutation until GitHub implemements their own createFork mutation.") + + """Merge a pull request""" + mergePullRequest_oneGraph(input: GitHubMergePullRequest_oneGraphInput!): GitHubMergePullRequest_oneGraphResponsePayload! @deprecated(reason: "Temporary mutation until GitHub implemements their own mergePullRequest mutation.") + + """ + Make a REST API call to the GitHub API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: GithubPassthroughMutation! +} + +"""""" +type EventilMutation { + """Set YouTube or Vimeo ID""" + setVideoId(vimeo_id: String, youtube_id: String, id: ID!): EventilPresentation +} + +input BrexCreateSessionInput { + clientMutationId: String! + password: String! + email: String! +} + +type BrexCreateSessionResponsePayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String! + session: BrexSession +} + +"""""" +input BrexDeleteLocationInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexDeleteLocationPayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexSuspendCardInput { + suspendReason: BrexTerminationReason + suspendDescription: String + id: ID! + clientMutationId: String! +} + +"""""" +type BrexSuspendCardPayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexFinishChannelVerificationInput { + verificationToken: String! + id: ID! + clientMutationId: String! +} + +"""""" +type BrexFinishChannelVerificationPayload { + """""" + channel: BrexChannel + + """""" + clientMutationId: String! +} + +"""""" +input BrexCreateOnboardingProductApplicationInput { + """The specific implementation of the blueprint type""" + name: String! + clientMutationId: String! + + """Cancel any existing applications of the same named blueprint""" + cancelPreviousApplication: Boolean +} + +"""""" +type BrexCreateOnboardingProductApplicationPayload { + """""" + clientMutationId: String! + + """""" + onboardingApplication: BrexOnboardingApplication! +} + +"""""" +input BrexRedeemStatementEntryRefundInput { + statementEntryId: ID! + redemptionOfferId: String! + clientMutationId: String! +} + +"""""" +type BrexRedeemStatementEntryRefundPayload { + """""" + account: BrexAccount! + + """""" + clientMutationId: String! + + """""" + refundedStatementEntry: BrexStatementEntry! +} + +"""""" +input BrexCreateTransactionRefusedSubscriptionInput { + clientMutationId: String! + channelId: ID! +} + +"""""" +type BrexCreateTransactionRefusedSubscriptionPayload { + """""" + clientMutationId: String! + + """""" + notificationSubscription: BrexNotificationSubscription +} + +"""""" +input BrexCreateAssetInput { + uploadRequestId: String! + name: String! + fiuo: Boolean + contentType: String! + clientMutationId: String! +} + +"""""" +type BrexCreateAssetPayload { + """""" + asset: BrexAsset + + """""" + clientMutationId: String! +} + +"""""" +input BrexCreateDepositsApplicationInput { + clientMutationId: String! + cancelPreviousApplication: Boolean +} + +"""""" +type BrexCreateDepositsApplicationPayload { + """""" + clientMutationId: String! + + """""" + onboardingApplication: BrexOnboardingApplication! +} + +"""""" +input BrexUpdateTransactionMemoInput { + transactionId: ID! + memo: String + clientMutationId: String! +} + +"""""" +type BrexUpdateTransactionMemoPayload { + """""" + clientMutationId: String! + + """""" + transaction: BrexTransaction +} + +"""""" +input BrexActivateCardInput { + last4: String! + clientMutationId: String! +} + +"""""" +type BrexActivateCardPayload { + """""" + card: BrexCard + + """""" + clientMutationId: String! +} + +"""""" +input BrexPullDataAsyncInput { + financialSourceId: ID! + clientMutationId: String! +} + +"""""" +type BrexPullDataAsyncPayload { + """""" + clientMutationId: String! + + """""" + updatedSource: BrexFinancialSource +} + +"""""" +input BrexRefreshIntegrationCredentialsInput { + """Filter by integration status""" + status: String + + """Filter by integration id""" + integrationId: ID + clientMutationId: String! +} + +"""""" +type BrexRefreshIntegrationCredentialsPayload { + """""" + clientMutationId: String! + + """""" + integrations: [BrexIntegration] +} + +"""""" +input BrexSetPrimaryCollectionSourceInput { + financialAccountId: ID! + clientMutationId: String! +} + +"""""" +type BrexSetPrimaryCollectionSourcePayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexConfirmMfaInput { + verificationToken: String! + deviceId: String! + clientMutationId: String! +} + +"""""" +type BrexConfirmMfaPayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexSubmitOnboardingApplicationInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexSubmitOnboardingApplicationPayload { + """""" + clientMutationId: String! + + """""" + onboardingApplication: BrexOnboardingApplication! +} + +"""""" +input BrexTerminateCardInput { + terminationReason: BrexTerminationReason + terminationDescription: String + id: ID! + clientMutationId: String! +} + +"""""" +type BrexTerminateCardPayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexFinancialMfaChalengeAnswer { + questionId: String + answer: String +} + +"""""" +input BrexCompleteChallengeInput { + financialSourceId: ID! + clientMutationId: String! + answers: [BrexFinancialMfaChalengeAnswer]! +} + +"""""" +type BrexCompleteChallengePayload { + """""" + clientMutationId: String! + + """""" + result: BrexFinancialsSourceResult +} + +"""""" +input BrexIssueCollectionInput { + clientMutationId: String! + amount: Int! +} + +"""""" +type BrexIssueCollectionPayload { + """""" + clientMutationId: String! + + """""" + collectionIntention: BrexCollectionIntention! +} + +"""""" +input BrexUpdateUserInput { + locationId: ID + lastName: String + id: ID! + firstName: String + departmentId: ID + clientMutationId: String! +} + +"""""" +type BrexUpdateUserPayload { + """""" + clientMutationId: String! + + """""" + user: BrexUser +} + +"""""" +input BrexCreateReferralInput { + referredEmail: String! + clientMutationId: String! +} + +"""""" +type BrexCreateReferralPayload { + """""" + clientMutationId: String! + + """""" + referral: BrexReferral! +} + +"""""" +input BrexCreateCredentialInput { + vendor: String! + clientMutationId: String! +} + +"""""" +type BrexCreateCredentialPayload { + """""" + clientMutationId: String! + + """""" + credential: BrexCredential +} + +"""""" +input BrexSubmitEvidenceInput { + evidenceId: String! + data: String! + clientMutationId: String! + applicationId: ID! +} + +"""""" +type BrexSubmitEvidencePayload { + """""" + clientMutationId: String! + + """""" + productApplication: BrexProductApplication +} + +"""""" +input BrexCreateCollectionIntentionInput { + """Date in UTC""" + scheduledForDate: String! + clientMutationId: String! + amount: Int! +} + +"""""" +type BrexCreateCollectionIntentionPayload { + """""" + clientMutationId: String! + + """""" + collectionIntention: BrexCollectionIntention! +} + +"""""" +input BrexSyncIntegrationInput { + startDateRange: String + id: ID! + endDateRange: String + clientMutationId: String! +} + +"""""" +type BrexSyncIntegrationPayload { + """""" + clientMutationId: String! + + """""" + integration: BrexIntegration +} + +"""""" +input BrexUpdateTransactionDepartmentInput { + transactionId: ID! + departmentId: ID! + clientMutationId: String! +} + +"""""" +type BrexUpdateTransactionDepartmentPayload { + """""" + clientMutationId: String! + + """""" + transaction: BrexTransaction +} + +"""""" +input BrexCancelCollectionIntentionInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexCancelCollectionIntentionPayload { + """""" + clientMutationId: String! + + """""" + collectionIntention: BrexCollectionIntention! +} + +"""""" +input BrexCreateSmsChannelInput { + number: String! + clientMutationId: String! +} + +"""""" +type BrexCreateSmsChannelPayload { + """""" + channel: BrexChannel + + """""" + clientMutationId: String! +} + +"""""" +input BrexCreateReceiptInput { + transactionId: ID! + clientMutationId: String! + assetId: ID! +} + +"""""" +type BrexCreateReceiptPayload { + """""" + clientMutationId: String! + + """""" + receipt: BrexReceipt +} + +"""""" +input BrexAddPlaidTestingCredentialsInput { + publicToken: String! + institutionName: String! + institutionId: String! + clientMutationId: String! +} + +"""""" +type BrexAddPlaidTestingCredentialsPayload { + """""" + clientMutationId: String! + + """""" + success: Boolean +} + +"""""" +input BrexStartResetUserUserInput { + email: String! +} + +"""""" +input BrexStartResetUserInput { + user: BrexStartResetUserUserInput! + clientMutationId: String! +} + +"""""" +type BrexStartResetUserPayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexDeleteIntegrationRuleInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexDeleteIntegrationRulePayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexUpdateTransactionCategoryInput { + userCategoryId: ID! + transactionId: ID! + clientMutationId: String! +} + +"""""" +type BrexUpdateTransactionCategoryPayload { + """""" + clientMutationId: String! + + """""" + transaction: BrexTransaction +} + +"""""" +input BrexSetUserLimitInput { + userId: ID! + timeWindowDays: Int! + clientMutationId: String! + amount: Int! +} + +"""""" +type BrexSetUserLimitPayload { + """""" + clientMutationId: String! + + """""" + rule: BrexRule +} + +"""""" +input BrexCreateProductApplicationInput { + clientMutationId: String! +} + +"""""" +type BrexCreateProductApplicationPayload { + """""" + clientMutationId: String! + + """""" + productApplication: BrexProductApplication +} + +"""""" +input BrexUpdateLocationInput { + name: String! + id: ID! + description: String + clientMutationId: String! +} + +"""""" +type BrexUpdateLocationPayload { + """""" + clientMutationId: String! + + """""" + location: BrexLocation! +} + +"""""" +input BrexCreateEmailChannelInput { + email: String! + clientMutationId: String! +} + +"""""" +type BrexCreateEmailChannelPayload { + """""" + channel: BrexChannel + + """""" + clientMutationId: String! +} + +"""""" +input BrexActivateUserInfo { + password: String! + legalAgreements: [BrexLegalAgreementReference] +} + +"""""" +input BrexActivateUserInput { + user: BrexActivateUserInfo + clientMutationId: String! + activationToken: String! +} + +"""""" +type BrexActivateUserPayload { + """""" + clientMutationId: String! + + """""" + session: BrexSession + + """""" + user: BrexUser +} + +"""""" +input BrexProgramMembershipPayload { + membershipId: String + lastName: String + firstName: String +} + +"""""" +input BrexCreateMilesTransferInput { + toCustomerUserId: String! + redemptionOfferId: String! + programMembership: BrexProgramMembershipPayload! + pointsAmount: Int! + milesAmount: Int! + loyaltyProgramId: String! + clientMutationId: String! +} + +"""""" +type BrexCreateMilesTransferPayload { + """""" + clientMutationId: String! + + """""" + milesTransfer: BrexMilesTransfer +} + +"""""" +input BrexBeginChannelVerificationInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexBeginChannelVerificationPayload { + """""" + channel: BrexChannel + + """""" + clientMutationId: String! +} + +"""""" +input BrexCreateIntegrationRuleInput { + type: String! + priority: Int! + name: String + integrationId: ID! + description: String + clientMutationId: String! + body: String! + applyAutomatically: Boolean! +} + +"""""" +type BrexCreateIntegrationRulePayload { + """""" + clientMutationId: String! + + """""" + integrationRule: BrexIntegrationRule +} + +"""""" +input BrexSaveOnboardingInformationRequestInput { + id: ID! + data: String + clientMutationId: String! +} + +"""""" +type BrexSaveOnboardingInformationRequestPayload { + """""" + clientMutationId: String! + + """""" + informationRequest: BrexOnboardingInformationRequest! +} + +"""""" +input BrexCreateOpenidSessionInput { + token: String! + clientMutationId: String! +} + +"""""" +type BrexCreateOpenidSessionPayload { + """""" + clientMutationId: String! + + """""" + session: BrexSession +} + +"""""" +input BrexDeleteReceiptInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexDeleteReceiptPayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexRefreshFinancialSourceInput { + financialSourceId: ID! + clientMutationId: String! +} + +"""""" +type BrexRefreshFinancialSourcePayload { + """""" + clientMutationId: String! + + """""" + result: BrexFinancialsSourceResult +} + +"""""" +input BrexDeviceInformationInput { + os: String! + model: String! + appVersion: String! + additionalInformation: String +} + +"""""" +input BrexCreatePushChannelInput { + type: BrexPushProviderType! + deviceToken: String! + deviceInformation: BrexDeviceInformationInput! + clientMutationId: String! +} + +"""""" +type BrexCreatePushChannelPayload { + """""" + channel: BrexChannel! + + """""" + clientMutationId: String! +} + +"""""" +input BrexUserCategoryInput { + isDisabled: Boolean + id: ID! +} + +"""""" +input BrexUpdateUserCategoriesInput { + userCategories: [BrexUserCategoryInput]! + clientMutationId: String! +} + +"""""" +type BrexUpdateUserCategoriesPayload { + """""" + clientMutationId: String! + + """""" + userCategories: [BrexUserCategory!] +} + +"""""" +input BrexSetUserRoleInput { + userId: ID! + role: String! + clientMutationId: String! +} + +"""""" +type BrexSetUserRolePayload { + """""" + clientMutationId: String! + + """""" + user: BrexUser +} + +"""""" +input BrexUpdateTransactionLocationInput { + transactionId: ID! + locationId: ID! + clientMutationId: String! +} + +"""""" +type BrexUpdateTransactionLocationPayload { + """""" + clientMutationId: String! + + """""" + transaction: BrexTransaction +} + +"""""" +input BrexSendMoneyInput { + transferDescription: String + paymentMethod: BrexMethod + depositsAccountId: ID! + counterpartyId: ID! + clientMutationId: String! + amount: Int! +} + +"""""" +type BrexSendMoneyPayload { + """""" + clientMutationId: String! + + """""" + transaction: BrexDepositsTransaction! +} + +"""""" +input BrexSoftSignupInput { + redirectUrl: String! + password: String! + info: BrexSignupInfoInput! + email: String! + clientMutationId: String! +} + +"""""" +type BrexSession { + """""" + token: String + + """""" + userId: String +} + +"""""" +type BrexSoftSignupPayload { + """""" + clientMutationId: String! + + """""" + session: BrexSession! + + """""" + user: BrexUser! +} + +"""""" +input BrexFlexibleAddressInput { + zip: String + state: String + country: String! + city: String! + address2: String + address1: String! +} + +"""""" +input BrexCreateCounterpartyInput { + type: BrexType + routingNumber: String + previousCounterpartyId: ID + paymentRail: BrexPaymentRail! + name: String! + location: BrexAccountLocation! + email: String + depositsAccountId: ID! + clientMutationId: String! + class: BrexClass + chequeRecipientName: String + beneficiaryBankName: String + beneficiaryBankInfo: String + beneficiaryBankAddress: BrexFlexibleAddressInput + approverId: ID! + address: BrexFlexibleAddressInput + accountNumber: String +} + +"""""" +type BrexCreateCounterpartyPayload { + """""" + clientMutationId: String! + + """""" + counterparty: BrexCounterparty! +} + +"""""" +input BrexCreateNetsuiteCredentialInput { + tokenSecret: String! + tokenId: String! + clientMutationId: String! + accountId: String! +} + +"""""" +type BrexCreateNetsuiteCredentialPayload { + """""" + authenticationResult: BrexCredentialAuthenticationResult + + """""" + clientMutationId: String! + + """""" + subsidiaries: [BrexNetsuiteSubsidiary] +} + +"""""" +input BrexResetUserUserInput { + password: String! +} + +"""""" +input BrexResetUserInput { + user: BrexResetUserUserInput! + token: String! + clientMutationId: String! +} + +"""""" +type BrexResetUserPayload { + """""" + clientMutationId: String! + + """""" + user: BrexUser +} + +"""""" +input BrexDeleteDepartmentInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexDeleteDepartmentPayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexCreateLocationInput { + name: String! + description: String + clientMutationId: String! +} + +"""""" +type BrexCreateLocationPayload { + """""" + clientMutationId: String! + + """""" + location: BrexLocation! +} + +"""""" +input BrexSetupMfaInput { + phoneNumber: String! + clientMutationId: String! +} + +"""""" +type BrexSetupMfaPayload { + """""" + clientMutationId: String! + + """""" + deviceId: String! +} + +"""""" +input BrexSubmitOnboardingInformationRequestInput { + id: ID! + data: String + clientMutationId: String! +} + +"""""" +type BrexSubmitOnboardingInformationRequestPayload { + """""" + clientMutationId: String! + + """""" + informationRequest: BrexOnboardingInformationRequest! +} + +"""""" +input BrexCDaInput { + clientMutationId: String! +} + +"""""" +type BrexCDaPayload { + """""" + clientMutationId: String! + + """""" + onboardingApplication: BrexOnboardingApplication! +} + +"""""" +input BrexConnectCredentialInput { + redirectUrl: String! + id: ID! + clientMutationId: String! +} + +"""""" +type BrexConnectCredentialPayload { + """""" + authenticationResult: BrexCredentialAuthenticationResult + + """""" + clientMutationId: String! +} + +"""""" +input BrexCreateIntegrationExportReportInput { + startDateRange: String + endDateRange: String + + """Time in user's timezone that report is generated""" + displayTime: String! + clientMutationId: String! +} + +"""""" +type BrexCreateIntegrationExportReportPayload { + """""" + clientMutationId: String! + + """""" + report: BrexReport +} + +"""""" +input BrexAssociateCategoriesInput { + userCategoryId: ID! + merchantCategoryId: ID! + clientMutationId: String! +} + +"""""" +type BrexAssociateCategoriesPayload { + """""" + clientMutationId: String! + + """""" + userCategory: BrexUserCategory +} + +"""""" +input BrexCreateFileUploadUrlInput { + clientMutationId: String! +} + +"""""" +type BrexCreateFileUploadUrlPayload { + """""" + clientMutationId: String! + + """""" + uploadRequestId: String + + """""" + uploadUrl: String +} + +"""""" +input BrexCreateDepartmentInput { + name: String! + description: String + clientMutationId: String! +} + +"""""" +type BrexCreateDepartmentPayload { + """""" + clientMutationId: String! + + """""" + department: BrexDepartment! +} + +"""""" +input BrexSetTransactionIntegrationFieldInput { + value: String! + transactionId: ID! + field: String! + clientMutationId: String! +} + +"""""" +type BrexSetTransactionIntegrationFieldPayload { + """""" + clientMutationId: String! + + """""" + lens: BrexTransactionLens +} + +"""""" +input BrexUpdateCardDisplayNameInput { + id: ID! + displayName: String! + clientMutationId: String! +} + +"""""" +type BrexUpdateCardDisplayNamePayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexUpdateCardPinInput { + pin: String! + id: ID! + clientMutationId: String! +} + +"""""" +type BrexUpdateCardPinPayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexSubmitProductApplicationInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexSubmitProductApplicationPayload { + """""" + clientMutationId: String! + + """""" + productApplication: BrexProductApplication +} + +"""""" +input BrexAddFundsInput { + financialAccountId: ID! + depositsAccountId: ID! + clientMutationId: String! + amount: Int! +} + +"""""" +type BrexAddFundsPayload { + """""" + clientMutationId: String! + + """""" + transaction: BrexDepositsTransaction! +} + +"""""" +input BrexLegalAgreementReference { + version: String! + name: String! +} + +"""""" +input BrexSignupInfoInput { + salesVolume: String + role: String + marketingMetadata: String + legalAgreements: [BrexLegalAgreementReference]! + lastName: String! + investmentSource: String + firstName: String! + financialProductType: BrexFinancialProductType! + companyUrl: String! + companyName: String! + blackbox: String + attributionToken: String + attributionSource: String +} + +"""""" +input BrexSignupInput { + redirectUrl: String! + password: String! + info: BrexSignupInfoInput! + email: String! + clientMutationId: String! +} + +"""""" +type BrexSignupPayload { + """""" + clientMutationId: String! + + """""" + user: BrexUser! +} + +"""""" +input BrexCreateVirtualCardInput { + holderName: String! + displayName: String + customerUserId: ID + clientMutationId: String! +} + +"""""" +type BrexCreateVirtualCardPayload { + """""" + card: BrexCard + + """""" + clientMutationId: String! +} + +"""""" +input BrexFinicityConnectGenerateLiteUrlInput { + institutionId: ID! + clientMutationId: String! +} + +"""""" +type BrexFinicityConnectGenerateLiteUrlPayload { + """""" + clientMutationId: String! + + """""" + url: String! +} + +"""""" +input BrexUpdateInstitutionLoginInput { + """default: FINICITY_LEGACY""" + requestType: BrexFinancialsConnectRequestType + + """login fields are only needed for FINICITY_LEGACY""" + loginFields: [BrexFinancialFieldInput] + financialSourceId: ID! + clientMutationId: String! +} + +"""""" +type BrexUpdateInstitutionLoginPayload { + """""" + clientMutationId: String! + + """""" + result: BrexFinancialsSourceResult +} + +"""""" +input BrexGenerateDepositsStatementDocumentDownloadUrlInput { + depositsStatementId: ID! + clientMutationId: String! +} + +"""""" +type BrexGenerateDepositsStatementDocumentDownloadUrlPayload { + """""" + clientMutationId: String! + + """""" + depositsStatementPdfDownloadUrl: String +} + +"""""" +input BrexDisableUserInput { + userId: ID! + clientMutationId: String! +} + +"""""" +type BrexDisableUserPayload { + """""" + clientMutationId: String! + + """""" + user: BrexUser +} + +"""""" +input BrexFinicityConnectGenerateFixUrlInput { + financialSourceId: ID! + clientMutationId: String! +} + +"""""" +type BrexFinicityConnectGenerateFixUrlPayload { + """""" + clientMutationId: String! + + """""" + url: String! +} + +"""""" +input BrexUpdateIntegrationRuleInput { + priority: Int + name: String + id: ID! + description: String + clientMutationId: String! + body: String + applyAutomatically: Boolean +} + +"""""" +type BrexUpdateIntegrationRulePayload { + """""" + clientMutationId: String! + + """""" + integrationRule: BrexIntegrationRule +} + +"""""" +input BrexUpdateUserCategoryInput { + isDisabled: Boolean + id: ID! + clientMutationId: String! +} + +"""""" +type BrexUpdateUserCategoryPayload { + """""" + clientMutationId: String! + + """""" + userCategory: BrexUserCategory +} + +"""""" +input BrexSetPrimaryFundingSourceInput { + fundingSourceId: ID! + clientMutationId: String! +} + +"""""" +type BrexSetPrimaryFundingSourcePayload { + """""" + clientMutationId: String! + + """""" + fundingSource: BrexFundingSource! +} + +"""""" +input BrexToggleRuleForStatementEntryInput { + statementEntryId: ID! + integrationRuleId: ID! + clientMutationId: String! +} + +"""""" +type BrexToggleRuleForStatementEntryPayload { + """""" + clientMutationId: String! + + """""" + statementEntry: BrexStatementEntry +} + +"""""" +input BrexUpdateIntegrationSyncSettingsInput { + syncFrom: String + syncDateRangeStart: String + syncDateRangeEnd: String + id: ID! + clientMutationId: String! + batchEntity: BrexBatchEntity + batchCadence: BrexBatchCadence +} + +"""""" +type BrexUpdateIntegrationSyncSettingsPayload { + """""" + clientMutationId: String! + + """""" + integration: BrexIntegration +} + +"""""" +input BrexEnableUserInput { + userId: ID! + clientMutationId: String! +} + +"""""" +type BrexEnableUserPayload { + """""" + clientMutationId: String! + + """""" + user: BrexUser +} + +"""""" +input BrexBankAccountSourceInput { + routingNumber: String! + accountType: String! + accountNumber: String! + accountName: String! +} + +"""""" +input BrexCreateFundingSourceInput { + type: String! + priority: BrexFundingSourcePriority + idempotencyKey: String! + clientMutationId: String! + bankAccountSource: BrexBankAccountSourceInput! +} + +"""""" +type BrexCreateFundingSourcePayload { + """""" + clientMutationId: String! + + """""" + fundingSource: BrexFundingSource! +} + +"""""" +input BrexUpdateIntegrationSettingsInput { + rewardsIncomeUserCategoryId: ID + id: ID! + collectionTargetCategoryId: ID + clientMutationId: String! + accountsPayableCategoryId: ID +} + +"""""" +type BrexUpdateIntegrationSettingsPayload { + """""" + clientMutationId: String! + + """""" + integration: BrexIntegration +} + +"""""" +input BrexDisableIntegrationInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexDisableIntegrationPayload { + """""" + clientMutationId: String! + + """""" + integration: BrexIntegration +} + +"""""" +input BrexCreateCashWireDetailsInput { + displayTime: String! + clientMutationId: String! +} + +"""""" +type BrexCreateCashWireDetailsPayload { + """""" + clientMutationId: String! + + """""" + report: BrexReport! +} + +"""""" +input BrexDeleteSubscriptionInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexDeleteSubscriptionPayload { + """""" + clientMutationId: String! +} + +enum BrexUserRoleTypeInput { + ADMIN + BOOKKEEPER + REGULAR + SUPERADMIN +} + +"""""" +input BrexInviteUserInput { + role: BrexUserRoleTypeInput! + locationId: ID + lastName: String! + firstName: String! + email: String! + departmentId: ID + clientMutationId: String! +} + +"""""" +type BrexInviteUserPayload { + """""" + clientMutationId: String! + + """""" + user: BrexUser +} + +"""""" +input BrexDeleteRuleInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexDeleteRulePayload { + """""" + clientMutationId: String! + + """""" + rule: BrexRule +} + +"""""" +input BrexUpdateDepartmentInput { + name: String! + id: ID! + description: String + clientMutationId: String! +} + +"""""" +type BrexUpdateDepartmentPayload { + """""" + clientMutationId: String! + + """""" + department: BrexDepartment! +} + +"""""" +input BrexCreateStatementEntriesSearchReportInput { + type: BrexReportType + statementEntriesFilters: String! + format: BrexReportFormat! + + """Time in user's timezone that report is generated""" + displayTime: String! + clientMutationId: String! +} + +"""""" +type BrexCreateStatementEntriesSearchReportPayload { + """""" + clientMutationId: String! + + """""" + report: BrexReport +} + +"""""" +input BrexCreateTransactionApprovedSubscriptionInput { + isPhysical: Boolean + clientMutationId: String! + channelId: ID! +} + +"""""" +type BrexCreateTransactionApprovedSubscriptionPayload { + """""" + clientMutationId: String! + + """""" + notificationSubscription: BrexNotificationSubscription +} + +"""""" +input BrexDepositChequeInput { + senderName: String! + memo: String + frontImageAssetId: ID! + depositsAccountId: ID! + clientMutationId: String! + backImageAssetId: ID! + amount: Int! +} + +"""""" +type BrexDepositChequePayload { + """""" + amount: Int! + + """""" + backImageAssetId: ID! + + """""" + chequeNumber: Int + + """""" + clientMutationId: String! + + """""" + expectedDeliveryDate: String + + """""" + frontImageAssetId: ID! + + """""" + recipientName: String + + """""" + senderName: String + + """""" + status: String! +} + +"""""" +input BrexSetDepositsTransactionPaymentMemoInput { + transactionId: ID! + memo: String + clientMutationId: String! +} + +"""""" +type BrexSetDepositsTransactionPaymentMemoPayload { + """""" + clientMutationId: String! + + """""" + transaction: BrexDepositsTransaction! +} + +"""""" +input BrexSubsidiaryInput { + vendorInternalId: String! + name: String! +} + +"""""" +input BrexCreateIntegrationInput { + scopes: [BrexIntegrationScope]! + netsuiteSubsidiary: BrexSubsidiaryInput + credentialId: ID! + clientMutationId: String! +} + +"""""" +type BrexCreateIntegrationPayload { + """""" + clientMutationId: String! + + """""" + integration: BrexIntegration +} + +"""""" +input BrexAccountPrincipalUserInput { + password: String! + lastName: String! + firstName: String! + email: String! +} + +enum BrexAccountIncorporationTypeInput { + CORPORATION + LLC + OTHER + PARTNERSHIP + SOLE_PROPRIETORSHIP +} + +"""""" +input BrexCreateAccountInput { + taxpayerNumber: String! + principalUser: BrexAccountPrincipalUserInput + officeAddress: BrexAddressInput! + legalName: String! + incorporationType: BrexAccountIncorporationTypeInput! + incorporationState: String! + dbaName: String! + dateEstablished: String! + clientMutationId: String! +} + +"""""" +type BrexCreateAccountPayload { + """""" + account: BrexAccount + + """""" + clientMutationId: String! +} + +"""""" +input BrexUnsuspendCardInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexUnsuspendCardPayload { + """""" + clientMutationId: String! +} + +enum BrexFinancialsConnectRequestType { + FINICITY_CONNECT + FINICITY_LEGACY +} + +"""""" +input BrexFinancialFieldInput { + value: String + id: String +} + +"""""" +input BrexConnectInstitutionInput { + """default: FINICITY_LEGACY""" + requestType: BrexFinancialsConnectRequestType + + """login fields are only needed for FINICITY_LEGACY""" + loginFields: [BrexFinancialFieldInput] + institutionId: ID! + clientMutationId: String! +} + +"""""" +type BrexConnectInstitutionPayload { + """""" + clientMutationId: String! + + """""" + result: BrexFinancialsSourceResult +} + +"""""" +input BrexCreateStatementEntriesReportInput { + searchStatementEntriesFilters: String! + format: BrexReportFormat! + + """Time in user's timezone that report is generated""" + displayTime: String! + consistentStatementEntriesFilters: String + clientMutationId: String! +} + +enum BrexReportType { + D_T + SEARCH + W_D +} + +enum BrexReportFormat { + CSV + HTML + PDF + TXT + XLSX +} + +"""""" +type BrexReport { + """""" + file: BrexAsset + + """""" + format: BrexReportFormat + + """""" + type: BrexReportType +} + +"""""" +type BrexCreateStatementEntriesReportPayload { + """""" + clientMutationId: String! + + """""" + report: BrexReport +} + +"""""" +input BrexUpdateIntegrationCredentialInput { + """ID of integration whose credential is getting changed""" + integrationId: ID! + + """ID of new credential""" + credentialId: ID! + clientMutationId: String! +} + +"""""" +type BrexUpdateIntegrationCredentialPayload { + """""" + clientMutationId: String! + + """""" + integration: BrexIntegration +} + +"""""" +input BrexUpdateProductApplicationInput { + id: ID! + data: String! + clientMutationId: String! +} + +"""""" +type BrexUpdateProductApplicationPayload { + """""" + clientMutationId: String! + + """""" + productApplication: BrexProductApplication +} + +"""""" +input BrexAddressInput { + zip: String! + state: String! + country: String! + city: String! + address2: String + address1: String! +} + +"""""" +input BrexCreatePhysicalCardInput { + shippingAddress: BrexAddressInput! + holderName: String! + displayName: String + customerUserId: ID + clientMutationId: String! +} + +"""""" +type BrexCreatePhysicalCardPayload { + """""" + card: BrexCard + + """""" + clientMutationId: String! +} + +"""""" +input BrexRefreshIntegrationInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexRefreshIntegrationPayload { + """""" + clientMutationId: String! + + """""" + integration: BrexIntegration +} + +"""""" +input BrexFinicityConnectMigrateAccountsInput { + financialSourceId: ID! + clientMutationId: String! +} + +"""""" +type BrexFinicityConnectMigrateAccountsPayload { + """""" + clientMutationId: String! + + """""" + updatedSource: BrexFinancialSource +} + +"""""" +input BrexDeleteUserInviteInput { + id: ID! + clientMutationId: String! +} + +"""""" +type BrexDeleteUserInvitePayload { + """""" + clientMutationId: String! +} + +"""""" +input BrexConnectShopifyCredentialInput { + shopName: String! + redirectUrl: String! + id: ID! + clientMutationId: String! +} + +"""""" +type BrexCredentialRedirectResult { + """""" + credential: BrexCredential + + """""" + redirectUrl: String +} + +"""""" +type BrexCredentialSuccessResult { + """""" + credential: BrexCredential +} + +"""""" +union BrexCredentialAuthenticationResult = BrexCredentialSuccessResult | BrexCredentialRedirectResult + +"""""" +type BrexConnectShopifyCredentialPayload { + """""" + authenticationResult: BrexCredentialAuthenticationResult + + """""" + clientMutationId: String! +} + +"""""" +input BrexCreateLimitRuleInput { + userId: ID! + timeWindowDays: Int! + clientMutationId: String! + amount: Int! +} + +"""""" +type BrexCreateLimitRulePayload { + """""" + clientMutationId: String! + + """""" + rule: BrexRule +} + +"""""" +input BrexSetStatementEntryIntegrationFieldInput { + value: String! + statementEntryId: ID! + field: String! + clientMutationId: String! +} + +"""""" +type BrexSetStatementEntryIntegrationFieldPayload { + """""" + clientMutationId: String! + + """""" + lens: BrexStatementEntryLens +} + +"""""" +input BrexCreateSubscriptionInput { + notificationType: BrexNotificationType! + clientMutationId: String! + channelId: ID! +} + +"""""" +type BrexCreateSubscriptionPayload { + """""" + clientMutationId: String! + + """""" + notificationSubscription: BrexNotificationSubscription +} + +"""""" +type BrexRootMutationType { + """""" + createSubscription(input: BrexCreateSubscriptionInput!): BrexCreateSubscriptionPayload + + """""" + setStatementEntryIntegrationField(input: BrexSetStatementEntryIntegrationFieldInput!): BrexSetStatementEntryIntegrationFieldPayload + + """""" + createLimitRule(input: BrexCreateLimitRuleInput!): BrexCreateLimitRulePayload + + """""" + connectShopifyCredential(input: BrexConnectShopifyCredentialInput!): BrexConnectShopifyCredentialPayload + + """""" + deleteUserInvite(input: BrexDeleteUserInviteInput!): BrexDeleteUserInvitePayload + + """""" + finicityConnectMigrateAccounts(input: BrexFinicityConnectMigrateAccountsInput!): BrexFinicityConnectMigrateAccountsPayload + + """""" + refreshIntegration(input: BrexRefreshIntegrationInput!): BrexRefreshIntegrationPayload + + """""" + createPhysicalCard(input: BrexCreatePhysicalCardInput!): BrexCreatePhysicalCardPayload + + """""" + updateProductApplication(input: BrexUpdateProductApplicationInput!): BrexUpdateProductApplicationPayload + + """""" + updateIntegrationCredential(input: BrexUpdateIntegrationCredentialInput!): BrexUpdateIntegrationCredentialPayload + + """ + Creates report based on statement filters and returns representative asset + """ + createStatementEntriesReport(input: BrexCreateStatementEntriesReportInput!): BrexCreateStatementEntriesReportPayload + + """""" + connectInstitution(input: BrexConnectInstitutionInput!): BrexConnectInstitutionPayload + + """""" + unsuspendCard(input: BrexUnsuspendCardInput!): BrexUnsuspendCardPayload + + """""" + createAccount(input: BrexCreateAccountInput!): BrexCreateAccountPayload + + """""" + createIntegration(input: BrexCreateIntegrationInput!): BrexCreateIntegrationPayload + + """""" + setDepositsTransactionPaymentMemo(input: BrexSetDepositsTransactionPaymentMemoInput!): BrexSetDepositsTransactionPaymentMemoPayload + + """""" + depositCheque(input: BrexDepositChequeInput!): BrexDepositChequePayload + + """""" + createTransactionApprovedSubscription(input: BrexCreateTransactionApprovedSubscriptionInput!): BrexCreateTransactionApprovedSubscriptionPayload + + """ + Creates report based on search query of statement entries and returns representative asset + """ + createStatementEntriesSearchReport(input: BrexCreateStatementEntriesSearchReportInput!): BrexCreateStatementEntriesSearchReportPayload + + """""" + updateDepartment(input: BrexUpdateDepartmentInput!): BrexUpdateDepartmentPayload + + """""" + deleteRule(input: BrexDeleteRuleInput!): BrexDeleteRulePayload + + """""" + inviteUser(input: BrexInviteUserInput!): BrexInviteUserPayload + + """""" + deleteSubscription(input: BrexDeleteSubscriptionInput!): BrexDeleteSubscriptionPayload + + """""" + createCashWireDetails(input: BrexCreateCashWireDetailsInput!): BrexCreateCashWireDetailsPayload + + """""" + disableIntegration(input: BrexDisableIntegrationInput!): BrexDisableIntegrationPayload + + """""" + updateIntegrationSettings(input: BrexUpdateIntegrationSettingsInput!): BrexUpdateIntegrationSettingsPayload + + """""" + createFundingSource(input: BrexCreateFundingSourceInput!): BrexCreateFundingSourcePayload + + """""" + enableUser(input: BrexEnableUserInput!): BrexEnableUserPayload + + """""" + updateIntegrationSyncSettings(input: BrexUpdateIntegrationSyncSettingsInput!): BrexUpdateIntegrationSyncSettingsPayload + + """""" + toggleRuleForStatementEntry(input: BrexToggleRuleForStatementEntryInput!): BrexToggleRuleForStatementEntryPayload + + """""" + setPrimaryFundingSource(input: BrexSetPrimaryFundingSourceInput!): BrexSetPrimaryFundingSourcePayload + + """""" + updateUserCategory(input: BrexUpdateUserCategoryInput!): BrexUpdateUserCategoryPayload + + """""" + updateIntegrationRule(input: BrexUpdateIntegrationRuleInput!): BrexUpdateIntegrationRulePayload + + """""" + finicityConnectGenerateFixUrl(input: BrexFinicityConnectGenerateFixUrlInput!): BrexFinicityConnectGenerateFixUrlPayload + + """""" + disableUser(input: BrexDisableUserInput!): BrexDisableUserPayload + + """""" + generateDepositsStatementDocumentDownloadUrl(input: BrexGenerateDepositsStatementDocumentDownloadUrlInput!): BrexGenerateDepositsStatementDocumentDownloadUrlPayload + + """""" + updateInstitutionLogin(input: BrexUpdateInstitutionLoginInput!): BrexUpdateInstitutionLoginPayload + + """""" + finicityConnectGenerateLiteUrl(input: BrexFinicityConnectGenerateLiteUrlInput!): BrexFinicityConnectGenerateLiteUrlPayload + + """""" + createVirtualCard(input: BrexCreateVirtualCardInput!): BrexCreateVirtualCardPayload + + """""" + signup(input: BrexSignupInput!): BrexSignupPayload @deprecated(reason: "Use 'softSignup' instead") + + """""" + addFunds(input: BrexAddFundsInput!): BrexAddFundsPayload + + """""" + submitProductApplication(input: BrexSubmitProductApplicationInput!): BrexSubmitProductApplicationPayload + + """""" + updateCardPin(input: BrexUpdateCardPinInput!): BrexUpdateCardPinPayload + + """""" + updateCardDisplayName(input: BrexUpdateCardDisplayNameInput!): BrexUpdateCardDisplayNamePayload + + """""" + setTransactionIntegrationField(input: BrexSetTransactionIntegrationFieldInput!): BrexSetTransactionIntegrationFieldPayload + + """""" + createDepartment(input: BrexCreateDepartmentInput!): BrexCreateDepartmentPayload + + """""" + createFileUploadUrl(input: BrexCreateFileUploadUrlInput!): BrexCreateFileUploadUrlPayload + + """""" + associateCategories(input: BrexAssociateCategoriesInput!): BrexAssociateCategoriesPayload + + """ + Creates report based on unexported statement entries for a transaction. + """ + createIntegrationExportReport(input: BrexCreateIntegrationExportReportInput!): BrexCreateIntegrationExportReportPayload + + """""" + connectCredential(input: BrexConnectCredentialInput!): BrexConnectCredentialPayload + + """""" + cDa(input: BrexCDaInput!): BrexCDaPayload @deprecated(reason: "Use 'onboardingCreateApplication' instead, passing in the blueprint name:'gemini'") + + """""" + submitOnboardingInformationRequest(input: BrexSubmitOnboardingInformationRequestInput!): BrexSubmitOnboardingInformationRequestPayload + + """""" + setupMfa(input: BrexSetupMfaInput!): BrexSetupMfaPayload + + """""" + createLocation(input: BrexCreateLocationInput!): BrexCreateLocationPayload + + """""" + deleteDepartment(input: BrexDeleteDepartmentInput!): BrexDeleteDepartmentPayload + + """""" + resetUser(input: BrexResetUserInput!): BrexResetUserPayload + + """""" + createNetsuiteCredential(input: BrexCreateNetsuiteCredentialInput!): BrexCreateNetsuiteCredentialPayload + + """""" + createCounterparty(input: BrexCreateCounterpartyInput!): BrexCreateCounterpartyPayload + + """""" + softSignup(input: BrexSoftSignupInput!): BrexSoftSignupPayload + + """""" + sendMoney(input: BrexSendMoneyInput!): BrexSendMoneyPayload + + """""" + updateTransactionLocation(input: BrexUpdateTransactionLocationInput!): BrexUpdateTransactionLocationPayload + + """""" + setUserRole(input: BrexSetUserRoleInput!): BrexSetUserRolePayload + + """""" + updateUserCategories(input: BrexUpdateUserCategoriesInput!): BrexUpdateUserCategoriesPayload + + """""" + createPushChannel(input: BrexCreatePushChannelInput!): BrexCreatePushChannelPayload + + """""" + refreshFinancialSource(input: BrexRefreshFinancialSourceInput!): BrexRefreshFinancialSourcePayload + + """""" + deleteReceipt(input: BrexDeleteReceiptInput!): BrexDeleteReceiptPayload + + """""" + createOpenidSession(input: BrexCreateOpenidSessionInput!): BrexCreateOpenidSessionPayload + + """""" + saveOnboardingInformationRequest(input: BrexSaveOnboardingInformationRequestInput!): BrexSaveOnboardingInformationRequestPayload + + """""" + createIntegrationRule(input: BrexCreateIntegrationRuleInput!): BrexCreateIntegrationRulePayload + + """""" + beginChannelVerification(input: BrexBeginChannelVerificationInput!): BrexBeginChannelVerificationPayload + + """""" + createMilesTransfer(input: BrexCreateMilesTransferInput!): BrexCreateMilesTransferPayload + + """""" + activateUser(input: BrexActivateUserInput!): BrexActivateUserPayload + + """""" + createEmailChannel(input: BrexCreateEmailChannelInput!): BrexCreateEmailChannelPayload + + """""" + updateLocation(input: BrexUpdateLocationInput!): BrexUpdateLocationPayload + + """""" + createProductApplication(input: BrexCreateProductApplicationInput!): BrexCreateProductApplicationPayload + + """""" + setUserLimit(input: BrexSetUserLimitInput!): BrexSetUserLimitPayload + + """""" + updateTransactionCategory(input: BrexUpdateTransactionCategoryInput!): BrexUpdateTransactionCategoryPayload + + """""" + deleteIntegrationRule(input: BrexDeleteIntegrationRuleInput!): BrexDeleteIntegrationRulePayload + + """""" + startResetUser(input: BrexStartResetUserInput!): BrexStartResetUserPayload + + """""" + addPlaidTestingCredentials(input: BrexAddPlaidTestingCredentialsInput!): BrexAddPlaidTestingCredentialsPayload + + """""" + onboardingInformationRequest(id: ID!): BrexOnboardingInformationRequest + + """""" + createReceipt(input: BrexCreateReceiptInput!): BrexCreateReceiptPayload + + """""" + createSmsChannel(input: BrexCreateSmsChannelInput!): BrexCreateSmsChannelPayload + + """""" + cancelCollectionIntention(input: BrexCancelCollectionIntentionInput!): BrexCancelCollectionIntentionPayload + + """""" + updateTransactionDepartment(input: BrexUpdateTransactionDepartmentInput!): BrexUpdateTransactionDepartmentPayload + + """""" + syncIntegration(input: BrexSyncIntegrationInput!): BrexSyncIntegrationPayload + + """""" + createCollectionIntention(input: BrexCreateCollectionIntentionInput!): BrexCreateCollectionIntentionPayload + + """""" + submitEvidence(input: BrexSubmitEvidenceInput!): BrexSubmitEvidencePayload + + """""" + createCredential(input: BrexCreateCredentialInput!): BrexCreateCredentialPayload + + """""" + createReferral(input: BrexCreateReferralInput!): BrexCreateReferralPayload + + """""" + updateUser(input: BrexUpdateUserInput!): BrexUpdateUserPayload + + """""" + issueCollection(input: BrexIssueCollectionInput!): BrexIssueCollectionPayload + + """""" + completeChallenge(input: BrexCompleteChallengeInput!): BrexCompleteChallengePayload + + """""" + terminateCard(input: BrexTerminateCardInput!): BrexTerminateCardPayload + + """""" + submitOnboardingApplication(input: BrexSubmitOnboardingApplicationInput!): BrexSubmitOnboardingApplicationPayload + + """""" + confirmMfa(input: BrexConfirmMfaInput!): BrexConfirmMfaPayload + + """""" + setPrimaryCollectionSource(input: BrexSetPrimaryCollectionSourceInput!): BrexSetPrimaryCollectionSourcePayload + + """ + For all integrations that match the filters, tests connectivity with integration vendor and updates credential status. + """ + refreshIntegrationCredentials(input: BrexRefreshIntegrationCredentialsInput!): BrexRefreshIntegrationCredentialsPayload + + """""" + pullDataAsync(input: BrexPullDataAsyncInput!): BrexPullDataAsyncPayload + + """""" + activateCard(input: BrexActivateCardInput!): BrexActivateCardPayload + + """""" + updateTransactionMemo(input: BrexUpdateTransactionMemoInput!): BrexUpdateTransactionMemoPayload + + """""" + createDepositsApplication(input: BrexCreateDepositsApplicationInput!): BrexCreateDepositsApplicationPayload @deprecated(reason: "Use 'onboardingCreateApplication' instead, passing in the blueprint name:'gemini'") + + """""" + createAsset(input: BrexCreateAssetInput!): BrexCreateAssetPayload + + """""" + createTransactionRefusedSubscription(input: BrexCreateTransactionRefusedSubscriptionInput!): BrexCreateTransactionRefusedSubscriptionPayload + + """""" + redeemStatementEntryRefund(input: BrexRedeemStatementEntryRefundInput!): BrexRedeemStatementEntryRefundPayload + + """ + Creates a product onboarding application following a blueprint of the given name + """ + createOnboardingProductApplication(input: BrexCreateOnboardingProductApplicationInput!): BrexCreateOnboardingProductApplicationPayload + + """""" + finishChannelVerification(input: BrexFinishChannelVerificationInput!): BrexFinishChannelVerificationPayload + + """""" + suspendCard(input: BrexSuspendCardInput!): BrexSuspendCardPayload + + """""" + deleteLocation(input: BrexDeleteLocationInput!): BrexDeleteLocationPayload + createSession(input: BrexCreateSessionInput!): BrexCreateSessionResponsePayload! @deprecated(reason: "Use `createOpenidSession` instead") +} + +type OneGraphSignoutResponsePayload { + me: Viewer! +} + +"""A OneGraph SignIn result""" +type OneGraphSignInResult { + """ + The accessToken that can be used to make requests on behalf of the OneGraph user + """ + accessToken: OneGraphAccessToken +} + +input OneGraphDisableGithubRepositorySubscriptionDelegationByIdInput { + """The id of the delegation.""" + id: String! +} + +type OneGraphDisableGithubRepositorySubscriptionDelegationByIdResult { + """The App that delegation was disabled for.""" + app: OneGraphApp! +} + +input OneGraphDisableGithubRepositorySubscriptionDelegationInput { + """ + The name of the repo, e.g. `graphiql-explorer` in `onegraph/graphiql-explorer`. + """ + repoName: String! + + """ + The owner of the repo, e.g. `onegraph` in `onegraph/graphiql-explorer`. + """ + repoOwner: String! +} + +type OneGraphDisableGithubRepositorySubscriptionDelegationResult { + """The GitHub repository name of app that delegation was enabled for.""" + repoName: String! + + """The GitHub repository owner of app that delegation was enabled for.""" + repoOwner: String! +} + +input OneGraphEnableGithubRepositorySubscriptionDelegationInput { + """ + The name of the repo, e.g. `graphiql-explorer` in `onegraph/graphiql-explorer`. + """ + repoName: String! + + """ + The owner of the repo, e.g. `onegraph` in `onegraph/graphiql-explorer`. + """ + repoOwner: String! +} + +type OneGraphEnableGithubRepositorySubscriptionDelegationResult { + """The GitHub repository name of app that delegation was disabled for.""" + repoName: String! + + """The GitHub repository owner of app that delegation was disabled for.""" + repoOwner: String! +} + +input OneGraphSetupSalesforceSubscriptionsCreateTriggerClassInput { + sobjectNames: [String!]! +} + +type OneGraphSetupSalesforceSubscriptionsTriggerClass { + name: String! + body: String! + apiVersion: Float! + sobjectName: String! + testClass: OneGraphSetupSalesforceSubscriptionsTestClass! +} + +type OneGraphSetupSalesforceSubscriptionsCreateTriggerClassPayload { + triggers: [OneGraphSetupSalesforceSubscriptionsTriggerClass!]! +} + +type OneGraphSetupSalesforceSubscriptionsTestClass { + name: String! + body: String! + + """Salesforce API version""" + apiVersion: Float! +} + +type OneGraphSetupSalesforceSubscriptionsHelperClass { + name: String! + body: String! + + """Salesforce API version""" + apiVersion: Float! + + """Test classes for the helper class""" + testClasses: [OneGraphSetupSalesforceSubscriptionsTestClass!]! +} + +type OneGraphSetupSalesforceSubscriptionsCreateHelperClassPayload { + helperClass: OneGraphSetupSalesforceSubscriptionsHelperClass! +} + +input OneGraphDeletePersistedQueryInput { + id: String! + appId: String! +} + +type OneGraphDeletePersistedQueryResponsePayload { + app: OneGraphApp! +} + +input OneGraphPersistedQueryTokenInput { + """Id for the app that you want to persist queries on.""" + appId: String! +} + +type OneGraphCreatePersitQueryTokenResponsePayload { + """The access token that can be used to persist queries""" + accessToken: OneGraphAccessToken! +} + +input OneGraphPersistedQueryCacheStrategyArg { + """Number of seconds to cache the query result for.""" + timeToLiveSeconds: Float! +} + +input OneGraphCreatePersistedQueryInput { + accessToken: String + cacheStrategy: OneGraphPersistedQueryCacheStrategyArg + fixedVariables: JSON + freeVariables: [String!] + query: String! + appId: String! +} + +type OneGraphPersistedQueryResponsePayload { + persistedQuery: OneGraphPersistedQuery! +} + +enum OneGraphDataVitualizationSupportedServiceArg { + GMAIL +} + +input OneGraphStartDataVirtualizationInput { + """ + Account ID to enable the service for. Must match the currently logged in account id + """ + accountId: String! + + """Service to enable data virtualization for""" + service: OneGraphDataVitualizationSupportedServiceArg! +} + +""" +Information about data virtualization that has been enabled for a service +""" +type OneGraphDataVirtualizationDetails { + accountId: String! + graphQLEndpoint: String! + service: String! +} + +type OneGraphStartDataVirtualizationPayload { + """Organization that was updated by this mutation""" + dataVirutalizationDetails: OneGraphDataVirtualizationDetails! +} + +input OneGraphUpdateOrgByIdPatch { + """New name for the organization""" + name: String! +} + +input OneGraphUpdateOrgByIdInput { + """New fields for the organization""" + patch: OneGraphUpdateOrgByIdPatch! + + """Id of the organization""" + id: String! +} + +type OneGraphUpdateOrgByIdResponsePayload { + """Organization that was updated by this mutation""" + org: OneGraphOrg! +} + +input OneGraphCreateOrgInput { + """Name for the organization""" + name: String! +} + +type OneGraphCreateOrgResponsePayload { + """Organization that was created by this mutation""" + org: OneGraphOrg! +} + +input OneGraphCreateShortenedUrlInput { + operation: String + description: String + name: String + variables: String + query: String! +} + +type OneGraphShortenUrlResponsePayload { + shortenedUrl: OneGraphShortenedQuery! +} + +input OneGraphPersistAuthsInput { + auths: OneGraphServiceAuths! +} + +type OneGraphPersistAuthsResponsePayload { + me: Viewer! +} + +input OneGraphAddAuthsToPersonalTokenInput { + appId: String! + + """ + Token that will be destroyed and have its auths moved to the personal token. + """ + sacrificialToken: String! + personalToken: String! +} + +type OneGraphAddAuthsToPersonalTokenResponsePayload { + """Personal access token that was updated by this mutation""" + accessToken: OneGraphAccessToken! + + """OneGraph user""" + oneUser: OneGraphUser! +} + +input OneGraphDeletePersonalTokenInput { + appId: String! + accessToken: String! +} + +type OneGraphDeletePersonalTokenResponsePayload { + """OneGraph user""" + oneUser: OneGraphUser! +} + +input OneGraphCreatePersonalTokenInput { + appId: String! + accessToken: String! + name: String! +} + +type OneGraphCreatePersonalTokenResponsePayload { + """Personal access token that was created by this mutation""" + accessToken: OneGraphAccessToken! + + """OneGraph user""" + oneUser: OneGraphUser! +} + +input OneGraphGraphQLSubscriptionUnsubscribeInput { + subscriptionId: String! +} + +type OneGraphGraphQLSubscriptionUnsubscribeResponsePayload { + """GraphQL Subscription that was modified by this mutation""" + subscription: OneGraphAppSubscription! +} + +input OneGraphDestroyServiceAuthInput { + serviceAuthId: String! + appId: String! +} + +type OneGraphDestroyServiceAuthResponsePayload { + """Service auth that was destroyed by this mutation""" + serviceAuth: OneGraphServiceAuth! + app: OneGraphApp! +} + +""" +Services OneGraph supports providing a custom clientId/clientSecret for. +""" +enum OneGraphCustomServiceAuthServiceEnum { + BOX + CONTENTFUL + DRIBBBLE + DROPBOX + EGGHEADIO + EVENTIL + FACEBOOK + GITHUB + GMAIL + GOOGLE_ANALYTICS + GOOGLE_CALENDAR + GOOGLE_COMPUTE + GOOGLE_DOCS + GOOGLE_TRANSLATE + HUBSPOT + INTERCOM + MAILCHIMP + MEETUP + QUICKBOOKS + SALESFORCE + SLACK + SPOTIFY + STRIPE + TRELLO + TWILIO + TWITTER + TWITCH_TV + YOUTUBE + ZENDESK +} + +input OneGraphCreateServiceAuthInput { + """Custom redirect URI.""" + customRedirectUri: String + + """ + Whether the user who created the token should be able to fetch it from OneGraph. Defaults to false. + """ + revealTokens: Boolean + + """Optional list of scopes to use for your app.""" + scopes: [String!] + + """App name for trello. Required to use custom Trello credentials.""" + trelloAppName: String + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + clientSecret: String! + clientId: String! + service: OneGraphCustomServiceAuthServiceEnum! + appId: String! +} + +type OneGraphCreateServiceAuthResponsePayload { + """Service auth that was created by this mutation""" + serviceAuth: OneGraphServiceAuth! + app: OneGraphApp! +} + +input OneGraphRemoveNetlifySiteFromAppCORSOriginsInput { + netlifySite: String! + appId: String! +} + +type OneGraphRemoveNetlifySiteFromAppCORSOriginsResponsePayload { + app: OneGraphApp! +} + +input OneGraphAddNetlifySiteToAppCORSOriginsInput { + netlifySite: String! + appId: String! +} + +type OneGraphAddNetlifySiteToAppCORSOriginsResponsePayload { + app: OneGraphApp! +} + +input OneGraphRemoveCORSOriginFromAppInput { + corsOrigin: String! + appId: String! +} + +type OneGraphRemoveCORSOriginFromAppResponsePayload { + app: OneGraphApp! +} + +input OneGraphAddCORSOriginToAppInput { + corsOrigin: String! + appId: String! +} + +type OneGraphAddCORSOriginToAppResponsePayload { + app: OneGraphApp! +} + +input SetAppCORSOriginsData { + corsOrigins: [String!]! + appId: String! +} + +type SetAppCORSOriginsResponsePayload { + app: OneGraphApp! +} + +enum OneGraphQueryChainIfMissingEnum { + ERROR + ALLOW + SKIP +} + +enum OneGraphQueryChainIfListEnum { + FIRST + LAST + ALL + EACH +} + +input OneGraphQueryChainArgumentDependencyInput { + functionFromScript: String! + maxRecur: Int + ifMissing: OneGraphQueryChainIfMissingEnum + ifList: OneGraphQueryChainIfListEnum + fromRequestIds: [String!]! + name: String! +} + +input OneGraphQueryChainVariableInput { + value: JSON! + name: String! +} + +input OneGraphQueryChainRequestInput { + argumentDependencies: [OneGraphQueryChainArgumentDependencyInput!] + variables: [OneGraphQueryChainVariableInput!] + + """The query to run. Must provide one of `query` or `operationName`.""" + query: String + + """ + The operationName of the query in the document to run. Must provide one of `query` or `operationName`. + """ + operationName: String + + """ + The id of the query. If you provide a script in the argument dependencies for a request that depends on this query, the data from this query will be provided as `{"$ID": query-result}`. This will typically be the same as the operation name, but could be different if your chain needs to use the same query in multiple requests. + """ + id: String! +} + +input OneGraphQueryChainInput { + requests: [OneGraphQueryChainRequestInput!]! + script: String +} + +type OneGraphQueryChainRequest { + """The id of the request""" + id: String! +} + +type OneGraphQueryChainMutationResult { + """The request.""" + request: OneGraphQueryChainRequest! + + """The result of the query""" + result: [JSON]! +} + +type OneGraphQueryChainMutationPayload { + results: [OneGraphQueryChainMutationResult!]! +} + +"""Tours for exploring OneGraph""" +enum OneGraphTourEnum { + DASHBOARD + QUERYCHAIN +} + +input OneGraphCompleteTourData { + tour: OneGraphTourEnum! +} + +type OneGraphCompleteTourResponsePayload { + me: Viewer! +} + +input OneGraphUnLinkOneGraphNodesInput { + """The `oneGraphId` for the end node""" + endNodeOneGraphId: String! + + """The `oneGraphId` for the start node""" + startNodeOneGraphId: String! +} + +type OneGraphUnLinkOneGraphNodesResponsePayload { + startNode: OneGraphNode + endNode: OneGraphNode +} + +input OneGraphLinkOneGraphNodesInput { + """The `oneGraphId` for the end node""" + endNodeOneGraphId: String! + + """The `oneGraphId` for the start node""" + startNodeOneGraphId: String! +} + +type OneGraphLinkOneGraphNodesResponsePayload { + startNode: OneGraphNode + endNode: OneGraphNode +} + +"""GraphQL types that support linking""" +enum OneGraphServiceLinkGraphQLTypeEnum { + GitHubIssue + GitHubIssueComment + GitHubUser + HubspotContact + IntercomUser + SalesforceAccount + SalesforceCase + SalesforceCaseComment + SalesforceContact + SalesforceFeedComment + SalesforceFeedItem + SalesforceLead + SalesforceUser + StripeCustomer + StripeRefund + ZendeskUser +} + +input OneGraphServiceLinkNodeArg { + id: String! + type: OneGraphServiceLinkGraphQLTypeEnum! +} + +input OneGraphCreateServiceLinkArg { + endNode: OneGraphServiceLinkNodeArg! + startNode: OneGraphServiceLinkNodeArg! +} + +type OneGraphServiceLinkNode { + type: String! + id: String! +} + +type OneGraphCreateServiceLinkResponsePayload { + startNode: OneGraphServiceLinkNode! + endNode: OneGraphServiceLinkNode! +} + +input OneGraphDangerouslySignJwtPayloadInput { + expiresInSeconds: Int + includeBaseFields: Boolean + payload: JSON! +} + +type OneGraphDangerouslySignJwtPayloadResponsePayload { + encoded: String! +} + +input OneGraphSetAppNetlifySiteNamesInput { + netlifySiteNames: [String!]! +} + +type OneGraphSetAppNetlifySiteNamesResponsePayload { + app: OneGraphApp! +} + +input OneGraphSetAuthGuardianActiveInput { + active: Boolean! +} + +type OneGraphSetAuthGuardianActiveResponsePayload { + app: OneGraphApp +} + +"""Signing algorithm for JWTs generated by Onegraph""" +enum OneGraphJwtSigningAlgorithmEnumArg { + HMAC_256 + RSA_256 +} + +input OneGraphSetJwtSigningAlgorithmAndSecretInput { + """ + When using symmetric (HMAC) algorithms, this is the shared secret OneGraph will use to sign the generated JSON web tokens. + """ + sharedSecret: String + + """ + When generating a JWT for SSO, OneGraph can sign the JSON tokens with either a shared-secret (symmetric) key (HMAC) or a public/private (asymmetric) key pair (RSA) + """ + signingAlgorithm: OneGraphJwtSigningAlgorithmEnumArg! +} + +type OneGraphSetJwtSigningAlgorithmAndSecretPayload { + app: OneGraphApp! +} + +input OneGraphSetJwtPreflightQueryAndWebhookUrlInput { + """ + An optional GraphQL query to run after a user has signed into any service. The result will be included in the body for the preflight webhook. You may want to use this to retrieve a user's Google subId, or a list of GitHub organization names a user belongs. + """ + preflightQuery: String + + """ + When generating a JWT for SSO using OneGraph to authenticate + with third-parties, you can run an optional GraphQL query and + send the result to a webhook for preprocessing before OneGraph + signs the final token and passes it to the client + """ + webhookUrl: String +} + +type OneGraphSetAppJwtPreflightQueryResponsePayload { + app: OneGraphApp! +} + +"""Mutations related to apps""" +type OneGraphAppMutations { + setCORSOrigins(corsOrigins: [String!]!): OneGraphApp! + setJwtPreflightQueryAndWebhookUrl(input: OneGraphSetJwtPreflightQueryAndWebhookUrlInput!): OneGraphSetAppJwtPreflightQueryResponsePayload + setJwtSigningAlgorithmAndSecret(input: OneGraphSetJwtSigningAlgorithmAndSecretInput!): OneGraphSetJwtSigningAlgorithmAndSecretPayload + setAuthGuardianActive(input: OneGraphSetAuthGuardianActiveInput!): OneGraphSetAuthGuardianActiveResponsePayload + setAuthGuardian(input: OneGraphSetAuthGuardianInput!): OneGraphSetAuthGuardianResponsePayload + setNetlifySiteNames(input: OneGraphSetAppNetlifySiteNamesInput!): OneGraphSetAppNetlifySiteNamesResponsePayload! + + """ + Use this when you need to generate a JWT (JSON web token) with a valid signature based on the JWT algorithm settings for your app. For example, you might want to test out a token within the Hasura console, on your Netlify site, or against your own GraphQL server without going through a full auth flow manually. + + By default these tokens will only be valid for 5 minutes (300 seconds). + + Note that these tokens will be signed and valid, and will be accepted *anywhere* you have configured. **Treat them as secure tokens and guard them!** + """ + dangerouslySignJwtPayload(input: OneGraphDangerouslySignJwtPayloadInput!): OneGraphDangerouslySignJwtPayloadResponsePayload +} + +"""Mutations for the currently authed user""" +type OneGraphMutation { + app(id: String!): OneGraphAppMutations @deprecated(reason: "Use setAppCORSOrigins") + createServiceLink(data: OneGraphCreateServiceLinkArg!): OneGraphCreateServiceLinkResponsePayload! + linkOneGraphNodes(input: OneGraphLinkOneGraphNodesInput!): OneGraphLinkOneGraphNodesResponsePayload! + unLinkOneGraphNodes(input: OneGraphUnLinkOneGraphNodesInput!): OneGraphUnLinkOneGraphNodesResponsePayload! + completeTour(data: OneGraphCompleteTourData!): OneGraphCompleteTourResponsePayload! + createApp( + """`id` of the organization that this app should belong to""" + orgId: String! + corsOrigins: [String!]! + description: String + name: String! + ): OneGraphApp! + executeChain(input: OneGraphQueryChainInput!): OneGraphQueryChainMutationPayload! + setAppCORSOrigins(data: SetAppCORSOriginsData!): SetAppCORSOriginsResponsePayload! + addCORSOriginToApp(input: OneGraphAddCORSOriginToAppInput!): OneGraphAddCORSOriginToAppResponsePayload! + removeCORSOriginFromApp(input: OneGraphRemoveCORSOriginFromAppInput!): OneGraphRemoveCORSOriginFromAppResponsePayload! + addNetlifySiteToAppCORSOrigins(input: OneGraphAddNetlifySiteToAppCORSOriginsInput!): OneGraphAddNetlifySiteToAppCORSOriginsResponsePayload! + removeNetlifySiteFromAppCORSOrigins(input: OneGraphRemoveNetlifySiteFromAppCORSOriginsInput!): OneGraphRemoveNetlifySiteFromAppCORSOriginsResponsePayload! + createServiceAuth(data: OneGraphCreateServiceAuthInput!): OneGraphCreateServiceAuthResponsePayload! + destroyServiceAuth(data: OneGraphDestroyServiceAuthInput!): OneGraphDestroyServiceAuthResponsePayload! + subscriptionUnsubscribe(data: OneGraphGraphQLSubscriptionUnsubscribeInput!): OneGraphGraphQLSubscriptionUnsubscribeResponsePayload! + createPersonalToken(input: OneGraphCreatePersonalTokenInput!): OneGraphCreatePersonalTokenResponsePayload! + deletePersonalToken(input: OneGraphDeletePersonalTokenInput!): OneGraphDeletePersonalTokenResponsePayload! + addAuthsToPersonalToken(input: OneGraphAddAuthsToPersonalTokenInput!): OneGraphAddAuthsToPersonalTokenResponsePayload! + persistAuths(input: OneGraphPersistAuthsInput!): OneGraphPersistAuthsResponsePayload! + createShortenedUrl(input: OneGraphCreateShortenedUrlInput!): OneGraphShortenUrlResponsePayload! + createOrg(input: OneGraphCreateOrgInput!): OneGraphCreateOrgResponsePayload! + updateOrgById(input: OneGraphUpdateOrgByIdInput!): OneGraphUpdateOrgByIdResponsePayload! + enableDataVirtualization(input: OneGraphStartDataVirtualizationInput!): OneGraphStartDataVirtualizationPayload! + createPersistedQuery(input: OneGraphCreatePersistedQueryInput!): OneGraphPersistedQueryResponsePayload! + createPersitQueryToken(input: OneGraphPersistedQueryTokenInput!): OneGraphCreatePersitQueryTokenResponsePayload! + deletePersistedQuery(input: OneGraphDeletePersistedQueryInput!): OneGraphDeletePersistedQueryResponsePayload! + setupSalesforceSubscriptionHelperClass: OneGraphSetupSalesforceSubscriptionsCreateHelperClassPayload! + setupSalesforceSubscriptionTriggerClass(input: OneGraphSetupSalesforceSubscriptionsCreateTriggerClassInput!): OneGraphSetupSalesforceSubscriptionsCreateTriggerClassPayload! + + """ + Allows non-admin users to subscribe to GitHub events on OneGraph for the given repo and app. + """ + enableGitHubRepositorySubscriptionDelegation(input: OneGraphEnableGithubRepositorySubscriptionDelegationInput!): OneGraphEnableGithubRepositorySubscriptionDelegationResult! + + """ + Remove ability for non-admin users to subscribe to GitHub events on OneGraph for the given repo and app. + """ + disableGitHubRepositorySubscriptionDelegation(input: OneGraphDisableGithubRepositorySubscriptionDelegationInput!): OneGraphDisableGithubRepositorySubscriptionDelegationResult! + + """ + Remove ability for non-admin users to subscribe to GitHub events on OneGraph. Allows the owner of the app on OneGraph to remove delegation for a repo. + """ + disableGitHubRepositorySubscriptionDelegationById(input: OneGraphDisableGithubRepositorySubscriptionDelegationByIdInput!): OneGraphDisableGithubRepositorySubscriptionDelegationByIdResult! + destroyApp(id: String!): OneGraphApp + saveQuery(public: Boolean, enabled: Boolean, tags: [String!]!, description: String, name: String!, body: String!): OneGraphQuery! + updateQuery(public: Boolean, enabled: Boolean, tags: [String!], name: String, id: String!): OneGraphQuery + destroyQuery(version: String!, name: String!): OneGraphQuery! + signUp(agreeToTOS: Boolean!, passwordConfirm: String!, password: String!, email: String!, fullName: String!): OneGraphSignInResult! + signIn(rememberMe: Boolean!, password: String!, email: String!): OneGraphSignInResult! + agreeToTos(userAgreesToTheOneGraphTermsOfService: Boolean!): OneGraphUser! + signOut: OneGraphSignoutResponsePayload! + exchangeGitHubContextForOneGraphAccessToken: OneGraphSignInResult! + associateOneGraphUserWithGitHubAccount: OneGraphUser! + requestPasswordReset(email: String!): String! + resetPassword(passwordConfirm: String!, password: String!, token: String!): Boolean! +} + +input ZeitAliasDeploymentArg { + """The alias we want to assign to the deployment defined in the URL..""" + alias: String! + deploymentId: String! +} + +type ZeitAliasDeploymentResponsePayload { + """ + The unique identifier of the previously aliased deployment, only received when the alias was used before + """ + oldId: String + + """The unique identifier of the alias""" + uid: String! + + """The date when the alias was created""" + created: String! +} + +"""The encoding used for the file content""" +enum ZeitFileEncodingEnumArg { + BASE64 + UTF8 +} + +input ZeitCreateDeploymentFileArg { + """ + The encoding used for the file content, it could be either `base64` or `plain`, defaults to `plain`. + """ + encoding: ZeitFileEncodingEnumArg + + """ + The file content, it could be either a base64 (useful for images, etc.) of the files or the plain content for source code. + """ + data: String! + + """The file name including the whole path, eg. `folder/file.js`.""" + pathAndFilename: String! +} + +input ZeitCreateDeploymentArg { + """A list of maps with the files you want in the deploy.""" + files: [ZeitCreateDeploymentFileArg!]! + + """ + A boolean indicating if the deployment is public. For every deployment done under the OSS plan, this needs to be set to true. + """ + public: Boolean! + + """A string with the project name used in the deployment URL.""" + projectName: String! +} + +type ZeitCreateANewDeploymentV6Response { + """A String holding the unique ID of the deployment.""" + id: String + + """ + A string with the unique URL of the deployment. If it hasn't finished uploading (is incomplete), the value will be null. + """ + url: String + + """The name of the deployment.""" + name: String + + """The Now platform version the deployment is associated to.""" + version: Int + + """The regions the deployment exists in, e.g. sfo1.""" + regions: [ZeitRegionEnum!] + + """ + A list of routes objects used to rewrite paths to point towards other internal or external paths. For example; [{ "src": "/docs", "dest": "https://docs.zeit.co" }]. + """ + routes: [ZeitRoute!] + + """ + A list of objects containing the Builds for a particular set of sources in the deployment. Each object contains a src and use describing the sources files that use Builds in the deployment. + """ + builds: [ZeitSimpleBuild!] + + """The pricing plan the deployment was made under.""" + plan: String + + """ + A Boolean representing if the deployment is public or not. By default this is false. + """ + public: Boolean + + """The unique ID of the user or team the deployment belongs to.""" + ownerId: String + + """""" + readyState: ZeitDeploymentReadyState + + """ + A number containing the date when the deployment was created in milliseconds. + """ + createdAt: Int + + """The region where the deployment was first created, e.g. sfo1.""" + createdIn: String + + """The logs from this newly-created deployment.""" + logs: [ZeitDeploymentLog!] +} + +type ZeitCreateDeploymentResponsePayload { + deployment: ZeitCreateANewDeploymentV6Response +} + +input ZeitPurchaseDomainArg { + """The price you expect to be charged for the purchase.""" + expectedPrice: Int + + """The domain name you want to purchase.""" + name: String! +} + +type ZeitPurchaseDomainResponsePayload { + success: Boolean! +} + +"""Namespace for all mutations for Zeit""" +type ZeitMutationNamespace { + purchaseDomain( + """ + Purchase the specified domain, it receive the domain name as the key name inside the request body. + """ + data: ZeitPurchaseDomainArg! + ): ZeitPurchaseDomainResponsePayload! + createDeployment( + """Create a Zeit deployment.""" + input: ZeitCreateDeploymentArg! + ): ZeitCreateDeploymentResponsePayload! + aliasDeployment( + """Alias a Zeit deployment with a domain.""" + input: ZeitAliasDeploymentArg! + ): ZeitAliasDeploymentResponsePayload! +} + +""" +The broadcastStatus parameter identifies the state to which the broadcast is changing. Note that to transition a broadcast to either the testing or live state, the `status.streamStatus` must be active for the stream that the broadcast is bound to. +""" +enum YouTubeBroadcastStatusEnum { + """ + Start testing the broadcast. YouTube transmits video to the broadcast's monitor stream. Note that you can only transition a broadcast to the testing state if its `contentDetails.monitorStream.enableMonitorStream` property is set to true. + """ + testing + + """ + The broadcast is visible to its audience. YouTube transmits video to the broadcast's monitor stream and its broadcast stream. + """ + live + + """The broadcast is over. YouTube stops transmitting video.""" + complete +} + +input YouTubeTransitionLiveBroadcastData { + """ + The id parameter specifies the unique ID of the broadcast that is transitioning to another status. + """ + broadcastStatus: YouTubeBroadcastStatusEnum! + id: String! +} + +type YouTubeTransitionLiveBroadcastSuccessResponsePayload { + livebroadcast: YouTubeLiveBroadcast! +} + +type YouTubeTransitionLiveBroadcastResponsePayload { + result: YouTubeTransitionLiveBroadcastSuccessResponsePayload +} + +input YouTubeLiveBroadcastMonitorStreamArg { + broadcastStreamDelayMs: Int! + enableMonitorStream: Boolean! +} + +input YouTubeLiveBroadcastContentDetailsArg { + monitorStream: YouTubeLiveBroadcastMonitorStreamArg! + startWithSlate: Boolean + recordFromStart: Boolean + enableEmbed: Boolean + enableContentEncryption: Boolean + enableDvr: Boolean +} + +""" +If you are submitting an update request, and your request does not specify a value for a property that already has a value, the property's existing value will be deleted. + +Updates a broadcast. For example, you could modify the broadcast settings defined in the liveBroadcast resource's contentDetails object. +""" +input YouTubeUpdateLiveBroadcastData { + contentDetails: YouTubeLiveBroadcastContentDetailsArg! + broadcastStatus: YouTubeLiveBroadcastStatusArg! + snippet: YouTubeLiveBroadcastSnippetArg! + id: String! +} + +type YouTubeUpdateLiveBroadcastResponsePayload { + livebroadcast: YouTubeLiveBroadcast! +} + +""" +The broadcast's privacy status. Note that the broadcast represents exactly one YouTube video, so the privacy settings are identical to those supported for videos. In addition, you can set this field by modifying the broadcast resource or by setting the privacyStatus field of the corresponding video resource. +""" +enum YouTubePrivacyStatusEnum { + public + private + unlisted +} + +input YouTubeLiveBroadcastStatusArg { + """ + The broadcast's title. Note that the broadcast represents exactly one YouTube video. You can set this field by modifying the broadcast resource or by setting the title field of the corresponding video resource. + """ + privacyStatus: YouTubePrivacyStatusEnum! +} + +input YouTubeLiveBroadcastSnippetArg { + """ + The date and time that the broadcast is scheduled to start. The value is specified in `ISO 8601` (`YYYY-MM-DDThh:mm:ss.sZ`) format. + """ + scheduledStartTime: String! + + """ + The broadcast's title. Note that the broadcast represents exactly one YouTube video. You can set this field by modifying the broadcast resource or by setting the title field of the corresponding video resource. + """ + title: String! +} + +input YouTubeLiveBroadcastArg { + status: YouTubeLiveBroadcastStatusArg! + snippet: YouTubeLiveBroadcastSnippetArg! +} + +input YouTubeInsertLiveBroadcastData { + liveBroadcast: YouTubeLiveBroadcastArg! + onBehalfOfContentOwner: String + onBehalfOfContentOwnerChannel: String +} + +type YouTubeInsertLiveBroadcastResponsePayload { + livebroadcast: YouTubeLiveBroadcast! +} + +type YouTubeLiveBroadcastMutation { + insertLiveBroadcast(data: YouTubeInsertLiveBroadcastData!): YouTubeInsertLiveBroadcastResponsePayload! + updateLiveBroadcast(data: YouTubeUpdateLiveBroadcastData!): YouTubeUpdateLiveBroadcastResponsePayload! + transitionLiveBroadcast(data: YouTubeTransitionLiveBroadcastData!): YouTubeTransitionLiveBroadcastResponsePayload! +} + +"""Namespace for all mutations for YouTube""" +type YouTubeMutationNamespace { + liveBroadcast: YouTubeLiveBroadcastMutation! +} + +input TwitterPostStatusArg { + """ + The text of the status update. URL encode as necessary. t.co link wrapping will affect character counts. + """ + status: String! +} + +type TwitterPostStatusResponsePayload { + success: Boolean! + tweet: TwitterTweet! +} + +"""Namespace for all mutations for Twitter""" +type TwitterMutationNamespace { + postStatus( + """Post a status update on twitter. You know - tweeting!""" + input: TwitterPostStatusArg! + ): TwitterPostStatusResponsePayload! +} + +""" +Make a REST API call to the Twitch API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type TwitchTvPassthroughMutation { + """ + Make a POST request to the Twitch API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + post( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PUT request to the Twitch API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + put( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PATCH request to the Twitch API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + patch( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a DELETE request to the Twitch API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + delete( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The root for TwitchTv mutations""" +type TwitchTvMutation { + """ + Make a REST API call to the Twitch API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: TwitchTvPassthroughMutation! +} + +input TwilioSendMessageData { + mediaUrl: String + body: String + from: String! + to: String! +} + +type TwilioSendMessageResponsePayload { + message: TwilioMessage! +} + +"""Namespace for all mutations for Twilio""" +type TwilioMutationNamespace { + sendMessage(data: TwilioSendMessageData!): TwilioSendMessageResponsePayload +} + +input TrelloDeleteOrganizationMutationInput { + """The id of the organization to archive.""" + id: String! +} + +type TrelloDeleteOrganizationResponsePayload { + deleted: Boolean! +} + +input TrelloDeleteListMutationInput { + """The id of the list to archive.""" + id: String! +} + +type TrelloDeleteListResponsePayload { + deleted: Boolean! +} + +input TrelloDeleteLabelMutationInput { + """The id of the label to archive.""" + id: String! +} + +type TrelloDeleteLabelResponsePayload { + deleted: Boolean! +} + +input TrelloDeleteCustomFieldMutationInput { + """The id of the customField to archive.""" + id: String! +} + +type TrelloDeleteCustomFieldResponsePayload { + deleted: Boolean! +} + +input TrelloDeleteChecklistMutationInput { + """The id of the checklist to archive.""" + id: String! +} + +type TrelloDeleteChecklistResponsePayload { + deleted: Boolean! +} + +input TrelloDeleteCardMutationInput { + """The id of the card to archive.""" + id: String! +} + +type TrelloDeleteCardResponsePayload { + deleted: Boolean! +} + +input TrelloDeleteBoardMutationInput { + """The id of the board to archive.""" + id: String! +} + +type TrelloDeleteBoardResponsePayload { + deleted: Boolean! +} + +input TrelloArchiveListMutationInput { + """The id of the list to archive.""" + id: String! +} + +type TrelloArchiveListResponsePayload { + list: TrelloList! +} + +input TrelloArchiveCardMutationInput { + """The id of the card to archive.""" + id: String! +} + +type TrelloArchiveCardResponsePayload { + card: TrelloCard! +} + +input TrelloArchiveBoardMutationInput { + """The id of the board to archive.""" + id: String! +} + +type TrelloArchiveBoardResponsePayload { + board: TrelloBoard! +} + +enum TrelloUpdateOrganizationPermissionLevel { + PRIVATE + PUBLIC +} + +enum TrelloUpdateOrganizationBoardVisibility { + ADMIN + NONE + ORG +} + +input TrelloUpdateOrganizationBoardVisibilityArg { + """Who on the team can make public boards.""" + public: TrelloUpdateOrganizationBoardVisibility + + """Who can make private boards.""" + private: TrelloUpdateOrganizationBoardVisibility + + """Who can make team visible boards.""" + org: TrelloUpdateOrganizationBoardVisibility +} + +input TrelloUpdateOrganizationPrefsArg { + """Whether the team page is publicly visible. One of: private, public""" + permissionLevel: TrelloUpdateOrganizationPermissionLevel + + """ + An email address with optional wildcard characters. (E.g. subdomain.*.trello.com) + """ + orgInviteRestrict: String + + """Visibility restrictions on the board""" + boardVisibilityRestrict: TrelloUpdateOrganizationBoardVisibilityArg + + """1 or 2""" + googleAppsVersion: Int + + """Whether non-team members can be added to boards inside the team""" + externalMembersDisabled: Boolean + + """The Google Apps domain to link this org to.""" + associatedDomain: String +} + +input TrelloUpdateOrganizationMutationInput { + """Preferences for the organization""" + prefs: TrelloUpdateOrganizationPrefsArg + + """A URL starting with `http://` or `https://`.""" + website: String + + """The description for the organization.""" + desc: String + + """""" + displayName: String + + """ + A string with a length of at least 3. Only lowercase letters, underscores, and numbers are allowed. Must be unique. + """ + name: String + + """The id of the organization to update""" + id: String! +} + +type TrelloUpdateOrganizationResponsePayload { + organization: TrelloOrganization! +} + +input TrelloUpdateListMutationInput { + """Whether the active member is subscribed to this list""" + subscribed: Boolean + + """ + Position of the list. `top`, `bottom`, or a positive floating point number. + """ + pos: String + + """The id of the board the list should be moved to.""" + idBoard: String + + """Whether the list should be closed (archived)""" + closed: Boolean + + """Name for the list""" + name: String + + """The id of the list to update""" + id: String! +} + +type TrelloUpdateListResponsePayload { + list: TrelloList! +} + +enum TrelloUpdateLabelColor { + YELLOW + PURPLE + BLUE + RED + GREEN + ORANGE + BLACK + SKY + PINK + LIME + + """null means no color, and the label will not show on the front of cards""" + NULL +} + +input TrelloUpdateLabelMutationInput { + """The color for the label""" + color: TrelloUpdateLabelColor + + """Name for the label""" + name: String + + """The id of the label to update""" + id: String! +} + +type TrelloUpdateLabelResponsePayload { + label: TrelloLabel! +} + +input TrelloUpdateCustomFieldMutationInput { + """Whether this custom field should be shown on the front of cards""" + displayCardFront: Boolean + pos: String + name: String + + """The id of the custom field to update.""" + id: String! +} + +type TrelloUpdateCustomFieldResponsePayload { + customField: TrelloCustomFields! +} + +input TrelloUpdateChecklistMutationInput { + """ + The position of the checklist on the card. One of: top, bottom, or a positive number. + """ + pos: String + + """The name of the checklist. Should be a string of length 1 to 16384.""" + name: String + + """The id of the checklist.""" + id: String! +} + +type TrelloUpdateChecklistResponsePayload { + checklist: TrelloChecklist! +} + +input TrelloUpdateCardMutationInput { + """Whether the member should be subscribed to the card""" + subscribed: Boolean + + """Whether the due date should be marked complete""" + dueComplete: Boolean + + """A due date for the card""" + due: String + + """The position of the card: `top`, `bottom`, or a positive float""" + pos: String + + """The id of the board the card should be on""" + idBoard: String + + """List of label ids to add to the card""" + idLabels: [String!] + + """The id of the list the card should be created in.""" + idList: String + + """ + The id of the image attachment the card should use as its cover, or null for none + """ + idAttachmentCover: String + + """List of member ids that should be added to the card""" + idMembers: [String!] + + """Whether the card should be archived""" + closed: Boolean + + """The description for the card""" + desc: String + + """The name for the card""" + name: String + + """The id of the card to update""" + id: String! +} + +type TrelloUpdateCardResponsePayload { + card: TrelloCard! +} + +input TrelloUpdateBoardLabelNamesArg { + """Name for the blue label. 1 to 16384 characters long""" + blue: String + + """Name for the purple label. 1 to 16384 characters long""" + purple: String + + """Name for the red label. 1 to 16384 characters long""" + red: String + + """Name for the orange label. 1 to 16384 characters long""" + orange: String + + """Name for the yellow label. 1 to 16384 characters long""" + yellow: String + + """Name for the green label. 1 to 16384 characters long""" + green: String +} + +enum TrelloUpdateBoardCardAging { + PIRATE + REGULAR +} + +enum TrelloUpdateBoardInvitations { + ADMINS + MEMBERS +} + +enum TrelloUpdateBoardComments { + DISABLED + MEMBERS + OBSERVERS + ORG + PUBLIC +} + +enum TrelloUpdateBoardVoting { + DISABLED + MEMBERS + OBSERVERS + ORG + PUBLIC +} + +enum TrelloUpdateBoardPermissionLevel { + ORG + PRIVATE + PUBLIC +} + +input TrelloUpdateBoardPrefsArg { + """ + Determines the type of card aging that should take place on the board if card aging is enabled. One of: pirate, regular. + """ + cardAging: TrelloUpdateBoardCardAging + + """ + The id of a custom background or one of: `blue`, `orange`, `green`, `red`, `purple`, `pink`, `lime`, `sky`, `grey`. + """ + background: String + + """Determines whether card covers are enabled.""" + cardCovers: Boolean + + """ + Determines whether users can join the boards themselves or whether they have to be invited. + """ + selfJoin: Boolean + + """Determines what types of members can invite users to join""" + invitations: TrelloUpdateBoardInvitations + + """Who can comment on cards on this board.""" + comments: TrelloUpdateBoardComments + + """Who can vote on this board""" + voting: TrelloUpdateBoardVoting + + """The permission level of the board""" + permissionLevel: TrelloUpdateBoardPermissionLevel +} + +input TrelloUpdateBoardMutationInput { + """The label names for the board""" + labelNames: TrelloUpdateBoardLabelNamesArg + + """The permissions for the board""" + prefs: TrelloUpdateBoardPrefsArg + + """The id or name of the team the board should be moved to.""" + idOrganization: String + + """Whether the acting user is subscribed to the board""" + subscribed: Boolean + + """Whether the board is closed""" + closed: Boolean + + """A new description for the board, 0 to 16384 characters long.""" + desc: String + + """The name for the board""" + name: String + + """The id of the board to update""" + id: String! +} + +type TrelloUpdateBoardResponsePayload { + board: TrelloBoard! +} + +input TrelloCreateOrganizationMutationInput { + """A URL starting with `http://` or `https://`.""" + website: String + + """ + A string with a length of at least 3. Only lowercase letters, underscores, and numbers are allowed. Must be unique. + """ + name: String + + """The description for the team.""" + desc: String + + """""" + displayName: String! +} + +type TrelloCreateOrganizationResponsePayload { + organization: TrelloOrganization! +} + +input TrelloCreateListMutationInput { + """ + Position of the list. `top`, `bottom`, or a positive floating point number. + """ + pos: String + + """id of the list to copy into the new list.""" + idListSource: String + + """The id of the board the list should be created on.""" + idBoard: String! + + """Name for the list""" + name: String! +} + +type TrelloCreateListResponsePayload { + list: TrelloList! +} + +enum TrelloCreateLabelColor { + YELLOW + PURPLE + BLUE + RED + GREEN + ORANGE + BLACK + SKY + PINK + LIME + + """null means no color, and the label will not show on the front of cards""" + NULL +} + +input TrelloCreateLabelMutationInput { + """The id of the board to create the label on.""" + idBoard: String! + + """The color for the label""" + color: TrelloCreateLabelColor! + + """Name for the label""" + name: String! +} + +type TrelloCreateLabelResponsePayload { + label: TrelloLabel! +} + +enum TrelloCreateCustomFieldType { + NUMBER + DATE + TEXT + CHECKBOX + LIST +} + +input TrelloCreateCustomFieldMutationInput { + """Whether this custom field should be shown on the front of cards""" + displayCardFront: Boolean + pos: String! + options: String + type: TrelloCreateCustomFieldType! + name: String! + + """ + The id of the model for which the Custom Field is being defined. This should always be the id of a board. + """ + idModel: String! +} + +type TrelloCreateCustomFieldResponsePayload { + customField: TrelloCustomFields! +} + +input TrelloCreateChecklistMutationInput { + """The id of a checklist to copy into the new checklist.""" + idChecklistSource: String + + """ + The position of the checklist on the card. One of: top, bottom, or a positive number. + """ + pos: String + + """The name of the checklist. Should be a string of length 1 to 16384.""" + name: String + + """The id of the card that the checklist should be added to.""" + idCard: String! +} + +type TrelloCreateChecklistResponsePayload { + checklist: TrelloChecklist! +} + +input TrelloCreateCardMutationInput { + """ + If using idCardSource you can specify which properties to copy over. `all` or a list of `attachments`, `checklists`, `comments`, `due`, `labels`, `members`, `stickers` + """ + keepFromSource: [String!] + + """The id of a card to copy into the new card""" + idCardSource: String + + """A URL starting with `http://` or `https://`""" + urlSource: String + + """List of label ids to add to the card""" + idLabels: [String!] + + """List of member ids that should be added to the card""" + idMembers: [String!] + + """The id of the list the card should be created in.""" + idList: String! + dueComplete: Boolean + + """A due date for the card""" + due: String + + """The position of the card: `top`, `bottom`, or a positive float""" + pos: String + + """The description for the card""" + desc: String + + """The name for the card""" + name: String +} + +type TrelloCreateCardResponsePayload { + card: TrelloCard! +} + +enum TrelloCreateBoardCardAging { + PIRATE + REGULAR +} + +enum TrelloCreateBoardInvitations { + ADMINS + MEMBERS +} + +enum TrelloCreateBoardComments { + DISABLED + MEMBERS + OBSERVERS + ORG + PUBLIC +} + +enum TrelloCreateBoardVoting { + DISABLED + MEMBERS + OBSERVERS + ORG + PUBLIC +} + +enum TrelloCreateBoardPermissionLevel { + ORG + PRIVATE + PUBLIC +} + +input TrelloCreateBoardPrefsArg { + """ + Determines the type of card aging that should take place on the board if card aging is enabled. One of: pirate, regular. + """ + cardAging: TrelloCreateBoardCardAging + + """ + The id of a custom background or one of: `blue`, `orange`, `green`, `red`, `purple`, `pink`, `lime`, `sky`, `grey`. + """ + background: String + + """Determines whether card covers are enabled.""" + cardCovers: Boolean + + """ + Determines whether users can join the boards themselves or whether they have to be invited. + """ + selfJoin: Boolean + + """Determines what types of members can invite users to join""" + invitations: TrelloCreateBoardInvitations + + """Who can comment on cards on this board.""" + comments: TrelloCreateBoardComments + + """Who can vote on this board""" + voting: TrelloCreateBoardVoting + + """The permission level of the board""" + permissionLevel: TrelloCreateBoardPermissionLevel +} + +enum TrelloCreateBoardPowerUps { + ALL + CALENDAR + CARDAGING + RECAP + VOTING +} + +input TrelloCreateBoardMutationInput { + """The permissions for the board""" + prefs: TrelloCreateBoardPrefsArg + + """ + The Power-Ups that should be enabled on the new board. One of: all, calendar, cardAging, recap, voting. + """ + powerUps: TrelloCreateBoardPowerUps + + """To keep cards from the original board pass in the value `cards`""" + keepFromSource: String + + """The id of a board to copy into the new board.""" + idBoardSource: String + + """The id or name of the team the board should belong to.""" + idOrganization: String + + """A new description for the board, 0 to 16384 characters long.""" + desc: String + + """ + Determines whether to add the default set of lists to a board (To Do, Doing, Done). It is ignored if `idBoardSource` is provided. + """ + defaultLists: Boolean + + """Determines whether to use the default set of labels.""" + defaultLabels: Boolean + + """The name for the board""" + name: String! +} + +type TrelloCreateBoardResponsePayload { + board: TrelloBoard! +} + +"""The root for Trello Mutations""" +type TrelloMutation { + """Create a board""" + createBoard(input: TrelloCreateBoardMutationInput!): TrelloCreateBoardResponsePayload! + + """Create a card""" + createCard(input: TrelloCreateCardMutationInput!): TrelloCreateCardResponsePayload! + + """Create a checklist""" + createChecklist(input: TrelloCreateChecklistMutationInput!): TrelloCreateChecklistResponsePayload! + + """Create a customField""" + createCustomField(input: TrelloCreateCustomFieldMutationInput!): TrelloCreateCustomFieldResponsePayload! + + """Create a label""" + createLabel(input: TrelloCreateLabelMutationInput!): TrelloCreateLabelResponsePayload! + + """Create a list""" + createList(input: TrelloCreateListMutationInput!): TrelloCreateListResponsePayload! + + """Create a organization""" + createOrganization(input: TrelloCreateOrganizationMutationInput!): TrelloCreateOrganizationResponsePayload! + + """Update a board""" + updateBoard(input: TrelloUpdateBoardMutationInput!): TrelloUpdateBoardResponsePayload! + + """Update a card""" + updateCard(input: TrelloUpdateCardMutationInput!): TrelloUpdateCardResponsePayload! + + """Update a checklist""" + updateChecklist(input: TrelloUpdateChecklistMutationInput!): TrelloUpdateChecklistResponsePayload! + + """Update a customField""" + updateCustomField(input: TrelloUpdateCustomFieldMutationInput!): TrelloUpdateCustomFieldResponsePayload! + + """Update a label""" + updateLabel(input: TrelloUpdateLabelMutationInput!): TrelloUpdateLabelResponsePayload! + + """Update a list""" + updateList(input: TrelloUpdateListMutationInput!): TrelloUpdateListResponsePayload! + + """Update a organization""" + updateOrganization(input: TrelloUpdateOrganizationMutationInput!): TrelloUpdateOrganizationResponsePayload! + + """Archive a board.""" + archiveBoard(input: TrelloArchiveBoardMutationInput!): TrelloArchiveBoardResponsePayload! + + """Archive a card.""" + archiveCard(input: TrelloArchiveCardMutationInput!): TrelloArchiveCardResponsePayload! + + """Archive a list.""" + archiveList(input: TrelloArchiveListMutationInput!): TrelloArchiveListResponsePayload! + + """ + Delete a board. It is safer to archive lists, boards, and cards rather than delete them. + """ + deleteBoard(input: TrelloDeleteBoardMutationInput!): TrelloDeleteBoardResponsePayload! + + """ + Delete a card. It is safer to archive lists, boards, and cards rather than delete them. + """ + deleteCard(input: TrelloDeleteCardMutationInput!): TrelloDeleteCardResponsePayload! + + """ + Delete a checklist. It is safer to archive lists, boards, and cards rather than delete them. + """ + deleteChecklist(input: TrelloDeleteChecklistMutationInput!): TrelloDeleteChecklistResponsePayload! + + """ + Delete a customField. It is safer to archive lists, boards, and cards rather than delete them. + """ + deleteCustomField(input: TrelloDeleteCustomFieldMutationInput!): TrelloDeleteCustomFieldResponsePayload! + + """ + Delete a label. It is safer to archive lists, boards, and cards rather than delete them. + """ + deleteLabel(input: TrelloDeleteLabelMutationInput!): TrelloDeleteLabelResponsePayload! + + """ + Delete a list. It is safer to archive lists, boards, and cards rather than delete them. + """ + deleteList(input: TrelloDeleteListMutationInput!): TrelloDeleteListResponsePayload! + + """ + Delete a organization. It is safer to archive lists, boards, and cards rather than delete them. + """ + deleteOrganization(input: TrelloDeleteOrganizationMutationInput!): TrelloDeleteOrganizationResponsePayload! +} + +input StripeCancelSubscriptionData { + """ + Will generate a proration invoice item that credits remaining unused time until the subscription period end. + + """ + prorate: Boolean + + """ + Will generate a final invoice that invoices for any un-invoiced metered usage and new/pending proration invoice items. + + """ + invoiceNow: Boolean + subscriptionId: String! +} + +type StripeCancelSubscriptionResponsePayload { + subscription: StripeSubscription! +} + +""" +String indicating the reason for the refund. If set, possible values are duplicate, fraudulent, and requested_by_customer. Specifying fraudulent as the reason when you believe the charge to be fraudulent will help us improve our fraud detection algorithms. +""" +enum StripeRefundReasonEnum { + duplicate + fraudulent + requested_by_customer +} + +input StripeRefundChargeData { + reason: StripeRefundReasonEnum + amount: Int + chargeId: String! +} + +type StripeRefundChargeResponsePayload { + refund: StripeRefund! +} + +"""Namespace for all mutations for stripe""" +type StripeMutationNamespace { + refundCharge(data: StripeRefundChargeData!): StripeRefundChargeResponsePayload! + + """ + Cancels a customer’s subscription immediately. The customer will not be charged again for the subscription. + + Note, however, that any pending invoice items that you’ve created will still be charged for at the end of the period, unless manually deleted. If you’ve set the subscription to cancel at the end of the period, any pending prorations will also be left in place and collected at the end of the period. But if the subscription is set to cancel immediately, pending prorations will be removed. + + By default, upon subscription cancellation, Stripe will stop automatic collection of all finalized invoices for the customer. This is intended to prevent unexpected payment attempts after the customer has canceled a subscription. However, you can resume automatic collection of the invoices manually after subscription cancellation to have us proceed. Or, you could check for unpaid invoices before allowing the customer to cancel the subscription at all. + """ + cancelSubscription(data: StripeCancelSubscriptionData!): StripeCancelSubscriptionResponsePayload! +} + +input SpotifySetPlayerVolumeInput { + """The volume to set. Must be a value from 0 to 100 inclusive.""" + volumePercent: Int! + + """ + The id of the device this command is targeting. If not supplied, the user’s currently active device is the target + """ + deviceId: String +} + +type SpotifySetPlayerVolumeResponsePayload { + player: SpotifyPlayer +} + +input SpotifySeekPlayerToMsInput { + """ + The position in milliseconds to seek to. Must be a positive number. Passing in a position that is greater than the length of the track will cause the player to start playing the next song. + """ + positionMs: Int! + + """ + The id of the device this command is targeting. If not supplied, the user’s currently active device is the target + """ + deviceId: String +} + +type SpotifySeekPlayerToMSResponsePayload { + player: SpotifyPlayer +} + +input SpotifyResumePlayerInput { + """ + The id of the device this command is targeting. If not supplied, the user’s currently active device is the target + """ + deviceId: String +} + +type SpotifyResumePlayerResponsePayload { + player: SpotifyPlayer +} + +input SpotifyStartPlayerInput { + """ + Indicates from what position to start playback. Must be a positive number. Passing in a position that is greater than the length of the track will cause the player to start playing the next song. + """ + positionMs: Int + + """ + An array of the Spotify track Id's to play. For example, the Spotify URIs: `["spotify:track:4iV5W9uYEdYUVa79Axb7Rh", "spotify:track:1301WleyT98MSxVHPZCA6M"]` would have ids of `["4iV5W9uYEdYUVa79Axb7Rh", "1301WleyT98MSxVHPZCA6M"]` + """ + trackIds: [String!]! + + """ + The id of the device this command is targeting. If not supplied, the user’s currently active device is the target + """ + deviceId: String +} + +type SpotifyStartPlayerTrackResponsePayload { + player: SpotifyPlayer +} + +input SpotifyPausePlayerInput { + """ + The id of the device this command is targeting. If not supplied, the user’s currently active device is the target + """ + deviceId: String +} + +type SpotifyPausePlayerResponsePayload { + player: SpotifyPlayer +} + +input SpotifySkipPreviousTrackInput { + """ + The id of the device this command is targeting. If not supplied, the user’s currently active device is the target + """ + deviceId: String +} + +type SpotifySkipPreviousTrackResponsePayload { + player: SpotifyPlayer +} + +input SpotifySkipNextTrackInput { + """ + The id of the device this command is targeting. If not supplied, the user’s currently active device is the target + """ + deviceId: String +} + +type SpotifySkipNextTrackResponsePayload { + player: SpotifyPlayer +} + +"""Namespace for all mutations for Spotify""" +type SpotifyMutationNamespace { + skipNextTrack(input: SpotifySkipNextTrackInput): SpotifySkipNextTrackResponsePayload + skipPreviousTrack(input: SpotifySkipPreviousTrackInput): SpotifySkipPreviousTrackResponsePayload + pausePlayer(input: SpotifyPausePlayerInput): SpotifyPausePlayerResponsePayload + playTrack(input: SpotifyStartPlayerInput!): SpotifyStartPlayerTrackResponsePayload + resumePlayer(input: SpotifyResumePlayerInput): SpotifyResumePlayerResponsePayload + seekPlayerToMs(input: SpotifySeekPlayerToMsInput!): SpotifySeekPlayerToMSResponsePayload + setPlayerVolume(input: SpotifySetPlayerVolumeInput!): SpotifySetPlayerVolumeResponsePayload +} + +input SlackChatUpdateInputArg { + """The timestamp of the original message you wish to update""" + ts: String! + + """Change how messages are treated. Defaults to NONE.""" + parse: String + + """Find and link channel names and usernames.""" + linkNames: Boolean + + """List of structured attachments.""" + attachments: [SlackPostMessageAttachmentArg!] + + """ + Pass true to post the message as the authed user, instead of as a bot. Defaults to false. + """ + asUser: Boolean + + """ + + Text of the message to send. See below for an explanation of formatting. This field is usually required, unless you're providing only attachments instead. Provide no more than 40,000 characters or risk truncation. + + Messages are formatted as described in the [formatting spec](https://api.slack.com/docs/message-formatting). You can specify values for parse and linkNames to change formatting behavior. + + """ + text: String + + """ + The id (e.g. `"C9F8STAP8"`, not `"#general"`) of the channel containing the message to be updated. + """ + channelId: String! +} + +input SlackMessageAttachmentFieldArg { + """ + An optional flag indicating whether the value is short enough to be displayed side-by-side with other values. + """ + short: Boolean + + """ + The text value of the field. It may contain [standard message markup](https://api.slack.com/docs/message-formatting) and must be escaped as normal. May be multi-line. + """ + value: String + + """ + Shown as a bold heading above the value text. It cannot contain markup and will be escaped for you. + """ + title: String +} + +input SlackPostMessageAttachmentArg { + """ + Does your attachment relate to something happening at a specific time? + + By providing the ts field with an integer value in "epoch time", the attachment will display an additional timestamp value as part of the attachment's footer. + + Use ts when referencing articles or happenings. Your message's timestamp will be displayed in varying ways, depending on how far in the past or future it is, relative to the present. Form factors, like mobile versus desktop may also transform its rendered appearance. + + Example: Providing 123456789 would result in a rendered timestamp of Nov 29th, 1973. If it were currently 1973, the year might be trimmed off. If it were only a few days ago, we might display also display the time of day, like 9:33pm. + """ + ts: Int + + """ + To render a small icon beside your footer text, provide a publicly accessible URL string in the footer_icon field. You must also provide a footer for the field to be recognized. + + We'll render what you provide at 16px by 16px. It's best to use an image that is similarly sized. + """ + footerIcon: String + + """ + Add some brief text to help contextualize and identify an attachment. Limited to 300 characters, and may be truncated further when displayed to users in environments with limited screen real estate. + """ + footer: String + + """ + A valid URL to an image file that will be displayed as a thumbnail on the right side of a message attachment. We currently support the following formats: GIF, JPEG, PNG, and BMP. + + The thumbnail's longest dimension will be scaled down to 75px while maintaining the aspect ratio of the image. The filesize of the image must also be less than 500 KB. + + For best results, please use images that are already 75px by 75px. + """ + thumbUrl: String + + """ + A valid URL to an image file that will be displayed inside a message attachment. We currently support the following formats: GIF, JPEG, PNG, and BMP. + + Large images will be resized to a maximum width of 360px or a maximum height of 500px, while still maintaining the original aspect ratio. + """ + imageUrl: String + + """Fields get displayed in a table-like way.""" + fields: [SlackMessageAttachmentFieldArg!] + + """ + This is the main text in a message attachment, and can contain standard message markup. The content will automatically collapse if it contains 700+ characters or 5+ linebreaks, and will display a "Show more..." link to expand the content. Links posted in the text field will not unfurl. + """ + text: String + + """By passing a valid URL, the title text will be hyperlinked""" + titleLink: String + + """ + The title is displayed as larger, bold text near the top of a message attachment. + """ + title: String + + """ + A valid URL that displays a small 16x16px image to the left of the author_name text. Will only work if authorName is present. + """ + authorIcon: String + + """ + A valid URL that will hyperlink the authorName text. Will only work if authorName is present. + """ + authorLink: String + + """Small text used to display the author's name.""" + authorName: String + + """This is optional text that appears above the message attachment block.""" + pretext: String + + """ + Like traffic signals, color-coding messages can quickly communicate intent and help separate them from the flow of other messages in the timeline. + + An optional value that can either be one of good, warning, danger, or any hex color code (eg. #439FE0). This value is used to color the border along the left side of the message attachment. + """ + color: String + + """ + A plain-text summary of the attachment. This text will be used in clients that don't show formatted text (eg. IRC, mobile notifications) and should not contain any markup. + """ + fallback: String +} + +input SlackPostMessageDataArg { + """ + Set your bot's user name. Must be used in conjunction with as_user set to false, otherwise ignored. + """ + username: String + + """Pass false to disable unfurling of media content.""" + unfurlMedia: Boolean + + """Pass true to enable unfurling of primarily text-based content.""" + unfurlLinks: Boolean + + """ + Provide another message's ts value to make this message a reply. Avoid using a reply's ts value; use its parent instead. + """ + threadTs: String + + """ + Used in conjunction with threadTs and indicates whether reply should be made visible to everyone in the channel or conversation. Defaults to false. + """ + replyBroadcast: Boolean + + """Change how messages are treated. Defaults to NONE.""" + parse: String + + """Disable Slack markup parsing by setting to false. Enabled by default.""" + markdown: Boolean + + """Find and link channel names and usernames.""" + linkNames: Boolean + + """ + URL to an image to use as the icon for this message. Must be used in conjunction with asUser set to false, otherwise ignored. + """ + iconUrl: String + + """ + Emoji to use as the icon for this message. Overrides iconUrl. Must be used in conjunction with asUser set to false, otherwise ignored. + + Example: `:chart_with_upwards_trend:` + """ + iconEmoji: String + + """List of structured attachments.""" + attachments: [SlackPostMessageAttachmentArg!] + + """ + Pass true to post the message as the authed user, instead of as a bot. Defaults to false. + """ + asUser: Boolean + + """ + + Text of the message to send. See below for an explanation of formatting. This field is usually required, unless you're providing only attachments instead. Provide no more than 40,000 characters or risk truncation. + + Messages are formatted as described in the [formatting spec](https://api.slack.com/docs/message-formatting). You can specify values for parse and linkNames to change formatting behavior. + + """ + text: String + + """ + Channel, private group, or IM channel to send message to. Can be an encoded ID, or a name. You must specify a public channel, private channel, or an IM channel with the channel argument. Each one behaves slightly differently based on the authenticated user's permissions and additional arguments: + + ## Post to a public channel + You can either pass the channel's name (#general) or encoded ID (C024BE91L), and the message will be posted to that channel. The channel's ID can be retrieved through the channels.list API method. + + ## Post to a private group + As long as the authenticated user is a member of the private group, you can either pass the group's name (secret-group) or encoded ID (G012AC86C), and the message will be posted to that group. The private group's ID can be retrieved through the groups.list API method. + + ## Post to an IM channel + Posting to an IM channel is a little more complex depending on the value of asUser. + + If asUser is false: + Pass the IM channel's ID (D023BB3L2) as the value of channel to post to that IM channel as the bot. The IM channel's ID can be retrieved through the im.list API method. + If asUser is true: + Pass the IM channel's ID (D023BB3L2) as the value of channel to post to that IM channel as the authenticated user. The IM channel's ID can be retrieved through the im.list API method. + To send a direct message to the user owning the token used in the request, provide the channel field with the a conversation/IM ID value found in a method like im.list. + + + """ + channel: String! +} + +"""Slack Message""" +type SlackMessage { + text: String + username: String + botId: String + type: String + subType: String + ts: String +} + +type SlackPostMessageResponsePayload { + ok: Boolean + channel: String + ts: String + + """Message that was sent to the channel""" + message: SlackMessage +} + +"""Namespace for all mutations for Slack""" +type SlackMutationNamespace { + postMessage(data: SlackPostMessageDataArg!): SlackPostMessageResponsePayload! + updateChatMessage(input: SlackChatUpdateInputArg!): SlackPostMessageResponsePayload! +} + +""" +Make a REST API call to the Salesforce API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type SalesforcePassthroughMutation { + """ + Make a POST request to the Salesforce API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + post( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PUT request to the Salesforce API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + put( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PATCH request to the Salesforce API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + patch( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a DELETE request to the Salesforce API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + delete( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +input SalesforceDeleteAuraDefinitionBundleInput { + """The id of the AuraDefinitionBundle to delete.""" + id: String! +} + +type SalesforceDeleteAuraDefinitionBundlePayload { + """The id of the AuraDefinitionBundle deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteApexTestRunResultInput { + """The id of the ApexTestRunResult to delete.""" + id: String! +} + +type SalesforceDeleteApexTestRunResultPayload { + """The id of the ApexTestRunResult deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteTopicAssignmentInput { + """The id of the TopicAssignment to delete.""" + id: String! +} + +type SalesforceDeleteTopicAssignmentPayload { + """The id of the TopicAssignment deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteLightningComponentBundleInput { + """The id of the LightningComponentBundle to delete.""" + id: String! +} + +type SalesforceDeleteLightningComponentBundlePayload { + """The id of the LightningComponentBundle deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteLeadFeedInput { + """The id of the LeadFeed to delete.""" + id: String! +} + +type SalesforceDeleteLeadFeedPayload { + """The id of the LeadFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteScontrolInput { + """The id of the Scontrol to delete.""" + id: String! +} + +type SalesforceDeleteScontrolPayload { + """The id of the Scontrol deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteApexLogInput { + """The id of the ApexLog to delete.""" + id: String! +} + +type SalesforceDeleteApexLogPayload { + """The id of the ApexLog deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCollaborationGroupRecordInput { + """The id of the CollaborationGroupRecord to delete.""" + id: String! +} + +type SalesforceDeleteCollaborationGroupRecordPayload { + """The id of the CollaborationGroupRecord deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteEmailMessageInput { + """The id of the EmailMessage to delete.""" + id: String! +} + +type SalesforceDeleteEmailMessagePayload { + """The id of the EmailMessage deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteOrderItemInput { + """The id of the OrderItem to delete.""" + id: String! +} + +type SalesforceDeleteOrderItemPayload { + """The id of the OrderItem deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserListViewCriterionInput { + """The id of the UserListViewCriterion to delete.""" + id: String! +} + +type SalesforceDeleteUserListViewCriterionPayload { + """The id of the UserListViewCriterion deleted by the mutation.""" + id: String! +} + +input SalesforceDeletePermissionSetAssignmentInput { + """The id of the PermissionSetAssignment to delete.""" + id: String! +} + +type SalesforceDeletePermissionSetAssignmentPayload { + """The id of the PermissionSetAssignment deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteDuplicateRecordItemInput { + """The id of the DuplicateRecordItem to delete.""" + id: String! +} + +type SalesforceDeleteDuplicateRecordItemPayload { + """The id of the DuplicateRecordItem deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserProvisioningConfigInput { + """The id of the UserProvisioningConfig to delete.""" + id: String! +} + +type SalesforceDeleteUserProvisioningConfigPayload { + """The id of the UserProvisioningConfig deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteTaskInput { + """The id of the Task to delete.""" + id: String! +} + +type SalesforceDeleteTaskPayload { + """The id of the Task deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserFeedInput { + """The id of the UserFeed to delete.""" + id: String! +} + +type SalesforceDeleteUserFeedPayload { + """The id of the UserFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentVersionCommentInput { + """The id of the ContentVersionComment to delete.""" + id: String! +} + +type SalesforceDeleteContentVersionCommentPayload { + """The id of the ContentVersionComment deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteStreamingChannelInput { + """The id of the StreamingChannel to delete.""" + id: String! +} + +type SalesforceDeleteStreamingChannelPayload { + """The id of the StreamingChannel deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteFieldPermissionsInput { + """The id of the FieldPermissions to delete.""" + id: String! +} + +type SalesforceDeleteFieldPermissionsPayload { + """The id of the FieldPermissions deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteFeedLikeInput { + """The id of the FeedLike to delete.""" + id: String! +} + +type SalesforceDeleteFeedLikePayload { + """The id of the FeedLike deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteMacroInput { + """The id of the Macro to delete.""" + id: String! +} + +type SalesforceDeleteMacroPayload { + """The id of the Macro deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteEmailServicesAddressInput { + """The id of the EmailServicesAddress to delete.""" + id: String! +} + +type SalesforceDeleteEmailServicesAddressPayload { + """The id of the EmailServicesAddress deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteHolidayInput { + """The id of the Holiday to delete.""" + id: String! +} + +type SalesforceDeleteHolidayPayload { + """The id of the Holiday deleted by the mutation.""" + id: String! +} + +input SalesforceDeletePushTopicInput { + """The id of the PushTopic to delete.""" + id: String! +} + +type SalesforceDeletePushTopicPayload { + """The id of the PushTopic deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteTransactionSecurityPolicyInput { + """The id of the TransactionSecurityPolicy to delete.""" + id: String! +} + +type SalesforceDeleteTransactionSecurityPolicyPayload { + """The id of the TransactionSecurityPolicy deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserProvisioningLogInput { + """The id of the UserProvisioningLog to delete.""" + id: String! +} + +type SalesforceDeleteUserProvisioningLogPayload { + """The id of the UserProvisioningLog deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteDandBCompanyInput { + """The id of the DandBCompany to delete.""" + id: String! +} + +type SalesforceDeleteDandBCompanyPayload { + """The id of the DandBCompany deleted by the mutation.""" + id: String! +} + +input SalesforceDeletePlatformCachePartitionTypeInput { + """The id of the PlatformCachePartitionType to delete.""" + id: String! +} + +type SalesforceDeletePlatformCachePartitionTypePayload { + """The id of the PlatformCachePartitionType deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentWorkspaceDocInput { + """The id of the ContentWorkspaceDoc to delete.""" + id: String! +} + +type SalesforceDeleteContentWorkspaceDocPayload { + """The id of the ContentWorkspaceDoc deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteGroupInput { + """The id of the Group to delete.""" + id: String! +} + +type SalesforceDeleteGroupPayload { + """The id of the Group deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteOpportunityFeedInput { + """The id of the OpportunityFeed to delete.""" + id: String! +} + +type SalesforceDeleteOpportunityFeedPayload { + """The id of the OpportunityFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteDocumentInput { + """The id of the Document to delete.""" + id: String! +} + +type SalesforceDeleteDocumentPayload { + """The id of the Document deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteSetupEntityAccessInput { + """The id of the SetupEntityAccess to delete.""" + id: String! +} + +type SalesforceDeleteSetupEntityAccessPayload { + """The id of the SetupEntityAccess deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteDuplicateRecordSetInput { + """The id of the DuplicateRecordSet to delete.""" + id: String! +} + +type SalesforceDeleteDuplicateRecordSetPayload { + """The id of the DuplicateRecordSet deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContactFeedInput { + """The id of the ContactFeed to delete.""" + id: String! +} + +type SalesforceDeleteContactFeedPayload { + """The id of the ContactFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteProduct2FeedInput { + """The id of the Product2Feed to delete.""" + id: String! +} + +type SalesforceDeleteProduct2FeedPayload { + """The id of the Product2Feed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteQuickTextInput { + """The id of the QuickText to delete.""" + id: String! +} + +type SalesforceDeleteQuickTextPayload { + """The id of the QuickText deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCorsWhitelistEntryInput { + """The id of the CorsWhitelistEntry to delete.""" + id: String! +} + +type SalesforceDeleteCorsWhitelistEntryPayload { + """The id of the CorsWhitelistEntry deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteChatterExtensionInput { + """The id of the ChatterExtension to delete.""" + id: String! +} + +type SalesforceDeleteChatterExtensionPayload { + """The id of the ChatterExtension deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentDocumentLinkInput { + """The id of the ContentDocumentLink to delete.""" + id: String! +} + +type SalesforceDeleteContentDocumentLinkPayload { + """The id of the ContentDocumentLink deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteOpportunityCompetitorInput { + """The id of the OpportunityCompetitor to delete.""" + id: String! +} + +type SalesforceDeleteOpportunityCompetitorPayload { + """The id of the OpportunityCompetitor deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteIdeaCommentInput { + """The id of the IdeaComment to delete.""" + id: String! +} + +type SalesforceDeleteIdeaCommentPayload { + """The id of the IdeaComment deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCaseTeamTemplateRecordInput { + """The id of the CaseTeamTemplateRecord to delete.""" + id: String! +} + +type SalesforceDeleteCaseTeamTemplateRecordPayload { + """The id of the CaseTeamTemplateRecord deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteGroupMemberInput { + """The id of the GroupMember to delete.""" + id: String! +} + +type SalesforceDeleteGroupMemberPayload { + """The id of the GroupMember deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCaseTeamTemplateMemberInput { + """The id of the CaseTeamTemplateMember to delete.""" + id: String! +} + +type SalesforceDeleteCaseTeamTemplateMemberPayload { + """The id of the CaseTeamTemplateMember deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteApexTestResultLimitsInput { + """The id of the ApexTestResultLimits to delete.""" + id: String! +} + +type SalesforceDeleteApexTestResultLimitsPayload { + """The id of the ApexTestResultLimits deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCaseTeamTemplateInput { + """The id of the CaseTeamTemplate to delete.""" + id: String! +} + +type SalesforceDeleteCaseTeamTemplatePayload { + """The id of the CaseTeamTemplate deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteObjectPermissionsInput { + """The id of the ObjectPermissions to delete.""" + id: String! +} + +type SalesforceDeleteObjectPermissionsPayload { + """The id of the ObjectPermissions deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteListViewChartInput { + """The id of the ListViewChart to delete.""" + id: String! +} + +type SalesforceDeleteListViewChartPayload { + """The id of the ListViewChart deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteOrderItemFeedInput { + """The id of the OrderItemFeed to delete.""" + id: String! +} + +type SalesforceDeleteOrderItemFeedPayload { + """The id of the OrderItemFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserProvMockTargetInput { + """The id of the UserProvMockTarget to delete.""" + id: String! +} + +type SalesforceDeleteUserProvMockTargetPayload { + """The id of the UserProvMockTarget deleted by the mutation.""" + id: String! +} + +input SalesforceDeletePricebook2Input { + """The id of the Pricebook2 to delete.""" + id: String! +} + +type SalesforceDeletePricebook2Payload { + """The id of the Pricebook2 deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteEmailDomainKeyInput { + """The id of the EmailDomainKey to delete.""" + id: String! +} + +type SalesforceDeleteEmailDomainKeyPayload { + """The id of the EmailDomainKey deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteLoginIpInput { + """The id of the LoginIp to delete.""" + id: String! +} + +type SalesforceDeleteLoginIpPayload { + """The id of the LoginIp deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteFeedCommentInput { + """The id of the FeedComment to delete.""" + id: String! +} + +type SalesforceDeleteFeedCommentPayload { + """The id of the FeedComment deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteLeadInput { + """The id of the Lead to delete.""" + id: String! +} + +type SalesforceDeleteLeadPayload { + """The id of the Lead deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteWebLinkInput { + """The id of the WebLink to delete.""" + id: String! +} + +type SalesforceDeleteWebLinkPayload { + """The id of the WebLink deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteEventRelationInput { + """The id of the EventRelation to delete.""" + id: String! +} + +type SalesforceDeleteEventRelationPayload { + """The id of the EventRelation deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteSolutionFeedInput { + """The id of the SolutionFeed to delete.""" + id: String! +} + +type SalesforceDeleteSolutionFeedPayload { + """The id of the SolutionFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteStaticResourceInput { + """The id of the StaticResource to delete.""" + id: String! +} + +type SalesforceDeleteStaticResourcePayload { + """The id of the StaticResource deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteFlowInterviewInput { + """The id of the FlowInterview to delete.""" + id: String! +} + +type SalesforceDeleteFlowInterviewPayload { + """The id of the FlowInterview deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteTodayGoalShareInput { + """The id of the TodayGoalShare to delete.""" + id: String! +} + +type SalesforceDeleteTodayGoalSharePayload { + """The id of the TodayGoalShare deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentFolderInput { + """The id of the ContentFolder to delete.""" + id: String! +} + +type SalesforceDeleteContentFolderPayload { + """The id of the ContentFolder deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentDistributionInput { + """The id of the ContentDistribution to delete.""" + id: String! +} + +type SalesforceDeleteContentDistributionPayload { + """The id of the ContentDistribution deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCategoryDataInput { + """The id of the CategoryData to delete.""" + id: String! +} + +type SalesforceDeleteCategoryDataPayload { + """The id of the CategoryData deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteListEmailShareInput { + """The id of the ListEmailShare to delete.""" + id: String! +} + +type SalesforceDeleteListEmailSharePayload { + """The id of the ListEmailShare deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCampaignFeedInput { + """The id of the CampaignFeed to delete.""" + id: String! +} + +type SalesforceDeleteCampaignFeedPayload { + """The id of the CampaignFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteChatterExtensionConfigInput { + """The id of the ChatterExtensionConfig to delete.""" + id: String! +} + +type SalesforceDeleteChatterExtensionConfigPayload { + """The id of the ChatterExtensionConfig deleted by the mutation.""" + id: String! +} + +input SalesforceDeletePricebookEntryInput { + """The id of the PricebookEntry to delete.""" + id: String! +} + +type SalesforceDeletePricebookEntryPayload { + """The id of the PricebookEntry deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteFeedAttachmentInput { + """The id of the FeedAttachment to delete.""" + id: String! +} + +type SalesforceDeleteFeedAttachmentPayload { + """The id of the FeedAttachment deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentWorkspaceSubscriptionInput { + """The id of the ContentWorkspaceSubscription to delete.""" + id: String! +} + +type SalesforceDeleteContentWorkspaceSubscriptionPayload { + """The id of the ContentWorkspaceSubscription deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteTopicFeedInput { + """The id of the TopicFeed to delete.""" + id: String! +} + +type SalesforceDeleteTopicFeedPayload { + """The id of the TopicFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteListEmailInput { + """The id of the ListEmail to delete.""" + id: String! +} + +type SalesforceDeleteListEmailPayload { + """The id of the ListEmail deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAccountContactRoleInput { + """The id of the AccountContactRole to delete.""" + id: String! +} + +type SalesforceDeleteAccountContactRolePayload { + """The id of the AccountContactRole deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteClientBrowserInput { + """The id of the ClientBrowser to delete.""" + id: String! +} + +type SalesforceDeleteClientBrowserPayload { + """The id of the ClientBrowser deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAssetFeedInput { + """The id of the AssetFeed to delete.""" + id: String! +} + +type SalesforceDeleteAssetFeedPayload { + """The id of the AssetFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCaseFeedInput { + """The id of the CaseFeed to delete.""" + id: String! +} + +type SalesforceDeleteCaseFeedPayload { + """The id of the CaseFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserPackageLicenseInput { + """The id of the UserPackageLicense to delete.""" + id: String! +} + +type SalesforceDeleteUserPackageLicensePayload { + """The id of the UserPackageLicense deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserProvisioningRequestInput { + """The id of the UserProvisioningRequest to delete.""" + id: String! +} + +type SalesforceDeleteUserProvisioningRequestPayload { + """The id of the UserProvisioningRequest deleted by the mutation.""" + id: String! +} + +input SalesforceDeletePermissionSetLicenseAssignInput { + """The id of the PermissionSetLicenseAssign to delete.""" + id: String! +} + +type SalesforceDeletePermissionSetLicenseAssignPayload { + """The id of the PermissionSetLicenseAssign deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserShareInput { + """The id of the UserShare to delete.""" + id: String! +} + +type SalesforceDeleteUserSharePayload { + """The id of the UserShare deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCampaignMemberInput { + """The id of the CampaignMember to delete.""" + id: String! +} + +type SalesforceDeleteCampaignMemberPayload { + """The id of the CampaignMember deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAssetRelationshipFeedInput { + """The id of the AssetRelationshipFeed to delete.""" + id: String! +} + +type SalesforceDeleteAssetRelationshipFeedPayload { + """The id of the AssetRelationshipFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeletePermissionSetInput { + """The id of the PermissionSet to delete.""" + id: String! +} + +type SalesforceDeletePermissionSetPayload { + """The id of the PermissionSet deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteActionLinkTemplateInput { + """The id of the ActionLinkTemplate to delete.""" + id: String! +} + +type SalesforceDeleteActionLinkTemplatePayload { + """The id of the ActionLinkTemplate deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteProfileInput { + """The id of the Profile to delete.""" + id: String! +} + +type SalesforceDeleteProfilePayload { + """The id of the Profile deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAccountInput { + """The id of the Account to delete.""" + id: String! +} + +type SalesforceDeleteAccountPayload { + """The id of the Account deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteEmailCaptureInput { + """The id of the EmailCapture to delete.""" + id: String! +} + +type SalesforceDeleteEmailCapturePayload { + """The id of the EmailCapture deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCaseSolutionInput { + """The id of the CaseSolution to delete.""" + id: String! +} + +type SalesforceDeleteCaseSolutionPayload { + """The id of the CaseSolution deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteOpportunityContactRoleInput { + """The id of the OpportunityContactRole to delete.""" + id: String! +} + +type SalesforceDeleteOpportunityContactRolePayload { + """The id of the OpportunityContactRole deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserRoleInput { + """The id of the UserRole to delete.""" + id: String! +} + +type SalesforceDeleteUserRolePayload { + """The id of the UserRole deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteEventFeedInput { + """The id of the EventFeed to delete.""" + id: String! +} + +type SalesforceDeleteEventFeedPayload { + """The id of the EventFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAssetRelationshipInput { + """The id of the AssetRelationship to delete.""" + id: String! +} + +type SalesforceDeleteAssetRelationshipPayload { + """The id of the AssetRelationship deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCollaborationGroupMemberInput { + """The id of the CollaborationGroupMember to delete.""" + id: String! +} + +type SalesforceDeleteCollaborationGroupMemberPayload { + """The id of the CollaborationGroupMember deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserPreferenceInput { + """The id of the UserPreference to delete.""" + id: String! +} + +type SalesforceDeleteUserPreferencePayload { + """The id of the UserPreference deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCollaborationGroupFeedInput { + """The id of the CollaborationGroupFeed to delete.""" + id: String! +} + +type SalesforceDeleteCollaborationGroupFeedPayload { + """The id of the CollaborationGroupFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteMailmergeTemplateInput { + """The id of the MailmergeTemplate to delete.""" + id: String! +} + +type SalesforceDeleteMailmergeTemplatePayload { + """The id of the MailmergeTemplate deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCaseTeamMemberInput { + """The id of the CaseTeamMember to delete.""" + id: String! +} + +type SalesforceDeleteCaseTeamMemberPayload { + """The id of the CaseTeamMember deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentFolderMemberInput { + """The id of the ContentFolderMember to delete.""" + id: String! +} + +type SalesforceDeleteContentFolderMemberPayload { + """The id of the ContentFolderMember deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentWorkspaceInput { + """The id of the ContentWorkspace to delete.""" + id: String! +} + +type SalesforceDeleteContentWorkspacePayload { + """The id of the ContentWorkspace deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentDocumentFeedInput { + """The id of the ContentDocumentFeed to delete.""" + id: String! +} + +type SalesforceDeleteContentDocumentFeedPayload { + """The id of the ContentDocumentFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteQueueSobjectInput { + """The id of the QueueSobject to delete.""" + id: String! +} + +type SalesforceDeleteQueueSobjectPayload { + """The id of the QueueSobject deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentWorkspaceMemberInput { + """The id of the ContentWorkspaceMember to delete.""" + id: String! +} + +type SalesforceDeleteContentWorkspaceMemberPayload { + """The id of the ContentWorkspaceMember deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAuthSessionInput { + """The id of the AuthSession to delete.""" + id: String! +} + +type SalesforceDeleteAuthSessionPayload { + """The id of the AuthSession deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteApexTestSuiteInput { + """The id of the ApexTestSuite to delete.""" + id: String! +} + +type SalesforceDeleteApexTestSuitePayload { + """The id of the ApexTestSuite deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteTopicInput { + """The id of the Topic to delete.""" + id: String! +} + +type SalesforceDeleteTopicPayload { + """The id of the Topic deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentVersionRatingInput { + """The id of the ContentVersionRating to delete.""" + id: String! +} + +type SalesforceDeleteContentVersionRatingPayload { + """The id of the ContentVersionRating deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteEmailTemplateInput { + """The id of the EmailTemplate to delete.""" + id: String! +} + +type SalesforceDeleteEmailTemplatePayload { + """The id of the EmailTemplate deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentDocumentInput { + """The id of the ContentDocument to delete.""" + id: String! +} + +type SalesforceDeleteContentDocumentPayload { + """The id of the ContentDocument deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContactInput { + """The id of the Contact to delete.""" + id: String! +} + +type SalesforceDeleteContactPayload { + """The id of the Contact deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAuraDefinitionInput { + """The id of the AuraDefinition to delete.""" + id: String! +} + +type SalesforceDeleteAuraDefinitionPayload { + """The id of the AuraDefinition deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteSecurityCustomBaselineInput { + """The id of the SecurityCustomBaseline to delete.""" + id: String! +} + +type SalesforceDeleteSecurityCustomBaselinePayload { + """The id of the SecurityCustomBaseline deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCampaignMemberStatusInput { + """The id of the CampaignMemberStatus to delete.""" + id: String! +} + +type SalesforceDeleteCampaignMemberStatusPayload { + """The id of the CampaignMemberStatus deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteEventInput { + """The id of the Event to delete.""" + id: String! +} + +type SalesforceDeleteEventPayload { + """The id of the Event deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteSearchPromotionRuleInput { + """The id of the SearchPromotionRule to delete.""" + id: String! +} + +type SalesforceDeleteSearchPromotionRulePayload { + """The id of the SearchPromotionRule deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteExternalDataUserAuthInput { + """The id of the ExternalDataUserAuth to delete.""" + id: String! +} + +type SalesforceDeleteExternalDataUserAuthPayload { + """The id of the ExternalDataUserAuth deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAnnouncementInput { + """The id of the Announcement to delete.""" + id: String! +} + +type SalesforceDeleteAnnouncementPayload { + """The id of the Announcement deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteTopicUserEventInput { + """The id of the TopicUserEvent to delete.""" + id: String! +} + +type SalesforceDeleteTopicUserEventPayload { + """The id of the TopicUserEvent deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserAppMenuCustomizationInput { + """The id of the UserAppMenuCustomization to delete.""" + id: String! +} + +type SalesforceDeleteUserAppMenuCustomizationPayload { + """The id of the UserAppMenuCustomization deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteTestSuiteMembershipInput { + """The id of the TestSuiteMembership to delete.""" + id: String! +} + +type SalesforceDeleteTestSuiteMembershipPayload { + """The id of the TestSuiteMembership deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCaseContactRoleInput { + """The id of the CaseContactRole to delete.""" + id: String! +} + +type SalesforceDeleteCaseContactRolePayload { + """The id of the CaseContactRole deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentNotificationInput { + """The id of the ContentNotification to delete.""" + id: String! +} + +type SalesforceDeleteContentNotificationPayload { + """The id of the ContentNotification deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentWorkspacePermissionInput { + """The id of the ContentWorkspacePermission to delete.""" + id: String! +} + +type SalesforceDeleteContentWorkspacePermissionPayload { + """The id of the ContentWorkspacePermission deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContractFeedInput { + """The id of the ContractFeed to delete.""" + id: String! +} + +type SalesforceDeleteContractFeedPayload { + """The id of the ContractFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteMacroInstructionInput { + """The id of the MacroInstruction to delete.""" + id: String! +} + +type SalesforceDeleteMacroInstructionPayload { + """The id of the MacroInstruction deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContractInput { + """The id of the Contract to delete.""" + id: String! +} + +type SalesforceDeleteContractPayload { + """The id of the Contract deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentTagSubscriptionInput { + """The id of the ContentTagSubscription to delete.""" + id: String! +} + +type SalesforceDeleteContentTagSubscriptionPayload { + """The id of the ContentTagSubscription deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCspTrustedSiteInput { + """The id of the CspTrustedSite to delete.""" + id: String! +} + +type SalesforceDeleteCspTrustedSitePayload { + """The id of the CspTrustedSite deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteEmailMessageRelationInput { + """The id of the EmailMessageRelation to delete.""" + id: String! +} + +type SalesforceDeleteEmailMessageRelationPayload { + """The id of the EmailMessageRelation deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteOrgWideEmailAddressInput { + """The id of the OrgWideEmailAddress to delete.""" + id: String! +} + +type SalesforceDeleteOrgWideEmailAddressPayload { + """The id of the OrgWideEmailAddress deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteEmailServicesFunctionInput { + """The id of the EmailServicesFunction to delete.""" + id: String! +} + +type SalesforceDeleteEmailServicesFunctionPayload { + """The id of the EmailServicesFunction deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteFeedSignalInput { + """The id of the FeedSignal to delete.""" + id: String! +} + +type SalesforceDeleteFeedSignalPayload { + """The id of the FeedSignal deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteProduct2Input { + """The id of the Product2 to delete.""" + id: String! +} + +type SalesforceDeleteProduct2Payload { + """The id of the Product2 deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteQuickTextShareInput { + """The id of the QuickTextShare to delete.""" + id: String! +} + +type SalesforceDeleteQuickTextSharePayload { + """The id of the QuickTextShare deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteFolderInput { + """The id of the Folder to delete.""" + id: String! +} + +type SalesforceDeleteFolderPayload { + """The id of the Folder deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteApexTestResultInput { + """The id of the ApexTestResult to delete.""" + id: String! +} + +type SalesforceDeleteApexTestResultPayload { + """The id of the ApexTestResult deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteOrgDeleteRequestShareInput { + """The id of the OrgDeleteRequestShare to delete.""" + id: String! +} + +type SalesforceDeleteOrgDeleteRequestSharePayload { + """The id of the OrgDeleteRequestShare deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteFlowInterviewShareInput { + """The id of the FlowInterviewShare to delete.""" + id: String! +} + +type SalesforceDeleteFlowInterviewSharePayload { + """The id of the FlowInterviewShare deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserProvAccountStagingInput { + """The id of the UserProvAccountStaging to delete.""" + id: String! +} + +type SalesforceDeleteUserProvAccountStagingPayload { + """The id of the UserProvAccountStaging deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteSolutionInput { + """The id of the Solution to delete.""" + id: String! +} + +type SalesforceDeleteSolutionPayload { + """The id of the Solution deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteVoteInput { + """The id of the Vote to delete.""" + id: String! +} + +type SalesforceDeleteVotePayload { + """The id of the Vote deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContractContactRoleInput { + """The id of the ContractContactRole to delete.""" + id: String! +} + +type SalesforceDeleteContractContactRolePayload { + """The id of the ContractContactRole deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteNoteInput { + """The id of the Note to delete.""" + id: String! +} + +type SalesforceDeleteNotePayload { + """The id of the Note deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteReportFeedInput { + """The id of the ReportFeed to delete.""" + id: String! +} + +type SalesforceDeleteReportFeedPayload { + """The id of the ReportFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteIdeaInput { + """The id of the Idea to delete.""" + id: String! +} + +type SalesforceDeleteIdeaPayload { + """The id of the Idea deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCollaborationGroupInput { + """The id of the CollaborationGroup to delete.""" + id: String! +} + +type SalesforceDeleteCollaborationGroupPayload { + """The id of the CollaborationGroup deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteOpportunityInput { + """The id of the Opportunity to delete.""" + id: String! +} + +type SalesforceDeleteOpportunityPayload { + """The id of the Opportunity deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentDocumentSubscriptionInput { + """The id of the ContentDocumentSubscription to delete.""" + id: String! +} + +type SalesforceDeleteContentDocumentSubscriptionPayload { + """The id of the ContentDocumentSubscription deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteListEmailRecipientSourceInput { + """The id of the ListEmailRecipientSource to delete.""" + id: String! +} + +type SalesforceDeleteListEmailRecipientSourcePayload { + """The id of the ListEmailRecipientSource deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteTodayGoalInput { + """The id of the TodayGoal to delete.""" + id: String! +} + +type SalesforceDeleteTodayGoalPayload { + """The id of the TodayGoal deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteTaskFeedInput { + """The id of the TaskFeed to delete.""" + id: String! +} + +type SalesforceDeleteTaskFeedPayload { + """The id of the TaskFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteOpportunityLineItemInput { + """The id of the OpportunityLineItem to delete.""" + id: String! +} + +type SalesforceDeleteOpportunityLineItemPayload { + """The id of the OpportunityLineItem deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteFlowRecordRelationInput { + """The id of the FlowRecordRelation to delete.""" + id: String! +} + +type SalesforceDeleteFlowRecordRelationPayload { + """The id of the FlowRecordRelation deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAdditionalNumberInput { + """The id of the AdditionalNumber to delete.""" + id: String! +} + +type SalesforceDeleteAdditionalNumberPayload { + """The id of the AdditionalNumber deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCollaborationInvitationInput { + """The id of the CollaborationInvitation to delete.""" + id: String! +} + +type SalesforceDeleteCollaborationInvitationPayload { + """The id of the CollaborationInvitation deleted by the mutation.""" + id: String! +} + +input SalesforceDeletePartnerInput { + """The id of the Partner to delete.""" + id: String! +} + +type SalesforceDeletePartnerPayload { + """The id of the Partner deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteEntitySubscriptionInput { + """The id of the EntitySubscription to delete.""" + id: String! +} + +type SalesforceDeleteEntitySubscriptionPayload { + """The id of the EntitySubscription deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCategoryNodeInput { + """The id of the CategoryNode to delete.""" + id: String! +} + +type SalesforceDeleteCategoryNodePayload { + """The id of the CategoryNode deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteApexEmailNotificationInput { + """The id of the ApexEmailNotification to delete.""" + id: String! +} + +type SalesforceDeleteApexEmailNotificationPayload { + """The id of the ApexEmailNotification deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserListViewInput { + """The id of the UserListView to delete.""" + id: String! +} + +type SalesforceDeleteUserListViewPayload { + """The id of the UserListView deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserProvAccountInput { + """The id of the UserProvAccount to delete.""" + id: String! +} + +type SalesforceDeleteUserProvAccountPayload { + """The id of the UserProvAccount deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteProcessInstanceWorkitemInput { + """The id of the ProcessInstanceWorkitem to delete.""" + id: String! +} + +type SalesforceDeleteProcessInstanceWorkitemPayload { + """The id of the ProcessInstanceWorkitem deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAssetInput { + """The id of the Asset to delete.""" + id: String! +} + +type SalesforceDeleteAssetPayload { + """The id of the Asset deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserProvisioningRequestShareInput { + """The id of the UserProvisioningRequestShare to delete.""" + id: String! +} + +type SalesforceDeleteUserProvisioningRequestSharePayload { + """The id of the UserProvisioningRequestShare deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteActionLinkGroupTemplateInput { + """The id of the ActionLinkGroupTemplate to delete.""" + id: String! +} + +type SalesforceDeleteActionLinkGroupTemplatePayload { + """The id of the ActionLinkGroupTemplate deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserAppInfoInput { + """The id of the UserAppInfo to delete.""" + id: String! +} + +type SalesforceDeleteUserAppInfoPayload { + """The id of the UserAppInfo deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAppMenuItemInput { + """The id of the AppMenuItem to delete.""" + id: String! +} + +type SalesforceDeleteAppMenuItemPayload { + """The id of the AppMenuItem deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteUserAppMenuCustomizationShareInput { + """The id of the UserAppMenuCustomizationShare to delete.""" + id: String! +} + +type SalesforceDeleteUserAppMenuCustomizationSharePayload { + """The id of the UserAppMenuCustomizationShare deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteDashboardComponentFeedInput { + """The id of the DashboardComponentFeed to delete.""" + id: String! +} + +type SalesforceDeleteDashboardComponentFeedPayload { + """The id of the DashboardComponentFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteFeedItemInput { + """The id of the FeedItem to delete.""" + id: String! +} + +type SalesforceDeleteFeedItemPayload { + """The id of the FeedItem deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteApexClassInput { + """The id of the ApexClass to delete.""" + id: String! +} + +type SalesforceDeleteApexClassPayload { + """The id of the ApexClass deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteDashboardFeedInput { + """The id of the DashboardFeed to delete.""" + id: String! +} + +type SalesforceDeleteDashboardFeedPayload { + """The id of the DashboardFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteSiteFeedInput { + """The id of the SiteFeed to delete.""" + id: String! +} + +type SalesforceDeleteSiteFeedPayload { + """The id of the SiteFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteApexTriggerInput { + """The id of the ApexTrigger to delete.""" + id: String! +} + +type SalesforceDeleteApexTriggerPayload { + """The id of the ApexTrigger deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCustomBrandAssetInput { + """The id of the CustomBrandAsset to delete.""" + id: String! +} + +type SalesforceDeleteCustomBrandAssetPayload { + """The id of the CustomBrandAsset deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAccountFeedInput { + """The id of the AccountFeed to delete.""" + id: String! +} + +type SalesforceDeleteAccountFeedPayload { + """The id of the AccountFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentAssetInput { + """The id of the ContentAsset to delete.""" + id: String! +} + +type SalesforceDeleteContentAssetPayload { + """The id of the ContentAsset deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteMacroShareInput { + """The id of the MacroShare to delete.""" + id: String! +} + +type SalesforceDeleteMacroSharePayload { + """The id of the MacroShare deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCollaborationGroupMemberRequestInput { + """The id of the CollaborationGroupMemberRequest to delete.""" + id: String! +} + +type SalesforceDeleteCollaborationGroupMemberRequestPayload { + """The id of the CollaborationGroupMemberRequest deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCampaignInput { + """The id of the Campaign to delete.""" + id: String! +} + +type SalesforceDeleteCampaignPayload { + """The id of the Campaign deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteOrderInput { + """The id of the Order to delete.""" + id: String! +} + +type SalesforceDeleteOrderPayload { + """The id of the Order deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteOrderFeedInput { + """The id of the OrderFeed to delete.""" + id: String! +} + +type SalesforceDeleteOrderFeedPayload { + """The id of the OrderFeed deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAttachmentInput { + """The id of the Attachment to delete.""" + id: String! +} + +type SalesforceDeleteAttachmentPayload { + """The id of the Attachment deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteApexComponentInput { + """The id of the ApexComponent to delete.""" + id: String! +} + +type SalesforceDeleteApexComponentPayload { + """The id of the ApexComponent deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteLightningComponentResourceInput { + """The id of the LightningComponentResource to delete.""" + id: String! +} + +type SalesforceDeleteLightningComponentResourcePayload { + """The id of the LightningComponentResource deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteApexPageInput { + """The id of the ApexPage to delete.""" + id: String! +} + +type SalesforceDeleteApexPagePayload { + """The id of the ApexPage deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCaseInput { + """The id of the Case to delete.""" + id: String! +} + +type SalesforceDeleteCasePayload { + """The id of the Case deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentUserSubscriptionInput { + """The id of the ContentUserSubscription to delete.""" + id: String! +} + +type SalesforceDeleteContentUserSubscriptionPayload { + """The id of the ContentUserSubscription deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteContentDistributionViewInput { + """The id of the ContentDistributionView to delete.""" + id: String! +} + +type SalesforceDeleteContentDistributionViewPayload { + """The id of the ContentDistributionView deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteBrandTemplateInput { + """The id of the BrandTemplate to delete.""" + id: String! +} + +type SalesforceDeleteBrandTemplatePayload { + """The id of the BrandTemplate deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteCaseCommentInput { + """The id of the CaseComment to delete.""" + id: String! +} + +type SalesforceDeleteCaseCommentPayload { + """The id of the CaseComment deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteStreamingChannelShareInput { + """The id of the StreamingChannelShare to delete.""" + id: String! +} + +type SalesforceDeleteStreamingChannelSharePayload { + """The id of the StreamingChannelShare deleted by the mutation.""" + id: String! +} + +input SalesforceDeletePlatformCachePartitionInput { + """The id of the PlatformCachePartition to delete.""" + id: String! +} + +type SalesforceDeletePlatformCachePartitionPayload { + """The id of the PlatformCachePartition deleted by the mutation.""" + id: String! +} + +input SalesforceDeleteAuthProviderInput { + """The id of the AuthProvider to delete.""" + id: String! +} + +type SalesforceDeleteAuthProviderPayload { + """The id of the AuthProvider deleted by the mutation.""" + id: String! +} + +input SalesforceAuraDefinitionBundlePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Description""" + description: String + + """Api Version""" + apiVersion: Float + + """Label""" + masterLabel: String + + """Master Language""" + language: String + + """Name""" + developerName: String +} + +input SalesforceUpdateAuraDefinitionBundleInput { + patch: SalesforceAuraDefinitionBundlePatch! + + """The id of the AuraDefinitionBundle to update.""" + id: String! +} + +type SalesforceUpdateAuraDefinitionBundlePayload { + """AuraDefinitionBundle updated by the mutation.""" + auraDefinitionBundle: SalesforceAuraDefinitionBundle! +} + +input SalesforceApexTestRunResultPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Number of methods failed in this test run""" + methodsFailed: Int + + """Number of methods completed in this test run""" + methodsCompleted: Int + + """Number of methods enqueued in this test run""" + methodsEnqueued: Int + + """Number of classes completed in this test run""" + classesCompleted: Int + + """Number of classes enqueued in this test run""" + classesEnqueued: Int + + """Status of the test run""" + status: String + + """Time(ms) actually spent running tests""" + testTime: Int + + """End time of the test run""" + endTime: String + + """Start time of the test run""" + startTime: String + + """Client that kicked off the test run""" + source: String + + """allTests""" + isAllTests: Boolean + + """Name of the job""" + jobName: String + + """User ID""" + userId: String + + """Apex Job ID""" + asyncApexJobId: String +} + +input SalesforceUpdateApexTestRunResultInput { + patch: SalesforceApexTestRunResultPatch! + + """The id of the ApexTestRunResult to update.""" + id: String! +} + +type SalesforceUpdateApexTestRunResultPayload { + """ApexTestRunResult updated by the mutation.""" + apexTestRunResult: SalesforceApexTestRunResult! +} + +input SalesforceLightningComponentBundlePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Available For""" + availableFor: String + + """IsExposed""" + isExposed: Boolean + + """Minimum Version""" + minVersion: Float + + """Api Version""" + apiVersion: Float + + """Label""" + masterLabel: String + + """Master Language""" + language: String + + """Name""" + developerName: String +} + +input SalesforceUpdateLightningComponentBundleInput { + patch: SalesforceLightningComponentBundlePatch! + + """The id of the LightningComponentBundle to update.""" + id: String! +} + +type SalesforceUpdateLightningComponentBundlePayload { + """LightningComponentBundle updated by the mutation.""" + lightningComponentBundle: SalesforceLightningComponentBundle! +} + +input SalesforceScontrolPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Prebuild In Page""" + supportsCaching: Boolean + + """Type""" + contentSource: String + + """Binary""" + binary: String + + """Filename""" + filename: String + + """HTML Body""" + htmlWrapper: String + + """Encoding""" + encodingKey: String + + """Description""" + description: String + + """S-Control Name""" + developerName: String + + """Label""" + name: String +} + +input SalesforceUpdateScontrolInput { + patch: SalesforceScontrolPatch! + + """The id of the Scontrol to update.""" + id: String! +} + +type SalesforceUpdateScontrolPayload { + """Scontrol updated by the mutation.""" + scontrol: SalesforceScontrol! +} + +input SalesforceEmailMessagePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Thread ID""" + threadIdentifier: String + + """Message ID""" + messageIdentifier: String + + """Message Date""" + messageDate: String + + """Status""" + status: String + + """BCC Address""" + bccAddress: String + + """CC Address""" + ccAddress: String + + """To Address""" + toAddress: String + + """From Address""" + fromAddress: String + + """From Name""" + fromName: String + + """Subject""" + subject: String + + """Headers""" + headers: String + + """HTML Body""" + htmlBody: String + + """Text Body""" + textBody: String +} + +input SalesforceUpdateEmailMessageInput { + patch: SalesforceEmailMessagePatch! + + """The id of the EmailMessage to update.""" + id: String! +} + +type SalesforceUpdateEmailMessagePayload { + """EmailMessage updated by the mutation.""" + emailMessage: SalesforceEmailMessage! +} + +input SalesforceOrderItemPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Line Description""" + description: String + + """End Date""" + endDate: String + + """Start Date""" + serviceDate: String + + """Unit Price""" + unitPrice: Float + + """Quantity""" + quantity: Float +} + +input SalesforceUpdateOrderItemInput { + patch: SalesforceOrderItemPatch! + + """The id of the OrderItem to update.""" + id: String! +} + +type SalesforceUpdateOrderItemPayload { + """OrderItem updated by the mutation.""" + orderItem: SalesforceOrderItem! +} + +input SalesforceUserListViewCriterionPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Value""" + value: String + + """Operation""" + operation: String + + """Column Name""" + columnName: String + + """Sort Order""" + sortOrder: Int +} + +input SalesforceUpdateUserListViewCriterionInput { + patch: SalesforceUserListViewCriterionPatch! + + """The id of the UserListViewCriterion to update.""" + id: String! +} + +type SalesforceUpdateUserListViewCriterionPayload { + """UserListViewCriterion updated by the mutation.""" + userListViewCriterion: SalesforceUserListViewCriterion! +} + +input SalesforceDuplicateRecordItemPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Record ID""" + recordId: String +} + +input SalesforceUpdateDuplicateRecordItemInput { + patch: SalesforceDuplicateRecordItemPatch! + + """The id of the DuplicateRecordItem to update.""" + id: String! +} + +type SalesforceUpdateDuplicateRecordItemPayload { + """DuplicateRecordItem updated by the mutation.""" + duplicateRecordItem: SalesforceDuplicateRecordItem! +} + +input SalesforceUserProvisioningConfigPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Recon Filter""" + reconFilter: String + + """Named Credential ID""" + namedCredentialId: String + + """Last Recon Date""" + lastReconDateTime: String + + """On Update Attributes""" + onUpdateAttributes: String + + """Enabled Operations""" + enabledOperations: String + + """User Account Mapping""" + userAccountMapping: String + + """Approval Required""" + approvalRequired: String + + """Enabled""" + enabled: Boolean + + """Notes""" + notes: String + + """Connected App ID""" + connectedAppId: String + + """Label""" + masterLabel: String + + """Master Language""" + language: String + + """Name""" + developerName: String +} + +input SalesforceUpdateUserProvisioningConfigInput { + patch: SalesforceUserProvisioningConfigPatch! + + """The id of the UserProvisioningConfig to update.""" + id: String! +} + +type SalesforceUpdateUserProvisioningConfigPayload { + """UserProvisioningConfig updated by the mutation.""" + userProvisioningConfig: SalesforceUserProvisioningConfig! +} + +input SalesforceTaskPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Repeat This Task""" + recurrenceRegeneratedType: String + + """Recurrence Month of Year""" + recurrenceMonthOfYear: String + + """Recurrence Instance""" + recurrenceInstance: String + + """Recurrence Day of Month""" + recurrenceDayOfMonth: Int + + """Recurrence Day of Week Mask""" + recurrenceDayOfWeekMask: Int + + """Recurrence Interval""" + recurrenceInterval: Int + + """Recurrence Type""" + recurrenceType: String + + """Recurrence Time Zone""" + recurrenceTimeZoneSidKey: String + + """Recurrence End""" + recurrenceEndDateOnly: String + + """Recurrence Start""" + recurrenceStartDateOnly: String + + """Reminder Set""" + isReminderSet: Boolean + + """Reminder Date/Time""" + reminderDateTime: String + + """Call Object Identifier""" + callObject: String + + """Call Result""" + callDisposition: String + + """Call Type""" + callType: String + + """Call Duration""" + callDurationInSeconds: Int + + """Description""" + description: String + + """Assigned To ID""" + ownerId: String + + """Priority""" + priority: String + + """Status""" + status: String + + """Due Date Only""" + activityDate: String + + """Subject""" + subject: String + + """Related To ID""" + whatId: String + + """Name ID""" + whoId: String +} + +input SalesforceUpdateTaskInput { + patch: SalesforceTaskPatch! + + """The id of the Task to update.""" + id: String! +} + +type SalesforceUpdateTaskPayload { + """Task updated by the mutation.""" + task: SalesforceTask! +} + +input SalesforceStreamingChannelPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Description""" + description: String + + """Streaming Channel Name""" + name: String + + """Owner ID""" + ownerId: String +} + +input SalesforceUpdateStreamingChannelInput { + patch: SalesforceStreamingChannelPatch! + + """The id of the StreamingChannel to update.""" + id: String! +} + +type SalesforceUpdateStreamingChannelPayload { + """StreamingChannel updated by the mutation.""" + streamingChannel: SalesforceStreamingChannel! +} + +input SalesforceApexTestQueueItemPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Status""" + status: String +} + +input SalesforceUpdateApexTestQueueItemInput { + patch: SalesforceApexTestQueueItemPatch! + + """The id of the ApexTestQueueItem to update.""" + id: String! +} + +type SalesforceUpdateApexTestQueueItemPayload { + """ApexTestQueueItem updated by the mutation.""" + apexTestQueueItem: SalesforceApexTestQueueItem! +} + +input SalesforceFieldPermissionsPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Read Field""" + permissionsRead: Boolean + + """Edit Field""" + permissionsEdit: Boolean +} + +input SalesforceUpdateFieldPermissionsInput { + patch: SalesforceFieldPermissionsPatch! + + """The id of the FieldPermissions to update.""" + id: String! +} + +type SalesforceUpdateFieldPermissionsPayload { + """FieldPermissions updated by the mutation.""" + fieldPermissions: SalesforceFieldPermissions! +} + +input SalesforceMacroPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Description""" + description: String + + """Macro Name""" + name: String + + """Owner ID""" + ownerId: String +} + +input SalesforceUpdateMacroInput { + patch: SalesforceMacroPatch! + + """The id of the Macro to update.""" + id: String! +} + +type SalesforceUpdateMacroPayload { + """Macro updated by the mutation.""" + macro: SalesforceMacro! +} + +input SalesforceEmailServicesAddressPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Email Address Name""" + developerName: String + + """Service ID""" + functionId: String + + """User ID""" + runAsUserId: String + + """Accept Email From""" + authorizedSenders: String + + """Email address""" + localPart: String + + """Active""" + isActive: Boolean +} + +input SalesforceUpdateEmailServicesAddressInput { + patch: SalesforceEmailServicesAddressPatch! + + """The id of the EmailServicesAddress to update.""" + id: String! +} + +type SalesforceUpdateEmailServicesAddressPayload { + """EmailServicesAddress updated by the mutation.""" + emailServicesAddress: SalesforceEmailServicesAddress! +} + +input SalesforceHolidayPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Recurrence Month of Year""" + recurrenceMonthOfYear: String + + """Recurrence Instance""" + recurrenceInstance: String + + """Recurrence Day of Month""" + recurrenceDayOfMonth: Int + + """Recurrence Day of Week Mask""" + recurrenceDayOfWeekMask: Int + + """Recurrence Interval""" + recurrenceInterval: Int + + """Recurrence Type""" + recurrenceType: String + + """Recurrence End""" + recurrenceEndDateOnly: String + + """Recurrence Start""" + recurrenceStartDate: String + + """Recurring Holiday""" + isRecurrence: Boolean + + """End Time In Minutes From Midnight""" + endTimeInMinutes: Int + + """Start Time In Minutes From Midnight""" + startTimeInMinutes: Int + + """Holiday Date""" + activityDate: String + + """All Day""" + isAllDay: Boolean + + """Description""" + description: String + + """Holiday Name""" + name: String +} + +input SalesforceUpdateHolidayInput { + patch: SalesforceHolidayPatch! + + """The id of the Holiday to update.""" + id: String! +} + +type SalesforceUpdateHolidayPayload { + """Holiday updated by the mutation.""" + holiday: SalesforceHoliday! +} + +input SalesforcePushTopicPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Undelete""" + notifyForOperationUndelete: Boolean + + """Delete""" + notifyForOperationDelete: Boolean + + """Update""" + notifyForOperationUpdate: Boolean + + """Create""" + notifyForOperationCreate: Boolean + + """Description""" + description: String + + """Notify For Fields""" + notifyForFields: String + + """Is Active""" + isActive: Boolean + + """API Version""" + apiVersion: Float + + """SOQL Query""" + query: String + + """Topic Name""" + name: String +} + +input SalesforceUpdatePushTopicInput { + patch: SalesforcePushTopicPatch! + + """The id of the PushTopic to update.""" + id: String! +} + +type SalesforceUpdatePushTopicPayload { + """PushTopic updated by the mutation.""" + pushTopic: SalesforcePushTopic! +} + +input SalesforceTransactionSecurityPolicyPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Description""" + description: String + + """User ID""" + executionUserId: String + + """Resource Name""" + resourceName: String + + """Event Type""" + eventType: String + + """Class ID""" + apexPolicyId: String + + """Action Configuration""" + actionConfig: String + + """State""" + state: String + + """Policy type""" + type: String + + """Label""" + masterLabel: String + + """Master Language""" + language: String + + """Name""" + developerName: String +} + +input SalesforceUpdateTransactionSecurityPolicyInput { + patch: SalesforceTransactionSecurityPolicyPatch! + + """The id of the TransactionSecurityPolicy to update.""" + id: String! +} + +type SalesforceUpdateTransactionSecurityPolicyPayload { + """TransactionSecurityPolicy updated by the mutation.""" + transactionSecurityPolicy: SalesforceTransactionSecurityPolicy! +} + +input SalesforceUserProvisioningLogPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Details""" + details: String + + """Status""" + status: String + + """User ID""" + userId: String + + """External Username""" + externalUsername: String + + """External User Id""" + externalUserId: String + + """UserProvisioningRequest ID""" + userProvisioningRequestId: String +} + +input SalesforceUpdateUserProvisioningLogInput { + patch: SalesforceUserProvisioningLogPatch! + + """The id of the UserProvisioningLog to update.""" + id: String! +} + +type SalesforceUpdateUserProvisioningLogPayload { + """UserProvisioningLog updated by the mutation.""" + userProvisioningLog: SalesforceUserProvisioningLog! +} + +input SalesforceDandBCompanyPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Prior Year Revenue""" + priorYearRevenue: Float + + """Prior Year Number of Employees - Total""" + priorYearEmployees: Int + + """Sixth SIC8 Description""" + sixthSic8Desc: String + + """Sixth SIC8 Code""" + sixthSic8: String + + """Fifth SIC8 Description""" + fifthSic8Desc: String + + """Fifth SIC8 Code""" + fifthSic8: String + + """Fourth SIC8 Description""" + fourthSic8Desc: String + + """Fourth SIC8 Code""" + fourthSic8: String + + """Third SIC8 Description""" + thirdSic8Desc: String + + """Third SIC8 Code""" + thirdSic8: String + + """Second SIC8 Description """ + secondSic8Desc: String + + """Second SIC8 Code""" + secondSic8: String + + """Primary SIC8 Description""" + primarySic8Desc: String + + """Primary SIC8 Code""" + primarySic8: String + + """Annual Revenue Growth""" + salesTurnoverGrowthRate: Float + + """Employee Growth""" + employeeQuantityGrowthRate: Float + + """Location Size Unit of Measure""" + premisesMeasureUnit: String + + """Location Size Accuracy""" + premisesMeasureReliability: String + + """Location Size""" + premisesMeasure: Int + + """S&P 500""" + includedInSnP500: String + + """Fortune 1000 Rank""" + fortuneRank: Int + + """Company Description""" + description: String + + """Local Currency ISO Code""" + companyCurrencyIsoCode: String + + """Location Type""" + locationStatus: String + + """Domestic Ultimate Business Name""" + domesticUltimateBusinessName: String + + """Domestic Ultimate D-U-N-S Number""" + domesticUltimateDunsNumber: String + + """Parent Company Business Name""" + parentOrHqBusinessName: String + + """Parent Company D-U-N-S Number""" + parentOrHqDunsNumber: String + + """Global Ultimate Business Name""" + globalUltimateBusinessName: String + + """Global Ultimate D-U-N-S Number""" + globalUltimateDunsNumber: String + + """Delinquency Risk""" + marketingPreScreen: String + + """Number of Business Family Members""" + familyMembers: Int + + """Geocode Accuracy""" + geoCodeAccuracy: String + + """US Tax ID Number""" + usTaxId: String + + """National Identification System""" + nationalIdType: String + + """National Identification Number""" + nationalId: String + + """Fifth Tradestyle""" + tradeStyle5: String + + """Fourth Tradestyle""" + tradeStyle4: String + + """Third Tradestyle""" + tradeStyle3: String + + """Second Tradestyle""" + tradeStyle2: String + + """Subsidiary Indicator""" + subsidiary: String + + """Import/Export""" + importExportAgent: String + + """Marketing Segmentation Cluster""" + marketingSegmentationCluster: String + + """Small Business Indicator""" + smallBusiness: String + + """Woman-Owned Indicator""" + womenOwned: String + + """Minority-Owned Indicator""" + minorityOwned: String + + """Number of Employees - Total Indicator""" + employeesTotalReliability: String + + """Number of Employees - Global""" + globalUltimateTotalEmployees: Float + + """Legal Structure""" + legalStatus: String + + """Local Currency Code""" + currencyCode: String + + """Annual Sales Volume Indicator""" + salesVolumeReliability: String + + """Number of Employees - Location Indicator""" + employeesHereReliability: String + + """Number of Employees - Location""" + employeesHere: Float + + """Location Ownership Indicator""" + ownOrRent: String + + """Sixth NAICS Description""" + sixthNaicsDesc: String + + """Sixth NAICS Code""" + sixthNaics: String + + """Fifth NAICS Description""" + fifthNaicsDesc: String + + """Fifth NAICS Code""" + fifthNaics: String + + """Fourth NAICS Description""" + fourthNaicsDesc: String + + """Fourth NAICS Code""" + fourthNaics: String + + """Third NAICS Description""" + thirdNaicsDesc: String + + """Third NAICS Code""" + thirdNaics: String + + """Second NAICS Description""" + secondNaicsDesc: String + + """Second NAICS Code""" + secondNaics: String + + """Primary NAICS Description""" + primaryNaicsDesc: String + + """Primary NAICS Code""" + primaryNaics: String + + """Sixth SIC Description""" + sixthSicDesc: String + + """Sixth SIC Code""" + sixthSic: String + + """Fifth SIC Description""" + fifthSicDesc: String + + """Fifth SIC Code""" + fifthSic: String + + """Fourth SIC Description""" + fourthSicDesc: String + + """Fourth SIC Code""" + fourthSic: String + + """Third SIC Description""" + thirdSicDesc: String + + """Third SIC Code""" + thirdSic: String + + """Second SIC Description""" + secondSicDesc: String + + """Second SIC Code""" + secondSic: String + + """Primary SIC Description""" + primarySicDesc: String + + """Primary SIC Code""" + primarySic: String + + """Longitude""" + longitude: String + + """Latitude""" + latitude: String + + """Mailing Geocode Accuracy""" + mailingGeocodeAccuracy: String + + """Mailing Country""" + mailingCountry: String + + """Mailing Postal Code""" + mailingPostalCode: String + + """Mailing State""" + mailingState: String + + """Mailing City""" + mailingCity: String + + """Mailing Street Address""" + mailingStreet: String + + """Year Started""" + yearStarted: String + + """Primary Tradestyle""" + tradeStyle1: String + + """FIPS MSA Code Description""" + fipsMsaDesc: String + + """FIPS MSA Code""" + fipsMsaCode: String + + """Number of Employees - Total""" + employeesTotal: Float + + """Out Of Business Indicator""" + outOfBusiness: String + + """URL""" + url: String + + """Annual Sales Volume""" + salesVolume: Float + + """Stock Exchange""" + stockExchange: String + + """Ticker Symbol""" + stockSymbol: String + + """Ownership Type Indicator""" + publicIndicator: String + + """International Dialing Code""" + countryAccessCode: String + + """Facsimile Number""" + fax: String + + """Telephone Number""" + phone: String + + """Geocode Accuracy""" + geocodeAccuracyStandard: String + + """Country""" + country: String + + """Postal Code""" + postalCode: String + + """State""" + state: String + + """City""" + city: String + + """Street Address""" + street: String + + """D-U-N-S Number""" + dunsNumber: String + + """Primary Business Name""" + name: String +} + +input SalesforceUpdateDandBCompanyInput { + patch: SalesforceDandBCompanyPatch! + + """The id of the DandBCompany to update.""" + id: String! +} + +type SalesforceUpdateDandBCompanyPayload { + """DandBCompany updated by the mutation.""" + dandBCompany: SalesforceDandBCompany! +} + +input SalesforcePlatformCachePartitionTypePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Allocated Trial Capacity""" + allocatedTrialCapacity: Int + + """Allocated Namespaced Purchased Capacity""" + allocatedPurchasedCapacity: Int + + """Allocated Capacity""" + allocatedCapacity: Int + + """Cache Type""" + cacheType: String +} + +input SalesforceUpdatePlatformCachePartitionTypeInput { + patch: SalesforcePlatformCachePartitionTypePatch! + + """The id of the PlatformCachePartitionType to update.""" + id: String! +} + +type SalesforceUpdatePlatformCachePartitionTypePayload { + """PlatformCachePartitionType updated by the mutation.""" + platformCachePartitionType: SalesforcePlatformCachePartitionType! +} + +input SalesforceGroupPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Include Bosses""" + doesIncludeBosses: Boolean + + """Send Email to Members""" + doesSendEmailToMembers: Boolean + + """Email""" + email: String + + """Developer Name""" + developerName: String + + """Name""" + name: String +} + +input SalesforceUpdateGroupInput { + patch: SalesforceGroupPatch! + + """The id of the Group to update.""" + id: String! +} + +type SalesforceUpdateGroupPayload { + """Group updated by the mutation.""" + group: SalesforceGroup! +} + +input SalesforceDocumentPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Author ID""" + authorId: String + + """Internal Use Only""" + isInternalUseOnly: Boolean + + """Keywords""" + keywords: String + + """Description""" + description: String + + """Url""" + url: String + + """Body""" + body: String + + """Externally Available""" + isPublic: Boolean + + """File Extension""" + type: String + + """MIME Type""" + contentType: String + + """Document Unique Name""" + developerName: String + + """Document Name""" + name: String + + """Folder ID""" + folderId: String +} + +input SalesforceUpdateDocumentInput { + patch: SalesforceDocumentPatch! + + """The id of the Document to update.""" + id: String! +} + +type SalesforceUpdateDocumentPayload { + """Document updated by the mutation.""" + document: SalesforceDocument! +} + +input SalesforceContactCleanInfoPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Title is Flagged Wrong""" + isFlaggedWrongTitle: Boolean + + """Address is Flagged Wrong""" + isFlaggedWrongAddress: Boolean + + """Phone is Flagged Wrong""" + isFlaggedWrongPhone: Boolean + + """Email is Flagged Wrong""" + isFlaggedWrongEmail: Boolean + + """Name is Flagged Wrong""" + isFlaggedWrongName: Boolean + + """Title is Reviewed""" + isReviewedTitle: Boolean + + """Address is Reviewed""" + isReviewedAddress: Boolean + + """Phone is Reviewed""" + isReviewedPhone: Boolean + + """Email is Reviewed""" + isReviewedEmail: Boolean + + """Name is Reviewed""" + isReviewedName: Boolean + + """Contact Status in Salesforce""" + isInactive: Boolean + + """Contact Clean Info Name""" + name: String +} + +input SalesforceUpdateContactCleanInfoInput { + patch: SalesforceContactCleanInfoPatch! + + """The id of the ContactCleanInfo to update.""" + id: String! +} + +type SalesforceUpdateContactCleanInfoPayload { + """ContactCleanInfo updated by the mutation.""" + contactCleanInfo: SalesforceContactCleanInfo! +} + +input SalesforceDuplicateRecordSetPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Duplicate Rule ID""" + duplicateRuleId: String +} + +input SalesforceUpdateDuplicateRecordSetInput { + patch: SalesforceDuplicateRecordSetPatch! + + """The id of the DuplicateRecordSet to update.""" + id: String! +} + +type SalesforceUpdateDuplicateRecordSetPayload { + """DuplicateRecordSet updated by the mutation.""" + duplicateRecordSet: SalesforceDuplicateRecordSet! +} + +input SalesforceQuickTextPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Channel""" + channel: String + + """Category""" + category: String + + """Message""" + message: String + + """Quick Text Name""" + name: String + + """Owner ID""" + ownerId: String +} + +input SalesforceUpdateQuickTextInput { + patch: SalesforceQuickTextPatch! + + """The id of the QuickText to update.""" + id: String! +} + +type SalesforceUpdateQuickTextPayload { + """QuickText updated by the mutation.""" + quickText: SalesforceQuickText! +} + +input SalesforceCorsWhitelistEntryPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Origin URL Pattern""" + urlPattern: String + + """Label""" + masterLabel: String + + """Master Language""" + language: String + + """Name""" + developerName: String +} + +input SalesforceUpdateCorsWhitelistEntryInput { + patch: SalesforceCorsWhitelistEntryPatch! + + """The id of the CorsWhitelistEntry to update.""" + id: String! +} + +type SalesforceUpdateCorsWhitelistEntryPayload { + """CorsWhitelistEntry updated by the mutation.""" + corsWhitelistEntry: SalesforceCorsWhitelistEntry! +} + +input SalesforceChatterExtensionPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Header Text""" + headerText: String + + """Hover Text""" + hoverText: String + + """Lightning Definition Bundle ID""" + renderComponentEnumOrId: String + + """Lightning Definition Bundle ID""" + compositionComponentEnumOrId: String + + """Description""" + description: String + + """Asset File ID""" + iconId: String + + """Type""" + type: String + + """Name""" + extensionName: String + + """Protected Component""" + isProtected: Boolean + + """Label""" + masterLabel: String + + """Master Language""" + language: String + + """Name""" + developerName: String +} + +input SalesforceUpdateChatterExtensionInput { + patch: SalesforceChatterExtensionPatch! + + """The id of the ChatterExtension to update.""" + id: String! +} + +type SalesforceUpdateChatterExtensionPayload { + """ChatterExtension updated by the mutation.""" + chatterExtension: SalesforceChatterExtension! +} + +input SalesforceContentDocumentLinkPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Share Type""" + shareType: String +} + +input SalesforceUpdateContentDocumentLinkInput { + patch: SalesforceContentDocumentLinkPatch! + + """The id of the ContentDocumentLink to update.""" + id: String! +} + +type SalesforceUpdateContentDocumentLinkPayload { + """ContentDocumentLink updated by the mutation.""" + contentDocumentLink: SalesforceContentDocumentLink! +} + +input SalesforceOpportunityCompetitorPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Weaknesses""" + weaknesses: String + + """Strengths""" + strengths: String + + """Competitor Name""" + competitorName: String +} + +input SalesforceUpdateOpportunityCompetitorInput { + patch: SalesforceOpportunityCompetitorPatch! + + """The id of the OpportunityCompetitor to update.""" + id: String! +} + +type SalesforceUpdateOpportunityCompetitorPayload { + """OpportunityCompetitor updated by the mutation.""" + opportunityCompetitor: SalesforceOpportunityCompetitor! +} + +input SalesforceIdeaCommentPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Comment Body""" + commentBody: String +} + +input SalesforceUpdateIdeaCommentInput { + patch: SalesforceIdeaCommentPatch! + + """The id of the IdeaComment to update.""" + id: String! +} + +type SalesforceUpdateIdeaCommentPayload { + """IdeaComment updated by the mutation.""" + ideaComment: SalesforceIdeaComment! +} + +input SalesforceCaseTeamTemplateMemberPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Team Role ID""" + teamRoleId: String +} + +input SalesforceUpdateCaseTeamTemplateMemberInput { + patch: SalesforceCaseTeamTemplateMemberPatch! + + """The id of the CaseTeamTemplateMember to update.""" + id: String! +} + +type SalesforceUpdateCaseTeamTemplateMemberPayload { + """CaseTeamTemplateMember updated by the mutation.""" + caseTeamTemplateMember: SalesforceCaseTeamTemplateMember! +} + +input SalesforceApexTestResultLimitsPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """LimitExceptions""" + limitExceptions: String + + """LimitContext""" + limitContext: String + + """ + Maximum number of push notification method calls allowed per Apex transaction + """ + mobilePush: Int + + """Total number of async calls""" + asyncCalls: Int + + """Total number of sendEmail methods allowed""" + email: Int + + """Total number of callouts""" + callouts: Int + + """Maximum CPU time on the Salesforce servers""" + cpu: Int + + """Total number of records processed as a result of DML statements""" + dmlRows: Int + + """Total number of DML statements issued""" + dml: Int + + """Total number of SOSL queries issued""" + sosl: Int + + """Total number of records retrieved by SOQL queries""" + queryRows: Int + + """Total number of SOQL queries issued""" + soql: Int +} + +input SalesforceUpdateApexTestResultLimitsInput { + patch: SalesforceApexTestResultLimitsPatch! + + """The id of the ApexTestResultLimits to update.""" + id: String! +} + +type SalesforceUpdateApexTestResultLimitsPayload { + """ApexTestResultLimits updated by the mutation.""" + apexTestResultLimits: SalesforceApexTestResultLimits! +} + +input SalesforceCaseTeamTemplatePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Description""" + description: String + + """Name""" + name: String +} + +input SalesforceUpdateCaseTeamTemplateInput { + patch: SalesforceCaseTeamTemplatePatch! + + """The id of the CaseTeamTemplate to update.""" + id: String! +} + +type SalesforceUpdateCaseTeamTemplatePayload { + """CaseTeamTemplate updated by the mutation.""" + caseTeamTemplate: SalesforceCaseTeamTemplate! +} + +input SalesforceObjectPermissionsPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Edit All Records""" + permissionsModifyAllRecords: Boolean + + """Read All Records""" + permissionsViewAllRecords: Boolean + + """Delete Records""" + permissionsDelete: Boolean + + """Edit Records""" + permissionsEdit: Boolean + + """Read Records""" + permissionsRead: Boolean + + """Create Records""" + permissionsCreate: Boolean +} + +input SalesforceUpdateObjectPermissionsInput { + patch: SalesforceObjectPermissionsPatch! + + """The id of the ObjectPermissions to update.""" + id: String! +} + +type SalesforceUpdateObjectPermissionsPayload { + """ObjectPermissions updated by the mutation.""" + objectPermissions: SalesforceObjectPermissions! +} + +input SalesforceListViewChartPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Aggregate Type""" + aggregateType: String + + """Custom Field Definition ID""" + aggregateField: String + + """Custom Field Definition ID""" + groupingField: String + + """Chart Type""" + chartType: String + + """User ID""" + ownerId: String + + """Label""" + masterLabel: String + + """Master Language""" + language: String + + """API Name""" + developerName: String +} + +input SalesforceUpdateListViewChartInput { + patch: SalesforceListViewChartPatch! + + """The id of the ListViewChart to update.""" + id: String! +} + +type SalesforceUpdateListViewChartPayload { + """ListViewChart updated by the mutation.""" + listViewChart: SalesforceListViewChart! +} + +input SalesforceUserProvMockTargetPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """External Last Name""" + externalLastName: String + + """External First Name""" + externalFirstName: String + + """External Email""" + externalEmail: String + + """External Username""" + externalUsername: String + + """External User Id""" + externalUserId: String + + """Name""" + name: String +} + +input SalesforceUpdateUserProvMockTargetInput { + patch: SalesforceUserProvMockTargetPatch! + + """The id of the UserProvMockTarget to update.""" + id: String! +} + +type SalesforceUpdateUserProvMockTargetPayload { + """UserProvMockTarget updated by the mutation.""" + userProvMockTarget: SalesforceUserProvMockTarget! +} + +input SalesforcePricebook2Patch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Description""" + description: String + + """Active""" + isActive: Boolean + + """Price Book Name""" + name: String +} + +input SalesforceUpdatePricebook2Input { + patch: SalesforcePricebook2Patch! + + """The id of the Pricebook2 to update.""" + id: String! +} + +type SalesforceUpdatePricebook2Payload { + """Pricebook2 updated by the mutation.""" + pricebook2: SalesforcePricebook2! +} + +input SalesforceRecentlyViewedPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Last Referenced Date""" + lastReferencedDate: String + + """Last Viewed Date""" + lastViewedDate: String +} + +input SalesforceUpdateRecentlyViewedInput { + patch: SalesforceRecentlyViewedPatch! + + """The id of the RecentlyViewed to update.""" + id: String! +} + +"""Recently Viewed""" +type SalesforceRecentlyViewed { + """Recently Viewed ID""" + id: String! + + """Name""" + name: String + + """Last Name""" + lastName: String + + """First Name""" + firstName: String + + """Type""" + type: String + + """Alias""" + alias: String + + """Role ID""" + userRoleId: String + + """Role ID""" + userRole: SalesforceUserRole + + """Record Type ID""" + recordTypeId: String + + """Record Type ID""" + recordType: SalesforceRecordType + + """Active""" + isActive: Boolean! + + """Profile ID""" + profileId: String + + """Profile ID""" + profile: SalesforceProfile + + """Title""" + title: String + + """Email""" + email: String + + """Phone""" + phone: String + + """Name or Alias""" + nameOrAlias: String + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Language""" + language: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! +} + +type SalesforceUpdateRecentlyViewedPayload { + """RecentlyViewed updated by the mutation.""" + recentlyViewed: SalesforceRecentlyViewed! +} + +input SalesforceEmailDomainKeyPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Private Key""" + privateKey: String + + """Public Key""" + publicKey: String + + """Active""" + isActive: Boolean + + """Domain Match""" + domainMatch: String + + """Domain""" + domain: String + + """Selector""" + selector: String +} + +input SalesforceUpdateEmailDomainKeyInput { + patch: SalesforceEmailDomainKeyPatch! + + """The id of the EmailDomainKey to update.""" + id: String! +} + +type SalesforceUpdateEmailDomainKeyPayload { + """EmailDomainKey updated by the mutation.""" + emailDomainKey: SalesforceEmailDomainKey! +} + +input SalesforceFeedCommentPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Status""" + status: String + + """Is Rich Text""" + isRichText: Boolean + + """Comment Body""" + commentBody: String +} + +input SalesforceUpdateFeedCommentInput { + patch: SalesforceFeedCommentPatch! + + """The id of the FeedComment to update.""" + id: String! +} + +type SalesforceUpdateFeedCommentPayload { + """FeedComment updated by the mutation.""" + feedComment: SalesforceFeedComment! +} + +input SalesforceLeadPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Email Bounced Date""" + emailBouncedDate: String + + """Email Bounced Reason""" + emailBouncedReason: String + + """D&B Company ID""" + dandbCompanyId: String + + """Company D-U-N-S Number""" + companyDunsNumber: String + + """Clean Status""" + cleanStatus: String + + """Data.com Key""" + jigsaw: String + + """Unread By Owner""" + isUnreadByOwner: Boolean + + """Owner ID""" + ownerId: String + + """Employees""" + numberOfEmployees: Int + + """Annual Revenue""" + annualRevenue: Float + + """Rating""" + rating: String + + """Industry""" + industry: String + + """Status""" + status: String + + """Lead Source""" + leadSource: String + + """Description""" + description: String + + """Website""" + website: String + + """Email""" + email: String + + """Fax""" + fax: String + + """Mobile Phone""" + mobilePhone: String + + """Phone""" + phone: String + + """Geocode Accuracy""" + geocodeAccuracy: String + + """Longitude""" + longitude: Float + + """Latitude""" + latitude: Float + + """Country""" + country: String + + """Zip/Postal Code""" + postalCode: String + + """State/Province""" + state: String + + """City""" + city: String + + """Street""" + street: String + + """Company""" + company: String + + """Title""" + title: String + + """Salutation""" + salutation: String + + """First Name""" + firstName: String + + """Last Name""" + lastName: String +} + +input SalesforceUpdateLeadInput { + patch: SalesforceLeadPatch! + + """The id of the Lead to update.""" + id: String! +} + +type SalesforceUpdateLeadPayload { + """Lead updated by the mutation.""" + lead: SalesforceLead! +} + +input SalesforceWebLinkPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Require Row Selection""" + requireRowSelection: Boolean + + """Display Type""" + displayType: String + + """Description""" + description: String + + """Label""" + masterLabel: String + + """Custom S-Control ID""" + scontrolId: String + + """Window Position""" + position: String + + """Resizeable""" + isResizable: Boolean + + """Show Status Bar""" + showsStatus: Boolean + + """Show Menu Bar""" + hasMenubar: Boolean + + """Show Toolbars""" + hasToolbar: Boolean + + """Show Scrollbars""" + hasScrollbars: Boolean + + """Show Address Bar""" + showsLocation: Boolean + + """Width (in pixels)""" + width: Int + + """Height (in pixels)""" + height: Int + + """Behavior""" + openType: String + + """Content Source""" + linkType: String + + """Link Encoding""" + encodingKey: String + + """URL""" + url: String + + """Protected Component""" + isProtected: Boolean + + """Name""" + name: String +} + +input SalesforceUpdateWebLinkInput { + patch: SalesforceWebLinkPatch! + + """The id of the WebLink to update.""" + id: String! +} + +type SalesforceUpdateWebLinkPayload { + """WebLink updated by the mutation.""" + webLink: SalesforceWebLink! +} + +input SalesforceEventRelationPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Response""" + response: String + + """Response Date""" + respondedDate: String + + """Status""" + status: String +} + +input SalesforceUpdateEventRelationInput { + patch: SalesforceEventRelationPatch! + + """The id of the EventRelation to update.""" + id: String! +} + +type SalesforceUpdateEventRelationPayload { + """EventRelation updated by the mutation.""" + eventRelation: SalesforceEventRelation! +} + +input SalesforceStaticResourcePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Cache Control""" + cacheControl: String + + """Description""" + description: String + + """Body""" + body: String + + """MIME Type""" + contentType: String + + """Name""" + name: String +} + +input SalesforceUpdateStaticResourceInput { + patch: SalesforceStaticResourcePatch! + + """The id of the StaticResource to update.""" + id: String! +} + +type SalesforceUpdateStaticResourcePayload { + """StaticResource updated by the mutation.""" + staticResource: SalesforceStaticResource! +} + +input SalesforceTodayGoalSharePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Object Access""" + accessLevel: String +} + +input SalesforceUpdateTodayGoalShareInput { + patch: SalesforceTodayGoalSharePatch! + + """The id of the TodayGoalShare to update.""" + id: String! +} + +type SalesforceUpdateTodayGoalSharePayload { + """TodayGoalShare updated by the mutation.""" + todayGoalShare: SalesforceTodayGoalShare! +} + +input SalesforceContentFolderPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent Content Folder ID""" + parentContentFolderId: String + + """Name""" + name: String +} + +input SalesforceUpdateContentFolderInput { + patch: SalesforceContentFolderPatch! + + """The id of the ContentFolder to update.""" + id: String! +} + +type SalesforceUpdateContentFolderPayload { + """ContentFolder updated by the mutation.""" + contentFolder: SalesforceContentFolder! +} + +input SalesforceContentDistributionPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Expiration Date""" + expiryDate: String + + """Email when Preview Images are Ready""" + preferencesNotifyRndtnComplete: Boolean + + """Content Delivery Expires""" + preferencesExpires: Boolean + + """Allow View in the Browser""" + preferencesAllowViewInBrowser: Boolean + + """Content Delivery Opens Latest Version""" + preferencesLinkLatestVersion: Boolean + + """Notify Me of First View or Download""" + preferencesNotifyOnVisit: Boolean + + """Require Password to Access Content""" + preferencesPasswordRequired: Boolean + + """Allow Download in Original Format""" + preferencesAllowOriginalDownload: Boolean + + """Allow Download as PDF""" + preferencesAllowPdfDownload: Boolean + + """Related Record ID""" + relatedRecordId: String + + """Content Delivery Name""" + name: String + + """Owner ID""" + ownerId: String +} + +input SalesforceUpdateContentDistributionInput { + patch: SalesforceContentDistributionPatch! + + """The id of the ContentDistribution to update.""" + id: String! +} + +type SalesforceUpdateContentDistributionPayload { + """ContentDistribution updated by the mutation.""" + contentDistribution: SalesforceContentDistribution! +} + +input SalesforceCategoryDataPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """SObject ID""" + relatedSobjectId: String + + """Category Node ID""" + categoryNodeId: String +} + +input SalesforceUpdateCategoryDataInput { + patch: SalesforceCategoryDataPatch! + + """The id of the CategoryData to update.""" + id: String! +} + +type SalesforceUpdateCategoryDataPayload { + """CategoryData updated by the mutation.""" + categoryData: SalesforceCategoryData! +} + +input SalesforceListEmailSharePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Object Access""" + accessLevel: String +} + +input SalesforceUpdateListEmailShareInput { + patch: SalesforceListEmailSharePatch! + + """The id of the ListEmailShare to update.""" + id: String! +} + +type SalesforceUpdateListEmailSharePayload { + """ListEmailShare updated by the mutation.""" + listEmailShare: SalesforceListEmailShare! +} + +input SalesforceChatterExtensionConfigPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Position""" + position: Int + + """Can Read""" + canRead: Boolean + + """Can Create""" + canCreate: Boolean + + """Chatter Extension ID""" + chatterExtensionId: String +} + +input SalesforceUpdateChatterExtensionConfigInput { + patch: SalesforceChatterExtensionConfigPatch! + + """The id of the ChatterExtensionConfig to update.""" + id: String! +} + +type SalesforceUpdateChatterExtensionConfigPayload { + """ChatterExtensionConfig updated by the mutation.""" + chatterExtensionConfig: SalesforceChatterExtensionConfig! +} + +input SalesforcePricebookEntryPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Use Standard Price""" + useStandardPrice: Boolean + + """Active""" + isActive: Boolean + + """List Price""" + unitPrice: Float +} + +input SalesforceUpdatePricebookEntryInput { + patch: SalesforcePricebookEntryPatch! + + """The id of the PricebookEntry to update.""" + id: String! +} + +type SalesforceUpdatePricebookEntryPayload { + """PricebookEntry updated by the mutation.""" + pricebookEntry: SalesforcePricebookEntry! +} + +input SalesforceFeedAttachmentPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Feed Attachment Value""" + value: String + + """Feed Attachment Title""" + title: String +} + +input SalesforceUpdateFeedAttachmentInput { + patch: SalesforceFeedAttachmentPatch! + + """The id of the FeedAttachment to update.""" + id: String! +} + +type SalesforceUpdateFeedAttachmentPayload { + """FeedAttachment updated by the mutation.""" + feedAttachment: SalesforceFeedAttachment! +} + +input SalesforceCaseTeamRolePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Visible in Customer Portal""" + preferencesVisibleInCsp: Boolean + + """Access Level""" + accessLevel: String + + """Name""" + name: String +} + +input SalesforceUpdateCaseTeamRoleInput { + patch: SalesforceCaseTeamRolePatch! + + """The id of the CaseTeamRole to update.""" + id: String! +} + +type SalesforceUpdateCaseTeamRolePayload { + """CaseTeamRole updated by the mutation.""" + caseTeamRole: SalesforceCaseTeamRole! +} + +input SalesforceRecordTypePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Active""" + isActive: Boolean + + """Business Process ID""" + businessProcessId: String + + """Description""" + description: String + + """Record Type Name""" + developerName: String + + """Name""" + name: String +} + +input SalesforceUpdateRecordTypeInput { + patch: SalesforceRecordTypePatch! + + """The id of the RecordType to update.""" + id: String! +} + +type SalesforceUpdateRecordTypePayload { + """RecordType updated by the mutation.""" + recordType: SalesforceRecordType! +} + +input SalesforceListEmailPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Status""" + status: String + + """From Address""" + fromAddress: String + + """From Name""" + fromName: String + + """Text Body""" + textBody: String + + """Html Body""" + htmlBody: String + + """Subject""" + subject: String + + """Name""" + name: String + + """Owner ID""" + ownerId: String +} + +input SalesforceUpdateListEmailInput { + patch: SalesforceListEmailPatch! + + """The id of the ListEmail to update.""" + id: String! +} + +type SalesforceUpdateListEmailPayload { + """ListEmail updated by the mutation.""" + listEmail: SalesforceListEmail! +} + +input SalesforceAccountContactRolePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Primary""" + isPrimary: Boolean + + """Role""" + role: String + + """Contact ID""" + contactId: String +} + +input SalesforceUpdateAccountContactRoleInput { + patch: SalesforceAccountContactRolePatch! + + """The id of the AccountContactRole to update.""" + id: String! +} + +type SalesforceUpdateAccountContactRolePayload { + """AccountContactRole updated by the mutation.""" + accountContactRole: SalesforceAccountContactRole! +} + +input SalesforceUserProvisioningRequestPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """UserProvisioningRequest ID""" + parentId: String + + """Retry Count""" + retryCount: Int + + """User ID""" + managerId: String + + """Approval Status""" + approvalStatus: String + + """User Provisioning Account ID""" + userProvAccountId: String + + """UserProvisioningConfig ID""" + userProvConfigId: String + + """Connected App ID""" + connectedAppId: String + + """Scheduled Provisioning Time""" + scheduleDate: String + + """Operation""" + operation: String + + """State""" + state: String + + """App Name""" + appName: String + + """External User Id""" + externalUserId: String + + """User ID""" + salesforceUserId: String + + """Owner ID""" + ownerId: String +} + +input SalesforceUpdateUserProvisioningRequestInput { + patch: SalesforceUserProvisioningRequestPatch! + + """The id of the UserProvisioningRequest to update.""" + id: String! +} + +type SalesforceUpdateUserProvisioningRequestPayload { + """UserProvisioningRequest updated by the mutation.""" + userProvisioningRequest: SalesforceUserProvisioningRequest! +} + +input SalesforceUserSharePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """User Access Level""" + userAccessLevel: String +} + +input SalesforceUpdateUserShareInput { + patch: SalesforceUserSharePatch! + + """The id of the UserShare to update.""" + id: String! +} + +type SalesforceUpdateUserSharePayload { + """UserShare updated by the mutation.""" + userShare: SalesforceUserShare! +} + +input SalesforceAccountCleanInfoPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Tradestyle is Flagged Wrong""" + isFlaggedWrongTradestyle: Boolean + + """Description is Flagged Wrong""" + isFlaggedWrongDescription: Boolean + + """Account Site is Flagged Wrong""" + isFlaggedWrongAccountSite: Boolean + + """Fax is Flagged Wrong""" + isFlaggedWrongFax: Boolean + + """Year Started is Flagged Wrong""" + isFlaggedWrongYearStarted: Boolean + + """NAICS Description is Flagged Wrong""" + isFlaggedWrongNaicsDescription: Boolean + + """NAICS Code is Flagged Wrong""" + isFlaggedWrongNaicsCode: Boolean + + """SIC Description is Flagged Wrong""" + isFlaggedWrongSicDescription: Boolean + + """SIC Code is Flagged Wrong""" + isFlaggedWrongSic: Boolean + + """D-U-N-S Number is Flagged Wrong""" + isFlaggedWrongDunsNumber: Boolean + + """Ownership is Flagged Wrong""" + isFlaggedWrongOwnership: Boolean + + """Industry is Flagged Wrong""" + isFlaggedWrongIndustry: Boolean + + """Number of Employees is Flagged Wrong""" + isFlaggedWrongNumberOfEmployees: Boolean + + """Annual Revenue is Flagged Wrong""" + isFlaggedWrongAnnualRevenue: Boolean + + """Ticker Symbol is Flagged Wrong""" + isFlaggedWrongTickerSymbol: Boolean + + """Website is Flagged Wrong""" + isFlaggedWrongWebsite: Boolean + + """Address is Flagged Wrong""" + isFlaggedWrongAddress: Boolean + + """Phone is Flagged Wrong""" + isFlaggedWrongPhone: Boolean + + """Company Name is Flagged Wrong""" + isFlaggedWrongCompanyName: Boolean + + """D&B Company D-U-N-S Number is Reviewed""" + isReviewedDandBCompanyDunsNumber: Boolean + + """Tradestyle is Reviewed""" + isReviewedTradestyle: Boolean + + """Description is Reviewed""" + isReviewedDescription: Boolean + + """Account Site is Reviewed""" + isReviewedAccountSite: Boolean + + """Fax is Reviewed""" + isReviewedFax: Boolean + + """Year Started is Reviewed""" + isReviewedYearStarted: Boolean + + """NAICS Description is Reviewed""" + isReviewedNaicsDescription: Boolean + + """NAICS Code is Reviewed""" + isReviewedNaicsCode: Boolean + + """SIC Description is Reviewed""" + isReviewedSicDescription: Boolean + + """SIC Code is Reviewed""" + isReviewedSic: Boolean + + """D-U-N-S Number is Reviewed""" + isReviewedDunsNumber: Boolean + + """Ownership is Reviewed""" + isReviewedOwnership: Boolean + + """Industry is Reviewed""" + isReviewedIndustry: Boolean + + """Number of Employees is Reviewed""" + isReviewedNumberOfEmployees: Boolean + + """Annual Revenue is Reviewed""" + isReviewedAnnualRevenue: Boolean + + """Ticker Symbol is Reviewed""" + isReviewedTickerSymbol: Boolean + + """Website is Reviewed""" + isReviewedWebsite: Boolean + + """Address is Reviewed""" + isReviewedAddress: Boolean + + """Phone is Reviewed""" + isReviewedPhone: Boolean + + """Company Name is Reviewed""" + isReviewedCompanyName: Boolean + + """Company Status in Salesforce""" + isInactive: Boolean + + """Account Clean Info Name""" + name: String +} + +input SalesforceUpdateAccountCleanInfoInput { + patch: SalesforceAccountCleanInfoPatch! + + """The id of the AccountCleanInfo to update.""" + id: String! +} + +type SalesforceUpdateAccountCleanInfoPayload { + """AccountCleanInfo updated by the mutation.""" + accountCleanInfo: SalesforceAccountCleanInfo! +} + +input SalesforceCampaignMemberPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Status""" + status: String +} + +input SalesforceUpdateCampaignMemberInput { + patch: SalesforceCampaignMemberPatch! + + """The id of the CampaignMember to update.""" + id: String! +} + +type SalesforceUpdateCampaignMemberPayload { + """CampaignMember updated by the mutation.""" + campaignMember: SalesforceCampaignMember! +} + +input SalesforcePermissionSetPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Session Activation Required""" + hasActivationRequired: Boolean + + """Description""" + description: String + + """View Roles and Role Hierarchy""" + permissionsViewRoles: Boolean + + """Manage Surveys""" + permissionsManageSurveys: Boolean + + """Show App Launcher in Communities""" + permissionsEnableCommunityAppLauncher: Boolean + + """Apex REST Services""" + permissionsApexRestServices: Boolean + + """Subscribe to Dashboards""" + permissionsSubscribeToLightningDashboards: Boolean + + """Subscribe to Reports: Set Running User""" + permissionsSubscribeReportsRunAsUser: Boolean + + """Lightning Console User""" + permissionsLightningConsoleAllowedForUser: Boolean + + """Subscribe to Reports: Add Recipients""" + permissionsSubscribeReportToOtherUsers: Boolean + + """View All Activities""" + permissionsViewAllActivities: Boolean + + """Allow Access to Customized Actions""" + permissionsUseWebLink: Boolean + + """IoT User""" + permissionsIotUser: Boolean + + """Change Dashboard Colors""" + permissionsChangeDashboardColors: Boolean + + """Pin Posts in Feeds""" + permissionsFeedPinning: Boolean + + """Allow sending of List Emails""" + permissionsListEmailSend: Boolean + + """Hide the Seen By List""" + permissionsHideReadByList: Boolean + + """Hide Option to Switch to Salesforce Classic""" + permissionsPreventClassicExperience: Boolean + + """Report Builder (Lightning Experience)""" + permissionsCreateReportInLightning: Boolean + + """Manage Certificates""" + permissionsManageCertificates: Boolean + + """Create and Update Second-Generation Packages""" + permissionsPackaging2: Boolean + + """Manage Health Check""" + permissionsManageHealthCheck: Boolean + + """View Health Check""" + permissionsViewHealthCheck: Boolean + + """Access Community Management""" + permissionsAccessCmc: Boolean + + """Show Company Name as Community Role""" + permissionsShowCompanyNameAsUserBadge: Boolean + + """View and Edit Converted Leads""" + permissionsAllowViewEditConvertedLeads: Boolean + + """Add People to Direct Messages""" + permissionsAddDirectMessageMembers: Boolean + + """Can Approve Feed Post and Comment""" + permissionsCanApproveFeedPost: Boolean + + """Remove People from Direct Messages""" + permissionsRemoveDirectMessageMembers: Boolean + + """Access to view Data Assessment""" + permissionsViewDataAssessment: Boolean + + """Campaign Influence""" + permissionsCampaignInfluence2: Boolean + + """Lightning Login User""" + permissionsAllowLightningLogin: Boolean + + """Manage All Private Reports and Dashboards""" + permissionsManagePvtRptsAndDashbds: Boolean + + """Subscribe to Reports""" + permissionsSubscribeToLightningReports: Boolean + + """Merge Topics""" + permissionsMergeTopics: Boolean + + """Moderate Community Users""" + permissionsModerateNetworkUsers: Boolean + + """Select Files from Salesforce""" + permissionsSelectFilesFromSalesforce: Boolean + + """Allow Inclusion of Code Snippets from UI""" + permissionsChatterComposeUiCodesnippet: Boolean + + """Manage Two-Factor Authentication in User Interface""" + permissionsDelegatedTwoFactor: Boolean + + """Import Custom Objects""" + permissionsImportCustomObjects: Boolean + + """Edit Posts on Records I Own""" + permissionsChatterEditOwnRecordPost: Boolean + + """Edit My Own Posts""" + permissionsChatterEditOwnPost: Boolean + + """Send announcement emails""" + permissionsSendAnnouncementEmails: Boolean + + """Manage Session Permission Set Activations""" + permissionsManageSessionPermissionSets: Boolean + + """Share internal Knowledge articles externally""" + permissionsShareInternalArticles: Boolean + + """Run Macros on Multiple Records""" + permissionsBulkMacrosAllowed: Boolean + + """Manage Macros Users Can't Undo""" + permissionsSubmitMacrosAllowed: Boolean + + """Configure Custom Recommendations""" + permissionsConfigCustomRecs: Boolean + + """Lightning Experience User""" + permissionsLightningExperienceUser: Boolean + + """Access Chatter For SharePoint""" + permissionsChatterForSharePoint: Boolean + + """Manage Two-Factor Authentication in API""" + permissionsManageTwoFactor: Boolean + + """Modify Secure Agents""" + permissionsModifySecureAgents: Boolean + + """Manage Unlisted Groups""" + permissionsManageUnlistedGroups: Boolean + + """Verify Answers to Chatter Questions""" + permissionsCanVerifyComment: Boolean + + """Manage Custom Permissions""" + permissionsManageCustomPermissions: Boolean + + """Manage Login Access Policies""" + permissionsManageLoginAccessPolicies: Boolean + + """Manage Password Policies""" + permissionsManagePasswordPolicies: Boolean + + """Manage Internal Users""" + permissionsManageInternalUsers: Boolean + + """Manage Sharing""" + permissionsManageSharing: Boolean + + """Manage IP Addresses""" + permissionsManageIpAddresses: Boolean + + """Manage Roles""" + permissionsManageRoles: Boolean + + """Assign Permission Sets""" + permissionsAssignPermissionSets: Boolean + + """Manage Profiles and Permission Sets""" + permissionsManageProfilesPermissionsets: Boolean + + """View Help Link""" + permissionsViewHelpLink: Boolean + + """Access Custom Mobile Apps""" + permissionsCustomMobileAppsAccess: Boolean + + """Manage Promoted Search Terms""" + permissionsManageSearchPromotionRules: Boolean + + """Access Libraries""" + permissionsContentWorkspaces: Boolean + + """Allow View Knowledge""" + permissionsAllowViewKnowledge: Boolean + + """Use Identity Connect""" + permissionsIdentityConnect: Boolean + + """Use Identity Features""" + permissionsIdentityEnabled: Boolean + + """Assign Topics""" + permissionsAssignTopics: Boolean + + """Create Topics""" + permissionsCreateTopics: Boolean + + """Edit Topics""" + permissionsEditTopics: Boolean + + """Delete Topics""" + permissionsDeleteTopics: Boolean + + """Two-Factor Authentication for API Logins""" + permissionsTwoFactorApi: Boolean + + """Sales Console""" + permissionsSalesConsole: Boolean + + """Manage Communities""" + permissionsGovernNetworks: Boolean + + """Enable Work.com""" + permissionsWorkDotComUserPerm: Boolean + + """Create and Customize List Views""" + permissionsCreateCustomizeFilters: Boolean + + """Enable Work.com Calibration""" + permissionsWorkCalibrationUser: Boolean + + """Connect Organization to Environment Hub""" + permissionsConnectOrgToEnvironmentHub: Boolean + + """Knowledge One""" + permissionsAllowUniversalSearch: Boolean + + """View All Users""" + permissionsViewAllUsers: Boolean + + """Edit My Reports""" + permissionsEditMyReports: Boolean + + """Edit My Dashboards""" + permissionsEditMyDashboards: Boolean + + """Manage Reports in Public Folders""" + permissionsManageReportsInPubFolders: Boolean + + """View Reports in Public Folders""" + permissionsViewPublicReports: Boolean + + """Create Report Folders""" + permissionsCreateReportFolders: Boolean + + """Create and Customize Reports""" + permissionsCreateCustomizeReports: Boolean + + """Manage Dashboards in Public Folders""" + permissionsManageDashbdsInPubFolders: Boolean + + """View Dashboards in Public Folders""" + permissionsViewPublicDashboards: Boolean + + """Create Dashboard Folders""" + permissionsCreateDashboardFolders: Boolean + + """Create and Customize Dashboards""" + permissionsCreateCustomizeDashboards: Boolean + + """Run Flows""" + permissionsRunFlow: Boolean + + """Manage Auth. Providers""" + permissionsManageAuthProviders: Boolean + + """Create and Set Up Communities""" + permissionsManageNetworks: Boolean + + """View Event Log Files""" + permissionsViewEventLogFiles: Boolean + + """Two-Factor Authentication for User Interface Logins""" + permissionsForceTwoFactor: Boolean + + """Create Public Links""" + permissionsChatterFileLink: Boolean + + """Email-Based Identity Verification Option""" + permissionsAllowEmailIc: Boolean + + """Manage Chatter Messages and Direct Messages""" + permissionsManageChatterMessages: Boolean + + """Email Administration""" + permissionsEmailAdministration: Boolean + + """Manage Email Templates""" + permissionsEmailTemplateManagement: Boolean + + """Manage Knowledge Article Import/Export""" + permissionsManageKnowledgeImportExport: Boolean + + """Insert System Field Values for Chatter Feeds""" + permissionsCanInsertFeedSystemFields: Boolean + + """Require Flow User Feature License""" + permissionsFlowUflRequired: Boolean + + """Reset User Passwords and Unlock Users""" + permissionsResetPasswords: Boolean + + """Moderate Chatter""" + permissionsModerateChatter: Boolean + + """View My Team's Dashboards""" + permissionsViewMyTeamsDashboards: Boolean + + """Manage Flow""" + permissionsManageInteraction: Boolean + + """Show Custom Sidebar On All Pages""" + permissionsCustomSidebarOnAllPages: Boolean + + """Manage Dynamic Dashboards""" + permissionsManageDynamicDashboards: Boolean + + """Manage Business Hours Holidays""" + permissionsManageBusinessHourHolidays: Boolean + + """Schedule Reports""" + permissionsScheduleReports: Boolean + + """Manage Reporting Snapshots""" + permissionsManageAnalyticSnapshots: Boolean + + """Manage Lightning Sync""" + permissionsManageExchangeConfig: Boolean + + """Manage record types and layouts for Files""" + permissionsManageContentTypes: Boolean + + """Manage Content Properties""" + permissionsManageContentProperties: Boolean + + """Manage Content Permissions""" + permissionsManageContentPermissions: Boolean + + """Create Libraries""" + permissionsCreateWorkspaces: Boolean + + """Manage Salesforce CRM Content""" + permissionsContentAdministrator: Boolean + + """Transfer Cases""" + permissionsTransferAnyCase: Boolean + + """Edit Case Comments""" + permissionsEditCaseComments: Boolean + + """Manage Custom Report Types""" + permissionsManageCustomReportTypes: Boolean + + """API Enabled""" + permissionsApiEnabled: Boolean + + """Manage Mobile Configurations""" + permissionsManageMobile: Boolean + + """Author Apex""" + permissionsAuthorApex: Boolean + + """Manage Data Categories""" + permissionsManageDataCategories: Boolean + + """View Data Categories""" + permissionsViewDataCategories: Boolean + + """Create Content Deliveries""" + permissionsDistributeFromPersWksp: Boolean + + """Manage Data Integrations""" + permissionsManageDataIntegrations: Boolean + + """Send Outbound Messages""" + permissionsEnableNotifications: Boolean + + """Manage Email Client Configurations""" + permissionsManageEmailClientConfig: Boolean + + """View Content in Portals""" + permissionsViewContent: Boolean + + """Manage Synonyms""" + permissionsManageSynonyms: Boolean + + """Manage Call Centers""" + permissionsManageCallCenters: Boolean + + """Import Solutions""" + permissionsSolutionImport: Boolean + + """Bulk API Hard Delete""" + permissionsBulkApiHardDelete: Boolean + + """Create AppExchange Packages""" + permissionsCreatePackaging: Boolean + + """Edit Opportunity Product Sales Price""" + permissionsEditOppLineItemUnitPrice: Boolean + + """Create and Own New Chatter Groups""" + permissionsChatterOwnGroups: Boolean + + """Upload AppExchange Packages""" + permissionsPublishPackaging: Boolean + + """Download AppExchange Packages""" + permissionsInstallPackaging: Boolean + + """Edit Activated Orders""" + permissionsEditActivatedOrders: Boolean + + """Use Team Reassignment Wizards""" + permissionsUseTeamReassignWizards: Boolean + + """Password Never Expires""" + permissionsPasswordNeverExpires: Boolean + + """Convert Leads""" + permissionsConvertLeads: Boolean + + """Manage Categories""" + permissionsManageCategories: Boolean + + """Drag-and-Drop Dashboard Builder""" + permissionsCanUseNewDashboardBuilder: Boolean + + """Manage Connected Apps""" + permissionsManageRemoteAccess: Boolean + + """Send Stay-in-Touch Requests""" + permissionsSendSitRequests: Boolean + + """Invite Customers To Chatter""" + permissionsChatterInviteExternalUsers: Boolean + + """Delete Activated Contracts""" + permissionsDeleteActivatedContract: Boolean + + """Manage Encryption Keys""" + permissionsManageEncryptionKeys: Boolean + + """Chatter Internal User""" + permissionsChatterInternalUser: Boolean + + """Edit HTML Templates""" + permissionsEditHtmlTemplates: Boolean + + """Manage Letterheads""" + permissionsEditBrandTemplates: Boolean + + """View Encrypted Data""" + permissionsViewEncryptedData: Boolean + + """Manage Public Documents""" + permissionsEditPublicDocuments: Boolean + + """View All Data""" + permissionsViewAllData: Boolean + + """Transfer Leads""" + permissionsTransferAnyLead: Boolean + + """Manage Leads""" + permissionsManageLeads: Boolean + + """Import Leads""" + permissionsImportLeads: Boolean + + """Activate Orders""" + permissionsActivateOrder: Boolean + + """Activate Contracts""" + permissionsActivateContract: Boolean + + """Report Builder""" + permissionsNewReportBuilder: Boolean + + """Transfer Record""" + permissionsTransferAnyEntity: Boolean + + """View Setup and Configuration""" + permissionsViewSetup: Boolean + + """Run Reports""" + permissionsRunReports: Boolean + + """Edit Read Only Fields""" + permissionsEditReadonlyFields: Boolean + + """Customize Application""" + permissionsCustomizeApplication: Boolean + + """Manage Published Solutions""" + permissionsManageSolutions: Boolean + + """Manage Salesforce Knowledge""" + permissionsManageKnowledge: Boolean + + """Manage Articles""" + permissionsEditKnowledge: Boolean + + """Mass Edits from Lists""" + permissionsMassInlineEdit: Boolean + + """Manage Cases""" + permissionsManageCases: Boolean + + """Modify All Data""" + permissionsModifyAllData: Boolean + + """Manage Public Templates""" + permissionsEditPublicTemplates: Boolean + + """Manage Public List Views""" + permissionsEditPublicFilters: Boolean + + """Manage Users""" + permissionsManageUsers: Boolean + + """Weekly Data Export""" + permissionsDataExport: Boolean + + """Import Personal Contacts""" + permissionsImportPersonal: Boolean + + """Export Reports""" + permissionsExportReport: Boolean + + """Edit Events""" + permissionsEditEvent: Boolean + + """Edit Tasks""" + permissionsEditTask: Boolean + + """Mass Email""" + permissionsEmailMass: Boolean + + """Send Email""" + permissionsEmailSingle: Boolean + + """Permission Set Label""" + label: String + + """Permission Set Name""" + name: String +} + +input SalesforceUpdatePermissionSetInput { + patch: SalesforcePermissionSetPatch! + + """The id of the PermissionSet to update.""" + id: String! +} + +type SalesforceUpdatePermissionSetPayload { + """PermissionSet updated by the mutation.""" + permissionSet: SalesforcePermissionSet! +} + +input SalesforceActionLinkTemplatePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """HTTP Headers""" + headers: String + + """HTTP Request Body""" + requestBody: String + + """Action URL""" + actionUrl: String + + """Label""" + label: String + + """Custom User Alias""" + userAlias: String + + """User Visibility""" + userVisibility: String + + """Default Link in Group""" + isGroupDefault: Boolean + + """Confirmation Required""" + isConfirmationRequired: Boolean + + """Position""" + position: Int + + """Action Type""" + linkType: String + + """HTTP Method""" + method: String + + """Label Key""" + labelKey: String +} + +input SalesforceUpdateActionLinkTemplateInput { + patch: SalesforceActionLinkTemplatePatch! + + """The id of the ActionLinkTemplate to update.""" + id: String! +} + +type SalesforceUpdateActionLinkTemplatePayload { + """ActionLinkTemplate updated by the mutation.""" + actionLinkTemplate: SalesforceActionLinkTemplate! +} + +input SalesforceProfilePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Description""" + description: String + + """View Roles and Role Hierarchy""" + permissionsViewRoles: Boolean + + """Manage Surveys""" + permissionsManageSurveys: Boolean + + """Show App Launcher in Communities""" + permissionsEnableCommunityAppLauncher: Boolean + + """Apex REST Services""" + permissionsApexRestServices: Boolean + + """Subscribe to Dashboards""" + permissionsSubscribeToLightningDashboards: Boolean + + """Subscribe to Reports: Set Running User""" + permissionsSubscribeReportsRunAsUser: Boolean + + """Lightning Console User""" + permissionsLightningConsoleAllowedForUser: Boolean + + """Subscribe to Reports: Add Recipients""" + permissionsSubscribeReportToOtherUsers: Boolean + + """View All Activities""" + permissionsViewAllActivities: Boolean + + """Allow Access to Customized Actions""" + permissionsUseWebLink: Boolean + + """IoT User""" + permissionsIotUser: Boolean + + """Change Dashboard Colors""" + permissionsChangeDashboardColors: Boolean + + """Pin Posts in Feeds""" + permissionsFeedPinning: Boolean + + """Allow sending of List Emails""" + permissionsListEmailSend: Boolean + + """Hide the Seen By List""" + permissionsHideReadByList: Boolean + + """Hide Option to Switch to Salesforce Classic""" + permissionsPreventClassicExperience: Boolean + + """Report Builder (Lightning Experience)""" + permissionsCreateReportInLightning: Boolean + + """Manage Certificates""" + permissionsManageCertificates: Boolean + + """Create and Update Second-Generation Packages""" + permissionsPackaging2: Boolean + + """Manage Health Check""" + permissionsManageHealthCheck: Boolean + + """View Health Check""" + permissionsViewHealthCheck: Boolean + + """Access Community Management""" + permissionsAccessCmc: Boolean + + """Show Company Name as Community Role""" + permissionsShowCompanyNameAsUserBadge: Boolean + + """View and Edit Converted Leads""" + permissionsAllowViewEditConvertedLeads: Boolean + + """Add People to Direct Messages""" + permissionsAddDirectMessageMembers: Boolean + + """Can Approve Feed Post and Comment""" + permissionsCanApproveFeedPost: Boolean + + """Remove People from Direct Messages""" + permissionsRemoveDirectMessageMembers: Boolean + + """Access to view Data Assessment""" + permissionsViewDataAssessment: Boolean + + """Campaign Influence""" + permissionsCampaignInfluence2: Boolean + + """Lightning Login User""" + permissionsAllowLightningLogin: Boolean + + """Manage All Private Reports and Dashboards""" + permissionsManagePvtRptsAndDashbds: Boolean + + """Subscribe to Reports""" + permissionsSubscribeToLightningReports: Boolean + + """Merge Topics""" + permissionsMergeTopics: Boolean + + """Moderate Community Users""" + permissionsModerateNetworkUsers: Boolean + + """Select Files from Salesforce""" + permissionsSelectFilesFromSalesforce: Boolean + + """Allow Inclusion of Code Snippets from UI""" + permissionsChatterComposeUiCodesnippet: Boolean + + """Manage Two-Factor Authentication in User Interface""" + permissionsDelegatedTwoFactor: Boolean + + """Import Custom Objects""" + permissionsImportCustomObjects: Boolean + + """Edit Posts on Records I Own""" + permissionsChatterEditOwnRecordPost: Boolean + + """Edit My Own Posts""" + permissionsChatterEditOwnPost: Boolean + + """Send announcement emails""" + permissionsSendAnnouncementEmails: Boolean + + """Manage Session Permission Set Activations""" + permissionsManageSessionPermissionSets: Boolean + + """Share internal Knowledge articles externally""" + permissionsShareInternalArticles: Boolean + + """Run Macros on Multiple Records""" + permissionsBulkMacrosAllowed: Boolean + + """Manage Macros Users Can't Undo""" + permissionsSubmitMacrosAllowed: Boolean + + """Configure Custom Recommendations""" + permissionsConfigCustomRecs: Boolean + + """Lightning Experience User""" + permissionsLightningExperienceUser: Boolean + + """Access Chatter For SharePoint""" + permissionsChatterForSharePoint: Boolean + + """Manage Two-Factor Authentication in API""" + permissionsManageTwoFactor: Boolean + + """Modify Secure Agents""" + permissionsModifySecureAgents: Boolean + + """Manage Unlisted Groups""" + permissionsManageUnlistedGroups: Boolean + + """Verify Answers to Chatter Questions""" + permissionsCanVerifyComment: Boolean + + """Manage Custom Permissions""" + permissionsManageCustomPermissions: Boolean + + """Manage Login Access Policies""" + permissionsManageLoginAccessPolicies: Boolean + + """Manage Password Policies""" + permissionsManagePasswordPolicies: Boolean + + """Manage Internal Users""" + permissionsManageInternalUsers: Boolean + + """Manage Sharing""" + permissionsManageSharing: Boolean + + """Manage IP Addresses""" + permissionsManageIpAddresses: Boolean + + """Manage Roles""" + permissionsManageRoles: Boolean + + """Assign Permission Sets""" + permissionsAssignPermissionSets: Boolean + + """Manage Profiles and Permission Sets""" + permissionsManageProfilesPermissionsets: Boolean + + """View Help Link""" + permissionsViewHelpLink: Boolean + + """Access Custom Mobile Apps""" + permissionsCustomMobileAppsAccess: Boolean + + """Manage Promoted Search Terms""" + permissionsManageSearchPromotionRules: Boolean + + """Access Libraries""" + permissionsContentWorkspaces: Boolean + + """Allow View Knowledge""" + permissionsAllowViewKnowledge: Boolean + + """Use Identity Connect""" + permissionsIdentityConnect: Boolean + + """Use Identity Features""" + permissionsIdentityEnabled: Boolean + + """Assign Topics""" + permissionsAssignTopics: Boolean + + """Create Topics""" + permissionsCreateTopics: Boolean + + """Edit Topics""" + permissionsEditTopics: Boolean + + """Delete Topics""" + permissionsDeleteTopics: Boolean + + """Two-Factor Authentication for API Logins""" + permissionsTwoFactorApi: Boolean + + """Sales Console""" + permissionsSalesConsole: Boolean + + """Manage Communities""" + permissionsGovernNetworks: Boolean + + """Enable Work.com""" + permissionsWorkDotComUserPerm: Boolean + + """Create and Customize List Views""" + permissionsCreateCustomizeFilters: Boolean + + """Enable Work.com Calibration""" + permissionsWorkCalibrationUser: Boolean + + """Connect Organization to Environment Hub""" + permissionsConnectOrgToEnvironmentHub: Boolean + + """Knowledge One""" + permissionsAllowUniversalSearch: Boolean + + """View All Users""" + permissionsViewAllUsers: Boolean + + """Edit My Reports""" + permissionsEditMyReports: Boolean + + """Edit My Dashboards""" + permissionsEditMyDashboards: Boolean + + """Manage Reports in Public Folders""" + permissionsManageReportsInPubFolders: Boolean + + """View Reports in Public Folders""" + permissionsViewPublicReports: Boolean + + """Create Report Folders""" + permissionsCreateReportFolders: Boolean + + """Create and Customize Reports""" + permissionsCreateCustomizeReports: Boolean + + """Manage Dashboards in Public Folders""" + permissionsManageDashbdsInPubFolders: Boolean + + """View Dashboards in Public Folders""" + permissionsViewPublicDashboards: Boolean + + """Create Dashboard Folders""" + permissionsCreateDashboardFolders: Boolean + + """Create and Customize Dashboards""" + permissionsCreateCustomizeDashboards: Boolean + + """Run Flows""" + permissionsRunFlow: Boolean + + """Manage Auth. Providers""" + permissionsManageAuthProviders: Boolean + + """Create and Set Up Communities""" + permissionsManageNetworks: Boolean + + """View Event Log Files""" + permissionsViewEventLogFiles: Boolean + + """Two-Factor Authentication for User Interface Logins""" + permissionsForceTwoFactor: Boolean + + """Create Public Links""" + permissionsChatterFileLink: Boolean + + """Email-Based Identity Verification Option""" + permissionsAllowEmailIc: Boolean + + """Manage Chatter Messages and Direct Messages""" + permissionsManageChatterMessages: Boolean + + """Email Administration""" + permissionsEmailAdministration: Boolean + + """Manage Email Templates""" + permissionsEmailTemplateManagement: Boolean + + """Manage Knowledge Article Import/Export""" + permissionsManageKnowledgeImportExport: Boolean + + """Insert System Field Values for Chatter Feeds""" + permissionsCanInsertFeedSystemFields: Boolean + + """Require Flow User Feature License""" + permissionsFlowUflRequired: Boolean + + """Reset User Passwords and Unlock Users""" + permissionsResetPasswords: Boolean + + """Moderate Chatter""" + permissionsModerateChatter: Boolean + + """View My Team's Dashboards""" + permissionsViewMyTeamsDashboards: Boolean + + """Manage Flow""" + permissionsManageInteraction: Boolean + + """Show Custom Sidebar On All Pages""" + permissionsCustomSidebarOnAllPages: Boolean + + """Manage Dynamic Dashboards""" + permissionsManageDynamicDashboards: Boolean + + """Manage Business Hours Holidays""" + permissionsManageBusinessHourHolidays: Boolean + + """Schedule Reports""" + permissionsScheduleReports: Boolean + + """Manage Reporting Snapshots""" + permissionsManageAnalyticSnapshots: Boolean + + """Manage Lightning Sync""" + permissionsManageExchangeConfig: Boolean + + """Manage record types and layouts for Files""" + permissionsManageContentTypes: Boolean + + """Manage Content Properties""" + permissionsManageContentProperties: Boolean + + """Manage Content Permissions""" + permissionsManageContentPermissions: Boolean + + """Create Libraries""" + permissionsCreateWorkspaces: Boolean + + """Manage Salesforce CRM Content""" + permissionsContentAdministrator: Boolean + + """Transfer Cases""" + permissionsTransferAnyCase: Boolean + + """Edit Case Comments""" + permissionsEditCaseComments: Boolean + + """Manage Custom Report Types""" + permissionsManageCustomReportTypes: Boolean + + """API Enabled""" + permissionsApiEnabled: Boolean + + """Manage Mobile Configurations""" + permissionsManageMobile: Boolean + + """Author Apex""" + permissionsAuthorApex: Boolean + + """Manage Data Categories""" + permissionsManageDataCategories: Boolean + + """View Data Categories""" + permissionsViewDataCategories: Boolean + + """Create Content Deliveries""" + permissionsDistributeFromPersWksp: Boolean + + """Manage Data Integrations""" + permissionsManageDataIntegrations: Boolean + + """Send Outbound Messages""" + permissionsEnableNotifications: Boolean + + """Manage Email Client Configurations""" + permissionsManageEmailClientConfig: Boolean + + """View Content in Portals""" + permissionsViewContent: Boolean + + """Manage Synonyms""" + permissionsManageSynonyms: Boolean + + """Manage Call Centers""" + permissionsManageCallCenters: Boolean + + """Import Solutions""" + permissionsSolutionImport: Boolean + + """Bulk API Hard Delete""" + permissionsBulkApiHardDelete: Boolean + + """Create AppExchange Packages""" + permissionsCreateMultiforce: Boolean + + """Edit Opportunity Product Sales Price""" + permissionsEditOppLineItemUnitPrice: Boolean + + """Create and Own New Chatter Groups""" + permissionsChatterOwnGroups: Boolean + + """Upload AppExchange Packages""" + permissionsPublishMultiforce: Boolean + + """Download AppExchange Packages""" + permissionsInstallMultiforce: Boolean + + """Edit Activated Orders""" + permissionsEditActivatedOrders: Boolean + + """Use Team Reassignment Wizards""" + permissionsUseTeamReassignWizards: Boolean + + """Password Never Expires""" + permissionsPasswordNeverExpires: Boolean + + """Convert Leads""" + permissionsConvertLeads: Boolean + + """Manage Categories""" + permissionsManageCategories: Boolean + + """Drag-and-Drop Dashboard Builder""" + permissionsCanUseNewDashboardBuilder: Boolean + + """Manage Connected Apps""" + permissionsManageRemoteAccess: Boolean + + """Send Stay-in-Touch Requests""" + permissionsSendSitRequests: Boolean + + """Invite Customers To Chatter""" + permissionsChatterInviteExternalUsers: Boolean + + """Delete Activated Contracts""" + permissionsDeleteActivatedContract: Boolean + + """Manage Encryption Keys""" + permissionsManageEncryptionKeys: Boolean + + """Chatter Internal User""" + permissionsChatterInternalUser: Boolean + + """Edit HTML Templates""" + permissionsEditHtmlTemplates: Boolean + + """Manage Letterheads""" + permissionsEditBrandTemplates: Boolean + + """View Encrypted Data""" + permissionsViewEncryptedData: Boolean + + """Manage Public Documents""" + permissionsEditPublicDocuments: Boolean + + """View All Data""" + permissionsViewAllData: Boolean + + """Transfer Leads""" + permissionsTransferAnyLead: Boolean + + """Manage Leads""" + permissionsManageLeads: Boolean + + """Import Leads""" + permissionsImportLeads: Boolean + + """Activate Orders""" + permissionsActivateOrder: Boolean + + """Activate Contracts""" + permissionsActivateContract: Boolean + + """Report Builder""" + permissionsNewReportBuilder: Boolean + + """Transfer Record""" + permissionsTransferAnyEntity: Boolean + + """View Setup and Configuration""" + permissionsViewSetup: Boolean + + """Run Reports""" + permissionsRunReports: Boolean + + """Edit Read Only Fields""" + permissionsEditReadonlyFields: Boolean + + """Customize Application""" + permissionsCustomizeApplication: Boolean + + """Manage Published Solutions""" + permissionsManageSolutions: Boolean + + """Manage Salesforce Knowledge""" + permissionsManageKnowledge: Boolean + + """Manage Articles""" + permissionsEditKnowledge: Boolean + + """Mass Edits from Lists""" + permissionsMassInlineEdit: Boolean + + """Manage Cases""" + permissionsManageCases: Boolean + + """Modify All Data""" + permissionsModifyAllData: Boolean + + """Manage Public Templates""" + permissionsEditPublicTemplates: Boolean + + """Manage Public List Views""" + permissionsEditPublicFilters: Boolean + + """Manage Users""" + permissionsManageUsers: Boolean + + """Weekly Data Export""" + permissionsDataExport: Boolean + + """Import Personal Contacts""" + permissionsImportPersonal: Boolean + + """Export Reports""" + permissionsExportReport: Boolean + + """Edit Events""" + permissionsEditEvent: Boolean + + """Edit Tasks""" + permissionsEditTask: Boolean + + """Mass Email""" + permissionsEmailMass: Boolean + + """Send Email""" + permissionsEmailSingle: Boolean + + """Name""" + name: String +} + +input SalesforceUpdateProfileInput { + patch: SalesforceProfilePatch! + + """The id of the Profile to update.""" + id: String! +} + +type SalesforceUpdateProfilePayload { + """Profile updated by the mutation.""" + profile: SalesforceProfile! +} + +input SalesforceAccountPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """D&B Company ID""" + dandbCompanyId: String + + """SIC Description""" + sicDesc: String + + """Year Started""" + yearStarted: String + + """NAICS Description""" + naicsDesc: String + + """NAICS Code""" + naicsCode: String + + """Tradestyle""" + tradestyle: String + + """D-U-N-S Number""" + dunsNumber: String + + """Account Source""" + accountSource: String + + """Clean Status""" + cleanStatus: String + + """Data.com Key""" + jigsaw: String + + """Owner ID""" + ownerId: String + + """Account Site""" + site: String + + """Account Rating""" + rating: String + + """Account Description""" + description: String + + """Ticker Symbol""" + tickerSymbol: String + + """Ownership""" + ownership: String + + """Employees""" + numberOfEmployees: Int + + """Annual Revenue""" + annualRevenue: Float + + """Industry""" + industry: String + + """SIC Code""" + sic: String + + """Website""" + website: String + + """Account Number""" + accountNumber: String + + """Account Fax""" + fax: String + + """Account Phone""" + phone: String + + """Shipping Geocode Accuracy""" + shippingGeocodeAccuracy: String + + """Shipping Longitude""" + shippingLongitude: Float + + """Shipping Latitude""" + shippingLatitude: Float + + """Shipping Country""" + shippingCountry: String + + """Shipping Zip/Postal Code""" + shippingPostalCode: String + + """Shipping State/Province""" + shippingState: String + + """Shipping City""" + shippingCity: String + + """Shipping Street""" + shippingStreet: String + + """Billing Geocode Accuracy""" + billingGeocodeAccuracy: String + + """Billing Longitude""" + billingLongitude: Float + + """Billing Latitude""" + billingLatitude: Float + + """Billing Country""" + billingCountry: String + + """Billing Zip/Postal Code""" + billingPostalCode: String + + """Billing State/Province""" + billingState: String + + """Billing City""" + billingCity: String + + """Billing Street""" + billingStreet: String + + """Parent Account ID""" + parentId: String + + """Account Type""" + type: String + + """Account Name""" + name: String +} + +input SalesforceUpdateAccountInput { + patch: SalesforceAccountPatch! + + """The id of the Account to update.""" + id: String! +} + +type SalesforceUpdateAccountPayload { + """Account updated by the mutation.""" + account: SalesforceAccount! +} + +input SalesforceOpportunityContactRolePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Primary""" + isPrimary: Boolean + + """Role""" + role: String + + """Contact ID""" + contactId: String +} + +input SalesforceUpdateOpportunityContactRoleInput { + patch: SalesforceOpportunityContactRolePatch! + + """The id of the OpportunityContactRole to update.""" + id: String! +} + +type SalesforceUpdateOpportunityContactRolePayload { + """OpportunityContactRole updated by the mutation.""" + opportunityContactRole: SalesforceOpportunityContactRole! +} + +input SalesforceUserRolePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Developer Name""" + developerName: String + + """User ID""" + forecastUserId: String + + """Case Access Level for Account Owner""" + caseAccessForAccountOwner: String + + """Opportunity Access Level for Account Owner""" + opportunityAccessForAccountOwner: String + + """Description""" + rollupDescription: String + + """Parent Role ID""" + parentRoleId: String + + """Name""" + name: String +} + +input SalesforceUpdateUserRoleInput { + patch: SalesforceUserRolePatch! + + """The id of the UserRole to update.""" + id: String! +} + +type SalesforceUpdateUserRolePayload { + """UserRole updated by the mutation.""" + userRole: SalesforceUserRole! +} + +input SalesforceAssetRelationshipPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Relationship Type""" + relationshipType: String + + """To Date""" + toDate: String + + """From Date""" + fromDate: String + + """Asset ID""" + relatedAssetId: String +} + +input SalesforceUpdateAssetRelationshipInput { + patch: SalesforceAssetRelationshipPatch! + + """The id of the AssetRelationship to update.""" + id: String! +} + +type SalesforceUpdateAssetRelationshipPayload { + """AssetRelationship updated by the mutation.""" + assetRelationship: SalesforceAssetRelationship! +} + +input SalesforceCollaborationGroupMemberPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Notification Frequency""" + notificationFrequency: String + + """Group Member Role""" + collaborationRole: String +} + +input SalesforceUpdateCollaborationGroupMemberInput { + patch: SalesforceCollaborationGroupMemberPatch! + + """The id of the CollaborationGroupMember to update.""" + id: String! +} + +type SalesforceUpdateCollaborationGroupMemberPayload { + """CollaborationGroupMember updated by the mutation.""" + collaborationGroupMember: SalesforceCollaborationGroupMember! +} + +input SalesforceUserPreferencePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Value""" + value: String + + """Preference""" + preference: String + + """User ID""" + userId: String +} + +input SalesforceUpdateUserPreferenceInput { + patch: SalesforceUserPreferencePatch! + + """The id of the UserPreference to update.""" + id: String! +} + +type SalesforceUpdateUserPreferencePayload { + """UserPreference updated by the mutation.""" + userPreference: SalesforceUserPreference! +} + +input SalesforceMailmergeTemplatePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Flash Injection was detected in the attachment""" + securityOptionsAttachmentHasFlash: Boolean + + """Attachment has been scanned for Flash Injection""" + securityOptionsAttachmentScannedforFlash: Boolean + + """XSS threat was detected in the attachment""" + securityOptionsAttachmentHasXssThreat: Boolean + + """Attachment has been scanned for XSS""" + securityOptionsAttachmentScannedForXss: Boolean + + """Description""" + description: String + + """Name""" + name: String +} + +input SalesforceUpdateMailmergeTemplateInput { + patch: SalesforceMailmergeTemplatePatch! + + """The id of the MailmergeTemplate to update.""" + id: String! +} + +type SalesforceUpdateMailmergeTemplatePayload { + """MailmergeTemplate updated by the mutation.""" + mailmergeTemplate: SalesforceMailmergeTemplate! +} + +input SalesforceCaseTeamMemberPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Team Role ID""" + teamRoleId: String +} + +input SalesforceUpdateCaseTeamMemberInput { + patch: SalesforceCaseTeamMemberPatch! + + """The id of the CaseTeamMember to update.""" + id: String! +} + +type SalesforceUpdateCaseTeamMemberPayload { + """CaseTeamMember updated by the mutation.""" + caseTeamMember: SalesforceCaseTeamMember! +} + +input SalesforceContentFolderMemberPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent Content Folder ID""" + parentContentFolderId: String +} + +input SalesforceUpdateContentFolderMemberInput { + patch: SalesforceContentFolderMemberPatch! + + """The id of the ContentFolderMember to update.""" + id: String! +} + +type SalesforceUpdateContentFolderMemberPayload { + """ContentFolderMember updated by the mutation.""" + contentFolderMember: SalesforceContentFolderMember! +} + +input SalesforceContentWorkspacePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Unique Name""" + developerName: String + + """Description""" + description: String + + """Name""" + name: String +} + +input SalesforceUpdateContentWorkspaceInput { + patch: SalesforceContentWorkspacePatch! + + """The id of the ContentWorkspace to update.""" + id: String! +} + +type SalesforceUpdateContentWorkspacePayload { + """ContentWorkspace updated by the mutation.""" + contentWorkspace: SalesforceContentWorkspace! +} + +input SalesforceContentWorkspaceMemberPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Library Permission ID""" + contentWorkspacePermissionId: String +} + +input SalesforceUpdateContentWorkspaceMemberInput { + patch: SalesforceContentWorkspaceMemberPatch! + + """The id of the ContentWorkspaceMember to update.""" + id: String! +} + +type SalesforceUpdateContentWorkspaceMemberPayload { + """ContentWorkspaceMember updated by the mutation.""" + contentWorkspaceMember: SalesforceContentWorkspaceMember! +} + +input SalesforceApexTestSuitePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Test Suite Name""" + testSuiteName: String +} + +input SalesforceUpdateApexTestSuiteInput { + patch: SalesforceApexTestSuitePatch! + + """The id of the ApexTestSuite to update.""" + id: String! +} + +type SalesforceUpdateApexTestSuitePayload { + """ApexTestSuite updated by the mutation.""" + apexTestSuite: SalesforceApexTestSuite! +} + +input SalesforceTopicPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Description""" + description: String + + """Name""" + name: String +} + +input SalesforceUpdateTopicInput { + patch: SalesforceTopicPatch! + + """The id of the Topic to update.""" + id: String! +} + +type SalesforceUpdateTopicPayload { + """Topic updated by the mutation.""" + topic: SalesforceTopic! +} + +input SalesforceEmailTemplatePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Object Definition ID""" + relatedEntityType: String + + """UI Type""" + uiType: String + + """Markup""" + markup: String + + """API Version""" + apiVersion: Float + + """Email Body""" + body: String + + """HTML Value""" + htmlValue: String + + """Subject""" + subject: String + + """Description""" + description: String + + """Encoding""" + encoding: String + + """Available For Use""" + isActive: Boolean + + """Letterhead ID""" + brandTemplateId: String + + """Folder ID""" + folderId: String + + """Owner ID""" + ownerId: String + + """Template Unique Name""" + developerName: String + + """Email Template Name""" + name: String +} + +input SalesforceUpdateEmailTemplateInput { + patch: SalesforceEmailTemplatePatch! + + """The id of the EmailTemplate to update.""" + id: String! +} + +type SalesforceUpdateEmailTemplatePayload { + """EmailTemplate updated by the mutation.""" + emailTemplate: SalesforceEmailTemplate! +} + +input SalesforceContentDocumentPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Asset File ID""" + contentAssetId: String + + """File Privacy on Records""" + sharingPrivacy: String + + """Prevent others from sharing and unsharing""" + sharingOption: String + + """Description""" + description: String + + """Parent ID""" + parentId: String + + """Title""" + title: String + + """Owner ID""" + ownerId: String + + """Is Archived""" + isArchived: Boolean +} + +input SalesforceUpdateContentDocumentInput { + patch: SalesforceContentDocumentPatch! + + """The id of the ContentDocument to update.""" + id: String! +} + +type SalesforceUpdateContentDocumentPayload { + """ContentDocument updated by the mutation.""" + contentDocument: SalesforceContentDocument! +} + +input SalesforceContactPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Clean Status""" + cleanStatus: String + + """Data.com Key""" + jigsaw: String + + """Email Bounced Date""" + emailBouncedDate: String + + """Email Bounced Reason""" + emailBouncedReason: String + + """Owner ID""" + ownerId: String + + """Contact Description""" + description: String + + """Birthdate""" + birthdate: String + + """Lead Source""" + leadSource: String + + """Assistant's Name""" + assistantName: String + + """Department""" + department: String + + """Title""" + title: String + + """Email""" + email: String + + """Reports To ID""" + reportsToId: String + + """Asst. Phone""" + assistantPhone: String + + """Other Phone""" + otherPhone: String + + """Home Phone""" + homePhone: String + + """Mobile Phone""" + mobilePhone: String + + """Business Fax""" + fax: String + + """Business Phone""" + phone: String + + """Mailing Geocode Accuracy""" + mailingGeocodeAccuracy: String + + """Mailing Longitude""" + mailingLongitude: Float + + """Mailing Latitude""" + mailingLatitude: Float + + """Mailing Country""" + mailingCountry: String + + """Mailing Zip/Postal Code""" + mailingPostalCode: String + + """Mailing State/Province""" + mailingState: String + + """Mailing City""" + mailingCity: String + + """Mailing Street""" + mailingStreet: String + + """Other Geocode Accuracy""" + otherGeocodeAccuracy: String + + """Other Longitude""" + otherLongitude: Float + + """Other Latitude""" + otherLatitude: Float + + """Other Country""" + otherCountry: String + + """Other Zip/Postal Code""" + otherPostalCode: String + + """Other State/Province""" + otherState: String + + """Other City""" + otherCity: String + + """Other Street""" + otherStreet: String + + """Salutation""" + salutation: String + + """First Name""" + firstName: String + + """Last Name""" + lastName: String + + """Account ID""" + accountId: String +} + +input SalesforceUpdateContactInput { + patch: SalesforceContactPatch! + + """The id of the Contact to update.""" + id: String! +} + +type SalesforceUpdateContactPayload { + """Contact updated by the mutation.""" + contact: SalesforceContact! +} + +input SalesforceAuraDefinitionPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Source""" + source: String + + """Format""" + format: String + + """Definition Type""" + defType: String +} + +input SalesforceUpdateAuraDefinitionInput { + patch: SalesforceAuraDefinitionPatch! + + """The id of the AuraDefinition to update.""" + id: String! +} + +type SalesforceUpdateAuraDefinitionPayload { + """AuraDefinition updated by the mutation.""" + auraDefinition: SalesforceAuraDefinition! +} + +input SalesforceSecurityCustomBaselinePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Is Default Baseline""" + isDefault: Boolean + + """Baseline""" + baseline: String + + """Label""" + masterLabel: String + + """Master Language""" + language: String + + """Name""" + developerName: String +} + +input SalesforceUpdateSecurityCustomBaselineInput { + patch: SalesforceSecurityCustomBaselinePatch! + + """The id of the SecurityCustomBaseline to update.""" + id: String! +} + +type SalesforceUpdateSecurityCustomBaselinePayload { + """SecurityCustomBaseline updated by the mutation.""" + securityCustomBaseline: SalesforceSecurityCustomBaseline! +} + +input SalesforceContentVersionPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """External Data Source ID""" + externalDataSourceId: String + + """External Document Info2""" + externalDocumentInfo2: String + + """External Document Info1""" + externalDocumentInfo1: String + + """Version Data""" + versionData: String + + """Tags""" + tagCsv: String + + """Owner ID""" + ownerId: String + + """File Privacy on Records""" + sharingPrivacy: String + + """Prevent others from sharing and unsharing""" + sharingOption: String + + """Reason For Change""" + reasonForChange: String + + """Description""" + description: String + + """Title""" + title: String + + """Content URL""" + contentUrl: String +} + +input SalesforceUpdateContentVersionInput { + patch: SalesforceContentVersionPatch! + + """The id of the ContentVersion to update.""" + id: String! +} + +type SalesforceUpdateContentVersionPayload { + """ContentVersion updated by the mutation.""" + contentVersion: SalesforceContentVersion! +} + +input SalesforceCampaignMemberStatusPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Responded""" + hasResponded: Boolean + + """Is Default""" + isDefault: Boolean + + """Sort Order""" + sortOrder: Int + + """Member Status""" + label: String +} + +input SalesforceUpdateCampaignMemberStatusInput { + patch: SalesforceCampaignMemberStatusPatch! + + """The id of the CampaignMemberStatus to update.""" + id: String! +} + +type SalesforceUpdateCampaignMemberStatusPayload { + """CampaignMemberStatus updated by the mutation.""" + campaignMemberStatus: SalesforceCampaignMemberStatus! +} + +input SalesforceEventPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Reminder Set""" + isReminderSet: Boolean + + """Reminder Date/Time""" + reminderDateTime: String + + """Recurrence Month of Year""" + recurrenceMonthOfYear: String + + """Recurrence Instance""" + recurrenceInstance: String + + """Recurrence Day of Month""" + recurrenceDayOfMonth: Int + + """Recurrence Day of Week Mask""" + recurrenceDayOfWeekMask: Int + + """Recurrence Interval""" + recurrenceInterval: Int + + """Recurrence Type""" + recurrenceType: String + + """Recurrence Time Zone""" + recurrenceTimeZoneSidKey: String + + """Recurrence End""" + recurrenceEndDateOnly: String + + """Recurrence Start""" + recurrenceStartDateTime: String + + """Show Time As""" + showAs: String + + """Private""" + isPrivate: Boolean + + """Assigned To ID""" + ownerId: String + + """Description""" + description: String + + """End Date Time""" + endDateTime: String + + """Start Date Time""" + startDateTime: String + + """Duration""" + durationInMinutes: Int + + """Due Date Only""" + activityDate: String + + """Due Date Time""" + activityDateTime: String + + """All-Day Event""" + isAllDayEvent: Boolean + + """Location""" + location: String + + """Subject""" + subject: String + + """Related To ID""" + whatId: String + + """Name ID""" + whoId: String +} + +input SalesforceUpdateEventInput { + patch: SalesforceEventPatch! + + """The id of the Event to update.""" + id: String! +} + +type SalesforceUpdateEventPayload { + """Event updated by the mutation.""" + event: SalesforceEvent! +} + +input SalesforceLeadCleanInfoPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Company D-U-N-S Number is Flagged Wrong""" + isFlaggedWrongCompanyDunsNumber: Boolean + + """Company Name is Flagged Wrong""" + isFlaggedWrongCompanyName: Boolean + + """Industry is Flagged Wrong""" + isFlaggedWrongIndustry: Boolean + + """Number of Employees is Flagged Wrong""" + isFlaggedWrongNumberOfEmployees: Boolean + + """Annual Revenue is Flagged Wrong""" + isFlaggedWrongAnnualRevenue: Boolean + + """Title is Flagged Wrong""" + isFlaggedWrongTitle: Boolean + + """Address is Flagged Wrong""" + isFlaggedWrongAddress: Boolean + + """Phone is Flagged Wrong""" + isFlaggedWrongPhone: Boolean + + """Email is Flagged Wrong""" + isFlaggedWrongEmail: Boolean + + """Name is Flagged Wrong""" + isFlaggedWrongName: Boolean + + """D&B Company D-U-N-S Number is Reviewed""" + isReviewedDandBCompanyDunsNumber: Boolean + + """Company D-U-N-S Number is Reviewed""" + isReviewedCompanyDunsNumber: Boolean + + """Company Name is Reviewed""" + isReviewedCompanyName: Boolean + + """Industry is Reviewed""" + isReviewedIndustry: Boolean + + """Number of Employees is Reviewed""" + isReviewedNumberOfEmployees: Boolean + + """Annual Revenue is Reviewed""" + isReviewedAnnualRevenue: Boolean + + """Title is Reviewed""" + isReviewedTitle: Boolean + + """Address is Reviewed""" + isReviewedAddress: Boolean + + """Phone is Reviewed""" + isReviewedPhone: Boolean + + """Email is Reviewed""" + isReviewedEmail: Boolean + + """Name is Reviewed""" + isReviewedName: Boolean + + """Contact Status in Salesforce""" + isInactive: Boolean + + """Lead Clean Info Name""" + name: String +} + +input SalesforceUpdateLeadCleanInfoInput { + patch: SalesforceLeadCleanInfoPatch! + + """The id of the LeadCleanInfo to update.""" + id: String! +} + +type SalesforceUpdateLeadCleanInfoPayload { + """LeadCleanInfo updated by the mutation.""" + leadCleanInfo: SalesforceLeadCleanInfo! +} + +input SalesforceSearchPromotionRulePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Term""" + query: String +} + +input SalesforceUpdateSearchPromotionRuleInput { + patch: SalesforceSearchPromotionRulePatch! + + """The id of the SearchPromotionRule to update.""" + id: String! +} + +type SalesforceUpdateSearchPromotionRulePayload { + """SearchPromotionRule updated by the mutation.""" + searchPromotionRule: SalesforceSearchPromotionRule! +} + +input SalesforceExternalDataUserAuthPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Auth. Provider ID""" + authProviderId: String + + """Password""" + password: String + + """Username""" + username: String + + """Authentication Protocol""" + protocol: String + + """User ID""" + userId: String +} + +input SalesforceUpdateExternalDataUserAuthInput { + patch: SalesforceExternalDataUserAuthPatch! + + """The id of the ExternalDataUserAuth to update.""" + id: String! +} + +type SalesforceUpdateExternalDataUserAuthPayload { + """ExternalDataUserAuth updated by the mutation.""" + externalDataUserAuth: SalesforceExternalDataUserAuth! +} + +input SalesforceAnnouncementPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Is Announcement Archived""" + isArchived: Boolean + + """Expiration Date""" + expirationDate: String +} + +input SalesforceUpdateAnnouncementInput { + patch: SalesforceAnnouncementPatch! + + """The id of the Announcement to update.""" + id: String! +} + +type SalesforceUpdateAnnouncementPayload { + """Announcement updated by the mutation.""" + announcement: SalesforceAnnouncement! +} + +input SalesforceUserAppMenuCustomizationPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Sort Order""" + sortOrder: Int + + """Application ID""" + applicationId: String + + """Owner ID""" + ownerId: String +} + +input SalesforceUpdateUserAppMenuCustomizationInput { + patch: SalesforceUserAppMenuCustomizationPatch! + + """The id of the UserAppMenuCustomization to update.""" + id: String! +} + +type SalesforceUpdateUserAppMenuCustomizationPayload { + """UserAppMenuCustomization updated by the mutation.""" + userAppMenuCustomization: SalesforceUserAppMenuCustomization! +} + +input SalesforceCaseContactRolePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Role""" + role: String + + """Contact ID""" + contactId: String +} + +input SalesforceUpdateCaseContactRoleInput { + patch: SalesforceCaseContactRolePatch! + + """The id of the CaseContactRole to update.""" + id: String! +} + +type SalesforceUpdateCaseContactRolePayload { + """CaseContactRole updated by the mutation.""" + caseContactRole: SalesforceCaseContactRole! +} + +input SalesforceUserPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Data.com Monthly Addition Limit""" + jigsawImportLimitOverride: Int + + """Default Notification Frequency when Joining Groups""" + defaultGroupNotificationFrequency: String + + """Chatter Email Highlights Frequency""" + digestFrequency: String + + """About Me""" + aboutMe: String + + """SAML Federation ID""" + federationIdentifier: String + + """Extension""" + extension: String + + """Call Center ID""" + callCenterId: String + + """HasCelebrationBadge""" + userPreferencesHasCelebrationBadge: Boolean + + """PreviewCustomTheme""" + userPreferencesPreviewCustomTheme: Boolean + + """SuppressEventSFXReminders""" + userPreferencesSuppressEventSfxReminders: Boolean + + """SuppressTaskSFXReminders""" + userPreferencesSuppressTaskSfxReminders: Boolean + + """ExcludeMailAppAttachments""" + userPreferencesExcludeMailAppAttachments: Boolean + + """FavoritesShowTopFavorites""" + userPreferencesFavoritesShowTopFavorites: Boolean + + """RecordHomeReservedWTShown""" + userPreferencesRecordHomeReservedWtShown: Boolean + + """RecordHomeSectionCollapseWTShown""" + userPreferencesRecordHomeSectionCollapseWtShown: Boolean + + """FavoritesWTShown""" + userPreferencesFavoritesWtShown: Boolean + + """CreateLEXAppsWTShown""" + userPreferencesCreateLexAppsWtShown: Boolean + + """GlobalNavGridMenuWTShown""" + userPreferencesGlobalNavGridMenuWtShown: Boolean + + """GlobalNavBarWTShown""" + userPreferencesGlobalNavBarWtShown: Boolean + + """HideBiggerPhotoCallout""" + userPreferencesHideBiggerPhotoCallout: Boolean + + """HideSfxWelcomeMat""" + userPreferencesHideSfxWelcomeMat: Boolean + + """HideLightningMigrationModal""" + userPreferencesHideLightningMigrationModal: Boolean + + """HideEndUserOnboardingAssistantModal""" + userPreferencesHideEndUserOnboardingAssistantModal: Boolean + + """PreviewLightning""" + userPreferencesPreviewLightning: Boolean + + """LightningExperiencePreferred""" + userPreferencesLightningExperiencePreferred: Boolean + + """ShowStreetAddressToGuestUsers""" + userPreferencesShowStreetAddressToGuestUsers: Boolean + + """ShowFaxToGuestUsers""" + userPreferencesShowFaxToGuestUsers: Boolean + + """ShowMobilePhoneToGuestUsers""" + userPreferencesShowMobilePhoneToGuestUsers: Boolean + + """ShowWorkPhoneToGuestUsers""" + userPreferencesShowWorkPhoneToGuestUsers: Boolean + + """ShowManagerToGuestUsers""" + userPreferencesShowManagerToGuestUsers: Boolean + + """ShowEmailToGuestUsers""" + userPreferencesShowEmailToGuestUsers: Boolean + + """CacheDiagnostics""" + userPreferencesCacheDiagnostics: Boolean + + """PathAssistantCollapsed""" + userPreferencesPathAssistantCollapsed: Boolean + + """DisableEndorsementEmail""" + userPreferencesDisableEndorsementEmail: Boolean + + """HideS1BrowserUI""" + userPreferencesHideS1BrowserUi: Boolean + + """DisableWorkEmail""" + userPreferencesDisableWorkEmail: Boolean + + """DisableFeedbackEmail""" + userPreferencesDisableFeedbackEmail: Boolean + + """ShowCountryToGuestUsers""" + userPreferencesShowCountryToGuestUsers: Boolean + + """ShowPostalCodeToGuestUsers""" + userPreferencesShowPostalCodeToGuestUsers: Boolean + + """ShowStateToGuestUsers""" + userPreferencesShowStateToGuestUsers: Boolean + + """ShowCityToGuestUsers""" + userPreferencesShowCityToGuestUsers: Boolean + + """ShowTitleToGuestUsers""" + userPreferencesShowTitleToGuestUsers: Boolean + + """ShowProfilePicToGuestUsers""" + userPreferencesShowProfilePicToGuestUsers: Boolean + + """ShowCountryToExternalUsers""" + userPreferencesShowCountryToExternalUsers: Boolean + + """ShowPostalCodeToExternalUsers""" + userPreferencesShowPostalCodeToExternalUsers: Boolean + + """ShowStateToExternalUsers""" + userPreferencesShowStateToExternalUsers: Boolean + + """ShowCityToExternalUsers""" + userPreferencesShowCityToExternalUsers: Boolean + + """ShowStreetAddressToExternalUsers""" + userPreferencesShowStreetAddressToExternalUsers: Boolean + + """ShowFaxToExternalUsers""" + userPreferencesShowFaxToExternalUsers: Boolean + + """ShowMobilePhoneToExternalUsers""" + userPreferencesShowMobilePhoneToExternalUsers: Boolean + + """ShowWorkPhoneToExternalUsers""" + userPreferencesShowWorkPhoneToExternalUsers: Boolean + + """ShowEmailToExternalUsers""" + userPreferencesShowEmailToExternalUsers: Boolean + + """ShowManagerToExternalUsers""" + userPreferencesShowManagerToExternalUsers: Boolean + + """ShowTitleToExternalUsers""" + userPreferencesShowTitleToExternalUsers: Boolean + + """DisableFileShareNotificationsForApi""" + userPreferencesDisableFileShareNotificationsForApi: Boolean + + """EnableAutoSubForFeeds""" + userPreferencesEnableAutoSubForFeeds: Boolean + + """DisableSharePostEmail""" + userPreferencesDisableSharePostEmail: Boolean + + """DisableBookmarkEmail""" + userPreferencesDisableBookmarkEmail: Boolean + + """JigsawListUser""" + userPreferencesJigsawListUser: Boolean + + """DisableMessageEmail""" + userPreferencesDisableMessageEmail: Boolean + + """SortFeedByComment""" + userPreferencesSortFeedByComment: Boolean + + """DisableLikeEmail""" + userPreferencesDisableLikeEmail: Boolean + + """DisCommentAfterLikeEmail""" + userPreferencesDisCommentAfterLikeEmail: Boolean + + """HideSecondChatterOnboardingSplash""" + userPreferencesHideSecondChatterOnboardingSplash: Boolean + + """HideChatterOnboardingSplash""" + userPreferencesHideChatterOnboardingSplash: Boolean + + """HideCSNDesktopTask""" + userPreferencesHideCsnDesktopTask: Boolean + + """DisMentionsCommentEmail""" + userPreferencesDisMentionsCommentEmail: Boolean + + """DisableMentionsPostEmail""" + userPreferencesDisableMentionsPostEmail: Boolean + + """HideCSNGetChatterMobileTask""" + userPreferencesHideCsnGetChatterMobileTask: Boolean + + """ApexPagesDeveloperMode""" + userPreferencesApexPagesDeveloperMode: Boolean + + """ContentEmailAsAndWhen""" + userPreferencesContentEmailAsAndWhen: Boolean + + """ContentNoEmail""" + userPreferencesContentNoEmail: Boolean + + """DisProfPostCommentEmail""" + userPreferencesDisProfPostCommentEmail: Boolean + + """DisableLaterCommentEmail""" + userPreferencesDisableLaterCommentEmail: Boolean + + """DisableChangeCommentEmail""" + userPreferencesDisableChangeCommentEmail: Boolean + + """DisableProfilePostEmail""" + userPreferencesDisableProfilePostEmail: Boolean + + """DisableFollowersEmail""" + userPreferencesDisableFollowersEmail: Boolean + + """DisableAllFeedsEmail""" + userPreferencesDisableAllFeedsEmail: Boolean + + """ReminderSoundOff""" + userPreferencesReminderSoundOff: Boolean + + """TaskRemindersCheckboxDefault""" + userPreferencesTaskRemindersCheckboxDefault: Boolean + + """EventRemindersCheckboxDefault""" + userPreferencesEventRemindersCheckboxDefault: Boolean + + """ActivityRemindersPopup""" + userPreferencesActivityRemindersPopup: Boolean + + """Allow Forecasting""" + forecastEnabled: Boolean + + """Work.com User""" + userPermissionsWorkDotComUserFeature: Boolean + + """Site.com Publisher User""" + userPermissionsSiteforcePublisherUser: Boolean + + """Site.com Contributor User""" + userPermissionsSiteforceContributorUser: Boolean + + """Data.com User""" + userPermissionsJigsawProspectingUser: Boolean + + """Service Cloud User""" + userPermissionsSupportUser: Boolean + + """Flow User""" + userPermissionsInteractionUser: Boolean + + """Knowledge User""" + userPermissionsKnowledgeUser: Boolean + + """Salesforce CRM Content User""" + userPermissionsSfContentUser: Boolean + + """Apex Mobile User""" + userPermissionsMobileUser: Boolean + + """Auto-login To Call Center""" + userPermissionsCallCenterAutoLogin: Boolean + + """Offline User""" + userPermissionsOfflineUser: Boolean + + """Marketing User""" + userPermissionsMarketingUser: Boolean + + """Manager ID""" + managerId: String + + """Delegated Approver ID""" + delegatedApproverId: String + + """Employee Number""" + employeeNumber: String + + """Language""" + languageLocaleKey: String + + """Profile ID""" + profileId: String + + """Email Encoding""" + emailEncodingKey: String + + """Admin Info Emails""" + receivesAdminInfoEmails: Boolean + + """Info Emails""" + receivesInfoEmails: Boolean + + """Locale""" + localeSidKey: String + + """Role ID""" + userRoleId: String + + """Time Zone""" + timeZoneSidKey: String + + """Active""" + isActive: Boolean + + """Nickname""" + communityNickname: String + + """Alias""" + alias: String + + """Cell""" + mobilePhone: String + + """Fax""" + fax: String + + """Phone""" + phone: String + + """Stay-in-Touch Email Note""" + stayInTouchNote: String + + """Stay-in-Touch Email Signature""" + stayInTouchSignature: String + + """Stay-in-Touch Email Subject""" + stayInTouchSubject: String + + """Email Signature""" + signature: String + + """Email Sender Name""" + senderName: String + + """Email Sender Address""" + senderEmail: String + + """StayInTouchReminder""" + emailPreferencesStayInTouchReminder: Boolean + + """AutoBccStayInTouch""" + emailPreferencesAutoBccStayInTouch: Boolean + + """AutoBcc""" + emailPreferencesAutoBcc: Boolean + + """Email""" + email: String + + """Geocode Accuracy""" + geocodeAccuracy: String + + """Longitude""" + longitude: Float + + """Latitude""" + latitude: Float + + """Country""" + country: String + + """Zip/Postal Code""" + postalCode: String + + """State/Province""" + state: String + + """City""" + city: String + + """Street""" + street: String + + """Title""" + title: String + + """Department""" + department: String + + """Division""" + division: String + + """Company Name""" + companyName: String + + """First Name""" + firstName: String + + """Last Name""" + lastName: String + + """Username""" + username: String +} + +input SalesforceUpdateUserInput { + patch: SalesforceUserPatch! + + """The id of the User to update.""" + id: String! +} + +type SalesforceUpdateUserPayload { + """User updated by the mutation.""" + user: SalesforceUser! +} + +input SalesforceBusinessHoursPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Time Zone""" + timeZoneSidKey: String + + """Saturday End""" + saturdayEndTime: String + + """Saturday Start""" + saturdayStartTime: String + + """Friday End""" + fridayEndTime: String + + """Friday Start""" + fridayStartTime: String + + """Thursday End""" + thursdayEndTime: String + + """Thursday Start""" + thursdayStartTime: String + + """Wednesday End""" + wednesdayEndTime: String + + """Wednesday Start""" + wednesdayStartTime: String + + """Tuesday End""" + tuesdayEndTime: String + + """Tuesday Start""" + tuesdayStartTime: String + + """Monday End""" + mondayEndTime: String + + """Monday Start""" + mondayStartTime: String + + """Sunday End""" + sundayEndTime: String + + """Sunday Start""" + sundayStartTime: String + + """Default Business Hours""" + isDefault: Boolean + + """Active""" + isActive: Boolean + + """Business Hours Name""" + name: String +} + +input SalesforceUpdateBusinessHoursInput { + patch: SalesforceBusinessHoursPatch! + + """The id of the BusinessHours to update.""" + id: String! +} + +type SalesforceUpdateBusinessHoursPayload { + """BusinessHours updated by the mutation.""" + businessHours: SalesforceBusinessHours! +} + +input SalesforceContentWorkspacePermissionPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Description""" + description: String + + """Organize File and Content Folder""" + permissionsOrganizeFileAndFolder: Boolean + + """Attach or Share Content""" + permissionsChatterSharing: Boolean + + """Deliver Content""" + permissionsDeliverContent: Boolean + + """Tag Content""" + permissionsTagContent: Boolean + + """Modify Comments""" + permissionsModifyComments: Boolean + + """Add Comment""" + permissionsAddComment: Boolean + + """View Comment""" + permissionsViewComments: Boolean + + """Feature Content""" + permissionsFeatureContent: Boolean + + """Delete Content""" + permissionsDeleteContent: Boolean + + """Archive Content""" + permissionsArchiveContent: Boolean + + """Add Content on Behalf of Others""" + permissionsAddContentObo: Boolean + + """Add Content""" + permissionsAddContent: Boolean + + """Manage Library""" + permissionsManageWorkspace: Boolean + + """Name""" + name: String +} + +input SalesforceUpdateContentWorkspacePermissionInput { + patch: SalesforceContentWorkspacePermissionPatch! + + """The id of the ContentWorkspacePermission to update.""" + id: String! +} + +type SalesforceUpdateContentWorkspacePermissionPayload { + """ContentWorkspacePermission updated by the mutation.""" + contentWorkspacePermission: SalesforceContentWorkspacePermission! +} + +input SalesforceMacroInstructionPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Sort Order""" + sortOrder: Int + + """Value Record ID""" + valueRecord: String + + """Value""" + value: String + + """Target""" + target: String + + """Operation""" + operation: String +} + +input SalesforceUpdateMacroInstructionInput { + patch: SalesforceMacroInstructionPatch! + + """The id of the MacroInstruction to update.""" + id: String! +} + +type SalesforceUpdateMacroInstructionPayload { + """MacroInstruction updated by the mutation.""" + macroInstruction: SalesforceMacroInstruction! +} + +input SalesforceDocumentAttachmentMapPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Attachment Sequence""" + documentSequence: Int + + """Document ID""" + documentId: String + + """Entity ID""" + parentId: String +} + +input SalesforceUpdateDocumentAttachmentMapInput { + patch: SalesforceDocumentAttachmentMapPatch! + + """The id of the DocumentAttachmentMap to update.""" + id: String! +} + +type SalesforceUpdateDocumentAttachmentMapPayload { + """DocumentAttachmentMap updated by the mutation.""" + documentAttachmentMap: SalesforceDocumentAttachmentMap! +} + +input SalesforceContractPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Description""" + description: String + + """Activated Date""" + activatedDate: String + + """Activated By ID""" + activatedById: String + + """Special Terms""" + specialTerms: String + + """Customer Signed Date""" + customerSignedDate: String + + """Customer Signed Title""" + customerSignedTitle: String + + """Customer Signed By ID""" + customerSignedId: String + + """Company Signed Date""" + companySignedDate: String + + """Company Signed By ID""" + companySignedId: String + + """Status""" + status: String + + """Owner ID""" + ownerId: String + + """Contract Term""" + contractTerm: Int + + """Billing Geocode Accuracy""" + billingGeocodeAccuracy: String + + """Billing Longitude""" + billingLongitude: Float + + """Billing Latitude""" + billingLatitude: Float + + """Billing Country""" + billingCountry: String + + """Billing Zip/Postal Code""" + billingPostalCode: String + + """Billing State/Province""" + billingState: String + + """Billing City""" + billingCity: String + + """Billing Street""" + billingStreet: String + + """Contract Start Date""" + startDate: String + + """Owner Expiration Notice""" + ownerExpirationNotice: String + + """Price Book ID""" + pricebook2Id: String + + """Account ID""" + accountId: String +} + +input SalesforceUpdateContractInput { + patch: SalesforceContractPatch! + + """The id of the Contract to update.""" + id: String! +} + +type SalesforceUpdateContractPayload { + """Contract updated by the mutation.""" + contract: SalesforceContract! +} + +input SalesforceCspTrustedSitePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Active""" + isActive: Boolean + + """Description""" + description: String + + """Trusted Site URL""" + endpointUrl: String + + """Label""" + masterLabel: String + + """Master Language""" + language: String + + """Trusted Site Name""" + developerName: String +} + +input SalesforceUpdateCspTrustedSiteInput { + patch: SalesforceCspTrustedSitePatch! + + """The id of the CspTrustedSite to update.""" + id: String! +} + +type SalesforceUpdateCspTrustedSitePayload { + """CspTrustedSite updated by the mutation.""" + cspTrustedSite: SalesforceCspTrustedSite! +} + +input SalesforceEmailMessageRelationPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Relation ID""" + relationId: String +} + +input SalesforceUpdateEmailMessageRelationInput { + patch: SalesforceEmailMessageRelationPatch! + + """The id of the EmailMessageRelation to update.""" + id: String! +} + +type SalesforceUpdateEmailMessageRelationPayload { + """EmailMessageRelation updated by the mutation.""" + emailMessageRelation: SalesforceEmailMessageRelation! +} + +input SalesforceOrgWideEmailAddressPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Allow All Profiles""" + isAllowAllProfiles: Boolean + + """Display Name""" + displayName: String + + """Email Address""" + address: String +} + +input SalesforceUpdateOrgWideEmailAddressInput { + patch: SalesforceOrgWideEmailAddressPatch! + + """The id of the OrgWideEmailAddress to update.""" + id: String! +} + +type SalesforceUpdateOrgWideEmailAddressPayload { + """OrgWideEmailAddress updated by the mutation.""" + orgWideEmailAddress: SalesforceOrgWideEmailAddress! +} + +input SalesforceEmailServicesFunctionPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Convert Text Attachments to Binary Attachments""" + isTextAttachmentsAsBinary: Boolean + + """Route Error Emails to This Email Address""" + errorRoutingAddress: String + + """Enable Error Routing""" + isErrorRoutingEnabled: Boolean + + """Unauthorized Sender Action""" + authorizationFailureAction: String + + """Unauthenticated Sender Action""" + authenticationFailureAction: String + + """Deactivated Email Address Action""" + addressInactiveAction: String + + """Deactivated Email Service Action""" + functionInactiveAction: String + + """Over Email Rate Limit Action""" + overLimitAction: String + + """Class ID""" + apexClassId: String + + """Accept Attachments""" + attachmentOption: String + + """TLS Required""" + isTlsRequired: Boolean + + """Advanced Email Security Settings""" + isAuthenticationRequired: Boolean + + """Accept Email From""" + authorizedSenders: String + + """Email Service Name""" + functionName: String + + """Active""" + isActive: Boolean +} + +input SalesforceUpdateEmailServicesFunctionInput { + patch: SalesforceEmailServicesFunctionPatch! + + """The id of the EmailServicesFunction to update.""" + id: String! +} + +type SalesforceUpdateEmailServicesFunctionPayload { + """EmailServicesFunction updated by the mutation.""" + emailServicesFunction: SalesforceEmailServicesFunction! +} + +input SalesforceProduct2Patch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Product SKU""" + stockKeepingUnit: String + + """Quantity Unit Of Measure""" + quantityUnitOfMeasure: String + + """Display URL""" + displayUrl: String + + """External ID""" + externalId: String + + """External Data Source ID""" + externalDataSourceId: String + + """Product Family""" + family: String + + """Active""" + isActive: Boolean + + """Product Description""" + description: String + + """Product Code""" + productCode: String + + """Product Name""" + name: String +} + +input SalesforceUpdateProduct2Input { + patch: SalesforceProduct2Patch! + + """The id of the Product2 to update.""" + id: String! +} + +type SalesforceUpdateProduct2Payload { + """Product2 updated by the mutation.""" + product2: SalesforceProduct2! +} + +input SalesforceQuickTextSharePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Object Access""" + accessLevel: String +} + +input SalesforceUpdateQuickTextShareInput { + patch: SalesforceQuickTextSharePatch! + + """The id of the QuickTextShare to update.""" + id: String! +} + +type SalesforceUpdateQuickTextSharePayload { + """QuickTextShare updated by the mutation.""" + quickTextShare: SalesforceQuickTextShare! +} + +input SalesforceFolderPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Read Only""" + isReadonly: Boolean + + """Access Type""" + accessType: String + + """Folder Unique Name""" + developerName: String + + """Name""" + name: String +} + +input SalesforceUpdateFolderInput { + patch: SalesforceFolderPatch! + + """The id of the Folder to update.""" + id: String! +} + +type SalesforceUpdateFolderPayload { + """Folder updated by the mutation.""" + folder: SalesforceFolder! +} + +input SalesforceApexTestResultPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Run Time""" + runTime: Int + + """ApexTestRunResult ID""" + apexTestRunResultId: String + + """Log ID""" + apexLogId: String + + """Apex Test Queue Item ID""" + queueItemId: String + + """Apex Job ID""" + asyncApexJobId: String + + """Stack Trace""" + stackTrace: String + + """Error Message""" + message: String + + """Method Name""" + methodName: String + + """Class ID""" + apexClassId: String + + """Pass/Fail""" + outcome: String + + """Time Started""" + testTimestamp: String +} + +input SalesforceUpdateApexTestResultInput { + patch: SalesforceApexTestResultPatch! + + """The id of the ApexTestResult to update.""" + id: String! +} + +type SalesforceUpdateApexTestResultPayload { + """ApexTestResult updated by the mutation.""" + apexTestResult: SalesforceApexTestResult! +} + +input SalesforceOrgDeleteRequestSharePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Object Access""" + accessLevel: String +} + +input SalesforceUpdateOrgDeleteRequestShareInput { + patch: SalesforceOrgDeleteRequestSharePatch! + + """The id of the OrgDeleteRequestShare to update.""" + id: String! +} + +type SalesforceUpdateOrgDeleteRequestSharePayload { + """OrgDeleteRequestShare updated by the mutation.""" + orgDeleteRequestShare: SalesforceOrgDeleteRequestShare! +} + +input SalesforceFlowInterviewSharePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Object Access""" + accessLevel: String +} + +input SalesforceUpdateFlowInterviewShareInput { + patch: SalesforceFlowInterviewSharePatch! + + """The id of the FlowInterviewShare to update.""" + id: String! +} + +type SalesforceUpdateFlowInterviewSharePayload { + """FlowInterviewShare updated by the mutation.""" + flowInterviewShare: SalesforceFlowInterviewShare! +} + +input SalesforceUserProvAccountStagingPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Status""" + status: String + + """Link State""" + linkState: String + + """External Last Name""" + externalLastName: String + + """External First Name""" + externalFirstName: String + + """External Email""" + externalEmail: String + + """External Username""" + externalUsername: String + + """External User Id""" + externalUserId: String + + """User ID""" + salesforceUserId: String + + """Connected App ID""" + connectedAppId: String +} + +input SalesforceUpdateUserProvAccountStagingInput { + patch: SalesforceUserProvAccountStagingPatch! + + """The id of the UserProvAccountStaging to update.""" + id: String! +} + +type SalesforceUpdateUserProvAccountStagingPayload { + """UserProvAccountStaging updated by the mutation.""" + userProvAccountStaging: SalesforceUserProvAccountStaging! +} + +input SalesforceBusinessProcessPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Active""" + isActive: Boolean + + """Description""" + description: String + + """Name""" + name: String +} + +input SalesforceUpdateBusinessProcessInput { + patch: SalesforceBusinessProcessPatch! + + """The id of the BusinessProcess to update.""" + id: String! +} + +type SalesforceUpdateBusinessProcessPayload { + """BusinessProcess updated by the mutation.""" + businessProcess: SalesforceBusinessProcess! +} + +input SalesforceSolutionPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Description""" + solutionNote: String + + """Status""" + status: String + + """Visible in Public Knowledge Base""" + isPublishedInPublicKb: Boolean + + """Public""" + isPublished: Boolean + + """Title""" + solutionName: String +} + +input SalesforceUpdateSolutionInput { + patch: SalesforceSolutionPatch! + + """The id of the Solution to update.""" + id: String! +} + +type SalesforceUpdateSolutionPayload { + """Solution updated by the mutation.""" + solution: SalesforceSolution! +} + +input SalesforceVotePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Vote Type""" + type: String +} + +input SalesforceUpdateVoteInput { + patch: SalesforceVotePatch! + + """The id of the Vote to update.""" + id: String! +} + +type SalesforceUpdateVotePayload { + """Vote updated by the mutation.""" + vote: SalesforceVote! +} + +input SalesforceContractContactRolePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Primary""" + isPrimary: Boolean + + """Role""" + role: String + + """Contact ID""" + contactId: String +} + +input SalesforceUpdateContractContactRoleInput { + patch: SalesforceContractContactRolePatch! + + """The id of the ContractContactRole to update.""" + id: String! +} + +type SalesforceUpdateContractContactRolePayload { + """ContractContactRole updated by the mutation.""" + contractContactRole: SalesforceContractContactRole! +} + +input SalesforceNotePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Body""" + body: String + + """Private""" + isPrivate: Boolean + + """Title""" + title: String +} + +input SalesforceUpdateNoteInput { + patch: SalesforceNotePatch! + + """The id of the Note to update.""" + id: String! +} + +type SalesforceUpdateNotePayload { + """Note updated by the mutation.""" + note: SalesforceNote! +} + +input SalesforceCustomBrandPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Branded Entity ID""" + parentId: String +} + +input SalesforceUpdateCustomBrandInput { + patch: SalesforceCustomBrandPatch! + + """The id of the CustomBrand to update.""" + id: String! +} + +type SalesforceUpdateCustomBrandPayload { + """CustomBrand updated by the mutation.""" + customBrand: SalesforceCustomBrand! +} + +input SalesforceIdeaPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Status""" + status: String + + """Categories""" + categories: String + + """Idea Body""" + body: String + + """Title""" + title: String +} + +input SalesforceUpdateIdeaInput { + patch: SalesforceIdeaPatch! + + """The id of the Idea to update.""" + id: String! +} + +type SalesforceUpdateIdeaPayload { + """Idea updated by the mutation.""" + idea: SalesforceIdea! +} + +input SalesforceCollaborationGroupPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Broadcast Only""" + isBroadcast: Boolean + + """Announcement ID""" + announcementId: String + + """Disable automatic archiving""" + isAutoArchiveDisabled: Boolean + + """Archive""" + isArchived: Boolean + + """Allow customers""" + canHaveGuests: Boolean + + """Information""" + informationBody: String + + """Information Title""" + informationTitle: String + + """Description""" + description: String + + """Access Type""" + collaborationType: String + + """Owner ID""" + ownerId: String + + """Name""" + name: String +} + +input SalesforceUpdateCollaborationGroupInput { + patch: SalesforceCollaborationGroupPatch! + + """The id of the CollaborationGroup to update.""" + id: String! +} + +type SalesforceUpdateCollaborationGroupPayload { + """CollaborationGroup updated by the mutation.""" + collaborationGroup: SalesforceCollaborationGroup! +} + +input SalesforceOpportunityPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Price Book ID""" + pricebook2Id: String + + """Campaign ID""" + campaignId: String + + """Forecast Category""" + forecastCategoryName: String + + """Lead Source""" + leadSource: String + + """Next Step""" + nextStep: String + + """Opportunity Type""" + type: String + + """Close Date""" + closeDate: String + + """Quantity""" + totalOpportunityQuantity: Float + + """Probability (%)""" + probability: Float + + """Amount""" + amount: Float + + """Stage""" + stageName: String + + """Description""" + description: String + + """Name""" + name: String + + """Private""" + isPrivate: Boolean + + """Account ID""" + accountId: String +} + +input SalesforceUpdateOpportunityInput { + patch: SalesforceOpportunityPatch! + + """The id of the Opportunity to update.""" + id: String! +} + +type SalesforceUpdateOpportunityPayload { + """Opportunity updated by the mutation.""" + opportunity: SalesforceOpportunity! +} + +input SalesforceListEmailRecipientSourcePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Type""" + sourceType: String + + """SourceList ID""" + sourceListId: String +} + +input SalesforceUpdateListEmailRecipientSourceInput { + patch: SalesforceListEmailRecipientSourcePatch! + + """The id of the ListEmailRecipientSource to update.""" + id: String! +} + +type SalesforceUpdateListEmailRecipientSourcePayload { + """ListEmailRecipientSource updated by the mutation.""" + listEmailRecipientSource: SalesforceListEmailRecipientSource! +} + +input SalesforceTodayGoalPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """User ID""" + userId: String + + """Value""" + value: Float + + """Owner ID""" + ownerId: String +} + +input SalesforceUpdateTodayGoalInput { + patch: SalesforceTodayGoalPatch! + + """The id of the TodayGoal to update.""" + id: String! +} + +type SalesforceUpdateTodayGoalPayload { + """TodayGoal updated by the mutation.""" + todayGoal: SalesforceTodayGoal! +} + +input SalesforceOrganizationPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Web to Cases Default Origin""" + webToCaseDefaultOrigin: String + + """UI Skin""" + uiSkin: String + + """OnlyLLPermUserAllowed""" + preferencesOnlyLlPermUserAllowed: Boolean + + """LightningLoginEnabled""" + preferencesLightningLoginEnabled: Boolean + + """IndividualAutoCreateEnabled""" + preferencesIndividualAutoCreateEnabled: Boolean + + """ConsentManagementEnabled""" + preferencesConsentManagementEnabled: Boolean + + """TerminateOldestSession""" + preferencesTerminateOldestSession: Boolean + + """TransactionSecurityPolicy""" + preferencesTransactionSecurityPolicy: Boolean + + """RequireOpportunityProducts""" + preferencesRequireOpportunityProducts: Boolean + + """Info Emails Admin""" + receivesAdminInfoEmails: Boolean + + """Info Emails""" + receivesInfoEmails: Boolean + + """Language""" + languageLocaleKey: String + + """Locale""" + defaultLocaleSidKey: String + + """Primary Contact""" + primaryContact: String + + """Fax""" + fax: String + + """Phone""" + phone: String + + """Geocode Accuracy""" + geocodeAccuracy: String + + """Longitude""" + longitude: Float + + """Latitude""" + latitude: Float + + """Zip/Postal Code""" + postalCode: String + + """State/Province""" + state: String + + """City""" + city: String + + """Street""" + street: String + + """Division""" + division: String + + """Name""" + name: String +} + +input SalesforceUpdateOrganizationInput { + patch: SalesforceOrganizationPatch! + + """The id of the Organization to update.""" + id: String! +} + +type SalesforceUpdateOrganizationPayload { + """Organization updated by the mutation.""" + organization: SalesforceOrganization! +} + +input SalesforceOpportunityLineItemPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Line Description""" + description: String + + """Date""" + serviceDate: String + + """Sales Price""" + unitPrice: Float + + """Total Price""" + totalPrice: Float + + """Quantity""" + quantity: Float +} + +input SalesforceUpdateOpportunityLineItemInput { + patch: SalesforceOpportunityLineItemPatch! + + """The id of the OpportunityLineItem to update.""" + id: String! +} + +type SalesforceUpdateOpportunityLineItemPayload { + """OpportunityLineItem updated by the mutation.""" + opportunityLineItem: SalesforceOpportunityLineItem! +} + +input SalesforceFlowRecordRelationPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Record ID""" + relatedRecordId: String +} + +input SalesforceUpdateFlowRecordRelationInput { + patch: SalesforceFlowRecordRelationPatch! + + """The id of the FlowRecordRelation to update.""" + id: String! +} + +type SalesforceUpdateFlowRecordRelationPayload { + """FlowRecordRelation updated by the mutation.""" + flowRecordRelation: SalesforceFlowRecordRelation! +} + +input SalesforceAdditionalNumberPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Phone""" + phone: String + + """Description""" + description: String + + """Name""" + name: String + + """Call Center ID""" + callCenterId: String +} + +input SalesforceUpdateAdditionalNumberInput { + patch: SalesforceAdditionalNumberPatch! + + """The id of the AdditionalNumber to update.""" + id: String! +} + +type SalesforceUpdateAdditionalNumberPayload { + """AdditionalNumber updated by the mutation.""" + additionalNumber: SalesforceAdditionalNumber! +} + +input SalesforceCategoryNodePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Subcategory Sort Style""" + sortStyle: String + + """Sort Order""" + sortOrder: Int + + """Name""" + masterLabel: String + + """Parent Category Node ID""" + parentId: String +} + +input SalesforceUpdateCategoryNodeInput { + patch: SalesforceCategoryNodePatch! + + """The id of the CategoryNode to update.""" + id: String! +} + +type SalesforceUpdateCategoryNodePayload { + """CategoryNode updated by the mutation.""" + categoryNode: SalesforceCategoryNode! +} + +input SalesforceApexEmailNotificationPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """email""" + email: String + + """User ID""" + userId: String +} + +input SalesforceUpdateApexEmailNotificationInput { + patch: SalesforceApexEmailNotificationPatch! + + """The id of the ApexEmailNotification to update.""" + id: String! +} + +type SalesforceUpdateApexEmailNotificationPayload { + """ApexEmailNotification updated by the mutation.""" + apexEmailNotification: SalesforceApexEmailNotification! +} + +input SalesforceUserListViewPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """List View Chart ID""" + lastViewedChart: String + + """Custom Object Definition ID""" + sobjectType: String +} + +input SalesforceUpdateUserListViewInput { + patch: SalesforceUserListViewPatch! + + """The id of the UserListView to update.""" + id: String! +} + +type SalesforceUpdateUserListViewPayload { + """UserListView updated by the mutation.""" + userListView: SalesforceUserListView! +} + +input SalesforceUserProvAccountPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Manual Override""" + isKnownLink: Boolean + + """Deleted Date""" + deletedDate: String + + """Status""" + status: String + + """Link State""" + linkState: String + + """External Last Name""" + externalLastName: String + + """External First Name""" + externalFirstName: String + + """External Email""" + externalEmail: String + + """External Username""" + externalUsername: String + + """External User Id""" + externalUserId: String + + """Connected App ID""" + connectedAppId: String + + """User ID""" + salesforceUserId: String +} + +input SalesforceUpdateUserProvAccountInput { + patch: SalesforceUserProvAccountPatch! + + """The id of the UserProvAccount to update.""" + id: String! +} + +type SalesforceUpdateUserProvAccountPayload { + """UserProvAccount updated by the mutation.""" + userProvAccount: SalesforceUserProvAccount! +} + +input SalesforceProcessInstanceWorkitemPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Actor ID""" + actorId: String + + """Original Actor ID""" + originalActorId: String + + """Process Instance ID""" + processInstanceId: String +} + +input SalesforceUpdateProcessInstanceWorkitemInput { + patch: SalesforceProcessInstanceWorkitemPatch! + + """The id of the ProcessInstanceWorkitem to update.""" + id: String! +} + +type SalesforceUpdateProcessInstanceWorkitemPayload { + """ProcessInstanceWorkitem updated by the mutation.""" + processInstanceWorkitem: SalesforceProcessInstanceWorkitem! +} + +input SalesforceAssetPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Internal Asset""" + isInternal: Boolean + + """Asset Serviced By ID""" + assetServicedById: String + + """Asset Provided By ID""" + assetProvidedById: String + + """Owner ID""" + ownerId: String + + """Description""" + description: String + + """Quantity""" + quantity: Float + + """Price""" + price: Float + + """Status""" + status: String + + """Usage End Date""" + usageEndDate: String + + """Purchase Date""" + purchaseDate: String + + """Install Date""" + installDate: String + + """Serial Number""" + serialNumber: String + + """Asset Name""" + name: String + + """Competitor Asset""" + isCompetitorProduct: Boolean + + """Product ID""" + product2Id: String + + """Parent Asset ID""" + parentId: String + + """Account ID""" + accountId: String + + """Contact ID""" + contactId: String +} + +input SalesforceUpdateAssetInput { + patch: SalesforceAssetPatch! + + """The id of the Asset to update.""" + id: String! +} + +type SalesforceUpdateAssetPayload { + """Asset updated by the mutation.""" + asset: SalesforceAsset! +} + +input SalesforceUserProvisioningRequestSharePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Object Access""" + accessLevel: String +} + +input SalesforceUpdateUserProvisioningRequestShareInput { + patch: SalesforceUserProvisioningRequestSharePatch! + + """The id of the UserProvisioningRequestShare to update.""" + id: String! +} + +type SalesforceUpdateUserProvisioningRequestSharePayload { + """UserProvisioningRequestShare updated by the mutation.""" + userProvisioningRequestShare: SalesforceUserProvisioningRequestShare! +} + +input SalesforceActionLinkGroupTemplatePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Published""" + isPublished: Boolean + + """Category""" + category: String + + """Hours until Expiration""" + hoursUntilExpiration: Int + + """Executions Allowed""" + executionsAllowed: String + + """Name""" + masterLabel: String + + """Master Language""" + language: String + + """Developer Name""" + developerName: String +} + +input SalesforceUpdateActionLinkGroupTemplateInput { + patch: SalesforceActionLinkGroupTemplatePatch! + + """The id of the ActionLinkGroupTemplate to update.""" + id: String! +} + +type SalesforceUpdateActionLinkGroupTemplatePayload { + """ActionLinkGroupTemplate updated by the mutation.""" + actionLinkGroupTemplate: SalesforceActionLinkGroupTemplate! +} + +input SalesforceUserAppInfoPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Form Factor""" + formFactor: String +} + +input SalesforceUpdateUserAppInfoInput { + patch: SalesforceUserAppInfoPatch! + + """The id of the UserAppInfo to update.""" + id: String! +} + +type SalesforceUpdateUserAppInfoPayload { + """UserAppInfo updated by the mutation.""" + userAppInfo: SalesforceUserAppInfo! +} + +input SalesforceAppMenuItemPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Is Visible""" + isVisible: Boolean +} + +input SalesforceUpdateAppMenuItemInput { + patch: SalesforceAppMenuItemPatch! + + """The id of the AppMenuItem to update.""" + id: String! +} + +type SalesforceUpdateAppMenuItemPayload { + """AppMenuItem updated by the mutation.""" + appMenuItem: SalesforceAppMenuItem! +} + +input SalesforceUserAppMenuCustomizationSharePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Object Access""" + accessLevel: String +} + +input SalesforceUpdateUserAppMenuCustomizationShareInput { + patch: SalesforceUserAppMenuCustomizationSharePatch! + + """The id of the UserAppMenuCustomizationShare to update.""" + id: String! +} + +type SalesforceUpdateUserAppMenuCustomizationSharePayload { + """UserAppMenuCustomizationShare updated by the mutation.""" + userAppMenuCustomizationShare: SalesforceUserAppMenuCustomizationShare! +} + +input SalesforceFeedItemPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Status""" + status: String + + """Is Rich Text""" + isRichText: Boolean + + """Body""" + body: String + + """Title""" + title: String +} + +input SalesforceUpdateFeedItemInput { + patch: SalesforceFeedItemPatch! + + """The id of the FeedItem to update.""" + id: String! +} + +type SalesforceUpdateFeedItemPayload { + """FeedItem updated by the mutation.""" + feedItem: SalesforceFeedItem! +} + +input SalesforceApexClassPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Size Without Comments""" + lengthWithoutComments: Int + + """Body""" + body: String + + """Body CRC""" + bodyCrc: Float + + """Is Valid""" + isValid: Boolean + + """Status""" + status: String + + """Api Version""" + apiVersion: Float + + """Name""" + name: String +} + +input SalesforceUpdateApexClassInput { + patch: SalesforceApexClassPatch! + + """The id of the ApexClass to update.""" + id: String! +} + +type SalesforceUpdateApexClassPayload { + """ApexClass updated by the mutation.""" + apexClass: SalesforceApexClass! +} + +input SalesforceApexTriggerPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Size Without Comments""" + lengthWithoutComments: Int + + """Body""" + body: String + + """Body CRC""" + bodyCrc: Float + + """Is Valid""" + isValid: Boolean + + """Status""" + status: String + + """Api Version""" + apiVersion: Float + + """AfterUndelete""" + usageAfterUndelete: Boolean + + """IsBulk""" + usageIsBulk: Boolean + + """AfterDelete""" + usageAfterDelete: Boolean + + """BeforeDelete""" + usageBeforeDelete: Boolean + + """AfterUpdate""" + usageAfterUpdate: Boolean + + """BeforeUpdate""" + usageBeforeUpdate: Boolean + + """AfterInsert""" + usageAfterInsert: Boolean + + """BeforeInsert""" + usageBeforeInsert: Boolean + + """Custom Object Definition ID""" + tableEnumOrId: String + + """Name""" + name: String +} + +input SalesforceUpdateApexTriggerInput { + patch: SalesforceApexTriggerPatch! + + """The id of the ApexTrigger to update.""" + id: String! +} + +type SalesforceUpdateApexTriggerPayload { + """ApexTrigger updated by the mutation.""" + apexTrigger: SalesforceApexTrigger! +} + +input SalesforceUserLoginPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Is Password Locked""" + isPasswordLocked: Boolean + + """Is Frozen""" + isFrozen: Boolean +} + +input SalesforceUpdateUserLoginInput { + patch: SalesforceUserLoginPatch! + + """The id of the UserLogin to update.""" + id: String! +} + +type SalesforceUpdateUserLoginPayload { + """UserLogin updated by the mutation.""" + userLogin: SalesforceUserLogin! +} + +input SalesforceCustomBrandAssetPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Asset source ID""" + assetSourceId: String + + """Text Asset""" + textAsset: String + + """Asset Category""" + assetCategory: String + + """Custom Brand ID""" + customBrandId: String +} + +input SalesforceUpdateCustomBrandAssetInput { + patch: SalesforceCustomBrandAssetPatch! + + """The id of the CustomBrandAsset to update.""" + id: String! +} + +type SalesforceUpdateCustomBrandAssetPayload { + """CustomBrandAsset updated by the mutation.""" + customBrandAsset: SalesforceCustomBrandAsset! +} + +input SalesforceContentAssetPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Let unauthenticated users see this asset file""" + isVisibleByExternalUsers: Boolean + + """Label""" + masterLabel: String + + """Master Language""" + language: String + + """Unique Name""" + developerName: String +} + +input SalesforceUpdateContentAssetInput { + patch: SalesforceContentAssetPatch! + + """The id of the ContentAsset to update.""" + id: String! +} + +type SalesforceUpdateContentAssetPayload { + """ContentAsset updated by the mutation.""" + contentAsset: SalesforceContentAsset! +} + +input SalesforceMacroSharePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Object Access""" + accessLevel: String +} + +input SalesforceUpdateMacroShareInput { + patch: SalesforceMacroSharePatch! + + """The id of the MacroShare to update.""" + id: String! +} + +type SalesforceUpdateMacroSharePayload { + """MacroShare updated by the mutation.""" + macroShare: SalesforceMacroShare! +} + +input SalesforceCollaborationGroupMemberRequestPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Status""" + status: String + + """Response Message""" + responseMessage: String +} + +input SalesforceUpdateCollaborationGroupMemberRequestInput { + patch: SalesforceCollaborationGroupMemberRequestPatch! + + """The id of the CollaborationGroupMemberRequest to update.""" + id: String! +} + +type SalesforceUpdateCollaborationGroupMemberRequestPayload { + """CollaborationGroupMemberRequest updated by the mutation.""" + collaborationGroupMemberRequest: SalesforceCollaborationGroupMemberRequest! +} + +input SalesforceCampaignPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Record Type ID""" + campaignMemberRecordTypeId: String + + """Owner ID""" + ownerId: String + + """Description""" + description: String + + """Active""" + isActive: Boolean + + """Num Sent in Campaign""" + numberSent: Float + + """Expected Response (%)""" + expectedResponse: Float + + """Actual Cost in Campaign""" + actualCost: Float + + """Budgeted Cost in Campaign""" + budgetedCost: Float + + """Expected Revenue in Campaign""" + expectedRevenue: Float + + """End Date""" + endDate: String + + """Start Date""" + startDate: String + + """Status""" + status: String + + """Type""" + type: String + + """Parent Campaign ID""" + parentId: String + + """Name""" + name: String +} + +input SalesforceUpdateCampaignInput { + patch: SalesforceCampaignPatch! + + """The id of the Campaign to update.""" + id: String! +} + +type SalesforceUpdateCampaignPayload { + """Campaign updated by the mutation.""" + campaign: SalesforceCampaign! +} + +input SalesforceOrderPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Status Category""" + statusCode: String + + """Activated By ID""" + activatedById: String + + """Activated Date""" + activatedDate: String + + """Ship To Contact ID""" + shipToContactId: String + + """Bill To Contact ID""" + billToContactId: String + + """Order Reference Number""" + orderReferenceNumber: String + + """PO Number""" + poNumber: String + + """PO Date""" + poDate: String + + """Order Name""" + name: String + + """Shipping Geocode Accuracy""" + shippingGeocodeAccuracy: String + + """Shipping Longitude""" + shippingLongitude: Float + + """Shipping Latitude""" + shippingLatitude: Float + + """Shipping Country""" + shippingCountry: String + + """Shipping Zip/Postal Code""" + shippingPostalCode: String + + """Shipping State/Province""" + shippingState: String + + """Shipping City""" + shippingCity: String + + """Shipping Street""" + shippingStreet: String + + """Billing Geocode Accuracy""" + billingGeocodeAccuracy: String + + """Billing Longitude""" + billingLongitude: Float + + """Billing Latitude""" + billingLatitude: Float + + """Billing Country""" + billingCountry: String + + """Billing Zip/Postal Code""" + billingPostalCode: String + + """Billing State/Province""" + billingState: String + + """Billing City""" + billingCity: String + + """Billing Street""" + billingStreet: String + + """Order Type""" + type: String + + """Company Authorized Date""" + companyAuthorizedDate: String + + """Company Authorized By ID""" + companyAuthorizedById: String + + """Customer Authorized Date""" + customerAuthorizedDate: String + + """Customer Authorized By ID""" + customerAuthorizedById: String + + """Internal Comments""" + description: String + + """Status""" + status: String + + """Order End Date""" + endDate: String + + """Order Start Date""" + effectiveDate: String + + """Price Book ID""" + pricebook2Id: String + + """Account ID""" + accountId: String + + """Contract ID""" + contractId: String + + """Owner ID""" + ownerId: String +} + +input SalesforceUpdateOrderInput { + patch: SalesforceOrderPatch! + + """The id of the Order to update.""" + id: String! +} + +type SalesforceUpdateOrderPayload { + """Order updated by the mutation.""" + order: SalesforceOrder! +} + +input SalesforceAttachmentPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Description""" + description: String + + """Owner ID""" + ownerId: String + + """Body""" + body: String + + """Content Type""" + contentType: String + + """Private""" + isPrivate: Boolean + + """File Name""" + name: String +} + +input SalesforceUpdateAttachmentInput { + patch: SalesforceAttachmentPatch! + + """The id of the Attachment to update.""" + id: String! +} + +type SalesforceUpdateAttachmentPayload { + """Attachment updated by the mutation.""" + attachment: SalesforceAttachment! +} + +input SalesforceApexComponentPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Markup""" + markup: String + + """Controller Key""" + controllerKey: String + + """Controller Type""" + controllerType: String + + """Description""" + description: String + + """Label""" + masterLabel: String + + """Api Version""" + apiVersion: Float + + """Name""" + name: String +} + +input SalesforceUpdateApexComponentInput { + patch: SalesforceApexComponentPatch! + + """The id of the ApexComponent to update.""" + id: String! +} + +type SalesforceUpdateApexComponentPayload { + """ApexComponent updated by the mutation.""" + apexComponent: SalesforceApexComponent! +} + +input SalesforceLightningComponentResourcePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Source""" + source: String + + """Format""" + format: String + + """File Path""" + filePath: String +} + +input SalesforceUpdateLightningComponentResourceInput { + patch: SalesforceLightningComponentResourcePatch! + + """The id of the LightningComponentResource to update.""" + id: String! +} + +type SalesforceUpdateLightningComponentResourcePayload { + """LightningComponentResource updated by the mutation.""" + lightningComponentResource: SalesforceLightningComponentResource! +} + +input SalesforceApexPagePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Markup""" + markup: String + + """Require CSRF protection on GET requests""" + isConfirmationTokenRequired: Boolean + + """ + Available for Lightning Experience, Lightning Communities, and the mobile app + """ + isAvailableInTouch: Boolean + + """Controller Key""" + controllerKey: String + + """Controller Type""" + controllerType: String + + """Description""" + description: String + + """Label""" + masterLabel: String + + """Api Version""" + apiVersion: Float + + """Name""" + name: String +} + +input SalesforceUpdateApexPageInput { + patch: SalesforceApexPagePatch! + + """The id of the ApexPage to update.""" + id: String! +} + +type SalesforceUpdateApexPagePayload { + """ApexPage updated by the mutation.""" + apexPage: SalesforceApexPage! +} + +input SalesforceCasePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Escalated""" + isEscalated: Boolean + + """Description""" + description: String + + """Priority""" + priority: String + + """Subject""" + subject: String + + """Case Origin""" + origin: String + + """Case Reason""" + reason: String + + """Status""" + status: String + + """Case Type""" + type: String + + """Company""" + suppliedCompany: String + + """Phone""" + suppliedPhone: String + + """Email Address""" + suppliedEmail: String + + """Name""" + suppliedName: String + + """Parent Case ID""" + parentId: String + + """Asset ID""" + assetId: String + + """Account ID""" + accountId: String + + """Contact ID""" + contactId: String +} + +input SalesforceUpdateCaseInput { + patch: SalesforceCasePatch! + + """The id of the Case to update.""" + id: String! +} + +type SalesforceUpdateCasePayload { + """Case updated by the mutation.""" + case: SalesforceCase! +} + +input SalesforceBrandTemplatePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Value""" + value: String + + """Description""" + description: String + + """Active""" + isActive: Boolean + + """Letterhead Unique Name""" + developerName: String + + """Brand Template Name""" + name: String +} + +input SalesforceUpdateBrandTemplateInput { + patch: SalesforceBrandTemplatePatch! + + """The id of the BrandTemplate to update.""" + id: String! +} + +type SalesforceUpdateBrandTemplatePayload { + """BrandTemplate updated by the mutation.""" + brandTemplate: SalesforceBrandTemplate! +} + +input SalesforceCaseCommentPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Body""" + commentBody: String + + """Published""" + isPublished: Boolean +} + +input SalesforceUpdateCaseCommentInput { + patch: SalesforceCaseCommentPatch! + + """The id of the CaseComment to update.""" + id: String! +} + +type SalesforceUpdateCaseCommentPayload { + """CaseComment updated by the mutation.""" + caseComment: SalesforceCaseComment! +} + +input SalesforceStreamingChannelSharePatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Object Access""" + accessLevel: String +} + +input SalesforceUpdateStreamingChannelShareInput { + patch: SalesforceStreamingChannelSharePatch! + + """The id of the StreamingChannelShare to update.""" + id: String! +} + +type SalesforceUpdateStreamingChannelSharePayload { + """StreamingChannelShare updated by the mutation.""" + streamingChannelShare: SalesforceStreamingChannelShare! +} + +input SalesforcePlatformCachePartitionPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Default Partition""" + isDefaultPartition: Boolean + + """Description""" + description: String + + """Label""" + masterLabel: String + + """Master Language""" + language: String + + """Name""" + developerName: String +} + +input SalesforceUpdatePlatformCachePartitionInput { + patch: SalesforcePlatformCachePartitionPatch! + + """The id of the PlatformCachePartition to update.""" + id: String! +} + +type SalesforceUpdatePlatformCachePartitionPayload { + """PlatformCachePartition updated by the mutation.""" + platformCachePartition: SalesforcePlatformCachePartition! +} + +input SalesforceAuthProviderPatch { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Metadata Type Record""" + customMetadataTypeRecord: String + + """Class ID""" + pluginId: String + + """Custom Logout URL""" + logoutUrl: String + + """Icon URL""" + iconUrl: String + + """ + Include identity organization's organization ID for third-party account linkage + """ + optionsIncludeOrgIdInId: Boolean + + """Send client credentials in header""" + optionsSendClientCredentialsInHeader: Boolean + + """Send access token in header""" + optionsSendAccessTokenInHeader: Boolean + + """Token Issuer""" + idTokenIssuer: String + + """Default Scopes""" + defaultScopes: String + + """User Info Endpoint URL""" + userInfoUrl: String + + """Token Endpoint URL""" + tokenUrl: String + + """Authorize Endpoint URL""" + authorizeUrl: String + + """Custom Error URL""" + errorUrl: String + + """Consumer Key""" + consumerKey: String + + """User ID""" + executionUserId: String + + """Class ID""" + registrationHandlerId: String + + """URL Suffix""" + developerName: String + + """Name""" + friendlyName: String + + """Provider Type""" + providerType: String +} + +input SalesforceUpdateAuthProviderInput { + patch: SalesforceAuthProviderPatch! + + """The id of the AuthProvider to update.""" + id: String! +} + +type SalesforceUpdateAuthProviderPayload { + """AuthProvider updated by the mutation.""" + authProvider: SalesforceAuthProvider! +} + +input SalesforceAuraDefinitionBundleInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + developerName: String + + """Master Language""" + language: String + + """Label""" + masterLabel: String + + """Api Version""" + apiVersion: Float + + """Description""" + description: String +} + +input SalesforceCreateAuraDefinitionBundleInput { + auraDefinitionBundle: SalesforceAuraDefinitionBundleInput! +} + +type SalesforceCreateAuraDefinitionBundlePayload { + """AuraDefinitionBundle created by the mutation.""" + auraDefinitionBundle: SalesforceAuraDefinitionBundle! +} + +input SalesforceApexTestRunResultInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Apex Job ID""" + asyncApexJobId: String + + """User ID""" + userId: String + + """Name of the job""" + jobName: String + + """allTests""" + isAllTests: Boolean + + """Client that kicked off the test run""" + source: String + + """Start time of the test run""" + startTime: String + + """End time of the test run""" + endTime: String + + """Time(ms) actually spent running tests""" + testTime: Int + + """Status of the test run""" + status: String + + """Number of classes enqueued in this test run""" + classesEnqueued: Int + + """Number of classes completed in this test run""" + classesCompleted: Int + + """Number of methods enqueued in this test run""" + methodsEnqueued: Int + + """Number of methods completed in this test run""" + methodsCompleted: Int + + """Number of methods failed in this test run""" + methodsFailed: Int +} + +input SalesforceCreateApexTestRunResultInput { + apexTestRunResult: SalesforceApexTestRunResultInput! +} + +type SalesforceCreateApexTestRunResultPayload { + """ApexTestRunResult created by the mutation.""" + apexTestRunResult: SalesforceApexTestRunResult! +} + +input SalesforceTopicAssignmentInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Topic ID""" + topicId: String + + """Entity ID""" + entityId: String +} + +input SalesforceCreateTopicAssignmentInput { + topicAssignment: SalesforceTopicAssignmentInput! +} + +type SalesforceCreateTopicAssignmentPayload { + """TopicAssignment created by the mutation.""" + topicAssignment: SalesforceTopicAssignment! +} + +input SalesforceLightningComponentBundleInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + developerName: String + + """Master Language""" + language: String + + """Label""" + masterLabel: String + + """Api Version""" + apiVersion: Float + + """Minimum Version""" + minVersion: Float + + """IsExposed""" + isExposed: Boolean + + """Available For""" + availableFor: String +} + +input SalesforceCreateLightningComponentBundleInput { + lightningComponentBundle: SalesforceLightningComponentBundleInput! +} + +type SalesforceCreateLightningComponentBundlePayload { + """LightningComponentBundle created by the mutation.""" + lightningComponentBundle: SalesforceLightningComponentBundle! +} + +input SalesforceCollaborationGroupRecordInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Chatter Group ID""" + collaborationGroupId: String + + """Record ID""" + recordId: String +} + +input SalesforceCreateCollaborationGroupRecordInput { + collaborationGroupRecord: SalesforceCollaborationGroupRecordInput! +} + +type SalesforceCreateCollaborationGroupRecordPayload { + """CollaborationGroupRecord created by the mutation.""" + collaborationGroupRecord: SalesforceCollaborationGroupRecord! +} + +input SalesforceEmailMessageInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Case ID""" + parentId: String + + """Activity ID""" + activityId: String + + """Text Body""" + textBody: String + + """HTML Body""" + htmlBody: String + + """Headers""" + headers: String + + """Subject""" + subject: String + + """From Name""" + fromName: String + + """From Address""" + fromAddress: String + + """From""" + validatedFromAddress: String + + """To Address""" + toAddress: String + + """CC Address""" + ccAddress: String + + """BCC Address""" + bccAddress: String + + """Is Incoming""" + incoming: Boolean + + """Status""" + status: String + + """Message Date""" + messageDate: String + + """Email Message ID""" + replyToEmailMessageId: String + + """Message ID""" + messageIdentifier: String + + """Thread ID""" + threadIdentifier: String + + """Is Client Managed""" + isClientManaged: Boolean + + """Related To ID""" + relatedToId: String +} + +input SalesforceCreateEmailMessageInput { + emailMessage: SalesforceEmailMessageInput! +} + +type SalesforceCreateEmailMessagePayload { + """EmailMessage created by the mutation.""" + emailMessage: SalesforceEmailMessage! +} + +input SalesforceOrderItemInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Product ID""" + product2Id: String + + """Order ID""" + orderId: String + + """Price Book Entry ID""" + pricebookEntryId: String + + """Original Order Item ID""" + originalOrderItemId: String + + """Quantity""" + quantity: Float + + """Unit Price""" + unitPrice: Float + + """Start Date""" + serviceDate: String + + """End Date""" + endDate: String + + """Line Description""" + description: String +} + +input SalesforceCreateOrderItemInput { + orderItem: SalesforceOrderItemInput! +} + +type SalesforceCreateOrderItemPayload { + """OrderItem created by the mutation.""" + orderItem: SalesforceOrderItem! +} + +input SalesforceUserListViewCriterionInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """User List View ID""" + userListViewId: String + + """Sort Order""" + sortOrder: Int + + """Column Name""" + columnName: String + + """Operation""" + operation: String + + """Value""" + value: String +} + +input SalesforceCreateUserListViewCriterionInput { + userListViewCriterion: SalesforceUserListViewCriterionInput! +} + +type SalesforceCreateUserListViewCriterionPayload { + """UserListViewCriterion created by the mutation.""" + userListViewCriterion: SalesforceUserListViewCriterion! +} + +input SalesforcePermissionSetAssignmentInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """PermissionSet ID""" + permissionSetId: String + + """Assignee ID""" + assigneeId: String +} + +input SalesforceCreatePermissionSetAssignmentInput { + permissionSetAssignment: SalesforcePermissionSetAssignmentInput! +} + +type SalesforceCreatePermissionSetAssignmentPayload { + """PermissionSetAssignment created by the mutation.""" + permissionSetAssignment: SalesforcePermissionSetAssignment! +} + +input SalesforceDuplicateRecordItemInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Duplicate Record Set ID""" + duplicateRecordSetId: String + + """Record ID""" + recordId: String +} + +input SalesforceCreateDuplicateRecordItemInput { + duplicateRecordItem: SalesforceDuplicateRecordItemInput! +} + +type SalesforceCreateDuplicateRecordItemPayload { + """DuplicateRecordItem created by the mutation.""" + duplicateRecordItem: SalesforceDuplicateRecordItem! +} + +input SalesforceUserProvisioningConfigInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + developerName: String + + """Master Language""" + language: String + + """Label""" + masterLabel: String + + """Connected App ID""" + connectedAppId: String + + """Notes""" + notes: String + + """Enabled""" + enabled: Boolean + + """Approval Required""" + approvalRequired: String + + """User Account Mapping""" + userAccountMapping: String + + """Enabled Operations""" + enabledOperations: String + + """On Update Attributes""" + onUpdateAttributes: String + + """Last Recon Date""" + lastReconDateTime: String + + """Named Credential ID""" + namedCredentialId: String + + """Recon Filter""" + reconFilter: String +} + +input SalesforceCreateUserProvisioningConfigInput { + userProvisioningConfig: SalesforceUserProvisioningConfigInput! +} + +type SalesforceCreateUserProvisioningConfigPayload { + """UserProvisioningConfig created by the mutation.""" + userProvisioningConfig: SalesforceUserProvisioningConfig! +} + +input SalesforceTaskInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name ID""" + whoId: String + + """Related To ID""" + whatId: String + + """Subject""" + subject: String + + """Due Date Only""" + activityDate: String + + """Status""" + status: String + + """Priority""" + priority: String + + """Assigned To ID""" + ownerId: String + + """Description""" + description: String + + """Call Duration""" + callDurationInSeconds: Int + + """Call Type""" + callType: String + + """Call Result""" + callDisposition: String + + """Call Object Identifier""" + callObject: String + + """Reminder Date/Time""" + reminderDateTime: String + + """Reminder Set""" + isReminderSet: Boolean + + """Create Recurring Series of Tasks""" + isRecurrence: Boolean + + """Recurrence Start""" + recurrenceStartDateOnly: String + + """Recurrence End""" + recurrenceEndDateOnly: String + + """Recurrence Time Zone""" + recurrenceTimeZoneSidKey: String + + """Recurrence Type""" + recurrenceType: String + + """Recurrence Interval""" + recurrenceInterval: Int + + """Recurrence Day of Week Mask""" + recurrenceDayOfWeekMask: Int + + """Recurrence Day of Month""" + recurrenceDayOfMonth: Int + + """Recurrence Instance""" + recurrenceInstance: String + + """Recurrence Month of Year""" + recurrenceMonthOfYear: String + + """Repeat This Task""" + recurrenceRegeneratedType: String + + """Task Subtype""" + taskSubtype: String +} + +input SalesforceCreateTaskInput { + task: SalesforceTaskInput! +} + +type SalesforceCreateTaskPayload { + """Task created by the mutation.""" + task: SalesforceTask! +} + +input SalesforceStreamingChannelInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Streaming Channel Name""" + name: String + + """Description""" + description: String +} + +input SalesforceCreateStreamingChannelInput { + streamingChannel: SalesforceStreamingChannelInput! +} + +type SalesforceCreateStreamingChannelPayload { + """StreamingChannel created by the mutation.""" + streamingChannel: SalesforceStreamingChannel! +} + +input SalesforceApexTestQueueItemInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Class ID""" + apexClassId: String +} + +input SalesforceCreateApexTestQueueItemInput { + apexTestQueueItem: SalesforceApexTestQueueItemInput! +} + +type SalesforceCreateApexTestQueueItemPayload { + """ApexTestQueueItem created by the mutation.""" + apexTestQueueItem: SalesforceApexTestQueueItem! +} + +input SalesforceFieldPermissionsInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """Sobject Type Name""" + sobjectType: String + + """Field Name""" + field: String + + """Edit Field""" + permissionsEdit: Boolean + + """Read Field""" + permissionsRead: Boolean +} + +input SalesforceCreateFieldPermissionsInput { + fieldPermissions: SalesforceFieldPermissionsInput! +} + +type SalesforceCreateFieldPermissionsPayload { + """FieldPermissions created by the mutation.""" + fieldPermissions: SalesforceFieldPermissions! +} + +input SalesforceFeedLikeInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Feed Item ID""" + feedItemId: String + + """Feed Item ID""" + feedEntityId: String + + """Created By ID""" + createdById: String + + """Created Date""" + createdDate: String +} + +input SalesforceCreateFeedLikeInput { + feedLike: SalesforceFeedLikeInput! +} + +"""Feed Like""" +type SalesforceFeedLike { + """Feed Like ID""" + id: String! + + """Feed Item ID""" + feedItemId: String + + """Feed Item ID""" + feedItem: SalesforceFeedLikeFeedItemUnion + + """Feed Item ID""" + feedEntityId: String + + """Feed Item ID""" + feedEntity: SalesforceFeedLikeFeedEntityUnion + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """InsertedBy ID""" + insertedById: String! + + """InsertedBy ID""" + insertedBy: SalesforceUser! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! +} + +type SalesforceCreateFeedLikePayload { + """FeedLike created by the mutation.""" + feedLike: SalesforceFeedLike! +} + +input SalesforceMacroInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Macro Name""" + name: String + + """Description""" + description: String + + """Apply To""" + startingContext: String +} + +input SalesforceCreateMacroInput { + macro: SalesforceMacroInput! +} + +type SalesforceCreateMacroPayload { + """Macro created by the mutation.""" + macro: SalesforceMacro! +} + +input SalesforceEmailServicesAddressInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Active""" + isActive: Boolean + + """Email address""" + localPart: String + + """Accept Email From""" + authorizedSenders: String + + """User ID""" + runAsUserId: String + + """Service ID""" + functionId: String + + """Email Address Name""" + developerName: String +} + +input SalesforceCreateEmailServicesAddressInput { + emailServicesAddress: SalesforceEmailServicesAddressInput! +} + +type SalesforceCreateEmailServicesAddressPayload { + """EmailServicesAddress created by the mutation.""" + emailServicesAddress: SalesforceEmailServicesAddress! +} + +input SalesforceHolidayInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Holiday Name""" + name: String + + """Description""" + description: String + + """All Day""" + isAllDay: Boolean + + """Holiday Date""" + activityDate: String + + """Start Time In Minutes From Midnight""" + startTimeInMinutes: Int + + """End Time In Minutes From Midnight""" + endTimeInMinutes: Int + + """Recurring Holiday""" + isRecurrence: Boolean + + """Recurrence Start""" + recurrenceStartDate: String + + """Recurrence End""" + recurrenceEndDateOnly: String + + """Recurrence Type""" + recurrenceType: String + + """Recurrence Interval""" + recurrenceInterval: Int + + """Recurrence Day of Week Mask""" + recurrenceDayOfWeekMask: Int + + """Recurrence Day of Month""" + recurrenceDayOfMonth: Int + + """Recurrence Instance""" + recurrenceInstance: String + + """Recurrence Month of Year""" + recurrenceMonthOfYear: String +} + +input SalesforceCreateHolidayInput { + holiday: SalesforceHolidayInput! +} + +type SalesforceCreateHolidayPayload { + """Holiday created by the mutation.""" + holiday: SalesforceHoliday! +} + +input SalesforcePushTopicInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Topic Name""" + name: String + + """SOQL Query""" + query: String + + """API Version""" + apiVersion: Float + + """Is Active""" + isActive: Boolean + + """Notify For Fields""" + notifyForFields: String + + """Description""" + description: String + + """Create""" + notifyForOperationCreate: Boolean + + """Update""" + notifyForOperationUpdate: Boolean + + """Delete""" + notifyForOperationDelete: Boolean + + """Undelete""" + notifyForOperationUndelete: Boolean +} + +input SalesforceCreatePushTopicInput { + pushTopic: SalesforcePushTopicInput! +} + +type SalesforceCreatePushTopicPayload { + """PushTopic created by the mutation.""" + pushTopic: SalesforcePushTopic! +} + +input SalesforceTransactionSecurityPolicyInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + developerName: String + + """Master Language""" + language: String + + """Label""" + masterLabel: String + + """Policy type""" + type: String + + """State""" + state: String + + """Action Configuration""" + actionConfig: String + + """Class ID""" + apexPolicyId: String + + """Event Type""" + eventType: String + + """Resource Name""" + resourceName: String + + """User ID""" + executionUserId: String + + """Description""" + description: String +} + +input SalesforceCreateTransactionSecurityPolicyInput { + transactionSecurityPolicy: SalesforceTransactionSecurityPolicyInput! +} + +type SalesforceCreateTransactionSecurityPolicyPayload { + """TransactionSecurityPolicy created by the mutation.""" + transactionSecurityPolicy: SalesforceTransactionSecurityPolicy! +} + +input SalesforceUserProvisioningLogInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """UserProvisioningRequest ID""" + userProvisioningRequestId: String + + """External User Id""" + externalUserId: String + + """External Username""" + externalUsername: String + + """User ID""" + userId: String + + """Status""" + status: String + + """Details""" + details: String +} + +input SalesforceCreateUserProvisioningLogInput { + userProvisioningLog: SalesforceUserProvisioningLogInput! +} + +type SalesforceCreateUserProvisioningLogPayload { + """UserProvisioningLog created by the mutation.""" + userProvisioningLog: SalesforceUserProvisioningLog! +} + +input SalesforceDandBCompanyInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Primary Business Name""" + name: String + + """D-U-N-S Number""" + dunsNumber: String + + """Street Address""" + street: String + + """City""" + city: String + + """State""" + state: String + + """Postal Code""" + postalCode: String + + """Country""" + country: String + + """Geocode Accuracy""" + geocodeAccuracyStandard: String + + """Telephone Number""" + phone: String + + """Facsimile Number""" + fax: String + + """International Dialing Code""" + countryAccessCode: String + + """Ownership Type Indicator""" + publicIndicator: String + + """Ticker Symbol""" + stockSymbol: String + + """Stock Exchange""" + stockExchange: String + + """Annual Sales Volume""" + salesVolume: Float + + """URL""" + url: String + + """Out Of Business Indicator""" + outOfBusiness: String + + """Number of Employees - Total""" + employeesTotal: Float + + """FIPS MSA Code""" + fipsMsaCode: String + + """FIPS MSA Code Description""" + fipsMsaDesc: String + + """Primary Tradestyle""" + tradeStyle1: String + + """Year Started""" + yearStarted: String + + """Mailing Street Address""" + mailingStreet: String + + """Mailing City""" + mailingCity: String + + """Mailing State""" + mailingState: String + + """Mailing Postal Code""" + mailingPostalCode: String + + """Mailing Country""" + mailingCountry: String + + """Mailing Geocode Accuracy""" + mailingGeocodeAccuracy: String + + """Latitude""" + latitude: String + + """Longitude""" + longitude: String + + """Primary SIC Code""" + primarySic: String + + """Primary SIC Description""" + primarySicDesc: String + + """Second SIC Code""" + secondSic: String + + """Second SIC Description""" + secondSicDesc: String + + """Third SIC Code""" + thirdSic: String + + """Third SIC Description""" + thirdSicDesc: String + + """Fourth SIC Code""" + fourthSic: String + + """Fourth SIC Description""" + fourthSicDesc: String + + """Fifth SIC Code""" + fifthSic: String + + """Fifth SIC Description""" + fifthSicDesc: String + + """Sixth SIC Code""" + sixthSic: String + + """Sixth SIC Description""" + sixthSicDesc: String + + """Primary NAICS Code""" + primaryNaics: String + + """Primary NAICS Description""" + primaryNaicsDesc: String + + """Second NAICS Code""" + secondNaics: String + + """Second NAICS Description""" + secondNaicsDesc: String + + """Third NAICS Code""" + thirdNaics: String + + """Third NAICS Description""" + thirdNaicsDesc: String + + """Fourth NAICS Code""" + fourthNaics: String + + """Fourth NAICS Description""" + fourthNaicsDesc: String + + """Fifth NAICS Code""" + fifthNaics: String + + """Fifth NAICS Description""" + fifthNaicsDesc: String + + """Sixth NAICS Code""" + sixthNaics: String + + """Sixth NAICS Description""" + sixthNaicsDesc: String + + """Location Ownership Indicator""" + ownOrRent: String + + """Number of Employees - Location""" + employeesHere: Float + + """Number of Employees - Location Indicator""" + employeesHereReliability: String + + """Annual Sales Volume Indicator""" + salesVolumeReliability: String + + """Local Currency Code""" + currencyCode: String + + """Legal Structure""" + legalStatus: String + + """Number of Employees - Global""" + globalUltimateTotalEmployees: Float + + """Number of Employees - Total Indicator""" + employeesTotalReliability: String + + """Minority-Owned Indicator""" + minorityOwned: String + + """Woman-Owned Indicator""" + womenOwned: String + + """Small Business Indicator""" + smallBusiness: String + + """Marketing Segmentation Cluster""" + marketingSegmentationCluster: String + + """Import/Export""" + importExportAgent: String + + """Subsidiary Indicator""" + subsidiary: String + + """Second Tradestyle""" + tradeStyle2: String + + """Third Tradestyle""" + tradeStyle3: String + + """Fourth Tradestyle""" + tradeStyle4: String + + """Fifth Tradestyle""" + tradeStyle5: String + + """National Identification Number""" + nationalId: String + + """National Identification System""" + nationalIdType: String + + """US Tax ID Number""" + usTaxId: String + + """Geocode Accuracy""" + geoCodeAccuracy: String + + """Number of Business Family Members""" + familyMembers: Int + + """Delinquency Risk""" + marketingPreScreen: String + + """Global Ultimate D-U-N-S Number""" + globalUltimateDunsNumber: String + + """Global Ultimate Business Name""" + globalUltimateBusinessName: String + + """Parent Company D-U-N-S Number""" + parentOrHqDunsNumber: String + + """Parent Company Business Name""" + parentOrHqBusinessName: String + + """Domestic Ultimate D-U-N-S Number""" + domesticUltimateDunsNumber: String + + """Domestic Ultimate Business Name""" + domesticUltimateBusinessName: String + + """Location Type""" + locationStatus: String + + """Local Currency ISO Code""" + companyCurrencyIsoCode: String + + """Company Description""" + description: String + + """Fortune 1000 Rank""" + fortuneRank: Int + + """S&P 500""" + includedInSnP500: String + + """Location Size""" + premisesMeasure: Int + + """Location Size Accuracy""" + premisesMeasureReliability: String + + """Location Size Unit of Measure""" + premisesMeasureUnit: String + + """Employee Growth""" + employeeQuantityGrowthRate: Float + + """Annual Revenue Growth""" + salesTurnoverGrowthRate: Float + + """Primary SIC8 Code""" + primarySic8: String + + """Primary SIC8 Description""" + primarySic8Desc: String + + """Second SIC8 Code""" + secondSic8: String + + """Second SIC8 Description """ + secondSic8Desc: String + + """Third SIC8 Code""" + thirdSic8: String + + """Third SIC8 Description""" + thirdSic8Desc: String + + """Fourth SIC8 Code""" + fourthSic8: String + + """Fourth SIC8 Description""" + fourthSic8Desc: String + + """Fifth SIC8 Code""" + fifthSic8: String + + """Fifth SIC8 Description""" + fifthSic8Desc: String + + """Sixth SIC8 Code""" + sixthSic8: String + + """Sixth SIC8 Description""" + sixthSic8Desc: String + + """Prior Year Number of Employees - Total""" + priorYearEmployees: Int + + """Prior Year Revenue""" + priorYearRevenue: Float +} + +input SalesforceCreateDandBCompanyInput { + dandBCompany: SalesforceDandBCompanyInput! +} + +type SalesforceCreateDandBCompanyPayload { + """DandBCompany created by the mutation.""" + dandBCompany: SalesforceDandBCompany! +} + +input SalesforcePlatformCachePartitionTypeInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Platform Cache Partition ID""" + platformCachePartitionId: String + + """Cache Type""" + cacheType: String + + """Allocated Capacity""" + allocatedCapacity: Int + + """Allocated Namespaced Purchased Capacity""" + allocatedPurchasedCapacity: Int + + """Allocated Trial Capacity""" + allocatedTrialCapacity: Int +} + +input SalesforceCreatePlatformCachePartitionTypeInput { + platformCachePartitionType: SalesforcePlatformCachePartitionTypeInput! +} + +type SalesforceCreatePlatformCachePartitionTypePayload { + """PlatformCachePartitionType created by the mutation.""" + platformCachePartitionType: SalesforcePlatformCachePartitionType! +} + +input SalesforceContentWorkspaceDocInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Library ID""" + contentWorkspaceId: String + + """ContentDocument ID""" + contentDocumentId: String +} + +input SalesforceCreateContentWorkspaceDocInput { + contentWorkspaceDoc: SalesforceContentWorkspaceDocInput! +} + +type SalesforceCreateContentWorkspaceDocPayload { + """ContentWorkspaceDoc created by the mutation.""" + contentWorkspaceDoc: SalesforceContentWorkspaceDoc! +} + +input SalesforceGroupInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Developer Name""" + developerName: String + + """Type""" + type: String + + """Email""" + email: String + + """Send Email to Members""" + doesSendEmailToMembers: Boolean + + """Include Bosses""" + doesIncludeBosses: Boolean +} + +input SalesforceCreateGroupInput { + group: SalesforceGroupInput! +} + +type SalesforceCreateGroupPayload { + """Group created by the mutation.""" + group: SalesforceGroup! +} + +input SalesforceDocumentInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Folder ID""" + folderId: String + + """Document Name""" + name: String + + """Document Unique Name""" + developerName: String + + """MIME Type""" + contentType: String + + """File Extension""" + type: String + + """Externally Available""" + isPublic: Boolean + + """Body""" + body: String + + """Url""" + url: String + + """Description""" + description: String + + """Keywords""" + keywords: String + + """Internal Use Only""" + isInternalUseOnly: Boolean + + """Author ID""" + authorId: String +} + +input SalesforceCreateDocumentInput { + document: SalesforceDocumentInput! +} + +type SalesforceCreateDocumentPayload { + """Document created by the mutation.""" + document: SalesforceDocument! +} + +input SalesforceSetupEntityAccessInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """Setup Entity ID""" + setupEntityId: String +} + +input SalesforceCreateSetupEntityAccessInput { + setupEntityAccess: SalesforceSetupEntityAccessInput! +} + +type SalesforceCreateSetupEntityAccessPayload { + """SetupEntityAccess created by the mutation.""" + setupEntityAccess: SalesforceSetupEntityAccess! +} + +input SalesforceDuplicateRecordSetInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Duplicate Rule ID""" + duplicateRuleId: String +} + +input SalesforceCreateDuplicateRecordSetInput { + duplicateRecordSet: SalesforceDuplicateRecordSetInput! +} + +type SalesforceCreateDuplicateRecordSetPayload { + """DuplicateRecordSet created by the mutation.""" + duplicateRecordSet: SalesforceDuplicateRecordSet! +} + +input SalesforceQuickTextInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Quick Text Name""" + name: String + + """Message""" + message: String + + """Category""" + category: String + + """Channel""" + channel: String +} + +input SalesforceCreateQuickTextInput { + quickText: SalesforceQuickTextInput! +} + +type SalesforceCreateQuickTextPayload { + """QuickText created by the mutation.""" + quickText: SalesforceQuickText! +} + +input SalesforceCorsWhitelistEntryInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + developerName: String + + """Master Language""" + language: String + + """Label""" + masterLabel: String + + """Origin URL Pattern""" + urlPattern: String +} + +input SalesforceCreateCorsWhitelistEntryInput { + corsWhitelistEntry: SalesforceCorsWhitelistEntryInput! +} + +type SalesforceCreateCorsWhitelistEntryPayload { + """CorsWhitelistEntry created by the mutation.""" + corsWhitelistEntry: SalesforceCorsWhitelistEntry! +} + +input SalesforceOutgoingEmailInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """External ID""" + externalId: String + + """From""" + validatedFromAddress: String + + """To""" + toAddress: String + + """CC""" + ccAddress: String + + """BCC""" + bccAddress: String + + """Subject""" + subject: String + + """Text Body""" + textBody: String + + """HTML Body""" + htmlBody: String + + """Related To ID""" + relatedToId: String + + """Name ID""" + whoId: String + + """Email Template ID""" + emailTemplateId: String +} + +input SalesforceCreateOutgoingEmailInput { + outgoingEmail: SalesforceOutgoingEmailInput! +} + +type SalesforceCreateOutgoingEmailPayload { + """OutgoingEmail created by the mutation.""" + outgoingEmail: SalesforceOutgoingEmail! +} + +input SalesforceChatterExtensionInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + developerName: String + + """Master Language""" + language: String + + """Label""" + masterLabel: String + + """Protected Component""" + isProtected: Boolean + + """Name""" + extensionName: String + + """Type""" + type: String + + """Asset File ID""" + iconId: String + + """Description""" + description: String + + """Lightning Definition Bundle ID""" + compositionComponentEnumOrId: String + + """Lightning Definition Bundle ID""" + renderComponentEnumOrId: String + + """Hover Text""" + hoverText: String + + """Header Text""" + headerText: String +} + +input SalesforceCreateChatterExtensionInput { + chatterExtension: SalesforceChatterExtensionInput! +} + +type SalesforceCreateChatterExtensionPayload { + """ChatterExtension created by the mutation.""" + chatterExtension: SalesforceChatterExtension! +} + +input SalesforceContentDocumentLinkInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Linked Entity ID""" + linkedEntityId: String + + """ContentDocument ID""" + contentDocumentId: String + + """Share Type""" + shareType: String + + """Visibility""" + visibility: String +} + +input SalesforceCreateContentDocumentLinkInput { + contentDocumentLink: SalesforceContentDocumentLinkInput! +} + +type SalesforceCreateContentDocumentLinkPayload { + """ContentDocumentLink created by the mutation.""" + contentDocumentLink: SalesforceContentDocumentLink! +} + +input SalesforceOpportunityCompetitorInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Opportunity ID""" + opportunityId: String + + """Competitor Name""" + competitorName: String + + """Strengths""" + strengths: String + + """Weaknesses""" + weaknesses: String +} + +input SalesforceCreateOpportunityCompetitorInput { + opportunityCompetitor: SalesforceOpportunityCompetitorInput! +} + +type SalesforceCreateOpportunityCompetitorPayload { + """OpportunityCompetitor created by the mutation.""" + opportunityCompetitor: SalesforceOpportunityCompetitor! +} + +input SalesforceIdeaCommentInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Idea ID""" + ideaId: String + + """Comment Body""" + commentBody: String +} + +input SalesforceCreateIdeaCommentInput { + ideaComment: SalesforceIdeaCommentInput! +} + +type SalesforceCreateIdeaCommentPayload { + """IdeaComment created by the mutation.""" + ideaComment: SalesforceIdeaComment! +} + +input SalesforceCaseTeamTemplateRecordInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Case ID""" + parentId: String + + """Team Template ID""" + teamTemplateId: String +} + +input SalesforceCreateCaseTeamTemplateRecordInput { + caseTeamTemplateRecord: SalesforceCaseTeamTemplateRecordInput! +} + +type SalesforceCreateCaseTeamTemplateRecordPayload { + """CaseTeamTemplateRecord created by the mutation.""" + caseTeamTemplateRecord: SalesforceCaseTeamTemplateRecord! +} + +input SalesforceGroupMemberInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Group ID""" + groupId: String + + """User/Group ID""" + userOrGroupId: String +} + +input SalesforceCreateGroupMemberInput { + groupMember: SalesforceGroupMemberInput! +} + +type SalesforceCreateGroupMemberPayload { + """GroupMember created by the mutation.""" + groupMember: SalesforceGroupMember! +} + +input SalesforceCaseTeamTemplateMemberInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Team Template ID""" + teamTemplateId: String + + """Member ID""" + memberId: String + + """Team Role ID""" + teamRoleId: String +} + +input SalesforceCreateCaseTeamTemplateMemberInput { + caseTeamTemplateMember: SalesforceCaseTeamTemplateMemberInput! +} + +type SalesforceCreateCaseTeamTemplateMemberPayload { + """CaseTeamTemplateMember created by the mutation.""" + caseTeamTemplateMember: SalesforceCaseTeamTemplateMember! +} + +input SalesforceApexTestResultLimitsInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Apex Test Result ID""" + apexTestResultId: String + + """Total number of SOQL queries issued""" + soql: Int + + """Total number of records retrieved by SOQL queries""" + queryRows: Int + + """Total number of SOSL queries issued""" + sosl: Int + + """Total number of DML statements issued""" + dml: Int + + """Total number of records processed as a result of DML statements""" + dmlRows: Int + + """Maximum CPU time on the Salesforce servers""" + cpu: Int + + """Total number of callouts""" + callouts: Int + + """Total number of sendEmail methods allowed""" + email: Int + + """Total number of async calls""" + asyncCalls: Int + + """ + Maximum number of push notification method calls allowed per Apex transaction + """ + mobilePush: Int + + """LimitContext""" + limitContext: String + + """LimitExceptions""" + limitExceptions: String +} + +input SalesforceCreateApexTestResultLimitsInput { + apexTestResultLimits: SalesforceApexTestResultLimitsInput! +} + +type SalesforceCreateApexTestResultLimitsPayload { + """ApexTestResultLimits created by the mutation.""" + apexTestResultLimits: SalesforceApexTestResultLimits! +} + +input SalesforceCaseTeamTemplateInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Description""" + description: String +} + +input SalesforceCreateCaseTeamTemplateInput { + caseTeamTemplate: SalesforceCaseTeamTemplateInput! +} + +type SalesforceCreateCaseTeamTemplatePayload { + """CaseTeamTemplate created by the mutation.""" + caseTeamTemplate: SalesforceCaseTeamTemplate! +} + +input SalesforceOutgoingEmailRelationInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """External ID""" + externalId: String + + """Outgoing Email ID""" + outgoingEmailId: String + + """Relation ID""" + relationId: String + + """Relation Address""" + relationAddress: String +} + +input SalesforceCreateOutgoingEmailRelationInput { + outgoingEmailRelation: SalesforceOutgoingEmailRelationInput! +} + +"""Outgoing Email Relation""" +type SalesforceOutgoingEmailRelation { + """Outgoing Email Relation ID""" + id: String! + + """External ID""" + externalId: String + + """Outgoing Email ID""" + outgoingEmailId: String + + """Relation ID""" + relationId: String + + """Relation ID""" + relation: SalesforceOutgoingEmailRelationRelationUnion + + """Relation Address""" + relationAddress: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! +} + +type SalesforceCreateOutgoingEmailRelationPayload { + """OutgoingEmailRelation created by the mutation.""" + outgoingEmailRelation: SalesforceOutgoingEmailRelation! +} + +input SalesforceObjectPermissionsInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """Sobject Type Name""" + sobjectType: String + + """Create Records""" + permissionsCreate: Boolean + + """Read Records""" + permissionsRead: Boolean + + """Edit Records""" + permissionsEdit: Boolean + + """Delete Records""" + permissionsDelete: Boolean + + """Read All Records""" + permissionsViewAllRecords: Boolean + + """Edit All Records""" + permissionsModifyAllRecords: Boolean +} + +input SalesforceCreateObjectPermissionsInput { + objectPermissions: SalesforceObjectPermissionsInput! +} + +type SalesforceCreateObjectPermissionsPayload { + """ObjectPermissions created by the mutation.""" + objectPermissions: SalesforceObjectPermissions! +} + +input SalesforceListViewChartInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Object Definition ID""" + sobjectType: String + + """API Name""" + developerName: String + + """Master Language""" + language: String + + """Label""" + masterLabel: String + + """User ID""" + ownerId: String + + """Chart Type""" + chartType: String + + """Custom Field Definition ID""" + groupingField: String + + """Custom Field Definition ID""" + aggregateField: String + + """Aggregate Type""" + aggregateType: String +} + +input SalesforceCreateListViewChartInput { + listViewChart: SalesforceListViewChartInput! +} + +type SalesforceCreateListViewChartPayload { + """ListViewChart created by the mutation.""" + listViewChart: SalesforceListViewChart! +} + +input SalesforceUserProvMockTargetInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """External User Id""" + externalUserId: String + + """External Username""" + externalUsername: String + + """External Email""" + externalEmail: String + + """External First Name""" + externalFirstName: String + + """External Last Name""" + externalLastName: String +} + +input SalesforceCreateUserProvMockTargetInput { + userProvMockTarget: SalesforceUserProvMockTargetInput! +} + +type SalesforceCreateUserProvMockTargetPayload { + """UserProvMockTarget created by the mutation.""" + userProvMockTarget: SalesforceUserProvMockTarget! +} + +input SalesforcePricebook2Input { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Price Book Name""" + name: String + + """Active""" + isActive: Boolean + + """Description""" + description: String +} + +input SalesforceCreatePricebook2Input { + pricebook2: SalesforcePricebook2Input! +} + +type SalesforceCreatePricebook2Payload { + """Pricebook2 created by the mutation.""" + pricebook2: SalesforcePricebook2! +} + +input SalesforceEmailDomainKeyInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Selector""" + selector: String + + """Domain""" + domain: String + + """Domain Match""" + domainMatch: String + + """Active""" + isActive: Boolean + + """Public Key""" + publicKey: String + + """Private Key""" + privateKey: String +} + +input SalesforceCreateEmailDomainKeyInput { + emailDomainKey: SalesforceEmailDomainKeyInput! +} + +type SalesforceCreateEmailDomainKeyPayload { + """EmailDomainKey created by the mutation.""" + emailDomainKey: SalesforceEmailDomainKey! +} + +input SalesforceFeedCommentInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Feed Item ID""" + feedItemId: String + + """Created By ID""" + createdById: String + + """Created Date""" + createdDate: String + + """Revision""" + revision: Int + + """Last Edit By ID""" + lastEditById: String + + """Last Edit Date""" + lastEditDate: String + + """Comment Body""" + commentBody: String + + """Comment Type""" + commentType: String + + """Related Record ID""" + relatedRecordId: String + + """Is Rich Text""" + isRichText: Boolean + + """Status""" + status: String +} + +input SalesforceCreateFeedCommentInput { + feedComment: SalesforceFeedCommentInput! +} + +type SalesforceCreateFeedCommentPayload { + """FeedComment created by the mutation.""" + feedComment: SalesforceFeedComment! +} + +input SalesforceLeadInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Last Name""" + lastName: String + + """First Name""" + firstName: String + + """Salutation""" + salutation: String + + """Title""" + title: String + + """Company""" + company: String + + """Street""" + street: String + + """City""" + city: String + + """State/Province""" + state: String + + """Zip/Postal Code""" + postalCode: String + + """Country""" + country: String + + """Latitude""" + latitude: Float + + """Longitude""" + longitude: Float + + """Geocode Accuracy""" + geocodeAccuracy: String + + """Phone""" + phone: String + + """Mobile Phone""" + mobilePhone: String + + """Fax""" + fax: String + + """Email""" + email: String + + """Website""" + website: String + + """Description""" + description: String + + """Lead Source""" + leadSource: String + + """Status""" + status: String + + """Industry""" + industry: String + + """Rating""" + rating: String + + """Annual Revenue""" + annualRevenue: Float + + """Employees""" + numberOfEmployees: Int + + """Owner ID""" + ownerId: String + + """Converted""" + isConverted: Boolean + + """Unread By Owner""" + isUnreadByOwner: Boolean + + """Data.com Key""" + jigsaw: String + + """Clean Status""" + cleanStatus: String + + """Company D-U-N-S Number""" + companyDunsNumber: String + + """D&B Company ID""" + dandbCompanyId: String +} + +input SalesforceCreateLeadInput { + lead: SalesforceLeadInput! +} + +type SalesforceCreateLeadPayload { + """Lead created by the mutation.""" + lead: SalesforceLead! +} + +input SalesforceWebLinkInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Page Or sObject Type Name""" + pageOrSobjectType: String + + """Name""" + name: String + + """Protected Component""" + isProtected: Boolean + + """URL""" + url: String + + """Link Encoding""" + encodingKey: String + + """Content Source""" + linkType: String + + """Behavior""" + openType: String + + """Height (in pixels)""" + height: Int + + """Width (in pixels)""" + width: Int + + """Show Address Bar""" + showsLocation: Boolean + + """Show Scrollbars""" + hasScrollbars: Boolean + + """Show Toolbars""" + hasToolbar: Boolean + + """Show Menu Bar""" + hasMenubar: Boolean + + """Show Status Bar""" + showsStatus: Boolean + + """Resizeable""" + isResizable: Boolean + + """Window Position""" + position: String + + """Custom S-Control ID""" + scontrolId: String + + """Label""" + masterLabel: String + + """Description""" + description: String + + """Display Type""" + displayType: String + + """Require Row Selection""" + requireRowSelection: Boolean +} + +input SalesforceCreateWebLinkInput { + webLink: SalesforceWebLinkInput! +} + +type SalesforceCreateWebLinkPayload { + """WebLink created by the mutation.""" + webLink: SalesforceWebLink! +} + +input SalesforceEventRelationInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Relation ID""" + relationId: String + + """Event ID""" + eventId: String + + """Status""" + status: String + + """Response Date""" + respondedDate: String + + """Response""" + response: String +} + +input SalesforceCreateEventRelationInput { + eventRelation: SalesforceEventRelationInput! +} + +type SalesforceCreateEventRelationPayload { + """EventRelation created by the mutation.""" + eventRelation: SalesforceEventRelation! +} + +input SalesforceStaticResourceInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """MIME Type""" + contentType: String + + """Body""" + body: String + + """Description""" + description: String + + """Cache Control""" + cacheControl: String +} + +input SalesforceCreateStaticResourceInput { + staticResource: SalesforceStaticResourceInput! +} + +type SalesforceCreateStaticResourcePayload { + """StaticResource created by the mutation.""" + staticResource: SalesforceStaticResource! +} + +input SalesforceTodayGoalShareInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """User/Group ID""" + userOrGroupId: String + + """Custom Object Access""" + accessLevel: String + + """Row Cause""" + rowCause: String +} + +input SalesforceCreateTodayGoalShareInput { + todayGoalShare: SalesforceTodayGoalShareInput! +} + +type SalesforceCreateTodayGoalSharePayload { + """TodayGoalShare created by the mutation.""" + todayGoalShare: SalesforceTodayGoalShare! +} + +input SalesforceContentFolderInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Parent Content Folder ID""" + parentContentFolderId: String +} + +input SalesforceCreateContentFolderInput { + contentFolder: SalesforceContentFolderInput! +} + +type SalesforceCreateContentFolderPayload { + """ContentFolder created by the mutation.""" + contentFolder: SalesforceContentFolder! +} + +input SalesforceContentDistributionInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Content Delivery Name""" + name: String + + """ContentVersion ID""" + contentVersionId: String + + """Related Record ID""" + relatedRecordId: String + + """Allow Download as PDF""" + preferencesAllowPdfDownload: Boolean + + """Allow Download in Original Format""" + preferencesAllowOriginalDownload: Boolean + + """Require Password to Access Content""" + preferencesPasswordRequired: Boolean + + """Notify Me of First View or Download""" + preferencesNotifyOnVisit: Boolean + + """Content Delivery Opens Latest Version""" + preferencesLinkLatestVersion: Boolean + + """Allow View in the Browser""" + preferencesAllowViewInBrowser: Boolean + + """Content Delivery Expires""" + preferencesExpires: Boolean + + """Email when Preview Images are Ready""" + preferencesNotifyRndtnComplete: Boolean + + """Expiration Date""" + expiryDate: String +} + +input SalesforceCreateContentDistributionInput { + contentDistribution: SalesforceContentDistributionInput! +} + +type SalesforceCreateContentDistributionPayload { + """ContentDistribution created by the mutation.""" + contentDistribution: SalesforceContentDistribution! +} + +input SalesforceCategoryDataInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Category Node ID""" + categoryNodeId: String + + """SObject ID""" + relatedSobjectId: String +} + +input SalesforceCreateCategoryDataInput { + categoryData: SalesforceCategoryDataInput! +} + +type SalesforceCreateCategoryDataPayload { + """CategoryData created by the mutation.""" + categoryData: SalesforceCategoryData! +} + +input SalesforceListEmailShareInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """User/Group ID""" + userOrGroupId: String + + """Custom Object Access""" + accessLevel: String + + """Row Cause""" + rowCause: String +} + +input SalesforceCreateListEmailShareInput { + listEmailShare: SalesforceListEmailShareInput! +} + +type SalesforceCreateListEmailSharePayload { + """ListEmailShare created by the mutation.""" + listEmailShare: SalesforceListEmailShare! +} + +input SalesforceChatterExtensionConfigInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Chatter Extension ID""" + chatterExtensionId: String + + """Can Create""" + canCreate: Boolean + + """Can Read""" + canRead: Boolean + + """Position""" + position: Int +} + +input SalesforceCreateChatterExtensionConfigInput { + chatterExtensionConfig: SalesforceChatterExtensionConfigInput! +} + +type SalesforceCreateChatterExtensionConfigPayload { + """ChatterExtensionConfig created by the mutation.""" + chatterExtensionConfig: SalesforceChatterExtensionConfig! +} + +input SalesforcePricebookEntryInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Price Book ID""" + pricebook2Id: String + + """Product ID""" + product2Id: String + + """List Price""" + unitPrice: Float + + """Active""" + isActive: Boolean + + """Use Standard Price""" + useStandardPrice: Boolean +} + +input SalesforceCreatePricebookEntryInput { + pricebookEntry: SalesforcePricebookEntryInput! +} + +type SalesforceCreatePricebookEntryPayload { + """PricebookEntry created by the mutation.""" + pricebookEntry: SalesforcePricebookEntry! +} + +input SalesforceFeedAttachmentInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Feed Entity ID""" + feedEntityId: String + + """Feed Attachment Type""" + type: String + + """Attachment Record ID""" + recordId: String + + """Feed Attachment Title""" + title: String + + """Feed Attachment Value""" + value: String +} + +input SalesforceCreateFeedAttachmentInput { + feedAttachment: SalesforceFeedAttachmentInput! +} + +type SalesforceCreateFeedAttachmentPayload { + """FeedAttachment created by the mutation.""" + feedAttachment: SalesforceFeedAttachment! +} + +input SalesforceCaseTeamRoleInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Access Level""" + accessLevel: String + + """Visible in Customer Portal""" + preferencesVisibleInCsp: Boolean +} + +input SalesforceCreateCaseTeamRoleInput { + caseTeamRole: SalesforceCaseTeamRoleInput! +} + +type SalesforceCreateCaseTeamRolePayload { + """CaseTeamRole created by the mutation.""" + caseTeamRole: SalesforceCaseTeamRole! +} + +input SalesforceRecordTypeInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Record Type Name""" + developerName: String + + """Description""" + description: String + + """Business Process ID""" + businessProcessId: String + + """Sobject Type Name""" + sobjectType: String +} + +input SalesforceCreateRecordTypeInput { + recordType: SalesforceRecordTypeInput! +} + +type SalesforceCreateRecordTypePayload { + """RecordType created by the mutation.""" + recordType: SalesforceRecordType! +} + +input SalesforceListEmailInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Name""" + name: String + + """Subject""" + subject: String + + """Html Body""" + htmlBody: String + + """Text Body""" + textBody: String + + """From Name""" + fromName: String + + """From Address""" + fromAddress: String + + """Status""" + status: String +} + +input SalesforceCreateListEmailInput { + listEmail: SalesforceListEmailInput! +} + +type SalesforceCreateListEmailPayload { + """ListEmail created by the mutation.""" + listEmail: SalesforceListEmail! +} + +input SalesforceAccountContactRoleInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Account ID""" + accountId: String + + """Contact ID""" + contactId: String + + """Role""" + role: String + + """Primary""" + isPrimary: Boolean +} + +input SalesforceCreateAccountContactRoleInput { + accountContactRole: SalesforceAccountContactRoleInput! +} + +type SalesforceCreateAccountContactRolePayload { + """AccountContactRole created by the mutation.""" + accountContactRole: SalesforceAccountContactRole! +} + +input SalesforceUserPackageLicenseInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Package License ID""" + packageLicenseId: String + + """Assigned User ID""" + userId: String +} + +input SalesforceCreateUserPackageLicenseInput { + userPackageLicense: SalesforceUserPackageLicenseInput! +} + +type SalesforceCreateUserPackageLicensePayload { + """UserPackageLicense created by the mutation.""" + userPackageLicense: SalesforceUserPackageLicense! +} + +input SalesforceUserProvisioningRequestInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """User ID""" + salesforceUserId: String + + """External User Id""" + externalUserId: String + + """App Name""" + appName: String + + """State""" + state: String + + """Operation""" + operation: String + + """Scheduled Provisioning Time""" + scheduleDate: String + + """Connected App ID""" + connectedAppId: String + + """UserProvisioningConfig ID""" + userProvConfigId: String + + """User Provisioning Account ID""" + userProvAccountId: String + + """Approval Status""" + approvalStatus: String + + """User ID""" + managerId: String + + """Retry Count""" + retryCount: Int + + """UserProvisioningRequest ID""" + parentId: String +} + +input SalesforceCreateUserProvisioningRequestInput { + userProvisioningRequest: SalesforceUserProvisioningRequestInput! +} + +type SalesforceCreateUserProvisioningRequestPayload { + """UserProvisioningRequest created by the mutation.""" + userProvisioningRequest: SalesforceUserProvisioningRequest! +} + +input SalesforcePermissionSetLicenseAssignInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Permission Set License ID""" + permissionSetLicenseId: String + + """User ID""" + assigneeId: String +} + +input SalesforceCreatePermissionSetLicenseAssignInput { + permissionSetLicenseAssign: SalesforcePermissionSetLicenseAssignInput! +} + +type SalesforceCreatePermissionSetLicenseAssignPayload { + """PermissionSetLicenseAssign created by the mutation.""" + permissionSetLicenseAssign: SalesforcePermissionSetLicenseAssign! +} + +input SalesforceUserShareInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """User ID""" + userId: String + + """User/Group ID""" + userOrGroupId: String + + """User Access Level""" + userAccessLevel: String + + """Row Cause""" + rowCause: String +} + +input SalesforceCreateUserShareInput { + userShare: SalesforceUserShareInput! +} + +type SalesforceCreateUserSharePayload { + """UserShare created by the mutation.""" + userShare: SalesforceUserShare! +} + +input SalesforceCampaignMemberInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Campaign ID""" + campaignId: String + + """Lead ID""" + leadId: String + + """Contact ID""" + contactId: String + + """Status""" + status: String +} + +input SalesforceCreateCampaignMemberInput { + campaignMember: SalesforceCampaignMemberInput! +} + +type SalesforceCreateCampaignMemberPayload { + """CampaignMember created by the mutation.""" + campaignMember: SalesforceCampaignMember! +} + +input SalesforcePermissionSetInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Permission Set Name""" + name: String + + """Permission Set Label""" + label: String + + """License ID""" + licenseId: String + + """Send Email""" + permissionsEmailSingle: Boolean + + """Mass Email""" + permissionsEmailMass: Boolean + + """Edit Tasks""" + permissionsEditTask: Boolean + + """Edit Events""" + permissionsEditEvent: Boolean + + """Export Reports""" + permissionsExportReport: Boolean + + """Import Personal Contacts""" + permissionsImportPersonal: Boolean + + """Weekly Data Export""" + permissionsDataExport: Boolean + + """Manage Users""" + permissionsManageUsers: Boolean + + """Manage Public List Views""" + permissionsEditPublicFilters: Boolean + + """Manage Public Templates""" + permissionsEditPublicTemplates: Boolean + + """Modify All Data""" + permissionsModifyAllData: Boolean + + """Manage Cases""" + permissionsManageCases: Boolean + + """Mass Edits from Lists""" + permissionsMassInlineEdit: Boolean + + """Manage Articles""" + permissionsEditKnowledge: Boolean + + """Manage Salesforce Knowledge""" + permissionsManageKnowledge: Boolean + + """Manage Published Solutions""" + permissionsManageSolutions: Boolean + + """Customize Application""" + permissionsCustomizeApplication: Boolean + + """Edit Read Only Fields""" + permissionsEditReadonlyFields: Boolean + + """Run Reports""" + permissionsRunReports: Boolean + + """View Setup and Configuration""" + permissionsViewSetup: Boolean + + """Transfer Record""" + permissionsTransferAnyEntity: Boolean + + """Report Builder""" + permissionsNewReportBuilder: Boolean + + """Activate Contracts""" + permissionsActivateContract: Boolean + + """Activate Orders""" + permissionsActivateOrder: Boolean + + """Import Leads""" + permissionsImportLeads: Boolean + + """Manage Leads""" + permissionsManageLeads: Boolean + + """Transfer Leads""" + permissionsTransferAnyLead: Boolean + + """View All Data""" + permissionsViewAllData: Boolean + + """Manage Public Documents""" + permissionsEditPublicDocuments: Boolean + + """View Encrypted Data""" + permissionsViewEncryptedData: Boolean + + """Manage Letterheads""" + permissionsEditBrandTemplates: Boolean + + """Edit HTML Templates""" + permissionsEditHtmlTemplates: Boolean + + """Chatter Internal User""" + permissionsChatterInternalUser: Boolean + + """Manage Encryption Keys""" + permissionsManageEncryptionKeys: Boolean + + """Delete Activated Contracts""" + permissionsDeleteActivatedContract: Boolean + + """Invite Customers To Chatter""" + permissionsChatterInviteExternalUsers: Boolean + + """Send Stay-in-Touch Requests""" + permissionsSendSitRequests: Boolean + + """Manage Connected Apps""" + permissionsManageRemoteAccess: Boolean + + """Drag-and-Drop Dashboard Builder""" + permissionsCanUseNewDashboardBuilder: Boolean + + """Manage Categories""" + permissionsManageCategories: Boolean + + """Convert Leads""" + permissionsConvertLeads: Boolean + + """Password Never Expires""" + permissionsPasswordNeverExpires: Boolean + + """Use Team Reassignment Wizards""" + permissionsUseTeamReassignWizards: Boolean + + """Edit Activated Orders""" + permissionsEditActivatedOrders: Boolean + + """Download AppExchange Packages""" + permissionsInstallPackaging: Boolean + + """Upload AppExchange Packages""" + permissionsPublishPackaging: Boolean + + """Create and Own New Chatter Groups""" + permissionsChatterOwnGroups: Boolean + + """Edit Opportunity Product Sales Price""" + permissionsEditOppLineItemUnitPrice: Boolean + + """Create AppExchange Packages""" + permissionsCreatePackaging: Boolean + + """Bulk API Hard Delete""" + permissionsBulkApiHardDelete: Boolean + + """Import Solutions""" + permissionsSolutionImport: Boolean + + """Manage Call Centers""" + permissionsManageCallCenters: Boolean + + """Manage Synonyms""" + permissionsManageSynonyms: Boolean + + """View Content in Portals""" + permissionsViewContent: Boolean + + """Manage Email Client Configurations""" + permissionsManageEmailClientConfig: Boolean + + """Send Outbound Messages""" + permissionsEnableNotifications: Boolean + + """Manage Data Integrations""" + permissionsManageDataIntegrations: Boolean + + """Create Content Deliveries""" + permissionsDistributeFromPersWksp: Boolean + + """View Data Categories""" + permissionsViewDataCategories: Boolean + + """Manage Data Categories""" + permissionsManageDataCategories: Boolean + + """Author Apex""" + permissionsAuthorApex: Boolean + + """Manage Mobile Configurations""" + permissionsManageMobile: Boolean + + """API Enabled""" + permissionsApiEnabled: Boolean + + """Manage Custom Report Types""" + permissionsManageCustomReportTypes: Boolean + + """Edit Case Comments""" + permissionsEditCaseComments: Boolean + + """Transfer Cases""" + permissionsTransferAnyCase: Boolean + + """Manage Salesforce CRM Content""" + permissionsContentAdministrator: Boolean + + """Create Libraries""" + permissionsCreateWorkspaces: Boolean + + """Manage Content Permissions""" + permissionsManageContentPermissions: Boolean + + """Manage Content Properties""" + permissionsManageContentProperties: Boolean + + """Manage record types and layouts for Files""" + permissionsManageContentTypes: Boolean + + """Manage Lightning Sync""" + permissionsManageExchangeConfig: Boolean + + """Manage Reporting Snapshots""" + permissionsManageAnalyticSnapshots: Boolean + + """Schedule Reports""" + permissionsScheduleReports: Boolean + + """Manage Business Hours Holidays""" + permissionsManageBusinessHourHolidays: Boolean + + """Manage Dynamic Dashboards""" + permissionsManageDynamicDashboards: Boolean + + """Show Custom Sidebar On All Pages""" + permissionsCustomSidebarOnAllPages: Boolean + + """Manage Flow""" + permissionsManageInteraction: Boolean + + """View My Team's Dashboards""" + permissionsViewMyTeamsDashboards: Boolean + + """Moderate Chatter""" + permissionsModerateChatter: Boolean + + """Reset User Passwords and Unlock Users""" + permissionsResetPasswords: Boolean + + """Require Flow User Feature License""" + permissionsFlowUflRequired: Boolean + + """Insert System Field Values for Chatter Feeds""" + permissionsCanInsertFeedSystemFields: Boolean + + """Manage Knowledge Article Import/Export""" + permissionsManageKnowledgeImportExport: Boolean + + """Manage Email Templates""" + permissionsEmailTemplateManagement: Boolean + + """Email Administration""" + permissionsEmailAdministration: Boolean + + """Manage Chatter Messages and Direct Messages""" + permissionsManageChatterMessages: Boolean + + """Email-Based Identity Verification Option""" + permissionsAllowEmailIc: Boolean + + """Create Public Links""" + permissionsChatterFileLink: Boolean + + """Two-Factor Authentication for User Interface Logins""" + permissionsForceTwoFactor: Boolean + + """View Event Log Files""" + permissionsViewEventLogFiles: Boolean + + """Create and Set Up Communities""" + permissionsManageNetworks: Boolean + + """Manage Auth. Providers""" + permissionsManageAuthProviders: Boolean + + """Run Flows""" + permissionsRunFlow: Boolean + + """Create and Customize Dashboards""" + permissionsCreateCustomizeDashboards: Boolean + + """Create Dashboard Folders""" + permissionsCreateDashboardFolders: Boolean + + """View Dashboards in Public Folders""" + permissionsViewPublicDashboards: Boolean + + """Manage Dashboards in Public Folders""" + permissionsManageDashbdsInPubFolders: Boolean + + """Create and Customize Reports""" + permissionsCreateCustomizeReports: Boolean + + """Create Report Folders""" + permissionsCreateReportFolders: Boolean + + """View Reports in Public Folders""" + permissionsViewPublicReports: Boolean + + """Manage Reports in Public Folders""" + permissionsManageReportsInPubFolders: Boolean + + """Edit My Dashboards""" + permissionsEditMyDashboards: Boolean + + """Edit My Reports""" + permissionsEditMyReports: Boolean + + """View All Users""" + permissionsViewAllUsers: Boolean + + """Knowledge One""" + permissionsAllowUniversalSearch: Boolean + + """Connect Organization to Environment Hub""" + permissionsConnectOrgToEnvironmentHub: Boolean + + """Enable Work.com Calibration""" + permissionsWorkCalibrationUser: Boolean + + """Create and Customize List Views""" + permissionsCreateCustomizeFilters: Boolean + + """Enable Work.com""" + permissionsWorkDotComUserPerm: Boolean + + """Manage Communities""" + permissionsGovernNetworks: Boolean + + """Sales Console""" + permissionsSalesConsole: Boolean + + """Two-Factor Authentication for API Logins""" + permissionsTwoFactorApi: Boolean + + """Delete Topics""" + permissionsDeleteTopics: Boolean + + """Edit Topics""" + permissionsEditTopics: Boolean + + """Create Topics""" + permissionsCreateTopics: Boolean + + """Assign Topics""" + permissionsAssignTopics: Boolean + + """Use Identity Features""" + permissionsIdentityEnabled: Boolean + + """Use Identity Connect""" + permissionsIdentityConnect: Boolean + + """Allow View Knowledge""" + permissionsAllowViewKnowledge: Boolean + + """Access Libraries""" + permissionsContentWorkspaces: Boolean + + """Manage Promoted Search Terms""" + permissionsManageSearchPromotionRules: Boolean + + """Access Custom Mobile Apps""" + permissionsCustomMobileAppsAccess: Boolean + + """View Help Link""" + permissionsViewHelpLink: Boolean + + """Manage Profiles and Permission Sets""" + permissionsManageProfilesPermissionsets: Boolean + + """Assign Permission Sets""" + permissionsAssignPermissionSets: Boolean + + """Manage Roles""" + permissionsManageRoles: Boolean + + """Manage IP Addresses""" + permissionsManageIpAddresses: Boolean + + """Manage Sharing""" + permissionsManageSharing: Boolean + + """Manage Internal Users""" + permissionsManageInternalUsers: Boolean + + """Manage Password Policies""" + permissionsManagePasswordPolicies: Boolean + + """Manage Login Access Policies""" + permissionsManageLoginAccessPolicies: Boolean + + """Manage Custom Permissions""" + permissionsManageCustomPermissions: Boolean + + """Verify Answers to Chatter Questions""" + permissionsCanVerifyComment: Boolean + + """Manage Unlisted Groups""" + permissionsManageUnlistedGroups: Boolean + + """Modify Secure Agents""" + permissionsModifySecureAgents: Boolean + + """Manage Two-Factor Authentication in API""" + permissionsManageTwoFactor: Boolean + + """Access Chatter For SharePoint""" + permissionsChatterForSharePoint: Boolean + + """Lightning Experience User""" + permissionsLightningExperienceUser: Boolean + + """Configure Custom Recommendations""" + permissionsConfigCustomRecs: Boolean + + """Manage Macros Users Can't Undo""" + permissionsSubmitMacrosAllowed: Boolean + + """Run Macros on Multiple Records""" + permissionsBulkMacrosAllowed: Boolean + + """Share internal Knowledge articles externally""" + permissionsShareInternalArticles: Boolean + + """Manage Session Permission Set Activations""" + permissionsManageSessionPermissionSets: Boolean + + """Send announcement emails""" + permissionsSendAnnouncementEmails: Boolean + + """Edit My Own Posts""" + permissionsChatterEditOwnPost: Boolean + + """Edit Posts on Records I Own""" + permissionsChatterEditOwnRecordPost: Boolean + + """Import Custom Objects""" + permissionsImportCustomObjects: Boolean + + """Manage Two-Factor Authentication in User Interface""" + permissionsDelegatedTwoFactor: Boolean + + """Allow Inclusion of Code Snippets from UI""" + permissionsChatterComposeUiCodesnippet: Boolean + + """Select Files from Salesforce""" + permissionsSelectFilesFromSalesforce: Boolean + + """Moderate Community Users""" + permissionsModerateNetworkUsers: Boolean + + """Merge Topics""" + permissionsMergeTopics: Boolean + + """Subscribe to Reports""" + permissionsSubscribeToLightningReports: Boolean + + """Manage All Private Reports and Dashboards""" + permissionsManagePvtRptsAndDashbds: Boolean + + """Lightning Login User""" + permissionsAllowLightningLogin: Boolean + + """Campaign Influence""" + permissionsCampaignInfluence2: Boolean + + """Access to view Data Assessment""" + permissionsViewDataAssessment: Boolean + + """Remove People from Direct Messages""" + permissionsRemoveDirectMessageMembers: Boolean + + """Can Approve Feed Post and Comment""" + permissionsCanApproveFeedPost: Boolean + + """Add People to Direct Messages""" + permissionsAddDirectMessageMembers: Boolean + + """View and Edit Converted Leads""" + permissionsAllowViewEditConvertedLeads: Boolean + + """Show Company Name as Community Role""" + permissionsShowCompanyNameAsUserBadge: Boolean + + """Access Community Management""" + permissionsAccessCmc: Boolean + + """View Health Check""" + permissionsViewHealthCheck: Boolean + + """Manage Health Check""" + permissionsManageHealthCheck: Boolean + + """Create and Update Second-Generation Packages""" + permissionsPackaging2: Boolean + + """Manage Certificates""" + permissionsManageCertificates: Boolean + + """Report Builder (Lightning Experience)""" + permissionsCreateReportInLightning: Boolean + + """Hide Option to Switch to Salesforce Classic""" + permissionsPreventClassicExperience: Boolean + + """Hide the Seen By List""" + permissionsHideReadByList: Boolean + + """Allow sending of List Emails""" + permissionsListEmailSend: Boolean + + """Pin Posts in Feeds""" + permissionsFeedPinning: Boolean + + """Change Dashboard Colors""" + permissionsChangeDashboardColors: Boolean + + """IoT User""" + permissionsIotUser: Boolean + + """Allow Access to Customized Actions""" + permissionsUseWebLink: Boolean + + """View All Activities""" + permissionsViewAllActivities: Boolean + + """Subscribe to Reports: Add Recipients""" + permissionsSubscribeReportToOtherUsers: Boolean + + """Lightning Console User""" + permissionsLightningConsoleAllowedForUser: Boolean + + """Subscribe to Reports: Set Running User""" + permissionsSubscribeReportsRunAsUser: Boolean + + """Subscribe to Dashboards""" + permissionsSubscribeToLightningDashboards: Boolean + + """Apex REST Services""" + permissionsApexRestServices: Boolean + + """Show App Launcher in Communities""" + permissionsEnableCommunityAppLauncher: Boolean + + """Manage Surveys""" + permissionsManageSurveys: Boolean + + """View Roles and Role Hierarchy""" + permissionsViewRoles: Boolean + + """Description""" + description: String + + """Session Activation Required""" + hasActivationRequired: Boolean +} + +input SalesforceCreatePermissionSetInput { + permissionSet: SalesforcePermissionSetInput! +} + +type SalesforceCreatePermissionSetPayload { + """PermissionSet created by the mutation.""" + permissionSet: SalesforcePermissionSet! +} + +input SalesforceActionLinkTemplateInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Action Link Group Template ID""" + actionLinkGroupTemplateId: String + + """Label Key""" + labelKey: String + + """HTTP Method""" + method: String + + """Action Type""" + linkType: String + + """Position""" + position: Int + + """Confirmation Required""" + isConfirmationRequired: Boolean + + """Default Link in Group""" + isGroupDefault: Boolean + + """User Visibility""" + userVisibility: String + + """Custom User Alias""" + userAlias: String + + """Label""" + label: String + + """Action URL""" + actionUrl: String + + """HTTP Request Body""" + requestBody: String + + """HTTP Headers""" + headers: String +} + +input SalesforceCreateActionLinkTemplateInput { + actionLinkTemplate: SalesforceActionLinkTemplateInput! +} + +type SalesforceCreateActionLinkTemplatePayload { + """ActionLinkTemplate created by the mutation.""" + actionLinkTemplate: SalesforceActionLinkTemplate! +} + +input SalesforceAccountInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Account Name""" + name: String + + """Account Type""" + type: String + + """Parent Account ID""" + parentId: String + + """Billing Street""" + billingStreet: String + + """Billing City""" + billingCity: String + + """Billing State/Province""" + billingState: String + + """Billing Zip/Postal Code""" + billingPostalCode: String + + """Billing Country""" + billingCountry: String + + """Billing Latitude""" + billingLatitude: Float + + """Billing Longitude""" + billingLongitude: Float + + """Billing Geocode Accuracy""" + billingGeocodeAccuracy: String + + """Shipping Street""" + shippingStreet: String + + """Shipping City""" + shippingCity: String + + """Shipping State/Province""" + shippingState: String + + """Shipping Zip/Postal Code""" + shippingPostalCode: String + + """Shipping Country""" + shippingCountry: String + + """Shipping Latitude""" + shippingLatitude: Float + + """Shipping Longitude""" + shippingLongitude: Float + + """Shipping Geocode Accuracy""" + shippingGeocodeAccuracy: String + + """Account Phone""" + phone: String + + """Account Fax""" + fax: String + + """Account Number""" + accountNumber: String + + """Website""" + website: String + + """SIC Code""" + sic: String + + """Industry""" + industry: String + + """Annual Revenue""" + annualRevenue: Float + + """Employees""" + numberOfEmployees: Int + + """Ownership""" + ownership: String + + """Ticker Symbol""" + tickerSymbol: String + + """Account Description""" + description: String + + """Account Rating""" + rating: String + + """Account Site""" + site: String + + """Owner ID""" + ownerId: String + + """Data.com Key""" + jigsaw: String + + """Clean Status""" + cleanStatus: String + + """Account Source""" + accountSource: String + + """D-U-N-S Number""" + dunsNumber: String + + """Tradestyle""" + tradestyle: String + + """NAICS Code""" + naicsCode: String + + """NAICS Description""" + naicsDesc: String + + """Year Started""" + yearStarted: String + + """SIC Description""" + sicDesc: String + + """D&B Company ID""" + dandbCompanyId: String +} + +input SalesforceCreateAccountInput { + account: SalesforceAccountInput! +} + +type SalesforceCreateAccountPayload { + """Account created by the mutation.""" + account: SalesforceAccount! +} + +input SalesforceEmailCaptureInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """To""" + toPattern: String + + """From""" + fromPattern: String +} + +input SalesforceCreateEmailCaptureInput { + emailCapture: SalesforceEmailCaptureInput! +} + +type SalesforceCreateEmailCapturePayload { + """EmailCapture created by the mutation.""" + emailCapture: SalesforceEmailCapture! +} + +input SalesforceCaseSolutionInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Case ID""" + caseId: String + + """Solution ID""" + solutionId: String +} + +input SalesforceCreateCaseSolutionInput { + caseSolution: SalesforceCaseSolutionInput! +} + +type SalesforceCreateCaseSolutionPayload { + """CaseSolution created by the mutation.""" + caseSolution: SalesforceCaseSolution! +} + +input SalesforceOpportunityContactRoleInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Opportunity ID""" + opportunityId: String + + """Contact ID""" + contactId: String + + """Role""" + role: String + + """Primary""" + isPrimary: Boolean +} + +input SalesforceCreateOpportunityContactRoleInput { + opportunityContactRole: SalesforceOpportunityContactRoleInput! +} + +type SalesforceCreateOpportunityContactRolePayload { + """OpportunityContactRole created by the mutation.""" + opportunityContactRole: SalesforceOpportunityContactRole! +} + +input SalesforceUserRoleInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Parent Role ID""" + parentRoleId: String + + """Description""" + rollupDescription: String + + """Opportunity Access Level for Account Owner""" + opportunityAccessForAccountOwner: String + + """Case Access Level for Account Owner""" + caseAccessForAccountOwner: String + + """User ID""" + forecastUserId: String + + """Developer Name""" + developerName: String + + """Account ID""" + portalAccountId: String + + """Portal Type""" + portalType: String +} + +input SalesforceCreateUserRoleInput { + userRole: SalesforceUserRoleInput! +} + +type SalesforceCreateUserRolePayload { + """UserRole created by the mutation.""" + userRole: SalesforceUserRole! +} + +input SalesforceAssetRelationshipInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Asset ID""" + assetId: String + + """Asset ID""" + relatedAssetId: String + + """From Date""" + fromDate: String + + """To Date""" + toDate: String + + """Relationship Type""" + relationshipType: String +} + +input SalesforceCreateAssetRelationshipInput { + assetRelationship: SalesforceAssetRelationshipInput! +} + +type SalesforceCreateAssetRelationshipPayload { + """AssetRelationship created by the mutation.""" + assetRelationship: SalesforceAssetRelationship! +} + +input SalesforceCollaborationGroupMemberInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """CollaborationGroup ID""" + collaborationGroupId: String + + """Member ID""" + memberId: String + + """Group Member Role""" + collaborationRole: String + + """Notification Frequency""" + notificationFrequency: String +} + +input SalesforceCreateCollaborationGroupMemberInput { + collaborationGroupMember: SalesforceCollaborationGroupMemberInput! +} + +type SalesforceCreateCollaborationGroupMemberPayload { + """CollaborationGroupMember created by the mutation.""" + collaborationGroupMember: SalesforceCollaborationGroupMember! +} + +input SalesforceUserPreferenceInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """User ID""" + userId: String + + """Preference""" + preference: String + + """Value""" + value: String +} + +input SalesforceCreateUserPreferenceInput { + userPreference: SalesforceUserPreferenceInput! +} + +type SalesforceCreateUserPreferencePayload { + """UserPreference created by the mutation.""" + userPreference: SalesforceUserPreference! +} + +input SalesforceOrgDeleteRequestInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Request Type""" + requestType: String +} + +input SalesforceCreateOrgDeleteRequestInput { + orgDeleteRequest: SalesforceOrgDeleteRequestInput! +} + +type SalesforceCreateOrgDeleteRequestPayload { + """OrgDeleteRequest created by the mutation.""" + orgDeleteRequest: SalesforceOrgDeleteRequest! +} + +input SalesforceMailmergeTemplateInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Description""" + description: String + + """File""" + filename: String + + """Body""" + body: String + + """Attachment has been scanned for XSS""" + securityOptionsAttachmentScannedForXss: Boolean + + """XSS threat was detected in the attachment""" + securityOptionsAttachmentHasXssThreat: Boolean + + """Attachment has been scanned for Flash Injection""" + securityOptionsAttachmentScannedforFlash: Boolean + + """Flash Injection was detected in the attachment""" + securityOptionsAttachmentHasFlash: Boolean +} + +input SalesforceCreateMailmergeTemplateInput { + mailmergeTemplate: SalesforceMailmergeTemplateInput! +} + +type SalesforceCreateMailmergeTemplatePayload { + """MailmergeTemplate created by the mutation.""" + mailmergeTemplate: SalesforceMailmergeTemplate! +} + +input SalesforceCaseTeamMemberInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Case ID""" + parentId: String + + """Member ID""" + memberId: String + + """Team Role ID""" + teamRoleId: String +} + +input SalesforceCreateCaseTeamMemberInput { + caseTeamMember: SalesforceCaseTeamMemberInput! +} + +type SalesforceCreateCaseTeamMemberPayload { + """CaseTeamMember created by the mutation.""" + caseTeamMember: SalesforceCaseTeamMember! +} + +input SalesforceCallCenterInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Internal Name""" + internalName: String + + """Version""" + version: Float + + """CTI Adapter URL""" + adapterUrl: String + + """Custom Settings""" + customSettings: String +} + +input SalesforceCreateCallCenterInput { + callCenter: SalesforceCallCenterInput! +} + +type SalesforceCreateCallCenterPayload { + """CallCenter created by the mutation.""" + callCenter: SalesforceCallCenter! +} + +input SalesforceContentWorkspaceInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Description""" + description: String + + """Add Creator Membership""" + shouldAddCreatorMembership: Boolean + + """Unique Name""" + developerName: String +} + +input SalesforceCreateContentWorkspaceInput { + contentWorkspace: SalesforceContentWorkspaceInput! +} + +type SalesforceCreateContentWorkspacePayload { + """ContentWorkspace created by the mutation.""" + contentWorkspace: SalesforceContentWorkspace! +} + +input SalesforceQueueSobjectInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Group ID""" + queueId: String + + """Sobject Type""" + sobjectType: String +} + +input SalesforceCreateQueueSobjectInput { + queueSobject: SalesforceQueueSobjectInput! +} + +type SalesforceCreateQueueSobjectPayload { + """QueueSobject created by the mutation.""" + queueSobject: SalesforceQueueSobject! +} + +input SalesforceContentWorkspaceMemberInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Library ID""" + contentWorkspaceId: String + + """Library Permission ID""" + contentWorkspacePermissionId: String + + """Member ID""" + memberId: String +} + +input SalesforceCreateContentWorkspaceMemberInput { + contentWorkspaceMember: SalesforceContentWorkspaceMemberInput! +} + +type SalesforceCreateContentWorkspaceMemberPayload { + """ContentWorkspaceMember created by the mutation.""" + contentWorkspaceMember: SalesforceContentWorkspaceMember! +} + +input SalesforceApexTestSuiteInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Test Suite Name""" + testSuiteName: String +} + +input SalesforceCreateApexTestSuiteInput { + apexTestSuite: SalesforceApexTestSuiteInput! +} + +type SalesforceCreateApexTestSuitePayload { + """ApexTestSuite created by the mutation.""" + apexTestSuite: SalesforceApexTestSuite! +} + +input SalesforceTopicInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Description""" + description: String +} + +input SalesforceCreateTopicInput { + topic: SalesforceTopicInput! +} + +type SalesforceCreateTopicPayload { + """Topic created by the mutation.""" + topic: SalesforceTopic! +} + +input SalesforceEmailTemplateInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Email Template Name""" + name: String + + """Template Unique Name""" + developerName: String + + """Owner ID""" + ownerId: String + + """Folder ID""" + folderId: String + + """Letterhead ID""" + brandTemplateId: String + + """Style""" + templateStyle: String + + """Available For Use""" + isActive: Boolean + + """Template Type""" + templateType: String + + """Encoding""" + encoding: String + + """Description""" + description: String + + """Subject""" + subject: String + + """HTML Value""" + htmlValue: String + + """Email Body""" + body: String + + """API Version""" + apiVersion: Float + + """Markup""" + markup: String + + """UI Type""" + uiType: String + + """Custom Object Definition ID""" + relatedEntityType: String +} + +input SalesforceCreateEmailTemplateInput { + emailTemplate: SalesforceEmailTemplateInput! +} + +type SalesforceCreateEmailTemplatePayload { + """EmailTemplate created by the mutation.""" + emailTemplate: SalesforceEmailTemplate! +} + +input SalesforceContactInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Account ID""" + accountId: String + + """Last Name""" + lastName: String + + """First Name""" + firstName: String + + """Salutation""" + salutation: String + + """Other Street""" + otherStreet: String + + """Other City""" + otherCity: String + + """Other State/Province""" + otherState: String + + """Other Zip/Postal Code""" + otherPostalCode: String + + """Other Country""" + otherCountry: String + + """Other Latitude""" + otherLatitude: Float + + """Other Longitude""" + otherLongitude: Float + + """Other Geocode Accuracy""" + otherGeocodeAccuracy: String + + """Mailing Street""" + mailingStreet: String + + """Mailing City""" + mailingCity: String + + """Mailing State/Province""" + mailingState: String + + """Mailing Zip/Postal Code""" + mailingPostalCode: String + + """Mailing Country""" + mailingCountry: String + + """Mailing Latitude""" + mailingLatitude: Float + + """Mailing Longitude""" + mailingLongitude: Float + + """Mailing Geocode Accuracy""" + mailingGeocodeAccuracy: String + + """Business Phone""" + phone: String + + """Business Fax""" + fax: String + + """Mobile Phone""" + mobilePhone: String + + """Home Phone""" + homePhone: String + + """Other Phone""" + otherPhone: String + + """Asst. Phone""" + assistantPhone: String + + """Reports To ID""" + reportsToId: String + + """Email""" + email: String + + """Title""" + title: String + + """Department""" + department: String + + """Assistant's Name""" + assistantName: String + + """Lead Source""" + leadSource: String + + """Birthdate""" + birthdate: String + + """Contact Description""" + description: String + + """Owner ID""" + ownerId: String + + """Email Bounced Reason""" + emailBouncedReason: String + + """Email Bounced Date""" + emailBouncedDate: String + + """Data.com Key""" + jigsaw: String + + """Clean Status""" + cleanStatus: String +} + +input SalesforceCreateContactInput { + contact: SalesforceContactInput! +} + +type SalesforceCreateContactPayload { + """Contact created by the mutation.""" + contact: SalesforceContact! +} + +input SalesforceAuraDefinitionInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Lightning Definition Bundle ID""" + auraDefinitionBundleId: String + + """Definition Type""" + defType: String + + """Format""" + format: String + + """Source""" + source: String +} + +input SalesforceCreateAuraDefinitionInput { + auraDefinition: SalesforceAuraDefinitionInput! +} + +type SalesforceCreateAuraDefinitionPayload { + """AuraDefinition created by the mutation.""" + auraDefinition: SalesforceAuraDefinition! +} + +input SalesforceSecurityCustomBaselineInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + developerName: String + + """Master Language""" + language: String + + """Label""" + masterLabel: String + + """Baseline""" + baseline: String + + """Is Default Baseline""" + isDefault: Boolean +} + +input SalesforceCreateSecurityCustomBaselineInput { + securityCustomBaseline: SalesforceSecurityCustomBaselineInput! +} + +type SalesforceCreateSecurityCustomBaselinePayload { + """SecurityCustomBaseline created by the mutation.""" + securityCustomBaseline: SalesforceSecurityCustomBaseline! +} + +input SalesforceContentVersionInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """ContentDocument ID""" + contentDocumentId: String + + """Content URL""" + contentUrl: String + + """Content Body ID""" + contentBodyId: String + + """Title""" + title: String + + """Description""" + description: String + + """Reason For Change""" + reasonForChange: String + + """Prevent others from sharing and unsharing""" + sharingOption: String + + """File Privacy on Records""" + sharingPrivacy: String + + """Path On Client""" + pathOnClient: String + + """Content Modified Date""" + contentModifiedDate: String + + """Owner ID""" + ownerId: String + + """Tags""" + tagCsv: String + + """Version Data""" + versionData: String + + """First Publish Location ID""" + firstPublishLocationId: String + + """Content Origin""" + origin: String + + """Content Location""" + contentLocation: String + + """External Document Info1""" + externalDocumentInfo1: String + + """External Document Info2""" + externalDocumentInfo2: String + + """External Data Source ID""" + externalDataSourceId: String + + """Major Version""" + isMajorVersion: Boolean + + """Asset File Enabled""" + isAssetEnabled: Boolean +} + +input SalesforceCreateContentVersionInput { + contentVersion: SalesforceContentVersionInput! +} + +type SalesforceCreateContentVersionPayload { + """ContentVersion created by the mutation.""" + contentVersion: SalesforceContentVersion! +} + +input SalesforceCampaignMemberStatusInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Campaign ID""" + campaignId: String + + """Member Status""" + label: String + + """Sort Order""" + sortOrder: Int + + """Is Default""" + isDefault: Boolean + + """Responded""" + hasResponded: Boolean +} + +input SalesforceCreateCampaignMemberStatusInput { + campaignMemberStatus: SalesforceCampaignMemberStatusInput! +} + +type SalesforceCreateCampaignMemberStatusPayload { + """CampaignMemberStatus created by the mutation.""" + campaignMemberStatus: SalesforceCampaignMemberStatus! +} + +input SalesforceEventInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name ID""" + whoId: String + + """Related To ID""" + whatId: String + + """Subject""" + subject: String + + """Location""" + location: String + + """All-Day Event""" + isAllDayEvent: Boolean + + """Due Date Time""" + activityDateTime: String + + """Due Date Only""" + activityDate: String + + """Duration""" + durationInMinutes: Int + + """Start Date Time""" + startDateTime: String + + """End Date Time""" + endDateTime: String + + """Description""" + description: String + + """Assigned To ID""" + ownerId: String + + """Private""" + isPrivate: Boolean + + """Show Time As""" + showAs: String + + """Create Recurring Series of Events""" + isRecurrence: Boolean + + """Recurrence Start""" + recurrenceStartDateTime: String + + """Recurrence End""" + recurrenceEndDateOnly: String + + """Recurrence Time Zone""" + recurrenceTimeZoneSidKey: String + + """Recurrence Type""" + recurrenceType: String + + """Recurrence Interval""" + recurrenceInterval: Int + + """Recurrence Day of Week Mask""" + recurrenceDayOfWeekMask: Int + + """Recurrence Day of Month""" + recurrenceDayOfMonth: Int + + """Recurrence Instance""" + recurrenceInstance: String + + """Recurrence Month of Year""" + recurrenceMonthOfYear: String + + """Reminder Date/Time""" + reminderDateTime: String + + """Reminder Set""" + isReminderSet: Boolean + + """Event Subtype""" + eventSubtype: String +} + +input SalesforceCreateEventInput { + event: SalesforceEventInput! +} + +type SalesforceCreateEventPayload { + """Event created by the mutation.""" + event: SalesforceEvent! +} + +input SalesforceSearchPromotionRuleInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Term""" + query: String +} + +input SalesforceCreateSearchPromotionRuleInput { + searchPromotionRule: SalesforceSearchPromotionRuleInput! +} + +type SalesforceCreateSearchPromotionRulePayload { + """SearchPromotionRule created by the mutation.""" + searchPromotionRule: SalesforceSearchPromotionRule! +} + +input SalesforceExternalDataUserAuthInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """External Data Source ID""" + externalDataSourceId: String + + """User ID""" + userId: String + + """Authentication Protocol""" + protocol: String + + """Username""" + username: String + + """Password""" + password: String + + """Auth. Provider ID""" + authProviderId: String +} + +input SalesforceCreateExternalDataUserAuthInput { + externalDataUserAuth: SalesforceExternalDataUserAuthInput! +} + +type SalesforceCreateExternalDataUserAuthPayload { + """ExternalDataUserAuth created by the mutation.""" + externalDataUserAuth: SalesforceExternalDataUserAuth! +} + +input SalesforceAnnouncementInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Feed Item ID""" + feedItemId: String + + """Expiration Date""" + expirationDate: String +} + +input SalesforceCreateAnnouncementInput { + announcement: SalesforceAnnouncementInput! +} + +type SalesforceCreateAnnouncementPayload { + """Announcement created by the mutation.""" + announcement: SalesforceAnnouncement! +} + +input SalesforceUserAppMenuCustomizationInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Application ID""" + applicationId: String + + """Sort Order""" + sortOrder: Int +} + +input SalesforceCreateUserAppMenuCustomizationInput { + userAppMenuCustomization: SalesforceUserAppMenuCustomizationInput! +} + +type SalesforceCreateUserAppMenuCustomizationPayload { + """UserAppMenuCustomization created by the mutation.""" + userAppMenuCustomization: SalesforceUserAppMenuCustomization! +} + +input SalesforceTestSuiteMembershipInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Test Suite ID""" + apexTestSuiteId: String + + """Class ID""" + apexClassId: String +} + +input SalesforceCreateTestSuiteMembershipInput { + testSuiteMembership: SalesforceTestSuiteMembershipInput! +} + +type SalesforceCreateTestSuiteMembershipPayload { + """TestSuiteMembership created by the mutation.""" + testSuiteMembership: SalesforceTestSuiteMembership! +} + +input SalesforceCaseContactRoleInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Case ID""" + casesId: String + + """Contact ID""" + contactId: String + + """Role""" + role: String +} + +input SalesforceCreateCaseContactRoleInput { + caseContactRole: SalesforceCaseContactRoleInput! +} + +type SalesforceCreateCaseContactRolePayload { + """CaseContactRole created by the mutation.""" + caseContactRole: SalesforceCaseContactRole! +} + +input SalesforceUserInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Username""" + username: String + + """Last Name""" + lastName: String + + """First Name""" + firstName: String + + """Company Name""" + companyName: String + + """Division""" + division: String + + """Department""" + department: String + + """Title""" + title: String + + """Street""" + street: String + + """City""" + city: String + + """State/Province""" + state: String + + """Zip/Postal Code""" + postalCode: String + + """Country""" + country: String + + """Latitude""" + latitude: Float + + """Longitude""" + longitude: Float + + """Geocode Accuracy""" + geocodeAccuracy: String + + """Email""" + email: String + + """AutoBcc""" + emailPreferencesAutoBcc: Boolean + + """AutoBccStayInTouch""" + emailPreferencesAutoBccStayInTouch: Boolean + + """StayInTouchReminder""" + emailPreferencesStayInTouchReminder: Boolean + + """Email Sender Address""" + senderEmail: String + + """Email Sender Name""" + senderName: String + + """Email Signature""" + signature: String + + """Stay-in-Touch Email Subject""" + stayInTouchSubject: String + + """Stay-in-Touch Email Signature""" + stayInTouchSignature: String + + """Stay-in-Touch Email Note""" + stayInTouchNote: String + + """Phone""" + phone: String + + """Fax""" + fax: String + + """Cell""" + mobilePhone: String + + """Alias""" + alias: String + + """Nickname""" + communityNickname: String + + """Active""" + isActive: Boolean + + """Time Zone""" + timeZoneSidKey: String + + """Role ID""" + userRoleId: String + + """Locale""" + localeSidKey: String + + """Info Emails""" + receivesInfoEmails: Boolean + + """Admin Info Emails""" + receivesAdminInfoEmails: Boolean + + """Email Encoding""" + emailEncodingKey: String + + """Profile ID""" + profileId: String + + """Language""" + languageLocaleKey: String + + """Employee Number""" + employeeNumber: String + + """Delegated Approver ID""" + delegatedApproverId: String + + """Manager ID""" + managerId: String + + """Marketing User""" + userPermissionsMarketingUser: Boolean + + """Offline User""" + userPermissionsOfflineUser: Boolean + + """Auto-login To Call Center""" + userPermissionsCallCenterAutoLogin: Boolean + + """Apex Mobile User""" + userPermissionsMobileUser: Boolean + + """Salesforce CRM Content User""" + userPermissionsSfContentUser: Boolean + + """Knowledge User""" + userPermissionsKnowledgeUser: Boolean + + """Flow User""" + userPermissionsInteractionUser: Boolean + + """Service Cloud User""" + userPermissionsSupportUser: Boolean + + """Data.com User""" + userPermissionsJigsawProspectingUser: Boolean + + """Site.com Contributor User""" + userPermissionsSiteforceContributorUser: Boolean + + """Site.com Publisher User""" + userPermissionsSiteforcePublisherUser: Boolean + + """Work.com User""" + userPermissionsWorkDotComUserFeature: Boolean + + """Allow Forecasting""" + forecastEnabled: Boolean + + """ActivityRemindersPopup""" + userPreferencesActivityRemindersPopup: Boolean + + """EventRemindersCheckboxDefault""" + userPreferencesEventRemindersCheckboxDefault: Boolean + + """TaskRemindersCheckboxDefault""" + userPreferencesTaskRemindersCheckboxDefault: Boolean + + """ReminderSoundOff""" + userPreferencesReminderSoundOff: Boolean + + """DisableAllFeedsEmail""" + userPreferencesDisableAllFeedsEmail: Boolean + + """DisableFollowersEmail""" + userPreferencesDisableFollowersEmail: Boolean + + """DisableProfilePostEmail""" + userPreferencesDisableProfilePostEmail: Boolean + + """DisableChangeCommentEmail""" + userPreferencesDisableChangeCommentEmail: Boolean + + """DisableLaterCommentEmail""" + userPreferencesDisableLaterCommentEmail: Boolean + + """DisProfPostCommentEmail""" + userPreferencesDisProfPostCommentEmail: Boolean + + """ContentNoEmail""" + userPreferencesContentNoEmail: Boolean + + """ContentEmailAsAndWhen""" + userPreferencesContentEmailAsAndWhen: Boolean + + """ApexPagesDeveloperMode""" + userPreferencesApexPagesDeveloperMode: Boolean + + """HideCSNGetChatterMobileTask""" + userPreferencesHideCsnGetChatterMobileTask: Boolean + + """DisableMentionsPostEmail""" + userPreferencesDisableMentionsPostEmail: Boolean + + """DisMentionsCommentEmail""" + userPreferencesDisMentionsCommentEmail: Boolean + + """HideCSNDesktopTask""" + userPreferencesHideCsnDesktopTask: Boolean + + """HideChatterOnboardingSplash""" + userPreferencesHideChatterOnboardingSplash: Boolean + + """HideSecondChatterOnboardingSplash""" + userPreferencesHideSecondChatterOnboardingSplash: Boolean + + """DisCommentAfterLikeEmail""" + userPreferencesDisCommentAfterLikeEmail: Boolean + + """DisableLikeEmail""" + userPreferencesDisableLikeEmail: Boolean + + """SortFeedByComment""" + userPreferencesSortFeedByComment: Boolean + + """DisableMessageEmail""" + userPreferencesDisableMessageEmail: Boolean + + """JigsawListUser""" + userPreferencesJigsawListUser: Boolean + + """DisableBookmarkEmail""" + userPreferencesDisableBookmarkEmail: Boolean + + """DisableSharePostEmail""" + userPreferencesDisableSharePostEmail: Boolean + + """EnableAutoSubForFeeds""" + userPreferencesEnableAutoSubForFeeds: Boolean + + """DisableFileShareNotificationsForApi""" + userPreferencesDisableFileShareNotificationsForApi: Boolean + + """ShowTitleToExternalUsers""" + userPreferencesShowTitleToExternalUsers: Boolean + + """ShowManagerToExternalUsers""" + userPreferencesShowManagerToExternalUsers: Boolean + + """ShowEmailToExternalUsers""" + userPreferencesShowEmailToExternalUsers: Boolean + + """ShowWorkPhoneToExternalUsers""" + userPreferencesShowWorkPhoneToExternalUsers: Boolean + + """ShowMobilePhoneToExternalUsers""" + userPreferencesShowMobilePhoneToExternalUsers: Boolean + + """ShowFaxToExternalUsers""" + userPreferencesShowFaxToExternalUsers: Boolean + + """ShowStreetAddressToExternalUsers""" + userPreferencesShowStreetAddressToExternalUsers: Boolean + + """ShowCityToExternalUsers""" + userPreferencesShowCityToExternalUsers: Boolean + + """ShowStateToExternalUsers""" + userPreferencesShowStateToExternalUsers: Boolean + + """ShowPostalCodeToExternalUsers""" + userPreferencesShowPostalCodeToExternalUsers: Boolean + + """ShowCountryToExternalUsers""" + userPreferencesShowCountryToExternalUsers: Boolean + + """ShowProfilePicToGuestUsers""" + userPreferencesShowProfilePicToGuestUsers: Boolean + + """ShowTitleToGuestUsers""" + userPreferencesShowTitleToGuestUsers: Boolean + + """ShowCityToGuestUsers""" + userPreferencesShowCityToGuestUsers: Boolean + + """ShowStateToGuestUsers""" + userPreferencesShowStateToGuestUsers: Boolean + + """ShowPostalCodeToGuestUsers""" + userPreferencesShowPostalCodeToGuestUsers: Boolean + + """ShowCountryToGuestUsers""" + userPreferencesShowCountryToGuestUsers: Boolean + + """DisableFeedbackEmail""" + userPreferencesDisableFeedbackEmail: Boolean + + """DisableWorkEmail""" + userPreferencesDisableWorkEmail: Boolean + + """HideS1BrowserUI""" + userPreferencesHideS1BrowserUi: Boolean + + """DisableEndorsementEmail""" + userPreferencesDisableEndorsementEmail: Boolean + + """PathAssistantCollapsed""" + userPreferencesPathAssistantCollapsed: Boolean + + """CacheDiagnostics""" + userPreferencesCacheDiagnostics: Boolean + + """ShowEmailToGuestUsers""" + userPreferencesShowEmailToGuestUsers: Boolean + + """ShowManagerToGuestUsers""" + userPreferencesShowManagerToGuestUsers: Boolean + + """ShowWorkPhoneToGuestUsers""" + userPreferencesShowWorkPhoneToGuestUsers: Boolean + + """ShowMobilePhoneToGuestUsers""" + userPreferencesShowMobilePhoneToGuestUsers: Boolean + + """ShowFaxToGuestUsers""" + userPreferencesShowFaxToGuestUsers: Boolean + + """ShowStreetAddressToGuestUsers""" + userPreferencesShowStreetAddressToGuestUsers: Boolean + + """LightningExperiencePreferred""" + userPreferencesLightningExperiencePreferred: Boolean + + """PreviewLightning""" + userPreferencesPreviewLightning: Boolean + + """HideEndUserOnboardingAssistantModal""" + userPreferencesHideEndUserOnboardingAssistantModal: Boolean + + """HideLightningMigrationModal""" + userPreferencesHideLightningMigrationModal: Boolean + + """HideSfxWelcomeMat""" + userPreferencesHideSfxWelcomeMat: Boolean + + """HideBiggerPhotoCallout""" + userPreferencesHideBiggerPhotoCallout: Boolean + + """GlobalNavBarWTShown""" + userPreferencesGlobalNavBarWtShown: Boolean + + """GlobalNavGridMenuWTShown""" + userPreferencesGlobalNavGridMenuWtShown: Boolean + + """CreateLEXAppsWTShown""" + userPreferencesCreateLexAppsWtShown: Boolean + + """FavoritesWTShown""" + userPreferencesFavoritesWtShown: Boolean + + """RecordHomeSectionCollapseWTShown""" + userPreferencesRecordHomeSectionCollapseWtShown: Boolean + + """RecordHomeReservedWTShown""" + userPreferencesRecordHomeReservedWtShown: Boolean + + """FavoritesShowTopFavorites""" + userPreferencesFavoritesShowTopFavorites: Boolean + + """ExcludeMailAppAttachments""" + userPreferencesExcludeMailAppAttachments: Boolean + + """SuppressTaskSFXReminders""" + userPreferencesSuppressTaskSfxReminders: Boolean + + """SuppressEventSFXReminders""" + userPreferencesSuppressEventSfxReminders: Boolean + + """PreviewCustomTheme""" + userPreferencesPreviewCustomTheme: Boolean + + """HasCelebrationBadge""" + userPreferencesHasCelebrationBadge: Boolean + + """Contact ID""" + contactId: String + + """Call Center ID""" + callCenterId: String + + """Extension""" + extension: String + + """SAML Federation ID""" + federationIdentifier: String + + """About Me""" + aboutMe: String + + """Chatter Email Highlights Frequency""" + digestFrequency: String + + """Default Notification Frequency when Joining Groups""" + defaultGroupNotificationFrequency: String + + """Data.com Monthly Addition Limit""" + jigsawImportLimitOverride: Int +} + +input SalesforceCreateUserInput { + user: SalesforceUserInput! +} + +type SalesforceCreateUserPayload { + """User created by the mutation.""" + user: SalesforceUser! +} + +input SalesforceBusinessHoursInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Business Hours Name""" + name: String + + """Active""" + isActive: Boolean + + """Default Business Hours""" + isDefault: Boolean + + """Sunday Start""" + sundayStartTime: String + + """Sunday End""" + sundayEndTime: String + + """Monday Start""" + mondayStartTime: String + + """Monday End""" + mondayEndTime: String + + """Tuesday Start""" + tuesdayStartTime: String + + """Tuesday End""" + tuesdayEndTime: String + + """Wednesday Start""" + wednesdayStartTime: String + + """Wednesday End""" + wednesdayEndTime: String + + """Thursday Start""" + thursdayStartTime: String + + """Thursday End""" + thursdayEndTime: String + + """Friday Start""" + fridayStartTime: String + + """Friday End""" + fridayEndTime: String + + """Saturday Start""" + saturdayStartTime: String + + """Saturday End""" + saturdayEndTime: String + + """Time Zone""" + timeZoneSidKey: String +} + +input SalesforceCreateBusinessHoursInput { + businessHours: SalesforceBusinessHoursInput! +} + +type SalesforceCreateBusinessHoursPayload { + """BusinessHours created by the mutation.""" + businessHours: SalesforceBusinessHours! +} + +input SalesforceContentWorkspacePermissionInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Manage Library""" + permissionsManageWorkspace: Boolean + + """Add Content""" + permissionsAddContent: Boolean + + """Add Content on Behalf of Others""" + permissionsAddContentObo: Boolean + + """Archive Content""" + permissionsArchiveContent: Boolean + + """Delete Content""" + permissionsDeleteContent: Boolean + + """Feature Content""" + permissionsFeatureContent: Boolean + + """View Comment""" + permissionsViewComments: Boolean + + """Add Comment""" + permissionsAddComment: Boolean + + """Modify Comments""" + permissionsModifyComments: Boolean + + """Tag Content""" + permissionsTagContent: Boolean + + """Deliver Content""" + permissionsDeliverContent: Boolean + + """Attach or Share Content""" + permissionsChatterSharing: Boolean + + """Organize File and Content Folder""" + permissionsOrganizeFileAndFolder: Boolean + + """Description""" + description: String +} + +input SalesforceCreateContentWorkspacePermissionInput { + contentWorkspacePermission: SalesforceContentWorkspacePermissionInput! +} + +type SalesforceCreateContentWorkspacePermissionPayload { + """ContentWorkspacePermission created by the mutation.""" + contentWorkspacePermission: SalesforceContentWorkspacePermission! +} + +input SalesforceMacroInstructionInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Macro ID""" + macroId: String + + """Operation""" + operation: String + + """Target""" + target: String + + """Value""" + value: String + + """Value Record ID""" + valueRecord: String + + """Sort Order""" + sortOrder: Int +} + +input SalesforceCreateMacroInstructionInput { + macroInstruction: SalesforceMacroInstructionInput! +} + +type SalesforceCreateMacroInstructionPayload { + """MacroInstruction created by the mutation.""" + macroInstruction: SalesforceMacroInstruction! +} + +input SalesforceDocumentAttachmentMapInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Entity ID""" + parentId: String + + """Document ID""" + documentId: String + + """Attachment Sequence""" + documentSequence: Int +} + +input SalesforceCreateDocumentAttachmentMapInput { + documentAttachmentMap: SalesforceDocumentAttachmentMapInput! +} + +type SalesforceCreateDocumentAttachmentMapPayload { + """DocumentAttachmentMap created by the mutation.""" + documentAttachmentMap: SalesforceDocumentAttachmentMap! +} + +input SalesforceContractInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Account ID""" + accountId: String + + """Price Book ID""" + pricebook2Id: String + + """Owner Expiration Notice""" + ownerExpirationNotice: String + + """Contract Start Date""" + startDate: String + + """Billing Street""" + billingStreet: String + + """Billing City""" + billingCity: String + + """Billing State/Province""" + billingState: String + + """Billing Zip/Postal Code""" + billingPostalCode: String + + """Billing Country""" + billingCountry: String + + """Billing Latitude""" + billingLatitude: Float + + """Billing Longitude""" + billingLongitude: Float + + """Billing Geocode Accuracy""" + billingGeocodeAccuracy: String + + """Contract Term""" + contractTerm: Int + + """Owner ID""" + ownerId: String + + """Status""" + status: String + + """Company Signed By ID""" + companySignedId: String + + """Company Signed Date""" + companySignedDate: String + + """Customer Signed By ID""" + customerSignedId: String + + """Customer Signed Title""" + customerSignedTitle: String + + """Customer Signed Date""" + customerSignedDate: String + + """Special Terms""" + specialTerms: String + + """Description""" + description: String +} + +input SalesforceCreateContractInput { + contract: SalesforceContractInput! +} + +type SalesforceCreateContractPayload { + """Contract created by the mutation.""" + contract: SalesforceContract! +} + +input SalesforceCspTrustedSiteInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Trusted Site Name""" + developerName: String + + """Master Language""" + language: String + + """Label""" + masterLabel: String + + """Trusted Site URL""" + endpointUrl: String + + """Description""" + description: String + + """Active""" + isActive: Boolean +} + +input SalesforceCreateCspTrustedSiteInput { + cspTrustedSite: SalesforceCspTrustedSiteInput! +} + +type SalesforceCreateCspTrustedSitePayload { + """CspTrustedSite created by the mutation.""" + cspTrustedSite: SalesforceCspTrustedSite! +} + +input SalesforceEmailMessageRelationInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Email Message ID""" + emailMessageId: String + + """Relation ID""" + relationId: String + + """Relation Type""" + relationType: String + + """Relation Address""" + relationAddress: String +} + +input SalesforceCreateEmailMessageRelationInput { + emailMessageRelation: SalesforceEmailMessageRelationInput! +} + +type SalesforceCreateEmailMessageRelationPayload { + """EmailMessageRelation created by the mutation.""" + emailMessageRelation: SalesforceEmailMessageRelation! +} + +input SalesforceOrgWideEmailAddressInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Email Address""" + address: String + + """Display Name""" + displayName: String + + """Allow All Profiles""" + isAllowAllProfiles: Boolean +} + +input SalesforceCreateOrgWideEmailAddressInput { + orgWideEmailAddress: SalesforceOrgWideEmailAddressInput! +} + +type SalesforceCreateOrgWideEmailAddressPayload { + """OrgWideEmailAddress created by the mutation.""" + orgWideEmailAddress: SalesforceOrgWideEmailAddress! +} + +input SalesforceEmailServicesFunctionInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Active""" + isActive: Boolean + + """Email Service Name""" + functionName: String + + """Accept Email From""" + authorizedSenders: String + + """Advanced Email Security Settings""" + isAuthenticationRequired: Boolean + + """TLS Required""" + isTlsRequired: Boolean + + """Accept Attachments""" + attachmentOption: String + + """Class ID""" + apexClassId: String + + """Over Email Rate Limit Action""" + overLimitAction: String + + """Deactivated Email Service Action""" + functionInactiveAction: String + + """Deactivated Email Address Action""" + addressInactiveAction: String + + """Unauthenticated Sender Action""" + authenticationFailureAction: String + + """Unauthorized Sender Action""" + authorizationFailureAction: String + + """Enable Error Routing""" + isErrorRoutingEnabled: Boolean + + """Route Error Emails to This Email Address""" + errorRoutingAddress: String + + """Convert Text Attachments to Binary Attachments""" + isTextAttachmentsAsBinary: Boolean +} + +input SalesforceCreateEmailServicesFunctionInput { + emailServicesFunction: SalesforceEmailServicesFunctionInput! +} + +type SalesforceCreateEmailServicesFunctionPayload { + """EmailServicesFunction created by the mutation.""" + emailServicesFunction: SalesforceEmailServicesFunction! +} + +input SalesforceFeedSignalInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Feed Item ID""" + feedItemId: String + + """Feed Item ID""" + feedEntityId: String + + """Signal value""" + signalValue: Int + + """Signal type""" + signalType: String + + """Created By ID""" + createdById: String + + """Created Date""" + createdDate: String +} + +input SalesforceCreateFeedSignalInput { + feedSignal: SalesforceFeedSignalInput! +} + +"""Feed Signal""" +type SalesforceFeedSignal { + """Feed Signal ID""" + id: String! + + """Feed Item ID""" + feedItemId: String + + """Feed Item ID""" + feedItem: SalesforceFeedSignalFeedItemUnion + + """Feed Item ID""" + feedEntityId: String + + """Feed Item ID""" + feedEntity: SalesforceFeedSignalFeedEntityUnion + + """Signal value""" + signalValue: Int + + """Signal type""" + signalType: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """InsertedBy ID""" + insertedById: String! + + """InsertedBy ID""" + insertedBy: SalesforceUser! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! +} + +type SalesforceCreateFeedSignalPayload { + """FeedSignal created by the mutation.""" + feedSignal: SalesforceFeedSignal! +} + +input SalesforceProduct2Input { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Product Name""" + name: String + + """Product Code""" + productCode: String + + """Product Description""" + description: String + + """Active""" + isActive: Boolean + + """Product Family""" + family: String + + """External Data Source ID""" + externalDataSourceId: String + + """External ID""" + externalId: String + + """Display URL""" + displayUrl: String + + """Quantity Unit Of Measure""" + quantityUnitOfMeasure: String + + """Product SKU""" + stockKeepingUnit: String +} + +input SalesforceCreateProduct2Input { + product2: SalesforceProduct2Input! +} + +type SalesforceCreateProduct2Payload { + """Product2 created by the mutation.""" + product2: SalesforceProduct2! +} + +input SalesforceQuickTextShareInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """User/Group ID""" + userOrGroupId: String + + """Custom Object Access""" + accessLevel: String + + """Row Cause""" + rowCause: String +} + +input SalesforceCreateQuickTextShareInput { + quickTextShare: SalesforceQuickTextShareInput! +} + +type SalesforceCreateQuickTextSharePayload { + """QuickTextShare created by the mutation.""" + quickTextShare: SalesforceQuickTextShare! +} + +input SalesforceFolderInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Folder Unique Name""" + developerName: String + + """Access Type""" + accessType: String + + """Read Only""" + isReadonly: Boolean + + """Type""" + type: String +} + +input SalesforceCreateFolderInput { + folder: SalesforceFolderInput! +} + +type SalesforceCreateFolderPayload { + """Folder created by the mutation.""" + folder: SalesforceFolder! +} + +input SalesforceApexTestResultInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Time Started""" + testTimestamp: String + + """Pass/Fail""" + outcome: String + + """Class ID""" + apexClassId: String + + """Method Name""" + methodName: String + + """Error Message""" + message: String + + """Stack Trace""" + stackTrace: String + + """Apex Job ID""" + asyncApexJobId: String + + """Apex Test Queue Item ID""" + queueItemId: String + + """Log ID""" + apexLogId: String + + """ApexTestRunResult ID""" + apexTestRunResultId: String + + """Run Time""" + runTime: Int +} + +input SalesforceCreateApexTestResultInput { + apexTestResult: SalesforceApexTestResultInput! +} + +type SalesforceCreateApexTestResultPayload { + """ApexTestResult created by the mutation.""" + apexTestResult: SalesforceApexTestResult! +} + +input SalesforceOrgDeleteRequestShareInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """User/Group ID""" + userOrGroupId: String + + """Custom Object Access""" + accessLevel: String + + """Row Cause""" + rowCause: String +} + +input SalesforceCreateOrgDeleteRequestShareInput { + orgDeleteRequestShare: SalesforceOrgDeleteRequestShareInput! +} + +type SalesforceCreateOrgDeleteRequestSharePayload { + """OrgDeleteRequestShare created by the mutation.""" + orgDeleteRequestShare: SalesforceOrgDeleteRequestShare! +} + +input SalesforceFlowInterviewShareInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """User/Group ID""" + userOrGroupId: String + + """Custom Object Access""" + accessLevel: String + + """Row Cause""" + rowCause: String +} + +input SalesforceCreateFlowInterviewShareInput { + flowInterviewShare: SalesforceFlowInterviewShareInput! +} + +type SalesforceCreateFlowInterviewSharePayload { + """FlowInterviewShare created by the mutation.""" + flowInterviewShare: SalesforceFlowInterviewShare! +} + +input SalesforceUserProvAccountStagingInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Connected App ID""" + connectedAppId: String + + """User ID""" + salesforceUserId: String + + """External User Id""" + externalUserId: String + + """External Username""" + externalUsername: String + + """External Email""" + externalEmail: String + + """External First Name""" + externalFirstName: String + + """External Last Name""" + externalLastName: String + + """Link State""" + linkState: String + + """Status""" + status: String +} + +input SalesforceCreateUserProvAccountStagingInput { + userProvAccountStaging: SalesforceUserProvAccountStagingInput! +} + +type SalesforceCreateUserProvAccountStagingPayload { + """UserProvAccountStaging created by the mutation.""" + userProvAccountStaging: SalesforceUserProvAccountStaging! +} + +input SalesforceBusinessProcessInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Description""" + description: String + + """Entity Enumeration Or ID""" + tableEnumOrId: String +} + +input SalesforceCreateBusinessProcessInput { + businessProcess: SalesforceBusinessProcessInput! +} + +type SalesforceCreateBusinessProcessPayload { + """BusinessProcess created by the mutation.""" + businessProcess: SalesforceBusinessProcess! +} + +input SalesforceSolutionInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Title""" + solutionName: String + + """Public""" + isPublished: Boolean + + """Visible in Public Knowledge Base""" + isPublishedInPublicKb: Boolean + + """Status""" + status: String + + """Description""" + solutionNote: String + + """Owner ID""" + ownerId: String +} + +input SalesforceCreateSolutionInput { + solution: SalesforceSolutionInput! +} + +type SalesforceCreateSolutionPayload { + """Solution created by the mutation.""" + solution: SalesforceSolution! +} + +input SalesforceVoteInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """Vote Type""" + type: String +} + +input SalesforceCreateVoteInput { + vote: SalesforceVoteInput! +} + +type SalesforceCreateVotePayload { + """Vote created by the mutation.""" + vote: SalesforceVote! +} + +input SalesforceContractContactRoleInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Contract ID""" + contractId: String + + """Contact ID""" + contactId: String + + """Role""" + role: String + + """Primary""" + isPrimary: Boolean +} + +input SalesforceCreateContractContactRoleInput { + contractContactRole: SalesforceContractContactRoleInput! +} + +type SalesforceCreateContractContactRolePayload { + """ContractContactRole created by the mutation.""" + contractContactRole: SalesforceContractContactRole! +} + +input SalesforceNoteInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """Title""" + title: String + + """Private""" + isPrivate: Boolean + + """Body""" + body: String + + """Owner ID""" + ownerId: String +} + +input SalesforceCreateNoteInput { + note: SalesforceNoteInput! +} + +type SalesforceCreateNotePayload { + """Note created by the mutation.""" + note: SalesforceNote! +} + +input SalesforceCustomBrandInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Branded Entity ID""" + parentId: String +} + +input SalesforceCreateCustomBrandInput { + customBrand: SalesforceCustomBrandInput! +} + +type SalesforceCreateCustomBrandPayload { + """CustomBrand created by the mutation.""" + customBrand: SalesforceCustomBrand! +} + +input SalesforceIdeaInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Title""" + title: String + + """Zone ID""" + communityId: String + + """Idea Body""" + body: String + + """Categories""" + categories: String + + """Status""" + status: String +} + +input SalesforceCreateIdeaInput { + idea: SalesforceIdeaInput! +} + +type SalesforceCreateIdeaPayload { + """Idea created by the mutation.""" + idea: SalesforceIdea! +} + +input SalesforceCollaborationGroupInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Owner ID""" + ownerId: String + + """Access Type""" + collaborationType: String + + """Description""" + description: String + + """Information Title""" + informationTitle: String + + """Information""" + informationBody: String + + """Allow customers""" + canHaveGuests: Boolean + + """Archive""" + isArchived: Boolean + + """Disable automatic archiving""" + isAutoArchiveDisabled: Boolean + + """Announcement ID""" + announcementId: String + + """Broadcast Only""" + isBroadcast: Boolean +} + +input SalesforceCreateCollaborationGroupInput { + collaborationGroup: SalesforceCollaborationGroupInput! +} + +type SalesforceCreateCollaborationGroupPayload { + """CollaborationGroup created by the mutation.""" + collaborationGroup: SalesforceCollaborationGroup! +} + +input SalesforceOpportunityInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Account ID""" + accountId: String + + """Private""" + isPrivate: Boolean + + """Name""" + name: String + + """Description""" + description: String + + """Stage""" + stageName: String + + """Amount""" + amount: Float + + """Probability (%)""" + probability: Float + + """Quantity""" + totalOpportunityQuantity: Float + + """Close Date""" + closeDate: String + + """Opportunity Type""" + type: String + + """Next Step""" + nextStep: String + + """Lead Source""" + leadSource: String + + """Forecast Category""" + forecastCategoryName: String + + """Campaign ID""" + campaignId: String + + """Price Book ID""" + pricebook2Id: String + + """Owner ID""" + ownerId: String +} + +input SalesforceCreateOpportunityInput { + opportunity: SalesforceOpportunityInput! +} + +type SalesforceCreateOpportunityPayload { + """Opportunity created by the mutation.""" + opportunity: SalesforceOpportunity! +} + +input SalesforceListEmailRecipientSourceInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """List Email ID""" + listEmailId: String + + """SourceList ID""" + sourceListId: String + + """Type""" + sourceType: String +} + +input SalesforceCreateListEmailRecipientSourceInput { + listEmailRecipientSource: SalesforceListEmailRecipientSourceInput! +} + +type SalesforceCreateListEmailRecipientSourcePayload { + """ListEmailRecipientSource created by the mutation.""" + listEmailRecipientSource: SalesforceListEmailRecipientSource! +} + +input SalesforceTodayGoalInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Value""" + value: Float + + """User ID""" + userId: String +} + +input SalesforceCreateTodayGoalInput { + todayGoal: SalesforceTodayGoalInput! +} + +type SalesforceCreateTodayGoalPayload { + """TodayGoal created by the mutation.""" + todayGoal: SalesforceTodayGoal! +} + +input SalesforceOpportunityLineItemInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Opportunity ID""" + opportunityId: String + + """Price Book Entry ID""" + pricebookEntryId: String + + """Product ID""" + product2Id: String + + """Quantity""" + quantity: Float + + """Total Price""" + totalPrice: Float + + """Sales Price""" + unitPrice: Float + + """Date""" + serviceDate: String + + """Line Description""" + description: String +} + +input SalesforceCreateOpportunityLineItemInput { + opportunityLineItem: SalesforceOpportunityLineItemInput! +} + +type SalesforceCreateOpportunityLineItemPayload { + """OpportunityLineItem created by the mutation.""" + opportunityLineItem: SalesforceOpportunityLineItem! +} + +input SalesforceFlowRecordRelationInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Flow Interview ID""" + parentId: String + + """Record ID""" + relatedRecordId: String +} + +input SalesforceCreateFlowRecordRelationInput { + flowRecordRelation: SalesforceFlowRecordRelationInput! +} + +type SalesforceCreateFlowRecordRelationPayload { + """FlowRecordRelation created by the mutation.""" + flowRecordRelation: SalesforceFlowRecordRelation! +} + +input SalesforceAdditionalNumberInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Call Center ID""" + callCenterId: String + + """Name""" + name: String + + """Description""" + description: String + + """Phone""" + phone: String +} + +input SalesforceCreateAdditionalNumberInput { + additionalNumber: SalesforceAdditionalNumberInput! +} + +type SalesforceCreateAdditionalNumberPayload { + """AdditionalNumber created by the mutation.""" + additionalNumber: SalesforceAdditionalNumber! +} + +input SalesforceCollaborationInvitationInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Shared Entity ID""" + sharedEntityId: String + + """Invited Email""" + invitedUserEmail: String + + """Optional Message""" + optionalMessage: String +} + +input SalesforceCreateCollaborationInvitationInput { + collaborationInvitation: SalesforceCollaborationInvitationInput! +} + +type SalesforceCreateCollaborationInvitationPayload { + """CollaborationInvitation created by the mutation.""" + collaborationInvitation: SalesforceCollaborationInvitation! +} + +input SalesforcePartnerInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Opportunity ID""" + opportunityId: String + + """Account From ID""" + accountFromId: String + + """Account To ID""" + accountToId: String + + """Role""" + role: String + + """Primary""" + isPrimary: Boolean +} + +input SalesforceCreatePartnerInput { + partner: SalesforcePartnerInput! +} + +type SalesforceCreatePartnerPayload { + """Partner created by the mutation.""" + partner: SalesforcePartner! +} + +input SalesforceEntitySubscriptionInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """Subscriber ID""" + subscriberId: String +} + +input SalesforceCreateEntitySubscriptionInput { + entitySubscription: SalesforceEntitySubscriptionInput! +} + +type SalesforceCreateEntitySubscriptionPayload { + """EntitySubscription created by the mutation.""" + entitySubscription: SalesforceEntitySubscription! +} + +input SalesforceCategoryNodeInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent Category Node ID""" + parentId: String + + """Name""" + masterLabel: String + + """Sort Order""" + sortOrder: Int + + """Subcategory Sort Style""" + sortStyle: String +} + +input SalesforceCreateCategoryNodeInput { + categoryNode: SalesforceCategoryNodeInput! +} + +type SalesforceCreateCategoryNodePayload { + """CategoryNode created by the mutation.""" + categoryNode: SalesforceCategoryNode! +} + +input SalesforceApexEmailNotificationInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """User ID""" + userId: String + + """email""" + email: String +} + +input SalesforceCreateApexEmailNotificationInput { + apexEmailNotification: SalesforceApexEmailNotificationInput! +} + +type SalesforceCreateApexEmailNotificationPayload { + """ApexEmailNotification created by the mutation.""" + apexEmailNotification: SalesforceApexEmailNotification! +} + +input SalesforceUserListViewInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """User ID""" + userId: String + + """List View ID""" + listViewId: String + + """Custom Object Definition ID""" + sobjectType: String + + """List View Chart ID""" + lastViewedChart: String +} + +input SalesforceCreateUserListViewInput { + userListView: SalesforceUserListViewInput! +} + +type SalesforceCreateUserListViewPayload { + """UserListView created by the mutation.""" + userListView: SalesforceUserListView! +} + +input SalesforceUserProvAccountInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """User ID""" + salesforceUserId: String + + """Connected App ID""" + connectedAppId: String + + """External User Id""" + externalUserId: String + + """External Username""" + externalUsername: String + + """External Email""" + externalEmail: String + + """External First Name""" + externalFirstName: String + + """External Last Name""" + externalLastName: String + + """Link State""" + linkState: String + + """Status""" + status: String + + """Deleted Date""" + deletedDate: String + + """Manual Override""" + isKnownLink: Boolean +} + +input SalesforceCreateUserProvAccountInput { + userProvAccount: SalesforceUserProvAccountInput! +} + +type SalesforceCreateUserProvAccountPayload { + """UserProvAccount created by the mutation.""" + userProvAccount: SalesforceUserProvAccount! +} + +input SalesforceAssetInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Contact ID""" + contactId: String + + """Account ID""" + accountId: String + + """Parent Asset ID""" + parentId: String + + """Product ID""" + product2Id: String + + """Competitor Asset""" + isCompetitorProduct: Boolean + + """Asset Name""" + name: String + + """Serial Number""" + serialNumber: String + + """Install Date""" + installDate: String + + """Purchase Date""" + purchaseDate: String + + """Usage End Date""" + usageEndDate: String + + """Status""" + status: String + + """Price""" + price: Float + + """Quantity""" + quantity: Float + + """Description""" + description: String + + """Owner ID""" + ownerId: String + + """Asset Provided By ID""" + assetProvidedById: String + + """Asset Serviced By ID""" + assetServicedById: String + + """Internal Asset""" + isInternal: Boolean +} + +input SalesforceCreateAssetInput { + asset: SalesforceAssetInput! +} + +type SalesforceCreateAssetPayload { + """Asset created by the mutation.""" + asset: SalesforceAsset! +} + +input SalesforceUserProvisioningRequestShareInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """User/Group ID""" + userOrGroupId: String + + """Custom Object Access""" + accessLevel: String + + """Row Cause""" + rowCause: String +} + +input SalesforceCreateUserProvisioningRequestShareInput { + userProvisioningRequestShare: SalesforceUserProvisioningRequestShareInput! +} + +type SalesforceCreateUserProvisioningRequestSharePayload { + """UserProvisioningRequestShare created by the mutation.""" + userProvisioningRequestShare: SalesforceUserProvisioningRequestShare! +} + +input SalesforceActionLinkGroupTemplateInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Developer Name""" + developerName: String + + """Master Language""" + language: String + + """Name""" + masterLabel: String + + """Executions Allowed""" + executionsAllowed: String + + """Hours until Expiration""" + hoursUntilExpiration: Int + + """Category""" + category: String + + """Published""" + isPublished: Boolean +} + +input SalesforceCreateActionLinkGroupTemplateInput { + actionLinkGroupTemplate: SalesforceActionLinkGroupTemplateInput! +} + +type SalesforceCreateActionLinkGroupTemplatePayload { + """ActionLinkGroupTemplate created by the mutation.""" + actionLinkGroupTemplate: SalesforceActionLinkGroupTemplate! +} + +input SalesforceUserAppInfoInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """User ID""" + userId: String + + """Form Factor""" + formFactor: String +} + +input SalesforceCreateUserAppInfoInput { + userAppInfo: SalesforceUserAppInfoInput! +} + +type SalesforceCreateUserAppInfoPayload { + """UserAppInfo created by the mutation.""" + userAppInfo: SalesforceUserAppInfo! +} + +input SalesforceUserAppMenuCustomizationShareInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """User/Group ID""" + userOrGroupId: String + + """Custom Object Access""" + accessLevel: String + + """Row Cause""" + rowCause: String +} + +input SalesforceCreateUserAppMenuCustomizationShareInput { + userAppMenuCustomizationShare: SalesforceUserAppMenuCustomizationShareInput! +} + +type SalesforceCreateUserAppMenuCustomizationSharePayload { + """UserAppMenuCustomizationShare created by the mutation.""" + userAppMenuCustomizationShare: SalesforceUserAppMenuCustomizationShare! +} + +input SalesforceFeedItemInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String + + """Created Date""" + createdDate: String + + """Revision""" + revision: Int + + """Last Edit By ID""" + lastEditById: String + + """Last Edit Date""" + lastEditDate: String + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean + + """Related Record ID""" + relatedRecordId: String + + """Status""" + status: String +} + +input SalesforceCreateFeedItemInput { + feedItem: SalesforceFeedItemInput! +} + +type SalesforceCreateFeedItemPayload { + """FeedItem created by the mutation.""" + feedItem: SalesforceFeedItem! +} + +input SalesforceApexClassInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Api Version""" + apiVersion: Float + + """Status""" + status: String + + """Is Valid""" + isValid: Boolean + + """Body CRC""" + bodyCrc: Float + + """Body""" + body: String + + """Size Without Comments""" + lengthWithoutComments: Int +} + +input SalesforceCreateApexClassInput { + apexClass: SalesforceApexClassInput! +} + +type SalesforceCreateApexClassPayload { + """ApexClass created by the mutation.""" + apexClass: SalesforceApexClass! +} + +input SalesforceApexTriggerInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Custom Object Definition ID""" + tableEnumOrId: String + + """BeforeInsert""" + usageBeforeInsert: Boolean + + """AfterInsert""" + usageAfterInsert: Boolean + + """BeforeUpdate""" + usageBeforeUpdate: Boolean + + """AfterUpdate""" + usageAfterUpdate: Boolean + + """BeforeDelete""" + usageBeforeDelete: Boolean + + """AfterDelete""" + usageAfterDelete: Boolean + + """IsBulk""" + usageIsBulk: Boolean + + """AfterUndelete""" + usageAfterUndelete: Boolean + + """Api Version""" + apiVersion: Float + + """Status""" + status: String + + """Is Valid""" + isValid: Boolean + + """Body CRC""" + bodyCrc: Float + + """Body""" + body: String + + """Size Without Comments""" + lengthWithoutComments: Int +} + +input SalesforceCreateApexTriggerInput { + apexTrigger: SalesforceApexTriggerInput! +} + +type SalesforceCreateApexTriggerPayload { + """ApexTrigger created by the mutation.""" + apexTrigger: SalesforceApexTrigger! +} + +input SalesforceCustomBrandAssetInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Custom Brand ID""" + customBrandId: String + + """Asset Category""" + assetCategory: String + + """Text Asset""" + textAsset: String + + """Asset source ID""" + assetSourceId: String +} + +input SalesforceCreateCustomBrandAssetInput { + customBrandAsset: SalesforceCustomBrandAssetInput! +} + +type SalesforceCreateCustomBrandAssetPayload { + """CustomBrandAsset created by the mutation.""" + customBrandAsset: SalesforceCustomBrandAsset! +} + +input SalesforceContentAssetInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Unique Name""" + developerName: String + + """Master Language""" + language: String + + """Label""" + masterLabel: String + + """Let unauthenticated users see this asset file""" + isVisibleByExternalUsers: Boolean +} + +input SalesforceCreateContentAssetInput { + contentAsset: SalesforceContentAssetInput! +} + +type SalesforceCreateContentAssetPayload { + """ContentAsset created by the mutation.""" + contentAsset: SalesforceContentAsset! +} + +input SalesforceMacroShareInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """User/Group ID""" + userOrGroupId: String + + """Custom Object Access""" + accessLevel: String + + """Row Cause""" + rowCause: String +} + +input SalesforceCreateMacroShareInput { + macroShare: SalesforceMacroShareInput! +} + +type SalesforceCreateMacroSharePayload { + """MacroShare created by the mutation.""" + macroShare: SalesforceMacroShare! +} + +input SalesforceCollaborationGroupMemberRequestInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """CollaborationGroup ID""" + collaborationGroupId: String + + """User ID""" + requesterId: String +} + +input SalesforceCreateCollaborationGroupMemberRequestInput { + collaborationGroupMemberRequest: SalesforceCollaborationGroupMemberRequestInput! +} + +type SalesforceCreateCollaborationGroupMemberRequestPayload { + """CollaborationGroupMemberRequest created by the mutation.""" + collaborationGroupMemberRequest: SalesforceCollaborationGroupMemberRequest! +} + +input SalesforceCampaignInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Parent Campaign ID""" + parentId: String + + """Type""" + type: String + + """Status""" + status: String + + """Start Date""" + startDate: String + + """End Date""" + endDate: String + + """Expected Revenue in Campaign""" + expectedRevenue: Float + + """Budgeted Cost in Campaign""" + budgetedCost: Float + + """Actual Cost in Campaign""" + actualCost: Float + + """Expected Response (%)""" + expectedResponse: Float + + """Num Sent in Campaign""" + numberSent: Float + + """Active""" + isActive: Boolean + + """Description""" + description: String + + """Owner ID""" + ownerId: String + + """Record Type ID""" + campaignMemberRecordTypeId: String +} + +input SalesforceCreateCampaignInput { + campaign: SalesforceCampaignInput! +} + +type SalesforceCreateCampaignPayload { + """Campaign created by the mutation.""" + campaign: SalesforceCampaign! +} + +input SalesforceOrderInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Owner ID""" + ownerId: String + + """Contract ID""" + contractId: String + + """Account ID""" + accountId: String + + """Price Book ID""" + pricebook2Id: String + + """Order ID""" + originalOrderId: String + + """Order Start Date""" + effectiveDate: String + + """Order End Date""" + endDate: String + + """Reduction Order""" + isReductionOrder: Boolean + + """Status""" + status: String + + """Internal Comments""" + description: String + + """Customer Authorized By ID""" + customerAuthorizedById: String + + """Customer Authorized Date""" + customerAuthorizedDate: String + + """Company Authorized By ID""" + companyAuthorizedById: String + + """Company Authorized Date""" + companyAuthorizedDate: String + + """Order Type""" + type: String + + """Billing Street""" + billingStreet: String + + """Billing City""" + billingCity: String + + """Billing State/Province""" + billingState: String + + """Billing Zip/Postal Code""" + billingPostalCode: String + + """Billing Country""" + billingCountry: String + + """Billing Latitude""" + billingLatitude: Float + + """Billing Longitude""" + billingLongitude: Float + + """Billing Geocode Accuracy""" + billingGeocodeAccuracy: String + + """Shipping Street""" + shippingStreet: String + + """Shipping City""" + shippingCity: String + + """Shipping State/Province""" + shippingState: String + + """Shipping Zip/Postal Code""" + shippingPostalCode: String + + """Shipping Country""" + shippingCountry: String + + """Shipping Latitude""" + shippingLatitude: Float + + """Shipping Longitude""" + shippingLongitude: Float + + """Shipping Geocode Accuracy""" + shippingGeocodeAccuracy: String + + """Order Name""" + name: String + + """PO Date""" + poDate: String + + """PO Number""" + poNumber: String + + """Order Reference Number""" + orderReferenceNumber: String + + """Bill To Contact ID""" + billToContactId: String + + """Ship To Contact ID""" + shipToContactId: String +} + +input SalesforceCreateOrderInput { + order: SalesforceOrderInput! +} + +type SalesforceCreateOrderPayload { + """Order created by the mutation.""" + order: SalesforceOrder! +} + +input SalesforceAttachmentInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """File Name""" + name: String + + """Private""" + isPrivate: Boolean + + """Content Type""" + contentType: String + + """Body""" + body: String + + """Owner ID""" + ownerId: String + + """Description""" + description: String +} + +input SalesforceCreateAttachmentInput { + attachment: SalesforceAttachmentInput! +} + +type SalesforceCreateAttachmentPayload { + """Attachment created by the mutation.""" + attachment: SalesforceAttachment! +} + +input SalesforceApexComponentInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Api Version""" + apiVersion: Float + + """Label""" + masterLabel: String + + """Description""" + description: String + + """Controller Type""" + controllerType: String + + """Controller Key""" + controllerKey: String + + """Markup""" + markup: String +} + +input SalesforceCreateApexComponentInput { + apexComponent: SalesforceApexComponentInput! +} + +type SalesforceCreateApexComponentPayload { + """ApexComponent created by the mutation.""" + apexComponent: SalesforceApexComponent! +} + +input SalesforceLightningComponentResourceInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Lightning Component Bundle ID""" + lightningComponentBundleId: String + + """File Path""" + filePath: String + + """Format""" + format: String + + """Source""" + source: String +} + +input SalesforceCreateLightningComponentResourceInput { + lightningComponentResource: SalesforceLightningComponentResourceInput! +} + +type SalesforceCreateLightningComponentResourcePayload { + """LightningComponentResource created by the mutation.""" + lightningComponentResource: SalesforceLightningComponentResource! +} + +input SalesforceApexPageInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + name: String + + """Api Version""" + apiVersion: Float + + """Label""" + masterLabel: String + + """Description""" + description: String + + """Controller Type""" + controllerType: String + + """Controller Key""" + controllerKey: String + + """ + Available for Lightning Experience, Lightning Communities, and the mobile app + """ + isAvailableInTouch: Boolean + + """Require CSRF protection on GET requests""" + isConfirmationTokenRequired: Boolean + + """Markup""" + markup: String +} + +input SalesforceCreateApexPageInput { + apexPage: SalesforceApexPageInput! +} + +type SalesforceCreateApexPagePayload { + """ApexPage created by the mutation.""" + apexPage: SalesforceApexPage! +} + +input SalesforceCaseInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Contact ID""" + contactId: String + + """Account ID""" + accountId: String + + """Asset ID""" + assetId: String + + """Parent Case ID""" + parentId: String + + """Name""" + suppliedName: String + + """Email Address""" + suppliedEmail: String + + """Phone""" + suppliedPhone: String + + """Company""" + suppliedCompany: String + + """Case Type""" + type: String + + """Status""" + status: String + + """Case Reason""" + reason: String + + """Case Origin""" + origin: String + + """Subject""" + subject: String + + """Priority""" + priority: String + + """Description""" + description: String + + """Escalated""" + isEscalated: Boolean + + """Owner ID""" + ownerId: String +} + +input SalesforceCreateCaseInput { + case: SalesforceCaseInput! +} + +type SalesforceCreateCasePayload { + """Case created by the mutation.""" + case: SalesforceCase! +} + +input SalesforceBrandTemplateInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Brand Template Name""" + name: String + + """Letterhead Unique Name""" + developerName: String + + """Active""" + isActive: Boolean + + """Description""" + description: String + + """Value""" + value: String +} + +input SalesforceCreateBrandTemplateInput { + brandTemplate: SalesforceBrandTemplateInput! +} + +type SalesforceCreateBrandTemplatePayload { + """BrandTemplate created by the mutation.""" + brandTemplate: SalesforceBrandTemplate! +} + +input SalesforceAuditFieldsInput { + """Created By ID""" + createdById: String + + """Created Date""" + createdDate: String + + """Last modified by ID""" + lastModifiedById: String + + """Last modified date""" + lastModifiedDate: String +} + +input SalesforceCaseCommentInput { + """ + System fields (like createdAt and createdBy) that are set through the API. Commonly used for migrations from external systems. + + The authenticated user must have the ability to set audit fields. See more in the [Salesforce documentation on audit fields](https://help.salesforce.com/articleView?id=000334139&language=en_US&type=1&mode=1). + """ + auditFields: SalesforceAuditFieldsInput + + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """Published""" + isPublished: Boolean + + """Body""" + commentBody: String +} + +input SalesforceCreateCaseCommentInput { + caseComment: SalesforceCaseCommentInput! +} + +type SalesforceCreateCaseCommentPayload { + """CaseComment created by the mutation.""" + caseComment: SalesforceCaseComment! +} + +input SalesforceStreamingChannelShareInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Parent ID""" + parentId: String + + """User/Group ID""" + userOrGroupId: String + + """Custom Object Access""" + accessLevel: String + + """Row Cause""" + rowCause: String +} + +input SalesforceCreateStreamingChannelShareInput { + streamingChannelShare: SalesforceStreamingChannelShareInput! +} + +type SalesforceCreateStreamingChannelSharePayload { + """StreamingChannelShare created by the mutation.""" + streamingChannelShare: SalesforceStreamingChannelShare! +} + +input SalesforcePlatformCachePartitionInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Name""" + developerName: String + + """Master Language""" + language: String + + """Label""" + masterLabel: String + + """Description""" + description: String + + """Default Partition""" + isDefaultPartition: Boolean +} + +input SalesforceCreatePlatformCachePartitionInput { + platformCachePartition: SalesforcePlatformCachePartitionInput! +} + +type SalesforceCreatePlatformCachePartitionPayload { + """PlatformCachePartition created by the mutation.""" + platformCachePartition: SalesforcePlatformCachePartition! +} + +input SalesforceCustomFieldInput { + """The value of the custom field""" + value: JSON! + + """The name of the custom field, e.g. `NumberofLocations__c`.""" + fieldName: String! +} + +input SalesforceAuthProviderInput { + """ + Accepts a list of custom fields to assign to the Salesforce object, e.g. `[{fieldName: "NumberofLocations__c", value: 10}]`. + """ + customFields: [SalesforceCustomFieldInput!] + + """Provider Type""" + providerType: String + + """Name""" + friendlyName: String + + """URL Suffix""" + developerName: String + + """Class ID""" + registrationHandlerId: String + + """User ID""" + executionUserId: String + + """Consumer Key""" + consumerKey: String + + """Consumer Secret""" + consumerSecret: String + + """Custom Error URL""" + errorUrl: String + + """Authorize Endpoint URL""" + authorizeUrl: String + + """Token Endpoint URL""" + tokenUrl: String + + """User Info Endpoint URL""" + userInfoUrl: String + + """Default Scopes""" + defaultScopes: String + + """Token Issuer""" + idTokenIssuer: String + + """Send access token in header""" + optionsSendAccessTokenInHeader: Boolean + + """Send client credentials in header""" + optionsSendClientCredentialsInHeader: Boolean + + """ + Include identity organization's organization ID for third-party account linkage + """ + optionsIncludeOrgIdInId: Boolean + + """Icon URL""" + iconUrl: String + + """Custom Logout URL""" + logoutUrl: String + + """Class ID""" + pluginId: String + + """Custom Metadata Type Record""" + customMetadataTypeRecord: String +} + +input SalesforceCreateAuthProviderInput { + authProvider: SalesforceAuthProviderInput! +} + +type SalesforceCreateAuthProviderPayload { + """AuthProvider created by the mutation.""" + authProvider: SalesforceAuthProvider! +} + +"""The root for Salesforce mutations""" +type SalesforceMutation { + """Create a new AuthProvider""" + createAuthProvider(input: SalesforceCreateAuthProviderInput!): SalesforceCreateAuthProviderPayload! + + """Create a new PlatformCachePartition""" + createPlatformCachePartition(input: SalesforceCreatePlatformCachePartitionInput!): SalesforceCreatePlatformCachePartitionPayload! + + """Create a new StreamingChannelShare""" + createStreamingChannelShare(input: SalesforceCreateStreamingChannelShareInput!): SalesforceCreateStreamingChannelSharePayload! + + """Create a new CaseComment""" + createCaseComment(input: SalesforceCreateCaseCommentInput!): SalesforceCreateCaseCommentPayload! + + """Create a new BrandTemplate""" + createBrandTemplate(input: SalesforceCreateBrandTemplateInput!): SalesforceCreateBrandTemplatePayload! + + """Create a new Case""" + createCase(input: SalesforceCreateCaseInput!): SalesforceCreateCasePayload! + + """Create a new ApexPage""" + createApexPage(input: SalesforceCreateApexPageInput!): SalesforceCreateApexPagePayload! + + """Create a new LightningComponentResource""" + createLightningComponentResource(input: SalesforceCreateLightningComponentResourceInput!): SalesforceCreateLightningComponentResourcePayload! + + """Create a new ApexComponent""" + createApexComponent(input: SalesforceCreateApexComponentInput!): SalesforceCreateApexComponentPayload! + + """Create a new Attachment""" + createAttachment(input: SalesforceCreateAttachmentInput!): SalesforceCreateAttachmentPayload! + + """Create a new Order""" + createOrder(input: SalesforceCreateOrderInput!): SalesforceCreateOrderPayload! + + """Create a new Campaign""" + createCampaign(input: SalesforceCreateCampaignInput!): SalesforceCreateCampaignPayload! + + """Create a new CollaborationGroupMemberRequest""" + createCollaborationGroupMemberRequest(input: SalesforceCreateCollaborationGroupMemberRequestInput!): SalesforceCreateCollaborationGroupMemberRequestPayload! + + """Create a new MacroShare""" + createMacroShare(input: SalesforceCreateMacroShareInput!): SalesforceCreateMacroSharePayload! + + """Create a new ContentAsset""" + createContentAsset(input: SalesforceCreateContentAssetInput!): SalesforceCreateContentAssetPayload! + + """Create a new CustomBrandAsset""" + createCustomBrandAsset(input: SalesforceCreateCustomBrandAssetInput!): SalesforceCreateCustomBrandAssetPayload! + + """Create a new ApexTrigger""" + createApexTrigger(input: SalesforceCreateApexTriggerInput!): SalesforceCreateApexTriggerPayload! + + """Create a new ApexClass""" + createApexClass(input: SalesforceCreateApexClassInput!): SalesforceCreateApexClassPayload! + + """Create a new FeedItem""" + createFeedItem(input: SalesforceCreateFeedItemInput!): SalesforceCreateFeedItemPayload! + + """Create a new UserAppMenuCustomizationShare""" + createUserAppMenuCustomizationShare(input: SalesforceCreateUserAppMenuCustomizationShareInput!): SalesforceCreateUserAppMenuCustomizationSharePayload! + + """Create a new UserAppInfo""" + createUserAppInfo(input: SalesforceCreateUserAppInfoInput!): SalesforceCreateUserAppInfoPayload! + + """Create a new ActionLinkGroupTemplate""" + createActionLinkGroupTemplate(input: SalesforceCreateActionLinkGroupTemplateInput!): SalesforceCreateActionLinkGroupTemplatePayload! + + """Create a new UserProvisioningRequestShare""" + createUserProvisioningRequestShare(input: SalesforceCreateUserProvisioningRequestShareInput!): SalesforceCreateUserProvisioningRequestSharePayload! + + """Create a new Asset""" + createAsset(input: SalesforceCreateAssetInput!): SalesforceCreateAssetPayload! + + """Create a new UserProvAccount""" + createUserProvAccount(input: SalesforceCreateUserProvAccountInput!): SalesforceCreateUserProvAccountPayload! + + """Create a new UserListView""" + createUserListView(input: SalesforceCreateUserListViewInput!): SalesforceCreateUserListViewPayload! + + """Create a new ApexEmailNotification""" + createApexEmailNotification(input: SalesforceCreateApexEmailNotificationInput!): SalesforceCreateApexEmailNotificationPayload! + + """Create a new CategoryNode""" + createCategoryNode(input: SalesforceCreateCategoryNodeInput!): SalesforceCreateCategoryNodePayload! + + """Create a new EntitySubscription""" + createEntitySubscription(input: SalesforceCreateEntitySubscriptionInput!): SalesforceCreateEntitySubscriptionPayload! + + """Create a new Partner""" + createPartner(input: SalesforceCreatePartnerInput!): SalesforceCreatePartnerPayload! + + """Create a new CollaborationInvitation""" + createCollaborationInvitation(input: SalesforceCreateCollaborationInvitationInput!): SalesforceCreateCollaborationInvitationPayload! + + """Create a new AdditionalNumber""" + createAdditionalNumber(input: SalesforceCreateAdditionalNumberInput!): SalesforceCreateAdditionalNumberPayload! + + """Create a new FlowRecordRelation""" + createFlowRecordRelation(input: SalesforceCreateFlowRecordRelationInput!): SalesforceCreateFlowRecordRelationPayload! + + """Create a new OpportunityLineItem""" + createOpportunityLineItem(input: SalesforceCreateOpportunityLineItemInput!): SalesforceCreateOpportunityLineItemPayload! + + """Create a new TodayGoal""" + createTodayGoal(input: SalesforceCreateTodayGoalInput!): SalesforceCreateTodayGoalPayload! + + """Create a new ListEmailRecipientSource""" + createListEmailRecipientSource(input: SalesforceCreateListEmailRecipientSourceInput!): SalesforceCreateListEmailRecipientSourcePayload! + + """Create a new Opportunity""" + createOpportunity(input: SalesforceCreateOpportunityInput!): SalesforceCreateOpportunityPayload! + + """Create a new CollaborationGroup""" + createCollaborationGroup(input: SalesforceCreateCollaborationGroupInput!): SalesforceCreateCollaborationGroupPayload! + + """Create a new Idea""" + createIdea(input: SalesforceCreateIdeaInput!): SalesforceCreateIdeaPayload! + + """Create a new CustomBrand""" + createCustomBrand(input: SalesforceCreateCustomBrandInput!): SalesforceCreateCustomBrandPayload! + + """Create a new Note""" + createNote(input: SalesforceCreateNoteInput!): SalesforceCreateNotePayload! + + """Create a new ContractContactRole""" + createContractContactRole(input: SalesforceCreateContractContactRoleInput!): SalesforceCreateContractContactRolePayload! + + """Create a new Vote""" + createVote(input: SalesforceCreateVoteInput!): SalesforceCreateVotePayload! + + """Create a new Solution""" + createSolution(input: SalesforceCreateSolutionInput!): SalesforceCreateSolutionPayload! + + """Create a new BusinessProcess""" + createBusinessProcess(input: SalesforceCreateBusinessProcessInput!): SalesforceCreateBusinessProcessPayload! + + """Create a new UserProvAccountStaging""" + createUserProvAccountStaging(input: SalesforceCreateUserProvAccountStagingInput!): SalesforceCreateUserProvAccountStagingPayload! + + """Create a new FlowInterviewShare""" + createFlowInterviewShare(input: SalesforceCreateFlowInterviewShareInput!): SalesforceCreateFlowInterviewSharePayload! + + """Create a new OrgDeleteRequestShare""" + createOrgDeleteRequestShare(input: SalesforceCreateOrgDeleteRequestShareInput!): SalesforceCreateOrgDeleteRequestSharePayload! + + """Create a new ApexTestResult""" + createApexTestResult(input: SalesforceCreateApexTestResultInput!): SalesforceCreateApexTestResultPayload! + + """Create a new Folder""" + createFolder(input: SalesforceCreateFolderInput!): SalesforceCreateFolderPayload! + + """Create a new QuickTextShare""" + createQuickTextShare(input: SalesforceCreateQuickTextShareInput!): SalesforceCreateQuickTextSharePayload! + + """Create a new Product2""" + createProduct2(input: SalesforceCreateProduct2Input!): SalesforceCreateProduct2Payload! + + """Create a new FeedSignal""" + createFeedSignal(input: SalesforceCreateFeedSignalInput!): SalesforceCreateFeedSignalPayload! + + """Create a new EmailServicesFunction""" + createEmailServicesFunction(input: SalesforceCreateEmailServicesFunctionInput!): SalesforceCreateEmailServicesFunctionPayload! + + """Create a new OrgWideEmailAddress""" + createOrgWideEmailAddress(input: SalesforceCreateOrgWideEmailAddressInput!): SalesforceCreateOrgWideEmailAddressPayload! + + """Create a new EmailMessageRelation""" + createEmailMessageRelation(input: SalesforceCreateEmailMessageRelationInput!): SalesforceCreateEmailMessageRelationPayload! + + """Create a new CspTrustedSite""" + createCspTrustedSite(input: SalesforceCreateCspTrustedSiteInput!): SalesforceCreateCspTrustedSitePayload! + + """Create a new Contract""" + createContract(input: SalesforceCreateContractInput!): SalesforceCreateContractPayload! + + """Create a new DocumentAttachmentMap""" + createDocumentAttachmentMap(input: SalesforceCreateDocumentAttachmentMapInput!): SalesforceCreateDocumentAttachmentMapPayload! + + """Create a new MacroInstruction""" + createMacroInstruction(input: SalesforceCreateMacroInstructionInput!): SalesforceCreateMacroInstructionPayload! + + """Create a new ContentWorkspacePermission""" + createContentWorkspacePermission(input: SalesforceCreateContentWorkspacePermissionInput!): SalesforceCreateContentWorkspacePermissionPayload! + + """Create a new BusinessHours""" + createBusinessHours(input: SalesforceCreateBusinessHoursInput!): SalesforceCreateBusinessHoursPayload! + + """Create a new User""" + createUser(input: SalesforceCreateUserInput!): SalesforceCreateUserPayload! + + """Create a new CaseContactRole""" + createCaseContactRole(input: SalesforceCreateCaseContactRoleInput!): SalesforceCreateCaseContactRolePayload! + + """Create a new TestSuiteMembership""" + createTestSuiteMembership(input: SalesforceCreateTestSuiteMembershipInput!): SalesforceCreateTestSuiteMembershipPayload! + + """Create a new UserAppMenuCustomization""" + createUserAppMenuCustomization(input: SalesforceCreateUserAppMenuCustomizationInput!): SalesforceCreateUserAppMenuCustomizationPayload! + + """Create a new Announcement""" + createAnnouncement(input: SalesforceCreateAnnouncementInput!): SalesforceCreateAnnouncementPayload! + + """Create a new ExternalDataUserAuth""" + createExternalDataUserAuth(input: SalesforceCreateExternalDataUserAuthInput!): SalesforceCreateExternalDataUserAuthPayload! + + """Create a new SearchPromotionRule""" + createSearchPromotionRule(input: SalesforceCreateSearchPromotionRuleInput!): SalesforceCreateSearchPromotionRulePayload! + + """Create a new Event""" + createEvent(input: SalesforceCreateEventInput!): SalesforceCreateEventPayload! + + """Create a new CampaignMemberStatus""" + createCampaignMemberStatus(input: SalesforceCreateCampaignMemberStatusInput!): SalesforceCreateCampaignMemberStatusPayload! + + """Create a new ContentVersion""" + createContentVersion(input: SalesforceCreateContentVersionInput!): SalesforceCreateContentVersionPayload! + + """Create a new SecurityCustomBaseline""" + createSecurityCustomBaseline(input: SalesforceCreateSecurityCustomBaselineInput!): SalesforceCreateSecurityCustomBaselinePayload! + + """Create a new AuraDefinition""" + createAuraDefinition(input: SalesforceCreateAuraDefinitionInput!): SalesforceCreateAuraDefinitionPayload! + + """Create a new Contact""" + createContact(input: SalesforceCreateContactInput!): SalesforceCreateContactPayload! + + """Create a new EmailTemplate""" + createEmailTemplate(input: SalesforceCreateEmailTemplateInput!): SalesforceCreateEmailTemplatePayload! + + """Create a new Topic""" + createTopic(input: SalesforceCreateTopicInput!): SalesforceCreateTopicPayload! + + """Create a new ApexTestSuite""" + createApexTestSuite(input: SalesforceCreateApexTestSuiteInput!): SalesforceCreateApexTestSuitePayload! + + """Create a new ContentWorkspaceMember""" + createContentWorkspaceMember(input: SalesforceCreateContentWorkspaceMemberInput!): SalesforceCreateContentWorkspaceMemberPayload! + + """Create a new QueueSobject""" + createQueueSobject(input: SalesforceCreateQueueSobjectInput!): SalesforceCreateQueueSobjectPayload! + + """Create a new ContentWorkspace""" + createContentWorkspace(input: SalesforceCreateContentWorkspaceInput!): SalesforceCreateContentWorkspacePayload! + + """Create a new CallCenter""" + createCallCenter(input: SalesforceCreateCallCenterInput!): SalesforceCreateCallCenterPayload! + + """Create a new CaseTeamMember""" + createCaseTeamMember(input: SalesforceCreateCaseTeamMemberInput!): SalesforceCreateCaseTeamMemberPayload! + + """Create a new MailmergeTemplate""" + createMailmergeTemplate(input: SalesforceCreateMailmergeTemplateInput!): SalesforceCreateMailmergeTemplatePayload! + + """Create a new OrgDeleteRequest""" + createOrgDeleteRequest(input: SalesforceCreateOrgDeleteRequestInput!): SalesforceCreateOrgDeleteRequestPayload! + + """Create a new UserPreference""" + createUserPreference(input: SalesforceCreateUserPreferenceInput!): SalesforceCreateUserPreferencePayload! + + """Create a new CollaborationGroupMember""" + createCollaborationGroupMember(input: SalesforceCreateCollaborationGroupMemberInput!): SalesforceCreateCollaborationGroupMemberPayload! + + """Create a new AssetRelationship""" + createAssetRelationship(input: SalesforceCreateAssetRelationshipInput!): SalesforceCreateAssetRelationshipPayload! + + """Create a new UserRole""" + createUserRole(input: SalesforceCreateUserRoleInput!): SalesforceCreateUserRolePayload! + + """Create a new OpportunityContactRole""" + createOpportunityContactRole(input: SalesforceCreateOpportunityContactRoleInput!): SalesforceCreateOpportunityContactRolePayload! + + """Create a new CaseSolution""" + createCaseSolution(input: SalesforceCreateCaseSolutionInput!): SalesforceCreateCaseSolutionPayload! + + """Create a new EmailCapture""" + createEmailCapture(input: SalesforceCreateEmailCaptureInput!): SalesforceCreateEmailCapturePayload! + + """Create a new Account""" + createAccount(input: SalesforceCreateAccountInput!): SalesforceCreateAccountPayload! + + """Create a new ActionLinkTemplate""" + createActionLinkTemplate(input: SalesforceCreateActionLinkTemplateInput!): SalesforceCreateActionLinkTemplatePayload! + + """Create a new PermissionSet""" + createPermissionSet(input: SalesforceCreatePermissionSetInput!): SalesforceCreatePermissionSetPayload! + + """Create a new CampaignMember""" + createCampaignMember(input: SalesforceCreateCampaignMemberInput!): SalesforceCreateCampaignMemberPayload! + + """Create a new UserShare""" + createUserShare(input: SalesforceCreateUserShareInput!): SalesforceCreateUserSharePayload! + + """Create a new PermissionSetLicenseAssign""" + createPermissionSetLicenseAssign(input: SalesforceCreatePermissionSetLicenseAssignInput!): SalesforceCreatePermissionSetLicenseAssignPayload! + + """Create a new UserProvisioningRequest""" + createUserProvisioningRequest(input: SalesforceCreateUserProvisioningRequestInput!): SalesforceCreateUserProvisioningRequestPayload! + + """Create a new UserPackageLicense""" + createUserPackageLicense(input: SalesforceCreateUserPackageLicenseInput!): SalesforceCreateUserPackageLicensePayload! + + """Create a new AccountContactRole""" + createAccountContactRole(input: SalesforceCreateAccountContactRoleInput!): SalesforceCreateAccountContactRolePayload! + + """Create a new ListEmail""" + createListEmail(input: SalesforceCreateListEmailInput!): SalesforceCreateListEmailPayload! + + """Create a new RecordType""" + createRecordType(input: SalesforceCreateRecordTypeInput!): SalesforceCreateRecordTypePayload! + + """Create a new CaseTeamRole""" + createCaseTeamRole(input: SalesforceCreateCaseTeamRoleInput!): SalesforceCreateCaseTeamRolePayload! + + """Create a new FeedAttachment""" + createFeedAttachment(input: SalesforceCreateFeedAttachmentInput!): SalesforceCreateFeedAttachmentPayload! + + """Create a new PricebookEntry""" + createPricebookEntry(input: SalesforceCreatePricebookEntryInput!): SalesforceCreatePricebookEntryPayload! + + """Create a new ChatterExtensionConfig""" + createChatterExtensionConfig(input: SalesforceCreateChatterExtensionConfigInput!): SalesforceCreateChatterExtensionConfigPayload! + + """Create a new ListEmailShare""" + createListEmailShare(input: SalesforceCreateListEmailShareInput!): SalesforceCreateListEmailSharePayload! + + """Create a new CategoryData""" + createCategoryData(input: SalesforceCreateCategoryDataInput!): SalesforceCreateCategoryDataPayload! + + """Create a new ContentDistribution""" + createContentDistribution(input: SalesforceCreateContentDistributionInput!): SalesforceCreateContentDistributionPayload! + + """Create a new ContentFolder""" + createContentFolder(input: SalesforceCreateContentFolderInput!): SalesforceCreateContentFolderPayload! + + """Create a new TodayGoalShare""" + createTodayGoalShare(input: SalesforceCreateTodayGoalShareInput!): SalesforceCreateTodayGoalSharePayload! + + """Create a new StaticResource""" + createStaticResource(input: SalesforceCreateStaticResourceInput!): SalesforceCreateStaticResourcePayload! + + """Create a new EventRelation""" + createEventRelation(input: SalesforceCreateEventRelationInput!): SalesforceCreateEventRelationPayload! + + """Create a new WebLink""" + createWebLink(input: SalesforceCreateWebLinkInput!): SalesforceCreateWebLinkPayload! + + """Create a new Lead""" + createLead(input: SalesforceCreateLeadInput!): SalesforceCreateLeadPayload! + + """Create a new FeedComment""" + createFeedComment(input: SalesforceCreateFeedCommentInput!): SalesforceCreateFeedCommentPayload! + + """Create a new EmailDomainKey""" + createEmailDomainKey(input: SalesforceCreateEmailDomainKeyInput!): SalesforceCreateEmailDomainKeyPayload! + + """Create a new Pricebook2""" + createPricebook2(input: SalesforceCreatePricebook2Input!): SalesforceCreatePricebook2Payload! + + """Create a new UserProvMockTarget""" + createUserProvMockTarget(input: SalesforceCreateUserProvMockTargetInput!): SalesforceCreateUserProvMockTargetPayload! + + """Create a new ListViewChart""" + createListViewChart(input: SalesforceCreateListViewChartInput!): SalesforceCreateListViewChartPayload! + + """Create a new ObjectPermissions""" + createObjectPermissions(input: SalesforceCreateObjectPermissionsInput!): SalesforceCreateObjectPermissionsPayload! + + """Create a new OutgoingEmailRelation""" + createOutgoingEmailRelation(input: SalesforceCreateOutgoingEmailRelationInput!): SalesforceCreateOutgoingEmailRelationPayload! + + """Create a new CaseTeamTemplate""" + createCaseTeamTemplate(input: SalesforceCreateCaseTeamTemplateInput!): SalesforceCreateCaseTeamTemplatePayload! + + """Create a new ApexTestResultLimits""" + createApexTestResultLimits(input: SalesforceCreateApexTestResultLimitsInput!): SalesforceCreateApexTestResultLimitsPayload! + + """Create a new CaseTeamTemplateMember""" + createCaseTeamTemplateMember(input: SalesforceCreateCaseTeamTemplateMemberInput!): SalesforceCreateCaseTeamTemplateMemberPayload! + + """Create a new GroupMember""" + createGroupMember(input: SalesforceCreateGroupMemberInput!): SalesforceCreateGroupMemberPayload! + + """Create a new CaseTeamTemplateRecord""" + createCaseTeamTemplateRecord(input: SalesforceCreateCaseTeamTemplateRecordInput!): SalesforceCreateCaseTeamTemplateRecordPayload! + + """Create a new IdeaComment""" + createIdeaComment(input: SalesforceCreateIdeaCommentInput!): SalesforceCreateIdeaCommentPayload! + + """Create a new OpportunityCompetitor""" + createOpportunityCompetitor(input: SalesforceCreateOpportunityCompetitorInput!): SalesforceCreateOpportunityCompetitorPayload! + + """Create a new ContentDocumentLink""" + createContentDocumentLink(input: SalesforceCreateContentDocumentLinkInput!): SalesforceCreateContentDocumentLinkPayload! + + """Create a new ChatterExtension""" + createChatterExtension(input: SalesforceCreateChatterExtensionInput!): SalesforceCreateChatterExtensionPayload! + + """Create a new OutgoingEmail""" + createOutgoingEmail(input: SalesforceCreateOutgoingEmailInput!): SalesforceCreateOutgoingEmailPayload! + + """Create a new CorsWhitelistEntry""" + createCorsWhitelistEntry(input: SalesforceCreateCorsWhitelistEntryInput!): SalesforceCreateCorsWhitelistEntryPayload! + + """Create a new QuickText""" + createQuickText(input: SalesforceCreateQuickTextInput!): SalesforceCreateQuickTextPayload! + + """Create a new DuplicateRecordSet""" + createDuplicateRecordSet(input: SalesforceCreateDuplicateRecordSetInput!): SalesforceCreateDuplicateRecordSetPayload! + + """Create a new SetupEntityAccess""" + createSetupEntityAccess(input: SalesforceCreateSetupEntityAccessInput!): SalesforceCreateSetupEntityAccessPayload! + + """Create a new Document""" + createDocument(input: SalesforceCreateDocumentInput!): SalesforceCreateDocumentPayload! + + """Create a new Group""" + createGroup(input: SalesforceCreateGroupInput!): SalesforceCreateGroupPayload! + + """Create a new ContentWorkspaceDoc""" + createContentWorkspaceDoc(input: SalesforceCreateContentWorkspaceDocInput!): SalesforceCreateContentWorkspaceDocPayload! + + """Create a new PlatformCachePartitionType""" + createPlatformCachePartitionType(input: SalesforceCreatePlatformCachePartitionTypeInput!): SalesforceCreatePlatformCachePartitionTypePayload! + + """Create a new DandBCompany""" + createDandBCompany(input: SalesforceCreateDandBCompanyInput!): SalesforceCreateDandBCompanyPayload! + + """Create a new UserProvisioningLog""" + createUserProvisioningLog(input: SalesforceCreateUserProvisioningLogInput!): SalesforceCreateUserProvisioningLogPayload! + + """Create a new TransactionSecurityPolicy""" + createTransactionSecurityPolicy(input: SalesforceCreateTransactionSecurityPolicyInput!): SalesforceCreateTransactionSecurityPolicyPayload! + + """Create a new PushTopic""" + createPushTopic(input: SalesforceCreatePushTopicInput!): SalesforceCreatePushTopicPayload! + + """Create a new Holiday""" + createHoliday(input: SalesforceCreateHolidayInput!): SalesforceCreateHolidayPayload! + + """Create a new EmailServicesAddress""" + createEmailServicesAddress(input: SalesforceCreateEmailServicesAddressInput!): SalesforceCreateEmailServicesAddressPayload! + + """Create a new Macro""" + createMacro(input: SalesforceCreateMacroInput!): SalesforceCreateMacroPayload! + + """Create a new FeedLike""" + createFeedLike(input: SalesforceCreateFeedLikeInput!): SalesforceCreateFeedLikePayload! + + """Create a new FieldPermissions""" + createFieldPermissions(input: SalesforceCreateFieldPermissionsInput!): SalesforceCreateFieldPermissionsPayload! + + """Create a new ApexTestQueueItem""" + createApexTestQueueItem(input: SalesforceCreateApexTestQueueItemInput!): SalesforceCreateApexTestQueueItemPayload! + + """Create a new StreamingChannel""" + createStreamingChannel(input: SalesforceCreateStreamingChannelInput!): SalesforceCreateStreamingChannelPayload! + + """Create a new Task""" + createTask(input: SalesforceCreateTaskInput!): SalesforceCreateTaskPayload! + + """Create a new UserProvisioningConfig""" + createUserProvisioningConfig(input: SalesforceCreateUserProvisioningConfigInput!): SalesforceCreateUserProvisioningConfigPayload! + + """Create a new DuplicateRecordItem""" + createDuplicateRecordItem(input: SalesforceCreateDuplicateRecordItemInput!): SalesforceCreateDuplicateRecordItemPayload! + + """Create a new PermissionSetAssignment""" + createPermissionSetAssignment(input: SalesforceCreatePermissionSetAssignmentInput!): SalesforceCreatePermissionSetAssignmentPayload! + + """Create a new UserListViewCriterion""" + createUserListViewCriterion(input: SalesforceCreateUserListViewCriterionInput!): SalesforceCreateUserListViewCriterionPayload! + + """Create a new OrderItem""" + createOrderItem(input: SalesforceCreateOrderItemInput!): SalesforceCreateOrderItemPayload! + + """Create a new EmailMessage""" + createEmailMessage(input: SalesforceCreateEmailMessageInput!): SalesforceCreateEmailMessagePayload! + + """Create a new CollaborationGroupRecord""" + createCollaborationGroupRecord(input: SalesforceCreateCollaborationGroupRecordInput!): SalesforceCreateCollaborationGroupRecordPayload! + + """Create a new LightningComponentBundle""" + createLightningComponentBundle(input: SalesforceCreateLightningComponentBundleInput!): SalesforceCreateLightningComponentBundlePayload! + + """Create a new TopicAssignment""" + createTopicAssignment(input: SalesforceCreateTopicAssignmentInput!): SalesforceCreateTopicAssignmentPayload! + + """Create a new ApexTestRunResult""" + createApexTestRunResult(input: SalesforceCreateApexTestRunResultInput!): SalesforceCreateApexTestRunResultPayload! + + """Create a new AuraDefinitionBundle""" + createAuraDefinitionBundle(input: SalesforceCreateAuraDefinitionBundleInput!): SalesforceCreateAuraDefinitionBundlePayload! + + """Update AuthProvider""" + updateAuthProvider(input: SalesforceUpdateAuthProviderInput!): SalesforceUpdateAuthProviderPayload! + + """Update PlatformCachePartition""" + updatePlatformCachePartition(input: SalesforceUpdatePlatformCachePartitionInput!): SalesforceUpdatePlatformCachePartitionPayload! + + """Update StreamingChannelShare""" + updateStreamingChannelShare(input: SalesforceUpdateStreamingChannelShareInput!): SalesforceUpdateStreamingChannelSharePayload! + + """Update CaseComment""" + updateCaseComment(input: SalesforceUpdateCaseCommentInput!): SalesforceUpdateCaseCommentPayload! + + """Update BrandTemplate""" + updateBrandTemplate(input: SalesforceUpdateBrandTemplateInput!): SalesforceUpdateBrandTemplatePayload! + + """Update Case""" + updateCase(input: SalesforceUpdateCaseInput!): SalesforceUpdateCasePayload! + + """Update ApexPage""" + updateApexPage(input: SalesforceUpdateApexPageInput!): SalesforceUpdateApexPagePayload! + + """Update LightningComponentResource""" + updateLightningComponentResource(input: SalesforceUpdateLightningComponentResourceInput!): SalesforceUpdateLightningComponentResourcePayload! + + """Update ApexComponent""" + updateApexComponent(input: SalesforceUpdateApexComponentInput!): SalesforceUpdateApexComponentPayload! + + """Update Attachment""" + updateAttachment(input: SalesforceUpdateAttachmentInput!): SalesforceUpdateAttachmentPayload! + + """Update Order""" + updateOrder(input: SalesforceUpdateOrderInput!): SalesforceUpdateOrderPayload! + + """Update Campaign""" + updateCampaign(input: SalesforceUpdateCampaignInput!): SalesforceUpdateCampaignPayload! + + """Update CollaborationGroupMemberRequest""" + updateCollaborationGroupMemberRequest(input: SalesforceUpdateCollaborationGroupMemberRequestInput!): SalesforceUpdateCollaborationGroupMemberRequestPayload! + + """Update MacroShare""" + updateMacroShare(input: SalesforceUpdateMacroShareInput!): SalesforceUpdateMacroSharePayload! + + """Update ContentAsset""" + updateContentAsset(input: SalesforceUpdateContentAssetInput!): SalesforceUpdateContentAssetPayload! + + """Update CustomBrandAsset""" + updateCustomBrandAsset(input: SalesforceUpdateCustomBrandAssetInput!): SalesforceUpdateCustomBrandAssetPayload! + + """Update UserLogin""" + updateUserLogin(input: SalesforceUpdateUserLoginInput!): SalesforceUpdateUserLoginPayload! + + """Update ApexTrigger""" + updateApexTrigger(input: SalesforceUpdateApexTriggerInput!): SalesforceUpdateApexTriggerPayload! + + """Update ApexClass""" + updateApexClass(input: SalesforceUpdateApexClassInput!): SalesforceUpdateApexClassPayload! + + """Update FeedItem""" + updateFeedItem(input: SalesforceUpdateFeedItemInput!): SalesforceUpdateFeedItemPayload! + + """Update UserAppMenuCustomizationShare""" + updateUserAppMenuCustomizationShare(input: SalesforceUpdateUserAppMenuCustomizationShareInput!): SalesforceUpdateUserAppMenuCustomizationSharePayload! + + """Update AppMenuItem""" + updateAppMenuItem(input: SalesforceUpdateAppMenuItemInput!): SalesforceUpdateAppMenuItemPayload! + + """Update UserAppInfo""" + updateUserAppInfo(input: SalesforceUpdateUserAppInfoInput!): SalesforceUpdateUserAppInfoPayload! + + """Update ActionLinkGroupTemplate""" + updateActionLinkGroupTemplate(input: SalesforceUpdateActionLinkGroupTemplateInput!): SalesforceUpdateActionLinkGroupTemplatePayload! + + """Update UserProvisioningRequestShare""" + updateUserProvisioningRequestShare(input: SalesforceUpdateUserProvisioningRequestShareInput!): SalesforceUpdateUserProvisioningRequestSharePayload! + + """Update Asset""" + updateAsset(input: SalesforceUpdateAssetInput!): SalesforceUpdateAssetPayload! + + """Update ProcessInstanceWorkitem""" + updateProcessInstanceWorkitem(input: SalesforceUpdateProcessInstanceWorkitemInput!): SalesforceUpdateProcessInstanceWorkitemPayload! + + """Update UserProvAccount""" + updateUserProvAccount(input: SalesforceUpdateUserProvAccountInput!): SalesforceUpdateUserProvAccountPayload! + + """Update UserListView""" + updateUserListView(input: SalesforceUpdateUserListViewInput!): SalesforceUpdateUserListViewPayload! + + """Update ApexEmailNotification""" + updateApexEmailNotification(input: SalesforceUpdateApexEmailNotificationInput!): SalesforceUpdateApexEmailNotificationPayload! + + """Update CategoryNode""" + updateCategoryNode(input: SalesforceUpdateCategoryNodeInput!): SalesforceUpdateCategoryNodePayload! + + """Update AdditionalNumber""" + updateAdditionalNumber(input: SalesforceUpdateAdditionalNumberInput!): SalesforceUpdateAdditionalNumberPayload! + + """Update FlowRecordRelation""" + updateFlowRecordRelation(input: SalesforceUpdateFlowRecordRelationInput!): SalesforceUpdateFlowRecordRelationPayload! + + """Update OpportunityLineItem""" + updateOpportunityLineItem(input: SalesforceUpdateOpportunityLineItemInput!): SalesforceUpdateOpportunityLineItemPayload! + + """Update Organization""" + updateOrganization(input: SalesforceUpdateOrganizationInput!): SalesforceUpdateOrganizationPayload! + + """Update TodayGoal""" + updateTodayGoal(input: SalesforceUpdateTodayGoalInput!): SalesforceUpdateTodayGoalPayload! + + """Update ListEmailRecipientSource""" + updateListEmailRecipientSource(input: SalesforceUpdateListEmailRecipientSourceInput!): SalesforceUpdateListEmailRecipientSourcePayload! + + """Update Opportunity""" + updateOpportunity(input: SalesforceUpdateOpportunityInput!): SalesforceUpdateOpportunityPayload! + + """Update CollaborationGroup""" + updateCollaborationGroup(input: SalesforceUpdateCollaborationGroupInput!): SalesforceUpdateCollaborationGroupPayload! + + """Update Idea""" + updateIdea(input: SalesforceUpdateIdeaInput!): SalesforceUpdateIdeaPayload! + + """Update CustomBrand""" + updateCustomBrand(input: SalesforceUpdateCustomBrandInput!): SalesforceUpdateCustomBrandPayload! + + """Update Note""" + updateNote(input: SalesforceUpdateNoteInput!): SalesforceUpdateNotePayload! + + """Update ContractContactRole""" + updateContractContactRole(input: SalesforceUpdateContractContactRoleInput!): SalesforceUpdateContractContactRolePayload! + + """Update Vote""" + updateVote(input: SalesforceUpdateVoteInput!): SalesforceUpdateVotePayload! + + """Update Solution""" + updateSolution(input: SalesforceUpdateSolutionInput!): SalesforceUpdateSolutionPayload! + + """Update BusinessProcess""" + updateBusinessProcess(input: SalesforceUpdateBusinessProcessInput!): SalesforceUpdateBusinessProcessPayload! + + """Update UserProvAccountStaging""" + updateUserProvAccountStaging(input: SalesforceUpdateUserProvAccountStagingInput!): SalesforceUpdateUserProvAccountStagingPayload! + + """Update FlowInterviewShare""" + updateFlowInterviewShare(input: SalesforceUpdateFlowInterviewShareInput!): SalesforceUpdateFlowInterviewSharePayload! + + """Update OrgDeleteRequestShare""" + updateOrgDeleteRequestShare(input: SalesforceUpdateOrgDeleteRequestShareInput!): SalesforceUpdateOrgDeleteRequestSharePayload! + + """Update ApexTestResult""" + updateApexTestResult(input: SalesforceUpdateApexTestResultInput!): SalesforceUpdateApexTestResultPayload! + + """Update Folder""" + updateFolder(input: SalesforceUpdateFolderInput!): SalesforceUpdateFolderPayload! + + """Update QuickTextShare""" + updateQuickTextShare(input: SalesforceUpdateQuickTextShareInput!): SalesforceUpdateQuickTextSharePayload! + + """Update Product2""" + updateProduct2(input: SalesforceUpdateProduct2Input!): SalesforceUpdateProduct2Payload! + + """Update EmailServicesFunction""" + updateEmailServicesFunction(input: SalesforceUpdateEmailServicesFunctionInput!): SalesforceUpdateEmailServicesFunctionPayload! + + """Update OrgWideEmailAddress""" + updateOrgWideEmailAddress(input: SalesforceUpdateOrgWideEmailAddressInput!): SalesforceUpdateOrgWideEmailAddressPayload! + + """Update EmailMessageRelation""" + updateEmailMessageRelation(input: SalesforceUpdateEmailMessageRelationInput!): SalesforceUpdateEmailMessageRelationPayload! + + """Update CspTrustedSite""" + updateCspTrustedSite(input: SalesforceUpdateCspTrustedSiteInput!): SalesforceUpdateCspTrustedSitePayload! + + """Update Contract""" + updateContract(input: SalesforceUpdateContractInput!): SalesforceUpdateContractPayload! + + """Update DocumentAttachmentMap""" + updateDocumentAttachmentMap(input: SalesforceUpdateDocumentAttachmentMapInput!): SalesforceUpdateDocumentAttachmentMapPayload! + + """Update MacroInstruction""" + updateMacroInstruction(input: SalesforceUpdateMacroInstructionInput!): SalesforceUpdateMacroInstructionPayload! + + """Update ContentWorkspacePermission""" + updateContentWorkspacePermission(input: SalesforceUpdateContentWorkspacePermissionInput!): SalesforceUpdateContentWorkspacePermissionPayload! + + """Update BusinessHours""" + updateBusinessHours(input: SalesforceUpdateBusinessHoursInput!): SalesforceUpdateBusinessHoursPayload! + + """Update User""" + updateUser(input: SalesforceUpdateUserInput!): SalesforceUpdateUserPayload! + + """Update CaseContactRole""" + updateCaseContactRole(input: SalesforceUpdateCaseContactRoleInput!): SalesforceUpdateCaseContactRolePayload! + + """Update UserAppMenuCustomization""" + updateUserAppMenuCustomization(input: SalesforceUpdateUserAppMenuCustomizationInput!): SalesforceUpdateUserAppMenuCustomizationPayload! + + """Update Announcement""" + updateAnnouncement(input: SalesforceUpdateAnnouncementInput!): SalesforceUpdateAnnouncementPayload! + + """Update ExternalDataUserAuth""" + updateExternalDataUserAuth(input: SalesforceUpdateExternalDataUserAuthInput!): SalesforceUpdateExternalDataUserAuthPayload! + + """Update SearchPromotionRule""" + updateSearchPromotionRule(input: SalesforceUpdateSearchPromotionRuleInput!): SalesforceUpdateSearchPromotionRulePayload! + + """Update LeadCleanInfo""" + updateLeadCleanInfo(input: SalesforceUpdateLeadCleanInfoInput!): SalesforceUpdateLeadCleanInfoPayload! + + """Update Event""" + updateEvent(input: SalesforceUpdateEventInput!): SalesforceUpdateEventPayload! + + """Update CampaignMemberStatus""" + updateCampaignMemberStatus(input: SalesforceUpdateCampaignMemberStatusInput!): SalesforceUpdateCampaignMemberStatusPayload! + + """Update ContentVersion""" + updateContentVersion(input: SalesforceUpdateContentVersionInput!): SalesforceUpdateContentVersionPayload! + + """Update SecurityCustomBaseline""" + updateSecurityCustomBaseline(input: SalesforceUpdateSecurityCustomBaselineInput!): SalesforceUpdateSecurityCustomBaselinePayload! + + """Update AuraDefinition""" + updateAuraDefinition(input: SalesforceUpdateAuraDefinitionInput!): SalesforceUpdateAuraDefinitionPayload! + + """Update Contact""" + updateContact(input: SalesforceUpdateContactInput!): SalesforceUpdateContactPayload! + + """Update ContentDocument""" + updateContentDocument(input: SalesforceUpdateContentDocumentInput!): SalesforceUpdateContentDocumentPayload! + + """Update EmailTemplate""" + updateEmailTemplate(input: SalesforceUpdateEmailTemplateInput!): SalesforceUpdateEmailTemplatePayload! + + """Update Topic""" + updateTopic(input: SalesforceUpdateTopicInput!): SalesforceUpdateTopicPayload! + + """Update ApexTestSuite""" + updateApexTestSuite(input: SalesforceUpdateApexTestSuiteInput!): SalesforceUpdateApexTestSuitePayload! + + """Update ContentWorkspaceMember""" + updateContentWorkspaceMember(input: SalesforceUpdateContentWorkspaceMemberInput!): SalesforceUpdateContentWorkspaceMemberPayload! + + """Update ContentWorkspace""" + updateContentWorkspace(input: SalesforceUpdateContentWorkspaceInput!): SalesforceUpdateContentWorkspacePayload! + + """Update ContentFolderMember""" + updateContentFolderMember(input: SalesforceUpdateContentFolderMemberInput!): SalesforceUpdateContentFolderMemberPayload! + + """Update CaseTeamMember""" + updateCaseTeamMember(input: SalesforceUpdateCaseTeamMemberInput!): SalesforceUpdateCaseTeamMemberPayload! + + """Update MailmergeTemplate""" + updateMailmergeTemplate(input: SalesforceUpdateMailmergeTemplateInput!): SalesforceUpdateMailmergeTemplatePayload! + + """Update UserPreference""" + updateUserPreference(input: SalesforceUpdateUserPreferenceInput!): SalesforceUpdateUserPreferencePayload! + + """Update CollaborationGroupMember""" + updateCollaborationGroupMember(input: SalesforceUpdateCollaborationGroupMemberInput!): SalesforceUpdateCollaborationGroupMemberPayload! + + """Update AssetRelationship""" + updateAssetRelationship(input: SalesforceUpdateAssetRelationshipInput!): SalesforceUpdateAssetRelationshipPayload! + + """Update UserRole""" + updateUserRole(input: SalesforceUpdateUserRoleInput!): SalesforceUpdateUserRolePayload! + + """Update OpportunityContactRole""" + updateOpportunityContactRole(input: SalesforceUpdateOpportunityContactRoleInput!): SalesforceUpdateOpportunityContactRolePayload! + + """Update Account""" + updateAccount(input: SalesforceUpdateAccountInput!): SalesforceUpdateAccountPayload! + + """Update Profile""" + updateProfile(input: SalesforceUpdateProfileInput!): SalesforceUpdateProfilePayload! + + """Update ActionLinkTemplate""" + updateActionLinkTemplate(input: SalesforceUpdateActionLinkTemplateInput!): SalesforceUpdateActionLinkTemplatePayload! + + """Update PermissionSet""" + updatePermissionSet(input: SalesforceUpdatePermissionSetInput!): SalesforceUpdatePermissionSetPayload! + + """Update CampaignMember""" + updateCampaignMember(input: SalesforceUpdateCampaignMemberInput!): SalesforceUpdateCampaignMemberPayload! + + """Update AccountCleanInfo""" + updateAccountCleanInfo(input: SalesforceUpdateAccountCleanInfoInput!): SalesforceUpdateAccountCleanInfoPayload! + + """Update UserShare""" + updateUserShare(input: SalesforceUpdateUserShareInput!): SalesforceUpdateUserSharePayload! + + """Update UserProvisioningRequest""" + updateUserProvisioningRequest(input: SalesforceUpdateUserProvisioningRequestInput!): SalesforceUpdateUserProvisioningRequestPayload! + + """Update AccountContactRole""" + updateAccountContactRole(input: SalesforceUpdateAccountContactRoleInput!): SalesforceUpdateAccountContactRolePayload! + + """Update ListEmail""" + updateListEmail(input: SalesforceUpdateListEmailInput!): SalesforceUpdateListEmailPayload! + + """Update RecordType""" + updateRecordType(input: SalesforceUpdateRecordTypeInput!): SalesforceUpdateRecordTypePayload! + + """Update CaseTeamRole""" + updateCaseTeamRole(input: SalesforceUpdateCaseTeamRoleInput!): SalesforceUpdateCaseTeamRolePayload! + + """Update FeedAttachment""" + updateFeedAttachment(input: SalesforceUpdateFeedAttachmentInput!): SalesforceUpdateFeedAttachmentPayload! + + """Update PricebookEntry""" + updatePricebookEntry(input: SalesforceUpdatePricebookEntryInput!): SalesforceUpdatePricebookEntryPayload! + + """Update ChatterExtensionConfig""" + updateChatterExtensionConfig(input: SalesforceUpdateChatterExtensionConfigInput!): SalesforceUpdateChatterExtensionConfigPayload! + + """Update ListEmailShare""" + updateListEmailShare(input: SalesforceUpdateListEmailShareInput!): SalesforceUpdateListEmailSharePayload! + + """Update CategoryData""" + updateCategoryData(input: SalesforceUpdateCategoryDataInput!): SalesforceUpdateCategoryDataPayload! + + """Update ContentDistribution""" + updateContentDistribution(input: SalesforceUpdateContentDistributionInput!): SalesforceUpdateContentDistributionPayload! + + """Update ContentFolder""" + updateContentFolder(input: SalesforceUpdateContentFolderInput!): SalesforceUpdateContentFolderPayload! + + """Update TodayGoalShare""" + updateTodayGoalShare(input: SalesforceUpdateTodayGoalShareInput!): SalesforceUpdateTodayGoalSharePayload! + + """Update StaticResource""" + updateStaticResource(input: SalesforceUpdateStaticResourceInput!): SalesforceUpdateStaticResourcePayload! + + """Update EventRelation""" + updateEventRelation(input: SalesforceUpdateEventRelationInput!): SalesforceUpdateEventRelationPayload! + + """Update WebLink""" + updateWebLink(input: SalesforceUpdateWebLinkInput!): SalesforceUpdateWebLinkPayload! + + """Update Lead""" + updateLead(input: SalesforceUpdateLeadInput!): SalesforceUpdateLeadPayload! + + """Update FeedComment""" + updateFeedComment(input: SalesforceUpdateFeedCommentInput!): SalesforceUpdateFeedCommentPayload! + + """Update EmailDomainKey""" + updateEmailDomainKey(input: SalesforceUpdateEmailDomainKeyInput!): SalesforceUpdateEmailDomainKeyPayload! + + """Update RecentlyViewed""" + updateRecentlyViewed(input: SalesforceUpdateRecentlyViewedInput!): SalesforceUpdateRecentlyViewedPayload! + + """Update Pricebook2""" + updatePricebook2(input: SalesforceUpdatePricebook2Input!): SalesforceUpdatePricebook2Payload! + + """Update UserProvMockTarget""" + updateUserProvMockTarget(input: SalesforceUpdateUserProvMockTargetInput!): SalesforceUpdateUserProvMockTargetPayload! + + """Update ListViewChart""" + updateListViewChart(input: SalesforceUpdateListViewChartInput!): SalesforceUpdateListViewChartPayload! + + """Update ObjectPermissions""" + updateObjectPermissions(input: SalesforceUpdateObjectPermissionsInput!): SalesforceUpdateObjectPermissionsPayload! + + """Update CaseTeamTemplate""" + updateCaseTeamTemplate(input: SalesforceUpdateCaseTeamTemplateInput!): SalesforceUpdateCaseTeamTemplatePayload! + + """Update ApexTestResultLimits""" + updateApexTestResultLimits(input: SalesforceUpdateApexTestResultLimitsInput!): SalesforceUpdateApexTestResultLimitsPayload! + + """Update CaseTeamTemplateMember""" + updateCaseTeamTemplateMember(input: SalesforceUpdateCaseTeamTemplateMemberInput!): SalesforceUpdateCaseTeamTemplateMemberPayload! + + """Update IdeaComment""" + updateIdeaComment(input: SalesforceUpdateIdeaCommentInput!): SalesforceUpdateIdeaCommentPayload! + + """Update OpportunityCompetitor""" + updateOpportunityCompetitor(input: SalesforceUpdateOpportunityCompetitorInput!): SalesforceUpdateOpportunityCompetitorPayload! + + """Update ContentDocumentLink""" + updateContentDocumentLink(input: SalesforceUpdateContentDocumentLinkInput!): SalesforceUpdateContentDocumentLinkPayload! + + """Update ChatterExtension""" + updateChatterExtension(input: SalesforceUpdateChatterExtensionInput!): SalesforceUpdateChatterExtensionPayload! + + """Update CorsWhitelistEntry""" + updateCorsWhitelistEntry(input: SalesforceUpdateCorsWhitelistEntryInput!): SalesforceUpdateCorsWhitelistEntryPayload! + + """Update QuickText""" + updateQuickText(input: SalesforceUpdateQuickTextInput!): SalesforceUpdateQuickTextPayload! + + """Update DuplicateRecordSet""" + updateDuplicateRecordSet(input: SalesforceUpdateDuplicateRecordSetInput!): SalesforceUpdateDuplicateRecordSetPayload! + + """Update ContactCleanInfo""" + updateContactCleanInfo(input: SalesforceUpdateContactCleanInfoInput!): SalesforceUpdateContactCleanInfoPayload! + + """Update Document""" + updateDocument(input: SalesforceUpdateDocumentInput!): SalesforceUpdateDocumentPayload! + + """Update Group""" + updateGroup(input: SalesforceUpdateGroupInput!): SalesforceUpdateGroupPayload! + + """Update PlatformCachePartitionType""" + updatePlatformCachePartitionType(input: SalesforceUpdatePlatformCachePartitionTypeInput!): SalesforceUpdatePlatformCachePartitionTypePayload! + + """Update DandBCompany""" + updateDandBCompany(input: SalesforceUpdateDandBCompanyInput!): SalesforceUpdateDandBCompanyPayload! + + """Update UserProvisioningLog""" + updateUserProvisioningLog(input: SalesforceUpdateUserProvisioningLogInput!): SalesforceUpdateUserProvisioningLogPayload! + + """Update TransactionSecurityPolicy""" + updateTransactionSecurityPolicy(input: SalesforceUpdateTransactionSecurityPolicyInput!): SalesforceUpdateTransactionSecurityPolicyPayload! + + """Update PushTopic""" + updatePushTopic(input: SalesforceUpdatePushTopicInput!): SalesforceUpdatePushTopicPayload! + + """Update Holiday""" + updateHoliday(input: SalesforceUpdateHolidayInput!): SalesforceUpdateHolidayPayload! + + """Update EmailServicesAddress""" + updateEmailServicesAddress(input: SalesforceUpdateEmailServicesAddressInput!): SalesforceUpdateEmailServicesAddressPayload! + + """Update Macro""" + updateMacro(input: SalesforceUpdateMacroInput!): SalesforceUpdateMacroPayload! + + """Update FieldPermissions""" + updateFieldPermissions(input: SalesforceUpdateFieldPermissionsInput!): SalesforceUpdateFieldPermissionsPayload! + + """Update ApexTestQueueItem""" + updateApexTestQueueItem(input: SalesforceUpdateApexTestQueueItemInput!): SalesforceUpdateApexTestQueueItemPayload! + + """Update StreamingChannel""" + updateStreamingChannel(input: SalesforceUpdateStreamingChannelInput!): SalesforceUpdateStreamingChannelPayload! + + """Update Task""" + updateTask(input: SalesforceUpdateTaskInput!): SalesforceUpdateTaskPayload! + + """Update UserProvisioningConfig""" + updateUserProvisioningConfig(input: SalesforceUpdateUserProvisioningConfigInput!): SalesforceUpdateUserProvisioningConfigPayload! + + """Update DuplicateRecordItem""" + updateDuplicateRecordItem(input: SalesforceUpdateDuplicateRecordItemInput!): SalesforceUpdateDuplicateRecordItemPayload! + + """Update UserListViewCriterion""" + updateUserListViewCriterion(input: SalesforceUpdateUserListViewCriterionInput!): SalesforceUpdateUserListViewCriterionPayload! + + """Update OrderItem""" + updateOrderItem(input: SalesforceUpdateOrderItemInput!): SalesforceUpdateOrderItemPayload! + + """Update EmailMessage""" + updateEmailMessage(input: SalesforceUpdateEmailMessageInput!): SalesforceUpdateEmailMessagePayload! + + """Update Scontrol""" + updateScontrol(input: SalesforceUpdateScontrolInput!): SalesforceUpdateScontrolPayload! + + """Update LightningComponentBundle""" + updateLightningComponentBundle(input: SalesforceUpdateLightningComponentBundleInput!): SalesforceUpdateLightningComponentBundlePayload! + + """Update ApexTestRunResult""" + updateApexTestRunResult(input: SalesforceUpdateApexTestRunResultInput!): SalesforceUpdateApexTestRunResultPayload! + + """Update AuraDefinitionBundle""" + updateAuraDefinitionBundle(input: SalesforceUpdateAuraDefinitionBundleInput!): SalesforceUpdateAuraDefinitionBundlePayload! + + """Delete AuthProvider by its id.""" + deleteAuthProvider(input: SalesforceDeleteAuthProviderInput!): SalesforceDeleteAuthProviderPayload! + + """Delete PlatformCachePartition by its id.""" + deletePlatformCachePartition(input: SalesforceDeletePlatformCachePartitionInput!): SalesforceDeletePlatformCachePartitionPayload! + + """Delete StreamingChannelShare by its id.""" + deleteStreamingChannelShare(input: SalesforceDeleteStreamingChannelShareInput!): SalesforceDeleteStreamingChannelSharePayload! + + """Delete CaseComment by its id.""" + deleteCaseComment(input: SalesforceDeleteCaseCommentInput!): SalesforceDeleteCaseCommentPayload! + + """Delete BrandTemplate by its id.""" + deleteBrandTemplate(input: SalesforceDeleteBrandTemplateInput!): SalesforceDeleteBrandTemplatePayload! + + """Delete ContentDistributionView by its id.""" + deleteContentDistributionView(input: SalesforceDeleteContentDistributionViewInput!): SalesforceDeleteContentDistributionViewPayload! + + """Delete ContentUserSubscription by its id.""" + deleteContentUserSubscription(input: SalesforceDeleteContentUserSubscriptionInput!): SalesforceDeleteContentUserSubscriptionPayload! + + """Delete Case by its id.""" + deleteCase(input: SalesforceDeleteCaseInput!): SalesforceDeleteCasePayload! + + """Delete ApexPage by its id.""" + deleteApexPage(input: SalesforceDeleteApexPageInput!): SalesforceDeleteApexPagePayload! + + """Delete LightningComponentResource by its id.""" + deleteLightningComponentResource(input: SalesforceDeleteLightningComponentResourceInput!): SalesforceDeleteLightningComponentResourcePayload! + + """Delete ApexComponent by its id.""" + deleteApexComponent(input: SalesforceDeleteApexComponentInput!): SalesforceDeleteApexComponentPayload! + + """Delete Attachment by its id.""" + deleteAttachment(input: SalesforceDeleteAttachmentInput!): SalesforceDeleteAttachmentPayload! + + """Delete OrderFeed by its id.""" + deleteOrderFeed(input: SalesforceDeleteOrderFeedInput!): SalesforceDeleteOrderFeedPayload! + + """Delete Order by its id.""" + deleteOrder(input: SalesforceDeleteOrderInput!): SalesforceDeleteOrderPayload! + + """Delete Campaign by its id.""" + deleteCampaign(input: SalesforceDeleteCampaignInput!): SalesforceDeleteCampaignPayload! + + """Delete CollaborationGroupMemberRequest by its id.""" + deleteCollaborationGroupMemberRequest(input: SalesforceDeleteCollaborationGroupMemberRequestInput!): SalesforceDeleteCollaborationGroupMemberRequestPayload! + + """Delete MacroShare by its id.""" + deleteMacroShare(input: SalesforceDeleteMacroShareInput!): SalesforceDeleteMacroSharePayload! + + """Delete ContentAsset by its id.""" + deleteContentAsset(input: SalesforceDeleteContentAssetInput!): SalesforceDeleteContentAssetPayload! + + """Delete AccountFeed by its id.""" + deleteAccountFeed(input: SalesforceDeleteAccountFeedInput!): SalesforceDeleteAccountFeedPayload! + + """Delete CustomBrandAsset by its id.""" + deleteCustomBrandAsset(input: SalesforceDeleteCustomBrandAssetInput!): SalesforceDeleteCustomBrandAssetPayload! + + """Delete ApexTrigger by its id.""" + deleteApexTrigger(input: SalesforceDeleteApexTriggerInput!): SalesforceDeleteApexTriggerPayload! + + """Delete SiteFeed by its id.""" + deleteSiteFeed(input: SalesforceDeleteSiteFeedInput!): SalesforceDeleteSiteFeedPayload! + + """Delete DashboardFeed by its id.""" + deleteDashboardFeed(input: SalesforceDeleteDashboardFeedInput!): SalesforceDeleteDashboardFeedPayload! + + """Delete ApexClass by its id.""" + deleteApexClass(input: SalesforceDeleteApexClassInput!): SalesforceDeleteApexClassPayload! + + """Delete FeedItem by its id.""" + deleteFeedItem(input: SalesforceDeleteFeedItemInput!): SalesforceDeleteFeedItemPayload! + + """Delete DashboardComponentFeed by its id.""" + deleteDashboardComponentFeed(input: SalesforceDeleteDashboardComponentFeedInput!): SalesforceDeleteDashboardComponentFeedPayload! + + """Delete UserAppMenuCustomizationShare by its id.""" + deleteUserAppMenuCustomizationShare(input: SalesforceDeleteUserAppMenuCustomizationShareInput!): SalesforceDeleteUserAppMenuCustomizationSharePayload! + + """Delete AppMenuItem by its id.""" + deleteAppMenuItem(input: SalesforceDeleteAppMenuItemInput!): SalesforceDeleteAppMenuItemPayload! + + """Delete UserAppInfo by its id.""" + deleteUserAppInfo(input: SalesforceDeleteUserAppInfoInput!): SalesforceDeleteUserAppInfoPayload! + + """Delete ActionLinkGroupTemplate by its id.""" + deleteActionLinkGroupTemplate(input: SalesforceDeleteActionLinkGroupTemplateInput!): SalesforceDeleteActionLinkGroupTemplatePayload! + + """Delete UserProvisioningRequestShare by its id.""" + deleteUserProvisioningRequestShare(input: SalesforceDeleteUserProvisioningRequestShareInput!): SalesforceDeleteUserProvisioningRequestSharePayload! + + """Delete Asset by its id.""" + deleteAsset(input: SalesforceDeleteAssetInput!): SalesforceDeleteAssetPayload! + + """Delete ProcessInstanceWorkitem by its id.""" + deleteProcessInstanceWorkitem(input: SalesforceDeleteProcessInstanceWorkitemInput!): SalesforceDeleteProcessInstanceWorkitemPayload! + + """Delete UserProvAccount by its id.""" + deleteUserProvAccount(input: SalesforceDeleteUserProvAccountInput!): SalesforceDeleteUserProvAccountPayload! + + """Delete UserListView by its id.""" + deleteUserListView(input: SalesforceDeleteUserListViewInput!): SalesforceDeleteUserListViewPayload! + + """Delete ApexEmailNotification by its id.""" + deleteApexEmailNotification(input: SalesforceDeleteApexEmailNotificationInput!): SalesforceDeleteApexEmailNotificationPayload! + + """Delete CategoryNode by its id.""" + deleteCategoryNode(input: SalesforceDeleteCategoryNodeInput!): SalesforceDeleteCategoryNodePayload! + + """Delete EntitySubscription by its id.""" + deleteEntitySubscription(input: SalesforceDeleteEntitySubscriptionInput!): SalesforceDeleteEntitySubscriptionPayload! + + """Delete Partner by its id.""" + deletePartner(input: SalesforceDeletePartnerInput!): SalesforceDeletePartnerPayload! + + """Delete CollaborationInvitation by its id.""" + deleteCollaborationInvitation(input: SalesforceDeleteCollaborationInvitationInput!): SalesforceDeleteCollaborationInvitationPayload! + + """Delete AdditionalNumber by its id.""" + deleteAdditionalNumber(input: SalesforceDeleteAdditionalNumberInput!): SalesforceDeleteAdditionalNumberPayload! + + """Delete FlowRecordRelation by its id.""" + deleteFlowRecordRelation(input: SalesforceDeleteFlowRecordRelationInput!): SalesforceDeleteFlowRecordRelationPayload! + + """Delete OpportunityLineItem by its id.""" + deleteOpportunityLineItem(input: SalesforceDeleteOpportunityLineItemInput!): SalesforceDeleteOpportunityLineItemPayload! + + """Delete TaskFeed by its id.""" + deleteTaskFeed(input: SalesforceDeleteTaskFeedInput!): SalesforceDeleteTaskFeedPayload! + + """Delete TodayGoal by its id.""" + deleteTodayGoal(input: SalesforceDeleteTodayGoalInput!): SalesforceDeleteTodayGoalPayload! + + """Delete ListEmailRecipientSource by its id.""" + deleteListEmailRecipientSource(input: SalesforceDeleteListEmailRecipientSourceInput!): SalesforceDeleteListEmailRecipientSourcePayload! + + """Delete ContentDocumentSubscription by its id.""" + deleteContentDocumentSubscription(input: SalesforceDeleteContentDocumentSubscriptionInput!): SalesforceDeleteContentDocumentSubscriptionPayload! + + """Delete Opportunity by its id.""" + deleteOpportunity(input: SalesforceDeleteOpportunityInput!): SalesforceDeleteOpportunityPayload! + + """Delete CollaborationGroup by its id.""" + deleteCollaborationGroup(input: SalesforceDeleteCollaborationGroupInput!): SalesforceDeleteCollaborationGroupPayload! + + """Delete Idea by its id.""" + deleteIdea(input: SalesforceDeleteIdeaInput!): SalesforceDeleteIdeaPayload! + + """Delete ReportFeed by its id.""" + deleteReportFeed(input: SalesforceDeleteReportFeedInput!): SalesforceDeleteReportFeedPayload! + + """Delete Note by its id.""" + deleteNote(input: SalesforceDeleteNoteInput!): SalesforceDeleteNotePayload! + + """Delete ContractContactRole by its id.""" + deleteContractContactRole(input: SalesforceDeleteContractContactRoleInput!): SalesforceDeleteContractContactRolePayload! + + """Delete Vote by its id.""" + deleteVote(input: SalesforceDeleteVoteInput!): SalesforceDeleteVotePayload! + + """Delete Solution by its id.""" + deleteSolution(input: SalesforceDeleteSolutionInput!): SalesforceDeleteSolutionPayload! + + """Delete UserProvAccountStaging by its id.""" + deleteUserProvAccountStaging(input: SalesforceDeleteUserProvAccountStagingInput!): SalesforceDeleteUserProvAccountStagingPayload! + + """Delete FlowInterviewShare by its id.""" + deleteFlowInterviewShare(input: SalesforceDeleteFlowInterviewShareInput!): SalesforceDeleteFlowInterviewSharePayload! + + """Delete OrgDeleteRequestShare by its id.""" + deleteOrgDeleteRequestShare(input: SalesforceDeleteOrgDeleteRequestShareInput!): SalesforceDeleteOrgDeleteRequestSharePayload! + + """Delete ApexTestResult by its id.""" + deleteApexTestResult(input: SalesforceDeleteApexTestResultInput!): SalesforceDeleteApexTestResultPayload! + + """Delete Folder by its id.""" + deleteFolder(input: SalesforceDeleteFolderInput!): SalesforceDeleteFolderPayload! + + """Delete QuickTextShare by its id.""" + deleteQuickTextShare(input: SalesforceDeleteQuickTextShareInput!): SalesforceDeleteQuickTextSharePayload! + + """Delete Product2 by its id.""" + deleteProduct2(input: SalesforceDeleteProduct2Input!): SalesforceDeleteProduct2Payload! + + """Delete FeedSignal by its id.""" + deleteFeedSignal(input: SalesforceDeleteFeedSignalInput!): SalesforceDeleteFeedSignalPayload! + + """Delete EmailServicesFunction by its id.""" + deleteEmailServicesFunction(input: SalesforceDeleteEmailServicesFunctionInput!): SalesforceDeleteEmailServicesFunctionPayload! + + """Delete OrgWideEmailAddress by its id.""" + deleteOrgWideEmailAddress(input: SalesforceDeleteOrgWideEmailAddressInput!): SalesforceDeleteOrgWideEmailAddressPayload! + + """Delete EmailMessageRelation by its id.""" + deleteEmailMessageRelation(input: SalesforceDeleteEmailMessageRelationInput!): SalesforceDeleteEmailMessageRelationPayload! + + """Delete CspTrustedSite by its id.""" + deleteCspTrustedSite(input: SalesforceDeleteCspTrustedSiteInput!): SalesforceDeleteCspTrustedSitePayload! + + """Delete ContentTagSubscription by its id.""" + deleteContentTagSubscription(input: SalesforceDeleteContentTagSubscriptionInput!): SalesforceDeleteContentTagSubscriptionPayload! + + """Delete Contract by its id.""" + deleteContract(input: SalesforceDeleteContractInput!): SalesforceDeleteContractPayload! + + """Delete MacroInstruction by its id.""" + deleteMacroInstruction(input: SalesforceDeleteMacroInstructionInput!): SalesforceDeleteMacroInstructionPayload! + + """Delete ContractFeed by its id.""" + deleteContractFeed(input: SalesforceDeleteContractFeedInput!): SalesforceDeleteContractFeedPayload! + + """Delete ContentWorkspacePermission by its id.""" + deleteContentWorkspacePermission(input: SalesforceDeleteContentWorkspacePermissionInput!): SalesforceDeleteContentWorkspacePermissionPayload! + + """Delete ContentNotification by its id.""" + deleteContentNotification(input: SalesforceDeleteContentNotificationInput!): SalesforceDeleteContentNotificationPayload! + + """Delete CaseContactRole by its id.""" + deleteCaseContactRole(input: SalesforceDeleteCaseContactRoleInput!): SalesforceDeleteCaseContactRolePayload! + + """Delete TestSuiteMembership by its id.""" + deleteTestSuiteMembership(input: SalesforceDeleteTestSuiteMembershipInput!): SalesforceDeleteTestSuiteMembershipPayload! + + """Delete UserAppMenuCustomization by its id.""" + deleteUserAppMenuCustomization(input: SalesforceDeleteUserAppMenuCustomizationInput!): SalesforceDeleteUserAppMenuCustomizationPayload! + + """Delete TopicUserEvent by its id.""" + deleteTopicUserEvent(input: SalesforceDeleteTopicUserEventInput!): SalesforceDeleteTopicUserEventPayload! + + """Delete Announcement by its id.""" + deleteAnnouncement(input: SalesforceDeleteAnnouncementInput!): SalesforceDeleteAnnouncementPayload! + + """Delete ExternalDataUserAuth by its id.""" + deleteExternalDataUserAuth(input: SalesforceDeleteExternalDataUserAuthInput!): SalesforceDeleteExternalDataUserAuthPayload! + + """Delete SearchPromotionRule by its id.""" + deleteSearchPromotionRule(input: SalesforceDeleteSearchPromotionRuleInput!): SalesforceDeleteSearchPromotionRulePayload! + + """Delete Event by its id.""" + deleteEvent(input: SalesforceDeleteEventInput!): SalesforceDeleteEventPayload! + + """Delete CampaignMemberStatus by its id.""" + deleteCampaignMemberStatus(input: SalesforceDeleteCampaignMemberStatusInput!): SalesforceDeleteCampaignMemberStatusPayload! + + """Delete SecurityCustomBaseline by its id.""" + deleteSecurityCustomBaseline(input: SalesforceDeleteSecurityCustomBaselineInput!): SalesforceDeleteSecurityCustomBaselinePayload! + + """Delete AuraDefinition by its id.""" + deleteAuraDefinition(input: SalesforceDeleteAuraDefinitionInput!): SalesforceDeleteAuraDefinitionPayload! + + """Delete Contact by its id.""" + deleteContact(input: SalesforceDeleteContactInput!): SalesforceDeleteContactPayload! + + """Delete ContentDocument by its id.""" + deleteContentDocument(input: SalesforceDeleteContentDocumentInput!): SalesforceDeleteContentDocumentPayload! + + """Delete EmailTemplate by its id.""" + deleteEmailTemplate(input: SalesforceDeleteEmailTemplateInput!): SalesforceDeleteEmailTemplatePayload! + + """Delete ContentVersionRating by its id.""" + deleteContentVersionRating(input: SalesforceDeleteContentVersionRatingInput!): SalesforceDeleteContentVersionRatingPayload! + + """Delete Topic by its id.""" + deleteTopic(input: SalesforceDeleteTopicInput!): SalesforceDeleteTopicPayload! + + """Delete ApexTestSuite by its id.""" + deleteApexTestSuite(input: SalesforceDeleteApexTestSuiteInput!): SalesforceDeleteApexTestSuitePayload! + + """Delete AuthSession by its id.""" + deleteAuthSession(input: SalesforceDeleteAuthSessionInput!): SalesforceDeleteAuthSessionPayload! + + """Delete ContentWorkspaceMember by its id.""" + deleteContentWorkspaceMember(input: SalesforceDeleteContentWorkspaceMemberInput!): SalesforceDeleteContentWorkspaceMemberPayload! + + """Delete QueueSobject by its id.""" + deleteQueueSobject(input: SalesforceDeleteQueueSobjectInput!): SalesforceDeleteQueueSobjectPayload! + + """Delete ContentDocumentFeed by its id.""" + deleteContentDocumentFeed(input: SalesforceDeleteContentDocumentFeedInput!): SalesforceDeleteContentDocumentFeedPayload! + + """Delete ContentWorkspace by its id.""" + deleteContentWorkspace(input: SalesforceDeleteContentWorkspaceInput!): SalesforceDeleteContentWorkspacePayload! + + """Delete ContentFolderMember by its id.""" + deleteContentFolderMember(input: SalesforceDeleteContentFolderMemberInput!): SalesforceDeleteContentFolderMemberPayload! + + """Delete CaseTeamMember by its id.""" + deleteCaseTeamMember(input: SalesforceDeleteCaseTeamMemberInput!): SalesforceDeleteCaseTeamMemberPayload! + + """Delete MailmergeTemplate by its id.""" + deleteMailmergeTemplate(input: SalesforceDeleteMailmergeTemplateInput!): SalesforceDeleteMailmergeTemplatePayload! + + """Delete CollaborationGroupFeed by its id.""" + deleteCollaborationGroupFeed(input: SalesforceDeleteCollaborationGroupFeedInput!): SalesforceDeleteCollaborationGroupFeedPayload! + + """Delete UserPreference by its id.""" + deleteUserPreference(input: SalesforceDeleteUserPreferenceInput!): SalesforceDeleteUserPreferencePayload! + + """Delete CollaborationGroupMember by its id.""" + deleteCollaborationGroupMember(input: SalesforceDeleteCollaborationGroupMemberInput!): SalesforceDeleteCollaborationGroupMemberPayload! + + """Delete AssetRelationship by its id.""" + deleteAssetRelationship(input: SalesforceDeleteAssetRelationshipInput!): SalesforceDeleteAssetRelationshipPayload! + + """Delete EventFeed by its id.""" + deleteEventFeed(input: SalesforceDeleteEventFeedInput!): SalesforceDeleteEventFeedPayload! + + """Delete UserRole by its id.""" + deleteUserRole(input: SalesforceDeleteUserRoleInput!): SalesforceDeleteUserRolePayload! + + """Delete OpportunityContactRole by its id.""" + deleteOpportunityContactRole(input: SalesforceDeleteOpportunityContactRoleInput!): SalesforceDeleteOpportunityContactRolePayload! + + """Delete CaseSolution by its id.""" + deleteCaseSolution(input: SalesforceDeleteCaseSolutionInput!): SalesforceDeleteCaseSolutionPayload! + + """Delete EmailCapture by its id.""" + deleteEmailCapture(input: SalesforceDeleteEmailCaptureInput!): SalesforceDeleteEmailCapturePayload! + + """Delete Account by its id.""" + deleteAccount(input: SalesforceDeleteAccountInput!): SalesforceDeleteAccountPayload! + + """Delete Profile by its id.""" + deleteProfile(input: SalesforceDeleteProfileInput!): SalesforceDeleteProfilePayload! + + """Delete ActionLinkTemplate by its id.""" + deleteActionLinkTemplate(input: SalesforceDeleteActionLinkTemplateInput!): SalesforceDeleteActionLinkTemplatePayload! + + """Delete PermissionSet by its id.""" + deletePermissionSet(input: SalesforceDeletePermissionSetInput!): SalesforceDeletePermissionSetPayload! + + """Delete AssetRelationshipFeed by its id.""" + deleteAssetRelationshipFeed(input: SalesforceDeleteAssetRelationshipFeedInput!): SalesforceDeleteAssetRelationshipFeedPayload! + + """Delete CampaignMember by its id.""" + deleteCampaignMember(input: SalesforceDeleteCampaignMemberInput!): SalesforceDeleteCampaignMemberPayload! + + """Delete UserShare by its id.""" + deleteUserShare(input: SalesforceDeleteUserShareInput!): SalesforceDeleteUserSharePayload! + + """Delete PermissionSetLicenseAssign by its id.""" + deletePermissionSetLicenseAssign(input: SalesforceDeletePermissionSetLicenseAssignInput!): SalesforceDeletePermissionSetLicenseAssignPayload! + + """Delete UserProvisioningRequest by its id.""" + deleteUserProvisioningRequest(input: SalesforceDeleteUserProvisioningRequestInput!): SalesforceDeleteUserProvisioningRequestPayload! + + """Delete UserPackageLicense by its id.""" + deleteUserPackageLicense(input: SalesforceDeleteUserPackageLicenseInput!): SalesforceDeleteUserPackageLicensePayload! + + """Delete CaseFeed by its id.""" + deleteCaseFeed(input: SalesforceDeleteCaseFeedInput!): SalesforceDeleteCaseFeedPayload! + + """Delete AssetFeed by its id.""" + deleteAssetFeed(input: SalesforceDeleteAssetFeedInput!): SalesforceDeleteAssetFeedPayload! + + """Delete ClientBrowser by its id.""" + deleteClientBrowser(input: SalesforceDeleteClientBrowserInput!): SalesforceDeleteClientBrowserPayload! + + """Delete AccountContactRole by its id.""" + deleteAccountContactRole(input: SalesforceDeleteAccountContactRoleInput!): SalesforceDeleteAccountContactRolePayload! + + """Delete ListEmail by its id.""" + deleteListEmail(input: SalesforceDeleteListEmailInput!): SalesforceDeleteListEmailPayload! + + """Delete TopicFeed by its id.""" + deleteTopicFeed(input: SalesforceDeleteTopicFeedInput!): SalesforceDeleteTopicFeedPayload! + + """Delete ContentWorkspaceSubscription by its id.""" + deleteContentWorkspaceSubscription(input: SalesforceDeleteContentWorkspaceSubscriptionInput!): SalesforceDeleteContentWorkspaceSubscriptionPayload! + + """Delete FeedAttachment by its id.""" + deleteFeedAttachment(input: SalesforceDeleteFeedAttachmentInput!): SalesforceDeleteFeedAttachmentPayload! + + """Delete PricebookEntry by its id.""" + deletePricebookEntry(input: SalesforceDeletePricebookEntryInput!): SalesforceDeletePricebookEntryPayload! + + """Delete ChatterExtensionConfig by its id.""" + deleteChatterExtensionConfig(input: SalesforceDeleteChatterExtensionConfigInput!): SalesforceDeleteChatterExtensionConfigPayload! + + """Delete CampaignFeed by its id.""" + deleteCampaignFeed(input: SalesforceDeleteCampaignFeedInput!): SalesforceDeleteCampaignFeedPayload! + + """Delete ListEmailShare by its id.""" + deleteListEmailShare(input: SalesforceDeleteListEmailShareInput!): SalesforceDeleteListEmailSharePayload! + + """Delete CategoryData by its id.""" + deleteCategoryData(input: SalesforceDeleteCategoryDataInput!): SalesforceDeleteCategoryDataPayload! + + """Delete ContentDistribution by its id.""" + deleteContentDistribution(input: SalesforceDeleteContentDistributionInput!): SalesforceDeleteContentDistributionPayload! + + """Delete ContentFolder by its id.""" + deleteContentFolder(input: SalesforceDeleteContentFolderInput!): SalesforceDeleteContentFolderPayload! + + """Delete TodayGoalShare by its id.""" + deleteTodayGoalShare(input: SalesforceDeleteTodayGoalShareInput!): SalesforceDeleteTodayGoalSharePayload! + + """Delete FlowInterview by its id.""" + deleteFlowInterview(input: SalesforceDeleteFlowInterviewInput!): SalesforceDeleteFlowInterviewPayload! + + """Delete StaticResource by its id.""" + deleteStaticResource(input: SalesforceDeleteStaticResourceInput!): SalesforceDeleteStaticResourcePayload! + + """Delete SolutionFeed by its id.""" + deleteSolutionFeed(input: SalesforceDeleteSolutionFeedInput!): SalesforceDeleteSolutionFeedPayload! + + """Delete EventRelation by its id.""" + deleteEventRelation(input: SalesforceDeleteEventRelationInput!): SalesforceDeleteEventRelationPayload! + + """Delete WebLink by its id.""" + deleteWebLink(input: SalesforceDeleteWebLinkInput!): SalesforceDeleteWebLinkPayload! + + """Delete Lead by its id.""" + deleteLead(input: SalesforceDeleteLeadInput!): SalesforceDeleteLeadPayload! + + """Delete FeedComment by its id.""" + deleteFeedComment(input: SalesforceDeleteFeedCommentInput!): SalesforceDeleteFeedCommentPayload! + + """Delete LoginIp by its id.""" + deleteLoginIp(input: SalesforceDeleteLoginIpInput!): SalesforceDeleteLoginIpPayload! + + """Delete EmailDomainKey by its id.""" + deleteEmailDomainKey(input: SalesforceDeleteEmailDomainKeyInput!): SalesforceDeleteEmailDomainKeyPayload! + + """Delete Pricebook2 by its id.""" + deletePricebook2(input: SalesforceDeletePricebook2Input!): SalesforceDeletePricebook2Payload! + + """Delete UserProvMockTarget by its id.""" + deleteUserProvMockTarget(input: SalesforceDeleteUserProvMockTargetInput!): SalesforceDeleteUserProvMockTargetPayload! + + """Delete OrderItemFeed by its id.""" + deleteOrderItemFeed(input: SalesforceDeleteOrderItemFeedInput!): SalesforceDeleteOrderItemFeedPayload! + + """Delete ListViewChart by its id.""" + deleteListViewChart(input: SalesforceDeleteListViewChartInput!): SalesforceDeleteListViewChartPayload! + + """Delete ObjectPermissions by its id.""" + deleteObjectPermissions(input: SalesforceDeleteObjectPermissionsInput!): SalesforceDeleteObjectPermissionsPayload! + + """Delete CaseTeamTemplate by its id.""" + deleteCaseTeamTemplate(input: SalesforceDeleteCaseTeamTemplateInput!): SalesforceDeleteCaseTeamTemplatePayload! + + """Delete ApexTestResultLimits by its id.""" + deleteApexTestResultLimits(input: SalesforceDeleteApexTestResultLimitsInput!): SalesforceDeleteApexTestResultLimitsPayload! + + """Delete CaseTeamTemplateMember by its id.""" + deleteCaseTeamTemplateMember(input: SalesforceDeleteCaseTeamTemplateMemberInput!): SalesforceDeleteCaseTeamTemplateMemberPayload! + + """Delete GroupMember by its id.""" + deleteGroupMember(input: SalesforceDeleteGroupMemberInput!): SalesforceDeleteGroupMemberPayload! + + """Delete CaseTeamTemplateRecord by its id.""" + deleteCaseTeamTemplateRecord(input: SalesforceDeleteCaseTeamTemplateRecordInput!): SalesforceDeleteCaseTeamTemplateRecordPayload! + + """Delete IdeaComment by its id.""" + deleteIdeaComment(input: SalesforceDeleteIdeaCommentInput!): SalesforceDeleteIdeaCommentPayload! + + """Delete OpportunityCompetitor by its id.""" + deleteOpportunityCompetitor(input: SalesforceDeleteOpportunityCompetitorInput!): SalesforceDeleteOpportunityCompetitorPayload! + + """Delete ContentDocumentLink by its id.""" + deleteContentDocumentLink(input: SalesforceDeleteContentDocumentLinkInput!): SalesforceDeleteContentDocumentLinkPayload! + + """Delete ChatterExtension by its id.""" + deleteChatterExtension(input: SalesforceDeleteChatterExtensionInput!): SalesforceDeleteChatterExtensionPayload! + + """Delete CorsWhitelistEntry by its id.""" + deleteCorsWhitelistEntry(input: SalesforceDeleteCorsWhitelistEntryInput!): SalesforceDeleteCorsWhitelistEntryPayload! + + """Delete QuickText by its id.""" + deleteQuickText(input: SalesforceDeleteQuickTextInput!): SalesforceDeleteQuickTextPayload! + + """Delete Product2Feed by its id.""" + deleteProduct2Feed(input: SalesforceDeleteProduct2FeedInput!): SalesforceDeleteProduct2FeedPayload! + + """Delete ContactFeed by its id.""" + deleteContactFeed(input: SalesforceDeleteContactFeedInput!): SalesforceDeleteContactFeedPayload! + + """Delete DuplicateRecordSet by its id.""" + deleteDuplicateRecordSet(input: SalesforceDeleteDuplicateRecordSetInput!): SalesforceDeleteDuplicateRecordSetPayload! + + """Delete SetupEntityAccess by its id.""" + deleteSetupEntityAccess(input: SalesforceDeleteSetupEntityAccessInput!): SalesforceDeleteSetupEntityAccessPayload! + + """Delete Document by its id.""" + deleteDocument(input: SalesforceDeleteDocumentInput!): SalesforceDeleteDocumentPayload! + + """Delete OpportunityFeed by its id.""" + deleteOpportunityFeed(input: SalesforceDeleteOpportunityFeedInput!): SalesforceDeleteOpportunityFeedPayload! + + """Delete Group by its id.""" + deleteGroup(input: SalesforceDeleteGroupInput!): SalesforceDeleteGroupPayload! + + """Delete ContentWorkspaceDoc by its id.""" + deleteContentWorkspaceDoc(input: SalesforceDeleteContentWorkspaceDocInput!): SalesforceDeleteContentWorkspaceDocPayload! + + """Delete PlatformCachePartitionType by its id.""" + deletePlatformCachePartitionType(input: SalesforceDeletePlatformCachePartitionTypeInput!): SalesforceDeletePlatformCachePartitionTypePayload! + + """Delete DandBCompany by its id.""" + deleteDandBCompany(input: SalesforceDeleteDandBCompanyInput!): SalesforceDeleteDandBCompanyPayload! + + """Delete UserProvisioningLog by its id.""" + deleteUserProvisioningLog(input: SalesforceDeleteUserProvisioningLogInput!): SalesforceDeleteUserProvisioningLogPayload! + + """Delete TransactionSecurityPolicy by its id.""" + deleteTransactionSecurityPolicy(input: SalesforceDeleteTransactionSecurityPolicyInput!): SalesforceDeleteTransactionSecurityPolicyPayload! + + """Delete PushTopic by its id.""" + deletePushTopic(input: SalesforceDeletePushTopicInput!): SalesforceDeletePushTopicPayload! + + """Delete Holiday by its id.""" + deleteHoliday(input: SalesforceDeleteHolidayInput!): SalesforceDeleteHolidayPayload! + + """Delete EmailServicesAddress by its id.""" + deleteEmailServicesAddress(input: SalesforceDeleteEmailServicesAddressInput!): SalesforceDeleteEmailServicesAddressPayload! + + """Delete Macro by its id.""" + deleteMacro(input: SalesforceDeleteMacroInput!): SalesforceDeleteMacroPayload! + + """Delete FeedLike by its id.""" + deleteFeedLike(input: SalesforceDeleteFeedLikeInput!): SalesforceDeleteFeedLikePayload! + + """Delete FieldPermissions by its id.""" + deleteFieldPermissions(input: SalesforceDeleteFieldPermissionsInput!): SalesforceDeleteFieldPermissionsPayload! + + """Delete StreamingChannel by its id.""" + deleteStreamingChannel(input: SalesforceDeleteStreamingChannelInput!): SalesforceDeleteStreamingChannelPayload! + + """Delete ContentVersionComment by its id.""" + deleteContentVersionComment(input: SalesforceDeleteContentVersionCommentInput!): SalesforceDeleteContentVersionCommentPayload! + + """Delete UserFeed by its id.""" + deleteUserFeed(input: SalesforceDeleteUserFeedInput!): SalesforceDeleteUserFeedPayload! + + """Delete Task by its id.""" + deleteTask(input: SalesforceDeleteTaskInput!): SalesforceDeleteTaskPayload! + + """Delete UserProvisioningConfig by its id.""" + deleteUserProvisioningConfig(input: SalesforceDeleteUserProvisioningConfigInput!): SalesforceDeleteUserProvisioningConfigPayload! + + """Delete DuplicateRecordItem by its id.""" + deleteDuplicateRecordItem(input: SalesforceDeleteDuplicateRecordItemInput!): SalesforceDeleteDuplicateRecordItemPayload! + + """Delete PermissionSetAssignment by its id.""" + deletePermissionSetAssignment(input: SalesforceDeletePermissionSetAssignmentInput!): SalesforceDeletePermissionSetAssignmentPayload! + + """Delete UserListViewCriterion by its id.""" + deleteUserListViewCriterion(input: SalesforceDeleteUserListViewCriterionInput!): SalesforceDeleteUserListViewCriterionPayload! + + """Delete OrderItem by its id.""" + deleteOrderItem(input: SalesforceDeleteOrderItemInput!): SalesforceDeleteOrderItemPayload! + + """Delete EmailMessage by its id.""" + deleteEmailMessage(input: SalesforceDeleteEmailMessageInput!): SalesforceDeleteEmailMessagePayload! + + """Delete CollaborationGroupRecord by its id.""" + deleteCollaborationGroupRecord(input: SalesforceDeleteCollaborationGroupRecordInput!): SalesforceDeleteCollaborationGroupRecordPayload! + + """Delete ApexLog by its id.""" + deleteApexLog(input: SalesforceDeleteApexLogInput!): SalesforceDeleteApexLogPayload! + + """Delete Scontrol by its id.""" + deleteScontrol(input: SalesforceDeleteScontrolInput!): SalesforceDeleteScontrolPayload! + + """Delete LeadFeed by its id.""" + deleteLeadFeed(input: SalesforceDeleteLeadFeedInput!): SalesforceDeleteLeadFeedPayload! + + """Delete LightningComponentBundle by its id.""" + deleteLightningComponentBundle(input: SalesforceDeleteLightningComponentBundleInput!): SalesforceDeleteLightningComponentBundlePayload! + + """Delete TopicAssignment by its id.""" + deleteTopicAssignment(input: SalesforceDeleteTopicAssignmentInput!): SalesforceDeleteTopicAssignmentPayload! + + """Delete ApexTestRunResult by its id.""" + deleteApexTestRunResult(input: SalesforceDeleteApexTestRunResultInput!): SalesforceDeleteApexTestRunResultPayload! + + """Delete AuraDefinitionBundle by its id.""" + deleteAuraDefinitionBundle(input: SalesforceDeleteAuraDefinitionBundleInput!): SalesforceDeleteAuraDefinitionBundlePayload! + + """ + Make a REST API call to the Salesforce API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: SalesforcePassthroughMutation! +} + +""" +Make a REST API call to the Netlify API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type NetlifyPassthroughMutation { + """ + Make a POST request to the Netlify API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + post( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PUT request to the Netlify API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + put( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PATCH request to the Netlify API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + patch( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a DELETE request to the Netlify API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + delete( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +input NetlifyDeploySiteCapabilitiesArg { + """""" + largeMediaEnabled: Boolean +} + +input NetlifyAvailableFunctionArg { + """""" + n: String + + """""" + d: String + + """""" + id: String + + """""" + c: String + + """""" + r: String + + """""" + s: Int +} + +input NetlifyDeployArg { + """""" + id: String + + """""" + siteId: String + + """""" + userId: String + + """""" + buildId: String + + """""" + state: String + + """""" + name: String + + """""" + url: String + + """""" + sslUrl: String + + """""" + adminUrl: String + + """""" + deployUrl: String + + """""" + deploySslUrl: String + + """""" + screenshotUrl: String + + """""" + reviewId: Float + + """""" + draft: Boolean + + """""" + required: [String!] + + """""" + requiredFunctions: [String!] + + """""" + errorMessage: String + + """""" + branch: String + + """""" + commitRef: String + + """""" + commitUrl: String + + """""" + skipped: Boolean + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + publishedAt: String + + """""" + title: String + + """""" + context: String + + """""" + locked: Boolean + + """""" + reviewUrl: String + + """""" + siteCapabilities: NetlifyDeploySiteCapabilitiesArg + + """""" + availableFunctions: [NetlifyAvailableFunctionArg!] +} + +input NetlifySiteProcessingSettingsImagesArg { + """""" + optimize: Boolean +} + +input NetlifyMinifyOptionsArg { + """""" + bundle: Boolean + + """""" + minify: Boolean +} + +input NetlifySiteProcessingSettingsHtmlArg { + """""" + prettyUrls: Boolean +} + +input NetlifySiteProcessingSettingsArg { + """""" + css: NetlifyMinifyOptionsArg + + """""" + images: NetlifySiteProcessingSettingsImagesArg + + """""" + js: NetlifyMinifyOptionsArg + + """""" + skip: Boolean + + """""" + html: NetlifySiteProcessingSettingsHtmlArg +} + +input NetlifySiteDefaultHooksDataArg { + """""" + accessToken: String +} + +input NetlifyRepoInfoArg { + """""" + id: Int + + """""" + provider: String + + """""" + deployKeyId: String + + """""" + repoPath: String + + """""" + repoBranch: String + + """""" + dir: String + + """""" + cmd: String + + """""" + allowedBranches: [String!] + + """""" + publicRepo: Boolean + + """""" + privateLogs: Boolean + + """""" + repoUrl: String + + """""" + installationId: Int +} + +input NetlifySiteArg { + """""" + id: String + + """""" + state: String + + """""" + plan: String + + """""" + name: String + + """""" + customDomain: String + + """""" + domainAliases: [String!] + + """""" + password: String + + """""" + notificationEmail: String + + """""" + url: String + + """""" + sslUrl: String + + """""" + adminUrl: String + + """""" + screenshotUrl: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + userId: String + + """""" + sessionId: String + + """""" + ssl: Boolean + + """""" + forceSsl: Boolean + + """""" + managedDns: Boolean + + """""" + deployUrl: String + + """""" + publishedDeploy: NetlifyDeployArg + + """""" + accountName: String + + """""" + accountSlug: String + + """""" + gitProvider: String + + """""" + deployHook: String + + """""" + processingSettings: NetlifySiteProcessingSettingsArg + + """""" + buildSettings: NetlifyRepoInfoArg + + """""" + idDomain: String + + """""" + defaultHooksData: NetlifySiteDefaultHooksDataArg + + """""" + buildImage: String + + """""" + repo: NetlifyRepoInfoArg +} + +input NetlifyCreateSiteInput { + configureDns: Boolean + site: NetlifySiteArg! +} + +"""Payload for the createSite mutation.""" +type NetlifyCreateSitePayload { + """Site that was created""" + site: NetlifySite! +} + +"""The root for netlify mutations""" +type NetlifyMutation { + """Create site""" + createSite(input: NetlifyCreateSiteInput!): NetlifyCreateSitePayload! + + """ + Make a REST API call to the Netlify API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: NetlifyPassthroughMutation! +} + +""" +Make a REST API call to the Mixpanel API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type MixpanelPassthroughMutation { + """ + Make a POST request to the Mixpanel API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + post( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PUT request to the Mixpanel API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + put( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PATCH request to the Mixpanel API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + patch( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a DELETE request to the Mixpanel API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + delete( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The root for Mixpanel mutations""" +type MixpanelMutation { + """ + Make a REST API call to the Mixpanel API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: MixpanelPassthroughMutation! +} + +""" +Make a REST API call to the Meetup API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type MeetupPassthroughMutation { + """ + Make a POST request to the Meetup API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + post( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PUT request to the Meetup API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + put( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PATCH request to the Meetup API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + patch( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a DELETE request to the Meetup API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + delete( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The root for Meetup mutations""" +type MeetupMutation { + """ + Make a REST API call to the Meetup API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: MeetupPassthroughMutation! +} + +""" +Make a REST API call to the Mailchimp API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type MailchimpPassthroughMutation { + """ + Make a POST request to the Mailchimp API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + post( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PUT request to the Mailchimp API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + put( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PATCH request to the Mailchimp API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + patch( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a DELETE request to the Mailchimp API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + delete( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The root for Mailchimp mutations""" +type MailchimpMutation { + """ + Make a REST API call to the Mailchimp API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: MailchimpPassthroughMutation! +} + +type IntercomCreateCompanyMutationPayload { + """company that was created or updated""" + company: IntercomCompany! +} + +input IntercomCreateCompanyMutationInput { + """ + A JSON-encoded object of key/value pairs containing any other data about the user you want Intercom to store.* + """ + customAttributes: JSON + + """The industry that this company operates in""" + industry: String + + """ + The URL for this company's website. Please note that the value specified here is not validated. Accepts any string. + """ + website: String + + """The number of employees in this company""" + size: Int + + """The name of the plan you have associated with the company""" + plan: String + + """ + How much revenue the company generates for your business. Note that this will truncate floats. i.e. it only allow for whole integers, 155.98 will be truncated to 155. Note that this has an upper limit of 2**31-1 or 2147483647. + """ + monthlySpend: Int + + """The name of the company""" + name: String + + """The company id you have defined for the company""" + companyId: String + + """The Unix timestamp (in seconds) when the company was created.""" + remoteCreatedAt: Int +} + +input IntercomCreateUserMutationInput { + """ + A boolean value, which if true, instructs Intercom to register the request as a session. + + + """ + newSession: Boolean + + """ + A boolean value, which if true, instructs Intercom to update the users' last_request_at value to the current API service time in UTC. default value if not sent is false. + + + """ + updateLastRequestAt: Boolean + + """ + A boolean value representing the users unsubscribed status. default value if not sent is false. + """ + unsubscribedFromEmails: Boolean + + """ + The Unix timestamp (in seconds) representing the date the user last visited your application. + """ + lastRequestAt: Int + + """The user agent the user last visited your application with.""" + companies: [IntercomCreateCompanyMutationInput!] + + """The user agent the user last visited your application with.""" + lastSeenUserAgent: String + + """ + A JSON-encoded object of key/value pairs containing any other data about the user you want Intercom to store.* + """ + customAttributes: JSON + + """ + An ip address (e.g. "1.2.3.4") representing the last ip address the user visited your application from. (Used for updating location_data). + """ + lastSeenIp: String + + """The user's full name""" + name: String + + """The Unix timestamp (in seconds) when the user signed up.""" + signedUpAt: Int + + """The canonical user id from Intercom. It may be used for user updates.""" + intercomId: String + + """The user's phone number.""" + phone: String + + """ + The user's email address. It is required on creation if a user_id is not supplied. + """ + email: String + + """ + A unique string identifier for the user. It is required on creation if an email is not supplied. + """ + userId: String +} + +type IntercomCreateUserMutationPayload { + """User that was created or updated""" + user: IntercomUser! +} + +"""The root for Intercom Mutations""" +type IntercomMutation { + createUser(input: IntercomCreateUserMutationInput!): IntercomCreateUserMutationPayload + createCompany(input: IntercomCreateCompanyMutationInput!): IntercomCreateCompanyMutationPayload +} + +""" +Make a REST API call to the Hubspot API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type HubspotPassthroughMutation { + """ + Make a POST request to the Hubspot API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + post( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PUT request to the Hubspot API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + put( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PATCH request to the Hubspot API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + patch( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a DELETE request to the Hubspot API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + delete( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The output of the updateContact mutation.""" +type HubspotUpsertContactPayload { + """Contact created or updated by the upsertContact mutation""" + contact: HubspotContact! + + """Indicates if a new record was created.""" + isNew: Boolean! +} + +"""Input to update a contact on Hubspot.""" +input HubspotUpdateContactByEmailInput { + """The existing Hubspot contact's email address.""" + email: String! + + """Properties for the Hubspot contact.""" + properties: HubspotContactPropertiesArg! +} + +"""Input to update a contact on Hubspot.""" +input HubspotUpdateContactInput { + """The existing Hubspot contact's vid""" + vid: Int! + + """Properties for the Hubspot contact.""" + properties: HubspotContactPropertiesArg! +} + +"""The output of the updateContact or updateContactByEmail mutation.""" +type HubspotUpdateContactPayload { + """Contact updated by the updateContact or updateContactByEmail mutations""" + contact: HubspotContact! +} + +"""Key, value pair for Hubspot properties""" +input HubspotContactPropertiesArg { + """Annual company revenue""" + annualrevenue: String + + """ + The date the first deal for a contact was created. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + firstDealCreatedDate: String + + """A set of additional email addresses for a contact""" + hsAdditionalEmails: String + + """A set of all vids, canonical or otherwise, for a contact""" + hsAllContactVids: String + + """The campaign responsible for the first touch creation of this contact""" + hsAnalyticsFirstTouchConvertingCampaign: String + + """The campaign responsible for the last touch creation of this contact""" + hsAnalyticsLastTouchConvertingCampaign: String + + """ + The path in the FileManager CDN for this contact's avatar override image. Automatically set by HubSpot. + """ + hsAvatarFilemanagerKey: String + + """Mobile number in international format""" + hsCalculatedMobileNumber: String + + """Phone number in international format""" + hsCalculatedPhoneNumber: String + + """Area Code of the calculated phone number""" + hsCalculatedPhoneNumberAreaCode: String + + """Country code of the calculated phone number""" + hsCalculatedPhoneNumberCountryCode: String + + """ISO2 Country code for the derived phone number""" + hsCalculatedPhoneNumberRegionCode: String + + """Flag indicating this contact was created by the Conversations API""" + hsCreatedByConversations: String + + """ + The last time a shared document (presentation) was accessed by this contact + """ + hsDocumentLastRevisited: String + + """A contact's email address domain""" + hsEmailDomain: String + + """ + Indicates that the current email address has been quarantined for anti-abuse reasons and any marketing email sends to it will be blocked. This is automatically set by HubSpot. + """ + hsEmailQuarantined: String + + """ + The number of marketing emails that have been sent to the current email address since the last engagement (open or link click). This is automatically set by HubSpot. + """ + hsEmailSendsSinceLastEngagement: String + + """ + The status of a contact's eligibility to receive marketing email. This is automatically set by HubSpot. + """ + hsEmailconfirmationstatus: String + + """A contact's facebook id""" + hsFacebookid: String + + """A contact's googleplus id""" + hsGoogleplusid: String + + """ + The timezone reported by a contact's IP address. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + hsIpTimezone: String + + """The contact's sales, prospecting or outreach status""" + hsLeadStatus: String + + """Legal basis for processing contact’s data""" + hsLegalBasis: String + + """A contact's linkedin id""" + hsLinkedinid: String + + """The last time a tracked sales email was clicked by this user""" + hsSalesEmailLastClicked: String + + """The last time a tracked sales email was opened by this user""" + hsSalesEmailLastOpened: String + + """The last time a tracked sales email was replied to by this user""" + hsSalesEmailLastReplied: String + + """Mobile number with country code""" + hsSearchableCalculatedInternationalMobileNumber: String + + """Phone number with country code""" + hsSearchableCalculatedInternationalPhoneNumber: String + + """Mobile number without country code""" + hsSearchableCalculatedMobileNumber: String + + """Phone number without country code""" + hsSearchableCalculatedPhoneNumber: String + + """ + A yes/no field that indicates whether the contact is currently in a Sequence. + """ + hsSequencesIsEnrolled: String + + """A contact's twitter id""" + hsTwitterid: String + + """ + The most recent date a HubSpot Owner was assigned to a contact. This is set automatically by HubSpot and can be used for segmentation and reporting. + """ + hubspotOwnerAssigneddate: String + + """ + The country code reported by a contact's IP address. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + ipCountryCode: String + + """ + The state code or region code reported by a contact's IP address. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + ipStateCode: String + + """ + The zipcode reported by a contact's IP address. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + ipZipcode: String + + """ + The number of deals associated with this contact. This is set automatically by HubSpot. + """ + numAssociatedDeals: String + + """ + The amount of the last closed won deal associated with a contact. This is set automatically by HubSpot based on information from the Deals object. + """ + recentDealAmount: String + + """ + The date that the last deal associated with a contact was won. This is automatically set by HubSpot based on information from the Deals object. + """ + recentDealCloseDate: String + + """""" + salesforceaccountid: String + + """""" + salesforcedeleted: String + + """ + The sum from all closed won deal revenue associated with a contact. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + totalRevenue: String + + """""" + blogApiDemonstrationBlogSubscription: String + + """A company's name""" + company: String + + """The first form this contact submitted""" + firstConversionEventName: String + + """ + The first page a contact saw on your website. This is automatically set by HubSpot for each contact. + """ + hsAnalyticsFirstUrl: String + + """ + The number of marketing emails delivered for the current email address. This is automatically set by HubSpot. + """ + hsEmailDelivered: String + + """Indicates that a contact has opted out of all email""" + hsEmailOptout: String + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout1281663: String + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout230318: String + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout2849: String + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout354586: String + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout4447431: String + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout4744389: String + + """A contact's twitter information""" + twitterhandle: String + + """If the contact is currently enrolled in any workflow""" + currentlyinworkflow: String + + """The number of Twitter followers a contact has""" + followercount: String + + """ + The last page a contact saw on your website. This is automatically set by HubSpot for each contact. + """ + hsAnalyticsLastUrl: String + + """ + The number of marketing emails opened for the current email address. This is automatically set by HubSpot. + """ + hsEmailOpen: String + + """The number of forms this contact has submitted""" + numConversionEvents: String + + """A company's website""" + website: String + + """The date this contact first submitted a form""" + firstConversionDate: String + + """A contact's first name""" + firstname: String + + """ + The sum of all pages a contact has seen on your website. This is automatically set by HubSpot for each contact. + """ + hsAnalyticsNumPageViews: String + + """ + The number of marketing emails which have had link clicks for the current email address. This is automatically set by HubSpot. + """ + hsEmailClick: String + + """The title used to address a contact""" + salutation: String + + """ + The contact's Twitter profile photo. This is set by HubSpot using the contact's email address. + """ + twitterprofilephoto: String + + """ + The sum of all visits a contact has made to your website. This is automatically set by HubSpot for each contact. + """ + hsAnalyticsNumVisits: String + + """ + The number of marketing emails that bounced for the current email address. This is automatically set by HubSpot. + """ + hsEmailBounce: String + + """A contact's persona""" + hsPersona: String + + """ + The date of the most recent click on a published social message. This is set automatically by HubSpot for each contact. + """ + hsSocialLastEngagement: String + + """The last form this contact submitted""" + recentConversionEventName: String + + """""" + hsAnalyticsFirstTimestamp: String + + """""" + hsAnalyticsFirstVisitTimestamp: String + + """ + The sum of all events a contact has experienced. This is automatically set by HubSpot for each contact. + """ + hsAnalyticsNumEventCompletions: String + + """ + The number of times a contact clicked on links you shared on Twitter through HubSpot. This is set automatically by HubSpot and can be used for segmentation. + """ + hsSocialTwitterClicks: String + + """A company's industry""" + industry: String + + """A contact's last name""" + lastname: String + + """A contact's mobile phone number""" + mobilephone: String + + """The date this contact last submitted a form""" + recentConversionDate: String + + """A contact's email address""" + email: String + + """""" + hsAnalyticsLastTimestamp: String + + """ + The name of the last marketing email sent to the current email address. This is automatically set by HubSpot. + """ + hsEmailLastEmailName: String + + """ + The date of the most recent delivery for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailLastSendDate: String + + """The number clicks on links shared on Facebook""" + hsSocialFacebookClicks: String + + """The number of different forms this contact has submitted""" + numUniqueConversionEvents: String + + """The date of the most recent meeting booked from the Meetings app.""" + engagementsLastMeetingBooked: String + + """ + The campaign of the last meeting booked through the Meetings App (ex: the specific email that was sent) + """ + engagementsLastMeetingBookedCampaign: String + + """ + The medium of the last meeting booked through the Meetings App (ex: email or website or in-app) + """ + engagementsLastMeetingBookedMedium: String + + """ + The source of the last meeting booked through the Meetings App (ex: pql-email, landing-page) + """ + engagementsLastMeetingBookedSource: String + + """ + The first known source through which a contact found your website. Source is automatically set by HubSpot. + """ + hsAnalyticsSource: String + + """ + The date of the most recent open for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailLastOpenDate: String + + """The number clicks on links shared on LinkedIn""" + hsSocialLinkedinClicks: String + + """ + The owner of a contact. This can be any HubSpot user or Salesforce integration user, and can be set manually or via Workflows. + """ + hubspotOwnerId: String + + """ + The latitude and longitude reported by a contact's IP address (formatted according to ISO 6709 Annex H) + """ + ipLatlon: String + + """ + The last time a call, email, or meeting was logged for a contact. This is set automatically by HubSpot based on user actions in the contact record. + """ + notesLastContacted: String + + """ + The last time a note, call, email, meeting, or task was logged for a contact. This is set automatically by HubSpot based on user actions in the contact record. + """ + notesLastUpdated: String + + """ + The date of the next upcoming activity for a contact. This is set automatically by HubSpot based on user actions in the contact record. + """ + notesNextActivityDate: String + + """ + The number of times a call, email, or meeting was logged for a contact. This is set automatically by HubSpot based on user actions in the contact record. + """ + numContactedNotes: String + + """ + The number of sales activities for a contact. This is set automatically by HubSpot based on user actions in the contact record. + """ + numNotes: String + + """ + A legacy property used to identify the email address of the owner of the contact. This property is no longer in use. + """ + owneremail: String + + """ + A legacy property used to identify the name of the owner of the contact. This property is no longer in use. + """ + ownername: String + + """ + This field is meaningless on its own, and is solely used for triggering dynamic list updates when SurveyMonkey information is updated + """ + surveymonkeyeventlastupdated: String + + """ + This field is meaningless on its own, and is solely used for triggering dynamic list updates when webinar information is updated + """ + webinareventlastupdated: String + + """""" + hsAnalyticsSourceData1: String + + """ + The date of the most recent link click for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailLastClickDate: String + + """The number clicks on links shared on Google Plus""" + hsSocialGooglePlusClicks: String + + """The team of the owner of a contact.""" + hubspotTeamId: String + + """The country reported by a contact's IP address""" + ipCountry: String + + """A contact's LinkedIn bio""" + linkedinbio: String + + """ + The contact's Twitter bio. This is set by HubSpot using the contact's email address. + """ + twitterbio: String + + """ + The value of all owner referencing properties for this object, both default and custom + """ + hsAllOwnerIds: String + + """The last time and date a contact visited your website.""" + hsAnalyticsLastVisitTimestamp: String + + """""" + hsAnalyticsSourceData2: String + + """ + The date of the earliest delivery for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailFirstSendDate: String + + """ + The number of clicks on published social messages. This is set automatically by HubSpot for each contact. + """ + hsSocialNumBroadcastClicks: String + + """The state or region reported by a contact's IP address""" + ipState: String + + """ + The team ids corresponding to all owner referencing properties for this object, both default and custom + """ + hsAllTeamIds: String + + """""" + hsAnalyticsFirstReferrer: String + + """ + The date of the earliest open for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailFirstOpenDate: String + + """The city reported by a contact's IP address""" + ipCity: String + + """""" + hsAnalyticsLastReferrer: String + + """ + The date of the earliest link click for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailFirstClickDate: String + + """How many LinkedIn connections they have""" + linkedinconnections: String + + """A contact's primary phone number""" + phone: String + + """A contact's primary fax number""" + fax: String + + """Indicates the contact is globally ineligible for email.""" + hsEmailIsIneligible: String + + """A contact's Klout score, a measure of Internet influence""" + kloutscoregeneral: String + + """A contact's street address, including apartment or unit #""" + address: String + + """""" + hsAnalyticsAveragePageViews: String + + """""" + hsEmailLastupdated: String + + """Social Media photo""" + photo: String + + """A contact's city of residence""" + city: String + + """""" + hsAnalyticsRevenue: String + + """""" + sfcampaignid: String + + """A contact's state of residence""" + state: String + + """ + The date when a contact's lifecycle stage changed to Lead. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageLeadDate: String + + """ + The date when a contact's lifecycle stage changed to MQL. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageMarketingqualifiedleadDate: String + + """ + The date when a contact's lifecycle stage changed to Opportunity. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageOpportunityDate: String + + """A contact's zip code""" + zip: String + + """A contact's country of residence""" + country: String + + """ + The date when a contact's lifecycle stage changed to SQL. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageSalesqualifiedleadDate: String + + """ + The date when a contact's lifecycle stage changed to Evangelist. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageEvangelistDate: String + + """A contact's job title""" + jobtitle: String + + """ + The date when a contact's lifecycle stage changed to Customer. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageCustomerDate: String + + """A field for any additional user input or comments""" + message: String + + """The date that a contact became a customer""" + closedate: String + + """ + The date when a contact's lifecycle stage changed to Subscriber. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageSubscriberDate: String + + """ + The date when a contact's lifecycle stage changed to Other. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageOtherDate: String + + """""" + lifecyclestage: String + + """The number of company employees""" + numemployees: String + + """The date that a contact entered the system""" + createdate: String + + """""" + hubspotscore: String + + """A company's ID""" + associatedcompanyid: String + + """The date any property on this contact was modified""" + lastmodifieddate: String + + """ + This field is meaningless on its own, and is solely used for triggering dynamic list updates when a company is updated + """ + associatedcompanylastupdated: String + + """A contact's IP Address""" + ipaddress: String + + """Days from create date to close date""" + daysToClose: String + + """The rating of this contact based on their predictive lead score""" + hsPredictivecontactscorebucket: String + + """ + A score calculated by HubSpot that represents a contact's likelihood to become a customer + """ + hsPredictivecontactscore: String +} + +"""Input to create a contact on Hubspot.""" +input HubspotCreateContactInput { + """Properties for the Hubspot contact.""" + properties: HubspotContactPropertiesArg! +} + +"""The output of the createContact mutation.""" +type HubspotCreateContactPayload { + """Contact created by the createContact mutation""" + contact: HubspotContact! +} + +"""The root for Hubspot mutations.""" +type HubspotMutation { + """ + Create a new contact in HubSpot. The contact will be created instantly inside of HubSpot, and will be assigned a unique ID (vid) + """ + createContact( + """Input to create contact.""" + input: HubspotCreateContactInput! + ): HubspotCreateContactPayload! + + """Update a contact in HubSpot.""" + updateContact( + """Input to update a contact.""" + input: HubspotUpdateContactInput! + ): HubspotUpdateContactPayload! + + """Update a contact in HubSpot by email address.""" + updateContactByEmail( + """Input to update a contact by email.""" + input: HubspotUpdateContactByEmailInput! + ): HubspotUpdateContactPayload! + + """ + Create a contact if it doesn't exist in an account already, or update it with the latest property values if it does. + """ + upsertContact( + """Input to update a contact by email.""" + input: HubspotUpdateContactByEmailInput! + ): HubspotUpsertContactPayload! + + """ + Make a REST API call to the Hubspot API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: HubspotPassthroughMutation! +} + +input GmailUpdateDraftData { + """Deprected: use bodyPlain instead. Use bodyHtml to send HTML emails.""" + body: String + + """ + Html email body. Can be provided in addition to bodyPlain. This will render in email clients that support html. + """ + bodyHtml: String + + """ + Plaintext email body. Can be provided in addition to bodyHtml. This will render in email clients that don't support html. + """ + bodyPlain: String + + """ + Subject of the email. If replyToMessageId is provided, this will be default to the subject of the message you are replying to. + """ + subject: String + + """ + Optional id of the message you are replying to. If this is set, the email will automatically be threaded. + """ + replyToMessageId: String + + """Optional id for your message.""" + messageId: String + + """ + List of email addresses that should be bcc'd. Each email address can be in format of `daniel@example.com` or `Daniel ` + """ + bcc: [String!] + + """ + List of email addresses that should be cc'd. Each email address can be in format of `daniel@example.com` or `Daniel ` + """ + cc: [String!] + + """ + List of email addresses the message is to. Each email address can be in format of `daniel@example.com` or `Daniel ` + """ + to: [String!] + + """ + Email address the message is from. Can be in format of `daniel@example.com` or `Daniel ` + """ + from: String + + """ + The id of the draft to update. Note that this is not the message id. This is the id you get from draft.id in the saveDraft mutation or from node.id if you list the drafts. + """ + draftId: String! +} + +type GmailUpdateDraftResponsePayload { + draft: GmailDraft! +} + +type GmailSaveDraftResponsePayload { + draft: GmailDraft! +} + +input GmailSendMessageData { + """Deprected: use bodyPlain instead. Use bodyHtml to send HTML emails.""" + body: String + + """ + Html email body. Can be provided in addition to bodyPlain. This will render in email clients that support html. + """ + bodyHtml: String + + """ + Plaintext email body. Can be provided in addition to bodyHtml. This will render in email clients that don't support html. + """ + bodyPlain: String + + """ + Subject of the email. If replyToMessageId is provided, this will be default to the subject of the message you are replying to. + """ + subject: String + + """ + Optional id of the message you are replying to. If this is set, the email will automatically be threaded. + """ + replyToMessageId: String + + """Optional id for your message.""" + messageId: String + + """ + List of email addresses that should be bcc'd. Each email address can be in format of `daniel@example.com` or `Daniel ` + """ + bcc: [String!] + + """ + List of email addresses that should be cc'd. Each email address can be in format of `daniel@example.com` or `Daniel ` + """ + cc: [String!] + + """ + List of email addresses the message is to. Each email address can be in format of `daniel@example.com` or `Daniel ` + """ + to: [String!] + + """ + Email address the message is from. Can be in format of `daniel@example.com` or `Daniel ` + """ + from: String +} + +type GmailSendMessageResponsePayload { + message: GmailMessage! +} + +""" +The visibility of messages with this label in the message list in the Gmail web interface. +""" +enum GmailMessageListVisibility { + """Do not show the label in the message list.""" + HIDE + + """Show the label in the message list. (Default)""" + SHOW +} + +""" +The visibility of the label in the label list in the Gmail web interface. +""" +enum GmailLabelListVisibility { + """Do not show the label in the label list.""" + LABEL_HIDE + + """Show the label in the label list. (Default)""" + LABEL_SHOW + + """Show the label in the label list. (Default)""" + LABEL_SHOW_IF_UNREAD +} + +input GmailModifyLabelDataLabelArg { + """ + The color to assign to the label. Color is only available for labels that have their type set to user. + """ + color: GmailModifyLabelDataLabelArg + + """The display name of the label""" + name: String! + + """ + The visibility of messages with this label in the message list in the Gmail web interface. + """ + messageListVisibility: GmailMessageListVisibility + + """ + The visibility of the label in the label list in the Gmail web interface. + """ + labelListVisibility: GmailLabelListVisibility +} + +input GmailCreateLabelData { + label: GmailModifyLabelDataLabelArg! +} + +type GmailCreateLabelResponsePayload { + label: GmailLabel! +} + +input GmailRemoveLabelsData { + labelIds: [String!]! + messageId: String! +} + +type GmailRemoveLabelsResponsePayload { + message: GmailMessage! +} + +input GmailAddLabelsData { + labelIds: [String!]! + messageId: String! +} + +type GmailAddLabelsResponsePayload { + message: GmailMessage! +} + +"""Namespace for all mutations for Gmail""" +type GmailMutationNamespace { + addLabelsToMessage(data: GmailAddLabelsData!): GmailAddLabelsResponsePayload! + removeLabelsFromMessage(data: GmailRemoveLabelsData!): GmailRemoveLabelsResponsePayload! + createLabel(data: GmailCreateLabelData!): GmailCreateLabelResponsePayload! + + """ + Send an email through Gmail. Note that you'll need to provide your own authentication in the `auths` argument, as the default OneGraph OAuth token will not have sufficient permissions to _send_ email, even if you've authenticated. + """ + sendMessage(data: GmailSendMessageData!): GmailSendMessageResponsePayload! + + """ + Save a draft through Gmail. Note that you'll need to provide your own authentication in the `auths` argument, as the default OneGraph OAuth token will not have sufficient permissions to _send_ email, even if you've authenticated. + """ + saveDraft(data: GmailSendMessageData!): GmailSaveDraftResponsePayload! + + """ + Update a draft through Gmail. Note that the draftId is different than the message id. Note that you'll need to provide your own authentication in the `auths` argument, as the default OneGraph OAuth token will not have sufficient permissions to _send_ email, even if you've authenticated. + """ + updateDraft(data: GmailUpdateDraftData!): GmailUpdateDraftResponsePayload! +} + +"""Data within a range of the spreadsheet.""" +type GoogleSheetsValueRange { + """ + The major dimension of the values. + + For output, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`, + then requesting `range=A1:B2,majorDimension=ROWS` will return + `[[1,2],[3,4]]`, + whereas requesting `range=A1:B2,majorDimension=COLUMNS` will return + `[[1,3],[2,4]]`. + + For input, with `range=A1:B2,majorDimension=ROWS` then `[[1,2],[3,4]]` + will set `A1=1,B1=2,A2=3,B2=4`. With `range=A1:B2,majorDimension=COLUMNS` + then `[[1,2],[3,4]]` will set `A1=1,B1=3,A2=2,B2=4`. + + When writing, if this field is not set, it defaults to ROWS. + """ + majorDimension: String + + """ + The data that was read or to be written. This is an array of arrays, + the outer array representing all the data and each inner array + representing a major dimension. Each item in the inner array + corresponds with one cell. + + For output, empty trailing rows and columns will not be included. + + For input, supported value types are: bool, string, and double. + Null values will be skipped. + To set a cell to an empty value, set the string value to an empty string. + """ + values: [[String!]!] + + """ + The range the values cover, in A1 notation. + For output, this range indicates the entire requested range, + even though the values will exclude trailing rows and columns. + When appending values, this field represents the range to search for a + table, after which values will be appended. + """ + range: String +} + +"""The response when updating a range of values in a spreadsheet.""" +type GoogleSheetsUpdateValuesResponse { + """The range (in A1 notation) that updates were applied to.""" + updatedRange: String + + """The number of cells updated.""" + updatedCells: Int + + """ + The values of the cells after updates were applied. + This is only included if the request's `includeValuesInResponse` field + was `true`. + """ + updatedData: GoogleSheetsValueRange + + """The number of rows where at least one cell in the row was updated.""" + updatedRows: Int + + """ + The number of columns where at least one cell in the column was updated. + """ + updatedColumns: Int + + """The spreadsheet the updates were applied to.""" + spreadsheetId: String +} + +"""The response when updating a range of values in a spreadsheet.""" +type GoogleSheetsAppendValuesResponse { + """Information about the updates that were applied.""" + updates: GoogleSheetsUpdateValuesResponse + + """ + The range (in A1 notation) of the table that values are being appended to + (before the values were appended). + Empty if no table was found. + """ + tableRange: String + + """The spreadsheet the updates were applied to.""" + spreadsheetId: String +} + +"""Google Sheets mutations""" +type GoogleSheetsMutation { + appendValues(insertDataOption: String, DateTimeRenderOption: String, valueInputOption: String!, values: [[String!]!]!, majorDimenson: String!, range: String!, id: String!): GoogleSheetsAppendValuesResponse! +} + +input GoogleComputeMetadataItemsArg { + value: String! + key: String! +} + +input GoogleComputeMetadataArg { + items: [GoogleComputeMetadataItemsArg!]! +} + +input GoogleComputeDiskInitializeParamsArg { + diskName: String + diskSizeGb: String! + diskType: String! + sourceImage: String! +} + +input GoogleComputeDiskArg { + initializeParams: GoogleComputeDiskInitializeParamsArg! + source: String + deviceName: String! + autoDelete: Boolean! + mode: String! + boot: Boolean! + type: String! +} + +input GoogleComputeNetworkInterfaceAccessConfigArg { + type: String! + natIP: String + name: String! +} + +input GoogleComputeNetworkInterfaceArg { + accessConfigs: [GoogleComputeNetworkInterfaceAccessConfigArg!]! + subnetwork: String! + network: String! + name: String! +} + +"""""" +type GoogleComputeOperationWarningsItemDataItem { + """ + [Output Only] A key that provides more detail on the warning being returned. For example, for warnings where there are no results in a list request for a particular zone, this key might be scope and the key value might be the zone name. Other examples might be a key indicating a deprecated resource and a suggested replacement, or a warning about invalid network settings (for example, if an instance attempts to perform IP forwarding but is not enabled for IP forwarding). + """ + key: String + + """[Output Only] A warning data value corresponding to the key.""" + value: String +} + +"""""" +type GoogleComputeOperationWarningsItem { + """ + [Output Only] A warning code, if applicable. For example, Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in the response. + """ + code: String + + """ + [Output Only] Metadata about this warning in key: value format. For example: + "data": [ { "key": "scope", "value": "zones/us-east1-d" } + """ + data: [GoogleComputeOperationWarningsItemDataItem!] + + """[Output Only] A human-readable description of the warning code.""" + message: String +} + +"""""" +type GoogleComputeOperationErrorErrorsItem { + """[Output Only] The error type identifier for this error.""" + code: String + + """ + [Output Only] Indicates the field in the request that caused the error. This property is optional. + """ + location: String + + """[Output Only] An optional, human-readable error message.""" + message: String +} + +""" +[Output Only] If errors are generated during processing of the operation, this field will be populated. +""" +type GoogleComputeOperationError { + """ + [Output Only] The array of errors encountered while processing this operation. + """ + errors: [GoogleComputeOperationErrorErrorsItem!] +} + +""" +An Operation resource, used to manage asynchronous API requests. (== resource_for v1.globalOperations ==) (== resource_for beta.globalOperations ==) (== resource_for v1.regionOperations ==) (== resource_for beta.regionOperations ==) (== resource_for v1.zoneOperations ==) (== resource_for beta.zoneOperations ==) +""" +type GoogleComputeOperation { + """ + [Output Only] If the operation fails, this field contains the HTTP error status code that was returned. For example, a 404 means the resource was not found. + """ + httpErrorStatusCode: Int + + """ + [Output Only] The time that this operation was requested. This value is in RFC3339 text format. + """ + insertTime: String + + """ + [Output Only] An optional progress indicator that ranges from 0 to 100. There is no requirement that this be linear or support any granularity of operations. This should not be used to guess when the operation will be complete. This number should monotonically increase as the operation progresses. + """ + progress: Int + + """ + [Output Only] The unique target ID, which identifies a specific incarnation of the target resource. + """ + targetId: String + + """ + [Output Only] If the operation fails, this field contains the HTTP error message that was returned, such as NOT FOUND. + """ + httpErrorMessage: String + + """ + [Output Only] User who requested the operation, for example: user@example.com. + """ + user: String + + """ + [Output Only] If errors are generated during processing of the operation, this field will be populated. + """ + error: GoogleComputeOperationError + + """ + [Output Only] The unique identifier for the resource. This identifier is defined by the server. + """ + id: String + + """ + [Output Only] The type of operation, such as insert, update, or delete, and so on. + """ + operationType: String + + """[Output Only] Name of the resource.""" + name: String + + """ + [Output Only] The time that this operation was started by the server. This value is in RFC3339 text format. + """ + startTime: String + + """ + [Output Only] The status of the operation, which can be one of the following: PENDING, RUNNING, or DONE. + """ + status: String + + """ + [Output Only] The URL of the region where the operation resides. Only available when performing regional operations. You must specify this field as part of the HTTP request URL. It is not settable as a field in the request body. + """ + region: String + + """ + [Output Only] An optional textual description of the current status of the operation. + """ + statusMessage: String + + """[Output Only] Server-defined URL for the resource.""" + selfLink: String + + """ + [Output Only] Type of the resource. Always compute#operation for Operation resources. + """ + kind: String + + """[Deprecated] This field is deprecated.""" + creationTimestamp: String + + """ + [Output Only] The URL of the zone where the operation resides. Only available when performing per-zone operations. You must specify this field as part of the HTTP request URL. It is not settable as a field in the request body. + """ + zone: String + + """ + [Output Only] The time that this operation was completed. This value is in RFC3339 text format. + """ + endTime: String + + """ + [Output Only] If warning messages are generated during processing of the operation, this field will be populated. + """ + warnings: [GoogleComputeOperationWarningsItem!] + + """ + [Output Only] A textual description of the operation, which is set when the operation is created. + """ + description: String + + """ + [Output Only] The value of `requestId` if you provided it in the request. Not present otherwise. + """ + clientOperationId: String + + """ + [Output Only] The URL of the resource that the operation modifies. For operations related to creating a snapshot, this points to the persistent disk that the snapshot was created from. + """ + targetLink: String +} + +"""Google Compute Engine mutations""" +type GoogleComputeMutation { + """Creates a new instance""" + insertInstance(metadata: GoogleComputeMetadataArg, disks: [GoogleComputeDiskArg!]!, networkInterface: [GoogleComputeNetworkInterfaceArg!]!, instanceName: String!, machineType: String!, zone: String!, projectId: String!): GoogleComputeOperation! + + """Deletes an existing instance""" + deleteInstance(name: String!, zone: String!, projectId: String!): GoogleComputeOperation! +} + +"""Google Cloud Storage mutations""" +type GoogleCloudStorageMutation { + """ + Uploads files, over-writing existing files in a given bucket. NB: This is not atomic, it's possible for some files to upload successfully and others not to in the same mutation + """ + upsertFiles(filename: String!, bucket: String!): Boolean! +} + +"""""" +type GoogleMutations { + cloudStorage: GoogleCloudStorageMutation! + compute: GoogleComputeMutation! + sheets: GoogleSheetsMutation! + gmail: GmailMutationNamespace! +} + +""" +Make a REST API call to the Dev.to API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type DevToPassthroughMutation { + """ + Make a POST request to the Dev.to API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + post( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PUT request to the Dev.to API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + put( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a PATCH request to the Dev.to API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + patch( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! + + """ + Make a DELETE request to the Dev.to API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + delete( + """The body to send. Only provide one of body or jsonBody.""" + body: String + + """ + The JSON-encoded body to send. This will automatically set the Content-Type header to `application/json`. Only provide one of body or jsonBody. + """ + jsonBody: JSON + + """The Accept header to set in the API.""" + accept: String + + """The Content-Type header to set in the API.""" + contentType: String + + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +input DevToDestroyWebhookInput { + id: Int! +} + +"""Payload for the destroyWebhook mutation.""" +type DevToDestroyWebhookPayload { + """Webhook that was destroyd""" + webhook: DevToWebhook! +} + +input DevToWebhookCreateWebhookEndpointArg { + """ + The name of the requester, eg. "DEV" + """ + source: String + + """The URL where the webhook will be delivered. Must be a `https` url.""" + targetUrl: String + + """ + An array of events identifiers, e.g. `"article_created"`, `"article_updated"` + """ + events: [String] +} + +input DevToWebhookCreateWebhookArg { + """""" + webhookEndpoint: DevToWebhookCreateWebhookEndpointArg +} + +"""Payload for the createWebhook mutation.""" +type DevToCreateWebhookPayload { + """Webhook that was created""" + webhook: DevToWebhook! +} + +input DevToSetArticlePublishedInput { + published: Boolean! + id: Int! +} + +"""Payload for the setArticlePublished mutation.""" +type DevToSetArticlePublishedPayload { + """Article that was either published or unpublished""" + article: DevToArticle! +} + +input DevToArticleUpdateArticleArg { + """""" + title: String + + """ + The body of the article. + + It can contain an optional front matter. For example + + ```markdown + --- + title: Hello, World! + published: true + tags: discuss, help + date: 20190701T10:00Z + series: Hello series + canonical_url: https://example.com/blog/hello + cover_image: article_published_cover_image + --- + ``` + + `date`, `series` and `canonical_url` are optional. + `date` is the publication date-time + `series` is the name of the series the article belongs to + `canonical_url` is the canonical URL of the article + `cover_image` is the main image of the article + + *If the markdown contains a front matter, it will take precedence + on the equivalent params given in the JSON payload.* + + """ + bodyMarkdown: String + + """ + True to create a published article, false otherwise. Defaults to false + + """ + published: Boolean + + """ + Article series name. + + All articles belonging to the same series need to have the same name + in this parameter. + + To remove an article from a series, the `null` value can be used. + + """ + series: String + + """""" + mainImage: String + + """""" + canonicalUrl: String + + """""" + description: String + + """A list of tags to apply to the article""" + tags: [String!] + + """ + Only users belonging to an organization can assign the article to it + + """ + organizationId: Int +} + +input DevToUpdateArticleInput { + article: DevToArticleUpdateArticleArg! + id: Int! +} + +"""Payload for the updateArticle mutation.""" +type DevToUpdateArticlePayload { + """Article that was updated""" + article: DevToArticle! +} + +input DevToArticleCreateArticleArg { + """""" + title: String! + + """ + The body of the article. + + It can contain an optional front matter. For example + + ```markdown + --- + title: Hello, World! + published: true + tags: discuss, help + date: 20190701T10:00Z + series: Hello series + canonical_url: https://example.com/blog/hello + cover_image: article_published_cover_image + --- + ``` + + `date`, `series` and `canonical_url` are optional. + `date` is the publication date-time + `series` is the name of the series the article belongs to + `canonical_url` is the canonical URL of the article + `cover_image` is the main image of the article + + *If the markdown contains a front matter, it will take precedence + on the equivalent params given in the JSON payload.* + + """ + bodyMarkdown: String + + """ + True to create a published article, false otherwise. Defaults to false + + """ + published: Boolean + + """ + Article series name. + + All articles belonging to the same series need to have the same name + in this parameter. + + """ + series: String + + """""" + mainImage: String + + """""" + canonicalUrl: String + + """""" + description: String + + """A list of tags to apply to the article""" + tags: [String!] + + """ + Only users belonging to an organization can assign the article to it + + """ + organizationId: Int +} + +input DevToCreateArticleInput { + article: DevToArticleCreateArticleArg! +} + +"""Payload for the createArticle mutation.""" +type DevToCreateArticlePayload { + """Article that was created""" + article: DevToArticle! +} + +"""The root for DevTo mutations""" +type DevToMutation { + """Create Article""" + createArticle(input: DevToCreateArticleInput!): DevToCreateArticlePayload! + + """Update Article""" + updateArticle(input: DevToUpdateArticleInput!): DevToUpdateArticlePayload! + + """Publish or unpublished an article by its id""" + setArticlePublished(input: DevToSetArticlePublishedInput!): DevToSetArticlePublishedPayload! + + """Create a webhook""" + createWebhook(input: DevToWebhookCreateWebhookArg!): DevToCreateWebhookPayload! + + """Destroy a webhook""" + destroyWebhook(input: DevToDestroyWebhookInput!): DevToDestroyWebhookPayload! + + """ + Make a REST API call to the Dev.to API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: DevToPassthroughMutation! +} + +input CloudflareRemoveAccountMemberInput { + membershipId: String! + accountId: String! +} + +type CloudflareRemoveAccountMemberResponsePayload { + account: CloudflareAccount! +} + +input CloudflareAddAccountMemberInput { + """List of role ids associated with this member""" + roleIds: [String!]! + email: String! + accountId: String! +} + +type CloudflareAddAccountMemberResponsePayload { + """Account membership that was created by this mutation""" + membership: CloudflareAccountMembership! + account: CloudflareAccount! +} + +"""Namespace for all mutations for Cloudflare""" +type CloudflareMutationNamespace { + addAccountMember(data: CloudflareAddAccountMemberInput!): CloudflareAddAccountMemberResponsePayload! + removeAccountMember(data: CloudflareRemoveAccountMemberInput!): CloudflareRemoveAccountMemberResponsePayload! +} + +type AirtableDeleteRecordPayload { + """Id of the record deleted.""" + recordId: String! +} + +input AirtableRecordFieldArg { + """ + Use boolenValue to set the value of the field if the field is a boolean (e.g. checkbox). Only provide one of stringValue, numberValue, or booleanValue. + """ + booleanValue: Boolean + + """ + Use numberValue to set the value of the field if the field is a number. Only provide one of stringValue, numberValue, or booleanValue. + """ + numberValue: Float + + """ + Use stringValue to set the value of the field if the field is a string. Only provide one of stringValue, numberValue, or booleanValue. + """ + stringValue: String + + """Name of the field.""" + fieldName: String! +} + +type AirtableRecordModificationPayload { + """Record that was created, updated, or replaced.""" + record: AirtableRecord! +} + +"""The root for Airtable mutations""" +type AirtableMutation { + """Creates a new record on the given table in the given base.""" + createRecord( + fields: [AirtableRecordFieldArg!]! + + """Table to create the record in""" + tableName: String! + + """ + Base to create the record in. You can find the baseId from by selecting one of your bases at https://airtable.com/api. The baseId is the part of the path in the URL that starts with `app`. + """ + baseId: String! + ): AirtableRecordModificationPayload! + + """ + Updates a record on the given table in the given base. Any fields that are not included will not be updated. + """ + updateRecord( + fields: [AirtableRecordFieldArg!]! + + """Id of the record to update.""" + recordId: String! + + """Table that the record lives in.""" + tableName: String! + + """ + Base to update record in. You can find the baseId from by selecting one of your bases at https://airtable.com/api. The baseId is the part of the path in the URL that starts with `app`. + """ + baseId: String! + ): AirtableRecordModificationPayload! + + """ + Replaces a record on the given table in the given base. Any fields that are not included will be removed. + """ + replaceRecord( + fields: [AirtableRecordFieldArg!]! + + """Id of the record to replace.""" + recordId: String! + + """Table that the record lives in.""" + tableName: String! + + """ + Base to replace record in. You can find the baseId from by selecting one of your bases at https://airtable.com/api. The baseId is the part of the path in the URL that starts with `app`. + """ + baseId: String! + ): AirtableRecordModificationPayload! + + """Deletes a record on the given table in the given base.""" + deleteRecord( + """Id of the record to delete.""" + recordId: String! + + """Table that the record lives in.""" + tableName: String! + + """ + Base to delete the record in. You can find the baseId from by selecting one of your bases at https://airtable.com/api. The baseId is the part of the path in the URL that starts with `app`. + """ + baseId: String! + ): AirtableDeleteRecordPayload! +} + +type Mutation { + """The root for Airtable mutations""" + airtable( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): AirtableMutation! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Cloudflare mutations""" + cloudflare( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): CloudflareMutationNamespace! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Dev.to mutations""" + devTo( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): DevToMutation! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Google mutations""" + google( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): GoogleMutations! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Hubspot mutations""" + hubspot( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): HubspotMutation! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Intercom mutations""" + intercom( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): IntercomMutation! + + """The root for Mailchimp mutations""" + mailchimp( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): MailchimpMutation! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Meetup mutations""" + meetup( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): MeetupMutation! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Mixpanel mutations""" + mixpanel( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): MixpanelMutation! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Netlify mutations""" + netlify( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): NetlifyMutation! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Salesforce mutations""" + salesforce( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): SalesforceMutation! + + """The root for Slack mutations""" + slack( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): SlackMutationNamespace! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Spotify mutations""" + spotify( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): SpotifyMutationNamespace! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Stripe mutations""" + stripe( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): StripeMutationNamespace! + + """The root for Trello mutations""" + trello( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): TrelloMutation! + + """The root for Twilio mutations""" + twilio( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): TwilioMutationNamespace! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Twitch mutations""" + twitchTv( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): TwitchTvMutation! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Twitter mutations""" + twitter( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): TwitterMutationNamespace! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for YouTube mutations""" + youTube( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): YouTubeMutationNamespace! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Zeit mutations""" + zeit( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): ZeitMutationNamespace! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + oneGraph: OneGraphMutation! + brex( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): BrexRootMutationType + eventil( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): EventilMutation + gitHub( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): GitHubMutation + productHunt( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): ProductHuntMutation + testMutate(query: String!): Boolean! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + signoutServiceUser(input: OneGraphSignoutServiceUserInput!): SignoutServicesResponsePayload! + signoutServices(data: SignoutServicesData!): SignoutServicesResponsePayload! +} + +"""Look up users across multiple services by their email address.""" +type OneGraphEmailNode { + """Hubspot contact.""" + hubspotContact: HubspotContact + + """Intercom user.""" + intercomUser: IntercomUser + + """Stripe customer.""" + stripeCustomer: StripeCustomer + + """Zendesk user.""" + zendeskUser: ZendeskUser + + """Salesforce Contct.""" + salesforceContact: SalesforceContact + + """Salesforce Contct.""" + salesforceLead: SalesforceLead +} + +"""An RSS2 Source""" +type Rss2Source { + """""" + data: String! + + """""" + url: String! +} + +""" +An RSS2 Enclosure. It has three required attributes. url says where the enclosure is located, length says how big it is in bytes, and type says what its type is, a standard MIME type. + +The url must be an http url. + +`` + +A use-case narrative for this element is [here](http://www.thetwowayweb.com/payloadsforrss) +""" +type Rss2Enclosure { + """Says where the enclosure is located""" + url: String! + + """Says how big the enclosure is in bytes""" + length: Int! + + """Says what the enclosure's type is, a standard MIME type""" + mime: String! +} + +"""An RSS2 Category""" +type Rss2Category { + """""" + data: String! + + """""" + domain: String +} + +"""An RSS2 GUID""" +type Rss2Guid { + """""" + data: String! + + """""" + permalink: Boolean! +} + +""" +An RSS2 feed item. A channel may contain any number of s. An item may represent a "story" -- much like a story in a newspaper or magazine; if so its description is a synopsis of the story, and the link points to the full story. An item may also be complete in itself, if so, the description contains the text (entity-encoded HTML is allowed), and the link and title may be omitted. All elements of an item are optional, however at least one of title or description must be present. +""" +type Rss2FeedItem { + """The title of the item""" + title: String! + + """The description of the item""" + description: String + + """ + "Email address of the author of the item. [More](https://validator.w3.org/feed/docs/rss2.html#ltauthorgtSubelementOfLtitemgt) + + It's the email address of the author of the item. For newspapers and magazines syndicating via RSS, the author is the person who wrote the article that the describes. For collaborative weblogs, the author of the item might be different from the managing editor or webmaster. For a weblog authored by a single individual it would make sense to omit the element. + + `lawyer@boyer.net (Lawyer Boyer)` + """ + author: String + + """The URL of the item""" + link: String + + """ + URL of a page for comments relating to the item. [More](https://validator.w3.org/feed/docs/rss2.html#ltcommentsgtSubelementOfLtitemgt) + If present, it is the url of the comments page for the item. + + `http://rateyourmusic.com/yaccs/commentsn/blogId=705245&itemId=271` + """ + comments: String + + """""" + content: String! + + """""" + contentUri: String + + """ + Indicates when the item was published. [More](https://validator.w3.org/feed/docs/rss2.html#ltpubdategtSubelementOfLtitemgt) + + Its value is a date, indicating when the item was published. If it's a date in the future, aggregators may choose to not display the item until that date. + + `Sun, 19 May 2002 15:21:36 GMT` + """ + pubDate: Float + + """ + A string that uniquely identifies the item. [More](https://validator.w3.org/feed/docs/rss2.html#ltguidgtSubelementOfLtitemgt) + + `guid` stands for globally unique identifier. It's a string that uniquely identifies the item. When present, an aggregator may choose to use this string to determine if an item is new. + + `http://some.server.com/weblogItem3207` + + There are no rules for the syntax of a guid. Aggregators must view them as a string. It's up to the source of the feed to establish the uniqueness of the string. + """ + guid: Rss2Guid + + """ + Includes the item in one or more categories. [More](https://validator.w3.org/feed/docs/rss2.html#ltcategorygtSubelementOfLtitemgt) + + It has one optional attribute, domain, a string that identifies a categorization taxonomy. + + The value of the element is a forward-slash-separated string that identifies a hierarchic location in the indicated taxonomy. Processors may establish conventions for the interpretation of categories. Two examples are provided below: + + `Grateful Dead` + + `MSFT` + + You may include as many category elements as you need to, for different domains, and to have an item cross-referenced in different parts of the same domain. + """ + category: Rss2Category + + """ + Describes a media object that is attached to the item. [More](https://validator.w3.org/feed/docs/rss2.html#ltenclosuregtSubelementOfLtitemgt) + It has three required attributes. url says where the enclosure is located, length says how big it is in bytes, and type says what its type is, a standard MIME type. + + The url must be an http url. + + `` + + A use-case narrative for this element is [here](http://www.thetwowayweb.com/payloadsforrss) + """ + enclosure: Rss2Enclosure + + """ + The RSS channel that the item came from. [More](https://validator.w3.org/feed/docs/rss2.html#ltsourcegtSubelementOfLtitemgt). + + Its value is the name of the RSS channel that the item came from, derived from its ``. It has one required attribute, `url`, which links to the XMLization of the source. + + `<source url="http://static.userland.com/tomalak/links2.xml">Tomalak's Realm</source>` + + The purpose of this element is to propogate credit for links, to publicize the sources of news items. It's used in the post command in the Radio UserLand aggregator. It should be generated automatically when forwarding an item from an aggregator to a weblog authoring tool. + """ + source: Rss2Source +} + +"""An RSS2 feed image""" +type Rss2FeedImage { + """The URL of a GIF, JPEG or PNG image that represents the channel""" + uri: String! + + """ + The URL of the site, when the channel is rendered, the image is a link to the site. (Note, in practice the image <title> and <link> should have the same value as the channel's <title> and <link>. + """ + link: String! + + """ + Describes the image, it's used in the ALT attribute of the HTML <img> tag when the channel is rendered in HTML + """ + title: String! + + """ + Numbers indicating the width of the image in pixels. Maximum value for width is 144, default value is 88. Note that the maximum is not enforced however. + """ + width: Int! + + """ + Numbers indicating the height of the image in pixels. Maximum value for height is 400, default value is 31. Note that the maximum is not enforced however. + """ + height: Int! + + """ + Contains text that is included in the TITLE attribute of the link formed around the image in the HTML rendering. + """ + description: String +} + +""" +An RSS2 feed cloud. It specifies a web service that supports the rssCloud interface which can be implemented in HTTP-POST, XML-RPC or SOAP 1.1. + +Its purpose is to allow processes to register with a cloud to be notified of updates to the channel, implementing a lightweight publish-subscribe protocol for RSS feeds. + +`<cloud domain="radio.xmlstoragesystem.com" port="80" path="/RPC2" registerProcedure="xmlStorageSystem.rssPleaseNotify" protocol="xml-rpc" />` + +In this example, to request notification on the channel it appears in, you would send an XML-RPC message to `radio.xmlstoragesystem.com` on port `80`, with a path of `/RPC2`. The procedure to call is `xmlStorageSystem.rssPleaseNotify`. + +A full explanation of this element and the rssCloud interface is [here](http://www.thetwowayweb.com/soapmeetsrss#rsscloudInterface). +""" +type Rss2FeedCloud { + """""" + uri: String! + + """""" + registerProcedure: String! + + """""" + protocol: String! +} + +""" +An RSS2 feed textInput. The purpose of the textInput element is something of a mystery. You can use it to specify a search engine box. Or to allow a reader to provide feedback. Most aggregators ignore it +""" +type Rss2FeedTextInput { + """The label of the Submit button in the text input area""" + title: String! + + """Explains the text input area""" + description: String! + + """The name of the text object in the text input area""" + name: String! + + """The URL of the CGI script that processes text input requests""" + link: String! +} + +"""An RSS2 Channel""" +type Rss2Channel { + """ + The name of the channel. It's how people refer to your service. If you have an HTML website that contains the same information as your RSS file, the title of your channel should be the same as the title of your website + """ + title: String! + + """The URL to the HTML website corresponding to the channel""" + link: String! + + """Phrase or sentence describing the channel""" + description: String! + + """ + The language the channel is written in. This allows aggregators to group all Italian language sites, for example, on a single page. A list of allowable values for this element, as provided by [Netscape](http://backend.userland.com/stories/storyReader$16), is here. You may also use [values defined](http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes) by the W3C. + """ + language: String + + """Copyright notice for content in the channel""" + copyright: String + + """Email address for person responsible for editorial content""" + managingEditor: String + + """ + Email address for person responsible for technical issues relating to channel + """ + webMaster: String + + """ + Specify one or more categories that the channel belongs to. Follows the same rules as the <item>-level [category](https://validator.w3.org/feed/docs/rss2.html#ltcategorygtSubelementOfLtitemgt) element. More [info](https://validator.w3.org/feed/docs/rss2.html#syndic8) + """ + category: String + + """A string indicating the program used to generate the channel""" + generator: String + + """ + A URL that points to the documentation for the format used in the RSS file. It's probably a pointer to OneGraph's RSS page. It's for people who might stumble across an RSS file on a Web server 25 years from now and wonder what it is. + """ + docs: String + + """ + ttl stands for time to live. It's a number of minutes that indicates how long a channel can be cached before refreshing from the source. More info [here](https://validator.w3.org/feed/docs/rss2.html#ltttlgtSubelementOfLtchannelgt) + """ + ttl: Int + + """""" + rating: Int + + """ + A hint for aggregators telling them which hours they can skip. More info [here](http://backend.userland.com/skipHoursDays#skiphours) + """ + skipHours: Int + + """ + A hint for aggregators telling them which days they can skip. More info [here](http://backend.userland.com/skipHoursDays#skipdays) + """ + skipDays: Int + + """ + Specifies a text input box that can be displayed with the channel. More info [here](https://validator.w3.org/feed/docs/rss2.html#lttextinputgtSubelementOfLtchannelgt) + """ + textInput: Rss2FeedTextInput + + """ + Allows processes to register with a cloud to be notified of updates to the channel, implementing a lightweight publish-subscribe protocol for RSS feeds. More info [here](https://validator.w3.org/feed/docs/rss2.html#ltcloudgtSubelementOfLtchannelgt) + """ + cloud: Rss2FeedCloud + + """ + The publication date for the content in the channel. For example, the New York Times publishes on a daily basis, the publication date flips once every 24 hours. That's when the pubDate of the channel changes. All date-times in RSS conform to the Date and Time Specification of RFC 822, with the exception that the year may be expressed with two characters or four characters (four preferred). + """ + pubDate: Float + + """The last time the content of the channel changed""" + lastBuildDate: Float + + """ + Specifies a GIF, JPEG or PNG image that can be displayed with the channel. More info [here](https://validator.w3.org/feed/docs/rss2.html#ltimagegtSubelementOfLtchannelgt) + """ + image: Rss2FeedImage + + """""" + items: [Rss2FeedItem!]! +} + +"""The root for Rss""" +type RssQuery { + """""" + rss2Feed( + """The source of the RSS2 feed""" + url: String! + ): Rss2Channel! +} + +input OneGraphSetAuthGuardianRuleEffectHasuraSetSessionVariableInput { + value: OneGraphSetAuthGuardianRuleEffectJsonValueInput! + name: String! +} + +""" +Commonly used values for use in JWT generation, like GitHub email address or the current time. +""" +enum OneGraphAuthGuardianBuiltInValue { + CONTENTFUL_AVATAR_URL + CONTENTFUL_USER_ID + CONTENTFUL_EMAIL + EGGHEADIO_AVATAR_URL + EGGHEADIO_USER_ID + EGGHEADIO_EMAIL + EGGHEADIO_IS_PRO + EGGHEADIO_IS_INSTRUCTOR + EGGHEADIO_IS_COMMUNITY_MEMBER + GITHUB_AVATAR_URL + GITHUB_EMAIL + GITHUB_LOGIN + GITHUB_NAME + GITHUB_USER_ID + GITHUB_FULL_EMAILS + GMAIL_EMAIL + GMAIL_EMAIL_VERIFIED + GMAIL_USER_ID + NOW_SECONDS + NOW_MILLISECONDS + NOW_TIMESTAMP + SALESFORCE_EMAIL + SALESFORCE_USER_ID + SPOTIFY_EMAIL + SPOTIFY_USER_ID + TWITCH_TV_EMAIL + TWITCH_TV_DISPLAY_NAME + TWITCH_TV_LOGO_URL + TWITCH_TV_USER_ID +} + +input OneGraphSetAuthGuardianRuleEffectJsonValueInput { + json: String + builtInValue: OneGraphAuthGuardianBuiltInValue +} + +input OneGraphSetAuthGuardianRuleEffectSetValueInput { + value: OneGraphSetAuthGuardianRuleEffectJsonValueInput! + path: String! +} + +input OneGraphSetAuthGuardianRuleEffectInput { + onExpressJsAddPermissions: [String!] + onApolloServerAddRoles: [String!] + onNetlifyAddUserRoles: [String!] + onHasuraSetUserId: OneGraphSetAuthGuardianRuleEffectJsonValueInput + onHasuraSetDefaultRole: String + onHasuraSetSessionVariable: OneGraphSetAuthGuardianRuleEffectHasuraSetSessionVariableInput + onHasuraAddRoles: [String!] + inTheJsonAddToListAtPath: OneGraphSetAuthGuardianRuleEffectSetValueInput + inTheJsonRemoveValueAtPath: String + inTheJsonSetValueAtPath: OneGraphSetAuthGuardianRuleEffectSetValueInput +} + +input OneGraphSetAuthGuardianRuleConditionTwitchTvInput { + loginStatus: Boolean + hasVerifiedEmail: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionSpotifyInput { + loginStatus: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionSalesforceInput { + loginStatus: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionGmailInput { + loginStatus: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionGitHubInput { + isCollaboratorOnRepositoryWhereFullName: String + isMemberOfOrganizationNamed: String + hasStarredARepositoryWithAFullNameOf: String + hasCommittedToRepositoryWithAFullNameOf: String + login: OneGraphSetAuthGuardianRuleStringConditionInput + loginStatus: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionEggheadioInput { + isCommunityMember: Boolean + isInstructor: Boolean + isPro: Boolean + loggedIn: Boolean + email: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleStringConditionInput { + isEqualToCaseInsensitively: String + containsCaseInsensitively: String + endsWithCaseInsensitively: String + startsWithCaseInsensitively: String + isEqualTo: String + contains: String + endsWith: String + startsWith: String +} + +input OneGraphSetAuthGuardianRuleEmailConditionInput { + isEqualTo: String + hasADomainThat: OneGraphSetAuthGuardianRuleStringConditionInput + endsWith: String + startsWith: String +} + +input OneGraphSetAuthGuardianRuleConditionContentfulInput { + confirmed: Boolean + activated: Boolean + loggedIn: Boolean + email: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionInput { + twitch: OneGraphSetAuthGuardianRuleConditionTwitchTvInput + spotify: OneGraphSetAuthGuardianRuleConditionSpotifyInput + salesforce: OneGraphSetAuthGuardianRuleConditionSalesforceInput + gmail: OneGraphSetAuthGuardianRuleConditionGmailInput + gitHub: OneGraphSetAuthGuardianRuleConditionGitHubInput + eggheadio: OneGraphSetAuthGuardianRuleConditionEggheadioInput + contentful: OneGraphSetAuthGuardianRuleConditionContentfulInput + always: Boolean +} + +input OneGraphSetAuthGuardianRuleInput { + effects: [OneGraphSetAuthGuardianRuleEffectInput!]! + conditions: [OneGraphSetAuthGuardianRuleConditionInput!]! +} + +input OneGraphSetAuthGuardianInput { + rules: [OneGraphSetAuthGuardianRuleInput!]! +} + +type OneGraphSetAuthGuardianResponsePayload { + javascript: String + graphQL: String + jwt: String + rules: JSON +} + +"""A OneGraph Server Info""" +type OneGraphServerInfo { + """""" + sha: String! + + """""" + buildNumber: Int! +} + +type OneGraphGithubRepositorySubscriptionDelegate { + id: String! + + """Name with owner (e.g. onegraph/graphiql-exporer) of the GitHub repo.""" + nameWithOwner: String! + + """ + Datetime that the repo was set up to allow non-admin subscriptions (rfc3339 encoded) + """ + createdAt: String! +} + +type OneGraphGithubRepositorySubscriptionDelegateConnection { + nodes: [OneGraphGithubRepositorySubscriptionDelegate!]! +} + +"""Persisted query""" +type OneGraphPersistedQuery { + """The persisted query's id.""" + id: String! + + """The persisted query's query string.""" + query: String! + + """The default variables provided to the query.""" + fixedVariables: JSON + + """ + The list of variables that the caller of the query is allowed to provide. + """ + freeVariables: [String!] +} + +"""List of persisted queries.""" +type OneGraphPersistedQueryConnection { + """List of persisted queries.""" + nodes: [OneGraphPersistedQuery!]! + + """Pagination information""" + pageInfo: PageInfo! +} + +type OneGraphAppAuthCompletedLog implements OneGraphAppLog { + """ + Noted whenever an end-user has completed a login for a service when using this app + """ + service: String! + friendlyName: String! + + """The user id according to the service they logged into""" + serviceUserId: String + + """The id of the log""" + id: String! + + """The time of the log, encoded as rfc3339""" + createdAt: String! + + """JSON data encoded as a string for this specific event""" + jsonData(pretty: Boolean): String! +} + +type OneGraphAppLogJwtWebhookFailed implements OneGraphAppLog { + """ + The destination webhook where we tried to deliver the JWT for preprocessing when it failed + """ + destination: String! + + """The numeric HTTP status code we received from the webhook (if any)""" + responseStatusCode: Int + + """The textual responseBody we received from the webhook (if any)""" + responseBody: String + friendlyName: String! + + """The id of the log""" + id: String! + + """The time of the log, encoded as rfc3339""" + createdAt: String! + + """JSON data encoded as a string for this specific event""" + jsonData(pretty: Boolean): String! +} + +type OneGraphAppLogSubscriptionDeliveryFailed implements OneGraphAppLog { + """The subscription for the failed delivery attempt""" + subscription: OneGraphAppSubscription + + """The attempt number for delivering this subscription payload""" + attempt: Int! + friendlyName: String! + + """The id of the log""" + id: String! + + """The time of the log, encoded as rfc3339""" + createdAt: String! + + """JSON data encoded as a string for this specific event""" + jsonData(pretty: Boolean): String! +} + +interface OneGraphAppLog { + id: String! + createdAt: String! + friendlyName: String! + jsonData(pretty: Boolean): String +} + +type OneGraphAppLogConnection { + """Applogs""" + nodes: [OneGraphAppLog!]! +} + +"""An RSA public key used for signing JWTs""" +type OneGraphAppJwtRsaPublicKey { + """The algorithm associated with this public key""" + algorithm: String! + + """The n of the rsa key""" + n: String! + + """The exponent of the rsa key""" + e: String! +} + +"""An HMAC key used for signing JWTs""" +type OneGraphJwtSigningKeyHmac256 implements OneGraphJwtSigningKey { + """The algorithm associated with this public key""" + algorithm: OneGraphJwtSigningAlgorithmEnum! + + """The algorithm associated with this public key""" + family: OneGraphSigningAlgorithmFamilyEnum! + + """The shared secret for this key (if any)""" + sharedSecret: String +} + +"""Signing algorithm for JWTs generated by Onegraph""" +enum OneGraphJwtSigningAlgorithmEnum { + HMAC_256 + RSA_256 +} + +"""The family of Signing algorithms""" +enum OneGraphSigningAlgorithmFamilyEnum { + SYMMETRIC + ASYMMETRIC +} + +"""An RSA public key used for signing JWTs""" +type OneGraphJwtSigningKeyRsa256 implements OneGraphJwtSigningKey { + """The algorithm associated with this public key""" + family: OneGraphSigningAlgorithmFamilyEnum! + + """The algorithm associated with this public key""" + algorithm: OneGraphJwtSigningAlgorithmEnum! +} + +interface OneGraphJwtSigningKey { + """The family of algorithms used for this key""" + family: OneGraphSigningAlgorithmFamilyEnum! + + """The algorithm associated with this key""" + algorithm: OneGraphJwtSigningAlgorithmEnum! +} + +"""The method of generating JWTs""" +enum OneGraphAppJwtGenerationMethodEnum { + MANUAL + AUTH_BUILDER +} + +"""JWT settings for the app, useful for SSO.""" +type OneGraphAppJwtSettings { + """A query to run on every user log in to use in generating the JWT token""" + jwtPreflightQuery: String + + """ + An optional webhook to use for generating the full JWT. Use this and `jwtPreflightQuery` to customize claims. Very useful when used alongside e.g. Hasura or PostGraphile + """ + jwtWebhookUrl: String + + """ + Whether this app is generating JWTs on login via a manual query/webhook combination, or using OneGraph's AuthGuardian + """ + jwtGenerationMethod: OneGraphAppJwtGenerationMethodEnum! + + """ + The rules this app is configured to use when generating JWTs on user login + """ + jwtAuthGuardianRules: JSON + + """The current key used to sign JWTs generated for this app""" + activeKey: OneGraphJwtSigningKey + + """List of the public keys for an app""" + publicKeys: [OneGraphAppJwtRsaPublicKey!] + + """The full JWT configuration for Hasura""" + hasuraConfig: String + + """ + The public well-known JWK url of where to look for public keys when verifying JWT for this app + """ + jwksUrl: String! +} + +"""Status of the subscription""" +enum OneGraphAppSubscriptionsStatusEnumArg { + ACTIVE + INACTIVE +} + +"""Webhook destination for a OneGraph subscription""" +type OneGraphAppSubscriptionWebhookDestination { + """Url that the webhook will deliver payloads to.""" + url: String! +} + +"""Websocket destination for a OneGraph subscription""" +type OneGraphAppSubscriptionWebsocketDestination { + """The client-side id for the subscription.""" + clientId: String! +} + +union OneGraphAppSubscriptionDestination = OneGraphAppSubscriptionWebsocketDestination | OneGraphAppSubscriptionWebhookDestination + +"""Information about a subscription to gmail.""" +type OneGraphGmailWatch { + """Email address that is being watched.""" + emailAddress: String! +} + +"""Subscription created by the app""" +type OneGraphAppSubscription { + """Unique id for the subscription.""" + id: String! + + """Status of the subscription.""" + status: String! + + """Query that the subscription run.""" + query: String! + + """ + If this is a subscription to Gmail, contains extra information about the Gmail subscription + """ + gmailWatch: OneGraphGmailWatch + + """Destination for the subscription payloads""" + destination: OneGraphAppSubscriptionDestination! +} + +""" +Subscriptions created by the app, with extra information about pagination. +""" +type OneGraphAppSubscriptionsConnection { + """List of subscriptions created by the app.""" + nodes: [OneGraphAppSubscription!]! +} + +"""Custom clientId and clientSecret for a service""" +type OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String +} + +"""A OneGraph Org""" +type OneGraphOrg { + """The id of the OneGraph Org""" + id: String! + + """The name of the OneGraph Org""" + name: String! + + """All OneGraph apps belonging to this organization""" + apps: [OneGraphApp!]! +} + +"""A OneGraph App""" +type OneGraphApp { + """The id of the OneGraph App""" + id: String! + + """The description of the OneGraph App""" + description: String! + + """The subdomain of the OneGraph App""" + subdomain: String! + + """The name of the OneGraph App""" + name: String! + + """The origins allowed for this OneGraph App from CORS requests""" + corsOrigins: [String!]! + + """The id of the OneGraph organization that this app belongs to""" + orgId: String! + + """The OneGraph organization that this app belongs to""" + org: OneGraphOrg + + """The queries belonging to this OneGraph app""" + queries: [OneGraphQuery!]! + + """ + The custom clientId/clientSecret that have been set for services (e.g. Gmail and Slack) that belong to this OneGraph app + """ + serviceAuths: [OneGraphServiceAuth!]! + + """Subscriptions created with this app""" + subscriptions( + """Fiter by status of the subscription""" + status: OneGraphAppSubscriptionsStatusEnumArg + + """How many subsriptions to fetch""" + first: Int + ): OneGraphAppSubscriptionsConnection! + + """The JWT settings for this app""" + jwtSettings: OneGraphAppJwtSettings! + + """Activity related to this app""" + auditLogs( + """ + How many log items to pull from the front of the collection, maximum of `250` + """ + first: Int + ): OneGraphAppLogConnection! + + """ + Sites on Netlify associated with this app. OneGraph will allow CORS and authentication redirects to all previews, branch, and production deploys of these sites. + """ + netlifySiteNames: [String!]! + + """List of persisted queries for this app""" + persistedQueries( + """Returns results after the provided cursor.""" + after: String + + """How many persisted queries to return. Defaults to 10, max 100.""" + first: Int + ): OneGraphPersistedQueryConnection! + + """GitHub repos for the app that can have subscriptions on OneGraph.""" + gitHubRepositorySubscriptionDelegates: OneGraphGithubRepositorySubscriptionDelegateConnection! +} + +"""A query stored in Onegraph""" +type OneGraphQuery { + """The id of the GraphQL query""" + id: String! + + """The id of the app that this GraphQL query belongs to""" + appId: String! + + """ + Whether a GraphQL query is globally enabled/disabled. Note that even if the query is enabled, a corresponding auth_token must share a tag with this query to use it. + """ + enabled: Boolean! + + """ + Whether a GraphQL query is shared and publicly viewable, including all of its meta-information. + """ + public: Boolean! + + """The version (currently a hash of the body) of the GraphQL query""" + version: String! + + """The body of the GraphQL query""" + body: String! + + """The name of the GraphQL query""" + name: String! + + """An optional description of the GraphQL query""" + description: String + + """The tags (for permissions and organization) of the GraphQL query""" + tags: [String!]! + + """What time this query was created""" + createdAtTs: String! + + """What time this query was created in milliseconds from the epoch""" + createdAtMs: Int! +} + +"""A query stored in OneGraph in shortened form for easy sharing""" +type OneGraphShortenedQuery { + """The id of the shortened OneGraph query""" + id: String! + + """The full query body of the shortened OneGraph query""" + query: String! + + """The variables of the shortened OneGraph query""" + variables: String + + """The pre-selected operation of the shortened OneGraph query""" + operation: String + + """An optional description of the purpose of the query""" + description: String + + """The optional short name for the shortened OneGraph query""" + name: String + + """ + The fully-qualified url for the shortened OneGraph query, used for sharing + """ + url: String! +} + +input OneGraphServiceInfoFilter { + """Filter for services that support custom service auth""" + supportsCustomServiceAuth: Boolean + + """Filter for services that support OAuth login""" + supportsOauthLogin: Boolean +} + +"""Information about a service that OneGraph supports.""" +type OneGraphServiceInfo { + service: OneGraphServiceEnum! + friendlyServiceName: String! + + """ + Service string that can be provided in the URL when going through the oauth flow. + """ + slug: String! + supportsOauthLogin: Boolean! + supportsCustomServiceAuth: Boolean! +} + +""" +Root fields for the OneGraph service. Used by OneGraph to build OneGraph. +""" +type OneGraphServiceQuery { + services(filter: OneGraphServiceInfoFilter): [OneGraphServiceInfo!]! + shortenedUrl(id: String!): OneGraphShortenedQuery + queries: [OneGraphQuery!]! + searchQueries(query: String!): [OneGraphQuery!]! + apps: [OneGraphApp!]! + app( + """App id""" + id: String! + ): OneGraphApp! + orgs: [OneGraphOrg!]! + org( + """Org id""" + id: String! + ): OneGraphOrg! + serverInfo: OneGraphServerInfo! + authGuardianPreview(input: OneGraphSetAuthGuardianInput!): OneGraphSetAuthGuardianResponsePayload +} + +"""Information about pagination in a connection.""" +type EventilPageInfo { + """When paginating forwards, the cursor to continue.""" + endCursor: String + + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: String +} + +"""An edge in a connection.""" +type EventilEventEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: EventilEvent +} + +"""The connection type for Event.""" +type EventilEventConnection { + """A list of edges.""" + edges: [EventilEventEdge] + + """Information to aid in pagination.""" + pageInfo: EventilPageInfo! +} + +"""Event cities""" +type EventilCity { + """""" + count: Int + + """""" + name: String +} + +"""""" +type EventilQuery { + """Top cities""" + cities(limit: Int): [EventilCity] + + """Event field""" + event(id: ID!): EventilEvent + + """Events list""" + events( + limit: Int + where: String + name: String + topics: [String] + topic: String + featured: Boolean + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): EventilEventConnection + + """Return resource owner""" + me: EventilUser + + """Find Presentation by ID / Hash ID / YouTube ID / Vimeo ID""" + presentation(vimeo_id: String, youtube_id: String, id: ID): EventilPresentation + + """Event topics""" + topics(top: Boolean, limit: Int): [EventilTopic] + + """Find User by GitHub/Twitter/HackerNews/Reddit handle""" + user(reddit: String, hackernews: String, twitter: String, github: String): EventilUser +} + +"""An edge in a connection.""" +type ProductHuntMakerProjectEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: ProductHuntMakerProject! +} + +"""The connection type for MakerProject.""" +type ProductHuntMakerProjectConnection { + """A list of edges.""" + edges: [ProductHuntMakerProjectEdge!]! + + """Information to aid in pagination.""" + pageInfo: ProductHuntPageInfo! + + """Total number of objects returned from this query""" + totalCount: Int! +} + +"""Top level scope for the user in whose context the API is running.""" +type ProductHuntViewer { + """Look up goals of the viewer.""" + goals( + """Define order for the Goals.""" + order: ProductHuntGoalsOrder + + """ + Select Goals which are set as current or not current depending on given value. + """ + current: Boolean + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntGoalConnection! + + """Look up maker groups the viewer is accepted member of.""" + makerGroups( + """Define order for the MakerGroups.""" + order: ProductHuntMakerGroupsOrder + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntMakerGroupConnection! + + """ + Look up maker projects the viewer is a maintainer(either created or maintained by) of. + """ + makerProjects( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntMakerProjectConnection! + + """User who is the viewer of the API.""" + user: ProductHuntUser! +} + +enum ProductHuntTopicsOrder { + """Returns Topics in descending order of creation date.""" + NEWEST + + """Returns Topics in descending order of followers count.""" + FOLLOWERS_COUNT +} + +enum ProductHuntPostsOrder { + """Returns Posts in descending order of featured date.""" + FEATURED_AT + + """Returns Posts in descending order of votes count.""" + VOTES + + """Returns Posts in descending order of ranking.""" + RANKING + + """Returns Posts in descending order of creation date.""" + NEWEST +} + +enum ProductHuntMakerGroupsOrder { + """Returns MakerGroups in descending order of last active date.""" + LAST_ACTIVE + + """Returns MakerGroups in descending order of members count.""" + MEMBERS_COUNT + + """Returns MakerGroups in descending order of goals count.""" + GOALS_COUNT + + """Returns MakerGroups in descending order of creation date.""" + NEWEST +} + +"""An edge in a connection.""" +type ProductHuntMakerGroupEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: ProductHuntMakerGroup! +} + +"""The connection type for MakerGroup.""" +type ProductHuntMakerGroupConnection { + """A list of edges.""" + edges: [ProductHuntMakerGroupEdge!]! + + """Information to aid in pagination.""" + pageInfo: ProductHuntPageInfo! + + """Total number of objects returned from this query""" + totalCount: Int! +} + +enum ProductHuntGoalsOrder { + """Returns Goals in descending order of completion date.""" + COMPLETED_AT + + """Returns Goals in ascending order of due date.""" + DUE_AT + + """Returns Goals in descending order of creation date.""" + NEWEST +} + +"""An edge in a connection.""" +type ProductHuntGoalEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: ProductHuntGoal! +} + +"""The connection type for Goal.""" +type ProductHuntGoalConnection { + """A list of edges.""" + edges: [ProductHuntGoalEdge!]! + + """Information to aid in pagination.""" + pageInfo: ProductHuntPageInfo! + + """Total number of objects returned from this query""" + totalCount: Int! +} + +"""A maker project.""" +type ProductHuntMakerProject { + """ID of the MakerProject.""" + id: ID! + + """Image of the MakerProject.""" + image(height: Int, width: Int): String + + """Whether the MakerProject owner is looking for other makers or not.""" + lookingForOtherMakers: Boolean! + + """ID of the MakerProject.""" + name: String! + + """Tagline of the MakerProject.""" + tagline: String! + + """URL of the MakerProject.""" + url: String! +} + +"""A group of makers, also known as Spaces on PH.""" +type ProductHuntMakerGroup { + """Description of the MakerGroup.""" + description: String! + + """Number of goals that have been created in the MakerGroup.""" + goalsCount: Int! + + """ID of the MakerGroup.""" + id: ID! + + """Whether Viewer is member of the MakerGroup or not.""" + isMember: Boolean! + + """Number of users who are part of the MakerGroup.""" + membersCount: Int! + + """Name of the MakerGroup.""" + name: String! + + """Tagline of the MakerGroup.""" + tagline: String! + + """URL of the MakerGroup.""" + url: String! +} + +"""A goal created by maker.""" +type ProductHuntGoal { + """Number of cheers on the Goal.""" + cheerCount: Int! + + """Identifies the date and time when goal was marked as completed.""" + completedAt: String + + """Identifies the date and time when goal was created.""" + createdAt: String! + + """Whether the goal is user's current goal or not.""" + current: Boolean! + + """Identifies the date and time until the goal is user's current goal.""" + currentUntil: String + + """Identifies the date and time when goal is due.""" + dueAt: String + + """Total time spent in focus mode in seconds, starts at 0""" + focusedDuration: Int! + + """Maker group to which the goal belongs to.""" + group: ProductHuntMakerGroup! + + """ID of Maker group to which the goal belongs to.""" + groupId: ID! + + """ID of the goal.""" + id: ID! + + """Whether the Viewer has cheered the goal or not.""" + isCheered: Boolean! + + """Maker project to which the goal belongs to.""" + project: ProductHuntMakerProject + + """ID of Maker project to which the goal belongs to.""" + projectId: ID + + """Title of the goal in plain text""" + title: String! + + """Public URL of the goal.""" + url: String! + + """User who created the goal.""" + user: ProductHuntUser! + + """ID of User who created the goal.""" + userId: ID! +} + +enum ProductHuntCollectionsOrder { + """Returns Collections in descending order of creation date.""" + NEWEST + + """Returns Collections in descending order of followers count.""" + FOLLOWERS_COUNT + + """Returns Collections in descending order of featured date.""" + FEATURED_AT +} + +"""An object that can have topics associated with it.""" +interface ProductHuntTopicableInterface { + """ID of the object.""" + id: ID! + + """Look up topics that are associated with the object.""" + topics( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntTopicConnection! +} + +"""A topic.""" +type ProductHuntTopic { + """Identifies the date and time when topic was created.""" + createdAt: String! + + """Description of the topic.""" + description: String! + + """Number of users who are following the topic.""" + followersCount: Int! + + """ID of the topic.""" + id: ID! + + """Image of the topic.""" + image(height: Int, width: Int): String + + """Whether the viewer is following the topic or not.""" + isFollowing: Boolean! + + """Name of the topic.""" + name: String! + + """Number of posts that are part of the topic.""" + postsCount: Int! + + """URL friendly slug of the topic.""" + slug: String! + + """Public URL of the topic.""" + url: String! +} + +"""An edge in a connection.""" +type ProductHuntTopicEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: ProductHuntTopic! +} + +"""The connection type for Topic.""" +type ProductHuntTopicConnection { + """A list of edges.""" + edges: [ProductHuntTopicEdge!]! + + """Information to aid in pagination.""" + pageInfo: ProductHuntPageInfo! + + """Total number of objects returned from this query""" + totalCount: Int! +} + +"""Product link from a post.""" +type ProductHuntProductLink { + """""" + type: String! + + """""" + url: String! +} + +"""A media object.""" +type ProductHuntMedia { + """Type of media object.""" + type: String! + + """ + Public URL for the media object. Incase of videos this URL represents thumbnail generated from video. + """ + url( + """Set height of the image to given value.""" + height: Int + + """Set width of the image to given value.""" + width: Int + ): String! + + """Video URL of the media object.""" + videoUrl: String +} + +"""An object which users can vote for.""" +interface ProductHuntVotableInterface { + """ID of the object""" + id: ID! + + """Whether the Viewer has voted for the object or not.""" + isVoted: Boolean! + + """""" + votes( + """Select Votes which were created before the given date and time.""" + createdBefore: String + + """Select Votes which were created after the given date and time.""" + createdAfter: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntVoteConnection! + + """Number of votes that the object has currently.""" + votesCount: Int! +} + +"""A vote.""" +type ProductHuntVote { + """Identifies the date and time when Vote was created.""" + createdAt: String! + + """ID of the Vote.""" + id: ID! + + """User who created the Vote.""" + user: ProductHuntUser! + + """ID of User who created the Vote.""" + userId: ID! +} + +"""An edge in a connection.""" +type ProductHuntVoteEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: ProductHuntVote! +} + +"""The connection type for Vote.""" +type ProductHuntVoteConnection { + """A list of edges.""" + edges: [ProductHuntVoteEdge!]! + + """Information to aid in pagination.""" + pageInfo: ProductHuntPageInfo! + + """Total number of objects returned from this query""" + totalCount: Int! +} + +"""An edge in a connection.""" +type ProductHuntUserEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: ProductHuntUser! +} + +"""The connection type for User.""" +type ProductHuntUserConnection { + """A list of edges.""" + edges: [ProductHuntUserEdge!]! + + """Information to aid in pagination.""" + pageInfo: ProductHuntPageInfo! + + """Total number of objects returned from this query""" + totalCount: Int! +} + +"""A user.""" +type ProductHuntUser { + """Cover image of the user.""" + coverImage(height: Int, width: Int): String + + """Identifies the date and time when user was created.""" + createdAt: String! + + """Look up collections that the user is following.""" + followedCollections( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntCollectionConnection! + + """Look up other users who are following the user.""" + followers( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntUserConnection! + + """Look up other users who are being followed by the user.""" + following( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntUserConnection! + + """Headline text of the user.""" + headline: String + + """ID of the user.""" + id: ID! + + """Whether the viewer is following the user or not.""" + isFollowing: Boolean! + + """Whether the user is an accepted maker or not.""" + isMaker: Boolean! + + """Whether the user is same as the viewer of the API.""" + isViewer: Boolean! + + """Look up posts that the user has made.""" + madePosts( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntPostConnection! + + """Name of the user.""" + name: String! + + """Profile image of the user.""" + profileImage(size: Int): String + + """Look up posts that the user has submitted.""" + submittedPosts( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntPostConnection! + + """Twitter username of the user.""" + twitterUsername: String + + """Public URL of the user's profile""" + url: String! + + """Username of the user.""" + username: String! + + """Look up posts that the user has voted for.""" + votedPosts( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntPostConnection! + + """URL for the user's website""" + websiteUrl: String + twitterUser: TwitterUser + gitHubUser: GitHubUser + websiteDescuri: Descuri +} + +enum ProductHuntCommentsOrder { + """Returns Comments in descending order of creation date.""" + NEWEST + + """Returns Comments in descending order of votes count.""" + VOTES_COUNT +} + +"""A comment posted by a User.""" +type ProductHuntComment implements ProductHuntVotableInterface { + """Body of the comment.""" + body: String! + + """Identifies the date and time when comment was created.""" + createdAt: String! + + """ID of the comment.""" + id: ID! + + """Whether the Viewer has voted for the object or not.""" + isVoted: Boolean! + + """ + Comment on which this comment was posted(null in case of top level comments). + """ + parent: ProductHuntComment + + """ + ID of Comment on which this comment was posted(null in case of top level comments). + """ + parentId: ID + + """Lookup comments that were posted on the comment itself.""" + replies( + """Define order for the Comments.""" + order: ProductHuntCommentsOrder + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntCommentConnection! + + """Public URL of the comment.""" + url: String! + + """User who posted the comment.""" + user: ProductHuntUser! + + """ID of User who posted the comment.""" + userId: ID! + + """""" + votes( + """Select Votes which were created before the given date and time.""" + createdBefore: String + + """Select Votes which were created after the given date and time.""" + createdAfter: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntVoteConnection! + + """Number of votes that the object has currently.""" + votesCount: Int! +} + +"""An edge in a connection.""" +type ProductHuntCommentEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: ProductHuntComment! +} + +"""The connection type for Comment.""" +type ProductHuntCommentConnection { + """A list of edges.""" + edges: [ProductHuntCommentEdge!]! + + """Information to aid in pagination.""" + pageInfo: ProductHuntPageInfo! + + """Total number of objects returned from this query""" + totalCount: Int! +} + +"""Information about pagination in a connection.""" +type ProductHuntPageInfo { + """When paginating forwards, the cursor to continue.""" + endCursor: String + + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: String +} + +"""An edge in a connection.""" +type ProductHuntCollectionEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: ProductHuntCollection! +} + +"""The connection type for Collection.""" +type ProductHuntCollectionConnection { + """A list of edges.""" + edges: [ProductHuntCollectionEdge!]! + + """Information to aid in pagination.""" + pageInfo: ProductHuntPageInfo! + + """Total number of objects returned from this query""" + totalCount: Int! +} + +"""A post.""" +type ProductHuntPost implements ProductHuntVotableInterface & ProductHuntTopicableInterface { + """Lookup collections which the Post is part of.""" + collections( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntCollectionConnection! + + """Lookup comments on the Post.""" + comments( + """Define order for the Comments.""" + order: ProductHuntCommentsOrder + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntCommentConnection! + + """Number of comments made on the Post.""" + commentsCount: Int! + + """Identifies the date and time when the Post was created.""" + createdAt: String! + + """Description of the Post in plain text.""" + description: String + + """Identifies the date and time when the Post was featured.""" + featuredAt: String + + """ID of the Post.""" + id: ID! + + """Whether the viewer has added the Post to one of their collections.""" + isCollected: Boolean! + + """Whether the Viewer has voted for the object or not.""" + isVoted: Boolean! + + """Users who are marked as makers of the Post.""" + makers: [ProductHuntUser!]! + + """Media items for the Post.""" + media: [ProductHuntMedia!]! + + """Name of the Post.""" + name: String! + + """Additional product links""" + productLinks: [ProductHuntProductLink!]! + + """Count of review for the Post""" + reviewsCount: Int! + + """Aggregate review rating for the Post.""" + reviewsRating: Float! + + """URL friendly slug of the Post.""" + slug: String! + + """Tagline of the Post.""" + tagline: String! + + """Thumbnail media object of the Post.""" + thumbnail: ProductHuntMedia + + """Look up topics that are associated with the object.""" + topics( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntTopicConnection! + + """URL of the Post on Product Hunt.""" + url: String! + + """User who created the Post.""" + user: ProductHuntUser! + + """ID of User who created the Post.""" + userId: ID! + + """""" + votes( + """Select Votes which were created before the given date and time.""" + createdBefore: String + + """Select Votes which were created after the given date and time.""" + createdAfter: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntVoteConnection! + + """Number of votes that the object has currently.""" + votesCount: Int! + + """URL that redirects to the Post's website.""" + website: String! +} + +"""An edge in a connection.""" +type ProductHuntPostEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: ProductHuntPost! +} + +"""The connection type for Post.""" +type ProductHuntPostConnection { + """A list of edges.""" + edges: [ProductHuntPostEdge!]! + + """Information to aid in pagination.""" + pageInfo: ProductHuntPageInfo! + + """Total number of objects returned from this query""" + totalCount: Int! +} + +"""A collection of posts.""" +type ProductHuntCollection implements ProductHuntTopicableInterface { + """Cover image for the collection.""" + coverImage(height: Int, width: Int): String + + """Identifies the date and time when collection was created.""" + createdAt: String! + + """Description of the collection in plain text.""" + description: String + + """Identifies the date and time when collection was featured.""" + featuredAt: String + + """Number of users following the collection.""" + followersCount: Int! + + """ID of the collection.""" + id: ID! + + """Whether the viewer is following the collection or not.""" + isFollowing: Boolean! + + """Name of the collection.""" + name: String! + + """Lookup posts which are part of the collection.""" + posts( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntPostConnection! + + """Tagline of the collection.""" + tagline: String! + + """Look up topics that are associated with the object.""" + topics( + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntTopicConnection! + + """Public URL of the goal.""" + url: String! + + """User who created the collection.""" + user: ProductHuntUser! + + """ID of User who created the collection.""" + userId: ID! +} + +"""The query root for Product Hunt API V2 schema""" +type ProductHuntQuery { + """Look up a Collection(only published).""" + collection( + """URL friendly slug for the object.""" + slug: String + + """ID for the object.""" + id: ID + ): ProductHuntCollection + + """Look up Collections by various parameters.""" + collections( + """Define order for the Collections.""" + order: ProductHuntCollectionsOrder + + """ + Select Collections that have been featured or not featured depending on given value. + """ + featured: Boolean + + """Select Collections that are created by User with the given ID.""" + userId: ID + + """Select Collections that have the Post with the given ID.""" + postId: ID + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntCollectionConnection! + + """Look up a Comment.""" + comment( + """ID for the object.""" + id: ID! + ): ProductHuntComment + + """Look up a Goal.""" + goal( + """ID for the object.""" + id: ID! + ): ProductHuntGoal + + """Look up Goals by various parameters.""" + goals( + """Define order for the Goals.""" + order: ProductHuntGoalsOrder + + """ + Select Goals that have been completed or not completed depending on given value. + """ + completed: Boolean + + """Select Goals that are created in the MakerProject with given ID.""" + makerProjectId: ID + + """Select Goals that are created in the MakerGroup(Space) with given ID.""" + makerGroupId: ID + + """Select Goals that are created by User with the given ID.""" + userId: ID + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntGoalConnection! + + """Look up a MakerGroup.""" + makerGroup( + """ID for the object.""" + id: ID! + ): ProductHuntMakerGroup + + """Look up MakerGroups by various parameters.""" + makerGroups( + """Define order for the MakerGroups.""" + order: ProductHuntMakerGroupsOrder + + """ + Select MakerGroups that the User with the given ID is accepted member of. + """ + userId: ID + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntMakerGroupConnection! + + """Look up a Post.""" + post( + """URL friendly slug for the object.""" + slug: String + + """ID for the object.""" + id: ID + ): ProductHuntPost + + """Look up Posts by various parameters.""" + posts( + """Select Posts that have the given twitter url.""" + twitterUrl: String + + """Define order for the Posts.""" + order: ProductHuntPostsOrder + + """Select Posts that have the given slug as one of their topics.""" + topic: String + + """Select Posts which were posted after the given date and time.""" + postedAfter: String + + """Select Posts which were posted before the given date and time.""" + postedBefore: String + + """ + Select Posts that have been featured or not featured depending on given value. + """ + featured: Boolean + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntPostConnection! + + """Look up a Topic.""" + topic( + """URL friendly slug for the object.""" + slug: String + + """ID for the object.""" + id: ID + ): ProductHuntTopic + + """Look up Topics by various parameters.""" + topics( + """Define order for the Topics.""" + order: ProductHuntTopicsOrder + + """Select Topics whose name or aliases match the given string""" + query: String + + """Select Topics that are followed by User with the given ID.""" + followedByUserId: ID + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Returns the first _n_ elements from the list.""" + first: Int + ): ProductHuntTopicConnection! + + """Look up a User.""" + user( + """Username for the user.""" + username: String + + """ID for the user.""" + id: ID + ): ProductHuntUser + + """ + Top level scope for currently authenticated user. Includes `goals`, `makerGroups`, `makerProjects` & `user` fields. + """ + viewer: ProductHuntViewer +} + +""" +Make a REST API call to the GitHub API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type GithubPassthroughQuery { + """ + Make a GET request to the GitHub API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +enum GitHubSecurityAdvisoryIdentifierType { + """Common Vulnerabilities and Exposures Identifier.""" + CVE + + """GitHub Security Advisory ID.""" + GHSA +} + +"""An advisory identifier to filter results on.""" +input GitHubSecurityAdvisoryIdentifierFilter { + """The identifier string. Supports exact or partial matching.""" + value: String! + + """The identifier type.""" + type: GitHubSecurityAdvisoryIdentifierType! +} + +enum GitHubSecurityAdvisoryOrderField { + """Order advisories by publication time""" + PUBLISHED_AT + + """Order advisories by update time""" + UPDATED_AT +} + +"""Ordering options for security advisory connections""" +input GitHubSecurityAdvisoryOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order security advisories by.""" + field: GitHubSecurityAdvisoryOrderField! +} + +"""An edge in a connection.""" +type GitHubSecurityAdvisoryEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubSecurityAdvisory +} + +"""The connection type for SecurityAdvisory.""" +type GitHubSecurityAdvisoryConnection { + """A list of edges.""" + edges: [GitHubSecurityAdvisoryEdge] + + """A list of nodes.""" + nodes: [GitHubSecurityAdvisory] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubSearchType { + """Returns results matching issues in repositories.""" + ISSUE + + """Returns results matching repositories.""" + REPOSITORY + + """Returns results matching users and organizations on GitHub.""" + USER +} + +"""Represents a single highlight in a search result match.""" +type GitHubTextMatchHighlight { + """The indice in the fragment where the matched text begins.""" + beginIndice: Int! + + """The indice in the fragment where the matched text ends.""" + endIndice: Int! + + """The text matched.""" + text: String! +} + +"""A text match within a search result.""" +type GitHubTextMatch { + """The specific text fragment within the property matched on.""" + fragment: String! + + """Highlights within the matched fragment.""" + highlights: [GitHubTextMatchHighlight!]! + + """The property matched on.""" + property: String! +} + +"""An edge in a connection.""" +type GitHubSearchResultItemEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubSearchResultItem + + """Text matches on the result found.""" + textMatches: [GitHubTextMatch] +} + +"""A list of results that matched against a search query.""" +type GitHubSearchResultItemConnection { + """The number of pieces of code that matched the search query.""" + codeCount: Int! + + """A list of edges.""" + edges: [GitHubSearchResultItemEdge] + + """The number of issues that matched the search query.""" + issueCount: Int! + + """A list of nodes.""" + nodes: [GitHubSearchResultItem] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """The number of repositories that matched the search query.""" + repositoryCount: Int! + + """The number of users that matched the search query.""" + userCount: Int! + + """The number of wiki pages that matched the search query.""" + wikiCount: Int! +} + +"""Represents the client's rate limit.""" +type GitHubRateLimit { + """The point cost for the current query counting against the rate limit.""" + cost: Int! + + """ + The maximum number of points the client is permitted to consume in a 60 minute window. + """ + limit: Int! + + """The maximum number of nodes this query may return""" + nodeCount: Int! + + """The number of points remaining in the current rate limit window.""" + remaining: Int! + + """ + The time at which the current rate limit window resets in UTC epoch seconds. + """ + resetAt: String! +} + +"""Represents information about the GitHub instance.""" +type GitHubGitHubMetadata { + """Returns a String that's a SHA of `github-services`""" + gitHubServicesSha: String! + + """IP addresses that users connect to for git operations""" + gitIpAddresses: [String!] + + """IP addresses that service hooks are sent from""" + hookIpAddresses: [String!] + + """IP addresses that the importer connects from""" + importerIpAddresses: [String!] + + """Whether or not users are verified""" + isPasswordAuthenticationVerifiable: Boolean! + + """IP addresses for GitHub Pages' A records""" + pagesIpAddresses: [String!] +} + +"""An edge in a connection.""" +type GitHubMarketplaceListingEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubMarketplaceListing +} + +"""Look up Marketplace Listings""" +type GitHubMarketplaceListingConnection { + """A list of edges.""" + edges: [GitHubMarketplaceListingEdge] + + """A list of nodes.""" + nodes: [GitHubMarketplaceListing] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""The query root of GitHub's GraphQL interface.""" +type GitHubQuery { + """Look up a code of conduct by its key""" + codeOfConduct( + """The code of conduct's key""" + key: String! + ): GitHubCodeOfConduct + + """Look up a code of conduct by its key""" + codesOfConduct: [GitHubCodeOfConduct] + + """Look up an enterprise by URL slug.""" + enterprise( + """The enterprise invitation token.""" + invitationToken: String + + """The enterprise URL slug.""" + slug: String! + ): GitHubEnterprise + + """ + Look up a pending enterprise administrator invitation by invitee, enterprise and role. + """ + enterpriseAdministratorInvitation( + """The role for the business member invitation.""" + role: GitHubEnterpriseAdministratorRole! + + """The slug of the enterprise the user was invited to join.""" + enterpriseSlug: String! + + """The login of the user invited to join the business.""" + userLogin: String! + ): GitHubEnterpriseAdministratorInvitation + + """ + Look up a pending enterprise administrator invitation by invitation token. + """ + enterpriseAdministratorInvitationByToken( + """The invitation token sent with the invitation email.""" + invitationToken: String! + ): GitHubEnterpriseAdministratorInvitation + + """Look up an open source license by its key""" + license( + """The license's downcased SPDX ID""" + key: String! + ): GitHubLicense + + """Return a list of known open source licenses""" + licenses: [GitHubLicense]! + + """Get alphabetically sorted list of Marketplace categories""" + marketplaceCategories( + """Returns top level categories only, excluding any subcategories.""" + excludeSubcategories: Boolean + + """Exclude categories with no listings.""" + excludeEmpty: Boolean + + """Return only the specified categories.""" + includeCategories: [String!] + ): [GitHubMarketplaceCategory!]! + + """Look up a Marketplace category by its slug.""" + marketplaceCategory( + """Also check topic aliases for the category slug""" + useTopicAliases: Boolean + + """The URL slug of the category.""" + slug: String! + ): GitHubMarketplaceCategory + + """Look up a single Marketplace listing""" + marketplaceListing( + """ + Select the listing that matches this slug. It's the short name of the listing used in its URL. + """ + slug: String! + ): GitHubMarketplaceListing + + """Look up Marketplace listings""" + marketplaceListings( + """Select only listings that offer a free trial.""" + withFreeTrialsOnly: Boolean + + """ + Select only listings where the primary category matches the given category slug. + """ + primaryCategoryOnly: Boolean + + """ + Select the listings with these slugs, if they are visible to the viewer. + """ + slugs: [String] + + """ + Select listings visible to the viewer even if they are not approved. If omitted or + false, only approved listings will be returned. + + """ + allStates: Boolean + + """Select listings for products owned by the specified organization.""" + organizationId: ID + + """Select listings that can be administered by the specified user.""" + adminId: ID + + """ + Select listings to which user has admin access. If omitted, listings visible to the + viewer are returned. + + """ + viewerCanAdmin: Boolean + + """Also check topic aliases for the category slug""" + useTopicAliases: Boolean + + """Select only listings with the given category.""" + categorySlug: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubMarketplaceListingConnection! + + """Return information about the GitHub instance""" + meta: GitHubGitHubMetadata! + + """Fetches an object given its ID.""" + node( + """ID of the object.""" + id: ID! + ): GitHubNode + + """Lookup nodes by a list of IDs.""" + nodes( + """The list of node IDs.""" + ids: [ID!]! + ): [GitHubNode]! + + """Lookup a organization by login.""" + organization( + """The organization's login.""" + login: String! + ): GitHubOrganization + + """The client's rate limit information.""" + rateLimit( + """If true, calculate the cost for the query without evaluating it""" + dryRun: Boolean + ): GitHubRateLimit + + """ + Hack to workaround https://github.com/facebook/relay/issues/112 re-exposing the root query object + """ + relay: GitHubQuery! + + """Lookup a given repository by the owner and repository name.""" + repository( + """The name of the repository""" + name: String! + + """The login field of a user or organization""" + owner: String! + ): GitHubRepository + + """ + Lookup a repository owner (ie. either a User or an Organization) by login. + """ + repositoryOwner( + """The username to lookup the owner by.""" + login: String! + ): GitHubRepositoryOwner + + """Lookup resource by a URL.""" + resource( + """The URL.""" + url: String! + ): GitHubUniformResourceLocatable + + """Perform a search across resources.""" + search( + """The types of search items to search within.""" + type: GitHubSearchType! + + """The search string to look for.""" + query: String! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSearchResultItemConnection! + + """GitHub Security Advisories""" + securityAdvisories( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filter advisories to those updated since a time in the past.""" + updatedSince: String + + """Filter advisories to those published since a time in the past.""" + publishedSince: String + + """Filter advisories by identifier, e.g. GHSA or CVE.""" + identifier: GitHubSecurityAdvisoryIdentifierFilter + + """Ordering options for the returned topics.""" + orderBy: GitHubSecurityAdvisoryOrder + ): GitHubSecurityAdvisoryConnection! + + """Fetch a Security Advisory by its GHSA ID""" + securityAdvisory( + """GitHub Security Advisory ID.""" + ghsaId: String! + ): GitHubSecurityAdvisory + + """Software Vulnerabilities documented by GitHub Security Advisories""" + securityVulnerabilities( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """A list of severities to filter vulnerabilities by.""" + severities: [GitHubSecurityAdvisorySeverity!] + + """A package name to filter vulnerabilities by.""" + package: String + + """An ecosystem to filter vulnerabilities by.""" + ecosystem: GitHubSecurityAdvisoryEcosystem + + """Ordering options for the returned topics.""" + orderBy: GitHubSecurityVulnerabilityOrder + ): GitHubSecurityVulnerabilityConnection! + + """Look up a single Sponsors Listing""" + sponsorsListing( + """Select the Sponsors listing which matches this slug""" + slug: String! + ): GitHubSponsorsListing @deprecated(reason: "`Query.sponsorsListing` will be removed. Use `Sponsorable.sponsorsListing` instead. Removal on 2020-04-01 UTC.") + + """Look up a topic by name.""" + topic( + """The topic's name.""" + name: String! + ): GitHubTopic + + """Lookup a user by login.""" + user( + """The user's login.""" + login: String! + ): GitHubUser + + """The currently authenticated user.""" + viewer: GitHubUser! + + """ + Make a REST API call to the GitHub API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: GithubPassthroughQuery! +} + +"""""" +type BrexLoyaltyProgramEdge { + """""" + cursor: String + + """""" + node: BrexLoyaltyProgram +} + +"""""" +type BrexLoyaltyProgramConnection { + """""" + edges: [BrexLoyaltyProgramEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexRewardsCampaignEdge { + """""" + cursor: String + + """""" + node: BrexRewardsCampaign +} + +"""""" +type BrexRewardsCampaignConnection { + """""" + edges: [BrexRewardsCampaignEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexIntegrationEdge { + """""" + cursor: String + + """""" + node: BrexIntegration +} + +"""""" +type BrexIntegrationConnection { + """""" + edges: [BrexIntegrationEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexSuggestion { + """""" + field: String! + + """""" + options: [BrexSuggestionType]! +} + +enum BrexOrderDirection { + ASC + DESC +} + +"""""" +input BrexOrderByInput { + sort: String! + direction: BrexOrderDirection! +} + +"""""" +type BrexDateHistogramAggregationField { + """""" + count: Int! + + """""" + date: Int! + + """""" + sum: Float +} + +"""""" +type BrexDateHistogramAggregationResult { + """""" + name: String! + + """""" + series: [BrexDateHistogramAggregationField]! +} + +"""""" +type BrexGroupAggregationField { + """""" + count: Int! + + """""" + key: String! +} + +"""""" +type BrexGroupAggregationResult { + """""" + name: String! + + """""" + values: [BrexGroupAggregationField] +} + +"""""" +type BrexSumAggregationResult { + """""" + name: String! + + """""" + value: Float! +} + +"""""" +union BrexAggregationResult = BrexSumAggregationResult | BrexGroupAggregationResult | BrexDateHistogramAggregationResult + +"""""" +type BrexSearchResult { + """""" + aggregates: [BrexAggregationResult] + + """""" + cursor: String + + """""" + hits: [BrexSearchable]! + + """""" + totalHits: Int! +} + +enum BrexSyncReadyStatus { + HAS_CONFLICT + INVALID_FIELDS + PAYLOAD_INVALID + READY_TO_SYNC +} + +"""""" +type BrexFinancialInstitutionEdge { + """""" + cursor: String + + """""" + node: BrexFinancialInstitution +} + +"""""" +type BrexFinancialInstitutionConnection { + """""" + edges: [BrexFinancialInstitutionEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexProductApplicationEdge { + """""" + cursor: String + + """""" + node: BrexProductApplication +} + +"""""" +type BrexProductApplicationConnection { + """""" + edges: [BrexProductApplicationEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexLocationEdge { + """""" + cursor: String + + """""" + node: BrexLocation +} + +"""""" +type BrexLocationConnection { + """""" + edges: [BrexLocationEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexApiClient { + """""" + clientName: String + + """""" + clientUrl: String +} + +enum BrexRecipientType { + BUSINESS + INDIVIDUAL +} + +"""""" +type BrexInternationalWireInputField { + """""" + displayName: String! + + """""" + forRecipientTypes: [BrexRecipientType!] + + """""" + format: String + + """""" + maxLength: Int! + + """""" + minLength: Int! + + """""" + name: String! + + """""" + tooltip: String +} + +"""""" +type BrexInternationalWireCountryConfig { + """""" + addressRequiresZipCode: Boolean! + + """""" + countryCodeAlpha2: String! + + """""" + countryName: String! + + """""" + iban: Boolean! + + """""" + inputFields: [BrexInternationalWireInputField!]! + + """""" + recipientTypes: [BrexRecipientType!] +} + +"""""" +type BrexInternationalWireConfig { + """""" + countryConfigs: [BrexInternationalWireCountryConfig!]! +} + +"""""" +type BrexInternationalBankInformation { + """""" + address: BrexAddress! + + """""" + name: String! + + """""" + nameAbbrev: String! +} + +"""""" +type BrexMilesTransferEdge { + """""" + cursor: String + + """""" + node: BrexMilesTransfer +} + +"""""" +type BrexMilesTransferConnection { + """""" + edges: [BrexMilesTransferEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexDepartmentEdge { + """""" + cursor: String + + """""" + node: BrexDepartment +} + +"""""" +type BrexDepartmentConnection { + """""" + edges: [BrexDepartmentEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexOnboardingApplicationEdge { + """""" + cursor: String + + """""" + node: BrexOnboardingApplication +} + +"""""" +type BrexOnboardingApplicationConnection { + """""" + edges: [BrexOnboardingApplicationEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexStatementEdge { + """""" + cursor: String + + """""" + node: BrexStatement +} + +"""""" +type BrexStatementConnection { + """""" + edges: [BrexStatementEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexReferralEdge { + """""" + cursor: String + + """""" + node: BrexReferral +} + +"""""" +type BrexReferralConnection { + """""" + edges: [BrexReferralEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexStatementEntryLensEdge { + """""" + cursor: String + + """""" + node: BrexStatementEntryLens +} + +"""""" +type BrexStatementEntryLensConnection { + """""" + edges: [BrexStatementEntryLensEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexCredentialEdge { + """""" + cursor: String + + """""" + node: BrexCredential +} + +"""""" +type BrexCredentialConnection { + """""" + edges: [BrexCredentialEdge] + + """""" + pageInfo: BrexPageInfo! +} + +enum BrexFinancialsVendor { + FINICITY +} + +"""""" +type BrexRootQueryType { + """""" + merchantCategory(id: ID!): BrexMerchantCategory + + """ + Reward offered to referred user for new referrals by logged-in referrer. + """ + currentReferredReward: BrexReferralReward + + """""" + integration(id: ID!): BrexIntegration + + """""" + connectHasEncounteredFailure(vendor: BrexFinancialsVendor!): Boolean! + + """""" + authzRules: [BrexRoleRule] + + """""" + integrationEntities(last: Int, first: Int, before: String, after: String): BrexExternalIntegrationEntityConnection + + """""" + credentials(vendor: String, last: Int, first: Int, before: String, after: String): BrexCredentialConnection + + """""" + userOnboardingApplication: BrexOnboardingApplication + + """""" + previewIntegrationRule(ruleId: ID, ruleBody: String!, last: Int, integrationId: ID!, first: Int, before: String, after: String): BrexStatementEntryLensConnection + + """""" + department(id: ID!): BrexDepartment + + """""" + unexportedStatementEntries(startDate: String, ruleIds: [ID], last: Int, integrationId: ID, first: Int, endDate: String, before: String, after: String, activeFacetType: BrexIntegrationRulesFilterFacetType): BrexStatementEntryConnection + + """""" + referrals(last: Int, first: Int, before: String, after: String): BrexReferralConnection + + """""" + collectionIntention(id: ID!): BrexCollectionIntention + + """""" + statements(last: Int, first: Int, before: String, after: String): BrexStatementConnection + + """""" + onboardingApplications(type: BrexOnboardingBlueprintType, last: Int, first: Int, before: String, applicantCustomerUserId: ID, after: String): BrexOnboardingApplicationConnection + + """""" + location(id: ID!): BrexLocation + + """""" + departments(last: Int, first: Int, before: String, after: String): BrexDepartmentConnection + + """""" + merchant(id: ID!): BrexMerchant + + """Customer account's current servicing policy""" + currentServicingPolicy: BrexServicingPolicy + + """""" + asset(id: ID): BrexAsset + + """""" + cards(last: Int, first: Int, before: String, after: String): BrexCardConnection + + """""" + node(id: ID!): BrexNode + + """""" + merchantCategories(last: Int, first: Int, before: String, after: String): BrexMerchantCategoryConnection + + """Miles transfers""" + milesTransfers(last: Int, first: Int, before: String, after: String): BrexMilesTransferConnection + + """""" + rules(last: Int, first: Int, before: String, after: String): BrexRuleConnection + + """""" + internationalBankInformation(swiftCode: String!): BrexInternationalBankInformation + + """""" + collectionIntentions(last: Int, first: Int, before: String, after: String): BrexCollectionIntentionConnection + + """""" + credential(id: ID!): BrexCredential + + """""" + collectionAttempts(last: Int, first: Int, before: String, after: String): BrexCollectionAttemptConnection + + """""" + internationalWireConfig: BrexInternationalWireConfig + + """""" + depositsTransaction(id: ID!): BrexDepositsTransaction + + """""" + validateLoyaltyProgramMembershipId(membershipId: String!, loyaltyProgramId: ID!): Boolean + + """""" + collectionAttempt(id: ID!): BrexCollectionAttempt + + """""" + userCategories(last: Int, first: Int, before: String, after: String): BrexUserCategoryConnection + + """""" + accountConnectedApiClient: BrexApiClient + + """The id of an object.""" + locations(last: Int, first: Int, before: String, after: String): BrexLocationConnection + + """""" + financialAccounts(last: Int, first: Int, before: String, after: String): BrexFinancialAccountConnection + + """""" + supportedRoles: [String] + + """""" + users(last: Int, first: Int, before: String, after: String): BrexUserConnection + + """""" + fedachParticipant(routingNumber: String!): BrexFedachParticipant + + """""" + productApplications(last: Int, first: Int, before: String, after: String): BrexProductApplicationConnection + + """""" + user(id: ID): BrexUser + + """""" + integrationRule(id: ID!): BrexIntegrationRule + + """""" + financialInstitutions(last: Int, first: Int, before: String, after: String): BrexFinancialInstitutionConnection + + """Reward offered to referrer for new referrals by logged-in referrer.""" + currentReferrerReward: BrexReferralReward + + """""" + transactions(status: String, last: Int, first: Int, customerUserId: ID, before: String, after: String): BrexTransactionConnection + + """""" + rule(id: ID!): BrexRule + + """""" + isIntegrationReadyToSync(startDate: String, id: ID!, endDate: String): BrexSyncReadyStatus + + """""" + card(showPan: Boolean, id: ID!): BrexCard + + """""" + fedwireParticipant(routingNumber: String!): BrexFedwireParticipant + + """""" + userCategory(id: ID!): BrexUserCategory + + """""" + search(type: String!, pageSize: Int, orderBy: [BrexOrderByInput], filters: String!, cursor: String, aggregates: String): BrexSearchResult + + """""" + account: BrexAccount + + """""" + financialInstitution(id: ID!): BrexFinancialInstitution + + """""" + suggest(text: String!): [BrexSuggestion] + + """""" + accountHasExpensifyIntegration: Boolean + + """""" + statementEntries(onlyUnexported: Boolean, last: Int, first: Int, before: String, after: String): BrexStatementEntryConnection + + """""" + statement(id: ID!): BrexStatement + + """""" + integrations(last: Int, first: Int, before: String, after: String): BrexIntegrationConnection + + """""" + onboardingApplication(id: ID!): BrexOnboardingApplication + + """""" + rewardsCampaigns(last: Int, first: Int, before: String, after: String): BrexRewardsCampaignConnection + + """Loyalty programs for miles transfer""" + loyaltyPrograms(last: Int, first: Int, before: String, after: String): BrexLoyaltyProgramConnection + + """""" + transactedMerchants: [BrexMerchant] + + """""" + transaction(id: ID!): BrexTransaction + + """""" + productApplication(id: ID!): BrexProductApplication + + """""" + financialSources(last: Int, first: Int, before: String, after: String): BrexFinancialSourceConnection + + """""" + unexportedStatementEntryFilterFacets(startDate: String, integrationId: ID, endDate: String): [BrexIntegrationRulesFilterFacet] + + """""" + integrationEntity(id: ID!): BrexExternalIntegrationEntity +} + +"""Field to sort search results by, defaults to `relevance`""" +enum ZendeskSearchSortBy { + UPDATED_AT + CREATED_AT + PRIORITY + TICKET_STATUS + TICKET_TYPE +} + +""" +The status property returns tickets set to the specified status. Possible values include `NEW`, `OPEN`, `PENDING`, `HOLD`, `SOLVED`, or `CLOSED`. [Learn more about ticket properties](https://support.zendesk.com/hc/en-us/articles/203663226#topic_crj_yev_uc). You can also search by user, organization, and group properties. +""" +enum ZendeskSearchStatus { + NEW + OPEN + PENDING + HOLD + SOLVED + CLOSED +} + +""" +The type property returns records of the specified resource type. Possible values include `TICKET`, `USER`, `ORGANIZATION`, or `GROUP`. [Learn more about types](https://support.zendesk.com/hc/en-us/articles/203663226#topic_qtr_avw_ld). +""" +enum ZendeskSearchType { + TICKET + USER + ORGANIZATION + GROUP +} + +"""""" +type ZendeskSearchResultsEdge { + """cursor""" + cursor: String! + + """node""" + node: ZendeskSearchResult! +} + +"""""" +type ZendeskSearchResultsConnection { + """Total number of search results""" + totalResults: Int! + + """edges""" + edges: [ZendeskSearchResultsEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +"""The root for Zendesk""" +type ZendeskQuery { + search( + sortOrder: ZendeskSearchSortOrder + sortBy: ZendeskSearchSortBy + status: ZendeskSearchStatus + type: ZendeskSearchType + + """ + The `:` character is the equality operator. Other operators include `<` and `>` , the minus sign `-` , and the wildcard character `*`. [Learn more about the operators](https://support.zendesk.com/hc/en-us/articles/203663226#topic_ngr_frb_vc) + + Double quotes, `""` , are used for search phrases. Only records containing an exact match of the phrase are returned. Note that in GraphiQL you'll need to escape these quotes. + + Date properties such as `created`, `updated`, and `solved` return records for a specific date, on or before a certain date, and on or after a certain date. The date format is `YYYY-MM-DD`. [Learn more about dates](https://support.zendesk.com/hc/en-us/articles/203663226#topic_gbg_dvw_ld). + """ + query: String + last: Int + first: Int + before: String + after: String + ): ZendeskSearchResultsConnection + tickets(sortOrder: ZendeskSearchSortOrder, sortBy: ZendeskTicketsSortBy, last: Int, first: Int, before: String, after: String): ZendeskTicketsConnection + user(id: String!): ZendeskUser +} + +type ZeitCreatorId { + """""" + uid: String +} + +type ZeitDeploymentList { + """ + A string with the unique deployment ID you can use to get more information or remove it. + """ + uid: String + + """A string with the deployment under which the deployment was created.""" + name: String + + """ + A string with the unique URL of the deployment. If it hasn't finished uploading (is incomplete), the value will be null. + """ + url: String + + """ + A number containing the date when the deployment was created (in timestamp). + """ + createdAt: Int + + """A map with the ID of the user who created the deployment.""" + creator: ZeitCreatorId + + """""" + state: ZeitDeploymentReadyState + + """The logs from this ZEIT deployment.""" + logs: [ZeitDeploymentLog!] +} + +enum ZeitServiceTypeEnum { + EXTERNAL + ZEIT_WORLD +} + +type ZeitDomainsList { + """The unique ID of the domain.""" + uid: String + + """The domain name.""" + name: String + + """The date when it was created the registry.""" + createdAt: String + + """If it was purchased through Now the date when it was purchased.""" + boughtAt: String + + """The date when the domain is going to expire and need to be renewed.""" + expiresAt: String + + """If it is an externally handled domain.""" + isExternal: Boolean + + """ + If the domain has the ownership verified. If an external nameserver is used the user must verify the domain name by creating a TXT record for `_now` subdomain containing a verification token provided as a `POST` result. After the record has been created, the user may retry the same `POST` and the endpoint shall return `verified: true`, if the domain was verified succesfully. + """ + verified: Boolean + + """`external` for externally handled domain; `zeit.world` for managed.""" + serviceType: ZeitServiceTypeEnum + + """""" + cdnEnabled: Boolean +} + +type ZeitPriceOfADomain { + """The domain price.""" + price: Int + + """The time period by which the domain is purchased.""" + period: Int +} + +type ZeitDomainAvailabilityStatus { + """If the domain is available or not.""" + available: Boolean +} + +enum ZeitDeploymentReadyState { + INITIALIZING + ANALYZING + BUILDING + DEPLOYING + READY + ERROR +} + +type ZeitSimpleBuild { + """""" + src: String + + """""" + use: String +} + +type ZeitRoute { + """""" + src: String + + """""" + dest: String +} + +enum ZeitRegionEnum { + BRU1 + GRU1 + IAD1 + SFO1 +} + +type ZeitDeploymentFull { + """A String holding the unique ID of the deployment.""" + id: String + + """ + A string with the unique URL of the deployment. If it hasn't finished uploading (is incomplete), the value will be null. + """ + url: String + + """The name of the deployment.""" + name: String + + """The Now platform version the deployment is associated with.""" + version: Int + + """The regions the deployment exists in, e.g. sfo1.""" + regions: [ZeitRegionEnum!] + + """ + A list of routes objects used to rewrite paths to point towards other internal or external paths. For example; [{ "src": "/docs", "dest": "https://docs.zeit.co" }]. + """ + routes: [ZeitRoute!] + + """ + A list of objects containing the Builds for a particular set of sources in the deployment. Each object contains a src and use describing the sources files that use Builds in the deployment. + """ + builds: [ZeitSimpleBuild!] + + """The pricing plan the deployment was made under.""" + plan: String + + """ + A Boolean representing if the deployment is public or not. By default this is false. + """ + public: Boolean + + """The unique ID of the user or team the deployment belongs to.""" + ownerId: String + + """""" + readyState: ZeitDeploymentReadyState + + """ + A number containing the date when the deployment was created in milliseconds. + """ + createdAt: Int + + """The region where the deployment was first created, e.g. sfo1.""" + createdIn: String +} + +type ZeitDeploymentLogPayload { + """""" + serial: String + + """""" + date: Int + + """""" + id: String + + """""" + text: String + + """""" + deploymentId: String + + """ + Retrieve a deployment by its id. Note that if a deployment hasn't finished uploading (is incomplete), the url property will have a value of null. + """ + deployment: ZeitDeploymentFull +} + +enum ZeitLogObjectTypeEnum { + REQUEST + RESPONSE + COMMAND + STDOUT +} + +type ZeitDeploymentLog { + """The date when the log was created.""" + createdAt: Int + + """ + The type of log. The type could be request, response, command or stdout. + """ + type: ZeitLogObjectTypeEnum + + """""" + payload: ZeitDeploymentLogPayload +} + +"""The root for Zeit.""" +type ZeitQuery { + """Logs from a deployment to Zeit.""" + deploymentLogs( + """The deployment id from Zeit.""" + id: String! + ): [ZeitDeploymentLog!] + + """Whether a domain *may* be available""" + domainAvailable( + """The domain name""" + name: String! + ): ZeitDomainAvailabilityStatus + + """Check domain price""" + domainPrice( + """The domain name""" + name: String! + ): ZeitPriceOfADomain + + """ + Retrieves a list of domains registered for the authenticating user. Each domain entry contains an `aliases` array listing every alias associated with the domain. The field `isExternal` is a boolean value telling whether an external nameserver is used to manage DNS records for the domain. + """ + domains: [ZeitDomainsList!] + + """ + List all the deployments under the account corresponding to the API token. If a deployment hasn't finished uploading (is incomplete), the url property will have a value of null. + """ + deployments: [ZeitDeploymentList!]! + + """ + Retrieve a deployment by its id. Note that if a deployment hasn't finished uploading (is incomplete), the url property will have a value of null. + """ + deployment(id: String!): ZeitDeploymentFull +} + +"""""" +type YouTubeLiveStreamConfigurationIssue { + """The long-form description of the issue and how to resolve it.""" + description: String + + """The short-form reason for this issue.""" + reason: String + + """How severe this issue is to the stream.""" + severity: String + + """The kind of error happening.""" + type: String +} + +"""""" +type YouTubeLiveStreamHealthStatus { + """The configurations issues on this stream""" + configurationIssues: [YouTubeLiveStreamConfigurationIssue!] + + """The last time this status was updated (in seconds)""" + lastUpdateTimeSeconds: String + + """The status code of this stream""" + status: String +} + +"""Brief description of the live stream status.""" +type YouTubeLiveStreamStatus { + """The health status of the stream.""" + healthStatus: YouTubeLiveStreamHealthStatus + + """""" + streamStatus: String +} + +"""""" +type YouTubeLiveStreamSnippet { + """ + The ID that YouTube uses to uniquely identify the channel that is transmitting the stream. + """ + channelId: String + + """ + The stream's description. The value cannot be longer than 10000 characters. + """ + description: String + + """""" + isDefaultStream: Boolean + + """ + The date and time that the stream was created. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishedAt: String + + """ + The stream's title. The value must be between 1 and 128 characters long. + """ + title: String +} + +"""Detailed settings of a stream.""" +type YouTubeLiveStreamContentDetails { + """The ingestion URL where the closed captions of this stream are sent.""" + closedCaptionsIngestionUrl: String + + """ + Indicates whether the stream is reusable, which means that it can be bound to multiple broadcasts. It is common for broadcasters to reuse the same stream for many different broadcasts if those broadcasts occur at different times. + + If you set this value to false, then the stream will not be reusable, which means that it can only be bound to one broadcast. Non-reusable streams differ from reusable streams in the following ways: + - A non-reusable stream can only be bound to one broadcast. + - A non-reusable stream might be deleted by an automated process after the broadcast ends. + - The liveStreams.list method does not list non-reusable streams if you call the method and set the mine parameter to true. The only way to use that method to retrieve the resource for a non-reusable stream is to use the id parameter to identify the stream. + """ + isReusable: Boolean +} + +""" +Describes information necessary for ingesting an RTMP or an HTTP stream. +""" +type YouTubeIngestionInfo { + """ + The backup ingestion URL that you should use to stream video to YouTube. You have the option of simultaneously streaming the content that you are sending to the ingestionAddress to this URL. + """ + backupIngestionAddress: String + + """ + The primary ingestion URL that you should use to stream video to YouTube. You must stream video to this URL. + + Depending on which application or tool you use to encode your video stream, you may need to enter the stream URL and stream name separately or you may need to concatenate them in the following format: + + STREAM_URL/STREAM_NAME + """ + ingestionAddress: String + + """The HTTP or RTMP stream name that YouTube assigns to the video stream.""" + streamName: String +} + +"""Brief description of the live stream cdn settings.""" +type YouTubeCdnSettings { + """The format of the video stream that you are sending to Youtube.""" + format: String + + """The frame rate of the inbound video data.""" + frameRate: String + + """ + The ingestionInfo object contains information that YouTube provides that you need to transmit your RTMP or HTTP stream to YouTube. + """ + ingestionInfo: YouTubeIngestionInfo + + """The method or protocol used to transmit the video stream.""" + ingestionType: String + + """The resolution of the inbound video data.""" + resolution: String +} + +"""A live stream describes a live ingestion point.""" +type YouTubeLiveStream { + """ + The cdn object defines the live stream's content delivery network (CDN) settings. These settings provide details about the manner in which you stream your content to YouTube. + """ + cdn: YouTubeCdnSettings + + """ + The content_details object contains information about the stream, including the closed captions ingestion URL. + """ + contentDetails: YouTubeLiveStreamContentDetails + + """Etag of this resource.""" + etag: String + + """The ID that YouTube assigns to uniquely identify the stream.""" + id: String + + """ + Identifies what kind of resource this is. Value: the fixed string "youtube#liveStream". + """ + kind: String + + """ + The snippet object contains basic details about the stream, including its channel, title, and description. + """ + snippet: YouTubeLiveStreamSnippet + + """The status object contains information about live stream's status.""" + status: YouTubeLiveStreamStatus +} + +"""""" +type YouTubeLiveStreamListResponse { + """""" + tokenPagination: String + + """The visitorId identifies the visitor.""" + visitorId: String + + """""" + pageInfo: YouTubePageInfo + + """A list of live streams that match the request criteria.""" + items: [YouTubeLiveStream!] + + """Etag of this resource.""" + etag: String + + """ + Identifies what kind of resource this is. Value: the fixed string "youtube#liveStreamListResponse". + """ + kind: String + + """ + The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set. + """ + nextPageToken: String + + """ + The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set. + """ + prevPageToken: String + + """Serialized EventId of the request which produced this response.""" + eventId: String +} + +"""""" +type YouTubeLiveBroadcastStatus { + """ + The broadcast's status. The status can be updated using the API's liveBroadcasts.transition method. + """ + lifeCycleStatus: String + + """Priority of the live broadcast event (internal state).""" + liveBroadcastPriority: String + + """ + The broadcast's privacy status. Note that the broadcast represents exactly one YouTube video, so the privacy settings are identical to those supported for videos. In addition, you can set this field by modifying the broadcast resource or by setting the privacyStatus field of the corresponding video resource. + """ + privacyStatus: String + + """The broadcast's recording status.""" + recordingStatus: String +} + +""" +Statistics about the live broadcast. These represent a snapshot of the values at the time of the request. Statistics are only returned for live broadcasts. +""" +type YouTubeLiveBroadcastStatistics { + """ + The number of viewers currently watching the broadcast. The property and its value will be present if the broadcast has current viewers and the broadcast owner has not hidden the viewcount for the video. Note that YouTube stops tracking the number of concurrent viewers for a broadcast when the broadcast ends. So, this property would not identify the number of viewers watching an archived video of a live broadcast that already ended. + """ + concurrentViewers: String + + """ + The total number of live chat messages currently on the broadcast. The property and its value will be present if the broadcast is public, has the live chat feature enabled, and has at least one message. Note that this field will not be filled after the broadcast ends. So this property would not identify the number of chat messages for an archived video of a completed live broadcast. + """ + totalChatCount: String +} + +"""""" +type YouTubeLiveBroadcastSnippet { + """The id of the live chat for this broadcast.""" + liveChatId: String + + """""" + isDefaultBroadcast: Boolean + + """ + A map of thumbnail images associated with the broadcast. For each nested object in this object, the key is the name of the thumbnail image, and the value is an object that contains other information about the thumbnail. + """ + thumbnails: YouTubeThumbnailDetails + + """ + The ID that YouTube uses to uniquely identify the channel that is publishing the broadcast. + """ + channelId: String + + """ + The date and time that the broadcast is scheduled to end. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + scheduledEndTime: String + + """ + The broadcast's title. Note that the broadcast represents exactly one YouTube video. You can set this field by modifying the broadcast resource or by setting the title field of the corresponding video resource. + """ + title: String + + """ + The date and time that the broadcast actually ended. This information is only available once the broadcast's state is complete. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + actualEndTime: String + + """ + The broadcast's description. As with the title, you can set this field by modifying the broadcast resource or by setting the description field of the corresponding video resource. + """ + description: String + + """ + The date and time that the broadcast is scheduled to start. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + scheduledStartTime: String + + """ + The date and time that the broadcast actually started. This information is only available once the broadcast's state is live. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + actualStartTime: String + + """ + The date and time that the broadcast was added to YouTube's live broadcast schedule. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishedAt: String +} + +"""Settings and Info of the monitor stream""" +type YouTubeMonitorStreamInfo { + """ + If you have set the enableMonitorStream property to true, then this property determines the length of the live broadcast delay. + """ + broadcastStreamDelayMs: Int + + """HTML code that embeds a player that plays the monitor stream.""" + embedHtml: String + + """ + This value determines whether the monitor stream is enabled for the broadcast. If the monitor stream is enabled, then YouTube will broadcast the event content on a special stream intended only for the broadcaster's consumption. The broadcaster can use the stream to review the event content and also to identify the optimal times to insert cuepoints. + + You need to set this value to true if you intend to have a broadcast delay for your event. + + Note: This property cannot be updated once the broadcast is in the testing or live state. + """ + enableMonitorStream: Boolean +} + +"""Detailed settings of a broadcast.""" +type YouTubeLiveBroadcastContentDetails { + """""" + stereoLayout: String + + """ + This setting determines whether viewers can access DVR controls while watching the video. DVR controls enable the viewer to control the video playback experience by pausing, rewinding, or fast forwarding content. The default value for this property is true. + + + + Important: You must set the value to true and also set the enableArchive property's value to true if you want to make playback available immediately after the broadcast ends. + """ + enableDvr: Boolean + + """ + The date and time that the live stream referenced by boundStreamId was last updated. + """ + boundStreamLastUpdateTimeMs: String + + """ + If both this and enable_low_latency are set, they must match. LATENCY_NORMAL should match enable_low_latency=false LATENCY_LOW should match enable_low_latency=true LATENCY_ULTRA_LOW should have enable_low_latency omitted. + """ + latencyPreference: String + + """ + This setting indicates whether the broadcast should automatically begin with an in-stream slate when you update the broadcast's status to live. After updating the status, you then need to send a liveCuepoints.insert request that sets the cuepoint's eventState to end to remove the in-stream slate and make your broadcast stream visible to viewers. + """ + startWithSlate: Boolean + + """ + This setting indicates whether YouTube should enable content encryption for the broadcast. + """ + enableContentEncryption: Boolean + + """ + The monitorStream object contains information about the monitor stream, which the broadcaster can use to review the event content before the broadcast stream is shown publicly. + """ + monitorStream: YouTubeMonitorStreamInfo + + """ + This setting indicates whether the broadcast video can be played in an embedded player. If you choose to archive the video (using the enableArchive property), this setting will also apply to the archived video. + """ + enableEmbed: Boolean + + """ + Automatically start recording after the event goes live. The default value for this property is true. + + + + Important: You must also set the enableDvr property's value to true if you want the playback to be available immediately after the broadcast ends. If you set this property's value to true but do not also set the enableDvr property to true, there may be a delay of around one day before the archived video will be available for playback. + """ + recordFromStart: Boolean + + """""" + closedCaptionsType: String + + """This value uniquely identifies the live stream bound to the broadcast.""" + boundStreamId: String + + """Indicates whether this broadcast has low latency enabled.""" + enableLowLatency: Boolean + + """""" + mesh: String + + """The projection format of this broadcast. This defaults to rectangular.""" + projection: String + + """ + This setting indicates whether auto start is enabled for this broadcast. + """ + enableAutoStart: Boolean + + """ + This setting indicates whether HTTP POST closed captioning is enabled for this broadcast. The ingestion URL of the closed captions is returned through the liveStreams API. This is mutually exclusive with using the closed_captions_type property, and is equivalent to setting closed_captions_type to CLOSED_CAPTIONS_HTTP_POST. + """ + enableClosedCaptions: Boolean +} + +""" +A liveBroadcast resource represents an event that will be streamed, via live video, on YouTube. +""" +type YouTubeLiveBroadcast { + """ + The contentDetails object contains information about the event's video content, such as whether the content can be shown in an embedded video player or if it will be archived and therefore available for viewing after the event has concluded. + """ + contentDetails: YouTubeLiveBroadcastContentDetails + + """Etag of this resource.""" + etag: String + + """The ID that YouTube assigns to uniquely identify the broadcast.""" + id: String + + """ + Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcast". + """ + kind: String + + """ + The snippet object contains basic details about the event, including its title, description, start time, and end time. + """ + snippet: YouTubeLiveBroadcastSnippet + + """ + The statistics object contains info about the event's current stats. These include concurrent viewers and total chat count. Statistics can change (in either direction) during the lifetime of an event. Statistics are only returned while the event is live. + """ + statistics: YouTubeLiveBroadcastStatistics + + """The status object contains information about the event's status.""" + status: YouTubeLiveBroadcastStatus +} + +"""""" +type YouTubeLiveBroadcastListResponse { + """""" + tokenPagination: String + + """The visitorId identifies the visitor.""" + visitorId: String + + """""" + pageInfo: YouTubePageInfo + + """A list of broadcasts that match the request criteria.""" + items: [YouTubeLiveBroadcast!] + + """Etag of this resource.""" + etag: String + + """ + Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcastListResponse". + """ + kind: String + + """ + The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set. + """ + nextPageToken: String + + """ + The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set. + """ + prevPageToken: String + + """Serialized EventId of the request which produced this response.""" + eventId: String +} + +"""""" +type YouTubeLiveChatPollEditedDetails { + """""" + id: String + + """""" + items: [YouTubeLiveChatPollItem!] + + """""" + prompt: String +} + +"""""" +type YouTubeChannelProfileDetails { + """The YouTube channel ID.""" + channelId: String + + """The channel's URL.""" + channelUrl: String + + """The channel's display name.""" + displayName: String + + """The channels's avatar URL.""" + profileImageUrl: String +} + +"""""" +type YouTubeLiveChatUserBannedMessageDetails { + """ + The duration of the ban. This property is only present if the banType is temporary. + """ + banDurationSeconds: String + + """The type of ban.""" + banType: String + + """The details of the user that was banned.""" + bannedUserDetails: YouTubeChannelProfileDetails +} + +"""""" +type YouTubeLiveChatPollClosedDetails { + """The id of the poll that was closed.""" + pollId: String +} + +"""""" +type YouTubeLiveChatPollItem { + """Plain text description of the item.""" + description: String + + """""" + itemId: String +} + +"""""" +type YouTubeLiveChatPollOpenedDetails { + """""" + id: String + + """""" + items: [YouTubeLiveChatPollItem!] + + """""" + prompt: String +} + +"""""" +type YouTubeLiveChatMessageDeletedDetails { + """""" + deletedMessageId: String +} + +"""""" +type YouTubeLiveChatFanFundingEventDetails { + """ + A rendered string that displays the fund amount and currency to the user. + """ + amountDisplayString: String + + """The amount of the fund.""" + amountMicros: String + + """The currency in which the fund was made.""" + currency: String + + """The comment added by the user to this fan funding event.""" + userComment: String +} + +"""""" +type YouTubeLiveChatPollVotedDetails { + """The poll item the user chose.""" + itemId: String + + """The poll the user voted on.""" + pollId: String +} + +"""""" +type YouTubeLiveChatTextMessageDetails { + """The user's message.""" + messageText: String +} + +"""""" +type YouTubeLiveChatSuperChatDetails { + """ + A rendered string that displays the fund amount and currency to the user. + """ + amountDisplayString: String + + """The amount purchased by the user, in micros (1,750,000 micros = 1.75).""" + amountMicros: String + + """The currency in which the purchase was made.""" + currency: String + + """ + The tier in which the amount belongs to. Lower amounts belong to lower tiers. Starts at 1. + """ + tier: Int + + """The comment added by the user to this Super Chat event.""" + userComment: String +} + +"""""" +type YouTubeLiveChatMessageRetractedDetails { + """""" + retractedMessageId: String +} + +"""""" +type YouTubeLiveChatMessageSnippet { + """""" + messageRetractedDetails: YouTubeLiveChatMessageRetractedDetails + + """ + Details about the Super Chat event, this is only set if the type is 'superChatEvent'. + """ + superChatDetails: YouTubeLiveChatSuperChatDetails + + """""" + liveChatId: String + + """ + Details about the text message, this is only set if the type is 'textMessageEvent'. + """ + textMessageDetails: YouTubeLiveChatTextMessageDetails + + """ + Contains a string that can be displayed to the user. If this field is not present the message is silent, at the moment only messages of type TOMBSTONE and CHAT_ENDED_EVENT are silent. + """ + displayMessage: String + + """""" + pollVotedDetails: YouTubeLiveChatPollVotedDetails + + """ + Details about the funding event, this is only set if the type is 'fanFundingEvent'. + """ + fanFundingEventDetails: YouTubeLiveChatFanFundingEventDetails + + """""" + messageDeletedDetails: YouTubeLiveChatMessageDeletedDetails + + """ + The type of message, this will always be present, it determines the contents of the message as well as which fields will be present. + """ + type: String + + """ + The ID of the user that authored this message, this field is not always filled. textMessageEvent - the user that wrote the message fanFundingEvent - the user that funded the broadcast newSponsorEvent - the user that just became a sponsor messageDeletedEvent - the moderator that took the action messageRetractedEvent - the author that retracted their message userBannedEvent - the moderator that took the action superChatEvent - the user that made the purchase + """ + authorChannelId: String + + """""" + pollOpenedDetails: YouTubeLiveChatPollOpenedDetails + + """""" + pollClosedDetails: YouTubeLiveChatPollClosedDetails + + """""" + userBannedDetails: YouTubeLiveChatUserBannedMessageDetails + + """ + Whether the message has display content that should be displayed to users. + """ + hasDisplayContent: Boolean + + """""" + pollEditedDetails: YouTubeLiveChatPollEditedDetails + + """ + The date and time when the message was orignally published. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishedAt: String +} + +"""""" +type YouTubeLiveChatMessageAuthorDetails { + """The YouTube channel ID.""" + channelId: String + + """The channel's URL.""" + channelUrl: String + + """The channel's display name.""" + displayName: String + + """Whether the author is a moderator of the live chat.""" + isChatModerator: Boolean + + """Whether the author is the owner of the live chat.""" + isChatOwner: Boolean + + """Whether the author is a sponsor of the live chat.""" + isChatSponsor: Boolean + + """Whether the author's identity has been verified by YouTube.""" + isVerified: Boolean + + """The channels's avatar URL.""" + profileImageUrl: String +} + +""" +A liveChatMessage resource represents a chat message in a YouTube Live Chat. +""" +type YouTubeLiveChatMessage { + """ + The authorDetails object contains basic details about the user that posted this message. + """ + authorDetails: YouTubeLiveChatMessageAuthorDetails + + """Etag of this resource.""" + etag: String + + """The ID that YouTube assigns to uniquely identify the message.""" + id: String + + """ + Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessage". + """ + kind: String + + """The snippet object contains basic details about the message.""" + snippet: YouTubeLiveChatMessageSnippet +} + +""" +Paging details for lists of resources, including total number of items available and number of resources returned in a single page. +""" +type YouTubePageInfo { + """The number of results included in the API response.""" + resultsPerPage: Int + + """The total number of results in the result set.""" + totalResults: Int +} + +"""""" +type YouTubeLiveChatMessageListResponse { + """ + The date and time when the underlying stream went offline. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + offlineAt: String + + """The amount of time the client should wait before polling again.""" + pollingIntervalMillis: Int + + """""" + tokenPagination: String + + """The visitorId identifies the visitor.""" + visitorId: String + + """""" + pageInfo: YouTubePageInfo + + """A list of live chat messages.""" + items: [YouTubeLiveChatMessage!] + + """Etag of this resource.""" + etag: String + + """ + Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessageListResponse". + """ + kind: String + + """ + The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set. + """ + nextPageToken: String + + """Serialized EventId of the request which produced this response.""" + eventId: String +} + +type YoutubeSearchNodeSnippet { + """The publishing time of the search ideam""" + publishedAtTs: String + + """ + The video published time in milliseconds since the epoch. See publishedAtTs for notes on the special cases for this field + """ + publishedAtMs: Int + + """The channelId of the search item""" + channelId: String + + """The title of the search item""" + title: String + + """The description of the search item""" + description: String + + """The thumbnails of the search item""" + thumbnails: YoutubeThumbnails + + """The channelTitle of the search item""" + channelTitle: String + + """TODO""" + liveBroadcastContent: String +} + +type YoutubeSearchNode { + """The search node kind""" + kind: String + + """The expiration for this node's information""" + etag: String + + """The search node item snippet""" + snippet: YoutubeSearchNodeSnippet + + """The search node item kind""" + itemKind: String + + """Id information about the search node item""" + id: String +} + +type YoutubeEdge { + """Information about current page in pagination""" + node: YoutubeSearchNode! +} + +type YoutubeVideoSearchItemContainer { + """Total number of search results returned""" + totalCount: Int + + """Information about current page in pagination""" + pageInfo: YoutubePageInfo! + + """Connection between items and nodes""" + edges: [YoutubeEdge!] +} + +type YoutubeVideoSearchResult { + """ + Identifies the API resource's type. The value will be youtube#searchListResponse. + """ + kind: String + + """The Etag of this resource.""" + etag: String + + """ + The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set. + """ + nextPageToken: String + + """ + The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set. + """ + prevPageToken: String + + """ + The pageInfo object encapsulates paging information for the result set. + + """ + pageInfo: YoutubePageInfo! + + """ + The region code that was used for the search query. The property value is a two-letter ISO country code that identifies the region. The i18nRegions.list method returns a list of supported regions. The default value is US. If a non-supported region is specified, Youtube might still select another region, rather than the default value, to handle the query. + """ + regionCode: String + + """A list of results that match the search criteria.""" + items: YoutubeVideoSearchItemContainer! +} + +"""Information about the playlist item's privacy status.""" +type YouTubePlaylistItemStatus { + """This resource's privacy status.""" + privacyStatus: String +} + +""" +A resource id is a generic reference that points to another YouTube resource. +""" +type YouTubeResourceId { + """ + The ID that YouTube uses to uniquely identify the referred resource, if that resource is a channel. This property is only present if the resourceId.kind value is youtube#channel. + """ + channelId: String + + """The type of the API resource.""" + kind: String + + """ + The ID that YouTube uses to uniquely identify the referred resource, if that resource is a playlist. This property is only present if the resourceId.kind value is youtube#playlist. + """ + playlistId: String + + """ + The ID that YouTube uses to uniquely identify the referred resource, if that resource is a video. This property is only present if the resourceId.kind value is youtube#video. + """ + videoId: String +} + +""" +Basic details about a playlist, including title, description and thumbnails. +""" +type YouTubePlaylistItemSnippet { + """ + The id object contains information that can be used to uniquely identify the resource that is included in the playlist as the playlist item. + """ + resourceId: YouTubeResourceId + + """ + The ID that YouTube uses to uniquely identify the playlist that the playlist item is in. + """ + playlistId: String + + """ + A map of thumbnail images associated with the playlist item. For each object in the map, the key is the name of the thumbnail image, and the value is an object that contains other information about the thumbnail. + """ + thumbnails: YouTubeThumbnailDetails + + """ + The order in which the item appears in the playlist. The value uses a zero-based index, so the first item has a position of 0, the second item has a position of 1, and so forth. + """ + position: Int + + """Channel title for the channel that the playlist item belongs to.""" + channelTitle: String + + """ + The ID that YouTube uses to uniquely identify the user that added the item to the playlist. + """ + channelId: String + + """The item's title.""" + title: String + + """The item's description.""" + description: String + + """ + The date and time that the item was added to the playlist. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishedAt: String +} + +"""Basic details about a caption track, such as its language and name.""" +type YouTubeCaptionSnippet { + """ + Indicates whether the caption track uses large text for the vision-impaired. The default value is false. + """ + isLarge: Boolean + + """ + Indicates whether caption track is formatted for "easy reader," meaning it is at a third-grade level for language learners. The default value is false. + """ + isEasyReader: Boolean + + """The type of audio track associated with the caption track.""" + audioTrackType: String + + """ + The ID that YouTube uses to uniquely identify the video associated with the caption track. + """ + videoId: String + + """ + The date and time when the caption track was last updated. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + lastUpdated: String + + """ + Indicates whether the caption track is a draft. If the value is true, then the track is not publicly visible. The default value is false. + """ + isDraft: Boolean + + """ + The name of the caption track. The name is intended to be visible to the user as an option during playback. + """ + name: String + + """The caption track's status.""" + status: String + + """ + Indicates whether the track contains closed captions for the deaf and hard of hearing. The default value is false. + """ + isCC: Boolean + + """ + The reason that YouTube failed to process the caption track. This property is only present if the state property's value is failed. + """ + failureReason: String + + """The caption track's type.""" + trackKind: String + + """ + Indicates whether YouTube synchronized the caption track to the audio track in the video. The value will be true if a sync was explicitly requested when the caption track was uploaded. For example, when calling the captions.insert or captions.update methods, you can set the sync parameter to true to instruct YouTube to sync the uploaded track to the video. If the value is false, YouTube uses the time codes in the uploaded caption track to determine when to display captions. + """ + isAutoSynced: Boolean + + """ + The language of the caption track. The property value is a BCP-47 language tag. + """ + language: String +} + +""" +A caption resource represents a YouTube caption track. A caption track is associated with exactly one YouTube video. +""" +type YouTubeCaption { + """Etag of this resource.""" + etag: String + + """The ID that YouTube uses to uniquely identify the caption track.""" + id: String + + """ + Identifies what kind of resource this is. Value: the fixed string "youtube#caption". + """ + kind: String + + """The snippet object contains basic details about the caption.""" + snippet: YouTubeCaptionSnippet + + """Text of the caption track""" + body( + """ + The tfmt parameter specifies that the caption track should be returned in a specific format. If the parameter is not included in the request, the track is returned in its original format. + + Supported values are: + + sbv – SubViewer subtitle + + scc – Scenarist Closed Caption format + + srt – SubRip subtitle + + ttml – Timed Text Markup Language caption + + vtt – Web Video Text Tracks caption + + """ + tfmt: String + ): String +} + +"""""" +type YouTubeCaptionListResponse { + """Etag of this resource.""" + etag: String + + """Serialized EventId of the request which produced this response.""" + eventId: String + + """A list of captions that match the request criteria.""" + items: [YouTubeCaption!] + + """ + Identifies what kind of resource this is. Value: the fixed string "youtube#captionListResponse". + """ + kind: String + + """The visitorId identifies the visitor.""" + visitorId: String +} + +"""Video processing progress and completion time estimate.""" +type YouTubeVideoProcessingDetailsProcessingProgress { + """ + The number of parts of the video that YouTube has already processed. You can estimate the percentage of the video that YouTube has already processed by calculating: + 100 * parts_processed / parts_total + + Note that since the estimated number of parts could increase without a corresponding increase in the number of parts that have already been processed, it is possible that the calculated progress could periodically decrease while YouTube processes a video. + """ + partsProcessed: String + + """ + An estimate of the total number of parts that need to be processed for the video. The number may be updated with more precise estimates while YouTube processes the video. + """ + partsTotal: String + + """ + An estimate of the amount of time, in millseconds, that YouTube needs to finish processing the video. + """ + timeLeftMs: String +} + +""" +Describes processing status and progress and availability of some other Video resource parts. +""" +type YouTubeVideoProcessingDetails { + """ + This value indicates whether video editing suggestions, which might improve video quality or the playback experience, are available for the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request. + """ + editorSuggestionsAvailability: String + + """ + This value indicates whether file details are available for the uploaded video. You can retrieve a video's file details by requesting the fileDetails part in your videos.list() request. + """ + fileDetailsAvailability: String + + """ + The reason that YouTube failed to process the video. This property will only have a value if the processingStatus property's value is failed. + """ + processingFailureReason: String + + """ + This value indicates whether the video processing engine has generated suggestions that might improve YouTube's ability to process the the video, warnings that explain video processing problems, or errors that cause video processing problems. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request. + """ + processingIssuesAvailability: String + + """ + The processingProgress object contains information about the progress YouTube has made in processing the video. The values are really only relevant if the video's processing status is processing. + """ + processingProgress: YouTubeVideoProcessingDetailsProcessingProgress + + """ + The video's processing status. This value indicates whether YouTube was able to process the video or if the video is still being processed. + """ + processingStatus: String + + """ + This value indicates whether keyword (tag) suggestions are available for the video. Tags can be added to a video's metadata to make it easier for other users to find the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request. + """ + tagSuggestionsAvailability: String + + """ + This value indicates whether thumbnail images have been generated for the video. + """ + thumbnailsAvailability: String +} + +""" +Ratings schemes. The country-specific ratings are mostly for movies and shows. NEXT_ID: 71 +""" +type YouTubeContentRating { + """The video's Canadian Home Video Rating System (CHVRS) rating.""" + chvrsRating: String + + """The rating system for MENA countries, a clone of MPAA. It is needed to""" + menaMpaaRating: String + + """ + The video's INCAA (Instituto Nacional de Cine y Artes Audiovisuales - Argentina) rating. + """ + incaaRating: String + + """The video's Central Board of Film Certification (CBFC - India) rating.""" + cbfcRating: String + + """The video's Consejo de Calificación Cinematográfica (Chile) rating.""" + cccRating: String + + """ + The video's rating from the Hungarian Nemzeti Filmiroda, the Rating Committee of the National Office of Film. + """ + rcnofRating: String + + """ + The rating system for trailer, DVD, and Ad in the US. See http://movielabs.com/md/ratings/v2.3/html/US_MPAAT_Ratings.html. + """ + mpaatRating: String + + """ + The video's rating from Romania's CONSILIUL NATIONAL AL AUDIOVIZUALULUI (CNA). + """ + cnaRating: String + + """The video's rating in Peru.""" + pefilmRating: String + + """ + The video's rating from the Canadian Radio-Television and Telecommunications Commission (CRTC) for Canadian French-language broadcasts. For more information, see the Canadian Broadcast Standards Council website. + """ + catvfrRating: String + + """ + Reasons that explain why the video received its FPB (South Africa) rating. + """ + fpbRatingReasons: [String!] + + """The video's TV Parental Guidelines (TVPG) rating.""" + tvpgRating: String + + """ + The video's rating from Italy's Autorità per le Garanzie nelle Comunicazioni (AGCOM). + """ + agcomRating: String + + """ + The video's General Directorate of Radio, Television and Cinematography (Mexico) rating. + """ + rtcRating: String + + """ + Rating system for Canadian TV - Canadian TV Classification System The video's rating from the Canadian Radio-Television and Telecommunications Commission (CRTC) for Canadian English-language broadcasts. For more information, see the Canadian Broadcast Standards Council website. + """ + catvRating: String + + """ + Rating system in France - Commission de classification cinematographique + """ + cncRating: String + + """ + The video's rating from Hong Kong's Office for Film, Newspaper and Article Administration. + """ + fcoRating: String + + """ + The video's rating from Statens medieråd (Sweden's National Media Council). + """ + smsaRating: String + + """The video's rating in Switzerland.""" + chfilmRating: String + + """The video's Ministerio de Cultura (Colombia) rating.""" + mocRating: String + + """A rating that YouTube uses to identify age-restricted content.""" + ytRating: String + + """The video's rating from Taiwan's Ministry of Culture (文化部).""" + moctwRating: String + + """ + The video's Korea Media Rating Board (영상물등급위원회) rating. The KMRB rates videos in South Korea. + """ + kmrbRating: String + + """ + The video's rating from Finland's Kansallinen Audiovisuaalinen Instituutti (National Audiovisual Institute). + """ + mekuRating: String + + """ + The video's rating from France's Conseil supérieur de l?audiovisuel, which rates broadcast content. + """ + csaRating: String + + """ + The video's rating from Singapore's Media Development Authority (MDA) and, specifically, it's Board of Film Censors (BFC). + """ + mdaRating: String + + """The video's rating from Indonesia's Lembaga Sensor Film.""" + lsfRating: String + + """ + This property has been deprecated. Use the contentDetails.contentRating.cncRating instead. + """ + fmocRating: String + + """Reasons that explain why the video received its DJCQT (Brazil) rating.""" + djctqRatingReasons: [String!] + + """The video's Motion Picture Association of America (MPAA) rating.""" + mpaaRating: String + + """ + The video's rating from the Danish Film Institute's (Det Danske Filminstitut) Media Council for Children and Young People. + """ + mccypRating: String + + """The video's rating from the Kenya Film Classification Board.""" + kfcbRating: String + + """ + The video's Departamento de Justiça, Classificação, Qualificação e Títulos (DJCQT - Brazil) rating. + """ + djctqRating: String + + """ + The video's rating from Portugal's Comissão de Classificação de Espect´culos. + """ + cceRating: String + + """The video's rating in Slovakia.""" + skfilmRating: String + + """ + The video's rating from the Movie and Television Review and Classification Board (Philippines). + """ + mtrcbRating: String + + """ + The video's Irish Film Classification Office (IFCO - Ireland) rating. See the IFCO website for more information. + """ + ifcoRating: String + + """The video's rating in Greece.""" + grfilmRating: String + + """ + The video's rating from Nigeria's National Film and Video Censors Board. + """ + nfvcbRating: String + + """The video's rating from the Bulgarian National Film Center.""" + nfrcRating: String + + """ + The video's rating from the Ministero dei Beni e delle Attività Culturali e del Turismo (Italy). + """ + mibacRating: String + + """ + Rating system in Turkey - Evaluation and Classification Board of the Ministry of Culture and Tourism + """ + ecbmctRating: String + + """The video's rating in Israel.""" + ilfilmRating: String + + """ + The video's rating from the Commission de Contrôle des Films (Belgium). + """ + cicfRating: String + + """ + The video's rating from the Austrian Board of Media Classification (Bundesministerium für Unterricht, Kunst und Kultur). + """ + bmukkRating: String + + """The video's rating in Venezuela.""" + resorteviolenciaRating: String + + """The video's rating from South Africa's Film and Publication Board.""" + fpbRating: String + + """ + The video's Office of Film and Literature Classification (OFLC - New Zealand) rating. + """ + oflcRating: String + + """The video's rating in Egypt.""" + egfilmRating: String + + """The video's rating system for Vietnam - MCST""" + mcstRating: String + + """ + The video's Australian Classification Board (ACB) or Australian Communications and Media Authority (ACMA) rating. ACMA ratings are used to classify children's television programming. + """ + acbRating: String + + """The video's rating in the Czech Republic.""" + czfilmRating: String + + """ + The video's rating from Luxembourg's Commission de surveillance de la classification des films (CSCF). + """ + cscfRating: String + + """ + The video's rating from the Nacionãlais Kino centrs (National Film Centre of Latvia). + """ + nkclvRating: String + + """The video's rating in Estonia.""" + eefilmRating: String + + """The video's rating in Poland.""" + nbcplRating: String + + """The video's rating from Malaysia's Film Censorship Board.""" + fcbmRating: String + + """The video's British Board of Film Classification (BBFC) rating.""" + bbfcRating: String + + """ + The video's rating from the Maldives National Bureau of Classification. + """ + nbcRating: String + + """The video's rating from Thailand's Board of Film and Video Censors.""" + bfvcRating: String + + """ + The video's Instituto de la Cinematografía y de las Artes Audiovisuales (ICAA - Spain) rating. + """ + icaaRating: String + + """The video's rating from Malta's Film Age-Classification Board.""" + mccaaRating: String + + """The video's Eirin (映倫) rating. Eirin is the Japanese rating system.""" + eirinRating: String + + """The video's rating in Iceland.""" + smaisRating: String + + """ + The video's Anatel (Asociación Nacional de Televisión) rating for Chilean television. + """ + anatelRating: String + + """ + The video's National Film Registry of the Russian Federation (MKRF - Russia) rating. + """ + russiaRating: String + + """ + The video's Freiwillige Selbstkontrolle der Filmwirtschaft (FSK - Germany) rating. + """ + fskRating: String + + """The video's rating from Ireland's Raidió Teilifís Éireann.""" + rteRating: String + + """The video's rating from Medietilsynet, the Norwegian Media Authority.""" + medietilsynetRating: String + + """voor de Classificatie van Audiovisuele Media (Netherlands).""" + kijkwijzerRating: String +} + +"""DEPRECATED Region restriction of the video.""" +type YouTubeVideoContentDetailsRegionRestriction { + """ + A list of region codes that identify countries where the video is viewable. If this property is present and a country is not listed in its value, then the video is blocked from appearing in that country. If this property is present and contains an empty list, the video is blocked in all countries. + """ + allowed: [String!] + + """ + A list of region codes that identify countries where the video is blocked. If this property is present and a country is not listed in its value, then the video is viewable in that country. If this property is present and contains an empty list, the video is viewable in all countries. + """ + blocked: [String!] +} + +"""Details about the content of a YouTube Video.""" +type YouTubeVideoContentDetails { + """ + The countryRestriction object contains information about the countries where a video is (or is not) viewable. + """ + countryRestriction: YouTubeAccessPolicy + + """ + The value of is_license_content indicates whether the video is licensed content. + """ + licensedContent: Boolean + + """ + The value of definition indicates whether the video is available in high definition or only in standard definition. + """ + definition: String + + """ + The length of the video. The tag value is an ISO 8601 duration in the format PT#M#S, in which the letters PT indicate that the value specifies a period of time, and the letters M and S refer to length in minutes and seconds, respectively. The # characters preceding the M and S letters are both integers that specify the number of minutes (or seconds) of the video. For example, a value of PT15M51S indicates that the video is 15 minutes and 51 seconds long. + """ + duration: String + + """Specifies the projection format of the video.""" + projection: String + + """ + Indicates whether the video uploader has provided a custom thumbnail image for the video. This property is only visible to the video uploader. + """ + hasCustomThumbnail: Boolean + + """The value of captions indicates whether the video has captions or not.""" + caption: String + + """ + The value of dimension indicates whether the video is available in 3D or in 2D. + """ + dimension: String + + """ + The regionRestriction object contains information about the countries where a video is (or is not) viewable. The object will contain either the contentDetails.regionRestriction.allowed property or the contentDetails.regionRestriction.blocked property. + """ + regionRestriction: YouTubeVideoContentDetailsRegionRestriction + + """ + Specifies the ratings that the video received under various rating schemes. + """ + contentRating: YouTubeContentRating +} + +"""""" +type YouTubeVideoAgeGating { + """ + Indicates whether or not the video has alcoholic beverage content. Only users of legal purchasing age in a particular country, as identified by ICAP, can view the content. + """ + alcoholContent: Boolean + + """ + Age-restricted trailers. For redband trailers and adult-rated video-games. Only users aged 18+ can view the content. The the field is true the content is restricted to viewers aged 18+. Otherwise The field won't be present. + """ + restricted: Boolean + + """Video game rating, if any.""" + videoGameRating: String +} + +"""A single tag suggestion with it's relevance information.""" +type YouTubeVideoSuggestionsTagSuggestion { + """ + A set of video categories for which the tag is relevant. You can use this information to display appropriate tag suggestions based on the video category that the video uploader associates with the video. By default, tag suggestions are relevant for all categories if there are no restricts defined for the keyword. + """ + categoryRestricts: [String!] + + """The keyword tag suggested for the video.""" + tag: String +} + +""" +Specifies suggestions on how to improve video content, including encoding hints, tag suggestions, and editor suggestions. +""" +type YouTubeVideoSuggestions { + """ + A list of video editing operations that might improve the video quality or playback experience of the uploaded video. + """ + editorSuggestions: [String!] + + """ + A list of errors that will prevent YouTube from successfully processing the uploaded video video. These errors indicate that, regardless of the video's current processing status, eventually, that status will almost certainly be failed. + """ + processingErrors: [String!] + + """ + A list of suggestions that may improve YouTube's ability to process the video. + """ + processingHints: [String!] + + """ + A list of reasons why YouTube may have difficulty transcoding the uploaded video or that might result in an erroneous transcoding. These warnings are generated before YouTube actually processes the uploaded video file. In addition, they identify issues that are unlikely to cause the video processing to fail but that might cause problems such as sync issues, video artifacts, or a missing audio track. + """ + processingWarnings: [String!] + + """ + A list of keyword tags that could be added to the video's metadata to increase the likelihood that users will locate your video when searching or browsing on YouTube. + """ + tagSuggestions: [YouTubeVideoSuggestionsTagSuggestion!] +} + +"""Details about the live streaming metadata.""" +type YouTubeVideoLiveStreamingDetails { + """ + The ID of the currently active live chat attached to this video. This field is filled only if the video is a currently live broadcast that has live chat. Once the broadcast transitions to complete this field will be removed and the live chat closed down. For persistent broadcasts that live chat id will no longer be tied to this video but rather to the new video being displayed at the persistent page. + """ + activeLiveChatId: String + + """ + The time that the broadcast actually ended. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. This value will not be available until the broadcast is over. + """ + actualEndTime: String + + """ + The time that the broadcast actually started. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. This value will not be available until the broadcast begins. + """ + actualStartTime: String + + """ + The number of viewers currently watching the broadcast. The property and its value will be present if the broadcast has current viewers and the broadcast owner has not hidden the viewcount for the video. Note that YouTube stops tracking the number of concurrent viewers for a broadcast when the broadcast ends. So, this property would not identify the number of viewers watching an archived video of a live broadcast that already ended. + """ + concurrentViewers: String + + """ + The time that the broadcast is scheduled to end. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. If the value is empty or the property is not present, then the broadcast is scheduled to continue indefinitely. + """ + scheduledEndTime: String + + """ + The time that the broadcast is scheduled to begin. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + scheduledStartTime: String +} + +"""Basic details about a video category, such as its localized title.""" +type YouTubeVideoStatus { + """This value indicates if the video can be embedded on another website.""" + embeddable: Boolean + + """ + This value explains why a video failed to upload. This property is only present if the uploadStatus property indicates that the upload failed. + """ + failureReason: String + + """The video's license.""" + license: String + + """The video's privacy status.""" + privacyStatus: String + + """ + This value indicates if the extended video statistics on the watch page can be viewed by everyone. Note that the view count, likes, etc will still be visible if this is disabled. + """ + publicStatsViewable: Boolean + + """ + The date and time when the video is scheduled to publish. It can be set only if the privacy status of the video is private. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishAt: String + + """ + This value explains why YouTube rejected an uploaded video. This property is only present if the uploadStatus property indicates that the upload was rejected. + """ + rejectionReason: String + + """The status of the uploaded video.""" + uploadStatus: String +} + +""" +Statistics about the video, such as the number of times the video was viewed or liked. +""" +type YouTubeVideoStatistics { + """The number of comments for the video.""" + commentCount: String + + """ + The number of users who have indicated that they disliked the video by giving it a negative rating. + """ + dislikeCount: String + + """ + The number of users who currently have the video marked as a favorite video. + """ + favoriteCount: String + + """ + The number of users who have indicated that they liked the video by giving it a positive rating. + """ + likeCount: String + + """The number of times the video has been viewed.""" + viewCount: String +} + +"""Geographical coordinates of a point, in WGS84.""" +type YouTubeGeoPoint { + """Altitude above the reference ellipsoid, in meters.""" + altitude: Float + + """Latitude in degrees.""" + latitude: Float + + """Longitude in degrees.""" + longitude: Float +} + +"""Recording information associated with the video.""" +type YouTubeVideoRecordingDetails { + """The geolocation information associated with the video.""" + location: YouTubeGeoPoint + + """The text description of the location where the video was recorded.""" + locationDescription: String + + """ + The date and time when the video was recorded. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sssZ) format. + """ + recordingDate: String +} + +"""Freebase topic information related to the video.""" +type YouTubeVideoTopicDetails { + """ + Similar to topic_id, except that these topics are merely relevant to the video. These are topics that may be mentioned in, or appear in the video. You can retrieve information about each topic using Freebase Topic API. + """ + relevantTopicIds: [String!] + + """ + A list of Wikipedia URLs that provide a high-level description of the video's content. + """ + topicCategories: [String!] + + """ + A list of Freebase topic IDs that are centrally associated with the video. These are topics that are centrally featured in the video, and it can be said that the video is mainly about each of these. You can retrieve information about each topic using the Freebase Topic API. + """ + topicIds: [String!] +} + +"""Project specific details about the content of a YouTube Video.""" +type YouTubeVideoProjectDetails { + """A list of project tags associated with the video during the upload.""" + tags: [String!] +} + +"""Localized versions of certain video properties (e.g. title).""" +type YouTubeVideoLocalization { + """Localized version of the video's description.""" + description: String + + """Localized version of the video's title.""" + title: String +} + +""" +Basic details about a video, including title, description, uploader, thumbnails and category. +""" +type YouTubeVideoSnippet { + """ + A map of thumbnail images associated with the video. For each object in the map, the key is the name of the thumbnail image, and the value is an object that contains other information about the thumbnail. + """ + thumbnails: YouTubeThumbnailDetails + + """ + A list of keyword tags associated with the video. Tags may contain spaces. + """ + tags: [String!] + + """ + The default_audio_language property specifies the language spoken in the video's default audio track. + """ + defaultAudioLanguage: String + + """Channel title for the channel that the video belongs to.""" + channelTitle: String + + """ + The ID that YouTube uses to uniquely identify the channel that the video was uploaded to. + """ + channelId: String + + """The video's title.""" + title: String + + """ + Localized snippet selected with the hl parameter. If no such localization exists, this field is populated with the default snippet. (Read-only) + """ + localized: YouTubeVideoLocalization + + """ + Indicates if the video is an upcoming/active live broadcast. Or it's "none" if the video is not an upcoming/active live broadcast. + """ + liveBroadcastContent: String + + """The video's description.""" + description: String + + """The YouTube video category associated with the video.""" + categoryId: String + + """The language of the videos's default snippet.""" + defaultLanguage: String + + """ + The date and time that the video was uploaded. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishedAt: String +} + +"""Player to be used for a video playback.""" +type YouTubeVideoPlayer { + """""" + embedHeight: String + + """An <iframe> tag that embeds a player that will play the video.""" + embedHtml: String + + """The embed width""" + embedWidth: String +} + +"""Rights management policy for YouTube resources.""" +type YouTubeAccessPolicy { + """ + The value of allowed indicates whether the access to the policy is allowed or denied by default. + """ + allowed: Boolean + + """ + A list of region codes that identify countries where the default policy do not apply. + """ + exception: [String!] +} + +"""Details about monetization of a YouTube Video.""" +type YouTubeVideoMonetizationDetails { + """ + The value of access indicates whether the video can be monetized or not. + """ + access: YouTubeAccessPolicy +} + +"""Information about an audio stream.""" +type YouTubeVideoFileDetailsAudioStream { + """The audio stream's bitrate, in bits per second.""" + bitrateBps: String + + """The number of audio channels that the stream contains.""" + channelCount: Int + + """The audio codec that the stream uses.""" + codec: String + + """ + A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code. + """ + vendor: String +} + +"""Information about a video stream.""" +type YouTubeVideoFileDetailsVideoStream { + """ + The video content's display aspect ratio, which specifies the aspect ratio in which the video should be displayed. + """ + aspectRatio: Float + + """The video stream's bitrate, in bits per second.""" + bitrateBps: String + + """The video codec that the stream uses.""" + codec: String + + """The video stream's frame rate, in frames per second.""" + frameRateFps: Float + + """The encoded video content's height in pixels.""" + heightPixels: Int + + """ + The amount that YouTube needs to rotate the original source content to properly display the video. + """ + rotation: String + + """ + A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code. + """ + vendor: String + + """ + The encoded video content's width in pixels. You can calculate the video's encoding aspect ratio as width_pixels / height_pixels. + """ + widthPixels: Int +} + +""" +Describes original video file properties, including technical details about audio and video streams, but also metadata information like content length, digitization time, or geotagging information. +""" +type YouTubeVideoFileDetails { + """ + The uploaded video file's combined (video and audio) bitrate in bits per second. + """ + bitrateBps: String + + """ + A list of video streams contained in the uploaded video file. Each item in the list contains detailed metadata about a video stream. + """ + videoStreams: [YouTubeVideoFileDetailsVideoStream!] + + """ + A list of audio streams contained in the uploaded video file. Each item in the list contains detailed metadata about an audio stream. + """ + audioStreams: [YouTubeVideoFileDetailsAudioStream!] + + """ + The uploaded file's type as detected by YouTube's video processing engine. Currently, YouTube only processes video files, but this field is present whether a video file or another type of file was uploaded. + """ + fileType: String + + """ + The uploaded file's name. This field is present whether a video file or another type of file was uploaded. + """ + fileName: String + + """ + The date and time when the uploaded video file was created. The value is specified in ISO 8601 format. Currently, the following ISO 8601 formats are supported: + - Date only: YYYY-MM-DD + - Naive time: YYYY-MM-DDTHH:MM:SS + - Time with timezone: YYYY-MM-DDTHH:MM:SS+HH:MM + """ + creationTime: String + + """ + The uploaded file's size in bytes. This field is present whether a video file or another type of file was uploaded. + """ + fileSize: String + + """The length of the uploaded video in milliseconds.""" + durationMs: String + + """The uploaded video file's container format.""" + container: String +} + +"""A video resource represents a YouTube video.""" +type YouTubeVideo { + """ + The fileDetails object encapsulates information about the video file that was uploaded to YouTube, including the file's resolution, duration, audio and video codecs, stream bitrates, and more. This data can only be retrieved by the video owner. + """ + fileDetails: YouTubeVideoFileDetails + + """ + The monetizationDetails object encapsulates information about the monetization status of the video. + """ + monetizationDetails: YouTubeVideoMonetizationDetails + + """ + The player object contains information that you would use to play the video in an embedded player. + """ + player: YouTubeVideoPlayer + + """ + The snippet object contains basic details about the video, such as its title, description, and category. + """ + snippet: YouTubeVideoSnippet + + """ + The projectDetails object contains information about the project specific video metadata. + """ + projectDetails: YouTubeVideoProjectDetails + + """The ID that YouTube uses to uniquely identify the video.""" + id: String + + """ + The topicDetails object encapsulates information about Freebase topics associated with the video. + """ + topicDetails: YouTubeVideoTopicDetails + + """ + The recordingDetails object encapsulates information about the location, date and address where the video was recorded. + """ + recordingDetails: YouTubeVideoRecordingDetails + + """The statistics object contains statistics about the video.""" + statistics: YouTubeVideoStatistics + + """ + The status object contains information about the video's uploading, processing, and privacy statuses. + """ + status: YouTubeVideoStatus + + """Etag of this resource.""" + etag: String + + """ + Identifies what kind of resource this is. Value: the fixed string "youtube#video". + """ + kind: String + + """ + The liveStreamingDetails object contains metadata about a live video broadcast. The object will only be present in a video resource if the video is an upcoming, live, or completed live broadcast. + """ + liveStreamingDetails: YouTubeVideoLiveStreamingDetails + + """ + The suggestions object encapsulates suggestions that identify opportunities to improve the video quality or the metadata for the uploaded video. This data can only be retrieved by the video owner. + """ + suggestions: YouTubeVideoSuggestions + + """ + Age restriction details related to a video. This data can only be retrieved by the video owner. + """ + ageGating: YouTubeVideoAgeGating + + """List with all localizations.""" + localizations: YouTubeVideoLocalization + + """ + The contentDetails object contains information about the video content, including the length of the video and its aspect ratio. + """ + contentDetails: YouTubeVideoContentDetails + + """ + The processingDetails object encapsulates information about YouTube's progress in processing the uploaded video file. The properties in the object identify the current processing status and an estimate of the time remaining until YouTube finishes processing the video. This part also indicates whether different types of data or content, such as file details or thumbnail images, are available for the video. + + The processingProgress object is designed to be polled so that the video uploaded can track the progress that YouTube has made in processing the uploaded video file. This data can only be retrieved by the video owner. + """ + processingDetails: YouTubeVideoProcessingDetails + + """YouTube caption tracks for this video""" + captions: YouTubeCaptionListResponse! +} + +"""""" +type YouTubePlaylistItemContentDetails { + """ + The time, measured in seconds from the start of the video, when the video should stop playing. (The playlist owner can specify the times when the video should start and stop playing when the video is played in the context of the playlist.) By default, assume that the video.endTime is the end of the video. + """ + endAt: String + + """A user-generated note for this item.""" + note: String + + """ + The time, measured in seconds from the start of the video, when the video should start playing. (The playlist owner can specify the times when the video should start and stop playing when the video is played in the context of the playlist.) The default value is 0. + """ + startAt: String + + """ + The ID that YouTube uses to uniquely identify a video. To retrieve the video resource, set the id query parameter to this value in your API request. + """ + videoId: String + + """ + The date and time that the video was published to YouTube. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + videoPublishedAt: String + + """The playlist video""" + video: YouTubeVideo +} + +""" +A playlistItem resource identifies another resource, such as a video, that is included in a playlist. In addition, the playlistItem resource contains details about the included resource that pertain specifically to how that resource is used in that playlist. + +YouTube uses playlists to identify special collections of videos for a channel, such as: +- uploaded videos +- favorite videos +- positively rated (liked) videos +- watch history +- watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. + +You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods. For example, if a user gives a positive rating to a video, you would insert that video into the liked videos playlist for that user's channel. +""" +type YouTubePlaylistItem { + """ + The contentDetails object is included in the resource if the included item is a YouTube video. The object contains additional information about the video. + """ + contentDetails: YouTubePlaylistItemContentDetails + + """Etag of this resource.""" + etag: String + + """The ID that YouTube uses to uniquely identify the playlist item.""" + id: String + + """ + Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItem". + """ + kind: String + + """ + The snippet object contains basic details about the playlist item, such as its title and position in the playlist. + """ + snippet: YouTubePlaylistItemSnippet + + """ + The status object contains information about the playlist item's privacy status. + """ + status: YouTubePlaylistItemStatus +} + +"""A connection to a list of YouTube playlist items .""" +type YouTubePlaylistItemsConnection { + """List of YouTube vidoes.""" + nodes: [YouTubePlaylistItem!]! + + """Pagination information""" + pageInfo: PageInfo! +} + +"""""" +type YouTubePlaylistStatus { + """The playlist's privacy status.""" + privacyStatus: String +} + +"""A thumbnail is an image representing a YouTube resource.""" +type YouTubeThumbnail { + """(Optional) Height of the thumbnail image.""" + height: Int + + """The thumbnail image's URL.""" + url: String + + """(Optional) Width of the thumbnail image.""" + width: Int +} + +"""Internal representation of thumbnails for a YouTube resource.""" +type YouTubeThumbnailDetails { + """The default image for this resource.""" + default: YouTubeThumbnail + + """The high quality image for this resource.""" + high: YouTubeThumbnail + + """The maximum resolution quality image for this resource.""" + maxres: YouTubeThumbnail + + """The medium quality image for this resource.""" + medium: YouTubeThumbnail + + """The standard quality image for this resource.""" + standard: YouTubeThumbnail +} + +""" +Basic details about a playlist, including title, description and thumbnails. +""" +type YouTubePlaylistSnippet { + """ + A map of thumbnail images associated with the playlist. For each object in the map, the key is the name of the thumbnail image, and the value is an object that contains other information about the thumbnail. + """ + thumbnails: YouTubeThumbnailDetails + + """Keyword tags associated with the playlist.""" + tags: [String!] + + """The channel title of the channel that the video belongs to.""" + channelTitle: String + + """ + The ID that YouTube uses to uniquely identify the channel that published the playlist. + """ + channelId: String + + """The playlist's title.""" + title: String + + """Localized title and description, read-only.""" + localized: YouTubePlaylistLocalization + + """The playlist's description.""" + description: String + + """The language of the playlist's default title and description.""" + defaultLanguage: String + + """ + The date and time that the playlist was created. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishedAt: String +} + +"""""" +type YouTubePlaylistPlayer { + """An <iframe> tag that embeds a player that will play the playlist.""" + embedHtml: String +} + +"""Playlist localization setting""" +type YouTubePlaylistLocalization { + """The localized strings for playlist's description.""" + description: String + + """The localized strings for playlist's title.""" + title: String +} + +"""""" +type YouTubePlaylistContentDetails { + """The number of videos in the playlist.""" + itemCount: Int +} + +""" +A playlist resource represents a YouTube playlist. A playlist is a collection of videos that can be viewed sequentially and shared with other users. A playlist can contain up to 200 videos, and YouTube does not limit the number of playlists that each user creates. By default, playlists are publicly visible to other users, but playlists can be public or private. + +YouTube also uses playlists to identify special collections of videos for a channel, such as: +- uploaded videos +- favorite videos +- positively rated (liked) videos +- watch history +- watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. + +You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods. +""" +type YouTubePlaylist { + """The contentDetails object contains information like video count.""" + contentDetails: YouTubePlaylistContentDetails + + """Etag of this resource.""" + etag: String + + """The ID that YouTube uses to uniquely identify the playlist.""" + id: String + + """ + Identifies what kind of resource this is. Value: the fixed string "youtube#playlist". + """ + kind: String + + """Localizations for different languages""" + localizations: YouTubePlaylistLocalization + + """ + The player object contains information that you would use to play the playlist in an embedded player. + """ + player: YouTubePlaylistPlayer + + """ + The snippet object contains basic details about the playlist, such as its title and description. + """ + snippet: YouTubePlaylistSnippet + + """The status object contains status information for the playlist.""" + status: YouTubePlaylistStatus + + """List of items for this playlist, with pagination information.""" + items( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Number of videos to fetch.""" + first: Int + ): YouTubePlaylistItemsConnection! +} + +"""Root fields for YouTube""" +type YouTubeQuery { + oldVideo(id: String!): YoutubeVideo @deprecated(reason: "Use `YouTube video` instead") + playlist( + """Playlist id""" + id: String! + ): YouTubePlaylist! + playlistItems( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Number of items to fetch.""" + first: Int + + """Playlist id""" + playlistId: String! + ): YouTubePlaylistItemsConnection! + search( + cursor: String + pageToken: String + maxResults: Int! + order: String + + """ + The q parameter specifies the query term to search for. + Your request can also use the Boolean NOT (-) and OR (|) operators to exclude videos or to find videos that are associated with one of several search terms. For example, to search for videos matching either "boating" or "sailing", set the q parameter value to boating|sailing. Similarly, to search for videos matching either "boating" or "sailing" but not "fishing", set the q parameter value to boating|sailing -fishing + """ + q: String! + ): YoutubeVideoSearchResult + video(id: String!): YouTubeVideo + liveChat(id: String!): YouTubeLiveChatMessageListResponse + liveBroadcasts(onBehalfOfContentOwnerChannel: String, onBehalfOfContentOwner: String, mine: Boolean, first: Int, broadcastType: String, broadcastStatus: String, id: String): YouTubeLiveBroadcastListResponse + liveStreams(onBehalfOfContentOwnerChannel: String, onBehalfOfContentOwner: String, mine: Boolean, first: Int, id: String): YouTubeLiveStreamListResponse +} + +"""""" +type UspsTrackDetail { + """The time of the event.""" + eventTime: String + + """The date of the event.""" + eventDate: String + + """The event type (e.g., Enroute).""" + event: String + + """The city where the event occurred.""" + eventCity: String + + """The state where the event occurred.""" + eventState: String + + """The ZIP Code of the event""" + eventZipCode: String + + """The country where the event occurred.""" + eventCountry: String + + """The company name if delivered to a company.""" + firmName: String + + """The name of the persons signing for delivery (if available).""" + name: String + + """True/False field indicating the person signing as an Authorized Agent.""" + authorizedAgent: Boolean + + """Event Code.""" + eventCode: String + + """Action Code.""" + actionCode: String + + """Reason Code.""" + reasonCode: String +} + +"""""" +type UspsTrackSummary { + """The time of the event.""" + eventTime: String + + """The date of the event.""" + eventDate: String + + """The event type (e.g., Enroute).""" + event: String + + """The city where the event occurred.""" + eventCity: String + + """The state where the event occurred.""" + eventState: String + + """The ZIP Code of the event.""" + eventZipCode: String + + """The country where the event occurred.""" + eventCountry: String + + """The company name if delivered to a company.""" + firmName: String + + """The name of the persons signing for delivery (if available).""" + name: String + + """True/False field indicating the person signing as an Authorized Agent.""" + authorizedAgent: Boolean + + """Event Code.""" + eventCode: String + + """""" + deliveryAttributeCode: String + + """Action Code.""" + actionCode: String + + """Reason Code.""" + reasonCode: String + + """Only eligible to display with delivery (01) events.""" + geoCertified: Boolean +} + +"""""" +type UspsTrackInfo { + """""" + trackSummary: UspsTrackSummary + + """""" + trackDetail: [UspsTrackDetail!] + + """ + Additional package information. + + """ + additionalInfo: String + + """ + Additional package information. + + """ + adpScripting: String + + """ + Internal data availability. + + """ + archdata: Boolean + + """ + Information regarding availability of Restore service function. + + """ + archiveRestoreInfo: String + + """ + Associated label. + + """ + associatedLabel: String + + """ + Indicates whether or not the mailer has authorized carrier release (T or F). + + """ + carrierRelease: String + + """ + The class of mail. Example: Priority Mail 1-Day + + """ + class: String + + """ + Class of mail code Examples: PM, PME, PMEI + + """ + classOfMailCode: String + + """ + Scheduled delivery date. + + """ + deliveryNotificationDate: String + + """ + The destination city. + + """ + destinationCity: String + + """ + The destination country code. + + """ + destinationCountryCode: String + + """ + The destination state. + + """ + destinationState: String + + """ + The destination zip code. + + """ + destinationZip: String + + """ + Identifies edited or full barcode information to support numeric only input. + + """ + editedLabelId: String! + + """ + Signifies if Track and Confirm by Email service is enabled. + + """ + emailEnabled: String + + """ + Expected delivery date. + + """ + expectedDeliveryDate: String + + """ + Expected delivery time. Example: 2:00 PM + + """ + expectedDeliveryTime: String + + """ + Guaranteed Delivery Date – Global Express Mail only: certain countries provide a guarantee delivery. Example: 04 June 2013, 3 Business Days + + """ + guaranteedDeliveryDate: String + + """ + Guaranteed Delivery Time – Global Express Mail only: certain countries provide a guarantee delivery. + + """ + guaranteedDeliveryTime: String + + """ + Messaging to identify Guarantee limits. (e.g. Loss Only Guarantee) + + """ + guaranteedDetails: String + + """ + Indicates if the shipment. + + """ + kahalaIndicator: String + + """ + The mail type code. + + """ + mailTypeCode: String + + """ + Internal date stamp in yyyy-mm-dd hh:mm:ss.xxxx format + + """ + mpdate: String + + """ + Internal suffix. + + """ + mpsuffix: Int + + """ + The origin city. + + """ + originCity: String + + """ + The origin country code. + + """ + originCountryCode: String + + """ + The origin state. + + """ + originState: String + + """ + The origin zip code. + + """ + originZip: String + + """ + Signifies if Proof of Delivery service is enabled. + + """ + podEnabled: Boolean + + """ + The predicted delivery date. + + """ + predictedDeliveryDate: String + + """ + Predicted Delivery Time. Example: 3:00 PM (Or blank) + + """ + predictedDeliveryTime: String + + """ + Predicted Delivery Window start time in military format. Example: 1300 + + """ + pdwStart: String + + """ + Predicted Delivery Window end time in military format. Example: 1500 + + """ + pdwEnd: String + + """ + Related Return Receipt ID. + + """ + relatedRrid: String + + """ + Signifies if Restore tracking information service is enabled. + + """ + restoreEnabled: Boolean + + """ + Signifies if RRAM service is enabled. + + """ + rramEnabled: Boolean + + """ + Signifies if Return Receipt Electronic service is enabled. + + """ + rreEnabled: Boolean + + """ + Additional services purchased. + + """ + service: [String!]! + + """ + Service Type Code. + + """ + serviceTypeCode: String + + """ + Delivery status. + + """ + status: String + + """ + Delivery status category. + + """ + statusCategory: String + + """ + Detailed status summary. + + """ + statusSummary: String + + """ + Internal table code. + + """ + tablecode: String + + """ + Signifies if Tracking Proof of Delivery service is enabled. + + """ + tPodEnabled: Boolean + + """ + Declared value of the package contents. Example: $20.00 (only returned for specific SourceIDs) + + """ + valueofArticle: String +} + +"""""" +type UspsTrackResponse { + """""" + trackInfo: UspsTrackInfo! +} + +"""The root for USPS""" +type USPSQuery { + """Track a USPS package""" + track( + """Optional SourceId to report your client to USPS""" + sourceId: String + + """Tracking number for the package""" + trackId: String! + ): UspsTrackResponse! +} + +"""""" +type UpsPreauthorizedReturnInformationType { + """""" + returnEligibilityIndicator: String + + """""" + returnExpirationDate: String + + """""" + returnRequestUrl: String + + """""" + originalTrackingNumber: String + + """""" + returnTrackingNumber: String +} + +"""""" +type UpsReferenceNumberType { + """""" + code: String + + """""" + value: String! +} + +"""""" +type UpsMessageType { + """""" + code: String! + + """""" + description: String +} + +"""""" +type UpsAdditionalCodeDescriptionValueType { + """""" + code: String! + + """""" + description: String + + """""" + value: String +} + +"""""" +type UpsNextScheduleActivityType { + """""" + date: String + + """""" + time: String +} + +"""""" +type UpsStatusType { + """""" + type: String + + """""" + description: String + + """""" + code: String +} + +"""""" +type UpsTransportFacilityType { + """""" + type: String! + + """""" + code: String +} + +"""""" +type UpsActivityLocationType { + """""" + address: UpsAddressType + + """""" + transportFacility: UpsTransportFacilityType + + """""" + code: String + + """""" + description: String + + """""" + signedForByName: String +} + +"""""" +type UpsAlternateTrackingInfoType { + """""" + type: String + + """""" + value: String! +} + +"""""" +type UpsActivityType { + """""" + alternateTrackingInfo: [UpsAlternateTrackingInfoType!] + + """""" + activityLocation: UpsActivityLocationType + + """""" + status: UpsStatusType + + """""" + date: String + + """""" + time: String + + """""" + deliveryDateFromManifestIndicator: String + + """""" + nextScheduleActivity: UpsNextScheduleActivityType + + """""" + document: [UpsDocumentType!] + + """""" + additionalAttribute: [UpsAdditionalCodeDescriptionValueType!] +} + +"""""" +type UpsServiceOptionType { + """""" + type: UpsCommonCodeDescriptionType! + + """""" + value: String +} + +"""""" +type UpsPackageAddressType { + """""" + type: UpsCommonCodeDescriptionType! + + """""" + address: UpsAddressType +} + +"""""" +type UpsRedirectType { + """""" + companyName: String + + """""" + locationId: String + + """""" + pickupDate: String +} + +"""""" +type UpsPackageType { + """""" + trackingNumber: String + + """""" + deliveryIndicator: String + + """""" + deliveryDate: String + + """""" + redirect: UpsRedirectType + + """""" + deliveryDetail: [UpsDeliveryDetailType!] + + """""" + packageAddress: [UpsPackageAddressType!] + + """""" + packageServiceOption: [UpsServiceOptionType!] + + """""" + cod: UpsCodType + + """""" + activity: [UpsActivityType!] + + """""" + message: [UpsMessageType!] + + """""" + packageWeight: UpsWeightType + + """""" + referenceNumber: [UpsReferenceNumberType!] + + """""" + alternateTrackingNumber: [String!] + + """""" + alternateTrackingInfo: [UpsAlternateTrackingInfoType!] + + """""" + dimensionalWeightScanIndicator: String + + """""" + preauthorizedReturnInformation: UpsPreauthorizedReturnInformationType +} + +"""""" +type UpsAppointmentType { + """""" + made: UpsDateTimeType + + """""" + requested: UpsDateTimeType + + """""" + beginTime: String + + """""" + endTime: String +} + +"""""" +type UpsDocumentType { + """""" + type: UpsCommonCodeDescriptionType! + + """""" + content: String + + """""" + format: UpsCommonCodeDescriptionType +} + +"""""" +type UpsCarrierActivityInformationType { + """""" + carrierId: String + + """""" + description: String + + """""" + status: String + + """""" + arrival: UpsDateTimeType + + """""" + departure: UpsDateTimeType + + """""" + originPort: String + + """""" + destinationPort: String +} + +"""""" +type UpsDestinationPortDetailType { + """""" + destinationPort: String + + """""" + estimatedArrival: UpsDateTimeType +} + +"""""" +type UpsDateTimeType { + """""" + date: String! + + """""" + time: String +} + +"""""" +type UpsOriginPortDetailType { + """""" + originPort: String + + """""" + estimatedDeparture: UpsDateTimeType +} + +"""""" +type UpsShipmentActivityType { + """""" + activityLocation: UpsAddressType + + """""" + description: String + + """""" + date: String + + """""" + time: String + + """""" + trailer: String +} + +"""""" +type UpsCodStatusType { + """""" + code: String! + + """""" + description: String +} + +"""""" +type UpsAmountType { + """""" + currencyCode: String! + + """""" + monetaryValue: String! +} + +"""""" +type UpsCodType { + """""" + amount: UpsAmountType + + """""" + status: UpsCodStatusType + + """""" + controlNumber: String +} + +"""""" +type UpsNumberOfPackagingUnitType { + """""" + type: UpsCommonCodeDescriptionType! + + """""" + value: String! +} + +"""""" +type UpsVolumeType { + """""" + unitOfMeasurement: UpsUnitOfMeasurementType + + """""" + value: String! +} + +"""""" +type UpsDeliveryDetailType { + """""" + type: UpsCommonCodeDescriptionType! + + """""" + date: String! + + """""" + time: String +} + +"""""" +type UpsDeliveryDateUnavailableType { + """""" + type: String + + """""" + description: String +} + +"""""" +type UpsServiceCenterType { + """""" + type: UpsCommonCodeDescriptionType! + + """""" + address: UpsAddressType! +} + +"""""" +type UpsShipmentReferenceNumberType { + """""" + code: String + + """""" + description: String + + """""" + value: String! +} + +"""""" +type UpsServiceType { + """""" + code: String + + """""" + description: String +} + +"""""" +type UpsUnitOfMeasurementType { + """""" + code: String! + + """""" + description: String +} + +"""""" +type UpsWeightType { + """""" + unitOfMeasurement: UpsUnitOfMeasurementType + + """""" + weight: String! +} + +"""""" +type UpsAddressType { + """""" + addressLine: [String!] + + """""" + city: String + + """""" + stateProvinceCode: String + + """""" + postalCode: String + + """""" + countryCode: String +} + +"""""" +type UpsCommonCodeDescriptionType { + """""" + code: String! + + """""" + description: String +} + +"""""" +type UpsShipmentAddressType { + """""" + type: UpsCommonCodeDescriptionType! + + """""" + address: UpsAddressType! +} + +"""""" +type UpsRefShipmentType { + """""" + code: String! + + """""" + description: String +} + +"""""" +type UpsCodeDescriptionValueType { + """""" + code: String + + """""" + description: String + + """""" + value: String! +} + +"""""" +type UpsShipmentType { + """""" + inquiryNumber: UpsCodeDescriptionValueType + + """""" + shipmentType: UpsRefShipmentType + + """""" + candidateBookmark: String + + """""" + shipperNumber: String + + """""" + shipmentAddress: [UpsShipmentAddressType!] + + """""" + shipmentWeight: UpsWeightType + + """""" + service: UpsServiceType + + """""" + referenceNumber: [UpsShipmentReferenceNumberType!] + + """""" + currentStatus: UpsCommonCodeDescriptionType + + """""" + pickupDate: String + + """""" + serviceCenter: [UpsServiceCenterType!] + + """""" + deliveryDateUnavailable: UpsDeliveryDateUnavailableType + + """""" + deliveryDetail: [UpsDeliveryDetailType!] + + """""" + volume: UpsVolumeType + + """""" + billToName: String + + """""" + numberOfPackagingUnit: [UpsNumberOfPackagingUnitType!] + + """""" + cod: UpsCodType + + """""" + signedForByName: String + + """""" + activity: [UpsShipmentActivityType!] + + """""" + originPortDetail: UpsOriginPortDetailType + + """""" + destinationPortDetail: UpsDestinationPortDetailType + + """""" + descriptionOfGoods: String + + """""" + cargoReady: UpsDateTimeType + + """""" + manifest: UpsDateTimeType + + """""" + carrierActivityInformation: [UpsCarrierActivityInformationType!] + + """""" + document: [UpsDocumentType!] + + """""" + fileNumber: String + + """""" + appointment: UpsAppointmentType + + """""" + package: [UpsPackageType!] + + """""" + additionalAttribute: [UpsAdditionalCodeDescriptionValueType!] +} + +"""""" +type UpsTrackResponse { + """""" + shipment: [UpsShipmentType!]! + + """""" + disclaimer: [String!] +} + +"""The root for Ups""" +type UpsQuery { + """Track a UPS package""" + track( + """Inquiry number for the package""" + inquiryNumber: String! + ): UpsTrackResponse! + + """Track several UPS package""" + trackMultiple( + """Inquiry numbers for the package""" + inquiryNumbers: [String!]! + ): [UpsTrackResponse!]! +} + +"""Twitter""" +type Twitter { + user(screenName: String!): TwitterUser + + """ + Returns a collection of the most recent Tweets and Retweets posted by the authenticating user and the users they follow. The home timeline is central to how most users interact with the Twitter service. + """ + homeTimeline( + """Number of tweets to fetch""" + first: Int + ): TwitterTimeline +} + +""" +Make a REST API call to the Twitch API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type TwitchTvPassthroughQuery { + """ + Make a GET request to the Twitch API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The root for TwitchTv""" +type TwitchTvQuery { + """ + Make a REST API call to the Twitch API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: TwitchTvPassthroughQuery! +} + +"""Filters for incoming phone numbers.""" +enum TwilioPhoneNumberOriginEnumArg { + TWILIO + HOSTED +} + +enum TwilioIncomingPhoneNumberVoiceMethod { + GET + POST +} + +enum TwilioIncomingPhoneNumberVoiceFallbackMethod { + GET + POST +} + +enum TwilioIncomingPhoneNumberStatusCallbackMethod { + GET + POST +} + +enum TwilioIncomingPhoneNumberSmsMethod { + GET + POST +} + +enum TwilioIncomingPhoneNumberSmsFallbackMethod { + GET + POST +} + +type TwilioPhoneNumberCapabilities { + """""" + mMS: String + + """""" + sMS: String + + """""" + voice: String +} + +enum TwilioIncomingPhoneNumberAddressRequirements { + NONE + ANY + LOCAL + FOREIGN +} + +type TwilioIncomingPhoneNumber { + """The unique id of the Account responsible for this phone number.""" + accountSid: String + + """ + This indicates whether the phone number requires you or your customer to have an Address registered with Twilio. Possible values are none, any, local, or foreign. + """ + addressRequirements: TwilioIncomingPhoneNumberAddressRequirements + + """ + The 34 character sid of the address Twilio should use to associate with the number. Addresses are required in some regions to meet local regulations + """ + addressSid: String + + """ + Calls to this phone number will start a new TwiML session with this API version. + """ + apiVersion: String + + """ + Phone numbers new to the Twilio platform are marked as beta. Possible values are either true or false. + """ + beta: Boolean + + """""" + capabilities: TwilioPhoneNumberCapabilities + + """The date that this resource was created, given as GMT RFC 2822 format.""" + dateCreated: String + + """ + The date that this resource was last updated, given as GMT RFC 2822 format. + """ + dateUpdated: String + + """ + A human readable descriptive text for this resource, up to 64 characters long. By default, the FriendlyName is a nicely formatted version of the phone number. + """ + friendlyName: String + + """ + The 34 character sid of the identity Twilio should use to associate with the number. Identities are required in some regions to meet local regulations + """ + identitySid: String + + """ + Twilio owned phone numbers are marked as twilio while hosted phone numbers are marked as hosted. + """ + origin: String + + """The incoming phone number. e.g., +16175551212 (E.164 format)""" + phoneNumber: String + + """A 34 character string that uniquely identifies this resource.""" + sid: String + + """ + The 34 character sid of the application Twilio should use to handle SMSs sent to this number. If a SmsApplicationSid is present, Twilio will ignore all of the SMS urls above and use those set on the application. + """ + smsApplicationSid: String + + """ + The HTTP method Twilio will use when requesting the above URL. Either GET or POST. + """ + smsFallbackMethod: TwilioIncomingPhoneNumberSmsFallbackMethod + + """ + The URL that Twilio will request if an error occurs retrieving or executing the TwiML from SmsUrl. + """ + smsFallbackUrl: String + + """ + The HTTP method Twilio will use when making requests to the SmsUrl. Either GET or POST. + """ + smsMethod: TwilioIncomingPhoneNumberSmsMethod + + """ + The URL Twilio will request when receiving an incoming SMS message to this number. + """ + smsUrl: String + + """ + The URL that Twilio will request to pass status parameters (such as call ended) to your application. + """ + statusCallback: String + + """ + The HTTP method Twilio will use to make requests to the StatusCallback URL. Either GET or POST. + """ + statusCallbackMethod: TwilioIncomingPhoneNumberStatusCallbackMethod + + """ + The 34 character sid of the Trunk Twilio should use to handle phone calls to this number. If a TrunkSid is present, Twilio will ignore all of the voice urls and voice applications above and use those set on the Trunk. Setting a TrunkSid will automatically delete your VoiceApplicationSid and vice versa. + """ + trunkSid: String + + """The URI for this resource, relative to https://api.twilio.com.""" + uri: String + + """ + The 34 character sid of the application Twilio should use to handle phone calls to this number. If a VoiceApplicationSid is present, Twilio will ignore all of the voice urls above and use those set on the application. Setting a VoiceApplicationSid will automatically delete your TrunkSid and vice versa. + """ + voiceApplicationSid: String + + """ + Look up the caller's caller-ID name from the CNAM database ($0.01 per look up). Either true or false. + """ + voiceCallerIdLookup: Boolean + + """ + The HTTP method Twilio will use when requesting the VoiceFallbackUrl. Either GET or POST. + """ + voiceFallbackMethod: TwilioIncomingPhoneNumberVoiceFallbackMethod + + """ + The URL that Twilio will request if an error occurs retrieving or executing the TwiML requested by Url. + """ + voiceFallbackUrl: String + + """ + The HTTP method Twilio will use when requesting the above Url. Either GET or POST. + """ + voiceMethod: TwilioIncomingPhoneNumberVoiceMethod + + """ + The URL Twilio will request when this phone number receives a call. The VoiceURL will no longer be used if a VoiceApplicationSid or a TrunkSid is set. + """ + voiceUrl: String + messages( + """ + Only show messages sent on this date (in GMT format), given as `YYYY-MM-DD`. Example: `DateSent: "2009-07-06"`. You can also specify inequality, such as `DateSent: "<=YYYY-MM-DD"` for messages that were sent on or before midnight on a date, and `DateSent: ">=YYYY-MM-DD"` for messages sent on or after midnight on a date. + """ + dateSent: String + + """Only show messages from this phone number or alphanumeric sender ID.""" + from: String + last: Int + first: Int + before: String + after: String + ): TwilioMessagesConnection +} + +type TwilioIncomingPhoneNumberConnectionEdge { + """node""" + node: TwilioIncomingPhoneNumber! +} + +type TwilioIncomingPhoneNumberConnection { + """edges""" + edges: [TwilioIncomingPhoneNumberConnectionEdge!]! + + """nodes""" + nodes: [TwilioIncomingPhoneNumber!]! + + """edges""" + totalCount: Int! +} + +type TwilioSubresourceUrisKeyValue { + """The key of the subresource uri""" + key: String! + + """The key of the subresource uri""" + value: String +} + +type TwilioSubresourceUrisContainer { + """The key of the subresource uri""" + uris: [TwilioSubresourceUrisKeyValue!]! +} + +enum TwilioMessageStatus { + ACCEPTED + QUEUED + SENDING + SENT + FAILED + DELIVERED + UNDELIVERED + RECEIVING + RECEIVED +} + +enum TwilioMessageDirection { + INBOUND + OUTBOUND_API + OUTBOUND_REPLY +} + +type TwilioMessage { + """The unique id of the Account that sent this message.""" + accountSid: String + + """The version of the Twilio API used to process the message.""" + apiVersion: String + + """The text body of the message. Up to 1600 characters long.""" + body: String + + """The date that this resource was created, given in RFC 2822 format.""" + dateCreated: String + + """ + The date that the message was sent. For outgoing messages, this is the date that the message was sent from Twilio's platform. For incoming messages, this is the date that Twilio made the HTTP request to your application. The date is given in RFC 2822 format. + """ + dateSent: String + + """ + The date that this resource was last updated, given in RFC 2822 format. + """ + dateUpdated: String + + """ + The direction of this message. `inbound` for incoming messages, `outbound-api` for messages initiated via the REST API, `outbound-call` for messages initiated during a call or `outbound-reply` for messages initiated in response to an incoming message. + """ + direction: TwilioMessageDirection + + """ + The error code, if any, associated with your message. If your message status is failed or undelivered, the ErrorCode can give you more information about the failure. The value will be null if the message was delivered successfully. + """ + errorCode: Int + + """ + The human readable description of the `ErrorCode`. If the message status is `failed` or `undelivered` it will have one of the values described below, otherwise, it will be null. + """ + errorMessage: String + + """ + The phone number (in E.164 format), alphanumeric sender ID, or Wireless SIM that initiated the message. For incoming messages, this will be the remote phone. For outgoing messages, this will be one of your Twilio phone numbers or the alphanumeric sender ID used. + """ + from: String + + """ + The unique id of the Messaging Service used with the message. The value will be null if a Messaging Service was not used. + """ + messagingServiceSid: String + + """ + This property indicates the number of media files associated with the message. Each message may send up to 10 media files. + """ + numMedia: String + + """ + This property indicates the number of segments that make up the message. If your body is too large to be sent as a single SMS message, it will be segmented and charged accordingly. Inbound message over 160 characters will be reassembled when the message is received. + """ + numSegments: String + + """ + The amount billed for the message, in the currency associated with the account. Note that your account will be charged for each segment sent to the handset. + """ + price: String + + """ + The currency in which `Price` is measured, in ISO 4127 format (e.g. `usd`, `eur`, `jpy`). + """ + priceUnit: String + + """A 34 character string that uniquely identifies this resource.""" + sid: String + + """ + The status of this message. Either `accepted`, `queued`, `sending`, `sent`, `failed`, `delivered`, `undelivered`, `receiving`, or `received`. + """ + status: TwilioMessageStatus + + """ + The URIs for any subresources associate with this resource, relative to https://api.twilio.com + """ + subresourceUris: TwilioSubresourceUrisContainer + + """ + The phone number that received the message in E.164 format. For incoming messages, this will be one of your Twilio phone numbers. For outgoing messages, this will be the remote phone. + """ + to: String + + """The URI for this resource, relative to https://api.twilio.com""" + uri: String +} + +"""""" +type TwilioMessageEdge { + """node""" + node: TwilioMessage! +} + +"""""" +type TwilioMessagesConnection { + """edges""" + edges: [TwilioMessageEdge!]! + + """nodes""" + nodes: [TwilioMessage!]! + + """edges""" + totalCount: Int! +} + +"""The root for Twilio""" +type TwilioQuery { + messages( + """ + Only show messages sent on this date (in GMT format), given as `YYYY-MM-DD`. Example: `DateSent: "2009-07-06"`. You can also specify inequality, such as `DateSent: "<=YYYY-MM-DD"` for messages that were sent on or before midnight on a date, and `DateSent: ">=YYYY-MM-DD"` for messages sent on or after midnight on a date. + """ + dateSent: String + + """Only show messages from this phone number or alphanumeric sender ID.""" + from: String + + """Only show messages to this phone number.""" + to: String + last: Int + first: Int + before: String + after: String + ): TwilioMessagesConnection + incomingPhoneNumbers( + """ + Only show the incoming phone number resources that match this pattern. You can specify partial numbers and use `'*'` as a wildcard for any digit. + """ + phoneNumber: String + + """ + Include phone numbers based on the origin, by default, phone numbers of all origin are included. + """ + origin: TwilioPhoneNumberOriginEnumArg + + """ + A human readable descriptive text for this resource, up to 64 characters long. By default, the FriendlyName is a nicely formatted version of the phone number. + """ + friendlyName: String + + """Phone numbers new to the Twilio platform are marked as beta.""" + beta: Boolean + last: Int + first: Int + before: String + after: String + ): TwilioIncomingPhoneNumberConnection +} + +"""List of Trello webhooks, with metadata field for pagination""" +type TrelloWebhooksConnection { + """List of Trello webhooks""" + nodes: [TrelloWebhook!]! + + """Total number of Trello webhooks""" + totalCount: Int! +} + +"""List of Trello emojis, with metadata field for pagination""" +type TrelloEmojisConnection { + """List of Trello emojis""" + nodes: [TrelloEmoji!]! + + """Total number of Trello emojis""" + totalCount: Int! +} + +""" +Webhooks allow developers to receive updates regarding actions that have occurred in Trello. +""" +type TrelloWebhook { + """ID of the webhook.""" + id: String + + """Description provided when creating webhook.""" + description: String + + """ID of the object the webhook is watching.""" + idModel: String + + """The URL that the webhook will POST information to.""" + callbackURL: String + + """Determines whether the webhook is active or not.""" + active: Boolean +} + +"""The root for Trello.""" +type TrelloQuery { + """Find a trello member by id""" + member( + """Find the member by username. Must provide one of username or id.""" + username: String + + """Find the member by id. Must provide one of id or username.""" + id: String + ): TrelloMember! + + """Find a trello action by id""" + action( + """Action id""" + id: String! + ): TrelloAction! + + """Find a trello board by id""" + board( + """Board id""" + id: String! + ): TrelloBoard! + + """Find a trello card by id""" + card( + """Card id""" + id: String! + ): TrelloCard! + + """Find a trello checklist by id""" + checklist( + """Checklist id""" + id: String! + ): TrelloChecklist! + + """Find a trello customField by id""" + customField( + """CustomField id""" + id: String! + ): TrelloCustomFields! + + """Find a trello enterprise by id""" + enterprise( + """Enterprise id""" + id: String! + ): TrelloEnterprise! + + """Find a trello list by id""" + list( + """List id""" + id: String! + ): TrelloList! + + """Find a trello organization by id""" + organization( + """Organization id""" + id: String! + ): TrelloOrganization! + + """Find a trello webhook by id""" + webhook( + """Webhook id""" + id: String! + ): TrelloWebhook! + + """Lists all available emoji""" + allEmoji: TrelloEmojisConnection + + """Lists all webhooks for the currently logged-in member""" + webhooks: TrelloWebhooksConnection +} + +"""""" +type StripeTransfersEdge { + """node""" + node: StripeTransfer! + + """cursor""" + cursor: String! +} + +"""""" +type StripeTransfersConnection { + """cursor""" + cursor: String + + """nodes""" + nodes: [StripeTransfer!]! + + """edges""" + edges: [StripeTransfersEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +"""""" +type StripePlansEdge { + """node""" + node: StripePlan! + + """cursor""" + cursor: String! +} + +"""""" +type StripePlansConnection { + """cursor""" + cursor: String + + """nodes""" + nodes: [StripePlan!]! + + """edges""" + edges: [StripePlansEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +enum StripeInvoiceItemObjectEnum { + invoiceitem +} + +"""""" +type StripeInvoiceItem { + """ + For prorations this indicates whether Stripe automatically grouped multiple related debit and credit line items into a single combined line item. + """ + unifiedProration: Boolean + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeInvoiceItemObjectEnum! + + """The ID of the invoice this invoice item belongs to.""" + invoice: StripeInvoice + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ + If true, discounts will apply to this invoice item. Always false for prorations. + """ + discountable: Boolean! + + """Unique identifier for the object.""" + id: String! + + """ + The tax rates which apply to the invoice item. When set, the `default_tax_rates` on the invoice do not apply to this invoice item. + """ + taxRates: [StripeTaxRate!] + + """ + Quantity of units for the invoice item. If the invoice item is a proration, the quantity of the subscription that the proration was computed for. + """ + quantity: Int! + + """The subscription that this invoice item has been created for, if any.""" + subscription: StripeSubscription + + """ + Same as `unit_amount`, but contains a decimal value with at most 12 decimal places. + """ + unitAmountDecimal: String + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + Whether the invoice item was created automatically as a proration adjustment when the customer switched plans. + """ + proration: Boolean! + + """ + The subscription item that this invoice item has been created for, if any. + """ + subscriptionItem: String + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + Amount (in the `currency` specified) of the invoice item. This should always be equal to `unit_amount * quantity`. + """ + amount: Int! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + date: Int! + + """ + If the invoice item is a proration, the plan of the subscription that the proration was computed for. + """ + plan: StripePlan + + """Unit Amount (in the `currency` specified) of the invoice item.""" + unitAmount: Int + + """""" + period: StripeInvoiceLineItemPeriod! + + """ + The ID of the customer who will be billed when this invoice item is billed. + """ + customer: StripeInvoiceItemCustomerUnion! + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String +} + +"""""" +type StripeBalanceTransactionsEdge { + """node""" + node: StripeBalanceTransaction! + + """cursor""" + cursor: String! +} + +"""""" +type StripeBalanceTransactionsConnection { + """cursor""" + cursor: String + + """nodes""" + nodes: [StripeBalanceTransaction!]! + + """edges""" + edges: [StripeBalanceTransactionsEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +"""""" +type StripeDisputesEdge { + """node""" + node: StripeDispute! + + """cursor""" + cursor: String! +} + +"""""" +type StripeDisputesConnection { + """cursor""" + cursor: String + + """nodes""" + nodes: [StripeDispute!]! + + """edges""" + edges: [StripeDisputesEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +"""""" +type StripeCustomersEdge { + """node""" + node: StripeCustomer! + + """cursor""" + cursor: String! +} + +"""""" +type StripeCustomersConnection { + """cursor""" + cursor: String + + """nodes""" + nodes: [StripeCustomer!]! + + """edges""" + edges: [StripeCustomersEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +"""The root for Stripe""" +type StripeQuery { + customer(id: String!): StripeCustomer + customers(after: String, before: String, first: Int): StripeCustomersConnection + invoice(id: String!): StripeInvoice + invoices(status: StripeInvoiceStatusEnum, customer: String, after: String, before: String, first: Int): StripeInvoicesConnection + charge(id: String!): StripeCharge + charges(customer: String, after: String, before: String, first: Int): StripeChargesConnection + dispute(id: String!): StripeDispute + disputes(after: String, before: String, first: Int): StripeDisputesConnection + refund(id: String!): StripeRefund + refunds(chargeId: String, after: String, before: String, first: Int): StripeRefundsConnection + balanceTransaction(id: String!): StripeBalanceTransaction + balanceTransactions(after: String, before: String, first: Int): StripeBalanceTransactionsConnection + payout(id: String!): StripePayout + bankAccount(customer: String!, id: String!): StripeBankAccount + card(customer: String!, id: String!): StripeCard + source(id: String!): StripeSource + coupon(id: String!): StripeCoupon + invoiceItem(id: String!): StripeInvoiceItem + paymentIntent(id: String!): StripePaymentIntent + paymentIntents(customer: String, after: String, before: String, first: Int): StripePaymentIntentsConnection + plan(id: String!): StripePlan + plans(after: String, before: String, first: Int): StripePlansConnection + subscription(id: String!): StripeSubscription + subscriptions(status: StripeSubscriptionStatusEnum, planId: String, after: String, before: String, first: Int): StripeSubscriptionsConnection + transfer(id: String!): StripeTransfer + transfers(after: String, before: String, first: Int): StripeTransfersConnection + subscriptionItem(id: String!): StripeSubscriptionItem + sku(id: String!): StripeSku + order(id: String!): StripeOrder + product(id: String!): StripeProduct + topup(id: String!): StripeTopup + bitcoinReceiver(id: String!): StripeBitcoinReceiver +} + +""" +"Searches can be made more specific by specifying an album, artist or track field filter. Possible field filters, depending on object types being searched, include year, genre, upc, and isrc." +""" +input SpotifySearchArg { + tag: String + isrc: String + upc: String + genre: String + + """Filter results that were released in a specific year""" + year: Int + artist: String + + """ + The search query's keywords. The search is not case-sensitive: 'roadhouse' will match 'Roadhouse', 'roadHouse', etc. Keywords will be matched in any order unless surrounded by quotes, thus `roadhouse blues` will match both 'Blues Roadhouse' and 'Roadhouse of the Blues'. Quotation marks can be used to limit the match to a phrase: `"roadhouse blues"` will match 'My Roadhouse Blues' but not 'Roadhouse of the Blues'. By default, results are returned when a match is found in any field of the target object type. The asterisk (`*`) character can, with some limitations, be used as a wildcard (maximum: 2 per query). It will match a variable number of non-white-space characters. It cannot be used in a quoted phrase, in a field filter, or as the first character of the keyword string. Searching for playlists will return results matching the playlist's name and/or description. + """ + query: String! +} + +type SpotifySearchResults { + albums: [SpotifyAlbum!] + artists: [SpotifyArtist!] + playlists: [SpotifyPlaylist!] + tracks: [SpotifyTrack!] +} + +"""The root for Spotify""" +type SpotifyQuery { + featuredPlaylists(limit: Int): [SpotifyPlaylist!] + me: SpotifyCurrentUserProfile + artist( + """The artist id""" + id: String! + ): SpotifyArtist + track( + """The track id""" + id: String! + ): SpotifyTrack + search(data: SpotifySearchArg!): SpotifySearchResults +} + +type SlackChannelTopic { + """""" + creator: String + + """""" + lastSet: Int + + """""" + value: String +} + +type SlackChannelPurpose { + """""" + creator: String + + """""" + lastSet: Int + + """""" + value: String +} + +type SlackTeamIcon { + """""" + image102: String + + """""" + image132: String + + """""" + image230: String + + """""" + image34: String + + """""" + image44: String + + """""" + image68: String + + """""" + image88: String + + """""" + imageDefault: Boolean +} + +"""A Slack channel""" +type SlackChannel { + """""" + acceptedUser: String + + """""" + created: Int + + """""" + creator: String + + """""" + id: String + + """""" + isArchived: Boolean + + """""" + isChannel: Boolean + + """""" + isGeneral: Boolean + + """""" + isMember: Boolean + + """""" + isMoved: Int + + """""" + isMpim: Boolean + + """""" + isOrgShared: Boolean + + """""" + isPendingExtShared: Boolean + + """""" + isPrivate: Boolean + + """""" + isReadOnly: Boolean + + """""" + isShared: Boolean + + """""" + lastRead: String + + """""" + latest: [SlackTeamIcon!] + + """""" + name: String + + """""" + nameNormalized: String + + """""" + numMembers: Int + + """""" + pendingShared: [String!] + + """""" + previousNames: [String!] + + """""" + priority: Int + + """""" + purpose: SlackChannelPurpose + + """""" + topic: SlackChannelTopic + + """""" + unlinked: Int + + """""" + unreadCount: Int + + """""" + unreadCountDisplay: Int + members: SlackMembersConnection +} + +"""Channels in a Slack workspace""" +type SlackChannelsConnection { + """Channels""" + nodes: [SlackChannel!]! +} + +"""A Slack member profile""" +type SlackMemberProfile { + avatarHash: String + image24: String + image32: String + image48: String + image72: String + image192: String + image512: String + image1024: String + imageOriginal: String + firstName: String + lastName: String + title: String + phone: String + skype: String + realName: String + realNameNormalized: String + displayName: String + displayNameNormalized: String + email: String +} + +"""A Slack member/user""" +type SlackMember { + """The id of the Slack member""" + id: String + + """The ID of the Slack member's team""" + teamId: String + + """The name of the Slack member""" + name: String + + """Whether this users has been removed from the Slack workspace or not""" + deleted: Boolean + + """A color represented in hex format""" + color: String + + """The real name of the Slack member""" + realName: String + + """The timezone of the Slack member""" + timezone: String + + """The label of the timezone of the Slack member""" + timezoneLabel: String + + """The offset of the timezone of the Slack member""" + timezoneOffset: Int + isAdmin: Boolean + isOwner: Boolean + isPrimaryOwner: Boolean + isRestricted: Boolean + isUltraRestricted: Boolean + isBot: Boolean + updated: Int + has2fa: Boolean + profile: SlackMemberProfile! +} + +"""Members in a Slack workspace""" +type SlackMembersConnection { + """Users""" + nodes: [SlackMember!]! + + """Page info""" + pageInfo: PageInfo! +} + +type Slack { + members( + """Pagination cursor from which to retrieve additional results""" + after: String + + """ + Limit the result to `first` items. The recommended maximum is 200, though the absolute is 1000. + """ + first: Int + ): SlackMembersConnection! + member(includeLocale: Boolean, id: String!): SlackMember! + channels: SlackChannelsConnection! + channel(id: String!): SlackChannel +} + +""" +Make a REST API call to the Salesforce API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type SalesforcePassthroughQuery { + """ + Make a GET request to the Salesforce API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""Result of a SOQL query""" +type SalesforceSoqlResult { + """Raw output from the SOQL query""" + raw: JSON! + + """List of SOQL result nodes""" + nodes: [SalesforceSobject!]! +} + +"""Field that Cron Jobs can be sorted by""" +enum SalesforceCronJobDetailSortByFieldEnum { + ID + NAME + JOB_TYPE +} + +"""An edge in a connection.""" +type SalesforceCronJobDetailEdge { + """The item at the end of the edge.""" + node: SalesforceCronJobDetail! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Cron Jobs connection, for use in pagination.""" +type SalesforceCronJobDetailsConnection { + """The count of all Cron Job you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Cron Jobs""" + nodes: [SalesforceCronJobDetail!]! + + """List of Cron Job edges""" + edges: [SalesforceCronJobDetailEdge!]! +} + +"""Field that Package Licenses can be sorted by""" +enum SalesforcePackageLicenseSortByFieldEnum { + ID + STATUS + IS_PROVISIONED + ALLOWED_LICENSES + USED_LICENSES + EXPIRATION_DATE + CREATED_DATE + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + NAMESPACE_PREFIX +} + +"""An edge in a connection.""" +type SalesforcePackageLicenseEdge { + """The item at the end of the edge.""" + node: SalesforcePackageLicense! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Package Licenses connection, for use in pagination.""" +type SalesforcePackageLicensesConnection { + """The count of all Package License you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Package Licenses""" + nodes: [SalesforcePackageLicense!]! + + """List of Package License edges""" + edges: [SalesforcePackageLicenseEdge!]! +} + +"""Field that User Licenses can be sorted by""" +enum SalesforceUserLicenseSortByFieldEnum { + ID + LICENSE_DEFINITION_KEY + TOTAL_LICENSES + STATUS + USED_LICENSES + USED_LICENSES_LAST_UPDATED + NAME + MASTER_LABEL + CREATED_DATE + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceUserLicenseEdge { + """The item at the end of the edge.""" + node: SalesforceUserLicense! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce User Licenses connection, for use in pagination.""" +type SalesforceUserLicensesConnection { + """The count of all User License you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Licenses""" + nodes: [SalesforceUserLicense!]! + + """List of User License edges""" + edges: [SalesforceUserLicenseEdge!]! +} + +"""The root for Salesforce""" +type SalesforceQuery { + authProvider(id: String!): SalesforceAuthProvider! + platformCachePartition(id: String!): SalesforcePlatformCachePartition! + streamingChannelShare(id: String!): SalesforceStreamingChannelShare! + caseComment(id: String!): SalesforceCaseComment! + brandTemplate(id: String!): SalesforceBrandTemplate! + undecidedEventRelation(id: String!): SalesforceUndecidedEventRelation! + contentDistributionView(id: String!): SalesforceContentDistributionView! + userLicense(id: String!): SalesforceUserLicense! + contentUserSubscription(id: String!): SalesforceContentUserSubscription! + processInstance(id: String!): SalesforceProcessInstance! + case(id: String!): SalesforceCase! + apexPage(id: String!): SalesforceApexPage! + lightningComponentResource(id: String!): SalesforceLightningComponentResource! + apexComponent(id: String!): SalesforceApexComponent! + forecastShare(id: String!): SalesforceForecastShare! + attachment(id: String!): SalesforceAttachment! + opportunityPartner(id: String!): SalesforceOpportunityPartner! + orderFeed(id: String!): SalesforceOrderFeed! + order(id: String!): SalesforceOrder! + campaign(id: String!): SalesforceCampaign! + collaborationGroupMemberRequest(id: String!): SalesforceCollaborationGroupMemberRequest! + macroShare(id: String!): SalesforceMacroShare! + contentAsset(id: String!): SalesforceContentAsset! + customPermissionDependency(id: String!): SalesforceCustomPermissionDependency! + accountFeed(id: String!): SalesforceAccountFeed! + customBrandAsset(id: String!): SalesforceCustomBrandAsset! + userLogin(id: String!): SalesforceUserLogin! + stampAssignment(id: String!): SalesforceStampAssignment! + apexTrigger(id: String!): SalesforceApexTrigger! + siteFeed(id: String!): SalesforceSiteFeed! + dashboardFeed(id: String!): SalesforceDashboardFeed! + apexClass(id: String!): SalesforceApexClass! + accountShare(id: String!): SalesforceAccountShare! + feedItem(id: String!): SalesforceFeedItem! + contentFolderLink(id: String!): SalesforceContentFolderLink! + period(id: String!): SalesforcePeriod! + dashboardComponentFeed(id: String!): SalesforceDashboardComponentFeed! + opportunityHistory(id: String!): SalesforceOpportunityHistory! + assetHistory(id: String!): SalesforceAssetHistory! + userAppMenuCustomizationShare(id: String!): SalesforceUserAppMenuCustomizationShare! + appMenuItem(id: String!): SalesforceAppMenuItem! + userAppInfo(id: String!): SalesforceUserAppInfo! + actionLinkGroupTemplate(id: String!): SalesforceActionLinkGroupTemplate! + userProvisioningRequestShare(id: String!): SalesforceUserProvisioningRequestShare! + datacloudOwnedEntity(id: String!): SalesforceDatacloudOwnedEntity! + asset(id: String!): SalesforceAsset! + processInstanceWorkitem(id: String!): SalesforceProcessInstanceWorkitem! + userProvAccount(id: String!): SalesforceUserProvAccount! + userListView(id: String!): SalesforceUserListView! + apexEmailNotification(id: String!): SalesforceApexEmailNotification! + categoryNode(id: String!): SalesforceCategoryNode! + entitySubscription(id: String!): SalesforceEntitySubscription! + partner(id: String!): SalesforcePartner! + collaborationInvitation(id: String!): SalesforceCollaborationInvitation! + additionalNumber(id: String!): SalesforceAdditionalNumber! + flowRecordRelation(id: String!): SalesforceFlowRecordRelation! + opportunityLineItem(id: String!): SalesforceOpportunityLineItem! + taskFeed(id: String!): SalesforceTaskFeed! + organization(id: String!): SalesforceOrganization! + todayGoal(id: String!): SalesforceTodayGoal! + namedCredential(id: String!): SalesforceNamedCredential! + listEmailRecipientSource(id: String!): SalesforceListEmailRecipientSource! + contactHistory(id: String!): SalesforceContactHistory! + contentDocumentSubscription(id: String!): SalesforceContentDocumentSubscription! + opportunity(id: String!): SalesforceOpportunity! + collaborationGroup(id: String!): SalesforceCollaborationGroup! + idea(id: String!): SalesforceIdea! + contentVersionHistory(id: String!): SalesforceContentVersionHistory! + reportFeed(id: String!): SalesforceReportFeed! + dataAssessmentValueMetric(id: String!): SalesforceDataAssessmentValueMetric! + customBrand(id: String!): SalesforceCustomBrand! + note(id: String!): SalesforceNote! + assignmentRule(id: String!): SalesforceAssignmentRule! + contractContactRole(id: String!): SalesforceContractContactRole! + vote(id: String!): SalesforceVote! + siteHistory(id: String!): SalesforceSiteHistory! + solution(id: String!): SalesforceSolution! + businessProcess(id: String!): SalesforceBusinessProcess! + userProvAccountStaging(id: String!): SalesforceUserProvAccountStaging! + flowInterviewShare(id: String!): SalesforceFlowInterviewShare! + orgDeleteRequestShare(id: String!): SalesforceOrgDeleteRequestShare! + apexTestResult(id: String!): SalesforceApexTestResult! + folder(id: String!): SalesforceFolder! + quickTextShare(id: String!): SalesforceQuickTextShare! + authConfigProviders(id: String!): SalesforceAuthConfigProviders! + product2(id: String!): SalesforceProduct2! + acceptedEventRelation(id: String!): SalesforceAcceptedEventRelation! + sessionPermSetActivation(id: String!): SalesforceSessionPermSetActivation! + community(id: String!): SalesforceCommunity! + leadStatus(id: String!): SalesforceLeadStatus! + emailServicesFunction(id: String!): SalesforceEmailServicesFunction! + matchingRule(id: String!): SalesforceMatchingRule! + orgWideEmailAddress(id: String!): SalesforceOrgWideEmailAddress! + emailMessageRelation(id: String!): SalesforceEmailMessageRelation! + knowledgeableUser(id: String!): SalesforceKnowledgeableUser! + setupAuditTrail(id: String!): SalesforceSetupAuditTrail! + cronTrigger(id: String!): SalesforceCronTrigger! + grantedByLicense(id: String!): SalesforceGrantedByLicense! + cspTrustedSite(id: String!): SalesforceCspTrustedSite! + solutionHistory(id: String!): SalesforceSolutionHistory! + contentTagSubscription(id: String!): SalesforceContentTagSubscription! + contract(id: String!): SalesforceContract! + documentAttachmentMap(id: String!): SalesforceDocumentAttachmentMap! + macroInstruction(id: String!): SalesforceMacroInstruction! + customPermission(id: String!): SalesforceCustomPermission! + contractFeed(id: String!): SalesforceContractFeed! + contentWorkspacePermission(id: String!): SalesforceContentWorkspacePermission! + businessHours(id: String!): SalesforceBusinessHours! + macroHistory(id: String!): SalesforceMacroHistory! + user(id: String!): SalesforceUser! + dashboard(id: String!): SalesforceDashboard! + contentNotification(id: String!): SalesforceContentNotification! + caseContactRole(id: String!): SalesforceCaseContactRole! + testSuiteMembership(id: String!): SalesforceTestSuiteMembership! + orderShare(id: String!): SalesforceOrderShare! + userAppMenuCustomization(id: String!): SalesforceUserAppMenuCustomization! + topicUserEvent(id: String!): SalesforceTopicUserEvent! + announcement(id: String!): SalesforceAnnouncement! + externalDataUserAuth(id: String!): SalesforceExternalDataUserAuth! + searchPromotionRule(id: String!): SalesforceSearchPromotionRule! + leadCleanInfo(id: String!): SalesforceLeadCleanInfo! + event(id: String!): SalesforceEvent! + processDefinition(id: String!): SalesforceProcessDefinition! + permissionSetLicense(id: String!): SalesforcePermissionSetLicense! + campaignMemberStatus(id: String!): SalesforceCampaignMemberStatus! + contentVersion(id: String!): SalesforceContentVersion! + securityCustomBaseline(id: String!): SalesforceSecurityCustomBaseline! + dataAssessmentFieldMetric(id: String!): SalesforceDataAssessmentFieldMetric! + auraDefinition(id: String!): SalesforceAuraDefinition! + datacloudPurchaseUsage(id: String!): SalesforceDatacloudPurchaseUsage! + contact(id: String!): SalesforceContact! + contentDocument(id: String!): SalesforceContentDocument! + leadHistory(id: String!): SalesforceLeadHistory! + emailTemplate(id: String!): SalesforceEmailTemplate! + contentVersionRating(id: String!): SalesforceContentVersionRating! + quickTextHistory(id: String!): SalesforceQuickTextHistory! + authConfig(id: String!): SalesforceAuthConfig! + topic(id: String!): SalesforceTopic! + taskPriority(id: String!): SalesforceTaskPriority! + apexTestSuite(id: String!): SalesforceApexTestSuite! + report(id: String!): SalesforceReport! + visualforceAccessMetrics(id: String!): SalesforceVisualforceAccessMetrics! + authSession(id: String!): SalesforceAuthSession! + contentWorkspaceMember(id: String!): SalesforceContentWorkspaceMember! + queueSobject(id: String!): SalesforceQueueSobject! + verificationHistory(id: String!): SalesforceVerificationHistory! + domain(id: String!): SalesforceDomain! + connectedApplication(id: String!): SalesforceConnectedApplication! + dashboardComponent(id: String!): SalesforceDashboardComponent! + contentDocumentFeed(id: String!): SalesforceContentDocumentFeed! + contentWorkspace(id: String!): SalesforceContentWorkspace! + contentFolderMember(id: String!): SalesforceContentFolderMember! + assetRelationshipHistory(id: String!): SalesforceAssetRelationshipHistory! + callCenter(id: String!): SalesforceCallCenter! + caseTeamMember(id: String!): SalesforceCaseTeamMember! + mailmergeTemplate(id: String!): SalesforceMailmergeTemplate! + customObjectUserLicenseMetrics(id: String!): SalesforceCustomObjectUserLicenseMetrics! + listView(id: String!): SalesforceListView! + orgDeleteRequest(id: String!): SalesforceOrgDeleteRequest! + collaborationGroupFeed(id: String!): SalesforceCollaborationGroupFeed! + userPreference(id: String!): SalesforceUserPreference! + collaborationGroupMember(id: String!): SalesforceCollaborationGroupMember! + opportunityFieldHistory(id: String!): SalesforceOpportunityFieldHistory! + accountHistory(id: String!): SalesforceAccountHistory! + samlSsoConfig(id: String!): SalesforceSamlSsoConfig! + opportunityShare(id: String!): SalesforceOpportunityShare! + eventLogFile(id: String!): SalesforceEventLogFile! + assetRelationship(id: String!): SalesforceAssetRelationship! + eventFeed(id: String!): SalesforceEventFeed! + userRole(id: String!): SalesforceUserRole! + opportunityContactRole(id: String!): SalesforceOpportunityContactRole! + caseSolution(id: String!): SalesforceCaseSolution! + emailCapture(id: String!): SalesforceEmailCapture! + account(id: String!): SalesforceAccount! + profile(id: String!): SalesforceProfile! + opportunityStage(id: String!): SalesforceOpportunityStage! + contentFolderItem(id: String!): SalesforceContentFolderItem! + actionLinkTemplate(id: String!): SalesforceActionLinkTemplate! + permissionSet(id: String!): SalesforcePermissionSet! + assetRelationshipFeed(id: String!): SalesforceAssetRelationshipFeed! + campaignMember(id: String!): SalesforceCampaignMember! + product2History(id: String!): SalesforceProduct2History! + contactShare(id: String!): SalesforceContactShare! + assetShare(id: String!): SalesforceAssetShare! + accountCleanInfo(id: String!): SalesforceAccountCleanInfo! + packageLicense(id: String!): SalesforcePackageLicense! + userShare(id: String!): SalesforceUserShare! + permissionSetLicenseAssign(id: String!): SalesforcePermissionSetLicenseAssign! + userProvisioningRequest(id: String!): SalesforceUserProvisioningRequest! + userPackageLicense(id: String!): SalesforceUserPackageLicense! + fileSearchActivity(id: String!): SalesforceFileSearchActivity! + caseFeed(id: String!): SalesforceCaseFeed! + partnerRole(id: String!): SalesforcePartnerRole! + assetFeed(id: String!): SalesforceAssetFeed! + clientBrowser(id: String!): SalesforceClientBrowser! + accountContactRole(id: String!): SalesforceAccountContactRole! + listEmail(id: String!): SalesforceListEmail! + recordType(id: String!): SalesforceRecordType! + topicFeed(id: String!): SalesforceTopicFeed! + contentWorkspaceSubscription(id: String!): SalesforceContentWorkspaceSubscription! + caseTeamRole(id: String!): SalesforceCaseTeamRole! + feedAttachment(id: String!): SalesforceFeedAttachment! + tenantUsageEntitlement(id: String!): SalesforceTenantUsageEntitlement! + contentDocumentHistory(id: String!): SalesforceContentDocumentHistory! + domainSite(id: String!): SalesforceDomainSite! + pricebookEntry(id: String!): SalesforcePricebookEntry! + chatterExtensionConfig(id: String!): SalesforceChatterExtensionConfig! + campaignFeed(id: String!): SalesforceCampaignFeed! + listEmailShare(id: String!): SalesforceListEmailShare! + fiscalYearSettings(id: String!): SalesforceFiscalYearSettings! + categoryData(id: String!): SalesforceCategoryData! + contentDistribution(id: String!): SalesforceContentDistribution! + accountPartner(id: String!): SalesforceAccountPartner! + contentFolder(id: String!): SalesforceContentFolder! + todayGoalShare(id: String!): SalesforceTodayGoalShare! + idpEventLog(id: String!): SalesforceIdpEventLog! + flowInterview(id: String!): SalesforceFlowInterview! + solutionStatus(id: String!): SalesforceSolutionStatus! + staticResource(id: String!): SalesforceStaticResource! + solutionFeed(id: String!): SalesforceSolutionFeed! + eventRelation(id: String!): SalesforceEventRelation! + cronJobDetail(id: String!): SalesforceCronJobDetail! + pricebook2History(id: String!): SalesforcePricebook2History! + caseShare(id: String!): SalesforceCaseShare! + webLink(id: String!): SalesforceWebLink! + feedPollChoice(id: String!): SalesforceFeedPollChoice! + orderItemHistory(id: String!): SalesforceOrderItemHistory! + lead(id: String!): SalesforceLead! + feedComment(id: String!): SalesforceFeedComment! + externalDataSource(id: String!): SalesforceExternalDataSource! + site(id: String!): SalesforceSite! + loginIp(id: String!): SalesforceLoginIp! + installedMobileApp(id: String!): SalesforceInstalledMobileApp! + emailDomainKey(id: String!): SalesforceEmailDomainKey! + chatterActivity(id: String!): SalesforceChatterActivity! + caseHistory(id: String!): SalesforceCaseHistory! + loginHistory(id: String!): SalesforceLoginHistory! + pricebook2(id: String!): SalesforcePricebook2! + userProvMockTarget(id: String!): SalesforceUserProvMockTarget! + processNode(id: String!): SalesforceProcessNode! + orderItemFeed(id: String!): SalesforceOrderItemFeed! + listViewChart(id: String!): SalesforceListViewChart! + objectPermissions(id: String!): SalesforceObjectPermissions! + processInstanceStep(id: String!): SalesforceProcessInstanceStep! + caseTeamTemplate(id: String!): SalesforceCaseTeamTemplate! + apexTestResultLimits(id: String!): SalesforceApexTestResultLimits! + caseTeamTemplateMember(id: String!): SalesforceCaseTeamTemplateMember! + waveCompatibilityCheckItem(id: String!): SalesforceWaveCompatibilityCheckItem! + groupMember(id: String!): SalesforceGroupMember! + caseTeamTemplateRecord(id: String!): SalesforceCaseTeamTemplateRecord! + backgroundOperation(id: String!): SalesforceBackgroundOperation! + ideaComment(id: String!): SalesforceIdeaComment! + opportunityCompetitor(id: String!): SalesforceOpportunityCompetitor! + contentDocumentLink(id: String!): SalesforceContentDocumentLink! + chatterExtension(id: String!): SalesforceChatterExtension! + orderHistory(id: String!): SalesforceOrderHistory! + corsWhitelistEntry(id: String!): SalesforceCorsWhitelistEntry! + feedPollVote(id: String!): SalesforceFeedPollVote! + secureAgentsCluster(id: String!): SalesforceSecureAgentsCluster! + quickText(id: String!): SalesforceQuickText! + product2Feed(id: String!): SalesforceProduct2Feed! + contactFeed(id: String!): SalesforceContactFeed! + secureAgent(id: String!): SalesforceSecureAgent! + leadShare(id: String!): SalesforceLeadShare! + duplicateRecordSet(id: String!): SalesforceDuplicateRecordSet! + contactCleanInfo(id: String!): SalesforceContactCleanInfo! + setupEntityAccess(id: String!): SalesforceSetupEntityAccess! + document(id: String!): SalesforceDocument! + opportunityFeed(id: String!): SalesforceOpportunityFeed! + group(id: String!): SalesforceGroup! + contentWorkspaceDoc(id: String!): SalesforceContentWorkspaceDoc! + platformCachePartitionType(id: String!): SalesforcePlatformCachePartitionType! + processInstanceNode(id: String!): SalesforceProcessInstanceNode! + contractStatus(id: String!): SalesforceContractStatus! + dandBCompany(id: String!): SalesforceDandBCompany! + userProvisioningLog(id: String!): SalesforceUserProvisioningLog! + transactionSecurityPolicy(id: String!): SalesforceTransactionSecurityPolicy! + loginGeo(id: String!): SalesforceLoginGeo! + caseStatus(id: String!): SalesforceCaseStatus! + pushTopic(id: String!): SalesforcePushTopic! + holiday(id: String!): SalesforceHoliday! + contractHistory(id: String!): SalesforceContractHistory! + emailServicesAddress(id: String!): SalesforceEmailServicesAddress! + macro(id: String!): SalesforceMacro! + secureAgentPluginProperty(id: String!): SalesforceSecureAgentPluginProperty! + fieldPermissions(id: String!): SalesforceFieldPermissions! + apexTestQueueItem(id: String!): SalesforceApexTestQueueItem! + stamp(id: String!): SalesforceStamp! + streamingChannel(id: String!): SalesforceStreamingChannel! + contentVersionComment(id: String!): SalesforceContentVersionComment! + matchingRuleItem(id: String!): SalesforceMatchingRuleItem! + userFeed(id: String!): SalesforceUserFeed! + taskStatus(id: String!): SalesforceTaskStatus! + campaignHistory(id: String!): SalesforceCampaignHistory! + task(id: String!): SalesforceTask! + userProvisioningConfig(id: String!): SalesforceUserProvisioningConfig! + declinedEventRelation(id: String!): SalesforceDeclinedEventRelation! + duplicateRecordItem(id: String!): SalesforceDuplicateRecordItem! + permissionSetAssignment(id: String!): SalesforcePermissionSetAssignment! + campaignShare(id: String!): SalesforceCampaignShare! + searchActivity(id: String!): SalesforceSearchActivity! + asyncApexJob(id: String!): SalesforceAsyncApexJob! + userListViewCriterion(id: String!): SalesforceUserListViewCriterion! + orderItem(id: String!): SalesforceOrderItem! + emailMessage(id: String!): SalesforceEmailMessage! + collaborationGroupRecord(id: String!): SalesforceCollaborationGroupRecord! + apexLog(id: String!): SalesforceApexLog! + secureAgentPlugin(id: String!): SalesforceSecureAgentPlugin! + duplicateRule(id: String!): SalesforceDuplicateRule! + scontrol(id: String!): SalesforceScontrol! + feedRevision(id: String!): SalesforceFeedRevision! + leadFeed(id: String!): SalesforceLeadFeed! + lightningComponentBundle(id: String!): SalesforceLightningComponentBundle! + topicAssignment(id: String!): SalesforceTopicAssignment! + dataAssessmentMetric(id: String!): SalesforceDataAssessmentMetric! + apexTestRunResult(id: String!): SalesforceApexTestRunResult! + auraDefinitionBundle(id: String!): SalesforceAuraDefinitionBundle! + + """Collection of Salesforce Auth. Providers""" + authProviders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthProviderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthProviderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Auth. Providers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthProvidersConnection + + """Collection of Salesforce Platform Cache Partitions""" + platformCachePartitions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePlatformCachePartitionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePlatformCachePartitionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Platform Cache Partitions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePlatformCachePartitionsConnection + + """Collection of Salesforce Streaming Channel Shares""" + streamingChannelShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStreamingChannelShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStreamingChannelShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Streaming Channel Shares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceStreamingChannelSharesConnection + + """Collection of Salesforce Case Comments""" + caseComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Case Comments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseCommentsConnection + + """Collection of Salesforce Letterheads""" + brandTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceBrandTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceBrandTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Letterheads to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceBrandTemplatesConnection + + """Collection of Salesforce Undecided Event Relations""" + undecidedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUndecidedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUndecidedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Undecided Event Relations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUndecidedEventRelationsConnection + + """Collection of Salesforce Content Delivery Views""" + contentDistributionViews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionViewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionViewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Delivery Views to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionViewsConnection + + """Collection of Salesforce User Licenses""" + userLicenses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserLicenseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserLicenseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of User Licenses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserLicensesConnection + + """Collection of Salesforce Content User Subscriptions""" + contentUserSubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentUserSubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentUserSubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content User Subscriptions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentUserSubscriptionsConnection + + """Collection of Salesforce Process Instances""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Process Instances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Cases""" + cases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Cases to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCasesConnection + + """Collection of Salesforce Visualforce Pages""" + apexPages( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexPageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexPageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Visualforce Pages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexPagesConnection + + """Collection of Salesforce LightningComponentResources""" + lightningComponentResources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLightningComponentResourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLightningComponentResourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of LightningComponentResources to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceLightningComponentResourcesConnection + + """Collection of Salesforce Visualforce Components""" + apexComponents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexComponentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexComponentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Visualforce Components to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceApexComponentsConnection + + """Collection of Salesforce Forecast Shares""" + forecastShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceForecastShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceForecastShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Forecast Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceForecastSharesConnection + + """Collection of Salesforce Attachments""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce Opportunity Partners""" + opportunityPartners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityPartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityPartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Opportunity Partners to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityPartnersConnection + + """Collection of Salesforce Order Feeds""" + orderFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Order Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderFeedsConnection + + """Collection of Salesforce Orders""" + orders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Orders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrdersConnection + + """Collection of Salesforce Campaigns""" + campaigns( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Campaigns to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignsConnection + + """Collection of Salesforce Group Member Requests""" + collaborationGroupMemberRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupMemberRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupMemberRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Group Member Requests to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupMemberRequestsConnection + + """Collection of Salesforce Macro Shares""" + macroShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMacroShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMacroShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Macro Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMacroSharesConnection + + """Collection of Salesforce Asset Files""" + contentAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Asset Files to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentAssetsConnection + + """Collection of Salesforce Custom Permission Dependencies""" + customPermissionDependencies( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomPermissionDependencyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomPermissionDependencySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Custom Permission Dependencies to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCustomPermissionDependencysConnection + + """Collection of Salesforce Account Feeds""" + accountFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Account Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountFeedsConnection + + """Collection of Salesforce Custom Brand Assets""" + customBrandAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomBrandAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomBrandAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Custom Brand Assets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomBrandAssetsConnection + + """Collection of Salesforce User Logins""" + userLogins( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserLoginConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserLoginSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of User Logins to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserLoginsConnection + + """Collection of Salesforce Stamp Assignments""" + stampAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStampAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStampAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Stamp Assignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceStampAssignmentsConnection + + """Collection of Salesforce Apex Triggers""" + apexTriggers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTriggerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTriggerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Apex Triggers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTriggersConnection + + """Collection of Salesforce Sites""" + siteFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSiteFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSiteFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Sites to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSiteFeedsConnection + + """Collection of Salesforce Dashboard Feeds""" + dashboardFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Dashboard Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDashboardFeedsConnection + + """Collection of Salesforce Apex Classes""" + apexClasses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexClassConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexClassSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Apex Classes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexClasssConnection + + """Collection of Salesforce Account Shares""" + accountShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Account Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountSharesConnection + + """Collection of Salesforce Feed Items""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Feed Items to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce Content Folder Links""" + contentFolderLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Folder Links to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentFolderLinksConnection + + """Collection of Salesforce Periods""" + periods( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePeriodConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePeriodSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Periods to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePeriodsConnection + + """Collection of Salesforce Dashboard Component Feeds""" + dashboardComponentFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardComponentFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardComponentFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Dashboard Component Feeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDashboardComponentFeedsConnection + + """Collection of Salesforce Opportunity Histories""" + opportunityHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Opportunity Histories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityHistorysConnection + + """Collection of Salesforce Asset Histories""" + assetHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Asset Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetHistorysConnection + + """Collection of Salesforce UserAppMenuCustomization Shares""" + userAppMenuCustomizationShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserAppMenuCustomizationShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserAppMenuCustomizationShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserAppMenuCustomization Shares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserAppMenuCustomizationSharesConnection + + """Collection of Salesforce AppMenuItems""" + appMenuItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAppMenuItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAppMenuItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AppMenuItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAppMenuItemsConnection + + """Collection of Salesforce Last Used Apps""" + userAppInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserAppInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserAppInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Last Used Apps to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserAppInfosConnection + + """Collection of Salesforce Action Link Group Templates""" + actionLinkGroupTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceActionLinkGroupTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceActionLinkGroupTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Action Link Group Templates to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceActionLinkGroupTemplatesConnection + + """Collection of Salesforce User Provisioning Request Shares""" + userProvisioningRequestShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningRequestShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningRequestShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of User Provisioning Request Shares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningRequestSharesConnection + + """Collection of Salesforce Data.com Owned Entities""" + datacloudOwnedEntities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDatacloudOwnedEntityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDatacloudOwnedEntitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Data.com Owned Entities to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDatacloudOwnedEntitysConnection + + """Collection of Salesforce Assets""" + assets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Assets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetsConnection + + """Collection of Salesforce Approval Requests""" + processInstanceWorkitems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceWorkitemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceWorkitemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Approval Requests to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstanceWorkitemsConnection + + """Collection of Salesforce User Provisioning Accounts""" + userProvAccounts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvAccountConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvAccountSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of User Provisioning Accounts to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvAccountsConnection + + """Collection of Salesforce User List Views""" + userListViews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserListViewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserListViewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of User List Views to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserListViewsConnection + + """Collection of Salesforce Apex Email Notifications""" + apexEmailNotifications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexEmailNotificationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexEmailNotificationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Apex Email Notifications to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceApexEmailNotificationsConnection + + """Collection of Salesforce Category Nodes""" + categoryNodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCategoryNodeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCategoryNodeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Category Nodes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCategoryNodesConnection + + """Collection of Salesforce Entity Subscriptions""" + entitySubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Entity Subscriptions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Partners""" + partners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Partners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePartnersConnection + + """Collection of Salesforce Chatter Invitations""" + collaborationInvitations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationInvitationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationInvitationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Chatter Invitations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCollaborationInvitationsConnection + + """Collection of Salesforce Additional Directory Numbers""" + additionalNumbers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAdditionalNumberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAdditionalNumberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Additional Directory Numbers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAdditionalNumbersConnection + + """Collection of Salesforce Flow Record Relations""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Flow Record Relations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Opportunity Products""" + opportunityLineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityLineItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityLineItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Opportunity Products to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityLineItemsConnection + + """Collection of Salesforce Task Feeds""" + taskFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Task Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTaskFeedsConnection + + """Collection of Salesforce Organizations""" + organizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrganizationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrganizationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Organizations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrganizationsConnection + + """Collection of Salesforce Goals""" + todayGoals( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTodayGoalConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTodayGoalSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Goals to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTodayGoalsConnection + + """Collection of Salesforce Named Credentials""" + namedCredentials( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNamedCredentialConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNamedCredentialSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Named Credentials to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNamedCredentialsConnection + + """Collection of Salesforce List Email Recipient Sources""" + listEmailRecipientSources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListEmailRecipientSourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListEmailRecipientSourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of List Email Recipient Sources to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceListEmailRecipientSourcesConnection + + """Collection of Salesforce Contact Histories""" + contactHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contact Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactHistorysConnection + + """Collection of Salesforce Content Document Subscriptions""" + contentDocumentSubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentSubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentSubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Document Subscriptions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentSubscriptionsConnection + + """Collection of Salesforce Opportunities""" + opportunities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Opportunities to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunitysConnection + + """Collection of Salesforce Groups""" + collaborationGroups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Groups to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCollaborationGroupsConnection + + """Collection of Salesforce Ideas""" + ideas( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdeaConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdeaSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Ideas to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdeasConnection + + """Collection of Salesforce Content Version Histories""" + contentVersionHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Version Histories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentVersionHistorysConnection + + """Collection of Salesforce Report Feeds""" + reportFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceReportFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceReportFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Report Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceReportFeedsConnection + + """Collection of Salesforce Data Assessment Field Value Metrics""" + dataAssessmentValueMetrics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDataAssessmentValueMetricConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDataAssessmentValueMetricSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Data Assessment Field Value Metrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDataAssessmentValueMetricsConnection + + """Collection of Salesforce Custom Brands""" + customBrands( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomBrandConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomBrandSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Custom Brands to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomBrandsConnection + + """Collection of Salesforce Notes""" + notes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Notes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNotesConnection + + """Collection of Salesforce Assignment Rules""" + assignmentRules( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssignmentRuleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssignmentRuleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Assignment Rules to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssignmentRulesConnection + + """Collection of Salesforce Contract Contact Roles""" + contractContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Contract Contact Roles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContractContactRolesConnection + + """Collection of Salesforce Votes""" + votes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Votes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceVotesConnection + + """Collection of Salesforce Site Histories""" + siteHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSiteHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSiteHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Site Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSiteHistorysConnection + + """Collection of Salesforce Solutions""" + solutions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSolutionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSolutionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Solutions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSolutionsConnection + + """Collection of Salesforce Business Processes""" + businessProcesses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceBusinessProcessConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceBusinessProcessSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Business Processes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceBusinessProcesssConnection + + """Collection of Salesforce User Provisioning Account Stagings""" + userProvAccountStagings( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvAccountStagingConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvAccountStagingSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of User Provisioning Account Stagings to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvAccountStagingsConnection + + """Collection of Salesforce Flow Interview Shares""" + flowInterviewShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowInterviewShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowInterviewShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Flow Interview Shares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceFlowInterviewSharesConnection + + """Collection of Salesforce Org Delete Request Shares""" + orgDeleteRequestShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrgDeleteRequestShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrgDeleteRequestShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Org Delete Request Shares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOrgDeleteRequestSharesConnection + + """Collection of Salesforce Apex Test Results""" + apexTestResults( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestResultConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestResultSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Apex Test Results to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestResultsConnection + + """Collection of Salesforce Folders""" + folders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFolderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFolderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Folders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFoldersConnection + + """Collection of Salesforce Quick Text Shares""" + quickTextShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceQuickTextShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceQuickTextShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Quick Text Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceQuickTextSharesConnection + + """Collection of Salesforce Authentication Configuration Auth. Providers""" + authConfigProvidersPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthConfigProvidersConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthConfigProvidersSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Authentication Configuration Auth. Providers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAuthConfigProviderssConnection + + """Collection of Salesforce Products""" + product2s( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProduct2ConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProduct2SortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Products to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProduct2sConnection + + """Collection of Salesforce Accepted Event Relations""" + acceptedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAcceptedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAcceptedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Accepted Event Relations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAcceptedEventRelationsConnection + + """Collection of Salesforce Session Permission Set Activations""" + sessionPermSetActivations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSessionPermSetActivationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSessionPermSetActivationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Session Permission Set Activations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSessionPermSetActivationsConnection + + """Collection of Salesforce Zones""" + communities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCommunityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCommunitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Zones to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCommunitysConnection + + """Collection of Salesforce Lead Status Values""" + leadStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Lead Status Values to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadStatussConnection + + """Collection of Salesforce Email Services""" + emailServicesFunctions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailServicesFunctionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailServicesFunctionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Email Services to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailServicesFunctionsConnection + + """Collection of Salesforce Matching Rules""" + matchingRules( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMatchingRuleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMatchingRuleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Matching Rules to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMatchingRulesConnection + + """Collection of Salesforce Organization-wide From Email Addresses""" + orgWideEmailAddresses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrgWideEmailAddressConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrgWideEmailAddressSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Organization-wide From Email Addresses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOrgWideEmailAddresssConnection + + """Collection of Salesforce Email Message Relations""" + emailMessageRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Email Message Relations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceEmailMessageRelationsConnection + + """Collection of Salesforce Knowledgeable Users""" + knowledgeableUsers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceKnowledgeableUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceKnowledgeableUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Knowledgeable Users to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceKnowledgeableUsersConnection + + """Collection of Salesforce Setup Audit Trail Entries""" + setupAuditTrails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSetupAuditTrailConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSetupAuditTrailSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Setup Audit Trail Entries to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSetupAuditTrailsConnection + + """Collection of Salesforce Scheduled Jobs""" + cronTriggers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCronTriggerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCronTriggerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Scheduled Jobs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCronTriggersConnection + + """Collection of Salesforce Setting Granted By Licenses""" + grantedByLicenses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceGrantedByLicenseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceGrantedByLicenseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Setting Granted By Licenses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceGrantedByLicensesConnection + + """Collection of Salesforce Content Security Policy Trusted Sites""" + cspTrustedSites( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCspTrustedSiteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCspTrustedSiteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Security Policy Trusted Sites to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCspTrustedSitesConnection + + """Collection of Salesforce Solution Histories""" + solutionHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSolutionHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSolutionHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Solution Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSolutionHistorysConnection + + """Collection of Salesforce Content Tag Subscriptions""" + contentTagSubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentTagSubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentTagSubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Tag Subscriptions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentTagSubscriptionsConnection + + """Collection of Salesforce Contracts""" + contracts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contracts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractsConnection + + """Collection of Salesforce Document Entity Maps""" + documentAttachmentMaps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDocumentAttachmentMapConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDocumentAttachmentMapSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Document Entity Maps to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDocumentAttachmentMapsConnection + + """Collection of Salesforce Macro Instructions""" + macroInstructions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMacroInstructionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMacroInstructionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Macro Instructions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMacroInstructionsConnection + + """Collection of Salesforce Custom Permissions""" + customPermissions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomPermissionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomPermissionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Custom Permissions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomPermissionsConnection + + """Collection of Salesforce Contract Feeds""" + contractFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contract Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractFeedsConnection + + """Collection of Salesforce Library Permissions""" + contentWorkspacePermissions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspacePermissionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspacePermissionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Library Permissions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentWorkspacePermissionsConnection + + """Collection of Salesforce Business Hours""" + businessHoursPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceBusinessHoursConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceBusinessHoursSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Business Hours to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceBusinessHourssConnection + + """Collection of Salesforce Macro Histories""" + macroHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMacroHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMacroHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Macro Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMacroHistorysConnection + + """Collection of Salesforce Users""" + users( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Users to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUsersConnection + + """Collection of Salesforce Dashboards""" + dashboards( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Dashboards to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDashboardsConnection + + """Collection of Salesforce Content Notifications""" + contentNotifications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentNotificationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentNotificationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Notifications to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentNotificationsConnection + + """Collection of Salesforce Case Contact Roles""" + caseContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Case Contact Roles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseContactRolesConnection + + """Collection of Salesforce Test Suite Memberships""" + testSuiteMemberships( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTestSuiteMembershipConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTestSuiteMembershipSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Test Suite Memberships to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceTestSuiteMembershipsConnection + + """Collection of Salesforce Order Shares""" + orderShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Order Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderSharesConnection + + """Collection of Salesforce UserAppMenuCustomizations""" + userAppMenuCustomizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserAppMenuCustomizationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserAppMenuCustomizationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserAppMenuCustomizations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserAppMenuCustomizationsConnection + + """Collection of Salesforce Topic User Events""" + topicUserEvents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicUserEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicUserEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Topic User Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicUserEventsConnection + + """Collection of Salesforce Announcements""" + announcements( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAnnouncementConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAnnouncementSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Announcements to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAnnouncementsConnection + + """Collection of Salesforce External Data User Authentications""" + externalDataUserAuths( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceExternalDataUserAuthConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceExternalDataUserAuthSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of External Data User Authentications to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceExternalDataUserAuthsConnection + + """Collection of Salesforce Promoted Search Terms""" + searchPromotionRules( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSearchPromotionRuleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSearchPromotionRuleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Promoted Search Terms to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSearchPromotionRulesConnection + + """Collection of Salesforce Lead Clean Infos""" + leadCleanInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Lead Clean Infos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadCleanInfosConnection + + """Collection of Salesforce Events""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce Process Definitions""" + processDefinitions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessDefinitionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessDefinitionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Process Definitions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessDefinitionsConnection + + """Collection of Salesforce Permission Set Licenses""" + permissionSetLicenses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetLicenseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetLicenseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Permission Set Licenses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePermissionSetLicensesConnection + + """Collection of Salesforce Campaign Member Statuses""" + campaignMemberStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignMemberStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignMemberStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Campaign Member Statuses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCampaignMemberStatussConnection + + """Collection of Salesforce Content Versions""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Content Versions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce Security Custom Baselines""" + securityCustomBaselines( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecurityCustomBaselineConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecurityCustomBaselineSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Security Custom Baselines to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSecurityCustomBaselinesConnection + + """Collection of Salesforce Data Assessment Field Metrics""" + dataAssessmentFieldMetrics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDataAssessmentFieldMetricConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDataAssessmentFieldMetricSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Data Assessment Field Metrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDataAssessmentFieldMetricsConnection + + """Collection of Salesforce Lightning Component Definitions""" + auraDefinitions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuraDefinitionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuraDefinitionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Lightning Component Definitions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAuraDefinitionsConnection + + """Collection of Salesforce Data.com Usages""" + datacloudPurchaseUsages( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDatacloudPurchaseUsageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDatacloudPurchaseUsageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Data.com Usages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDatacloudPurchaseUsagesConnection + + """Collection of Salesforce Contacts""" + contacts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contacts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactsConnection + + """Collection of Salesforce Content Documents""" + contentDocuments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Content Documents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentDocumentsConnection + + """Collection of Salesforce Lead Histories""" + leadHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Lead Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadHistorysConnection + + """Collection of Salesforce Email Templates""" + emailTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Email Templates to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailTemplatesConnection + + """Collection of Salesforce Content Version Ratings""" + contentVersionRatings( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionRatingConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionRatingSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Version Ratings to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentVersionRatingsConnection + + """Collection of Salesforce Quick Text Histories""" + quickTextHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceQuickTextHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceQuickTextHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Quick Text Histories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceQuickTextHistorysConnection + + """Collection of Salesforce Authentication Configurations""" + authConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Authentication Configurations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAuthConfigsConnection + + """Collection of Salesforce Topics""" + topics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Topics to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicsConnection + + """Collection of Salesforce Task Priority Values""" + taskPriorities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskPriorityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskPrioritySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Task Priority Values to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceTaskPrioritysConnection + + """Collection of Salesforce Apex Test Suites""" + apexTestSuites( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestSuiteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestSuiteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Apex Test Suites to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestSuitesConnection + + """Collection of Salesforce Reports""" + reports( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceReportConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceReportSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Reports to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceReportsConnection + + """Collection of Salesforce Visualforce Access Metrics""" + visualforceAccessMetricsPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVisualforceAccessMetricsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVisualforceAccessMetricsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Visualforce Access Metrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceVisualforceAccessMetricssConnection + + """Collection of Salesforce Auth Sessions""" + authSessions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthSessionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthSessionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Auth Sessions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthSessionsConnection + + """Collection of Salesforce Library Members""" + contentWorkspaceMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Library Members to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentWorkspaceMembersConnection + + """Collection of Salesforce Queue Sobjects""" + queueSobjects( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceQueueSobjectConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceQueueSobjectSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Queue Sobjects to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceQueueSobjectsConnection + + """Collection of Salesforce Identity Verification Histories""" + verificationHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVerificationHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVerificationHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Identity Verification Histories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceVerificationHistorysConnection + + """Collection of Salesforce Domains""" + domains( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDomainConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDomainSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Domains to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDomainsConnection + + """Collection of Salesforce Connected Apps""" + connectedApplications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceConnectedApplicationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceConnectedApplicationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Connected Apps to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceConnectedApplicationsConnection + + """Collection of Salesforce Dashboard Components""" + dashboardComponents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardComponentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardComponentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Dashboard Components to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDashboardComponentsConnection + + """Collection of Salesforce ContentDocument Feeds""" + contentDocumentFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocument Feeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentFeedsConnection + + """Collection of Salesforce Libraries""" + contentWorkspaces( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Libraries to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentWorkspacesConnection + + """Collection of Salesforce Content Folder Members""" + contentFolderMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Folder Members to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentFolderMembersConnection + + """Collection of Salesforce Asset Relationship Histories""" + assetRelationshipHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetRelationshipHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetRelationshipHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Asset Relationship Histories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAssetRelationshipHistorysConnection + + """Collection of Salesforce Call Centers""" + callCenters( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCallCenterConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCallCenterSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Call Centers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCallCentersConnection + + """Collection of Salesforce Case Team Members""" + caseTeamMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Case Team Members to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseTeamMembersConnection + + """Collection of Salesforce Mail Merge Templates""" + mailmergeTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMailmergeTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMailmergeTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Mail Merge Templates to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceMailmergeTemplatesConnection + + """Collection of Salesforce Custom Object Usage By User License Metrics""" + customObjectUserLicenseMetricsPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomObjectUserLicenseMetricsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomObjectUserLicenseMetricsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Custom Object Usage By User License Metrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCustomObjectUserLicenseMetricssConnection + + """Collection of Salesforce List Views""" + listViews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListViewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListViewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of List Views to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceListViewsConnection + + """Collection of Salesforce Org Delete Requests""" + orgDeleteRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrgDeleteRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrgDeleteRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Org Delete Requests to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrgDeleteRequestsConnection + + """Collection of Salesforce Group Feeds""" + collaborationGroupFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Group Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCollaborationGroupFeedsConnection + + """Collection of Salesforce User Preferences""" + userPreferences( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserPreferenceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserPreferenceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of User Preferences to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserPreferencesConnection + + """Collection of Salesforce Group Members""" + collaborationGroupMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Group Members to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCollaborationGroupMembersConnection + + """Collection of Salesforce Opportunity Field Histories""" + opportunityFieldHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityFieldHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityFieldHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Opportunity Field Histories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityFieldHistorysConnection + + """Collection of Salesforce Account Histories""" + accountHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Account Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountHistorysConnection + + """Collection of Salesforce SAML Single Sign-On Settings""" + samlSsoConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSamlSsoConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSamlSsoConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of SAML Single Sign-On Settings to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSamlSsoConfigsConnection + + """Collection of Salesforce Opportunity Shares""" + opportunityShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Opportunity Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunitySharesConnection + + """Collection of Salesforce Event Log Files""" + eventLogFiles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventLogFileConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventLogFileSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Event Log Files to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventLogFilesConnection + + """Collection of Salesforce Asset Relationships""" + assetRelationships( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetRelationshipConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetRelationshipSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Asset Relationships to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetRelationshipsConnection + + """Collection of Salesforce Event Feeds""" + eventFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Event Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventFeedsConnection + + """Collection of Salesforce Roles""" + userRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Roles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserRolesConnection + + """Collection of Salesforce Opportunity Contact Roles""" + opportunityContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Opportunity Contact Roles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityContactRolesConnection + + """Collection of Salesforce Case Solutions""" + caseSolutions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseSolutionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseSolutionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Case Solutions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseSolutionsConnection + + """Collection of Salesforce EmailCaptures""" + emailCaptures( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailCaptureConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailCaptureSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailCaptures to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailCapturesConnection + + """Collection of Salesforce Accounts""" + accounts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Accounts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountsConnection + + """Collection of Salesforce Profiles""" + profiles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProfileConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProfileSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Profiles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProfilesConnection + + """Collection of Salesforce Opportunity Stages""" + opportunityStages( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityStageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityStageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Opportunity Stages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunityStagesConnection + + """Collection of Salesforce Content Folder Items""" + contentFolderItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Folder Items to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentFolderItemsConnection + + """Collection of Salesforce Action Link Templates""" + actionLinkTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceActionLinkTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceActionLinkTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Action Link Templates to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceActionLinkTemplatesConnection + + """Collection of Salesforce Permission Sets""" + permissionSets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Permission Sets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePermissionSetsConnection + + """Collection of Salesforce Asset Relationship Feeds""" + assetRelationshipFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetRelationshipFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetRelationshipFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Asset Relationship Feeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAssetRelationshipFeedsConnection + + """Collection of Salesforce Campaign Members""" + campaignMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Campaign Members to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignMembersConnection + + """Collection of Salesforce Product Histories""" + product2Histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProduct2HistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProduct2HistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Product Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProduct2HistorysConnection + + """Collection of Salesforce Contact Shares""" + contactShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contact Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactSharesConnection + + """Collection of Salesforce Asset Shares""" + assetShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Asset Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetSharesConnection + + """Collection of Salesforce Account Clean Infos""" + accountCleanInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Account Clean Infos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountCleanInfosConnection + + """Collection of Salesforce Package Licenses""" + packageLicenses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePackageLicenseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePackageLicenseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Package Licenses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePackageLicensesConnection + + """Collection of Salesforce User Shares""" + userShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of User Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserSharesConnection + + """Collection of Salesforce Permission Set License Assignments""" + permissionSetLicenseAssigns( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetLicenseAssignConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetLicenseAssignSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Permission Set License Assignments to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePermissionSetLicenseAssignsConnection + + """Collection of Salesforce User Provisioning Requests""" + userProvisioningRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of User Provisioning Requests to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningRequestsConnection + + """Collection of Salesforce User Package Licenses""" + userPackageLicenses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserPackageLicenseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserPackageLicenseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of User Package Licenses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserPackageLicensesConnection + + """Collection of Salesforce FileSearchActivities""" + fileSearchActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFileSearchActivityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFileSearchActivitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of FileSearchActivities to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceFileSearchActivitysConnection + + """Collection of Salesforce Case Feeds""" + caseFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Case Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseFeedsConnection + + """Collection of Salesforce Partner Role Values""" + partnerRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePartnerRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePartnerRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Partner Role Values to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePartnerRolesConnection + + """Collection of Salesforce Asset Feeds""" + assetFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Asset Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetFeedsConnection + + """Collection of Salesforce Client Browsers""" + clientBrowsers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceClientBrowserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceClientBrowserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Client Browsers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceClientBrowsersConnection + + """Collection of Salesforce Account Contact Roles""" + accountContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Account Contact Roles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAccountContactRolesConnection + + """Collection of Salesforce List Emails""" + listEmails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListEmailConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListEmailSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of List Emails to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceListEmailsConnection + + """Collection of Salesforce Record Types""" + recordTypes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceRecordTypeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceRecordTypeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Record Types to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceRecordTypesConnection + + """Collection of Salesforce Topic Feeds""" + topicFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Topic Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicFeedsConnection + + """Collection of Salesforce Content Workspace Subscriptions""" + contentWorkspaceSubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceSubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceSubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Workspace Subscriptions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentWorkspaceSubscriptionsConnection + + """Collection of Salesforce Case Team Member Roles""" + caseTeamRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Case Team Member Roles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCaseTeamRolesConnection + + """Collection of Salesforce Feed Attachments""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Feed Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce Tenant Usage Entitlements""" + tenantUsageEntitlements( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTenantUsageEntitlementConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTenantUsageEntitlementSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Tenant Usage Entitlements to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceTenantUsageEntitlementsConnection + + """Collection of Salesforce Content Document Histories""" + contentDocumentHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Document Histories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentHistorysConnection + + """Collection of Salesforce Custom URLs""" + domainSites( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDomainSiteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDomainSiteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Custom URLs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDomainSitesConnection + + """Collection of Salesforce Price Book Entries""" + pricebookEntries( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePricebookEntryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePricebookEntrySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Price Book Entries to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePricebookEntrysConnection + + """Collection of Salesforce Chatter Extension Configurations""" + chatterExtensionConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceChatterExtensionConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceChatterExtensionConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Chatter Extension Configurations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceChatterExtensionConfigsConnection + + """Collection of Salesforce Campaign Feeds""" + campaignFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Campaign Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignFeedsConnection + + """Collection of Salesforce List Email Shares""" + listEmailShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListEmailShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListEmailShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of List Email Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceListEmailSharesConnection + + """Collection of Salesforce Fiscal Year Settings""" + fiscalYearSettingsPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFiscalYearSettingsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFiscalYearSettingsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Fiscal Year Settings to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceFiscalYearSettingssConnection + + """Collection of Salesforce Category Datas""" + categoryDatas( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCategoryDataConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCategoryDataSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Category Datas to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCategoryDatasConnection + + """Collection of Salesforce Content Deliveries""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Content Deliveries to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce Account Partners""" + accountPartners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountPartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountPartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Account Partners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountPartnersConnection + + """Collection of Salesforce Content Folders""" + contentFolders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Content Folders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentFoldersConnection + + """Collection of Salesforce Goal Shares""" + todayGoalShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTodayGoalShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTodayGoalShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Goal Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTodayGoalSharesConnection + + """Collection of Salesforce Identity Provider Event Logs""" + idpEventLogs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdpEventLogConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdpEventLogSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Identity Provider Event Logs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceIdpEventLogsConnection + + """Collection of Salesforce Flow Interviews""" + flowInterviews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowInterviewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowInterviewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Flow Interviews to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowInterviewsConnection + + """Collection of Salesforce Solution Status Values""" + solutionStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSolutionStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSolutionStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Solution Status Values to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSolutionStatussConnection + + """Collection of Salesforce Static Resources""" + staticResources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStaticResourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStaticResourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Static Resources to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceStaticResourcesConnection + + """Collection of Salesforce Solution Feeds""" + solutionFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSolutionFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSolutionFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Solution Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSolutionFeedsConnection + + """Collection of Salesforce Event Relations""" + eventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Event Relations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventRelationsConnection + + """Collection of Salesforce Cron Jobs""" + cronJobDetails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCronJobDetailConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCronJobDetailSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Cron Jobs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCronJobDetailsConnection + + """Collection of Salesforce Price Book Histories""" + pricebook2Histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePricebook2HistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePricebook2HistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Price Book Histories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePricebook2HistorysConnection + + """Collection of Salesforce Case Shares""" + caseShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Case Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseSharesConnection + + """Collection of Salesforce Custom Button or Links""" + webLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceWebLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceWebLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Custom Button or Links to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceWebLinksConnection + + """Collection of Salesforce Feed Poll Choices""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Feed Poll Choices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce Order Product Histories""" + orderItemHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Order Product Histories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOrderItemHistorysConnection + + """Collection of Salesforce Leads""" + leads( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Leads to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadsConnection + + """Collection of Salesforce Feed Comments""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Feed Comments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce External Data Sources""" + externalDataSources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceExternalDataSourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceExternalDataSourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of External Data Sources to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceExternalDataSourcesConnection + + """Collection of Salesforce Sites""" + sites( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSiteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSiteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Sites to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSitesConnection + + """Collection of Salesforce Login IPs""" + loginIps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLoginIpConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLoginIpSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Login IPs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLoginIpsConnection + + """Collection of Salesforce Installed Mobile Apps""" + installedMobileApps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceInstalledMobileAppConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceInstalledMobileAppSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Installed Mobile Apps to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceInstalledMobileAppsConnection + + """Collection of Salesforce Email Domain Keys""" + emailDomainKeys( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailDomainKeyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailDomainKeySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Email Domain Keys to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailDomainKeysConnection + + """Collection of Salesforce Chatter Activities""" + chatterActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceChatterActivityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceChatterActivitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Chatter Activities to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceChatterActivitysConnection + + """Collection of Salesforce Case Histories""" + caseHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Case Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseHistorysConnection + + """Collection of Salesforce Login Histories""" + loginHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLoginHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLoginHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Login Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLoginHistorysConnection + + """Collection of Salesforce Price Books""" + pricebook2s( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePricebook2ConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePricebook2SortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Price Books to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePricebook2sConnection + + """Collection of Salesforce User Provisioning Mock Targets""" + userProvMockTargets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvMockTargetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvMockTargetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of User Provisioning Mock Targets to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvMockTargetsConnection + + """Collection of Salesforce Process Nodes""" + processNodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessNodeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessNodeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Process Nodes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessNodesConnection + + """Collection of Salesforce Order Product Feeds""" + orderItemFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Order Product Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemFeedsConnection + + """Collection of Salesforce List View Charts""" + listViewCharts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListViewChartConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListViewChartSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of List View Charts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceListViewChartsConnection + + """Collection of Salesforce Object Permissions""" + objectPermissionsPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceObjectPermissionsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceObjectPermissionsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Object Permissions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceObjectPermissionssConnection + + """Collection of Salesforce Process Instance Steps""" + processInstanceSteps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceStepConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceStepSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Process Instance Steps to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceProcessInstanceStepsConnection + + """Collection of Salesforce Predefined Case Teams""" + caseTeamTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Predefined Case Teams to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCaseTeamTemplatesConnection + + """Collection of Salesforce Apex Test Result Limits""" + apexTestResultLimitsPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestResultLimitsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestResultLimitsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Apex Test Result Limits to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceApexTestResultLimitssConnection + + """Collection of Salesforce Predefined Case Team Members""" + caseTeamTemplateMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamTemplateMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamTemplateMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Predefined Case Team Members to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCaseTeamTemplateMembersConnection + + """Collection of Salesforce Wave Compatibility Check Items""" + waveCompatibilityCheckItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceWaveCompatibilityCheckItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceWaveCompatibilityCheckItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Wave Compatibility Check Items to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceWaveCompatibilityCheckItemsConnection + + """Collection of Salesforce Group Members""" + groupMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceGroupMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceGroupMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Group Members to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceGroupMembersConnection + + """Collection of Salesforce Predefined Case Team Records""" + caseTeamTemplateRecords( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamTemplateRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamTemplateRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Predefined Case Team Records to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCaseTeamTemplateRecordsConnection + + """Collection of Salesforce Background Operations""" + backgroundOperations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceBackgroundOperationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceBackgroundOperationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Background Operations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceBackgroundOperationsConnection + + """Collection of Salesforce Idea Comments""" + ideaComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdeaCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdeaCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Idea Comments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdeaCommentsConnection + + """Collection of Salesforce Opportunity: Competitors""" + opportunityCompetitors( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityCompetitorConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityCompetitorSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Opportunity: Competitors to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityCompetitorsConnection + + """Collection of Salesforce Content Document Links""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Document Links to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce Chatter Extensions""" + chatterExtensions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceChatterExtensionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceChatterExtensionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Chatter Extensions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceChatterExtensionsConnection + + """Collection of Salesforce Order Histories""" + orderHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Order Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderHistorysConnection + + """Collection of Salesforce CORS Whitelist Origins""" + corsWhitelistEntries( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCorsWhitelistEntryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCorsWhitelistEntrySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CORS Whitelist Origins to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCorsWhitelistEntrysConnection + + """Collection of Salesforce Feed Poll Votes""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Feed Poll Votes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + + """Collection of Salesforce Secure Agent Clusters""" + secureAgentsClusters( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecureAgentsClusterConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecureAgentsClusterSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Secure Agent Clusters to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSecureAgentsClustersConnection + + """Collection of Salesforce Quick Texts""" + quickTexts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceQuickTextConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceQuickTextSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Quick Texts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceQuickTextsConnection + + """Collection of Salesforce Product Feeds""" + product2Feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProduct2FeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProduct2FeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Product Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProduct2FeedsConnection + + """Collection of Salesforce Contact Feeds""" + contactFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contact Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactFeedsConnection + + """Collection of Salesforce Secure Agents""" + secureAgents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecureAgentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecureAgentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Secure Agents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSecureAgentsConnection + + """Collection of Salesforce Lead Shares""" + leadShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Lead Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadSharesConnection + + """Collection of Salesforce Duplicate Record Sets""" + duplicateRecordSets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDuplicateRecordSetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDuplicateRecordSetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Duplicate Record Sets to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDuplicateRecordSetsConnection + + """Collection of Salesforce Contact Clean Infos""" + contactCleanInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contact Clean Infos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactCleanInfosConnection + + """Collection of Salesforce Setup Entity Accesses""" + setupEntityAccesses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSetupEntityAccessConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSetupEntityAccessSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Setup Entity Accesses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSetupEntityAccesssConnection + + """Collection of Salesforce Documents""" + documents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDocumentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDocumentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Documents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDocumentsConnection + + """Collection of Salesforce Opportunity Feeds""" + opportunityFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Opportunity Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunityFeedsConnection + + """Collection of Salesforce Groups""" + groups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceGroupConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceGroupSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Groups to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceGroupsConnection + + """Collection of Salesforce Library Documents""" + contentWorkspaceDocs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceDocConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceDocSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Library Documents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentWorkspaceDocsConnection + + """Collection of Salesforce Platform Cache Partition Types""" + platformCachePartitionTypes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePlatformCachePartitionTypeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePlatformCachePartitionTypeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Platform Cache Partition Types to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePlatformCachePartitionTypesConnection + + """Collection of Salesforce Process Instance Nodes""" + processInstanceNodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceNodeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceNodeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Process Instance Nodes to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceProcessInstanceNodesConnection + + """Collection of Salesforce Contract Status Values""" + contractStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Contract Status Values to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContractStatussConnection + + """Collection of Salesforce D&B Companies""" + dandBCompanies( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDandBCompanyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDandBCompanySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of D&B Companies to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDandBCompanysConnection + + """Collection of Salesforce User Provisioning Logs""" + userProvisioningLogs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningLogConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningLogSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of User Provisioning Logs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningLogsConnection + + """Collection of Salesforce Transaction Security Policies""" + transactionSecurityPolicies( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTransactionSecurityPolicyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTransactionSecurityPolicySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Transaction Security Policies to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceTransactionSecurityPolicysConnection + + """Collection of Salesforce Login Geo Datas""" + loginGeos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLoginGeoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLoginGeoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Login Geo Datas to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLoginGeosConnection + + """Collection of Salesforce Case Status Values""" + caseStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Case Status Values to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseStatussConnection + + """Collection of Salesforce Push Topics""" + pushTopics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePushTopicConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePushTopicSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Push Topics to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePushTopicsConnection + + """Collection of Salesforce Holidays""" + holidays( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceHolidayConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceHolidaySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Holidays to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceHolidaysConnection + + """Collection of Salesforce Contract Histories""" + contractHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contract Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractHistorysConnection + + """Collection of Salesforce Email Services Addresses""" + emailServicesAddresses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailServicesAddressConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailServicesAddressSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Email Services Addresses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceEmailServicesAddresssConnection + + """Collection of Salesforce Macros""" + macros( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMacroConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMacroSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Macros to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMacrosConnection + + """Collection of Salesforce Secure Agent Plug-in Properties""" + secureAgentPluginProperties( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecureAgentPluginPropertyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecureAgentPluginPropertySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Secure Agent Plug-in Properties to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSecureAgentPluginPropertysConnection + + """Collection of Salesforce Field Permissions""" + fieldPermissionsPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFieldPermissionsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFieldPermissionsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Field Permissions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFieldPermissionssConnection + + """Collection of Salesforce Apex Test Queue Items""" + apexTestQueueItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestQueueItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestQueueItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Apex Test Queue Items to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceApexTestQueueItemsConnection + + """Collection of Salesforce Stamps""" + stamps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStampConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStampSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Stamps to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceStampsConnection + + """Collection of Salesforce Streaming Channels""" + streamingChannels( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStreamingChannelConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStreamingChannelSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Streaming Channels to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceStreamingChannelsConnection + + """Collection of Salesforce Content Version Comments""" + contentVersionComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Content Version Comments to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentVersionCommentsConnection + + """Collection of Salesforce Matching Rule Items""" + matchingRuleItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMatchingRuleItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMatchingRuleItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Matching Rule Items to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMatchingRuleItemsConnection + + """Collection of Salesforce User Feeds""" + userFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of User Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserFeedsConnection + + """Collection of Salesforce Task Status Values""" + taskStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Task Status Values to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTaskStatussConnection + + """Collection of Salesforce Campaign Field Histories""" + campaignHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Campaign Field Histories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCampaignHistorysConnection + + """Collection of Salesforce Tasks""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce User Provisioning Configs""" + userProvisioningConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of User Provisioning Configs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningConfigsConnection + + """Collection of Salesforce Declined Event Relations""" + declinedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDeclinedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDeclinedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Declined Event Relations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDeclinedEventRelationsConnection + + """Collection of Salesforce Duplicate Record Items""" + duplicateRecordItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDuplicateRecordItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDuplicateRecordItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Duplicate Record Items to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDuplicateRecordItemsConnection + + """Collection of Salesforce Permission Set Assignments""" + permissionSetAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Permission Set Assignments to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePermissionSetAssignmentsConnection + + """Collection of Salesforce Campaign Shares""" + campaignShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Campaign Shares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignSharesConnection + + """Collection of Salesforce SearchActivities""" + searchActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSearchActivityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSearchActivitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SearchActivities to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSearchActivitysConnection + + """Collection of Salesforce Apex Jobs""" + asyncApexJobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAsyncApexJobConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAsyncApexJobSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Apex Jobs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAsyncApexJobsConnection + + """Collection of Salesforce User List View Criterias""" + userListViewCriterions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserListViewCriterionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserListViewCriterionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of User List View Criterias to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserListViewCriterionsConnection + + """Collection of Salesforce Order Products""" + orderItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Order Products to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemsConnection + + """Collection of Salesforce Email Messages""" + emailMessages( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Email Messages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce Group Records""" + collaborationGroupRecords( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Group Records to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCollaborationGroupRecordsConnection + + """Collection of Salesforce Apex Debug Logs""" + apexLogs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexLogConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexLogSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Apex Debug Logs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexLogsConnection + + """Collection of Salesforce Secure Agent Plug-ins""" + secureAgentPlugins( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecureAgentPluginConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecureAgentPluginSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Secure Agent Plug-ins to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSecureAgentPluginsConnection + + """Collection of Salesforce Duplicate Rules""" + duplicateRules( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDuplicateRuleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDuplicateRuleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Duplicate Rules to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDuplicateRulesConnection + + """Collection of Salesforce Custom S-Controls""" + scontrols( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceScontrolConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceScontrolSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Custom S-Controls to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceScontrolsConnection + + """Collection of Salesforce Feed Revisions""" + feedRevisions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedRevisionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedRevisionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Feed Revisions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedRevisionsConnection + + """Collection of Salesforce Lead Feeds""" + leadFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Lead Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadFeedsConnection + + """Collection of Salesforce LightningComponentBundles""" + lightningComponentBundles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLightningComponentBundleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLightningComponentBundleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of LightningComponentBundles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceLightningComponentBundlesConnection + + """Collection of Salesforce Records""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Records to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + + """Collection of Salesforce Data Assessment Metrics""" + dataAssessmentMetrics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDataAssessmentMetricConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDataAssessmentMetricSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Data Assessment Metrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDataAssessmentMetricsConnection + + """Collection of Salesforce Apex Test Run Results""" + apexTestRunResults( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestRunResultConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestRunResultSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Apex Test Run Results to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceApexTestRunResultsConnection + + """Collection of Salesforce Lightning Component Bundles""" + auraDefinitionBundles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuraDefinitionBundleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: String + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuraDefinitionBundleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of Lightning Component Bundles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAuraDefinitionBundlesConnection + + """ + Run a SOQL query that fetches any sobject. + + For now, any fields used in the query body must be selected in the query. Some fields may need to be suffixed with `Id`. + + Example: + + ``` + { + + salesforce { + soql(query: "select name, id, ownerId from Account limit 10") { + nodes { + ... on SalesforceAccount { + name + id + owner { + name + } + } + } + } + } + } + ``` + + """ + soql(query: String!): SalesforceSoqlResult! @deprecated(reason: "This field is still in beta and has many rough edges.") + + """ + Make a REST API call to the Salesforce API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: SalesforcePassthroughQuery! +} + +"""Download data for npm overall""" +type NpmOverallDownloadPeriodData { + """The start date of download stats""" + start: String! + + """The end date of download stats""" + end: String! + + """ + The download stats for all over npm for the given range. Check out explanation of how [npm download counts work](http://blog.npmjs.org/post/92574016600/numeric-precision-matters-how-npm-download-counts), including "what counts as a download?" + """ + count: Int! + + """ + "Download data for all of npm for a given period in a daily breakdown" + """ + perDay: [NpmDownloadsPerDay!]! +} + +"""Information about download stats related to a package""" +type NpmOverallDownloadData { + """The download status for all of npm over the last day""" + lastDay: NpmOverallDownloadPeriodData + + """The download status for all of npm over the last week""" + lastWeek: NpmOverallDownloadPeriodData + + """The download status for all of npm over the last month""" + lastMonth: NpmOverallDownloadPeriodData + + """The download status for all of npm for a specific period""" + period( + """ + The later date for download stats, e.g. 2018-12-07. Must be after `startDate` + """ + endDate: String! + + """ + The earlier date for download stats, e.g. 2018-12-06. Must be before `endDate` + """ + startDate: String! + ): NpmOverallDownloadPeriodData + + """The download status for all of npm for a specific day""" + day( + """The specific date for download stats, e.g. 2018-12-06""" + date: String! + ): NpmOverallDownloadPeriodData +} + +type NpmPackageMetadataDistTagEntry { + """The name of the tag""" + tag: String! + + """The version as a string for this tag""" + versionString: String! + + """The full version for this tag""" + version: NpmPackageVersion +} + +type NpmPackageMetadataDistTagLatestEntry { + """The version as a string for this tag""" + versionString: String + + """The full version for the `latest` tag""" + version: NpmPackageVersion +} + +""" +Tags can be used to provide an alias instead of version numbers. For example, a project might choose to have multiple streams of development and use a different tag for each stream, e.g., stable, beta, dev, canary. +""" +type NpmPackageDistTags { + """ + By default, the latest tag is used by npm to identify the current version of a package + """ + latest: NpmPackageMetadataDistTagLatestEntry + + """Any custom tags used by the package maintainers""" + custom: [NpmPackageMetadataDistTagEntry!]! +} + +type NpmDownloadsPerDay { + """The download count""" + count: Int + + """""" + day: String +} + +"""Download data for a given package""" +type NpmPackageDownloadPeriodData { + """The start date of download stats""" + start: String! + + """The end date of download stats""" + end: String! + + """ + The download stats for the given package and range. Check out explanation of how [npm download counts work](http://blog.npmjs.org/post/92574016600/numeric-precision-matters-how-npm-download-counts), including "what counts as a download?" + """ + count: Int! + + """ + "Download data for this package and period in a daily breakdown" + """ + perDay: [NpmDownloadsPerDay!]! +} + +"""Information about download stats related to a package""" +type NpmPackageDownloadData { + """The download status for this package over the last day""" + lastDay: NpmPackageDownloadPeriodData + + """The download status for this package over the last week""" + lastWeek: NpmPackageDownloadPeriodData + + """The download status for this package over the last month""" + lastMonth: NpmPackageDownloadPeriodData + + """The download status for this package for a specific period""" + period( + """ + The later date for download stats, e.g. 2018-12-07. Must be after `startDate` + """ + endDate: String! + + """ + The earlier date for download stats, e.g. 2018-12-06. Must be before `endDate` + """ + startDate: String! + ): NpmPackageDownloadPeriodData + + """The download status for this package for a specific day""" + day( + """The specific date for download stats, e.g. 2018-12-06""" + date: String! + ): NpmPackageDownloadPeriodData +} + +"""A npm package license""" +type NpmPackageLicense { + """ + The [SPDX identifier](https://spdx.org/licenses/) of the package's license + """ + type: String + + """A url for the full license""" + url: String +} + +""" +A mapping of other packages this version depends on to the required semver ranges +""" +type NpmPackageVersionDependency { + """The package name of the dependency""" + name: String + + """The version of the package dependency""" + version: String +} + +"""The dist object is generated by npm and may be relied upon""" +type NpmPackageDist { + """""" + tarball: String + + """""" + shasum: String +} + +"""A npm package version""" +type NpmPackageVersion { + """ + `true` if this version is known to have a shrinkwrap that must be used to install it; false if this version is known not to have a shrinkwrap. If this field is undefined, the client must determine through other means if a shrinkwrap exists. + """ + hasShrinkwrap: Boolean + + """""" + from: String + + """`package@version`, such as `npm@1.0.0`""" + id: String + + """The version of node used to publish this""" + nodeVersion: String + + """The version of the npm client used to publish this""" + npmVersion: String + + """The dist object is generated by npm and may be relied upon.""" + dist: NpmPackageDist + + """The SHA-1 sum of the tarball""" + shasum: String + + """A short description of the package at this version""" + description: String + + """The package's entry point (e.g., `index.js` or `main.js`)""" + main: String + + """The package name""" + name: String + + """Deprecation warnings message of this version""" + deprecated: String + + """The version string for this version""" + version: String + + """""" + maintainers: [NpmPackageMaintainer!] + + """ + A mapping of other packages this version depends on to the required semver ranges + """ + dependencies: [NpmPackageVersionDependency!]! + + """ + A mapping of package names to the required semver ranges of _development_ dependencies + """ + devDependencies: [NpmPackageVersionDependency!]! + + """ + A mapping of package names to the required semver ranges of _optional_ dependencies + """ + optionalDependencies: [NpmPackageVersionDependency!]! + + """ + A mapping of package names to the required semver ranges of _peer_ dependencies + """ + peerDependencies: [NpmPackageVersionDependency!]! + + """The license for this package""" + license: NpmPackageLicense! + + """ + [Bundlephobia](https://bundlephobia.com) is a service by [@pastelsky](https://github.com/pastelsky) to find the cost of adding an `npm` package to your bundle. Use this field to get the bundlephobia info, such as size (both minified and gzipped) on this package. + """ + bundlephobia( + """ + Whether to include this query in the Bundlephobia analytics stats and recent searches + """ + record: Boolean + ): BundlephobiaDependencyInfo +} + +"""Information on where bugs are filed for this package""" +type NpmPackageBugs { + """""" + url: String +} + +""" +Specifies the repository where the source for this package might be found +""" +type NpmPackageRepository { + """""" + url: String + + """""" + type: String + sourceRepository: NpmPackageSourceRepository +} + +"""A package publishing time for a given version""" +type NpmPackageTimeVersion { + """The package version""" + version: String + + """The date this version was published""" + date: String +} + +""" +Information about when a package was created and last modified, as well as the publishing date for each version +""" +type NpmPackageTime { + """""" + created: String + + """""" + modified: String + + """Publishing information for each version of a package""" + versions: [NpmPackageTimeVersion!]! +} + +"""A npm package maintainer""" +type NpmPackageMaintainer { + """The package maintainer's email""" + email: String + + """""" + name: String +} + +"""A npm package""" +type NpmPackage { + """The package name, used as an ID in CouchDB""" + id: String + + """The revision number of this version of the document in CouchDB""" + rev: String + + """The primary author of the npm package""" + author: NpmPackageMaintainer + + """ + A mapping of versions to the time published, along with created and modified timestamps + """ + time: NpmPackageTime + + """The package name""" + name: String + + """A short description of the package""" + description: String + + """ + The first 64K of the README data for the most-recently published version of the package + """ + readme: String + + """""" + homepage: String + + """The repository url as given in package.json, for the latest version""" + repository: NpmPackageRepository + + """""" + keywords: [String!] + + """""" + bugs: NpmPackageBugs + + """The name of the file from which the readme data was taken""" + readmeFilename: String + + """ + People with permission to publish this package (NB: Not authoritative, but informational) + """ + maintainers: [NpmPackageMaintainer!] + + """A mapping of semver-compliant version numbers to version data""" + versions: [NpmPackageVersion!]! + + """Summary download stats for a package""" + downloads: NpmPackageDownloadData! + + """The license for this package""" + license: NpmPackageLicense! + + """ + [Bundlephobia](https://bundlephobia.com) is a service by [@pastelsky](https://github.com/pastelsky) to find the cost of adding an `npm` package to your bundle. Use this field to get the bundlephobia info, such as size (both minified and gzipped) on this package. + """ + bundlephobia( + """ + Whether to include this query in the Bundlephobia analytics stats and recent searches + """ + record: Boolean + ): BundlephobiaDependencyInfo + + """ + Tags can be used to provide an alias instead of version numbers. For example, a project might choose to have multiple streams of development and use a different tag for each stream, e.g., stable, beta, dev, canary. + """ + distTags: NpmPackageDistTags +} + +"""The root for Npm.""" +type NpmQuery { + """Find a npm package member by its npm name, e.g. `"fela"`""" + package( + """Find the package by its name""" + name: String! + ): NpmPackage + + """Overall download stats in the npm ecosystem""" + downloads: NpmOverallDownloadData +} + +""" +Make a REST API call to the Netlify API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type NetlifyPassthroughQuery { + """ + Make a GET request to the Netlify API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +type NetlifyDomainAvailability { + """""" + available: Boolean + + """Price of the domain in US dollars, with fractional cents (e.g. 10.99)""" + price: String + + """ + Renewal price of the domain in US dollars, with fractional cents (e.g. 14.99) + """ + renewalPrice: String +} + +type NetlifyAccountUsageCapability { + """""" + included: Int + + """""" + used: Int +} + +type NetlifyAccountMembershipCapabilities { + """""" + collaborators: NetlifyAccountUsageCapability + + """""" + sites: NetlifyAccountUsageCapability +} + +type NetlifyAccount { + """""" + id: String + + """""" + name: String + + """""" + slug: String + + """""" + type: String + + """""" + capabilities: NetlifyAccountMembershipCapabilities + + """""" + billingName: String + + """""" + billingEmail: String + + """""" + billingDetails: String + + """""" + billingPeriod: String + + """""" + paymentMethodId: String + + """""" + typeName: String + + """""" + typeId: String + + """""" + ownerIds: [String!] + + """""" + rolesAllowed: [String!] + + """""" + createdAt: String + + """""" + updatedAt: String +} + +type NetlifySiteSSL { + """""" + state: String + + """""" + domains: [String!] + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + expiresAt: String +} + +type NetlifySiteHookDataEmail { + """""" + email: String +} + +type NetlifySiteHookDataSlack { + """""" + url: String + + """""" + channel: String +} + +type NetlifySiteHookDataGitHub { + """""" + accessToken: String + + """""" + message: String +} + +type NetlifySiteHookDataWebhook { + """""" + url: String + + """""" + signatureSecret: String +} + +union NetlifySiteHookData = NetlifySiteHookDataWebhook | NetlifySiteHookDataGitHub | NetlifySiteHookDataSlack | NetlifySiteHookDataEmail + +type NetlifySiteHook { + """""" + id: String + + """""" + siteId: String + + """""" + type: String + + """""" + event: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + disabled: Boolean + hookData: NetlifySiteHookData +} + +type NetlifySiteForm { + """""" + id: String + + """""" + siteId: String + + """""" + name: String + + """""" + paths: [String!] + + """""" + submissionCount: Int + + """""" + createdAt: String +} + +type NetlifySiteFile { + """""" + id: String + + """""" + path: String + + """""" + sha: String + + """""" + mimeType: String + + """""" + size: Int +} + +type NetlifySiteDeployKey { + """""" + id: String + + """""" + publicKey: String + + """""" + createdAt: String +} + +type NetlifySiteDeployedBranch { + """""" + id: String + + """""" + deployId: String + + """""" + name: String + + """""" + slug: String + + """""" + url: String + + """""" + sslUrl: String +} + +type NetlifySiteBuildHook { + """""" + id: String + + """""" + title: String + + """""" + branch: String + + """""" + url: String + + """""" + siteId: String + + """""" + createdAt: String +} + +type NetlifySiteBuild { + """""" + id: String + + """""" + deployId: String + + """""" + sha: String + + """""" + done: Boolean + + """""" + error: String + + """""" + createdAt: String +} + +type NetlifySiteDefaultHooksData { + """""" + accessToken: String +} + +type NetlifyEnvironmentVariable { + """ + The property name of the environment variable, e.g. `PORT` in `PORT=3000` + """ + property: String! + + """The value of the environment variable, e.g. `3000` in `PORT=3000`""" + value: String +} + +type NetlifyRepoInfo { + """""" + id: Int + + """""" + provider: String + + """""" + deployKeyId: String + + """""" + repoPath: String + + """""" + repoBranch: String + + """""" + dir: String + + """""" + cmd: String + + """""" + allowedBranches: [String!] + + """""" + publicRepo: Boolean + + """""" + privateLogs: Boolean + + """""" + repoUrl: String + + """""" + installationId: Int + sourceRepository: NetlifySiteSourceRepository + + """List of environment variables for the build""" + env: [NetlifyEnvironmentVariable!]! +} + +type NetlifySiteProcessingSettingsHtml { + """""" + prettyUrls: Boolean +} + +type NetlifySiteProcessingSettingsImages { + """""" + optimize: Boolean +} + +type NetlifyMinifyOptions { + """""" + bundle: Boolean + + """""" + minify: Boolean +} + +type NetlifySiteProcessingSettings { + """""" + css: NetlifyMinifyOptions + + """""" + images: NetlifySiteProcessingSettingsImages + + """""" + js: NetlifyMinifyOptions + + """""" + skip: Boolean + + """""" + html: NetlifySiteProcessingSettingsHtml +} + +type NetlifySiteAvailableFunction { + """""" + name: String + + """""" + digest: String + + """""" + id: String + + """""" + createdAt: String + + """""" + language: String + + """""" + size: Int +} + +type NetlifyDeploySiteCapabilities { + """""" + largeMediaEnabled: Boolean +} + +type NetlifyDeploy { + """""" + id: String + + """""" + siteId: String + + """""" + userId: String + + """""" + buildId: String + + """""" + state: String + + """""" + name: String + + """""" + url: String + + """""" + sslUrl: String + + """""" + adminUrl: String + + """""" + deployUrl: String + + """""" + deploySslUrl: String + + """""" + screenshotUrl: String + + """""" + reviewId: Float + + """""" + draft: Boolean + + """""" + required: [String!] + + """""" + requiredFunctions: [String!] + + """""" + errorMessage: String + + """""" + branch: String + + """""" + commitRef: String + + """""" + commitUrl: String + + """""" + skipped: Boolean + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + publishedAt: String + + """""" + title: String + + """""" + context: String + + """""" + locked: Boolean + + """""" + reviewUrl: String + + """""" + siteCapabilities: NetlifyDeploySiteCapabilities + + """""" + availableFunctions: [NetlifySiteAvailableFunction!] +} + +type NetlifySite { + """""" + id: String + + """""" + state: String + + """""" + plan: String + + """""" + name: String + + """""" + customDomain: String + + """""" + domainAliases: [String!] + + """""" + password: String + + """""" + notificationEmail: String + + """""" + url: String + + """""" + sslUrl: String + + """""" + adminUrl: String + + """""" + screenshotUrl: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + userId: String + + """""" + sessionId: String + + """""" + ssl: Boolean + + """""" + forceSsl: Boolean + + """""" + managedDns: Boolean + + """""" + deployUrl: String + + """""" + publishedDeploy: NetlifyDeploy + + """""" + accountName: String + + """""" + accountSlug: String + + """""" + gitProvider: String + + """""" + deployHook: String + + """""" + processingSettings: NetlifySiteProcessingSettings + + """""" + buildSettings: NetlifyRepoInfo + + """""" + idDomain: String + + """""" + defaultHooksData: NetlifySiteDefaultHooksData + + """""" + buildImage: String + + """""" + repo: NetlifyRepoInfo + + """Get the builds belonging to a Netlify site""" + builds: [NetlifySiteBuild!] + + """Get the build hooks belonging to a Netlify site""" + buildHooks: [NetlifySiteBuildHook!] + + """Get the various deployed branches belonging to a Netlify site""" + deployedBranches: [NetlifySiteDeployedBranch!] + + """Get the deploy keys belonging to a Netlify site""" + deployKeys: [NetlifySiteDeployKey!] + + """Get the deploys belonging to a Netlify site""" + deploys: [NetlifyDeploy!] + + """Get the files belonging to a Netlify site""" + files: [NetlifySiteFile!] + + """Get the forms belonging to a Netlify site""" + forms: [NetlifySiteForm!] + + """Get the hooks belonging to a Netlify site""" + hooks: [NetlifySiteHook!] + + """Get the SNI Certificates belonging to a Netlify site""" + sniCertificates: NetlifySiteSSL +} + +"""The root for Netlify.""" +type NetlifyQuery { + """Get a Netlify site by its id""" + site( + """The site id""" + id: String! + ): NetlifySite + + """List all Netlify sites for this account""" + sites( + """Site name to filter for XXX TODO FIXME""" + filter: String + + """Site name to filter for""" + name: String + ): [NetlifySite!] + + """List all Netlify accounts for this user""" + accounts: [NetlifyAccount!] + + """Check price and availability for a domain.""" + domainAvailability( + """Domain to search for (e.g. example.com)""" + domain: String! + + """Netlify account id""" + accountId: String! + ): NetlifyDomainAvailability! + + """ + Make a REST API call to the Netlify API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: NetlifyPassthroughQuery! +} + +""" +Make a REST API call to the Mixpanel API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type MixpanelPassthroughQuery { + """ + Make a GET request to the Mixpanel API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The root for Mixpanel""" +type MixpanelQuery { + """ + Make a REST API call to the Mixpanel API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: MixpanelPassthroughQuery! +} + +""" +Make a REST API call to the Meetup API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type MeetupPassthroughQuery { + """ + Make a GET request to the Meetup API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The root for Meetup""" +type MeetupQuery { + """ + Make a REST API call to the Meetup API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: MeetupPassthroughQuery! +} + +""" +Make a REST API call to the Mailchimp API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type MailchimpPassthroughQuery { + """ + Make a GET request to the Mailchimp API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The root for Mailchimp""" +type MailchimpQuery { + """ + Make a REST API call to the Mailchimp API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: MailchimpPassthroughQuery! +} + +""".""" +enum LogdnaExportPreferEnumArg { + """Return results from the head of the list""" + HEAD + + """Return results from the tail of the list""" + TAIL +} + +"""A logdna log line""" +type LogdnaLogLine { + """""" + _logtype: String + + """""" + _account: String + + """""" + _cluster: String + + """""" + _host: String + + """""" + _ingester: String + + """""" + _mac: String + + """""" + _tag: [String!] + + """""" + _file: String + + """""" + _line: String + + """""" + _ts: Float + + """""" + _app: String + + """""" + _ip: String + + """""" + _ipremote: String + + """""" + _key: String + + """""" + _bid: String + + """""" + _parserids: [String!] + + """""" + _id: String + + """""" + level: String + + """Full API response from LogDNA, as a json-encoded string.""" + _raw: String! +} + +"""A connection to a list of LogdnaLogLine values""" +type LogdnaLogLinesConnection { + """A list of LogdnaLogLine objects.""" + nodes: [LogdnaLogLine!] +} + +"""The root for Logdna.""" +type LogdnaQuery { + """Returns a list of log lines""" + export( + """Allows user to set the subject of the email""" + emailSubject: String + + """ + Specifies an email that the results will be sent to, by default results are streamed back. + """ + email: String + + """ + If total results was 654 lines, tail would return the last 100 lines and head would return the first 100 lines. + """ + prefer: LogdnaExportPreferEnumArg + + """ + Search query. Same format as LogDNA's log viewer. See [https://docs.logdna.com/docs/search](https://docs.logdna.com/docs/search) + """ + query: String + + """List of levels to filter by.""" + levels: [String!] + + """List of apps to filter by.""" + apps: [String!] + + """List of hosts to filter by.""" + hosts: [String!] + + """ + Number of results to return. Depends on your plan, but generally the max is 10,000. Defaults to 100 + """ + first: Int + + """ + End time for logs to export, in Unix timestamp in seconds or milliseconds. + """ + to: Float! + + """ + Start time for logs to export, in Unix timestamp in seconds or milliseconds. + """ + from: Float! + ): LogdnaLogLinesConnection! +} + +""" +Webhooks for new events in Intercom: [https://www.intercom.com/help/apps-in-intercom/apps/webhooks](https://www.intercom.com/help/apps-in-intercom/apps/webhooks) +""" +type IntercomSubscription { + """value is always 'notification_subscription'""" + type: String + + """The Intercom defined id representing the subscription.""" + id: String + + """The time the subscription was added to Intercom""" + createdAt: Int + + """The last time the subscription was updated""" + updatedAt: Int + + """ + The url the notification should be sent to. Required depending on the service type. + """ + url: String + + """ + The type of the service being called. Default is web for a plain webhook, which is the only accepted value currently. + """ + serviceType: String + + """An array of topics to subscribe to.""" + topics: [String!] + + """Indicates whether the subscription is currently active.""" + active: Boolean + + """Required for event.created webhooks.""" + metadata: JSON +} + +"""The root for Intercom.""" +type IntercomQuery { + """The Users resource is the primary way of interacting with Intercom.""" + user( + """The email you have defined for the user.""" + email: String + + """The user id you have defined for the user.""" + userId: String + + """The canonical user id from Intercom.""" + intercomId: String + ): IntercomUser + + """ + Companies allow you to represent commercial organizations using your product. + """ + company( + """The name you have defined for the user.""" + name: String + + """The company_id you have defined for the user.""" + companyId: String + + """The canonical company id from Intercom.""" + intercomId: String + ): IntercomCompany + + """Conversation are how you can communicate with users in Intercom.""" + conversation( + """If true, retrieves conversation messages in plain text""" + displayAsPlaintext: Boolean + + """id of the conversation""" + id: String! + ): IntercomConversation + + """Conversation are how you can communicate with users in Intercom.""" + conversations( + """ + When true, retrieves conversation messages in plain text. Defaults to false. + """ + displayAsPlaintext: Boolean + + """Return the conversations before a timestamp""" + before: Int + + """What field to sort the results by. Defaults to UPDATED_AT.""" + sortByField: IntercomConversationSortByField + + """ + Return the conversations in ascending or descending order. Defaults to DESC. + """ + orderBy: IntercomSortOrderBy + ): IntercomConversationsConnection + + """ + Gets conversations by an admin. If no adminId is provided, gets all unassigned conversations. + + Conversation are how you can communicate with users in Intercom. + """ + conversationsByAdmins( + """ + When true, retrieves conversation messages in plain text. Defaults to false. + """ + displayAsPlaintext: Boolean + + """ + Defaults to true. When true, fetches just open conversations. When false, fetches just closed conversations. + """ + open: Boolean + + """The id of the admin. If not provided, defaults to unassigned.""" + adminId: String + + """What field to sort the results by. Defaults to UPDATED_AT.""" + sortByField: IntercomConversationSortByField + + """ + Return the conversations in ascending or descending order. Defaults to DESC. + """ + orderBy: IntercomSortOrderBy + ): IntercomConversationsConnection + + """ + Gets conversations by a user. + + Conversation are how you can communicate with users in Intercom. + """ + conversationsByUsers( + """ + When true, retrieves conversation messages in plain text. Defaults to false. + """ + displayAsPlaintext: Boolean + + """Defaults to false. When true, fetches just unread conversations.""" + unread: Boolean + + """ + The id of the user. Provide only one of userId, email, or intercomUserId. + """ + intercomUserId: String + + """ + Your email for the user. Provide only one of userId, email, or intercomUserId. + """ + email: String + + """ + Your user_id for the user. Provide only one of userId, email, or intercomUserId. + """ + userId: String + + """What field to sort the results by. Defaults to UPDATED_AT.""" + sortByField: IntercomConversationSortByField + + """ + Return the conversations in ascending or descending order. Defaults to DESC. + """ + orderBy: IntercomSortOrderBy + ): IntercomConversationsConnection + + """All of your users on Intercom""" + users( + """Filter by segment, only provide one of tagId or segmentId""" + segmentId: String + + """Filter by tag, only provide one of tagId or segmentId""" + tagId: String + + """Limit results to users that were created in that last number of days""" + createdDaysAgo: Int + + """What field to sort the results by. Defaults to CREATED_AT.""" + sortByField: IntercomUsersSortByField + + """Return the users in ascending or descending order. Defaults to DESC.""" + orderBy: IntercomSortOrderBy + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Number of user to fetch, maximum is 60""" + first: Int + ): IntercomUsersConnection + + """ + A tag allows you to label your users and companies and list them using that tag. + """ + tags: [IntercomTag!] + + """ + List of events on Intercom for a user. Provide one of userId, email, or intercomUserId. + """ + events( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Get events by the Intercom-defiend user id.""" + intercomUserId: String + + """Get events by the email you have defined for the user.""" + email: String + + """Get events by the user id you have defined for the user.""" + userId: String + + """Number of events to fetch, defaults to 50""" + first: Int + ): IntercomEventssConnection + + """ + List of event summaries for a user. Provide one of userId, email, or intercomUserId. + """ + eventsSummary( + """Get events by the Intercom-defiend user id.""" + intercomUserId: String + + """Get events by the email you have defined for the user.""" + email: String + + """Get events by the user id you have defined for the user.""" + userId: String + ): [IntercomEventSummary!] + + """ + A tag allows you to label your users and companies and list them using that tag. + """ + tag( + """The id of the tag. Only provide one of name or id.""" + id: String + + """The name of the tag. Only provide one of name or id.""" + name: String + ): IntercomTag + + """ + Webhooks for new events in Intercom: [https://www.intercom.com/help/apps-in-intercom/apps/webhooks](https://www.intercom.com/help/apps-in-intercom/apps/webhooks) + """ + subscriptions: [IntercomSubscription!] +} + +""" +Make a REST API call to the Hubspot API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type HubspotPassthroughQuery { + """ + Make a GET request to the Hubspot API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""Hubspot Deal edge""" +type HubspotDealEdge { + """Deal""" + node: HubspotDeal! + + """Contact cursor for use in pagination""" + cursor: String! +} + +"""List of deals, with pagniation information""" +type HubspotDealsConnection { + """List of deals""" + nodes: [HubspotDeal!]! + + """List of deal edges""" + edges: [HubspotDealEdge!]! + + """Page info""" + pageInfo: PageInfo! +} + +type HubspotDealProperties { + """ + The amount of the deal, using the exchange rate, in your company's currency + """ + amountInHomeCurrency: HubspotProperty + + """The number of days the deal took to close""" + daysToClose: HubspotProperty + + """ + Original source for the contact with the earliest activity for this deal. + """ + hsAnalyticsSource: HubspotProperty + + """ + Additional information about the original source for the associated contact, or associated company if there is no contact, with the oldest value for the Time first seen property. + """ + hsAnalyticsSourceData1: HubspotProperty + + """ + Additional information about the original source for the associated contact, or associated company if there is no contact, with the oldest value for the Time first seen property. + """ + hsAnalyticsSourceData2: HubspotProperty + + """The marketing campaign the deal is associated with""" + hsCampaign: HubspotProperty + + """Returns the amount if the deal is closed. Else, returns 0.""" + hsClosedAmount: HubspotProperty + + """ + Returns the amount in home currency if the deal is closed. Else, returns 0. + """ + hsClosedAmountInHomeCurrency: HubspotProperty + + """ + The user that created this object. This value is automatically set by HubSpot and may not be modified. + """ + hsCreatedByUserId: HubspotProperty + + """ + The date and time when the deal entered the 'win' stage, 'The Pipe' pipeline + """ + hsDateEntered88fefcbd257b4b09998cB10e0e61ca2a253742203: HubspotProperty + + """ + The date and time when the deal entered the 'Appointment Scheduled' stage, 'Sales Pipeline' pipeline + """ + hsDateEnteredAppointmentscheduled: HubspotProperty + + """ + The date and time when the deal entered the 'lost' stage, 'The Pipe' pipeline + """ + hsDateEnteredBdcd24d2D3d745f2Abc5E5c07236804f1731668740: HubspotProperty + + """ + The date and time when the deal entered the 'Closed Lost' stage, 'Sales Pipeline' pipeline + """ + hsDateEnteredClosedlost: HubspotProperty + + """ + The date and time when the deal entered the 'Closed Won' stage, 'Sales Pipeline' pipeline + """ + hsDateEnteredClosedwon: HubspotProperty + + """ + The date and time when the deal entered the 'Contract Sent' stage, 'Sales Pipeline' pipeline + """ + hsDateEnteredContractsent: HubspotProperty + + """ + The date and time when the deal entered the 'Decision Maker Bought-In' stage, 'Sales Pipeline' pipeline + """ + hsDateEnteredDecisionmakerboughtin: HubspotProperty + + """ + The date and time when the deal entered the 'start' stage, 'The Pipe' pipeline + """ + hsDateEnteredDfc03f6441834cccBfb5A205af0709cb4911820: HubspotProperty + + """ + The date and time when the deal entered the 'Presentation Scheduled' stage, 'Sales Pipeline' pipeline + """ + hsDateEnteredPresentationscheduled: HubspotProperty + + """ + The date and time when the deal entered the 'Qualified To Buy' stage, 'Sales Pipeline' pipeline + """ + hsDateEnteredQualifiedtobuy: HubspotProperty + + """ + The date and time when the deal exited the 'win' stage, 'The Pipe' pipeline + """ + hsDateExited88fefcbd257b4b09998cB10e0e61ca2a253742203: HubspotProperty + + """ + The date and time when the deal exited the 'Appointment Scheduled' stage, 'Sales Pipeline' pipeline + """ + hsDateExitedAppointmentscheduled: HubspotProperty + + """ + The date and time when the deal exited the 'lost' stage, 'The Pipe' pipeline + """ + hsDateExitedBdcd24d2D3d745f2Abc5E5c07236804f1731668740: HubspotProperty + + """ + The date and time when the deal exited the 'Closed Lost' stage, 'Sales Pipeline' pipeline + """ + hsDateExitedClosedlost: HubspotProperty + + """ + The date and time when the deal exited the 'Closed Won' stage, 'Sales Pipeline' pipeline + """ + hsDateExitedClosedwon: HubspotProperty + + """ + The date and time when the deal exited the 'Contract Sent' stage, 'Sales Pipeline' pipeline + """ + hsDateExitedContractsent: HubspotProperty + + """ + The date and time when the deal exited the 'Decision Maker Bought-In' stage, 'Sales Pipeline' pipeline + """ + hsDateExitedDecisionmakerboughtin: HubspotProperty + + """ + The date and time when the deal exited the 'start' stage, 'The Pipe' pipeline + """ + hsDateExitedDfc03f6441834cccBfb5A205af0709cb4911820: HubspotProperty + + """ + The date and time when the deal exited the 'Presentation Scheduled' stage, 'Sales Pipeline' pipeline + """ + hsDateExitedPresentationscheduled: HubspotProperty + + """ + The date and time when the deal exited the 'Qualified To Buy' stage, 'Sales Pipeline' pipeline + """ + hsDateExitedQualifiedtobuy: HubspotProperty + + """Specifies how deal amount should be calculated from line items""" + hsDealAmountCalculationPreference: HubspotProperty + + """ + The probability between 0 and 1 of deal stage. Defaults to 0 for unknown deal stages. + """ + hsDealStageProbability: HubspotProperty + + """True if the deal was won or lost.""" + hsIsClosed: HubspotProperty + + """ + The most recent date that any property on a deal was updated. This is updated automatically by HubSpot. + """ + hsLastmodifieddate: HubspotProperty + + """ + Hubspot predicted likelihood between 0 and 1 of the deal to close by the close date. + """ + hsLikelihoodToClose: HubspotProperty + + """ + The likelihood a deal will close. This property is used for manual forecasting your deals. + """ + hsManualForecastCategory: HubspotProperty + + """ + The list of object IDs that have been merged into this object. This value is automatically set by HubSpot and may not be modified. + """ + hsMergedObjectIds: HubspotProperty + + """ + The unique ID for this deal. This unique ID is automatically populated by HubSpot and cannot be changed. + """ + hsObjectId: HubspotProperty + + """ + Returns the multiplication of the deal amount times the predicted likelihood of the deal to close by the close date. + """ + hsPredictedAmount: HubspotProperty + + """ + Returns the multiplication of the deal amount in your company's currency times the predicted likelihood of the deal to close by the close date. + """ + hsPredictedAmountInHomeCurrency: HubspotProperty + + """ + Returns the multiplication of the amount times the probability of the deal closing. + """ + hsProjectedAmount: HubspotProperty + + """ + Returns the multiplication of the amount in home currency times the probability of the deal closing. + """ + hsProjectedAmountInHomeCurrency: HubspotProperty + + """ + The total time in seconds spent by the deal in the 'win' stage, 'The Pipe' pipeline + """ + hsTimeIn88fefcbd257b4b09998cB10e0e61ca2a253742203: HubspotProperty + + """ + The total time in seconds spent by the deal in the 'Appointment Scheduled' stage, 'Sales Pipeline' pipeline + """ + hsTimeInAppointmentscheduled: HubspotProperty + + """ + The total time in seconds spent by the deal in the 'lost' stage, 'The Pipe' pipeline + """ + hsTimeInBdcd24d2D3d745f2Abc5E5c07236804f1731668740: HubspotProperty + + """ + The total time in seconds spent by the deal in the 'Closed Lost' stage, 'Sales Pipeline' pipeline + """ + hsTimeInClosedlost: HubspotProperty + + """ + The total time in seconds spent by the deal in the 'Closed Won' stage, 'Sales Pipeline' pipeline + """ + hsTimeInClosedwon: HubspotProperty + + """ + The total time in seconds spent by the deal in the 'Contract Sent' stage, 'Sales Pipeline' pipeline + """ + hsTimeInContractsent: HubspotProperty + + """ + The total time in seconds spent by the deal in the 'Decision Maker Bought-In' stage, 'Sales Pipeline' pipeline + """ + hsTimeInDecisionmakerboughtin: HubspotProperty + + """ + The total time in seconds spent by the deal in the 'start' stage, 'The Pipe' pipeline + """ + hsTimeInDfc03f6441834cccBfb5A205af0709cb4911820: HubspotProperty + + """ + The total time in seconds spent by the deal in the 'Presentation Scheduled' stage, 'Sales Pipeline' pipeline + """ + hsTimeInPresentationscheduled: HubspotProperty + + """ + The total time in seconds spent by the deal in the 'Qualified To Buy' stage, 'Sales Pipeline' pipeline + """ + hsTimeInQualifiedtobuy: HubspotProperty + + """ + The user that last updated this object. This value is automatically set by HubSpot and may not be modified. + """ + hsUpdatedByUserId: HubspotProperty + + """ + The date the most recent deal owner was assigned to a deal. This is updated automatically by HubSpot. + """ + hubspotOwnerAssigneddate: HubspotProperty + + """The name given to this deal.""" + dealname: HubspotProperty + + """""" + salesforcelastsynctime: HubspotProperty + + """The total amount of the deal""" + amount: HubspotProperty + + """The stage of the deal""" + dealstage: HubspotProperty + + """ + The pipeline the deal is in. This determines which stages are options for the deal. + """ + pipeline: HubspotProperty + + """The expected close date of the deal""" + closedate: HubspotProperty + + """ + The date the deal was created. This property is set automatically by HubSpot. + """ + createdate: HubspotProperty + + """ + The date of the most recent meeting an associated contact has booked through the meetings tool. + """ + engagementsLastMeetingBooked: HubspotProperty + + """ + This UTM parameter shows which marketing campaign (e.g. a specific email) referred an associated contact to the meetings tool for their most recent booking. This property is only populated when you add tracking parameters to your meeting link. + """ + engagementsLastMeetingBookedCampaign: HubspotProperty + + """ + This UTM parameter shows which channel (e.g. email) referred an associated contact to the meetings tool for their most recent booking. This property is only populated when you add tracking parameters to your meeting link. + """ + engagementsLastMeetingBookedMedium: HubspotProperty + + """ + This UTM parameter shows which site (e.g. Twitter) referred an associated contact to the meetings tool for their most recent booking. This property is only populated when you add tracking parameters to your meeting link. + """ + engagementsLastMeetingBookedSource: HubspotProperty + + """ + The date of the most recent meeting (past or upcoming) logged for, scheduled with, or booked by a contact associated with this deal. + """ + hsLatestMeetingActivity: HubspotProperty + + """The last time a tracked sales email was replied to for this deal""" + hsSalesEmailLastReplied: HubspotProperty + + """The owner of the deal""" + hubspotOwnerId: HubspotProperty + + """ + The last time a call, sales email, or meeting was logged for this deal. This is set automatically by HubSpot based on user actions. + """ + notesLastContacted: HubspotProperty + + """ + The last time a note, call, email, meeting, or task was logged for a deal. This is set automatically by HubSpot based on user actions in the deal record. + """ + notesLastUpdated: HubspotProperty + + """ + The date of the next upcoming activity for a deal. This property is set automatically by HubSpot based on user action. This includes logging a future call, sales email, or meeting using the Log feature, as well as creating a future task or scheduling a future meeting. This is updated automatically by HubSpot. + """ + notesNextActivityDate: HubspotProperty + + """The number of times a call, email or meeting was logged for this deal""" + numContactedNotes: HubspotProperty + + """ + The total number of sales activities (notes, calls, emails, meetings, or tasks) logged for a deal. This is updated automatically by HubSpot. + """ + numNotes: HubspotProperty + + """ + The date the deal was created. This property is set automatically by HubSpot. + """ + hsCreatedate: HubspotProperty + + """The team of the owner of the deal.""" + hubspotTeamId: HubspotProperty + + """Type of the deal""" + dealtype: HubspotProperty + + """ + The value of all owner referencing properties for this object, both default and custom + """ + hsAllOwnerIds: HubspotProperty + + """Description of the deal""" + description: HubspotProperty + + """ + The team ids corresponding to all owner referencing properties for this object, both default and custom + """ + hsAllTeamIds: HubspotProperty + + """ + The team ids, including up the team hierarchy, corresponding to all owner referencing properties for this object, both default and custom + """ + hsAllAccessibleTeamIds: HubspotProperty + + """ + The number of contacts associated with this deal. This property is set automatically by HubSpot. + """ + numAssociatedContacts: HubspotProperty + + """Reason why this deal was lost""" + closedLostReason: HubspotProperty + + """Reason why this deal was won""" + closedWonReason: HubspotProperty +} + +""" +A deal represents an ongoing transaction that a sales team is pursuing with a contact or company. It’s tracked through pipeline stages until won or lost. Deals, along with companies, contacts, tickets, line items, products, and quotes, are an object in the HubSpot CRM. +""" +type HubspotDeal { + """The Hub ID that the company belongs to.""" + portalId: Int + + """The unique ID of the deal record.""" + dealId: Int + + """ + Whether or not the record is deleted. In practice this will always be false as deleted records will not appear in the API. + """ + isDeleted: Boolean + + """ + "An object containing objects representing the properties that are set for the deal record. + + Deals will only contain an entry for a property if that property has been set for the record. + """ + properties: HubspotDealProperties +} + +"""Hubspot Company edge""" +type HubspotCompanyEdge { + """Company""" + node: HubspotCompany! + + """Contact cursor for use in pagination""" + cursor: String! +} + +"""List of Companies, with pagniation information""" +type HubspotCompaniesConnection { + """List of Companies""" + nodes: [HubspotCompany!]! + + """List of company edges""" + edges: [HubspotCompanyEdge!]! + + """Page info""" + pageInfo: PageInfo! +} + +"""Hubspot Contact edge""" +type HubspotContactEdge { + """Contact""" + node: HubspotContact! + + """Contact cursor for use in pagination""" + cursor: String! +} + +type HubspotEngagementCall implements HubspotEngagementInterface { + """The unique ID for the engagement""" + id: Int + + """""" + active: Boolean + + """ + A Unix timestamp (in milliseconds) for when the engagement was created. + """ + createdAt: Int + + """ + A Unix timestamp (in milliseconds) for when the engagement was last updated. + """ + updatedAt: Int + + """The Hubspot owner of the engagement.""" + owner: HubspotOwner + + """ + A Unix timestamp (in milliseconds) representing the time that the engagement should appear in the timeline. + """ + timestamp: Int + + """The phone number that was called.""" + toNumber: String + + """The phone number that was used as the from number.""" + fromNumber: String + + """Will be COMPLETED when the call is finished.""" + status: String + + """ + For calls made in HubSpot, this will be the internal ID of the call. Has no effect for engagements created through the API. + """ + externalId: String + + """The length of the call in milliseconds.""" + durationMilliseconds: Int + + """ + For calls made in HubSpot, this will be the internal ID of the account used to make the call. Has no effect for engagements created through the API. + """ + externalAccountId: String + + """The details or notes of the call.""" + body: String + + """Internal GUID that corresponds to the call outcome.""" + disposition: String + + """List of Hubspot contacts associated with this engagement.""" + contacts: [HubspotContact!]! +} + +type HubspotEngagementMeeting implements HubspotEngagementInterface { + """The unique ID for the engagement""" + id: Int + + """""" + active: Boolean + + """ + A Unix timestamp (in milliseconds) for when the engagement was created. + """ + createdAt: Int + + """ + A Unix timestamp (in milliseconds) for when the engagement was last updated. + """ + updatedAt: Int + + """The Hubspot owner of the engagement.""" + owner: HubspotOwner + + """ + A Unix timestamp (in milliseconds) representing the time that the engagement should appear in the timeline. + """ + timestamp: Int + + """The body or details of the meeting.""" + body: String + + """ + A Unix timestamp (in milliseconds) representing the start time of the meeting. + """ + startTime: Int + + """ + A Unix timestamp (in milliseconds) representing the end time of the meeting. + """ + endTime: Int + + """The title or subject of the meeting.""" + title: String + + """List of Hubspot contacts associated with this engagement.""" + contacts: [HubspotContact!]! +} + +type HubspotEngagementEmailRecipient { + """The email address of the recipient.""" + email: String +} + +type HubspotEngagementEmailSender { + """The email address of the sender.""" + email: String + + """The first name of the sender.""" + firstName: String + + """The last name of the sender.""" + lastName: String +} + +type HubspotEngagementEmail implements HubspotEngagementInterface { + """The unique ID for the engagement""" + id: Int + + """""" + active: Boolean + + """ + A Unix timestamp (in milliseconds) for when the engagement was created. + """ + createdAt: Int + + """ + A Unix timestamp (in milliseconds) for when the engagement was last updated. + """ + updatedAt: Int + + """The Hubspot owner of the engagement.""" + owner: HubspotOwner + + """ + A Unix timestamp (in milliseconds) representing the time that the engagement should appear in the timeline. + """ + timestamp: Int + + """The details of the sender.""" + from: HubspotEngagementEmailSender + + """The details of the recipients.""" + to: [HubspotEngagementEmailRecipient!] + + """The details of the cc'd recipients.""" + cc: [HubspotEngagementEmailRecipient!] + + """The details of the bcc'd recipients.""" + bcc: [HubspotEngagementEmailRecipient!] + + """The subject of the email.""" + subject: String + + """The body of the HTML email.""" + html: String + + """The body of the text-only email.""" + text: String + + """List of Hubspot contacts associated with this engagement.""" + contacts: [HubspotContact!]! +} + +type HubspotEngagementTask implements HubspotEngagementInterface { + """The unique ID for the engagement""" + id: Int + + """""" + active: Boolean + + """ + A Unix timestamp (in milliseconds) for when the engagement was created. + """ + createdAt: Int + + """ + A Unix timestamp (in milliseconds) for when the engagement was last updated. + """ + updatedAt: Int + + """The Hubspot owner of the engagement.""" + owner: HubspotOwner + + """ + A Unix timestamp (in milliseconds) representing the time that the engagement should appear in the timeline. + """ + timestamp: Int + + """The body or details of the task.""" + body: String + + """The subject or title of the task.""" + subject: String + + """The status of the task.""" + status: String + + """List of Hubspot contacts associated with this engagement.""" + contacts: [HubspotContact!]! +} + +""" +HubSpot uses owners to assign CRM objects (contacts, companies, and deals) to specific people in your organization. +""" +type HubspotOwner { + """Owner's first name.""" + firstName: String + + """Owner's last name.""" + lastName: String + + """Owner's email address.""" + email: String + + """A Unix timestamp (in milliseconds) for when the identity was created.""" + createdAt: Int + + """A Unix timestamp (in milliseconds) for when the identity was created.""" + updatedAt: Int + + """The Hubspot owner for this person in Hubspot.""" + owner: HubspotOwner +} + +type HubspotEngagementNote implements HubspotEngagementInterface { + """The unique ID for the engagement""" + id: Int + + """""" + active: Boolean + + """ + A Unix timestamp (in milliseconds) for when the engagement was created. + """ + createdAt: Int + + """ + A Unix timestamp (in milliseconds) for when the engagement was last updated. + """ + updatedAt: Int + + """The Hubspot owner of the engagement.""" + owner: HubspotOwner + + """ + A Unix timestamp (in milliseconds) representing the time that the engagement should appear in the timeline. + """ + timestamp: Int + + """The body of the note. The body has a limit of 65536 characters.""" + body: String + + """List of Hubspot contacts associated with this engagement.""" + contacts: [HubspotContact!]! +} + +interface HubspotEngagementInterface { + """The unique ID for the engagement""" + id: Int + + """""" + active: Boolean + + """ + A Unix timestamp (in milliseconds) for when the engagement was created. + """ + createdAt: Int + + """ + A Unix timestamp (in milliseconds) for when the engagement was last updated. + """ + updatedAt: Int + + """The Hubspot owner of the engagement.""" + owner: HubspotOwner + + """ + A Unix timestamp (in milliseconds) representing the time that the engagement should appear in the timeline. + """ + timestamp: Int + + """List of Hubspot contacts associated with this engagement.""" + contacts: [HubspotContact!]! +} + +""" +List of Hubspot engagements with pagination info. Engagements are used to store data from CRM actions, including notes, tasks, meetings, and calls. Engagements should be associated with at least one contact record, and optionally other contacts, deals, and a company record. +""" +type HubspotEngagementsConnection { + """List of Hubspot engagemnets.""" + nodes: [HubspotEngagementInterface!]! + + """Pagination info.""" + pageInfo: PageInfo! +} + +type HubspotMergeAuditMergedToEmail { + """The email address of the primary contact at the time of the merge.""" + value: String + + """ + The method by which the email property was last updated. Example: CONTACTS_WEB + """ + sourceType: String + + """ + Additional data realted to the source-type. May not be populated for all source-types. + """ + sourceId: String + + """ + Additional data realted to the source-type. May not be populated for all source-types. + """ + sourceLabel: String + + """A Unix timestamp (in milliseconds) for when the email was last updated""" + timestamp: Int +} + +type HubspotMergeAuditMergedFromEmail { + """the email address of the secondary contact at the time of the merge""" + value: String + + """ + The method by which the email property was last updated. Example: CONTACTS_WEB + """ + sourceType: String + + """ + Additional data realted to the source-type. May not be populated for all source-types. + """ + sourceId: String + + """ + Additional data realted to the source-type. May not be populated for all source-types. + """ + sourceLabel: String + + """ + A list of integers, where each entry is a vid from the secondary contact. This list may contain multiple entries if the secondary record was previously merged. + """ + sourceVids: [Int!] + + """ + A Unix timestamp (in milliseconds) for when the email address was last updated. + """ + timestamp: Int +} + +type HubspotMergeAudit { + """vid of the primary contact (record that was merged into).""" + canonicalVid: Int + + """ + The vid of the secondary contact (record that the data was merged from). + """ + vidToMerge: Int + + """A Unix timestamp (in milliseconds) of when the merge occurred""" + timestamp: Int + + """ + The internal ID of the user who initiated the merge. This will have no value outside of the HubSpot app. + """ + userId: Int + + """The number of properties updating as a result of the merge""" + numPropertiesMoved: Int + + """A set of data from the secondary contact""" + mergedFromEmail: HubspotMergeAuditMergedFromEmail + + """A set of data for the primary contact.""" + mergedToEmail: HubspotMergeAuditMergedToEmail +} + +type HubspotIdentityProfileIdentity { + """ + The type of the identity. One of EMAIL or LEAD_GUID. LEAD_GUID identities are an internal reference and should not be used. + """ + type: String + + """The value of the identity""" + value: String + + """A Unix timestamp (in milliseconds) for when the identity was created.""" + timestamp: Int +} + +type HubspotIdentityProfile { + """The original vid for this identity""" + vid: Int + + """ + A Unix timestamp (in milliseconds) of when the identity was last updated. + """ + savedAtTimestamp: Int + + """A list of the individual identies for this pointer.""" + identities: [HubspotIdentityProfileIdentity!] +} + +type HubspotListMembership { + """The ID of the contact list""" + staticListId: Int + + """ + A Unix timestamp (in milliseconds) for when the contact joined the list. + """ + timestamp: Int + + """The vid of the contact record.""" + vid: Int + + """ + This will always be true as the API only returns lists that the record is currently a member of. + """ + isMember: Boolean +} + +type HubspotFormSubmission { + """A Unique ID for the specific form conversion""" + conversionId: String + + """A Unix timestamp in milliseconds of the time the submission occurred""" + timestamp: Int + + """The GUID of the form that the subission belongs to.""" + formId: String + + """the Portal ID (Hub ID) that the submission belongs to""" + portalId: Int + + """ + The URL that the form was submitted on. This field may be missing if no URL was provided in the submission. + """ + pageUrl: String + + """ + The title of the page that the form was submitted on. This will default to the name of the form if no title is provided. + """ + title: String +} + +type HubspotProperties { + """Annual company revenue""" + annualrevenue: HubspotProperty + + """ + The date the first deal for a contact was created. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + firstDealCreatedDate: HubspotProperty + + """A set of additional email addresses for a contact""" + hsAdditionalEmails: HubspotProperty + + """A set of all vids, canonical or otherwise, for a contact""" + hsAllContactVids: HubspotProperty + + """The campaign responsible for the first touch creation of this contact""" + hsAnalyticsFirstTouchConvertingCampaign: HubspotProperty + + """The campaign responsible for the last touch creation of this contact""" + hsAnalyticsLastTouchConvertingCampaign: HubspotProperty + + """ + The path in the FileManager CDN for this contact's avatar override image. Automatically set by HubSpot. + """ + hsAvatarFilemanagerKey: HubspotProperty + + """Mobile number in international format""" + hsCalculatedMobileNumber: HubspotProperty + + """Phone number in international format""" + hsCalculatedPhoneNumber: HubspotProperty + + """Area Code of the calculated phone number""" + hsCalculatedPhoneNumberAreaCode: HubspotProperty + + """Country code of the calculated phone number""" + hsCalculatedPhoneNumberCountryCode: HubspotProperty + + """ISO2 Country code for the derived phone number""" + hsCalculatedPhoneNumberRegionCode: HubspotProperty + + """Flag indicating this contact was created by the Conversations API""" + hsCreatedByConversations: HubspotProperty + + """ + The last time a shared document (presentation) was accessed by this contact + """ + hsDocumentLastRevisited: HubspotProperty + + """A contact's email address domain""" + hsEmailDomain: HubspotProperty + + """ + Indicates that the current email address has been quarantined for anti-abuse reasons and any marketing email sends to it will be blocked. This is automatically set by HubSpot. + """ + hsEmailQuarantined: HubspotProperty + + """ + The number of marketing emails that have been sent to the current email address since the last engagement (open or link click). This is automatically set by HubSpot. + """ + hsEmailSendsSinceLastEngagement: HubspotProperty + + """ + The status of a contact's eligibility to receive marketing email. This is automatically set by HubSpot. + """ + hsEmailconfirmationstatus: HubspotProperty + + """A contact's facebook id""" + hsFacebookid: HubspotProperty + + """A contact's googleplus id""" + hsGoogleplusid: HubspotProperty + + """ + The timezone reported by a contact's IP address. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + hsIpTimezone: HubspotProperty + + """The contact's sales, prospecting or outreach status""" + hsLeadStatus: HubspotProperty + + """Legal basis for processing contact’s data""" + hsLegalBasis: HubspotProperty + + """A contact's linkedin id""" + hsLinkedinid: HubspotProperty + + """The last time a tracked sales email was clicked by this user""" + hsSalesEmailLastClicked: HubspotProperty + + """The last time a tracked sales email was opened by this user""" + hsSalesEmailLastOpened: HubspotProperty + + """The last time a tracked sales email was replied to by this user""" + hsSalesEmailLastReplied: HubspotProperty + + """Mobile number with country code""" + hsSearchableCalculatedInternationalMobileNumber: HubspotProperty + + """Phone number with country code""" + hsSearchableCalculatedInternationalPhoneNumber: HubspotProperty + + """Mobile number without country code""" + hsSearchableCalculatedMobileNumber: HubspotProperty + + """Phone number without country code""" + hsSearchableCalculatedPhoneNumber: HubspotProperty + + """ + A yes/no field that indicates whether the contact is currently in a Sequence. + """ + hsSequencesIsEnrolled: HubspotProperty + + """A contact's twitter id""" + hsTwitterid: HubspotProperty + + """ + The most recent date a HubSpot Owner was assigned to a contact. This is set automatically by HubSpot and can be used for segmentation and reporting. + """ + hubspotOwnerAssigneddate: HubspotProperty + + """ + The country code reported by a contact's IP address. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + ipCountryCode: HubspotProperty + + """ + The state code or region code reported by a contact's IP address. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + ipStateCode: HubspotProperty + + """ + The zipcode reported by a contact's IP address. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + ipZipcode: HubspotProperty + + """ + The number of deals associated with this contact. This is set automatically by HubSpot. + """ + numAssociatedDeals: HubspotProperty + + """ + The amount of the last closed won deal associated with a contact. This is set automatically by HubSpot based on information from the Deals object. + """ + recentDealAmount: HubspotProperty + + """ + The date that the last deal associated with a contact was won. This is automatically set by HubSpot based on information from the Deals object. + """ + recentDealCloseDate: HubspotProperty + + """""" + salesforceaccountid: HubspotProperty + + """""" + salesforcedeleted: HubspotProperty + + """ + The sum from all closed won deal revenue associated with a contact. This is automatically set by HubSpot and can be used for segmentation and reporting. + """ + totalRevenue: HubspotProperty + + """""" + blogApiDemonstrationBlogSubscription: HubspotProperty + + """A company's name""" + company: HubspotProperty + + """The first form this contact submitted""" + firstConversionEventName: HubspotProperty + + """ + The first page a contact saw on your website. This is automatically set by HubSpot for each contact. + """ + hsAnalyticsFirstUrl: HubspotProperty + + """ + The number of marketing emails delivered for the current email address. This is automatically set by HubSpot. + """ + hsEmailDelivered: HubspotProperty + + """Indicates that a contact has opted out of all email""" + hsEmailOptout: HubspotProperty + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout1281663: HubspotProperty + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout230318: HubspotProperty + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout2849: HubspotProperty + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout354586: HubspotProperty + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout4447431: HubspotProperty + + """ + Indicates that the current email address has opted out of this email type. + """ + hsEmailOptout4744389: HubspotProperty + + """A contact's twitter information""" + twitterhandle: HubspotProperty + + """If the contact is currently enrolled in any workflow""" + currentlyinworkflow: HubspotProperty + + """The number of Twitter followers a contact has""" + followercount: HubspotProperty + + """ + The last page a contact saw on your website. This is automatically set by HubSpot for each contact. + """ + hsAnalyticsLastUrl: HubspotProperty + + """ + The number of marketing emails opened for the current email address. This is automatically set by HubSpot. + """ + hsEmailOpen: HubspotProperty + + """The number of forms this contact has submitted""" + numConversionEvents: HubspotProperty + + """A company's website""" + website: HubspotProperty + + """The date this contact first submitted a form""" + firstConversionDate: HubspotProperty + + """A contact's first name""" + firstname: HubspotProperty + + """ + The sum of all pages a contact has seen on your website. This is automatically set by HubSpot for each contact. + """ + hsAnalyticsNumPageViews: HubspotProperty + + """ + The number of marketing emails which have had link clicks for the current email address. This is automatically set by HubSpot. + """ + hsEmailClick: HubspotProperty + + """The title used to address a contact""" + salutation: HubspotProperty + + """ + The contact's Twitter profile photo. This is set by HubSpot using the contact's email address. + """ + twitterprofilephoto: HubspotProperty + + """ + The sum of all visits a contact has made to your website. This is automatically set by HubSpot for each contact. + """ + hsAnalyticsNumVisits: HubspotProperty + + """ + The number of marketing emails that bounced for the current email address. This is automatically set by HubSpot. + """ + hsEmailBounce: HubspotProperty + + """A contact's persona""" + hsPersona: HubspotProperty + + """ + The date of the most recent click on a published social message. This is set automatically by HubSpot for each contact. + """ + hsSocialLastEngagement: HubspotProperty + + """The last form this contact submitted""" + recentConversionEventName: HubspotProperty + + """""" + hsAnalyticsFirstTimestamp: HubspotProperty + + """""" + hsAnalyticsFirstVisitTimestamp: HubspotProperty + + """ + The sum of all events a contact has experienced. This is automatically set by HubSpot for each contact. + """ + hsAnalyticsNumEventCompletions: HubspotProperty + + """ + The number of times a contact clicked on links you shared on Twitter through HubSpot. This is set automatically by HubSpot and can be used for segmentation. + """ + hsSocialTwitterClicks: HubspotProperty + + """A company's industry""" + industry: HubspotProperty + + """A contact's last name""" + lastname: HubspotProperty + + """A contact's mobile phone number""" + mobilephone: HubspotProperty + + """The date this contact last submitted a form""" + recentConversionDate: HubspotProperty + + """A contact's email address""" + email: HubspotProperty + + """""" + hsAnalyticsLastTimestamp: HubspotProperty + + """ + The name of the last marketing email sent to the current email address. This is automatically set by HubSpot. + """ + hsEmailLastEmailName: HubspotProperty + + """ + The date of the most recent delivery for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailLastSendDate: HubspotProperty + + """The number clicks on links shared on Facebook""" + hsSocialFacebookClicks: HubspotProperty + + """The number of different forms this contact has submitted""" + numUniqueConversionEvents: HubspotProperty + + """The date of the most recent meeting booked from the Meetings app.""" + engagementsLastMeetingBooked: HubspotProperty + + """ + The campaign of the last meeting booked through the Meetings App (ex: the specific email that was sent) + """ + engagementsLastMeetingBookedCampaign: HubspotProperty + + """ + The medium of the last meeting booked through the Meetings App (ex: email or website or in-app) + """ + engagementsLastMeetingBookedMedium: HubspotProperty + + """ + The source of the last meeting booked through the Meetings App (ex: pql-email, landing-page) + """ + engagementsLastMeetingBookedSource: HubspotProperty + + """ + The first known source through which a contact found your website. Source is automatically set by HubSpot. + """ + hsAnalyticsSource: HubspotProperty + + """ + The date of the most recent open for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailLastOpenDate: HubspotProperty + + """The number clicks on links shared on LinkedIn""" + hsSocialLinkedinClicks: HubspotProperty + + """ + The owner of a contact. This can be any HubSpot user or Salesforce integration user, and can be set manually or via Workflows. + """ + hubspotOwnerId: HubspotProperty + + """ + The latitude and longitude reported by a contact's IP address (formatted according to ISO 6709 Annex H) + """ + ipLatlon: HubspotProperty + + """ + The last time a call, email, or meeting was logged for a contact. This is set automatically by HubSpot based on user actions in the contact record. + """ + notesLastContacted: HubspotProperty + + """ + The last time a note, call, email, meeting, or task was logged for a contact. This is set automatically by HubSpot based on user actions in the contact record. + """ + notesLastUpdated: HubspotProperty + + """ + The date of the next upcoming activity for a contact. This is set automatically by HubSpot based on user actions in the contact record. + """ + notesNextActivityDate: HubspotProperty + + """ + The number of times a call, email, or meeting was logged for a contact. This is set automatically by HubSpot based on user actions in the contact record. + """ + numContactedNotes: HubspotProperty + + """ + The number of sales activities for a contact. This is set automatically by HubSpot based on user actions in the contact record. + """ + numNotes: HubspotProperty + + """ + A legacy property used to identify the email address of the owner of the contact. This property is no longer in use. + """ + owneremail: HubspotProperty + + """ + A legacy property used to identify the name of the owner of the contact. This property is no longer in use. + """ + ownername: HubspotProperty + + """ + This field is meaningless on its own, and is solely used for triggering dynamic list updates when SurveyMonkey information is updated + """ + surveymonkeyeventlastupdated: HubspotProperty + + """ + This field is meaningless on its own, and is solely used for triggering dynamic list updates when webinar information is updated + """ + webinareventlastupdated: HubspotProperty + + """""" + hsAnalyticsSourceData1: HubspotProperty + + """ + The date of the most recent link click for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailLastClickDate: HubspotProperty + + """The number clicks on links shared on Google Plus""" + hsSocialGooglePlusClicks: HubspotProperty + + """The team of the owner of a contact.""" + hubspotTeamId: HubspotProperty + + """The country reported by a contact's IP address""" + ipCountry: HubspotProperty + + """A contact's LinkedIn bio""" + linkedinbio: HubspotProperty + + """ + The contact's Twitter bio. This is set by HubSpot using the contact's email address. + """ + twitterbio: HubspotProperty + + """ + The value of all owner referencing properties for this object, both default and custom + """ + hsAllOwnerIds: HubspotProperty + + """The last time and date a contact visited your website.""" + hsAnalyticsLastVisitTimestamp: HubspotProperty + + """""" + hsAnalyticsSourceData2: HubspotProperty + + """ + The date of the earliest delivery for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailFirstSendDate: HubspotProperty + + """ + The number of clicks on published social messages. This is set automatically by HubSpot for each contact. + """ + hsSocialNumBroadcastClicks: HubspotProperty + + """The state or region reported by a contact's IP address""" + ipState: HubspotProperty + + """ + The team ids corresponding to all owner referencing properties for this object, both default and custom + """ + hsAllTeamIds: HubspotProperty + + """""" + hsAnalyticsFirstReferrer: HubspotProperty + + """ + The date of the earliest open for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailFirstOpenDate: HubspotProperty + + """The city reported by a contact's IP address""" + ipCity: HubspotProperty + + """""" + hsAnalyticsLastReferrer: HubspotProperty + + """ + The date of the earliest link click for any marketing email to the current email address. This is automatically set by HubSpot. + """ + hsEmailFirstClickDate: HubspotProperty + + """How many LinkedIn connections they have""" + linkedinconnections: HubspotProperty + + """A contact's primary phone number""" + phone: HubspotProperty + + """A contact's primary fax number""" + fax: HubspotProperty + + """Indicates the contact is globally ineligible for email.""" + hsEmailIsIneligible: HubspotProperty + + """A contact's Klout score, a measure of Internet influence""" + kloutscoregeneral: HubspotProperty + + """A contact's street address, including apartment or unit #""" + address: HubspotProperty + + """""" + hsAnalyticsAveragePageViews: HubspotProperty + + """""" + hsEmailLastupdated: HubspotProperty + + """Social Media photo""" + photo: HubspotProperty + + """A contact's city of residence""" + city: HubspotProperty + + """""" + hsAnalyticsRevenue: HubspotProperty + + """""" + sfcampaignid: HubspotProperty + + """A contact's state of residence""" + state: HubspotProperty + + """ + The date when a contact's lifecycle stage changed to Lead. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageLeadDate: HubspotProperty + + """ + The date when a contact's lifecycle stage changed to MQL. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageMarketingqualifiedleadDate: HubspotProperty + + """ + The date when a contact's lifecycle stage changed to Opportunity. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageOpportunityDate: HubspotProperty + + """A contact's zip code""" + zip: HubspotProperty + + """A contact's country of residence""" + country: HubspotProperty + + """ + The date when a contact's lifecycle stage changed to SQL. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageSalesqualifiedleadDate: HubspotProperty + + """ + The date when a contact's lifecycle stage changed to Evangelist. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageEvangelistDate: HubspotProperty + + """A contact's job title""" + jobtitle: HubspotProperty + + """ + The date when a contact's lifecycle stage changed to Customer. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageCustomerDate: HubspotProperty + + """A field for any additional user input or comments""" + message: HubspotProperty + + """The date that a contact became a customer""" + closedate: HubspotProperty + + """ + The date when a contact's lifecycle stage changed to Subscriber. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageSubscriberDate: HubspotProperty + + """ + The date when a contact's lifecycle stage changed to Other. This is automatically set by HubSpot for each contact. + """ + hsLifecyclestageOtherDate: HubspotProperty + + """""" + lifecyclestage: HubspotProperty + + """The number of company employees""" + numemployees: HubspotProperty + + """The date that a contact entered the system""" + createdate: HubspotProperty + + """""" + hubspotscore: HubspotProperty + + """A company's ID""" + associatedcompanyid: HubspotProperty + + """The date any property on this contact was modified""" + lastmodifieddate: HubspotProperty + + """ + This field is meaningless on its own, and is solely used for triggering dynamic list updates when a company is updated + """ + associatedcompanylastupdated: HubspotProperty + + """A contact's IP Address""" + ipaddress: HubspotProperty + + """Days from create date to close date""" + daysToClose: HubspotProperty + + """The rating of this contact based on their predictive lead score""" + hsPredictivecontactscorebucket: HubspotProperty + + """ + A score calculated by HubSpot that represents a contact's likelihood to become a customer + """ + hsPredictivecontactscore: HubspotProperty +} + +""" +Contacts are the fundamental building block to HubSpot - they store lead-specific data that makes it possible to leverage much of the functionality in HubSpot, from marketing automation, to lead scoring to smart content. + +If you've come across contacts in a CRM or Marketing Automation system before, you're already familiar with the core concepts. For an in depth look at the way HubSpot customers use their contacts database, refer to the [Contacts User Guide](https://knowledge.hubspot.com/contacts-user-guide). +""" +type HubspotContact { + """The internal ID of the contact record.""" + vid: Int + + """ + The internal ID of the contact record. Contacts may have multiple vids, but the canonical-vid will be the primary ID for a record. + """ + canonicalVid: Int + + """A list of vids that have been merged into this contact record.""" + mergedVids: [Int!] + + """The Portal ID (Hub ID) that the record belongs to.""" + portalId: Int + + """ + Indicates if the record is a valid contact record. Any record where this is set to false is not a valid contact. Those records will only have placeholder data and cannot be updated. + """ + isContact: Boolean + + """ + A unique token that can be used to view the contact without logging into HubSpot. See the profileUrl + """ + profileToken: String + + """ + A URL that can be used to view the contact data without logging in. Anyone with this link would be able to view (but not edit) the record + + Note: You can force a login for the public link by changing the Public View Login option in your Contact Settings + """ + profileUrl: String + + """ + An object containing objects representing the properties that are set for the contact record. + + Contacts will only contain an entry for a property if that property has been set for the record. + """ + properties: HubspotProperties + + """""" + state: HubspotProperty + + """""" + zip: HubspotProperty + + """ + A list of form submissions for the contact. This list will be empty for records with no form submissions. + """ + formSubmissions: [HubspotFormSubmission!] + + """ + A list of objects representing the contact's membership in contact lists. + """ + listMemberships: [HubspotListMembership!] + + """ + A list of objects representing the identities of the contact. Each identity represents an identifier for the object, many records will only have a single identity, but merged records may have multiple. + """ + identityProfiles: [HubspotIdentityProfile!] + + """ + A list of data related to any merges that have happened for the record. This list will be empty for records that have not been merged + """ + mergeAudits: [HubspotMergeAudit!] + + """The company associated with this contact.""" + company: HubspotCompany + + """""" + engagements( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Number of engagments to fetch. Defaults to 10. Maximum is 100.""" + first: Int + ): HubspotEngagementsConnection! +} + +"""Hubspot contacts""" +type HubspotContactsConnection { + """List of contacts""" + nodes: [HubspotContact!]! + + """List of contact edges""" + edges: [HubspotContactEdge!]! + + """Page info""" + pageInfo: PageInfo! +} + +type HubspotPropertyVersion { + """The historical value of the property.""" + value: String + + """The method by which the property was changed, e.g. API""" + sourceType: String + + """ + Additional data realted to the source-type. May not be populated for all source-types. + """ + sourceId: String + + """ + Additional data realted to the source-type. May not be populated for all source-types. + """ + sourceLabel: String + + """ + A Unix timestamp in milliseconds representing when the property was updated. + """ + timestamp: Int +} + +type HubspotProperty { + """The current value of the property""" + value: String + + """ + A list of the historical values of the property. A new versions entry will be added each time the property is updated. This data is read-only, and generated automatically when a property is updated. + """ + versions: [HubspotPropertyVersion!] +} + +type HubspotCompanyProperties { + """Short about-company""" + aboutUs: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property closedate calculated as EARLIEST_VALUE via values of closedate on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + closedateTimestampEarliestValueA2a17e6e: HubspotProperty + + """Number of facebook fans""" + facebookfans: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property first_contact_createdate calculated as EARLIEST_VALUE via values of createdate on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + firstContactCreatedateTimestampEarliestValue78b50eea: HubspotProperty + + """ + The first conversion date across all contacts associated this company or organization + """ + firstConversionDate: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property first_conversion_date calculated as EARLIEST_VALUE via values of first_conversion_date on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + firstConversionDateTimestampEarliestValue61f58f2c: HubspotProperty + + """ + The first form submitted across all contacts associated this company or organization + """ + firstConversionEventName: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property first_conversion_event_name calculated as EARLIEST_VALUE via values of first_conversion_event_name on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + firstConversionEventNameTimestampEarliestValue68ddae0a: HubspotProperty + + """The create date of the first deal associated with this company record.""" + firstDealCreatedDate: HubspotProperty + + """The year the company was created. Powered by HubSpot Insights.""" + foundedYear: HubspotProperty + + """Additional domains belonging to this company""" + hsAdditionalDomains: HubspotProperty + + """ + The first activity for any contact associated with this company or organization + """ + hsAnalyticsFirstTimestamp: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property hs_analytics_first_timestamp calculated as EARLIEST_VALUE via values of hs_analytics_first_timestamp on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsAnalyticsFirstTimestampTimestampEarliestValue11e3a63a: HubspotProperty + + """ + The campaign responsible for the first touch creation of the first contact associated with this company + """ + hsAnalyticsFirstTouchConvertingCampaign: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property hs_analytics_first_touch_converting_campaign calculated as EARLIEST_VALUE via values of hs_analytics_first_touch_converting_campaign on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsAnalyticsFirstTouchConvertingCampaignTimestampEarliestValue4757fe10: HubspotProperty + + """ + Time of first session across all contacts associated with this company or organization + """ + hsAnalyticsFirstVisitTimestamp: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property hs_analytics_first_visit_timestamp calculated as EARLIEST_VALUE via values of hs_analytics_first_visit_timestamp on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsAnalyticsFirstVisitTimestampTimestampEarliestValueAccc17ae: HubspotProperty + + """ + Time last seen across all contacts associated with this company or organization + """ + hsAnalyticsLastTimestamp: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property hs_analytics_last_timestamp calculated as LATEST_VALUE via values of hs_analytics_last_timestamp on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsAnalyticsLastTimestampTimestampLatestValue4e16365a: HubspotProperty + + """ + The campaign responsible for the last touch creation of the first contact associated with this company + """ + hsAnalyticsLastTouchConvertingCampaign: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property hs_analytics_last_touch_converting_campaign calculated as LATEST_VALUE via values of hs_analytics_last_touch_converting_campaign on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsAnalyticsLastTouchConvertingCampaignTimestampLatestValue81a64e30: HubspotProperty + + """ + Time of the last session attributed to any contacts that are associated with this company record. + """ + hsAnalyticsLastVisitTimestamp: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property hs_analytics_last_visit_timestamp calculated as LATEST_VALUE via values of hs_analytics_last_visit_timestamp on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsAnalyticsLastVisitTimestampTimestampLatestValue999a0fce: HubspotProperty + + """ + Total number of page views across all contacts associated with this company or organization + """ + hsAnalyticsNumPageViews: HubspotProperty + + """ + Calculation context property providing cardinality for rollup property hs_analytics_num_page_views calculated as SUM via values of hs_analytics_num_page_views on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsAnalyticsNumPageViewsCardinalitySumE46e85b0: HubspotProperty + + """ + Total number of sessions across all contacts associated with this company or organization + """ + hsAnalyticsNumVisits: HubspotProperty + + """ + Calculation context property providing cardinality for rollup property hs_analytics_num_visits calculated as SUM via values of hs_analytics_num_visits on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsAnalyticsNumVisitsCardinalitySum53d952a6: HubspotProperty + + """ + Original source for the contact with the earliest activity for this company or organization + """ + hsAnalyticsSource: HubspotProperty + + """ + Additional information about the original source for the contact with the earliest activity for this company or organization + """ + hsAnalyticsSourceData1: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property hs_analytics_source_data_1 calculated as EARLIEST_VALUE via values of hs_analytics_source_data_1 on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsAnalyticsSourceData1TimestampEarliestValue9b2f1fa1: HubspotProperty + + """ + Additional information about the original source for the contact with the earliest activity for this company or organization + """ + hsAnalyticsSourceData2: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property hs_analytics_source_data_2 calculated as EARLIEST_VALUE via values of hs_analytics_source_data_2 on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsAnalyticsSourceData2TimestampEarliestValue9b2f9400: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property hs_analytics_source calculated as EARLIEST_VALUE via values of hs_analytics_source on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsAnalyticsSourceTimestampEarliestValue25a3a52c: HubspotProperty + + """ + The path in the FileManager CDN for this company's avatar override image. Automatically set by HubSpot. + """ + hsAvatarFilemanagerKey: HubspotProperty + + """ + The user that created this object. This value is automatically set by HubSpot and may not be modified. + """ + hsCreatedByUserId: HubspotProperty + + """ + The date and time at which this object was created. This value is automatically set by HubSpot and may not be modified. + """ + hsCreatedate: HubspotProperty + + """The date of the last sales activity with the company.""" + hsLastSalesActivityDate: HubspotProperty + + """The date any property on this company was modified""" + hsLastmodifieddate: HubspotProperty + + """ + The list of object IDs that have been merged into this object. This value is automatically set by HubSpot and may not be modified. + """ + hsMergedObjectIds: HubspotProperty + + """ + The unique ID for this company. This unique ID is automatically populated by HubSpot and cannot be changed. + """ + hsObjectId: HubspotProperty + + """ + The highest probability that a contact associated with this company will become a customer within the next 90 days. This score is based on standard contact properties and behavior. + """ + hsPredictivecontactscoreV2: HubspotProperty + + """ + Calculation context property providing next_max for rollup property hs_predictivecontactscore_v2 calculated as MAX via values of hs_predictivecontactscore_v2 on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + hsPredictivecontactscoreV2NextMaxMaxD4e58c1e: HubspotProperty + + """ + The Target Account property is a means to flag high priority companies if you are following an account based strategy + """ + hsTargetAccount: HubspotProperty + + """The probability a company is marked as a target account""" + hsTargetAccountProbability: HubspotProperty + + """ + The user that last updated this object. This value is automatically set by HubSpot and may not be modified. + """ + hsUpdatedByUserId: HubspotProperty + + """The timestamp when an owner was assigned to this company""" + hubspotOwnerAssigneddate: HubspotProperty + + """ + Indicates that the company is publicly traded. Powered by HubSpot Insights. + """ + isPublic: HubspotProperty + + """The number of contacts associated with this company""" + numAssociatedContacts: HubspotProperty + + """The number of deals associated with this company""" + numAssociatedDeals: HubspotProperty + + """ + The number of forms submission for all contacts associated with this company or organization + """ + numConversionEvents: HubspotProperty + + """ + Calculation context property providing cardinality for rollup property num_conversion_events calculated as SUM via values of num_conversion_events on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + numConversionEventsCardinalitySumD095f14b: HubspotProperty + + """ + The most recent conversion date across all contacts associated this company or organization + """ + recentConversionDate: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property recent_conversion_date calculated as LATEST_VALUE via values of recent_conversion_date on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + recentConversionDateTimestampLatestValue72856da1: HubspotProperty + + """ + The last form submitted across all contacts associated this company or organization + """ + recentConversionEventName: HubspotProperty + + """ + Calculation context property providing timestamp for rollup property recent_conversion_event_name calculated as LATEST_VALUE via values of recent_conversion_event_name on object type ObjectTypeId{legacyObjectType=CONTACT} + """ + recentConversionEventNameTimestampLatestValue66c820bf: HubspotProperty + + """The amount of the last deal closed""" + recentDealAmount: HubspotProperty + + """ + The date of the last `closed won` deal associated with this company record. + """ + recentDealCloseDate: HubspotProperty + + """""" + salesforceaccountid: HubspotProperty + + """ + The time zone where the company or organization is located. Powered by HubSpot Insights. + """ + timezone: HubspotProperty + + """ + The total amount of money raised by the company. Powered by HubSpot Insights. + """ + totalMoneyRaised: HubspotProperty + + """The total amount of closed won deals""" + totalRevenue: HubspotProperty + + """The main twitter account of the company or organization""" + twitterhandle: HubspotProperty + + """The Twitter bio of the company or organization""" + twitterbio: HubspotProperty + + """The number of Twitter followers of the company or organization""" + twitterfollowers: HubspotProperty + + """ + The street address of the company or organization, including unit number. Powered by HubSpot Insights. + """ + address: HubspotProperty + + """ + The additional address of the company or organization. Powered by HubSpot Insights. + """ + address2: HubspotProperty + + """The URL of the Facebook company page for the company or organization""" + facebookCompanyPage: HubspotProperty + + """The city where the company is located. Powered by HubSpot Insights.""" + city: HubspotProperty + + """The URL of the LinkedIn company page for the company or organization""" + linkedinCompanyPage: HubspotProperty + + """The LinkedIn bio for the company or organization""" + linkedinbio: HubspotProperty + + """ + The state or region in which the company or organization is located. Powered by HubSpot Insights. + """ + state: HubspotProperty + + """The URL of the Google Plus page for the company or organization""" + googleplusPage: HubspotProperty + + """ + The date of the most recent meeting an associated contact has booked through the meetings tool. + """ + engagementsLastMeetingBooked: HubspotProperty + + """ + This UTM parameter shows which marketing campaign (e.g. a specific email) referred an associated contact to the meetings tool for their most recent booking. This property is only populated when you add tracking parameters to your meeting link. + """ + engagementsLastMeetingBookedCampaign: HubspotProperty + + """ + This UTM parameter shows which channel (e.g. email) referred an associated contact to the meetings tool for their most recent booking. This property is only populated when you add tracking parameters to your meeting link. + """ + engagementsLastMeetingBookedMedium: HubspotProperty + + """ + This UTM parameter shows which site (e.g. Twitter) referred an associated contact to the meetings tool for their most recent booking. This property is only populated when you add tracking parameters to your meeting link. + """ + engagementsLastMeetingBookedSource: HubspotProperty + + """ + The date of the most recent meeting (past or upcoming) logged for, scheduled with, or booked by a contact associated with this company. + """ + hsLatestMeetingActivity: HubspotProperty + + """The last time a tracked sales email was replied to by this company""" + hsSalesEmailLastReplied: HubspotProperty + + """The owner of the company""" + hubspotOwnerId: HubspotProperty + + """ + The last timestamp when a call, email or meeting was logged for a contact at this company. + """ + notesLastContacted: HubspotProperty + + """ + The last time a note, call, meeting, or task was logged for a company. This is set automatically by HubSpot based on user actions in the company record. + """ + notesLastUpdated: HubspotProperty + + """ + The date of the next upcoming scheduled sales activity for this company record. + """ + notesNextActivityDate: HubspotProperty + + """ + The number of times a call, email or meeting was logged for this company + """ + numContactedNotes: HubspotProperty + + """ + Number of sales activities for this company. For example, a call, email or meeting logged. + """ + numNotes: HubspotProperty + + """ + The postal or zip code of the company or organization. Powered by HubSpot Insights. + """ + zip: HubspotProperty + + """ + The country/region in which the company or organization is located. Powered by HubSpot Insights. + """ + country: HubspotProperty + + """The team of the owner of the company.""" + hubspotTeamId: HubspotProperty + + """ + The value of all owner referencing properties for this object, both default and custom + """ + hsAllOwnerIds: HubspotProperty + + """The domain name of the company or organization""" + domain: HubspotProperty + + """ + The team ids corresponding to all owner referencing properties for this object, both default and custom + """ + hsAllTeamIds: HubspotProperty + + """ + The team ids, including up the team hierarchy, corresponding to all owner referencing properties for this object, both default and custom + """ + hsAllAccessibleTeamIds: HubspotProperty + + """ + The type of business the company performs. By default, this property has approximately 150 pre-defined options to select from. While these options cannot be deleted as they used by HubSpot Insights, you can add new custom options to meet your needs. + """ + industry: HubspotProperty + + """ + The most advanced lifecycle stage across all contacts associated with this company or organization + """ + lifecyclestage: HubspotProperty + + """The company's sales, prospecting or outreach status""" + hsLeadStatus: HubspotProperty + + """The parent company of this company""" + hsParentCompanyId: HubspotProperty + + """ + The optional classification of this company record - prospect, partner, etc. + """ + type: HubspotProperty + + """ + A short statement about the company's mission and goals. Powered by HubSpot Insights. + """ + description: HubspotProperty + + """The number of child companies of this company""" + hsNumChildCompanies: HubspotProperty + + """The sales and marketing score for the company or organization""" + hubspotscore: HubspotProperty + + """The date the company or organization was added to the database""" + createdate: HubspotProperty + + """The date the company or organization was closed as a customer""" + closedate: HubspotProperty + + """ + The date that the first contact from this company entered the system, which could pre-date the company's create date + """ + firstContactCreatedate: HubspotProperty + + """ + The number of days between when the company record was created and when they closed as a customer. + """ + daysToClose: HubspotProperty + + """ + The web technologies used by the company or organization. Powered by HubSpot Insights. + """ + webTechnologies: HubspotProperty +} + +"""Company records store information about a business or organization""" +type HubspotCompany { + """The Hub ID that the company belongs to.""" + portalId: Int + + """The unique ID of the company record.""" + companyId: Int + + """ + Whether or not the record is deleted. In practice this will always be false as deleted records will not appear in the API. + """ + isDeleted: Boolean + + """ + "An object containing objects representing the properties that are set for the company record. + + Companies will only contain an entry for a property if that property has been set for the record. + """ + properties: HubspotCompanyProperties + + """All contacts associated with this company.""" + contacts( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Number of contacts to fetch, maximum is 100. Defaults to 20.""" + first: Int + ): HubspotContactsConnection +} + +"""The root for Hubspot""" +type HubspotQuery { + """ + Get a company by its id. Company records store information about a business or organization + """ + company(id: Int!): HubspotCompany! + + """List companies""" + companies( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Number of companies to fetch, maximum is 250. Defaults to 20.""" + first: Int + ): HubspotCompaniesConnection + + """Contact""" + contact( + """Contact email. Must provide exactly one of id or email.""" + email: String + + """Contact id. Must provide exactly one of id or email.""" + id: Int + ): HubspotContact! + + """Contacts""" + contacts( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Number of contacts to fetch, maximum is 100. Defaults to 20.""" + first: Int + ): HubspotContactsConnection + + """Get a deal by its id.""" + deal(id: Int!): HubspotDeal! + + """List deals""" + deals( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Number of deals to fetch, maximum is 250. Defaults to 100.""" + first: Int + ): HubspotDealsConnection + + """ + Get a list of all engagement for a portal, with pagination. Engagements are used to store data from CRM actions, including notes, tasks, meetings, and calls. Engagements should be associated with at least one contact record, and optionally other contacts, deals, and a company record. + """ + engagements( + """Fetch results after the specified cursor.""" + after: String + + """Number of results to fetch. Defaults to 10, max is 100.""" + first: Int + ): HubspotEngagementsConnection! + + """Get an owner by id.""" + owner( + """Id of the owner.""" + id: Int! + ): HubspotOwner! + + """ + Make a REST API call to the Hubspot API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: HubspotPassthroughQuery! +} + +type GoogleDiscoveryMediaUploadProtocol { + """""" + name: String! + + """""" + multipart: Boolean! + + """""" + path: String! +} + +type GoogleDiscoveryMediaUpload { + """""" + accept: [String!]! + + """""" + protocols: [GoogleDiscoveryMediaUploadProtocol!]! +} + +type GoogleDiscoveryApiResourceMethodResponse { + """The Google Resource data this field points to, if any""" + ref: String +} + +type GoogleDiscoveryApiResourceMethodRequest { + """The Google Resource data this field points to, if any""" + ref: String +} + +type GoogleDiscoveryApiResourceMethodParameter { + """""" + name: String! + + """""" + type: String + + """""" + required: Boolean + + """""" + location: String + + """""" + description: String + + """""" + format: String + + """""" + minimum: String + + """""" + maximum: String + + """""" + default: String +} + +type GoogleDiscoveryApiResourceMethod { + """""" + name: String! + + """""" + id: String + + """""" + path: String + + """""" + httpMethod: String + + """""" + description: String + + """""" + parameters: [GoogleDiscoveryApiResourceMethodParameter!]! + + """""" + parameterOrder: [String!]! + + """""" + scopes: [String!] + + """""" + request: GoogleDiscoveryApiResourceMethodRequest + + """""" + response: GoogleDiscoveryApiResourceMethodResponse + + """""" + supportsMediaDownload: Boolean + + """""" + supportsMediaUpload: Boolean + + """""" + useMediaDownloadService: Boolean + + """""" + useMediaUploadService: Boolean + + """""" + mediaUpload: GoogleDiscoveryMediaUpload +} + +type GoogleDiscoveryApiResource { + """""" + name: String! + + """""" + methods: [GoogleDiscoveryApiResourceMethod!]! + + """""" + resources: [GoogleDiscoveryApiResource!]! +} + +type GoogleDiscoveryApiSchemaPropertyItemAdditionalProperty { + """""" + type: String + + """The Google Resource data this field points to, if any""" + ref: String + + """""" + description: String +} + +type GoogleDiscoveryApiSchemaPropertyItem { + """""" + type: String + + """The Google Resource data this field points to, if any""" + ref: String + + """ + If this is an object type, this field will have info on the field types + """ + properties: [GoogleDiscoveryApiSchemaProperty!]! +} + +type GoogleDiscoveryApiSchemaProperty { + """""" + name: String! + + """""" + type: String + + """""" + description: String + + """""" + default: String + + """The Google Resource data this field points to, if any""" + ref: String + + """""" + enum: [String!] + + """""" + enumDescriptions: [String!] + + """ + If this is an array type, this field will have info on the element types + """ + items: GoogleDiscoveryApiSchemaPropertyItem + + """ + If this is an object type, this field will have info on the field types + """ + properties: [GoogleDiscoveryApiSchemaProperty!]! + + """If this is an object type, this field may have info on the field types""" + additionalProperties: GoogleDiscoveryApiSchemaPropertyItemAdditionalProperty +} + +type GoogleDiscoveryApiSchema { + """""" + name: String! + + """""" + id: String + + """""" + type: String + + """""" + description: String + + """""" + properties: [GoogleDiscoveryApiSchemaProperty!]! +} + +type GoogleDiscoveryApiOAuth2Scope { + """""" + value: String! + + """""" + description: String +} + +type GoogleDiscoveryApiOAuth2 { + """""" + scopes: [GoogleDiscoveryApiOAuth2Scope!]! +} + +type GoogleDiscoveryApiAuth { + """""" + oauth2: GoogleDiscoveryApiOAuth2 +} + +type GoogleDiscoveryApiParameter { + """""" + name: String! + + """""" + type: String + + """""" + description: String + + """""" + default: String + + """""" + location: String +} + +type GoogleDiscoveryApiDetails { + """""" + parameters: [GoogleDiscoveryApiParameter!]! + + """""" + batchPath: String + + """""" + servicePath: String + + """""" + rootUrl: String + + """""" + basePath: String + + """""" + baseUrl: String + + """""" + protocol: String + + """""" + documentationLink: String + + """""" + ownerName: String + + """""" + ownerDomain: String + + """""" + description: String + + """""" + title: String + + """""" + revision: String + + """""" + version: String + + """""" + canonicalName: String + + """""" + name: String + + """""" + id: String + + """""" + discoveryVersion: String + + """""" + etag: String + + """""" + kind: String + + """""" + auth: GoogleDiscoveryApiAuth + + """""" + schemas: [GoogleDiscoveryApiSchema!]! + + """""" + resources: [GoogleDiscoveryApiResource!]! +} + +type GoogleDiscoveryApiItemsIcons { + """""" + x16: String! + + """""" + x32: String! +} + +type GoogleDiscoveryApiOverview { + """""" + documentationLink: String + + """""" + discoveryLink: String + + """""" + id: String! + + """""" + icons: GoogleDiscoveryApiItemsIcons! + + """""" + name: String! + + """""" + labels: [String!] + + """""" + kind: String! + + """""" + preferred: Boolean! + + """""" + title: String! + + """""" + version: String! + + """""" + discoveryRestUrl: String! + + """""" + description: String! + details: GoogleDiscoveryApiDetails! +} + +type GoogleDiscoveryApiApis { + """""" + discoveryVersion: String! + + """""" + items: [GoogleDiscoveryApiOverview!]! + + """""" + kind: String! +} + +type GoogleDiscoveryQuery { + apis: GoogleDiscoveryApiApis! + api(version: String!, name: String!): GoogleDiscoveryApiDetails! +} + +""" +The format of the source text, in either HTML (default) or plain-text. A value of html indicates HTML and a value of text indicates plain-text. +""" +enum GoogleTranslateFormat { + """text indicates plain-text""" + text + + """html indicates HTML """ + html +} + +enum GoogleTranslatePhraseBasedMachineTranslationModelLanguageEnum { + """Afrikaans""" + af + + """Albanian""" + sq + + """Amharic""" + am + + """Arabic""" + ar + + """Armenian""" + hy + + """Azeerbaijani""" + az + + """Basque""" + eu + + """Belarusian""" + be + + """Bengali""" + bn + + """Bosnian""" + bs + + """Bulgarian""" + bg + + """Catalan""" + ca + + """Cebuano""" + ceb + + """Chinese (Simplified)""" + zhCN + + """Chinese (Traditional)""" + zhTW + + """Corsican""" + co + + """Croatian""" + hr + + """Czech""" + cs + + """Danish""" + da + + """Dutch""" + nl + + """English""" + en + + """Esperanto""" + eo + + """Estonian""" + et + + """Finnish""" + fi + + """French""" + fr + + """Frisian""" + fy + + """Galician""" + gl + + """Georgian""" + ka + + """German""" + de + + """Greek""" + el + + """Gujarati""" + gu + + """Haitian Creole""" + ht + + """Hausa""" + ha + + """Hawaiian""" + haw + + """Hebrew""" + iw + + """Hindi""" + hi + + """Hmong""" + hmn + + """Hungarian""" + hu + + """Icelandic""" + is + + """Igbo""" + ig + + """Indonesian""" + id + + """Irish""" + ga + + """Italian""" + it + + """Japanese""" + ja + + """Javanese""" + jw + + """Kannada""" + kn + + """Kazakh""" + kk + + """Khmer""" + km + + """Korean""" + ko + + """Kurdish""" + ku + + """Kyrgyz""" + ky + + """Lao""" + lo + + """Latin""" + la + + """Latvian""" + lv + + """Lithuanian""" + lt + + """Luxembourgish""" + lb + + """Macedonian""" + mk + + """Malagasy""" + mg + + """Malay""" + ms + + """Malayalam""" + ml + + """Maltese""" + mt + + """Maori""" + mi + + """Marathi""" + mr + + """Mongolian""" + mn + + """Myanmar (Burmese)""" + my + + """Nepali""" + ne + + """Norwegian""" + no + + """Nyanja (Chichewa)""" + ny + + """Pashto""" + ps + + """Persian""" + fa + + """Polish""" + pl + + """Portuguese (Portugal, Brazil)""" + pt + + """Punjabi""" + pa + + """Romanian""" + ro + + """Russian""" + ru + + """Samoan""" + sm + + """Scots Gaelic""" + gd + + """Serbian""" + sr + + """Sesotho""" + st + + """Shona""" + sn + + """Sindhi""" + sd + + """Sinhala (Sinhalese)""" + si + + """Slovak""" + sk + + """Slovenian""" + sl + + """Somali""" + so + + """Spanish""" + es + + """Sundanese""" + su + + """Swahili""" + sw + + """Swedish""" + sv + + """Tagalog (Filipino)""" + tl + + """Tajik""" + tg + + """Tamil""" + ta + + """Telugu""" + te + + """Thai""" + th + + """Turkish""" + tr + + """Ukrainian""" + uk + + """Urdu""" + ur + + """Uzbek""" + uz + + """Vietnamese""" + vi + + """Welsh""" + cy + + """Xhosa""" + xh + + """Yiddish""" + yi + + """Yoruba""" + yo + + """Zulu""" + zu +} + +"""""" +input GoogleTranslateTranslationInputArg { + format: GoogleTranslateFormat + q: [String!]! + target: GoogleTranslatePhraseBasedMachineTranslationModelLanguageEnum! + model: String + source: String +} + +"""""" +type GoogleTranslateTranslationsResource { + """Text translated into the target language.""" + translatedText: String + + """ + The source language of the initial request, detected automatically, if + no source language was passed within the initial request. If the + source language was passed, auto-detection of the language will not + occur and this field will be empty. + """ + detectedSourceLanguage: String + + """ + The `model` type used for this translation. Valid values are + listed in public documentation. Can be different from requested `model`. + Present only if specific model type was explicitly requested. + """ + model: String +} + +"""The main language translation response message.""" +type GoogleTranslateTranslationsListResponse { + """Translations contains list of translation results of given text""" + translations: [GoogleTranslateTranslationsResource!] +} + +"""Google Translate""" +type GoogleTranslate { + translate(data: GoogleTranslateTranslationInputArg!): GoogleTranslateTranslationsListResponse +} + +"""Body of items (files/documents) to which the query applies.""" +enum GoogleDriveFilesCorporaEnum { + """Files owned by or shared to the user.""" + USER + + """Files owned by or shared to the user's domain.""" + DOMAIN + + """ + Files owned by a team. Must provide teamDriveId when using this option. + """ + TEAM_DRIVE + + """ + Files owned by any team drive. Results may be incomplete when searching multiple team drives. Check the `incompleteSearch` field in the results to check if any results are missing. When that happens, it is suggested that clients narrow their query by choosing a different corpus such as `user` or `teamDrive`. + """ + ALL_TEAM_DRIVES +} + +"""Key to order the results by.""" +enum GoogleDriveFilesOrderByEnum { + """Order by createdTime ascending""" + CREATED_TIME_ASC + + """Order by createdTime descending""" + CREATED_TIME_DESC + + """Order by folder ascending""" + FOLDER_ASC + + """Order by folder descending""" + FOLDER_DESC + + """Order by modifiedByMeTime ascending""" + MODIFIED_BY_ME_TIME_ASC + + """Order by modifiedByMeTime descending""" + MODIFIED_BY_ME_TIME_DESC + + """Order by modifiedTime ascending""" + MODIFIED_TIME_ASC + + """Order by modifiedTime descending""" + MODIFIED_TIME_DESC + + """Order by name ascending""" + NAME_ASC + + """Order by name descending""" + NAME_DESC + + """Order by name_natural ascending""" + NAME_NATURAL_ASC + + """Order by name_natural descending""" + NAME_NATURAL_DESC + + """Order by quotaBytesUsed ascending""" + QUOTA_BYTES_USED_ASC + + """Order by quotaBytesUsed descending""" + QUOTA_BYTES_USED_DESC + + """Order by recency ascending""" + RECENCY_ASC + + """Order by recency descending""" + RECENCY_DESC + + """Order by sharedWithMeTime ascending""" + SHARED_WITH_ME_TIME_ASC + + """Order by sharedWithMeTime descending""" + SHARED_WITH_ME_TIME_DESC + + """Order by starred ascending""" + STARRED_ASC + + """Order by starred descending""" + STARRED_DESC + + """Order by viewedByMe ascending""" + VIEWED_BY_ME_ASC + + """Order by viewdedByMe descending""" + VIEWED_BY_ME_DESC +} + +"""Spaces to which the query applies.""" +enum GoogleDriveFilesSpacesEnum { + """Drive""" + DRIVE + + """App data folder""" + APP_DATA_FOLDER + + """Photos""" + PHOTOS +} + +"""List of files with pagination info.""" +type GoogleDriveFilesConnection { + """List of files""" + nodes: [GoogleDriveFile!]! + + """Pagination information for the result""" + pageInfo: PageInfo! + + """ + Whether the search process was incomplete. If true, then some search results may be missing, since all documents were not searched. This may occur when searching multiple Team Drives corpora, but all corpora could not be searched. When this happens, it is suggested that clients narrow their query by choosing a different corpus such as `USER` or `TEAM_DRIVE`. + """ + incompleteSearch: Boolean! +} + +""" +Self-contained URL to download the file. Keep the url secure, as anyone with the URL will be able to download the file. Expires in 24 hours. +""" +type GoogleDriveOneGraphFileDownload { + """ + Url to download the file. Keep the url secure, as anyone with the URL will be able to download the file. Expires in 24 hours. + """ + url: String! + + """The time at which the download url expires (RFC 3339 date-time).""" + expirationTime: String! +} + +""" +A thumbnail for the file. This will only be used if Drive cannot generate a standard thumbnail. +""" +type GoogleDriveFileContentHintsThumbnail { + """The thumbnail data encoded with URL-safe Base64 (RFC 4648 section 5).""" + image: String + + """The MIME type of the thumbnail.""" + mimeType: String +} + +""" +Additional information about the content of the file. These fields are never populated in responses. +""" +type GoogleDriveFileContentHints { + """ + Text to be indexed for the file to improve fullText queries. This is limited to 128KB in length and may contain HTML elements. + """ + indexableText: String + + """ + A thumbnail for the file. This will only be used if Drive cannot generate a standard thumbnail. + """ + thumbnail: GoogleDriveFileContentHintsThumbnail +} + +""" +Additional metadata about video media. This may not be available immediately upon upload. +""" +type GoogleDriveFileVideoMediaMetadata { + """The duration of the video in milliseconds.""" + durationMillis: String + + """The height of the video in pixels.""" + height: Int + + """The width of the video in pixels.""" + width: Int +} + +"""Geographic location information stored in the image.""" +type GoogleDriveFileImageMediaMetadataLocation { + """The altitude stored in the image.""" + altitude: Float + + """The latitude stored in the image.""" + latitude: Float + + """The longitude stored in the image.""" + longitude: Float +} + +"""Additional metadata about image media, if available.""" +type GoogleDriveFileImageMediaMetadata { + """Whether a flash was used to create the photo.""" + flashUsed: Boolean + + """ + The smallest f-number of the lens at the focal length used to create the photo (APEX value). + """ + maxApertureValue: Float + + """The width of the image in pixels.""" + width: Int + + """The make of the camera used to create the photo.""" + cameraMake: String + + """The height of the image in pixels.""" + height: Int + + """The exposure mode used to create the photo.""" + exposureMode: String + + """The lens used to create the photo.""" + lens: String + + """The white balance mode used to create the photo.""" + whiteBalance: String + + """The distance to the subject of the photo, in meters.""" + subjectDistance: Int + + """The type of sensor used to create the photo.""" + sensor: String + + """The ISO speed used to create the photo.""" + isoSpeed: Int + + """The exposure bias of the photo (APEX value).""" + exposureBias: Float + + """The model of the camera used to create the photo.""" + cameraModel: String + + """Geographic location information stored in the image.""" + location: GoogleDriveFileImageMediaMetadataLocation + + """The date and time the photo was taken (EXIF DateTime).""" + time: String + + """ + The rotation in clockwise degrees from the image's original orientation. + """ + rotation: Int + + """The color space of the photo.""" + colorSpace: String + + """The focal length used to create the photo, in millimeters.""" + focalLength: Float + + """The length of the exposure, in seconds.""" + exposureTime: Float + + """The aperture used to create the photo (f-number).""" + aperture: Float + + """The metering mode used to create the photo.""" + meteringMode: String +} + +"""Information about a Drive user.""" +type GoogleDriveUser { + """A plain text displayable name for this user.""" + displayName: String + + """ + The email address of the user. This may not be present in certain contexts if the user has not made their email address visible to the requester. + """ + emailAddress: String + + """ + Identifies what kind of resource this is. Value: the fixed string "drive#user". + """ + kind: String + + """Whether this user is the requesting user.""" + me: Boolean + + """The user's ID as visible in Permission resources.""" + permissionId: String + + """A link to the user's profile photo, if available.""" + photoLink: String +} + +"""""" +type GoogleDrivePermissionTeamDrivePermissionDetailsItem { + """ + Whether this permission is inherited. This field is always populated. This is an output-only field. + """ + inherited: Boolean + + """ + The ID of the item from which this permission is inherited. This is an output-only field and is only populated for members of the Team Drive. + """ + inheritedFrom: String + + """ + The primary role for this user. While new values may be added in the future, the following are currently possible: + - organizer + - fileOrganizer + - writer + - commenter + - reader + """ + role: String + + """ + The Team Drive permission type for this user. While new values may be added in future, the following are currently possible: + - file + - member + """ + teamDrivePermissionType: String +} + +""" +A permission for a file. A permission grants a user, group, domain or the world access to a file or a folder hierarchy. +""" +type GoogleDrivePermission { + """ + The role granted by this permission. While new values may be supported in the future, the following are currently allowed: + - owner + - organizer + - fileOrganizer + - writer + - commenter + - reader + """ + role: String + + """ + The email address of the user or group to which this permission refers. + """ + emailAddress: String + + """A displayable name for users, groups or domains.""" + displayName: String + + """ + The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId. + """ + id: String + + """ + Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone. + """ + allowFileDiscovery: Boolean + + """ + The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions: + - They can only be set on user and group permissions + - The time must be in the future + - The time cannot be more than a year in the future + """ + expirationTime: String + + """The domain to which this permission refers.""" + domain: String + + """A link to the user's profile photo, if available.""" + photoLink: String + + """ + Details of whether the permissions on this Team Drive item are inherited or directly on this item. This is an output-only field which is present only for Team Drive items. + """ + teamDrivePermissionDetails: [GoogleDrivePermissionTeamDrivePermissionDetailsItem!] + + """ + Identifies what kind of resource this is. Value: the fixed string "drive#permission". + """ + kind: String + + """ + The type of the grantee. Valid values are: + - user + - group + - domain + - anyone + """ + type: String + + """ + Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions. + """ + deleted: Boolean +} + +""" +Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take. +""" +type GoogleDriveFileCapabilities { + """ + Whether the current user can delete children of this folder. This is false when the item is not a folder. Only populated for Team Drive items. + """ + canDeleteChildren: Boolean + + """ + Whether the current user can change the copyRequiresWriterPermission restriction of this file. + """ + canChangeCopyRequiresWriterPermission: Boolean + + """ + Whether the current user can trash children of this folder. This is false when the item is not a folder. Only populated for Team Drive items. + """ + canTrashChildren: Boolean + + """ + Whether the current user can move this Team Drive item outside of this Team Drive by changing its parent. Note that a request to change the parent of the item may still fail depending on the new parent that is being added. Only populated for Team Drive items. + """ + canMoveItemOutOfTeamDrive: Boolean + + """ + Whether the current user can add children to this folder. This is always false when the item is not a folder. + """ + canAddChildren: Boolean + + """ + Whether the current user can modify the sharing settings for this file. + """ + canShare: Boolean + + """ + Whether the current user can read the revisions resource of this file. For a Team Drive item, whether revisions of non-folder descendants of this item, or this item itself if it is not a folder, can be read. + """ + canReadRevisions: Boolean + + """ + Whether the current user can remove children from this folder. This is always false when the item is not a folder. For Team Drive items, use canDeleteChildren or canTrashChildren instead. + """ + canRemoveChildren: Boolean + + """ + Whether the current user can move this item into a Team Drive. If the item is in a Team Drive, this field is equivalent to canMoveTeamDriveItem. + """ + canMoveItemIntoTeamDrive: Boolean + + """ + Whether the current user can copy this file. For a Team Drive item, whether the current user can copy non-folder descendants of this item, or this item itself if it is not a folder. + """ + canCopy: Boolean + + """Whether the current user can move this file to trash.""" + canTrash: Boolean + + """ + Whether the current user can move children of this folder outside of the Team Drive. This is false when the item is not a folder. Only populated for Team Drive items. + """ + canMoveChildrenOutOfTeamDrive: Boolean + + """ + Deprecated - use canMoveItemWithinTeamDrive or canMoveItemOutOfTeamDrive instead. + """ + canMoveTeamDriveItem: Boolean + + """Whether the current user can delete this file.""" + canDelete: Boolean + + """Whether the current user can download this file.""" + canDownload: Boolean + + """Whether the current user can restore this file from trash.""" + canUntrash: Boolean + + """ + Whether the current user can move children of this folder within the Team Drive. This is false when the item is not a folder. Only populated for Team Drive items. + """ + canMoveChildrenWithinTeamDrive: Boolean + + """Whether the current user can edit this file.""" + canEdit: Boolean + + """Deprecated""" + canChangeViewersCanCopyContent: Boolean + + """Whether the current user can rename this file.""" + canRename: Boolean + + """ + Whether the current user can move this Team Drive item within this Team Drive. Note that a request to change the parent of the item may still fail depending on the new parent that is being added. Only populated for Team Drive items. + """ + canMoveItemWithinTeamDrive: Boolean + + """ + Whether the current user can read the Team Drive to which this file belongs. Only populated for Team Drive files. + """ + canReadTeamDrive: Boolean + + """ + Whether the current user can list the children of this folder. This is always false when the item is not a folder. + """ + canListChildren: Boolean + + """Whether the current user can comment on this file.""" + canComment: Boolean +} + +"""The metadata for a file.""" +type GoogleDriveFile { + """ + Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take. + """ + capabilities: GoogleDriveFileCapabilities + + """ + A collection of arbitrary key-value pairs which are visible to all apps. + Entries with null values are cleared in update and copy requests. + """ + properties: [KVPair!] + + """ + The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files. + """ + permissions: [GoogleDrivePermission!] + + """ + A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive. + """ + webContentLink: String + + """ + A collection of arbitrary key-value pairs which are private to the requesting app. + Entries with null values are cleared in update and copy requests. + """ + appProperties: [KVPair!] + + """ + Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash. + """ + trashed: Boolean + + """Whether the user owns the file. Not populated for Team Drive files.""" + ownedByMe: Boolean + + """ + The final component of fullFileExtension. This is only available for files with binary content in Drive. + """ + fileExtension: String + + """ + Whether the options to copy, print, or download this file, should be disabled for readers and commenters. + """ + copyRequiresWriterPermission: Boolean + + """ + Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder. + """ + explicitlyTrashed: Boolean + + """Whether the user has starred the file.""" + starred: Boolean + + """The thumbnail version for use in thumbnail cache invalidation.""" + thumbnailVersion: String + + """The last user to modify the file.""" + lastModifyingUser: GoogleDriveUser + + """Whether the file has been shared. Not populated for Team Drive files.""" + shared: Boolean + + """The ID of the file.""" + id: String + + """ + The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files. + """ + owners: [GoogleDriveUser!] + + """ + The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource. + If an unsupported color is specified, the closest color in the palette will be used instead. + """ + folderColorRgb: String + + """The time at which the file was created (RFC 3339 date-time).""" + createdTime: String + + """Whether the file was created or opened by the requesting app.""" + isAppAuthorized: Boolean + + """The last time the file was modified by the user (RFC 3339 date-time).""" + modifiedByMeTime: String + + """ + The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'. + """ + spaces: [String!] + + """ + The IDs of the parent folders which contain the file. + If not specified as part of a create request, the file will be placed directly in the user's My Drive folder. If not specified as part of a copy request, the file will inherit any discoverable parents of the source file. Update requests must use the addParents and removeParents parameters to modify the parents list. + """ + parents: [String!] + + """Additional metadata about image media, if available.""" + imageMediaMetadata: GoogleDriveFileImageMediaMetadata + + """ + The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant. + """ + name: String + + """ + If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files. + """ + trashingUser: GoogleDriveUser + + """ + Additional metadata about video media. This may not be available immediately upon upload. + """ + videoMediaMetadata: GoogleDriveFileVideoMediaMetadata + + """A static, unauthenticated link to the file's icon.""" + iconLink: String + + """ + The ID of the file's head revision. This is currently only available for files with binary content in Drive. + """ + headRevisionId: String + + """ + Identifies what kind of resource this is. Value: the fixed string "drive#file". + """ + kind: String + + """ID of the Team Drive the file resides in.""" + teamDriveId: String + + """ + Additional information about the content of the file. These fields are never populated in responses. + """ + contentHints: GoogleDriveFileContentHints + + """ + The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files. + """ + trashedTime: String + + """ + Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field. + """ + hasThumbnail: Boolean + + """ + A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user. + """ + version: String + + """ + The last time the file was modified by anyone (RFC 3339 date-time). + Note that setting modifiedTime will also update modifiedByMeTime for the user. + """ + modifiedTime: String + + """Deprecated - use copyRequiresWriterPermission instead.""" + viewersCanCopyContent: Boolean + + """ + Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files. + """ + writersCanShare: Boolean + + """ + The full file extension extracted from the name field. May contain multiple concatenated extensions, such as "tar.gz". This is only available for files with binary content in Drive. + This is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension. + """ + fullFileExtension: String + + """The last time the file was viewed by the user (RFC 3339 date-time).""" + viewedByMeTime: String + + """ + The size of the file's content in bytes. This is only applicable to files with binary content in Drive. + """ + size: String + + """Whether the file has been viewed by this user.""" + viewedByMe: Boolean + + """ + The MIME type of the file. + Drive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded. + If a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource. + """ + mimeType: String + + """Whether the file has been modified by this user.""" + modifiedByMe: Boolean + + """ + The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled. + """ + quotaBytesUsed: String + + """ + The time at which the file was shared with the user, if applicable (RFC 3339 date-time). + """ + sharedWithMeTime: String + + """ + The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive. + """ + md5Checksum: String + + """ + The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive. + """ + originalFilename: String + + """List of permission IDs for users with access to this file.""" + permissionIds: [String!] + + """ + A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content. + """ + thumbnailLink: String + + """A short description of the file.""" + description: String + + """ + A link for opening the file in a relevant Google editor or viewer in a browser. + """ + webViewLink: String + + """The user who shared the file with the requesting user, if applicable.""" + sharingUser: GoogleDriveUser + + """ + Whether any users are granted file access directly on this file. This field is only populated for Team Drive files. + """ + hasAugmentedPermissions: Boolean + + """ + Self-contained URL to download the file. Keep the url secure, as anyone with the URL will be able to download the file. Expires in 24 hours. + """ + fileDownload( + """ + + You must provide a mimeType if you are downloading a Google Docs file (e.g. a spreadsheet created with Google Docs). + + mimeType will be ignored for downloading regualar files. + + The following mimeTypes are supported: + + + | Google Doc Format | Conversion Format | Corresponding MIME type | + | ----------------- | ------------------------ | ------------------------------------------------------------------------- | + | Documents | HTML | text/html | + | | HTML (zipped) | application/zip | + | | Plain text | text/plain | + | | Rich text | application/rtf | + | | Open Office doc | application/vnd.oasis.opendocument.text | + | | PDF | application/pdf | + | | MS Word document | application/vnd.openxmlformats-officedocument.wordprocessingml.document | + | | EPUB | application/epub+zip | + | Spreadsheets | MS Excel | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | + | | Open Office sheet | application/x-vnd.oasis.opendocument.spreadsheet | + | | PDF | application/pdf | + | | CSV (first sheet only) | text/csv | + | | TSV (first sheet only) | text/tab-separated-values | + | | HTML (zipped) | application/zip | + | Drawings | JPEG | image/jpeg | + | | PNG | image/png | + | | SVG | image/svg+xml | + | | PDF | application/pdf | + | Presentations | MS PowerPoint | application/vnd.openxmlformats-officedocument.presentationml.presentation | + | | Open Office presentation | application/vnd.oasis.opendocument.presentation | + | | PDF | application/pdf | + | | Plain text | text/plain | + | Apps Scripts | JSON | application/vnd.google-apps.script+json | + + Reference: [https://developers.google.com/drive/api/v3/manage-downloads](https://developers.google.com/drive/api/v3/manage-downloads) + + """ + mimeType: String + ): GoogleDriveOneGraphFileDownload +} + +"""Google Drive""" +type GoogleDrive { + file( + """Id of the file""" + id: String! + ): GoogleDriveFile! + files( + """ + + Optional query param to search for specific files. + + **Examples** + + Search for files with the name "hello" + + ``` + name = 'hello' + ``` + + Search for folders using the folder-specific MIME type + + ``` + mimeType = 'application/vnd.google-apps.folder' + ``` + + Search for files that are not folders + + ``` + mimeType != 'application/vnd.google-apps.folder' + ``` + + Search for files with a name containing the words "hello" and "goodbye" + + ``` + name contains 'hello' and name contains 'goodbye' + ``` + + Search for files with a name that does not contain the word "hello" + + ``` + not name contains 'hello' + ``` + + Search for files containing the word "hello" in the content + + ``` + fullText contains 'hello' + ``` + + Search for files not containing the word "hello" in the content + + ``` + not fullText contains 'hello' + ``` + + Search for files containing the exact phrase "hello world" in the content + + ``` + fullText contains '"hello world"' + fullText contains '"hello_world"' + ``` + + Search for files with a query containing the "" character (e.g., "\\authors") + + ``` + fullText contains '\\authors' + ``` + + Search for files writeable by the user "test@example.org" + + ``` + 'test@example.org' in writers + ``` + + Search for files writeable by the members of the group "group@example.org" + + ``` + 'group@example.org' in writers + ``` + + Search for the ID 1234567 in the parents collection. This finds all files and folders located directly in the folder whose ID is 1234567. + + ``` + '1234567' in parents + ``` + + Search for the alias ID appDataFolder in the parents collection. This finds all files and folders located directly under the Application Data folder. + + ``` + 'appDataFolder' in parents + ``` + + Search for files writeable by the users "test@example.org" and "test2@example.org" + + ``` + 'test@example.org' in writers and 'test2@example.org' in writers + ``` + + Search for files containing the text "important" which are in the trash + + ``` + fullText contains 'important' and trashed = true + ``` + + Search for files modified after June 4th 2012 + + ``` + modifiedTime > '2012-06-04T12:00:00' // default time zone is UTC + modifiedTime > '2012-06-04T12:00:00-08:00' + ``` + + Search for files shared with the authorized user with "hello" in the name + + ``` + sharedWithMe and name contains 'hello' + ``` + + Search for files with a custom file property named additionalID with the value 8e8aceg2af2ge72e78. + + ``` + appProperties has { key='additionalID' and value='8e8aceg2af2ge72e78' } + ``` + + Search for files that have not been shared with anyone or domains (only private, or shared with specific users or groups) + + ``` + visibility = 'limited' + ``` + + **Fields** + + | Field | Value Type | Operators | Description | + | -------------- | ---------- | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | + | name | string | contains, =, != | Name of the file. `contains` only matches from the start of the string (e.g. 'hello' will find 'hello world', but not 'world hello' | + | fullText | string | contains | Full text of the file including name, description, content, and indexable text. `contains` only matches whole words | + | mimeType | string | contains, =, != | MIME type of the file. | + | modifiedTime | date3 | <=, <, =, !=, >, >= | Date of the last modification of the file. | + | viewedByMeTime | date3 | <=, <, =, !=, >, >= | Date that the user last viewed a file. | + | trashed | boolean | =, != | Whether the file is in the trash or not. | + | starred | boolean | =, != | Whether the file is starred or not. | + | parents | collection | in | Whether the parents collection contains the specified ID. | + | owners | collection | in | Users who own the file. | + | writers | collection | in | Users or groups who have permission to modify the file. | + | readers | collection | in | Users or groups who have permission to read the file. | + | sharedWithMe | boolean | =, != | Files that are in the user's "Shared with me" collection. | + | properties | collection | has | Public custom file properties. | + | appProperties | collection | has | Private custom file properties. | + | visibility | string | =, '!=' | The visibility level of the file. Valid values are anyoneCanFind, anyoneWithLink, domainCanFind, domainWithLink, and limited. | + + """ + q: String + + """ + Body of items (files/documents) to which the query applies. Supported bodies are `USER`, `DOMAIN`, `TEAM_DRIVE` and `ALL_TEAM_DRIVES`. Prefer `USER` or `TEAM_DRIVE` to `ALL_TEAM_DRIVES` for efficiency. Defaults to `USER` + """ + corpora: GoogleDriveFilesCorporaEnum + + """ + Sort keys. Can sort by multiple different keys. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored. + """ + orderBy: [GoogleDriveFilesOrderByEnum!] + + """ + The maximum number of files to return. Partial or empty result pages are possible even before the end of the files list has been reached. Acceptable values are 1 to 1000, inclusive. Defaults to 10. + """ + first: Int + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Spaces to query within the corpus.""" + spaces: [GoogleDriveFilesSpacesEnum!] + + """ID of Team Drive to search""" + teamDriveId: String + ): GoogleDriveFilesConnection! +} + +"""A unit of data that will be returned by the DNS servers.""" +type ResourceRecordSet { + """ + Identifies what kind of resource this is. Value: the fixed string "dns#resourceRecordSet". + """ + kind: String + + """For example, www.example.com.""" + name: String + + """As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1).""" + rrdatas: [String!] + + """As defined in RFC 4034 (section 3.2).""" + signatureRrdatas: [String!] + + """ + Number of seconds that this ResourceRecordSet can be cached by resolvers. + """ + ttl: Int + + """ + The identifier of a supported record type, for example, A, AAAA, MX, TXT, and so on. + """ + type: String +} + +"""Elements common to every response.""" +type ResponseHeader { + """ + For mutating operation requests that completed successfully. This is the client_operation_id if the client specified it, otherwise it is generated by the server (output only). + """ + operationId: String +} + +"""""" +type ResourceRecordSetsListResponse { + """""" + header: ResponseHeader + + """Type of resource.""" + kind: String + + """ + The presence of this field indicates that there exist more results following your last page of results in pagination order. To fetch them, make another list request using this value as your pagination token. + + In this way you can retrieve the complete contents of even very large collections one page at a time. However, if the contents of the collection change between the first and last paginated list request, the set of all elements returned will be an inconsistent view of the collection. There is no way to retrieve a consistent snapshot of a collection larger than the maximum page size. + """ + nextPageToken: String + + """The resource record set resources.""" + rrsets: [ResourceRecordSet!] +} + +type GoogleDNSProjectZone { + """""" + kind: String + + """""" + description: String + + """""" + dnsName: String + + """""" + id: String + + """""" + name: String + + """""" + nameServerSet: String + + """""" + nameServers: [String!] + resourceRecords: ResourceRecordSetsListResponse! +} + +type GoogleDNSProjectZones { + """kind""" + kind: String + + """kind""" + nextPageToken: String + + """zones""" + zones: [GoogleDNSProjectZone!] +} + +""" +Parameters for DnsKey key generation. Used for generating initial keys for a new ManagedZone and as default when adding a new DnsKey. +""" +type DnsKeySpec { + """String mnemonic specifying the DNSSEC algorithm of this key.""" + algorithm: String + + """Length of the keys in bits.""" + keyLength: Int + + """ + One of "KEY_SIGNING" or "ZONE_SIGNING". Keys of type KEY_SIGNING have the Secure Entry Point flag set and, when active, will be used to sign only resource record sets of type DNSKEY. Otherwise, the Secure Entry Point flag will be cleared and this key will be used to sign only resource record sets of other types. + """ + keyType: String + + """ + Identifies what kind of resource this is. Value: the fixed string "dns#dnsKeySpec". + """ + kind: String +} + +"""Limits associated with a Project.""" +type Quota { + """DNSSEC algorithm and key length types that can be used for DnsKeys.""" + whitelistedKeySpecs: [DnsKeySpec!] + + """Maximum allowed number of ResourceRecords per ResourceRecordSet.""" + resourceRecordsPerRrset: Int + + """Maximum allowed number of ResourceRecordSets per zone in the project.""" + rrsetsPerManagedZone: Int + + """ + Maximum allowed number of ResourceRecordSets to delete per ChangesCreateRequest. + """ + rrsetDeletionsPerChange: Int + + """Maximum allowed number of managed zones in the project.""" + managedZones: Int + + """ + Identifies what kind of resource this is. Value: the fixed string "dns#quota". + """ + kind: String + + """ + Maximum allowed size for total rrdata in one ChangesCreateRequest in bytes. + """ + totalRrdataSizePerChange: Int + + """ + Maximum allowed number of ResourceRecordSets to add per ChangesCreateRequest. + """ + rrsetAdditionsPerChange: Int + + """Maximum allowed number of DnsKeys per ManagedZone.""" + dnsKeysPerManagedZone: Int +} + +type GoogleDNSProject { + """User assigned unique identifier for the resource (output only).""" + id: String + + """ + Identifies what kind of resource this is. Value: the fixed string "dns#project". + """ + kind: String + + """ + Unique numeric identifier for the resource; defined by the server (output only). + """ + number: String + + """Quotas assigned to this project (output only).""" + quota: Quota + managedZones: GoogleDNSProjectZones! +} + +"""Google DNS""" +type GoogleDNS { + GoogleDNSProjects(projectId: String!): GoogleDNSProject! +} + +"""""" +type GoogleComputeMetadataItemsItem { + """ + Key for the metadata entry. Keys must conform to the following regexp: [a-zA-Z0-9-_]+, and be less than 128 bytes in length. This is reflected as part of a URL in the metadata server. Additionally, to avoid ambiguity, keys must not conflict with any other metadata keys for the project. + """ + key: String + + """ + Value for the metadata entry. These are free-form strings, and only have meaning as interpreted by the image running in the instance. The only restriction placed on values is that their size must be less than or equal to 262144 bytes (256 KiB). + """ + value: String +} + +"""A metadata key/value entry.""" +type GoogleComputeMetadata { + """ + Specifies a fingerprint for this request, which is essentially a hash of the metadata's contents and used for optimistic locking. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update metadata. You must always provide an up-to-date fingerprint hash in order to update or change metadata, otherwise the request will fail with error 412 conditionNotMet. + + To see the latest fingerprint, make a get() request to retrieve the resource. + """ + fingerprint: String + + """ + Array of key/value pairs. The total size of all keys and values must be less than 512 KB. + """ + items: [GoogleComputeMetadataItemsItem!] + + """ + [Output Only] Type of the resource. Always compute#metadata for metadata. + """ + kind: String +} + +"""An alias IP range attached to an instance's network interface.""" +type GoogleComputeAliasIpRange { + """ + The IP CIDR range represented by this alias IP range. This IP CIDR range must belong to the specified subnetwork and cannot contain IP addresses reserved by system or used by other network interfaces. This range may be a single IP address (e.g. 10.2.3.4), a netmask (e.g. /24) or a CIDR format string (e.g. 10.1.2.0/24). + """ + ipCidrRange: String + + """ + Optional subnetwork secondary range name specifying the secondary range from which to allocate the IP CIDR range for this alias IP range. If left unspecified, the primary range of the subnetwork will be used. + """ + subnetworkRangeName: String +} + +""" +An access configuration attached to an instance's network interface. Only one access config per instance is supported. +""" +type GoogleComputeAccessConfig { + """ + [Output Only] Type of the resource. Always compute#accessConfig for access configs. + """ + kind: String + + """ + The name of this access configuration. The default and recommended name is External NAT but you can use any arbitrary string you would like. For example, My external IP or Network Access. + """ + name: String + + """ + An external IP address associated with this instance. Specify an unused static external IP address available to the project or leave this field undefined to use an IP from a shared ephemeral IP address pool. If you specify a static external IP address, it must live in the same region as the zone of the instance. + """ + natIP: String + + """ + This signifies the networking tier used for configuring this access configuration and can only take the following values: PREMIUM, STANDARD. + + If an AccessConfig is specified without a valid external IP address, an ephemeral IP will be created with this networkTier. + + If an AccessConfig with a valid external IP address is specified, it must match that of the networkTier associated with the Address resource owning that IP. + """ + networkTier: String + + """ + The DNS domain name for the public PTR record. This field can only be set when the set_public_ptr field is enabled. + """ + publicPtrDomainName: String + + """ + Specifies whether a public DNS ?PTR? record should be created to map the external IP address of the instance to a DNS domain name. + """ + setPublicPtr: Boolean + + """ + The type of configuration. The default and only option is ONE_TO_ONE_NAT. + """ + type: String +} + +"""A network interface resource attached to an instance.""" +type GoogleComputeNetworkInterface { + """ + An array of configurations for this interface. Currently, only one access config, ONE_TO_ONE_NAT, is supported. If there are no accessConfigs specified, then this instance will have no external internet access. + """ + accessConfigs: [GoogleComputeAccessConfig!] + + """ + An array of alias IP ranges for this network interface. Can only be specified for network interfaces on subnet-mode networks. + """ + aliasIpRanges: [GoogleComputeAliasIpRange!] + + """ + Fingerprint hash of contents stored in this network interface. This field will be ignored when inserting an Instance or adding a NetworkInterface. An up-to-date fingerprint must be provided in order to update the NetworkInterface, otherwise the request will fail with error 412 conditionNotMet. + """ + fingerprint: String + + """ + [Output Only] Type of the resource. Always compute#networkInterface for network interfaces. + """ + kind: String + + """ + [Output Only] The name of the network interface, generated by the server. For network devices, these are eth0, eth1, etc. + """ + name: String + + """ + URL of the network resource for this instance. When creating an instance, if neither the network nor the subnetwork is specified, the default network global/networks/default is used; if the network is not specified but the subnetwork is specified, the network is inferred. + + This field is optional when creating a firewall rule. If not specified when creating a firewall rule, the default network global/networks/default is used. + + If you specify this property, you can specify the network as a full or partial URL. For example, the following are all valid URLs: + - https://www.googleapis.com/compute/v1/projects/project/global/networks/network + - projects/project/global/networks/network + - global/networks/default + """ + network: String + + """ + An IPv4 internal network address to assign to the instance for this network interface. If not specified by the user, an unused internal IP is assigned by the system. + """ + networkIP: String + + """ + The URL of the Subnetwork resource for this instance. If the network resource is in legacy mode, do not provide this property. If the network is in auto subnet mode, providing the subnetwork is optional. If the network is in custom subnet mode, then this field should be specified. If you specify this property, you can specify the subnetwork as a full or partial URL. For example, the following are all valid URLs: + - https://www.googleapis.com/compute/v1/projects/project/regions/region/subnetworks/subnetwork + - regions/region/subnetworks/subnetwork + """ + subnetwork: String +} + +"""Google Compute Engine Instance""" +type GoogleComputeInstance { + """""" + id: String + + """""" + canIpForward: Boolean + + """""" + cpuPlatform: String + + """""" + creationTimestamp: String + + """""" + description: String + + """""" + kind: String + + """""" + labelFingerprint: String + + """""" + machineType: String + + """""" + name: String + + """""" + selfLink: String + + """""" + startRestricted: Boolean + + """""" + status: String + + """""" + statusMessage: String + + """""" + zone: String + + """networkInterfaces for this instance""" + networkInterfaces: [GoogleComputeNetworkInterface!] + + """Metadata about this instance""" + metadata: GoogleComputeMetadata +} + +"""Google Compute Engine Instance""" +type GoogleComputeInstances { + """""" + id: String + + """""" + kind: String + + """""" + nextPageToken: String + + """""" + selfLink: String + + """""" + items: [GoogleComputeInstance!] +} + +"""Google Compute Engine""" +type GoogleComputeEngine { + instances(zone: String!, projectId: String!): GoogleComputeInstances! +} + +"""""" +type GoogleCalendarCalendarNotification { + """ + The method used to deliver the notification. Possible values are: + - "email" - Notifications are sent via email. + - "sms" - Deprecated. Once this feature is shutdown, the API will no longer return notifications using this method. Any newly added SMS notifications will be ignored. See Google Calendar SMS notifications to be removed for more information. + Notifications are sent via SMS. This value is read-only and is ignored on inserts and updates. SMS notifications are only available for G Suite customers. + Required when adding a notification. + """ + method: String + + """ + The type of notification. Possible values are: + - "eventCreation" - Notification sent when a new event is put on the calendar. + - "eventChange" - Notification sent when an event is changed. + - "eventCancellation" - Notification sent when an event is cancelled. + - "eventResponse" - Notification sent when an attendee responds to the event invitation. + - "agenda" - An agenda with the events of the day (sent out in the morning). + Required when adding a notification. + """ + type: String +} + +""" +The notifications that the authenticated user is receiving for this calendar. +""" +type GoogleCalendarCalendarListEntryNotificationSettings { + """The list of notifications set for this calendar.""" + notifications: [GoogleCalendarCalendarNotification!] +} + +"""""" +type GoogleCalendarConferenceProperties { + """ + The types of conference solutions that are supported for this calendar. + The possible values are: + - "eventHangout" + - "eventNamedHangout" + - "hangoutsMeet" Optional. + """ + allowedConferenceSolutionTypes: [String!] +} + +""" +A calendar is a collection of events. Each calendar has associated metadata, such as calendar description or default calendar time zone. +""" +type GoogleCalendarCalendar { + """ + The effective access role that the authenticated user has on the calendar. Read-only. Possible values are: + - "freeBusyReader" - Provides read access to free/busy information. + - "reader" - Provides read access to the calendar. Private events will appear to users with reader access, but event details will be hidden. + - "writer" - Provides read and write access to the calendar. Private events will appear to users with writer access, and event details will be visible. + - "owner" - Provides ownership of the calendar. This role has all of the permissions of the writer role with the additional ability to see and manipulate ACLs. + """ + accessRole: String + + """ + The main color of the calendar in the hexadecimal format "#0088aa". This property supersedes the index-based colorId property. To set or change this property, you need to specify colorRgbFormat=true in the parameters of the insert, update and patch methods. Optional. + """ + backgroundColor: String + + """ + The color of the calendar. This is an ID referring to an entry in the calendar section of the colors definition (see the colors endpoint). This property is superseded by the backgroundColor and foregroundColor properties and can be ignored when using these properties. Optional. + """ + colorId: String + + """ + Conferencing properties for this calendar, for example what types of conferences are allowed. + """ + conferenceProperties: GoogleCalendarConferenceProperties + + """ + The default reminders that the authenticated user has for this calendar. + """ + defaultReminders: [GoogleCalendarEventReminder!] + + """ + Whether this calendar list entry has been deleted from the calendar list. Read-only. Optional. The default is False. + """ + deleted: Boolean + + """Description of the calendar. Optional. Read-only.""" + description: String + + """ETag of the resource.""" + etag: String + + """ + The foreground color of the calendar in the hexadecimal format "#ffffff". This property supersedes the index-based colorId property. To set or change this property, you need to specify colorRgbFormat=true in the parameters of the insert, update and patch methods. Optional. + """ + foregroundColor: String + + """ + Whether the calendar has been hidden from the list. Optional. The default is False. + """ + hidden: Boolean + + """Identifier of the calendar.""" + id: String + + """Type of the resource ("calendar#calendarListEntry").""" + kind: String + + """ + Geographic location of the calendar as free-form text. Optional. Read-only. + """ + location: String + + """ + The notifications that the authenticated user is receiving for this calendar. + """ + notificationSettings: GoogleCalendarCalendarListEntryNotificationSettings + + """ + Whether the calendar is the primary calendar of the authenticated user. Read-only. Optional. The default is False. + """ + primary: Boolean + + """ + Whether the calendar content shows up in the calendar UI. Optional. The default is False. + """ + selected: Boolean + + """Title of the calendar. Read-only.""" + summary: String + + """ + The summary that the authenticated user has set for this calendar. Optional. + """ + summaryOverride: String + + """The time zone of the calendar. Optional. Read-only.""" + timeZone: String + + """Events for the calendar""" + events( + """ + Time zone used in the response. The default is the time zone of the calendar. + """ + timeZone: String + + """ + Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time. Must be an RFC3339 timestamp with mandatory time zone offset, e.g., 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but will be ignored. If timeMin is set, timeMax must be greater than timeMin. + """ + timeMax: String + + """ + Lower bound (inclusive) for an event's end time to filter by. Optional. The default is not to filter by end time. Must be an RFC3339 timestamp with mandatory time zone offset, e.g., 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but will be ignored. If timeMax is set, timeMin must be smaller than timeMax. + """ + timeMin: String + + """ + Whether to include deleted events (with status equals "cancelled") in the result. Cancelled instances of recurring events (but not the underlying recurring event) will still be included if showDeleted and singleEvents are both False. If showDeleted and singleEvents are both True, only single instances of deleted events (but not the underlying recurring events) are returned. The default is false. + """ + showDeleted: Boolean + + """ + Free text search terms to find events that match these terms in any field, except for extended properties. + """ + q: String + + """ + Whether to expand recurring events into instances and only return single one-off events and instances of recurring events, but not the underlying recurring events themselves. The default is false unless ordering by startTime, in which case it must be true. + """ + singleEvents: Boolean + + """ + The order of the events returned in the result. The default is an unspecified, stable order. + + Acceptable values are: + + "startTime": Order by the start date/time (ascending). This is only available when querying single events (i.e. the parameter singleEvents is true) + + "updated": Order by last modification time (ascending). + """ + orderBy: String + + """ + Cursor for use in pagination. Returns the elements in the list that come after the specified cursor. + """ + after: String + + """Number of events to return.""" + first: Int + ): GoogleCalendarEventsConnection +} + +"""All of the logged in user's calendars""" +type GoogleCalendarCalendarsConnection { + nodes: [GoogleCalendarCalendar!]! + + """Page info""" + pageInfo: PageInfo! +} + +"""""" +type GoogleCalendarEventAttendee { + """ + Whether the attendee is a resource. Can only be set when the attendee is added to the event for the first time. Subsequent modifications are ignored. Optional. The default is False. + """ + resource: Boolean + + """Whether this is an optional attendee. Optional. The default is False.""" + optional: Boolean + + """The attendee's name, if available. Optional.""" + displayName: String + + """ + The attendee's Profile ID, if available. It corresponds to the id field in the People collection of the Google+ API + """ + id: String + + """ + The attendee's email address, if available. This field must be present when adding an attendee. It must be a valid email address as per RFC5322. + Required when adding an attendee. + """ + email: String + + """Number of additional guests. Optional. The default is 0.""" + additionalGuests: Int + + """ + Whether the attendee is the organizer of the event. Read-only. The default is False. + """ + organizer: Boolean + + """ + The attendee's response status. Possible values are: + - "needsAction" - The attendee has not responded to the invitation. + - "declined" - The attendee has declined the invitation. + - "tentative" - The attendee has tentatively accepted the invitation. + - "accepted" - The attendee has accepted the invitation. + """ + responseStatus: String + + """ + Whether this entry represents the calendar on which this copy of the event appears. Read-only. The default is False. + """ + self: Boolean + + """The attendee's response comment. Optional.""" + comment: String +} + +"""""" +type GoogleCalendarEventAttachment { + """ + ID of the attached file. Read-only. + For Google Drive files, this is the ID of the corresponding Files resource entry in the Drive API. + """ + fileId: String + + """ + URL link to the attachment. + For adding Google Drive file attachments use the same format as in alternateLink property of the Files resource in the Drive API. + Required when adding an attachment. + """ + fileUrl: String + + """URL link to the attachment's icon. Read-only.""" + iconLink: String + + """Internet media type (MIME type) of the attachment.""" + mimeType: String + + """Attachment title.""" + title: String +} + +""" +Source from which the event was created. For example, a web page, an email message or any document identifiable by an URL with HTTP or HTTPS scheme. Can only be seen or modified by the creator of the event. +""" +type GoogleCalendarEventSource { + """ + Title of the source; for example a title of a web page or an email subject. + """ + title: String + + """ + URL of the source pointing to a resource. The URL scheme must be HTTP or HTTPS. + """ + url: String +} + +"""""" +type GoogleCalendarConferenceParametersAddOnParameters { + """""" + parameters: [KVPair!] +} + +"""""" +type GoogleCalendarConferenceParameters { + """Additional add-on specific data.""" + addOnParameters: GoogleCalendarConferenceParametersAddOnParameters +} + +"""""" +type GoogleCalendarEntryPoint { + """ + The type of the conference entry point. + Possible values are: + - "video" - joining a conference over HTTP. A conference can have zero or one video entry point. + - "phone" - joining a conference by dialing a phone number. A conference can have zero or more phone entry points. + - "sip" - joining a conference over SIP. A conference can have zero or one sip entry point. + - "more" - further conference joining instructions, for example additional phone numbers. A conference can have zero or one more entry point. A conference with only a more entry point is not a valid conference. + """ + entryPointType: String + + """ + The access code to access the conference. The maximum length is 128 characters. + When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed. + Optional. + """ + accessCode: String + + """ + The label for the URI. Visible to end users. Not localized. The maximum length is 512 characters. + Examples: + - for video: meet.google.com/aaa-bbbb-ccc + - for phone: +1 123 268 2601 + - for sip: 12345678@altostrat.com + - for more: should not be filled + Optional. + """ + label: String + + """ + The URI of the entry point. The maximum length is 1300 characters. + Format: + - for video, http: or https: schema is required. + - for phone, tel: schema is required. The URI should include the entire dial sequence (e.g., tel:+12345678900,,,123456789;1234). + - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com. + - for more, http: or https: schema is required. + """ + uri: String + + """ + The passcode to access the conference. The maximum length is 128 characters. + When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed. + """ + passcode: String + + """ + The CLDR/ISO 3166 region code for the country associated with this phone access. Example: "SE" for Sweden. + Calendar backend will populate this field only for EntryPointType.PHONE. + """ + regionCode: String + + """ + The PIN to access the conference. The maximum length is 128 characters. + When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed. + Optional. + """ + pin: String + + """ + The password to access the conference. The maximum length is 128 characters. + When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed. + Optional. + """ + password: String + + """ + The meeting code to access the conference. The maximum length is 128 characters. + When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed. + Optional. + """ + meetingCode: String + + """ + Features of the entry point, such as being toll or toll-free. One entry point can have multiple features. However, toll and toll-free cannot be both set on the same entry point. + """ + entryPointFeatures: [String!] +} + +"""""" +type GoogleCalendarConferenceRequestStatus { + """ + The current status of the conference create request. Read-only. + The possible values are: + - "pending": the conference create request is still being processed. + - "success": the conference create request succeeded, the entry points are populated. + - "failure": the conference create request failed, there are no entry points. + """ + statusCode: String +} + +"""""" +type GoogleCalendarCreateConferenceRequest { + """The conference solution, such as Hangouts or Hangouts Meet.""" + conferenceSolutionKey: GoogleCalendarConferenceSolutionKey + + """ + The client-generated unique ID for this request. + Clients should regenerate this ID for every new request. If an ID provided is the same as for the previous request, the request is ignored. + """ + requestId: String + + """The status of the conference create request.""" + status: GoogleCalendarConferenceRequestStatus +} + +"""""" +type GoogleCalendarConferenceSolutionKey { + """ + The conference solution type. + If a client encounters an unfamiliar or empty type, it should still be able to display the entry points. However, it should disallow modifications. + The possible values are: + - "eventHangout" for Hangouts for consumers (http://hangouts.google.com) + - "eventNamedHangout" for classic Hangouts for G Suite users (http://hangouts.google.com) + - "hangoutsMeet" for Hangouts Meet (http://meet.google.com) + """ + type: String +} + +"""""" +type GoogleCalendarConferenceSolution { + """The user-visible icon for this solution.""" + iconUri: String + + """ + The key which can uniquely identify the conference solution for this event. + """ + key: GoogleCalendarConferenceSolutionKey + + """The user-visible name of this solution. Not localized.""" + name: String +} + +"""""" +type GoogleCalendarConferenceData { + """ + The ID of the conference. + Can be used by developers to keep track of conferences, should not be displayed to users. + Values for solution types: + - "eventHangout": unset. + - "eventNamedHangout": the name of the Hangout. + - "hangoutsMeet": the 10-letter meeting code, for example "aaa-bbbb-ccc". Optional. + """ + conferenceId: String + + """ + The conference solution, such as Hangouts or Hangouts Meet. + Unset for a conference with a failed create request. + Either conferenceSolution and at least one entryPoint, or createRequest is required. + """ + conferenceSolution: GoogleCalendarConferenceSolution + + """ + A request to generate a new conference and attach it to the event. The data is generated asynchronously. To see whether the data is present check the status field. + Either conferenceSolution and at least one entryPoint, or createRequest is required. + """ + createRequest: GoogleCalendarCreateConferenceRequest + + """ + Information about individual conference entry points, such as URLs or phone numbers. + All of them must belong to the same conference. + Either conferenceSolution and at least one entryPoint, or createRequest is required. + """ + entryPoints: [GoogleCalendarEntryPoint!] + + """ + Additional notes (such as instructions from the domain administrator, legal notices) to display to the user. Can contain HTML. The maximum length is 2048 characters. Optional. + """ + notes: String + + """ + Additional properties related to a conference. An example would be a solution-specific setting for enabling video streaming. + """ + parameters: GoogleCalendarConferenceParameters + + """ + The signature of the conference data. + Genereated on server side. Must be preserved while copying the conference data between events, otherwise the conference data will not be copied. + Unset for a conference with a failed create request. + Optional for a conference with a pending create request. + """ + signature: String +} + +"""A gadget that extends this event.""" +type GoogleCalendarEventGadget { + """ + The gadget's display mode. Optional. Possible values are: + - "icon" - The gadget displays next to the event's title in the calendar view. + - "chip" - The gadget displays when the event is clicked. + """ + display: String + + """ + The gadget's height in pixels. The height must be an integer greater than 0. Optional. + """ + height: Int + + """The gadget's icon URL. The URL scheme must be HTTPS.""" + iconLink: String + + """The gadget's URL. The URL scheme must be HTTPS.""" + link: String + + """Preferences.""" + preferences: [KVPair!] + + """The gadget's title.""" + title: String + + """The gadget's type.""" + type: String + + """ + The gadget's width in pixels. The width must be an integer greater than 0. Optional. + """ + width: Int +} + +"""""" +type GoogleCalendarEventDateTime { + """The date, in the format "yyyy-mm-dd", if this is an all-day event.""" + date: String + + """ + The time, as a combined date-time value (formatted according to RFC3339). A time zone offset is required unless a time zone is explicitly specified in timeZone. + """ + dateTime: String + + """ + The time zone in which the time is specified. (Formatted as an IANA Time Zone Database name, e.g. "Europe/Zurich".) For recurring events this field is required and specifies the time zone in which the recurrence is expanded. For single events this field is optional and indicates a custom time zone for the event start/end. + """ + timeZone: String +} + +""" +The organizer of the event. If the organizer is also an attendee, this is indicated with a separate entry in attendees with the organizer field set to True. To change the organizer, use the move operation. Read-only, except when importing an event. +""" +type GoogleCalendarEventOrganizer { + """The organizer's name, if available.""" + displayName: String + + """ + The organizer's email address, if available. It must be a valid email address as per RFC5322. + """ + email: String + + """ + The organizer's Profile ID, if available. It corresponds to the id field in the People collection of the Google+ API + """ + id: String + + """ + Whether the organizer corresponds to the calendar on which this copy of the event appears. Read-only. The default is False. + """ + self: Boolean +} + +"""""" +type GoogleCalendarEventReminder { + """ + The method used by this reminder. Possible values are: + - "email" - Reminders are sent via email. + - "sms" - Deprecated. Once this feature is shutdown, the API will no longer return reminders using this method. Any newly added SMS reminders will be ignored. See Google Calendar SMS notifications to be removed for more information. + Reminders are sent via SMS. These are only available for G Suite customers. Requests to set SMS reminders for other account types are ignored. + - "popup" - Reminders are sent via a UI popup. + Required when adding a reminder. + """ + method: String + + """ + Number of minutes before the start of the event when the reminder should trigger. Valid values are between 0 and 40320 (4 weeks in minutes). + Required when adding a reminder. + """ + minutes: Int +} + +"""Information about the event's reminders for the authenticated user.""" +type GoogleCalendarEventReminders { + """ + If the event doesn't use the default reminders, this lists the reminders specific to the event, or, if not set, indicates that no reminders are set for this event. The maximum number of override reminders is 5. + """ + overrides: [GoogleCalendarEventReminder!] + + """Whether the default reminders of the calendar apply to the event.""" + useDefault: Boolean +} + +"""The creator of the event. Read-only.""" +type GoogleCalendarEventCreator { + """The creator's name, if available.""" + displayName: String + + """The creator's email address, if available.""" + email: String + + """ + The creator's Profile ID, if available. It corresponds to the id field in the People collection of the Google+ API + """ + id: String + + """ + Whether the creator corresponds to the calendar on which this copy of the event appears. Read-only. The default is False. + """ + self: Boolean +} + +""" Key/value pair """ +type KVPair { + """ Key field """ + key: String + + """ Value field """ + value: String +} + +"""Extended properties of the event.""" +type GoogleCalendarEventExtendedProperties { + """ + Properties that are private to the copy of the event that appears on this calendar. + """ + private: [KVPair!] + + """ + Properties that are shared between copies of the event on other attendees' calendars. + """ + shared: [KVPair!] +} + +"""""" +type GoogleCalendarEvent { + """ + Whether the event blocks time on the calendar. Optional. Possible values are: + - "opaque" - Default value. The event does block time on the calendar. This is equivalent to setting Show me as to Busy in the Calendar UI. + - "transparent" - The event does not block time on the calendar. This is equivalent to setting Show me as to Available in the Calendar UI. + """ + transparency: String + + """Creation time of the event (as a RFC3339 timestamp). Read-only.""" + created: String + + """Extended properties of the event.""" + extendedProperties: GoogleCalendarEventExtendedProperties + + """ + An absolute link to the Google+ hangout associated with this event. Read-only. + """ + hangoutLink: String + + """ + The color of the event. This is an ID referring to an entry in the event section of the colors definition (see the colors endpoint). Optional. + """ + colorId: String + + """ + Whether anyone can invite themselves to the event (currently works for Google+ events only). Optional. The default is False. + """ + anyoneCanAddSelf: Boolean + + """ + Event unique identifier as defined in RFC5545. It is used to uniquely identify events accross calendaring systems and must be supplied when importing events via the import method. + Note that the icalUID and the id are not identical and only one of them should be supplied at event creation time. One difference in their semantics is that in recurring events, all occurrences of one event have different ids while they all share the same icalUIDs. + """ + iCalUID: String + + """ + Opaque identifier of the event. When creating new single or recurring events, you can specify their IDs. Provided IDs must follow these rules: + - characters allowed in the ID are those used in base32hex encoding, i.e. lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938 + - the length of the ID must be between 5 and 1024 characters + - the ID must be unique per calendar Due to the globally distributed nature of the system, we cannot guarantee that ID collisions will be detected at event creation time. To minimize the risk of collisions we recommend using an established UUID algorithm such as one described in RFC4122. + If you do not specify an ID, it will be automatically generated by the server. + Note that the icalUID and the id are not identical and only one of them should be supplied at event creation time. One difference in their semantics is that in recurring events, all occurrences of one event have different ids while they all share the same icalUIDs. + """ + id: String + + """Title of the event.""" + summary: String + + """ + Visibility of the event. Optional. Possible values are: + - "default" - Uses the default visibility for events on the calendar. This is the default value. + - "public" - The event is public and event details are visible to all readers of the calendar. + - "private" - The event is private and only event attendees may view event details. + - "confidential" - The event is private. This value is provided for compatibility reasons. + """ + visibility: String + + """The creator of the event. Read-only.""" + creator: GoogleCalendarEventCreator + + """Information about the event's reminders for the authenticated user.""" + reminders: GoogleCalendarEventReminders + + """ + For an instance of a recurring event, this is the id of the recurring event to which this instance belongs. Immutable. + """ + recurringEventId: String + + """ + Whether this is a private event copy where changes are not shared with other copies on other calendars. Optional. Immutable. The default is False. + """ + privateCopy: Boolean + + """Sequence number as per iCalendar.""" + sequence: Int + + """Geographic location of the event as free-form text. Optional.""" + location: String + + """ + The organizer of the event. If the organizer is also an attendee, this is indicated with a separate entry in attendees with the organizer field set to True. To change the organizer, use the move operation. Read-only, except when importing an event. + """ + organizer: GoogleCalendarEventOrganizer + + """ + Status of the event. Optional. Possible values are: + - "confirmed" - The event is confirmed. This is the default status. + - "tentative" - The event is tentatively confirmed. + - "cancelled" - The event is cancelled (deleted). The list method returns cancelled events only on incremental sync (when syncToken or updatedMin are specified) or if the showDeleted flag is set to true. The get method always returns them. + A cancelled status represents two different states depending on the event type: + - Cancelled exceptions of an uncancelled recurring event indicate that this instance should no longer be presented to the user. Clients should store these events for the lifetime of the parent recurring event. + Cancelled exceptions are only guaranteed to have values for the id, recurringEventId and originalStartTime fields populated. The other fields might be empty. + - All other cancelled events represent deleted events. Clients should remove their locally synced copies. Such cancelled events will eventually disappear, so do not rely on them being available indefinitely. + Deleted events are only guaranteed to have the id field populated. On the organizer's calendar, cancelled events continue to expose event details (summary, location, etc.) so that they can be restored (undeleted). Similarly, the events to which the user was invited and that they manually removed continue to provide details. However, incremental sync requests with showDeleted set to false will not return these details. + If an event changes its organizer (for example via the move operation) and the original organizer is not on the attendee list, it will leave behind a cancelled event where only the id field is guaranteed to be populated. + """ + status: String + + """ + The (inclusive) start time of the event. For a recurring event, this is the start time of the first instance. + """ + start: GoogleCalendarEventDateTime + + """ + List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, as specified in RFC5545. Note that DTSTART and DTEND lines are not allowed in this field; event start and end times are specified in the start and end fields. This field is omitted for single events or instances of recurring events. + """ + recurrence: [String!] + + """ + Whether attendees other than the organizer can modify the event. Optional. The default is False. + """ + guestsCanModify: Boolean + + """A gadget that extends this event.""" + gadget: GoogleCalendarEventGadget + + """ETag of the resource.""" + etag: String + + """ + Whether attendees other than the organizer can invite others to the event. Optional. The default is True. + """ + guestsCanInviteOthers: Boolean + + """Type of the resource ("calendar#event").""" + kind: String + + """ + The conference-related information, such as details of a Hangouts Meet conference. To create new conference details use the createRequest field. To persist your changes, remember to set the conferenceDataVersion request parameter to 1 for all event modification requests. + """ + conferenceData: GoogleCalendarConferenceData + + """ + Source from which the event was created. For example, a web page, an email message or any document identifiable by an URL with HTTP or HTTPS scheme. Can only be seen or modified by the creator of the event. + """ + source: GoogleCalendarEventSource + + """ + Whether the end time is actually unspecified. An end time is still provided for compatibility reasons, even if this attribute is set to True. The default is False. + """ + endTimeUnspecified: Boolean + + """ + An absolute link to this event in the Google Calendar Web UI. Read-only. + """ + htmlLink: String + + """ + Last modification time of the event (as a RFC3339 timestamp). Read-only. + """ + updated: String + + """ + Whether attendees other than the organizer can see who the event's attendees are. Optional. The default is True. + """ + guestsCanSeeOtherGuests: Boolean + + """ + Whether this is a locked event copy where no changes can be made to the main event fields "summary", "description", "location", "start", "end" or "recurrence". The default is False. Read-Only. + """ + locked: Boolean + + """ + For an instance of a recurring event, this is the time at which this event would start according to the recurrence data in the recurring event identified by recurringEventId. It uniquely identifies the instance within the recurring event series even if the instance was moved to a different time. Immutable. + """ + originalStartTime: GoogleCalendarEventDateTime + + """ + File attachments for the event. Currently only Google Drive attachments are supported. + In order to modify attachments the supportsAttachments request parameter should be set to true. + There can be at most 25 attachments per event, + """ + attachments: [GoogleCalendarEventAttachment!] + + """ + The attendees of the event. See the Events with attendees guide for more information on scheduling events with other calendar users. + """ + attendees: [GoogleCalendarEventAttendee!] + + """ + The (exclusive) end time of the event. For a recurring event, this is the end time of the first instance. + """ + end: GoogleCalendarEventDateTime + + """Description of the event. Optional.""" + description: String + + """ + Whether attendees may have been omitted from the event's representation. When retrieving an event, this may be due to a restriction specified by the maxAttendee query parameter. When updating an event, this can be used to only update the participant's response. Optional. The default is False. + """ + attendeesOmitted: Boolean +} + +"""All calendar events.""" +type GoogleCalendarEventsConnection { + nodes: [GoogleCalendarEvent!]! + + """Page info""" + pageInfo: PageInfo! +} + +"""The root for Google Calendar.""" +type GoogleCalendarQuery { + """ + Calendar events. + + Note that calendar events can only be returned in ascending order. Use timeMin to get events after a certain date. + + An event on a calendar containing information such as the title, start and end times, and attendees. Events can be either single events or recurring events. + """ + events( + """ + Time zone used in the response. The default is the time zone of the calendar. + """ + timeZone: String + + """ + Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time. Must be an RFC3339 timestamp with mandatory time zone offset, e.g., 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but will be ignored. If timeMin is set, timeMax must be greater than timeMin. + """ + timeMax: String + + """ + Lower bound (inclusive) for an event's end time to filter by. Optional. The default is not to filter by end time. Must be an RFC3339 timestamp with mandatory time zone offset, e.g., 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but will be ignored. If timeMax is set, timeMin must be smaller than timeMax. + """ + timeMin: String + + """ + Whether to include deleted events (with status equals "cancelled") in the result. Cancelled instances of recurring events (but not the underlying recurring event) will still be included if showDeleted and singleEvents are both False. If showDeleted and singleEvents are both True, only single instances of deleted events (but not the underlying recurring events) are returned. The default is false. + """ + showDeleted: Boolean + + """ + Free text search terms to find events that match these terms in any field, except for extended properties. + """ + q: String + + """ + Whether to expand recurring events into instances and only return single one-off events and instances of recurring events, but not the underlying recurring events themselves. The default is false unless ordering by startTime, in which case it must be true. + """ + singleEvents: Boolean + + """ + The order of the events returned in the result. The default is an unspecified, stable order. + + Acceptable values are: + + "startTime": Order by the start date/time (ascending). This is only available when querying single events (i.e. the parameter singleEvents is true) + + "updated": Order by last modification time (ascending). + """ + orderBy: String + + """ + Cursor for use in pagination. Returns the elements in the list that come after the specified cursor. + """ + after: String + + """Number of events to return.""" + first: Int + + """ + Id of the calendar. Use "primary" to get the logged in user's primary calendar. + """ + calendarId: String! + ): GoogleCalendarEventsConnection + + """ + Calendar events. + + Note that calendar events can only be returned in ascending order. Use timeMin to get events after a certain date. + + An event on a calendar containing information such as the title, start and end times, and attendees. Events can be either single events or recurring events. + """ + calendars( + """ + Cursor for use in pagination. Returns the elements in the list that come after the specified cursor. + """ + after: String + + """Number of events to return.""" + first: Int + ): GoogleCalendarCalendarsConnection +} + +"""A named range.""" +type GoogleSheetsNamedRange { + """The ID of the named range.""" + namedRangeId: String + + """The range this represents.""" + range: GoogleSheetsGridRange + + """The name of the named range.""" + name: String +} + +""" +Settings to control how circular dependencies are resolved with iterative +calculation. +""" +type GoogleSheetsIterativeCalculationSettings { + """ + When iterative calculation is enabled and successive results differ by + less than this threshold value, the calculation rounds stop. + """ + convergenceThreshold: Float + + """ + When iterative calculation is enabled, the maximum number of calculation + rounds to perform. + """ + maxIterations: Int +} + +"""Properties of a spreadsheet.""" +type GoogleSheetsSpreadsheetProperties { + """ + The default format of all cells in the spreadsheet. + CellData.effectiveFormat will not be set if + the cell's format is equal to this default format. This field is read-only. + """ + defaultFormat: GoogleSheetsCellFormat + + """The amount of time to wait before volatile functions are recalculated.""" + autoRecalc: String + + """The title of the spreadsheet.""" + title: String + + """ + The time zone of the spreadsheet, in CLDR format such as + `America/New_York`. If the time zone isn't recognized, this may + be a custom time zone such as `GMT-07:00`. + """ + timeZone: String + + """ + The locale of the spreadsheet in one of the following formats: + + * an ISO 639-1 language code such as `en` + + * an ISO 639-2 language code such as `fil`, if no 639-1 code exists + + * a combination of the ISO language code and country code, such as `en_US` + + Note: when updating this field, not all locales/languages are supported. + """ + locale: String + + """ + Determines whether and how circular references are resolved with iterative + calculation. Absence of this field means that circular references will + result in calculation errors. + """ + iterativeCalculationSettings: GoogleSheetsIterativeCalculationSettings +} + +"""The definition of how a value in a pivot table should be calculated.""" +type GoogleSheetsPivotValue { + """ + A custom formula to calculate the value. The formula must start + with an `=` character. + """ + formula: String + + """ + If specified, indicates that pivot values should be displayed as + the result of a calculation with another pivot value. For example, if + calculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the + pivot values are displayed as the percentage of the grand total. In + the Sheets UI, this is referred to as "Show As" in the value section of a + pivot table. + """ + calculatedDisplayType: String + + """ + A function to summarize the value. + If formula is set, the only supported values are + SUM and + CUSTOM. + If sourceColumnOffset is set, then `CUSTOM` + is not supported. + """ + summarizeFunction: String + + """ + The column offset of the source range that this value reads from. + + For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0` + means this value refers to column `C`, whereas the offset `1` would + refer to column `D`. + """ + sourceColumnOffset: Int + + """A name to use for the value.""" + name: String +} + +""" +A group name and a list of items from the source data that should be placed +in the group with this name. +""" +type GoogleSheetsManualRuleGroup { + """ + The items in the source data that should be placed into this group. Each + item may be a string, number, or boolean. Items may appear in at most one + group within a given ManualRule. Items that do not appear in any + group will appear on their own. + """ + items: [GoogleSheetsExtendedValue!] + + """ + The group name, which must be a string. Each group in a given + ManualRule must have a unique group name. + """ + groupName: GoogleSheetsExtendedValue +} + +""" +Allows you to manually organize the values in a source data column into +buckets with names of your choosing. For example, a pivot table that +aggregates population by state: + + +-------+-------------------+ + | State | SUM of Population | + +-------+-------------------+ + | AK | 0.7 | + | AL | 4.8 | + | AR | 2.9 | + ... + +-------+-------------------+ +could be turned into a pivot table that aggregates population by time zone +by providing a list of groups (for example, groupName = 'Central', +items = ['AL', 'AR', 'IA', ...]) to a manual group rule. +Note that a similar effect could be achieved by adding a time zone column +to the source data and adjusting the pivot table. + + +-----------+-------------------+ + | Time Zone | SUM of Population | + +-----------+-------------------+ + | Central | 106.3 | + | Eastern | 151.9 | + | Mountain | 17.4 | + ... + +-----------+-------------------+ +""" +type GoogleSheetsManualRule { + """ + The list of group names and the corresponding items from the source data + that map to each group name. + """ + groups: [GoogleSheetsManualRuleGroup!] +} + +""" +Allows you to organize the date-time values in a source data column into +buckets based on selected parts of their date or time values. For example, +consider a pivot table showing sales transactions by date: + + +----------+--------------+ + | Date | SUM of Sales | + +----------+--------------+ + | 1/1/2017 | $621.14 | + | 2/3/2017 | $708.84 | + | 5/8/2017 | $326.84 | + ... + +----------+--------------+ +Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH +results in the following pivot table. + + +--------------+--------------+ + | Grouped Date | SUM of Sales | + +--------------+--------------+ + | 2017-Jan | $53,731.78 | + | 2017-Feb | $83,475.32 | + | 2017-Mar | $94,385.05 | + ... + +--------------+--------------+ +""" +type GoogleSheetsDateTimeRule { + """The type of date-time grouping to apply.""" + type: String +} + +""" +Allows you to organize the numeric values in a source data column into +buckets of a constant size. All values from HistogramRule.start to +HistogramRule.end are placed into groups of size +HistogramRule.interval. In addition, all values below +HistogramRule.start are placed in one group, and all values above +HistogramRule.end are placed in another. Only +HistogramRule.interval is required, though if HistogramRule.start +and HistogramRule.end are both provided, HistogramRule.start must +be less than HistogramRule.end. For example, a pivot table showing +average purchase amount by age that has 50+ rows: + + +-----+-------------------+ + | Age | AVERAGE of Amount | + +-----+-------------------+ + | 16 | $27.13 | + | 17 | $5.24 | + | 18 | $20.15 | + ... + +-----+-------------------+ +could be turned into a pivot table that looks like the one below by +applying a histogram group rule with a HistogramRule.start of 25, +an HistogramRule.interval of 20, and an HistogramRule.end +of 65. + + +-------------+-------------------+ + | Grouped Age | AVERAGE of Amount | + +-------------+-------------------+ + | < 25 | $19.34 | + | 25-45 | $31.43 | + | 45-65 | $35.87 | + | > 65 | $27.55 | + +-------------+-------------------+ + | Grand Total | $29.12 | + +-------------+-------------------+ +""" +type GoogleSheetsHistogramRule { + """ + The minimum value at which items are placed into buckets + of constant size. Values below start are lumped into a single bucket. + This field is optional. + """ + start: Float + + """ + The maximum value at which items are placed into buckets + of constant size. Values above end are lumped into a single bucket. + This field is optional. + """ + end: Float + + """The size of the buckets that are created. Must be positive.""" + interval: Float +} + +""" +An optional setting on a PivotGroup that defines buckets for the values +in the source data column rather than breaking out each individual value. +Only one PivotGroup with a group rule may be added for each column in +the source data, though on any given column you may add both a +PivotGroup that has a rule and a PivotGroup that does not. +""" +type GoogleSheetsPivotGroupRule { + """A HistogramRule.""" + histogramRule: GoogleSheetsHistogramRule + + """A DateTimeRule.""" + dateTimeRule: GoogleSheetsDateTimeRule + + """A ManualRule.""" + manualRule: GoogleSheetsManualRule +} + +"""Metadata about a value in a pivot grouping.""" +type GoogleSheetsPivotGroupValueMetadata { + """ + The calculated value the metadata corresponds to. + (Note that formulaValue is not valid, + because the values will be calculated.) + """ + value: GoogleSheetsExtendedValue + + """True if the data corresponding to the value is collapsed.""" + collapsed: Boolean +} + +""" +Information about which values in a pivot group should be used for sorting. +""" +type GoogleSheetsPivotGroupSortValueBucket { + """ + The offset in the PivotTable.values list which the values in this + grouping should be sorted by. + """ + valuesIndex: Int + + """ + Determines the bucket from which values are chosen to sort. + + For example, in a pivot table with one row group & two column groups, + the row group can list up to two values. The first value corresponds + to a value within the first column group, and the second value + corresponds to a value in the second column group. If no values + are listed, this would indicate that the row should be sorted according + to the "Grand Total" over the column groups. If a single value is listed, + this would correspond to using the "Total" of that bucket. + """ + buckets: [GoogleSheetsExtendedValue!] +} + +"""A single grouping (either row or column) in a pivot table.""" +type GoogleSheetsPivotGroup { + """ + The bucket of the opposite pivot group to sort by. + If not specified, sorting is alphabetical by this group's values. + """ + valueBucket: GoogleSheetsPivotGroupSortValueBucket + + """Metadata about values in the grouping.""" + valueMetadata: [GoogleSheetsPivotGroupValueMetadata!] + + """True if the pivot table should include the totals for this grouping.""" + showTotals: Boolean + + """The group rule to apply to this row/column group.""" + groupRule: GoogleSheetsPivotGroupRule + + """ + The labels to use for the row/column groups which can be customized. For + example, in the following pivot table, the row label is `Region` (which + could be renamed to `State`) and the column label is `Product` (which + could be renamed `Item`). Pivot tables created before December 2017 do + not have header labels. If you'd like to add header labels to an existing + pivot table, please delete the existing pivot table and then create a new + pivot table with same parameters. + + +--------------+---------+-------+ + | SUM of Units | Product | | + | Region | Pen | Paper | + +--------------+---------+-------+ + | New York | 345 | 98 | + | Oregon | 234 | 123 | + | Tennessee | 531 | 415 | + +--------------+---------+-------+ + | Grand Total | 1110 | 636 | + +--------------+---------+-------+ + """ + label: String + + """ + True if the headings in this pivot group should be repeated. + This is only valid for row groupings and is ignored by columns. + + By default, we minimize repitition of headings by not showing higher + level headings where they are the same. For example, even though the + third row below corresponds to "Q1 Mar", "Q1" is not shown because + it is redundant with previous rows. Setting repeat_headings to true + would cause "Q1" to be repeated for "Feb" and "Mar". + + +--------------+ + | Q1 | Jan | + | | Feb | + | | Mar | + +--------+-----+ + | Q1 Total | + +--------------+ + """ + repeatHeadings: Boolean + + """ + The column offset of the source range that this grouping is based on. + + For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0` + means this group refers to column `C`, whereas the offset `1` would refer + to column `D`. + """ + sourceColumnOffset: Int + + """The order the values in this group should be sorted.""" + sortOrder: String +} + +"""Criteria for showing/hiding rows in a pivot table.""" +type GoogleSheetsPivotFilterCriteria { + """Values that should be included. Values not listed here are excluded.""" + visibleValues: [String!] +} + +"""A pivot table.""" +type GoogleSheetsPivotTable { + """ + An optional mapping of filters per source column offset. + + The filters are applied before aggregating data into the pivot table. + The map's key is the column offset of the source range that you want to + filter, and the value is the criteria for that column. + + For example, if the source was `C10:E15`, a key of `0` will have the filter + for column `C`, whereas the key `1` is for column `D`. + """ + criteria: GoogleSheetsPivotFilterCriteria + + """Each row grouping in the pivot table.""" + rows: [GoogleSheetsPivotGroup!] + + """ + Whether values should be listed horizontally (as columns) + or vertically (as rows). + """ + valueLayout: String + + """The range the pivot table is reading data from.""" + source: GoogleSheetsGridRange + + """Each column grouping in the pivot table.""" + columns: [GoogleSheetsPivotGroup!] + + """A list of values to include in the pivot table.""" + values: [GoogleSheetsPivotValue!] +} + +"""A data validation rule.""" +type GoogleSheetsDataValidationRule { + """The condition that data in the cell must match.""" + condition: GoogleSheetsBooleanCondition + + """ + True if the UI should be customized based on the kind of condition. + If true, "List" conditions will show a dropdown. + """ + showCustomUi: Boolean + + """True if invalid data should be rejected.""" + strict: Boolean + + """A message to show the user when adding data to the cell.""" + inputMessage: String +} + +""" +A run of a text format. The format of this run continues until the start +index of the next run. +When updating, all fields must be set. +""" +type GoogleSheetsTextFormatRun { + """The character index where this run starts.""" + startIndex: Int + + """The format of this run. Absent values inherit the cell's format.""" + format: GoogleSheetsTextFormat +} + +"""An error in a cell.""" +type GoogleSheetsErrorValue { + """The type of error.""" + type: String + + """ + A message with more information about the error + (in the spreadsheet's locale). + """ + message: String +} + +"""The kinds of value that a cell in a spreadsheet can have.""" +type GoogleSheetsExtendedValue { + """ + Represents a string value. + Leading single quotes are not included. For example, if the user typed + `'123` into the UI, this would be represented as a `stringValue` of + `"123"`. + """ + stringValue: String + + """Represents a boolean value.""" + boolValue: Boolean + + """Represents a formula.""" + formulaValue: String + + """ + Represents a double value. + Note: Dates, Times and DateTimes are represented as doubles in + "serial number" format. + """ + numberValue: Float + + """ + Represents an error. + This field is read-only. + """ + errorValue: GoogleSheetsErrorValue +} + +"""Data about a specific cell.""" +type GoogleSheetsCellData { + """ + The effective value of the cell. For cells with formulas, this is + the calculated value. For cells with literals, this is + the same as the user_entered_value. + This field is read-only. + """ + effectiveValue: GoogleSheetsExtendedValue + + """ + Runs of rich text applied to subsections of the cell. Runs are only valid + on user entered strings, not formulas, bools, or numbers. + Runs start at specific indexes in the text and continue until the next + run. Properties of a run will continue unless explicitly changed + in a subsequent run (and properties of the first run will continue + the properties of the cell unless explicitly changed). + + When writing, the new runs will overwrite any prior runs. When writing a + new user_entered_value, previous runs are erased. + """ + textFormatRuns: [GoogleSheetsTextFormatRun!] + + """Any note on the cell.""" + note: String + + """ + The effective format being used by the cell. + This includes the results of applying any conditional formatting and, + if the cell contains a formula, the computed number format. + If the effective format is the default format, effective format will + not be written. + This field is read-only. + """ + effectiveFormat: GoogleSheetsCellFormat + + """ + A hyperlink this cell points to, if any. + This field is read-only. (To set it, use a `=HYPERLINK` formula + in the userEnteredValue.formulaValue + field.) + """ + hyperlink: String + + """ + The formatted value of the cell. + This is the value as it's shown to the user. + This field is read-only. + """ + formattedValue: String + + """ + The format the user entered for the cell. + + When writing, the new format will be merged with the existing format. + """ + userEnteredFormat: GoogleSheetsCellFormat + + """ + The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()` + Note: Dates, Times and DateTimes are represented as doubles in + serial number format. + """ + userEnteredValue: GoogleSheetsExtendedValue + + """ + A data validation rule on the cell, if any. + + When writing, the new data validation rule will overwrite any prior rule. + """ + dataValidation: GoogleSheetsDataValidationRule + + """ + A pivot table anchored at this cell. The size of pivot table itself + is computed dynamically based on its data, grouping, filters, values, + etc. Only the top-left cell of the pivot table contains the pivot table + definition. The other cells will contain the calculated values of the + results of the pivot in their effective_value fields. + """ + pivotTable: GoogleSheetsPivotTable +} + +"""Data about each cell in a row.""" +type GoogleSheetsRowData { + """The values in the row, one per column.""" + values: [GoogleSheetsCellData!] +} + +"""Properties about a dimension.""" +type GoogleSheetsDimensionProperties { + """ + The height (if a row) or width (if a column) of the dimension in pixels. + """ + pixelSize: Int + + """ + True if this dimension is being filtered. + This field is read-only. + """ + hiddenByFilter: Boolean + + """True if this dimension is explicitly hidden.""" + hiddenByUser: Boolean + + """The developer metadata associated with a single row or column.""" + developerMetadata: [GoogleSheetsDeveloperMetadata!] +} + +"""Data in the grid, as well as metadata about the dimensions.""" +type GoogleSheetsGridData { + """The first column this GridData refers to, zero-based.""" + startColumn: Int + + """ + Metadata about the requested rows in the grid, starting with the row + in start_row. + """ + rowMetadata: [GoogleSheetsDimensionProperties!] + + """ + The data in the grid, one entry per row, + starting with the row in startRow. + The values in RowData will correspond to columns starting + at start_column. + """ + rowData: [GoogleSheetsRowData!] + + """The first row this GridData refers to, zero-based.""" + startRow: Int + + """ + Metadata about the requested columns in the grid, starting with the column + in start_column. + """ + columnMetadata: [GoogleSheetsDimensionProperties!] +} + +"""The default filter associated with a sheet.""" +type GoogleSheetsBasicFilter { + """The range the filter covers.""" + range: GoogleSheetsGridRange + + """ + The criteria for showing/hiding values per column. + The map's key is the column index, and the value is the criteria for + that column. + """ + criteria: GoogleSheetsFilterCriteria + + """ + The sort order per column. Later specifications are used when values + are equal in the earlier specifications. + """ + sortSpecs: [GoogleSheetsSortSpec!] +} + +"""A sort order associated with a specific column or row.""" +type GoogleSheetsSortSpec { + """The dimension the sort should be applied to.""" + dimensionIndex: Int + + """The order data should be sorted.""" + sortOrder: String +} + +"""Criteria for showing/hiding rows in a filter or filter view.""" +type GoogleSheetsFilterCriteria { + """Values that should be hidden.""" + hiddenValues: [String!] + + """ + A condition that must be true for values to be shown. + (This does not override hiddenValues -- if a value is listed there, + it will still be hidden.) + """ + condition: GoogleSheetsBooleanCondition +} + +"""A filter view.""" +type GoogleSheetsFilterView { + """ + The named range this filter view is backed by, if any. + + When writing, only one of range or named_range_id + may be set. + """ + namedRangeId: String + + """The ID of the filter view.""" + filterViewId: Int + + """ + The criteria for showing/hiding values per column. + The map's key is the column index, and the value is the criteria for + that column. + """ + criteria: GoogleSheetsFilterCriteria + + """The name of the filter view.""" + title: String + + """ + The range this filter view covers. + + When writing, only one of range or named_range_id + may be set. + """ + range: GoogleSheetsGridRange + + """ + The sort order per column. Later specifications are used when values + are equal in the earlier specifications. + """ + sortSpecs: [GoogleSheetsSortSpec!] +} + +""" +A single interpolation point on a gradient conditional format. +These pin the gradient color scale according to the color, +type and value chosen. +""" +type GoogleSheetsInterpolationPoint { + """How the value should be interpreted.""" + type: String + + """ + The value this interpolation point uses. May be a formula. + Unused if type is MIN or + MAX. + """ + value: String + + """The color this interpolation point should use.""" + color: GoogleSheetsColor +} + +""" +A rule that applies a gradient color scale format, based on +the interpolation points listed. The format of a cell will vary +based on its contents as compared to the values of the interpolation +points. +""" +type GoogleSheetsGradientRule { + """An optional midway interpolation point.""" + midpoint: GoogleSheetsInterpolationPoint + + """The starting interpolation point.""" + minpoint: GoogleSheetsInterpolationPoint + + """The final interpolation point.""" + maxpoint: GoogleSheetsInterpolationPoint +} + +"""The value of the condition.""" +type GoogleSheetsConditionValue { + """ + A relative date (based on the current date). + Valid only if the type is + DATE_BEFORE, + DATE_AFTER, + DATE_ON_OR_BEFORE or + DATE_ON_OR_AFTER. + + Relative dates are not supported in data validation. + They are supported only in conditional formatting and + conditional filters. + """ + relativeDate: String + + """ + A value the condition is based on. + The value is parsed as if the user typed into a cell. + Formulas are supported (and must begin with an `=` or a '+'). + """ + userEnteredValue: String +} + +""" +A condition that can evaluate to true or false. +BooleanConditions are used by conditional formatting, +data validation, and the criteria in filters. +""" +type GoogleSheetsBooleanCondition { + """The type of condition.""" + type: String + + """ + The values of the condition. The number of supported values depends + on the condition type. Some support zero values, + others one or two values, + and ConditionType.ONE_OF_LIST supports an arbitrary number of values. + """ + values: [GoogleSheetsConditionValue!] +} + +"""The number format of a cell.""" +type GoogleSheetsNumberFormat { + """ + The type of the number format. + When writing, this field must be set. + """ + type: String + + """ + Pattern string used for formatting. If not set, a default pattern based on + the user's locale will be used if necessary for the given type. + See the [Date and Number Formats guide](/sheets/api/guides/formats) for more + information about the supported patterns. + """ + pattern: String +} + +"""A border along a cell.""" +type GoogleSheetsBorder { + """The style of the border.""" + style: String + + """The color of the border.""" + color: GoogleSheetsColor + + """ + The width of the border, in pixels. + Deprecated; the width is determined by the "style" field. + """ + width: Int +} + +"""The borders of the cell.""" +type GoogleSheetsBorders { + """The right border of the cell.""" + right: GoogleSheetsBorder + + """The bottom border of the cell.""" + bottom: GoogleSheetsBorder + + """The top border of the cell.""" + top: GoogleSheetsBorder + + """The left border of the cell.""" + left: GoogleSheetsBorder +} + +""" +The amount of padding around the cell, in pixels. +When updating padding, every field must be specified. +""" +type GoogleSheetsPadding { + """The right padding of the cell.""" + right: Int + + """The bottom padding of the cell.""" + bottom: Int + + """The top padding of the cell.""" + top: Int + + """The left padding of the cell.""" + left: Int +} + +"""The rotation applied to text in a cell.""" +type GoogleSheetsTextRotation { + """ + The angle between the standard orientation and the desired orientation. + Measured in degrees. Valid values are between -90 and 90. Positive + angles are angled upwards, negative are angled downwards. + + Note: For LTR text direction positive angles are in the counterclockwise + direction, whereas for RTL they are in the clockwise direction + """ + angle: Int + + """ + If true, text reads top to bottom, but the orientation of individual + characters is unchanged. + For example: + + | V | + | e | + | r | + | t | + | i | + | c | + | a | + | l | + """ + vertical: Boolean +} + +"""The format of a cell.""" +type GoogleSheetsCellFormat { + """The background color of the cell.""" + backgroundColor: GoogleSheetsColor + + """The rotation applied to text in a cell""" + textRotation: GoogleSheetsTextRotation + + """The wrap strategy for the value in the cell.""" + wrapStrategy: String + + """ + The format of the text in the cell (unless overridden by a format run). + """ + textFormat: GoogleSheetsTextFormat + + """The padding of the cell.""" + padding: GoogleSheetsPadding + + """The horizontal alignment of the value in the cell.""" + horizontalAlignment: String + + """How a hyperlink, if it exists, should be displayed in the cell.""" + hyperlinkDisplayType: String + + """The borders of the cell.""" + borders: GoogleSheetsBorders + + """The vertical alignment of the value in the cell.""" + verticalAlignment: String + + """ + A format describing how number values should be represented to the user. + """ + numberFormat: GoogleSheetsNumberFormat + + """The direction of the text in the cell.""" + textDirection: String +} + +"""A rule that may or may not match, depending on the condition.""" +type GoogleSheetsBooleanRule { + """ + The format to apply. + Conditional formatting can only apply a subset of formatting: + bold, italic, + strikethrough, + foreground color & + background color. + """ + format: GoogleSheetsCellFormat + + """ + The condition of the rule. If the condition evaluates to true, + the format is applied. + """ + condition: GoogleSheetsBooleanCondition +} + +"""A rule describing a conditional format.""" +type GoogleSheetsConditionalFormatRule { + """The formatting is either "on" or "off" according to the rule.""" + booleanRule: GoogleSheetsBooleanRule + + """ + The ranges that are formatted if the condition is true. + All the ranges must be on the same grid. + """ + ranges: [GoogleSheetsGridRange!] + + """The formatting will vary based on the gradients in the rule.""" + gradientRule: GoogleSheetsGradientRule +} + +""" +A group over an interval of rows or columns on a sheet, which can contain or +be contained within other groups. A group can be collapsed or expanded as a +unit on the sheet. +""" +type GoogleSheetsDimensionGroup { + """ + This field is true if this group is collapsed. A collapsed group remains + collapsed if an overlapping group at a shallower depth is expanded. + + A true value does not imply that all dimensions within the group are + hidden, since a dimension's visibility can change independently from this + group property. However, when this property is updated, all dimensions + within it are set to hidden if this field is true, or set to visible if + this field is false. + """ + collapsed: Boolean + + """The range over which this group exists.""" + range: GoogleSheetsDimensionRange + + """ + The depth of the group, representing how many groups have a range that + wholly contains the range of this group. + """ + depth: Int +} + +""" +An <a href="/chart/interactive/docs/gallery/orgchart">org chart</a>. +Org charts require a unique set of labels in labels and may +optionally include parent_labels and tooltips. +parent_labels contain, for each node, the label identifying the parent +node. tooltips contain, for each node, an optional tooltip. + +For example, to describe an OrgChart with Alice as the CEO, Bob as the +President (reporting to Alice) and Cathy as VP of Sales (also reporting to +Alice), have labels contain "Alice", "Bob", "Cathy", +parent_labels contain "", "Alice", "Alice" and tooltips contain +"CEO", "President", "VP Sales". +""" +type GoogleSheetsOrgChartSpec { + """ + The data containing the tooltip for the corresponding node. A blank value + results in no tooltip being displayed for the node. + This field is optional. + """ + tooltips: GoogleSheetsChartData + + """The color of the selected org chart nodes.""" + selectedNodeColor: GoogleSheetsColor + + """ + The data containing the label of the parent for the corresponding node. + A blank value indicates that the node has no parent and is a top-level + node. + This field is optional. + """ + parentLabels: GoogleSheetsChartData + + """The size of the org chart nodes.""" + nodeSize: String + + """ + The data containing the labels for all the nodes in the chart. Labels + must be unique. + """ + labels: GoogleSheetsChartData + + """The color of the org chart nodes.""" + nodeColor: GoogleSheetsColor +} + +"""The domain of a waterfall chart.""" +type GoogleSheetsWaterfallChartDomain { + """The data of the WaterfallChartDomain.""" + data: GoogleSheetsChartData + + """True to reverse the order of the domain values (horizontal axis).""" + reversed: Boolean +} + +"""A custom subtotal column for a waterfall chart series.""" +type GoogleSheetsWaterfallChartCustomSubtotal { + """ + The 0-based index of a data point within the series. If + data_is_subtotal is true, the data point at this index is the + subtotal. Otherwise, the subtotal appears after the data point with + this index. A series can have multiple subtotals at arbitrary indices, + but subtotals do not affect the indices of the data points. For + example, if a series has three data points, their indices will always + be 0, 1, and 2, regardless of how many subtotals exist on the series or + what data points they are associated with. + """ + subtotalIndex: Int + + """ + True if the data point at subtotal_index is the subtotal. If false, + the subtotal will be computed and appear after the data point. + """ + dataIsSubtotal: Boolean + + """A label for the subtotal column.""" + label: String +} + +"""Styles for a waterfall chart column.""" +type GoogleSheetsWaterfallChartColumnStyle { + """The label of the column's legend.""" + label: String + + """The color of the column.""" + color: GoogleSheetsColor +} + +"""A single series of data for a waterfall chart.""" +type GoogleSheetsWaterfallChartSeries { + """Styles for all columns in this series with positive values.""" + positiveColumnsStyle: GoogleSheetsWaterfallChartColumnStyle + + """The data being visualized in this series.""" + data: GoogleSheetsChartData + + """Styles for all columns in this series with negative values.""" + negativeColumnsStyle: GoogleSheetsWaterfallChartColumnStyle + + """ + True to hide the subtotal column from the end of the series. By default, + a subtotal column will appear at the end of each series. Setting this + field to true will hide that subtotal column for this series. + """ + hideTrailingSubtotal: Boolean + + """ + Custom subtotal columns appearing in this series. The order in which + subtotals are defined is not significant. Only one subtotal may be + defined for each data point. + """ + customSubtotals: [GoogleSheetsWaterfallChartCustomSubtotal!] + + """Styles for all subtotal columns in this series.""" + subtotalColumnsStyle: GoogleSheetsWaterfallChartColumnStyle +} + +"""A waterfall chart.""" +type GoogleSheetsWaterfallChartSpec { + """The data this waterfall chart is visualizing.""" + series: [GoogleSheetsWaterfallChartSeries!] + + """The line style for the connector lines.""" + connectorLineStyle: GoogleSheetsLineStyle + + """The domain data (horizontal axis) for the waterfall chart.""" + domain: GoogleSheetsWaterfallChartDomain + + """True to interpret the first value as a total.""" + firstValueIsTotal: Boolean + + """True to hide connector lines between columns.""" + hideConnectorLines: Boolean + + """The stacked type.""" + stackedType: String +} + +"""The series of a CandlestickData.""" +type GoogleSheetsCandlestickSeries { + """The data of the CandlestickSeries.""" + data: GoogleSheetsChartData +} + +""" +The Candlestick chart data, each containing the low, open, close, and high +values for a series. +""" +type GoogleSheetsCandlestickData { + """ + The range data (vertical axis) for the high/maximum value for each + candle. This is the top of the candle's center line. + """ + highSeries: GoogleSheetsCandlestickSeries + + """ + The range data (vertical axis) for the low/minimum value for each candle. + This is the bottom of the candle's center line. + """ + lowSeries: GoogleSheetsCandlestickSeries + + """ + The range data (vertical axis) for the close/final value for each candle. + This is the top of the candle body. If greater than the open value the + candle will be filled. Otherwise the candle will be hollow. + """ + closeSeries: GoogleSheetsCandlestickSeries + + """ + The range data (vertical axis) for the open/initial value for each + candle. This is the bottom of the candle body. If less than the close + value the candle will be filled. Otherwise the candle will be hollow. + """ + openSeries: GoogleSheetsCandlestickSeries +} + +"""The domain of a CandlestickChart.""" +type GoogleSheetsCandlestickDomain { + """True to reverse the order of the domain values (horizontal axis).""" + reversed: Boolean + + """The data of the CandlestickDomain.""" + data: GoogleSheetsChartData +} + +""" +A <a href="/chart/interactive/docs/gallery/candlestickchart">candlestick chart</a>. +""" +type GoogleSheetsCandlestickChartSpec { + """ + The domain data (horizontal axis) for the candlestick chart. String data + will be treated as discrete labels, other data will be treated as + continuous values. + """ + domain: GoogleSheetsCandlestickDomain + + """ + The Candlestick chart data. + Only one CandlestickData is supported. + """ + data: [GoogleSheetsCandlestickData!] +} + +"""A histogram series containing the series color and data.""" +type GoogleSheetsHistogramSeries { + """ + The color of the column representing this series in each bucket. + This field is optional. + """ + barColor: GoogleSheetsColor + + """The data for this histogram series.""" + data: GoogleSheetsChartData +} + +""" +A <a href="/chart/interactive/docs/gallery/histogram">histogram chart</a>. +A histogram chart groups data items into bins, displaying each bin as a +column of stacked items. Histograms are used to display the distribution +of a dataset. Each column of items represents a range into which those +items fall. The number of bins can be chosen automatically or specified +explicitly. +""" +type GoogleSheetsHistogramChartSpec { + """ + By default the bucket size (the range of values stacked in a single + column) is chosen automatically, but it may be overridden here. + E.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc. + Cannot be negative. + This field is optional. + """ + bucketSize: Float + + """ + The outlier percentile is used to ensure that outliers do not adversely + affect the calculation of bucket sizes. For example, setting an outlier + percentile of 0.05 indicates that the top and bottom 5% of values when + calculating buckets. The values are still included in the chart, they will + be added to the first or last buckets instead of their own buckets. + Must be between 0.0 and 0.5. + """ + outlierPercentile: Float + + """ + Whether horizontal divider lines should be displayed between items in each + column. + """ + showItemDividers: Boolean + + """ + The series for a histogram may be either a single series of values to be + bucketed or multiple series, each of the same length, containing the name + of the series followed by the values to be bucketed for that series. + """ + series: [GoogleSheetsHistogramSeries!] + + """The position of the chart legend.""" + legendPosition: String +} + +"""A color scale for a treemap chart.""" +type GoogleSheetsTreemapChartColorScale { + """ + The background color for cells with a color value at the midpoint between + minValue and + maxValue. Defaults to #efe6dc if not + specified. + """ + midValueColor: GoogleSheetsColor + + """ + The background color for cells with a color value greater than or equal + to maxValue. Defaults to #109618 if not + specified. + """ + maxValueColor: GoogleSheetsColor + + """ + The background color for cells with a color value less than or equal to + minValue. Defaults to #dc3912 if not + specified. + """ + minValueColor: GoogleSheetsColor + + """ + The background color for cells that have no color data associated with + them. Defaults to #000000 if not specified. + """ + noDataColor: GoogleSheetsColor +} + +"""A <a href="/chart/interactive/docs/gallery/treemap">Treemap chart</a>.""" +type GoogleSheetsTreemapChartSpec { + """ + The data that determines the background color of each treemap data cell. + This field is optional. If not specified, size_data is used to + determine background colors. If specified, the data is expected to be + numeric. color_scale will determine how the values in this data map to + data cell background colors. + """ + colorData: GoogleSheetsChartData + + """ + The number of additional data levels beyond the labeled levels to be shown + on the treemap chart. These levels are not interactive and are shown + without their labels. Defaults to 0 if not specified. + """ + hintedLevels: Int + + """The data the contains the treemap cells' parent labels.""" + parentLabels: GoogleSheetsChartData + + """The text format for all labels on the chart.""" + textFormat: GoogleSheetsTextFormat + + """ + The maximum possible data value. Cells with values greater than this will + have the same color as cells with this value. If not specified, defaults + to the actual maximum value from color_data, or the maximum value from + size_data if color_data is not specified. + """ + maxValue: Float + + """The data that contains the treemap cell labels.""" + labels: GoogleSheetsChartData + + """ + The data that determines the size of each treemap data cell. This data is + expected to be numeric. The cells corresponding to non-numeric or missing + data will not be rendered. If color_data is not specified, this data + is used to determine data cell background colors as well. + """ + sizeData: GoogleSheetsChartData + + """ + The number of data levels to show on the treemap chart. These levels are + interactive and are shown with their labels. Defaults to 2 if not + specified. + """ + levels: Int + + """ + The color scale for data cells in the treemap chart. Data cells are + assigned colors based on their color values. These color values come from + color_data, or from size_data if color_data is not specified. + Cells with color values less than or equal to min_value will + have minValueColor as their + background color. Cells with color values greater than or equal to + max_value will have + maxValueColor as their background + color. Cells with color values between min_value and max_value will + have background colors on a gradient between + minValueColor and + maxValueColor, the midpoint of + the gradient being midValueColor. + Cells with missing or non-numeric color values will have + noDataColor as their background + color. + """ + colorScale: GoogleSheetsTreemapChartColorScale + + """ + The minimum possible data value. Cells with values less than this will + have the same color as cells with this value. If not specified, defaults + to the actual minimum value from color_data, or the minimum value from + size_data if color_data is not specified. + """ + minValue: Float + + """True to hide tooltips.""" + hideTooltips: Boolean + + """The background color for header cells.""" + headerColor: GoogleSheetsColor +} + +""" +A <a href="/chart/interactive/docs/gallery/bubblechart">bubble chart</a>. +""" +type GoogleSheetsBubbleChartSpec { + """The bubble border color.""" + bubbleBorderColor: GoogleSheetsColor + + """ + The data contianing the bubble sizes. Bubble sizes are used to draw + the bubbles at different sizes relative to each other. + If specified, group_ids must also be specified. This field is + optional. + """ + bubbleSizes: GoogleSheetsChartData + + """ + The format of the text inside the bubbles. + Underline and Strikethrough are not supported. + """ + bubbleTextStyle: GoogleSheetsTextFormat + + """ + The max radius size of the bubbles, in pixels. + If specified, the field must be a positive value. + """ + bubbleMaxRadiusSize: Int + + """ + The data containing the bubble x-values. These values locate the bubbles + in the chart horizontally. + """ + domain: GoogleSheetsChartData + + """ + The data containing the bubble group IDs. All bubbles with the same group + ID are drawn in the same color. If bubble_sizes is specified then + this field must also be specified but may contain blank values. + This field is optional. + """ + groupIds: GoogleSheetsChartData + + """ + The data contianing the bubble y-values. These values locate the bubbles + in the chart vertically. + """ + series: GoogleSheetsChartData + + """ + The minimum radius size of the bubbles, in pixels. + If specific, the field must be a positive value. + """ + bubbleMinRadiusSize: Int + + """Where the legend of the chart should be drawn.""" + legendPosition: String + + """ + The data containing the bubble labels. These do not need to be unique. + """ + bubbleLabels: GoogleSheetsChartData + + """ + The opacity of the bubbles between 0 and 1.0. + 0 is fully transparent and 1 is fully opaque. + """ + bubbleOpacity: Float +} + +"""A <a href="/chart/interactive/docs/gallery/piechart">pie chart</a>.""" +type GoogleSheetsPieChartSpec { + """The data that covers the one and only series of the pie chart.""" + series: GoogleSheetsChartData + + """Where the legend of the pie chart should be drawn.""" + legendPosition: String + + """The size of the hole in the pie chart.""" + pieHole: Float + + """The data that covers the domain of the pie chart.""" + domain: GoogleSheetsChartData + + """True if the pie is three dimensional.""" + threeDimensional: Boolean +} + +"""Properties that describe the style of a line.""" +type GoogleSheetsLineStyle { + """The dash type of the line.""" + type: String + + """The thickness of the line, in px.""" + width: Int +} + +""" +A single series of data in a chart. +For example, if charting stock prices over time, multiple series may exist, +one for the "Open Price", "High Price", "Low Price" and "Close Price". +""" +type GoogleSheetsBasicChartSeries { + """ + The line style of this series. Valid only if the + chartType is AREA, + LINE, or SCATTER. + COMBO charts are also supported if the + series chart type is + AREA or LINE. + """ + lineStyle: GoogleSheetsLineStyle + + """The data being visualized in this chart series.""" + series: GoogleSheetsChartData + + """ + The type of this series. Valid only if the + chartType is + COMBO. + Different types will change the way the series is visualized. + Only LINE, AREA, + and COLUMN are supported. + """ + type: String + + """ + The minor axis that will specify the range of values for this series. + For example, if charting stocks over time, the "Volume" series + may want to be pinned to the right with the prices pinned to the left, + because the scale of trading volume is different than the scale of + prices. + It is an error to specify an axis that isn't a valid minor axis + for the chart's type. + """ + targetAxis: String + + """ + The color for elements (i.e. bars, lines, points) associated with this + series. If empty, a default color is used. + """ + color: GoogleSheetsColor +} + +"""Source ranges for a chart.""" +type GoogleSheetsChartSourceRange { + """ + The ranges of data for a series or domain. + Exactly one dimension must have a length of 1, + and all sources in the list must have the same dimension + with length 1. + The domain (if it exists) & all series must have the same number + of source ranges. If using more than one source range, then the source + range at a given offset must be in order and contiguous across the domain + and series. + + For example, these are valid configurations: + + domain sources: A1:A5 + series1 sources: B1:B5 + series2 sources: D6:D10 + + domain sources: A1:A5, C10:C12 + series1 sources: B1:B5, D10:D12 + series2 sources: C1:C5, E10:E12 + """ + sources: [GoogleSheetsGridRange!] +} + +"""The data included in a domain or series.""" +type GoogleSheetsChartData { + """The source ranges of the data.""" + sourceRange: GoogleSheetsChartSourceRange +} + +""" +The domain of a chart. +For example, if charting stock prices over time, this would be the date. +""" +type GoogleSheetsBasicChartDomain { + """True to reverse the order of the domain values (horizontal axis).""" + reversed: Boolean + + """ + The data of the domain. For example, if charting stock prices over time, + this is the data representing the dates. + """ + domain: GoogleSheetsChartData +} + +"""Position settings for text.""" +type GoogleSheetsTextPosition { + """Horizontal alignment setting for the piece of text.""" + horizontalAlignment: String +} + +""" +The format of a run of text in a cell. +Absent values indicate that the field isn't specified. +""" +type GoogleSheetsTextFormat { + """True if the text has a strikethrough.""" + strikethrough: Boolean + + """True if the text is italicized.""" + italic: Boolean + + """The size of the font.""" + fontSize: Int + + """True if the text is underlined.""" + underline: Boolean + + """True if the text is bold.""" + bold: Boolean + + """The foreground color of the text.""" + foregroundColor: GoogleSheetsColor + + """The font family.""" + fontFamily: String +} + +""" +An axis of the chart. +A chart may not have more than one axis per +axis position. +""" +type GoogleSheetsBasicChartAxis { + """ + The format of the title. + Only valid if the axis is not associated with the domain. + """ + format: GoogleSheetsTextFormat + + """The position of this axis.""" + position: String + + """ + The title of this axis. If set, this overrides any title inferred + from headers of the data. + """ + title: String + + """The axis title text position.""" + titleTextPosition: GoogleSheetsTextPosition +} + +""" +The specification for a basic chart. See BasicChartType for the list +of charts this supports. +""" +type GoogleSheetsBasicChartSpec { + """ + The behavior of tooltips and data highlighting when hovering on data and + chart area. + """ + compareMode: String + + """ + True to make the chart 3D. + Applies to Bar and Column charts. + """ + threeDimensional: Boolean + + """The axis on the chart.""" + axis: [GoogleSheetsBasicChartAxis!] + + """ + The stacked type for charts that support vertical stacking. + Applies to Area, Bar, Column, Combo, and Stepped Area charts. + """ + stackedType: String + + """The type of the chart.""" + chartType: String + + """ + The number of rows or columns in the data that are "headers". + If not set, Google Sheets will guess how many rows are headers based + on the data. + + (Note that BasicChartAxis.title may override the axis title + inferred from the header values.) + """ + headerCount: Int + + """ + Gets whether all lines should be rendered smooth or straight by default. + Applies to Line charts. + """ + lineSmoothing: Boolean + + """ + The domain of data this is charting. + Only a single domain is supported. + """ + domains: [GoogleSheetsBasicChartDomain!] + + """The data this chart is visualizing.""" + series: [GoogleSheetsBasicChartSeries!] + + """The position of the chart legend.""" + legendPosition: String + + """ + If some values in a series are missing, gaps may appear in the chart (e.g, + segments of lines in a line chart will be missing). To eliminate these + gaps set this to true. + Applies to Line, Area, and Combo charts. + """ + interpolateNulls: Boolean +} + +"""The specifications of a chart.""" +type GoogleSheetsChartSpec { + """ + The name of the font to use by default for all chart text (e.g. title, + axis labels, legend). If a font is specified for a specific part of the + chart it will override this font name. + """ + fontName: String + + """ + The background color of the entire chart. + Not applicable to Org charts. + """ + backgroundColor: GoogleSheetsColor + + """ + A basic chart specification, can be one of many kinds of charts. + See BasicChartType for the list of all + charts this supports. + """ + basicChart: GoogleSheetsBasicChartSpec + + """ + The title text position. + This field is optional. + """ + titleTextPosition: GoogleSheetsTextPosition + + """Determines how the charts will use hidden rows or columns.""" + hiddenDimensionStrategy: String + + """A pie chart specification.""" + pieChart: GoogleSheetsPieChartSpec + + """A bubble chart specification.""" + bubbleChart: GoogleSheetsBubbleChartSpec + + """ + The subtitle text position. + This field is optional. + """ + subtitleTextPosition: GoogleSheetsTextPosition + + """A treemap chart specification.""" + treemapChart: GoogleSheetsTreemapChartSpec + + """A histogram chart specification.""" + histogramChart: GoogleSheetsHistogramChartSpec + + """A candlestick chart specification.""" + candlestickChart: GoogleSheetsCandlestickChartSpec + + """ + The title text format. + Strikethrough and underline are not supported. + """ + titleTextFormat: GoogleSheetsTextFormat + + """The subtitle of the chart.""" + subtitle: String + + """A waterfall chart specification.""" + waterfallChart: GoogleSheetsWaterfallChartSpec + + """The title of the chart.""" + title: String + + """ + The subtitle text format. + Strikethrough and underline are not supported. + """ + subtitleTextFormat: GoogleSheetsTextFormat + + """ + True to make a chart fill the entire space in which it's rendered with + minimum padding. False to use the default padding. + (Not applicable to Geo and Org charts.) + """ + maximized: Boolean + + """ + The alternative text that describes the chart. This is often used + for accessibility. + """ + altText: String + + """An org chart specification.""" + orgChart: GoogleSheetsOrgChartSpec +} + +""" +A coordinate in a sheet. +All indexes are zero-based. +""" +type GoogleSheetsGridCoordinate { + """The row index of the coordinate.""" + rowIndex: Int + + """The column index of the coordinate.""" + columnIndex: Int + + """The sheet this coordinate is on.""" + sheetId: Int +} + +"""The location an object is overlaid on top of a grid.""" +type GoogleSheetsOverlayPosition { + """The width of the object, in pixels. Defaults to 600.""" + widthPixels: Int + + """ + The horizontal offset, in pixels, that the object is offset + from the anchor cell. + """ + offsetXPixels: Int + + """The cell the object is anchored to.""" + anchorCell: GoogleSheetsGridCoordinate + + """ + The vertical offset, in pixels, that the object is offset + from the anchor cell. + """ + offsetYPixels: Int + + """The height of the object, in pixels. Defaults to 371.""" + heightPixels: Int +} + +"""The position of an embedded object such as a chart.""" +type GoogleSheetsEmbeddedObjectPosition { + """ + If true, the embedded object is put on a new sheet whose ID + is chosen for you. Used only when writing. + """ + newSheet: Boolean + + """ + The sheet this is on. Set only if the embedded object + is on its own sheet. Must be non-negative. + """ + sheetId: Int + + """The position at which the object is overlaid on top of a grid.""" + overlayPosition: GoogleSheetsOverlayPosition +} + +"""A chart embedded in a sheet.""" +type GoogleSheetsEmbeddedChart { + """The ID of the chart.""" + chartId: Int + + """The position of the chart.""" + position: GoogleSheetsEmbeddedObjectPosition + + """The specification of the chart.""" + spec: GoogleSheetsChartSpec +} + +""" +Properties referring a single dimension (either row or column). If both +BandedRange.row_properties and BandedRange.column_properties are +set, the fill colors are applied to cells according to the following rules: + +* header_color and footer_color take priority over band colors. +* first_band_color takes priority over second_band_color. +* row_properties takes priority over column_properties. + +For example, the first row color takes priority over the first column +color, but the first column color takes priority over the second row color. +Similarly, the row header takes priority over the column header in the +top left cell, but the column header takes priority over the first row +color if the row header is not set. +""" +type GoogleSheetsBandingProperties { + """The first color that is alternating. (Required)""" + firstBandColor: GoogleSheetsColor + + """The second color that is alternating. (Required)""" + secondBandColor: GoogleSheetsColor + + """ + The color of the last row or column. If this field is not set, the last + row or column will be filled with either first_band_color or + second_band_color, depending on the color of the previous row or + column. + """ + footerColor: GoogleSheetsColor + + """ + The color of the first row or column. If this field is set, the first + row or column will be filled with this color and the colors will + alternate between first_band_color and second_band_color starting + from the second row or column. Otherwise, the first row or column will be + filled with first_band_color and the colors will proceed to alternate + as they normally would. + """ + headerColor: GoogleSheetsColor +} + +"""A banded (alternating colors) range in a sheet.""" +type GoogleSheetsBandedRange { + """The range over which these properties are applied.""" + range: GoogleSheetsGridRange + + """The id of the banded range.""" + bandedRangeId: Int + + """ + Properties for row bands. These properties are applied on a row-by-row + basis throughout all the rows in the range. At least one of + row_properties or column_properties must be specified. + """ + rowProperties: GoogleSheetsBandingProperties + + """ + Properties for column bands. These properties are applied on a column- + by-column basis throughout all the columns in the range. At least one of + row_properties or column_properties must be specified. + """ + columnProperties: GoogleSheetsBandingProperties +} + +"""The editors of a protected range.""" +type GoogleSheetsEditors { + """The email addresses of users with edit access to the protected range.""" + users: [String!] + + """The email addresses of groups with edit access to the protected range.""" + groups: [String!] + + """ + True if anyone in the document's domain has edit access to the protected + range. Domain protection is only supported on documents within a domain. + """ + domainUsersCanEdit: Boolean +} + +""" +A range on a sheet. +All indexes are zero-based. +Indexes are half open, e.g the start index is inclusive +and the end index is exclusive -- [start_index, end_index). +Missing indexes indicate the range is unbounded on that side. + +For example, if `"Sheet1"` is sheet ID 0, then: + + `Sheet1!A1:A1 == sheet_id: 0, + start_row_index: 0, end_row_index: 1, + start_column_index: 0, end_column_index: 1` + + `Sheet1!A3:B4 == sheet_id: 0, + start_row_index: 2, end_row_index: 4, + start_column_index: 0, end_column_index: 2` + + `Sheet1!A:B == sheet_id: 0, + start_column_index: 0, end_column_index: 2` + + `Sheet1!A5:B == sheet_id: 0, + start_row_index: 4, + start_column_index: 0, end_column_index: 2` + + `Sheet1 == sheet_id:0` + +The start index must always be less than or equal to the end index. +If the start index equals the end index, then the range is empty. +Empty ranges are typically not meaningful and are usually rendered in the +UI as `#REF!`. +""" +type GoogleSheetsGridRange { + """The start column (inclusive) of the range, or not set if unbounded.""" + startColumnIndex: Int + + """The sheet this range is on.""" + sheetId: Int + + """The end row (exclusive) of the range, or not set if unbounded.""" + endRowIndex: Int + + """The end column (exclusive) of the range, or not set if unbounded.""" + endColumnIndex: Int + + """The start row (inclusive) of the range, or not set if unbounded.""" + startRowIndex: Int +} + +"""A protected range.""" +type GoogleSheetsProtectedRange { + """ + True if the user who requested this protected range can edit the + protected area. + This field is read-only. + """ + requestingUserCanEdit: Boolean + + """ + The range that is being protected. + The range may be fully unbounded, in which case this is considered + a protected sheet. + + When writing, only one of range or named_range_id + may be set. + """ + range: GoogleSheetsGridRange + + """ + The users and groups with edit access to the protected range. + This field is only visible to users with edit access to the protected + range and the document. + Editors are not supported with warning_only protection. + """ + editors: GoogleSheetsEditors + + """The description of this protected range.""" + description: String + + """ + The list of unprotected ranges within a protected sheet. + Unprotected ranges are only supported on protected sheets. + """ + unprotectedRanges: [GoogleSheetsGridRange!] + + """ + The named range this protected range is backed by, if any. + + When writing, only one of range or named_range_id + may be set. + """ + namedRangeId: String + + """ + The ID of the protected range. + This field is read-only. + """ + protectedRangeId: Int + + """ + True if this protected range will show a warning when editing. + Warning-based protection means that every user can edit data in the + protected range, except editing will prompt a warning asking the user + to confirm the edit. + + When writing: if this field is true, then editors is ignored. + Additionally, if this field is changed from true to false and the + `editors` field is not set (nor included in the field mask), then + the editors will be set to all the editors in the document. + """ + warningOnly: Boolean +} + +"""Properties of a grid.""" +type GoogleSheetsGridProperties { + """True if the row grouping control toggle is shown after the group.""" + rowGroupControlAfter: Boolean + + """The number of rows in the grid.""" + rowCount: Int + + """True if the grid isn't showing gridlines in the UI.""" + hideGridlines: Boolean + + """The number of rows that are frozen in the grid.""" + frozenRowCount: Int + + """The number of columns in the grid.""" + columnCount: Int + + """The number of columns that are frozen in the grid.""" + frozenColumnCount: Int + + """True if the column grouping control toggle is shown after the group.""" + columnGroupControlAfter: Boolean +} + +""" +Represents a color in the RGBA color space. This representation is designed +for simplicity of conversion to/from color representations in various +languages over compactness; for example, the fields of this representation +can be trivially provided to the constructor of "java.awt.Color" in Java; it +can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha" +method in iOS; and, with just a little work, it can be easily formatted into +a CSS "rgba()" string in JavaScript, as well. Here are some examples: + +Example (Java): + + import com.google.type.Color; + + // ... + public static java.awt.Color fromProto(Color protocolor) { + float alpha = protocolor.hasAlpha() + ? protocolor.getAlpha().getValue() + : 1.0; + + return new java.awt.Color( + protocolor.getRed(), + protocolor.getGreen(), + protocolor.getBlue(), + alpha); + } + + public static Color toProto(java.awt.Color color) { + float red = (float) color.getRed(); + float green = (float) color.getGreen(); + float blue = (float) color.getBlue(); + float denominator = 255.0; + Color.Builder resultBuilder = + Color + .newBuilder() + .setRed(red / denominator) + .setGreen(green / denominator) + .setBlue(blue / denominator); + int alpha = color.getAlpha(); + if (alpha != 255) { + result.setAlpha( + FloatValue + .newBuilder() + .setValue(((float) alpha) / denominator) + .build()); + } + return resultBuilder.build(); + } + // ... + +Example (iOS / Obj-C): + + // ... + static UIColor* fromProto(Color* protocolor) { + float red = [protocolor red]; + float green = [protocolor green]; + float blue = [protocolor blue]; + FloatValue* alpha_wrapper = [protocolor alpha]; + float alpha = 1.0; + if (alpha_wrapper != nil) { + alpha = [alpha_wrapper value]; + } + return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; + } + + static Color* toProto(UIColor* color) { + CGFloat red, green, blue, alpha; + if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) { + return nil; + } + Color* result = [[Color alloc] init]; + [result setRed:red]; + [result setGreen:green]; + [result setBlue:blue]; + if (alpha <= 0.9999) { + [result setAlpha:floatWrapperWithValue(alpha)]; + } + [result autorelease]; + return result; + } + // ... + + Example (JavaScript): + + // ... + + var protoToCssColor = function(rgb_color) { + var redFrac = rgb_color.red || 0.0; + var greenFrac = rgb_color.green || 0.0; + var blueFrac = rgb_color.blue || 0.0; + var red = Math.floor(redFrac * 255); + var green = Math.floor(greenFrac * 255); + var blue = Math.floor(blueFrac * 255); + + if (!('alpha' in rgb_color)) { + return rgbToCssColor_(red, green, blue); + } + + var alphaFrac = rgb_color.alpha.value || 0.0; + var rgbParams = [red, green, blue].join(','); + return ['rgba(', rgbParams, ',', alphaFrac, ')'].join(''); + }; + + var rgbToCssColor_ = function(red, green, blue) { + var rgbNumber = new Number((red << 16) | (green << 8) | blue); + var hexString = rgbNumber.toString(16); + var missingZeros = 6 - hexString.length; + var resultBuilder = ['#']; + for (var i = 0; i < missingZeros; i++) { + resultBuilder.push('0'); + } + resultBuilder.push(hexString); + return resultBuilder.join(''); + }; + + // ... +""" +type GoogleSheetsColor { + """The amount of green in the color as a value in the interval [0, 1].""" + green: Float + + """The amount of blue in the color as a value in the interval [0, 1].""" + blue: Float + + """ + The fraction of this color that should be applied to the pixel. That is, + the final pixel color is defined by the equation: + + pixel color = alpha * (this color) + (1.0 - alpha) * (background color) + + This means that a value of 1.0 corresponds to a solid color, whereas + a value of 0.0 corresponds to a completely transparent color. This + uses a wrapper message rather than a simple float scalar so that it is + possible to distinguish between a default value and the value being unset. + If omitted, this color object is to be rendered as a solid color + (as if the alpha value had been explicitly given with a value of 1.0). + """ + alpha: Float + + """The amount of red in the color as a value in the interval [0, 1].""" + red: Float +} + +"""Properties of a sheet.""" +type GoogleSheetsSheetProperties { + """The name of the sheet.""" + title: String + + """The color of the tab in the UI.""" + tabColor: GoogleSheetsColor + + """ + The index of the sheet within the spreadsheet. + When adding or updating sheet properties, if this field + is excluded then the sheet is added or moved to the end + of the sheet list. When updating sheet indices or inserting + sheets, movement is considered in "before the move" indexes. + For example, if there were 3 sheets (S1, S2, S3) in order to + move S1 ahead of S2 the index would have to be set to 2. A sheet + index update request is ignored if the requested index is + identical to the sheets current index or if the requested new + index is equal to the current sheet index + 1. + """ + index: Int + + """ + The ID of the sheet. Must be non-negative. + This field cannot be changed once set. + """ + sheetId: Int + + """True if the sheet is an RTL sheet instead of an LTR sheet.""" + rightToLeft: Boolean + + """True if the sheet is hidden in the UI, false if it's visible.""" + hidden: Boolean + + """ + Additional properties of the sheet if this sheet is a grid. + (If the sheet is an object sheet, containing a chart or image, then + this field will be absent.) + When writing it is an error to set any grid properties on non-grid sheets. + """ + gridProperties: GoogleSheetsGridProperties + + """ + The type of sheet. Defaults to GRID. + This field cannot be changed once set. + """ + sheetType: String +} + +"""A sheet in a spreadsheet.""" +type GoogleSheetsSheet { + """The properties of the sheet.""" + properties: GoogleSheetsSheetProperties + + """The protected ranges in this sheet.""" + protectedRanges: [GoogleSheetsProtectedRange!] + + """The banded (alternating colors) ranges on this sheet.""" + bandedRanges: [GoogleSheetsBandedRange!] + + """The specifications of every chart on this sheet.""" + charts: [GoogleSheetsEmbeddedChart!] + + """ + All column groups on this sheet, ordered by increasing range start index, + then by group depth. + """ + columnGroups: [GoogleSheetsDimensionGroup!] + + """The conditional format rules in this sheet.""" + conditionalFormats: [GoogleSheetsConditionalFormatRule!] + + """ + All row groups on this sheet, ordered by increasing range start index, then + by group depth. + """ + rowGroups: [GoogleSheetsDimensionGroup!] + + """The filter views in this sheet.""" + filterViews: [GoogleSheetsFilterView!] + + """The filter on this sheet, if any.""" + basicFilter: GoogleSheetsBasicFilter + + """The developer metadata associated with a sheet.""" + developerMetadata: [GoogleSheetsDeveloperMetadata!] + + """ + Data in the grid, if this is a grid sheet. + The number of GridData objects returned is dependent on the number of + ranges requested on this sheet. For example, if this is representing + `Sheet1`, and the spreadsheet was requested with ranges + `Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a + startRow/startColumn of `0`, + while the second one will have `startRow 14` (zero-based row 15), + and `startColumn 3` (zero-based column D). + """ + data: [GoogleSheetsGridData!] + + """The ranges that are merged together.""" + merges: [GoogleSheetsGridRange!] +} + +""" +A range along a single dimension on a sheet. +All indexes are zero-based. +Indexes are half open: the start index is inclusive +and the end index is exclusive. +Missing indexes indicate the range is unbounded on that side. +""" +type GoogleSheetsDimensionRange { + """The dimension of the span.""" + dimension: String + + """The start (inclusive) of the span, or not set if unbounded.""" + startIndex: Int + + """The end (exclusive) of the span, or not set if unbounded.""" + endIndex: Int + + """The sheet this span is on.""" + sheetId: Int +} + +"""A location where metadata may be associated in a spreadsheet.""" +type GoogleSheetsDeveloperMetadataLocation { + """The type of location this object represents. This field is read-only.""" + locationType: String + + """ + Represents the row or column when metadata is associated with + a dimension. The specified DimensionRange must represent a single row + or column; it cannot be unbounded or span multiple rows or columns. + """ + dimensionRange: GoogleSheetsDimensionRange + + """True when metadata is associated with an entire spreadsheet.""" + spreadsheet: Boolean + + """The ID of the sheet when metadata is associated with an entire sheet.""" + sheetId: Int +} + +""" +Developer metadata associated with a location or object in a spreadsheet. +Developer metadata may be used to associate arbitrary data with various +parts of a spreadsheet and will remain associated at those locations as they +move around and the spreadsheet is edited. For example, if developer +metadata is associated with row 5 and another row is then subsequently +inserted above row 5, that original metadata will still be associated with +the row it was first associated with (what is now row 6). If the associated +object is deleted its metadata is deleted too. +""" +type GoogleSheetsDeveloperMetadata { + """ + The metadata key. There may be multiple metadata in a spreadsheet with the + same key. Developer metadata must always have a key specified. + """ + metadataKey: String + + """ + The spreadsheet-scoped unique ID that identifies the metadata. IDs may be + specified when metadata is created, otherwise one will be randomly + generated and assigned. Must be positive. + """ + metadataId: Int + + """The location where the metadata is associated.""" + location: GoogleSheetsDeveloperMetadataLocation + + """ + The metadata visibility. Developer metadata must always have a visibility + specified. + """ + visibility: String + + """Data associated with the metadata's key.""" + metadataValue: String +} + +"""Resource that represents a spreadsheet.""" +type GoogleSheetsSpreadsheet { + """The developer metadata associated with a spreadsheet.""" + developerMetadata: [GoogleSheetsDeveloperMetadata!] + + """The sheets that are part of a spreadsheet.""" + sheets: [GoogleSheetsSheet!] + + """ + The url of the spreadsheet. + This field is read-only. + """ + spreadsheetUrl: String + + """Overall properties of a spreadsheet.""" + properties: GoogleSheetsSpreadsheetProperties + + """ + The ID of the spreadsheet. + This field is read-only. + """ + spreadsheetId: String + + """The named ranges defined in a spreadsheet.""" + namedRanges: [GoogleSheetsNamedRange!] +} + +"""Google Sheets""" +type Sheets { + sheet(includeGridData: Boolean, ranges: String, id: String!): GoogleSheetsSpreadsheet! +} + +type GoogleMapsGeolocationAddressComponent { + longName: String! + shortName: String! + types: [String!]! +} + +type GoogleMapsGeolocationGeometryViewport { + northEast: GoogleMapsElevationLatLng! + southWest: GoogleMapsElevationLatLng! +} + +type GoogleMapsGeolocationGeometry { + locationType: String! + location: GoogleMapsElevationLatLng! + viewport: GoogleMapsGeolocationGeometryViewport! +} + +type GoogleMapsGeolocation { + placeId: String! + types: [String!]! + formattedAddress: String! + geometry: GoogleMapsGeolocationGeometry! + addressComponents: [GoogleMapsGeolocationAddressComponent!]! +} + +input GoogleMapsPathArg { + samples: Int! + locations: [GoogleMapsLatLngArg!]! +} + +input GoogleMapsLatLngArg { + lng: Float! + lat: Float! +} + +type GoogleMapsElevationLatLng { + """""" + lat: Float! + + """""" + lng: Float! + elevation: GoogleMapsElevation! +} + +type GoogleMapsElevation { + """""" + resolution: Float! + + """""" + location: GoogleMapsElevationLatLng! + + """""" + elevation: Float! +} + +type GoogleMaps { + elevation(path: GoogleMapsPathArg, locations: [GoogleMapsLatLngArg!]): [GoogleMapsElevation!]! + + """Do a geolocation lookup by address or lat/lng""" + geolocation(address: String!): GoogleMapsGeolocation + + """Do a geolocation lookup by lat/lng""" + reverseGeolocation(point: GoogleMapsLatLngArg!): GoogleMapsGeolocation +} + +"""""" +type GmailListLabelsResponse { + """List of labels.""" + labels: [GmailLabel!] +} + +type GmailThreadDeprecated { + """The ID of the last history record that modified this thread.""" + historyId: String + + """The unique ID of the thread.""" + id: String + + """The list of messages in the thread.""" + messages: [GmailMessage!] + + """A short part of the message text.""" + snippet: String + expanded( + """ + The format to return. Options are + "full": Returns the full email message data with body content parsed in the payload field; the raw field is not used. (default) + "metadata": Returns only email message ID, labels, and email headers. + "minimal": Returns only email message ID and labels; does not return the email headers, body, or payload. + + """ + format: String + ): GmailThread! +} + +type GmailListThreadsResponseDeprecated { + """Page token to retrieve the next page of results in the list.""" + nextPageToken: String + + """Estimated total number of results.""" + resultSizeEstimate: Int + + """List of threads.""" + threads: [GmailThreadDeprecated!] +} + +"""A collection of messages representing a conversation.""" +type GmailThread { + """The ID of the last history record that modified this thread.""" + historyId: String + + """The unique ID of the thread.""" + id: String + + """The list of messages in the thread.""" + messages: [GmailMessage!] + + """A short part of the message text.""" + snippet: String +} + +"""List of threads with pagination info""" +type GmailThreadsConnection { + """List of threads""" + nodes: [GmailThread!]! + + """Pagination information for the result""" + pageInfo: PageInfo! + + """Estimated total number of threads in the connection""" + totalCount: Int +} + +"""List of messages with pagination info""" +type GmailMessagesConnection { + """List of messages""" + nodes: [GmailMessage!]! + + """Pagination information for the result""" + pageInfo: PageInfo! + + """Estimated total number of messages in the connection""" + totalCount: Int +} + +"""""" +type GmailLabelColor { + """ + The background color represented as hex string #RRGGBB (ex #000000). This field is required in order to set the color of a label. Only the following predefined set of color values are allowed: + #000000, #434343, #666666, #999999, #cccccc, #efefef, #f3f3f3, #ffffff, #fb4c2f, #ffad47, #fad165, #16a766, #43d692, #4a86e8, #a479e2, #f691b3, #f6c5be, #ffe6c7, #fef1d1, #b9e4d0, #c6f3de, #c9daf8, #e4d7f5, #fcdee8, #efa093, #ffd6a2, #fce8b3, #89d3b2, #a0eac9, #a4c2f4, #d0bcf1, #fbc8d9, #e66550, #ffbc6b, #fcda83, #44b984, #68dfa9, #6d9eeb, #b694e8, #f7a7c0, #cc3a21, #eaa041, #f2c960, #149e60, #3dc789, #3c78d8, #8e63ce, #e07798, #ac2b16, #cf8933, #d5ae49, #0b804b, #2a9c68, #285bac, #653e9b, #b65775, #822111, #a46a21, #aa8831, #076239, #1a764d, #1c4587, #41236d, #83334c + """ + backgroundColor: String + + """ + The text color of the label, represented as hex string. This field is required in order to set the color of a label. Only the following predefined set of color values are allowed: + #000000, #434343, #666666, #999999, #cccccc, #efefef, #f3f3f3, #ffffff, #fb4c2f, #ffad47, #fad165, #16a766, #43d692, #4a86e8, #a479e2, #f691b3, #f6c5be, #ffe6c7, #fef1d1, #b9e4d0, #c6f3de, #c9daf8, #e4d7f5, #fcdee8, #efa093, #ffd6a2, #fce8b3, #89d3b2, #a0eac9, #a4c2f4, #d0bcf1, #fbc8d9, #e66550, #ffbc6b, #fcda83, #44b984, #68dfa9, #6d9eeb, #b694e8, #f7a7c0, #cc3a21, #eaa041, #f2c960, #149e60, #3dc789, #3c78d8, #8e63ce, #e07798, #ac2b16, #cf8933, #d5ae49, #0b804b, #2a9c68, #285bac, #653e9b, #b65775, #822111, #a46a21, #aa8831, #076239, #1a764d, #1c4587, #41236d, #83334c + """ + textColor: String +} + +""" +Labels are used to categorize messages and threads within the user's mailbox. +""" +type GmailLabel { + """The number of unread threads with the label.""" + threadsUnread: Int + + """The number of unread messages with the label.""" + messagesUnread: Int + + """ + The visibility of the label in the message list in the Gmail web interface. + """ + messageListVisibility: String + + """The immutable ID of the label.""" + id: String + + """The total number of threads with the label.""" + threadsTotal: Int + + """The display name of the label.""" + name: String + + """ + The owner type for the label. User labels are created by the user and can be modified and deleted by the user and can be applied to any message or thread. System labels are internally created and cannot be added, modified, or deleted. System labels may be able to be applied to or removed from messages and threads under some circumstances but this is not guaranteed. For example, users can apply and remove the INBOX and UNREAD labels from messages and threads, but cannot apply or remove the DRAFTS or SENT labels from messages or threads. + """ + type: String + + """The total number of messages with the label.""" + messagesTotal: Int + + """ + The visibility of the label in the label list in the Gmail web interface. + """ + labelListVisibility: String + + """ + The color to assign to the label. Color is only available for labels that have their type set to user. + """ + color: GmailLabelColor +} + +type MessageAttachment { + """The filename of the attachment.""" + filename: String + + """The MIME type of the attachment.""" + mimeType: String + + """Size of the attachment in bytes, encoding notwithstanding.""" + size: Int + + """If true, the attachment is meant to be displayed inline in the body""" + inline: Boolean! + attachmentId: String! +} + +""" The contents of a List-Unsubscribe header """ +type GoogleGmailListUnsubscribe { + """ The mailto portion of the unsubscribe link """ + mailto: [String!]! + + """ The http portion of the unsubscribe link """ + http: [String!]! +} + +"""""" +type GmailMessagePartHeader { + """The name of the header before the : separator. For example, To.""" + name: String + + """ + The value of the header after the : separator. For example, someuser@example.com. + """ + value: String +} + +"""The body of a single MIME message part.""" +type GmailMessagePartBody { + """ + When present, contains the ID of an external attachment that can be retrieved in a separate messages.attachments.get request. When not present, the entire content of the message part body is contained in the data field. + """ + attachmentId: String + + """ + The body data of a MIME message part as a base64url encoded string. May be empty for MIME container types that have no message body or when the body data is sent as a separate attachment. An attachment ID is present if the body data is contained in a separate attachment. + """ + data: String + + """Number of bytes for the message part data (encoding notwithstanding).""" + size: Int + + """ The body data of a MIME message part. May be empty for MIME container types that have no message body or when the body data is sent as a separate attachment. An attachment ID is present if the body data is contained in a separate attachment. + """ + decodedData: String + + """ A collection of http links in the body in the order they appear """ + httpLinks: [String!] +} + +"""A single MIME message part.""" +type GmailMessagePart { + """ + The message part body for this part, which may be empty for container MIME message parts. + """ + body: GmailMessagePartBody + + """ + The filename of the attachment. Only present if this message part represents an attachment. + """ + filename: String + + """ + List of headers on this message part. For the top-level message part, representing the entire message payload, it will contain the standard RFC 2822 email headers such as To, From, and Subject. + """ + headers: [GmailMessagePartHeader!] + + """The MIME type of the message part.""" + mimeType: String + + """The immutable ID of the message part.""" + partId: String + + """ + The child MIME message parts of this part. This only applies to container MIME message parts, for example multipart/*. For non- container MIME message part types, such as text/plain, this field is empty. For more information, see RFC 1521. + """ + parts: [GmailMessagePart!] + + """ The recipients of the email, extracted from the "To" header """ + to: String + + """ The recipients of the email, extracted from the "Cc" header """ + cc: String + + """ The recipients of the email, extracted from the "Bcc" header """ + bcc: String + + """ The sender of the email, extracted from the "From" header """ + from: String + + """ The unsubscribe link (if any), extracted from the "List-Unsubscribe" header + """ + listUnsubscribe: GoogleGmailListUnsubscribe + + """ The date of the email, extracted from the "Date" header """ + date: String + + """ The subject of the email, extracted from the "Subject" header """ + subject: String + attachments: [MessageAttachment!] +} + +"""An email message.""" +type GmailMessage { + """ + The ID of the thread the message belongs to. To add a message or draft to a thread, the following criteria must be met: + - The requested threadId must be specified on the Message or Draft.Message you supply with your request. + - The References and In-Reply-To headers must be set in compliance with the RFC 2822 standard. + - The Subject headers must match. + """ + threadId: String + + """A short part of the message text.""" + snippet: String + + """The ID of the last history record that modified this message.""" + historyId: String + + """List of IDs of labels applied to this message.""" + labelIds: [String!] + + """The immutable ID of the message.""" + id: String + + """Estimated size in bytes of the message.""" + sizeEstimate: Int + + """ + The entire email message in an RFC 2822 formatted and base64url encoded string. Returned in messages.get and drafts.get responses when the format=RAW parameter is supplied. + """ + raw: String + + """The parsed email structure in the message parts.""" + payload: GmailMessagePart + + """ + The internal message creation timestamp (epoch ms), which determines ordering in the inbox. For normal SMTP-received email, this represents the time the message was originally accepted by Google, which is more reliable than the Date header. However, for API-migrated mail, it can be configured by client to be based on the Date header. + """ + internalDate: String + + """ List of labels applied to this message. """ + labels: [GmailLabel!]! +} + +"""A draft email in the user's mailbox.""" +type GmailDraft { + """The immutable ID of the draft.""" + id: String + + """The message content of the draft.""" + message: GmailMessage +} + +"""List of drafts with pagination info""" +type GmailDraftsConnection { + """List of drafts""" + nodes: [GmailDraft!]! + + """Pagination information for the result""" + pageInfo: PageInfo! + + """Estimated total number of messages in the connection""" + totalCount: Int +} + +"""Google Gmail""" +type Gmail { + drafts( + """ + The format to return. Options are + "full": Returns the full email message data with body content parsed in the payload field; the raw field is not used. (default) + "metadata": Returns only email message ID, labels, and email headers. + "minimal": Returns only email message ID and labels; does not return the email headers, body, or payload. + + """ + format: String + + """ + Only return drafts matching the specified query. Supports the same query format as the Gmail search box. For example, "from:someuser@example.com rfc822msgid:<somemsgid@example.com> is:unread". Parameter cannot be used when accessing the api using the gmail.metadata scope. + """ + q: String + + """Returns the drafts in the list that come after the specified cursor.""" + after: String + + """The maximum number of drafts to return. Defaults to 10.""" + first: Int + ): GmailDraftsConnection! + messages( + """ + The format to return. Options are + "full": Returns the full email message data with body content parsed in the payload field; the raw field is not used. (default) + "metadata": Returns only email message ID, labels, and email headers. + "minimal": Returns only email message ID and labels; does not return the email headers, body, or payload. + + """ + format: String + + """ + Only return messages matching the specified query. Supports the same query format as the Gmail search box. For example, "from:someuser@example.com rfc822msgid:<somemsgid@example.com> is:unread". Parameter cannot be used when accessing the api using the gmail.metadata scope. + """ + q: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """The maximum number of messages to return. Defaults to 10.""" + first: Int + labelIds: String + ): GmailMessagesConnection! + messageThreads( + """ + The format to return. Options are + "full": Returns the full email message data with body content parsed in the payload field; the raw field is not used. (default) + "metadata": Returns only email message ID, labels, and email headers. + "minimal": Returns only email message ID and labels; does not return the email headers, body, or payload. + + """ + format: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Only return messages matching the specified query. Supports the same query format as the Gmail search box. For example, "from:someuser@example.com rfc822msgid:<somemsgid@example.com> is:unread". Parameter cannot be used when accessing the api using the gmail.metadata scope. + """ + q: String + + """The maximum number of messages to return. Defaults to 10.""" + first: Int + labelIds: String + ): GmailThreadsConnection! + + """Return a draft by its id""" + draft( + """Draft id""" + id: String! + ): GmailDraft! + + """Return a message by its id""" + message(id: String!): GmailMessage! + + """Return a thread by its id""" + thread(id: String!): GmailThread! + threads( + pageToken: String + + """ + Only return messages matching the specified query. Supports the same query format as the Gmail search box. For example, "from:someuser@example.com rfc822msgid:<somemsgid@example.com> is:unread". Parameter cannot be used when accessing the api using the gmail.metadata scope. + """ + q: String + maxResults: Int + labelIds: String + ): GmailListThreadsResponseDeprecated! @deprecated(reason: "Use messageThreads instead") + queryThreads( + pageToken: String + + """ + Only return messages matching the specified query. Supports the same query format as the Gmail search box. For example, "from:someuser@example.com rfc822msgid:<somemsgid@example.com> is:unread". Parameter cannot be used when accessing the api using the gmail.metadata scope. + """ + q: String + maxResults: Int + labelIds: String + ): GmailListThreadsResponseDeprecated! @deprecated(reason: "Use messageThreads instead") + labels: GmailListLabelsResponse! +} + +"""List of Google Analytics accounts, with pagination information""" +type GoogleAnalyticsAccountsConnection { + """List of Google Analytics accounts""" + nodes: [GoogleAnalyticsAccont!] +} + +"""Permissions the user has for this view (profile).""" +type GoogleAnalyticsProfilePermissions { + """ + All the permissions that the user has for this view (profile). These include any implied permissions (e.g., EDIT implies VIEW) or inherited permissions from the parent web property. + """ + effective: [String!] +} + +type GoogleAnalyticsProfile { + """Permissions the user has for this view (profile).""" + permissions: GoogleAnalyticsProfilePermissions + + """Time this view (profile) was created.""" + created: String + + """Account ID to which this view (profile) belongs.""" + accountId: String + + """Indicates whether this view (profile) is starred or not.""" + starred: Boolean + + """ + Time zone for which this view (profile) has been configured. Time zones are identified by strings from the TZ database. + """ + timezone: String + + """ + The currency type associated with this view (profile), defaults to USD. The supported values are: + USD, JPY, EUR, GBP, AUD, KRW, BRL, CNY, DKK, RUB, SEK, NOK, PLN, TRY, TWD, HKD, THB, IDR, ARS, MXN, VND, PHP, INR, CHF, CAD, CZK, NZD, HUF, BGN, LTL, ZAR, UAH, AED, BOB, CLP, COP, EGP, HRK, ILS, MAD, MYR, PEN, PKR, RON, RSD, SAR, SGD, VEF, LVL + """ + currency: String + + """ + Indicates whether enhanced ecommerce tracking is enabled for this view (profile). This property can only be enabled if ecommerce tracking is enabled. + """ + enhancedECommerceTracking: Boolean + + """View (Profile) ID.""" + id: String + + """Indicates whether bot filtering is enabled for this view (profile).""" + botFilteringEnabled: Boolean + + """Site search category parameters for this view (profile).""" + siteSearchCategoryParameters: String + + """Name of this view (profile).""" + name: String + + """ + Whether or not Analytics will strip search query parameters from the URLs in your reports. + """ + stripSiteSearchQueryParameters: Boolean + + """ + Web property ID of the form UA-XXXXX-YY to which this view (profile) belongs. + """ + webPropertyId: String + + """The site search query parameters for this view (profile).""" + siteSearchQueryParameters: String + + """The query parameters that are excluded from this view (profile).""" + excludeQueryParameters: String + + """Internal ID for the web property to which this view (profile) belongs.""" + internalWebPropertyId: String + + """Default page for this view (profile).""" + defaultPage: String + + """Resource type for Analytics view (profile).""" + kind: String + + """View (Profile) type. Supported types: WEB or APP.""" + type: String + + """ + Indicates whether ecommerce tracking is enabled for this view (profile). + """ + eCommerceTracking: Boolean + + """Time this view (profile) was last modified.""" + updated: String + + """ + Whether or not Analytics will strip search category parameters from the URLs in your reports. + """ + stripSiteSearchCategoryParameters: Boolean + + """Website URL for this view (profile).""" + websiteUrl: String +} + +type GoogleAnalyticsProfilessConnection { + """List of profiles""" + nodes: [GoogleAnalyticsProfile!] +} + +"""Permissions the user has for this web property.""" +type GoogleAnalyticsWebpropertyPermissions { + """ + All the permissions that the user has for this web property. These include any implied permissions (e.g., EDIT implies VIEW) or inherited permissions from the parent account. + """ + effective: [String!] +} + +type GoogleAnalyticsWebproperty { + """Permissions the user has for this web property.""" + permissions: GoogleAnalyticsWebpropertyPermissions + + """Time this web property was created.""" + created: String + + """Account ID to which this web property belongs.""" + accountId: String + + """Indicates whether this web property is starred or not.""" + starred: Boolean + + """ + The length of time for which user and event data is retained. + This property cannot be set on insert. + """ + dataRetentionTtl: String + + """Web property ID of the form UA-XXXXX-YY.""" + id: String + + """The industry vertical/category selected for this web property.""" + industryVertical: String + + """Name of this web property.""" + name: String + + """View (Profile) count for this web property.""" + profileCount: Int + + """Level for this web property. Possible values are STANDARD or PREMIUM.""" + level: String + + """ + Set to true to reset the retention period of the user identifier with each new event from that user (thus setting the expiration date to current time plus retention period). + Set to false to delete data associated with the user identifier automatically after the rentention period. + This property cannot be set on insert. + """ + dataRetentionResetOnNewActivity: Boolean + + """Internal ID for this web property.""" + internalWebPropertyId: String + + """Resource type for Analytics WebProperty.""" + kind: String + + """Time this web property was last modified.""" + updated: String + + """Default view (profile) ID.""" + defaultProfileId: String + + """Website url for this web property.""" + websiteUrl: String + profiles: GoogleAnalyticsProfilessConnection +} + +type GoogleAnalyticsWebPropertiesConnection { + """List of web properties""" + nodes: [GoogleAnalyticsWebproperty!] +} + +"""Permissions the user has for this account.""" +type GoogleAnalyticsAccountPermissions { + """ + All the permissions that the user has for this account. These include any implied permissions (e.g., EDIT implies VIEW). + """ + effective: [String!] +} + +type GoogleAnalyticsAccont { + """Permissions the user has for this account.""" + permissions: GoogleAnalyticsAccountPermissions + + """Time the account was created.""" + created: String + + """Indicates whether this account is starred or not.""" + starred: Boolean + + """Account ID.""" + id: String + + """Account name.""" + name: String + + """Time the account was last modified.""" + updated: String + + """Web properties connected to the account""" + webProperties: GoogleAnalyticsWebPropertiesConnection +} + +""" +Make a REST API call to the Google Analytics API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type GoogleAnalyticsRealtimePassthroughQuery { + """ + Make a GET request to the Google Analytics API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +type GoogleAnalyticsRealtimePassthroughApi { + """ + Make a REST API call to the Google Analytics API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: GoogleAnalyticsRealtimePassthroughQuery! +} + +""" +Make a REST API call to the Google Analytics API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type GoogleAnalyticsReportingPassthroughQuery { + """ + Make a GET request to the Google Analytics API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +type GoogleAnalyticsReportingPassthroughApi { + """ + Make a REST API call to the Google Analytics API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: GoogleAnalyticsReportingPassthroughQuery! +} + +"""The root for Google Analytics""" +type GoogleAnalytics { + """Passthrough field for the Google Analytics Reporting v4 API""" + reportingApi: GoogleAnalyticsReportingPassthroughApi! + + """Passthrough field for the Google Analytics Realtime v3 API""" + realtimeApi: GoogleAnalyticsRealtimePassthroughApi! + + """A Google analytics account.""" + account( + """The account id for the account to fetch.""" + id: String! + ): GoogleAnalyticsAccont! + + """Google analytics accounts, with pagination information.""" + accounts( + """Number of accounts to fetch""" + first: Int + ): GoogleAnalyticsAccountsConnection! +} + +"""""" +type GoogleServices { + analytics: GoogleAnalytics! + gmail: Gmail! + maps: GoogleMaps! + sheets: Sheets! + calendar: GoogleCalendarQuery! + compute: GoogleComputeEngine! + dns: GoogleDNS! + drive: GoogleDrive! + translate: GoogleTranslate! + discovery: GoogleDiscoveryQuery! +} + +enum FedexArrivalLocationTypeEnum { + AIRPORT + CUSTOMER + CUSTOMS_BROKER + DELIVERY_LOCATION + DESTINATION_AIRPORT + DESTINATION_FEDEX_FACILITY + DROP_BOX + ENROUTE + FEDEX_FACILITY + FEDEX_OFFICE_LOCATION + INTERLINE_CARRIER + NON_FEDEX_FACILITY + ORIGIN_AIRPORT + ORIGIN_FEDEX_FACILITY + PICKUP_LOCATION + PLANE + PORT_OF_ENTRY + SHIP_AND_GET_LOCATION + SORT_FACILITY + TURNPOINT + VEHICLE +} + +"""""" +type FedexTrackEvent { + """The time this event occurred.""" + timestamp: String + + """Carrier's scan code. Pairs with EventDescription.""" + eventType: String + + """Literal description that pairs with the EventType.""" + eventDescription: String + + """ + Further defines the Scan Type code's specific type (e.g., DEX08 business closed). Pairs with StatusExceptionDescription. + """ + statusExceptionCode: String + + """Literal description that pairs with the StatusExceptionCode.""" + statusExceptionDescription: String + + """Address information of the station that is responsible for the scan.""" + address: FedexAddress + + """ + FedEx location ID where the scan took place. (Returned for CSR SL only.) + """ + stationId: String + + """Indicates where the arrival actually occurred.""" + arrivalLocation: FedexArrivalLocationTypeEnum +} + +enum FedexEligibilityTypeEnum { + ELIGIBLE + INELIGIBLE + POSSIBLY_ELIGIBLE +} + +enum FedexDeliveryOptionTypeEnum { + INDIRECT_SIGNATURE_RELEASE + REDIRECT_TO_HOLD_AT_LOCATION + REROUTE + RESCHEDULE +} + +"""""" +type FedexDeliveryOptionEligibilityDetail { + """Type of delivery option.""" + option: FedexDeliveryOptionTypeEnum + + """Eligibility of the customer for the specific delivery option.""" + eligibility: FedexEligibilityTypeEnum +} + +"""""" +type FedexTrackSplitShipmentPart { + """The number of pieces in this part.""" + pieceCount: Int + + """The date and time this status began.""" + timestamp: String + + """A code that identifies this type of status.""" + statusCode: String + + """A human-readable description of this status.""" + statusDescription: String +} + +enum FedexNotificationEventTypeEnum { + ON_DELIVERY + ON_ESTIMATED_DELIVERY + ON_EXCEPTION + ON_SHIPMENT + ON_TENDER +} + +"""""" +type FedexSignatureImageDetail { + """""" + image: String + + """""" + notifications: [FedexNotification!] +} + +enum FedexImageSizeTypeEnum { + LARGE + SMALL +} + +enum FedexAvailableImageTypeEnum { + BILL_OF_LADING + SIGNATURE_PROOF_OF_DELIVERY +} + +"""""" +type FedexAvailableImagesDetail { + """""" + type: FedexAvailableImageTypeEnum + + """""" + size: FedexImageSizeTypeEnum +} + +enum FedexPieceCountLocationTypeEnum { + DESTINATION + ORIGIN +} + +"""""" +type FedexPieceCountVerificationDetail { + """""" + countLocationType: FedexPieceCountLocationTypeEnum + + """""" + count: Int + + """""" + description: String +} + +enum FedexTrackDeliveryLocationTypeEnum { + APARTMENT_OFFICE + FEDEX_LOCATION + GATE_HOUSE + GUARD_OR_SECURITY_STATION + IN_BOND_OR_CAGE + LEASING_OFFICE + MAILROOM + MAIN_OFFICE + MANAGER_OFFICE + OTHER + PHARMACY + RECEPTIONIST_OR_FRONT_DESK + RENTAL_OFFICE + RESIDENCE + SHIPPING_RECEIVING +} + +enum FedexOfficeOrderDeliveryMethodTypeEnum { + COURIER + OTHER + PICKUP + SHIPMENT +} + +enum FedexFedExLocationTypeEnum { + FEDEX_AUTHORIZED_SHIP_CENTER + FEDEX_EXPRESS_STATION + FEDEX_FACILITY + FEDEX_FREIGHT_SERVICE_CENTER + FEDEX_GROUND_TERMINAL + FEDEX_HOME_DELIVERY_STATION + FEDEX_OFFICE + FEDEX_SELF_SERVICE_LOCATION + FEDEX_SHIPSITE + FEDEX_SMART_POST_HUB +} + +"""""" +type FedexLocalTimeRange { + """""" + begins: String + + """""" + ends: String +} + +enum FedexAppointmentWindowTypeEnum { + AFTERNOON + LATE_AFTERNOON + MID_DAY + MORNING +} + +"""""" +type FedexAppointmentTimeDetail { + """ + The description that FedEx Ground uses for the appointment window being specified. + """ + type: FedexAppointmentWindowTypeEnum + + """Specifies the window of time for an appointment.""" + window: FedexLocalTimeRange + + """""" + description: String +} + +"""""" +type FedexAppointmentDetail { + """""" + date: String + + """Different appointment time windows on the date specified.""" + windowDetails: [FedexAppointmentTimeDetail!] +} + +enum FedexSpecialInstructionsStatusCodeEnum { + ACCEPTED + CANCELLED + DENIED + HELD + MODIFIED + RELINQUISHED + REQUESTED + SET +} + +"""""" +type FedexSpecialInstructionStatusDetail { + """Specifies the status of the track special instructions requested.""" + status: FedexSpecialInstructionsStatusCodeEnum + + """Time when the status was changed.""" + statusCreateTime: String +} + +enum FedexTrackDeliveryOptionTypeEnum { + APPOINTMENT + DATE_CERTAIN + ELECTRONIC_SIGNATURE_RELEASE + EVENING + REDIRECT_TO_HOLD_AT_LOCATION + REROUTE +} + +"""""" +type FedexTrackSpecialInstruction { + """""" + description: String + + """""" + deliveryOption: FedexTrackDeliveryOptionTypeEnum + + """ + Specifies the status and status update time of the track special instructions. + """ + statusDetail: FedexSpecialInstructionStatusDetail + + """ + Specifies the estimated delivery time that was originally estimated when the shipment was shipped. + """ + originalEstimatedDeliveryTimestamp: String + + """Specifies the time the customer requested a change to the shipment.""" + originalRequestTime: String + + """The requested appointment time for delivery.""" + requestedAppointmentTime: FedexAppointmentDetail +} + +enum FedexDistanceUnitsEnum { + KM + MI +} + +"""""" +type FedexDistance { + """Identifies the distance quantity.""" + value: Float + + """Identifies the unit of measure for the distance value.""" + units: FedexDistanceUnitsEnum +} + +enum FedexTrackingDateOrTimestampTypeEnum { + ACTUAL_DELIVERY + ACTUAL_PICKUP + ACTUAL_TENDER + ANTICIPATED_TENDER + APPOINTMENT_DELIVERY + ESTIMATED_DELIVERY + ESTIMATED_PICKUP + SHIP +} + +"""""" +type FedexTrackingDateOrTimestamp { + """""" + type: FedexTrackingDateOrTimestampTypeEnum + + """""" + dateOrTimestamp: String +} + +enum FedexTrackPossessionStatusTypeEnum { + BROKER + CARRIER + CUSTOMS + RECIPIENT + SHIPPER + SPLIT_STATUS + TRANSFER_PARTNER +} + +enum FedexTrackChargesPaymentClassificationTypeEnum { + DUTIES_AND_TAXES + TRANSPORTATION +} + +"""""" +type FedexTrackPayment { + """Indicates the classification of the charges being paid.""" + classification: FedexTrackChargesPaymentClassificationTypeEnum + + """""" + type: FedexTrackPaymentTypeEnum + + """""" + description: String +} + +enum FedexTrackPaymentTypeEnum { + CASH_OR_CHECK_AT_DESTINATION + CASH_OR_CHECK_AT_ORIGIN + CREDIT_CARD_AT_DESTINATION + CREDIT_CARD_AT_ORIGIN + OTHER + RECIPIENT_ACCOUNT + SHIPPER_ACCOUNT + THIRD_PARTY_ACCOUNT +} + +enum FedexTrackSpecialHandlingTypeEnum { + ACCESSIBLE_DANGEROUS_GOODS + ADULT_SIGNATURE_OPTION + AIRBILL_AUTOMATION + AIRBILL_DELIVERY + ALCOHOL + AM_DELIVERY_GUARANTEE + APPOINTMENT_DELIVERY + BATTERY + BILL_RECIPIENT + BROKER_SELECT_OPTION + CALL_BEFORE_DELIVERY + CALL_TAG + CALL_TAG_DAMAGE + CHARGEABLE_CODE + COD + COLLECT + CONSOLIDATION + CONSOLIDATION_SMALLS_BAG + CURRENCY + CUT_FLOWERS + DATE_CERTAIN_DELIVERY + DELIVERY_ON_INVOICE_ACCEPTANCE + DELIVERY_REATTEMPT + DELIVERY_RECEIPT + DELIVER_WEEKDAY + DIRECT_SIGNATURE_OPTION + DOMESTIC + DO_NOT_BREAK_DOWN_PALLETS + DO_NOT_STACK_PALLETS + DRY_ICE + DRY_ICE_ADDED + EAST_COAST_SPECIAL + ELECTRONIC_COD + ELECTRONIC_DOCUMENTS_WITH_ORIGINALS + ELECTRONIC_SIGNATURE_SERVICE + ELECTRONIC_TRADE_DOCUMENTS + EVENING_DELIVERY + EXCLUSIVE_USE + EXTENDED_DELIVERY + EXTENDED_PICKUP + EXTRA_LABOR + EXTREME_LENGTH + FOOD + FREIGHT_ON_VALUE_CARRIER_RISK + FREIGHT_ON_VALUE_OWN_RISK + FREIGHT_TO_COLLECT + FULLY_REGULATED_DANGEROUS_GOODS + GEL_PACKS_ADDED_OR_REPLACED + GROUND_SUPPORT_FOR_SMARTPOST + GUARANTEED_FUNDS + HAZMAT + HIGH_FLOOR + HOLD_AT_LOCATION + HOLIDAY_DELIVERY + INACCESSIBLE_DANGEROUS_GOODS + INDIRECT_SIGNATURE_OPTION + INSIDE_DELIVERY + INSIDE_PICKUP + INTERNATIONAL + INTERNATIONAL_CONTROLLED_EXPORT + INTERNATIONAL_MAIL_SERVICE + INTERNATIONAL_TRAFFIC_IN_ARMS_REGULATIONS + LIFTGATE + LIFTGATE_DELIVERY + LIFTGATE_PICKUP + LIMITED_ACCESS_DELIVERY + LIMITED_ACCESS_PICKUP + LIMITED_QUANTITIES_DANGEROUS_GOODS + MARKING_OR_TAGGING + NET_RETURN + NON_BUSINESS_TIME + NON_STANDARD_CONTAINER + NO_SIGNATURE_REQUIRED_SIGNATURE_OPTION + ORDER_NOTIFY + OTHER + OTHER_REGULATED_MATERIAL_DOMESTIC + PACKAGE_RETURN_PROGRAM + PIECE_COUNT_VERIFICATION + POISON + PREPAID + PRIORITY_ALERT + PRIORITY_ALERT_PLUS + PROTECTION_FROM_FREEZING + RAIL_MODE + RECONSIGNMENT_CHARGES + REROUTE_CROSS_COUNTRY_DEFERRED + REROUTE_CROSS_COUNTRY_EXPEDITED + REROUTE_LOCAL + RESIDENTIAL_DELIVERY + RESIDENTIAL_PICKUP + RETURNS_CLEARANCE + RETURNS_CLEARANCE_SPECIAL_ROUTING_REQUIRED + RETURN_MANAGER + SATURDAY_DELIVERY + SHIPMENT_PLACED_IN_COLD_STORAGE + SINGLE_SHIPMENT + SMALL_QUANTITY_EXCEPTION + SORT_AND_SEGREGATE + SPECIAL_DELIVERY + SPECIAL_EQUIPMENT + STANDARD_GROUND_SERVICE + STORAGE + SUNDAY_DELIVERY + THIRD_PARTY_BILLING + THIRD_PARTY_CONSIGNEE + TOP_LOAD + WEEKEND_DELIVERY + WEEKEND_PICKUP +} + +"""""" +type FedexTrackSpecialHandling { + """""" + type: FedexTrackSpecialHandlingTypeEnum + + """""" + description: String + + """""" + paymentType: FedexTrackPaymentTypeEnum +} + +enum FedexTrackAdvanceNotificationStatusTypeEnum { + BACK_ON_TRACK + FAIL +} + +"""""" +type FedexTrackAdvanceNotificationDetail { + """""" + estimatedTimeOfArrival: String + + """""" + reason: String + + """""" + status: FedexTrackAdvanceNotificationStatusTypeEnum + + """""" + statusDescription: String + + """""" + statusTime: String +} + +enum FedexCustomsOptionTypeEnum { + COURTESY_RETURN_LABEL + EXHIBITION_TRADE_SHOW + FAULTY_ITEM + FOLLOWING_REPAIR + FOR_REPAIR + ITEM_FOR_LOAN + OTHER + REJECTED + REPLACEMENT + TRIAL +} + +"""""" +type FedexCustomsOptionDetail { + """""" + type: FedexCustomsOptionTypeEnum + + """ + Specifies additional description about customs options. This is a required field when the customs options type is "OTHER". + """ + description: String +} + +enum FedexTrackReturnLabelTypeEnum { + EMAIL + PRINT +} + +enum FedexTrackReturnMovementStatusTypeEnum { + MOVEMENT_OCCURRED + NO_MOVEMENT +} + +"""""" +type FedexTrackReturnDetail { + """""" + movementStatus: FedexTrackReturnMovementStatusTypeEnum + + """""" + labelType: FedexTrackReturnLabelTypeEnum + + """""" + description: String + + """""" + authorizationName: String +} + +"""""" +type FedexDateRange { + """""" + begins: String + + """""" + ends: String +} + +enum FedexNaftaNetCostMethodCodeEnum { + NC + NO +} + +enum FedexNaftaProducerDeterminationCodeEnum { + NO_1 + NO_2 + NO_3 + YES +} + +enum FedexNaftaPreferenceCriterionCodeEnum { + A + B + C + D + E + F +} + +"""""" +type FedexNaftaCommodityDetail { + """Defined by NAFTA regulations.""" + preferenceCriterion: FedexNaftaPreferenceCriterionCodeEnum + + """Defined by NAFTA regulations.""" + producerDetermination: FedexNaftaProducerDeterminationCodeEnum + + """ + Identification of which producer is associated with this commodity (if multiple producers are used in a single shipment). + """ + producerId: String + + """""" + netCostMethod: FedexNaftaNetCostMethodCodeEnum + + """Date range over which RVC net cost was calculated.""" + netCostDateRange: FedexDateRange +} + +"""""" +type FedexEdtExciseCondition { + """""" + category: String + + """ + Customer-declared value, with data type and legal values depending on excise condition, used in defining the taxable value of the item. + """ + value: String +} + +"""""" +type FedexMeasure { + """""" + quantity: Float + + """""" + units: String +} + +enum FedexCommodityPurposeTypeEnum { + BUSINESS + CONSUMER +} + +"""""" +type FedexCommodity { + """ + Value used to identify a commodity description; must be unique within the containing shipment. + """ + commodityId: String + + """""" + name: String + + """""" + numberOfPieces: Int + + """""" + description: String + + """""" + purpose: FedexCommodityPurposeTypeEnum + + """""" + countryOfManufacture: String + + """""" + harmonizedCode: String + + """""" + weight: FedexWeight + + """""" + quantity: Float + + """""" + quantityUnits: String + + """ + Contains only additional quantitative information other than weight and quantity to calculate duties and taxes. + """ + additionalMeasures: [FedexMeasure!] + + """""" + unitPrice: FedexMoney + + """""" + customsValue: FedexMoney + + """ + Defines additional characteristic of commodity used to calculate duties and taxes + """ + exciseConditions: [FedexEdtExciseCondition!] + + """""" + exportLicenseNumber: String + + """""" + exportLicenseExpirationDate: String + + """""" + ciMarksAndNumbers: String + + """""" + partNumber: String + + """All data required for this commodity in NAFTA Certificate of Origin.""" + naftaDetail: FedexNaftaCommodityDetail +} + +"""""" +type FedexContentRecord { + """""" + partNumber: String + + """""" + itemNumber: String + + """""" + receivedQuantity: Int + + """""" + description: String +} + +enum FedexTrackDetailAttributeTypeEnum { + INCLUDED_IN_WATCHLIST +} + +"""""" +type FedexMoney { + """""" + currency: String + + """""" + amount: Float +} + +enum FedexTrackChargeDetailTypeEnum { + ORIGINAL_CHARGES +} + +"""""" +type FedexTrackChargeDetail { + """""" + type: FedexTrackChargeDetailTypeEnum + + """""" + chargeAmount: FedexMoney +} + +enum FedexPhysicalPackagingTypeEnum { + BAG + BARREL + BASKET + BOX + BUCKET + BUNDLE + CAGE + CARTON + CASE + CHEST + CONTAINER + CRATE + CYLINDER + DRUM + ENVELOPE + HAMPER + OTHER + PACKAGE + PAIL + PALLET + PARCEL + PIECE + REEL + ROLL + SACK + SHRINK_WRAPPED + SKID + TANK + TOTE_BIN + TUBE + UNIT +} + +enum FedexPackagingTypeEnum { + FEDEX_10KG_BOX + FEDEX_25KG_BOX + FEDEX_BOX + FEDEX_ENVELOPE + FEDEX_EXTRA_LARGE_BOX + FEDEX_LARGE_BOX + FEDEX_MEDIUM_BOX + FEDEX_PAK + FEDEX_SMALL_BOX + FEDEX_TUBE + YOUR_PACKAGING +} + +enum FedexLinearUnitsEnum { + CM + IN +} + +"""""" +type FedexDimensions { + """""" + length: Int + + """""" + width: Int + + """""" + height: Int + + """""" + units: FedexLinearUnitsEnum +} + +enum FedexWeightUnitsEnum { + KG + LB +} + +"""""" +type FedexWeight { + """Identifies the unit of measure associated with a weight value.""" + units: FedexWeightUnitsEnum + + """Identifies the weight value of a package/shipment.""" + value: Float +} + +enum FedexServiceTypeEnum { + EUROPE_FIRST_INTERNATIONAL_PRIORITY + FEDEX_1_DAY_FREIGHT + FEDEX_2_DAY + FEDEX_2_DAY_AM + FEDEX_2_DAY_FREIGHT + FEDEX_3_DAY_FREIGHT + FEDEX_CARGO_AIRPORT_TO_AIRPORT + FEDEX_CARGO_FREIGHT_FORWARDING + FEDEX_CARGO_INTERNATIONAL_EXPRESS_FREIGHT + FEDEX_CARGO_INTERNATIONAL_PREMIUM + FEDEX_CARGO_MAIL + FEDEX_CARGO_REGISTERED_MAIL + FEDEX_CARGO_SURFACE_MAIL + FEDEX_CUSTOM_CRITICAL_AIR_EXPEDITE + FEDEX_CUSTOM_CRITICAL_AIR_EXPEDITE_EXCLUSIVE_USE + FEDEX_CUSTOM_CRITICAL_AIR_EXPEDITE_NETWORK + FEDEX_CUSTOM_CRITICAL_CHARTER_AIR + FEDEX_CUSTOM_CRITICAL_POINT_TO_POINT + FEDEX_CUSTOM_CRITICAL_SURFACE_EXPEDITE + FEDEX_CUSTOM_CRITICAL_SURFACE_EXPEDITE_EXCLUSIVE_USE + FEDEX_CUSTOM_CRITICAL_TEMP_ASSURE_AIR + FEDEX_CUSTOM_CRITICAL_TEMP_ASSURE_VALIDATED_AIR + FEDEX_CUSTOM_CRITICAL_WHITE_GLOVE_SERVICES + FEDEX_DISTANCE_DEFERRED + FEDEX_EXPRESS_SAVER + FEDEX_FIRST_FREIGHT + FEDEX_FREIGHT_ECONOMY + FEDEX_FREIGHT_PRIORITY + FEDEX_GROUND + FEDEX_NEXT_DAY_AFTERNOON + FEDEX_NEXT_DAY_EARLY_MORNING + FEDEX_NEXT_DAY_END_OF_DAY + FEDEX_NEXT_DAY_FREIGHT + FEDEX_NEXT_DAY_MID_MORNING + FIRST_OVERNIGHT + GROUND_HOME_DELIVERY + INTERNATIONAL_DISTRIBUTION_FREIGHT + INTERNATIONAL_ECONOMY + INTERNATIONAL_ECONOMY_DISTRIBUTION + INTERNATIONAL_ECONOMY_FREIGHT + INTERNATIONAL_FIRST + INTERNATIONAL_PRIORITY + INTERNATIONAL_PRIORITY_DISTRIBUTION + INTERNATIONAL_PRIORITY_EXPRESS + INTERNATIONAL_PRIORITY_FREIGHT + PRIORITY_OVERNIGHT + SAME_DAY + SAME_DAY_CITY + SMART_POST + STANDARD_OVERNIGHT + TRANSBORDER_DISTRIBUTION_CONSOLIDATION +} + +"""""" +type FedexTrackServiceDescriptionDetail { + """""" + type: FedexServiceTypeEnum + + """""" + description: String + + """ + Specifies a shorter description for the service that is calculated per the service code. + """ + shortDescription: String +} + +enum FedexTrackIdentifierTypeEnum { + BILL_OF_LADING + COD_RETURN_TRACKING_NUMBER + CUSTOMER_AUTHORIZATION_NUMBER + CUSTOMER_REFERENCE + DEPARTMENT + DOCUMENT_AIRWAY_BILL + FREE_FORM_REFERENCE + GROUND_INTERNATIONAL + GROUND_SHIPMENT_ID + GROUP_MPS + INVOICE + JOB_GLOBAL_TRACKING_NUMBER + ORDER_GLOBAL_TRACKING_NUMBER + ORDER_TO_PAY_NUMBER + OUTBOUND_LINK_TO_RETURN + PARTNER_CARRIER_NUMBER + PART_NUMBER + PURCHASE_ORDER + REROUTE_TRACKING_NUMBER + RETURNED_TO_SHIPPER_TRACKING_NUMBER + RETURN_MATERIALS_AUTHORIZATION + SHIPPER_REFERENCE + STANDARD_MPS + TRACKING_NUMBER_OR_DOORTAG + TRANSPORTATION_CONTROL_NUMBER +} + +"""""" +type FedexTrackPackageIdentifier { + """ + The type of the Value to be used to retrieve tracking information for a package (e.g. SHIPPER_REFERENCE, PURCHASE_ORDER, TRACKING_NUMBER_OR_DOORTAG, etc..) . + """ + type: FedexTrackIdentifierTypeEnum! + + """The value to be used to retrieve tracking information for a package.""" + value: String! +} + +"""""" +type FedexTrackOtherIdentifierDetail { + """""" + packageIdentifier: FedexTrackPackageIdentifier + + """""" + trackingNumberUniqueIdentifier: String + + """""" + carrierCode: FedexCarrierCodeTypeEnum +} + +"""""" +type FedexContact { + """Identifies the contact person's name.""" + personName: String + + """Identifies the contact person's title.""" + title: String + + """Identifies the company this contact is associated with.""" + companyName: String + + """Identifies the phone number associated with this contact.""" + phoneNumber: String + + """Identifies the phone extension associated with this contact.""" + phoneExtension: String + + """Identifies a toll free number, if any, associated with this contact.""" + tollFreePhoneNumber: String + + """Identifies the pager number associated with this contact.""" + pagerNumber: String + + """Identifies the fax number associated with this contact.""" + faxNumber: String + + """Identifies the email address associated with this contact.""" + eMailAddress: String +} + +"""""" +type FedexContactAndAddress { + """""" + contact: FedexContact! + + """""" + address: FedexAddress +} + +enum FedexOperatingCompanyTypeEnum { + FEDEX_CARGO + FEDEX_CORPORATE_SERVICES + FEDEX_CORPORATION + FEDEX_CUSTOMER_INFORMATION_SYSTEMS + FEDEX_CUSTOM_CRITICAL + FEDEX_EXPRESS + FEDEX_FREIGHT + FEDEX_GROUND + FEDEX_KINKOS + FEDEX_OFFICE + FEDEX_SERVICES + FEDEX_TRADE_NETWORKS +} + +enum FedexCarrierCodeTypeEnum { + FDXC + FDXE + FDXG + FXCC + FXFR + FXSP +} + +"""""" +type FedexTrackReconciliation { + """An identifier for this type of status.""" + status: String! + + """A human-readable description of this status.""" + description: String! +} + +"""""" +type FedexCustomerExceptionRequestDetail { + """Unique identifier for the customer exception request.""" + id: String + + """""" + statusCode: String + + """""" + statusDescription: String + + """""" + createTime: String +} + +"""""" +type FedexTrackInformationNoteDetail { + """ + A code that designates the type of informational message being returned. + """ + code: String + + """The informational message in human readable form.""" + description: String +} + +"""""" +type FedexTrackStatusAncillaryDetail { + """""" + reason: String + + """""" + reasonDescription: String + + """""" + action: String + + """""" + actionDescription: String +} + +"""""" +type FedexAddress { + """ + Combination of number, street name, etc. At least one line is required for a valid physical address; empty lines should not be included. + """ + streetLines: [String!] + + """Name of city, town, etc.""" + city: String + + """ + Identifying abbreviation for US state, Canada province, etc. Format and presence of this field will vary, depending on country. + """ + stateOrProvinceCode: String + + """ + Identification of a region (usually small) for mail/package delivery. Format and presence of this field will vary, depending on country. + """ + postalCode: String + + """Relevant only to addresses in Puerto Rico.""" + urbanizationCode: String + + """The two-letter code used to identify a country.""" + countryCode: String + + """The fully spelt out name of a country.""" + countryName: String + + """Indicates whether this address residential (as opposed to commercial).""" + residential: Boolean + + """The geographic coordinates cooresponding to this address.""" + geographicCoordinates: String +} + +"""""" +type FedexTrackStatusDetail { + """""" + creationTime: String + + """""" + code: String + + """""" + description: String + + """""" + location: FedexAddress + + """""" + ancillaryDetails: [FedexTrackStatusAncillaryDetail!] +} + +enum FedexStringBarcodeTypeEnum { + ADDRESS + ASTRA + FEDEX_1D + GROUND + POSTAL + USPS +} + +"""""" +type FedexStringBarcode { + """The kind of barcode data in this instance.""" + type: FedexStringBarcodeTypeEnum + + """The data content of this instance.""" + value: String +} + +"""""" +type FedexTrackDetail { + """To report soft error on an individual track detail.""" + notification: FedexNotification + + """The FedEx package identifier.""" + trackingNumber: String + + """""" + barcode: FedexStringBarcode + + """ + When duplicate tracking numbers exist this data is returned with summary information for each of the duplicates. The summary information is used to determine which of the duplicates the intended tracking number is. This identifier is used on a subsequent track request to retrieve the tracking data for the desired tracking number. + """ + trackingNumberUniqueIdentifier: String + + """Specifies details about the status of the shipment being tracked.""" + statusDetail: FedexTrackStatusDetail + + """ + Notifications to the end user that provide additional information relevant to the tracked shipment. For example, a notification may indicate that a change in behavior has occurred. + """ + informationNotes: [FedexTrackInformationNoteDetail!] + + """""" + customerExceptionRequests: [FedexCustomerExceptionRequestDetail!] + + """ + Used to report the status of a piece of a multiple piece shipment which is no longer traveling with the rest of the packages in the shipment or has not been accounted for. + """ + reconciliation: FedexTrackReconciliation + + """ + Used to convey information such as. 1. FedEx has received information about a package but has not yet taken possession of it. 2. FedEx has handed the package off to a third party for final delivery. 3. The package delivery has been cancelled + """ + serviceCommitMessage: String + + """""" + destinationServiceArea: String + + """""" + destinationServiceAreaDescription: String + + """Identifies a FedEx operating company (transportation).""" + carrierCode: FedexCarrierCodeTypeEnum + + """ + Identifies operating transportation company that is the specific to the carrier code. + """ + operatingCompany: FedexOperatingCompanyTypeEnum + + """ + Specifies a detailed description about the carrier or the operating company. + """ + operatingCompanyOrCarrierDescription: String + + """ + If the package was interlined to a cartage agent, this is the name of the cartage agent. (Returned for CSR SL only.) + """ + cartageAgentCompanyName: String + + """Specifies the FXO production centre contact and address.""" + productionLocationContactAndAddress: FedexContactAndAddress + + """""" + otherIdentifiers: [FedexTrackOtherIdentifierDetail!] + + """(Returned for CSR SL only.)""" + formId: String + + """Specifies details about service such as service description and type.""" + service: FedexTrackServiceDescriptionDetail + + """The weight of this package.""" + packageWeight: FedexWeight + + """Physical dimensions of the package.""" + packageDimensions: FedexDimensions + + """The dimensional weight of the package.""" + packageDimensionalWeight: FedexWeight + + """The weight of the entire shipment.""" + shipmentWeight: FedexWeight + + """Retained for legacy compatibility only.""" + packaging: String + + """ + Strict representation of the Packaging type (e.g. FEDEX_BOX, YOUR_PACKAGING). + """ + packagingType: FedexPackagingTypeEnum + + """""" + physicalPackagingType: FedexPhysicalPackagingTypeEnum + + """ + The sequence number of this package in a shipment. This would be 2 if it was package number 2 of 4. + """ + packageSequenceNumber: Int + + """The number of packages in this shipment.""" + packageCount: Int + + """ + FOR FEDEX INTERNAL USE ONLY: Specifies the software id of the device that was used to create this tracked shipment. + """ + creatorSoftwareId: String + + """Specifies the details about the SPOC details.""" + charges: [FedexTrackChargeDetail!] + + """""" + nickName: String + + """""" + notes: String + + """""" + attributes: [FedexTrackDetailAttributeTypeEnum!] + + """""" + shipmentContents: [FedexContentRecord!] + + """""" + packageContents: [String!] + + """""" + clearanceLocationCode: String + + """""" + commodities: [FedexCommodity!] + + """""" + returnDetail: FedexTrackReturnDetail + + """Specifies the reason for return.""" + customsOptionDetails: [FedexCustomsOptionDetail!] + + """""" + advanceNotificationDetail: FedexTrackAdvanceNotificationDetail + + """List of special handlings that applied to this package.""" + specialHandlings: [FedexTrackSpecialHandling!] + + """ + Specifies the details about the payments for the shipment being tracked. + """ + payments: [FedexTrackPayment!] + + """(Returned for CSR SL only.)""" + shipper: FedexContact + + """Indicates last-known possession of package (Returned for CSR SL only.)""" + possessionStatus: FedexTrackPossessionStatusTypeEnum + + """""" + shipperAddress: FedexAddress + + """The address of the FedEx pickup location/facility.""" + originLocationAddress: FedexAddress + + """(Returned for CSR SL only.)""" + originStationId: String + + """""" + datesOrTimes: [FedexTrackingDateOrTimestamp!] + + """ + The distance from the origin to the destination. Returned for Custom Critical shipments. + """ + totalTransitDistance: FedexDistance + + """ + Total distance package still has to travel. Returned for Custom Critical shipments. + """ + distanceToDestination: FedexDistance + + """Provides additional details about package delivery.""" + specialInstructions: [FedexTrackSpecialInstruction!] + + """(Returned for CSR SL only.)""" + recipient: FedexContact + + """This is the latest updated destination address.""" + lastUpdatedDestinationAddress: FedexAddress + + """The address this package is to be (or has been) delivered.""" + destinationAddress: FedexAddress + + """""" + holdAtLocationContact: FedexContact + + """The address this package is requested to placed on hold.""" + holdAtLocationAddress: FedexAddress + + """(Returned for CSR SL only.)""" + destinationStationId: String + + """The address of the FedEx delivery location/facility.""" + destinationLocationAddress: FedexAddress + + """""" + destinationLocationType: FedexFedExLocationTypeEnum + + """""" + destinationLocationTimeZoneOffset: String + + """ + Actual address where package was delivered. Differs from destinationAddress, which indicates where the package was to be delivered; This field tells where delivery actually occurred (next door, at station, etc.) + """ + actualDeliveryAddress: FedexAddress + + """Identifies the method of office order delivery.""" + officeOrderDeliveryMethod: FedexOfficeOrderDeliveryMethodTypeEnum + + """ + Strict text indicating the delivery location at the delivered to address. + """ + deliveryLocationType: FedexTrackDeliveryLocationTypeEnum + + """ + User/screen friendly representation of the DeliveryLocationType (delivery location at the delivered to address). Can be returned in localized text. + """ + deliveryLocationDescription: String + + """ + Specifies the number of delivery attempts made to deliver the shipment. + """ + deliveryAttempts: Int + + """ + This is either the name of the person that signed for the package or "Signature not requested" or "Signature on file". + """ + deliverySignatureName: String + + """ + Specifies the details about the count of the packages delivered at the delivery location and the count of the packages at the origin. + """ + pieceCountVerificationDetails: [FedexPieceCountVerificationDetail!] + + """ + Specifies the total number of unique addresses on the CRNs in a consolidation. + """ + totalUniqueAddressCountInConsolidation: Int + + """""" + availableImages: [FedexAvailableImagesDetail!] + + """""" + signature: FedexSignatureImageDetail + + """""" + notificationEventsAvailable: [FedexNotificationEventTypeEnum!] + + """ + Returned for cargo shipments only when they are currently split across vehicles. + """ + splitShipmentParts: [FedexTrackSplitShipmentPart!] + + """ + Specifies the details about the eligibility for different delivery options. + """ + deliveryOptionEligibilityDetails: [FedexDeliveryOptionEligibilityDetail!] + + """Event information for a tracking number.""" + events: [FedexTrackEvent!] +} + +"""""" +type FedexCompletedTrackDetail { + """""" + highestSeverity: FedexNotificationSeverityTypeEnum + + """""" + notifications: [FedexNotification!] + + """ + True if duplicate packages (more than one package with the same tracking number) have been found, and only limited data will be provided for each one. + """ + duplicateWaybill: Boolean + + """True if additional packages remain to be retrieved.""" + moreData: Boolean + + """ + Value that must be passed in a TrackNotification request to retrieve the next set of packages (when MoreDataAvailable = true). + """ + pagingToken: String + + """ + Identifies the total number of available track details across all pages. + """ + trackDetailsCount: Int + + """Contains detailed tracking information for the requested packages(s).""" + trackDetails: [FedexTrackDetail!] +} + +"""""" +type FedexVersionId { + """Identifies a system or sub-system which performs an operation.""" + serviceId: String! + + """Identifies the service business level.""" + major: Int! + + """Identifies the service interface level.""" + intermediate: Int! + + """Identifies the service code level.""" + minor: Int! +} + +"""""" +type FedexLocalization { + """Two-letter code for language (e.g. EN, FR, etc.)""" + languageCode: String! + + """Two-letter code for the region (e.g. us, ca, etc..).""" + localeCode: String +} + +"""""" +type FedexTransactionDetail { + """ + Free form text to be echoed back in the reply. Used to match requests and replies. + """ + customerTransactionId: String + + """ + Governs data payload language/translations (contrasted with ClientDetail.localization, which governs Notification.localizedMessage language selection). + """ + localization: FedexLocalization +} + +"""""" +type FedexNotificationParameter { + """ + Identifies the type of data contained in Value (e.g. SERVICE_TYPE, PACKAGE_SEQUENCE, etc..). + """ + id: String + + """The value of the parameter (e.g. PRIORITY_OVERNIGHT, 2, etc..).""" + value: String +} + +"""""" +type FedexNotification { + """ + The severity of this notification. This can indicate success or failure or some other information about the request. The values that can be returned are SUCCESS - Your transaction succeeded with no other applicable information. NOTE - Additional information that may be of interest to you about your transaction. WARNING - Additional information that you need to know about your transaction that you may need to take action on. ERROR - Information about an error that occurred while processing your transaction. FAILURE - FedEx was unable to process your transaction at this time due to a system failure. Please try again later + """ + severity: FedexNotificationSeverityTypeEnum! + + """ + Indicates the source of this notification. Combined with the Code it uniquely identifies this notification + """ + source: String! + + """ + A code that represents this notification. Combined with the Source it uniquely identifies this notification. + """ + code: String + + """Human-readable text that explains this notification.""" + message: String + + """ + The translated message. The language and locale specified in the ClientDetail. Localization are used to determine the representation. Currently only supported in a TrackReply. + """ + localizedMessage: String + + """ + A collection of name/value pairs that provide specific data to help the client determine the nature of an error (or warning, etc.) without having to parse the message string. + """ + messageParameters: [FedexNotificationParameter!] +} + +enum FedexNotificationSeverityTypeEnum { + ERROR + FAILURE + NOTE + SUCCESS + WARNING +} + +"""""" +type FedexTrackReply { + """ + This contains the severity type of the most severe Notification in the Notifications array. + """ + highestSeverity: FedexNotificationSeverityTypeEnum! + + """ + Information about the request/reply such was the transaction successful or not, and any additional information relevant to the request and/or reply. There may be multiple Notifications in a reply. + """ + notifications: [FedexNotification!]! + + """ + Contains the CustomerTransactionDetail that is echoed back to the caller for matching requests and replies and a Localization element for defining the language/translation used in the reply data. + """ + transactionDetail: FedexTransactionDetail + + """Contains the version of the reply being used.""" + version: FedexVersionId! + + """Contains detailed tracking entity information.""" + completedTrackDetails: [FedexCompletedTrackDetail!] +} + +"""The root for Fedex""" +type FedexQuery { + """Track a Fedex package""" + track( + """Tracking number for the package""" + trackingNumber: String! + ): FedexTrackReply! + + """Track multiple Fedex packages""" + trackMultiple( + """Tracking numbers for packages""" + trackingNumbers: [String!]! + ): [FedexTrackReply]! +} + +"""""" +type FacebookBusinessWhatsAppBusinessProfile { + id: String + nameVerification: JSON + verifiedName: String +} + +"""""" +type FacebookBusinessWhatsAppBusinessAccount { + analytics: JSON + currency: String + id: String + messageTemplateNamespace: String + name: String + onBehalfOfBusinessInfo: JSON + purchaseOrderNumber: String + status: String + timezoneId: String + messageTemplates(status: [FacebookBusinessStatusEnum!], nameOrContent: String, name: String, language: [String!], content: String, category: [FacebookBusinessCategoryEnum!], before: String, after: String, first: Int): FacebookBusinessJSONConnection! + phoneNumbers(before: String, after: String, first: Int): FacebookBusinessJSONConnection! +} + +"""""" +type FacebookBusinessVideoGameShow { + endTime: String + gameStatus: String + gameType: String + id: String + startTime: String +} + +"""""" +type FacebookBusinessSplitTestConfig { + budget: Int + earlyWinnerDeclarationEnabled: Boolean + endTime: String + splits: [Int] + startTime: String + testVariable: String + id: String +} + +"""""" +type FacebookBusinessSavedMessageResponse { + category: String + id: String + image: String + isEnabled: Boolean + message: String + title: String +} + +"""""" +type FacebookBusinessReferral { + id: String + inviteLimit: Int + messengerCta: String + messengerPromotionText: String + namespace: String + needPromoCode: Boolean + offerOrigin: String + promotionText: String + receiverBenefitsText: String + referralLinkUri: String + senderBenefitsText: String +} + +"""""" +type FacebookBusinessReadOnlyAnalyticsUserPropertyConfig { + activeProperties: [String] + id: String +} + +"""""" +type FacebookBusinessPageSavedFilter { + displayName: String + filters: [JSON] + id: String + pageId: String + section: String + timeCreated: Int + timeUpdated: Int +} + +"""""" +type FacebookBusinessOpenGraphObject { + admins: [JSON] + application: JSON + audio: [JSON] + createdTime: String + description: String + determiner: String + engagement: FacebookBusinessEngagement + id: String + image: [JSON] + isScraped: Boolean + locale: JSON + location: FacebookBusinessLocation + postActionId: String + profileId: JSON + restrictions: JSON + seeAlso: [String] + siteName: String + title: String + updatedTime: String + video: [JSON] + comments(since: String, order: FacebookBusinessOrderEnum, liveFilter: FacebookBusinessLiveFilterEnum, filter: FacebookBusinessFilterEnum, before: String, after: String, first: Int): FacebookBusinessCommentConnection! + reactions(type: FacebookBusinessTypeEnum, before: String, after: String, first: Int): FacebookBusinessProfileConnection! +} + +"""""" +type FacebookBusinessOpenGraphContext { + id: String + friendsTaggedAt(before: String, after: String, first: Int): FacebookBusinessUserConnection! + musicListenFriends(before: String, after: String, first: Int): FacebookBusinessUserConnection! + videoWatchFriends(before: String, after: String, first: Int): FacebookBusinessUserConnection! +} + +"""""" +type FacebookBusinessOfflineTermsOfService { + acceptTime: Int + id: String + signedByUser: FacebookBusinessUser +} + +"""""" +type FacebookBusinessMessengerPlatformReferral { + adId: String + id: String + ref: String + source: String +} + +"""""" +type FacebookBusinessMeasurementUploadEvent { + aggregationLevel: String + conversionEndDate: String + conversionStartDate: String + eventStatus: String + id: String + lookbackWindow: String + matchUniverse: String + partner: FacebookBusinessBusiness + timezone: String + uploadTag: String +} + +"""""" +type FacebookBusinessLink { + caption: String + createdTime: String + description: String + from: JSON + icon: String + id: String + link: String + message: String + multiShareOptimized: Boolean + name: String + privacy: FacebookBusinessPrivacy + via: JSON + likes(before: String, after: String, first: Int): FacebookBusinessProfileConnection! + reactions(type: FacebookBusinessTypeEnum, before: String, after: String, first: Int): FacebookBusinessProfileConnection! + sharedPosts(before: String, after: String, first: Int): FacebookBusinessPostConnection! +} + +"""""" +type FacebookBusinessLifeEvent { + description: String + endTime: String + from: FacebookBusinessPage + id: String + isHidden: Boolean + startTime: String + title: String + updatedTime: String + comments(since: String, order: FacebookBusinessOrderEnum, liveFilter: FacebookBusinessLiveFilterEnum, filter: FacebookBusinessFilterEnum, before: String, after: String, first: Int): FacebookBusinessCommentConnection! + likes(before: String, after: String, first: Int): FacebookBusinessProfileConnection! + photos(before: String, after: String, first: Int): FacebookBusinessPhotoConnection! + sharedPosts(before: String, after: String, first: Int): FacebookBusinessPostConnection! +} + +"""""" +type FacebookBusinessIterativeSplitTestConfig { + budget: Int + endTime: String + guidance: JSON + id: String + iterativeSplitTestOriginalVariantId: String + iterativeSplitTestVariantToSplitMapping: JSON + resultsWindow: JSON + splits: [Int] + startTime: String +} + +"""""" +type FacebookBusinessDynamicContentSet { + businessId: String + id: String + name: String +} + +"""""" +type FacebookBusinessDomain { + id: String + name: String + url: String +} + +"""""" +type FacebookBusinessDestinationCatalogSettings { + generateItemsFromPages: Boolean + id: String +} + +"""""" +type FacebookBusinessBusinessImage { + business: FacebookBusinessBusiness + creationTime: String + hash: String + height: Int + id: String + mediaLibraryUrl: String + name: String + url: String + url128: String + width: Int + adPlacementValidationResults(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + creativeAssetTags(businessId: String!, before: String, after: String, first: Int): FacebookBusinessCreativeAssetTagConnection! + insights(timeRangeJson: JSON, breakdowns: [FacebookBusinessBreakdownsEnum!], before: String, after: String, first: Int): FacebookBusinessJSONConnection! +} + +"""""" +type FacebookBusinessBrandAudience { + account: FacebookBusinessAdAccount + deliveryTargeting: FacebookBusinessTargeting + description: String + id: String + name: String + status: String + targeting: FacebookBusinessTargeting + timeCreated: String + timeUpdated: String +} + +"""""" +type FacebookBusinessAudioCopyright { + creationTime: String + displayedMatchesCount: Int + id: String + inConflict: Boolean + isrc: String + matchRule: FacebookBusinessVideoCopyrightRule + ownershipCountries: [String] + referenceFileStatus: String + ridgeMonitoringStatus: String + tags: [String] + updateTime: String + whitelistedFbUsers: [JSON] + whitelistedIgUsers: [String] +} + +"""""" +type FacebookBusinessAsyncSession { + app: FacebookBusinessApplication + completeTime: String + errorCode: Int + exception: String + id: String + method: String + name: String + page: FacebookBusinessPage + percentCompleted: Int + platformVersion: String + result: String + startTime: String + status: String + uri: String + user: FacebookBusinessUser +} + +"""""" +type FacebookBusinessAdsInterest { + audienceSize: Int + description: String + disambiguationCategory: String + id: String + name: String + path: [String] + topic: String +} + +enum FacebookBusinessAdgroupactivityObjectiveOld { + APP_INSTALLS + BRAND_AWARENESS + CANVAS_APP_ENGAGEMENT + CANVAS_APP_INSTALLS + EVENT_RESPONSES + LEAD_GENERATION + LINK_CLICKS + LOCAL_AWARENESS + MESSAGES + MOBILE_APP_ENGAGEMENT + MOBILE_APP_INSTALLS + NONE + OFFER_CLAIMS + PAGE_LIKES + POST_ENGAGEMENT + PRODUCT_CATALOG_SALES + VIDEO_VIEWS + WEBSITE_CONVERSIONS +} + +enum FacebookBusinessAdgroupactivityObjectiveNew { + APP_INSTALLS + BRAND_AWARENESS + CANVAS_APP_ENGAGEMENT + CANVAS_APP_INSTALLS + EVENT_RESPONSES + LEAD_GENERATION + LINK_CLICKS + LOCAL_AWARENESS + MESSAGES + MOBILE_APP_ENGAGEMENT + MOBILE_APP_INSTALLS + NONE + OFFER_CLAIMS + PAGE_LIKES + POST_ENGAGEMENT + PRODUCT_CATALOG_SALES + VIDEO_VIEWS + WEBSITE_CONVERSIONS +} + +"""""" +type FacebookBusinessAdgroupActivity { + adCreativeIdNew: String + adCreativeIdOld: String + assetFeedIdNew: String + assetFeedIdOld: String + bidAmountNew: Int + bidAmountOld: Int + bidInfoNew: JSON + bidInfoOld: JSON + bidTypeNew: String + bidTypeOld: String + conversionSpecsNew: [JSON] + conversionSpecsOld: [JSON] + createdTime: String + displaySequenceNew: Int + displaySequenceOld: Int + engagementAudienceNew: Boolean + engagementAudienceOld: Boolean + eventTime: String + eventType: String + forceRunStatusNew: Boolean + forceRunStatusOld: Boolean + friendlyNameNew: String + friendlyNameOld: String + id: String + isReviewerAdminNew: Boolean + isReviewerAdminOld: Boolean + objectiveNew: FacebookBusinessAdgroupactivityObjectiveNew + objectiveOld: FacebookBusinessAdgroupactivityObjectiveOld + objectiveSourceNew: String + objectiveSourceOld: String + priorityNew: Int + priorityOld: Int + reasonNew: String + reasonOld: String + runStatusNew: String + runStatusOld: String + sourceAdgroupIdNew: String + sourceAdgroupIdOld: String + startTimeNew: String + startTimeOld: String + stopTimeNew: String + stopTimeOld: String + targetSpecIdNew: String + targetSpecIdOld: String + trackingPixelIdsNew: [String] + trackingPixelIdsOld: [String] + trackingSpecsNew: [JSON] + trackingSpecsOld: [JSON] + updateTimeNew: String + updateTimeOld: String + viewTagsNew: [String] + viewTagsOld: [String] +} + +"""""" +type FacebookBusinessAdReportSpec { + accountId: String + actionsGroupBy: [String] + creationSource: String + dataColumns: [String] + datePreset: String + exportColumns: [String] + filters: [JSON] + formatVersion: Int + id: String + insightsSection: JSON + name: String + reportSchedule: JSON + reportScheduleId: String + sortBy: String + sortDir: String + timeIncrement: String + timeInterval: JSON + timeRanges: [JSON] +} + +"""""" +type FacebookBusinessAdReportRun { + accountId: String + asyncPercentCompletion: Int + asyncStatus: String + dateStart: String + dateStop: String + emails: [String] + friendlyName: String + id: String + isBookmarked: Boolean + isRunning: Boolean + scheduleId: String + timeCompleted: Int + timeRef: Int + insights(before: String, after: String, first: Int): FacebookBusinessAdsInsightsConnection! +} + +"""""" +type FacebookBusinessAdMonetizationProperty { + id: String + adNetworkAnalytics(until: String, since: String, orderingType: FacebookBusinessOrderingTypeEnum, orderingColumn: FacebookBusinessOrderingColumnEnum, metrics: [FacebookBusinessMetricsEnum!]!, filtersJson: [JSON!], breakdowns: [FacebookBusinessBreakdownsEnum!], aggregationPeriod: FacebookBusinessAggregationPeriodEnum, before: String, after: String, first: Int): FacebookBusinessAdNetworkAnalyticsSyncQueryResultConnection! + adNetworkAnalyticsResults(queryIds: [String!], before: String, after: String, first: Int): FacebookBusinessAdNetworkAnalyticsAsyncQueryResultConnection! +} + +enum FacebookBusinessAdcampaigngroupactivityObjectiveOld { + APP_INSTALLS + BRAND_AWARENESS + CANVAS_APP_ENGAGEMENT + CANVAS_APP_INSTALLS + EVENT_RESPONSES + LEAD_GENERATION + LINK_CLICKS + LOCAL_AWARENESS + MESSAGES + MOBILE_APP_ENGAGEMENT + MOBILE_APP_INSTALLS + NONE + OFFER_CLAIMS + PAGE_LIKES + POST_ENGAGEMENT + PRODUCT_CATALOG_SALES + VIDEO_VIEWS + WEBSITE_CONVERSIONS +} + +enum FacebookBusinessAdcampaigngroupactivityObjectiveNew { + APP_INSTALLS + BRAND_AWARENESS + CANVAS_APP_ENGAGEMENT + CANVAS_APP_INSTALLS + EVENT_RESPONSES + LEAD_GENERATION + LINK_CLICKS + LOCAL_AWARENESS + MESSAGES + MOBILE_APP_ENGAGEMENT + MOBILE_APP_INSTALLS + NONE + OFFER_CLAIMS + PAGE_LIKES + POST_ENGAGEMENT + PRODUCT_CATALOG_SALES + VIDEO_VIEWS + WEBSITE_CONVERSIONS +} + +"""""" +type FacebookBusinessAdCampaignGroupActivity { + budgetLimitNew: JSON + budgetLimitOld: JSON + buyingTypeNew: String + buyingTypeOld: String + eventTime: String + eventType: String + id: String + isAutobidNew: Boolean + isAutobidOld: Boolean + isAveragePricePacingNew: Boolean + isAveragePricePacingOld: Boolean + nameNew: String + nameOld: String + objectiveNew: FacebookBusinessAdcampaigngroupactivityObjectiveNew + objectiveOld: FacebookBusinessAdcampaigngroupactivityObjectiveOld + pacingType: Int + runStatusNew: String + runStatusOld: String + spendCapNew: Int + spendCapOld: Int + timeCreated: String + timeUpdatedNew: String + timeUpdatedOld: String +} + +enum FacebookBusinessAdcampaignactivityOptimizationGoalOld { + AD_RECALL_LIFT + APP_DOWNLOADS + APP_INSTALLS + BRAND_AWARENESS + CLICKS + DERIVED_EVENTS + ENGAGED_USERS + EVENT_RESPONSES + IMPRESSIONS + LANDING_PAGE_VIEWS + LEAD_GENERATION + LINK_CLICKS + NONE + OFFER_CLAIMS + OFFSITE_CONVERSIONS + PAGE_ENGAGEMENT + PAGE_LIKES + POST_ENGAGEMENT + REACH + REPLIES + SOCIAL_IMPRESSIONS + THRUPLAY + TWO_SECOND_CONTINUOUS_VIDEO_VIEWS + VALUE + VISIT_INSTAGRAM_PROFILE +} + +enum FacebookBusinessAdcampaignactivityOptimizationGoalNew { + AD_RECALL_LIFT + APP_DOWNLOADS + APP_INSTALLS + BRAND_AWARENESS + CLICKS + DERIVED_EVENTS + ENGAGED_USERS + EVENT_RESPONSES + IMPRESSIONS + LANDING_PAGE_VIEWS + LEAD_GENERATION + LINK_CLICKS + NONE + OFFER_CLAIMS + OFFSITE_CONVERSIONS + PAGE_ENGAGEMENT + PAGE_LIKES + POST_ENGAGEMENT + REACH + REPLIES + SOCIAL_IMPRESSIONS + THRUPLAY + TWO_SECOND_CONTINUOUS_VIDEO_VIEWS + VALUE + VISIT_INSTAGRAM_PROFILE +} + +enum FacebookBusinessAdcampaignactivityBillingEventOld { + APP_INSTALLS + CLICKS + IMPRESSIONS + LINK_CLICKS + NONE + OFFER_CLAIMS + PAGE_LIKES + POST_ENGAGEMENT + THRUPLAY +} + +enum FacebookBusinessAdcampaignactivityBillingEventNew { + APP_INSTALLS + CLICKS + IMPRESSIONS + LINK_CLICKS + NONE + OFFER_CLAIMS + PAGE_LIKES + POST_ENGAGEMENT + THRUPLAY +} + +enum FacebookBusinessAdcampaignactivityBidStrategyOld { + COST_CAP + LOWEST_COST_WITHOUT_CAP + LOWEST_COST_WITH_BID_CAP + TARGET_COST +} + +enum FacebookBusinessAdcampaignactivityBidStrategyNew { + COST_CAP + LOWEST_COST_WITHOUT_CAP + LOWEST_COST_WITH_BID_CAP + TARGET_COST +} + +"""""" +type FacebookBusinessAdCampaignActivity { + autoCreateLookalikeNew: Boolean + autoCreateLookalikeOld: Boolean + bidAdjustmentsSpecNew: String + bidAdjustmentsSpecOld: String + bidAmountNew: Int + bidAmountOld: Int + bidConstraintsNew: JSON + bidConstraintsOld: JSON + bidInfoNew: JSON + bidInfoOld: JSON + bidStrategyNew: FacebookBusinessAdcampaignactivityBidStrategyNew + bidStrategyOld: FacebookBusinessAdcampaignactivityBidStrategyOld + bidTypeNew: String + bidTypeOld: String + billingEventNew: FacebookBusinessAdcampaignactivityBillingEventNew + billingEventOld: FacebookBusinessAdcampaignactivityBillingEventOld + brandeAudienceIdNew: String + brandeAudienceIdOld: String + budgetLimitNew: JSON + budgetLimitOld: JSON + createdTime: String + dailyImpressionsNew: Int + dailyImpressionsOld: Int + dcoModeNew: String + dcoModeOld: String + deliveryBehaviorNew: String + deliveryBehaviorOld: String + destinationTypeNew: String + destinationTypeOld: String + eventTime: String + eventType: String + id: String + invoicingLimitNew: Int + invoicingLimitOld: Int + minSpendTargetNew: JSON + minSpendTargetOld: JSON + nameNew: String + nameOld: String + optimizationGoalNew: FacebookBusinessAdcampaignactivityOptimizationGoalNew + optimizationGoalOld: FacebookBusinessAdcampaignactivityOptimizationGoalOld + pacingTypeNew: Int + pacingTypeOld: Int + runStatusNew: String + runStatusOld: String + scheduleNew: [JSON] + scheduleOld: [JSON] + spendCapNew: JSON + spendCapOld: JSON + startTimeNew: String + startTimeOld: String + stopTimeNew: String + stopTimeOld: String + targetingExpansionNew: JSON + targetingExpansionOld: JSON + updatedTimeNew: String + updatedTimeOld: String +} + +"""""" +type FacebookBusinessAdAccountActivity { + billingAddressNew: String + billingAddressOld: String + createdBy: String + createdTime: String + creditNew: JSON + creditOld: JSON + currencyNew: String + currencyOld: String + dailySpendLimitNew: JSON + dailySpendLimitOld: JSON + eventTime: String + eventType: String + fundingIdNew: String + fundingIdOld: String + gracePeriodTimeNew: Int + gracePeriodTimeOld: Int + id: String + managerIdNew: String + managerIdOld: String + nameNew: String + nameOld: String + spendCapNew: JSON + spendCapOld: JSON + statusNew: String + statusOld: String + termsNew: Int + termsOld: Int + tierNew: String + tierOld: String + timeUpdatedNew: String + timeUpdatedOld: String +} + +"""""" +type FacebookBusinessUserTaggableFriend { + firstName: String + id: String + lastName: String + middleName: String + name: String + picture(width: Int, type: FacebookBusinessTypeEnum, redirect: Boolean, height: Int, before: String, after: String, first: Int): FacebookBusinessProfilePictureSourceConnection! +} + +type FacebookBusinessUserTaggableFriendConnection { + nodes: [FacebookBusinessUserTaggableFriend!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessRequesthistoryHttpMethod { + DELETE + GET + POST +} + +"""""" +type FacebookBusinessRequestHistory { + apiVersion: String + createdTime: String + errorCode: Int + graphPath: String + httpMethod: FacebookBusinessRequesthistoryHttpMethod + postParams: JSON + queryParams: JSON +} + +type FacebookBusinessRequestHistoryConnection { + nodes: [FacebookBusinessRequestHistory!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPermission { + permission: String + status: String +} + +type FacebookBusinessPermissionConnection { + nodes: [FacebookBusinessPermission!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessUserIDForPage { + id: String + page: FacebookBusinessPage +} + +type FacebookBusinessUserIDForPageConnection { + nodes: [FacebookBusinessUserIDForPage!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessUserIDForApp { + app: FacebookBusinessApplication + id: String +} + +type FacebookBusinessUserIDForAppConnection { + nodes: [FacebookBusinessUserIDForApp!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessFriendList { + id: String + listType: String + name: String + owner: String +} + +type FacebookBusinessFriendListConnection { + nodes: [FacebookBusinessFriendList!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAppRequest { + actionType: String + application: FacebookBusinessApplication + createdTime: String + data: String + from: JSON + id: String + message: String + object: JSON + to: JSON +} + +type FacebookBusinessAppRequestConnection { + nodes: [FacebookBusinessAppRequest!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAppRequestFormerRecipient { + id: String + recipientId: String +} + +type FacebookBusinessAppRequestFormerRecipientConnection { + nodes: [FacebookBusinessAppRequestFormerRecipient!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessVideoUploadLimits { + length: Int + size: Int +} + +"""""" +type FacebookBusinessSecuritySettings { + secureBrowsing: JSON +} + +"""""" +type FacebookBusinessPaymentPricepoints { + mobile: [JSON] +} + +"""""" +type FacebookBusinessExperience { + description: String + from: FacebookBusinessUser + id: String + name: String + with: [FacebookBusinessUser] +} + +"""""" +type FacebookBusinessUserDevice { + hardware: String + os: String +} + +"""""" +type FacebookBusinessCurrency { + currencyOffset: Int + usdExchange: Float + usdExchangeInverse: Float + userCurrency: String +} + +"""""" +type FacebookBusinessUserCoverPhoto { + offsetX: Float + offsetY: Float + source: String +} + +"""""" +type FacebookBusinessAgeRange { + max: Int + min: Int +} + +"""""" +type FacebookBusinessVideoList { + creationTime: String + description: String + id: String + lastModified: String + owner: JSON + seasonNumber: Int + thumbnail: String + title: String + videosCount: Int + videos(before: String, after: String, first: Int): FacebookBusinessAdVideoConnection! +} + +type FacebookBusinessVideoListConnection { + nodes: [FacebookBusinessVideoList!]! + pageInfo: PageInfo! +} + +type FacebookBusinessVideoCopyrightRuleConnection { + nodes: [FacebookBusinessVideoCopyrightRule!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPageChangeProposal { + acceptanceStatus: String + category: String + currentValue: String + id: String + proposedValue: String + upcomingChangeInfo: FacebookBusinessPageUpcomingChange +} + +"""""" +type FacebookBusinessPageUpcomingChange { + changeType: String + effectiveTime: String + id: String + page: FacebookBusinessPage + proposal: FacebookBusinessPageChangeProposal + timerStatus: String +} + +type FacebookBusinessPageUpcomingChangeConnection { + nodes: [FacebookBusinessPageUpcomingChange!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessEventTour { + description: String + dominantColor: String + endTime: String + id: String + isPast: Boolean + lastEventTimestamp: Int + name: String + numEvents: Int + photo: FacebookBusinessPhoto + publishingState: String + scheduledPublishTimestamp: Int + startTime: String + ticketingUri: String + video: FacebookBusinessAdVideo + events(before: String, after: String, first: Int): FacebookBusinessEventConnection! + pages(before: String, after: String, first: Int): FacebookBusinessPageConnection! +} + +type FacebookBusinessEventTourConnection { + nodes: [FacebookBusinessEventTour!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPageThreadOwner { + threadOwner: JSON +} + +type FacebookBusinessPageThreadOwnerConnection { + nodes: [FacebookBusinessPageThreadOwner!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessTab { + application: FacebookBusinessApplication + customImageUrl: String + customName: String + id: String + imageUrl: String + isNonConnectionLandingTab: Boolean + isPermanent: Boolean + link: String + name: String + position: Int +} + +type FacebookBusinessTabConnection { + nodes: [FacebookBusinessTab!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPageSettings { + setting: String + value: JSON +} + +type FacebookBusinessPageSettingsConnection { + nodes: [FacebookBusinessPageSettings!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessRecommendation { + createdTime: String + hasRating: Boolean + hasReview: Boolean + openGraphStory: JSON + rating: Int + recommendationType: String + reviewText: String + reviewer: FacebookBusinessUser +} + +type FacebookBusinessRecommendationConnection { + nodes: [FacebookBusinessRecommendation!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPlaceTopic { + count: Int + hasChildren: Boolean + iconUrl: String + id: String + name: String + parentIds: [String] + pluralName: String + topSubtopicNames: [String] +} + +type FacebookBusinessPlaceTopicConnection { + nodes: [FacebookBusinessPlaceTopic!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPersona { + id: String + name: String + profilePictureUrl: String +} + +type FacebookBusinessPersonaConnection { + nodes: [FacebookBusinessPersona!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessNativeOfferView { + id: String + offer: FacebookBusinessNativeOffer + saveCount: Int + photos(before: String, after: String, first: Int): FacebookBusinessPhotoConnection! +} + +type FacebookBusinessNativeOfferViewConnection { + nodes: [FacebookBusinessNativeOfferView!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessNativeOfferDiscount { + currency: String + override: String + text: String + value1: Float + value2: Float +} + +"""""" +type FacebookBusinessNativeOffer { + barcodePhoto: String + barcodePhotoUri: String + barcodeType: String + barcodeValue: String + blockReshares: Boolean + details: String + disableLocation: Boolean + discounts: [FacebookBusinessNativeOfferDiscount] + expirationTime: String + id: String + instoreCode: String + locationType: String + maxSaveCount: Int + onlineCode: String + page: FacebookBusinessPage + pageSetId: String + redemptionCode: String + redemptionLink: String + saveCount: Int + terms: String + title: String + totalUniqueCodes: String + uniqueCodes: String + uniqueCodesFileCodeType: String + uniqueCodesFileName: String + uniqueCodesFileUploadStatus: String + views(before: String, after: String, first: Int): FacebookBusinessNativeOfferViewConnection! +} + +type FacebookBusinessNativeOfferConnection { + nodes: [FacebookBusinessNativeOffer!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessMessengerProfile { + accountLinkingUrl: String + getStarted: JSON + greeting: [JSON] + homeUrl: JSON + iceBreakers: [JSON] + paymentSettings: JSON + persistentMenu: [JSON] + targetAudience: JSON + whitelistedDomains: [String] +} + +type FacebookBusinessMessengerProfileConnection { + nodes: [FacebookBusinessMessengerProfile!]! + pageInfo: PageInfo! +} + +type FacebookBusinessMessengerDestinationPageWelcomeMessageConnection { + nodes: [FacebookBusinessMessengerDestinationPageWelcomeMessage!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessMessagingFeatureReview { + feature: String + status: String +} + +type FacebookBusinessMessagingFeatureReviewConnection { + nodes: [FacebookBusinessMessagingFeatureReview!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessMediaFingerprint { + durationInSec: Float + fingerprintContentType: String + fingerprintType: String + id: String + metadata: JSON + title: String + universalContentId: String +} + +type FacebookBusinessMediaFingerprintConnection { + nodes: [FacebookBusinessMediaFingerprint!]! + pageInfo: PageInfo! +} + +type FacebookBusinessLiveEncoderConnection { + nodes: [FacebookBusinessLiveEncoder!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessLeadGenQuestionOption { + key: String + value: String +} + +"""""" +type FacebookBusinessLeadGenConditionalQuestionsGroupQuestions { + fieldKey: String + inputType: String + name: String +} + +"""""" +type FacebookBusinessLeadGenConditionalQuestionsGroupChoices { + customizedToken: String + nextQuestionChoices: [FacebookBusinessLeadGenConditionalQuestionsGroupChoices] + value: String +} + +"""""" +type FacebookBusinessLeadGenQuestion { + conditionalQuestionsChoices: [FacebookBusinessLeadGenConditionalQuestionsGroupChoices] + conditionalQuestionsGroupId: String + dependentConditionalQuestions: [FacebookBusinessLeadGenConditionalQuestionsGroupQuestions] + id: String + inlineContext: String + key: String + label: String + options: [FacebookBusinessLeadGenQuestionOption] +} + +"""""" +type FacebookBusinessLeadgenForm { + allowOrganicLead: Boolean + blockDisplayForNonTargetedViewer: Boolean + contextCard: JSON + createdTime: String + expiredLeadsCount: Int + followUpActionText: String + followUpActionUrl: String + id: String + isOptimizedForQuality: Boolean + leadsCount: Int + legalContent: JSON + locale: String + name: String + organicLeadsCount: Int + page: FacebookBusinessPage + pageId: String + privacyPolicyUrl: String + questionPageCustomHeadline: String + questions: [FacebookBusinessLeadGenQuestion] + status: String + thankYouPage: JSON + trackingParameters: JSON + leads(before: String, after: String, first: Int): FacebookBusinessLeadConnection! + testLeads(before: String, after: String, first: Int): FacebookBusinessLeadConnection! +} + +type FacebookBusinessLeadgenFormConnection { + nodes: [FacebookBusinessLeadgenForm!]! + pageInfo: PageInfo! +} + +type FacebookBusinessInstantArticleConnection { + nodes: [FacebookBusinessInstantArticle!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessWithEnum { + LOCATION +} + +enum FacebookBusinessTimeFilterEnum { + PAST + UPCOMING +} + +enum FacebookBusinessEventStateFilterEnum { + CANCELED + DRAFT + PUBLISHED + SCHEDULED_DRAFT_FOR_PUBLICATION +} + +"""""" +type FacebookBusinessCustomUserSettings { + pageLevelPersistentMenu: [JSON] + userLevelPersistentMenu: [JSON] +} + +type FacebookBusinessCustomUserSettingsConnection { + nodes: [FacebookBusinessCustomUserSettings!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPageUserMessageThreadLabel { + id: String + name: String +} + +type FacebookBusinessPageUserMessageThreadLabelConnection { + nodes: [FacebookBusinessPageUserMessageThreadLabel!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessUnifiedThread { + canReply: Boolean + formerParticipants: JSON + id: String + isSubscribed: Boolean + link: String + messageCount: Int + name: String + participants: JSON + scopedThreadKey: String + senders: JSON + snippet: String + subject: String + unreadCount: Int + updatedTime: String + wallpaper: String + messages(source: FacebookBusinessSourceEnum, before: String, after: String, first: Int): FacebookBusinessJSONConnection! +} + +type FacebookBusinessUnifiedThreadConnection { + nodes: [FacebookBusinessUnifiedThread!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessBreakdownEnum { + AGE + COUNTRY + GENDER + GENDER_AND_AGE + IS_ORGANIC + IS_SHARED_BY_IA_OWNER + NO_BREAKDOWN + PLATFORM + REGION +} + +"""""" +type FacebookBusinessInstantArticleInsightsQueryResult { + breakdowns: JSON + name: String + time: String + value: String +} + +type FacebookBusinessInstantArticleInsightsQueryResultConnection { + nodes: [FacebookBusinessInstantArticleInsightsQueryResult!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessInstantArticle { + canonicalUrl: String + developmentMode: Boolean + htmlSource: String + id: String + mostRecentImportStatus: JSON + photos: [JSON] + publishStatus: String + published: Boolean + videos: [JSON] + insights(until: String, since: String, period: FacebookBusinessPeriodEnum!, metricJson: [JSON!]!, breakdown: FacebookBusinessBreakdownEnum, before: String, after: String, first: Int): FacebookBusinessInstantArticleInsightsQueryResultConnection! +} + +"""""" +type FacebookBusinessURL { + developmentInstantArticle: FacebookBusinessInstantArticle + engagement: JSON + id: String + instantArticle: FacebookBusinessInstantArticle + ogObject: JSON + ownershipPermissions: JSON + scopes: JSON +} + +type FacebookBusinessURLConnection { + nodes: [FacebookBusinessURL!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessCanvas { + backgroundColor: String + bodyElements: [JSON] + canvasLink: String + id: String + isHidden: Boolean + isPublished: Boolean + lastEditor: FacebookBusinessUser + name: String + owner: FacebookBusinessPage + updateTime: Int +} + +type FacebookBusinessCanvasConnection { + nodes: [FacebookBusinessCanvas!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessCanvasBodyElement { + element: JSON +} + +type FacebookBusinessCanvasBodyElementConnection { + nodes: [FacebookBusinessCanvasBodyElement!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPageCallToAction { + androidApp: FacebookBusinessApplication + androidDeeplink: String + androidDestinationType: String + androidPackageName: String + androidUrl: String + createdTime: String + emailAddress: String + from: FacebookBusinessPage + id: String + intlNumberWithPlus: String + iphoneApp: FacebookBusinessApplication + iphoneDeeplink: String + iphoneDestinationType: String + iphoneUrl: String + status: String + updatedTime: String + webDestinationType: String + webUrl: String +} + +type FacebookBusinessPageCallToActionConnection { + nodes: [FacebookBusinessPageCallToAction!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPagePost { + adminCreator: JSON + allowedAdvertisingObjectives: [String] + application: FacebookBusinessApplication + backdatedTime: String + callToAction: JSON + canReplyPrivately: Boolean + commentsMirroringDomain: String + coordinates: JSON + createdTime: String + event: FacebookBusinessEvent + expandedHeight: Int + expandedWidth: Int + feedTargeting: JSON + from: JSON + fullPicture: String + height: Int + icon: String + id: String + instagramEligibility: String + isAppShare: Boolean + isEligibleForPromotion: Boolean + isExpired: Boolean + isHidden: Boolean + isInstagramEligible: Boolean + isPopular: Boolean + isPublished: Boolean + isSpherical: Boolean + message: String + multiShareEndCard: Boolean + multiShareOptimized: Boolean + parentId: String + permalinkUrl: JSON + picture: String + place: FacebookBusinessPlace + privacy: FacebookBusinessPrivacy + promotableId: String + promotionStatus: String + scheduledPublishTime: Float + shares: JSON + statusType: String + story: String + subscribed: Boolean + target: FacebookBusinessProfile + targeting: JSON + timelineVisibility: String + updatedTime: String + via: JSON + videoBuyingEligibility: [String] + width: Int + attachments(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + comments(since: String, order: FacebookBusinessOrderEnum, liveFilter: FacebookBusinessLiveFilterEnum, filter: FacebookBusinessFilterEnum, before: String, after: String, first: Int): FacebookBusinessCommentConnection! + dynamicPosts(before: String, after: String, first: Int): FacebookBusinessRTBDynamicPostConnection! + insights(until: String, since: String, period: FacebookBusinessPeriodEnum, metricJson: [JSON!], datePreset: FacebookBusinessDatePresetEnum, before: String, after: String, first: Int): FacebookBusinessInsightsResultConnection! + likes(before: String, after: String, first: Int): FacebookBusinessProfileConnection! + reactions(type: FacebookBusinessTypeEnum, before: String, after: String, first: Int): FacebookBusinessProfileConnection! + sharedPosts(before: String, after: String, first: Int): FacebookBusinessPostConnection! + sponsorTags(before: String, after: String, first: Int): FacebookBusinessPageConnection! + to(before: String, after: String, first: Int): FacebookBusinessProfileConnection! +} + +type FacebookBusinessPagePostConnection { + nodes: [FacebookBusinessPagePost!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessVoipInfo { + hasMobileApp: Boolean + hasPermission: Boolean + isCallable: Boolean + isCallableWebrtc: Boolean + isPushable: Boolean + reasonCode: Int + reasonDescription: String +} + +"""""" +type FacebookBusinessPageStartInfo { + date: JSON +} + +"""""" +type FacebookBusinessPageRestaurantSpecialties { + breakfast: Int + coffee: Int + dinner: Int + drinks: Int + lunch: Int +} + +"""""" +type FacebookBusinessPageRestaurantServices { + catering: Boolean + delivery: Boolean + groups: Boolean + kids: Boolean + outdoor: Boolean + pickup: Boolean + reserve: Boolean + takeout: Boolean + waiter: Boolean + walkins: Boolean +} + +"""""" +type FacebookBusinessPagePaymentOptions { + amex: Int + cashOnly: Int + discover: Int + mastercard: Int + visa: Int +} + +"""""" +type FacebookBusinessPageParking { + lot: Int + street: Int + valet: Int +} + +"""""" +type FacebookBusinessPageAboutStory { + composedText: [JSON] + coverPhoto: FacebookBusinessPhoto + entityMap: [JSON] + id: String + isPublished: Boolean + pageId: String + title: String +} + +"""""" +type FacebookBusinessMessengerDestinationPageWelcomeMessage { + id: String + pageWelcomeMessageBody: String + pageWelcomeMessageType: String + templateName: String + timeCreated: String + timeLastUsed: String +} + +"""""" +type FacebookBusinessEngagement { + count: Int + countString: String + countStringWithLike: String + countStringWithoutLike: String + socialSentence: String + socialSentenceWithLike: String + socialSentenceWithoutLike: String +} + +"""""" +type FacebookBusinessMailingAddress { + city: String + cityPage: FacebookBusinessPage + country: String + id: String + postalCode: String + region: String + street1: String + street2: String +} + +enum FacebookBusinessMetricEnum { + CAROUSEL_ALBUM_ENGAGEMENT + CAROUSEL_ALBUM_IMPRESSIONS + CAROUSEL_ALBUM_REACH + CAROUSEL_ALBUM_SAVED + CAROUSEL_ALBUM_VIDEO_VIEWS + ENGAGEMENT + EXITS + IMPRESSIONS + REACH + REPLIES + SAVED + TAPS_BACK + TAPS_FORWARD + VIDEO_VIEWS +} + +"""""" +type FacebookBusinessInstagramInsightsValue { + endTime: String + value: JSON +} + +"""""" +type FacebookBusinessInstagramInsightsResult { + description: String + id: String + name: String + period: String + title: String + values: [FacebookBusinessInstagramInsightsValue] +} + +type FacebookBusinessInstagramInsightsResultConnection { + nodes: [FacebookBusinessInstagramInsightsResult!]! + pageInfo: PageInfo! +} + +type FacebookBusinessIGCommentConnection { + nodes: [FacebookBusinessIGComment!]! + pageInfo: PageInfo! +} + +type FacebookBusinessIGMediaConnection { + nodes: [FacebookBusinessIGMedia!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessIGMedia { + caption: String + commentsCount: Int + id: String + igId: String + isCommentEnabled: Boolean + likeCount: Int + mediaType: String + mediaUrl: String + owner: FacebookBusinessIGUser + permalink: String + shortcode: String + thumbnailUrl: String + timestamp: String + username: String + children(before: String, after: String, first: Int): FacebookBusinessIGMediaConnection! + comments(before: String, after: String, first: Int): FacebookBusinessIGCommentConnection! + insights(period: [FacebookBusinessPeriodEnum!], metric: [FacebookBusinessMetricEnum!]!, before: String, after: String, first: Int): FacebookBusinessInstagramInsightsResultConnection! +} + +"""""" +type FacebookBusinessIGComment { + hidden: Boolean + id: String + likeCount: Int + media: FacebookBusinessIGMedia + text: String + timestamp: String + user: FacebookBusinessIGUser + username: String + replies(before: String, after: String, first: Int): FacebookBusinessIGCommentConnection! +} + +"""""" +type FacebookBusinessIGUser { + biography: String + businessDiscovery: FacebookBusinessIGUser + followersCount: Int + followsCount: Int + id: String + igId: Int + mediaCount: Int + mentionedComment: FacebookBusinessIGComment + mentionedMedia: FacebookBusinessIGMedia + name: String + profilePictureUrl: String + username: String + website: String + insights(until: String, since: String, period: [FacebookBusinessPeriodEnum!]!, metric: [FacebookBusinessMetricEnum!]!, before: String, after: String, first: Int): FacebookBusinessInstagramInsightsResultConnection! + media(before: String, after: String, first: Int): FacebookBusinessIGMediaConnection! + recentlySearchedHashtags(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + stories(before: String, after: String, first: Int): FacebookBusinessIGMediaConnection! + tags(before: String, after: String, first: Int): FacebookBusinessIGMediaConnection! +} + +"""""" +type FacebookBusinessPageCategory { + apiEnum: String + fbPageCategories: [FacebookBusinessPageCategory] + id: String + name: String +} + +"""""" +type FacebookBusinessAdCampaignDeliveryEstimate { + dailyOutcomesCurve: [FacebookBusinessOutcomePredictionPoint] + estimateDau: Int + estimateMau: Int + estimateReady: Boolean +} + +type FacebookBusinessAdCampaignDeliveryEstimateConnection { + nodes: [FacebookBusinessAdCampaignDeliveryEstimate!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessAdsetStatus { + ACTIVE + ARCHIVED + DELETED + PAUSED +} + +enum FacebookBusinessAdsetOptimizationGoal { + AD_RECALL_LIFT + APP_DOWNLOADS + APP_INSTALLS + BRAND_AWARENESS + CLICKS + DERIVED_EVENTS + ENGAGED_USERS + EVENT_RESPONSES + IMPRESSIONS + LANDING_PAGE_VIEWS + LEAD_GENERATION + LINK_CLICKS + NONE + OFFER_CLAIMS + OFFSITE_CONVERSIONS + PAGE_ENGAGEMENT + PAGE_LIKES + POST_ENGAGEMENT + REACH + REPLIES + SOCIAL_IMPRESSIONS + THRUPLAY + TWO_SECOND_CONTINUOUS_VIDEO_VIEWS + VALUE + VISIT_INSTAGRAM_PROFILE +} + +"""""" +type FacebookBusinessAdCampaignLearningStageInfo { + attributionWindows: [String] + conversions: Int + lastSigEditTs: Int + status: String +} + +"""""" +type FacebookBusinessAdCampaignFrequencyControlSpecs { + event: String + intervalDays: Int + maxFrequency: Int +} + +enum FacebookBusinessAdsetEffectiveStatus { + ACTIVE + ARCHIVED + CAMPAIGN_PAUSED + DELETED + IN_PROCESS + PAUSED + WITH_ISSUES +} + +enum FacebookBusinessAdsetConfiguredStatus { + ACTIVE + ARCHIVED + DELETED + PAUSED +} + +enum FacebookBusinessAdsetBillingEvent { + APP_INSTALLS + CLICKS + IMPRESSIONS + LINK_CLICKS + NONE + OFFER_CLAIMS + PAGE_LIKES + POST_ENGAGEMENT + THRUPLAY +} + +enum FacebookBusinessAdsetBidStrategy { + COST_CAP + LOWEST_COST_WITHOUT_CAP + LOWEST_COST_WITH_BID_CAP + TARGET_COST +} + +"""""" +type FacebookBusinessAdCampaignBidConstraint { + roasAverageFloor: Int +} + +"""""" +type FacebookBusinessAdBidAdjustments { + ageRange: JSON + pageTypes: JSON + userGroups: String +} + +"""""" +type FacebookBusinessDayPart { + days: [Int] + endMinute: Int + startMinute: Int + timezoneType: String +} + +"""""" +type FacebookBusinessAdAccountUser { + id: String + name: String + tasks: [String] +} + +type FacebookBusinessAdAccountUserConnection { + nodes: [FacebookBusinessAdAccountUser!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdAccountTrackingData { + trackingSpecs: FacebookBusinessConversionActionQuery +} + +type FacebookBusinessAdAccountTrackingDataConnection { + nodes: [FacebookBusinessAdAccountTrackingData!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessObjectiveEnum { + APP_INSTALLS + BRAND_AWARENESS + CONVERSIONS + EVENT_RESPONSES + LEAD_GENERATION + LINK_CLICKS + LOCAL_AWARENESS + MESSAGES + OFFER_CLAIMS + PAGE_LIKES + POST_ENGAGEMENT + PRODUCT_CATALOG_SALES + REACH + VIDEO_VIEWS +} + +enum FacebookBusinessModeEnum { + BEST_PERFORMING + RECENTLY_USED + RELATED + SUGGESTIONS +} + +enum FacebookBusinessWhitelistedTypesEnum { + ADGROUP_ID + AGE_MAX + AGE_MIN + ALTERNATE_AUTO_TARGETING_OPTION + APP_INSTALL_STATE + AUDIENCE_NETWORK_POSITIONS + BEHAVIORS + BRAND_SAFETY_CONTENT_FILTER_LEVELS + BRAND_SAFETY_CONTENT_SEVERITY_LEVELS + CATALOG_BASED_TARGETING + CITIES + CITY_KEYS + COLLEGE_YEARS + CONJUNCTIVE_USER_ADCLUSTERS + CONNECTIONS + CONTEXTUAL_TARGETING_CATEGORIES + COUNTRIES + COUNTRY + COUNTRY_GROUPS + CUSTOM_AUDIENCES + DEVICE_PLATFORMS + DIRECT_INSTALL_DEVICES + DYNAMIC_AUDIENCE_IDS + EDUCATION_MAJORS + EDUCATION_SCHOOLS + EDUCATION_STATUSES + EFFECTIVE_AUDIENCE_NETWORK_POSITIONS + EFFECTIVE_DEVICE_PLATFORMS + EFFECTIVE_FACEBOOK_POSITIONS + EFFECTIVE_INSTAGRAM_POSITIONS + EFFECTIVE_MESSENGER_POSITIONS + EFFECTIVE_PUBLISHER_PLATFORMS + EFFECTIVE_WHATSAPP_POSITIONS + ENGAGEMENT_SPECS + ETHNIC_AFFINITY + EXCLUDE_PREVIOUS_DAYS + EXCLUDE_REACHED_SINCE + EXCLUDED_BRAND_SAFETY_CONTENT_TYPES + EXCLUDED_CONNECTIONS + EXCLUDED_CUSTOM_AUDIENCES + EXCLUDED_DYNAMIC_AUDIENCE_IDS + EXCLUDED_ENGAGEMENT_SPECS + EXCLUDED_GEO_LOCATIONS + EXCLUDED_MOBILE_DEVICE_MODEL + EXCLUDED_PRODUCT_AUDIENCE_SPECS + EXCLUDED_PUBLISHER_CATEGORIES + EXCLUDED_PUBLISHER_LIST_IDS + EXCLUDED_USER_ADCLUSTERS + EXCLUDED_USER_DEVICE + EXCLUSIONS + FACEBOOK_POSITIONS + FAMILY_STATUSES + FB_DEAL_ID + FLEXIBLE_SPEC + FOLLOW_PROFILES + FOLLOW_PROFILES_NEGATIVE + FORMAT + FRIENDS_OF_CONNECTIONS + GATEKEEPERS + GENDERS + GENERATION + GEO_LOCATIONS + HOME_OWNERSHIP + HOME_TYPE + HOME_VALUE + HOUSEHOLD_COMPOSITION + ID + INCOME + INDUSTRIES + INSTAGRAM_HASHTAGS + INSTAGRAM_POSITIONS + INSTREAM_VIDEO_SPONSORSHIP_PLACEMENTS + INTEREST_DEFAULTS_SOURCE + INTERESTED_IN + INTERESTS + IS_INSTAGRAM_DESTINATION_AD + IS_WHATSAPP_DESTINATION_AD + KEYWORDS + LIFE_EVENTS + LOCALES + LOCATION_CATEGORIES + LOCATION_CLUSTER_IDS + LOCATION_EXPANSION + MARKETPLACE_PRODUCT_CATEGORIES + MESSENGER_POSITIONS + MOBILE_DEVICE_MODEL + MOMS + NET_WORTH + OFFICE_TYPE + PAGE_TYPES + PLACE_PAGE_SET_IDS + POLITICAL_VIEWS + POLITICS + PRODUCT_AUDIENCE_SPECS + PROSPECTING_AUDIENCE + PUBLISHER_PLATFORMS + RADIUS + REGION_KEYS + REGIONS + RELATIONSHIP_STATUSES + RTB_FLAG + SITE_CATEGORY + TARGETING_OPTIMIZATION + TIMEZONES + TOPIC + TRENDING + USER_ADCLUSTERS + USER_DEVICE + USER_EVENT + USER_OS + USER_PAGE_THREADS + USER_PAGE_THREADS_EXCLUDED + WHATSAPP_POSITIONS + WIRELESS_CARRIER + WORK_EMPLOYERS + WORK_POSITIONS + ZIPS +} + +enum FacebookBusinessRegulatedCategoriesEnum { + CREDIT + EMPLOYMENT + HOUSING + NONE +} + +enum FacebookBusinessLimitTypeEnum { + BEHAVIORS + COLLEGE_YEARS + EDUCATION_MAJORS + EDUCATION_SCHOOLS + EDUCATION_STATUSES + ETHNIC_AFFINITY + FAMILY_STATUSES + GENERATION + HOME_OWNERSHIP + HOME_TYPE + HOME_VALUE + HOUSEHOLD_COMPOSITION + INCOME + INDUSTRIES + INTERESTED_IN + INTERESTS + LIFE_EVENTS + LOCATION_CATEGORIES + MOMS + NET_WORTH + OFFICE_TYPE + POLITICS + RELATIONSHIP_STATUSES + USER_ADCLUSTERS + WORK_EMPLOYERS + WORK_POSITIONS +} + +"""""" +type FacebookBusinessAdAccountTargetingUnified { + audienceSize: Int + conversionLift: Float + description: String + id: String + img: String + info: String + infoTitle: String + isRecommendation: Boolean + key: String + link: String + name: String + parent: String + partner: String + path: [String] + performanceRating: Int + rawName: String + recommendationModel: String + searchInterestId: String + source: String + spend: Float + valid: Boolean +} + +type FacebookBusinessAdAccountTargetingUnifiedConnection { + nodes: [FacebookBusinessAdAccountTargetingUnified!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdAccountSubscribedApps { + appId: String + appName: String +} + +type FacebookBusinessAdAccountSubscribedAppsConnection { + nodes: [FacebookBusinessAdAccountSubscribedApps!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessSavedAudience { + account: FacebookBusinessAdAccount + approximateCount: Int + description: String + extraInfo: String + id: String + name: String + permissionForActions: FacebookBusinessAudiencePermissionForActions + runStatus: String + targeting: FacebookBusinessTargeting + timeCreated: String + timeUpdated: String +} + +type FacebookBusinessSavedAudienceConnection { + nodes: [FacebookBusinessSavedAudience!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdAccountRoas { + adgroupId: String + arpu180d: Float + arpu1d: Float + arpu30d: Float + arpu365d: Float + arpu3d: Float + arpu7d: Float + arpu90d: Float + campaignGroupId: String + campaignId: String + dateStart: String + dateStop: String + installs: Int + revenue: Float + revenue180d: Float + revenue1d: Float + revenue30d: Float + revenue365d: Float + revenue3d: Float + revenue7d: Float + revenue90d: Float + spend: Float + yield180d: Float + yield1d: Float + yield30d: Float + yield365d: Float + yield3d: Float + yield7d: Float + yield90d: Float +} + +type FacebookBusinessAdAccountRoasConnection { + nodes: [FacebookBusinessAdAccountRoas!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessReachFrequencyEstimatesPlacementBreakdown { + android: [Float] + audienceNetwork: [Float] + desktop: [Float] + igAndroid: [Float] + igIos: [Float] + igOther: [Float] + igStory: [Float] + instantArticles: [Float] + instreamVideos: [Float] + ios: [Float] + msite: [Float] + suggestedVideos: [Float] +} + +"""""" +type FacebookBusinessReachFrequencyDayPart { + days: [Int] + endMinute: Int + startMinute: Int +} + +"""""" +type FacebookBusinessReachFrequencyEstimatesCurve { + budget: [Int] + conversion: [Int] + impression: [Int] + interpolatedReach: Float + numPoints: Int + rawImpression: [Int] + rawReach: [Int] + reach: [Int] +} + +"""""" +type FacebookBusinessReachFrequencyAdFormat { + details: JSON +} + +"""""" +type FacebookBusinessReachFrequencyActivity { + accountId: String + campaignActive: Boolean + campaignStarted: Boolean + creativeUploaded: Boolean + ioApproved: Boolean + sfLink: String +} + +"""""" +type FacebookBusinessReachFrequencyPrediction { + accountId: Int + activityStatus: FacebookBusinessReachFrequencyActivity + adFormats: [FacebookBusinessReachFrequencyAdFormat] + auctionEntryOptionIndex: Int + businessId: Int + buyingType: String + campaignGroupId: Int + campaignId: String + campaignTimeStart: String + campaignTimeStop: String + currency: String + curveBudgetReach: FacebookBusinessReachFrequencyEstimatesCurve + curveReach: [Int] + dailyGrpCurve: [Float] + dailyImpressionCurve: [Float] + dailyImpressionCurveMap: JSON + dayPartingSchedule: [FacebookBusinessReachFrequencyDayPart] + destinationId: String + endTime: String + expirationTime: String + externalBudget: Int + externalImpression: Int + externalMaximumBudget: Int + externalMaximumImpression: String + externalMaximumReach: Int + externalMinimumBudget: Int + externalMinimumImpression: Int + externalMinimumReach: Int + externalReach: Int + feedRatio0000: Int + frequencyCap: Int + frequencyDistributionMap: JSON + frequencyDistributionMapAgg: JSON + grpAudienceSize: Float + grpAvgProbabilityMap: String + grpCountryAudienceSize: Float + grpCurve: [Float] + grpDmasAudienceSize: Float + grpFilteringThreshold00: Int + grpPoints: Float + grpRatio: Float + grpReachRatio: Float + grpStatus: String + holdoutPercentage: Int + id: String + impressionCurve: [Int] + instagramDestinationId: String + instreamPackages: [String] + intervalFrequencyCap: Int + intervalFrequencyCapResetPeriod: Int + isBonusMedia: Int + isConversionGoal: Int + isHigherAverageFrequency: Boolean + isIo: Boolean + isReservedBuying: Int + isTrp: Boolean + name: String + objective: Int + objectiveName: String + pausePeriods: [JSON] + placementBreakdown: FacebookBusinessReachFrequencyEstimatesPlacementBreakdown + placementBreakdownMap: JSON + planName: String + planType: String + predictionMode: Int + predictionProgress: Int + referenceId: String + reservationStatus: Int + startTime: String + status: Int + storyEventType: Int + targetAudienceSize: Int + targetCpm: Int + targetSpec: FacebookBusinessTargeting + timeCreated: String + timeUpdated: String + timezoneId: Int + timezoneName: String + toplineId: Int + videoViewLengthConstraint: Int + viewtag: String +} + +type FacebookBusinessReachFrequencyPredictionConnection { + nodes: [FacebookBusinessReachFrequencyPrediction!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdAccountReachEstimate { + estimateReady: Boolean + users: Int +} + +type FacebookBusinessAdAccountReachEstimateConnection { + nodes: [FacebookBusinessAdAccountReachEstimate!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPublisherBlockList { + appPublishers: [JSON] + businessOwnerId: String + id: String + isAutoBlockingOn: Boolean + isEligibleAtCampaignLevel: Boolean + lastUpdateTime: String + lastUpdateUser: String + name: String + ownerAdAccountId: String + webPublishers: [JSON] + pagedAppPublishers(draftId: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + pagedWebPublishers(draftId: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! +} + +type FacebookBusinessPublisherBlockListConnection { + nodes: [FacebookBusinessPublisherBlockList!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusinessOwnedObjectOnBehalfOfRequest { + businessOwnedObject: String + id: String + receivingBusiness: FacebookBusinessBusiness + requestingBusiness: FacebookBusinessBusiness + status: String +} + +type FacebookBusinessBusinessOwnedObjectOnBehalfOfRequestConnection { + nodes: [FacebookBusinessBusinessOwnedObjectOnBehalfOfRequest!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessMinimumBudget { + currency: String + minDailyBudgetHighFreq: Int + minDailyBudgetImp: Int + minDailyBudgetLowFreq: Int + minDailyBudgetVideoViews: Int +} + +type FacebookBusinessMinimumBudgetConnection { + nodes: [FacebookBusinessMinimumBudget!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdAccountMaxBid { + maxBid: Int +} + +type FacebookBusinessAdAccountMaxBidConnection { + nodes: [FacebookBusinessAdAccountMaxBid!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessAppStoreEnum { + AMAZON_APP_STORE + DOES_NOT_EXIST + FB_ANDROID_STORE + FB_CANVAS + FB_GAMEROOM + GOOGLE_PLAY + INSTANT_GAME + ITUNES + ITUNES_IPAD + ROKU_STORE + WINDOWS_10_STORE + WINDOWS_STORE +} + +"""""" +type FacebookBusinessAdAccountMatchedSearchApplicationsEdgeData { + appId: String + areAppEventsUnavailable: Boolean + iconUrl: String + name: String + searchSourceStore: String + store: String + uniqueId: String + url: String +} + +type FacebookBusinessAdAccountMatchedSearchApplicationsEdgeDataConnection { + nodes: [FacebookBusinessAdAccountMatchedSearchApplicationsEdgeData!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessOptimizationGoalEnum { + AD_RECALL_LIFT + APP_DOWNLOADS + APP_INSTALLS + BRAND_AWARENESS + CLICKS + DERIVED_EVENTS + ENGAGED_USERS + EVENT_RESPONSES + IMPRESSIONS + LANDING_PAGE_VIEWS + LEAD_GENERATION + LINK_CLICKS + NONE + OFFER_CLAIMS + OFFSITE_CONVERSIONS + PAGE_ENGAGEMENT + PAGE_LIKES + POST_ENGAGEMENT + REACH + REPLIES + SOCIAL_IMPRESSIONS + THRUPLAY + TWO_SECOND_CONTINUOUS_VIDEO_VIEWS + VALUE + VISIT_INSTAGRAM_PROFILE +} + +"""""" +type FacebookBusinessOutcomePredictionPoint { + actions: Float + impressions: Float + reach: Float + spend: Int +} + +"""""" +type FacebookBusinessAdAccountDeliveryEstimate { + dailyOutcomesCurve: [FacebookBusinessOutcomePredictionPoint] + estimateDau: Int + estimateMau: Int + estimateReady: Boolean +} + +type FacebookBusinessAdAccountDeliveryEstimateConnection { + nodes: [FacebookBusinessAdAccountDeliveryEstimate!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessCustomAudiencesTOS { + content: String + id: String +} + +type FacebookBusinessCustomAudiencesTOSConnection { + nodes: [FacebookBusinessCustomAudiencesTOS!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBroadTargetingCategories { + categoryDescription: String + id: String + name: String + parentCategory: String + path: [String] + size: Int + source: String + typeName: String + untranslatedName: String + untranslatedParentName: String +} + +type FacebookBusinessBroadTargetingCategoriesConnection { + nodes: [FacebookBusinessBroadTargetingCategories!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessStatusesEnum { + CANCELED + CANCELED_DEPENDENCY + ERROR + ERROR_CONFLICTS + ERROR_DEPENDENCY + INITIAL + IN_PROGRESS + PENDING_DEPENDENCY + SUCCESS + USER_CANCELED + USER_CANCELED_DEPENDENCY +} + +"""""" +type FacebookBusinessAdAsyncRequest { + asyncRequestSet: FacebookBusinessAdAsyncRequestSet + createdTime: String + id: String + input: JSON + result: JSON + scopeObjectId: String + status: String + updatedTime: String +} + +type FacebookBusinessAdAsyncRequestConnection { + nodes: [FacebookBusinessAdAsyncRequest!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessAdasyncrequestsetNotificationStatus { + NOT_SENT + SENDING + SENT +} + +"""""" +type FacebookBusinessAdAsyncRequestSetNotificationResult { + response: String + status: String +} + +enum FacebookBusinessAdasyncrequestsetNotificationMode { + OFF + ON_COMPLETE +} + +"""""" +type FacebookBusinessAdAsyncRequestSet { + canceledCount: Int + createdTime: String + errorCount: Int + id: String + inProgressCount: Int + initialCount: Int + isCompleted: Boolean + name: String + notificationMode: FacebookBusinessAdasyncrequestsetNotificationMode + notificationResult: FacebookBusinessAdAsyncRequestSetNotificationResult + notificationStatus: FacebookBusinessAdasyncrequestsetNotificationStatus + notificationUri: String + ownerId: String + successCount: Int + totalCount: Int + updatedTime: String + requests(statuses: [FacebookBusinessStatusesEnum!], before: String, after: String, first: Int): FacebookBusinessAdAsyncRequestConnection! +} + +type FacebookBusinessAdAsyncRequestSetConnection { + nodes: [FacebookBusinessAdAsyncRequestSet!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAsyncRequest { + id: Int + result: String + status: Int +} + +type FacebookBusinessAsyncRequestConnection { + nodes: [FacebookBusinessAsyncRequest!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdAccountAdVolume { + actorId: String + adsRunningOrInReviewCount: Int + currentAccountAdsRunningOrInReviewCount: Int +} + +type FacebookBusinessAdAccountAdVolumeConnection { + nodes: [FacebookBusinessAdAccountAdVolume!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessEvaluationTypeEnum { + SCHEDULE + TRIGGER +} + +"""""" +type FacebookBusinessAdAccountAdRulesHistory { + evaluationSpec: FacebookBusinessAdRuleEvaluationSpec + exceptionCode: Int + exceptionMessage: String + executionSpec: FacebookBusinessAdRuleExecutionSpec + isManual: Boolean + results: [FacebookBusinessAdRuleHistoryResult] + ruleId: Int + scheduleSpec: FacebookBusinessAdRuleScheduleSpec + timestamp: String +} + +type FacebookBusinessAdAccountAdRulesHistoryConnection { + nodes: [FacebookBusinessAdAccountAdRulesHistory!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPlayableContent { + id: String + name: String + owner: FacebookBusinessProfile +} + +type FacebookBusinessPlayableContentConnection { + nodes: [FacebookBusinessPlayableContent!]! + pageInfo: PageInfo! +} + +type FacebookBusinessAdLabelConnection { + nodes: [FacebookBusinessAdLabel!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessAdimageStatus { + ACTIVE + DELETED +} + +"""""" +type FacebookBusinessAdImage { + accountId: String + createdTime: String + creatives: [String] + hash: String + height: Int + id: String + isAssociatedCreativesInAdgroups: Boolean + name: String + originalHeight: Int + originalWidth: Int + permalinkUrl: String + status: FacebookBusinessAdimageStatus + updatedTime: String + url: String + url128: String + width: Int +} + +type FacebookBusinessAdImageConnection { + nodes: [FacebookBusinessAdImage!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessOperatorEnum { + ALL + ANY +} + +enum FacebookBusinessCategoryEnum { + ACCOUNT + AD + AD_KEYWORDS + AD_SET + AUDIENCE + BID + BUDGET + CAMPAIGN + DATE + STATUS + TARGETING +} + +enum FacebookBusinessAdactivityEventType { + ACCOUNT_SPENDING_LIMIT_REACHED + AD_ACCOUNT_ADD_USER_TO_ROLE + AD_ACCOUNT_BILLING_CHARGE + AD_ACCOUNT_BILLING_CHARGE_FAILED + AD_ACCOUNT_BILLING_CHARGEBACK + AD_ACCOUNT_BILLING_CHARGEBACK_REVERSAL + AD_ACCOUNT_BILLING_DECLINE + AD_ACCOUNT_BILLING_REFUND + AD_ACCOUNT_REMOVE_SPEND_LIMIT + AD_ACCOUNT_REMOVE_USER_FROM_ROLE + AD_ACCOUNT_RESET_SPEND_LIMIT + AD_ACCOUNT_SET_BUSINESS_INFORMATION + AD_ACCOUNT_UPDATE_SPEND_LIMIT + AD_ACCOUNT_UPDATE_STATUS + AD_REVIEW_APPROVED + AD_REVIEW_DECLINED + ADD_FUNDING_SOURCE + ADD_IMAGES + BILLING_EVENT + CAMPAIGN_ENDED + CAMPAIGN_SPENDING_LIMIT_REACHED + CONVERSION_EVENT_UPDATED + CREATE_AD + CREATE_AD_SET + CREATE_AUDIENCE + CREATE_CAMPAIGN_GROUP + CREATE_CAMPAIGN_LEGACY + DELETE_AUDIENCE + DELETE_IMAGES + DI_AD_SET_LEARNING_STAGE_EXIT + EDIT_AND_UPDATE_AD_CREATIVE + EDIT_IMAGES + FIRST_DELIVERY_EVENT + FUNDING_EVENT_INITIATED + FUNDING_EVENT_SUCCESSFUL + LIFETIME_BUDGET_SPENT + RECEIVE_AUDIENCE + REMOVE_FUNDING_SOURCE + REMOVE_SHARED_AUDIENCE + SHARE_AUDIENCE + UNKNOWN + UNSHARE_AUDIENCE + UPDATE_AD_BID_INFO + UPDATE_AD_BID_TYPE + UPDATE_AD_CREATIVE + UPDATE_AD_FRIENDLY_NAME + UPDATE_AD_LABELS + UPDATE_AD_RUN_STATUS + UPDATE_AD_RUN_STATUS_TO_BE_SET_AFTER_REVIEW + UPDATE_AD_SET_AD_KEYWORDS + UPDATE_AD_SET_BID_ADJUSTMENTS + UPDATE_AD_SET_BID_STRATEGY + UPDATE_AD_SET_BIDDING + UPDATE_AD_SET_BUDGET + UPDATE_AD_SET_DURATION + UPDATE_AD_SET_MIN_SPEND_TARGET + UPDATE_AD_SET_NAME + UPDATE_AD_SET_OPTIMIZATION_GOAL + UPDATE_AD_SET_RUN_STATUS + UPDATE_AD_SET_SPEND_CAP + UPDATE_AD_SET_TARGET_SPEC + UPDATE_AD_TARGETS_SPEC + UPDATE_ADGROUP_STOP_DELIVERY + UPDATE_AUDIENCE + UPDATE_CAMPAIGN_AD_SCHEDULING + UPDATE_CAMPAIGN_BUDGET + UPDATE_CAMPAIGN_DELIVERY_TYPE + UPDATE_CAMPAIGN_DURATION + UPDATE_CAMPAIGN_GROUP_AD_SCHEDULING + UPDATE_CAMPAIGN_GROUP_DELIVERY_TYPE + UPDATE_CAMPAIGN_GROUP_SPEND_CAP + UPDATE_CAMPAIGN_NAME + UPDATE_CAMPAIGN_RUN_STATUS + UPDATE_CAMPAIGN_SCHEDULE +} + +"""""" +type FacebookBusinessAdActivity { + actorId: String + actorName: String + applicationId: String + applicationName: String + dateTimeInTimezone: String + eventTime: String + eventType: FacebookBusinessAdactivityEventType + extraData: String + objectId: String + objectName: String + objectType: String + translatedEventType: String +} + +type FacebookBusinessAdActivityConnection { + nodes: [FacebookBusinessAdActivity!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessReachFrequencySpec { + countries: [String] + defaultCreationData: JSON + globalIoMaxCampaignDuration: Int + maxCampaignDuration: JSON + maxDaysToFinish: JSON + maxPauseWithoutPredictionRerun: JSON + minCampaignDuration: JSON + minReachLimits: JSON +} + +"""""" +type FacebookBusinessFundingSourceDetailsCoupon { + amount: Int + currency: String + displayAmount: String + expiration: String +} + +"""""" +type FacebookBusinessFundingSourceDetails { + coupon: FacebookBusinessFundingSourceDetailsCoupon + displayString: String + id: String +} + +"""""" +type FacebookBusinessAttributionSpec { + eventType: String + windowDays: Int +} + +"""""" +type FacebookBusinessAgencyClientDeclaration { + agencyRepresentingClient: Int + clientBasedInFrance: Int + clientCity: String + clientCountryCode: String + clientEmailAddress: String + clientName: String + clientPostalCode: String + clientProvince: String + clientStreet: String + clientStreet2: String + hasWrittenMandateFromAdvertiser: Int + isClientPayingInvoices: Int +} + +"""""" +type FacebookBusinessThirdPartyMeasurementReportDataset { + category: String + id: String + partner: FacebookBusinessBusiness + product: String + schema: [JSON] +} + +type FacebookBusinessThirdPartyMeasurementReportDatasetConnection { + nodes: [FacebookBusinessThirdPartyMeasurementReportDataset!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessSystemUser { + createdBy: FacebookBusinessUser + createdTime: String + financePermission: String + id: String + ipPermission: String + name: String + assignedAdAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + assignedBusinessAssetGroups(containedAssetId: String, before: String, after: String, first: Int): FacebookBusinessBusinessAssetGroupConnection! + assignedPages(before: String, after: String, first: Int): FacebookBusinessPageConnection! + assignedProductCatalogs(before: String, after: String, first: Int): FacebookBusinessProductCatalogConnection! + updatedBy(before: String, after: String, first: Int): FacebookBusinessUserConnection! +} + +type FacebookBusinessSystemUserConnection { + nodes: [FacebookBusinessSystemUser!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusinessPixelTOS { + acceptTime: Int + id: String +} + +type FacebookBusinessBusinessPixelTOSConnection { + nodes: [FacebookBusinessBusinessPixelTOS!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusinessRoleRequest { + createdBy: JSON + createdTime: String + email: String + expirationTime: String + expiryTime: String + financeRole: String + id: String + inviteLink: String + ipRole: String + owner: FacebookBusinessBusiness + role: String + status: String + updatedBy: JSON + updatedTime: String +} + +type FacebookBusinessBusinessRoleRequestConnection { + nodes: [FacebookBusinessBusinessRoleRequest!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusinessPageRequest { + id: String + page: FacebookBusinessPage +} + +type FacebookBusinessBusinessPageRequestConnection { + nodes: [FacebookBusinessBusinessPageRequest!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusinessApplicationRequest { + application: FacebookBusinessApplication + id: String +} + +type FacebookBusinessBusinessApplicationRequestConnection { + nodes: [FacebookBusinessBusinessApplicationRequest!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusinessAdAccountRequest { + adAccount: FacebookBusinessAdAccount + id: String +} + +type FacebookBusinessBusinessAdAccountRequestConnection { + nodes: [FacebookBusinessBusinessAdAccountRequest!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusinessAssetSharingAgreement { + id: String + initiator: FacebookBusinessBusiness + recipient: FacebookBusinessBusiness + relationshipType: [String] + requestStatus: String + requestType: String +} + +type FacebookBusinessBusinessAssetSharingAgreementConnection { + nodes: [FacebookBusinessBusinessAssetSharingAgreement!]! + pageInfo: PageInfo! +} + +type FacebookBusinessExtendedCreditAllocationConfigConnection { + nodes: [FacebookBusinessExtendedCreditAllocationConfig!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessExtendedCreditInvoiceGroup { + autoEnroll: Boolean + customerPoNumber: String + email: JSON + emails: [String] + id: String + name: String + adAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! +} + +type FacebookBusinessExtendedCreditInvoiceGroupConnection { + nodes: [FacebookBusinessExtendedCreditInvoiceGroup!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessExtendedCreditAllocationConfig { + currencyAmount: FacebookBusinessCurrencyAmount + id: String + liabilityType: String + owningBusiness: FacebookBusinessBusiness + owningCredential: FacebookBusinessExtendedCredit + partitionType: String + receivingBusiness: FacebookBusinessBusiness + receivingCredential: FacebookBusinessExtendedCredit + requestStatus: String + sendBillTo: String +} + +"""""" +type FacebookBusinessExtendedCredit { + allocatedAmount: FacebookBusinessCurrencyAmount + balance: FacebookBusinessCurrencyAmount + creditAvailable: FacebookBusinessCurrencyAmount + creditType: String + id: String + isAccessRevoked: Boolean + isAutomatedExperience: Boolean + lastPaymentTime: String + legalEntityName: String + liableBizName: String + maxBalance: FacebookBusinessCurrencyAmount + onlineMaxBalance: FacebookBusinessCurrencyAmount + ownerBusiness: FacebookBusinessBusiness + ownerBusinessName: String + partitionFrom: String + receivingCreditAllocationConfig: FacebookBusinessExtendedCreditAllocationConfig + sendBillToBizName: String + extendedCreditInvoiceGroups(before: String, after: String, first: Int): FacebookBusinessExtendedCreditInvoiceGroupConnection! + owningCreditAllocationConfigs(receivingBusinessId: String, before: String, after: String, first: Int): FacebookBusinessExtendedCreditAllocationConfigConnection! +} + +type FacebookBusinessExtendedCreditConnection { + nodes: [FacebookBusinessExtendedCredit!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessEventSourceGroup { + business: FacebookBusinessBusiness + eventSources: [FacebookBusinessExternalEventSource] + id: String + name: String + sharedAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! +} + +type FacebookBusinessEventSourceGroupConnection { + nodes: [FacebookBusinessEventSourceGroup!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusinessCreative { + creationTime: String + duration: Int + hash: String + height: Int + id: String + name: String + thumbnail: String + url: String + videoId: String + width: Int + adPlacementValidationResults(before: String, after: String, first: Int): FacebookBusinessJSONConnection! +} + +type FacebookBusinessBusinessCreativeConnection { + nodes: [FacebookBusinessBusinessCreative!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusinessCreativeFolder { + business: FacebookBusinessBusiness + creationTime: String + creativeInsightPermissions: JSON + description: String + id: String + mediaLibraryUrl: String + name: String + parentFolder: FacebookBusinessBusinessCreativeFolder + agencies(before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + assignedUsers(business: String!, before: String, after: String, first: Int): FacebookBusinessAssignedUserConnection! + subFolders(before: String, after: String, first: Int): FacebookBusinessBusinessCreativeFolderConnection! +} + +type FacebookBusinessBusinessCreativeFolderConnection { + nodes: [FacebookBusinessBusinessCreativeFolder!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessCreativeAssetTag { + name: String +} + +type FacebookBusinessCreativeAssetTagConnection { + nodes: [FacebookBusinessCreativeAssetTag!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAtlasURL { + url: String +} + +type FacebookBusinessAtlasURLConnection { + nodes: [FacebookBusinessAtlasURL!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessInvoiceCampaign { + adAccountId: String + billedAmountDetails: FacebookBusinessBilledAmountDetails + campaignId: String + campaignName: String + clicks: Int + conversions: Int + impressions: Int + tags: [String] +} + +type FacebookBusinessInvoiceCampaignConnection { + nodes: [FacebookBusinessInvoiceCampaign!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessDimensionsEnum { + DEVICE_TYPE + SOURCE_CHANNEL +} + +"""""" +type FacebookBusinessBusinessUser { + business: FacebookBusinessBusiness + email: String + financePermission: String + firstName: String + id: String + ipPermission: String + lastName: String + markedForRemoval: Boolean + name: String + pendingEmail: String + role: String + title: String + twoFacStatus: String + assignedAdAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + assignedBusinessAssetGroups(containedAssetId: String, before: String, after: String, first: Int): FacebookBusinessBusinessAssetGroupConnection! + assignedPages(before: String, after: String, first: Int): FacebookBusinessPageConnection! + assignedProductCatalogs(before: String, after: String, first: Int): FacebookBusinessProductCatalogConnection! +} + +type FacebookBusinessBusinessUserConnection { + nodes: [FacebookBusinessBusinessUser!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessTimePeriodEnum { + ALL_AVAILABLE + ALL_DATES + CUSTOM + DATE_RANGE + FIFTEEN_DAYS + LAST_FOURTEEN_DAYS + LAST_HUNDRED_FOURTY_FOUR_HOURS + LAST_MONTH + LAST_NINETY_DAYS + LAST_QUARTER + LAST_SEVEN_DAYS + LAST_SIXTY_DAYS + LAST_THIRTY_DAYS + LAST_TWENTY_FOUR_HOURS + LAST_YEAR + MONTH_TO_DATE + QUARTER_TO_DATE + SEVEN_DAYS + THIRTY_DAYS + THIS_MONTH_WHOLE_DAYS + TODAY + WEEK_TO_DATE + YEAR_TO_DATE + YESTERDAY +} + +type FacebookBusinessAtlasCampaignConnection { + nodes: [FacebookBusinessAtlasCampaign!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusinessUnit { + business: FacebookBusinessBusiness + creationTime: String + currency: String + excludedSources: JSON + id: String + isEnabledForMeasurement: Boolean + name: String + timeZone: String + visitsAvailableDate: Int + adAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + adPlatforms(orderBy: String, metricScopeJson: JSON, filterBy: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + atlasSalesAccesses(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + campaigns(orderBy: String, metricScopeJson: JSON, filterBy: String, before: String, after: String, first: Int): FacebookBusinessAtlasCampaignConnection! + conversionEvents(orderBy: String, metricScopeJson: JSON, filterBy: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + conversionPaths(viewLookbackWindow: Int!, timePeriod: FacebookBusinessTimePeriodEnum!, metricContextJson: JSON, fbConversionEventId: Int!, dateRangeJson: JSON, clickLookbackWindow: Int!, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + customBreakdowns(orderBy: String, filterBy: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + diagnostics(orderBy: String, filterBy: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + externalImportFile(orderBy: String, filterBy: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + reports(orderBy: String, metricScopeJson: JSON, filterBy: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + sources(orderBy: String, metricScopeJson: JSON, filterBy: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + users(before: String, after: String, first: Int): FacebookBusinessBusinessUserConnection! +} + +type FacebookBusinessBusinessUnitConnection { + nodes: [FacebookBusinessBusinessUnit!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAtlasCampaign { + adPlatform: JSON + alias: String + costPer1kImpressions: Float + costPerClick: Float + costPerVisit: Float + createdBy: JSON + createdDate: String + dataDrivenConvs: Float + dataDrivenConvsPer1kImpress: Float + dataDrivenConvsPerClick: Float + dataDrivenConvsPerVisit: Float + dataDrivenCpa: Float + dataDrivenNullableConvs: Float + dataDrivenRevenue: Float + dataDrivenRoas: Float + evenCreditConvs: Float + evenCreditConvsPer1kImpress: Float + evenCreditConvsPerClick: Float + evenCreditConvsPerVisit: Float + evenCreditCpa: Float + evenCreditRevenue: Float + evenCreditRoas: Float + firstClickConvs: Float + firstClickConvsPer1kImpress: Float + firstClickConvsPerClick: Float + firstClickConvsPerVisit: Float + firstClickCpa: Float + firstClickRevenue: Float + firstClickRoas: Float + firstTouchConvs: Float + firstTouchConvsPer1kImpress: Float + firstTouchConvsPerClick: Float + firstTouchConvsPerVisit: Float + firstTouchCpa: Float + firstTouchRevenue: Float + firstTouchRoas: Float + id: String + isArchived: Boolean + lastClickConvs: Float + lastClickConvsPer1kImpress: Float + lastClickConvsPerClick: Float + lastClickConvsPerVisit: Float + lastClickCpa: Float + lastClickRevenue: Float + lastClickRoas: Float + lastClickWithExtrapolationConvs: Float + lastClickWithExtrapolationConvsPer100Clicks: Float + lastClickWithExtrapolationConvsPer1kImpress: Float + lastClickWithExtrapolationConvsPerClick: Float + lastClickWithExtrapolationConvsPerVisit: Float + lastClickWithExtrapolationCpa: Float + lastClickWithExtrapolationRevenue: Float + lastClickWithExtrapolationRoas: Float + lastClickWithExtrapolationUnattributed: Float + lastModifiedBy: JSON + lastModifiedDate: String + lastTouchConvs: Float + lastTouchConvsPer1kImpress: Float + lastTouchConvsPerClick: Float + lastTouchConvsPerVisit: Float + lastTouchCpa: Float + lastTouchRevenue: Float + lastTouchRoas: Float + name: String + netMediaCost: Float + positional30flConvs: Float + positional30flConvsPer1kImpress: Float + positional30flConvsPerClick: Float + positional30flConvsPerVisit: Float + positional30flCpa: Float + positional30flRevenue: Float + positional30flRoas: Float + positional40flConvs: Float + positional40flConvsPer1kImpress: Float + positional40flConvsPerClick: Float + positional40flConvsPerVisit: Float + positional40flCpa: Float + positional40flRevenue: Float + positional40flRoas: Float + reportClickThroughRate: Float + reportClicks: Int + reportImpressions: Int + reportVisits: Int + timeDecay1dayConvs: Float + timeDecay1dayConvsPer1kImpress: Float + timeDecay1dayConvsPerClick: Float + timeDecay1dayConvsPerVisit: Float + timeDecay1dayCpa: Float + timeDecay1dayRevenue: Float + timeDecay1dayRoas: Float + timeDecay7dayConvs: Float + timeDecay7dayConvsPer1kImpress: Float + timeDecay7dayConvsPerClick: Float + timeDecay7dayConvsPerVisit: Float + timeDecay7dayCpa: Float + timeDecay7dayRevenue: Float + timeDecay7dayRoas: Float + adSets(orderBy: String, metricScopeJson: JSON, filterBy: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + businessUnit(before: String, after: String, first: Int): FacebookBusinessBusinessUnitConnection! + metricsBreakdown(metricScopeJson: JSON, granularity: FacebookBusinessGranularityEnum, dimensions: [FacebookBusinessDimensionsEnum!], before: String, after: String, first: Int): FacebookBusinessJSONConnection! + sources(orderBy: String, metricScopeJson: JSON, filterBy: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! +} + +"""""" +type FacebookBusinessBilledAmountDetails { + currency: String + netAmount: String + taxAmount: String + totalAmount: String +} + +"""""" +type FacebookBusinessCurrencyAmount { + amount: String + amountInHundredths: String + currency: String + offsettedAmount: String +} + +"""""" +type FacebookBusinessOracleTransaction { + adAccountIds: [String] + amount: String + amountDue: FacebookBusinessCurrencyAmount + billedAmountDetails: FacebookBusinessBilledAmountDetails + billingPeriod: String + campaign: FacebookBusinessAtlasCampaign + cdnDownloadUri: String + currency: String + downloadUri: String + dueDate: String + entity: String + id: String + invoiceDate: String + invoiceId: String + invoiceType: String + liabilityType: String + paymentStatus: String + paymentTerm: String + campaigns(before: String, after: String, first: Int): FacebookBusinessInvoiceCampaignConnection! + data(redirect: Boolean, before: String, after: String, first: Int): FacebookBusinessAtlasURLConnection! +} + +type FacebookBusinessOracleTransactionConnection { + nodes: [FacebookBusinessOracleTransaction!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessProductCatalogProductSetsBatch { + errors: [JSON] + errorsTotalCount: Int + handle: String + status: String +} + +type FacebookBusinessProductCatalogProductSetsBatchConnection { + nodes: [FacebookBusinessProductCatalogProductSetsBatch!]! + pageInfo: PageInfo! +} + +type FacebookBusinessProductGroupConnection { + nodes: [FacebookBusinessProductGroup!]! + pageInfo: PageInfo! +} + +type FacebookBusinessProductFeedUploadConnection { + nodes: [FacebookBusinessProductFeedUpload!]! + pageInfo: PageInfo! +} + +type FacebookBusinessProductFeedScheduleConnection { + nodes: [FacebookBusinessProductFeedSchedule!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessProductFeedRule { + attribute: String + id: String + params: JSON + ruleType: String +} + +type FacebookBusinessProductFeedRuleConnection { + nodes: [FacebookBusinessProductFeedRule!]! + pageInfo: PageInfo! +} + +type FacebookBusinessVehicleConnection { + nodes: [FacebookBusinessVehicle!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessVehicleOffer { + amountCurrency: String + amountPercentage: Float + amountPrice: String + amountQualifier: String + bodyStyle: String + cashbackCurrency: String + cashbackPrice: String + currency: String + dmaCodes: [String] + downpaymentCurrency: String + downpaymentPrice: String + downpaymentQualifier: String + endDate: String + endTime: Int + id: String + images: [String] + make: String + model: String + offerDescription: String + offerDisclaimer: String + offerType: String + price: String + sanitizedImages: [String] + startDate: String + startTime: Int + termLength: Int + termQualifier: String + title: String + trim: String + url: String + vehicleOfferId: String + year: Int +} + +type FacebookBusinessVehicleOfferConnection { + nodes: [FacebookBusinessVehicleOffer!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessProductSet { + autoCreationUrl: String + filter: String + id: String + name: String + productCatalog: FacebookBusinessProductCatalog + productCount: Int + automotiveModels(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessAutomotiveModelConnection! + destinations(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessDestinationConnection! + flights(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessFlightConnection! + homeListings(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessHomeListingConnection! + hotels(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessHotelConnection! + products(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessProductItemConnection! + vehicleOffers(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessVehicleOfferConnection! + vehicles(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessVehicleConnection! +} + +type FacebookBusinessProductSetConnection { + nodes: [FacebookBusinessProductSet!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessProductitemVisibility { + PUBLISHED + STAGING +} + +enum FacebookBusinessProductitemShippingWeightUnit { + G + KG + LB + OZ +} + +enum FacebookBusinessProductitemReviewStatus { + APPROVED + OUTDATED + PENDING + REJECTED +} + +"""""" +type FacebookBusinessProductVariant { + label: String + options: [String] + productField: String +} + +"""""" +type FacebookBusinessProductGroup { + id: String + productCatalog: FacebookBusinessProductCatalog + retailerId: String + variants: [FacebookBusinessProductVariant] + products(before: String, after: String, first: Int): FacebookBusinessProductItemConnection! +} + +enum FacebookBusinessProductitemGender { + FEMALE + MALE + UNISEX +} + +enum FacebookBusinessProductitemCondition { + CPO + NEW + OPEN_BOX_NEW + REFURBISHED + USED + USED_FAIR + USED_GOOD + USED_LIKE_NEW +} + +"""""" +type FacebookBusinessProductItemCommerceInsights { + messageSends: Int + organicImpressions: Int + paidImpressions: Int +} + +enum FacebookBusinessProductitemAvailability { + AVAILABLE_FOR_ORDER + DISCONTINUED + IN_STOCK + OUT_OF_STOCK + PENDING + PREORDER +} + +enum FacebookBusinessProductitemAgeGroup { + ADULT + ALL_AGES + INFANT + KIDS + NEWBORN + TEEN + TODDLER +} + +"""""" +type FacebookBusinessProductItem { + additionalImageCdnUrls: [JSON] + additionalImageUrls: [String] + additionalVariantAttributes: JSON + ageGroup: FacebookBusinessProductitemAgeGroup + availability: FacebookBusinessProductitemAvailability + brand: String + capabilityToReviewStatus: JSON + category: String + color: String + commerceInsights: FacebookBusinessProductItemCommerceInsights + condition: FacebookBusinessProductitemCondition + currency: String + customData: JSON + customLabel0: String + customLabel1: String + customLabel2: String + customLabel3: String + customLabel4: String + description: String + expirationDate: String + gender: FacebookBusinessProductitemGender + gtin: String + id: String + imageCdnUrls: JSON + imageUrl: String + inventory: Int + manufacturerPartNumber: String + material: String + mobileLink: String + name: String + orderingIndex: Int + pattern: String + price: String + productCatalog: FacebookBusinessProductCatalog + productFeed: FacebookBusinessProductFeed + productGroup: FacebookBusinessProductGroup + productType: String + retailerId: String + retailerProductGroupId: String + reviewRejectionReasons: [String] + reviewStatus: FacebookBusinessProductitemReviewStatus + salePrice: String + salePriceEndDate: String + salePriceStartDate: String + shippingWeightUnit: FacebookBusinessProductitemShippingWeightUnit + shippingWeightValue: Float + shortDescription: String + size: String + startDate: String + url: String + visibility: FacebookBusinessProductitemVisibility + productSets(before: String, after: String, first: Int): FacebookBusinessProductSetConnection! +} + +type FacebookBusinessProductItemConnection { + nodes: [FacebookBusinessProductItem!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessProductfeedscheduleInterval { + DAILY + HOURLY + MONTHLY + WEEKLY +} + +enum FacebookBusinessProductfeedscheduleDayOfWeek { + FRIDAY + MONDAY + SATURDAY + SUNDAY + THURSDAY + TUESDAY + WEDNESDAY +} + +"""""" +type FacebookBusinessProductFeedSchedule { + dayOfMonth: Int + dayOfWeek: FacebookBusinessProductfeedscheduleDayOfWeek + hour: Int + id: String + interval: FacebookBusinessProductfeedscheduleInterval + intervalCount: Int + minute: Int + timezone: String + url: String + username: String +} + +enum FacebookBusinessProductfeedQuotedFieldsMode { + AUTODETECT + OFF + ON +} + +"""""" +type FacebookBusinessProductFeedRuleSuggestion { + attribute: String + params: JSON +} + +type FacebookBusinessProductFeedRuleSuggestionConnection { + nodes: [FacebookBusinessProductFeedRuleSuggestion!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessProductFeedUploadErrorSample { + id: String + retailerId: String + rowNumber: Int +} + +type FacebookBusinessProductFeedUploadErrorSampleConnection { + nodes: [FacebookBusinessProductFeedUploadErrorSample!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessProductfeeduploaderrorSeverity { + FATAL + WARNING +} + +enum FacebookBusinessProductfeeduploaderrorAffectedSurfaces { + DYNAMIC_ADS + MARKETPLACE + US_MARKETPLACE +} + +"""""" +type FacebookBusinessProductFeedUploadError { + affectedSurfaces: [FacebookBusinessProductfeeduploaderrorAffectedSurfaces] + description: String + errorType: String + id: String + severity: FacebookBusinessProductfeeduploaderrorSeverity + summary: String + totalCount: Int + samples(before: String, after: String, first: Int): FacebookBusinessProductFeedUploadErrorSampleConnection! + suggestedRules(before: String, after: String, first: Int): FacebookBusinessProductFeedRuleSuggestionConnection! +} + +type FacebookBusinessProductFeedUploadErrorConnection { + nodes: [FacebookBusinessProductFeedUploadError!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessProductfeeduploadInputMethod { + GOOGLE_SHEETS_FETCH + MANUAL_UPLOAD + REUPLOAD_LAST_FILE + SERVER_FETCH + USER_INITIATED_SERVER_FETCH +} + +"""""" +type FacebookBusinessProductFeedUploadErrorReport { + fileHandle: String + reportStatus: String +} + +"""""" +type FacebookBusinessProductFeedUpload { + endTime: String + errorCount: Int + errorReport: FacebookBusinessProductFeedUploadErrorReport + filename: String + id: String + inputMethod: FacebookBusinessProductfeeduploadInputMethod + numDeletedItems: Int + numDetectedItems: Int + numInvalidItems: Int + numPersistedItems: Int + startTime: String + url: String + warningCount: Int + errors(before: String, after: String, first: Int): FacebookBusinessProductFeedUploadErrorConnection! +} + +enum FacebookBusinessProductfeedDelimiter { + AUTODETECT + BAR + COMMA + SEMICOLON + TAB + TILDE +} + +"""""" +type FacebookBusinessProductFeed { + country: String + createdTime: String + defaultCurrency: String + deletionEnabled: Boolean + delimiter: FacebookBusinessProductfeedDelimiter + encoding: String + fileName: String + id: String + latestUpload: FacebookBusinessProductFeedUpload + name: String + overrideType: String + productCount: Int + quotedFieldsMode: FacebookBusinessProductfeedQuotedFieldsMode + schedule: FacebookBusinessProductFeedSchedule + updateSchedule: FacebookBusinessProductFeedSchedule + automotiveModels(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessAutomotiveModelConnection! + destinations(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessDestinationConnection! + flights(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessFlightConnection! + homeListings(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessHomeListingConnection! + hotels(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessHotelConnection! + products(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessProductItemConnection! + rules(before: String, after: String, first: Int): FacebookBusinessProductFeedRuleConnection! + uploadSchedules(before: String, after: String, first: Int): FacebookBusinessProductFeedScheduleConnection! + uploads(before: String, after: String, first: Int): FacebookBusinessProductFeedUploadConnection! + vehicleOffers(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessVehicleOfferConnection! + vehicles(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessVehicleConnection! +} + +type FacebookBusinessProductFeedConnection { + nodes: [FacebookBusinessProductFeed!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessProductCatalogPricingVariablesBatch { + errors: [JSON] + errorsTotalCount: Int + handle: String + status: String +} + +type FacebookBusinessProductCatalogPricingVariablesBatchConnection { + nodes: [FacebookBusinessProductCatalogPricingVariablesBatch!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessDynamicPriceConfigByDate { + checkinDate: String + prices: String + pricesPretty: [JSON] + id: String +} + +type FacebookBusinessDynamicPriceConfigByDateConnection { + nodes: [FacebookBusinessDynamicPriceConfigByDate!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessHotelRoom { + basePrice: String + currency: String + description: String + id: String + images: [String] + marginLevel: String + name: String + roomId: String + salePrice: String + url: String + pricingVariables(before: String, after: String, first: Int): FacebookBusinessDynamicPriceConfigByDateConnection! +} + +type FacebookBusinessHotelRoomConnection { + nodes: [FacebookBusinessHotelRoom!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessHotel { + address: String + brand: String + category: String + currency: String + description: String + guestRatings: String + hotelId: String + id: String + images: [String] + lowestBasePrice: String + loyaltyProgram: String + marginLevel: Int + name: String + phone: String + salePrice: String + sanitizedImages: [String] + starRating: Float + url: String + hotelRooms(before: String, after: String, first: Int): FacebookBusinessHotelRoomConnection! +} + +type FacebookBusinessHotelConnection { + nodes: [FacebookBusinessHotel!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessProductCatalogHotelRoomsBatch { + errors: [JSON] + errorsTotalCount: Int + handle: String + status: String +} + +type FacebookBusinessProductCatalogHotelRoomsBatchConnection { + nodes: [FacebookBusinessProductCatalogHotelRoomsBatch!]! + pageInfo: PageInfo! +} + +type FacebookBusinessHomeListingConnection { + nodes: [FacebookBusinessHomeListing!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessFlight { + currency: String + description: String + destinationAirport: String + destinationCity: String + flightId: String + id: String + images: [String] + onewayCurrency: String + onewayPrice: String + originAirport: String + originCity: String + price: String + sanitizedImages: [String] + url: String +} + +type FacebookBusinessFlightConnection { + nodes: [FacebookBusinessFlight!]! + pageInfo: PageInfo! +} + +type FacebookBusinessExternalEventSourceConnection { + nodes: [FacebookBusinessExternalEventSource!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessProducteventstatEvent { + ADDTOCART + ADDTOWISHLIST + INITIATECHECKOUT + LEAD + PURCHASE + SEARCH + SUBSCRIBE + VIEWCONTENT +} + +enum FacebookBusinessProducteventstatDeviceType { + DESKTOP + MOBILE_ANDROID_PHONE + MOBILE_ANDROID_TABLET + MOBILE_IPAD + MOBILE_IPHONE + MOBILE_IPOD + MOBILE_PHONE + MOBILE_TABLET + MOBILE_WINDOWS_PHONE + UNKNOWN +} + +"""""" +type FacebookBusinessProductEventStat { + dateStart: String + dateStop: String + deviceType: FacebookBusinessProducteventstatDeviceType + event: FacebookBusinessProducteventstatEvent + eventSource: FacebookBusinessExternalEventSource + totalContentIdsMatchedOtherCatalogs: Int + totalMatchedContentIds: Int + totalUnmatchedContentIds: Int + uniqueContentIdsMatchedOtherCatalogs: Int + uniqueMatchedContentIds: Int + uniqueUnmatchedContentIds: Int +} + +type FacebookBusinessProductEventStatConnection { + nodes: [FacebookBusinessProductEventStat!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessDestination { + address: String + currency: String + description: String + destinationId: String + id: String + images: [String] + name: String + price: String + priceChange: String + sanitizedImages: [String] + types: [String] + url: String +} + +type FacebookBusinessDestinationConnection { + nodes: [FacebookBusinessDestination!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessCollaborativeAdsShareSettings { + agencyBusiness: FacebookBusinessBusiness + id: String + productCatalogProxyId: String + utmCampaign: String + utmMedium: String + utmSource: String +} + +type FacebookBusinessCollaborativeAdsShareSettingsConnection { + nodes: [FacebookBusinessCollaborativeAdsShareSettings!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessCheckBatchRequestStatus { + errors: [JSON] + errorsTotalCount: Int + handle: String + idsOfInvalidRequests: [String] + status: String + warnings: [JSON] + warningsTotalCount: Int +} + +type FacebookBusinessCheckBatchRequestStatusConnection { + nodes: [FacebookBusinessCheckBatchRequestStatus!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessCategorizationCriteriaEnum { + BRAND + CATEGORY + PRODUCT_TYPE +} + +"""""" +type FacebookBusinessProductCatalogCategory { + criteriaValue: String + description: String + destinationUri: String + imageUrl: String + name: String + numItems: Int + tokens: JSON +} + +type FacebookBusinessProductCatalogCategoryConnection { + nodes: [FacebookBusinessProductCatalogCategory!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAutomotiveModel { + automotiveModelId: String + availability: String + bodyStyle: String + currency: String + customLabel0: String + description: String + drivetrain: String + exteriorColor: String + financeDescription: String + financeType: String + fuelType: String + generation: String + id: String + images: [String] + interiorColor: String + interiorUpholstery: String + make: String + model: String + price: String + sanitizedImages: [String] + title: String + transmission: String + trim: String + url: String + year: Int +} + +type FacebookBusinessAutomotiveModelConnection { + nodes: [FacebookBusinessAutomotiveModel!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessStoreCatalogSettings { + id: String + page: FacebookBusinessPage +} + +"""""" +type FacebookBusinessProductCatalogImageSettingsOperation { + transformationType: String +} + +"""""" +type FacebookBusinessProductCatalogImageSettings { + carouselAd: FacebookBusinessProductCatalogImageSettingsOperation + singleAd: FacebookBusinessProductCatalogImageSettingsOperation +} + +"""""" +type FacebookBusinessCPASParentCatalogSettings { + attributionWindows: [String] + defaultCurrency: String + id: String +} + +"""""" +type FacebookBusinessProductCatalog { + business: FacebookBusinessBusiness + cpasParentCatalogSettings: FacebookBusinessCPASParentCatalogSettings + daDisplaySettings: FacebookBusinessProductCatalogImageSettings + defaultImageUrl: String + fallbackImageUrl: [String] + feedCount: Int + id: String + isCatalogSegment: Boolean + name: String + productCount: Int + storeCatalogSettings: FacebookBusinessStoreCatalogSettings + vertical: String + agencies(before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + assignedUsers(business: String!, before: String, after: String, first: Int): FacebookBusinessAssignedUserConnection! + automotiveModels(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessAutomotiveModelConnection! + categories(filterJson: JSON, categorizationCriteria: FacebookBusinessCategorizationCriteriaEnum!, before: String, after: String, first: Int): FacebookBusinessProductCatalogCategoryConnection! + checkBatchRequestStatus(loadIdsOfInvalidRequests: Boolean, handle: String!, before: String, after: String, first: Int): FacebookBusinessCheckBatchRequestStatusConnection! + collaborativeAdsShareSettings(before: String, after: String, first: Int): FacebookBusinessCollaborativeAdsShareSettingsConnection! + destinations(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessDestinationConnection! + eventStats(breakdowns: [FacebookBusinessBreakdownsEnum!], before: String, after: String, first: Int): FacebookBusinessProductEventStatConnection! + externalEventSources(before: String, after: String, first: Int): FacebookBusinessExternalEventSourceConnection! + flights(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessFlightConnection! + homeListings(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessHomeListingConnection! + hotelRoomsBatch(handle: String!, before: String, after: String, first: Int): FacebookBusinessProductCatalogHotelRoomsBatchConnection! + hotels(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessHotelConnection! + pricingVariablesBatch(handle: String!, before: String, after: String, first: Int): FacebookBusinessProductCatalogPricingVariablesBatchConnection! + productFeeds(before: String, after: String, first: Int): FacebookBusinessProductFeedConnection! + productGroups(before: String, after: String, first: Int): FacebookBusinessProductGroupConnection! + productSets(retailerId: String, parentId: String, hasChildren: Boolean, ancestorId: String, before: String, after: String, first: Int): FacebookBusinessProductSetConnection! + productSetsBatch(handle: String!, before: String, after: String, first: Int): FacebookBusinessProductCatalogProductSetsBatchConnection! + products(returnOnlyApprovedProducts: Boolean, filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessProductItemConnection! + vehicleOffers(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessVehicleOfferConnection! + vehicles(filterJson: JSON, bulkPagination: Boolean, before: String, after: String, first: Int): FacebookBusinessVehicleConnection! +} + +type FacebookBusinessProductCatalogConnection { + nodes: [FacebookBusinessProductCatalog!]! + pageInfo: PageInfo! +} + +type FacebookBusinessInstagramUserConnection { + nodes: [FacebookBusinessInstagramUser!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusinessAssetGroup { + id: String + name: String + assignedUsers(business: String!, before: String, after: String, first: Int): FacebookBusinessAssignedUserConnection! + containedAdAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + containedApplications(before: String, after: String, first: Int): FacebookBusinessApplicationConnection! + containedCustomConversions(before: String, after: String, first: Int): FacebookBusinessCustomConversionConnection! + containedInstagramAccounts(before: String, after: String, first: Int): FacebookBusinessInstagramUserConnection! + containedOfflineConversionDataSets(before: String, after: String, first: Int): FacebookBusinessOfflineConversionDataSetConnection! + containedPages(before: String, after: String, first: Int): FacebookBusinessPageConnection! + containedPixels(before: String, after: String, first: Int): FacebookBusinessAdsPixelConnection! + containedProductCatalogs(before: String, after: String, first: Int): FacebookBusinessProductCatalogConnection! +} + +type FacebookBusinessBusinessAssetGroupConnection { + nodes: [FacebookBusinessBusinessAssetGroup!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessRequestStatusEnum { + APPROVE + DECLINE + EXPIRED + IN_PROGRESS + PENDING +} + +"""""" +type FacebookBusinessBusinessCreativeFolderSharingAgreement { + folderId: String + id: String + requestingBusiness: FacebookBusinessBusiness + status: String +} + +type FacebookBusinessBusinessCreativeFolderSharingAgreementConnection { + nodes: [FacebookBusinessBusinessCreativeFolderSharingAgreement!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdPlacement { + bundleId: String + displayFormat: String + externalPlacementId: String + googleDisplayFormat: String + id: String + name: String + platform: String + status: String +} + +type FacebookBusinessAdPlacementConnection { + nodes: [FacebookBusinessAdPlacement!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPartnerStudy { + additionalInfo: String + brand: String + clientName: String + emails: String + id: String + inputIds: [String] + isExport: Boolean + liftStudy: FacebookBusinessAdStudy + location: String + matchFileDs: String + name: String + partnerDefinedId: String + partnerHouseholdGraphDatasetId: String + status: String + studyEndDate: String + studyStartDate: String + studyType: String + submitDate: String + submitters(before: String, after: String, first: Int): FacebookBusinessUserConnection! +} + +type FacebookBusinessPartnerStudyConnection { + nodes: [FacebookBusinessPartnerStudy!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessOffsitePixel { + creator: String + id: String + jsPixel: String + lastFiringTime: String + name: String + tag: String +} + +type FacebookBusinessOffsitePixelConnection { + nodes: [FacebookBusinessOffsitePixel!]! + pageInfo: PageInfo! +} + +type FacebookBusinessOfflineConversionDataSetConnection { + nodes: [FacebookBusinessOfflineConversionDataSet!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessCustomconversionstatsresultAggregation { + COUNT + DEVICE_TYPE + HOST + PIXEL_FIRE + UNMATCHED_COUNT + UNMATCHED_USD_AMOUNT + URL + USD_AMOUNT +} + +"""""" +type FacebookBusinessCustomConversionStatsResult { + aggregation: FacebookBusinessCustomconversionstatsresultAggregation + data: [JSON] + timestamp: String +} + +type FacebookBusinessCustomConversionStatsResultConnection { + nodes: [FacebookBusinessCustomConversionStatsResult!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessSortByEnum { + LAST_FIRED_TIME + NAME +} + +enum FacebookBusinessGranularityEnum { + DAY + HOUR + MONTH + WEEK + YEAR +} + +enum FacebookBusinessAggrTimeEnum { + EVENT_TIME + UPLOAD_TIME +} + +"""""" +type FacebookBusinessCustomAudiencesharedAccountInfo { + accountId: String + accountName: String + businessId: String + businessName: String + sharingStatus: String +} + +type FacebookBusinessCustomAudiencesharedAccountInfoConnection { + nodes: [FacebookBusinessCustomAudiencesharedAccountInfo!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessCustomAudienceSession { + endTime: String + numInvalidEntries: String + numMatched: String + numReceived: String + progress: String + sessionId: String + stage: String + startTime: String +} + +type FacebookBusinessCustomAudienceSessionConnection { + nodes: [FacebookBusinessCustomAudienceSession!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessCustomAudiencePrefillState { + description: String + numAdded: Int + status: String +} + +type FacebookBusinessCustomAudiencePrefillStateConnection { + nodes: [FacebookBusinessCustomAudiencePrefillState!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessCustomAudienceSharingStatus { + sharingRelationshipId: Int + status: String +} + +"""""" +type FacebookBusinessAudiencePermissionForActions { + canEdit: Boolean + canSeeInsight: Boolean + canShare: Boolean + subtypeSupportsLookalike: Boolean + supportsRecipientLookalike: Boolean +} + +"""""" +type FacebookBusinessLookalikeSpec { + country: String + isFinancialService: Boolean + origin: [JSON] + originEventName: String + originEventSourceName: String + originEventSourceType: String + productSetName: String + ratio: Float + startingRatio: Float + targetCountries: [String] +} + +"""""" +type FacebookBusinessCustomAudienceStatus { + code: Int + description: String +} + +enum FacebookBusinessCustomaudiencedatasourceSubType { + ANYTHING + APP_USERS + CAMPAIGN_CONVERSIONS + COMBINATION_CUSTOM_AUDIENCE_USERS + CONSTANT_CONTACTS_EMAIL_HASHES + CONTACT_IMPORTER + CONVERSION_PIXEL_HITS + COPY_PASTE_EMAIL_HASHES + CUSTOM_AUDIENCE_USERS + DATA_FILE + DYNAMIC_RULE + ENGAGEMENT_EVENT_USERS + EXPANDED_AUDIENCE + EXTERNAL_IDS + EXTERNAL_IDS_MIX + FB_EVENT_SIGNALS + FB_PIXEL_HITS + HASHES + HASHES_OR_USER_IDS + HOUSEHOLD_EXPANSION + IG_BUSINESS_EVENTS + IG_PROMOTED_POST + INSTANT_ARTICLE_EVENTS + LOOKALIKE_PLATFORM + MAIL_CHIMP_EMAIL_HASHES + MOBILE_ADVERTISER_IDS + MOBILE_APP_COMBINATION_EVENTS + MOBILE_APP_CUSTOM_AUDIENCE_USERS + MOBILE_APP_EVENTS + MULTICOUNTRY_COMBINATION + MULTI_DATA_EVENTS + MULTI_EVENT_SOURCE + MULTI_HASHES + NOTHING + OFFLINE_EVENT_USERS + PAGE_FANS + PAGE_SMART_AUDIENCE + PARTNER_CATEGORY_USERS + PLACE_VISITS + PLATFORM + PLATFORM_USERS + SEED_LIST + SMART_AUDIENCE + STORE_VISIT_EVENTS + S_EXPR + TOKENS + USER_IDS + VIDEO_EVENTS + VIDEO_EVENT_USERS + WEB_PIXEL_COMBINATION_EVENTS + WEB_PIXEL_HITS + WEB_PIXEL_HITS_CUSTOM_AUDIENCE_USERS +} + +"""""" +type FacebookBusinessCustomAudienceDataSource { + creationParams: String + subType: FacebookBusinessCustomaudiencedatasourceSubType +} + +"""""" +type FacebookBusinessCustomAudience { + accountId: String + approximateCount: Int + customerFileSource: String + dataSource: FacebookBusinessCustomAudienceDataSource + dataSourceTypes: String + datafileCustomAudienceUploadingStatus: String + deliveryStatus: FacebookBusinessCustomAudienceStatus + description: String + excludedCustomAudiences: [FacebookBusinessCustomAudience] + externalEventSource: FacebookBusinessAdsPixel + householdAudience: Int + id: String + includedCustomAudiences: [FacebookBusinessCustomAudience] + isHousehold: Boolean + isSnapshot: Boolean + isValueBased: Boolean + lookalikeAudienceIds: [String] + lookalikeSpec: FacebookBusinessLookalikeSpec + name: String + operationStatus: FacebookBusinessCustomAudienceStatus + optOutLink: String + permissionForActions: FacebookBusinessAudiencePermissionForActions + pixelId: String + regulatedAudienceSpec: FacebookBusinessLookalikeSpec + retentionDays: Int + revSharePolicyId: Int + rule: String + ruleAggregation: String + ruleV2: String + seedAudience: Int + sharingStatus: FacebookBusinessCustomAudienceSharingStatus + subtype: String + timeContentUpdated: Int + timeCreated: Int + timeUpdated: Int + adAccounts(permissions: String, before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + ads(status: [String!], effectiveStatus: [String!], before: String, after: String, first: Int): FacebookBusinessAdConnection! + prefills(before: String, after: String, first: Int): FacebookBusinessCustomAudiencePrefillStateConnection! + sessions(sessionId: Int, before: String, after: String, first: Int): FacebookBusinessCustomAudienceSessionConnection! + sharedAccountInfo(before: String, after: String, first: Int): FacebookBusinessCustomAudiencesharedAccountInfoConnection! +} + +type FacebookBusinessCustomAudienceConnection { + nodes: [FacebookBusinessCustomAudience!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessOfflineConversionDataSet { + business: FacebookBusinessBusiness + config: String + creationTime: String + description: String + duplicateEntries: Int + enableAutoAssignToAccounts: Boolean + eventStats: String + eventTimeMax: Int + eventTimeMin: Int + id: String + isMtaUse: Boolean + isRestrictedUse: Boolean + isUnavailable: Boolean + lastUploadApp: String + lastUploadAppChangedTime: Int + matchRateApprox: Int + matchedEntries: Int + name: String + usage: JSON + validEntries: Int + adAccounts(business: String!, before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + agencies(before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + audiences(adAccount: String, before: String, after: String, first: Int): FacebookBusinessCustomAudienceConnection! + customConversions(adAccount: String, before: String, after: String, first: Int): FacebookBusinessCustomConversionConnection! + stats(userTimezoneId: Int, start: Int, skipEmptyValues: Boolean, granularity: FacebookBusinessGranularityEnum, end: Int, aggrTime: FacebookBusinessAggrTimeEnum, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + uploads(uploadTag: String, startTime: String, sortBy: FacebookBusinessSortByEnum, order: FacebookBusinessOrderEnum, endTime: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! +} + +"""""" +type FacebookBusinessExternalEventSource { + id: String + name: String + sourceType: String +} + +enum FacebookBusinessCustomconversionCustomEventType { + ADD_PAYMENT_INFO + ADD_TO_CART + ADD_TO_WISHLIST + COMPLETE_REGISTRATION + CONTACT + CONTENT_VIEW + CUSTOMIZE_PRODUCT + DONATE + FIND_LOCATION + INITIATED_CHECKOUT + LEAD + LISTING_INTERACTION + OTHER + PURCHASE + SCHEDULE + SEARCH + START_TRIAL + SUBMIT_APPLICATION + SUBSCRIBE +} + +"""""" +type FacebookBusinessCustomConversion { + accountId: String + aggregationRule: String + business: FacebookBusinessBusiness + creationTime: String + customEventType: FacebookBusinessCustomconversionCustomEventType + dataSources: [FacebookBusinessExternalEventSource] + defaultConversionValue: Int + description: String + eventSourceType: String + firstFiredTime: String + id: String + isArchived: Boolean + isUnavailable: Boolean + lastFiredTime: String + name: String + offlineConversionDataSet: FacebookBusinessOfflineConversionDataSet + pixel: FacebookBusinessAdsPixel + retentionDays: Int + rule: String + stats(startTime: String, endTime: String, aggregation: FacebookBusinessAggregationEnum, before: String, after: String, first: Int): FacebookBusinessCustomConversionStatsResultConnection! +} + +type FacebookBusinessCustomConversionConnection { + nodes: [FacebookBusinessCustomConversion!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessStatusEnum { + ACTIVE + ARCHIVED + DELETED + PAUSED +} + +type FacebookBusinessAdVideoConnection { + nodes: [FacebookBusinessAdVideo!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessSourceEnum { + OWNER + TARGET +} + +enum FacebookBusinessBroadcastStatusEnum { + LIVE + LIVE_STOPPED + PROCESSING + SCHEDULED_CANCELED + SCHEDULED_EXPIRED + SCHEDULED_LIVE + SCHEDULED_UNPUBLISHED + UNPUBLISHED + VOD +} + +"""""" +type FacebookBusinessLiveVideoError { + creationTime: String + errorCode: Int + errorMessage: String + errorType: String + id: String +} + +type FacebookBusinessLiveVideoErrorConnection { + nodes: [FacebookBusinessLiveVideoError!]! + pageInfo: PageInfo! +} + +type FacebookBusinessUserConnection { + nodes: [FacebookBusinessUser!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessVideoThumbnail { + height: Int + id: String + isPreferred: Boolean + name: String + scale: Float + uri: String + width: Int +} + +type FacebookBusinessVideoThumbnailConnection { + nodes: [FacebookBusinessVideoThumbnail!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessVideopollStatus { + CLOSED + RESULTS_OPEN + VOTING_OPEN +} + +"""""" +type FacebookBusinessVideoPoll { + closeAfterVoting: Boolean + defaultOpen: Boolean + id: String + question: String + showGradient: Boolean + showResults: Boolean + status: FacebookBusinessVideopollStatus + pollOptions(before: String, after: String, first: Int): FacebookBusinessJSONConnection! +} + +type FacebookBusinessVideoPollConnection { + nodes: [FacebookBusinessVideoPoll!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessMusicVideoCopyright { + creationTime: String + displayedMatchesCount: Int + id: String + inConflict: Boolean + isrc: String + matchRule: FacebookBusinessVideoCopyrightRule + ownershipCountries: [String] + referenceFileStatus: String + ridgeMonitoringStatus: String + tags: [String] + updateTime: String + videoAsset: FacebookBusinessCopyrightReferenceContainer + whitelistedFbUsers: [JSON] + whitelistedIgUsers: [String] +} + +"""""" +type FacebookBusinessAdVideo { + adBreaks: [Int] + backdatedTime: String + backdatedTimeGranularity: String + contentCategory: String + contentTags: [String] + copyright: FacebookBusinessVideoCopyright + copyrightMonitoringStatus: String + createdTime: String + customLabels: [String] + description: String + embedHtml: String + embeddable: Boolean + event: FacebookBusinessEvent + expiration: JSON + format: [JSON] + from: JSON + icon: String + id: String + isCrosspostVideo: Boolean + isCrosspostingEligible: Boolean + isEpisode: Boolean + isInstagramEligible: Boolean + isReferenceOnly: Boolean + length: Float + liveAudienceCount: Int + liveStatus: String + musicVideoCopyright: FacebookBusinessMusicVideoCopyright + permalinkUrl: String + picture: String + place: FacebookBusinessPlace + premiereLivingRoomStatus: String + privacy: FacebookBusinessPrivacy + published: Boolean + scheduledPublishTime: String + source: String + spherical: Boolean + status: JSON + title: String + universalVideoId: String + updatedTime: String + captions(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + comments(since: String, order: FacebookBusinessOrderEnum, liveFilter: FacebookBusinessLiveFilterEnum, filter: FacebookBusinessFilterEnum, before: String, after: String, first: Int): FacebookBusinessCommentConnection! + crosspostSharedPages(before: String, after: String, first: Int): FacebookBusinessPageConnection! + likes(before: String, after: String, first: Int): FacebookBusinessProfileConnection! + pollSettings(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + polls(before: String, after: String, first: Int): FacebookBusinessVideoPollConnection! + sharedPosts(before: String, after: String, first: Int): FacebookBusinessPostConnection! + sponsorTags(before: String, after: String, first: Int): FacebookBusinessPageConnection! + tags(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + thumbnails(before: String, after: String, first: Int): FacebookBusinessVideoThumbnailConnection! + videoInsights(until: String, since: String, period: FacebookBusinessPeriodEnum, metricJson: [JSON!], before: String, after: String, first: Int): FacebookBusinessInsightsResultConnection! +} + +"""""" +type FacebookBusinessLiveVideoTargeting { + ageMax: Int + ageMin: Int + excludedCountries: [String] + geoLocations: FacebookBusinessTargetingGeoLocation +} + +"""""" +type FacebookBusinessLiveEncoder { + brand: String + creationTime: String + currentBroadcast: FacebookBusinessLiveVideo + currentInputStream: FacebookBusinessLiveVideoInputStream + deviceId: String + id: String + lastHeartbeatTime: String + model: String + name: String + status: String + version: String +} + +"""""" +type FacebookBusinessLiveVideoInputStream { + dashIngestUrl: String + dashPreviewUrl: String + id: String + isMaster: Boolean + liveEncoder: FacebookBusinessLiveEncoder + secureStreamUrl: String + streamHealth: JSON + streamId: String + streamUrl: String +} + +"""""" +type FacebookBusinessVideoCopyrightConditionGroup { + action: String + conditions: [JSON] + validityStatus: String +} + +"""""" +type FacebookBusinessVideoCopyrightRule { + conditionGroups: [FacebookBusinessVideoCopyrightConditionGroup] + copyrights: [String] + createdDate: String + creator: FacebookBusinessUser + id: String + isInMigration: Boolean + name: String +} + +"""""" +type FacebookBusinessCopyrightReferenceContainer { + contentType: String + copyrightCreationTime: String + downloadHdUrl: String + durationInSec: Float + id: String + iswc: String + metadata: JSON + publishedTime: String + thumbnailUrl: String + title: String + universalContentId: String + writerNames: [String] +} + +"""""" +type FacebookBusinessVideoCopyrightGeoGate { + excludedCountries: [String] + includedCountries: [String] +} + +"""""" +type FacebookBusinessVideoCopyrightSegment { + durationInSec: Float + mediaType: String + startTimeInSec: Float +} + +"""""" +type FacebookBusinessVideoCopyright { + contentCategory: String + copyrightContentId: String + creator: FacebookBusinessUser + excludedOwnershipSegments: [FacebookBusinessVideoCopyrightSegment] + id: String + inConflict: Boolean + monitoringStatus: String + monitoringType: String + ownershipCountries: FacebookBusinessVideoCopyrightGeoGate + referenceFile: FacebookBusinessCopyrightReferenceContainer + referenceFileDisabled: Boolean + referenceFileDisabledByOps: Boolean + referenceOwnerId: String + ruleIds: [FacebookBusinessVideoCopyrightRule] + tags: [String] + whitelistedIds: [String] +} + +"""""" +type FacebookBusinessLiveVideoAdBreakConfig { + defaultAdBreakDuration: Int + failureReasonPollingInterval: Int + firstBreakEligibleSecs: Int + guideUrl: String + isEligibleToOnboard: Boolean + isEnabled: Boolean + onboardingUrl: String + preparingDuration: Int + timeBetweenAdBreaksSecs: Int + viewerCountThreshold: Int +} + +"""""" +type FacebookBusinessLiveVideo { + adBreakConfig: FacebookBusinessLiveVideoAdBreakConfig + adBreakFailureReason: String + broadcastStartTime: String + copyright: FacebookBusinessVideoCopyright + creationTime: String + dashIngestUrl: String + dashPreviewUrl: String + description: String + embedHtml: String + from: JSON + id: String + ingestStreams: [FacebookBusinessLiveVideoInputStream] + isManualMode: Boolean + isReferenceOnly: Boolean + liveEncoders: [FacebookBusinessLiveEncoder] + liveViews: Int + overlayUrl: String + permalinkUrl: String + plannedStartTime: String + secondsLeft: Int + secureStreamUrl: String + status: String + streamUrl: String + targeting: FacebookBusinessLiveVideoTargeting + title: String + totalViews: String + video: FacebookBusinessAdVideo + blockedUsers(uidJson: JSON, before: String, after: String, first: Int): FacebookBusinessUserConnection! + comments(since: String, order: FacebookBusinessOrderEnum, liveFilter: FacebookBusinessLiveFilterEnum, filter: FacebookBusinessFilterEnum, before: String, after: String, first: Int): FacebookBusinessCommentConnection! + crosspostSharedPages(before: String, after: String, first: Int): FacebookBusinessPageConnection! + crosspostedBroadcasts(before: String, after: String, first: Int): FacebookBusinessLiveVideoConnection! + errors(before: String, after: String, first: Int): FacebookBusinessLiveVideoErrorConnection! + likes(before: String, after: String, first: Int): FacebookBusinessProfileConnection! + polls(before: String, after: String, first: Int): FacebookBusinessVideoPollConnection! + reactions(type: FacebookBusinessTypeEnum, before: String, after: String, first: Int): FacebookBusinessProfileConnection! +} + +type FacebookBusinessLiveVideoConnection { + nodes: [FacebookBusinessLiveVideo!]! + pageInfo: PageInfo! +} + +type FacebookBusinessEventConnection { + nodes: [FacebookBusinessEvent!]! + pageInfo: PageInfo! +} + +type FacebookBusinessPhotoConnection { + nodes: [FacebookBusinessPhoto!]! + pageInfo: PageInfo! +} + +type FacebookBusinessPageConnection { + nodes: [FacebookBusinessPage!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessInstagramUser { + followCount: Int + followedByCount: Int + hasProfilePicture: Boolean + id: String + isPrivate: Boolean + isPublished: Boolean + mediaCount: Int + profilePic: String + username: String + agencies(before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + authorizedAdAccounts(business: String!, before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! +} + +"""""" +type FacebookBusinessInstagramComment { + commentType: String + createdAt: String + id: String + instagramCommentId: String + instagramUser: FacebookBusinessInstagramUser + mentionedInstagramUsers: [FacebookBusinessInstagramUser] + message: String + replies(before: String, after: String, first: Int): FacebookBusinessInstagramCommentConnection! +} + +type FacebookBusinessInstagramCommentConnection { + nodes: [FacebookBusinessInstagramComment!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessDynamicPostChildAttachment { + description: String + imageUrl: String + link: String + placeId: String + productId: String + title: String +} + +"""""" +type FacebookBusinessRTBDynamicPost { + childAttachments: [FacebookBusinessDynamicPostChildAttachment] + created: String + description: String + id: String + imageUrl: String + link: String + message: String + ownerId: String + placeId: String + productId: String + title: String + comments(since: String, order: FacebookBusinessOrderEnum, liveFilter: FacebookBusinessLiveFilterEnum, filter: FacebookBusinessFilterEnum, before: String, after: String, first: Int): FacebookBusinessCommentConnection! + instagramComments(before: String, after: String, first: Int): FacebookBusinessInstagramCommentConnection! + likes(before: String, after: String, first: Int): FacebookBusinessProfileConnection! +} + +type FacebookBusinessRTBDynamicPostConnection { + nodes: [FacebookBusinessRTBDynamicPost!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPrivacy { + allow: String + deny: String + description: String + friends: String + networks: String + value: String +} + +"""""" +type FacebookBusinessPost { + adminCreator: JSON + allowedAdvertisingObjectives: [String] + application: FacebookBusinessApplication + backdatedTime: String + callToAction: JSON + canReplyPrivately: Boolean + caption: String + commentsMirroringDomain: String + coordinates: JSON + createdTime: String + description: String + event: FacebookBusinessEvent + expandedHeight: Int + expandedWidth: Int + feedTargeting: JSON + from: JSON + fullPicture: String + height: Int + icon: String + id: String + instagramEligibility: String + isAppShare: Boolean + isEligibleForPromotion: Boolean + isExpired: Boolean + isHidden: Boolean + isInstagramEligible: Boolean + isPopular: Boolean + isPublished: Boolean + isSpherical: Boolean + link: String + message: String + multiShareEndCard: Boolean + multiShareOptimized: Boolean + name: String + objectId: String + parentId: String + permalinkUrl: JSON + picture: String + place: FacebookBusinessPlace + privacy: FacebookBusinessPrivacy + promotableId: String + promotionStatus: String + scheduledPublishTime: Float + shares: JSON + source: String + statusType: String + story: String + subscribed: Boolean + target: FacebookBusinessProfile + targeting: JSON + timelineVisibility: String + updatedTime: String + via: JSON + videoBuyingEligibility: [String] + width: Int + attachments(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + comments(since: String, order: FacebookBusinessOrderEnum, liveFilter: FacebookBusinessLiveFilterEnum, filter: FacebookBusinessFilterEnum, before: String, after: String, first: Int): FacebookBusinessCommentConnection! + dynamicPosts(before: String, after: String, first: Int): FacebookBusinessRTBDynamicPostConnection! + insights(until: String, since: String, period: FacebookBusinessPeriodEnum, metricJson: [JSON!], datePreset: FacebookBusinessDatePresetEnum, before: String, after: String, first: Int): FacebookBusinessInsightsResultConnection! + reactions(type: FacebookBusinessTypeEnum, before: String, after: String, first: Int): FacebookBusinessProfileConnection! + sharedPosts(before: String, after: String, first: Int): FacebookBusinessPostConnection! + sponsorTags(before: String, after: String, first: Int): FacebookBusinessPageConnection! + to(before: String, after: String, first: Int): FacebookBusinessProfileConnection! +} + +type FacebookBusinessPostConnection { + nodes: [FacebookBusinessPost!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessInsightsResult { + description: String + descriptionFromApiDoc: String + id: String + name: String + period: String + title: String + values: [JSON] +} + +type FacebookBusinessInsightsResultConnection { + nodes: [FacebookBusinessInsightsResult!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessOrderEnum { + CHRONOLOGICAL + REVERSE_CHRONOLOGICAL +} + +enum FacebookBusinessLiveFilterEnum { + FILTER_LOW_QUALITY + NO_FILTER +} + +enum FacebookBusinessFilterEnum { + STREAM + TOPLEVEL +} + +"""""" +type FacebookBusinessComment { + adminCreator: FacebookBusinessUser + application: FacebookBusinessApplication + attachment: JSON + canComment: Boolean + canHide: Boolean + canLike: Boolean + canRemove: Boolean + canReplyPrivately: Boolean + commentCount: Int + createdTime: String + from: JSON + id: String + isHidden: Boolean + isPrivate: Boolean + likeCount: Int + liveBroadcastTimestamp: Int + message: String + messageTags: [FacebookBusinessEntityAtTextRange] + object: JSON + parent: FacebookBusinessComment + permalinkUrl: String + privateReplyConversation: JSON + userLikes: Boolean + comments(since: String, order: FacebookBusinessOrderEnum, liveFilter: FacebookBusinessLiveFilterEnum, filter: FacebookBusinessFilterEnum, before: String, after: String, first: Int): FacebookBusinessCommentConnection! + reactions(type: FacebookBusinessTypeEnum, before: String, after: String, first: Int): FacebookBusinessProfileConnection! +} + +type FacebookBusinessCommentConnection { + nodes: [FacebookBusinessComment!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessEntityAtTextRange { + id: String + length: Int + name: String + object: FacebookBusinessProfile + offset: Int +} + +"""""" +type FacebookBusinessPlatformImageSource { + height: Int + source: String + width: Int +} + +type FacebookBusinessProfilePictureSourceConnection { + nodes: [FacebookBusinessProfilePictureSource!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessProfileProfileType { + APPLICATION + EVENT + GROUP + PAGE + USER +} + +"""""" +type FacebookBusinessProfilePictureSource { + bottom: Int + cacheKey: String + height: Int + isSilhouette: Boolean + left: Int + right: Int + top: Int + url: String + width: Int +} + +"""""" +type FacebookBusinessProfile { + canPost: Boolean + id: String + link: String + name: String + pic: String + picCrop: FacebookBusinessProfilePictureSource + picLarge: String + picSmall: String + picSquare: String + profileType: FacebookBusinessProfileProfileType + username: String + picture(width: Int, type: FacebookBusinessTypeEnum, redirect: Boolean, height: Int, before: String, after: String, first: Int): FacebookBusinessProfilePictureSourceConnection! +} + +type FacebookBusinessProfileConnection { + nodes: [FacebookBusinessProfile!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessNullNode { + data: JSON +} + +type FacebookBusinessNullNodeConnection { + nodes: [FacebookBusinessNullNode!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessPlace { + id: String + location: FacebookBusinessLocation + name: String + overallRating: Float +} + +"""""" +type FacebookBusinessChildEvent { + endTime: String + id: String + startTime: String + ticketUri: String +} + +enum FacebookBusinessEventCategory { + ART_EVENT + BOOK_EVENT + CLASS_EVENT + COMEDY_EVENT + CONFERENCE_EVENT + DANCE_EVENT + DINING_EVENT + FAMILY_EVENT + FESTIVAL_EVENT + FITNESS + FOOD_TASTING + FUNDRAISER + LECTURE + MEETUP + MOVIE_EVENT + MUSIC_EVENT + NEIGHBORHOOD + NIGHTLIFE + OTHER + RELIGIOUS_EVENT + SHOPPING + SPORTS_EVENT + THEATER_EVENT + VOLUNTEERING + WORKSHOP +} + +"""""" +type FacebookBusinessEvent { + attendingCount: Int + canGuestsInvite: Boolean + category: FacebookBusinessEventCategory + cover: FacebookBusinessCoverPhoto + declinedCount: Int + description: String + discountCodeEnabled: Boolean + endTime: String + eventTimes: [FacebookBusinessChildEvent] + guestListEnabled: Boolean + id: String + interestedCount: Int + isCanceled: Boolean + isDraft: Boolean + isOnline: Boolean + isPageOwned: Boolean + maybeCount: Int + name: String + noreplyCount: Int + owner: JSON + parentGroup: FacebookBusinessGroup + place: FacebookBusinessPlace + scheduledPublishTime: String + startTime: String + ticketUri: String + ticketUriStartSalesTime: String + ticketingPrivacyUri: String + ticketingTermsUri: String + timezone: String + updatedTime: String + comments(before: String, after: String, first: Int): FacebookBusinessNullNodeConnection! + feed(before: String, after: String, first: Int): FacebookBusinessNullNodeConnection! + liveVideos(before: String, after: String, first: Int): FacebookBusinessNullNodeConnection! + photos(before: String, after: String, first: Int): FacebookBusinessNullNodeConnection! + picture(before: String, after: String, first: Int): FacebookBusinessNullNodeConnection! + posts(before: String, after: String, first: Int): FacebookBusinessNullNodeConnection! + roles(before: String, after: String, first: Int): FacebookBusinessProfileConnection! + videos(before: String, after: String, first: Int): FacebookBusinessNullNodeConnection! +} + +"""""" +type FacebookBusinessPhoto { + album: FacebookBusinessAlbum + altText: String + altTextCustom: String + backdatedTime: String + backdatedTimeGranularity: String + canBackdate: Boolean + canDelete: Boolean + canTag: Boolean + createdTime: String + event: FacebookBusinessEvent + from: JSON + height: Int + icon: String + id: String + images: [FacebookBusinessPlatformImageSource] + link: String + name: String + nameTags: [FacebookBusinessEntityAtTextRange] + pageStoryId: String + picture: String + place: FacebookBusinessPlace + position: Int + source: String + target: FacebookBusinessProfile + updatedTime: String + webpImages: [FacebookBusinessPlatformImageSource] + width: Int + comments(since: String, order: FacebookBusinessOrderEnum, liveFilter: FacebookBusinessLiveFilterEnum, filter: FacebookBusinessFilterEnum, before: String, after: String, first: Int): FacebookBusinessCommentConnection! + insights(until: String, since: String, period: FacebookBusinessPeriodEnum, metricJson: [JSON!], datePreset: FacebookBusinessDatePresetEnum, before: String, after: String, first: Int): FacebookBusinessInsightsResultConnection! + likes(before: String, after: String, first: Int): FacebookBusinessProfileConnection! + sharedPosts(before: String, after: String, first: Int): FacebookBusinessPostConnection! + sponsorTags(before: String, after: String, first: Int): FacebookBusinessPageConnection! +} + +"""""" +type FacebookBusinessAlbum { + backdatedTime: String + backdatedTimeGranularity: String + canBackdate: Boolean + canUpload: Boolean + count: Int + coverPhoto: FacebookBusinessPhoto + createdTime: String + description: String + editLink: JSON + event: FacebookBusinessEvent + from: JSON + id: String + isUserFacing: Boolean + link: JSON + location: String + modifiedMajor: String + name: String + photoCount: Int + place: FacebookBusinessPlace + privacy: String + updatedTime: String + videoCount: Int + comments(since: String, order: FacebookBusinessOrderEnum, liveFilter: FacebookBusinessLiveFilterEnum, filter: FacebookBusinessFilterEnum, before: String, after: String, first: Int): FacebookBusinessCommentConnection! + photos(before: String, after: String, first: Int): FacebookBusinessPhotoConnection! + picture(type: FacebookBusinessTypeEnum, redirect: Boolean, before: String, after: String, first: Int): FacebookBusinessProfilePictureSourceConnection! + sharedPosts(before: String, after: String, first: Int): FacebookBusinessPostConnection! +} + +type FacebookBusinessAlbumConnection { + nodes: [FacebookBusinessAlbum!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessCoverPhoto { + coverId: String + id: String + offsetX: Float + offsetY: Float + source: String +} + +"""""" +type FacebookBusinessGroup { + archived: Boolean + cover: FacebookBusinessCoverPhoto + createdTime: String + description: String + email: String + icon: String + id: String + link: String + memberCount: Int + memberRequestCount: Int + name: String + owner: JSON + parent: JSON + permissions: [String] + privacy: String + purpose: String + subdomain: String + updatedTime: String + venue: FacebookBusinessLocation + albums(before: String, after: String, first: Int): FacebookBusinessAlbumConnection! + docs(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + events(before: String, after: String, first: Int): FacebookBusinessEventConnection! + groups(before: String, after: String, first: Int): FacebookBusinessGroupConnection! + liveVideos(source: FacebookBusinessSourceEnum, broadcastStatus: [FacebookBusinessBroadcastStatusEnum!], before: String, after: String, first: Int): FacebookBusinessLiveVideoConnection! + optedInMembers(before: String, after: String, first: Int): FacebookBusinessUserConnection! + picture(width: Int, type: FacebookBusinessTypeEnum, redirect: Boolean, height: Int, before: String, after: String, first: Int): FacebookBusinessProfilePictureSourceConnection! + videos(type: FacebookBusinessTypeEnum, before: String, after: String, first: Int): FacebookBusinessAdVideoConnection! +} + +type FacebookBusinessGroupConnection { + nodes: [FacebookBusinessGroup!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessPeriodEnum { + DAY + DAYS_28 + LIFETIME + MONTH + WEEK +} + +enum FacebookBusinessEcosystemEnum { + GAME + NON_GAME +} + +enum FacebookBusinessAggregatebyEnum { + AVERAGE_JOURNEY_LENGTH + CONVERTED_JOURNEY_PERCENT + COUNT + COUNT_IDENTIFIED_USERS + COUNT_PER_USER + DAU + EVENT_LATEST_FIRE_TIME + EVENT_SOURCE_IDS + JOURNEY_CHANNEL_INCLUSION + JOURNEY_INCLUSION + MAU + MEDIAN_JOURNEY_LENGTH + MEDIAN_VALUE + MEDIAN_VALUE_PER_USER + OVERLAP + PERCENTILES_COUNT + PERCENTILES_USD_VALUE + PERCENTILES_VALUE + SCORE + SESSIONS_PER_JOURNEY + SESSION_BOUNCE_RATE + SUM + SUM_IDENTIFIED_USERS + SUM_PER_EVENT + TOPK + UNKNOWN_USERS + USD_SUM + USD_SUM_IDENTIFIED_USERS + USD_SUM_PER_EVENT + USD_SUM_PER_USER + USD_VALUE_PER_USER + USERS + USER_PROPERTY_USER_COUNT + VALUE_PER_USER + WAU +} + +"""""" +type FacebookBusinessAdNetworkAnalyticsAsyncQueryResult { + data: JSON + error: JSON + queryId: String + results: [JSON] + status: String +} + +type FacebookBusinessAdNetworkAnalyticsAsyncQueryResultConnection { + nodes: [FacebookBusinessAdNetworkAnalyticsAsyncQueryResult!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessOrderingTypeEnum { + ASCENDING + DESCENDING +} + +enum FacebookBusinessOrderingColumnEnum { + METRIC + TIME + VALUE +} + +enum FacebookBusinessMetricsEnum { + FB_AD_NETWORK_BIDDING_BID_RATE + FB_AD_NETWORK_BIDDING_REQUEST + FB_AD_NETWORK_BIDDING_RESPONSE + FB_AD_NETWORK_BIDDING_REVENUE + FB_AD_NETWORK_BIDDING_WIN_RATE + FB_AD_NETWORK_CLICK + FB_AD_NETWORK_CPM + FB_AD_NETWORK_CTR + FB_AD_NETWORK_FILLED_REQUEST + FB_AD_NETWORK_FILL_RATE + FB_AD_NETWORK_IMP + FB_AD_NETWORK_IMPRESSION_RATE + FB_AD_NETWORK_REQUEST + FB_AD_NETWORK_REVENUE + FB_AD_NETWORK_SHOW_RATE + FB_AD_NETWORK_VIDEO_GUARANTEE_REVENUE + FB_AD_NETWORK_VIDEO_MRC + FB_AD_NETWORK_VIDEO_MRC_RATE + FB_AD_NETWORK_VIDEO_VIEW + FB_AD_NETWORK_VIDEO_VIEW_RATE +} + +enum FacebookBusinessAggregationPeriodEnum { + DAY + TOTAL +} + +"""""" +type FacebookBusinessAdNetworkAnalyticsSyncQueryResult { + queryId: String + results: [JSON] +} + +type FacebookBusinessAdNetworkAnalyticsSyncQueryResultConnection { + nodes: [FacebookBusinessAdNetworkAnalyticsSyncQueryResult!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessTypeEnum { + ASYNC_ADGROUP_CREATION + BATCH_API + DRAFTS +} + +type FacebookBusinessJSONNode { + data: JSON! +} + +type FacebookBusinessJSONConnection { + nodes: [FacebookBusinessJSONNode!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessApplicationSupportedPlatforms { + AMAZON + ANDROID + CANVAS + GAMEROOM + INSTANT_GAME + IPAD + IPHONE + MOBILE_WEB + SUPPLEMENTARY_IMAGES + WEB + WINDOWS +} + +"""""" +type FacebookBusinessApplication { + aamRules: String + anAdSpaceLimit: Int + anPlatforms: [String] + androidKeyHash: [String] + androidSdkErrorCategories: [JSON] + appDomains: [String] + appEventsFeatureBitmask: Int + appEventsSessionTimeout: Int + appInstallTracked: Boolean + appName: String + appSignalsBindingIos: [JSON] + appType: Int + authDialogDataHelpUrl: String + authDialogHeadline: String + authDialogPermsExplanation: String + authReferralDefaultActivityPrivacy: String + authReferralEnabled: Int + authReferralExtendedPerms: [String] + authReferralFriendPerms: [String] + authReferralResponseType: String + authReferralUserPerms: [String] + autoEventMappingAndroid: [JSON] + autoEventMappingIos: [JSON] + autoEventSetupEnabled: Boolean + canvasFluidHeight: Boolean + canvasFluidWidth: Int + canvasUrl: String + category: String + clientConfig: JSON + company: String + configuredIosSso: Boolean + contactEmail: String + createdTime: String + creatorUid: String + dailyActiveUsers: String + dailyActiveUsersRank: Int + deauthCallbackUrl: String + defaultShareMode: String + description: String + financialId: String + gdpv4ChromeCustomTabsEnabled: Boolean + gdpv4Enabled: Boolean + gdpv4NuxContent: String + gdpv4NuxEnabled: Boolean + hasMessengerProduct: Boolean + hostingUrl: String + iconUrl: String + id: String + iosBundleId: [String] + iosSdkDialogFlows: JSON + iosSdkErrorCategories: [JSON] + iosSfvcAttr: Boolean + iosSupportsNativeProxyAuthFlow: Boolean + iosSupportsSystemAuth: Boolean + ipadAppStoreId: String + iphoneAppStoreId: String + latestSdkVersion: JSON + link: String + loggingToken: String + loginSecret: String + logoUrl: String + migrations: JSON + mobileProfileSectionUrl: String + mobileWebUrl: String + monthlyActiveUsers: String + monthlyActiveUsersRank: Int + name: String + namespace: String + objectStoreUrls: JSON + pageTabDefaultName: String + pageTabUrl: String + photoUrl: String + privacyPolicyUrl: String + profileSectionUrl: String + propertyId: String + realTimeModeDevices: [String] + restrictions: JSON + restrictiveDataFilterParams: String + restrictiveDataFilterRules: String + sdkUpdateMessage: String + seamlessLogin: Int + secureCanvasUrl: String + securePageTabUrl: String + serverIpWhitelist: String + smartLoginBookmarkIconUrl: String + smartLoginMenuIconUrl: String + socialDiscovery: Int + subcategory: String + suggestedEventsSetting: String + supportedPlatforms: [FacebookBusinessApplicationSupportedPlatforms] + supportsApprequestsFastAppSwitch: JSON + supportsAttribution: Boolean + supportsImplicitSdkLogging: Boolean + suppressNativeIosGdp: Boolean + termsOfServiceUrl: String + urlSchemeSuffix: String + userSupportEmail: String + userSupportUrl: String + websiteUrl: String + weeklyActiveUsers: String + accounts(type: FacebookBusinessTypeEnum, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + adNetworkAnalytics(until: String, since: String, orderingType: FacebookBusinessOrderingTypeEnum, orderingColumn: FacebookBusinessOrderingColumnEnum, metrics: [FacebookBusinessMetricsEnum!]!, filtersJson: [JSON!], breakdowns: [FacebookBusinessBreakdownsEnum!], aggregationPeriod: FacebookBusinessAggregationPeriodEnum, before: String, after: String, first: Int): FacebookBusinessAdNetworkAnalyticsSyncQueryResultConnection! + adNetworkAnalyticsResults(queryIds: [String!], before: String, after: String, first: Int): FacebookBusinessAdNetworkAnalyticsAsyncQueryResultConnection! + agencies(before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + appEventTypes(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + appInsights(until: String, since: String, period: FacebookBusinessPeriodEnum, metricKey: String!, intervalsToAggregate: Int, eventName: String, ecosystem: FacebookBusinessEcosystemEnum, breakdowns: [String!], aggregateby: FacebookBusinessAggregatebyEnum, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + appInstalledGroups(groupId: String, before: String, after: String, first: Int): FacebookBusinessGroupConnection! + appAssets(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + authorizedAdAccounts(business: String, before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + buttonAutoDetectionDeviceSelection(deviceId: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + daChecks(checks: [String!], before: String, after: String, first: Int): FacebookBusinessDACheckConnection! + events(type: FacebookBusinessTypeEnum, includeCanceled: Boolean, before: String, after: String, first: Int): FacebookBusinessEventConnection! + insightsPushSchedule(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + iosDialogConfigs(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + mobileSdkGk(sdkVersion: String!, platform: FacebookBusinessPlatformEnum!, extinfoJson: JSON, deviceId: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + ozoneRelease(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + permissions(status: [FacebookBusinessStatusEnum!], proxiedAppId: Int, iosBundleId: String, androidKeyHash: String, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + products(productIds: [String!], before: String, after: String, first: Int): FacebookBusinessJSONConnection! + purchases(isPremium: Boolean, before: String, after: String, first: Int): FacebookBusinessJSONConnection! + roles(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + subscribedDomains(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + subscribedDomainsPhishing(before: String, after: String, first: Int): FacebookBusinessJSONConnection! +} + +type FacebookBusinessApplicationConnection { + nodes: [FacebookBusinessApplication!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessAggregationEnum { + BROWSER_TYPE + CUSTOM_DATA_FIELD + DEVICE_OS + DEVICE_TYPE + EVENT + EVENT_DETECTION_METHOD + EVENT_PROCESSING_RESULTS + EVENT_SOURCE + EVENT_TOTAL_COUNTS + EVENT_VALUE_COUNT + HAD_PII + HOST + MATCH_KEYS + PIXEL_FIRE + URL + URL_BY_RULE +} + +"""""" +type FacebookBusinessAdsPixelStats { + count: Int + diagnosticsHourlyLastTimestamp: String + event: String + value: String +} + +"""""" +type FacebookBusinessAdsPixelStatsResult { + aggregation: String + data: [FacebookBusinessAdsPixelStats] + startTime: String +} + +type FacebookBusinessAdsPixelStatsResultConnection { + nodes: [FacebookBusinessAdsPixelStatsResult!]! + pageInfo: PageInfo! +} + +type FacebookBusinessBusinessConnection { + nodes: [FacebookBusinessBusiness!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessDACheck { + actionUri: String + description: String + key: String + result: String + title: String + userMessage: String +} + +type FacebookBusinessDACheckConnection { + nodes: [FacebookBusinessDACheck!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAssignedUser { + business: FacebookBusinessBusiness + id: String + name: String + userType: String +} + +type FacebookBusinessAssignedUserConnection { + nodes: [FacebookBusinessAssignedUser!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdsPixel { + automaticMatchingFields: [String] + canProxy: Boolean + code: String + creationTime: String + creator: FacebookBusinessUser + dataUseSetting: String + enableAutomaticMatching: Boolean + firstPartyCookieStatus: String + id: String + isCreatedByBusiness: Boolean + isUnavailable: Boolean + lastFiredTime: String + name: String + ownerAdAccount: FacebookBusinessAdAccount + ownerBusiness: FacebookBusinessBusiness + assignedUsers(business: String!, before: String, after: String, first: Int): FacebookBusinessAssignedUserConnection! + daChecks(checks: [String!], before: String, after: String, first: Int): FacebookBusinessDACheckConnection! + sharedAccounts(business: String!, before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + sharedAgencies(before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + stats(startTime: String, eventSource: String, event: String, endTime: String, aggregation: FacebookBusinessAggregationEnum, before: String, after: String, first: Int): FacebookBusinessAdsPixelStatsResultConnection! +} + +type FacebookBusinessAdsPixelConnection { + nodes: [FacebookBusinessAdsPixel!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdPlacePageSet { + accountId: String + id: String + locationTypes: [String] + name: String + pagesCount: Int + parentPage: FacebookBusinessPage +} + +type FacebookBusinessAdPlacePageSetConnection { + nodes: [FacebookBusinessAdPlacePageSet!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdStudyObjective { + id: String + isPrimary: Boolean + lastUpdatedResults: String + name: String + results: [String] + adPlacePageSets(before: String, after: String, first: Int): FacebookBusinessAdPlacePageSetConnection! + adsPixels(before: String, after: String, first: Int): FacebookBusinessAdsPixelConnection! + applications(before: String, after: String, first: Int): FacebookBusinessApplicationConnection! + customConversions(before: String, after: String, first: Int): FacebookBusinessCustomConversionConnection! + offlineConversionDataSets(before: String, after: String, first: Int): FacebookBusinessOfflineConversionDataSetConnection! + offsitePixels(before: String, after: String, first: Int): FacebookBusinessOffsitePixelConnection! + partnerStudies(before: String, after: String, first: Int): FacebookBusinessPartnerStudyConnection! +} + +type FacebookBusinessAdStudyObjectiveConnection { + nodes: [FacebookBusinessAdStudyObjective!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessPositionEnum { + ALL_PLACEMENTS + AN_CLASSIC + FACEBOOK_GROUPS_FEED + FACEBOOK_STORIES + FEED + GROUPS + HIDDEN_AAA + INSTAGRAM_EXPLORE + INSTAGRAM_IGTV + INSTAGRAM_STORIES + INSTANT_ARTICLE + INSTREAM_VIDEO + JOBS_BROWSER + MARKETPLACE + MESSENGER_INBOX + MESSENGER_STORIES + OTHERS + REWARDED_VIDEO + RIGHT_HAND_COLUMN + SEARCH + STATUS + SUGGESTED_VIDEO + UNKNOWN + VIDEO_FEEDS +} + +enum FacebookBusinessPlatformEnum { + AUDIENCE_NETWORK + FACEBOOK + HIDDEN_AAA + INSTAGRAM + MESSENGER + UNKNOWN + WHATSAPP +} + +"""""" +type FacebookBusinessContentDeliveryReport { + contentName: String + contentUrl: String + creatorName: String + creatorUrl: String + estimatedImpressions: Int +} + +type FacebookBusinessContentDeliveryReportConnection { + nodes: [FacebookBusinessContentDeliveryReport!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessEffectiveStatusEnum { + ACTIVE + ADSET_PAUSED + ARCHIVED + CAMPAIGN_PAUSED + DELETED + DISAPPROVED + IN_PROCESS + PAUSED + PENDING_BILLING_INFO + PENDING_REVIEW + PREAPPROVED + WITH_ISSUES +} + +"""""" +type FacebookBusinessTargetingSentenceLine { + id: String + params: FacebookBusinessTargeting +} + +type FacebookBusinessTargetingSentenceLineConnection { + nodes: [FacebookBusinessTargetingSentenceLine!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessVehicle { + address: JSON + availability: String + bodyStyle: String + condition: String + currency: String + customLabel0: String + dateFirstOnLot: String + dealerCommunicationChannel: String + dealerEmail: String + dealerId: String + dealerName: String + dealerPhone: String + dealerPrivacyPolicyUrl: String + description: String + drivetrain: String + exteriorColor: String + fbPageId: FacebookBusinessPage + features: [JSON] + fuelType: String + id: String + images: [String] + interiorColor: String + legalDisclosureImpressumUrl: String + make: String + mileage: JSON + model: String + previousCurrency: String + previousPrice: String + price: String + saleCurrency: String + salePrice: String + sanitizedImages: [String] + stateOfVehicle: String + title: String + transmission: String + trim: String + url: String + vehicleId: String + vehicleRegistrationPlate: String + vehicleSpecifications: [JSON] + vehicleType: String + vin: String + year: Int +} + +"""""" +type FacebookBusinessHomeListing { + acType: String + additionalFeesDescription: String + address: JSON + agentCompany: String + agentEmail: String + agentFbPageId: FacebookBusinessPage + agentName: String + agentPhone: String + areaSize: Int + areaUnit: String + availability: String + co2EmissionRatingEu: JSON + currency: String + daysOnMarket: Int + description: String + energyRatingEu: JSON + furnishType: String + groupId: String + heatingType: String + homeListingId: String + id: String + images: [String] + laundryType: String + listingType: String + maxCurrency: String + maxPrice: String + minCurrency: String + minPrice: String + name: String + numBaths: Float + numBeds: Float + numRooms: Float + numUnits: Int + parkingType: String + partnerVerification: String + petPolicy: String + price: String + propertyType: String + sanitizedImages: [String] + url: String + yearBuilt: Int +} + +"""""" +type FacebookBusinessUserLeadGenFieldData { + name: String + values: [String] +} + +"""""" +type FacebookBusinessUserLeadGenDisclaimerResponse { + checkboxKey: String + isChecked: String +} + +"""""" +type FacebookBusinessLead { + adId: String + adName: String + adsetId: String + adsetName: String + campaignId: String + campaignName: String + createdTime: String + customDisclaimerResponses: [FacebookBusinessUserLeadGenDisclaimerResponse] + fieldData: [FacebookBusinessUserLeadGenFieldData] + formId: String + homeListing: FacebookBusinessHomeListing + id: String + isOrganic: Boolean + partnerName: String + platform: String + retailerItemId: String + vehicle: FacebookBusinessVehicle +} + +type FacebookBusinessLeadConnection { + nodes: [FacebookBusinessLead!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessSummaryActionBreakdownsEnum { + ACTION_CANVAS_COMPONENT_NAME + ACTION_CAROUSEL_CARD_ID + ACTION_CAROUSEL_CARD_NAME + ACTION_DESTINATION + ACTION_DEVICE + ACTION_REACTION + ACTION_TARGET_ID + ACTION_TYPE + ACTION_VIDEO_SOUND + ACTION_VIDEO_TYPE +} + +enum FacebookBusinessLevelEnum { + ACCOUNT + AD + ADSET + CAMPAIGN +} + +enum FacebookBusinessBreakdownsEnum { + AD_FORMAT_ASSET + AGE + BODY_ASSET + CALL_TO_ACTION_ASSET + COUNTRY + DESCRIPTION_ASSET + DEVICE_PLATFORM + DMA + FREQUENCY_VALUE + GENDER + HOURLY_STATS_AGGREGATED_BY_ADVERTISER_TIME_ZONE + HOURLY_STATS_AGGREGATED_BY_AUDIENCE_TIME_ZONE + IMAGE_ASSET + IMPRESSION_DEVICE + LINK_URL_ASSET + PLACE_PAGE_ID + PLATFORM_POSITION + PRODUCT_ID + PUBLISHER_PLATFORM + REGION + TITLE_ASSET + VIDEO_ASSET +} + +enum FacebookBusinessActionReportTimeEnum { + CONVERSION + IMPRESSION +} + +enum FacebookBusinessActionBreakdownsEnum { + ACTION_CANVAS_COMPONENT_NAME + ACTION_CAROUSEL_CARD_ID + ACTION_CAROUSEL_CARD_NAME + ACTION_DESTINATION + ACTION_DEVICE + ACTION_REACTION + ACTION_TARGET_ID + ACTION_TYPE + ACTION_VIDEO_SOUND + ACTION_VIDEO_TYPE +} + +enum FacebookBusinessActionAttributionWindowsEnum { + VALUE_1D_CLICK + VALUE_1D_VIEW + VALUE_28D_CLICK + VALUE_28D_VIEW + VALUE_7D_CLICK + VALUE_7D_VIEW + DEFAULT +} + +"""""" +type FacebookBusinessAdsActionStats { + actionCanvasComponentId: String + actionCanvasComponentName: String + actionCarouselCardId: String + actionCarouselCardName: String + actionConvertedProductId: String + actionDestination: String + actionDevice: String + actionEventChannel: String + actionLinkClickDestination: String + actionLocationCode: String + actionReaction: String + actionTargetId: String + actionType: String + actionVideoAssetId: String + actionVideoSound: String + actionVideoType: String + dda: String + inline: String + interactiveComponentStickerId: String + interactiveComponentStickerResponse: String + value: String +} + +"""""" +type FacebookBusinessAdsInsights { + accountCurrency: String + accountId: String + accountName: String + actionValues: [FacebookBusinessAdsActionStats] + actions: [FacebookBusinessAdsActionStats] + adBidType: String + adBidValue: String + adClickActions: [FacebookBusinessAdsActionStats] + adDelivery: String + adId: String + adImpressionActions: [FacebookBusinessAdsActionStats] + adName: String + adsetBidType: String + adsetBidValue: String + adsetBudgetType: String + adsetBudgetValue: String + adsetDelivery: String + adsetEnd: String + adsetId: String + adsetName: String + adsetStart: String + ageTargeting: String + auctionBid: String + auctionCompetitiveness: String + auctionMaxCompetitorBid: String + buyingType: String + campaignId: String + campaignName: String + canvasAvgViewPercent: String + canvasAvgViewTime: String + clicks: String + conversionRateRanking: String + conversionValues: [FacebookBusinessAdsActionStats] + conversions: [FacebookBusinessAdsActionStats] + costPer15SecVideoView: [FacebookBusinessAdsActionStats] + costPer2SecContinuousVideoView: [FacebookBusinessAdsActionStats] + costPerActionType: [FacebookBusinessAdsActionStats] + costPerAdClick: [FacebookBusinessAdsActionStats] + costPerConversion: [FacebookBusinessAdsActionStats] + costPerDdaCountbyConvs: String + costPerEstimatedAdRecallers: String + costPerInlineLinkClick: String + costPerInlinePostEngagement: String + costPerOneThousandAdImpression: [FacebookBusinessAdsActionStats] + costPerOutboundClick: [FacebookBusinessAdsActionStats] + costPerStoreVisitAction: [FacebookBusinessAdsActionStats] + costPerThruplay: [FacebookBusinessAdsActionStats] + costPerUniqueActionType: [FacebookBusinessAdsActionStats] + costPerUniqueClick: String + costPerUniqueConversion: [FacebookBusinessAdsActionStats] + costPerUniqueInlineLinkClick: String + costPerUniqueOutboundClick: [FacebookBusinessAdsActionStats] + cpc: String + cpm: String + cpp: String + createdTime: String + ctr: String + dateStart: String + dateStop: String + ddaCountbyConvs: String + engagementRateRanking: String + estimatedAdRecallRate: String + estimatedAdRecallRateLowerBound: String + estimatedAdRecallRateUpperBound: String + estimatedAdRecallers: String + estimatedAdRecallersLowerBound: String + estimatedAdRecallersUpperBound: String + frequency: String + fullViewImpressions: String + fullViewReach: String + genderTargeting: String + impressions: String + inlineLinkClickCtr: String + inlineLinkClicks: String + inlinePostEngagement: String + instantExperienceClicksToOpen: String + instantExperienceClicksToStart: String + instantExperienceOutboundClicks: String + labels: String + location: String + mobileAppPurchaseRoas: [FacebookBusinessAdsActionStats] + objective: String + outboundClicks: [FacebookBusinessAdsActionStats] + outboundClicksCtr: [FacebookBusinessAdsActionStats] + placePageName: String + purchaseRoas: [FacebookBusinessAdsActionStats] + qualityRanking: String + qualityScoreEctr: String + qualityScoreEcvr: String + qualityScoreOrganic: String + reach: String + socialSpend: String + spend: String + storeVisitActions: [FacebookBusinessAdsActionStats] + uniqueActions: [FacebookBusinessAdsActionStats] + uniqueClicks: String + uniqueConversions: [FacebookBusinessAdsActionStats] + uniqueCtr: String + uniqueInlineLinkClickCtr: String + uniqueInlineLinkClicks: String + uniqueLinkClicksCtr: String + uniqueOutboundClicks: [FacebookBusinessAdsActionStats] + uniqueOutboundClicksCtr: [FacebookBusinessAdsActionStats] + uniqueVideoContinuous2SecWatchedActions: [FacebookBusinessAdsActionStats] + uniqueVideoView15Sec: [FacebookBusinessAdsActionStats] + updatedTime: String + video15SecWatchedActions: [FacebookBusinessAdsActionStats] + video30SecWatchedActions: [FacebookBusinessAdsActionStats] + videoAvgTimeWatchedActions: [FacebookBusinessAdsActionStats] + videoContinuous2SecWatchedActions: [FacebookBusinessAdsActionStats] + videoP100WatchedActions: [FacebookBusinessAdsActionStats] + videoP25WatchedActions: [FacebookBusinessAdsActionStats] + videoP50WatchedActions: [FacebookBusinessAdsActionStats] + videoP75WatchedActions: [FacebookBusinessAdsActionStats] + videoP95WatchedActions: [FacebookBusinessAdsActionStats] + videoPlayActions: [FacebookBusinessAdsActionStats] + videoPlayCurveActions: [JSON] + videoPlayRetention0To15sActions: [JSON] + videoPlayRetention20To60sActions: [JSON] + videoPlayRetentionGraphActions: [JSON] + videoThruplayWatchedActions: [FacebookBusinessAdsActionStats] + videoTimeWatchedActions: [FacebookBusinessAdsActionStats] + websiteCtr: [FacebookBusinessAdsActionStats] + websitePurchaseRoas: [FacebookBusinessAdsActionStats] + wishBid: String +} + +type FacebookBusinessAdsInsightsConnection { + nodes: [FacebookBusinessAdsInsights!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessDatePresetEnum { + LAST_14D + LAST_28D + LAST_30D + LAST_3D + LAST_7D + LAST_90D + LAST_MONTH + LAST_QUARTER + LAST_WEEK_MON_SUN + LAST_WEEK_SUN_SAT + LAST_YEAR + LIFETIME + THIS_MONTH + THIS_QUARTER + THIS_WEEK_MON_TODAY + THIS_WEEK_SUN_TODAY + THIS_YEAR + TODAY + YESTERDAY +} + +type FacebookBusinessAdCreativeConnection { + nodes: [FacebookBusinessAdCreative!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessTrackingAndConversionWithDefaults { + customConversion: [JSON] + customTracking: [JSON] + defaultConversion: [JSON] + defaultTracking: [JSON] +} + +"""""" +type FacebookBusinessTargetingProspectingAudience { + sources: [JSON] +} + +"""""" +type FacebookBusinessFlexibleTargeting { + behaviors: [FacebookBusinessIDName] + collegeYears: [Int] + connections: [FacebookBusinessIDName] + customAudiences: [FacebookBusinessIDName] + educationMajors: [FacebookBusinessIDName] + educationSchools: [FacebookBusinessIDName] + educationStatuses: [Int] + ethnicAffinity: [FacebookBusinessIDName] + familyStatuses: [FacebookBusinessIDName] + friendsOfConnections: [FacebookBusinessIDName] + generation: [FacebookBusinessIDName] + homeOwnership: [FacebookBusinessIDName] + homeType: [FacebookBusinessIDName] + homeValue: [FacebookBusinessIDName] + householdComposition: [FacebookBusinessIDName] + income: [FacebookBusinessIDName] + industries: [FacebookBusinessIDName] + interestedIn: [Int] + interests: [FacebookBusinessIDName] + lifeEvents: [FacebookBusinessIDName] + moms: [FacebookBusinessIDName] + netWorth: [FacebookBusinessIDName] + officeType: [FacebookBusinessIDName] + politics: [FacebookBusinessIDName] + relationshipStatuses: [Int] + userAdclusters: [FacebookBusinessIDName] + workEmployers: [FacebookBusinessIDName] + workPositions: [FacebookBusinessIDName] +} + +"""""" +type FacebookBusinessTargetingProductAudienceSubSpec { + retentionSeconds: String + rule: String +} + +"""""" +type FacebookBusinessTargetingProductAudienceSpec { + exclusions: [FacebookBusinessTargetingProductAudienceSubSpec] + inclusions: [FacebookBusinessTargetingProductAudienceSubSpec] + productSetId: String +} + +"""""" +type FacebookBusinessTargetingGeoLocationZip { + country: String + key: String + name: String + primaryCityId: Int + regionId: Int +} + +"""""" +type FacebookBusinessTargetingGeoLocationRegion { + country: String + key: String + name: String +} + +"""""" +type FacebookBusinessTargetingGeoLocationPoliticalDistrict { + country: String + key: String + name: String + politicalDistrict: String +} + +"""""" +type FacebookBusinessTargetingGeoLocationPlace { + country: String + distanceUnit: String + key: String + latitude: Float + longitude: Float + name: String + primaryCityId: Int + radius: Float + regionId: Int +} + +"""""" +type FacebookBusinessTargetingGeoLocationLocationExpansion { + allowed: Boolean +} + +"""""" +type FacebookBusinessTargetingGeoLocationLocationCluster { + key: Int +} + +"""""" +type FacebookBusinessTargetingGeoLocationGeoEntities { + country: String + key: String + name: String + region: String + regionId: String +} + +"""""" +type FacebookBusinessTargetingGeoLocationMarket { + country: String + key: String + marketType: String + name: String +} + +"""""" +type FacebookBusinessTargetingGeoLocationElectoralDistrict { + country: String + electoralDistrict: String + key: String + name: String +} + +"""""" +type FacebookBusinessTargetingGeoLocationCustomLocation { + addressString: String + country: String + countryGroup: String + customType: String + distanceUnit: String + key: String + latitude: Float + longitude: Float + maxPopulation: Int + minPopulation: Int + name: String + primaryCityId: Int + radius: Float + regionId: Int +} + +"""""" +type FacebookBusinessTargetingGeoLocationCity { + country: String + distanceUnit: String + key: String + name: String + radius: Int + region: String + regionId: String +} + +"""""" +type FacebookBusinessTargetingGeoLocation { + cities: [FacebookBusinessTargetingGeoLocationCity] + countries: [String] + countryGroups: [String] + customLocations: [FacebookBusinessTargetingGeoLocationCustomLocation] + electoralDistricts: [FacebookBusinessTargetingGeoLocationElectoralDistrict] + geoMarkets: [FacebookBusinessTargetingGeoLocationMarket] + largeGeoAreas: [FacebookBusinessTargetingGeoLocationGeoEntities] + locationClusterIds: [FacebookBusinessTargetingGeoLocationLocationCluster] + locationExpansion: FacebookBusinessTargetingGeoLocationLocationExpansion + locationTypes: [String] + mediumGeoAreas: [FacebookBusinessTargetingGeoLocationGeoEntities] + metroAreas: [FacebookBusinessTargetingGeoLocationGeoEntities] + neighborhoods: [FacebookBusinessTargetingGeoLocationGeoEntities] + places: [FacebookBusinessTargetingGeoLocationPlace] + politicalDistricts: [FacebookBusinessTargetingGeoLocationPoliticalDistrict] + regions: [FacebookBusinessTargetingGeoLocationRegion] + smallGeoAreas: [FacebookBusinessTargetingGeoLocationGeoEntities] + subcities: [FacebookBusinessTargetingGeoLocationGeoEntities] + subneighborhoods: [FacebookBusinessTargetingGeoLocationGeoEntities] + zips: [FacebookBusinessTargetingGeoLocationZip] +} + +"""""" +type FacebookBusinessTargetingDynamicRule { + adGroupId: String + campaignGroupId: String + campaignId: String + impressionCount: String + pageId: String + post: String + retentionSeconds: String +} + +enum FacebookBusinessTargetingEffectiveDevicePlatforms { + CONNECTED_TV + DESKTOP + MOBILE +} + +enum FacebookBusinessTargetingDevicePlatforms { + CONNECTED_TV + DESKTOP + MOBILE +} + +"""""" +type FacebookBusinessRawCustomAudience { + id: String + name: String +} + +"""""" +type FacebookBusinessCatalogBasedTargeting { + geoTargetingType: String +} + +"""""" +type FacebookBusinessIDName { + id: String + name: String +} + +"""""" +type FacebookBusinessTargeting { + adgroupId: String + ageMax: Int + ageMin: Int + alternateAutoTargetingOption: String + appInstallState: String + audienceNetworkPositions: [String] + behaviors: [FacebookBusinessIDName] + brandSafetyContentFilterLevels: [String] + catalogBasedTargeting: FacebookBusinessCatalogBasedTargeting + cities: [FacebookBusinessIDName] + collegeYears: [Int] + connections: [FacebookBusinessIDName] + contextualTargetingCategories: [FacebookBusinessIDName] + countries: [String] + country: [String] + countryGroups: [String] + customAudiences: [FacebookBusinessRawCustomAudience] + devicePlatforms: [FacebookBusinessTargetingDevicePlatforms] + directInstallDevices: Boolean + dynamicAudienceIds: [String] + educationMajors: [FacebookBusinessIDName] + educationSchools: [FacebookBusinessIDName] + educationStatuses: [Int] + effectiveAudienceNetworkPositions: [String] + effectiveDevicePlatforms: [FacebookBusinessTargetingEffectiveDevicePlatforms] + effectiveFacebookPositions: [String] + effectiveInstagramPositions: [String] + effectiveMessengerPositions: [String] + effectivePublisherPlatforms: [String] + engagementSpecs: [FacebookBusinessTargetingDynamicRule] + ethnicAffinity: [FacebookBusinessIDName] + excludeReachedSince: [String] + excludedBrandSafetyContentTypes: [String] + excludedConnections: [FacebookBusinessIDName] + excludedCustomAudiences: [FacebookBusinessRawCustomAudience] + excludedDynamicAudienceIds: [String] + excludedEngagementSpecs: [FacebookBusinessTargetingDynamicRule] + excludedGeoLocations: FacebookBusinessTargetingGeoLocation + excludedMobileDeviceModel: [String] + excludedProductAudienceSpecs: [FacebookBusinessTargetingProductAudienceSpec] + excludedPublisherCategories: [String] + excludedPublisherListIds: [String] + excludedUserDevice: [String] + exclusions: FacebookBusinessFlexibleTargeting + facebookPositions: [String] + familyStatuses: [FacebookBusinessIDName] + fbDealId: String + flexibleSpec: [FacebookBusinessFlexibleTargeting] + friendsOfConnections: [FacebookBusinessIDName] + genders: [Int] + generation: [FacebookBusinessIDName] + geoLocations: FacebookBusinessTargetingGeoLocation + homeOwnership: [FacebookBusinessIDName] + homeType: [FacebookBusinessIDName] + homeValue: [FacebookBusinessIDName] + householdComposition: [FacebookBusinessIDName] + income: [FacebookBusinessIDName] + industries: [FacebookBusinessIDName] + instagramPositions: [String] + interestedIn: [Int] + interests: [FacebookBusinessIDName] + isWhatsappDestinationAd: Boolean + keywords: [String] + lifeEvents: [FacebookBusinessIDName] + locales: [Int] + messengerPositions: [String] + moms: [FacebookBusinessIDName] + netWorth: [FacebookBusinessIDName] + officeType: [FacebookBusinessIDName] + placePageSetIds: [String] + politicalViews: [Int] + politics: [FacebookBusinessIDName] + productAudienceSpecs: [FacebookBusinessTargetingProductAudienceSpec] + prospectingAudience: FacebookBusinessTargetingProspectingAudience + publisherPlatforms: [String] + radius: String + regions: [FacebookBusinessIDName] + relationshipStatuses: [Int] + siteCategory: [String] + targetingOptimization: String + userAdclusters: [FacebookBusinessIDName] + userDevice: [String] + userEvent: [Int] + userOs: [String] + wirelessCarrier: [String] + workEmployers: [FacebookBusinessIDName] + workPositions: [FacebookBusinessIDName] + zips: [String] +} + +enum FacebookBusinessAdStatus { + ACTIVE + ARCHIVED + DELETED + PAUSED +} + +"""""" +type FacebookBusinessAdgroupIssuesInfo { + errorCode: Int + errorMessage: String + errorSummary: String + errorType: String + level: String +} + +"""""" +type FacebookBusinessDeliveryCheckExtraInfo { + adgroupIds: [String] + campaignIds: [String] + countries: [String] +} + +"""""" +type FacebookBusinessDeliveryCheck { + checkName: String + description: String + extraInfo: FacebookBusinessDeliveryCheckExtraInfo + summary: String +} + +enum FacebookBusinessAdEffectiveStatus { + ACTIVE + ADSET_PAUSED + ARCHIVED + CAMPAIGN_PAUSED + DELETED + DISAPPROVED + IN_PROCESS + PAUSED + PENDING_BILLING_INFO + PENDING_REVIEW + PREAPPROVED + WITH_ISSUES +} + +enum FacebookBusinessRenderTypeEnum { + FALLBACK +} + +enum FacebookBusinessAdFormatEnum { + AUDIENCE_NETWORK_INSTREAM_VIDEO + AUDIENCE_NETWORK_INSTREAM_VIDEO_MOBILE + AUDIENCE_NETWORK_OUTSTREAM_VIDEO + AUDIENCE_NETWORK_REWARDED_VIDEO + DESKTOP_FEED_STANDARD + FACEBOOK_STORY_MOBILE + INSTAGRAM_EXPLORE_CONTEXTUAL + INSTAGRAM_EXPLORE_IMMERSIVE + INSTAGRAM_STANDARD + INSTAGRAM_STORY + INSTANT_ARTICLE_RECIRCULATION_AD + INSTANT_ARTICLE_STANDARD + INSTREAM_VIDEO_DESKTOP + INSTREAM_VIDEO_MOBILE + JOB_BROWSER_DESKTOP + JOB_BROWSER_MOBILE + MARKETPLACE_MOBILE + MESSENGER_MOBILE_INBOX_MEDIA + MESSENGER_MOBILE_STORY_MEDIA + MOBILE_BANNER + MOBILE_FEED_BASIC + MOBILE_FEED_STANDARD + MOBILE_FULLWIDTH + MOBILE_INTERSTITIAL + MOBILE_MEDIUM_RECTANGLE + MOBILE_NATIVE + RIGHT_COLUMN_STANDARD + SUGGESTED_VIDEO_DESKTOP + SUGGESTED_VIDEO_MOBILE + WATCH_FEED_MOBILE +} + +"""""" +type FacebookBusinessAdPreview { + body: String +} + +type FacebookBusinessAdPreviewConnection { + nodes: [FacebookBusinessAdPreview!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdCreativeInsights { + aesthetics: JSON +} + +type FacebookBusinessAdCreativeInsightsConnection { + nodes: [FacebookBusinessAdCreativeInsights!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdCreativeTemplateURLSpec { + android: JSON + config: JSON + ios: JSON + ipad: JSON + iphone: JSON + web: JSON + windowsPhone: JSON +} + +enum FacebookBusinessAdcreativeStatus { + ACTIVE + DELETED + IN_PROCESS + WITH_ISSUES +} + +"""""" +type FacebookBusinessAdCreativeRecommenderSettings { + preferredEvents: [String] + productSalesChannel: String +} + +"""""" +type FacebookBusinessAdCreativePortraitCustomizations { + specifications: [JSON] +} + +"""""" +type FacebookBusinessAdCreativePlatformCustomization { + instagram: JSON +} + +enum FacebookBusinessAdcreativeObjectType { + APPLICATION + DOMAIN + EVENT + INVALID + OFFER + PAGE + PHOTO + POST_DELETED + PRIVACY_CHECK_FAIL + SHARE + STATUS + STORE_ITEM + VIDEO +} + +"""""" +type FacebookBusinessAdCreativeInteractiveComponentsSpec { + components: [JSON] +} + +enum FacebookBusinessAdcreativeCallToActionType { + ADD_TO_CART + APPLY_NOW + BOOK_TRAVEL + BUY + BUY_NOW + BUY_TICKETS + CALL + CALL_ME + CONTACT + CONTACT_US + DONATE + DONATE_NOW + DOWNLOAD + EVENT_RSVP + FIND_A_GROUP + FIND_YOUR_GROUPS + FOLLOW_NEWS_STORYLINE + GET_DIRECTIONS + GET_OFFER + GET_OFFER_VIEW + GET_QUOTE + GET_SHOWTIMES + INSTALL_APP + INSTALL_MOBILE_APP + LEARN_MORE + LIKE_PAGE + LISTEN_MUSIC + LISTEN_NOW + MESSAGE_PAGE + MOBILE_DOWNLOAD + MOMENTS + NO_BUTTON + OPEN_LINK + ORDER_NOW + PLAY_GAME + RECORD_NOW + SAY_THANKS + SEE_MORE + SELL_NOW + SHARE + SHOP_NOW + SIGN_UP + SOTTO_SUBSCRIBE + SUBSCRIBE + UPDATE_APP + USE_APP + USE_MOBILE_APP + VIDEO_ANNOTATION + VISIT_PAGES_FEED + WATCH_MORE + WATCH_VIDEO + WHATSAPP_MESSAGE + WOODHENGE_SUPPORT +} + +"""""" +type FacebookBusinessAdAssetFeedSpecVideo { + adlabels: [FacebookBusinessAdAssetFeedSpecAssetLabel] + captionIds: [String] + thumbnailHash: String + thumbnailUrl: String + urlTags: String + videoId: String +} + +"""""" +type FacebookBusinessAdAssetFeedSpecTitle { + adlabels: [FacebookBusinessAdAssetFeedSpecAssetLabel] + text: String + urlTags: String +} + +"""""" +type FacebookBusinessAdAssetFeedSpecLinkURL { + adlabels: [FacebookBusinessAdAssetFeedSpecAssetLabel] + carouselSeeMoreUrl: String + deeplinkUrl: String + displayUrl: String + urlTags: String + websiteUrl: String +} + +"""""" +type FacebookBusinessAdsImageCrops { + data: JSON +} + +"""""" +type FacebookBusinessAdAssetFeedSpecImage { + adlabels: [FacebookBusinessAdAssetFeedSpecAssetLabel] + hash: String + imageCrops: FacebookBusinessAdsImageCrops + url: String + urlTags: String +} + +"""""" +type FacebookBusinessAdAssetFeedSpecGroupRule { + bodyLabel: FacebookBusinessAdAssetFeedSpecAssetLabel + captionLabel: FacebookBusinessAdAssetFeedSpecAssetLabel + descriptionLabel: FacebookBusinessAdAssetFeedSpecAssetLabel + imageLabel: FacebookBusinessAdAssetFeedSpecAssetLabel + linkUrlLabel: FacebookBusinessAdAssetFeedSpecAssetLabel + titleLabel: FacebookBusinessAdAssetFeedSpecAssetLabel + videoLabel: FacebookBusinessAdAssetFeedSpecAssetLabel +} + +"""""" +type FacebookBusinessAdAssetFeedSpecDescription { + adlabels: [FacebookBusinessAdAssetFeedSpecAssetLabel] + text: String + urlTags: String +} + +"""""" +type FacebookBusinessAdAssetFeedSpecCaption { + adlabels: [FacebookBusinessAdAssetFeedSpecAssetLabel] + text: String + urlTags: String +} + +enum FacebookBusinessAdassetfeedspecCallToActionTypes { + ADD_TO_CART + APPLY_NOW + BOOK_TRAVEL + BUY + BUY_NOW + BUY_TICKETS + CALL + CALL_ME + CONTACT + CONTACT_US + DONATE + DONATE_NOW + DOWNLOAD + EVENT_RSVP + FIND_A_GROUP + FIND_YOUR_GROUPS + FOLLOW_NEWS_STORYLINE + GET_DIRECTIONS + GET_OFFER + GET_OFFER_VIEW + GET_QUOTE + GET_SHOWTIMES + INSTALL_APP + INSTALL_MOBILE_APP + LEARN_MORE + LIKE_PAGE + LISTEN_MUSIC + LISTEN_NOW + MESSAGE_PAGE + MOBILE_DOWNLOAD + MOMENTS + NO_BUTTON + OPEN_LINK + ORDER_NOW + PLAY_GAME + RECORD_NOW + SAY_THANKS + SEE_MORE + SELL_NOW + SHARE + SHOP_NOW + SIGN_UP + SOTTO_SUBSCRIBE + SUBSCRIBE + UPDATE_APP + USE_APP + USE_MOBILE_APP + VIDEO_ANNOTATION + VISIT_PAGES_FEED + WATCH_MORE + WATCH_VIDEO + WHATSAPP_MESSAGE + WOODHENGE_SUPPORT +} + +"""""" +type FacebookBusinessAdAssetFeedSpecAssetLabel { + id: String + name: String +} + +"""""" +type FacebookBusinessAdAssetFeedSpecBody { + adlabels: [FacebookBusinessAdAssetFeedSpecAssetLabel] + text: String + urlTags: String +} + +"""""" +type FacebookBusinessAdAssetFeedSpec { + adFormats: [String] + additionalData: JSON + assetCustomizationRules: [JSON] + autotranslate: [String] + bodies: [FacebookBusinessAdAssetFeedSpecBody] + callToActionTypes: [FacebookBusinessAdassetfeedspecCallToActionTypes] + captions: [FacebookBusinessAdAssetFeedSpecCaption] + carousels: [JSON] + descriptions: [FacebookBusinessAdAssetFeedSpecDescription] + groups: [FacebookBusinessAdAssetFeedSpecGroupRule] + images: [FacebookBusinessAdAssetFeedSpecImage] + linkUrls: [FacebookBusinessAdAssetFeedSpecLinkURL] + optimizationType: String + titles: [FacebookBusinessAdAssetFeedSpecTitle] + videos: [FacebookBusinessAdAssetFeedSpecVideo] +} + +enum FacebookBusinessAdcreativeApplinkTreatment { + DEEPLINK_WITH_APPSTORE_FALLBACK + DEEPLINK_WITH_WEB_FALLBACK + WEB_ONLY +} + +"""""" +type FacebookBusinessAdCreative { + accountId: String + actorId: String + adlabels: [FacebookBusinessAdLabel] + applinkTreatment: FacebookBusinessAdcreativeApplinkTreatment + assetFeedSpec: FacebookBusinessAdAssetFeedSpec + authorizationCategory: String + autoUpdate: Boolean + body: String + brandedContentSponsorPageId: String + bundleFolderId: String + callToActionType: FacebookBusinessAdcreativeCallToActionType + categorizationCriteria: String + categoryMediaSource: String + destinationSetId: String + dynamicAdVoice: String + effectiveAuthorizationCategory: String + effectiveInstagramMediaId: String + effectiveInstagramStoryId: String + effectiveObjectStoryId: String + enableDirectInstall: Boolean + enableLaunchInstantApp: Boolean + id: String + imageCrops: FacebookBusinessAdsImageCrops + imageHash: String + imageUrl: String + instagramActorId: String + instagramPermalinkUrl: String + instagramStoryId: String + interactiveComponentsSpec: FacebookBusinessAdCreativeInteractiveComponentsSpec + linkDeepLinkUrl: String + linkDestinationDisplayUrl: String + linkOgId: String + linkUrl: String + messengerSponsoredMessage: String + name: String + objectId: String + objectStoreUrl: String + objectStoryId: String + objectType: FacebookBusinessAdcreativeObjectType + objectUrl: String + placePageSetId: String + platformCustomizations: FacebookBusinessAdCreativePlatformCustomization + playableAssetId: String + portraitCustomizations: FacebookBusinessAdCreativePortraitCustomizations + productSetId: String + recommenderSettings: FacebookBusinessAdCreativeRecommenderSettings + status: FacebookBusinessAdcreativeStatus + templateUrl: String + templateUrlSpec: FacebookBusinessAdCreativeTemplateURLSpec + thumbnailUrl: String + title: String + urlTags: String + usePageActorOverride: Boolean + videoId: String + creativeInsights(before: String, after: String, first: Int): FacebookBusinessAdCreativeInsightsConnection! + previews(width: Int, startDate: String, renderType: FacebookBusinessRenderTypeEnum, productItemIds: [String!], postJson: JSON, placePageId: Int, locale: String, height: Int, endDate: String, dynamicCustomizationJson: JSON, dynamicCreativeSpecJson: JSON, dynamicAssetLabel: String, adFormat: FacebookBusinessAdFormatEnum!, before: String, after: String, first: Int): FacebookBusinessAdPreviewConnection! +} + +"""""" +type FacebookBusinessConversionActionQuery { + application: [JSON] + conversionId: [String] + creative: [JSON] + dataset: [String] + event: [String] + eventType: [String] + fbPixel: [String] + fbPixelEvent: [String] + leadgen: [String] + object: [String] + offer: [String] + offsitePixel: [String] + page: [String] + post: [String] + question: [String] + response: [String] + subtype: [String] +} + +enum FacebookBusinessAdConfiguredStatus { + ACTIVE + ARCHIVED + DELETED + PAUSED +} + +enum FacebookBusinessAdBidType { + ABSOLUTE_OCPM + CPA + CPC + CPM + MULTI_PREMIUM +} + +"""""" +type FacebookBusinessAdgroupPlacementSpecificReviewFeedback { + accountAdmin: JSON + ad: JSON + b2c: JSON + bsg: JSON + cityCommunity: JSON + dailyDeals: JSON + dailyDealsLegacy: JSON + dpa: JSON + facebook: JSON + facebookPagesLiveShopping: JSON + instagram: JSON + instagramShop: JSON + leadGenHoneypot: JSON + marketplace: JSON + marketplaceHomeRentals: JSON + marketplaceHomeSales: JSON + marketplaceMotors: JSON + marketplaceShops: JSON + maxReviewPlacements: JSON + pageAdmin: JSON + product: JSON + productService: JSON + profile: JSON + seller: JSON + shops: JSON + trafficQuality: JSON + whatsapp: JSON +} + +"""""" +type FacebookBusinessAdgroupReviewFeedback { + global: JSON + placementSpecific: FacebookBusinessAdgroupPlacementSpecificReviewFeedback +} + +"""""" +type FacebookBusinessAd { + accountId: String + adReviewFeedback: FacebookBusinessAdgroupReviewFeedback + adlabels: [FacebookBusinessAdLabel] + adset: FacebookBusinessAdSet + adsetId: String + bidAmount: Int + bidInfo: JSON + bidType: FacebookBusinessAdBidType + campaign: FacebookBusinessCampaign + campaignId: String + configuredStatus: FacebookBusinessAdConfiguredStatus + conversionSpecs: [FacebookBusinessConversionActionQuery] + createdTime: String + creative: FacebookBusinessAdCreative + demolinkHash: String + displaySequence: Int + effectiveStatus: FacebookBusinessAdEffectiveStatus + engagementAudience: Boolean + failedDeliveryChecks: [FacebookBusinessDeliveryCheck] + id: String + isAutobid: Boolean + issuesInfo: [FacebookBusinessAdgroupIssuesInfo] + lastUpdatedByAppId: String + name: String + previewShareableLink: String + priority: Int + recommendations: [FacebookBusinessAdRecommendation] + sourceAd: FacebookBusinessAd + sourceAdId: String + status: FacebookBusinessAdStatus + targeting: FacebookBusinessTargeting + trackingAndConversionWithDefaults: FacebookBusinessTrackingAndConversionWithDefaults + trackingSpecs: [FacebookBusinessConversionActionQuery] + updatedTime: String + adCreatives(before: String, after: String, first: Int): FacebookBusinessAdCreativeConnection! + adRulesGoverned(passEvaluation: Boolean, before: String, after: String, first: Int): FacebookBusinessAdRuleConnection! + copies(updatedSince: Int, timeRangeJson: JSON, effectiveStatus: [String!], datePreset: FacebookBusinessDatePresetEnum, before: String, after: String, first: Int): FacebookBusinessAdConnection! + insights(useAccountAttributionSetting: Boolean, timeRangesJson: [JSON!], timeRangeJson: JSON, timeIncrement: String, summaryActionBreakdowns: [FacebookBusinessSummaryActionBreakdownsEnum!], summary: [String!], sort: [String!], productIdLimit: Int, level: FacebookBusinessLevelEnum, filteringJson: [JSON!], fields: [String!], exportName: String, exportFormat: String, exportColumns: [String!], defaultSummary: Boolean, datePreset: FacebookBusinessDatePresetEnum, breakdowns: [FacebookBusinessBreakdownsEnum!], actionReportTime: FacebookBusinessActionReportTimeEnum, actionBreakdowns: [FacebookBusinessActionBreakdownsEnum!], actionAttributionWindows: [FacebookBusinessActionAttributionWindowsEnum!], before: String, after: String, first: Int): FacebookBusinessAdsInsightsConnection! + leads(before: String, after: String, first: Int): FacebookBusinessLeadConnection! + previews(width: Int, startDate: String, renderType: FacebookBusinessRenderTypeEnum, productItemIds: [String!], postJson: JSON, placePageId: Int, locale: String, height: Int, endDate: String, dynamicCustomizationJson: JSON, dynamicCreativeSpecJson: JSON, dynamicAssetLabel: String, adFormat: FacebookBusinessAdFormatEnum!, before: String, after: String, first: Int): FacebookBusinessAdPreviewConnection! + targetingSentenceLines(before: String, after: String, first: Int): FacebookBusinessTargetingSentenceLineConnection! +} + +type FacebookBusinessAdConnection { + nodes: [FacebookBusinessAd!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessActionEnum { + BUDGET_NOT_REDISTRIBUTED + CHANGED_BID + CHANGED_BUDGET + EMAIL + ENDPOINT_PINGED + ERROR + FACEBOOK_NOTIFICATION_SENT + MESSAGE_SENT + NOT_CHANGED + PAUSED + UNPAUSED +} + +enum FacebookBusinessAdrulehistoryresultObjectType { + AD + ADSET + CAMPAIGN +} + +"""""" +type FacebookBusinessAdRuleHistoryResultAction { + action: String + field: String + newValue: String + oldValue: String +} + +"""""" +type FacebookBusinessAdRuleHistoryResult { + actions: [FacebookBusinessAdRuleHistoryResultAction] + objectId: String + objectType: FacebookBusinessAdrulehistoryresultObjectType +} + +"""""" +type FacebookBusinessAdRuleHistory { + evaluationSpec: FacebookBusinessAdRuleEvaluationSpec + exceptionCode: Int + exceptionMessage: String + executionSpec: FacebookBusinessAdRuleExecutionSpec + isManual: Boolean + results: [FacebookBusinessAdRuleHistoryResult] + scheduleSpec: FacebookBusinessAdRuleScheduleSpec + timestamp: String +} + +type FacebookBusinessAdRuleHistoryConnection { + nodes: [FacebookBusinessAdRuleHistory!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdRuleSchedule { + days: [Int] + endMinute: Int + startMinute: Int +} + +"""""" +type FacebookBusinessAdRuleScheduleSpec { + schedule: [FacebookBusinessAdRuleSchedule] + scheduleType: String +} + +enum FacebookBusinessAdruleexecutionspecExecutionType { + CHANGE_BID + CHANGE_BUDGET + CHANGE_CAMPAIGN_BUDGET + NOTIFICATION + PAUSE + PING_ENDPOINT + REBALANCE_BUDGET + ROTATE + UNPAUSE +} + +enum FacebookBusinessAdruleexecutionoptionsOperator { + EQUAL + IN +} + +"""""" +type FacebookBusinessAdRuleExecutionOptions { + field: String + operator: FacebookBusinessAdruleexecutionoptionsOperator + value: JSON +} + +"""""" +type FacebookBusinessAdRuleExecutionSpec { + executionOptions: [FacebookBusinessAdRuleExecutionOptions] + executionType: FacebookBusinessAdruleexecutionspecExecutionType +} + +enum FacebookBusinessAdruletriggerOperator { + ALL + ANY + CONTAIN + EQUAL + GREATER_THAN + IN + IN_RANGE + LESS_THAN + NONE + NOT_CONTAIN + NOT_EQUAL + NOT_IN + NOT_IN_RANGE +} + +"""""" +type FacebookBusinessAdRuleTrigger { + field: String + operator: FacebookBusinessAdruletriggerOperator + value: JSON +} + +enum FacebookBusinessAdrulefiltersOperator { + ALL + ANY + CONTAIN + EQUAL + GREATER_THAN + IN + IN_RANGE + LESS_THAN + NONE + NOT_CONTAIN + NOT_EQUAL + NOT_IN + NOT_IN_RANGE +} + +"""""" +type FacebookBusinessAdRuleFilters { + field: String + operator: FacebookBusinessAdrulefiltersOperator + value: JSON +} + +enum FacebookBusinessAdruleevaluationspecEvaluationType { + SCHEDULE + TRIGGER +} + +"""""" +type FacebookBusinessAdRuleEvaluationSpec { + evaluationType: FacebookBusinessAdruleevaluationspecEvaluationType + filters: [FacebookBusinessAdRuleFilters] + trigger: FacebookBusinessAdRuleTrigger +} + +"""""" +type FacebookBusinessAdRule { + accountId: String + createdBy: FacebookBusinessUser + createdTime: String + evaluationSpec: FacebookBusinessAdRuleEvaluationSpec + executionSpec: FacebookBusinessAdRuleExecutionSpec + id: String + name: String + scheduleSpec: FacebookBusinessAdRuleScheduleSpec + status: String + updatedTime: String + history(objectId: String, hideNoChanges: Boolean, action: FacebookBusinessActionEnum, before: String, after: String, first: Int): FacebookBusinessAdRuleHistoryConnection! +} + +type FacebookBusinessAdRuleConnection { + nodes: [FacebookBusinessAdRule!]! + pageInfo: PageInfo! +} + +enum FacebookBusinessCampaignStatus { + ACTIVE + ARCHIVED + DELETED + PAUSED +} + +"""""" +type FacebookBusinessAdRecommendationData { + link: String +} + +enum FacebookBusinessAdrecommendationImportance { + HIGH + LOW + MEDIUM +} + +enum FacebookBusinessAdrecommendationConfidence { + HIGH + LOW + MEDIUM +} + +"""""" +type FacebookBusinessAdRecommendation { + blameField: String + code: Int + confidence: FacebookBusinessAdrecommendationConfidence + importance: FacebookBusinessAdrecommendationImportance + message: String + recommendationData: FacebookBusinessAdRecommendationData + title: String +} + +"""""" +type FacebookBusinessAdCampaignIssuesInfo { + errorCode: Int + errorMessage: String + errorSummary: String + errorType: String + level: String +} + +enum FacebookBusinessCampaignEffectiveStatus { + ACTIVE + ARCHIVED + DELETED + IN_PROCESS + PAUSED + WITH_ISSUES +} + +enum FacebookBusinessCampaignConfiguredStatus { + ACTIVE + ARCHIVED + DELETED + PAUSED +} + +enum FacebookBusinessCampaignBidStrategy { + COST_CAP + LOWEST_COST_WITHOUT_CAP + LOWEST_COST_WITH_BID_CAP + TARGET_COST +} + +"""""" +type FacebookBusinessCampaign { + accountId: String + adlabels: [FacebookBusinessAdLabel] + bidStrategy: FacebookBusinessCampaignBidStrategy + boostedObjectId: String + brandLiftStudies: [FacebookBusinessAdStudy] + budgetRebalanceFlag: Boolean + budgetRemaining: String + buyingType: String + canCreateBrandLiftStudy: Boolean + canUseSpendCap: Boolean + configuredStatus: FacebookBusinessCampaignConfiguredStatus + createdTime: String + dailyBudget: String + effectiveStatus: FacebookBusinessCampaignEffectiveStatus + id: String + issuesInfo: [FacebookBusinessAdCampaignIssuesInfo] + lastBudgetTogglingTime: String + lifetimeBudget: String + name: String + objective: String + pacingType: [String] + recommendations: [FacebookBusinessAdRecommendation] + sourceCampaign: FacebookBusinessCampaign + sourceCampaignId: String + specialAdCategory: String + spendCap: String + startTime: String + status: FacebookBusinessCampaignStatus + stopTime: String + toplineId: String + updatedTime: String + adStudies(before: String, after: String, first: Int): FacebookBusinessAdStudyConnection! + adRulesGoverned(passEvaluation: Boolean, before: String, after: String, first: Int): FacebookBusinessAdRuleConnection! + ads(updatedSince: Int, timeRangeJson: JSON, includeDrafts: Boolean, effectiveStatus: [String!], datePreset: FacebookBusinessDatePresetEnum, adDraftId: String, before: String, after: String, first: Int): FacebookBusinessAdConnection! + adSets(timeRangeJson: JSON, isCompleted: Boolean, includeDrafts: Boolean, effectiveStatus: [FacebookBusinessEffectiveStatusEnum!], datePreset: FacebookBusinessDatePresetEnum, adDraftId: String, before: String, after: String, first: Int): FacebookBusinessAdSetConnection! + contentDeliveryReport(summary: Boolean, startDate: String, position: FacebookBusinessPositionEnum!, platform: FacebookBusinessPlatformEnum!, pageId: Int, endDate: String, before: String, after: String, first: Int): FacebookBusinessContentDeliveryReportConnection! + copies(timeRangeJson: JSON, isCompleted: Boolean, effectiveStatus: [FacebookBusinessEffectiveStatusEnum!], datePreset: FacebookBusinessDatePresetEnum, before: String, after: String, first: Int): FacebookBusinessCampaignConnection! + insights(useAccountAttributionSetting: Boolean, timeRangesJson: [JSON!], timeRangeJson: JSON, timeIncrement: String, summaryActionBreakdowns: [FacebookBusinessSummaryActionBreakdownsEnum!], summary: [String!], sort: [String!], productIdLimit: Int, level: FacebookBusinessLevelEnum, filteringJson: [JSON!], fields: [String!], exportName: String, exportFormat: String, exportColumns: [String!], defaultSummary: Boolean, datePreset: FacebookBusinessDatePresetEnum, breakdowns: [FacebookBusinessBreakdownsEnum!], actionReportTime: FacebookBusinessActionReportTimeEnum, actionBreakdowns: [FacebookBusinessActionBreakdownsEnum!], actionAttributionWindows: [FacebookBusinessActionAttributionWindowsEnum!], before: String, after: String, first: Int): FacebookBusinessAdsInsightsConnection! +} + +type FacebookBusinessCampaignConnection { + nodes: [FacebookBusinessCampaign!]! + pageInfo: PageInfo! +} + +type FacebookBusinessAdSetConnection { + nodes: [FacebookBusinessAdSet!]! + pageInfo: PageInfo! +} + +type FacebookBusinessAdAccountConnection { + nodes: [FacebookBusinessAdAccount!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdStudyCell { + adEntitiesCount: Int + controlPercentage: Float + id: String + name: String + treatmentPercentage: Float + adAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + adSets(before: String, after: String, first: Int): FacebookBusinessAdSetConnection! + campaigns(before: String, after: String, first: Int): FacebookBusinessCampaignConnection! +} + +type FacebookBusinessAdStudyCellConnection { + nodes: [FacebookBusinessAdStudyCell!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessAdStudy { + business: FacebookBusinessBusiness + canceledTime: String + cooldownStartTime: String + createdBy: FacebookBusinessUser + createdTime: String + description: String + endTime: String + id: String + name: String + observationEndTime: String + resultsFirstAvailableDate: String + startTime: String + updatedBy: FacebookBusinessUser + updatedTime: String + cells(before: String, after: String, first: Int): FacebookBusinessAdStudyCellConnection! + objectives(before: String, after: String, first: Int): FacebookBusinessAdStudyObjectiveConnection! +} + +type FacebookBusinessAdStudyConnection { + nodes: [FacebookBusinessAdStudy!]! + pageInfo: PageInfo! +} + +"""""" +type FacebookBusinessBusiness { + blockOfflineAnalytics: Boolean + createdBy: JSON + createdTime: String + extendedUpdatedTime: String + id: String + isHidden: Boolean + isInstagramEnabledInFbAnalytics: Boolean + link: String + name: String + paymentAccountId: String + primaryPage: FacebookBusinessPage + profilePictureUri: String + timezoneId: Int + twoFactorType: String + updatedBy: JSON + updatedTime: String + verificationStatus: String + vertical: String + verticalId: Int + adStudies(before: String, after: String, first: Int): FacebookBusinessAdStudyConnection! + adNetworkAnalytics(until: String, since: String, orderingType: FacebookBusinessOrderingTypeEnum, orderingColumn: FacebookBusinessOrderingColumnEnum, metrics: [FacebookBusinessMetricsEnum!]!, filtersJson: [JSON!], breakdowns: [FacebookBusinessBreakdownsEnum!], aggregationPeriod: FacebookBusinessAggregationPeriodEnum, before: String, after: String, first: Int): FacebookBusinessAdNetworkAnalyticsSyncQueryResultConnection! + adNetworkAnalyticsResults(queryIds: [String!], before: String, after: String, first: Int): FacebookBusinessAdNetworkAnalyticsAsyncQueryResultConnection! + adsPixels(sortBy: FacebookBusinessSortByEnum, nameFilter: String, idFilter: String, before: String, after: String, first: Int): FacebookBusinessAdsPixelConnection! + agencies(before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + anPlacements(before: String, after: String, first: Int): FacebookBusinessAdPlacementConnection! + attemptedSharingAgreements(requestingBusinessId: String, requestStatus: FacebookBusinessRequestStatusEnum, before: String, after: String, first: Int): FacebookBusinessBusinessCreativeFolderSharingAgreementConnection! + businessAssetGroups(before: String, after: String, first: Int): FacebookBusinessBusinessAssetGroupConnection! + businessInvoices(type: FacebookBusinessTypeEnum, startDate: String, rootId: Int, issueStartDate: String, issueEndDate: String, invoiceId: Int, endDate: String, before: String, after: String, first: Int): FacebookBusinessOracleTransactionConnection! + businessUnits(before: String, after: String, first: Int): FacebookBusinessBusinessUnitConnection! + businessUsers(before: String, after: String, first: Int): FacebookBusinessBusinessUserConnection! + clientAdAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + clientApps(before: String, after: String, first: Int): FacebookBusinessApplicationConnection! + clientPages(before: String, after: String, first: Int): FacebookBusinessPageConnection! + clientPixels(before: String, after: String, first: Int): FacebookBusinessAdsPixelConnection! + clientProductCatalogs(before: String, after: String, first: Int): FacebookBusinessProductCatalogConnection! + clients(before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + contentDeliveryReport(summary: Boolean, startDate: String, position: FacebookBusinessPositionEnum!, platform: FacebookBusinessPlatformEnum!, pageId: Int, endDate: String, before: String, after: String, first: Int): FacebookBusinessContentDeliveryReportConnection! + creativeAssetTags(before: String, after: String, first: Int): FacebookBusinessCreativeAssetTagConnection! + creativeFolders(before: String, after: String, first: Int): FacebookBusinessBusinessCreativeFolderConnection! + creatives(creativeFolderId: String, before: String, after: String, first: Int): FacebookBusinessBusinessCreativeConnection! + eventSourceGroups(before: String, after: String, first: Int): FacebookBusinessEventSourceGroupConnection! + extendedCredits(before: String, after: String, first: Int): FacebookBusinessExtendedCreditConnection! + initiatedAudienceSharingRequests(requestStatus: FacebookBusinessRequestStatusEnum, recipientId: String, before: String, after: String, first: Int): FacebookBusinessBusinessAssetSharingAgreementConnection! + instagramAccounts(before: String, after: String, first: Int): FacebookBusinessInstagramUserConnection! + offlineConversionDataSets(before: String, after: String, first: Int): FacebookBusinessOfflineConversionDataSetConnection! + ownedAdAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + ownedApps(before: String, after: String, first: Int): FacebookBusinessApplicationConnection! + ownedBusinesses(clientUserId: Int, before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + ownedInstagramAccounts(before: String, after: String, first: Int): FacebookBusinessInstagramUserConnection! + ownedPages(before: String, after: String, first: Int): FacebookBusinessPageConnection! + ownedPixels(before: String, after: String, first: Int): FacebookBusinessAdsPixelConnection! + ownedProductCatalogs(before: String, after: String, first: Int): FacebookBusinessProductCatalogConnection! + pendingClientAdAccounts(before: String, after: String, first: Int): FacebookBusinessBusinessAdAccountRequestConnection! + pendingClientApps(before: String, after: String, first: Int): FacebookBusinessBusinessApplicationRequestConnection! + pendingClientPages(before: String, after: String, first: Int): FacebookBusinessBusinessPageRequestConnection! + pendingOwnedAdAccounts(before: String, after: String, first: Int): FacebookBusinessBusinessAdAccountRequestConnection! + pendingOwnedPages(before: String, after: String, first: Int): FacebookBusinessBusinessPageRequestConnection! + pendingSharedCreativeFolders(before: String, after: String, first: Int): FacebookBusinessBusinessCreativeFolderConnection! + pendingUsers(email: String, before: String, after: String, first: Int): FacebookBusinessBusinessRoleRequestConnection! + picture(width: Int, type: FacebookBusinessTypeEnum, redirect: Boolean, height: Int, before: String, after: String, first: Int): FacebookBusinessProfilePictureSourceConnection! + pixelTos(before: String, after: String, first: Int): FacebookBusinessBusinessPixelTOSConnection! + receivedAudienceSharingRequests(requestStatus: FacebookBusinessRequestStatusEnum, initiatorId: String, before: String, after: String, first: Int): FacebookBusinessBusinessAssetSharingAgreementConnection! + systemUsers(before: String, after: String, first: Int): FacebookBusinessSystemUserConnection! + thirdPartyMeasurementReportDataset(before: String, after: String, first: Int): FacebookBusinessThirdPartyMeasurementReportDatasetConnection! +} + +"""""" +type FacebookBusinessAdAccountCreationRequest { + adAccountsCurrency: String + adAccountsInfo: [JSON] + additionalComment: String + addressInChinese: String + addressInEnglish: JSON + addressInLocalLanguage: String + advertiserBusiness: FacebookBusinessBusiness + appealReason: JSON + business: FacebookBusinessBusiness + businessRegistrationId: String + chineseLegalEntityName: String + contact: JSON + creator: FacebookBusinessUser + creditCardId: String + disapprovalReasons: [JSON] + englishLegalEntityName: String + extendedCreditId: String + id: String + isSmb: Boolean + isTest: Boolean + isUnderAuthorization: Boolean + legalEntityNameInLocalLanguage: String + oeRequestId: String + officialWebsiteUrl: String + planningAgencyBusiness: FacebookBusinessBusiness + planningAgencyBusinessId: String + promotableAppIds: [String] + promotablePageIds: [String] + promotableUrls: [String] + requestChangeReasons: [JSON] + status: String + subvertical: String + timeCreated: String + vertical: String + adAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! +} + +"""""" +type FacebookBusinessAdAccount { + accountId: String + accountStatus: Int + adAccountCreationRequest: FacebookBusinessAdAccountCreationRequest + age: Float + agencyClientDeclaration: FacebookBusinessAgencyClientDeclaration + amountSpent: String + attributionSpec: [FacebookBusinessAttributionSpec] + balance: String + business: FacebookBusinessBusiness + businessCity: String + businessCountryCode: String + businessName: String + businessState: String + businessStreet: String + businessStreet2: String + businessZip: String + canCreateBrandLiftStudy: Boolean + capabilities: [String] + createdTime: String + currency: String + disableReason: Int + endAdvertiser: String + endAdvertiserName: String + extendedCreditInvoiceGroup: FacebookBusinessExtendedCreditInvoiceGroup + failedDeliveryChecks: [FacebookBusinessDeliveryCheck] + fbEntity: Int + fundingSource: String + fundingSourceDetails: FacebookBusinessFundingSourceDetails + hasMigratedPermissions: Boolean + hasPageAuthorizedAdaccount: Boolean + id: String + ioNumber: String + isAttributionSpecSystemDefault: Boolean + isDirectDealsEnabled: Boolean + isIn3dsAuthorizationEnabledMarket: Boolean + isInMiddleOfLocalEntityMigration: Boolean + isNotificationsEnabled: Boolean + isPersonal: Int + isPrepayAccount: Boolean + isTaxIdRequired: Boolean + lineNumbers: [Int] + mediaAgency: String + minCampaignGroupSpendCap: String + minDailyBudget: Int + name: String + offsitePixelsTosAccepted: Boolean + owner: String + partner: String + rfSpec: FacebookBusinessReachFrequencySpec + showCheckoutExperience: Boolean + spendCap: String + taxId: String + taxIdStatus: Int + taxIdType: String + timezoneId: Int + timezoneName: String + timezoneOffsetHoursUtc: Float + tosAccepted: JSON + userTasks: [String] + userTosAccepted: JSON + activities(until: String, uid: Int, since: String, oid: String, extraOids: [String!], category: FacebookBusinessCategoryEnum, businessId: String, addChildren: Boolean, before: String, after: String, first: Int): FacebookBusinessAdActivityConnection! + adPlacePageSets(before: String, after: String, first: Int): FacebookBusinessAdPlacePageSetConnection! + adStudies(before: String, after: String, first: Int): FacebookBusinessAdStudyConnection! + adCreatives(before: String, after: String, first: Int): FacebookBusinessAdCreativeConnection! + adCreativesByLabels(operator: FacebookBusinessOperatorEnum, adLabelIds: [String!]!, before: String, after: String, first: Int): FacebookBusinessAdCreativeConnection! + adImages(name: String, minwidth: Int, minheight: Int, hashes: [String!], businessId: String, bizTagId: Int, before: String, after: String, first: Int): FacebookBusinessAdImageConnection! + adLabels(before: String, after: String, first: Int): FacebookBusinessAdLabelConnection! + adPlayables(before: String, after: String, first: Int): FacebookBusinessPlayableContentConnection! + adReportSchedules(before: String, after: String, first: Int): FacebookBusinessJSONConnection! + adRulesHistory(objectId: String, hideNoChanges: Boolean, evaluationType: FacebookBusinessEvaluationTypeEnum, action: FacebookBusinessActionEnum, before: String, after: String, first: Int): FacebookBusinessAdAccountAdRulesHistoryConnection! + adRulesLibrary(before: String, after: String, first: Int): FacebookBusinessAdRuleConnection! + ads(useEmployeeDraft: Boolean, updatedSince: Int, timeRangeJson: JSON, includeDrafts: Boolean, effectiveStatus: [String!], datePreset: FacebookBusinessDatePresetEnum, adDraftId: String, before: String, after: String, first: Int): FacebookBusinessAdConnection! + adsVolume(showBreakdownByActor: Boolean, pageId: Int, before: String, after: String, first: Int): FacebookBusinessAdAccountAdVolumeConnection! + adsByLabels(operator: FacebookBusinessOperatorEnum, adLabelIds: [String!]!, before: String, after: String, first: Int): FacebookBusinessAdConnection! + adSets(useEmployeeDraft: Boolean, timeRangeJson: JSON, isCompleted: Boolean, includeDrafts: Boolean, effectiveStatus: [FacebookBusinessEffectiveStatusEnum!], datePreset: FacebookBusinessDatePresetEnum, adDraftId: String, before: String, after: String, first: Int): FacebookBusinessAdSetConnection! + adSetsByLabels(operator: FacebookBusinessOperatorEnum, adLabelIds: [String!]!, before: String, after: String, first: Int): FacebookBusinessAdSetConnection! + adsPixels(sortBy: FacebookBusinessSortByEnum, before: String, after: String, first: Int): FacebookBusinessAdsPixelConnection! + advertisableApplications(businessId: String, appId: String, before: String, after: String, first: Int): FacebookBusinessApplicationConnection! + adVideos(title: String, minwidth: Int, minlength: Int, minheight: Int, minAspectRatio: Float, maxwidth: Int, maxlength: Int, maxheight: Int, maxAspectRatio: Float, before: String, after: String, first: Int): FacebookBusinessAdVideoConnection! + affectedAdSets(before: String, after: String, first: Int): FacebookBusinessAdSetConnection! + agencies(before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + applications(before: String, after: String, first: Int): FacebookBusinessApplicationConnection! + assignedUsers(business: String!, before: String, after: String, first: Int): FacebookBusinessAssignedUserConnection! + asyncRequests(type: FacebookBusinessTypeEnum, status: FacebookBusinessStatusEnum, before: String, after: String, first: Int): FacebookBusinessAsyncRequestConnection! + asyncAdRequestSets(isCompleted: Boolean, before: String, after: String, first: Int): FacebookBusinessAdAsyncRequestSetConnection! + broadTargetingCategories(customCategoriesOnly: Boolean, before: String, after: String, first: Int): FacebookBusinessBroadTargetingCategoriesConnection! + campaigns(useEmployeeDraft: Boolean, timeRangeJson: JSON, isCompleted: Boolean, includeDrafts: Boolean, effectiveStatus: [FacebookBusinessEffectiveStatusEnum!], datePreset: FacebookBusinessDatePresetEnum, before: String, after: String, first: Int): FacebookBusinessCampaignConnection! + campaignsByLabels(operator: FacebookBusinessOperatorEnum, adLabelIds: [String!]!, before: String, after: String, first: Int): FacebookBusinessCampaignConnection! + contentDeliveryReport(summary: Boolean, startDate: String, position: FacebookBusinessPositionEnum!, platform: FacebookBusinessPlatformEnum!, pageId: Int, endDate: String, before: String, after: String, first: Int): FacebookBusinessContentDeliveryReportConnection! + customAudiences(pixelId: String, filteringJson: [JSON!], fields: [String!], businessId: String, before: String, after: String, first: Int): FacebookBusinessCustomAudienceConnection! + customAudiencesTos(before: String, after: String, first: Int): FacebookBusinessCustomAudiencesTOSConnection! + customConversions(before: String, after: String, first: Int): FacebookBusinessCustomConversionConnection! + deliveryEstimate(promotedObjectJson: JSON, optimizationGoal: FacebookBusinessOptimizationGoalEnum!, before: String, after: String, first: Int): FacebookBusinessAdAccountDeliveryEstimateConnection! + deprecatedTargetingAdSets(type: String, before: String, after: String, first: Int): FacebookBusinessAdSetConnection! + generatePreviews(width: Int, startDate: String, renderType: FacebookBusinessRenderTypeEnum, productItemIds: [String!], postJson: JSON, placePageId: Int, locale: String, height: Int, endDate: String, dynamicCustomizationJson: JSON, dynamicCreativeSpecJson: JSON, dynamicAssetLabel: String, adFormat: FacebookBusinessAdFormatEnum!, before: String, after: String, first: Int): FacebookBusinessAdPreviewConnection! + impactingAdStudies(before: String, after: String, first: Int): FacebookBusinessAdStudyConnection! + insights(useAccountAttributionSetting: Boolean, timeRangesJson: [JSON!], timeRangeJson: JSON, timeIncrement: String, summaryActionBreakdowns: [FacebookBusinessSummaryActionBreakdownsEnum!], summary: [String!], sort: [String!], productIdLimit: Int, level: FacebookBusinessLevelEnum, filteringJson: [JSON!], fields: [String!], exportName: String, exportFormat: String, exportColumns: [String!], defaultSummary: Boolean, datePreset: FacebookBusinessDatePresetEnum, breakdowns: [FacebookBusinessBreakdownsEnum!], actionReportTime: FacebookBusinessActionReportTimeEnum, actionBreakdowns: [FacebookBusinessActionBreakdownsEnum!], actionAttributionWindows: [FacebookBusinessActionAttributionWindowsEnum!], before: String, after: String, first: Int): FacebookBusinessAdsInsightsConnection! + instagramAccounts(before: String, after: String, first: Int): FacebookBusinessInstagramUserConnection! + matchedSearchApplications(queryTerm: String!, businessId: String, appStoreCountry: String, appStore: FacebookBusinessAppStoreEnum!, allowIncompleteApp: Boolean, before: String, after: String, first: Int): FacebookBusinessAdAccountMatchedSearchApplicationsEdgeDataConnection! + maxBid(before: String, after: String, first: Int): FacebookBusinessAdAccountMaxBidConnection! + minimumBudgets(bidAmount: Int, before: String, after: String, first: Int): FacebookBusinessMinimumBudgetConnection! + offlineConversionDataSets(before: String, after: String, first: Int): FacebookBusinessOfflineConversionDataSetConnection! + onBehalfRequests(status: FacebookBusinessStatusEnum, before: String, after: String, first: Int): FacebookBusinessBusinessOwnedObjectOnBehalfOfRequestConnection! + promotePages(before: String, after: String, first: Int): FacebookBusinessPageConnection! + publisherBlockLists(before: String, after: String, first: Int): FacebookBusinessPublisherBlockListConnection! + reachEstimate(objectStoreUrl: String, isDebug: Boolean, creativeActionSpec: String, concepts: String, callerId: String, adgroupIds: [String!], before: String, after: String, first: Int): FacebookBusinessAdAccountReachEstimateConnection! + reachFrequencyPredictions(before: String, after: String, first: Int): FacebookBusinessReachFrequencyPredictionConnection! + roas(timeRangeJson: JSON!, timeIncrement: String, filteringJson: [JSON!]!, fields: [String!], before: String, after: String, first: Int): FacebookBusinessAdAccountRoasConnection! + savedAudiences(filteringJson: [JSON!], fields: [String!], businessId: String, before: String, after: String, first: Int): FacebookBusinessSavedAudienceConnection! + subscribedApps(before: String, after: String, first: Int): FacebookBusinessAdAccountSubscribedAppsConnection! + targetingBrowse(whitelistedTypes: [FacebookBusinessWhitelistedTypesEnum!], regulatedCategories: [FacebookBusinessRegulatedCategoriesEnum!], limitType: FacebookBusinessLimitTypeEnum, isExclusion: Boolean, includeNodes: Boolean, excludedCategory: String, before: String, after: String, first: Int): FacebookBusinessAdAccountTargetingUnifiedConnection! + targetingSearch(whitelistedTypes: [FacebookBusinessWhitelistedTypesEnum!], targetingListJson: [JSON!], sessionId: Int, regulatedCategories: [FacebookBusinessRegulatedCategoriesEnum!], q: String!, limitType: FacebookBusinessLimitTypeEnum, isExclusion: Boolean, countries: [String!], allowOnlyFatHeadInterests: Boolean, before: String, after: String, first: Int): FacebookBusinessAdAccountTargetingUnifiedConnection! + targetingSentenceLines(hideTargetingSpecFromReturn: Boolean, discardPlacements: Boolean, discardAges: Boolean, before: String, after: String, first: Int): FacebookBusinessTargetingSentenceLineConnection! + targetingSuggestions(whitelistedTypes: [FacebookBusinessWhitelistedTypesEnum!], targetingListJson: [JSON!], sessionId: Int, regulatedCategories: [FacebookBusinessRegulatedCategoriesEnum!], objectsJson: JSON, objective: FacebookBusinessObjectiveEnum, mode: FacebookBusinessModeEnum, limitType: FacebookBusinessLimitTypeEnum, countries: [String!], before: String, after: String, first: Int): FacebookBusinessAdAccountTargetingUnifiedConnection! + targetingValidation(targetingListJson: [JSON!], nameList: [String!], isExclusion: Boolean, idList: [Int!], before: String, after: String, first: Int): FacebookBusinessAdAccountTargetingUnifiedConnection! + tracking(before: String, after: String, first: Int): FacebookBusinessAdAccountTrackingDataConnection! + users(before: String, after: String, first: Int): FacebookBusinessAdAccountUserConnection! +} + +"""""" +type FacebookBusinessAdLabel { + account: FacebookBusinessAdAccount + createdTime: String + id: String + name: String + updatedTime: String + adCreatives(before: String, after: String, first: Int): FacebookBusinessAdCreativeConnection! + ads(before: String, after: String, first: Int): FacebookBusinessAdConnection! + adSets(before: String, after: String, first: Int): FacebookBusinessAdSetConnection! + campaigns(before: String, after: String, first: Int): FacebookBusinessCampaignConnection! +} + +"""""" +type FacebookBusinessAdSet { + accountId: String + adlabels: [FacebookBusinessAdLabel] + adsetSchedule: [FacebookBusinessDayPart] + assetFeedId: String + attributionSpec: [FacebookBusinessAttributionSpec] + bidAdjustments: FacebookBusinessAdBidAdjustments + bidAmount: Int + bidConstraints: FacebookBusinessAdCampaignBidConstraint + bidInfo: JSON + bidStrategy: FacebookBusinessAdsetBidStrategy + billingEvent: FacebookBusinessAdsetBillingEvent + budgetRemaining: String + campaign: FacebookBusinessCampaign + campaignId: String + configuredStatus: FacebookBusinessAdsetConfiguredStatus + createdTime: String + creativeSequence: [String] + dailyBudget: String + dailyMinSpendTarget: String + dailySpendCap: String + destinationType: String + effectiveStatus: FacebookBusinessAdsetEffectiveStatus + endTime: String + frequencyControlSpecs: [FacebookBusinessAdCampaignFrequencyControlSpecs] + fullFunnelExplorationMode: String + id: String + instagramActorId: String + isDynamicCreative: Boolean + issuesInfo: [FacebookBusinessAdCampaignIssuesInfo] + learningStageInfo: FacebookBusinessAdCampaignLearningStageInfo + lifetimeBudget: String + lifetimeImps: Int + lifetimeMinSpendTarget: String + lifetimeSpendCap: String + name: String + optimizationGoal: FacebookBusinessAdsetOptimizationGoal + optimizationSubEvent: String + pacingType: [String] + recommendations: [FacebookBusinessAdRecommendation] + recurringBudgetSemantics: Boolean + reviewFeedback: String + rfPredictionId: String + sourceAdset: FacebookBusinessAdSet + sourceAdsetId: String + startTime: String + status: FacebookBusinessAdsetStatus + targeting: FacebookBusinessTargeting + timeBasedAdRotationIntervals: [Int] + updatedTime: String + useNewAppClick: Boolean + activities(until: String, uid: Int, since: String, category: FacebookBusinessCategoryEnum, businessId: String, before: String, after: String, first: Int): FacebookBusinessAdActivityConnection! + adStudies(before: String, after: String, first: Int): FacebookBusinessAdStudyConnection! + adCreatives(before: String, after: String, first: Int): FacebookBusinessAdCreativeConnection! + adRulesGoverned(passEvaluation: Boolean, before: String, after: String, first: Int): FacebookBusinessAdRuleConnection! + ads(updatedSince: Int, timeRangeJson: JSON, includeDrafts: Boolean, effectiveStatus: [String!], datePreset: FacebookBusinessDatePresetEnum, adDraftId: String, before: String, after: String, first: Int): FacebookBusinessAdConnection! + asyncAdRequests(statuses: [FacebookBusinessStatusesEnum!], before: String, after: String, first: Int): FacebookBusinessAdAsyncRequestConnection! + contentDeliveryReport(summary: Boolean, startDate: String, position: FacebookBusinessPositionEnum!, platform: FacebookBusinessPlatformEnum!, endDate: String, before: String, after: String, first: Int): FacebookBusinessContentDeliveryReportConnection! + copies(timeRangeJson: JSON, isCompleted: Boolean, effectiveStatus: [FacebookBusinessEffectiveStatusEnum!], datePreset: FacebookBusinessDatePresetEnum, before: String, after: String, first: Int): FacebookBusinessAdSetConnection! + deliveryEstimate(promotedObjectJson: JSON, optimizationGoal: FacebookBusinessOptimizationGoalEnum, before: String, after: String, first: Int): FacebookBusinessAdCampaignDeliveryEstimateConnection! + insights(useAccountAttributionSetting: Boolean, timeRangesJson: [JSON!], timeRangeJson: JSON, timeIncrement: String, summaryActionBreakdowns: [FacebookBusinessSummaryActionBreakdownsEnum!], summary: [String!], sort: [String!], productIdLimit: Int, level: FacebookBusinessLevelEnum, filteringJson: [JSON!], fields: [String!], exportName: String, exportFormat: String, exportColumns: [String!], defaultSummary: Boolean, datePreset: FacebookBusinessDatePresetEnum, breakdowns: [FacebookBusinessBreakdownsEnum!], actionReportTime: FacebookBusinessActionReportTimeEnum, actionBreakdowns: [FacebookBusinessActionBreakdownsEnum!], actionAttributionWindows: [FacebookBusinessActionAttributionWindowsEnum!], before: String, after: String, first: Int): FacebookBusinessAdsInsightsConnection! + targetingSentenceLines(before: String, after: String, first: Int): FacebookBusinessTargetingSentenceLineConnection! +} + +"""""" +type FacebookBusinessPage { + about: String + accessToken: String + adCampaign: FacebookBusinessAdSet + affiliation: String + appId: String + artistsWeLike: String + attire: String + awards: String + bandInterests: String + bandMembers: String + bestPage: FacebookBusinessPage + bio: String + birthday: String + bookingAgent: String + built: String + business: JSON + canCheckin: Boolean + canPost: Boolean + category: String + categoryList: [FacebookBusinessPageCategory] + checkins: Int + companyOverview: String + connectedInstagramAccount: FacebookBusinessIGUser + contactAddress: FacebookBusinessMailingAddress + copyrightWhitelistedIgPartners: [String] + countryPageLikes: Int + cover: FacebookBusinessCoverPhoto + culinaryTeam: String + currentLocation: String + description: String + descriptionHtml: String + differentlyOpenOfferings: JSON + directedBy: String + displaySubtext: String + displayedMessageResponseTime: String + emails: [String] + engagement: FacebookBusinessEngagement + fanCount: Int + featuredVideo: FacebookBusinessAdVideo + features: String + foodStyles: [String] + founded: String + generalInfo: String + generalManager: String + genre: String + globalBrandPageName: String + globalBrandRootId: String + hasAddedApp: Boolean + hasWhatsappBusinessNumber: Boolean + hasWhatsappNumber: Boolean + hometown: String + hours: JSON + id: String + impressum: String + influences: String + instagramBusinessAccount: FacebookBusinessIGUser + instantArticlesReviewStatus: String + isAlwaysOpen: Boolean + isChain: Boolean + isCommunityPage: Boolean + isEligibleForBrandedContent: Boolean + isMessengerBotGetStartedEnabled: Boolean + isMessengerPlatformBot: Boolean + isOwned: Boolean + isPermanentlyClosed: Boolean + isPublished: Boolean + isUnclaimed: Boolean + isVerified: Boolean + isWebhooksSubscribed: Boolean + keywords: JSON + leadgenTosAcceptanceTime: String + leadgenTosAccepted: Boolean + leadgenTosAcceptingUser: FacebookBusinessUser + link: String + location: FacebookBusinessLocation + members: String + merchantId: String + merchantReviewStatus: String + messengerAdsDefaultIcebreakers: [String] + messengerAdsDefaultPageWelcomeMessage: FacebookBusinessMessengerDestinationPageWelcomeMessage + messengerAdsDefaultQuickReplies: [String] + messengerAdsQuickRepliesType: String + mission: String + mpg: String + name: String + nameWithLocationDescriptor: String + network: String + newLikeCount: Int + offerEligible: Boolean + overallStarRating: Float + pageAboutStory: FacebookBusinessPageAboutStory + pageToken: String + parentPage: FacebookBusinessPage + parking: FacebookBusinessPageParking + paymentOptions: FacebookBusinessPagePaymentOptions + personalInfo: String + personalInterests: String + pharmaSafetyInfo: String + phone: String + placeType: String + plotOutline: String + preferredAudience: FacebookBusinessTargeting + pressContact: String + priceRange: String + privacyInfoUrl: String + producedBy: String + products: String + promotionEligible: Boolean + promotionIneligibleReason: String + publicTransit: String + ratingCount: Int + recipient: String + recordLabel: String + releaseDate: String + restaurantServices: FacebookBusinessPageRestaurantServices + restaurantSpecialties: FacebookBusinessPageRestaurantSpecialties + schedule: String + screenplayBy: String + season: String + singleLineAddress: String + starring: String + startInfo: FacebookBusinessPageStartInfo + storeCode: String + storeLocationDescriptor: String + storeNumber: Int + studio: String + supportsDonateButtonInLiveVideo: Boolean + supportsInstantArticles: Boolean + talkingAboutCount: Int + temporaryStatus: String + unreadMessageCount: Int + unreadNotifCount: Int + unseenMessageCount: Int + username: String + verificationStatus: String + voipInfo: FacebookBusinessVoipInfo + website: String + wereHereCount: Int + whatsappNumber: String + writtenBy: String + adsPosts(until: String, since: String, includeInlineCreate: Boolean, excludeDynamicAds: Boolean, before: String, after: String, first: Int): FacebookBusinessPagePostConnection! + agencies(before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + albums(before: String, after: String, first: Int): FacebookBusinessAlbumConnection! + assignedUsers(business: String!, before: String, after: String, first: Int): FacebookBusinessAssignedUserConnection! + blocked(user: Int, uid: Int, before: String, after: String, first: Int): FacebookBusinessProfileConnection! + callToActions(before: String, after: String, first: Int): FacebookBusinessPageCallToActionConnection! + canvasElements(before: String, after: String, first: Int): FacebookBusinessCanvasBodyElementConnection! + canvases(isPublished: Boolean, isHidden: Boolean, before: String, after: String, first: Int): FacebookBusinessCanvasConnection! + claimedUrls(before: String, after: String, first: Int): FacebookBusinessURLConnection! + conversations(userId: String, tags: [String!], folder: String, before: String, after: String, first: Int): FacebookBusinessUnifiedThreadConnection! + copyrightWhitelistedPartners(before: String, after: String, first: Int): FacebookBusinessProfileConnection! + crosspostWhitelistedPages(before: String, after: String, first: Int): FacebookBusinessPageConnection! + customLabels(before: String, after: String, first: Int): FacebookBusinessPageUserMessageThreadLabelConnection! + customUserSettings(psid: String!, before: String, after: String, first: Int): FacebookBusinessCustomUserSettingsConnection! + events(type: FacebookBusinessTypeEnum, timeFilter: FacebookBusinessTimeFilterEnum, includeCanceled: Boolean, eventStateFilter: [FacebookBusinessEventStateFilterEnum!], before: String, after: String, first: Int): FacebookBusinessEventConnection! + featuredVideosCollection(before: String, after: String, first: Int): FacebookBusinessAdVideoConnection! + feed(with: FacebookBusinessWithEnum, showExpired: Boolean, includeHidden: Boolean, before: String, after: String, first: Int): FacebookBusinessPagePostConnection! + globalBrandChildren(before: String, after: String, first: Int): FacebookBusinessPageConnection! + indexedVideos(before: String, after: String, first: Int): FacebookBusinessAdVideoConnection! + insights(until: String, since: String, showDescriptionFromApiDoc: Boolean, period: FacebookBusinessPeriodEnum, metricJson: [JSON!], datePreset: FacebookBusinessDatePresetEnum, before: String, after: String, first: Int): FacebookBusinessInsightsResultConnection! + instagramAccounts(before: String, after: String, first: Int): FacebookBusinessInstagramUserConnection! + instantArticles(developmentMode: Boolean, before: String, after: String, first: Int): FacebookBusinessInstantArticleConnection! + instantArticlesInsights(until: String, since: String, period: FacebookBusinessPeriodEnum!, metricJson: [JSON!]!, breakdown: FacebookBusinessBreakdownEnum, before: String, after: String, first: Int): FacebookBusinessInstantArticleInsightsQueryResultConnection! + leadGenForms(before: String, after: String, first: Int): FacebookBusinessLeadgenFormConnection! + likes(targetId: String, before: String, after: String, first: Int): FacebookBusinessPageConnection! + liveEncoders(before: String, after: String, first: Int): FacebookBusinessLiveEncoderConnection! + liveVideos(source: FacebookBusinessSourceEnum, broadcastStatus: [FacebookBusinessBroadcastStatusEnum!], before: String, after: String, first: Int): FacebookBusinessLiveVideoConnection! + locations(before: String, after: String, first: Int): FacebookBusinessPageConnection! + mediaFingerprints(universalContentId: String, before: String, after: String, first: Int): FacebookBusinessMediaFingerprintConnection! + messagingFeatureReview(before: String, after: String, first: Int): FacebookBusinessMessagingFeatureReviewConnection! + messengerAdsPageWelcomeMessages(before: String, after: String, first: Int): FacebookBusinessMessengerDestinationPageWelcomeMessageConnection! + messengerProfile(before: String, after: String, first: Int): FacebookBusinessMessengerProfileConnection! + nativeOffers(before: String, after: String, first: Int): FacebookBusinessNativeOfferConnection! + pageBackedInstagramAccounts(before: String, after: String, first: Int): FacebookBusinessInstagramUserConnection! + personas(before: String, after: String, first: Int): FacebookBusinessPersonaConnection! + photos(type: FacebookBusinessTypeEnum, businessId: String, bizTagId: Int, before: String, after: String, first: Int): FacebookBusinessPhotoConnection! + picture(width: Int, type: FacebookBusinessTypeEnum, redirect: Boolean, height: Int, before: String, after: String, first: Int): FacebookBusinessProfilePictureSourceConnection! + placeTopics(before: String, after: String, first: Int): FacebookBusinessPlaceTopicConnection! + posts(with: FacebookBusinessWithEnum, showExpired: Boolean, q: String, includeHidden: Boolean, before: String, after: String, first: Int): FacebookBusinessPagePostConnection! + productCatalogs(before: String, after: String, first: Int): FacebookBusinessProductCatalogConnection! + publishedPosts(until: String, since: String, before: String, after: String, first: Int): FacebookBusinessPagePostConnection! + ratings(before: String, after: String, first: Int): FacebookBusinessRecommendationConnection! + roles(uid: Int, includeDeactivated: Boolean, before: String, after: String, first: Int): FacebookBusinessUserConnection! + rtbDynamicPosts(before: String, after: String, first: Int): FacebookBusinessRTBDynamicPostConnection! + scheduledPosts(before: String, after: String, first: Int): FacebookBusinessPagePostConnection! + secondaryReceivers(before: String, after: String, first: Int): FacebookBusinessApplicationConnection! + settings(before: String, after: String, first: Int): FacebookBusinessPageSettingsConnection! + subscribedApps(before: String, after: String, first: Int): FacebookBusinessApplicationConnection! + tabs(tab: [String!], before: String, after: String, first: Int): FacebookBusinessTabConnection! + tagged(before: String, after: String, first: Int): FacebookBusinessPagePostConnection! + threadOwner(recipient: String!, before: String, after: String, first: Int): FacebookBusinessPageThreadOwnerConnection! + threads(userId: String, tags: [String!], folder: String, before: String, after: String, first: Int): FacebookBusinessUnifiedThreadConnection! + tours(before: String, after: String, first: Int): FacebookBusinessEventTourConnection! + upcomingChanges(includeInactive: Boolean, before: String, after: String, first: Int): FacebookBusinessPageUpcomingChangeConnection! + videoCopyrightRules(source: FacebookBusinessSourceEnum, selectedRuleId: String, before: String, after: String, first: Int): FacebookBusinessVideoCopyrightRuleConnection! + videoLists(before: String, after: String, first: Int): FacebookBusinessVideoListConnection! + videos(type: FacebookBusinessTypeEnum, before: String, after: String, first: Int): FacebookBusinessAdVideoConnection! + visitorPosts(includeHidden: Boolean, before: String, after: String, first: Int): FacebookBusinessPagePostConnection! +} + +"""""" +type FacebookBusinessPageAdminNote { + body: String + from: FacebookBusinessPage + id: String + user: FacebookBusinessUser +} + +"""""" +type FacebookBusinessLocation { + city: String + cityId: Int + country: String + countryCode: String + latitude: Float + locatedIn: String + longitude: Float + name: String + region: String + regionId: Int + state: String + street: String + zip: String +} + +"""""" +type FacebookBusinessUser { + about: String + address: FacebookBusinessLocation + adminNotes: [FacebookBusinessPageAdminNote] + ageRange: FacebookBusinessAgeRange + authMethod: String + birthday: String + canReviewMeasurementRequest: Boolean + cover: FacebookBusinessUserCoverPhoto + currency: FacebookBusinessCurrency + devices: [FacebookBusinessUserDevice] + education: [JSON] + email: String + favoriteAthletes: [FacebookBusinessExperience] + favoriteTeams: [FacebookBusinessExperience] + firstName: String + gender: String + hometown: FacebookBusinessPage + id: String + inspirationalPeople: [FacebookBusinessExperience] + installType: String + installed: Boolean + interestedIn: [String] + isFamedeeplinkinguser: Boolean + isGuestUser: Boolean + isSharedLogin: Boolean + isVerified: Boolean + languages: [FacebookBusinessExperience] + lastName: String + link: String + localNewsMegaphoneDismissStatus: Boolean + localNewsSubscriptionStatus: Boolean + locale: String + location: FacebookBusinessPage + meetingFor: [String] + middleName: String + name: String + nameFormat: String + paymentPricepoints: FacebookBusinessPaymentPricepoints + political: String + profilePic: String + publicKey: String + quotes: String + relationshipStatus: String + religion: String + securitySettings: FacebookBusinessSecuritySettings + sharedLoginUpgradeRequiredBy: String + shortName: String + significantOther: FacebookBusinessUser + sports: [FacebookBusinessExperience] + supportsDonateButtonInLiveVideo: Boolean + testGroup: Int + thirdPartyId: String + timezone: Float + tokenForBusiness: String + updatedTime: String + verified: Boolean + videoUploadLimits: FacebookBusinessVideoUploadLimits + viewerCanSendGift: Boolean + website: String + work: [JSON] + accounts(isPromotable: Boolean, isPlace: Boolean, before: String, after: String, first: Int): FacebookBusinessPageConnection! + adStudies(before: String, after: String, first: Int): FacebookBusinessAdStudyConnection! + adAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + albums(before: String, after: String, first: Int): FacebookBusinessAlbumConnection! + appRequestFormerRecipients(before: String, after: String, first: Int): FacebookBusinessAppRequestFormerRecipientConnection! + appRequests(before: String, after: String, first: Int): FacebookBusinessAppRequestConnection! + assignedAdAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + assignedBusinessAssetGroups(containedAssetId: String, before: String, after: String, first: Int): FacebookBusinessBusinessAssetGroupConnection! + assignedPages(before: String, after: String, first: Int): FacebookBusinessPageConnection! + assignedProductCatalogs(before: String, after: String, first: Int): FacebookBusinessProductCatalogConnection! + books(targetId: String, before: String, after: String, first: Int): FacebookBusinessPageConnection! + businessUsers(before: String, after: String, first: Int): FacebookBusinessBusinessUserConnection! + businesses(before: String, after: String, first: Int): FacebookBusinessBusinessConnection! + conversations(userId: String, tags: [String!], folder: String, before: String, after: String, first: Int): FacebookBusinessUnifiedThreadConnection! + customLabels(before: String, after: String, first: Int): FacebookBusinessPageUserMessageThreadLabelConnection! + events(type: FacebookBusinessTypeEnum, includeCanceled: Boolean, before: String, after: String, first: Int): FacebookBusinessEventConnection! + friendLists(before: String, after: String, first: Int): FacebookBusinessFriendListConnection! + friends(uid: Int, before: String, after: String, first: Int): FacebookBusinessUserConnection! + games(targetId: String, before: String, after: String, first: Int): FacebookBusinessPageConnection! + groups(parent: String, adminOnly: Boolean, before: String, after: String, first: Int): FacebookBusinessGroupConnection! + idsForApps(app: Int, before: String, after: String, first: Int): FacebookBusinessUserIDForAppConnection! + idsForBusiness(app: Int, before: String, after: String, first: Int): FacebookBusinessUserIDForAppConnection! + idsForPages(page: Int, before: String, after: String, first: Int): FacebookBusinessUserIDForPageConnection! + likes(targetId: String, before: String, after: String, first: Int): FacebookBusinessPageConnection! + liveEncoders(before: String, after: String, first: Int): FacebookBusinessLiveEncoderConnection! + liveVideos(source: FacebookBusinessSourceEnum, broadcastStatus: [FacebookBusinessBroadcastStatusEnum!], before: String, after: String, first: Int): FacebookBusinessLiveVideoConnection! + movies(targetId: String, before: String, after: String, first: Int): FacebookBusinessPageConnection! + music(targetId: String, before: String, after: String, first: Int): FacebookBusinessPageConnection! + permissions(status: FacebookBusinessStatusEnum, permission: String, before: String, after: String, first: Int): FacebookBusinessPermissionConnection! + personalAdAccounts(before: String, after: String, first: Int): FacebookBusinessAdAccountConnection! + photos(type: FacebookBusinessTypeEnum, before: String, after: String, first: Int): FacebookBusinessPhotoConnection! + picture(width: Int, type: FacebookBusinessTypeEnum, redirect: Boolean, height: Int, before: String, after: String, first: Int): FacebookBusinessProfilePictureSourceConnection! + requestHistory(before: String, after: String, first: Int): FacebookBusinessRequestHistoryConnection! + richMediaDocuments(query: String, before: String, after: String, first: Int): FacebookBusinessCanvasConnection! + taggableFriends(before: String, after: String, first: Int): FacebookBusinessUserTaggableFriendConnection! + television(targetId: String, before: String, after: String, first: Int): FacebookBusinessPageConnection! + videos(type: FacebookBusinessTypeEnum, before: String, after: String, first: Int): FacebookBusinessAdVideoConnection! +} + +"""The root for Facebook business.""" +type FacebookBusinessQuery { + """Currently logged in User""" + me: FacebookBusinessUser! + + """Get single Ad by its id""" + ad(id: String!): FacebookBusinessAd! + + """Get single AdAccount by its id""" + adAccount(id: String!): FacebookBusinessAdAccount! + + """Get single AdAccountActivity by its id""" + adAccountActivity(id: String!): FacebookBusinessAdAccountActivity! + + """Get single AdAccountCreationRequest by its id""" + adAccountCreationRequest(id: String!): FacebookBusinessAdAccountCreationRequest! + + """Get single AdAsyncRequest by its id""" + adAsyncRequest(id: String!): FacebookBusinessAdAsyncRequest! + + """Get single AdAsyncRequestSet by its id""" + adAsyncRequestSet(id: String!): FacebookBusinessAdAsyncRequestSet! + + """Get single AdCampaignActivity by its id""" + adCampaignActivity(id: String!): FacebookBusinessAdCampaignActivity! + + """Get single AdCampaignGroupActivity by its id""" + adCampaignGroupActivity(id: String!): FacebookBusinessAdCampaignGroupActivity! + + """Get single AdCreative by its id""" + adCreative(id: String!): FacebookBusinessAdCreative! + + """Get single AdImage by its id""" + adImage(id: String!): FacebookBusinessAdImage! + + """Get single AdLabel by its id""" + adLabel(id: String!): FacebookBusinessAdLabel! + + """Get single AdMonetizationProperty by its id""" + adMonetizationProperty(id: String!): FacebookBusinessAdMonetizationProperty! + + """Get single AdPlacePageSet by its id""" + adPlacePageSet(id: String!): FacebookBusinessAdPlacePageSet! + + """Get single AdPlacement by its id""" + adPlacement(id: String!): FacebookBusinessAdPlacement! + + """Get single AdReportRun by its id""" + adReportRun(id: String!): FacebookBusinessAdReportRun! + + """Get single AdReportSpec by its id""" + adReportSpec(id: String!): FacebookBusinessAdReportSpec! + + """Get single AdRule by its id""" + adRule(id: String!): FacebookBusinessAdRule! + + """Get single AdSet by its id""" + adSet(id: String!): FacebookBusinessAdSet! + + """Get single AdStudy by its id""" + adStudy(id: String!): FacebookBusinessAdStudy! + + """Get single AdStudyCell by its id""" + adStudyCell(id: String!): FacebookBusinessAdStudyCell! + + """Get single AdStudyObjective by its id""" + adStudyObjective(id: String!): FacebookBusinessAdStudyObjective! + + """Get single AdVideo by its id""" + adVideo(id: String!): FacebookBusinessAdVideo! + + """Get single AdgroupActivity by its id""" + adgroupActivity(id: String!): FacebookBusinessAdgroupActivity! + + """Get single AdsInterest by its id""" + adsInterest(id: String!): FacebookBusinessAdsInterest! + + """Get single AdsPixel by its id""" + adsPixel(id: String!): FacebookBusinessAdsPixel! + + """Get single Album by its id""" + album(id: String!): FacebookBusinessAlbum! + + """Get single AppRequest by its id""" + appRequest(id: String!): FacebookBusinessAppRequest! + + """Get single Application by its id""" + application(id: String!): FacebookBusinessApplication! + + """Get single AsyncSession by its id""" + asyncSession(id: String!): FacebookBusinessAsyncSession! + + """Get single AtlasCampaign by its id""" + atlasCampaign(id: String!): FacebookBusinessAtlasCampaign! + + """Get single AudioCopyright by its id""" + audioCopyright(id: String!): FacebookBusinessAudioCopyright! + + """Get single AutomotiveModel by its id""" + automotiveModel(id: String!): FacebookBusinessAutomotiveModel! + + """Get single BrandAudience by its id""" + brandAudience(id: String!): FacebookBusinessBrandAudience! + + """Get single Business by its id""" + business(id: String!): FacebookBusinessBusiness! + + """Get single BusinessAssetGroup by its id""" + businessAssetGroup(id: String!): FacebookBusinessBusinessAssetGroup! + + """Get single BusinessAssetSharingAgreement by its id""" + businessAssetSharingAgreement(id: String!): FacebookBusinessBusinessAssetSharingAgreement! + + """Get single BusinessCreative by its id""" + businessCreative(id: String!): FacebookBusinessBusinessCreative! + + """Get single BusinessCreativeFolder by its id""" + businessCreativeFolder(id: String!): FacebookBusinessBusinessCreativeFolder! + + """Get single BusinessCreativeFolderSharingAgreement by its id""" + businessCreativeFolderSharingAgreement(id: String!): FacebookBusinessBusinessCreativeFolderSharingAgreement! + + """Get single BusinessImage by its id""" + businessImage(id: String!): FacebookBusinessBusinessImage! + + """Get single BusinessOwnedObjectOnBehalfOfRequest by its id""" + businessOwnedObjectOnBehalfOfRequest(id: String!): FacebookBusinessBusinessOwnedObjectOnBehalfOfRequest! + + """Get single BusinessPixelTOS by its id""" + businessPixelTOS(id: String!): FacebookBusinessBusinessPixelTOS! + + """Get single BusinessRoleRequest by its id""" + businessRoleRequest(id: String!): FacebookBusinessBusinessRoleRequest! + + """Get single BusinessUnit by its id""" + businessUnit(id: String!): FacebookBusinessBusinessUnit! + + """Get single BusinessUser by its id""" + businessUser(id: String!): FacebookBusinessBusinessUser! + + """Get single CPASParentCatalogSettings by its id""" + cpasParentCatalogSettings(id: String!): FacebookBusinessCPASParentCatalogSettings! + + """Get single Campaign by its id""" + campaign(id: String!): FacebookBusinessCampaign! + + """Get single Canvas by its id""" + canvas(id: String!): FacebookBusinessCanvas! + + """Get single CollaborativeAdsShareSettings by its id""" + collaborativeAdsShareSettings(id: String!): FacebookBusinessCollaborativeAdsShareSettings! + + """Get single Comment by its id""" + comment(id: String!): FacebookBusinessComment! + + """Get single CustomAudience by its id""" + customAudience(id: String!): FacebookBusinessCustomAudience! + + """Get single CustomConversion by its id""" + customConversion(id: String!): FacebookBusinessCustomConversion! + + """Get single Destination by its id""" + destination(id: String!): FacebookBusinessDestination! + + """Get single DestinationCatalogSettings by its id""" + destinationCatalogSettings(id: String!): FacebookBusinessDestinationCatalogSettings! + + """Get single Domain by its id""" + domain(id: String!): FacebookBusinessDomain! + + """Get single DynamicContentSet by its id""" + dynamicContentSet(id: String!): FacebookBusinessDynamicContentSet! + + """Get single DynamicPriceConfigByDate by its id""" + dynamicPriceConfigByDate(id: String!): FacebookBusinessDynamicPriceConfigByDate! + + """Get single Event by its id""" + event(id: String!): FacebookBusinessEvent! + + """Get single EventSourceGroup by its id""" + eventSourceGroup(id: String!): FacebookBusinessEventSourceGroup! + + """Get single EventTour by its id""" + eventTour(id: String!): FacebookBusinessEventTour! + + """Get single ExtendedCredit by its id""" + extendedCredit(id: String!): FacebookBusinessExtendedCredit! + + """Get single ExtendedCreditAllocationConfig by its id""" + extendedCreditAllocationConfig(id: String!): FacebookBusinessExtendedCreditAllocationConfig! + + """Get single ExtendedCreditInvoiceGroup by its id""" + extendedCreditInvoiceGroup(id: String!): FacebookBusinessExtendedCreditInvoiceGroup! + + """Get single ExternalEventSource by its id""" + externalEventSource(id: String!): FacebookBusinessExternalEventSource! + + """Get single Flight by its id""" + flight(id: String!): FacebookBusinessFlight! + + """Get single FriendList by its id""" + friendList(id: String!): FacebookBusinessFriendList! + + """Get single Group by its id""" + group(id: String!): FacebookBusinessGroup! + + """Get single HomeListing by its id""" + homeListing(id: String!): FacebookBusinessHomeListing! + + """Get single Hotel by its id""" + hotel(id: String!): FacebookBusinessHotel! + + """Get single HotelRoom by its id""" + hotelRoom(id: String!): FacebookBusinessHotelRoom! + + """Get single IGComment by its id""" + igComment(id: String!): FacebookBusinessIGComment! + + """Get single IGMedia by its id""" + igMedia(id: String!): FacebookBusinessIGMedia! + + """Get single IGUser by its id""" + igUser(id: String!): FacebookBusinessIGUser! + + """Get single InstagramComment by its id""" + instagramComment(id: String!): FacebookBusinessInstagramComment! + + """Get single InstagramUser by its id""" + instagramUser(id: String!): FacebookBusinessInstagramUser! + + """Get single InstantArticle by its id""" + instantArticle(id: String!): FacebookBusinessInstantArticle! + + """Get single IterativeSplitTestConfig by its id""" + iterativeSplitTestConfig(id: String!): FacebookBusinessIterativeSplitTestConfig! + + """Get single Lead by its id""" + lead(id: String!): FacebookBusinessLead! + + """Get single LeadgenForm by its id""" + leadgenForm(id: String!): FacebookBusinessLeadgenForm! + + """Get single LifeEvent by its id""" + lifeEvent(id: String!): FacebookBusinessLifeEvent! + + """Get single Link by its id""" + link(id: String!): FacebookBusinessLink! + + """Get single LiveEncoder by its id""" + liveEncoder(id: String!): FacebookBusinessLiveEncoder! + + """Get single LiveVideo by its id""" + liveVideo(id: String!): FacebookBusinessLiveVideo! + + """Get single LiveVideoError by its id""" + liveVideoError(id: String!): FacebookBusinessLiveVideoError! + + """Get single LiveVideoInputStream by its id""" + liveVideoInputStream(id: String!): FacebookBusinessLiveVideoInputStream! + + """Get single MailingAddress by its id""" + mailingAddress(id: String!): FacebookBusinessMailingAddress! + + """Get single MeasurementUploadEvent by its id""" + measurementUploadEvent(id: String!): FacebookBusinessMeasurementUploadEvent! + + """Get single MediaFingerprint by its id""" + mediaFingerprint(id: String!): FacebookBusinessMediaFingerprint! + + """Get single MessengerDestinationPageWelcomeMessage by its id""" + messengerDestinationPageWelcomeMessage(id: String!): FacebookBusinessMessengerDestinationPageWelcomeMessage! + + """Get single MessengerPlatformReferral by its id""" + messengerPlatformReferral(id: String!): FacebookBusinessMessengerPlatformReferral! + + """Get single MusicVideoCopyright by its id""" + musicVideoCopyright(id: String!): FacebookBusinessMusicVideoCopyright! + + """Get single NativeOffer by its id""" + nativeOffer(id: String!): FacebookBusinessNativeOffer! + + """Get single NativeOfferView by its id""" + nativeOfferView(id: String!): FacebookBusinessNativeOfferView! + + """Get single OfflineConversionDataSet by its id""" + offlineConversionDataSet(id: String!): FacebookBusinessOfflineConversionDataSet! + + """Get single OfflineTermsOfService by its id""" + offlineTermsOfService(id: String!): FacebookBusinessOfflineTermsOfService! + + """Get single OffsitePixel by its id""" + offsitePixel(id: String!): FacebookBusinessOffsitePixel! + + """Get single OpenGraphContext by its id""" + openGraphContext(id: String!): FacebookBusinessOpenGraphContext! + + """Get single OpenGraphObject by its id""" + openGraphObject(id: String!): FacebookBusinessOpenGraphObject! + + """Get single OracleTransaction by its id""" + oracleTransaction(id: String!): FacebookBusinessOracleTransaction! + + """Get single Page by its id""" + page(id: String!): FacebookBusinessPage! + + """Get single PageAboutStory by its id""" + pageAboutStory(id: String!): FacebookBusinessPageAboutStory! + + """Get single PageAdminNote by its id""" + pageAdminNote(id: String!): FacebookBusinessPageAdminNote! + + """Get single PageCallToAction by its id""" + pageCallToAction(id: String!): FacebookBusinessPageCallToAction! + + """Get single PageChangeProposal by its id""" + pageChangeProposal(id: String!): FacebookBusinessPageChangeProposal! + + """Get single PagePost by its id""" + pagePost(id: String!): FacebookBusinessPagePost! + + """Get single PageSavedFilter by its id""" + pageSavedFilter(id: String!): FacebookBusinessPageSavedFilter! + + """Get single PageUpcomingChange by its id""" + pageUpcomingChange(id: String!): FacebookBusinessPageUpcomingChange! + + """Get single PageUserMessageThreadLabel by its id""" + pageUserMessageThreadLabel(id: String!): FacebookBusinessPageUserMessageThreadLabel! + + """Get single PartnerStudy by its id""" + partnerStudy(id: String!): FacebookBusinessPartnerStudy! + + """Get single Persona by its id""" + persona(id: String!): FacebookBusinessPersona! + + """Get single Photo by its id""" + photo(id: String!): FacebookBusinessPhoto! + + """Get single Place by its id""" + place(id: String!): FacebookBusinessPlace! + + """Get single PlaceTopic by its id""" + placeTopic(id: String!): FacebookBusinessPlaceTopic! + + """Get single PlayableContent by its id""" + playableContent(id: String!): FacebookBusinessPlayableContent! + + """Get single Post by its id""" + post(id: String!): FacebookBusinessPost! + + """Get single ProductCatalog by its id""" + productCatalog(id: String!): FacebookBusinessProductCatalog! + + """Get single ProductFeed by its id""" + productFeed(id: String!): FacebookBusinessProductFeed! + + """Get single ProductFeedRule by its id""" + productFeedRule(id: String!): FacebookBusinessProductFeedRule! + + """Get single ProductFeedSchedule by its id""" + productFeedSchedule(id: String!): FacebookBusinessProductFeedSchedule! + + """Get single ProductFeedUpload by its id""" + productFeedUpload(id: String!): FacebookBusinessProductFeedUpload! + + """Get single ProductFeedUploadError by its id""" + productFeedUploadError(id: String!): FacebookBusinessProductFeedUploadError! + + """Get single ProductFeedUploadErrorSample by its id""" + productFeedUploadErrorSample(id: String!): FacebookBusinessProductFeedUploadErrorSample! + + """Get single ProductGroup by its id""" + productGroup(id: String!): FacebookBusinessProductGroup! + + """Get single ProductItem by its id""" + productItem(id: String!): FacebookBusinessProductItem! + + """Get single ProductSet by its id""" + productSet(id: String!): FacebookBusinessProductSet! + + """Get single Profile by its id""" + profile(id: String!): FacebookBusinessProfile! + + """Get single PublisherBlockList by its id""" + publisherBlockList(id: String!): FacebookBusinessPublisherBlockList! + + """Get single RTBDynamicPost by its id""" + rtbDynamicPost(id: String!): FacebookBusinessRTBDynamicPost! + + """Get single ReachFrequencyPrediction by its id""" + reachFrequencyPrediction(id: String!): FacebookBusinessReachFrequencyPrediction! + + """Get single ReadOnlyAnalyticsUserPropertyConfig by its id""" + readOnlyAnalyticsUserPropertyConfig(id: String!): FacebookBusinessReadOnlyAnalyticsUserPropertyConfig! + + """Get single Referral by its id""" + referral(id: String!): FacebookBusinessReferral! + + """Get single SavedAudience by its id""" + savedAudience(id: String!): FacebookBusinessSavedAudience! + + """Get single SavedMessageResponse by its id""" + savedMessageResponse(id: String!): FacebookBusinessSavedMessageResponse! + + """Get single SplitTestConfig by its id""" + splitTestConfig(id: String!): FacebookBusinessSplitTestConfig! + + """Get single StoreCatalogSettings by its id""" + storeCatalogSettings(id: String!): FacebookBusinessStoreCatalogSettings! + + """Get single SystemUser by its id""" + systemUser(id: String!): FacebookBusinessSystemUser! + + """Get single ThirdPartyMeasurementReportDataset by its id""" + thirdPartyMeasurementReportDataset(id: String!): FacebookBusinessThirdPartyMeasurementReportDataset! + + """Get single URL by its id""" + url(id: String!): FacebookBusinessURL! + + """Get single UnifiedThread by its id""" + unifiedThread(id: String!): FacebookBusinessUnifiedThread! + + """Get single User by its id""" + user(id: String!): FacebookBusinessUser! + + """Get single UserTaggableFriend by its id""" + userTaggableFriend(id: String!): FacebookBusinessUserTaggableFriend! + + """Get single Vehicle by its id""" + vehicle(id: String!): FacebookBusinessVehicle! + + """Get single VehicleOffer by its id""" + vehicleOffer(id: String!): FacebookBusinessVehicleOffer! + + """Get single VideoCopyright by its id""" + videoCopyright(id: String!): FacebookBusinessVideoCopyright! + + """Get single VideoCopyrightRule by its id""" + videoCopyrightRule(id: String!): FacebookBusinessVideoCopyrightRule! + + """Get single VideoGameShow by its id""" + videoGameShow(id: String!): FacebookBusinessVideoGameShow! + + """Get single VideoList by its id""" + videoList(id: String!): FacebookBusinessVideoList! + + """Get single VideoPoll by its id""" + videoPoll(id: String!): FacebookBusinessVideoPoll! + + """Get single WhatsAppBusinessAccount by its id""" + whatsAppBusinessAccount(id: String!): FacebookBusinessWhatsAppBusinessAccount! + + """Get single WhatsAppBusinessProfile by its id""" + whatsAppBusinessProfile(id: String!): FacebookBusinessWhatsAppBusinessProfile! +} + +""" +Make a REST API call to the Egghead.io API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type EggheadioPassthroughQuery { + """ + Make a GET request to the Egghead.io API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The root for Eggheadio""" +type EggheadioQuery { + """ + Make a REST API call to the Egghead.io API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: EggheadioPassthroughQuery! +} + +"""The search mode.""" +enum DropboxFileSearchMode { + """Search in file names only""" + FILENAME + + """Search in file name and content""" + FILENAME_AND_CONTENT + + """Search deleted file names""" + DELETED_FILENAME +} + +""" +Self-contained URL to download the file. Keep the url secure, as anyone with the URL will be able to download the file. Expires in 24 hours. +""" +type DropboxOneGraphFileDownload { + """ + Url to download the file. Keep the url secure, as anyone with the URL will be able to download the file. Expires in 24 hours. + """ + url: String! + + """The time at which the download url expires (RFC 3339 date-time).""" + expirationTime: String! +} + +"""Sharing info for a file which is contained by a shared folder.""" +type DropboxFileSharingInfo { + """True if the file or folder is inside a read-only shared folder.""" + readOnly: Boolean + + """ID of shared folder that holds this file.""" + parentSharedFolderId: String + + """ + The last user who modified the file. This field will be null if the user's account has been deleted. This field is optional. + """ + modifiedBy: String +} + +"""""" +type DropboxSymlinkInfo { + """The target this symlink points to.""" + target: String +} + +"""Metadata for a photo""" +type DropboxPhotoMetadata { + """Dimension of the photo/video. This field is optional.""" + dimensions: DropboxDimensions + + """The GPS coordinate of the photo/video. This field is optional.""" + location: DropboxGpsCoordinates + + """The timestamp when the photo/video is taken. This field is optional.""" + timeTaken: String +} + +"""GpsCoordinates for a photo or video.""" +type DropboxGpsCoordinates { + """Latitude of the GPS coordinates.""" + latitude: Float + + """Longitude of the GPS coordinates.""" + longitude: Float +} + +"""Dimensions for a photo or video.""" +type DropboxDimensions { + """Height of the photo/video.""" + height: Int + + """Width of the photo/video.""" + width: Int +} + +"""Metadata for a video""" +type DropboxVideoMetadata { + """Dimension of the photo/video. This field is optional.""" + dimensions: DropboxDimensions + + """The GPS coordinate of the photo/video. This field is optional.""" + location: DropboxGpsCoordinates + + """The timestamp when the photo/video is taken. This field is optional.""" + timeTaken: String + + """The duration of the video in milliseconds. This field is optional.""" + duration: Int +} + +union DropboxMediaMetadata = DropboxVideoMetadata | DropboxPhotoMetadata + +"""""" +type DropboxMediaInfo { + """ + Indicate the photo/video is still under processing and metadata is not available yet. + """ + pending: Boolean + + """The metadata for the photo/video.""" + metadata: DropboxMediaMetadata +} + +"""Metadata for a file""" +type DropboxFile { + """ + The last component of the path (including extension). This never contains a slash. + """ + name: String + + """A unique identifier for the file.""" + id: String + + """ + For files, this is the modification time set by the desktop client when the file was added to Dropbox. Since this time is not verified (the Dropbox server stores whatever the desktop client sends up), this should only be used for display purposes (such as sorting) and not, for example, to determine if a file has changed or not. + """ + clientModified: String + + """The last time the file was modified on Dropbox.""" + serverModified: String + + """ + A unique identifier for the current revision of a file. This field is the same rev as elsewhere in the API and can be used to detect changes and avoid conflicts. + """ + rev: String + + """The file size in bytes.""" + size: Int + + """ + The lowercased full path in the user's Dropbox. This always starts with a slash. This field will be null if the file or folder is not mounted. This field is optional. + """ + pathLower: String + + """ + The cased path to be used for display purposes only. In rare instances the casing will not correctly match the user's filesystem, but this behavior will match the path provided in the Core API v1, and at least the last path component will have the correct casing. Changes to only the casing of paths won't be returned by + """ + pathDisplay: String + + """ + Field is deprecated. Please use FileSharingInfo.parent_shared_folder_id or FolderSharingInfo.parent_shared_folder_id instead. This field is optional. + """ + parentSharedFolderIddeprecated: String + + """ + Additional information if the file is a photo or video. This field is optional. + """ + mediaInfo: DropboxMediaInfo + + """Set if this file is a symlink. This field is optional.""" + symlinkInfo: DropboxSymlinkInfo + + """ + Set if this file is contained in a shared folder. This field is optional. + """ + sharingInfo: DropboxFileSharingInfo + + """ + Additional information if the file has custom properties with the property template specified. This field is optional. + """ + propertyGroups: [DropboxProperyGroup!] + + """ + This flag will only be present if include_has_explicit_shared_members is true in + """ + hasExplicitSharedMembers: Boolean + + """ + A hash of the file content. This field can be used to verify data integrity. For more information see our + """ + contentHash: String + + """ + Self-contained URL to download the file. Keep the url secure, as anyone with the URL will be able to download the file. Expires in 24 hours. + """ + fileDownload: DropboxOneGraphFileDownload +} + +"""Key/Value pair.""" +type DropboxProperyField { + """ + Key of the property field associated with a file and template. Keys can be up to 256 bytes. + """ + name: String + + """ + Value of the property field associated with a file and template. Values can be up to 1024 bytes. + """ + value: String +} + +""" +Additional information if the file has custom properties with the property template specified +""" +type DropboxProperyGroup { + """A unique identifier for the associated template.""" + templateId: String + + """ + The actual properties associated with the template. There can be up to 32 property types per template. + """ + fields: [DropboxProperyField!] +} + +""" +Sharing info for a folder which is contained in a shared folder or is a shared folder mount point. +""" +type DropboxFolderSharingInfo { + """True if the file or folder is inside a read-only shared folder.""" + readOnly: Boolean + + """ID of shared folder that holds this file.""" + parentSharedFolderId: String + + """ + The last user who modified the file. This field will be null if the user's account has been deleted. This field is optional. + """ + modifiedBy: String +} + +"""Metadata for a folder""" +type DropboxFolder { + """ + The last component of the path (including extension). This never contains a slash. + """ + name: String + + """A unique identifier for the folder.""" + id: String + + """ + The lowercased full path in the user's Dropbox. This always starts with a slash. This field will be null if the file or folder is not mounted. This field is optional. + """ + pathLower: String + + """ + The cased path to be used for display purposes only. In rare instances the casing will not correctly match the user's filesystem, but this behavior will match the path provided in the Core API v1, and at least the last path component will have the correct casing. Changes to only the casing of paths won't be returned by + """ + pathDisplay: String + + """ + Set if the folder is contained in a shared folder or is a shared folder mount point. This field is optional. + """ + sharingInfo: DropboxFolderSharingInfo + + """ + Additional information if the file has custom properties with the property template specified. Note that only properties associated with user-owned templates, not team-owned templates, can be attached to folders. This field is optional. + """ + propertyGroups: [DropboxProperyGroup!] +} + +union DropboxFileSearchResultMetadata = DropboxFolder | DropboxFile + +"""File search result""" +type DropboxFileSearchResult { + """The type of the match. One of `filename`, `content`, or `both`.""" + matchType: String + + """The metadata for the matched file or folder.""" + result: DropboxFileSearchResultMetadata +} + +"""List of file search results with pagination information.""" +type DropboxFileSearchResultsConnection { + """List of file search results.""" + nodes: [DropboxFileSearchResult!] +} + +"""The root for dropbx.""" +type DropboxQuery { + account( + """A user's account information""" + accountId: String! + ): DropboxAccount + searchFiles( + """ + The search mode (`FILENAME`, `FILENAME_AND_CONTENT`, or `DELETED_FILENAME`). Note that searching file content is only available for Dropbox Business accounts. + """ + mode: DropboxFileSearchMode + + """ + The path in the user's Dropbox to search. Should probably be a folder. Defaults to the root folder. + """ + filePath: String + + """Number of results to fetch""" + first: Int + + """""" + query: String! + ): DropboxFileSearchResultsConnection +} + +"""An edge in a connection.""" +type DribbbleProjectsEdge { + """The item at the end of the edge""" + node: DribbbleProject! +} + +type DribbbleProject { + """""" + id: Int + + """""" + name: String + + """""" + description: String + + """""" + shotsCount: Int + + """""" + createdAt: String + + """""" + updatedAt: String +} + +"""Projects on Dribbble""" +type DribbbleProjectsConnection { + """Projects""" + nodes: [DribbbleProject!]! + + """A list of edges""" + edges: [DribbbleProjectsEdge!]! +} + +"""An edge in a connection.""" +type DribbbleShotsEdge { + """The item at the end of the edge""" + node: DribbbleShot! +} + +type DribbbleShotVideo { + """""" + id: Int + + """""" + duration: Int + + """""" + videoFileName: String + + """""" + videoFileSize: Int + + """""" + width: Int + + """""" + height: Int + + """""" + silent: Boolean + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + url: String + + """""" + smallPreviewUrl: String + + """""" + largePreviewUrl: String + + """""" + xlargePreviewUrl: String +} + +type DribbbleShotProject { + """""" + id: Int + + """""" + name: String + + """""" + description: String + + """""" + shotsCount: Int + + """""" + createdAt: String + + """""" + updatedAt: String +} + +type DribbbleShotAttachment { + """""" + id: Int + + """""" + url: String + + """""" + thumbnailUrl: String + + """""" + size: Int + + """""" + contentType: String + + """""" + createdAt: String +} + +type DribbbleShotImage { + """""" + hidpi: String + + """""" + normal: String + + """""" + teaser: String +} + +type DribbbleShot { + """""" + id: Int + + """""" + title: String + + """""" + description: String + + """""" + width: Int + + """""" + height: Int + + """""" + images: DribbbleShotImage + + """""" + publishedAt: String + + """""" + updatedAt: String + + """""" + htmlUrl: String + + """""" + animated: Boolean + + """""" + tags: [String!] + + """""" + attachments: [DribbbleShotAttachment!] + + """""" + projects: [DribbbleShotProject!] + + """""" + team: DribbbleTeam + + """""" + video: DribbbleShotVideo + + """""" + lowProfile: Boolean +} + +"""Shots on Dribbble""" +type DribbbleShotsConnection { + """Shots""" + nodes: [DribbbleShot!]! + + """A list of edges""" + edges: [DribbbleShotsEdge!]! +} + +"""The root for the currently logged-in Dribbble user.""" +type DribbbleMe { + """The user's unique Dribbble ID.""" + id: Int + + """""" + name: String + + """""" + login: String + + """""" + htmlUrl: String + + """""" + avatarUrl: String + + """""" + bio: String + + """""" + location: String + + """""" + links: DribbbleLink + + """""" + canUploadShot: Boolean + + """""" + pro: Boolean + + """""" + followersCount: Int + + """""" + createdAt: String + + """""" + type: String + + """""" + teams: [DribbbleTeam!] + shots: DribbbleShotsConnection + projects: DribbbleProjectsConnection +} + +"""The root for Dribbble.""" +type DribbbleQuery { + me: DribbbleMe +} + +"""An edge in a connection.""" +type DevToArticlesEdge { + """The item at the end of the edge""" + node: DevToArticle! +} + +"""Articles on DevTo""" +type DevToArticlessConnection { + """Articles""" + nodes: [DevToArticle!]! + + """A list of edges""" + edges: [DevToArticlesEdge!]! +} + +type DevToArticle { + """""" + typeOf: String + + """""" + id: Int + + """""" + title: String + + """""" + description: String + + """""" + coverImage: String + + """""" + readablePublishDate: String + + """""" + socialImage: String + + """""" + slug: String + + """""" + path: String + + """""" + url: String + + """""" + canonicalUrl: String + + """""" + commentsCount: Int + + """""" + positiveReactionsCount: Int + + """""" + createdAt: String + + """""" + editedAt: String + + """""" + crosspostedAt: String + + """""" + publishedAt: String + + """""" + lastCommentAt: String + + """Crossposting or published date time""" + publishedTimestamp: String + + """""" + user: DevToArticleUser + + """""" + organization: DevToArticleOrganization + + """""" + flareTag: DevToArticleFlareTag + + """The body content as the original markdown""" + bodyMarkdown: String + + """The body content as the rendered html""" + bodyHtml: String + + """Keywords this article has been tagged with""" + tags: [String!] +} + +""" +Make a REST API call to the Dev.to API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type DevToPassthroughQuery { + """ + Make a GET request to the Dev.to API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The root for DevTo""" +type DevToQuery { + """ + Make a REST API call to the Dev.to API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: DevToPassthroughQuery! + + """A published article""" + publishedArticle(id: Int!): DevToArticle + + """ + "Articles" are all the posts that users create on DEV that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but is referred to as article within the code. + + By default it will return featured, published articles ordered by descending popularity. + + Each page will contain `30` articles. + + Responses, according to the combination of params, are cached for 24 hours. + + """ + articles( + """ + Adding this will allow the client to return the most popular articles + in the last `N` days. + + `top` indicates the number of days since publication of the articles + returned. + + This param can only be used by itself or with `tag`. + + """ + top: Int + + """ + Adding this will allow the client to check which articles are fresh or rising. + + If `state=fresh` the server will return published fresh articles. + If `state=rising` the server will return published rising articles. + + This param can only be used by itself or with `username` if set to `all`. + + """ + state: String + + """ + Adding this parameter will return articles belonging to a User or Organization + ordered by descending `published_at`. + + If `state=all` the number of items returned will be `1000` instead of the default `30`. + + This param can be used by itself or only with `page` and `state`. + + """ + username: String + + """ + Adding this parameter will return articles that contain the + requested tag. + + This param can be used by itself, with `page` or with `top`. + + """ + tag: String + ): DevToArticlessConnection + + """ + Retrieve a list of webhooks they have previously registered. + + "Webhooks" are used to register HTTP endpoints that will be called once a relevant event is triggered inside the web application, events like article_created, article_updated. + + It will return all webhooks, without pagination. + """ + webhooks: [DevToWebhook!] +} + +""" +The full response of the API request, including headers and status code. +""" +type PassthroughResultResponse { + """The HTTP status code of the response""" + statusCode: Int! + + """The HTTP headers, as a list of key, value pairs.""" + headers: [[String!]!]! + + """The HTTP version, usually 1.1""" + httpVersion: String! + + """The body of the HTTP response, as a string.""" + rawBody: String! +} + +"""Result of a passthrough API call.""" +type PassthroughResult { + """ + The json-encoded body of the HTTP response. If you need the raw body, use `response.rawBody`. + """ + jsonBody: JSON! + + """ + The full response of the API request, including headers and status code. + """ + response: PassthroughResultResponse! +} + +""" +Make a REST API call to the Contentful API. + +OneGraph will inject the auth params for the API call. + +Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. +""" +type ContentfulPassthroughQuery { + """ + Make a GET request to the Contentful API. Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + get( + """ + Whether to send an unauthenticated request to the API. Defaults to false. + """ + allowUnauthenticated: Boolean + + """ + The query for the URL as a percent-encoded string, e.g. `first=10&sort=popular` + """ + queryString: String + + """ + The query for the URL, as a list of key-value pairs, e.g. `[["first", "10"], ["sort", "popular"]]` + """ + query: [[String!]!] + + """The path of the URL, e.g. `/posts`.""" + path: String! + ): PassthroughResult! +} + +"""The root for Contentful""" +type ContentfulQuery { + """ + Make a REST API call to the Contentful API. + + OneGraph will inject the auth params for the API call. + + Use this as an escape hatch if OneGraph does not yet support functionality of the underlying API. + """ + makeRestCall: ContentfulPassthroughQuery! +} + +"""Direction to order results, ascending or descending""" +enum CloudflareDirectionArg { + ASCENDING + DESCENDING +} + +"""Access level for a permission""" +type CloudflareAccountRolePermissionAccessLevel { + """""" + read: Boolean + + """""" + edit: Boolean +} + +"""Access permissions for a Role""" +type CloudflareAccountRolePermissions { + """""" + analytics: CloudflareAccountRolePermissionAccessLevel + + """""" + zones: CloudflareAccountRolePermissionAccessLevel + + """""" + dns: CloudflareAccountRolePermissionAccessLevel + + """""" + dnsRecords: CloudflareAccountRolePermissionAccessLevel + + """""" + ssl: CloudflareAccountRolePermissionAccessLevel + + """""" + cachePurge: CloudflareAccountRolePermissionAccessLevel + + """""" + logs: CloudflareAccountRolePermissionAccessLevel + + """""" + organization: CloudflareAccountRolePermissionAccessLevel + + """""" + lb: CloudflareAccountRolePermissionAccessLevel + + """""" + zoneSettings: CloudflareAccountRolePermissionAccessLevel + + """""" + billing: CloudflareAccountRolePermissionAccessLevel + + """""" + waf: CloudflareAccountRolePermissionAccessLevel +} + +"""A Role defines what permissions a Member of an Account has.""" +type CloudflareAccountRole { + """ + Role identifier tag + + 3536bcfad5faccb999b47003c79917fb + + """ + id: String + + """ + Role Name + + Account Administrator + + """ + name: String + + """ + Description of role's permissions + + Administrative access to the entire Account + + """ + description: String + + """Access permissions for a Role""" + permissions: CloudflareAccountRolePermissions +} + +"""A Cloudflare Organization.""" +type CloudflareOrganization { + """ + Organization identifier tag + + 01a7362d577a6c3019a474fd6f485823 + + """ + id: String + + """ + Organization Name + + Cloudflare, Inc. + + """ + name: String + + """ + Whether or not the user is a member of the organization or has an inivitation pending + + member + + """ + status: String + + """Access permissions for this User""" + permissions: [String!] + + """List of role names for the User at the Organization""" + roles: [String!] +} + +"""A Cloudflare User.""" +type CloudflareUser { + """ + A list of the organizations the user is a member of (or invited to) and the permissions granted to them. + """ + organizations: [CloudflareOrganization!] + + """ + A list of betas the user is currently participating in. If a beta is zone-specific, the beta will apply to all zones. + """ + betas: [String!] + + """ + User's telephone number + + "+1 123-123-1234" + + """ + telephone: String + + """ + The zipcode or postal code where the user lives. + + "12345" + + """ + zipcode: String + + """ + User's last name + + "Appleseed" + + """ + lastName: String + + """ + Last time the user was modified + + "2014-01-01T05:20:00Z" + + """ + modifiedOn: String + + """ + A username used to access other cloudflare services, like support + + "cfuser12345" + + """ + username: String + + """ + When the user signed up. + + "2014-01-01T05:20:00Z" + + """ + createdOn: String + + """ + The country in which the user lives. + + "US" + + """ + country: String + + """ + Whether two-factor authentication is enabled for the user account. This does not apply to API authentication + + false + + """ + twoFactorAuthenticationEnabled: Boolean + + """ + User's first name + + "John" + + """ + firstName: String + + """ + User identifier tag + + "7c5dae5552338874e5053f2534d2767a" + + """ + id: String + + """ + Your contact email address + + "user@example.com" + + """ + email: String +} + +"""An association between a Cloudflare user and an account""" +type CloudflareAccountMembership { + """ + Membership identifier tag + + "4536bcfad5faccb111b47003c79917fa" + + """ + id: String + + """ + The unique activation code for the account membership + + "05dd05cce12bbed97c0d87cd78e89bc2fd41a6cee72f27f6fc84af2e45c0fac0" + + """ + code: String + + """Member""" + user: CloudflareUser + + """ + A member's status in the account + + "accepted" + + """ + status: String + + """Roles assigned to this member""" + roles: [CloudflareAccountRole!] +} + +""" +List of Cloudflare account memberships, with metadata fields for pagination. +""" +type CloudflareAccountMembershipsConnection { + """List of Cloudflare account memberships""" + nodes: [CloudflareAccountMembership!]! + + """Total number of account memberships.""" + totalCount: Int! + + """Extra fields for use in pagination.""" + pageInfo: PageInfo! +} + +"""Account settings for a Cloudflare Account.""" +type CloudflareAccountSettings { + """ + Indicates whether or not membership in this account requires that Two-Factor Authentication is enabled + """ + enforceTwofactor: Boolean +} + +"""A Cloudflare Account.""" +type CloudflareAccount { + """ + Account identifier tag + + "01a7362d577a6c3019a474fd6f485823" + + """ + id: String + + """ + Account name + + "Demo Account" + + """ + name: String + + """ + Account settings + + { + "enforce_twofactor": false + } + """ + settings: CloudflareAccountSettings + + """All memberships of an account""" + memberships( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Direction to order results by, defaults to descending""" + direction: CloudflareDirectionArg + + """ + Number of results to return, minimum is 5, maximum is 50. Defaults to 20. + """ + first: Int + ): CloudflareAccountMembershipsConnection + + """All roles of an account""" + roles: [CloudflareAccountRole!] +} + +"""List of Cloudflare accounts, with metadata fields for pagination.""" +type CloudflareAccountsConnection { + """List of Cloudflare accounts""" + nodes: [CloudflareAccount!]! + + """Total number of accounts.""" + totalCount: Int! + + """Extra fields for use in pagination.""" + pageInfo: PageInfo! +} + +"""The root for CloudFlare.""" +type CloudflareQuery { + """Accounts that the current authentication owns or has access to""" + accounts( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Direction to order results by, defaults to descending""" + direction: CloudflareDirectionArg + + """ + Number of results to return, minimum is 5, maximum is 50. Defaults to 20. + """ + first: Int + ): CloudflareAccountsConnection + + """Get information about a specific account""" + account( + """Account Id""" + id: String! + ): CloudflareAccount + + """currently logged in user""" + me: CloudflareUser +} + +"""Clearbit company metrics""" +type ClearbitPersonCompanyMetrics { + alexaUsRank: Int + employees: Int + alexaGlobalRank: Int + estimatedAnnualRevenue: String + employeesRange: String + fiscalYearEnd: Int + raised: Int + annualRevenue: Int + marketCap: Int +} + +"""Clearbit company category""" +type ClearbitPersonCompanyCategory { + sector: String + industry: String + industryGroup: String + subIndustry: String + sicCode: String + naicsCode: String +} + +"""Clearbit company site""" +type ClearbitPersonCompanySite { + phoneNumbers: [String!] + emailAddresses: [String!] +} + +"""Clearbit company crunchbase""" +type ClearbitPersonCompanyCrunchbase { + handle: String +} + +"""Clearbit company parent""" +type ClearbitPersonCompanyParent { + domain: String +} + +"""Clearbit company identifier""" +type ClearbitPersonCompanyIdentifier { + usEIN: String +} + +"""The result of a Clearbit company enrichment call""" +type ClearbitPersonCompany { + domainAliases: [String!] + tech: [String!] + identifiers: ClearbitPersonCompanyIdentifier + parent: ClearbitPersonCompanyParent + tags: [String!] + crunchbase: ClearbitPersonCompanyCrunchbase + timeZone: String + id: String + twitter: TwitterUser + linkedin: ClearbitPersonLinkedIn + foundedYear: Int + name: String + geo: ClearbitPersonGeo + location: String + domain: String + site: ClearbitPersonCompanySite + facebook: ClearbitPersonFacebook + ticker: String + type: String + phone: String + utcOffset: Int + legalName: String + logo: String + category: ClearbitPersonCompanyCategory + emailProvider: Boolean + metrics: ClearbitPersonCompanyMetrics + description: String + indexedAt: String +} + +"""Clearbit Google Plus""" +type ClearbitPersonGooglePlus { + handle: String +} + +"""Clearbit Facebook""" +type ClearbitPersonFacebook { + handle: String +} + +"""Clearbit person geo""" +type ClearbitPersonGeo { + countryCode: String + stateCode: String + county: String + city: String + lng: Float + lat: Float + state: String +} + +"""Clearbit person name""" +type ClearbitPersonName { + familyName: String + fullName: String + givenName: String +} + +"""Clearbit LinkedIn""" +type ClearbitPersonLinkedIn { + handle: String +} + +"""Clearbit Gravatar Avatar""" +type ClearbitPersonGravatarAvatar { + url: String + type: String +} + +"""Clearbit Gravatar""" +type ClearbitPersonGravatar { + handle: String + urls: [String!] + avatar: String + avatars: [ClearbitPersonGravatarAvatar!] +} + +"""Clearbit employment""" +type ClearbitPersonEmployment { + role: String + name: String + domain: String + seniority: String + title: String +} + +"""The result of a Clearbit contact enrichment call""" +type ClearbitPerson { + employment: ClearbitPersonEmployment + githubUser: GitHubUser + bio: String + gravatar: ClearbitPersonGravatar + timeZone: String + id: String! + email: String + fuzzy: Boolean + twitter: TwitterUser + linkedin: ClearbitPersonLinkedIn + name: ClearbitPersonName + geo: ClearbitPersonGeo + avatar: String + location: String + site: String + facebook: ClearbitPersonFacebook + googleplus: ClearbitPersonGooglePlus + utcOffset: Int + emailProvider: Boolean + indexedAt: String +} + +""" +The Enrichment API lets you look up person and company data based on an email or domain. For example, you could retrieve a person’s name, location and social handles from an email. Or you could lookup a company’s location, headcount or logo based on their domain name. + + Note: You’ll only be charged once per 30 day period for each unique request, so if you didn’t store the data properly or need to re-run a series of requests for any reason, those won’t count against your allotment. +""" +type ClearbitEnrichment { + person: ClearbitPerson + company: ClearbitPersonCompany +} + +"""The result of a Clearbit autocomplete call""" +type ClearbitAutocomplete { + """Domain name of company""" + domain: String + + """URL to logo""" + logo: String + + """Name of the company""" + name: String +} + +""" +Company Autocomplete is a free Clearbit API that lets you auto-complete company names and retrieve logo and domain information. +""" +type Clearbit { + """Clearbit company autocomplete""" + autocomplete( + """The partial name of the company""" + name: String! + ): [ClearbitAutocomplete!] + + """Clearbit contact enrichment""" + enrich(facebook: String, twitter: String, linkedin: String, companyDomain: String, company: String, location: String, ipAddress: String, familyName: String, givenName: String, email: String!): ClearbitEnrichment +} + +type BundlephobiaRecentSearch { + """""" + count: Int + + """""" + lastSearched: Int + + """""" + name: String + + """""" + version: String + + """ + Info on a recently searched package from Bundlephobia at the searched for version. + """ + package( + """ + Whether to include this query in the Bundlephobia analytics stats and recent searches + """ + record: Boolean + ): BundlephobiaDependencyInfo +} + +type BundlephobiaDependencySize { + """""" + approximateSize: Int + + """""" + name: String +} + +type BundlephobiaDependencyInfo { + """""" + dependencyCount: Int + + """""" + description: String + + """""" + gzip: Int + + """""" + hasJSModule: String + + """""" + hasJSNext: String + + """""" + hasSideEffects: Boolean + + """""" + name: String + + """""" + repository: String + + """""" + scoped: Boolean + + """""" + size: Int + + """""" + version: String + + """""" + dependencySizes: [BundlephobiaDependencySize!] + + """Historical info on this package.""" + history: [BundlephobiaDependencyInfo] +} + +""" +The root for Bundlephobia. [Bundlephobia](https://bundlephobia.com) is a service by [@pastelsky](https://github.com/pastelsky) to find the cost of adding an `npm` package to your bundle, because JavaScript bloat is more real today than ever before. Sites continuously accumulate mass as more (often redundant) libraries are thrown in to solve new problems. Until of-course, the big rewrite happens. Bundlephobia lets you understand the performance cost of npm installing a new npm package before actually adding it to your bundle. +""" +type BundlephobiaQuery { + """Info on a package from Bundlephobia.""" + packageInfo( + """ + Whether to include this query in the Bundlephobia analytics stats and recent searches + """ + record: Boolean + + """The npm package version, e.g. `10.0.1`""" + version: String + + """The npm package name.""" + package: String! + ): BundlephobiaDependencyInfo + + """Historical info on a package from Bundlephobia.""" + packageHistory( + """The npm package name.""" + package: String! + ): [BundlephobiaDependencyInfo] + + """Get recent searches on Bundlephobia.""" + recentSearches: [BundlephobiaRecentSearch!] +} + +"""The content type to search.""" +enum BoxFileSearchContentType { + NAME + DESCRIPTION + FILE_CONTENT + COMMENTS + TAGS +} + +""" +Range argument. Can provide start, end, or both. If start or end is not provided, then the range will be unbounded. +""" +input BoxRangeArg { + end: String + start: String +} + +""" +Self-contained URL to download the file. Keep the url secure, as anyone with the URL will be able to download the file. Expires in 24 hours. +""" +type BoxOneGraphFileDownload { + """ + Url to download the file. Keep the url secure, as anyone with the URL will be able to download the file. Expires in 24 hours. + """ + url: String! + + """The time at which the download url expires (RFC 3339 date-time).""" + expirationTime: String! +} + +"""The watermarkInfo held on the file""" +type BoxWatermarkInfo { + """""" + isWatermarked: Boolean +} + +"""The lock held on the file""" +type BoxLock { + """""" + createdBy: BoxUser + + """""" + createdAt: String + + """""" + expiredAt: String + + """""" + isDownloadPrevented: Boolean + + """""" + id: String + + """""" + type: String +} + +""" +An object containing the permissions that the current user has on this file. +""" +type BoxFilePermissions { + """""" + canDownload: Boolean + + """""" + canPreview: Boolean + + """""" + canUpload: Boolean + + """""" + canRename: Boolean + + """""" + candDelete: Boolean + + """""" + canShare: Boolean + + """""" + canInviteCollaborator: Boolean + + """""" + canSetShareAccess: Boolean +} + +"""Permissions for a shared link""" +type BoxSharedLinkPermissions { + """""" + canDownload: Boolean + + """""" + canPreview: Boolean +} + +""" +Shared links provide direct, read-only access to files or folder on Box using a URL. Shared links with `open` access level allow anyone with the URL to access the item, while shared links with `company` or `collaborators` access levels can only be accessed by appropriate authenticated Box users. See [here](https://community.box.com/t5/Using-Shared-Links/Creating-Shared-Links/ta-p/19523) for more details on all of the options and admin settings related to shared links. + + Users can access shared items by entering the shared link URL in a browser. Applications can also access shared items using the [Get Shared Item](https://developer.box.com/reference#get-a-shared-item) API and the `BoxApi` header. + +Shared link objects are only created, updated, or deleted as part of file or folder objects -- not on their own. There is only one active shared link for a file or folder at any time. If you update the shared link settings, the new settings will apply to any users who already have the URL. If you delete the shared link and create a new one, the new shared link with have a different URL and users with the old URL will not be able to access the item. +""" +type BoxSharedLink { + """""" + url: String + + """""" + downloadUrl: String + + """""" + password: String + + """""" + vanityUrl: String + + """""" + isPasswordEnabled: Boolean + + """""" + unsharedAt: String + + """""" + downloadCount: Int + + """""" + previewCount: Int + + """""" + access: String + + """""" + effectiveAccess: String + + """""" + permissions: BoxSharedLinkPermissions +} + +"""References either a file or folder""" +type BoxItemReference { + """ + A unique ID for use with the /events endpoint. + May be null for some folders such as root or trash. + """ + sequenceId: String + + """ + A unique string identifying the version of this folder. + May be null for some folders such as root or trash. + """ + etag: String + + """The name of the folder.""" + name: String + + """""" + id: String + + """""" + type: String +} + +"""List of path collections""" +type BoxPathCollectionConnection { + """List of patch collections""" + nodes: [BoxItemReference!] + + """Total number of results""" + totalCount: Int +} + +"""The version information of the file.""" +type BoxFileVersionReference { + """""" + name: String + + """""" + size: Int + + """""" + createdAt: String + + """""" + modifiedAt: String + + """""" + modifiedBy: BoxUser + + """The sha1 hash of this file.""" + sha1: String + + """""" + id: String + + """""" + type: String +} + +"""File object in Box""" +type BoxFile { + """The sha1 hash of this file.""" + sha1: String + + """ + A unique ID for use with the /events endpoint. + May be null for some folders such as root or trash. + """ + sequenceId: String + + """ + A unique string identifying the version of this folder. + May be null for some folders such as root or trash. + """ + etag: String + + """The name of the folder.""" + name: String + + """""" + id: String + + """""" + type: String + + """""" + fileVersion: BoxFileVersionReference + + """The description of this file.""" + description: String + + """Size of this file in bytes.""" + size: Int + + """The path of folders to this file, starting at the root.""" + pathCollection: BoxPathCollectionConnection + + """When this file was created on Box’s servers.""" + createdAt: String + + """When this file was last updated on the Box servers.""" + modifiedAt: String + + """When this file was last moved to the trash.""" + trashedAt: String + + """When this file will be permanently deleted.""" + purgedAt: String + + """When the content of this file was created (more info).""" + contentCreatedAt: String + + """When the content of this file was last modified (more info).""" + contentModifiedAt: String + + """The user who first created file.""" + createdBy: BoxUser + + """The user who last updated this file.""" + modifiedBy: BoxUser + + """The user who owns this file.""" + ownedBy: BoxUser + + """""" + sharedLink: BoxSharedLink + + """The folder containing this file.""" + parent: BoxItemReference + + """Whether this item is deleted or not.""" + itemStatus: String + + """The version number of the file.""" + versionNumber: String + + """The number of comments on a file.""" + commentCount: Int + + """""" + permissions: BoxFilePermissions + + """All tags applied to this file.""" + tags: [String!] + + """""" + lock: BoxLock + + """ + Indicates the suffix, when available, on the file. By default, set to an empty string. The suffix usually indicates the encoding (file format) of the file contents or usage. + """ + extension: String + + """Whether the file is a package. Used for Mac Packages used by iWorks.""" + isPackage: Boolean + + """ + An expiring URL for an embedded preview session in an iframe. This URL will expire after 60 seconds and the session will expire after 60 minutes. + """ + expiringEmbedLink: String + + """""" + watermarkInfo: BoxWatermarkInfo + + """ + Self-contained URL to download the file. Keep the url secure, as anyone with the URL will be able to download the file. Expires in 24 hours. + """ + fileDownload: BoxOneGraphFileDownload +} + +"""List of files with pagination information""" +type BoxFilesConnection { + """List of files""" + nodes: [BoxFile!] + + """Total number of results""" + totalCount: Int +} + +"""The root for Box.""" +type BoxQuery { + user(userId: String!): BoxUser + searchFiles( + """ + Whether to search for trash. If true, only returns items from the trash + """ + searchTrash: Boolean + + """Search for objects of specified content types. """ + contentTypes: [BoxFileSearchContentType!] + + """Search for the contents of specific folders (and folders within them).""" + ancestorFolderIds: [String!] + + """Search for objects by owner.""" + ownerUserIds: [String!] + + """ + Return only files within a stated size range. Specify the range in bytes + """ + size: BoxRangeArg + + """ + The date when the item last updated. Specify the date range using RFC3339 timestamps. For example: `2014-05-15T13:35:01-07:00` + """ + updatedAt: BoxRangeArg + + """ + The date when the item was created. Specify the date range using RFC3339 timestamps. For example: `2014-05-15T13:35:01-07:00` + """ + createdAt: BoxRangeArg + + """Limit searches to specific file extensions like pdf,png, or doc.""" + fileExtensions: [String!] + + """Number of results to fetch""" + first: Int + + """ + The string to search for. Box matches the search string against object names, descriptions, text contents of files, and other data. + """ + query: String! + ): BoxFilesConnection +} + +type AirtableTable { + records( + """ + A [formula](https://support.airtable.com/hc/en-us/articles/203255215-Formula-Field-Reference) used to filter records. The formula will be evaluated for each record, and if the result is not `0`, `false`, `""`, `NaN`, `[]`, or `#Error!` the record will be included in the response. + + If combined with view, only records in that view which satisfy the formula will be returned. + + For example, to only include records where fieldName isn't empty, pass in: `NOT({fieldName} = '')` + """ + filterByFormula: String + + """ + A list of sort objects that specifies how the records will be ordered. Each sort object must have a field key specifying the name of the field to sort on, and an optional direction key that is either `ASC` or `DESC`. The default direction is `ASC`. + """ + sort: [AirtableRecordsSortArg!] + + """ + The name or ID of a view in the table. If set, only the records in that view will be returned. The records will be sorted according to the order of the view. + """ + view: String + + """Returns the elements that come after the specified cursor.""" + after: String + + """How many records to fetch. Defaults to 10, max is 100.""" + first: Int + ): AirtableRecordsConnection! + record( + """Id of the record to fetch.""" + recordId: String! + ): AirtableRecord! +} + +""" +An Airtable base contains all of the information you need for a particular project or collection. Each of the square icons on your homepage is a different base. It's kind of like a workbook in a traditional spreadsheet, and can contain multiple tables of content. + +""" +type AirtableBase { + table( + """Case-insensitive name for the table""" + tableName: String! + ): AirtableTable! +} + +enum AirtableRecordsSortDirection { + """Sort ascending""" + ASC + + """Sort descending""" + DESC +} + +input AirtableRecordsSortArg { + """The direction to sort. Default is `ASC`.""" + direction: AirtableRecordsSortDirection + + """The field name to sort on. Note that the field name is case sensitive.""" + field: String! +} + +type AirtableBooleanField { + fieldName: String! + value: Boolean! +} + +type AirtableNumberField { + fieldName: String! + value: Float! +} + +type AirtableStringField { + fieldName: String! + value: String! +} + +union AirtableField = AirtableStringField | AirtableNumberField | AirtableBooleanField + +type AirtableRecord { + """Id of the record.""" + id: String! + + """Time that the record was created.""" + createdTime: String! + fields: [AirtableField!]! + field(fieldName: String!): AirtableField + stringField(fieldName: String!): String + numberField(fieldName: String!): Float + booleanField(fieldName: String!): Boolean +} + +type AirtableRecordsConnection { + pageInfo: PageInfo + nodes: [AirtableRecord!]! +} + +"""The root for Airtable.""" +type AirtableQuery { + records( + """ + A [formula](https://support.airtable.com/hc/en-us/articles/203255215-Formula-Field-Reference) used to filter records. The formula will be evaluated for each record, and if the result is not `0`, `false`, `""`, `NaN`, `[]`, or `#Error!` the record will be included in the response. + + If combined with view, only records in that view which satisfy the formula will be returned. + + For example, to only include records where fieldName isn't empty, pass in: `NOT({fieldName} = '')` + """ + filterByFormula: String + + """ + A list of sort objects that specifies how the records will be ordered. Each sort object must have a field key specifying the name of the field to sort on, and an optional direction key that is either `ASC` or `DESC`. The default direction is `ASC`. + """ + sort: [AirtableRecordsSortArg!] + + """ + The name or ID of a view in the table. If set, only the records in that view will be returned. The records will be sorted according to the order of the view. + """ + view: String + + """Returns the elements that come after the specified cursor.""" + after: String + + """How many records to fetch. Defaults to 10, max is 100.""" + first: Int + + """The table name that contains the records.""" + tableName: String! + + """ + You can find the baseId from by selecting one of your bases at https://airtable.com/api. The baseId is the part of the path in the URL that starts with `app`. + """ + baseId: String! + ): AirtableRecordsConnection! + record( + """The id of the record to fetch.""" + recordId: String! + + """The table name that contains the record.""" + tableName: String! + + """ + You can find the baseId from by selecting one of your bases at https://airtable.com/api. The baseId is the part of the path in the URL that starts with `app`. + """ + baseId: String! + ): AirtableRecord! + + """ + An Airtable base contains all of the information you need for a particular project or collection. Each of the square icons on your homepage is a different base. It's kind of like a workbook in a traditional spreadsheet, and can contain multiple tables of content. + + """ + base( + """ + You can find the baseId from by selecting one of your bases at https://airtable.com/api. The baseId is the part of the path in the URL that starts with `app`. + """ + baseId: String! + ): AirtableBase! +} + +input OneGraphServiceUserIds { + """User id for Box""" + box: String + + """User id for Dev.to""" + devTo: String + + """User id for Dribbble""" + dribbble: String + + """User id for Dropbox""" + dropbox: String + + """User id for Contentful""" + contentful: String + + """User id for Egghead.io""" + eggheadio: String + + """User id for Eventil""" + eventil: String + + """User id for Facebook""" + facebookBusiness: String + + """User id for GitHub""" + gitHub: String + + """User id for Gmail""" + gmail: String + + """User id for Google""" + google: String + + """User id for Google Analytics""" + googleAnalytics: String + + """User id for Google Calendar""" + googleCalendar: String + + """User id for Google Compute""" + googleCompute: String + + """User id for Google Docs""" + googleDocs: String + + """User id for Google Translate""" + googleTranslate: String + + """User id for Hubspot""" + hubspot: String + + """User id for Intercom""" + intercom: String + + """User id for Mailchimp""" + mailchimp: String + + """User id for Meetup""" + meetup: String + + """User id for Netlify""" + netlify: String + + """User id for Product Hunt""" + productHunt: String + + """User id for QuickBooks""" + quickbooks: String + + """User id for Salesforce""" + salesforce: String + + """User id for Slack""" + slack: String + + """User id for Spotify""" + spotify: String + + """User id for Stripe""" + stripe: String + + """User id for Trello""" + trello: String + + """User id for Twilio""" + twilio: String + + """User id for Twitter""" + twitter: String + + """User id for Twitch""" + twitchTv: String + + """User id for YouTube""" + youTube: String + + """User id for Zeit""" + zeit: String + + """User id for Zendesk""" + zendesk: String +} + +input OneGraphZendeskAPITokenAuth { + token: String! + email: String! + subdomain: String! +} + +input OneGraphUSPSAPIAuth { + password: String + userId: String! +} + +input OneGraphUPSAPIAuth { + accessToken: String! + password: String! + username: String! +} + +input OneGraphTwilioAuth { + authToken: String! + accountSid: String! +} + +input OneGraphTrelloTokenAuth { + token: String! + apiKey: String! +} + +""" +Authenticate requests when using the Stripe API on behalf of a connected account using the Stripe-Account header and the connected account’s ID. https://stripe.com/docs/connect/authentication#stripe-account-header +""" +input OneGraphStripeConnectAuthArg { + """Id of the connected account for which the request is being made.""" + connectedStripeAccountId: String! + + """Your platform account’s secret key.""" + platformSecretKey: String! +} + +input OneGraphSalesforceOAuthArg { + instanceUrl: String! + token: String! +} + +input OneGraphLogdnaServiceAuthArg { + """ + Service Key from LogDNA. Retrive a service key from [your profile](https://app.logdna.com/manage/profile) under API Keys > Service Keys. + """ + serviceKey: String! +} + +input OneGraphFedexAPIAuth { + meterNumber: String! + accountNumber: String! + password: String! + key: String! +} + +input OneGraphDevToAuthArg { + """ + For advanced usage: if you have separately implemented the Dev.to OAuth flow and have an OAuth token to make calls on behalf of your user, use it with this `oauthToken` argument + """ + oauthToken: String + + """ + For use with a personal API token, see the [Dev.to authentication](https://docs.dev.to/api/#section/Authentication/api_key) docs on generating a token. Will take priority over the `oauthToken` argument if both are provided. + """ + apiKey: String +} + +input OneGraphCloudflareUserAuthArg { + key: String! + email: String! +} + +input OneGraphServiceAuths { + zendeskAPITokenAuth: OneGraphZendeskAPITokenAuth + zeitOAuthToken: String + youtubeOAuthToken: String + uspsAPIAuth: OneGraphUSPSAPIAuth + upsAPIAuth: OneGraphUPSAPIAuth + twilioAuth: OneGraphTwilioAuth + trelloTokenAuth: OneGraphTrelloTokenAuth + stripeOAuthToken: String + stripeConnectAuth: OneGraphStripeConnectAuthArg + spotifyOAuthToken: String + slackOAuthToken: String + salesforceOAuth: OneGraphSalesforceOAuthArg + productHuntOAuthToken: String + mixpanelApiSecret: String + logdnaServiceAuth: OneGraphLogdnaServiceAuthArg + intercomOAuthToken: String + hubspotOAuthToken: String + googleTranslateOAuthToken: String + googleMapsKey: String + googleDocsOAuthToken: String + googleComputeOAuthToken: String + googleCalendarOAuthToken: String + googleOAuthToken: String + gmailOAuthToken: String + gitHubOAuthToken: String + fedexAPIAuth: OneGraphFedexAPIAuth + facebookOAuthToken: String + dropboxOAuthToken: String + dribbbleOAuthToken: String + devToAuth: OneGraphDevToAuthArg + crunchbaseUserKey: String + cloudflareUserAuth: OneGraphCloudflareUserAuthArg + clearbitAuth: String + brexAuth: String + airtableApiKey: String +} + +"""A OneGraph me Twilio user""" +type TwilioUser { + """The Twilio account's ID""" + id: String! + + """The date the Twilio account was last updated""" + dateUpdated: String! + + """The date the Twilio account was created""" + dateCreated: String! + + """The Twilio account's friendly name""" + friendlyName: String! + + """The Twilio account's URI""" + uri: String! + + """The Twilio account's status""" + status: String! +} + +type NetlifyUserOnboardingProgress { + """""" + slides: String +} + +type NetlifyUser { + """""" + id: String + + """""" + uid: String + + """""" + fullName: String + + """""" + avatarUrl: String + + """""" + email: String + + """""" + affiliateId: String + + """""" + siteCount: Int + + """""" + createdAt: String + + """""" + lastLogin: String + + """""" + loginProviders: [String!] + + """""" + onboardingProgress: NetlifyUserOnboardingProgress + + """""" + supportPriority: Int +} + +"""A Hubspot user""" +type HubspotOAuthUser { + """user""" + user: String + + """scopes""" + scopes: [String] + + """Hub id""" + hubId: Int + + """App id""" + appId: Int + + """User id""" + userId: Int! +} + +"""A OneGraph Me Eventil user""" +type OneGraphMeEventilUser { + """The user's Eventil User ID""" + id: String! + + """The user's Eventil name""" + name: String! +} + +""" +Extended email data for the currently-authenticated user. + +See the [email address endpoint documentation](https://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user) for more details. +""" +type GitHubUserEmail_oneGraph { + email: String! + isPrimary: Boolean! + isVerified: Boolean! +} + +"""Profile type""" +type EventilProfile { + """""" + avatar: String + + """""" + description: String + + """""" + gender: Int + + """""" + github: String + + """""" + hackernews: String + + """""" + id: ID + + """""" + linkedin: String + + """""" + location: String + + """""" + nationality: String + + """""" + reddit: String + + """""" + twitter: String + + """""" + website: String + gitHubUser: GitHubUser + twitterTimeline: TwitterTimeline +} + +"""Group type""" +type EventilGroup { + """""" + admins: [EventilUser!]! + + """""" + avatar: String + + """""" + facebook_id: String + + """""" + id: ID + + """""" + meetup: String + + """""" + name: String + + """""" + twitter: String +} + +"""AgendaSession type""" +type EventilAgendaSession { + """""" + day_number: Int + + """""" + desc: String + + """""" + end_time: String + + """""" + event: EventilEvent + + """""" + id: ID + + """""" + kind: Int + + """""" + name: String + + """""" + presentation: EventilPresentation + + """""" + start_time: String + + """""" + track: String +} + +"""Event type""" +type EventilEvent { + """""" + agenda_sessions: [EventilAgendaSession!]! + + """""" + city: String + + """""" + country: String + + """""" + description: String + + """""" + ended_at: String + + """""" + groups: [EventilGroup!]! + + """""" + header_image: String + + """""" + id: ID + + """""" + lat: Float + + """""" + lng: Float + + """""" + location: String + + """""" + name: String + + """""" + online: Boolean + + """""" + place_name: String + + """""" + presentations: [EventilPresentation!]! + + """""" + started_at: String + + """""" + topics: [EventilTopic!]! + + """""" + twitter: String + + """""" + url: String + + """""" + user: EventilUser +} + +type YoutubeTopicDetails { + """ + Important: This property has been deprecated as of November 10, 2016. The API no longer returns values for this property, and any topics associated with a video are now returned by the topicDetails.relevantTopicIds[] property value. + """ + relevantTopicIds: [String!] + + """ + A list of Wikipedia URLs that provide a high-level description of the video's content. + """ + topicCategories: [String!] +} + +type YoutubePlayer { + """ + An <iframe> tag that embeds a player that plays the video. + If the API request to retrieve the resource specifies a value for the maxHeight and/or maxWidth parameters, the size of the embedded player is scaled to satisfy the maxHeight and/or maxWidth requirements. + If the video's aspect ratio is unknown, the embedded player defaults to a 4:3 format. + """ + embedHtml: String +} + +"""Video licenses available""" +enum YoutubeVideoLicense { + creativeCommon + youtube +} + +"""The uploadStatus of a video""" +enum YoutubeVideoUploadStatuses { + deleted + failed + processed + rejected + uploaded +} + +type YoutubeStatus { + """The status of the uploaded video.""" + uploadStatus: YoutubeVideoUploadStatuses + + """The video's privacy status.""" + privacyStatus: String + + """The video's license.""" + license: YoutubeVideoLicense + + """ + This value indicates whether the video can be embedded on another website. + """ + embeddable: Boolean + + """ + This value indicates whether the extended video statistics on the video's watch page are publicly viewable. By default, those statistics are viewable, and statistics like a video's viewcount and ratings will still be publicly visible even if this property's value is set to false. + """ + publicStatsViewable: Boolean +} + +type YoutubeCommentThreadItemSnippet { + """The display name of the user who posted the comment.""" + authorDisplayName: String + + """ + The URL for the avatar of the user who posted the comment. + + """ + authorProfileImageUrl: String + + """The URL of the comment author's Youtube channel, if available.""" + authorChannelUrl: String + + """ + The ID of the Youtube channel associated with the comment. + If the comment is a video comment, then this property identifies the video's channel, and the snippet.videoId property identifies the video. + If the comment is a channel comment, then this property identifies the channel that the comment is about. + """ + authorChannelId: String + + """The channel of the author""" + authorChannel: YoutubeVideoChannel + + """ + The ID of the video that the comment refers to. This property is only present if the comment was made on a video. + """ + videoId: String + + """ + The comment's text. The text can be retrieved in either plain text or HTML. (The comments.list and commentThreads.list methods both support a textFormat parameter, which specifies the desired text format.) + + Note that even the plain text may differ from the original comment text. For example, it may replace video links with video titles. + + """ + textDisplay: String + + """ + The original, raw text of the comment as it was initially posted or last updated. The original text is only returned if it is accessible to the authenticated user, which is only guaranteed if the user is the comment's author. + """ + textOriginal: String + + """ + This setting indicates whether the current viewer can rate the comment. + + """ + canRate: Boolean + + """ + + The rating the viewer has given to this comment. Note that this property does not currently identify dislike ratings, though this behavior is subject to change. In the meantime, the property value is like if the viewer has rated the comment positively. The value is none in all other cases, including the user having given the comment a negative rating or not having rated the comment. + + Valid values for this property are: + like + none + """ + viewRating: String + + """ + The total number of likes (positive ratings) the comment has received. + + """ + likeCount: Int + + """ + The date and time when the comment was orignally published. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishedAtTs: String + + """ + The date and time when the comment was last updated. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + updatedAtTs: String +} + +type YoutubeCommentThreadItemComment { + """ + Identifies the API resource's type. The valute will be youtube#searchListResponse. + """ + kind: String + + """The Etag of this resource.""" + etag: String + + """The id of this resource.""" + id: String + + """ + The snippet object contains basic details about the comment thread. It also contains the thread's top-level comment, which is a comment resource. + """ + snippet: YoutubeCommentThreadItemSnippet +} + +type YoutubeCommentThreadNodeSnippet { + """ + The ID of the video that the comments refer to, if any. If this property is not present or does not have a value, then the thread applies to the channel and not to a specific video. + """ + videoId: String + + """ + This setting indicates whether the current viewer can reply to the thread. + + """ + canReply: Boolean + + """ + The total number of replies that have been submitted in response to the top-level comment. + """ + totalReplyCount: Int + + """ + This setting indicates whether the thread, including all of its comments and comment replies, is visible to all Youtube users. + """ + isPublic: Boolean + + """ + The thread's top-level comment. The property's value is a comment resource. + """ + topLevelComment: YoutubeCommentThreadItemComment +} + +type YoutubeCommentThreadNode { + """The search node kind""" + kind: String + + """The expiration for this node's information""" + etag: String + + """The comment id""" + id: String + + """ + The snippet object contains basic details about the comment thread. It also contains the thread's top-level comment, which is a comment resource. + """ + snippet: YoutubeCommentThreadNodeSnippet +} + +type YoutubeCommentThreadEdge { + """Information about current page in pagination""" + node: YoutubeCommentThreadNode! +} + +type YoutubePageInfo { + """The total number of results in this list""" + totalResults: Int + + """How many result will be shown per page""" + resultsPerPage: Int + + """Cursor to get the next page of results""" + nextCursor: String + + """Cursor to get the next page of results""" + prevCursor: String +} + +type YoutubeCommentThread { + """Information about current page in pagination""" + pageInfo: YoutubePageInfo! + + """Connection between items and nodes""" + edges: [YoutubeCommentThreadEdge!] +} + +"""The projection of a video""" +enum YoutubeVideoProjection { + _360 + rectangular +} + +"""The definition of a video""" +enum YoutubeVideoDefinition { + hd + sd +} + +""" +The contentDetails object contains information about the video content, including the length of the video and an indication of whether captions are available for the video. +""" +type YoutubeContentDetails { + """ + The length of the video. The property value is an ISO 8601 duration. For example, for a video that is at least one minute long and less than one hour long, the duration is in the format PT#M#S, in which the letters PT indicate that the value specifies a period of time, and the letters M and S refer to length in minutes and seconds, respectively. The # characters preceding the M and S letters are both integers that specify the number of minutes (or seconds) of the video. For example, a value of PT15M33S indicates that the video is 15 minutes and 33 seconds long. + + If the video is at least one hour long, the duration is in the format PT#H#M#S, in which the # preceding the letter H specifies the length of the video in hours and all of the other details are the same as described above. If the video is at least one day long, the letters P and T are separated, and the value's format is P#DT#H#M#S. Please refer to the ISO 8601 specification for complete details. + """ + duration: String + + """Indicates whether the video is available in 3D or in 2D.""" + dimension: String + + """ + Indicates whether the video is available in high definition (HD) or only in standard definition. + """ + definition: YoutubeVideoDefinition + + """Indicates whether captions are available for the video.""" + caption: Boolean + + """ + Indicates whether the video represents licensed content, which means that the content was uploaded to a channel linked to a Youtube content partner and then claimed by that partner. + """ + licensedContent: Boolean + + """Specifies the projection format of the video.""" + projection: YoutubeVideoProjection +} + +"""The statistics object contains statistics about the video.""" +type YoutubeStatistics { + """The number of times the video has been viewed.""" + viewCount: String + + """The number of users who have indicated that they liked the video.""" + likeCount: String + + """The number of users who have indicated that they disliked the video.""" + dislikeCount: String + + """ + Note: This property has been deprecated. The deprecation is effective as of August 28, 2015. The property's value is now always set to 0. + """ + favoriteCount: String + + """The number of comments for the video.""" + commentCount: String +} + +""" +The localizations object contains translations of the video's metadata. +""" +type YoutubeLocalization { + """The localized video title.""" + title: String + + """The localized video description.""" + description: String +} + +"""The role of a user""" +enum YoutubeUserRole { + live + none + upcoming +} + +""" +A videoCategory resource identifies a category that has been or could be associated with uploaded videos. +""" +type YoutubeVideoCategorySnippet { + """The Youtube channelId that created the video category.""" + channelId: String + + """The Youtube channel that created the video category.""" + channel: YoutubeVideoChannel! + + """The video category's title.""" + title: String + + """Indicates whether videos can be associated with the category.""" + assignable: Boolean +} + +type YoutubeVideoCategory { + snippet: YoutubeVideoCategorySnippet +} + +"""The hints object encapsulates additional branding properties.""" +type YoutubeChannelBrandingHint { + """A property.""" + property: String + + """A value.""" + value: String +} + +""" +A channelBanner resource contains the URL that you would use to set a newly uploaded image as the banner image for a channel. +""" +type YoutubeChannelBrandingImage { + """ + The URL for the banner image shown on the channel page on the Youtube website. The image is 1060px by 175px. + """ + bannerImageUrl: String + + """ + The URL for the banner image shown on the channel page in mobile applications. The image is 640px by 175px. + """ + bannerMobileImageUrl: String + + """ + The URL for a low-resolution banner image that displays on the channel page in tablet applications. The image's maximum size is 1138px by 188px. + """ + bannerTabletLowImageUrl: String + + """ + The URL for a banner image that displays on the channel page in tablet applications. The image is 1707px by 283px. + """ + bannerTabletImageUrl: String + + """ + The URL for a high-resolution banner image that displays on the channel page in tablet applications. The image's maximum size is 2276px by 377px. + """ + bannerTabletHdImageUrl: String + + """ + The URL for an extra-high-resolution banner image that displays on the channel page in tablet applications. The image's maximum size is 2560px by 424px. + """ + bannerTabletExtraHdImageUrl: String + + """ + The URL for a low-resolution banner image that displays on the channel page in mobile applications. The image's maximum size is 320px by 88px. + """ + bannerMobileLowImageUrl: String + + """ + The URL for a medium-resolution banner image that displays on the channel page in mobile applications. The image's maximum size is 960px by 263px. + """ + bannerMobileMediumHdImageUrl: String + + """ + The URL for a high-resolution banner image that displays on the channel page in mobile applications. The image's maximum size is 1280px by 360px. + """ + bannerMobileHdImageUrl: String + + """ + The URL for a very high-resolution banner image that displays on the channel page in mobile applications. The image's maximum size is 1440px by 395px. + """ + bannerMobileExtraHdImageUrl: String + + """ + The URL for an extra-high-resolution banner image that displays on the channel page in television applications. The image's maximum size is 2120px by 1192px. + """ + bannerTvImageUrl: String + + """ + The URL for a low-resolution banner image that displays on the channel page in television applications. The image's maximum size is 854px by 480px. + """ + bannerTvLowImageUrl: String + + """ + The URL for a medium-resolution banner image that displays on the channel page in television applications. The image's maximum size is 1280px by 720px. + """ + bannerTvMediumImageUrl: String + + """ + The URL for a high-resolution banner image that displays on the channel page in television applications. The image's maximum size is 1920px by 1080px. + """ + bannerTvHighImageUrl: String +} + +""" +The brandingSettings object encapsulates information about the branding of the channel. +""" +type YoutubeChannelBrandingChannel { + """The channel's title. The title has a maximum length of 30 characters.""" + title: String + + """ + The channel description, which appears in the channel information box on your channel page. The property's value has a maximum length of 1000 characters. + """ + description: String + + """ + Keywords associated with your channel. The value is a space-separated list of strings. + """ + keywords: String + + """Keywords associated with your channel""" + keywordsList: [String!] + + """ + This setting indicates whether Youtube should show an algorithmically generated list of related channels on your channel page. + """ + showRelatedChannels: Boolean + + """ + This setting indicates whether the channel page should display content in a browse or feed view. For example, the browse view might display separate sections for uploaded videos, playlists, and liked videos. The feed view, on the other hand, displays the channel's activity feed. + """ + showBrowseView: Boolean + + """ + The title that displays above the featured channels module. The title has a maximum length of 30 characters. + """ + featuredChannelsTitle: String + + """A prominent color that complements the channel's content.""" + profileColor: String +} + +""" +The brandingSettings object encapsulates information about the branding of the channel. +""" +type YoutubeChannelBrandingSettings { + """ + The channel object encapsulates branding properties of the channel page. + """ + channel: YoutubeChannelBrandingChannel + + """ + The image object encapsulates information about images that display on the channel's channel page or video watch pages. + """ + image: YoutubeChannelBrandingImage + + """The hints object encapsulates additional branding properties.""" + hints: [YoutubeChannelBrandingHint!] +} + +""" +Indicates whether the channel is eligible to upload videos that are more than 15 minutes long. This property is only returned if the channel owner authorized the API request. See the Youtube Help Center for more information about this feature. + allowed – This channel can upload videos that are more than 15 minutes long. +disallowed – This channel is not able or eligible to upload videos that are more than 15 minutes long. A channel is only eligible to upload long videos if it is in good standing based on Youtube Community Guidelines and it does not have any worldwide Content ID blocks on its content. + +After the channel owner resolves the issues that are preventing the channel from uploading longer videos, the channel will revert to either the allowed or eligible state. +eligible – This channel is eligible to upload videos that are more than 15 minutes long. However, the channel owner must first enable the ability to upload longer videos at https://www.youtube.com/verify. See the Youtube Help Center for more detailed information about this feature. +""" +enum YoutubeChannelLongUploadsStatus { + allowed + disallowed + eligible +} + +""" +The status object encapsulates information about the privacy status of the channel. +""" +type YoutubeChannelStatus { + """Privacy status of the channel.""" + privacyStatus: YoutubeVideoPrivacyStatuses + + """ + Indicates whether the channel data identifies a user that is already linked to either a Youtube username or a Google+ account. A user that has one of these links already has a public Youtube identity, which is a prerequisite for several actions, such as uploading videos. + """ + isLinked: Boolean + + """ + Indicates whether the channel is eligible to upload videos that are more than 15 minutes long. This property is only returned if the channel owner authorized the API request. See the Youtube Help Center for more information about this feature. + """ + longUploadsStatus: YoutubeChannelLongUploadsStatus +} + +type YoutubeChannelTopicDetails { + """ + A list of topic IDs associated with the channel. + + This property has been deprecated as of November 10, 2016. It will be supported until November 10, 2017. + + Important: Due to the deprecation of Freebase and the Freebase API, topic IDs started working differently as of February 27, 2017. At that time, Youtube started returning a small set of curated topic IDs. + """ + topicIds: [String!] + + """A list of Wikipedia URLs that describe the channel's content.""" + topicCategories: [String!] +} + +type YoutubeChannelStatistics { + """The number of times the channel has been viewed.""" + viewCount: String + + """The number of comments for the channel.""" + commentCount: String + + """The number of subscribers that the channel has.""" + subscriberCount: String + + """Indicates whether the channel's subscriber count is publicly visible.""" + hiddenSubscriberCount: Boolean + + """The number of videos uploaded to the channel.""" + videoCount: String +} + +"""""" +enum YoutubeVideoPrivacyStatuses { + private + public + unlisted +} + +type YoutubePlaylistStatus { + """The playlist's privacy status.""" + privacyStatus: YoutubeVideoPrivacyStatuses +} + +""" +The contentDetails object contains information about the playlist content, including the number of videos in the playlist. +""" +type YoutubePlaylistContentDetails { + """The number of videos in the playlist.""" + itemCount: Int +} + +type YoutubePlaylistSnippet { + """ + The date and time that the playlist was created. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishedAt: String + + """ + The ID that Youtube uses to uniquely identify the channel that published the playlist. + """ + channelId: String + + """The playlist's title.""" + title: String + + """The playlist's description.""" + description: String + + """ + A map of thumbnail images associated with the playlist. For each object in the map, the key is the name of the thumbnail image, and the value is an object that contains other information about the thumbnail. + """ + thumbnails: YoutubeThumbnails + + """The channel title of the channel that the video belongs to.""" + channelTitle: String + + """ + The language of the text in the playlist resource's snippet.title and snippet.description properties. + """ + defaultLanguage: String +} + +""" +The contentDetails object is included in the resource if the included item is a Youtube video. The object contains additional information about the video. +""" +type YoutubePlaylistItemContentDetails { + """ + The ID that Youtube uses to uniquely identify a video. To retrieve the video resource, set the id query parameter to this value in your API request. + """ + videoId: String + + """ + The date and time that the video was published to Youtube. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + videoPublishedAt: String +} + +type YoutubePlaylistItemSnippetResourceId { + """The kind, or type, of the referred resource.""" + kind: String + + """ + If the snippet.resourceId.kind property's value is youtube#video, then this property will be present and its value will contain the ID that Youtube uses to uniquely identify the video in the playlist. + """ + videoId: String + + """A url to the video""" + videoUrl: String! +} + +"""A thumbnail resource with url and size information""" +type YoutubeThumbnail { + """The image's URL.""" + url: String + + """The image's height.""" + height: Int + + """The image's width.""" + width: Int +} + +""" + A thumbnail resource identifies different thumbnail image sizes associated with a resource. Please note the following characteristics of thumbnail images: + +A thumbnail resource identifies different thumbnail image sizes associated with a resource. Please note the following characteristics of thumbnail images: + +A resource's snippet.thumbnails property is an object that identifies the thumbnail images available for that resource. +A thumbnail resource contains a series of objects. The name of each object (default, medium, high, etc.) refers to the thumbnail image size. +Different types of resources may support different thumbnail image sizes. +Different types of resources may define different sizes for thumbnail images with the same name. For example, the default thumbnail image for a video resource is typically 120px by 90px, and the default thumbnail image for a channel resource is typically 88px by 88px. +Resources of the same type may still have different thumbnail image sizes for certain images depending on the resolution of the original image or content uploaded to Youtube. For example, an HD video may support higher resolution thumbnails than non-HD videos. +Each object that contains information about a thumbnail image size has a width property and a height property. However, the width and height properties may not be returned for that image. +If an uploaded thumbnail image does not match the required dimensions, the image is resized to match the correct size without changing its aspect ratio. The image is not cropped, but may include black bars so that the size is correct. + +""" +type YoutubeThumbnails { + """ + The default thumbnail image. The default thumbnail for a video or a resource that refers to a video, such as a playlist item or search result is 120px wide and 90px tall. The default thumbnail for a channel is 88px wide and 88px tall. + """ + default: YoutubeThumbnail + + """ + A higher resolution version of the thumbnail image. For a video (or a resource that refers to a video), this image is 320px wide and 180px tall. For a channel, this image is 240px wide and 240px tall. + """ + medium: YoutubeThumbnail + + """ + A high resolution version of the thumbnail image. For a video (or a resource that refers to a video), this image is 480px wide and 360px tall. For a channel, this image is 800px wide and 800px tall. + """ + high: YoutubeThumbnail + + """ + An even higher resolution version of the thumbnail image than the high resolution image. This image is available for some videos and other resources that refer to videos, like playlist items or search results. This image is 640px wide and 480px tall. + """ + standard: YoutubeThumbnail + + """ + The highest resolution version of the thumbnail image. This image size is available for some videos and other resources that refer to videos, like playlist items or search results. This image is 1280px wide and 720px tall. + """ + maxres: YoutubeThumbnail +} + +type YoutubePlaylistItemSnippet { + """ + The date and time that the item was added to the playlist. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishedAt: String + + """ + The ID that Youtube uses to uniquely identify the user that added the item to the playlist. + """ + channelId: String + + """The item's title.""" + title: String + + """The item's description.""" + description: String + + """ + A map of thumbnail images associated with the playlist item. For each object in the map, the key is the name of the thumbnail image, and the value is an object that contains other information about the thumbnail. + """ + thumbnails: YoutubeThumbnails + + """The channel title of the channel that the playlist item belongs to.""" + channelTitle: String + + """ + The ID that Youtube uses to uniquely identify the playlist that the playlist item is in. + """ + playlistId: String + + """ + The order in which the item appears in the playlist. The value uses a zero-based index, so the first item has a position of 0, the second item has a position of 1, and so forth. + """ + position: Int + + """ + The id object contains information that can be used to uniquely identify the resource that is included in the playlist as the playlist item. + """ + resourceId: YoutubePlaylistItemSnippetResourceId +} + +type YoutubePlaylistItem { + """ + The snippet object contains basic details about the playlist item, such as its title and position in the playlist. + """ + snippet: YoutubePlaylistItemSnippet + + """The ID that Youtube uses to uniquely identify the playlist item.""" + id: String + + """ + The contentDetails object is included in the resource if the included item is a Youtube video. The object contains additional information about the video. + """ + contentDetails: YoutubePlaylistItemContentDetails +} + +type YoutubePlaylistItemResult { + """A list of playlist items that match the request criteria.""" + items: [YoutubePlaylistItem!] +} + +type YoutubePlaylist { + playlistItems: [YoutubePlaylistItemResult!]! + + """ + The snippet object contains basic details about the playlist, such as its title and description. + """ + snippet: YoutubePlaylistSnippet + + """ + The contentDetails object contains information about the playlist content, including the number of videos in the playlist. + """ + contentDetails: YoutubePlaylistContentDetails + + """The status object contains status information for the playlist.""" + status: YoutubePlaylistStatus +} + +type YoutubeChannelRelatedPlaylists { + """ + The ID of the playlist that contains the channel's favorite videos. Use the playlistItems.insert and playlistItems.delete methods to add or remove items from that list. + + Note that Youtube has deprecated favorite video functionality. For example, the video resource's statistics.favoriteCount property was deprecated on August 28, 2015. As a result, for historical reasons, this property value might contain a playlist ID that refers to an empty playlist and, therefore, cannot be fetched. + """ + favorites: String + + """The ID of the playlist that contains the channel's uploaded videos.""" + uploads: String + + """The playlist that contains the channel's uploaded videos.""" + uploadsList: YoutubePlaylist! + + """ + Note: This property has been deprecated. + + The property's value is always set to HL. The API now returns an empty list in response to requests for playlist details (playlists.list) or playlist items (playlistItems.list) for this playlist. That empty-list behavior is also true for any watchHistory playlist IDs that your API Client may have already stored. + """ + watchHistory: String + + """ + Note: This property has been deprecated. + + The property's value is always set to WL. The API now returns an empty list in response to requests for playlist details (playlists.list) or playlist items (playlistItems.list) for this playlist. That empty-list behavior is also true for any watchLater playlist IDs that your API Client may have already stored. + """ + watchLater: String +} + +type YoutubeChannelContentDetails { + """ + The relatedPlaylists object is a map that identifies playlists associated with the channel, such as the channel's uploaded videos or liked videos. You can retrieve any of these playlists using the playlists.list method. + """ + relatedPlaylists: YoutubeChannelRelatedPlaylists +} + +type YoutubeChannelThumbnail { + """The image's URL.""" + url: String +} + +type YoutubeChannelThumbnails { + """ + The default thumbnail image. The default thumbnail for a video – or a resource that refers to a video, such as a playlist item or search result – is 120px wide and 90px tall. The default thumbnail for a channel is 88px wide and 88px tall. + """ + default: YoutubeChannelThumbnail + + """ + A higher resolution version of the thumbnail image. For a video (or a resource that refers to a video), this image is 320px wide and 180px tall. For a channel, this image is 240px wide and 240px tall. + """ + medium: YoutubeChannelThumbnail + + """ + A high resolution version of the thumbnail image. For a video (or a resource that refers to a video), this image is 480px wide and 360px tall. For a channel, this image is 800px wide and 800px tall. + """ + high: YoutubeChannelThumbnail + + """ + A custom resolution version of the thumbnail, which will be a SIZExSIZE image + """ + custom(size: Int!): YoutubeChannelThumbnail +} + +type YoutubeChannelSnippet { + """The channel's title.""" + title: String + + """ + The channel's description. The property's value has a maximum length of 1000 characters. + """ + description: String + + """ + The channel's custom URL. The [Youtube Help Center](https://support.google.com/youtube/answer/2657968) explains eligibility requirements for getting a custom URL as well as how to set up the URL. + """ + customUrl: String + + """ + The date and time that the channel was created. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishedAtTs: String + + """ + The date and time that the channel was created. The value is specified in milliseconds since the epoch. + """ + publishedAtMs: Int + + """ + A map of thumbnail images associated with the channel. For each object in the map, the key is the name of the thumbnail image, and the value is an object that contains other information about the thumbnail. + """ + thumbnails: YoutubeChannelThumbnails +} + +"""A url list wrapped in a url key""" +type TwitterUrl2 { + """urls list""" + urls: [TwitterUrl!]! +} + +""" +A twitter User-Entity (NB: Different from other Entities in Twitter sub-graph) +""" +type TwitterUserEntities { + """url""" + url: TwitterUrl2 +} + +"""The mailto result of a Descuri call""" +type DescuriMailtoResult { + """The full URI""" + uri: String! + + """The mailto address""" + address: String! +} + +"""The GitHub result of a Descuri call""" +type DescuriGitHubResult { + """The full URI""" + uri: String! + gitHubUser: GitHubUser +} + +"""The result of a Descuri call""" +type DescuriBasicResult { + """The full URI""" + uri: String! +} + +"""Uncategorized Descuri results""" +type DescuriOtherResult { + """A http or https uri""" + uri: String! + descuri: Descuri +} + +"""A Descuri Twitter result""" +type DescuriTwitterResult { + """Any link to twitter found on the URI""" + links: [String!]! + timelines(first: Int): [TwitterTimeline!]! +} + +"""The result of a Descuri call""" +type Descuri { + """Twitter results pulled from URI""" + twitter: DescuriTwitterResult! + + """ + Uncategorized URLs with no further connections. Use with caution--previously uncategorized urls may disappear from this field if they become recognized as a new service. + """ + other(first: Int): [DescuriOtherResult!]! + + """YouTube results from URI""" + youTube: [DescuriBasicResult!]! + + """StackOverflow results from URI""" + stackoverflow: [DescuriBasicResult!]! + + """Discord results from URI""" + discord: [DescuriBasicResult!]! + + """Facebook results from URI""" + facebook: [DescuriBasicResult!]! + + """Hacker News user results from URI""" + hackerNewsUsers: [DescuriBasicResult!]! + + """Hacker News item results from URI""" + hackerNewsItems: [DescuriBasicResult!]! + + """GitHub results pulled from URI""" + gitHub: [DescuriGitHubResult!]! + + """mailto results pulled from URI""" + mailto: [DescuriMailtoResult!]! +} + +"""A twitter user""" +type TwitterUser { + """id""" + id: Int! + + """idStr""" + idStr: String! + + """name""" + name: String! + + """screenName""" + screenName: String! + timeline(first: Int): TwitterTimeline + + """location""" + location: String! + + """description""" + description: String! + + """url""" + url: String + homepageDescuri: Descuri + + """user Entities (NB: Different from twEntities)""" + userEntities: TwitterUserEntities! + + """protected""" + protected: Boolean! + + """followersCount""" + followersCount: Int! + + """friendsCount""" + friendsCount: Int! + + """createdAt""" + createdAt: String! + + """favouritesCount""" + favouritesCount: Int! + + """geoEnabled""" + geoEnabled: Boolean! + + """verified""" + verified: Boolean! + + """statusesCount""" + statusesCount: Int! + + """lang""" + lang: String + + """contributorsEnabled""" + contributorsEnabled: Boolean! + + """isTranslator""" + isTranslator: Boolean! + + """isTranslationEnabled""" + isTranslationEnabled: Boolean! + + """profileBackgroundColor""" + profileBackgroundColor: String! + + """profileBackgroundTile""" + profileBackgroundTile: Boolean! + + """profileLinkColor""" + profileLinkColor: String! + + """profileSidebarBorderColor""" + profileSidebarBorderColor: String! + + """profileSidebarFillColor""" + profileSidebarFillColor: String! + + """profileTextColor""" + profileTextColor: String! + + """profileUseBackgroundImage""" + profileUseBackgroundImage: Boolean! + + """profileBackgroundImageUrl""" + profileBackgroundImageUrl: String + + """profileBackgroundImageUrlHttps""" + profileBackgroundImageUrlHttps: String + + """profileImageUrl""" + profileImageUrl: String + + """profileImageUrlHttps""" + profileImageUrlHttps: String + + """profileBannerUrl""" + profileBannerUrl: String + + """hasExtendedProfile""" + hasExtendedProfile: Boolean! + + """defaultProfile""" + defaultProfile: Boolean! + + """defaultProfileImage""" + defaultProfileImage: Boolean! + + """translatorType""" + translatorType: String! +} + +"""A twitter url""" +type TwitterUrl { + """url""" + url: String + + """expandedUrl""" + expandedUrl: String! + + """displayUrl""" + displayUrl: String! + + """indices""" + indices: [Int!]! +} + +"""A twitter userMention""" +type TwitterUserMention { + timeline(first: Int): TwitterTimeline + + """screenName""" + screenName: String! + + """name""" + name: String! + + """ + id of the Tweet - be careful with this! Although it's an Int, it's too large to fit as a normal number in JS. In JavaScript, use the `idStr` instead. + """ + id: Int! + + """idStr""" + idStr: String! + + """indices""" + indices: [Int!]! +} + +"""A twitter hashtag""" +type TwitterHashtag { + """the text of the hashtag""" + text: String! + + """indices""" + indices: [Int!]! +} + +"""A twitter Entity""" +type TwitterEntities { + """hashtags""" + hashtags: [TwitterHashtag!]! + + """symbols""" + symbols: [String!]! + + """userMentions""" + userMentions: [TwitterUserMention!]! + + """urls""" + urls: [TwitterUrl!]! +} + +"""A tweet""" +type TwitterTweet { + """the text of a tweet""" + text: String! + + """The first youtube video linked from the tweet""" + video: YoutubeVideo + + """createdAt""" + createdAt: String! + + """id""" + id: Int! + + """idStr""" + idStr: String! + + """truncated""" + truncated: Boolean! + + """entities""" + entities: TwitterEntities! + + """source""" + source: String! + + """twUser""" + user: TwitterUser! + + """isQuoteStatus""" + isQuoteStatus: Boolean! + + """retweetCount""" + retweetCount: Int! + + """favoriteCount""" + favoriteCount: Int! + + """favorited""" + favorited: Boolean! + + """retweeted""" + retweeted: Boolean! + + """lang""" + lang: String +} + +"""Tweets on an account's timeline""" +type TwitterTimeline { + """the tweets on a timeline""" + tweets: [TwitterTweet!]! +} + +"""A link from Youtube to twitter""" +type YoutubeTwitterLink { + """Twitter connection""" + twitter(first: Int): TwitterTimeline + + """Twitter link name""" + name: String! +} + +"""A channel resource contains information about a Youtube channel.""" +type YoutubeVideoChannel { + twitterLinks: [YoutubeTwitterLink!]! + + """ + The snippet object contains basic details about the channel, such as its title, description, and thumbnail images. + """ + snippet: YoutubeChannelSnippet + + """ + The contentDetails object encapsulates information about the channel's content. + """ + contentDetails: YoutubeChannelContentDetails + + """The statistics object encapsulates statistics for the channel.""" + statistics: YoutubeChannelStatistics + + """ + The topicDetails object encapsulates information about topics associated with the channel. + + Important: See the topicDetails.topicIds[] property definition and the revision history for more details about changes related to topic IDs. + """ + topicDetails: YoutubeChannelTopicDetails + + """ + The status object encapsulates information about the privacy status of the channel. + """ + status: YoutubeChannelStatus + + """ + The brandingSettings object encapsulates information about the branding of the channel. + """ + brandingSettings: YoutubeChannelBrandingSettings + + """The id of the channel.""" + id: String +} + +""" +The snippet object contains basic details about the video, such as its title, description, and category. +""" +type YoutubeSnippet { + """ + The video's title. The property value has a maximum length of 100 characters and may contain all valid UTF-8 characters except < and >. You must set a value for this property if you call the videos.update method and are updating the snippet part of a video resource. + """ + title: String + + """ + The date and time that the video was published. Note that this time might be different than the time that the video was uploaded. For example, if a video is uploaded as a private video and then made public at a later time, this property will specify the time that the video was made public. + + There are a couple of special cases: + If a video is uploaded as a private video and the video metadata is retrieved by the channel owner, then the property value specifies the date and time that the video was uploaded. + If a video is uploaded as an unlisted video, the property value also specifies the date and time that the video was uploaded. In this case, anyone who knows the video's unique video ID can retrieve the video metadata. + The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format. + """ + publishedAtTs: String + + """ + The video published time in milliseconds since the epoch. See publishedAtTs for notes on the special cases for this field + """ + publishedAtMs: Int + + """ + The ID that Youtube uses to uniquely identify the channel that the video was uploaded to. + """ + channelId: String + + """The channel the video uploaded to""" + uploadChannel: YoutubeVideoChannel! + + """ + The video's description. The property value has a maximum length of 5000 bytes and may contain all valid UTF-8 characters except < and >. + """ + description: String + + """ + A map of thumbnail images associated with the video. For each object in the map, the key is the name of the thumbnail image, and the value is an object that contains other information about the thumbnail. + """ + thumbnails: YoutubeThumbnails + + """Channel title for the channel that the video belongs to.""" + channelTitle: String + + """ + A list of keyword tags associated with the video. Tags may contain spaces. The property value has a maximum length of 500 characters. Note the following rules regarding the way the character limit is calculated: + The property value is a list, and commas between items in the list count toward the limit. + If a tag contains a space, the API server handles the tag value as though it were wrapped in quotation marks, and the quotation marks count toward the character limit. So, for the purposes of character limits, the tag Foo-Baz contains seven characters, but the tag Foo Baz contains nine characters. + """ + tags: [String!] + + """ + The Youtube video category associated with the video. You must set a value for this property if you call the videos.update method and are updating the snippet part of a video resource. + """ + categoryId: String + + """The Youtube video category associated with the video""" + category: YoutubeVideoCategory! + + """ + Indicates if the video is an upcoming/active live broadcast. Or it's "none" if the video is not an upcoming/active live broadcast. + """ + liveBroadcastContent: YoutubeUserRole! + + """ + The snippet.localized object contains either a localized title and description for the video or the title in the default language for the video's metadata. + """ + localized: YoutubeLocalization +} + +""" +A video resource represents a Youtube video, read more at https://developers.google.com/youtube/v3/docs/videos +""" +type YoutubeVideo { + """The ID that Youtube uses to uniquely identify the video.""" + id: String + + """The Etag of this resource.""" + etag: String + + """Identifies the API resource's type. The value will be youtube#video.""" + kind: String + snippet: YoutubeSnippet + statistics: YoutubeStatistics + contentDetails: YoutubeContentDetails + + """Top-level comments on the video""" + commentThreads: YoutubeCommentThread! + status: YoutubeStatus + player: YoutubePlayer + topicDetails: YoutubeTopicDetails +} + +"""Event topics""" +type EventilTopic { + """""" + count: Int + + """""" + name: String +} + +"""Draft type""" +type EventilDraft { + """""" + abstract: String + + """""" + id: ID + + """""" + title: String + + """""" + topics: [EventilTopic!]! + + """""" + user: EventilUser! + + """""" + video_url: String + youtubeVideo: YoutubeVideo +} + +"""Presentation type""" +type EventilPresentation { + """""" + draft: EventilDraft + + """""" + event: EventilEvent + + """""" + id: ID + + """""" + speakers: [EventilUser!]! + + """""" + user: EventilUser +} + +"""User type""" +type EventilUser { + """""" + id: ID + + """""" + name: String + + """""" + presentations: [EventilPresentation!]! + + """""" + profile: EventilProfile! +} + +"""Represents a starred repository.""" +type GitHubStarredRepositoryEdge { + """A cursor for use in pagination.""" + cursor: String! + + """""" + node: GitHubRepository! + + """Identifies when the item was starred.""" + starredAt: String! +} + +"""The connection type for Repository.""" +type GitHubStarredRepositoryConnection { + """A list of edges.""" + edges: [GitHubStarredRepositoryEdge] + + """ + Is the list of stars for this user truncated? This is true for users that have many stars. + """ + isOverLimit: Boolean! + + """A list of nodes.""" + nodes: [GitHubRepository] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubSavedReplyOrderField { + """Order saved reply by when they were updated.""" + UPDATED_AT +} + +"""Ordering options for saved reply connections.""" +input GitHubSavedReplyOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order saved replies by.""" + field: GitHubSavedReplyOrderField! +} + +"""An edge in a connection.""" +type GitHubSavedReplyEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubSavedReply +} + +"""The connection type for SavedReply.""" +type GitHubSavedReplyConnection { + """A list of edges.""" + edges: [GitHubSavedReplyEdge] + + """A list of nodes.""" + nodes: [GitHubSavedReply] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubRepositoryContributionType { + """Created a commit""" + COMMIT + + """Created an issue""" + ISSUE + + """Created a pull request""" + PULL_REQUEST + + """Created the repository""" + REPOSITORY + + """Reviewed a pull request""" + PULL_REQUEST_REVIEW +} + +"""An edge in a connection.""" +type GitHubPublicKeyEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubPublicKey +} + +"""The connection type for PublicKey.""" +type GitHubPublicKeyConnection { + """A list of edges.""" + edges: [GitHubPublicKeyEdge] + + """A list of nodes.""" + nodes: [GitHubPublicKey] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubGistPrivacy { + """Public""" + PUBLIC + + """Secret""" + SECRET + + """Gists that are public and secret""" + ALL +} + +"""The connection type for User.""" +type GitHubFollowingConnection { + """A list of edges.""" + edges: [GitHubUserEdge] + + """A list of nodes.""" + nodes: [GitHubUser] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""The connection type for User.""" +type GitHubFollowerConnection { + """A list of edges.""" + edges: [GitHubUserEdge] + + """A list of nodes.""" + nodes: [GitHubUser] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type GitHubCreatedRepositoryContributionEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubCreatedRepositoryContribution +} + +"""The connection type for CreatedRepositoryContribution.""" +type GitHubCreatedRepositoryContributionConnection { + """A list of edges.""" + edges: [GitHubCreatedRepositoryContributionEdge] + + """A list of nodes.""" + nodes: [GitHubCreatedRepositoryContribution] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +This aggregates pull request reviews made by a user within one repository. +""" +type GitHubPullRequestReviewContributionsByRepository { + """The pull request review contributions.""" + contributions( + """Ordering options for contributions returned from the connection.""" + orderBy: GitHubContributionOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCreatedPullRequestReviewContributionConnection! + + """The repository in which the pull request reviews were made.""" + repository: GitHubRepository! +} + +"""An edge in a connection.""" +type GitHubCreatedPullRequestReviewContributionEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubCreatedPullRequestReviewContribution +} + +"""The connection type for CreatedPullRequestReviewContribution.""" +type GitHubCreatedPullRequestReviewContributionConnection { + """A list of edges.""" + edges: [GitHubCreatedPullRequestReviewContributionEdge] + + """A list of nodes.""" + nodes: [GitHubCreatedPullRequestReviewContribution] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""This aggregates pull requests opened by a user within one repository.""" +type GitHubPullRequestContributionsByRepository { + """The pull request contributions.""" + contributions( + """Ordering options for contributions returned from the connection.""" + orderBy: GitHubContributionOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCreatedPullRequestContributionConnection! + + """The repository in which the pull requests were opened.""" + repository: GitHubRepository! +} + +"""An edge in a connection.""" +type GitHubCreatedPullRequestContributionEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubCreatedPullRequestContribution +} + +"""The connection type for CreatedPullRequestContribution.""" +type GitHubCreatedPullRequestContributionConnection { + """A list of edges.""" + edges: [GitHubCreatedPullRequestContributionEdge] + + """A list of nodes.""" + nodes: [GitHubCreatedPullRequestContribution] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""This aggregates issues opened by a user within one repository.""" +type GitHubIssueContributionsByRepository { + """The issue contributions.""" + contributions( + """Ordering options for contributions returned from the connection.""" + orderBy: GitHubContributionOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCreatedIssueContributionConnection! + + """The repository in which the issues were opened.""" + repository: GitHubRepository! +} + +enum GitHubContributionOrderField { + """Order contributions by when they were made.""" + OCCURRED_AT +} + +"""Ordering options for contribution connections.""" +input GitHubContributionOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """ + The field by which to order contributions. + + **Upcoming Change on 2019-10-01 UTC** + **Description:** `field` will be removed. Only one order field is supported. + **Reason:** `field` will be removed. + + """ + field: GitHubContributionOrderField +} + +"""An edge in a connection.""" +type GitHubCreatedIssueContributionEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubCreatedIssueContribution +} + +"""The connection type for CreatedIssueContribution.""" +type GitHubCreatedIssueContributionConnection { + """A list of edges.""" + edges: [GitHubCreatedIssueContributionEdge] + + """A list of nodes.""" + nodes: [GitHubCreatedIssueContribution] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Represents a single day of contributions on GitHub by a user.""" +type GitHubContributionCalendarDay { + """ + The hex color code that represents how many contributions were made on this day compared to others in the calendar. + """ + color: String! + + """How many contributions were made by the user on this day.""" + contributionCount: Int! + + """The day this square represents.""" + date: String! + + """ + A number representing which day of the week this square represents, e.g., 1 is Monday. + """ + weekday: Int! +} + +"""A week of contributions in a user's contribution graph.""" +type GitHubContributionCalendarWeek { + """The days of contributions in this week.""" + contributionDays: [GitHubContributionCalendarDay!]! + + """The date of the earliest square in this week.""" + firstDay: String! +} + +"""A month of contributions in a user's contribution graph.""" +type GitHubContributionCalendarMonth { + """The date of the first day of this month.""" + firstDay: String! + + """The name of the month.""" + name: String! + + """How many weeks started in this month.""" + totalWeeks: Int! + + """The year the month occurred in.""" + year: Int! +} + +"""A calendar of contributions made on GitHub by a user.""" +type GitHubContributionCalendar { + """ + A list of hex color codes used in this calendar. The darker the color, the more contributions it represents. + """ + colors: [String!]! + + """ + Determine if the color set was chosen because it's currently Halloween. + """ + isHalloween: Boolean! + + """A list of the months of contributions in this calendar.""" + months: [GitHubContributionCalendarMonth!]! + + """The count of total contributions in the calendar.""" + totalContributions: Int! + + """A list of the weeks of contributions in this calendar.""" + weeks: [GitHubContributionCalendarWeek!]! +} + +enum GitHubCommitContributionOrderField { + """Order commit contributions by when they were made.""" + OCCURRED_AT + + """Order commit contributions by how many commits they represent.""" + COMMIT_COUNT +} + +"""Ordering options for commit contribution connections.""" +input GitHubCommitContributionOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field by which to order commit contributions.""" + field: GitHubCommitContributionOrderField! +} + +""" +Represents the contribution a user made by leaving a review on a pull request. +""" +type GitHubCreatedPullRequestReviewContribution implements GitHubContribution { + """ + Whether this contribution is associated with a record you do not have access to. For + example, your own 'first issue' contribution may have been made on a repository you can no + longer access. + + """ + isRestricted: Boolean! + + """When this contribution was made.""" + occurredAt: String! + + """The pull request the user reviewed.""" + pullRequest: GitHubPullRequest! + + """The review the user left on the pull request.""" + pullRequestReview: GitHubPullRequestReview! + + """The repository containing the pull request that the user reviewed.""" + repository: GitHubRepository! + + """The HTTP path for this contribution.""" + resourcePath: String! + + """The HTTP URL for this contribution.""" + url: String! + + """ + The user who made this contribution. + + """ + user: GitHubUser! +} + +"""Represents a user signing up for a GitHub account.""" +type GitHubJoinedGitHubContribution implements GitHubContribution { + """ + Whether this contribution is associated with a record you do not have access to. For + example, your own 'first issue' contribution may have been made on a repository you can no + longer access. + + """ + isRestricted: Boolean! + + """When this contribution was made.""" + occurredAt: String! + + """The HTTP path for this contribution.""" + resourcePath: String! + + """The HTTP URL for this contribution.""" + url: String! + + """ + The user who made this contribution. + + """ + user: GitHubUser! +} + +"""Represents the contribution a user made on GitHub by opening an issue.""" +type GitHubCreatedIssueContribution implements GitHubContribution { + """ + Whether this contribution is associated with a record you do not have access to. For + example, your own 'first issue' contribution may have been made on a repository you can no + longer access. + + """ + isRestricted: Boolean! + + """The issue that was opened.""" + issue: GitHubIssue! + + """When this contribution was made.""" + occurredAt: String! + + """The HTTP path for this contribution.""" + resourcePath: String! + + """The HTTP URL for this contribution.""" + url: String! + + """ + The user who made this contribution. + + """ + user: GitHubUser! +} + +""" +Represents either a issue the viewer can access or a restricted contribution. +""" +union GitHubCreatedIssueOrRestrictedContribution = GitHubRestrictedContribution | GitHubCreatedIssueContribution + +""" +Represents the contribution a user made on GitHub by opening a pull request. +""" +type GitHubCreatedPullRequestContribution implements GitHubContribution { + """ + Whether this contribution is associated with a record you do not have access to. For + example, your own 'first issue' contribution may have been made on a repository you can no + longer access. + + """ + isRestricted: Boolean! + + """When this contribution was made.""" + occurredAt: String! + + """The pull request that was opened.""" + pullRequest: GitHubPullRequest! + + """The HTTP path for this contribution.""" + resourcePath: String! + + """The HTTP URL for this contribution.""" + url: String! + + """ + The user who made this contribution. + + """ + user: GitHubUser! +} + +""" +Represents either a pull request the viewer can access or a restricted contribution. +""" +union GitHubCreatedPullRequestOrRestrictedContribution = GitHubRestrictedContribution | GitHubCreatedPullRequestContribution + +""" +Represents the contribution a user made on GitHub by creating a repository. +""" +type GitHubCreatedRepositoryContribution implements GitHubContribution { + """ + Whether this contribution is associated with a record you do not have access to. For + example, your own 'first issue' contribution may have been made on a repository you can no + longer access. + + """ + isRestricted: Boolean! + + """When this contribution was made.""" + occurredAt: String! + + """The repository that was created.""" + repository: GitHubRepository! + + """The HTTP path for this contribution.""" + resourcePath: String! + + """The HTTP URL for this contribution.""" + url: String! + + """ + The user who made this contribution. + + """ + user: GitHubUser! +} + +""" +Represents either a repository the viewer can access or a restricted contribution. +""" +union GitHubCreatedRepositoryOrRestrictedContribution = GitHubRestrictedContribution | GitHubCreatedRepositoryContribution + +"""Represents a private contribution a user made on GitHub.""" +type GitHubRestrictedContribution implements GitHubContribution { + """ + Whether this contribution is associated with a record you do not have access to. For + example, your own 'first issue' contribution may have been made on a repository you can no + longer access. + + """ + isRestricted: Boolean! + + """When this contribution was made.""" + occurredAt: String! + + """The HTTP path for this contribution.""" + resourcePath: String! + + """The HTTP URL for this contribution.""" + url: String! + + """ + The user who made this contribution. + + """ + user: GitHubUser! +} + +""" +Represents a contribution a user made on GitHub, such as opening an issue. +""" +interface GitHubContribution { + """ + Whether this contribution is associated with a record you do not have access to. For + example, your own 'first issue' contribution may have been made on a repository you can no + longer access. + + """ + isRestricted: Boolean! + + """When this contribution was made.""" + occurredAt: String! + + """The HTTP path for this contribution.""" + resourcePath: String! + + """The HTTP URL for this contribution.""" + url: String! + + """ + The user who made this contribution. + + """ + user: GitHubUser! +} + +"""Represents the contribution a user made by committing to a repository.""" +type GitHubCreatedCommitContribution implements GitHubContribution { + """How many commits were made on this day to this repository by the user.""" + commitCount: Int! + + """ + Whether this contribution is associated with a record you do not have access to. For + example, your own 'first issue' contribution may have been made on a repository you can no + longer access. + + """ + isRestricted: Boolean! + + """When this contribution was made.""" + occurredAt: String! + + """The repository the user made a commit in.""" + repository: GitHubRepository! + + """The HTTP path for this contribution.""" + resourcePath: String! + + """The HTTP URL for this contribution.""" + url: String! + + """ + The user who made this contribution. + + """ + user: GitHubUser! +} + +"""An edge in a connection.""" +type GitHubCreatedCommitContributionEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubCreatedCommitContribution +} + +"""The connection type for CreatedCommitContribution.""" +type GitHubCreatedCommitContributionConnection { + """A list of edges.""" + edges: [GitHubCreatedCommitContributionEdge] + + """A list of nodes.""" + nodes: [GitHubCreatedCommitContribution] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """ + Identifies the total count of commits across days and repositories in the connection. + + """ + totalCount: Int! +} + +"""This aggregates commits made by a user within one repository.""" +type GitHubCommitContributionsByRepository { + """The commit contributions, each representing a day.""" + contributions( + """ + Ordering options for commit contributions returned from the connection. + """ + orderBy: GitHubCommitContributionOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCreatedCommitContributionConnection! + + """The repository in which the commits were made.""" + repository: GitHubRepository! + + """ + The HTTP path for the user's commits to the repository in this time range. + """ + resourcePath: String! + + """ + The HTTP URL for the user's commits to the repository in this time range. + """ + url: String! +} + +""" +A contributions collection aggregates contributions such as opened issues and commits created by a user. +""" +type GitHubContributionsCollection { + """Commit contributions made by the user, grouped by repository.""" + commitContributionsByRepository( + """How many repositories should be included.""" + maxRepositories: Int + ): [GitHubCommitContributionsByRepository!]! + + """A calendar of this user's contributions on GitHub.""" + contributionCalendar: GitHubContributionCalendar! + + """ + The years the user has been making contributions with the most recent year first. + """ + contributionYears: [Int!]! + + """ + Determine if this collection's time span ends in the current month. + + """ + doesEndInCurrentMonth: Boolean! + + """ + The date of the first restricted contribution the user made in this time period. Can only be non-null when the user has enabled private contribution counts. + """ + earliestRestrictedContributionDate: String + + """The ending date and time of this collection.""" + endedAt: String! + + """ + The first issue the user opened on GitHub. This will be null if that issue was opened outside the collection's time range and ignoreTimeRange is false. If the issue is not visible but the user has opted to show private contributions, a RestrictedContribution will be returned. + """ + firstIssueContribution: GitHubCreatedIssueOrRestrictedContribution + + """ + The first pull request the user opened on GitHub. This will be null if that pull request was opened outside the collection's time range and ignoreTimeRange is not true. If the pull request is not visible but the user has opted to show private contributions, a RestrictedContribution will be returned. + """ + firstPullRequestContribution: GitHubCreatedPullRequestOrRestrictedContribution + + """ + The first repository the user created on GitHub. This will be null if that first repository was created outside the collection's time range and ignoreTimeRange is false. If the repository is not visible, then a RestrictedContribution is returned. + """ + firstRepositoryContribution: GitHubCreatedRepositoryOrRestrictedContribution + + """ + Does the user have any more activity in the timeline that occurred prior to the collection's time range? + """ + hasActivityInThePast: Boolean! + + """Determine if there are any contributions in this collection.""" + hasAnyContributions: Boolean! + + """ + Determine if the user made any contributions in this time frame whose details are not visible because they were made in a private repository. Can only be true if the user enabled private contribution counts. + """ + hasAnyRestrictedContributions: Boolean! + + """Whether or not the collector's time span is all within the same day.""" + isSingleDay: Boolean! + + """A list of issues the user opened.""" + issueContributions( + """Ordering options for contributions returned from the connection.""" + orderBy: GitHubContributionOrder + + """Should the user's most commented issue be excluded from the result.""" + excludePopular: Boolean + + """Should the user's first issue ever be excluded from the result.""" + excludeFirst: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCreatedIssueContributionConnection! + + """Issue contributions made by the user, grouped by repository.""" + issueContributionsByRepository( + """Should the user's most commented issue be excluded from the result.""" + excludePopular: Boolean + + """Should the user's first issue ever be excluded from the result.""" + excludeFirst: Boolean + + """How many repositories should be included.""" + maxRepositories: Int + ): [GitHubIssueContributionsByRepository!]! + + """ + When the user signed up for GitHub. This will be null if that sign up date falls outside the collection's time range and ignoreTimeRange is false. + """ + joinedGitHubContribution: GitHubJoinedGitHubContribution + + """ + The date of the most recent restricted contribution the user made in this time period. Can only be non-null when the user has enabled private contribution counts. + """ + latestRestrictedContributionDate: String + + """ + When this collection's time range does not include any activity from the user, use this + to get a different collection from an earlier time range that does have activity. + + """ + mostRecentCollectionWithActivity: GitHubContributionsCollection + + """ + Returns a different contributions collection from an earlier time range than this one + that does not have any contributions. + + """ + mostRecentCollectionWithoutActivity: GitHubContributionsCollection + + """ + The issue the user opened on GitHub that received the most comments in the specified + time frame. + + """ + popularIssueContribution: GitHubCreatedIssueContribution + + """ + The pull request the user opened on GitHub that received the most comments in the + specified time frame. + + """ + popularPullRequestContribution: GitHubCreatedPullRequestContribution + + """Pull request contributions made by the user.""" + pullRequestContributions( + """Ordering options for contributions returned from the connection.""" + orderBy: GitHubContributionOrder + + """ + Should the user's most commented pull request be excluded from the result. + """ + excludePopular: Boolean + + """Should the user's first pull request ever be excluded from the result.""" + excludeFirst: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCreatedPullRequestContributionConnection! + + """Pull request contributions made by the user, grouped by repository.""" + pullRequestContributionsByRepository( + """ + Should the user's most commented pull request be excluded from the result. + """ + excludePopular: Boolean + + """Should the user's first pull request ever be excluded from the result.""" + excludeFirst: Boolean + + """How many repositories should be included.""" + maxRepositories: Int + ): [GitHubPullRequestContributionsByRepository!]! + + """Pull request review contributions made by the user.""" + pullRequestReviewContributions( + """Ordering options for contributions returned from the connection.""" + orderBy: GitHubContributionOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCreatedPullRequestReviewContributionConnection! + + """ + Pull request review contributions made by the user, grouped by repository. + """ + pullRequestReviewContributionsByRepository( + """How many repositories should be included.""" + maxRepositories: Int + ): [GitHubPullRequestReviewContributionsByRepository!]! + + """ + A list of repositories owned by the user that the user created in this time range. + """ + repositoryContributions( + """Ordering options for contributions returned from the connection.""" + orderBy: GitHubContributionOrder + + """Should the user's first repository ever be excluded from the result.""" + excludeFirst: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCreatedRepositoryContributionConnection! + + """ + A count of contributions made by the user that the viewer cannot access. Only non-zero when the user has chosen to share their private contribution counts. + """ + restrictedContributionsCount: Int! + + """The beginning date and time of this collection.""" + startedAt: String! + + """How many commits were made by the user in this time span.""" + totalCommitContributions: Int! + + """How many issues the user opened.""" + totalIssueContributions( + """Should the user's most commented issue be excluded from this count.""" + excludePopular: Boolean + + """Should the user's first issue ever be excluded from this count.""" + excludeFirst: Boolean + ): Int! + + """How many pull requests the user opened.""" + totalPullRequestContributions( + """ + Should the user's most commented pull request be excluded from this count. + """ + excludePopular: Boolean + + """Should the user's first pull request ever be excluded from this count.""" + excludeFirst: Boolean + ): Int! + + """How many pull request reviews the user left.""" + totalPullRequestReviewContributions: Int! + + """How many different repositories the user committed to.""" + totalRepositoriesWithContributedCommits: Int! + + """How many different repositories the user opened issues in.""" + totalRepositoriesWithContributedIssues( + """Should the user's most commented issue be excluded from this count.""" + excludePopular: Boolean + + """Should the user's first issue ever be excluded from this count.""" + excludeFirst: Boolean + ): Int! + + """How many different repositories the user left pull request reviews in.""" + totalRepositoriesWithContributedPullRequestReviews: Int! + + """How many different repositories the user opened pull requests in.""" + totalRepositoriesWithContributedPullRequests( + """ + Should the user's most commented pull request be excluded from this count. + """ + excludePopular: Boolean + + """Should the user's first pull request ever be excluded from this count.""" + excludeFirst: Boolean + ): Int! + + """How many repositories the user created.""" + totalRepositoryContributions( + """Should the user's first repository ever be excluded from this count.""" + excludeFirst: Boolean + ): Int! + + """The user who made the contributions in this collection.""" + user: GitHubUser! +} + +"""Represents any entity on GitHub that has a profile page.""" +interface GitHubProfileOwner { + """ + Determine if this repository owner has any items that can be pinned to their profile. + """ + anyPinnableItems( + """Filter to only a particular kind of pinnable item.""" + type: GitHubPinnableItemType + ): Boolean! + + """The public profile email.""" + email: String + + """""" + id: ID! + + """ + Showcases a selection of repositories and gists that the profile owner has either curated or that have been selected automatically based on popularity. + """ + itemShowcase: GitHubProfileItemShowcase! + + """The public profile location.""" + location: String + + """The username used to login.""" + login: String! + + """The public profile name.""" + name: String + + """ + A list of repositories and gists this profile owner can pin to their profile. + """ + pinnableItems( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filter the types of pinnable items that are returned.""" + types: [GitHubPinnableItemType!] + ): GitHubPinnableItemConnection! + + """ + A list of repositories and gists this profile owner has pinned to their profile + """ + pinnedItems( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filter the types of pinned items that are returned.""" + types: [GitHubPinnableItemType!] + ): GitHubPinnableItemConnection! + + """ + Returns how many more items this profile owner can pin to their profile. + """ + pinnedItemsRemaining: Int! + + """Can the viewer pin repositories and gists to the profile?""" + viewerCanChangePinnedItems: Boolean! + + """The public profile website URL.""" + websiteUrl: String +} + +enum GitHubTeamRole { + """User has admin rights on the team.""" + ADMIN + + """User is a member of the team.""" + MEMBER +} + +enum GitHubOrganizationMemberRole { + """The user is a member of the organization.""" + MEMBER + + """The user is an administrator of the organization.""" + ADMIN +} + +"""Represents a user within an organization.""" +type GitHubOrganizationMemberEdge { + """A cursor for use in pagination.""" + cursor: String! + + """ + Whether the organization member has two factor enabled or not. Returns null if information is not available to viewer. + """ + hasTwoFactorEnabled: Boolean + + """The item at the end of the edge.""" + node: GitHubUser + + """The role this user has in the organization.""" + role: GitHubOrganizationMemberRole +} + +"""The connection type for User.""" +type GitHubOrganizationMemberConnection { + """A list of edges.""" + edges: [GitHubOrganizationMemberEdge] + + """A list of nodes.""" + nodes: [GitHubUser] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type GitHubPinnableItemEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubPinnableItem +} + +"""The connection type for PinnableItem.""" +type GitHubPinnableItemConnection { + """A list of edges.""" + edges: [GitHubPinnableItemEdge] + + """A list of nodes.""" + nodes: [GitHubPinnableItem] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +A curatable list of repositories relating to a repository owner, which defaults to showing the most popular repositories they own. +""" +type GitHubProfileItemShowcase { + """Whether or not the owner has pinned any repositories or gists.""" + hasPinnedItems: Boolean! + + """ + The repositories and gists in the showcase. If the profile owner has any pinned items, those will be returned. Otherwise, the profile owner's popular repositories will be returned. + """ + items( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubPinnableItemConnection! +} + +enum GitHubAuditLogOrderField { + """Order audit log entries by timestamp""" + CREATED_AT +} + +"""Ordering options for Audit Log connections.""" +input GitHubAuditLogOrder { + """The ordering direction.""" + direction: GitHubOrderDirection + + """The field to order Audit Logs by.""" + field: GitHubAuditLogOrderField +} + +"""""" +type BrexMerchantCategoryEdge { + """""" + cursor: String + + """""" + node: BrexMerchantCategory +} + +"""""" +type BrexMerchantCategoryConnection { + """""" + edges: [BrexMerchantCategoryEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexUserCategoryEdge { + """""" + cursor: String + + """""" + node: BrexUserCategory +} + +"""""" +type BrexUserCategoryConnection { + """""" + edges: [BrexUserCategoryEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexExpensifySetupInstructions { + """""" + copilotEmail: String +} + +"""""" +union BrexSetupInstructions = BrexExpensifySetupInstructions + +"""""" +type BrexNetsuiteSubsidiary { + """""" + name: String! + + """""" + vendorInternalId: String! +} + +enum BrexBatchEntity { + DEPARTMENT + LOCATION + USER +} + +enum BrexBatchCadence { + DAILY + MONTHLY + SINGLE_ENTRY + WEEKLY +} + +"""""" +type BrexBatchSettings { + """""" + cadence: BrexBatchCadence + + """""" + entity: BrexBatchEntity +} + +"""""" +type BrexIntegrationSettings { + """""" + batchSettings: BrexBatchSettings + + """""" + netsuiteSubsidiary: BrexNetsuiteSubsidiary + + """""" + syncDateRangeEnd: String + + """""" + syncDateRangeStart: String + + """""" + syncFrom: String +} + +enum BrexIntegrationScope { + COLLECTIONS + EXPENSES + REWARDS_REDEMPTIONS +} + +"""""" +type BrexIntegrationUserEdge { + """""" + cursor: String + + """""" + node: BrexIntegrationUser +} + +"""""" +type BrexIntegrationUserConnection { + """""" + edges: [BrexIntegrationUserEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexIntegrationRuleEdge { + """""" + cursor: String + + """""" + node: BrexIntegrationRule +} + +"""""" +type BrexIntegrationRuleConnection { + """""" + edges: [BrexIntegrationRuleEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexExternalIntegrationEntityEdge { + """""" + cursor: String + + """""" + node: BrexExternalIntegrationEntity +} + +"""""" +type BrexExternalIntegrationEntityConnection { + """""" + edges: [BrexExternalIntegrationEntityEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexExportEdge { + """""" + cursor: String + + """""" + node: BrexExport +} + +"""""" +type BrexExportConnection { + """""" + edges: [BrexExportEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexExport implements OneGraphNode & BrexNode { + """""" + errorMessage: String + + """The ID of an object""" + id: ID! + + """""" + insertedAt: String! + + """""" + status: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexFedachParticipant implements OneGraphNode & BrexNode { + """""" + changeDate: String! + + """""" + customerAddress: String! + + """""" + customerAreaCode: String! + + """""" + customerCity: String! + + """""" + customerName: String! + + """""" + customerPhonePrefix: String! + + """""" + customerPhoneSuffix: String! + + """""" + customerState: String! + + """""" + customerZip: String! + + """""" + customerZipExt: String! + + """""" + dataViewCode: String! + + """The ID of an object""" + id: ID! + + """""" + institutionStatusCode: String! + + """""" + newRoutingNumber: String! + + """""" + officeCode: String! + + """""" + recordTypeCode: String! + + """""" + routingNumber: String! + + """""" + servicingFrbNumber: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexFedwireParticipant implements OneGraphNode & BrexNode { + """""" + changeDate: String + + """""" + customerCity: String! + + """""" + customerName: String! + + """""" + customerState: String! + + """""" + fundsEligibility: String! + + """""" + fundsSettlementOnlyStatus: String + + """The ID of an object""" + id: ID! + + """""" + routingNumber: String! + + """""" + securitiesEligibility: String! + + """""" + telegraphicName: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexIntegrationErrorDetails implements OneGraphNode & BrexNode { + """""" + count: Int! + + """""" + errorSubtype: String + + """""" + errorType: String! + + """The ID of an object""" + id: ID! + + """""" + maxPostedAt: String! + + """""" + minPostedAt: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum BrexIntegrationRulesFilterFacetType { + CONFLICTING + CUSTOM + MERCHANT + OVERRIDE +} + +"""""" +type BrexIntegrationRulesFilterFacet implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + rules: [BrexIntegrationRule] + + """""" + type: BrexIntegrationRulesFilterFacetType + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexIntegrationUser implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + user: BrexUser + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum BrexMilesTransferStatus { + FAILED + PROCESSING + SUCCEEDED + UNKNOWN +} + +enum BrexMilesTransferFailureReason { + """A generic error occurred during miles transaction""" + GENERIC_ERROR + + """Membership is invalid""" + INVALID_MEMBER_INFORMATION_ID + + """Membership account is ineligible""" + MEMBER_ACCOUNT_INELEGIBLE + + """Membership name does not match""" + MEMBER_NAME_NOT_MATCHING +} + +"""""" +type BrexMilesTransfer implements OneGraphNode & BrexNode { + """""" + failureReasons: [BrexMilesTransferFailureReason] + + """The ID of an object""" + id: ID! + + """""" + initiatedByUser: BrexUser + + """""" + insertedAt: String + + """""" + loyaltyProgram: BrexLoyaltyProgram + + """""" + milesAmount: Int + + """""" + pointsAmount: Int + + """""" + programMembership: BrexProgramMembership + + """""" + referenceId: String! + + """""" + status: BrexMilesTransferStatus + + """""" + toUser: BrexUser + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum BrexOnboardingInformationRequestType { + EXTRA + INITIAL +} + +enum BrexOnboardingInformationRequestStatus { + COMPLETE + IN_PROGRESS + NEW +} + +"""""" +type BrexOnboardingPageDSuitability { + """""" + _: Boolean + + """""" + content: BrexOnboardingFormEmpty! +} + +"""""" +type BrexOnboardingPageDTerms { + """""" + _: Boolean + + """""" + content: BrexOnboardingFormEmpty! +} + +"""""" +type BrexOnboardingPageEmailVerification { + """""" + _: Boolean + + """""" + content: BrexOnboardingFormBlocking! +} + +"""""" +type BrexOnboardingPageForm { + """""" + _: Boolean + + """""" + content: BrexOnboardingFormJsonSchema! +} + +"""""" +type BrexOnboardingPageFundingSource { + """""" + _: Boolean + + """""" + content: BrexOnboardingFormEmpty! +} + +"""""" +type BrexOnboardingPageMfa { + """""" + _: Boolean + + """""" + content: BrexOnboardingFormEmpty! +} + +"""""" +type BrexOnboardingPagePersona { + """""" + _: Boolean + + """""" + content: BrexOnboardingFormPersona! +} + +"""""" +type BrexOnboardingPageUwBankConnection { + """""" + canSkipStatements: Boolean! + + """""" + content: BrexOnboardingFormUwBankConnection! + + """""" + shouldPromptStatements: Boolean! +} + +"""""" +type BrexOnboardingPageUwEcommerceConnection { + """""" + _: Boolean + + """""" + content: BrexOnboardingFormUwEcommerceConnection! +} + +"""""" +union BrexOnboardingSubmittablePage = BrexOnboardingPageUwEcommerceConnection | BrexOnboardingPageUwBankConnection | BrexOnboardingPagePersona | BrexOnboardingPageMfa | BrexOnboardingPageFundingSource | BrexOnboardingPageForm | BrexOnboardingPageEmailVerification | BrexOnboardingPageDTerms | BrexOnboardingPageDSuitability + +"""""" +type BrexOnboardingFormBlocking { + """""" + _: Boolean +} + +"""""" +type BrexOnboardingFormEmpty { + """""" + _: Boolean +} + +"""""" +type BrexOnboardingFormPersona { + """""" + templateId: String +} + +"""""" +type BrexOnboardingFormUwBankConnection { + """""" + _: Boolean +} + +"""""" +type BrexOnboardingFormUwEcommerceConnection { + """""" + _: Boolean +} + +"""""" +union BrexOnboardingInformationRequestContent = BrexOnboardingFormUwEcommerceConnection | BrexOnboardingFormUwBankConnection | BrexOnboardingFormPersona | BrexOnboardingFormJsonSchema | BrexOnboardingFormEmpty | BrexOnboardingFormBlocking + +"""""" +type BrexOnboardingFormJsonSchema { + """""" + jsonSchema: String! + + """""" + uiSchema: String +} + +"""""" +type BrexOnboardingPagePhotoIdIntro { + """""" + _: Boolean + + """""" + content: BrexOnboardingFormJsonSchema! +} + +"""""" +union BrexOnboardingNonSubmittablePage = BrexOnboardingPagePhotoIdIntro + +enum BrexOnboardingApplicationStatus { + """Application approved""" + APPROVED + + """Error""" + ERROR + + """User needs to submit evidence requests (before application submission)""" + IN_PROGRESS + + """User needs to submit evidence requests (after application submission)""" + PENDING_EVIDENCE + + """Application needs to be manually reviewed""" + PENDING_REVIEW + + """ + New application or all evidence requests were submitted but application has not been submitted yet + """ + PROCESSING + + """Same as processing. Will be deprecated.""" + PROCESSING_EVIDENCES + + """Application rejected""" + REJECTED + + """Application submitted by user""" + SUBMITTED +} + +"""""" +type BrexOnboardingInformationRequestEdge { + """""" + cursor: String + + """""" + node: BrexOnboardingInformationRequest +} + +"""""" +type BrexOnboardingInformationRequestConnection { + """""" + edges: [BrexOnboardingInformationRequestEdge] + + """""" + pageInfo: BrexPageInfo! +} + +enum BrexOnboardingBlueprintType { + """Applications to change the user's cash role""" + CHANGE_ROLE + + """Cash upsell applications""" + DEPOSITS + + """Net-new product applications""" + PRODUCT_V1 + + """Onboarding flows to set up a user's account""" + USER_SETUP +} + +"""""" +type BrexOnboardingBlueprint implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """The specific implementation of the blueprint type""" + name: String! + + """ + Determines which application handler will be used to process the application + """ + type: BrexOnboardingBlueprintType! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexOnboardingApplication implements OneGraphNode & BrexNode { + """The blueprint that this application will follow""" + blueprint: BrexOnboardingBlueprint! + + """The application creator""" + createdByUser: BrexUser! + + """The ID of an object""" + id: ID! + + """Information requests to be completed by the applicant""" + informationRequests(last: Int, first: Int, before: String, after: String): BrexOnboardingInformationRequestConnection + + """The total number of information requests""" + informationRequestsCount: Int! + + """The status of the application""" + status: BrexOnboardingApplicationStatus! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexOnboardingInformationRequest implements OneGraphNode & BrexNode { + """""" + application: BrexOnboardingApplication! + + """""" + beforePages: [BrexOnboardingNonSubmittablePage!]! + + """""" + content: BrexOnboardingInformationRequestContent! @deprecated(reason: "Use contentPage.content instead") + + """""" + contentPage: BrexOnboardingSubmittablePage! + + """""" + data: String + + """The ID of an object""" + id: ID! + + """""" + status: BrexOnboardingInformationRequestStatus! + + """""" + type: BrexOnboardingInformationRequestType! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum BrexProductApplicationStatus { + APPROVED + IN_PROGRESS + NEW + PENDING_EVIDENCE + PENDING_REVIEW + REJECTED + SUBMITTED +} + +"""""" +type BrexProductApplicationInformationRequest { + """""" + form: String + + """""" + id: String +} + +"""""" +type BrexProductApplication implements OneGraphNode & BrexNode { + """""" + account: BrexAccount + + """The ID of an object""" + id: ID! + + """""" + informationRequests: [BrexProductApplicationInformationRequest] + + """""" + payload: String + + """""" + status: BrexProductApplicationStatus + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum BrexReferralStatus { + COMPLETED + INVITE_SENT + PENDING_INVITE + SIGNED_UP +} + +enum BrexReferralRewardType { + GIFT_CARD + POINTS + WAIVED_CARD_FEES +} + +"""""" +type BrexReferralReward { + """""" + amount: Int! + + """""" + type: BrexReferralRewardType! +} + +"""""" +type BrexReferral implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + referredEmail: String! + + """""" + referredReward: BrexReferralReward! + + """""" + referrerReward: BrexReferralReward! + + """""" + status: BrexReferralStatus! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexRewardsTriggerEdge { + """""" + cursor: String + + """""" + node: BrexRewardsTrigger +} + +"""""" +type BrexRewardsTriggerConnection { + """""" + edges: [BrexRewardsTriggerEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexRewardsCampaign implements OneGraphNode & BrexNode { + """""" + description: String! + + """The ID of an object""" + id: ID! + + """""" + name: String! + + """""" + rewardsTriggers(last: Int, first: Int, before: String, after: String): BrexRewardsTriggerConnection + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexRoleRulePredicate { + """""" + customerAccountId: String + + """""" + customerUserId: String +} + +"""""" +type BrexRoleRule { + """""" + actions: [String] + + """""" + predicates: [BrexRoleRulePredicate] + + """""" + resources: [String] +} + +"""""" +type BrexRole implements OneGraphNode & BrexNode { + """""" + description: String + + """The ID of an object""" + id: ID! + + """""" + name: String! + + """""" + rules: [BrexRoleRule] + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexBiweeklyClosingStrategy { + """""" + dayOfWeek: Int +} + +"""""" +type BrexEveryNDaysClosingStrategy { + """""" + numDays: Int +} + +"""""" +type BrexMonthlyClosingStrategy { + """""" + dayOfMonth: Int +} + +"""""" +type BrexSemiMonthlyClosingStrategy { + """""" + firstDay: Int + + """""" + secondDay: Int +} + +"""""" +type BrexSemiWeeklyClosingStrategy { + """""" + firstDay: Int + + """""" + secondDay: Int +} + +"""""" +type BrexWeeklyClosingStrategy { + """""" + dayOfWeek: Int +} + +"""""" +union BrexClosingStrategy = BrexWeeklyClosingStrategy | BrexSemiWeeklyClosingStrategy | BrexSemiMonthlyClosingStrategy | BrexMonthlyClosingStrategy | BrexEveryNDaysClosingStrategy | BrexBiweeklyClosingStrategy + +"""""" +type BrexServicingPolicy implements OneGraphNode & BrexNode { + """""" + closingStrategy: BrexClosingStrategy + + """""" + collectedNumDaysAfterClose: Int + + """""" + delinquentNumDaysAfterClose: Int + + """The ID of an object""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexRuleEdge { + """""" + cursor: String + + """""" + node: BrexRule +} + +"""""" +type BrexRuleConnection { + """""" + edges: [BrexRuleEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexMilesTransferQuote { + """""" + exchangeRate: Int! + + """""" + redemptionOfferId: String! +} + +enum BrexLoyaltyProgramAlliance { + ONE_WORLD + SKY_TEAM + STAR_ALLIANCE + TRUEBLUE +} + +"""""" +type BrexLoyaltyProgramConfig { + """""" + alliance: BrexLoyaltyProgramAlliance! + + """""" + membershipIdRegex: String! + + """""" + minimumMiles: Int! +} + +"""""" +type BrexAscendaMaintenance { + """""" + creditingDelayHours: Int + + """""" + enabled: Boolean! +} + +"""""" +type BrexAscendaDetails { + """""" + currencyName: String + + """""" + description: String + + """""" + enrollmentLink: String + + """""" + estimatedProcessingTimeHours: Int + + """""" + fullCurrencyName: String + + """""" + maintenance: BrexAscendaMaintenance! + + """""" + partnerName: String + + """""" + programName: String + + """""" + shortProgramName: String + + """""" + termsAndConditionsLink: String +} + +"""""" +type BrexLoyaltyProgram implements OneGraphNode & BrexNode { + """""" + ascendaDetails: BrexAscendaDetails! + + """""" + ascendaProgramId: String! + + """""" + config: BrexLoyaltyProgramConfig + + """The ID of an object""" + id: ID! + + """""" + imageUrl: String! + + """""" + quote: BrexMilesTransferQuote + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexProgramMembership implements OneGraphNode & BrexNode { + """""" + firstName: String + + """The ID of an object""" + id: ID! + + """""" + lastName: String + + """""" + loyaltyProgram: BrexLoyaltyProgram + + """""" + membershipId: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexProgramMembershipEdge { + """""" + cursor: String + + """""" + node: BrexProgramMembership +} + +"""""" +type BrexProgramMembershipConnection { + """""" + edges: [BrexProgramMembershipEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexMonthlyUserBalance { + """""" + amountSpent: Int! + + """""" + month: String! + + """""" + year: Int! +} + +enum BrexDepositsRole { + ADMIN + BOOKKEEPER +} + +enum BrexChannelStatus { + DISABLED + PENDING_VERIFICATION + READY +} + +"""""" +type BrexChannelEmailOptions { + """""" + email: String +} + +enum BrexPushProviderType { + APNS + FCM +} + +"""""" +type BrexDeviceInformation { + """""" + additionalInformation: String + + """""" + appVersion: String! + + """""" + model: String! + + """""" + os: String! +} + +"""""" +type BrexChannelPushOptions { + """""" + deviceInformation: BrexDeviceInformation + + """""" + deviceToken: String + + """""" + type: BrexPushProviderType +} + +"""""" +type BrexChannelSmsOptions { + """""" + number: String +} + +"""""" +union BrexChannelOptions = BrexChannelSmsOptions | BrexChannelPushOptions | BrexChannelEmailOptions + +enum BrexNotificationType { + CARD_IS_SHIPPING + DEPOSITS_TRANSACTION_STATUS + LIMIT_WARNING + TRANSACTION_APPROVED + TRANSACTION_REFUSED +} + +"""""" +type BrexTransactionPresenceNotificationFilter { + """""" + isPhysical: Boolean +} + +"""""" +union BrexNotificationFilter = BrexTransactionPresenceNotificationFilter + +"""""" +type BrexNotificationSubscription implements OneGraphNode & BrexNode { + """""" + channel: BrexChannel + + """""" + filters: [BrexNotificationFilter] + + """The ID of an object""" + id: ID! + + """""" + notificationType: BrexNotificationType + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexNotificationSubscriptionEdge { + """""" + cursor: String + + """""" + node: BrexNotificationSubscription +} + +"""""" +type BrexNotificationSubscriptionConnection { + """""" + edges: [BrexNotificationSubscriptionEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexChannel implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + notificationSubscriptions(last: Int, first: Int, before: String, after: String): BrexNotificationSubscriptionConnection + + """""" + options: BrexChannelOptions + + """""" + status: BrexChannelStatus + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexChannelEdge { + """""" + cursor: String + + """""" + node: BrexChannel +} + +"""""" +type BrexChannelConnection { + """""" + edges: [BrexChannelEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexCardEdge { + """""" + cursor: String + + """""" + node: BrexCard +} + +"""""" +type BrexCardConnection { + """""" + edges: [BrexCardEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexFinancialMfaChallengeChoice { + """""" + choiceId: String + + """""" + text: String +} + +"""""" +type BrexFinancialMfaChallengeChoicesQuestion { + """""" + choices: [BrexFinancialMfaChallengeChoice] + + """""" + questionId: String + + """""" + text: String +} + +"""""" +type BrexFinancialMfaChallengeImageQuestion { + """""" + image: String + + """""" + questionId: String + + """""" + text: String +} + +"""""" +type BrexFinancialMfaChallengeTextQuestion { + """""" + questionId: String + + """""" + text: String +} + +"""""" +union BrexFinancialMfaChallengeQuestion = BrexFinancialMfaChallengeTextQuestion | BrexFinancialMfaChallengeImageQuestion | BrexFinancialMfaChallengeChoicesQuestion + +"""""" +type BrexFinancialMfaChallenge { + """""" + financialSource: BrexFinancialSource + + """""" + questions: [BrexFinancialMfaChallengeQuestion] +} + +"""""" +union BrexFinancialsSourceResult = BrexFinancialSource | BrexFinancialMfaChallenge + +enum BrexFinancialSourceStatus { + ACTIVE + CONNECTING + ERROR + INVALID + PENDING + USER_ACTION +} + +"""""" +type BrexFinicityPayload { + """""" + needsMigration: Boolean! +} + +"""""" +union BrexFinancialSourcePayload = BrexFinicityPayload + +"""""" +type BrexFinancialBalance implements OneGraphNode & BrexNode { + """Time of balance""" + accrualTime: String! + + """Amount of balance in cents""" + amount: Int! + + """The ID of an object""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum BrexFinancialAccountType { + CHECKING + CREDIT_CARD + INVESTMENT + LINE_OF_CREDIT + LOAN + MORTGAGE + SAVINGS +} + +enum BrexFinancialLoginFieldContentType { + IMAGE + PASSWORD + TEXT + UNKNOWN + USERNAME +} + +"""""" +type BrexFinancialLoginField { + """""" + contentType: BrexFinancialLoginFieldContentType + + """""" + description: String + + """""" + id: String + + """""" + masked: Boolean + + """""" + name: String + + """""" + order: Int +} + +"""""" +type BrexFinancialInstitutionImageUrls { + """""" + icon: String + + """""" + logo: String +} + +"""""" +type BrexFinancialInstitution implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + imageUrls: BrexFinancialInstitutionImageUrls + + """""" + loginFields: [BrexFinancialLoginField] + + """""" + loginInstructions: String + + """""" + logoUrl: String @deprecated(reason: "Use image_urls->>logo instead") + + """""" + name: String + + """""" + order: Int + + """""" + website: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexFinancialAccountDetails { + """Last 4 digits of account number if it exists.""" + accountNumberLast4: String + + """""" + institution: BrexFinancialInstitution + + """Last 4 digits of routing number if it exists.""" + routingNumberLast4: String + + """""" + type: BrexFinancialAccountType +} + +"""""" +type BrexFinancialAccount implements OneGraphNode & BrexNode { + """""" + description: String + + """""" + details: BrexFinancialAccountDetails + + """The ID of an object""" + id: ID! + + """""" + latestBalance: BrexFinancialBalance + + """""" + name: String + + """""" + priority: BrexFundingSourcePriority + + """""" + source: BrexFinancialSource + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexFinancialAccountEdge { + """""" + cursor: String + + """""" + node: BrexFinancialAccount +} + +"""""" +type BrexFinancialAccountConnection { + """""" + edges: [BrexFinancialAccountEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexFinancialSource implements OneGraphNode & BrexNode { + """""" + accounts(last: Int, first: Int, before: String, after: String): BrexFinancialAccountConnection + + """The ID of an object""" + id: ID! + + """""" + institution: BrexFinancialInstitution + + """""" + payload: BrexFinancialSourcePayload + + """""" + status: BrexFinancialSourceStatus + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexFinancialSourceEdge { + """""" + cursor: String + + """""" + node: BrexFinancialSource +} + +"""""" +type BrexFinancialSourceConnection { + """""" + edges: [BrexFinancialSourceEdge] + + """""" + pageInfo: BrexPageInfo! +} + +enum BrexDepositsTransactionType { + ACH + ACH_RETURN + ADMIN_BALANCE_ADJUSTMENT + CARD_COLLECTION + CHEQUE + CHEQUE_RETURN + DIVIDEND + WIRE +} + +enum BrexStatus { + PROCESSED + PROCESSING +} + +"""""" +type BrexAchDetails { + """""" + counterparty: BrexCounterparty! + + """""" + estimatedOn: String! + + """""" + initiatorCustomerUser: BrexUser + + """""" + method: BrexMethod! + + """""" + origin: BrexOrigin! + + """""" + transferDescription: String +} + +"""""" +type BrexAchReturnDetails { + """""" + counterparty: BrexCounterparty! + + """""" + initiatorCustomerUser: BrexUser + + """""" + method: BrexMethod! + + """""" + origin: BrexOrigin! + + """""" + returnReason: BrexReturnReason! +} + +"""""" +type BrexBrexOriginatedChequeDetails { + """""" + chequeMemo: String + + """""" + chequeNumber: Int! + + """""" + counterparty: BrexCounterparty! + + """""" + expectedDeliveryDate: String + + """""" + recipientName: String + + """""" + returnReason: BrexReturnReason + + """""" + sentAt: String + + """""" + type: BrexTxType +} + +"""""" +type BrexCardCollectionDetails { + """""" + collectionAttempt: BrexCollectionAttempt! + + """""" + collectionId: String! +} + +"""""" +type BrexDepositsAdminBalanceAdjustmentDetails { + """""" + description: String + + """""" + method: BrexMethod! +} + +enum BrexInstrumentCode { + NASDAQ_DAGXX + NASDAQ_DGCXX + NASDAQ_DGVXX + NASDAQ_DPGXX + NASDAQ_GGBXX + NASDAQ_GGDXX + NASDAQ_GGSXX + NASDAQ_GSBXX + USD +} + +"""""" +type BrexFinancialInstrument { + """""" + code: BrexInstrumentCode + + """""" + name: String + + """""" + tickerSymbol: String +} + +"""""" +type BrexDividendDetails { + """""" + forFinancialInstrument: BrexFinancialInstrument + + """""" + paidOn: String +} + +"""""" +type BrexExternallyOriginatedChequeDetails { + """""" + backImageSrc: String + + """""" + chequeMemo: String + + """""" + frontImageSrc: String + + """""" + returnReason: BrexReturnReason + + """""" + senderName: String + + """""" + type: BrexTxType +} + +enum BrexTxType { + RETURN + STANDARD +} + +enum BrexReturnReason { + ACCOUNT_NOT_FOUND + CORPORATE_CUSTOMER_ADVISES_NOT_AUTHORIZED + CREDIT_ENTRY_REFUSED_BY_RECEIVER + INCORRECTLY_CODED_OUTBOUND_INTERNATIONAL_PAYMENT + INSUFFICIENT_FUNDS + UNKNOWN +} + +enum BrexTxPaymentRail { + ACH + CHEQUE + WIRE +} + +"""""" +type BrexPaymentDetails { + """""" + counterparty: BrexCounterparty! + + """""" + estimatedOn: String + + """""" + estimatedOnLatest: String + + """""" + fedReferenceNumber: String + + """""" + initiatorCustomerUser: BrexUser + + """""" + method: BrexMethod! + + """""" + origin: BrexOrigin! + + """""" + paymentRail: BrexTxPaymentRail + + """""" + returnReason: BrexReturnReason + + """""" + transferDescription: String + + """""" + type: BrexTxType +} + +enum BrexOrigin { + BREX + EXTERNAL +} + +enum BrexMethod { + CREDIT + DEBIT +} + +"""""" +type BrexWireDetails { + """""" + counterparty: BrexCounterparty! + + """""" + estimatedOn: String! + + """""" + estimatedOnLatest: String + + """""" + fedReferenceNumber: String + + """""" + initiatorCustomerUser: BrexUser + + """""" + method: BrexMethod! + + """""" + origin: BrexOrigin! + + """""" + transferDescription: String +} + +"""""" +union BrexDepositsTransactionDetails = BrexWireDetails | BrexPaymentDetails | BrexExternallyOriginatedChequeDetails | BrexDividendDetails | BrexDepositsAdminBalanceAdjustmentDetails | BrexCardCollectionDetails | BrexBrexOriginatedChequeDetails | BrexAchReturnDetails | BrexAchDetails + +"""""" +type BrexDepositsTransaction implements OneGraphNode & BrexNode { + """""" + amount: Int! + + """""" + counterpartyName: String + + """""" + depositsTraceId: String! + + """""" + details: BrexDepositsTransactionDetails! + + """The ID of an object""" + id: ID! + + """""" + memo: String + + """""" + postedAt: String! + + """""" + settledAt: String + + """""" + snapshotBalance: Int + + """""" + status: BrexStatus! + + """""" + type: BrexDepositsTransactionType! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexDepositsTransactionEdge { + """""" + cursor: String + + """""" + node: BrexDepositsTransaction +} + +"""""" +type BrexDepositsTransactionConnection { + """""" + edges: [BrexDepositsTransactionEdge] + + """""" + pageInfo: BrexPageInfo! + + """""" + totalCount: Int! +} + +enum BrexDepositsAccountStatusReason { + PENDING_VERIFICATION +} + +enum BrexDepositsAccountStatus { + ACTIVE + CLOSED + REJECTED + RESTRICTED + SUSPENDED +} + +"""""" +type BrexDepositsStatement implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + name: String! + + """""" + periodEndTime: String! + + """""" + periodStartTime: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexDepositsStatementEdge { + """""" + cursor: String + + """""" + node: BrexDepositsStatement +} + +"""""" +type BrexDepositsStatementConnection { + """""" + edges: [BrexDepositsStatementEdge] + + """""" + pageInfo: BrexPageInfo! +} + +enum BrexType { + CHECKING + SAVINGS +} + +enum BrexPaymentRail { + ACH + CHEQUE + WIRE +} + +enum BrexAccountLocation { + DOMESTIC + INTERNATIONAL +} + +enum BrexClass { + BUSINESS + PERSONAL +} + +"""""" +type BrexCounterparty implements OneGraphNode & BrexNode { + """""" + accountNumber: String + + """""" + address: BrexAddress + + """""" + approverUser: BrexUser + + """""" + beneficiaryBankAddress: BrexAddress + + """""" + beneficiaryBankInfo: String + + """""" + beneficiaryBankName: String + + """""" + chequeRecipientName: String + + """""" + class: BrexClass + + """""" + email: String + + """The ID of an object""" + id: ID! + + """""" + location: BrexAccountLocation! + + """""" + name: String! + + """""" + paymentRail: BrexPaymentRail! + + """""" + routingNumber: String + + """""" + type: BrexType + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexCounterpartyEdge { + """""" + cursor: String + + """""" + node: BrexCounterparty +} + +"""""" +type BrexCounterpartyConnection { + """""" + edges: [BrexCounterpartyEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexBalanceBreakdown { + """""" + availableBalance: Int! + + """""" + processingBalance: Int! + + """""" + sameDayCardBalance: Int! +} + +"""""" +type BrexDepositsAccount implements OneGraphNode & BrexNode { + """The account number, this will be null for restricted accounts""" + accountNumber: String + + """""" + balance: Int! + + """""" + balanceBreakdown: BrexBalanceBreakdown! + + """""" + balanceIn(timeWindowDays: Int!): Int! + + """""" + balanceOut(timeWindowDays: Int!): Int! + + """""" + counterparties(last: Int, first: Int, before: String, after: String): BrexCounterpartyConnection + + """The ID of an object""" + id: ID! + + """""" + interestEarned(timeWindowDays: Int!): Int! + + """""" + name: String! + + """""" + routingNumber: String! + + """""" + statements(startTime: String, last: Int, first: Int, endTime: String, before: String, after: String): BrexDepositsStatementConnection + + """""" + status: BrexDepositsAccountStatus! + + """Account's status reason (optional)""" + statusReason: BrexDepositsAccountStatusReason + + """Total amount that the account has earned from dividend payouts""" + totalInterestYield: Int! + + """""" + transactions(status: BrexStatus, startTime: String, last: Int, first: Int, endTime: String, before: String, after: String): BrexDepositsTransactionConnection + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexDepositsAccountEdge { + """""" + cursor: String + + """""" + node: BrexDepositsAccount +} + +"""""" +type BrexDepositsAccountConnection { + """""" + edges: [BrexDepositsAccountEdge] + + """""" + pageInfo: BrexPageInfo! +} + +enum BrexFinancialProductType { + ECOMMERCE + LIFESCIENCES + STARTUP +} + +"""""" +type BrexUserAmountSpent { + """""" + amountSpent: Int! + + """""" + userId: ID! +} + +"""""" +type BrexCardAmountSpent { + """""" + amountSpent: Int! + + """""" + cardId: ID! +} + +"""""" +type BrexCobranding { + """""" + enabled: Boolean + + """""" + fullName: String + + """""" + name: String +} + +"""""" +type BrexCollectionIntentionEdge { + """""" + cursor: String + + """""" + node: BrexCollectionIntention +} + +"""""" +type BrexCollectionIntentionConnection { + """""" + edges: [BrexCollectionIntentionEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexStatementEntryEdge { + """""" + cursor: String + + """""" + node: BrexStatementEntry +} + +"""""" +type BrexStatementEntryConnection { + """""" + edges: [BrexStatementEntryEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexCollection { + """""" + type: String +} + +"""""" +type BrexCollectionIntention implements OneGraphNode & BrexNode { + """""" + amount: Int + + """""" + collectedAt: String + + """""" + collectionAttempts(last: Int, first: Int, before: String, after: String): BrexCollectionAttemptConnection + + """""" + customerAccountId: String + + """The ID of an object""" + id: ID! + + """""" + initiator: BrexUser + + """""" + insertedAt: String + + """""" + originatorType: String + + """""" + scheduledForDate: String + + """""" + status: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexRewardsRefund implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + pointsCost: Int! + + """""" + redeemer: BrexUser! + + """""" + refundedStatementEntry: BrexStatementEntry! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexRewardsOffer { + """""" + pointsCost: Int! + + """""" + redemptionOfferId: String! +} + +"""""" +type BrexStatementEntryLens implements OneGraphNode & BrexNode { + """""" + disabledRules: [BrexIntegrationRule] + + """""" + displayFieldEntities: [BrexExternalIntegrationEntity] + + """""" + displayFields: String + + """""" + externalClass: BrexExternalIntegrationEntity + + """""" + externalDepartment: BrexExternalIntegrationEntity + + """""" + externalLocation: BrexExternalIntegrationEntity + + """The ID of an object""" + id: ID! + + """""" + ruleEvaluations: [BrexIntegrationRuleEvaluation] + + """""" + ste: BrexStatementEntry + + """""" + userCategory: BrexUserCategory + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum BrexStatementEntryIntegrationStatus { + EXPORTED + FAILED +} + +"""""" +type BrexExportItem implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + insertedAt: String! + + """""" + status: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexStatementEntry implements OneGraphNode & BrexNode { + """""" + accrualTime: String + + """""" + amount: Int + + """""" + exportItem: BrexExportItem + + """The ID of an object""" + id: ID! + + """""" + integrationStatus: BrexStatementEntryIntegrationStatus + + """""" + integrationVendorEntryId: String + + """""" + integrationVendorEntryUrl: String + + """""" + lens: BrexStatementEntryLens + + """""" + operation: BrexTransactionOperation + + """""" + originator: BrexStatementEntryOriginator + + """""" + originatorType: String + + """""" + postedAt: String + + """""" + purchaseTime: String + + """""" + rewardsRedemptionOffer: BrexRewardsOffer + + """ + Information about how this statement entry was refunded, only non-null for refunded statement entries + """ + rewardsRefund: BrexRewardsRefund + + """""" + transaction: BrexTransaction + + """""" + userCategory: BrexUserCategory + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +union BrexSearchable = BrexUser | BrexTransactionOperation | BrexTransaction | BrexStatementEntry | BrexStatement | BrexCollectionIntention + +"""""" +type BrexEmailAssetBody { + """""" + content: String + + """""" + contentType: String +} + +"""""" +type BrexEmailAssetAttachment { + """""" + asset: BrexAsset + + """""" + contentType: String + + """""" + size: Int +} + +"""""" +type BrexEmailAsset { + """""" + accrualTime: String + + """""" + attachments: [BrexEmailAssetAttachment] + + """""" + bodies: [BrexEmailAssetBody] + + """""" + forwardedBy: String + + """""" + from: String + + """""" + subject: String +} + +"""""" +type BrexFileAsset { + """""" + contentType: String + + """""" + name: String +} + +"""""" +union BrexAssetData = BrexFileAsset | BrexEmailAsset + +"""""" +type BrexAsset implements OneGraphNode & BrexNode { + """""" + data: BrexAssetData! + + """""" + downloadUrl: String + + """The ID of an object""" + id: ID! + + """""" + presignedDownloadUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexReceipt implements OneGraphNode & BrexNode { + """""" + asset: BrexAsset + + """The ID of an object""" + id: ID! + + """""" + origin: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexReceiptEdge { + """""" + cursor: String + + """""" + node: BrexReceipt +} + +"""""" +type BrexReceiptConnection { + """""" + edges: [BrexReceiptEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexTransactionOperationEdge { + """""" + cursor: String + + """""" + node: BrexTransactionOperation +} + +"""""" +type BrexTransactionOperationConnection { + """""" + edges: [BrexTransactionOperationEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexAggregation { + """ + Sum of amounts of all unexported statement entries that match this rule. + """ + amount: Int + + """Total number of unexported statement entries that match this rule.""" + count: Int +} + +"""""" +type BrexIntegrationRule implements OneGraphNode & BrexNode { + """""" + aggregation: BrexAggregation + + """""" + applyAutomatically: Boolean + + """""" + body: String + + """""" + description: String + + """The ID of an object""" + id: ID! + + """""" + name: String + + """""" + priority: Int + + """""" + type: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexIntegrationRuleEvaluation implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + key: String + + """""" + rule: BrexIntegrationRule + + """""" + value: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexNetsuiteClass { + """""" + isInactive: Boolean + + """""" + name: String +} + +"""""" +type BrexNetsuiteDepartment { + """""" + isInactive: Boolean + + """""" + name: String +} + +"""""" +type BrexNetsuiteLocation { + """""" + isInactive: Boolean + + """""" + name: String +} + +"""""" +type BrexQuickbooksClass { + """""" + name: String +} + +"""""" +type BrexQuickbooksLocation { + """""" + name: String +} + +"""""" +union BrexExternalIntegrationEntityPayload = BrexQuickbooksLocation | BrexQuickbooksClass | BrexNetsuiteLocation | BrexNetsuiteDepartment | BrexNetsuiteClass + +"""""" +type BrexExternalIntegrationEntity implements OneGraphNode & BrexNode { + """""" + deletedAt: String + + """The ID of an object""" + id: ID! + + """""" + integration: BrexIntegration + + """""" + parentEntity: BrexExternalIntegrationEntity + + """""" + payload: BrexExternalIntegrationEntityPayload + + """""" + vendorInternalId: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexTransactionLens implements OneGraphNode & BrexNode { + """""" + displayFields: String + + """""" + externalClass: BrexExternalIntegrationEntity + + """The ID of an object""" + id: ID! + + """""" + ruleEvaluations: [BrexIntegrationRuleEvaluation] + + """""" + transaction: BrexTransaction + + """""" + userCategory: BrexUserCategory + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexCardAcceptor implements OneGraphNode & BrexNode { + """""" + address: String + + """""" + captureMethod: String + + """""" + city: String + + """""" + country: String + + """The ID of an object""" + id: ID! + + """""" + mcc: String + + """""" + mid: String + + """""" + name: String + + """""" + state: String + + """""" + zip: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexTransactionEdge { + """""" + cursor: String + + """""" + node: BrexTransaction +} + +"""""" +type BrexTransactionConnection { + """""" + edges: [BrexTransactionEdge] + + """""" + pageInfo: BrexPageInfo! +} + +enum BrexTerminationReason { + CARD_DAMAGED + CARD_LOST + CARD_NOT_RECEIVED + DO_NOT_NEED_PHYSICAL_CARD + DO_NOT_NEED_VIRTUAL_CARD + FRAUD + OTHER +} + +"""""" +type BrexDepartment implements OneGraphNode & BrexNode { + """""" + deletedAt: String + + """""" + description: String + + """The ID of an object""" + id: ID! + + """""" + membersCount: Int + + """""" + name: String + + """""" + users(last: Int, first: Int, before: String, after: String): BrexUserConnection + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexUserEdge { + """""" + cursor: String + + """""" + node: BrexUser +} + +"""""" +type BrexUserConnection { + """""" + edges: [BrexUserEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexLocation implements OneGraphNode & BrexNode { + """""" + deletedAt: String + + """""" + description: String + + """The ID of an object""" + id: ID! + + """""" + membersCount: Int + + """""" + name: String + + """""" + users(last: Int, first: Int, before: String, after: String): BrexUserConnection + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +union BrexSuggestionType = BrexUserCategory | BrexUser | BrexMerchantCategory | BrexMerchant | BrexLocation | BrexDepartment | BrexCard + +"""""" +type BrexMerchantCategory implements OneGraphNode & BrexNode { + """""" + description: String + + """The ID of an object""" + id: ID! + + """""" + isDefault: Boolean + + """""" + name: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexMerchant implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + merchantCategory: BrexMerchantCategory + + """""" + name: String + + """""" + status: String + + """""" + website: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexPerMerchantStats implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + lastPurchaseTime: String + + """""" + merchant: BrexMerchant + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexPerMerchantStatsEdge { + """""" + cursor: String + + """""" + node: BrexPerMerchantStats +} + +"""""" +type BrexPerMerchantStatsConnection { + """""" + edges: [BrexPerMerchantStatsEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexCard implements OneGraphNode & BrexNode { + """Net amount spent by card from now until given number of days ago""" + amountSpent(timeWindowDays: Int!): Int + + """""" + billingAddress: BrexAddress + + """""" + companyName: String + + """""" + cvv: String + + """""" + displayName: String + + """""" + expiration: String + + """""" + first6: String + + """""" + fulfillmentStatus: String + + """""" + holderName: String + + """The ID of an object""" + id: ID! + + """""" + instrumentType: String + + """""" + last4: String + + """""" + network: String + + """""" + pan: String + + """""" + recurringMerchants(last: Int, first: Int, before: String, after: String): BrexPerMerchantStatsConnection + + """""" + shippingAddress: BrexAddress + + """""" + status: String + + """""" + terminationReason: BrexTerminationReason + + """""" + transactions(last: Int, first: Int, before: String, after: String): BrexTransactionConnection + + """""" + type: String + + """""" + user: BrexUser + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexTransactionAmount { + """ + Sum of amounts of all pending transaction operation amounts for this transaction + """ + pending: Int +} + +"""""" +type BrexTransaction implements OneGraphNode & BrexNode { + """""" + accrualTime: String + + """""" + amount: BrexTransactionAmount + + """""" + authorizationCode: String + + """""" + card: BrexCard + + """""" + cardAcceptor: BrexCardAcceptor + + """""" + categorizationType: String + + """""" + clearedAmount: Int + + """""" + department: BrexDepartment + + """The ID of an object""" + id: ID! + + """""" + lens: BrexTransactionLens + + """""" + location: BrexLocation + + """""" + memo: String + + """""" + merchant: BrexMerchant + + """""" + operations(last: Int, first: Int, before: String, after: String): BrexTransactionOperationConnection + + """""" + pendingAmount: Int + + """""" + purchaseTime: String + + """""" + receipts(last: Int, first: Int, before: String, after: String): BrexReceiptConnection + + """""" + status: String + + """""" + userCategory: BrexUserCategory + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexRewardsTrigger implements OneGraphNode & BrexNode { + """""" + description: String! + + """The ID of an object""" + id: ID! + + """""" + name: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexRewardsAccrualEntry implements OneGraphNode & BrexNode { + """""" + amount: Int! + + """The ID of an object""" + id: ID! + + """""" + rewardsTrigger: BrexRewardsTrigger + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexRewardsAccrualEntryEdge { + """""" + cursor: String + + """""" + node: BrexRewardsAccrualEntry +} + +"""""" +type BrexRewardsAccrualEntryConnection { + """""" + edges: [BrexRewardsAccrualEntryEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexGlobalLimitRuleMetadata { + """""" + amount: Int +} + +"""""" +type BrexLimitRuleMetadata { + """""" + amount: Int + + """""" + timeWindowDays: Int +} + +"""""" +union BrexRuleMetadata = BrexLimitRuleMetadata | BrexGlobalLimitRuleMetadata + +"""""" +type BrexRule implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + metadata: BrexRuleMetadata + + """""" + type: String + + """""" + usageInfo: String + + """""" + user: BrexUser + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexTransactionOperation implements OneGraphNode & BrexNode { + """""" + accrualTime: String + + """""" + amount: Int + + """""" + declinedByRule: BrexRule + + """The ID of an object""" + id: ID! + + """""" + rewardsAccrualEntries(last: Int, first: Int, before: String, after: String): BrexRewardsAccrualEntryConnection + + """""" + status: String + + """""" + statusReason: String + + """""" + subtype: String + + """""" + transaction: BrexTransaction + + """""" + type: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +union BrexStatementEntryOriginator = BrexTransactionOperation | BrexRewardsRefund | BrexCollectionAttempt | BrexCollection + +"""""" +type BrexCollectionAttempt implements OneGraphNode & BrexNode { + """""" + amount: Int + + """""" + collectionDate: String + + """""" + fundingSource: BrexFundingSource + + """The ID of an object""" + id: ID! + + """""" + originatorId: String + + """""" + originatorType: String + + """""" + presentCollectionIntentionId: String + + """""" + providerCollectionId: String + + """""" + providerName: String + + """""" + scheduledDate: String + + """""" + statement: BrexStatement + + """""" + status: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexCollectionAttemptEdge { + """""" + cursor: String + + """""" + node: BrexCollectionAttempt +} + +"""""" +type BrexCollectionAttemptConnection { + """""" + edges: [BrexCollectionAttemptEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexStatement implements OneGraphNode & BrexNode { + """""" + actualPaymentDate: String + + """ + Balance of the statement based on the sum of amount from statement entries + """ + balance: Int + + """Amount spent on during the statement period""" + balanceExcludingCollections: Int + + """""" + closedAmount: Int + + """""" + closingTime: String + + """""" + collectionAttempts(last: Int, first: Int, before: String, after: String): BrexCollectionAttemptConnection + + """""" + entries(last: Int, first: Int, before: String, after: String): BrexStatementEntryConnection + + """The ID of an object""" + id: ID! + + """""" + interestAmount: Int + + """""" + paidAmount: Int + + """""" + paymentDate: String + + """""" + periodEndDate: String + + """""" + periodStartDate: String + + """""" + startingTime: String + + """""" + status: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexAccountSystemSettings { + """""" + bypassFinancialsSetup: Boolean + + """""" + monthlyUserLimitRolloutEnabled: Boolean +} + +enum BrexUnderwritingAccountStatus { + APPROVED + PENDING + PROVISIONALLY_APPROVED + REJECTED +} + +enum BrexUnderwritingAnalysisFlagName { + LOW_FIDELITY +} + +"""""" +type BrexUnderwritingAnalysisFlag implements OneGraphNode & BrexNode { + """The ID of an object""" + id: ID! + + """""" + name: BrexUnderwritingAnalysisFlagName! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexUnderwritingAnalysisFlagEdge { + """""" + cursor: String + + """""" + node: BrexUnderwritingAnalysisFlag +} + +"""""" +type BrexUnderwritingAnalysisFlagConnection { + """""" + edges: [BrexUnderwritingAnalysisFlagEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexUnderwritingAnalysis implements OneGraphNode & BrexNode { + """""" + flags(last: Int, first: Int, before: String, after: String): BrexUnderwritingAnalysisFlagConnection + + """The ID of an object""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexUnderwritingAccount implements OneGraphNode & BrexNode { + """""" + appliedAnalysis: BrexUnderwritingAnalysis + + """The ID of an object""" + id: ID! + + """""" + status: BrexUnderwritingAccountStatus! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexPageInfo { + """When paginating forwards, the cursor to continue.""" + endCursor: String + + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: String +} + +enum BrexFundingSourceStatus { + AWAITING_VERIFICATION + DISABLED + ENABLED + PENDING +} + +enum BrexFundingSourcePriority { + ALTERNATIVE + PRIMARY +} + +"""""" +type BrexFundingSourceData implements OneGraphNode & BrexNode { + """""" + accountName: String + + """""" + accountNumberLastFour: String + + """""" + accountType: String + + """The ID of an object""" + id: ID! + + """""" + routingNumber: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexFundingSource implements OneGraphNode & BrexNode { + """""" + data: BrexFundingSourceData + + """""" + disabledOnTimestamp: String + + """""" + financialAccountId: String + + """The ID of an object""" + id: ID! + + """""" + isBrexCash: Boolean + + """""" + priority: BrexFundingSourcePriority + + """""" + status: BrexFundingSourceStatus + + """""" + type: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexFundingSourceEdge { + """""" + cursor: String + + """""" + node: BrexFundingSource +} + +"""""" +type BrexFundingSourceConnection { + """""" + edges: [BrexFundingSourceEdge] + + """""" + pageInfo: BrexPageInfo! +} + +"""""" +type BrexAddress { + """""" + address1: String + + """""" + address2: String + + """""" + city: String + + """""" + country: String + + """""" + state: String + + """""" + zip: String +} + +"""""" +type BrexAccount implements OneGraphNode & BrexNode { + """ + Total amount of transactions by customer that have had auth but no clearing event + """ + balancePending: Int + + """Number of points available to account""" + pointsBalance: Int + + """""" + maximumUserInitiatedPaymentAmount: Int + + """""" + officeAddress: BrexAddress + + """""" + fundingSources(last: Int, first: Int, before: String, after: String): BrexFundingSourceConnection + + """The ID of an object""" + id: ID! + + """ + Amount of money a customer owes, minus the entries that haven't become due yet + """ + currentAmountDue: Int + + """""" + underwriting: BrexUnderwritingAccount + + """""" + systemSettings: BrexAccountSystemSettings + + """""" + legalName: String + + """""" + allowUserManualPayment: Boolean + + """""" + status: String + + """""" + nextDueStatement: BrexStatement + + """""" + insertedAt: String + + """""" + dateEstablished: String + + """""" + collectionIntentions(last: Int, first: Int, before: String, after: String): BrexCollectionIntentionConnection + + """""" + currentStatement: BrexStatement + + """""" + taxpayerNumber: String + + """""" + users(last: Int, first: Int, before: String, after: String): BrexUserConnection + + """""" + lastUserInitiatedCollectionIntention: BrexCollectionIntention + + """""" + cobranding: BrexCobranding! + + """Amount we're currently trying to collect for this customer""" + outstandingCollectionAmount: Int + + """ + Net amount spent by all cards for this account from now until given number of days ago + """ + cardsAmountSpent(timeWindowDays: Int!): [BrexCardAmountSpent] + + """ + Net amount spent by all users for this account from now until given number of days ago + """ + usersAmountSpent(timeWindowDays: Int!): [BrexUserAmountSpent] + + """""" + financialProductType: BrexFinancialProductType + + """Rounded amount of money that customer has available to spend""" + roundedRemainingSpend: Int + + """Amount we're currently trying to collect for this customer""" + scheduledCollectionAmount: Int + + """""" + depositsAccounts(last: Int, first: Int, before: String, after: String): BrexDepositsAccountConnection + + """Rounded estimate of the global limit for the customer""" + roundedGlobalLimit: Int + + """ + Total amount of money that customer owes Brex, including entries that aren't due yet + """ + balanceDue: Int + + """""" + dbaName: String + + """""" + financialSources(last: Int, first: Int, before: String, after: String): BrexFinancialSourceConnection + + """""" + incorporationState: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexUser implements OneGraphNode & BrexNode { + """""" + account: BrexAccount + + """""" + address: BrexAddress + + """Net amount spent by user from now until given number of days ago""" + amountSpent(timeWindowDays: Int!): Int + + """""" + birthDate: String + + """""" + cards(last: Int, first: Int, before: String, after: String): BrexCardConnection + + """""" + channels(last: Int, first: Int, before: String, after: String): BrexChannelConnection + + """""" + department: BrexDepartment + + """""" + depositsRole: BrexDepositsRole + + """""" + email: String + + """""" + firstName: String + + """""" + helpshiftAuthToken: String! + + """The ID of an object""" + id: ID! + + """""" + isMfaEnabled: Boolean + + """""" + lastName: String + + """""" + location: BrexLocation + + """Monthly breakdown for amount spent by user""" + monthlySpendBreakdown: [BrexMonthlyUserBalance] + + """""" + notificationSubscriptions(last: Int, first: Int, before: String, after: String): BrexNotificationSubscriptionConnection + + """""" + programMemberships(last: Int, first: Int, before: String, after: String): BrexProgramMembershipConnection + + """""" + referralCode: String + + """""" + role: String + + """""" + rules(last: Int, first: Int, before: String, after: String): BrexRuleConnection + + """""" + ssn: String + + """""" + status: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +interface BrexNode { + """The id of the object.""" + id: ID! +} + +"""""" +type BrexCredentialShopifyPayload { + """""" + shopName: String +} + +"""""" +union BrexCredentialPayload = BrexCredentialShopifyPayload + +"""""" +type BrexCredential implements OneGraphNode & BrexNode { + """""" + expirationDate: String + + """The ID of an object""" + id: ID! + + """""" + payload: BrexCredentialPayload + + """""" + publicData: String + + """""" + renewalDate: String + + """""" + status: String + + """""" + vendor: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexExpensifyCategories { + """""" + vendorName: String +} + +"""""" +type BrexNetsuiteCategories { + """""" + accountsPayableUserCategory: BrexUserCategory + + """""" + collectionTargetUserCategory: BrexUserCategory + + """""" + rewardsIncomeUserCategory: BrexUserCategory + + """""" + vendorName: String +} + +"""""" +type BrexQuickbooksCategories { + """""" + accountsPayableUserCategory: BrexUserCategory + + """""" + collectionTargetUserCategory: BrexUserCategory + + """""" + rewardsIncomeUserCategory: BrexUserCategory + + """""" + vendorName: String +} + +"""""" +type BrexXeroCategories { + """""" + accountsPayableUserCategory: BrexUserCategory + + """""" + collectionTargetUserCategory: BrexUserCategory + + """""" + organizationName: String + + """""" + rewardsIncomeUserCategory: BrexUserCategory + + """""" + vendorName: String +} + +"""""" +union BrexAccountCategories = BrexXeroCategories | BrexQuickbooksCategories | BrexNetsuiteCategories | BrexExpensifyCategories + +"""""" +type BrexIntegration implements OneGraphNode & BrexNode { + """""" + accountCategories: BrexAccountCategories + + """""" + credential: BrexCredential + + """""" + errorDetails: [BrexIntegrationErrorDetails] + + """""" + exports(last: Int, first: Int, before: String, after: String): BrexExportConnection + + """The ID of an object""" + id: ID! + + """""" + integrationEntities(last: Int, first: Int, before: String, after: String): BrexExternalIntegrationEntityConnection + + """""" + integrationRules(last: Int, first: Int, before: String, after: String): BrexIntegrationRuleConnection + + """""" + integrationUsers(last: Int, first: Int, before: String, after: String): BrexIntegrationUserConnection + + """""" + scopes: [BrexIntegrationScope] + + """""" + settings: BrexIntegrationSettings + + """""" + setupInstructions: BrexSetupInstructions + + """""" + status: String + + """""" + userCategories(last: Int, first: Int, before: String, after: String): BrexUserCategoryConnection + + """""" + vendor: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type BrexUserCategory implements OneGraphNode & BrexNode { + """""" + category: String + + """""" + description: String + + """The ID of an object""" + id: ID! + + """""" + integration: BrexIntegration + + """""" + isDeleted: Boolean + + """""" + isDisabled: Boolean + + """""" + isInactive: Boolean + + """""" + merchantCategories(last: Int, first: Int, before: String, after: String): BrexMerchantCategoryConnection + + """""" + name: String + + """""" + parentUserCategory: BrexUserCategory + + """""" + vendorInternalId: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against `SyncState` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseSyncStateFilter { + """Negates the expression.""" + not: CrunchbaseSyncStateFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseSyncStateFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseSyncStateFilter!] + + """Filter by the object’s `lastUpdatedAt` field.""" + lastUpdatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `objectType` field.""" + objectType: CrunchbaseStringFilter +} + +enum CrunchbaseSyncStatesOrderBy { + NATURAL + OBJECT_TYPE_ASC + OBJECT_TYPE_DESC + LAST_UPDATED_AT_ASC + LAST_UPDATED_AT_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""A `SyncState` edge in the connection.""" +type CrunchbaseSyncStatesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `SyncState` at the end of the edge.""" + node: CrunchbaseSyncState +} + +"""A connection to a list of `SyncState` values.""" +type CrunchbaseSyncStatesConnection { + """A list of `SyncState` objects.""" + nodes: [CrunchbaseSyncState]! + + """ + A list of edges which contains the `SyncState` and cursor to aid in pagination. + """ + edges: [CrunchbaseSyncStatesEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `SyncState` you could get from the connection.""" + totalCount: Int! +} + +"""The root query type which gives access points into the data universe.""" +type CrunchbaseQuery implements OneGraphNode & CrunchbaseNode { + """ + Exposes the root query type nested one level down. This is helpful for Relay 1 which can only query top level fields if they are in a particular form. + """ + query: CrunchbaseQuery! + + """ + The root query type must be a `Node` to work well with Relay 1 mutations. This just resolves to `query`. + """ + nodeId: ID! + + """Fetches an object given its globally unique `ID`.""" + node( + """The globally unique `ID`.""" + nodeId: ID! + ): CrunchbaseNode + + """Reads and enables pagination through a set of `Acquisition`.""" + acquisitions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseAcquisitionFilter + + """The method to use when ordering `Acquisition`.""" + orderBy: [CrunchbaseAcquisitionsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseAcquisitionsConnection + + """Reads and enables pagination through a set of `Address`.""" + addresses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseAddressFilter + + """The method to use when ordering `Address`.""" + orderBy: [CrunchbaseAddressesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseAddressesConnection + + """Reads and enables pagination through a set of `Category`.""" + categories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseCategoryFilter + + """The method to use when ordering `Category`.""" + orderBy: [CrunchbaseCategoriesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseCategoriesConnection + + """Reads and enables pagination through a set of `Degree`.""" + degrees( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseDegreeFilter + + """The method to use when ordering `Degree`.""" + orderBy: [CrunchbaseDegreesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseDegreesConnection + + """Reads and enables pagination through a set of `Fund`.""" + funds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseFundFilter + + """The method to use when ordering `Fund`.""" + orderBy: [CrunchbaseFundsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseFundsConnection + + """Reads and enables pagination through a set of `FundingRound`.""" + fundingRounds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseFundingRoundFilter + + """The method to use when ordering `FundingRound`.""" + orderBy: [CrunchbaseFundingRoundsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseFundingRoundsConnection + + """Reads and enables pagination through a set of `Image`.""" + images( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseImageFilter + + """The method to use when ordering `Image`.""" + orderBy: [CrunchbaseImagesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseImagesConnection + + """Reads and enables pagination through a set of `Investment`.""" + investments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseInvestmentFilter + + """The method to use when ordering `Investment`.""" + orderBy: [CrunchbaseInvestmentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseInvestmentsConnection + + """Reads and enables pagination through a set of `Ipo`.""" + ipos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseIpoFilter + + """The method to use when ordering `Ipo`.""" + orderBy: [CrunchbaseIposOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseIposConnection + + """Reads and enables pagination through a set of `Job`.""" + jobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseJobFilter + + """The method to use when ordering `Job`.""" + orderBy: [CrunchbaseJobsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseJobsConnection + + """Reads and enables pagination through a set of `Location`.""" + locations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseLocationFilter + + """The method to use when ordering `Location`.""" + orderBy: [CrunchbaseLocationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseLocationsConnection + + """Reads and enables pagination through a set of `Organization`.""" + organizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection + + """Reads and enables pagination through a set of `Person`.""" + people( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection + + """Reads and enables pagination through a set of `SyncState`.""" + syncStates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseSyncStateFilter + + """The method to use when ordering `SyncState`.""" + orderBy: [CrunchbaseSyncStatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseSyncStatesConnection + + """""" + acquisitionById(id: String!): CrunchbaseAcquisition + + """""" + addressById(id: String!): CrunchbaseAddress + + """""" + categoryById(id: String!): CrunchbaseCategory + + """""" + degreeById(id: String!): CrunchbaseDegree + + """""" + fundById(id: String!): CrunchbaseFund + + """""" + fundingRoundById(id: String!): CrunchbaseFundingRound + + """""" + imageById(id: String!): CrunchbaseImage + + """""" + investmentById(id: String!): CrunchbaseInvestment + + """""" + ipoById(id: String!): CrunchbaseIpo + + """""" + jobById(id: String!): CrunchbaseJob + + """""" + locationById(id: String!): CrunchbaseLocation + + """""" + organizationById(id: String!): CrunchbaseOrganization + + """""" + personById(id: String!): CrunchbasePerson + + """""" + syncStateByObjectType(objectType: String!): CrunchbaseSyncState + + """Reads a single `Acquisition` using its globally unique `ID`.""" + acquisition( + """ + The globally unique `ID` to be used in selecting a single `Acquisition`. + """ + nodeId: ID! + ): CrunchbaseAcquisition + + """Reads a single `Address` using its globally unique `ID`.""" + address( + """The globally unique `ID` to be used in selecting a single `Address`.""" + nodeId: ID! + ): CrunchbaseAddress + + """Reads a single `Category` using its globally unique `ID`.""" + category( + """The globally unique `ID` to be used in selecting a single `Category`.""" + nodeId: ID! + ): CrunchbaseCategory + + """Reads a single `Degree` using its globally unique `ID`.""" + degree( + """The globally unique `ID` to be used in selecting a single `Degree`.""" + nodeId: ID! + ): CrunchbaseDegree + + """Reads a single `Fund` using its globally unique `ID`.""" + fund( + """The globally unique `ID` to be used in selecting a single `Fund`.""" + nodeId: ID! + ): CrunchbaseFund + + """Reads a single `FundingRound` using its globally unique `ID`.""" + fundingRound( + """ + The globally unique `ID` to be used in selecting a single `FundingRound`. + """ + nodeId: ID! + ): CrunchbaseFundingRound + + """Reads a single `Image` using its globally unique `ID`.""" + image( + """The globally unique `ID` to be used in selecting a single `Image`.""" + nodeId: ID! + ): CrunchbaseImage + + """Reads a single `Investment` using its globally unique `ID`.""" + investment( + """ + The globally unique `ID` to be used in selecting a single `Investment`. + """ + nodeId: ID! + ): CrunchbaseInvestment + + """Reads a single `Ipo` using its globally unique `ID`.""" + ipo( + """The globally unique `ID` to be used in selecting a single `Ipo`.""" + nodeId: ID! + ): CrunchbaseIpo + + """Reads a single `Job` using its globally unique `ID`.""" + job( + """The globally unique `ID` to be used in selecting a single `Job`.""" + nodeId: ID! + ): CrunchbaseJob + + """Reads a single `Location` using its globally unique `ID`.""" + location( + """The globally unique `ID` to be used in selecting a single `Location`.""" + nodeId: ID! + ): CrunchbaseLocation + + """Reads a single `Organization` using its globally unique `ID`.""" + organization( + """ + The globally unique `ID` to be used in selecting a single `Organization`. + """ + nodeId: ID! + ): CrunchbaseOrganization + + """Reads a single `Person` using its globally unique `ID`.""" + person( + """The globally unique `ID` to be used in selecting a single `Person`.""" + nodeId: ID! + ): CrunchbasePerson + + """Reads a single `SyncState` using its globally unique `ID`.""" + syncState( + """The globally unique `ID` to be used in selecting a single `SyncState`.""" + nodeId: ID! + ): CrunchbaseSyncState + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type CrunchbaseOrganizationsConnectionAverages { + """""" + numEmployeesMin: Float + + """""" + numEmployeesMax: Float + + """""" + totalFundingUsd: Float + + """""" + numberOfInvestments: Float + + """""" + rank: Float +} + +"""""" +type CrunchbaseOrganizationsConnectionSums { + """""" + numEmployeesMin: Float + + """""" + numEmployeesMax: Float + + """""" + totalFundingUsd: Float + + """""" + numberOfInvestments: Float + + """""" + rank: Float +} + +"""""" +type CrunchbaseOrganizationsConnectionAggregates { + """""" + sum: CrunchbaseOrganizationsConnectionSums + + """""" + avg: CrunchbaseOrganizationsConnectionAverages +} + +"""A `Organization` edge in the connection.""" +type CrunchbaseOrganizationsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Organization` at the end of the edge.""" + node: CrunchbaseOrganization +} + +enum CrunchbaseCategoriesOrderBy { + NATURAL + ID_ASC + ID_DESC + WEB_PATH_ASC + WEB_PATH_DESC + GROUPS_ASC + GROUPS_DESC + NAME_ASC + NAME_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""A `Category` edge in the connection.""" +type CrunchbaseCategoriesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Category` at the end of the edge.""" + node: CrunchbaseCategory +} + +"""A connection to a list of `Category` values.""" +type CrunchbaseCategoriesConnection { + """A list of `Category` objects.""" + nodes: [CrunchbaseCategory]! + + """ + A list of edges which contains the `Category` and cursor to aid in pagination. + """ + edges: [CrunchbaseCategoriesEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Category` you could get from the connection.""" + totalCount: Int! +} + +enum CrunchbaseAddressesOrderBy { + NATURAL + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + STREET_1_ASC + STREET_1_DESC + STREET_2_ASC + STREET_2_DESC + CITY_ASC + CITY_DESC + CITY_WEB_PATH_ASC + CITY_WEB_PATH_DESC + REGION_ASC + REGION_DESC + REGION_WEB_PATH_ASC + REGION_WEB_PATH_DESC + COUNTRY_ASC + COUNTRY_DESC + COUNTRY_WEB_PATH_ASC + COUNTRY_WEB_PATH_DESC + LATITUDE_ASC + LATITUDE_DESC + LONGITUDE_ASC + LONGITUDE_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + POSTAL_CODE_ASC + POSTAL_CODE_DESC + REGION_CODE_2_ASC + REGION_CODE_2_DESC + COUNTRY_CODE_2_ASC + COUNTRY_CODE_2_DESC + COUNTRY_CODE_3_ASC + COUNTRY_CODE_3_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type CrunchbaseAddressesConnectionAverages { + """""" + latitude: Float + + """""" + longitude: Float +} + +"""""" +type CrunchbaseAddressesConnectionSums { + """""" + latitude: Float + + """""" + longitude: Float +} + +"""""" +type CrunchbaseAddressesConnectionAggregates { + """""" + sum: CrunchbaseAddressesConnectionSums + + """""" + avg: CrunchbaseAddressesConnectionAverages +} + +"""A `Address` edge in the connection.""" +type CrunchbaseAddressesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Address` at the end of the edge.""" + node: CrunchbaseAddress +} + +"""A connection to a list of `Address` values.""" +type CrunchbaseAddressesConnection { + """A list of `Address` objects.""" + nodes: [CrunchbaseAddress]! + + """ + A list of edges which contains the `Address` and cursor to aid in pagination. + """ + edges: [CrunchbaseAddressesEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Address` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: CrunchbaseAddressesConnectionAggregates +} + +enum CrunchbaseIposOrderBy { + NATURAL + ID_ASC + ID_DESC + API_PATH_ASC + API_PATH_DESC + WEB_PATH_ASC + WEB_PATH_DESC + WENT_PUBLIC_ON_ASC + WENT_PUBLIC_ON_DESC + WENT_PUBLIC_ON_TRUST_CODE_ASC + WENT_PUBLIC_ON_TRUST_CODE_DESC + STOCK_EXCHANGE_SYMBOL_ASC + STOCK_EXCHANGE_SYMBOL_DESC + STOCK_SYMBOL_ASC + STOCK_SYMBOL_DESC + OPENING_SHARE_PRICE_ASC + OPENING_SHARE_PRICE_DESC + OPENING_SHARE_PRICE_CURRENCY_CODE_ASC + OPENING_SHARE_PRICE_CURRENCY_CODE_DESC + OPENING_SHARE_PRICE_USD_ASC + OPENING_SHARE_PRICE_USD_DESC + OPENING_VALUATION_ASC + OPENING_VALUATION_DESC + OPENING_VALUATION_CURRENCY_CODE_ASC + OPENING_VALUATION_CURRENCY_CODE_DESC + OPENING_VALUATION_USD_ASC + OPENING_VALUATION_USD_DESC + MONEY_RAISED_ASC + MONEY_RAISED_DESC + MONEY_RAISED_CURRENCY_CODE_ASC + MONEY_RAISED_CURRENCY_CODE_DESC + MONEY_RAISED_USD_ASC + MONEY_RAISED_USD_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + API_URL_ASC + API_URL_DESC + FUNDED_COMPANY_ID_ASC + FUNDED_COMPANY_ID_DESC + NEWS_ITEMS_ASC + NEWS_ITEMS_DESC + SHARES_SOLD_ASC + SHARES_SOLD_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type CrunchbaseIposConnectionAverages { + """""" + openingSharePrice: Float + + """""" + openingSharePriceUsd: Float + + """""" + openingValuation: Float + + """""" + openingValuationUsd: Float + + """""" + moneyRaised: Float + + """""" + moneyRaisedUsd: Float + + """""" + sharesSold: Float +} + +"""""" +type CrunchbaseIposConnectionSums { + """""" + openingSharePrice: Float + + """""" + openingSharePriceUsd: Float + + """""" + openingValuation: Float + + """""" + openingValuationUsd: Float + + """""" + moneyRaised: Float + + """""" + moneyRaisedUsd: Float + + """""" + sharesSold: Float +} + +"""""" +type CrunchbaseIposConnectionAggregates { + """""" + sum: CrunchbaseIposConnectionSums + + """""" + avg: CrunchbaseIposConnectionAverages +} + +"""A `Ipo` edge in the connection.""" +type CrunchbaseIposEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Ipo` at the end of the edge.""" + node: CrunchbaseIpo +} + +"""""" +type CrunchbaseIpo implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + apiPath: String + + """""" + webPath: String + + """""" + wentPublicOn: String + + """""" + wentPublicOnTrustCode: CrunchbaseTrustCode + + """""" + stockExchangeSymbol: String + + """""" + stockSymbol: String + + """""" + openingSharePrice: Float + + """""" + openingSharePriceCurrencyCode: CrunchbaseCurrencyCode + + """ + currency conversion, when necessary, is done based on the went_public_on date + """ + openingSharePriceUsd: Float + + """""" + openingValuation: String + + """""" + openingValuationCurrencyCode: CrunchbaseCurrencyCode + + """ + currency conversion, when necessary, is done based on the went_public_on date + """ + openingValuationUsd: String + + """""" + moneyRaised: String + + """""" + moneyRaisedCurrencyCode: CrunchbaseCurrencyCode + + """ + currency conversion, when necessary, is done based on the went_public_on date + """ + moneyRaisedUsd: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + apiUrl: String + + """""" + fundedCompanyId: String + + """""" + newsItems: [CrunchbaseNewsItem] + + """""" + sharesSold: Int + + """Reads a single `Organization` that is related to this `Ipo`.""" + fundedCompany: CrunchbaseOrganization + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Ipo` values.""" +type CrunchbaseIposConnection { + """A list of `Ipo` objects.""" + nodes: [CrunchbaseIpo]! + + """ + A list of edges which contains the `Ipo` and cursor to aid in pagination. + """ + edges: [CrunchbaseIposEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Ipo` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: CrunchbaseIposConnectionAggregates +} + +enum CrunchbaseAcquisitionsOrderBy { + NATURAL + ID_ASC + ID_DESC + API_PATH_ASC + API_PATH_DESC + WEB_PATH_ASC + WEB_PATH_DESC + PRICE_ASC + PRICE_DESC + PRICE_CURRENCY_CODE_ASC + PRICE_CURRENCY_CODE_DESC + PRICE_USD_ASC + PRICE_USD_DESC + PAYMENT_TYPE_ASC + PAYMENT_TYPE_DESC + ACQUISITION_TYPE_ASC + ACQUISITION_TYPE_DESC + ACQUISITION_STATUS_ASC + ACQUISITION_STATUS_DESC + DISPOSITION_OF_ACQUIRED_ASC + DISPOSITION_OF_ACQUIRED_DESC + ANNOUNCED_ON_ASC + ANNOUNCED_ON_DESC + ANNOUNCED_ON_TRUST_CODE_ASC + ANNOUNCED_ON_TRUST_CODE_DESC + COMPLETED_ON_ASC + COMPLETED_ON_DESC + COMPLETED_ON_TRUST_CODE_ASC + COMPLETED_ON_TRUST_CODE_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + API_URL_ASC + API_URL_DESC + RANK_ASC + RANK_DESC + ACQUIRER_ID_ASC + ACQUIRER_ID_DESC + ACQUIREE_ID_ASC + ACQUIREE_ID_DESC + NEWS_ITEMS_ASC + NEWS_ITEMS_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type CrunchbaseAcquisitionsConnectionAverages { + """""" + price: Float + + """""" + priceUsd: Float + + """""" + rank: Float +} + +"""""" +type CrunchbaseAcquisitionsConnectionSums { + """""" + price: Float + + """""" + priceUsd: Float + + """""" + rank: Float +} + +"""""" +type CrunchbaseAcquisitionsConnectionAggregates { + """""" + sum: CrunchbaseAcquisitionsConnectionSums + + """""" + avg: CrunchbaseAcquisitionsConnectionAverages +} + +"""A `Acquisition` edge in the connection.""" +type CrunchbaseAcquisitionsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Acquisition` at the end of the edge.""" + node: CrunchbaseAcquisition +} + +"""""" +type CrunchbaseAcquisition implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + apiPath: String + + """""" + webPath: String + + """""" + price: String + + """""" + priceCurrencyCode: CrunchbaseCurrencyCode + + """ + currency conversion, if necessary, is done based on the announced_on date. + """ + priceUsd: String + + """""" + paymentType: CrunchbaseAcquisitionPaymentType + + """""" + acquisitionType: CrunchbaseAcquisitionType + + """""" + acquisitionStatus: CrunchbaseAcquisitionStatus + + """""" + dispositionOfAcquired: CrunchbaseAcquisitionDisposition + + """""" + announcedOn: String + + """""" + announcedOnTrustCode: CrunchbaseTrustCode + + """""" + completedOn: String + + """""" + completedOnTrustCode: CrunchbaseTrustCode + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + apiUrl: String + + """""" + rank: Int + + """""" + acquirerId: String + + """""" + acquireeId: String + + """""" + newsItems: [CrunchbaseNewsItem] + + """Reads a single `Organization` that is related to this `Acquisition`.""" + acquirer: CrunchbaseOrganization + + """Reads a single `Organization` that is related to this `Acquisition`.""" + acquiree: CrunchbaseOrganization + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Acquisition` values.""" +type CrunchbaseAcquisitionsConnection { + """A list of `Acquisition` objects.""" + nodes: [CrunchbaseAcquisition]! + + """ + A list of edges which contains the `Acquisition` and cursor to aid in pagination. + """ + edges: [CrunchbaseAcquisitionsEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Acquisition` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: CrunchbaseAcquisitionsConnectionAggregates +} + +enum CrunchbaseImagesOrderBy { + NATURAL + ID_ASC + ID_DESC + ASSET_PATH_ASC + ASSET_PATH_DESC + ASSET_URL_ASC + ASSET_URL_DESC + CONTENT_TYPE_ASC + CONTENT_TYPE_DESC + HEIGHT_ASC + HEIGHT_DESC + WIDTH_ASC + WIDTH_DESC + FILESIZE_ASC + FILESIZE_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type CrunchbaseImagesConnectionAverages { + """""" + height: Float + + """""" + width: Float + + """""" + filesize: Float +} + +"""""" +type CrunchbaseImagesConnectionSums { + """""" + height: Float + + """""" + width: Float + + """""" + filesize: Float +} + +"""""" +type CrunchbaseImagesConnectionAggregates { + """""" + sum: CrunchbaseImagesConnectionSums + + """""" + avg: CrunchbaseImagesConnectionAverages +} + +"""A `Image` edge in the connection.""" +type CrunchbaseImagesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Image` at the end of the edge.""" + node: CrunchbaseImage +} + +"""A connection to a list of `Image` values.""" +type CrunchbaseImagesConnection { + """A list of `Image` objects.""" + nodes: [CrunchbaseImage]! + + """ + A list of edges which contains the `Image` and cursor to aid in pagination. + """ + edges: [CrunchbaseImagesEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Image` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: CrunchbaseImagesConnectionAggregates +} + +"""""" +type CrunchbaseAddress implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """ + User-provided name of the Address (e.g., "European HQ", "New York Sales Office") + """ + name: String + + """Primary street address""" + street1: String + + """Secondary / additional street address or information""" + street2: String + + """City name""" + city: String + + """Path to Location detail for city""" + cityWebPath: String + + """""" + region: String + + """""" + regionWebPath: String + + """Country full name""" + country: String + + """Path to Location detail for country""" + countryWebPath: String + + """""" + latitude: Float + + """""" + longitude: Float + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + postalCode: String + + """""" + regionCode2: String + + """""" + countryCode2: String + + """""" + countryCode3: String + + """Reads and enables pagination through a set of `Organization`.""" + organizationsHeadquartered( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + + """Reads and enables pagination through a set of `Image`.""" + images( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseImageFilter + + """The method to use when ordering `Image`.""" + orderBy: [CrunchbaseImagesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseImagesConnection! + + """Reads and enables pagination through a set of `Organization`.""" + organizationsWithOffice( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type CrunchbasePeopleConnectionAverages { + """""" + rank: Float +} + +"""""" +type CrunchbasePeopleConnectionSums { + """""" + rank: Float +} + +"""""" +type CrunchbasePeopleConnectionAggregates { + """""" + sum: CrunchbasePeopleConnectionSums + + """""" + avg: CrunchbasePeopleConnectionAverages +} + +"""A `Person` edge in the connection.""" +type CrunchbasePeopleEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Person` at the end of the edge.""" + node: CrunchbasePerson +} + +enum CrunchbaseFundsOrderBy { + NATURAL + ID_ASC + ID_DESC + API_PATH_ASC + API_PATH_DESC + WEB_PATH_ASC + WEB_PATH_DESC + NAME_ASC + NAME_DESC + ANNOUNCED_ON_ASC + ANNOUNCED_ON_DESC + ANNOUNCED_ON_TRUST_CODE_ASC + ANNOUNCED_ON_TRUST_CODE_DESC + MONEY_RAISED_ASC + MONEY_RAISED_DESC + MONEY_RAISED_CURRENCY_CODE_ASC + MONEY_RAISED_CURRENCY_CODE_DESC + MONEY_RAISED_USD_ASC + MONEY_RAISED_USD_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + PERMALINK_ASC + PERMALINK_DESC + API_URL_ASC + API_URL_DESC + VENTURE_FIRM_ID_ASC + VENTURE_FIRM_ID_DESC + NEWS_ITEMS_ASC + NEWS_ITEMS_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type CrunchbaseFundsConnectionAverages { + """""" + moneyRaised: Float + + """""" + moneyRaisedUsd: Float +} + +"""""" +type CrunchbaseFundsConnectionSums { + """""" + moneyRaised: Float + + """""" + moneyRaisedUsd: Float +} + +"""""" +type CrunchbaseFundsConnectionAggregates { + """""" + sum: CrunchbaseFundsConnectionSums + + """""" + avg: CrunchbaseFundsConnectionAverages +} + +"""A `Fund` edge in the connection.""" +type CrunchbaseFundsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Fund` at the end of the edge.""" + node: CrunchbaseFund +} + +"""A connection to a list of `Fund` values.""" +type CrunchbaseFundsConnection { + """A list of `Fund` objects.""" + nodes: [CrunchbaseFund]! + + """ + A list of edges which contains the `Fund` and cursor to aid in pagination. + """ + edges: [CrunchbaseFundsEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Fund` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: CrunchbaseFundsConnectionAggregates +} + +enum CrunchbaseFundingRoundsOrderBy { + NATURAL + ID_ASC + ID_DESC + API_PATH_ASC + API_PATH_DESC + WEB_PATH_ASC + WEB_PATH_DESC + FUNDING_TYPE_ASC + FUNDING_TYPE_DESC + SERIES_ASC + SERIES_DESC + SERIES_QUALIFIER_ASC + SERIES_QUALIFIER_DESC + ANNOUNCED_ON_ASC + ANNOUNCED_ON_DESC + ANNOUNCED_ON_TRUST_CODE_ASC + ANNOUNCED_ON_TRUST_CODE_DESC + CLOSED_ON_ASC + CLOSED_ON_DESC + CLOSED_ON_TRUST_CODE_ASC + CLOSED_ON_TRUST_CODE_DESC + MONEY_RAISED_ASC + MONEY_RAISED_DESC + MONEY_RAISED_CURRENCY_CODE_ASC + MONEY_RAISED_CURRENCY_CODE_DESC + MONEY_RAISED_USD_ASC + MONEY_RAISED_USD_DESC + TARGET_MONEY_RAISED_ASC + TARGET_MONEY_RAISED_DESC + TARGET_MONEY_RAISED_CURRENCY_CODE_ASC + TARGET_MONEY_RAISED_CURRENCY_CODE_DESC + TARGET_MONEY_RAISED_USD_ASC + TARGET_MONEY_RAISED_USD_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + PERMALINK_ASC + PERMALINK_DESC + API_URL_ASC + API_URL_DESC + PRE_MONEY_VALUATION_ASC + PRE_MONEY_VALUATION_DESC + PRE_MONEY_VALUATION_CURRENCY_CODE_ASC + PRE_MONEY_VALUATION_CURRENCY_CODE_DESC + PRE_MONEY_VALUATION_USD_ASC + PRE_MONEY_VALUATION_USD_DESC + RANK_ASC + RANK_DESC + FUNDED_ORGANIZATION_ID_ASC + FUNDED_ORGANIZATION_ID_DESC + NEWS_ITEMS_ASC + NEWS_ITEMS_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type CrunchbaseFundingRoundsConnectionAverages { + """""" + moneyRaised: Float + + """""" + moneyRaisedUsd: Float + + """""" + targetMoneyRaised: Float + + """""" + targetMoneyRaisedUsd: Float + + """""" + preMoneyValuation: Float + + """""" + preMoneyValuationUsd: Float + + """""" + rank: Float +} + +"""""" +type CrunchbaseFundingRoundsConnectionSums { + """""" + moneyRaised: Float + + """""" + moneyRaisedUsd: Float + + """""" + targetMoneyRaised: Float + + """""" + targetMoneyRaisedUsd: Float + + """""" + preMoneyValuation: Float + + """""" + preMoneyValuationUsd: Float + + """""" + rank: Float +} + +"""""" +type CrunchbaseFundingRoundsConnectionAggregates { + """""" + sum: CrunchbaseFundingRoundsConnectionSums + + """""" + avg: CrunchbaseFundingRoundsConnectionAverages +} + +"""A `FundingRound` edge in the connection.""" +type CrunchbaseFundingRoundsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `FundingRound` at the end of the edge.""" + node: CrunchbaseFundingRound +} + +"""A connection to a list of `FundingRound` values.""" +type CrunchbaseFundingRoundsConnection { + """A list of `FundingRound` objects.""" + nodes: [CrunchbaseFundingRound]! + + """ + A list of edges which contains the `FundingRound` and cursor to aid in pagination. + """ + edges: [CrunchbaseFundingRoundsEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `FundingRound` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: CrunchbaseFundingRoundsConnectionAggregates +} + +enum CrunchbaseFundInvestorsOrderBy { + NATURAL + FUND_ID_ASC + FUND_ID_DESC + ORGANIZATION_ID_ASC + ORGANIZATION_ID_DESC + PERSON_ID_ASC + PERSON_ID_DESC +} + +"""A `FundInvestor` edge in the connection.""" +type CrunchbaseFundInvestorsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `FundInvestor` at the end of the edge.""" + node: CrunchbaseFundInvestor +} + +"""""" +type CrunchbaseFund implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + apiPath: String + + """""" + webPath: String + + """""" + name: String + + """""" + announcedOn: String + + """""" + announcedOnTrustCode: CrunchbaseTrustCode + + """""" + moneyRaised: String + + """""" + moneyRaisedCurrencyCode: CrunchbaseCurrencyCode + + """ + currency conversion, if necessary, is done based on the announced_on date + """ + moneyRaisedUsd: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + permalink: String + + """""" + apiUrl: String + + """""" + ventureFirmId: String + + """""" + newsItems: [CrunchbaseNewsItem] + + """Reads a single `Organization` that is related to this `Fund`.""" + ventureFirm: CrunchbaseOrganization + + """Reads and enables pagination through a set of `Organization`.""" + fundInvestorOrganizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + + """Reads and enables pagination through a set of `Person`.""" + fundInvestorPeople( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type CrunchbaseFundInvestor { + """""" + fundId: String! + + """""" + organizationId: String + + """""" + personId: String + + """Reads a single `Fund` that is related to this `FundInvestor`.""" + fund: CrunchbaseFund + + """Reads a single `Organization` that is related to this `FundInvestor`.""" + organization: CrunchbaseOrganization + + """Reads a single `Person` that is related to this `FundInvestor`.""" + person: CrunchbasePerson +} + +"""A connection to a list of `FundInvestor` values.""" +type CrunchbaseFundInvestorsConnection { + """A list of `FundInvestor` objects.""" + nodes: [CrunchbaseFundInvestor]! + + """ + A list of edges which contains the `FundInvestor` and cursor to aid in pagination. + """ + edges: [CrunchbaseFundInvestorsEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `FundInvestor` you could get from the connection.""" + totalCount: Int! +} + +"""""" +type CrunchbaseInvestmentsConnectionAverages { + """""" + moneyInvested: Float + + """""" + moneyInvestedUsd: Float +} + +"""""" +type CrunchbaseInvestmentsConnectionSums { + """""" + moneyInvested: Float + + """""" + moneyInvestedUsd: Float +} + +"""""" +type CrunchbaseInvestmentsConnectionAggregates { + """""" + sum: CrunchbaseInvestmentsConnectionSums + + """""" + avg: CrunchbaseInvestmentsConnectionAverages +} + +"""A `Investment` edge in the connection.""" +type CrunchbaseInvestmentsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Investment` at the end of the edge.""" + node: CrunchbaseInvestment +} + +enum CrunchbaseInvestmentsOrderBy { + NATURAL + ID_ASC + ID_DESC + MONEY_INVESTED_ASC + MONEY_INVESTED_DESC + MONEY_INVESTED_CURRENCY_CODE_ASC + MONEY_INVESTED_CURRENCY_CODE_DESC + MONEY_INVESTED_USD_ASC + MONEY_INVESTED_USD_DESC + IS_LEAD_INVESTOR_ASC + IS_LEAD_INVESTOR_DESC + ANNOUNCED_ON_ASC + ANNOUNCED_ON_DESC + ANNOUNCED_ON_TRUST_CODE_ASC + ANNOUNCED_ON_TRUST_CODE_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + FUNDING_ROUND_ID_ASC + FUNDING_ROUND_ID_DESC + INVESTED_IN_PERSON_ID_ASC + INVESTED_IN_PERSON_ID_DESC + INVESTED_IN_ORGANIZATION_ID_ASC + INVESTED_IN_ORGANIZATION_ID_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type CrunchbaseFundingRound implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + apiPath: String + + """""" + webPath: String + + """""" + fundingType: CrunchbaseFundingType + + """ + For each round with the funding_type "venture", the "series" property is populated with the corresponding letter (e.g., A, B, C, D, etc.). + """ + series: String + + """ + In some cases, Organizations may have multiple venture FundingRounds with the same series (e.g., two "A" rounds). + + In this case, the FundingRounds have an optional series_qualifier property that can disambiguate the rounds from one another. + + Most often, these qualifiers are numeric. So if an Organization had two Series A rounds, they could be qualified as Series A1 and Series A2, where the numbers 1 and 2 are the series_qualifier properties. + """ + seriesQualifier: String + + """""" + announcedOn: String + + """""" + announcedOnTrustCode: CrunchbaseTrustCode + + """""" + closedOn: String + + """""" + closedOnTrustCode: CrunchbaseTrustCode + + """""" + moneyRaised: String + + """""" + moneyRaisedCurrencyCode: CrunchbaseCurrencyCode + + """ + currency conversion, if necessary, is done based on the announced_on date. + """ + moneyRaisedUsd: String + + """""" + targetMoneyRaised: String + + """""" + targetMoneyRaisedCurrencyCode: CrunchbaseCurrencyCode + + """ + currency conversion, if necessary, is done based on the announced_on date. + """ + targetMoneyRaisedUsd: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + permalink: String + + """""" + apiUrl: String + + """""" + preMoneyValuation: String + + """""" + preMoneyValuationCurrencyCode: CrunchbaseCurrencyCode + + """ + currency conversion, if necessary, is done based on the announced_on date. + """ + preMoneyValuationUsd: String + + """""" + rank: Int + + """""" + fundedOrganizationId: String + + """""" + newsItems: [CrunchbaseNewsItem] + + """Reads a single `Organization` that is related to this `FundingRound`.""" + fundedOrganization: CrunchbaseOrganization + + """Reads and enables pagination through a set of `Investment`.""" + investments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseInvestmentFilter + + """The method to use when ordering `Investment`.""" + orderBy: [CrunchbaseInvestmentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseInvestmentsConnection! + + """Reads and enables pagination through a set of `Person`.""" + peopleInvestedIn( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + + """Reads and enables pagination through a set of `Organization`.""" + organizationsInvestedIn( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type CrunchbaseInvestment implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + moneyInvested: String + + """""" + moneyInvestedCurrencyCode: CrunchbaseCurrencyCode + + """ + currency conversion, if necessary, is done based on the announced_on date. + """ + moneyInvestedUsd: String + + """""" + isLeadInvestor: Boolean + + """""" + announcedOn: String + + """""" + announcedOnTrustCode: CrunchbaseTrustCode + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + fundingRoundId: String + + """""" + investedInPersonId: String + + """""" + investedInOrganizationId: String + + """Reads a single `FundingRound` that is related to this `Investment`.""" + fundingRound: CrunchbaseFundingRound + + """Reads a single `Person` that is related to this `Investment`.""" + investedInPerson: CrunchbasePerson + + """Reads a single `Organization` that is related to this `Investment`.""" + investedInOrganization: CrunchbaseOrganization + + """Reads and enables pagination through a set of `Organization`.""" + investorOrganizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + + """Reads and enables pagination through a set of `Person`.""" + investorPeople( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + + """Reads and enables pagination through a set of `Person`.""" + investmentPartners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Investment` values.""" +type CrunchbaseInvestmentsConnection { + """A list of `Investment` objects.""" + nodes: [CrunchbaseInvestment]! + + """ + A list of edges which contains the `Investment` and cursor to aid in pagination. + """ + edges: [CrunchbaseInvestmentsEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Investment` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: CrunchbaseInvestmentsConnectionAggregates +} + +enum CrunchbaseJobsOrderBy { + NATURAL + ID_ASC + ID_DESC + TITLE_ASC + TITLE_DESC + IS_CURRENT_ASC + IS_CURRENT_DESC + IS_PRIMARY_ASC + IS_PRIMARY_DESC + STARTED_ON_ASC + STARTED_ON_DESC + STARTED_ON_TRUST_CODE_ASC + STARTED_ON_TRUST_CODE_DESC + ENDED_ON_ASC + ENDED_ON_DESC + ENDED_ON_TRUST_CODE_ASC + ENDED_ON_TRUST_CODE_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + JOB_TYPE_ASC + JOB_TYPE_DESC + PERSON_ID_ASC + PERSON_ID_DESC + ORGANIZATION_ID_ASC + ORGANIZATION_ID_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""A `Job` edge in the connection.""" +type CrunchbaseJobsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Job` at the end of the edge.""" + node: CrunchbaseJob +} + +"""""" +type CrunchbaseJob implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + title: String + + """""" + isCurrent: Boolean + + """""" + isPrimary: Boolean + + """""" + startedOn: String + + """""" + startedOnTrustCode: CrunchbaseTrustCode + + """""" + endedOn: String + + """""" + endedOnTrustCode: CrunchbaseTrustCode + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + jobType: String + + """""" + personId: String + + """""" + organizationId: String + + """Reads a single `Person` that is related to this `Job`.""" + person: CrunchbasePerson + + """Reads a single `Organization` that is related to this `Job`.""" + organization: CrunchbaseOrganization + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Job` values.""" +type CrunchbaseJobsConnection { + """A list of `Job` objects.""" + nodes: [CrunchbaseJob]! + + """ + A list of edges which contains the `Job` and cursor to aid in pagination. + """ + edges: [CrunchbaseJobsEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Job` you could get from the connection.""" + totalCount: Int! +} + +enum CrunchbaseDegreesOrderBy { + NATURAL + ID_ASC + ID_DESC + STARTED_ON_ASC + STARTED_ON_DESC + STARTED_ON_TRUST_CODE_ASC + STARTED_ON_TRUST_CODE_DESC + COMPLETED_ON_ASC + COMPLETED_ON_DESC + COMPLETED_ON_TRUST_CODE_ASC + COMPLETED_ON_TRUST_CODE_DESC + DEGREE_TYPE_NAME_ASC + DEGREE_TYPE_NAME_DESC + DEGREE_SUBJECT_ASC + DEGREE_SUBJECT_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + SCHOOL_ID_ASC + SCHOOL_ID_DESC + PERSON_ID_ASC + PERSON_ID_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""A `Degree` edge in the connection.""" +type CrunchbaseDegreesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Degree` at the end of the edge.""" + node: CrunchbaseDegree +} + +"""""" +type CrunchbaseDegree implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + startedOn: String + + """""" + startedOnTrustCode: CrunchbaseTrustCode + + """""" + completedOn: String + + """""" + completedOnTrustCode: CrunchbaseTrustCode + + """ + e.g., "BA", "PhD" + """ + degreeTypeName: String + + """""" + degreeSubject: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + schoolId: String + + """""" + personId: String + + """Reads a single `Organization` that is related to this `Degree`.""" + school: CrunchbaseOrganization + + """Reads a single `Person` that is related to this `Degree`.""" + person: CrunchbasePerson + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Degree` values.""" +type CrunchbaseDegreesConnection { + """A list of `Degree` objects.""" + nodes: [CrunchbaseDegree]! + + """ + A list of edges which contains the `Degree` and cursor to aid in pagination. + """ + edges: [CrunchbaseDegreesEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Degree` you could get from the connection.""" + totalCount: Int! +} + +enum CrunchbasePeopleOrderBy { + NATURAL + ID_ASC + ID_DESC + PERMALINK_ASC + PERMALINK_DESC + API_PATH_ASC + API_PATH_DESC + WEB_PATH_ASC + WEB_PATH_DESC + FIRST_NAME_ASC + FIRST_NAME_DESC + LAST_NAME_ASC + LAST_NAME_DESC + ALSO_KNOWN_AS_ASC + ALSO_KNOWN_AS_DESC + BIO_ASC + BIO_DESC + PROFILE_IMAGE_URL_ASC + PROFILE_IMAGE_URL_DESC + ROLE_INVESTOR_ASC + ROLE_INVESTOR_DESC + BORN_ON_ASC + BORN_ON_DESC + BORN_ON_TRUST_CODE_ASC + BORN_ON_TRUST_CODE_DESC + DIED_ON_ASC + DIED_ON_DESC + DIED_ON_TRUST_CODE_ASC + DIED_ON_TRUST_CODE_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + API_URL_ASC + API_URL_DESC + PERMALINK_ALIASES_ASC + PERMALINK_ALIASES_DESC + GENDER_ASC + GENDER_DESC + RANK_ASC + RANK_DESC + PRIMARY_LOCATION_ID_ASC + PRIMARY_LOCATION_ID_DESC + PRIMARY_IMAGE_ID_ASC + PRIMARY_IMAGE_ID_DESC + WEBSITES_ASC + WEBSITES_DESC + NEWS_ITEMS_ASC + NEWS_ITEMS_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +enum CrunchbaseLocationsOrderBy { + NATURAL + ID_ASC + ID_DESC + WEB_PATH_ASC + WEB_PATH_DESC + NAME_ASC + NAME_DESC + LOCATION_TYPE_ASC + LOCATION_TYPE_DESC + PARENT_LOCATION_ID_ASC + PARENT_LOCATION_ID_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CITY_ASC + CITY_DESC + REGION_ASC + REGION_DESC + REGION_CODE2_ASC + REGION_CODE2_DESC + COUNTRY_ASC + COUNTRY_DESC + COUNTRY_CODE2_ASC + COUNTRY_CODE2_DESC + COUNTRY_CODE3_ASC + COUNTRY_CODE3_DESC + CONTINENT_ASC + CONTINENT_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""Information about pagination in a connection.""" +type CrunchbasePageInfo { + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: String + + """When paginating forwards, the cursor to continue.""" + endCursor: String +} + +"""A `Location` edge in the connection.""" +type CrunchbaseLocationsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Location` at the end of the edge.""" + node: CrunchbaseLocation +} + +"""A connection to a list of `Location` values.""" +type CrunchbaseLocationsConnection { + """A list of `Location` objects.""" + nodes: [CrunchbaseLocation]! + + """ + A list of edges which contains the `Location` and cursor to aid in pagination. + """ + edges: [CrunchbaseLocationsEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Location` you could get from the connection.""" + totalCount: Int! +} + +"""""" +type CrunchbaseLocation implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + webPath: String + + """""" + name: String + + """""" + locationType: CrunchbaseLocationType + + """""" + parentLocationId: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + city: String + + """""" + region: String + + """""" + regionCode2: String + + """""" + country: String + + """""" + countryCode2: String + + """""" + countryCode3: String + + """""" + continent: String + + """Reads a single `Location` that is related to this `Location`.""" + parentLocation: CrunchbaseLocation + + """Reads and enables pagination through a set of `Location`.""" + subLocations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseLocationFilter + + """The method to use when ordering `Location`.""" + orderBy: [CrunchbaseLocationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseLocationsConnection! + + """Reads and enables pagination through a set of `Person`.""" + peopleByPrimaryLocationId( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type CrunchbasePerson implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + permalink: String + + """""" + apiPath: String + + """""" + webPath: String + + """""" + firstName: String + + """""" + lastName: String + + """Aliases / Past names""" + alsoKnownAs: [String] + + """""" + bio: String + + """""" + profileImageUrl: String + + """""" + roleInvestor: Boolean + + """""" + bornOn: String + + """""" + bornOnTrustCode: CrunchbaseTrustCode + + """""" + diedOn: String + + """""" + diedOnTrustCode: CrunchbaseTrustCode + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + apiUrl: String + + """""" + permalinkAliases: [String] + + """""" + gender: String + + """""" + rank: Int + + """""" + primaryLocationId: String + + """""" + primaryImageId: String + + """""" + websites: [CrunchbaseWebsite] + + """""" + newsItems: [CrunchbaseNewsItem] + + """Reads a single `Location` that is related to this `Person`.""" + primaryLocation: CrunchbaseLocation + + """Reads a single `Image` that is related to this `Person`.""" + primaryImage: CrunchbaseImage + + """Reads and enables pagination through a set of `Degree`.""" + degrees( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseDegreeFilter + + """The method to use when ordering `Degree`.""" + orderBy: [CrunchbaseDegreesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseDegreesConnection! + + """Reads and enables pagination through a set of `Job`.""" + jobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseJobFilter + + """The method to use when ordering `Job`.""" + orderBy: [CrunchbaseJobsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseJobsConnection! + + """Reads and enables pagination through a set of `Investment`.""" + investmentsAsInvestee( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseInvestmentFilter + + """The method to use when ordering `Investment`.""" + orderBy: [CrunchbaseInvestmentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseInvestmentsConnection! + + """Reads and enables pagination through a set of `FundInvestor`.""" + fundInvestors( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseFundInvestorFilter + + """The method to use when ordering `FundInvestor`.""" + orderBy: [CrunchbaseFundInvestorsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseFundInvestorsConnection! + + """Reads and enables pagination through a set of `Organization`.""" + graduatedSchools( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + + """Reads and enables pagination through a set of `Organization`.""" + organizationsByJobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + + """Reads and enables pagination through a set of `FundingRound`.""" + fundingRoundsAsInvestee( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseFundingRoundFilter + + """The method to use when ordering `FundingRound`.""" + orderBy: [CrunchbaseFundingRoundsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseFundingRoundsConnection! + + """Reads and enables pagination through a set of `Organization`.""" + organizationsInvestedIn( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + + """Reads and enables pagination through a set of `Organization`.""" + foundedOrganizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + + """Reads and enables pagination through a set of `Investment`.""" + investmentsAsInvestor( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseInvestmentFilter + + """The method to use when ordering `Investment`.""" + orderBy: [CrunchbaseInvestmentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseInvestmentsConnection! + + """Reads and enables pagination through a set of `Organization`.""" + investorOrganizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + + """Reads and enables pagination through a set of `Investment`.""" + investmentsAsPartner( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseInvestmentFilter + + """The method to use when ordering `Investment`.""" + orderBy: [CrunchbaseInvestmentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseInvestmentsConnection! + + """Reads and enables pagination through a set of `Job`.""" + advisorRoleJobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseJobFilter + + """The method to use when ordering `Job`.""" + orderBy: [CrunchbaseJobsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseJobsConnection! + + """Reads and enables pagination through a set of `Fund`.""" + investedInFunds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseFundFilter + + """The method to use when ordering `Fund`.""" + orderBy: [CrunchbaseFundsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseFundsConnection! + + """Reads and enables pagination through a set of `Organization`.""" + fundInvestorOrganizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Person` values.""" +type CrunchbasePeopleConnection { + """A list of `Person` objects.""" + nodes: [CrunchbasePerson]! + + """ + A list of edges which contains the `Person` and cursor to aid in pagination. + """ + edges: [CrunchbasePeopleEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Person` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: CrunchbasePeopleConnectionAggregates +} + +""" +A filter to be used against many `FundInvestor` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyFundInvestorFilter { + """ + No related `FundInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseFundInvestorFilter + + """ + Some related `FundInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseFundInvestorFilter + + """ + Every related `FundInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseFundInvestorFilter +} + +""" +A filter to be used against many `OrganizationCategory` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseCategoryToManyOrganizationCategoryFilter { + """ + No related `OrganizationCategory` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationCategoryFilter + + """ + Some related `OrganizationCategory` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationCategoryFilter + + """ + Every related `OrganizationCategory` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationCategoryFilter +} + +""" +A filter to be used against `Category` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseCategoryFilter { + """Negates the expression.""" + not: CrunchbaseCategoryFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseCategoryFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseCategoryFilter!] + + """Some related `organizationCategories` exist.""" + organizationCategoriesExist: Boolean + + """Filter by the object’s `organizationCategories` relation.""" + organizationCategories: CrunchbaseCategoryToManyOrganizationCategoryFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `name` field.""" + name: CrunchbaseStringFilter + + """Filter by the object’s `groups` field.""" + groups: CrunchbaseStringListFilter + + """Filter by the object’s `webPath` field.""" + webPath: CrunchbaseStringFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against `OrganizationCategory` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationCategoryFilter { + """Negates the expression.""" + not: CrunchbaseOrganizationCategoryFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseOrganizationCategoryFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseOrganizationCategoryFilter!] + + """Filter by the object’s `category` relation.""" + category: CrunchbaseCategoryFilter + + """Filter by the object’s `organization` relation.""" + organization: CrunchbaseOrganizationFilter + + """Filter by the object’s `categoryId` field.""" + categoryId: CrunchbaseUUIDFilter + + """Filter by the object’s `organizationId` field.""" + organizationId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `OrganizationCategory` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyOrganizationCategoryFilter { + """ + No related `OrganizationCategory` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationCategoryFilter + + """ + Some related `OrganizationCategory` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationCategoryFilter + + """ + Every related `OrganizationCategory` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationCategoryFilter +} + +""" +A filter to be used against `OrganizationOwner` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationOwnerFilter { + """Negates the expression.""" + not: CrunchbaseOrganizationOwnerFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseOrganizationOwnerFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseOrganizationOwnerFilter!] + + """A related `ownerOrganization` exists.""" + ownerOrganizationExists: Boolean + + """Filter by the object’s `ownerOrganization` relation.""" + ownerOrganization: CrunchbaseOrganizationFilter + + """Filter by the object’s `ownedOrganization` relation.""" + ownedOrganization: CrunchbaseOrganizationFilter + + """Filter by the object’s `ownerOrganizationId` field.""" + ownerOrganizationId: CrunchbaseUUIDFilter + + """Filter by the object’s `ownedOrganizationId` field.""" + ownedOrganizationId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `OrganizationOwner` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyOrganizationOwnerFilter { + """ + No related `OrganizationOwner` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationOwnerFilter + + """ + Some related `OrganizationOwner` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationOwnerFilter + + """ + Every related `OrganizationOwner` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationOwnerFilter +} + +""" +A filter to be used against many `InvestmentInvestor` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyInvestmentInvestorFilter { + """ + No related `InvestmentInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseInvestmentInvestorFilter + + """ + Some related `InvestmentInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseInvestmentInvestorFilter + + """ + Every related `InvestmentInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseInvestmentInvestorFilter +} + +""" +A filter to be used against many `OrganizationBoardAndAdvisorMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyOrganizationBoardAndAdvisorMemberFilter { + """ + No related `OrganizationBoardAndAdvisorMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationBoardAndAdvisorMemberFilter + + """ + Some related `OrganizationBoardAndAdvisorMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationBoardAndAdvisorMemberFilter + + """ + Every related `OrganizationBoardAndAdvisorMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationBoardAndAdvisorMemberFilter +} + +""" +A filter to be used against many `OrganizationPastTeamMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyOrganizationPastTeamMemberFilter { + """ + No related `OrganizationPastTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationPastTeamMemberFilter + + """ + Some related `OrganizationPastTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationPastTeamMemberFilter + + """ + Every related `OrganizationPastTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationPastTeamMemberFilter +} + +""" +A filter to be used against many `OrganizationFeaturedTeamMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyOrganizationFeaturedTeamMemberFilter { + """ + No related `OrganizationFeaturedTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationFeaturedTeamMemberFilter + + """ + Some related `OrganizationFeaturedTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationFeaturedTeamMemberFilter + + """ + Every related `OrganizationFeaturedTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationFeaturedTeamMemberFilter +} + +""" +A filter to be used against many `OrganizationCurrentTeamMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyOrganizationCurrentTeamMemberFilter { + """ + No related `OrganizationCurrentTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationCurrentTeamMemberFilter + + """ + Some related `OrganizationCurrentTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationCurrentTeamMemberFilter + + """ + Every related `OrganizationCurrentTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationCurrentTeamMemberFilter +} + +""" +A filter to be used against many `OrganizationFounder` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyOrganizationFounderFilter { + """ + No related `OrganizationFounder` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationFounderFilter + + """ + Some related `OrganizationFounder` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationFounderFilter + + """ + Every related `OrganizationFounder` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationFounderFilter +} + +""" +A filter to be used against `Ipo` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseIpoFilter { + """Negates the expression.""" + not: CrunchbaseIpoFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseIpoFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseIpoFilter!] + + """A related `fundedCompany` exists.""" + fundedCompanyExists: Boolean + + """Filter by the object’s `fundedCompany` relation.""" + fundedCompany: CrunchbaseOrganizationFilter + + """Filter by the object’s `sharesSold` field.""" + sharesSold: CrunchbaseIntFilter + + """Filter by the object’s `fundedCompanyId` field.""" + fundedCompanyId: CrunchbaseUUIDFilter + + """Filter by the object’s `apiUrl` field.""" + apiUrl: CrunchbaseStringFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `moneyRaisedUsd` field.""" + moneyRaisedUsd: CrunchbaseBigIntFilter + + """Filter by the object’s `moneyRaisedCurrencyCode` field.""" + moneyRaisedCurrencyCode: CrunchbaseCurrencyCodeFilter + + """Filter by the object’s `moneyRaised` field.""" + moneyRaised: CrunchbaseBigIntFilter + + """Filter by the object’s `openingValuationUsd` field.""" + openingValuationUsd: CrunchbaseBigIntFilter + + """Filter by the object’s `openingValuationCurrencyCode` field.""" + openingValuationCurrencyCode: CrunchbaseCurrencyCodeFilter + + """Filter by the object’s `openingValuation` field.""" + openingValuation: CrunchbaseBigIntFilter + + """Filter by the object’s `openingSharePriceUsd` field.""" + openingSharePriceUsd: CrunchbaseFloatFilter + + """Filter by the object’s `openingSharePriceCurrencyCode` field.""" + openingSharePriceCurrencyCode: CrunchbaseCurrencyCodeFilter + + """Filter by the object’s `openingSharePrice` field.""" + openingSharePrice: CrunchbaseFloatFilter + + """Filter by the object’s `stockSymbol` field.""" + stockSymbol: CrunchbaseStringFilter + + """Filter by the object’s `stockExchangeSymbol` field.""" + stockExchangeSymbol: CrunchbaseStringFilter + + """Filter by the object’s `wentPublicOnTrustCode` field.""" + wentPublicOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `wentPublicOn` field.""" + wentPublicOn: CrunchbaseDateFilter + + """Filter by the object’s `webPath` field.""" + webPath: CrunchbaseStringFilter + + """Filter by the object’s `apiPath` field.""" + apiPath: CrunchbaseStringFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `Ipo` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyIpoFilter { + """ + No related `Ipo` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseIpoFilter + + """ + Some related `Ipo` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseIpoFilter + + """ + Every related `Ipo` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseIpoFilter +} + +enum CrunchbaseAcquisitionDisposition { + SEPARATE_ENTITY + PRODUCT + DIVISION + SUBSIDIARY + COMBINED +} + +""" +A filter to be used against AcquisitionDisposition fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseAcquisitionDispositionFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: CrunchbaseAcquisitionDisposition + + """Greater than the specified value.""" + greaterThan: CrunchbaseAcquisitionDisposition + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: CrunchbaseAcquisitionDisposition + + """Less than the specified value.""" + lessThan: CrunchbaseAcquisitionDisposition + + """Not included in the specified list.""" + notIn: [CrunchbaseAcquisitionDisposition!] + + """Included in the specified list.""" + in: [CrunchbaseAcquisitionDisposition!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: CrunchbaseAcquisitionDisposition + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: CrunchbaseAcquisitionDisposition + + """Not equal to the specified value.""" + notEqualTo: CrunchbaseAcquisitionDisposition + + """Equal to the specified value.""" + equalTo: CrunchbaseAcquisitionDisposition + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +enum CrunchbaseAcquisitionStatus { + PENDING + COMPLETE + CANCELLED +} + +""" +A filter to be used against AcquisitionStatus fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseAcquisitionStatusFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: CrunchbaseAcquisitionStatus + + """Greater than the specified value.""" + greaterThan: CrunchbaseAcquisitionStatus + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: CrunchbaseAcquisitionStatus + + """Less than the specified value.""" + lessThan: CrunchbaseAcquisitionStatus + + """Not included in the specified list.""" + notIn: [CrunchbaseAcquisitionStatus!] + + """Included in the specified list.""" + in: [CrunchbaseAcquisitionStatus!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: CrunchbaseAcquisitionStatus + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: CrunchbaseAcquisitionStatus + + """Not equal to the specified value.""" + notEqualTo: CrunchbaseAcquisitionStatus + + """Equal to the specified value.""" + equalTo: CrunchbaseAcquisitionStatus + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +enum CrunchbaseAcquisitionType { + ACQUISITION + ACQUIHIRE + LEVERAGED_BUY_OUT + LBO +} + +""" +A filter to be used against AcquisitionType fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseAcquisitionTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: CrunchbaseAcquisitionType + + """Greater than the specified value.""" + greaterThan: CrunchbaseAcquisitionType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: CrunchbaseAcquisitionType + + """Less than the specified value.""" + lessThan: CrunchbaseAcquisitionType + + """Not included in the specified list.""" + notIn: [CrunchbaseAcquisitionType!] + + """Included in the specified list.""" + in: [CrunchbaseAcquisitionType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: CrunchbaseAcquisitionType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: CrunchbaseAcquisitionType + + """Not equal to the specified value.""" + notEqualTo: CrunchbaseAcquisitionType + + """Equal to the specified value.""" + equalTo: CrunchbaseAcquisitionType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +enum CrunchbaseAcquisitionPaymentType { + CASH + STOCK + CASH_AND_STOCK +} + +""" +A filter to be used against AcquisitionPaymentType fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseAcquisitionPaymentTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: CrunchbaseAcquisitionPaymentType + + """Greater than the specified value.""" + greaterThan: CrunchbaseAcquisitionPaymentType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: CrunchbaseAcquisitionPaymentType + + """Less than the specified value.""" + lessThan: CrunchbaseAcquisitionPaymentType + + """Not included in the specified list.""" + notIn: [CrunchbaseAcquisitionPaymentType!] + + """Included in the specified list.""" + in: [CrunchbaseAcquisitionPaymentType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: CrunchbaseAcquisitionPaymentType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: CrunchbaseAcquisitionPaymentType + + """Not equal to the specified value.""" + notEqualTo: CrunchbaseAcquisitionPaymentType + + """Equal to the specified value.""" + equalTo: CrunchbaseAcquisitionPaymentType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Acquisition` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseAcquisitionFilter { + """Negates the expression.""" + not: CrunchbaseAcquisitionFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseAcquisitionFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseAcquisitionFilter!] + + """A related `acquiree` exists.""" + acquireeExists: Boolean + + """Filter by the object’s `acquiree` relation.""" + acquiree: CrunchbaseOrganizationFilter + + """A related `acquirer` exists.""" + acquirerExists: Boolean + + """Filter by the object’s `acquirer` relation.""" + acquirer: CrunchbaseOrganizationFilter + + """Filter by the object’s `acquireeId` field.""" + acquireeId: CrunchbaseUUIDFilter + + """Filter by the object’s `acquirerId` field.""" + acquirerId: CrunchbaseUUIDFilter + + """Filter by the object’s `rank` field.""" + rank: CrunchbaseIntFilter + + """Filter by the object’s `apiUrl` field.""" + apiUrl: CrunchbaseStringFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `completedOnTrustCode` field.""" + completedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `completedOn` field.""" + completedOn: CrunchbaseDateFilter + + """Filter by the object’s `announcedOnTrustCode` field.""" + announcedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `announcedOn` field.""" + announcedOn: CrunchbaseDateFilter + + """Filter by the object’s `dispositionOfAcquired` field.""" + dispositionOfAcquired: CrunchbaseAcquisitionDispositionFilter + + """Filter by the object’s `acquisitionStatus` field.""" + acquisitionStatus: CrunchbaseAcquisitionStatusFilter + + """Filter by the object’s `acquisitionType` field.""" + acquisitionType: CrunchbaseAcquisitionTypeFilter + + """Filter by the object’s `paymentType` field.""" + paymentType: CrunchbaseAcquisitionPaymentTypeFilter + + """Filter by the object’s `priceUsd` field.""" + priceUsd: CrunchbaseBigIntFilter + + """Filter by the object’s `priceCurrencyCode` field.""" + priceCurrencyCode: CrunchbaseCurrencyCodeFilter + + """Filter by the object’s `price` field.""" + price: CrunchbaseBigIntFilter + + """Filter by the object’s `webPath` field.""" + webPath: CrunchbaseStringFilter + + """Filter by the object’s `apiPath` field.""" + apiPath: CrunchbaseStringFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `Acquisition` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyAcquisitionFilter { + """ + No related `Acquisition` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseAcquisitionFilter + + """ + Some related `Acquisition` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseAcquisitionFilter + + """ + Every related `Acquisition` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseAcquisitionFilter +} + +""" +A filter to be used against many `Investment` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyInvestmentFilter { + """ + No related `Investment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseInvestmentFilter + + """ + Some related `Investment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseInvestmentFilter + + """ + Every related `Investment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseInvestmentFilter +} + +""" +A filter to be used against many `FundingRound` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyFundingRoundFilter { + """ + No related `FundingRound` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseFundingRoundFilter + + """ + Some related `FundingRound` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseFundingRoundFilter + + """ + Every related `FundingRound` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseFundingRoundFilter +} + +""" +A filter to be used against many `Fund` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyFundFilter { + """ + No related `Fund` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseFundFilter + + """ + Some related `Fund` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseFundFilter + + """ + Every related `Fund` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseFundFilter +} + +""" +A filter to be used against many `Job` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyJobFilter { + """ + No related `Job` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseJobFilter + + """ + Some related `Job` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseJobFilter + + """ + Every related `Job` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseJobFilter +} + +""" +A filter to be used against many `Person` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseImageToManyPersonFilter { + """ + No related `Person` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbasePersonFilter + + """ + Some related `Person` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbasePersonFilter + + """ + Every related `Person` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbasePersonFilter +} + +""" +A filter to be used against many `Organization` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseImageToManyOrganizationFilter { + """ + No related `Organization` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationFilter + + """ + Some related `Organization` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationFilter + + """ + Every related `Organization` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationFilter +} + +""" +A filter to be used against `Image` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseImageFilter { + """Negates the expression.""" + not: CrunchbaseImageFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseImageFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseImageFilter!] + + """Some related `peopleByPrimaryImageId` exist.""" + peopleByPrimaryImageIdExist: Boolean + + """Filter by the object’s `peopleByPrimaryImageId` relation.""" + peopleByPrimaryImageId: CrunchbaseImageToManyPersonFilter + + """Some related `organizations` exist.""" + organizationsExist: Boolean + + """Filter by the object’s `organizations` relation.""" + organizations: CrunchbaseImageToManyOrganizationFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `filesize` field.""" + filesize: CrunchbaseIntFilter + + """Filter by the object’s `width` field.""" + width: CrunchbaseIntFilter + + """Filter by the object’s `height` field.""" + height: CrunchbaseIntFilter + + """Filter by the object’s `contentType` field.""" + contentType: CrunchbaseStringFilter + + """Filter by the object’s `assetUrl` field.""" + assetUrl: CrunchbaseStringFilter + + """Filter by the object’s `assetPath` field.""" + assetPath: CrunchbaseStringFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `Person` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseLocationToManyPersonFilter { + """ + No related `Person` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbasePersonFilter + + """ + Some related `Person` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbasePersonFilter + + """ + Every related `Person` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbasePersonFilter +} + +""" +A filter to be used against many `Location` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseLocationToManyLocationFilter { + """ + No related `Location` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseLocationFilter + + """ + Some related `Location` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseLocationFilter + + """ + Every related `Location` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseLocationFilter +} + +enum CrunchbaseLocationType { + CITY + REGION + COUNTRY + GROUP + CONTINENT +} + +""" +A filter to be used against LocationType fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseLocationTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: CrunchbaseLocationType + + """Greater than the specified value.""" + greaterThan: CrunchbaseLocationType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: CrunchbaseLocationType + + """Less than the specified value.""" + lessThan: CrunchbaseLocationType + + """Not included in the specified list.""" + notIn: [CrunchbaseLocationType!] + + """Included in the specified list.""" + in: [CrunchbaseLocationType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: CrunchbaseLocationType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: CrunchbaseLocationType + + """Not equal to the specified value.""" + notEqualTo: CrunchbaseLocationType + + """Equal to the specified value.""" + equalTo: CrunchbaseLocationType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Location` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseLocationFilter { + """Negates the expression.""" + not: CrunchbaseLocationFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseLocationFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseLocationFilter!] + + """A related `parentLocation` exists.""" + parentLocationExists: Boolean + + """Filter by the object’s `parentLocation` relation.""" + parentLocation: CrunchbaseLocationFilter + + """Some related `peopleByPrimaryLocationId` exist.""" + peopleByPrimaryLocationIdExist: Boolean + + """Filter by the object’s `peopleByPrimaryLocationId` relation.""" + peopleByPrimaryLocationId: CrunchbaseLocationToManyPersonFilter + + """Some related `subLocations` exist.""" + subLocationsExist: Boolean + + """Filter by the object’s `subLocations` relation.""" + subLocations: CrunchbaseLocationToManyLocationFilter + + """Filter by the object’s `continent` field.""" + continent: CrunchbaseStringFilter + + """Filter by the object’s `countryCode3` field.""" + countryCode3: CrunchbaseStringFilter + + """Filter by the object’s `countryCode2` field.""" + countryCode2: CrunchbaseStringFilter + + """Filter by the object’s `country` field.""" + country: CrunchbaseStringFilter + + """Filter by the object’s `regionCode2` field.""" + regionCode2: CrunchbaseStringFilter + + """Filter by the object’s `region` field.""" + region: CrunchbaseStringFilter + + """Filter by the object’s `city` field.""" + city: CrunchbaseStringFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `parentLocationId` field.""" + parentLocationId: CrunchbaseUUIDFilter + + """Filter by the object’s `locationType` field.""" + locationType: CrunchbaseLocationTypeFilter + + """Filter by the object’s `name` field.""" + name: CrunchbaseStringFilter + + """Filter by the object’s `webPath` field.""" + webPath: CrunchbaseStringFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `FundInvestor` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseFundToManyFundInvestorFilter { + """ + No related `FundInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseFundInvestorFilter + + """ + Some related `FundInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseFundInvestorFilter + + """ + Every related `FundInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseFundInvestorFilter +} + +""" +A filter to be used against `Fund` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseFundFilter { + """Negates the expression.""" + not: CrunchbaseFundFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseFundFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseFundFilter!] + + """A related `ventureFirm` exists.""" + ventureFirmExists: Boolean + + """Filter by the object’s `ventureFirm` relation.""" + ventureFirm: CrunchbaseOrganizationFilter + + """Some related `fundInvestors` exist.""" + fundInvestorsExist: Boolean + + """Filter by the object’s `fundInvestors` relation.""" + fundInvestors: CrunchbaseFundToManyFundInvestorFilter + + """Filter by the object’s `ventureFirmId` field.""" + ventureFirmId: CrunchbaseUUIDFilter + + """Filter by the object’s `apiUrl` field.""" + apiUrl: CrunchbaseStringFilter + + """Filter by the object’s `permalink` field.""" + permalink: CrunchbaseStringFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `moneyRaisedUsd` field.""" + moneyRaisedUsd: CrunchbaseBigIntFilter + + """Filter by the object’s `moneyRaisedCurrencyCode` field.""" + moneyRaisedCurrencyCode: CrunchbaseCurrencyCodeFilter + + """Filter by the object’s `moneyRaised` field.""" + moneyRaised: CrunchbaseBigIntFilter + + """Filter by the object’s `announcedOnTrustCode` field.""" + announcedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `announcedOn` field.""" + announcedOn: CrunchbaseDateFilter + + """Filter by the object’s `name` field.""" + name: CrunchbaseStringFilter + + """Filter by the object’s `webPath` field.""" + webPath: CrunchbaseStringFilter + + """Filter by the object’s `apiPath` field.""" + apiPath: CrunchbaseStringFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against `FundInvestor` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseFundInvestorFilter { + """Negates the expression.""" + not: CrunchbaseFundInvestorFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseFundInvestorFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseFundInvestorFilter!] + + """A related `person` exists.""" + personExists: Boolean + + """Filter by the object’s `person` relation.""" + person: CrunchbasePersonFilter + + """A related `organization` exists.""" + organizationExists: Boolean + + """Filter by the object’s `organization` relation.""" + organization: CrunchbaseOrganizationFilter + + """Filter by the object’s `fund` relation.""" + fund: CrunchbaseFundFilter + + """Filter by the object’s `personId` field.""" + personId: CrunchbaseUUIDFilter + + """Filter by the object’s `organizationId` field.""" + organizationId: CrunchbaseUUIDFilter + + """Filter by the object’s `fundId` field.""" + fundId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `FundInvestor` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbasePersonToManyFundInvestorFilter { + """ + No related `FundInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseFundInvestorFilter + + """ + Some related `FundInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseFundInvestorFilter + + """ + Every related `FundInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseFundInvestorFilter +} + +""" +A filter to be used against many `PersonAdvisorRole` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbasePersonToManyPersonAdvisorRoleFilter { + """ + No related `PersonAdvisorRole` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbasePersonAdvisorRoleFilter + + """ + Some related `PersonAdvisorRole` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbasePersonAdvisorRoleFilter + + """ + Every related `PersonAdvisorRole` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbasePersonAdvisorRoleFilter +} + +""" +A filter to be used against many `InvestmentPartner` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbasePersonToManyInvestmentPartnerFilter { + """ + No related `InvestmentPartner` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseInvestmentPartnerFilter + + """ + Some related `InvestmentPartner` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseInvestmentPartnerFilter + + """ + Every related `InvestmentPartner` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseInvestmentPartnerFilter +} + +""" +A filter to be used against many `InvestmentInvestor` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbasePersonToManyInvestmentInvestorFilter { + """ + No related `InvestmentInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseInvestmentInvestorFilter + + """ + Some related `InvestmentInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseInvestmentInvestorFilter + + """ + Every related `InvestmentInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseInvestmentInvestorFilter +} + +""" +A filter to be used against `OrganizationFounder` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationFounderFilter { + """Negates the expression.""" + not: CrunchbaseOrganizationFounderFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseOrganizationFounderFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseOrganizationFounderFilter!] + + """Filter by the object’s `person` relation.""" + person: CrunchbasePersonFilter + + """Filter by the object’s `organization` relation.""" + organization: CrunchbaseOrganizationFilter + + """Filter by the object’s `personId` field.""" + personId: CrunchbaseUUIDFilter + + """Filter by the object’s `organizationId` field.""" + organizationId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `OrganizationFounder` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbasePersonToManyOrganizationFounderFilter { + """ + No related `OrganizationFounder` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationFounderFilter + + """ + Some related `OrganizationFounder` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationFounderFilter + + """ + Every related `OrganizationFounder` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationFounderFilter +} + +""" +A filter to be used against many `FundingRoundInvestment` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseFundingRoundToManyFundingRoundInvestmentFilter { + """ + No related `FundingRoundInvestment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseFundingRoundInvestmentFilter + + """ + Some related `FundingRoundInvestment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseFundingRoundInvestmentFilter + + """ + Every related `FundingRoundInvestment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseFundingRoundInvestmentFilter +} + +""" +A filter to be used against many `Investment` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseFundingRoundToManyInvestmentFilter { + """ + No related `Investment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseInvestmentFilter + + """ + Some related `Investment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseInvestmentFilter + + """ + Every related `Investment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseInvestmentFilter +} + +enum CrunchbaseFundingType { + PRE_SEED + SEED + ANGEL + VENTURE + EQUITY_CROWDFUNDING + PRODUCT_CROWDFUNDING + PRIVATE_EQUITY + CONVERTIBLE_NOTE + DEBT_FINANCING + SECONDARY_MARKET + GRANT + POST_IPO_EQUITY + POST_IPO_DEBT + NON_EQUITY_ASSISTANCE + UNDISCLOSED + CORPORATE_ROUND + INITIAL_COIN_OFFERING + POST_IPO_SECONDARY + SERIES_A + SERIES_B + SERIES_C + SERIES_D + SERIES_E + SERIES_F + SERIES_G + SERIES_H + SERIES_I + SERIES_J + SERIES_UNKNOWN +} + +""" +A filter to be used against FundingType fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseFundingTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: CrunchbaseFundingType + + """Greater than the specified value.""" + greaterThan: CrunchbaseFundingType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: CrunchbaseFundingType + + """Less than the specified value.""" + lessThan: CrunchbaseFundingType + + """Not included in the specified list.""" + notIn: [CrunchbaseFundingType!] + + """Included in the specified list.""" + in: [CrunchbaseFundingType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: CrunchbaseFundingType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: CrunchbaseFundingType + + """Not equal to the specified value.""" + notEqualTo: CrunchbaseFundingType + + """Equal to the specified value.""" + equalTo: CrunchbaseFundingType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `FundingRound` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseFundingRoundFilter { + """Negates the expression.""" + not: CrunchbaseFundingRoundFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseFundingRoundFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseFundingRoundFilter!] + + """A related `fundedOrganization` exists.""" + fundedOrganizationExists: Boolean + + """Filter by the object’s `fundedOrganization` relation.""" + fundedOrganization: CrunchbaseOrganizationFilter + + """Some related `fundingRoundInvestments` exist.""" + fundingRoundInvestmentsExist: Boolean + + """Filter by the object’s `fundingRoundInvestments` relation.""" + fundingRoundInvestments: CrunchbaseFundingRoundToManyFundingRoundInvestmentFilter + + """Some related `investments` exist.""" + investmentsExist: Boolean + + """Filter by the object’s `investments` relation.""" + investments: CrunchbaseFundingRoundToManyInvestmentFilter + + """Filter by the object’s `fundedOrganizationId` field.""" + fundedOrganizationId: CrunchbaseUUIDFilter + + """Filter by the object’s `rank` field.""" + rank: CrunchbaseIntFilter + + """Filter by the object’s `preMoneyValuationUsd` field.""" + preMoneyValuationUsd: CrunchbaseBigIntFilter + + """Filter by the object’s `preMoneyValuationCurrencyCode` field.""" + preMoneyValuationCurrencyCode: CrunchbaseCurrencyCodeFilter + + """Filter by the object’s `preMoneyValuation` field.""" + preMoneyValuation: CrunchbaseBigIntFilter + + """Filter by the object’s `apiUrl` field.""" + apiUrl: CrunchbaseStringFilter + + """Filter by the object’s `permalink` field.""" + permalink: CrunchbaseStringFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `targetMoneyRaisedUsd` field.""" + targetMoneyRaisedUsd: CrunchbaseBigIntFilter + + """Filter by the object’s `targetMoneyRaisedCurrencyCode` field.""" + targetMoneyRaisedCurrencyCode: CrunchbaseCurrencyCodeFilter + + """Filter by the object’s `targetMoneyRaised` field.""" + targetMoneyRaised: CrunchbaseBigIntFilter + + """Filter by the object’s `moneyRaisedUsd` field.""" + moneyRaisedUsd: CrunchbaseBigIntFilter + + """Filter by the object’s `moneyRaisedCurrencyCode` field.""" + moneyRaisedCurrencyCode: CrunchbaseCurrencyCodeFilter + + """Filter by the object’s `moneyRaised` field.""" + moneyRaised: CrunchbaseBigIntFilter + + """Filter by the object’s `closedOnTrustCode` field.""" + closedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `closedOn` field.""" + closedOn: CrunchbaseDateFilter + + """Filter by the object’s `announcedOnTrustCode` field.""" + announcedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `announcedOn` field.""" + announcedOn: CrunchbaseDateFilter + + """Filter by the object’s `seriesQualifier` field.""" + seriesQualifier: CrunchbaseStringFilter + + """Filter by the object’s `series` field.""" + series: CrunchbaseStringFilter + + """Filter by the object’s `fundingType` field.""" + fundingType: CrunchbaseFundingTypeFilter + + """Filter by the object’s `webPath` field.""" + webPath: CrunchbaseStringFilter + + """Filter by the object’s `apiPath` field.""" + apiPath: CrunchbaseStringFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against `FundingRoundInvestment` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseFundingRoundInvestmentFilter { + """Negates the expression.""" + not: CrunchbaseFundingRoundInvestmentFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseFundingRoundInvestmentFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseFundingRoundInvestmentFilter!] + + """A related `investment` exists.""" + investmentExists: Boolean + + """Filter by the object’s `investment` relation.""" + investment: CrunchbaseInvestmentFilter + + """Filter by the object’s `fundingRound` relation.""" + fundingRound: CrunchbaseFundingRoundFilter + + """Filter by the object’s `investmentId` field.""" + investmentId: CrunchbaseUUIDFilter + + """Filter by the object’s `fundingRoundId` field.""" + fundingRoundId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `FundingRoundInvestment` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseInvestmentToManyFundingRoundInvestmentFilter { + """ + No related `FundingRoundInvestment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseFundingRoundInvestmentFilter + + """ + Some related `FundingRoundInvestment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseFundingRoundInvestmentFilter + + """ + Every related `FundingRoundInvestment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseFundingRoundInvestmentFilter +} + +""" +A filter to be used against `InvestmentPartner` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseInvestmentPartnerFilter { + """Negates the expression.""" + not: CrunchbaseInvestmentPartnerFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseInvestmentPartnerFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseInvestmentPartnerFilter!] + + """A related `partner` exists.""" + partnerExists: Boolean + + """Filter by the object’s `partner` relation.""" + partner: CrunchbasePersonFilter + + """Filter by the object’s `investment` relation.""" + investment: CrunchbaseInvestmentFilter + + """Filter by the object’s `partnerId` field.""" + partnerId: CrunchbaseUUIDFilter + + """Filter by the object’s `investmentId` field.""" + investmentId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `InvestmentPartner` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseInvestmentToManyInvestmentPartnerFilter { + """ + No related `InvestmentPartner` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseInvestmentPartnerFilter + + """ + Some related `InvestmentPartner` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseInvestmentPartnerFilter + + """ + Every related `InvestmentPartner` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseInvestmentPartnerFilter +} + +""" +A filter to be used against `InvestmentInvestor` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseInvestmentInvestorFilter { + """Negates the expression.""" + not: CrunchbaseInvestmentInvestorFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseInvestmentInvestorFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseInvestmentInvestorFilter!] + + """A related `investorPerson` exists.""" + investorPersonExists: Boolean + + """Filter by the object’s `investorPerson` relation.""" + investorPerson: CrunchbasePersonFilter + + """A related `investorOrganization` exists.""" + investorOrganizationExists: Boolean + + """Filter by the object’s `investorOrganization` relation.""" + investorOrganization: CrunchbaseOrganizationFilter + + """Filter by the object’s `investment` relation.""" + investment: CrunchbaseInvestmentFilter + + """Filter by the object’s `investorPersonId` field.""" + investorPersonId: CrunchbaseUUIDFilter + + """Filter by the object’s `investorOrganizationId` field.""" + investorOrganizationId: CrunchbaseUUIDFilter + + """Filter by the object’s `investmentId` field.""" + investmentId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `InvestmentInvestor` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseInvestmentToManyInvestmentInvestorFilter { + """ + No related `InvestmentInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseInvestmentInvestorFilter + + """ + Some related `InvestmentInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseInvestmentInvestorFilter + + """ + Every related `InvestmentInvestor` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseInvestmentInvestorFilter +} + +enum CrunchbaseCurrencyCode { + AED + AFN + ALL + AMD + ANG + AOA + ARS + AUD + AWG + AZN + BAM + BBD + BDT + BGN + BHD + BIF + BMD + BND + BOB + BRL + BSD + BTC + BTN + BWP + BYR + BZD + CAD + CDF + CHF + CLF + CLP + CNY + COP + CRC + CUC + CUP + CVE + CZK + DJF + DKK + DOP + DZD + EEK + EGP + ERN + ETB + EUR + FJD + FKP + GBP + GEL + GGP + GHS + GIP + GMD + GNF + GTQ + GYD + HKD + HNL + HRK + HTG + HUF + IDR + ILS + IMP + INR + IQD + IRR + ISK + JEP + JMD + JOD + JPY + KES + KGS + KHR + KMF + KPW + KRW + KWD + KYD + KZT + LAK + LBP + LKR + LRD + LSL + LTL + LVL + LYD + MAD + MDL + MGA + MKD + MMK + MNT + MOP + MRO + MTL + MUR + MVR + MWK + MXN + MYR + MZN + NAD + NGN + NIO + NOK + NPR + NZD + OMR + PAB + PEN + PGK + PHP + PKR + PLN + PYG + QAR + RON + RSD + RUB + RWF + SAR + SBD + SCR + SDG + SEK + SGD + SHP + SKK + SLL + SOS + SPL_ASTERISK + SRD + STD + SVC + SYP + SZL + THB + TJS + TMT + TND + TOP + TRY + TTD + TVD + TWD + TZS + UAH + UGX + USD + UYU + UZS + VEF + VND + VUV + WST + XAF + XAG + XAU + XCD + XDR + XOF + XPF + YER + ZAR + ZMK + ZMW + ZWD + ZWL +} + +""" +A filter to be used against CurrencyCode fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseCurrencyCodeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: CrunchbaseCurrencyCode + + """Greater than the specified value.""" + greaterThan: CrunchbaseCurrencyCode + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: CrunchbaseCurrencyCode + + """Less than the specified value.""" + lessThan: CrunchbaseCurrencyCode + + """Not included in the specified list.""" + notIn: [CrunchbaseCurrencyCode!] + + """Included in the specified list.""" + in: [CrunchbaseCurrencyCode!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: CrunchbaseCurrencyCode + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: CrunchbaseCurrencyCode + + """Not equal to the specified value.""" + notEqualTo: CrunchbaseCurrencyCode + + """Equal to the specified value.""" + equalTo: CrunchbaseCurrencyCode + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Investment` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseInvestmentFilter { + """Negates the expression.""" + not: CrunchbaseInvestmentFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseInvestmentFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseInvestmentFilter!] + + """A related `investedInOrganization` exists.""" + investedInOrganizationExists: Boolean + + """Filter by the object’s `investedInOrganization` relation.""" + investedInOrganization: CrunchbaseOrganizationFilter + + """A related `investedInPerson` exists.""" + investedInPersonExists: Boolean + + """Filter by the object’s `investedInPerson` relation.""" + investedInPerson: CrunchbasePersonFilter + + """A related `fundingRound` exists.""" + fundingRoundExists: Boolean + + """Filter by the object’s `fundingRound` relation.""" + fundingRound: CrunchbaseFundingRoundFilter + + """Some related `fundingRoundInvestments` exist.""" + fundingRoundInvestmentsExist: Boolean + + """Filter by the object’s `fundingRoundInvestments` relation.""" + fundingRoundInvestments: CrunchbaseInvestmentToManyFundingRoundInvestmentFilter + + """Some related `omit` exist.""" + omitExist: Boolean + + """Filter by the object’s `omit` relation.""" + omit: CrunchbaseInvestmentToManyInvestmentPartnerFilter + + """Some related `investmentInvestors` exist.""" + investmentInvestorsExist: Boolean + + """Filter by the object’s `investmentInvestors` relation.""" + investmentInvestors: CrunchbaseInvestmentToManyInvestmentInvestorFilter + + """Filter by the object’s `investedInOrganizationId` field.""" + investedInOrganizationId: CrunchbaseUUIDFilter + + """Filter by the object’s `investedInPersonId` field.""" + investedInPersonId: CrunchbaseUUIDFilter + + """Filter by the object’s `fundingRoundId` field.""" + fundingRoundId: CrunchbaseUUIDFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `announcedOnTrustCode` field.""" + announcedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `announcedOn` field.""" + announcedOn: CrunchbaseDateFilter + + """Filter by the object’s `isLeadInvestor` field.""" + isLeadInvestor: CrunchbaseBooleanFilter + + """Filter by the object’s `moneyInvestedUsd` field.""" + moneyInvestedUsd: CrunchbaseBigIntFilter + + """Filter by the object’s `moneyInvestedCurrencyCode` field.""" + moneyInvestedCurrencyCode: CrunchbaseCurrencyCodeFilter + + """Filter by the object’s `moneyInvested` field.""" + moneyInvested: CrunchbaseBigIntFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `Investment` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbasePersonToManyInvestmentFilter { + """ + No related `Investment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseInvestmentFilter + + """ + Some related `Investment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseInvestmentFilter + + """ + Every related `Investment` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseInvestmentFilter +} + +""" +A filter to be used against `PersonAdvisorRole` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbasePersonAdvisorRoleFilter { + """Negates the expression.""" + not: CrunchbasePersonAdvisorRoleFilter + + """Checks for any expressions in this list.""" + or: [CrunchbasePersonAdvisorRoleFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbasePersonAdvisorRoleFilter!] + + """Filter by the object’s `job` relation.""" + job: CrunchbaseJobFilter + + """Filter by the object’s `person` relation.""" + person: CrunchbasePersonFilter + + """Filter by the object’s `jobId` field.""" + jobId: CrunchbaseUUIDFilter + + """Filter by the object’s `personId` field.""" + personId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `PersonAdvisorRole` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseJobToManyPersonAdvisorRoleFilter { + """ + No related `PersonAdvisorRole` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbasePersonAdvisorRoleFilter + + """ + Some related `PersonAdvisorRole` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbasePersonAdvisorRoleFilter + + """ + Every related `PersonAdvisorRole` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbasePersonAdvisorRoleFilter +} + +""" +A filter to be used against `OrganizationBoardAndAdvisorMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationBoardAndAdvisorMemberFilter { + """Negates the expression.""" + not: CrunchbaseOrganizationBoardAndAdvisorMemberFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseOrganizationBoardAndAdvisorMemberFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseOrganizationBoardAndAdvisorMemberFilter!] + + """Filter by the object’s `job` relation.""" + job: CrunchbaseJobFilter + + """Filter by the object’s `organization` relation.""" + organization: CrunchbaseOrganizationFilter + + """Filter by the object’s `jobId` field.""" + jobId: CrunchbaseUUIDFilter + + """Filter by the object’s `organizationId` field.""" + organizationId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `OrganizationBoardAndAdvisorMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseJobToManyOrganizationBoardAndAdvisorMemberFilter { + """ + No related `OrganizationBoardAndAdvisorMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationBoardAndAdvisorMemberFilter + + """ + Some related `OrganizationBoardAndAdvisorMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationBoardAndAdvisorMemberFilter + + """ + Every related `OrganizationBoardAndAdvisorMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationBoardAndAdvisorMemberFilter +} + +""" +A filter to be used against `OrganizationPastTeamMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationPastTeamMemberFilter { + """Negates the expression.""" + not: CrunchbaseOrganizationPastTeamMemberFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseOrganizationPastTeamMemberFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseOrganizationPastTeamMemberFilter!] + + """Filter by the object’s `job` relation.""" + job: CrunchbaseJobFilter + + """Filter by the object’s `organization` relation.""" + organization: CrunchbaseOrganizationFilter + + """Filter by the object’s `jobId` field.""" + jobId: CrunchbaseUUIDFilter + + """Filter by the object’s `organizationId` field.""" + organizationId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `OrganizationPastTeamMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseJobToManyOrganizationPastTeamMemberFilter { + """ + No related `OrganizationPastTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationPastTeamMemberFilter + + """ + Some related `OrganizationPastTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationPastTeamMemberFilter + + """ + Every related `OrganizationPastTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationPastTeamMemberFilter +} + +""" +A filter to be used against `OrganizationFeaturedTeamMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationFeaturedTeamMemberFilter { + """Negates the expression.""" + not: CrunchbaseOrganizationFeaturedTeamMemberFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseOrganizationFeaturedTeamMemberFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseOrganizationFeaturedTeamMemberFilter!] + + """Filter by the object’s `job` relation.""" + job: CrunchbaseJobFilter + + """Filter by the object’s `organization` relation.""" + organization: CrunchbaseOrganizationFilter + + """Filter by the object’s `jobId` field.""" + jobId: CrunchbaseUUIDFilter + + """Filter by the object’s `organizationId` field.""" + organizationId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `OrganizationFeaturedTeamMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseJobToManyOrganizationFeaturedTeamMemberFilter { + """ + No related `OrganizationFeaturedTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationFeaturedTeamMemberFilter + + """ + Some related `OrganizationFeaturedTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationFeaturedTeamMemberFilter + + """ + Every related `OrganizationFeaturedTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationFeaturedTeamMemberFilter +} + +""" +A filter to be used against `OrganizationCurrentTeamMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationCurrentTeamMemberFilter { + """Negates the expression.""" + not: CrunchbaseOrganizationCurrentTeamMemberFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseOrganizationCurrentTeamMemberFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseOrganizationCurrentTeamMemberFilter!] + + """Filter by the object’s `job` relation.""" + job: CrunchbaseJobFilter + + """Filter by the object’s `organization` relation.""" + organization: CrunchbaseOrganizationFilter + + """Filter by the object’s `jobId` field.""" + jobId: CrunchbaseUUIDFilter + + """Filter by the object’s `organizationId` field.""" + organizationId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `OrganizationCurrentTeamMember` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseJobToManyOrganizationCurrentTeamMemberFilter { + """ + No related `OrganizationCurrentTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationCurrentTeamMemberFilter + + """ + Some related `OrganizationCurrentTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationCurrentTeamMemberFilter + + """ + Every related `OrganizationCurrentTeamMember` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationCurrentTeamMemberFilter +} + +""" +A filter to be used against `Job` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseJobFilter { + """Negates the expression.""" + not: CrunchbaseJobFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseJobFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseJobFilter!] + + """A related `organization` exists.""" + organizationExists: Boolean + + """Filter by the object’s `organization` relation.""" + organization: CrunchbaseOrganizationFilter + + """A related `person` exists.""" + personExists: Boolean + + """Filter by the object’s `person` relation.""" + person: CrunchbasePersonFilter + + """Some related `personAdvisorRoles` exist.""" + personAdvisorRolesExist: Boolean + + """Filter by the object’s `personAdvisorRoles` relation.""" + personAdvisorRoles: CrunchbaseJobToManyPersonAdvisorRoleFilter + + """Some related `organizationBoardAndAdvisorMembers` exist.""" + organizationBoardAndAdvisorMembersExist: Boolean + + """Filter by the object’s `organizationBoardAndAdvisorMembers` relation.""" + organizationBoardAndAdvisorMembers: CrunchbaseJobToManyOrganizationBoardAndAdvisorMemberFilter + + """Some related `organizationPastTeamMembers` exist.""" + organizationPastTeamMembersExist: Boolean + + """Filter by the object’s `organizationPastTeamMembers` relation.""" + organizationPastTeamMembers: CrunchbaseJobToManyOrganizationPastTeamMemberFilter + + """Some related `organizationFeaturedTeamMembers` exist.""" + organizationFeaturedTeamMembersExist: Boolean + + """Filter by the object’s `organizationFeaturedTeamMembers` relation.""" + organizationFeaturedTeamMembers: CrunchbaseJobToManyOrganizationFeaturedTeamMemberFilter + + """Some related `organizationCurrentTeamMembers` exist.""" + organizationCurrentTeamMembersExist: Boolean + + """Filter by the object’s `organizationCurrentTeamMembers` relation.""" + organizationCurrentTeamMembers: CrunchbaseJobToManyOrganizationCurrentTeamMemberFilter + + """Filter by the object’s `organizationId` field.""" + organizationId: CrunchbaseUUIDFilter + + """Filter by the object’s `personId` field.""" + personId: CrunchbaseUUIDFilter + + """Filter by the object’s `jobType` field.""" + jobType: CrunchbaseStringFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `endedOnTrustCode` field.""" + endedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `endedOn` field.""" + endedOn: CrunchbaseDateFilter + + """Filter by the object’s `startedOnTrustCode` field.""" + startedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `startedOn` field.""" + startedOn: CrunchbaseDateFilter + + """Filter by the object’s `isPrimary` field.""" + isPrimary: CrunchbaseBooleanFilter + + """Filter by the object’s `isCurrent` field.""" + isCurrent: CrunchbaseBooleanFilter + + """Filter by the object’s `title` field.""" + title: CrunchbaseStringFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `Job` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbasePersonToManyJobFilter { + """ + No related `Job` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseJobFilter + + """ + Some related `Job` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseJobFilter + + """ + Every related `Job` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseJobFilter +} + +""" +A filter to be used against many `Degree` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbasePersonToManyDegreeFilter { + """ + No related `Degree` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseDegreeFilter + + """ + Some related `Degree` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseDegreeFilter + + """ + Every related `Degree` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseDegreeFilter +} + +""" +A filter to be used against `Person` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbasePersonFilter { + """Negates the expression.""" + not: CrunchbasePersonFilter + + """Checks for any expressions in this list.""" + or: [CrunchbasePersonFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbasePersonFilter!] + + """A related `primaryImage` exists.""" + primaryImageExists: Boolean + + """Filter by the object’s `primaryImage` relation.""" + primaryImage: CrunchbaseImageFilter + + """A related `primaryLocation` exists.""" + primaryLocationExists: Boolean + + """Filter by the object’s `primaryLocation` relation.""" + primaryLocation: CrunchbaseLocationFilter + + """Some related `fundInvestors` exist.""" + fundInvestorsExist: Boolean + + """Filter by the object’s `fundInvestors` relation.""" + fundInvestors: CrunchbasePersonToManyFundInvestorFilter + + """Some related `personAdvisorRoles` exist.""" + personAdvisorRolesExist: Boolean + + """Filter by the object’s `personAdvisorRoles` relation.""" + personAdvisorRoles: CrunchbasePersonToManyPersonAdvisorRoleFilter + + """Some related `investmentPartnersByPartnerId` exist.""" + investmentPartnersByPartnerIdExist: Boolean + + """Filter by the object’s `investmentPartnersByPartnerId` relation.""" + investmentPartnersByPartnerId: CrunchbasePersonToManyInvestmentPartnerFilter + + """Some related `investmentInvestorsByInvestorPersonId` exist.""" + investmentInvestorsByInvestorPersonIdExist: Boolean + + """ + Filter by the object’s `investmentInvestorsByInvestorPersonId` relation. + """ + investmentInvestorsByInvestorPersonId: CrunchbasePersonToManyInvestmentInvestorFilter + + """Some related `organizationFounders` exist.""" + organizationFoundersExist: Boolean + + """Filter by the object’s `organizationFounders` relation.""" + organizationFounders: CrunchbasePersonToManyOrganizationFounderFilter + + """Some related `investmentsAsInvestee` exist.""" + investmentsAsInvesteeExist: Boolean + + """Filter by the object’s `investmentsAsInvestee` relation.""" + investmentsAsInvestee: CrunchbasePersonToManyInvestmentFilter + + """Some related `jobs` exist.""" + jobsExist: Boolean + + """Filter by the object’s `jobs` relation.""" + jobs: CrunchbasePersonToManyJobFilter + + """Some related `degrees` exist.""" + degreesExist: Boolean + + """Filter by the object’s `degrees` relation.""" + degrees: CrunchbasePersonToManyDegreeFilter + + """Filter by the object’s `primaryImageId` field.""" + primaryImageId: CrunchbaseUUIDFilter + + """Filter by the object’s `primaryLocationId` field.""" + primaryLocationId: CrunchbaseUUIDFilter + + """Filter by the object’s `rank` field.""" + rank: CrunchbaseIntFilter + + """Filter by the object’s `gender` field.""" + gender: CrunchbaseStringFilter + + """Filter by the object’s `permalinkAliases` field.""" + permalinkAliases: CrunchbaseStringListFilter + + """Filter by the object’s `apiUrl` field.""" + apiUrl: CrunchbaseStringFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `diedOnTrustCode` field.""" + diedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `diedOn` field.""" + diedOn: CrunchbaseDateFilter + + """Filter by the object’s `bornOnTrustCode` field.""" + bornOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `bornOn` field.""" + bornOn: CrunchbaseDateFilter + + """Filter by the object’s `roleInvestor` field.""" + roleInvestor: CrunchbaseBooleanFilter + + """Filter by the object’s `profileImageUrl` field.""" + profileImageUrl: CrunchbaseStringFilter + + """Filter by the object’s `bio` field.""" + bio: CrunchbaseStringFilter + + """Filter by the object’s `alsoKnownAs` field.""" + alsoKnownAs: CrunchbaseStringListFilter + + """Filter by the object’s `lastName` field.""" + lastName: CrunchbaseStringFilter + + """Filter by the object’s `firstName` field.""" + firstName: CrunchbaseStringFilter + + """Filter by the object’s `webPath` field.""" + webPath: CrunchbaseStringFilter + + """Filter by the object’s `apiPath` field.""" + apiPath: CrunchbaseStringFilter + + """Filter by the object’s `permalink` field.""" + permalink: CrunchbaseStringFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against `Degree` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseDegreeFilter { + """Negates the expression.""" + not: CrunchbaseDegreeFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseDegreeFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseDegreeFilter!] + + """A related `person` exists.""" + personExists: Boolean + + """Filter by the object’s `person` relation.""" + person: CrunchbasePersonFilter + + """A related `school` exists.""" + schoolExists: Boolean + + """Filter by the object’s `school` relation.""" + school: CrunchbaseOrganizationFilter + + """Filter by the object’s `personId` field.""" + personId: CrunchbaseUUIDFilter + + """Filter by the object’s `schoolId` field.""" + schoolId: CrunchbaseUUIDFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `degreeSubject` field.""" + degreeSubject: CrunchbaseStringFilter + + """Filter by the object’s `degreeTypeName` field.""" + degreeTypeName: CrunchbaseStringFilter + + """Filter by the object’s `completedOnTrustCode` field.""" + completedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `completedOn` field.""" + completedOn: CrunchbaseDateFilter + + """Filter by the object’s `startedOnTrustCode` field.""" + startedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `startedOn` field.""" + startedOn: CrunchbaseDateFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `Degree` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyDegreeFilter { + """ + No related `Degree` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseDegreeFilter + + """ + Some related `Degree` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseDegreeFilter + + """ + Every related `Degree` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseDegreeFilter +} + +""" +A filter to be used against many `OrganizationOffice` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseAddressToManyOrganizationOfficeFilter { + """ + No related `OrganizationOffice` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationOfficeFilter + + """ + Some related `OrganizationOffice` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationOfficeFilter + + """ + Every related `OrganizationOffice` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationOfficeFilter +} + +""" +A filter to be used against many `Organization` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseAddressToManyOrganizationFilter { + """ + No related `Organization` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationFilter + + """ + Some related `Organization` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationFilter + + """ + Every related `Organization` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationFilter +} + +""" +A filter to be used against Float fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseFloatFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Float + + """Greater than the specified value.""" + greaterThan: Float + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: Float + + """Less than the specified value.""" + lessThan: Float + + """Not included in the specified list.""" + notIn: [Float!] + + """Included in the specified list.""" + in: [Float!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: Float + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: Float + + """Not equal to the specified value.""" + notEqualTo: Float + + """Equal to the specified value.""" + equalTo: Float + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Address` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseAddressFilter { + """Negates the expression.""" + not: CrunchbaseAddressFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseAddressFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseAddressFilter!] + + """Some related `organizationOffices` exist.""" + organizationOfficesExist: Boolean + + """Filter by the object’s `organizationOffices` relation.""" + organizationOffices: CrunchbaseAddressToManyOrganizationOfficeFilter + + """Some related `organizationsHeadquartered` exist.""" + organizationsHeadquarteredExist: Boolean + + """Filter by the object’s `organizationsHeadquartered` relation.""" + organizationsHeadquartered: CrunchbaseAddressToManyOrganizationFilter + + """Filter by the object’s `countryCode3` field.""" + countryCode3: CrunchbaseStringFilter + + """Filter by the object’s `countryCode2` field.""" + countryCode2: CrunchbaseStringFilter + + """Filter by the object’s `regionCode2` field.""" + regionCode2: CrunchbaseStringFilter + + """Filter by the object’s `postalCode` field.""" + postalCode: CrunchbaseStringFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `longitude` field.""" + longitude: CrunchbaseFloatFilter + + """Filter by the object’s `latitude` field.""" + latitude: CrunchbaseFloatFilter + + """Filter by the object’s `countryWebPath` field.""" + countryWebPath: CrunchbaseStringFilter + + """Filter by the object’s `country` field.""" + country: CrunchbaseStringFilter + + """Filter by the object’s `regionWebPath` field.""" + regionWebPath: CrunchbaseStringFilter + + """Filter by the object’s `region` field.""" + region: CrunchbaseStringFilter + + """Filter by the object’s `cityWebPath` field.""" + cityWebPath: CrunchbaseStringFilter + + """Filter by the object’s `city` field.""" + city: CrunchbaseStringFilter + + """Filter by the object’s `street2` field.""" + street2: CrunchbaseStringFilter + + """Filter by the object’s `street1` field.""" + street1: CrunchbaseStringFilter + + """Filter by the object’s `name` field.""" + name: CrunchbaseStringFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +""" +A filter to be used against `OrganizationOffice` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationOfficeFilter { + """Negates the expression.""" + not: CrunchbaseOrganizationOfficeFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseOrganizationOfficeFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseOrganizationOfficeFilter!] + + """A related `office` exists.""" + officeExists: Boolean + + """Filter by the object’s `office` relation.""" + office: CrunchbaseAddressFilter + + """A related `organization` exists.""" + organizationExists: Boolean + + """Filter by the object’s `organization` relation.""" + organization: CrunchbaseOrganizationFilter + + """Filter by the object’s `addressId` field.""" + addressId: CrunchbaseUUIDFilter + + """Filter by the object’s `organizationId` field.""" + organizationId: CrunchbaseUUIDFilter +} + +""" +A filter to be used against many `OrganizationOffice` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationToManyOrganizationOfficeFilter { + """ + No related `OrganizationOffice` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + none: CrunchbaseOrganizationOfficeFilter + + """ + Some related `OrganizationOffice` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + some: CrunchbaseOrganizationOfficeFilter + + """ + Every related `OrganizationOffice` matches the filter criteria. All fields are combined with a logical ‘and.’ + """ + every: CrunchbaseOrganizationOfficeFilter +} + +""" +A filter to be used against Datetime fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseDatetimeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Less than the specified value.""" + lessThan: String + + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against BigInt fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseBigIntFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Less than the specified value.""" + lessThan: String + + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against Int fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseIntFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Int + + """Greater than the specified value.""" + greaterThan: Int + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: Int + + """Less than the specified value.""" + lessThan: Int + + """Not included in the specified list.""" + notIn: [Int!] + + """Included in the specified list.""" + in: [Int!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: Int + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: Int + + """Not equal to the specified value.""" + notEqualTo: Int + + """Equal to the specified value.""" + equalTo: Int + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against TrustCode fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseTrustCodeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: CrunchbaseTrustCode + + """Greater than the specified value.""" + greaterThan: CrunchbaseTrustCode + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: CrunchbaseTrustCode + + """Less than the specified value.""" + lessThan: CrunchbaseTrustCode + + """Not included in the specified list.""" + notIn: [CrunchbaseTrustCode!] + + """Included in the specified list.""" + in: [CrunchbaseTrustCode!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: CrunchbaseTrustCode + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: CrunchbaseTrustCode + + """Not equal to the specified value.""" + notEqualTo: CrunchbaseTrustCode + + """Equal to the specified value.""" + equalTo: CrunchbaseTrustCode + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against Date fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseDateFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Less than the specified value.""" + lessThan: String + + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against Boolean fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseBooleanFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Boolean + + """Greater than the specified value.""" + greaterThan: Boolean + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: Boolean + + """Less than the specified value.""" + lessThan: Boolean + + """Not included in the specified list.""" + notIn: [Boolean!] + + """Included in the specified list.""" + in: [Boolean!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: Boolean + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: Boolean + + """Not equal to the specified value.""" + notEqualTo: Boolean + + """Equal to the specified value.""" + equalTo: Boolean + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against OrganizationRole fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationRoleFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: CrunchbaseOrganizationRole + + """Greater than the specified value.""" + greaterThan: CrunchbaseOrganizationRole + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: CrunchbaseOrganizationRole + + """Less than the specified value.""" + lessThan: CrunchbaseOrganizationRole + + """Not included in the specified list.""" + notIn: [CrunchbaseOrganizationRole!] + + """Included in the specified list.""" + in: [CrunchbaseOrganizationRole!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: CrunchbaseOrganizationRole + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: CrunchbaseOrganizationRole + + """Not equal to the specified value.""" + notEqualTo: CrunchbaseOrganizationRole + + """Equal to the specified value.""" + equalTo: CrunchbaseOrganizationRole + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against String List fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseStringListFilter { + """Any array item is greater than or equal to the specified value.""" + anyGreaterThanOrEqualTo: String + + """Any array item is greater than the specified value.""" + anyGreaterThan: String + + """Any array item is less than or equal to the specified value.""" + anyLessThanOrEqualTo: String + + """Any array item is less than the specified value.""" + anyLessThan: String + + """Any array item is not equal to the specified value.""" + anyNotEqualTo: String + + """Any array item is equal to the specified value.""" + anyEqualTo: String + + """Overlaps the specified list of values.""" + overlaps: [String] + + """Contained by the specified list of values.""" + containedBy: [String] + + """Contains the specified list of values.""" + contains: [String] + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: [String] + + """Greater than the specified value.""" + greaterThan: [String] + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: [String] + + """Less than the specified value.""" + lessThan: [String] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: [String] + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: [String] + + """Not equal to the specified value.""" + notEqualTo: [String] + + """Equal to the specified value.""" + equalTo: [String] + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against String fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseStringFilter { + """ + Does not match the specified pattern using the SQL standard's definition of a regular expression. + """ + notSimilarTo: String + + """ + Matches the specified pattern using the SQL standard's definition of a regular expression. + """ + similarTo: String + + """ + Does not match the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + notLikeInsensitive: String + + """ + Matches the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + likeInsensitive: String + + """ + Does not match the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + notLike: String + + """ + Matches the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + like: String + + """Does not end with the specified string (case-insensitive).""" + notEndsWithInsensitive: String + + """Ends with the specified string (case-insensitive).""" + endsWithInsensitive: String + + """Does not end with the specified string (case-sensitive).""" + notEndsWith: String + + """Ends with the specified string (case-sensitive).""" + endsWith: String + + """Does not start with the specified string (case-insensitive).""" + notStartsWithInsensitive: String + + """Starts with the specified string (case-insensitive).""" + startsWithInsensitive: String + + """Does not start with the specified string (case-sensitive).""" + notStartsWith: String + + """Starts with the specified string (case-sensitive).""" + startsWith: String + + """Does not contain the specified string (case-insensitive).""" + notIncludesInsensitive: String + + """Contains the specified string (case-insensitive).""" + includesInsensitive: String + + """Does not contain the specified string (case-sensitive).""" + notIncludes: String + + """Contains the specified string (case-sensitive).""" + includes: String + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Less than the specified value.""" + lessThan: String + + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against UUID fields. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseUUIDFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Less than the specified value.""" + lessThan: String + + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Organization` object types. All fields are combined with a logical ‘and.’ +""" +input CrunchbaseOrganizationFilter { + """Negates the expression.""" + not: CrunchbaseOrganizationFilter + + """Checks for any expressions in this list.""" + or: [CrunchbaseOrganizationFilter!] + + """Checks for all expressions in this list.""" + and: [CrunchbaseOrganizationFilter!] + + """A related `headquarters` exists.""" + headquartersExists: Boolean + + """Filter by the object’s `headquarters` relation.""" + headquarters: CrunchbaseAddressFilter + + """A related `primaryImage` exists.""" + primaryImageExists: Boolean + + """Filter by the object’s `primaryImage` relation.""" + primaryImage: CrunchbaseImageFilter + + """Some related `fundInvestors` exist.""" + fundInvestorsExist: Boolean + + """Filter by the object’s `fundInvestors` relation.""" + fundInvestors: CrunchbaseOrganizationToManyFundInvestorFilter + + """Some related `organizationCategories` exist.""" + organizationCategoriesExist: Boolean + + """Filter by the object’s `organizationCategories` relation.""" + organizationCategories: CrunchbaseOrganizationToManyOrganizationCategoryFilter + + """Some related `organizationOwnersByOwnerOrganizationId` exist.""" + organizationOwnersByOwnerOrganizationIdExist: Boolean + + """ + Filter by the object’s `organizationOwnersByOwnerOrganizationId` relation. + """ + organizationOwnersByOwnerOrganizationId: CrunchbaseOrganizationToManyOrganizationOwnerFilter + + """Some related `organizationOwnersByOwnedOrganizationId` exist.""" + organizationOwnersByOwnedOrganizationIdExist: Boolean + + """ + Filter by the object’s `organizationOwnersByOwnedOrganizationId` relation. + """ + organizationOwnersByOwnedOrganizationId: CrunchbaseOrganizationToManyOrganizationOwnerFilter + + """Some related `investmentInvestorsByInvestorOrganizationId` exist.""" + investmentInvestorsByInvestorOrganizationIdExist: Boolean + + """ + Filter by the object’s `investmentInvestorsByInvestorOrganizationId` relation. + """ + investmentInvestorsByInvestorOrganizationId: CrunchbaseOrganizationToManyInvestmentInvestorFilter + + """Some related `organizationBoardAndAdvisorMembers` exist.""" + organizationBoardAndAdvisorMembersExist: Boolean + + """Filter by the object’s `organizationBoardAndAdvisorMembers` relation.""" + organizationBoardAndAdvisorMembers: CrunchbaseOrganizationToManyOrganizationBoardAndAdvisorMemberFilter + + """Some related `organizationPastTeamMembers` exist.""" + organizationPastTeamMembersExist: Boolean + + """Filter by the object’s `organizationPastTeamMembers` relation.""" + organizationPastTeamMembers: CrunchbaseOrganizationToManyOrganizationPastTeamMemberFilter + + """Some related `organizationFeaturedTeamMembers` exist.""" + organizationFeaturedTeamMembersExist: Boolean + + """Filter by the object’s `organizationFeaturedTeamMembers` relation.""" + organizationFeaturedTeamMembers: CrunchbaseOrganizationToManyOrganizationFeaturedTeamMemberFilter + + """Some related `organizationCurrentTeamMembers` exist.""" + organizationCurrentTeamMembersExist: Boolean + + """Filter by the object’s `organizationCurrentTeamMembers` relation.""" + organizationCurrentTeamMembers: CrunchbaseOrganizationToManyOrganizationCurrentTeamMemberFilter + + """Some related `organizationFounders` exist.""" + organizationFoundersExist: Boolean + + """Filter by the object’s `organizationFounders` relation.""" + organizationFounders: CrunchbaseOrganizationToManyOrganizationFounderFilter + + """Some related `ipos` exist.""" + iposExist: Boolean + + """Filter by the object’s `ipos` relation.""" + ipos: CrunchbaseOrganizationToManyIpoFilter + + """Some related `acquisitionsAsAcquiree` exist.""" + acquisitionsAsAcquireeExist: Boolean + + """Filter by the object’s `acquisitionsAsAcquiree` relation.""" + acquisitionsAsAcquiree: CrunchbaseOrganizationToManyAcquisitionFilter + + """Some related `acquisitionsAsAcquirer` exist.""" + acquisitionsAsAcquirerExist: Boolean + + """Filter by the object’s `acquisitionsAsAcquirer` relation.""" + acquisitionsAsAcquirer: CrunchbaseOrganizationToManyAcquisitionFilter + + """Some related `investmentsAsInvestee` exist.""" + investmentsAsInvesteeExist: Boolean + + """Filter by the object’s `investmentsAsInvestee` relation.""" + investmentsAsInvestee: CrunchbaseOrganizationToManyInvestmentFilter + + """Some related `fundingRounds` exist.""" + fundingRoundsExist: Boolean + + """Filter by the object’s `fundingRounds` relation.""" + fundingRounds: CrunchbaseOrganizationToManyFundingRoundFilter + + """Some related `ventureFirmFunds` exist.""" + ventureFirmFundsExist: Boolean + + """Filter by the object’s `ventureFirmFunds` relation.""" + ventureFirmFunds: CrunchbaseOrganizationToManyFundFilter + + """Some related `jobs` exist.""" + jobsExist: Boolean + + """Filter by the object’s `jobs` relation.""" + jobs: CrunchbaseOrganizationToManyJobFilter + + """Some related `degreesIssued` exist.""" + degreesIssuedExist: Boolean + + """Filter by the object’s `degreesIssued` relation.""" + degreesIssued: CrunchbaseOrganizationToManyDegreeFilter + + """Some related `organizationOffices` exist.""" + organizationOfficesExist: Boolean + + """Filter by the object’s `organizationOffices` relation.""" + organizationOffices: CrunchbaseOrganizationToManyOrganizationOfficeFilter + + """Filter by the object’s `twitterUrl` field.""" + twitterUrl: CrunchbaseStringFilter + + """Filter by the object’s `linkedinUrl` field.""" + linkedinUrl: CrunchbaseStringFilter + + """Filter by the object’s `homepageHostname` field.""" + homepageHostname: CrunchbaseStringFilter + + """Filter by the object’s `facebookUrl` field.""" + facebookUrl: CrunchbaseStringFilter + + """Filter by the object’s `headquartersId` field.""" + headquartersId: CrunchbaseUUIDFilter + + """Filter by the object’s `primaryImageId` field.""" + primaryImageId: CrunchbaseUUIDFilter + + """Filter by the object’s `rank` field.""" + rank: CrunchbaseIntFilter + + """Filter by the object’s `phoneNumber` field.""" + phoneNumber: CrunchbaseStringFilter + + """Filter by the object’s `contactEmail` field.""" + contactEmail: CrunchbaseStringFilter + + """Filter by the object’s `investorType` field.""" + investorType: CrunchbaseStringListFilter + + """Filter by the object’s `apiUrl` field.""" + apiUrl: CrunchbaseStringFilter + + """Filter by the object’s `permalinkAliases` field.""" + permalinkAliases: CrunchbaseStringListFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: CrunchbaseDatetimeFilter + + """Filter by the object’s `homepageUrl` field.""" + homepageUrl: CrunchbaseStringFilter + + """Filter by the object’s `numberOfInvestments` field.""" + numberOfInvestments: CrunchbaseIntFilter + + """Filter by the object’s `stockSymbol` field.""" + stockSymbol: CrunchbaseStringFilter + + """Filter by the object’s `stockExchange` field.""" + stockExchange: CrunchbaseStringFilter + + """Filter by the object’s `totalFundingUsd` field.""" + totalFundingUsd: CrunchbaseBigIntFilter + + """Filter by the object’s `numEmployeesMax` field.""" + numEmployeesMax: CrunchbaseIntFilter + + """Filter by the object’s `numEmployeesMin` field.""" + numEmployeesMin: CrunchbaseIntFilter + + """Filter by the object’s `closedOnTrustCode` field.""" + closedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `closedOn` field.""" + closedOn: CrunchbaseDateFilter + + """Filter by the object’s `isClosed` field.""" + isClosed: CrunchbaseBooleanFilter + + """Filter by the object’s `foundedOnTrustCode` field.""" + foundedOnTrustCode: CrunchbaseTrustCodeFilter + + """Filter by the object’s `foundedOn` field.""" + foundedOn: CrunchbaseDateFilter + + """Filter by the object’s `roleSchool` field.""" + roleSchool: CrunchbaseBooleanFilter + + """Filter by the object’s `roleGroup` field.""" + roleGroup: CrunchbaseBooleanFilter + + """Filter by the object’s `roleInvestor` field.""" + roleInvestor: CrunchbaseBooleanFilter + + """Filter by the object’s `roleCompany` field.""" + roleCompany: CrunchbaseBooleanFilter + + """Filter by the object’s `primaryRole` field.""" + primaryRole: CrunchbaseOrganizationRoleFilter + + """Filter by the object’s `profileImageUrl` field.""" + profileImageUrl: CrunchbaseStringFilter + + """Filter by the object’s `description` field.""" + description: CrunchbaseStringFilter + + """Filter by the object’s `shortDescription` field.""" + shortDescription: CrunchbaseStringFilter + + """Filter by the object’s `alsoKnownAs` field.""" + alsoKnownAs: CrunchbaseStringListFilter + + """Filter by the object’s `name` field.""" + name: CrunchbaseStringFilter + + """Filter by the object’s `webPath` field.""" + webPath: CrunchbaseStringFilter + + """Filter by the object’s `apiPath` field.""" + apiPath: CrunchbaseStringFilter + + """Filter by the object’s `permalink` field.""" + permalink: CrunchbaseStringFilter + + """Filter by the object’s `id` field.""" + id: CrunchbaseUUIDFilter +} + +enum CrunchbaseOrganizationsOrderBy { + NATURAL + ID_ASC + ID_DESC + PERMALINK_ASC + PERMALINK_DESC + API_PATH_ASC + API_PATH_DESC + WEB_PATH_ASC + WEB_PATH_DESC + NAME_ASC + NAME_DESC + ALSO_KNOWN_AS_ASC + ALSO_KNOWN_AS_DESC + SHORT_DESCRIPTION_ASC + SHORT_DESCRIPTION_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + PROFILE_IMAGE_URL_ASC + PROFILE_IMAGE_URL_DESC + PRIMARY_ROLE_ASC + PRIMARY_ROLE_DESC + ROLE_COMPANY_ASC + ROLE_COMPANY_DESC + ROLE_INVESTOR_ASC + ROLE_INVESTOR_DESC + ROLE_GROUP_ASC + ROLE_GROUP_DESC + ROLE_SCHOOL_ASC + ROLE_SCHOOL_DESC + FOUNDED_ON_ASC + FOUNDED_ON_DESC + FOUNDED_ON_TRUST_CODE_ASC + FOUNDED_ON_TRUST_CODE_DESC + IS_CLOSED_ASC + IS_CLOSED_DESC + CLOSED_ON_ASC + CLOSED_ON_DESC + CLOSED_ON_TRUST_CODE_ASC + CLOSED_ON_TRUST_CODE_DESC + NUM_EMPLOYEES_MIN_ASC + NUM_EMPLOYEES_MIN_DESC + NUM_EMPLOYEES_MAX_ASC + NUM_EMPLOYEES_MAX_DESC + TOTAL_FUNDING_USD_ASC + TOTAL_FUNDING_USD_DESC + STOCK_EXCHANGE_ASC + STOCK_EXCHANGE_DESC + STOCK_SYMBOL_ASC + STOCK_SYMBOL_DESC + NUMBER_OF_INVESTMENTS_ASC + NUMBER_OF_INVESTMENTS_DESC + HOMEPAGE_URL_ASC + HOMEPAGE_URL_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + PERMALINK_ALIASES_ASC + PERMALINK_ALIASES_DESC + API_URL_ASC + API_URL_DESC + INVESTOR_TYPE_ASC + INVESTOR_TYPE_DESC + CONTACT_EMAIL_ASC + CONTACT_EMAIL_DESC + PHONE_NUMBER_ASC + PHONE_NUMBER_DESC + RANK_ASC + RANK_DESC + PRIMARY_IMAGE_ID_ASC + PRIMARY_IMAGE_ID_DESC + HEADQUARTERS_ID_ASC + HEADQUARTERS_ID_DESC + WEBSITES_ASC + WEBSITES_DESC + NEWS_ITEMS_ASC + NEWS_ITEMS_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type CrunchbaseImage implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + assetPath: String + + """""" + assetUrl: String + + """""" + contentType: String + + """""" + height: Int + + """""" + width: Int + + """file size in bytes""" + filesize: Int + + """""" + createdAt: String + + """""" + updatedAt: String + + """Reads and enables pagination through a set of `Organization`.""" + organizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + + """Reads and enables pagination through a set of `Person`.""" + peopleByPrimaryImageId( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type CrunchbaseNewsItem { + """""" + title: String + + """""" + author: String + + """""" + postedOn: String + + """""" + postedOnTrustCode: CrunchbaseTrustCode + + """""" + url: String + + """""" + createdAt: String + + """""" + updatedAt: String +} + +enum CrunchbaseWebsiteType { + FACEBOOK + LINKEDIN + TWITTER + HOMEPAGE +} + +"""""" +type CrunchbaseWebsite { + """""" + websiteType: CrunchbaseWebsiteType + + """""" + url: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + websiteName: String +} + +enum CrunchbaseTrustCode { + NULL_OR_INVALID + DAY + MONTH + DAY_MONTH + YEAR + YEAR_DAY + YEAR_MONTH + YEAR_DAY_MONTH +} + +enum CrunchbaseOrganizationRole { + COMPANY + INVESTOR + SCHOOL + GROUP +} + +"""""" +type CrunchbaseOrganization implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + permalink: String + + """""" + apiPath: String + + """""" + webPath: String + + """User-friendly name (as presented on CrunchBase)""" + name: String + + """Aliases and previous names""" + alsoKnownAs: [String] + + """""" + shortDescription: String + + """""" + description: String + + """""" + profileImageUrl: String + + """""" + primaryRole: CrunchbaseOrganizationRole + + """Does this organization act as a company?""" + roleCompany: Boolean + + """Does this organization act as a investor?""" + roleInvestor: Boolean + + """Does this organization act as a group?""" + roleGroup: Boolean + + """Does this organization act as a school?""" + roleSchool: Boolean + + """""" + foundedOn: String + + """""" + foundedOnTrustCode: CrunchbaseTrustCode + + """""" + isClosed: Boolean + + """""" + closedOn: String + + """""" + closedOnTrustCode: CrunchbaseTrustCode + + """""" + numEmployeesMin: Int + + """""" + numEmployeesMax: Int + + """""" + totalFundingUsd: String + + """""" + stockExchange: String + + """The symbol under which the Organization trades on the stock_exchange""" + stockSymbol: String + + """""" + numberOfInvestments: Int + + """""" + homepageUrl: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + permalinkAliases: [String] + + """""" + apiUrl: String + + """""" + investorType: [String] + + """""" + contactEmail: String + + """""" + phoneNumber: String + + """""" + rank: Int + + """""" + primaryImageId: String + + """""" + headquartersId: String + + """""" + websites: [CrunchbaseWebsite] + + """""" + newsItems: [CrunchbaseNewsItem] + + """Reads a single `Image` that is related to this `Organization`.""" + primaryImage: CrunchbaseImage + + """Reads a single `Address` that is related to this `Organization`.""" + headquarters: CrunchbaseAddress + + """Reads and enables pagination through a set of `Degree`.""" + degreesIssued( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseDegreeFilter + + """The method to use when ordering `Degree`.""" + orderBy: [CrunchbaseDegreesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseDegreesConnection! + + """Reads and enables pagination through a set of `Job`.""" + jobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseJobFilter + + """The method to use when ordering `Job`.""" + orderBy: [CrunchbaseJobsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseJobsConnection! + + """Reads and enables pagination through a set of `Fund`.""" + ventureFirmFunds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseFundFilter + + """The method to use when ordering `Fund`.""" + orderBy: [CrunchbaseFundsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseFundsConnection! + + """Reads and enables pagination through a set of `FundingRound`.""" + fundingRounds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseFundingRoundFilter + + """The method to use when ordering `FundingRound`.""" + orderBy: [CrunchbaseFundingRoundsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseFundingRoundsConnection! + + """Reads and enables pagination through a set of `Investment`.""" + investmentsAsInvestee( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseInvestmentFilter + + """The method to use when ordering `Investment`.""" + orderBy: [CrunchbaseInvestmentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseInvestmentsConnection! + + """Reads and enables pagination through a set of `Acquisition`.""" + acquisitionsAsAcquirer( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseAcquisitionFilter + + """The method to use when ordering `Acquisition`.""" + orderBy: [CrunchbaseAcquisitionsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseAcquisitionsConnection! + + """Reads and enables pagination through a set of `Acquisition`.""" + acquisitionsAsAcquiree( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseAcquisitionFilter + + """The method to use when ordering `Acquisition`.""" + orderBy: [CrunchbaseAcquisitionsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseAcquisitionsConnection! + + """Reads and enables pagination through a set of `Ipo`.""" + ipos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseIpoFilter + + """The method to use when ordering `Ipo`.""" + orderBy: [CrunchbaseIposOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseIposConnection! + + """""" + facebookUrl: String + + """""" + homepageHostname: String + + """""" + linkedinUrl: String + + """""" + twitterUrl: String + + """Reads and enables pagination through a set of `Address`.""" + offices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseAddressFilter + + """The method to use when ordering `Address`.""" + orderBy: [CrunchbaseAddressesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseAddressesConnection! + + """Reads and enables pagination through a set of `Person`.""" + degreeHolders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + + """Reads and enables pagination through a set of `Person`.""" + peopleByJobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + + """Reads and enables pagination through a set of `FundingRound`.""" + fundingRoundsAsInvestee( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseFundingRoundFilter + + """The method to use when ordering `FundingRound`.""" + orderBy: [CrunchbaseFundingRoundsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseFundingRoundsConnection! + + """Reads and enables pagination through a set of `Person`.""" + peopleInvestedIn( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + + """Reads and enables pagination through a set of `Person`.""" + founders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + + """Reads and enables pagination through a set of `Job`.""" + currentTeamJobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseJobFilter + + """The method to use when ordering `Job`.""" + orderBy: [CrunchbaseJobsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseJobsConnection! + + """Reads and enables pagination through a set of `Job`.""" + featuredTeamJobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseJobFilter + + """The method to use when ordering `Job`.""" + orderBy: [CrunchbaseJobsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseJobsConnection! + + """Reads and enables pagination through a set of `Job`.""" + pastTeamJobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseJobFilter + + """The method to use when ordering `Job`.""" + orderBy: [CrunchbaseJobsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseJobsConnection! + + """Reads and enables pagination through a set of `Job`.""" + boardAndAdvisorJobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseJobFilter + + """The method to use when ordering `Job`.""" + orderBy: [CrunchbaseJobsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseJobsConnection! + + """Reads and enables pagination through a set of `Investment`.""" + investmentsAsInvestor( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseInvestmentFilter + + """The method to use when ordering `Investment`.""" + orderBy: [CrunchbaseInvestmentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseInvestmentsConnection! + + """Reads and enables pagination through a set of `Person`.""" + investorPeople( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + + """Reads and enables pagination through a set of `Category`.""" + categories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseCategoryFilter + + """The method to use when ordering `Category`.""" + orderBy: [CrunchbaseCategoriesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseCategoriesConnection! + + """Reads and enables pagination through a set of `Fund`.""" + investedInFunds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseFundFilter + + """The method to use when ordering `Fund`.""" + orderBy: [CrunchbaseFundsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseFundsConnection! + + """Reads and enables pagination through a set of `Person`.""" + fundInvestorPeople( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbasePersonFilter + + """The method to use when ordering `Person`.""" + orderBy: [CrunchbasePeopleOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbasePeopleConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Organization` values.""" +type CrunchbaseOrganizationsConnection { + """A list of `Organization` objects.""" + nodes: [CrunchbaseOrganization]! + + """ + A list of edges which contains the `Organization` and cursor to aid in pagination. + """ + edges: [CrunchbaseOrganizationsEdge!]! + + """Information to aid in pagination.""" + pageInfo: CrunchbasePageInfo! + + """The count of *all* `Organization` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: CrunchbaseOrganizationsConnectionAggregates +} + +"""""" +type CrunchbaseCategory implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + webPath: String + + """""" + groups: [String] + + """""" + name: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """Reads and enables pagination through a set of `Organization`.""" + organizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CrunchbaseOrganizationFilter + + """The method to use when ordering `Organization`.""" + orderBy: [CrunchbaseOrganizationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): CrunchbaseOrganizationsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An object with a globally unique `ID`.""" +interface CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! +} + +"""""" +type CrunchbaseSyncState implements OneGraphNode & CrunchbaseNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + objectType: String! + + """""" + lastUpdatedAt: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type QuickbooksCustomersConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + accountId: Float + + """""" + defaultTaxCodeId: Float + + """""" + salesTermId: Float + + """""" + balanceWithJobs: Float + + """""" + parentId: Float + + """""" + level: Float + + """""" + balance: Float + + """""" + shippingAddressId: Float + + """""" + paymentMethodId: Float + + """""" + billingAddressId: Float + + """""" + taxExemptionReasonId: Float +} + +"""""" +type QuickbooksCustomersConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + accountId: Float + + """""" + defaultTaxCodeId: Float + + """""" + salesTermId: Float + + """""" + balanceWithJobs: Float + + """""" + parentId: Float + + """""" + level: Float + + """""" + balance: Float + + """""" + shippingAddressId: Float + + """""" + paymentMethodId: Float + + """""" + billingAddressId: Float + + """""" + taxExemptionReasonId: Float +} + +"""""" +type QuickbooksCustomersConnectionAggregates { + """""" + sum: QuickbooksCustomersConnectionSums + + """""" + avg: QuickbooksCustomersConnectionAverages +} + +"""A `Customer` edge in the connection.""" +type QuickbooksCustomersEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Customer` at the end of the edge.""" + node: QuickbooksCustomer +} + +"""""" +type QuickbooksItemsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + quantityOnHand: Float + + """""" + assetAccountId: Float + + """""" + salesTaxCodeId: Float + + """""" + abatementRate: Float + + """""" + reverseChargeRate: Float + + """""" + preferredVendorId: Float + + """""" + level: Float + + """""" + uqcId: Float + + """""" + purchaseTaxCodeId: Float + + """""" + purchaseCost: Float + + """""" + parentId: Float + + """""" + unitPrice: Float + + """""" + incomeAccountId: Float + + """""" + expenseAccountId: Float +} + +"""""" +type QuickbooksItemsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + quantityOnHand: Float + + """""" + assetAccountId: Float + + """""" + salesTaxCodeId: Float + + """""" + abatementRate: Float + + """""" + reverseChargeRate: Float + + """""" + preferredVendorId: Float + + """""" + level: Float + + """""" + uqcId: Float + + """""" + purchaseTaxCodeId: Float + + """""" + purchaseCost: Float + + """""" + parentId: Float + + """""" + unitPrice: Float + + """""" + incomeAccountId: Float + + """""" + expenseAccountId: Float +} + +"""""" +type QuickbooksItemsConnectionAggregates { + """""" + sum: QuickbooksItemsConnectionSums + + """""" + avg: QuickbooksItemsConnectionAverages +} + +"""A `Item` edge in the connection.""" +type QuickbooksItemsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Item` at the end of the edge.""" + node: QuickbooksItem +} + +"""""" +type QuickbooksBillsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + vendorId: Float + + """""" + syncToken: Float + + """""" + totalAmount: Float + + """""" + homeBalance: Float + + """""" + accountId: Float + + """""" + departmentId: Float + + """""" + exchangeRate: Float + + """""" + salesTermId: Float + + """""" + balance: Float +} + +"""""" +type QuickbooksBillsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + vendorId: Float + + """""" + syncToken: Float + + """""" + totalAmount: Float + + """""" + homeBalance: Float + + """""" + accountId: Float + + """""" + departmentId: Float + + """""" + exchangeRate: Float + + """""" + salesTermId: Float + + """""" + balance: Float +} + +"""""" +type QuickbooksBillsConnectionAggregates { + """""" + sum: QuickbooksBillsConnectionSums + + """""" + avg: QuickbooksBillsConnectionAverages +} + +"""A `Bill` edge in the connection.""" +type QuickbooksBillsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Bill` at the end of the edge.""" + node: QuickbooksBill +} + +""" +A filter to be used against BillLineItemExpenseType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksBillLineItemExpenseTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksBillLineItemExpenseType + + """Greater than the specified value.""" + greaterThan: QuickbooksBillLineItemExpenseType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksBillLineItemExpenseType + + """Less than the specified value.""" + lessThan: QuickbooksBillLineItemExpenseType + + """Not included in the specified list.""" + notIn: [QuickbooksBillLineItemExpenseType!] + + """Included in the specified list.""" + in: [QuickbooksBillLineItemExpenseType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksBillLineItemExpenseType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksBillLineItemExpenseType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksBillLineItemExpenseType + + """Equal to the specified value.""" + equalTo: QuickbooksBillLineItemExpenseType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `BillLineItem` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksBillLineItemFilter { + """Negates the expression.""" + not: QuickbooksBillLineItemFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksBillLineItemFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksBillLineItemFilter!] + + """Filter by the object’s `unitPrice` field.""" + unitPrice: QuickbooksBigFloatFilter + + """Filter by the object’s `quantity` field.""" + quantity: QuickbooksBigFloatFilter + + """Filter by the object’s `billableStatus` field.""" + billableStatus: QuickbooksBillableStatusFilter + + """Filter by the object’s `markupPercent` field.""" + markupPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `markupAccountId` field.""" + markupAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `taxCodeId` field.""" + taxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `customerId` field.""" + customerId: QuickbooksBigIntFilter + + """Filter by the object’s `accountId` field.""" + accountId: QuickbooksBigIntFilter + + """Filter by the object’s `itemId` field.""" + itemId: QuickbooksBigIntFilter + + """Filter by the object’s `expenseType` field.""" + expenseType: QuickbooksBillLineItemExpenseTypeFilter + + """Filter by the object’s `taxInclusiveAmount` field.""" + taxInclusiveAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `taxAmount` field.""" + taxAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `lineNumber` field.""" + lineNumber: QuickbooksIntFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `billId` field.""" + billId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksBillLineItemsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + BILL_ID_ASC + BILL_ID_DESC + AMOUNT_ASC + AMOUNT_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + LINE_NUMBER_ASC + LINE_NUMBER_DESC + TAX_AMOUNT_ASC + TAX_AMOUNT_DESC + TAX_INCLUSIVE_AMOUNT_ASC + TAX_INCLUSIVE_AMOUNT_DESC + EXPENSE_TYPE_ASC + EXPENSE_TYPE_DESC + ITEM_ID_ASC + ITEM_ID_DESC + ACCOUNT_ID_ASC + ACCOUNT_ID_DESC + CUSTOMER_ID_ASC + CUSTOMER_ID_DESC + CLASS_ID_ASC + CLASS_ID_DESC + TAX_CODE_ID_ASC + TAX_CODE_ID_DESC + MARKUP_ACCOUNT_ID_ASC + MARKUP_ACCOUNT_ID_DESC + MARKUP_PERCENT_ASC + MARKUP_PERCENT_DESC + BILLABLE_STATUS_ASC + BILLABLE_STATUS_DESC + QUANTITY_ASC + QUANTITY_DESC + UNIT_PRICE_ASC + UNIT_PRICE_DESC +} + +"""""" +type QuickbooksBillLineItemsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + billId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + taxAmount: Float + + """""" + taxInclusiveAmount: Float + + """""" + itemId: Float + + """""" + accountId: Float + + """""" + customerId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + quantity: Float + + """""" + unitPrice: Float +} + +"""""" +type QuickbooksBillLineItemsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + billId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + taxAmount: Float + + """""" + taxInclusiveAmount: Float + + """""" + itemId: Float + + """""" + accountId: Float + + """""" + customerId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + quantity: Float + + """""" + unitPrice: Float +} + +"""""" +type QuickbooksBillLineItemsConnectionAggregates { + """""" + sum: QuickbooksBillLineItemsConnectionSums + + """""" + avg: QuickbooksBillLineItemsConnectionAverages +} + +"""A `BillLineItem` edge in the connection.""" +type QuickbooksBillLineItemsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `BillLineItem` at the end of the edge.""" + node: QuickbooksBillLineItem +} + +"""A connection to a list of `BillLineItem` values.""" +type QuickbooksBillLineItemsConnection { + """A list of `BillLineItem` objects.""" + nodes: [QuickbooksBillLineItem]! + + """ + A list of edges which contains the `BillLineItem` and cursor to aid in pagination. + """ + edges: [QuickbooksBillLineItemsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `BillLineItem` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksBillLineItemsConnectionAggregates +} + +"""""" +type QuickbooksBillPaymentsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + vendorId: Float + + """""" + totalAmount: Float + + """""" + syncToken: Float + + """""" + exchangeRate: Float + + """""" + accountId: Float + + """""" + departmentId: Float + + """""" + checkPaymentAccountId: Float + + """""" + creditCardPaymentAccountId: Float +} + +"""""" +type QuickbooksBillPaymentsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + vendorId: Float + + """""" + totalAmount: Float + + """""" + syncToken: Float + + """""" + exchangeRate: Float + + """""" + accountId: Float + + """""" + departmentId: Float + + """""" + checkPaymentAccountId: Float + + """""" + creditCardPaymentAccountId: Float +} + +"""""" +type QuickbooksBillPaymentsConnectionAggregates { + """""" + sum: QuickbooksBillPaymentsConnectionSums + + """""" + avg: QuickbooksBillPaymentsConnectionAverages +} + +"""A `BillPayment` edge in the connection.""" +type QuickbooksBillPaymentsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `BillPayment` at the end of the edge.""" + node: QuickbooksBillPayment +} + +""" +A filter to be used against `BillPaymentLineItem` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksBillPaymentLineItemFilter { + """Negates the expression.""" + not: QuickbooksBillPaymentLineItemFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksBillPaymentLineItemFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksBillPaymentLineItemFilter!] + + """Filter by the object’s `billPaymentId` field.""" + billPaymentId: QuickbooksBigIntFilter + + """Filter by the object’s `lineNumber` field.""" + lineNumber: QuickbooksIntFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksBillPaymentLineItemsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + AMOUNT_ASC + AMOUNT_DESC + LINE_NUMBER_ASC + LINE_NUMBER_DESC + BILL_PAYMENT_ID_ASC + BILL_PAYMENT_ID_DESC +} + +"""""" +type QuickbooksBillPaymentLineItemsConnectionAverages { + """""" + realmId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + billPaymentId: Float +} + +"""""" +type QuickbooksBillPaymentLineItemsConnectionSums { + """""" + realmId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + billPaymentId: Float +} + +"""""" +type QuickbooksBillPaymentLineItemsConnectionAggregates { + """""" + sum: QuickbooksBillPaymentLineItemsConnectionSums + + """""" + avg: QuickbooksBillPaymentLineItemsConnectionAverages +} + +"""A `BillPaymentLineItem` edge in the connection.""" +type QuickbooksBillPaymentLineItemsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `BillPaymentLineItem` at the end of the edge.""" + node: QuickbooksBillPaymentLineItem +} + +""" +A filter to be used against `BillPaymentLineItemTransaction` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksBillPaymentLineItemTransactionFilter { + """Negates the expression.""" + not: QuickbooksBillPaymentLineItemTransactionFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksBillPaymentLineItemTransactionFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksBillPaymentLineItemTransactionFilter!] + + """Filter by the object’s `transactionLineNumber` field.""" + transactionLineNumber: QuickbooksIntFilter + + """Filter by the object’s `billId` field.""" + billId: QuickbooksBigIntFilter + + """Filter by the object’s `billPaymentLineItemLineNumber` field.""" + billPaymentLineItemLineNumber: QuickbooksIntFilter + + """Filter by the object’s `billPaymentId` field.""" + billPaymentId: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksBillPaymentLineItemTransactionsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + BILL_PAYMENT_ID_ASC + BILL_PAYMENT_ID_DESC + BILL_PAYMENT_LINE_ITEM_LINE_NUMBER_ASC + BILL_PAYMENT_LINE_ITEM_LINE_NUMBER_DESC + BILL_ID_ASC + BILL_ID_DESC + TRANSACTION_LINE_NUMBER_ASC + TRANSACTION_LINE_NUMBER_DESC +} + +"""""" +type QuickbooksBillPaymentLineItemTransactionsConnectionAverages { + """""" + realmId: Float + + """""" + billPaymentId: Float + + """""" + billPaymentLineItemLineNumber: Float + + """""" + billId: Float + + """""" + transactionLineNumber: Float +} + +"""""" +type QuickbooksBillPaymentLineItemTransactionsConnectionSums { + """""" + realmId: Float + + """""" + billPaymentId: Float + + """""" + billPaymentLineItemLineNumber: Float + + """""" + billId: Float + + """""" + transactionLineNumber: Float +} + +"""""" +type QuickbooksBillPaymentLineItemTransactionsConnectionAggregates { + """""" + sum: QuickbooksBillPaymentLineItemTransactionsConnectionSums + + """""" + avg: QuickbooksBillPaymentLineItemTransactionsConnectionAverages +} + +"""A `BillPaymentLineItemTransaction` edge in the connection.""" +type QuickbooksBillPaymentLineItemTransactionsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `BillPaymentLineItemTransaction` at the end of the edge.""" + node: QuickbooksBillPaymentLineItemTransaction +} + +enum QuickbooksBillLineItemExpenseType { + ACCOUNT_BASED + ITEM_BASED +} + +"""""" +type QuickbooksBillLineItem { + """""" + realmId: String! + + """""" + id: String! + + """""" + billId: String! + + """""" + amount: String + + """""" + description: String + + """""" + lineNumber: Int! + + """""" + taxAmount: String + + """""" + taxInclusiveAmount: String + + """""" + expenseType: QuickbooksBillLineItemExpenseType! + + """""" + itemId: String + + """""" + accountId: String + + """""" + customerId: String + + """""" + classId: String + + """""" + taxCodeId: String + + """""" + markupAccountId: String + + """""" + markupPercent: String + + """""" + billableStatus: QuickbooksBillableStatus + + """""" + quantity: String + + """""" + unitPrice: String + + """Reads a single `Bill` that is related to this `BillLineItem`.""" + bill: QuickbooksBill + + """Reads a single `Item` that is related to this `BillLineItem`.""" + item: QuickbooksItem + + """Reads a single `Account` that is related to this `BillLineItem`.""" + account: QuickbooksAccount + + """Reads a single `Customer` that is related to this `BillLineItem`.""" + customer: QuickbooksCustomer + + """Reads a single `Class` that is related to this `BillLineItem`.""" + class: QuickbooksClass + + """Reads a single `TaxCode` that is related to this `BillLineItem`.""" + taxCode: QuickbooksTaxCode + + """Reads a single `Account` that is related to this `BillLineItem`.""" + markupAccount: QuickbooksAccount +} + +"""""" +type QuickbooksBillPaymentLineItemTransaction { + """""" + realmId: String! + + """""" + billPaymentId: String! + + """""" + billPaymentLineItemLineNumber: Int! + + """""" + billId: String + + """""" + transactionLineNumber: Int + + """ + Reads a single `Realm` that is related to this `BillPaymentLineItemTransaction`. + """ + realm: QuickbooksRealm + + """ + Reads a single `BillPayment` that is related to this `BillPaymentLineItemTransaction`. + """ + billPayment: QuickbooksBillPayment + + """ + Reads a single `BillPaymentLineItem` that is related to this `BillPaymentLineItemTransaction`. + """ + billPaymentLineItem: QuickbooksBillPaymentLineItem + + """ + Reads a single `Bill` that is related to this `BillPaymentLineItemTransaction`. + """ + bill: QuickbooksBill + + """ + Reads a single `BillLineItem` that is related to this `BillPaymentLineItemTransaction`. + """ + billLineItem: QuickbooksBillLineItem +} + +"""A connection to a list of `BillPaymentLineItemTransaction` values.""" +type QuickbooksBillPaymentLineItemTransactionsConnection { + """A list of `BillPaymentLineItemTransaction` objects.""" + nodes: [QuickbooksBillPaymentLineItemTransaction]! + + """ + A list of edges which contains the `BillPaymentLineItemTransaction` and cursor to aid in pagination. + """ + edges: [QuickbooksBillPaymentLineItemTransactionsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `BillPaymentLineItemTransaction` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksBillPaymentLineItemTransactionsConnectionAggregates +} + +"""""" +type QuickbooksBillPaymentLineItem { + """""" + realmId: String! + + """""" + amount: String + + """""" + lineNumber: Int! + + """""" + billPaymentId: String! + + """ + Reads a single `BillPayment` that is related to this `BillPaymentLineItem`. + """ + billPayment: QuickbooksBillPayment + + """ + Reads and enables pagination through a set of `BillPaymentLineItemTransaction`. + """ + linkedTransactions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillPaymentLineItemTransactionFilter + + """The method to use when ordering `BillPaymentLineItemTransaction`.""" + orderBy: [QuickbooksBillPaymentLineItemTransactionsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillPaymentLineItemTransactionsConnection! +} + +"""A connection to a list of `BillPaymentLineItem` values.""" +type QuickbooksBillPaymentLineItemsConnection { + """A list of `BillPaymentLineItem` objects.""" + nodes: [QuickbooksBillPaymentLineItem]! + + """ + A list of edges which contains the `BillPaymentLineItem` and cursor to aid in pagination. + """ + edges: [QuickbooksBillPaymentLineItemsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `BillPaymentLineItem` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksBillPaymentLineItemsConnectionAggregates +} + +"""""" +type QuickbooksInvoicesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + shipFromAddressId: Float + + """""" + homeBalance: Float + + """""" + classId: Float + + """""" + salesTermId: Float + + """""" + totalAmount: Float + + """""" + depositToAccountId: Float + + """""" + exchangeRate: Float + + """""" + deposit: Float + + """""" + balance: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + shippingAddressId: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksInvoicesConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + shipFromAddressId: Float + + """""" + homeBalance: Float + + """""" + classId: Float + + """""" + salesTermId: Float + + """""" + totalAmount: Float + + """""" + depositToAccountId: Float + + """""" + exchangeRate: Float + + """""" + deposit: Float + + """""" + balance: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + shippingAddressId: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksInvoicesConnectionAggregates { + """""" + sum: QuickbooksInvoicesConnectionSums + + """""" + avg: QuickbooksInvoicesConnectionAverages +} + +"""A `Invoice` edge in the connection.""" +type QuickbooksInvoicesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Invoice` at the end of the edge.""" + node: QuickbooksInvoice +} + +""" +A filter to be used against InvoiceLineItemType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksInvoiceLineItemTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksInvoiceLineItemType + + """Greater than the specified value.""" + greaterThan: QuickbooksInvoiceLineItemType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksInvoiceLineItemType + + """Less than the specified value.""" + lessThan: QuickbooksInvoiceLineItemType + + """Not included in the specified list.""" + notIn: [QuickbooksInvoiceLineItemType!] + + """Included in the specified list.""" + in: [QuickbooksInvoiceLineItemType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksInvoiceLineItemType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksInvoiceLineItemType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksInvoiceLineItemType + + """Equal to the specified value.""" + equalTo: QuickbooksInvoiceLineItemType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `InvoiceLineItem` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksInvoiceLineItemFilter { + """Negates the expression.""" + not: QuickbooksInvoiceLineItemFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksInvoiceLineItemFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksInvoiceLineItemFilter!] + + """Filter by the object’s `discountPercent` field.""" + discountPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `discountIsPercentBased` field.""" + discountIsPercentBased: QuickbooksBooleanFilter + + """Filter by the object’s `discountAccountId` field.""" + discountAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `groupItemId` field.""" + groupItemId: QuickbooksBigIntFilter + + """Filter by the object’s `taxClassificationId` field.""" + taxClassificationId: QuickbooksStringFilter + + """Filter by the object’s `unitPrice` field.""" + unitPrice: QuickbooksBigFloatFilter + + """Filter by the object’s `quantity` field.""" + quantity: QuickbooksBigFloatFilter + + """Filter by the object’s `discountRate` field.""" + discountRate: QuickbooksBigFloatFilter + + """Filter by the object’s `serviceDate` field.""" + serviceDate: QuickbooksDateFilter + + """Filter by the object’s `itemAccountId` field.""" + itemAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `markupPercent` field.""" + markupPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `markupAccountId` field.""" + markupAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `taxCodeId` field.""" + taxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `itemId` field.""" + itemId: QuickbooksBigIntFilter + + """Filter by the object’s `discountAmount` field.""" + discountAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `taxInclusiveAmount` field.""" + taxInclusiveAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `index` field.""" + index: QuickbooksIntFilter + + """Filter by the object’s `lineNumber` field.""" + lineNumber: QuickbooksIntFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `type` field.""" + type: QuickbooksInvoiceLineItemTypeFilter + + """Filter by the object’s `invoiceId` field.""" + invoiceId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksInvoiceLineItemsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + INVOICE_ID_ASC + INVOICE_ID_DESC + TYPE_ASC + TYPE_DESC + AMOUNT_ASC + AMOUNT_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + LINE_NUMBER_ASC + LINE_NUMBER_DESC + INDEX_ASC + INDEX_DESC + TAX_INCLUSIVE_AMOUNT_ASC + TAX_INCLUSIVE_AMOUNT_DESC + DISCOUNT_AMOUNT_ASC + DISCOUNT_AMOUNT_DESC + ITEM_ID_ASC + ITEM_ID_DESC + CLASS_ID_ASC + CLASS_ID_DESC + TAX_CODE_ID_ASC + TAX_CODE_ID_DESC + MARKUP_ACCOUNT_ID_ASC + MARKUP_ACCOUNT_ID_DESC + MARKUP_PERCENT_ASC + MARKUP_PERCENT_DESC + ITEM_ACCOUNT_ID_ASC + ITEM_ACCOUNT_ID_DESC + SERVICE_DATE_ASC + SERVICE_DATE_DESC + DISCOUNT_RATE_ASC + DISCOUNT_RATE_DESC + QUANTITY_ASC + QUANTITY_DESC + UNIT_PRICE_ASC + UNIT_PRICE_DESC + TAX_CLASSIFICATION_ID_ASC + TAX_CLASSIFICATION_ID_DESC + GROUP_ITEM_ID_ASC + GROUP_ITEM_ID_DESC + DISCOUNT_ACCOUNT_ID_ASC + DISCOUNT_ACCOUNT_ID_DESC + DISCOUNT_IS_PERCENT_BASED_ASC + DISCOUNT_IS_PERCENT_BASED_DESC + DISCOUNT_PERCENT_ASC + DISCOUNT_PERCENT_DESC +} + +"""""" +type QuickbooksInvoiceLineItemsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + invoiceId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + index: Float + + """""" + taxInclusiveAmount: Float + + """""" + discountAmount: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + itemAccountId: Float + + """""" + discountRate: Float + + """""" + quantity: Float + + """""" + unitPrice: Float + + """""" + groupItemId: Float + + """""" + discountAccountId: Float + + """""" + discountPercent: Float +} + +"""""" +type QuickbooksInvoiceLineItemsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + invoiceId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + index: Float + + """""" + taxInclusiveAmount: Float + + """""" + discountAmount: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + itemAccountId: Float + + """""" + discountRate: Float + + """""" + quantity: Float + + """""" + unitPrice: Float + + """""" + groupItemId: Float + + """""" + discountAccountId: Float + + """""" + discountPercent: Float +} + +"""""" +type QuickbooksInvoiceLineItemsConnectionAggregates { + """""" + sum: QuickbooksInvoiceLineItemsConnectionSums + + """""" + avg: QuickbooksInvoiceLineItemsConnectionAverages +} + +"""A `InvoiceLineItem` edge in the connection.""" +type QuickbooksInvoiceLineItemsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `InvoiceLineItem` at the end of the edge.""" + node: QuickbooksInvoiceLineItem +} + +enum QuickbooksInvoiceLineItemType { + SALES_ITEM + GROUP + DESCRIPTIN_ONLY + DISCOUNT + SUB_TOTAL +} + +"""""" +type QuickbooksInvoiceLineItem { + """""" + realmId: String! + + """""" + id: String + + """""" + invoiceId: String! + + """""" + type: QuickbooksInvoiceLineItemType! + + """""" + amount: String + + """""" + description: String + + """""" + lineNumber: Int + + """""" + index: Int! + + """""" + taxInclusiveAmount: String + + """""" + discountAmount: String + + """""" + itemId: String + + """""" + classId: String + + """""" + taxCodeId: String + + """""" + markupAccountId: String + + """""" + markupPercent: String + + """""" + itemAccountId: String + + """""" + serviceDate: String + + """""" + discountRate: String + + """""" + quantity: String + + """""" + unitPrice: String + + """""" + taxClassificationId: String + + """""" + groupItemId: String + + """""" + discountAccountId: String + + """""" + discountIsPercentBased: Boolean + + """""" + discountPercent: String + + """Reads a single `Invoice` that is related to this `InvoiceLineItem`.""" + invoice: QuickbooksInvoice + + """Reads a single `Item` that is related to this `InvoiceLineItem`.""" + item: QuickbooksItem + + """Reads a single `Class` that is related to this `InvoiceLineItem`.""" + class: QuickbooksClass + + """Reads a single `TaxCode` that is related to this `InvoiceLineItem`.""" + taxCode: QuickbooksTaxCode + + """Reads a single `Account` that is related to this `InvoiceLineItem`.""" + itemAccount: QuickbooksAccount + + """ + Reads a single `TaxClassification` that is related to this `InvoiceLineItem`. + """ + taxClassification: QuickbooksTaxClassification + + """Reads a single `Item` that is related to this `InvoiceLineItem`.""" + groupItem: QuickbooksItem + + """Reads a single `Account` that is related to this `InvoiceLineItem`.""" + discountAccount: QuickbooksAccount +} + +"""A connection to a list of `InvoiceLineItem` values.""" +type QuickbooksInvoiceLineItemsConnection { + """A list of `InvoiceLineItem` objects.""" + nodes: [QuickbooksInvoiceLineItem]! + + """ + A list of edges which contains the `InvoiceLineItem` and cursor to aid in pagination. + """ + edges: [QuickbooksInvoiceLineItemsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `InvoiceLineItem` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksInvoiceLineItemsConnectionAggregates +} + +"""""" +type QuickbooksEmployeesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + primaryAddressId: Float + + """""" + billRate: Float +} + +"""""" +type QuickbooksEmployeesConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + primaryAddressId: Float + + """""" + billRate: Float +} + +"""""" +type QuickbooksEmployeesConnectionAggregates { + """""" + sum: QuickbooksEmployeesConnectionSums + + """""" + avg: QuickbooksEmployeesConnectionAverages +} + +"""A `Employee` edge in the connection.""" +type QuickbooksEmployeesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Employee` at the end of the edge.""" + node: QuickbooksEmployee +} + +"""""" +type QuickbooksTimeActivitiesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + employeeId: Float + + """""" + vendorId: Float + + """""" + hours: Float + + """""" + minutes: Float + + """""" + hourlyRate: Float + + """""" + breakHours: Float + + """""" + breakMinutes: Float + + """""" + customerId: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + departmentId: Float +} + +"""""" +type QuickbooksTimeActivitiesConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + employeeId: Float + + """""" + vendorId: Float + + """""" + hours: Float + + """""" + minutes: Float + + """""" + hourlyRate: Float + + """""" + breakHours: Float + + """""" + breakMinutes: Float + + """""" + customerId: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + departmentId: Float +} + +"""""" +type QuickbooksTimeActivitiesConnectionAggregates { + """""" + sum: QuickbooksTimeActivitiesConnectionSums + + """""" + avg: QuickbooksTimeActivitiesConnectionAverages +} + +"""A `TimeActivity` edge in the connection.""" +type QuickbooksTimeActivitiesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `TimeActivity` at the end of the edge.""" + node: QuickbooksTimeActivity +} + +"""""" +type QuickbooksEstimatesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + shipFromAddressId: Float + + """""" + classId: Float + + """""" + salesTermId: Float + + """""" + totalAmount: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + exchangeRate: Float + + """""" + shippingAddressId: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksEstimatesConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + shipFromAddressId: Float + + """""" + classId: Float + + """""" + salesTermId: Float + + """""" + totalAmount: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + exchangeRate: Float + + """""" + shippingAddressId: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksEstimatesConnectionAggregates { + """""" + sum: QuickbooksEstimatesConnectionSums + + """""" + avg: QuickbooksEstimatesConnectionAverages +} + +"""A `Estimate` edge in the connection.""" +type QuickbooksEstimatesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Estimate` at the end of the edge.""" + node: QuickbooksEstimate +} + +""" +A filter to be used against EstimateLineItemType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksEstimateLineItemTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksEstimateLineItemType + + """Greater than the specified value.""" + greaterThan: QuickbooksEstimateLineItemType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksEstimateLineItemType + + """Less than the specified value.""" + lessThan: QuickbooksEstimateLineItemType + + """Not included in the specified list.""" + notIn: [QuickbooksEstimateLineItemType!] + + """Included in the specified list.""" + in: [QuickbooksEstimateLineItemType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksEstimateLineItemType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksEstimateLineItemType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksEstimateLineItemType + + """Equal to the specified value.""" + equalTo: QuickbooksEstimateLineItemType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `EstimateLineItem` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksEstimateLineItemFilter { + """Negates the expression.""" + not: QuickbooksEstimateLineItemFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksEstimateLineItemFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksEstimateLineItemFilter!] + + """Filter by the object’s `discountPercent` field.""" + discountPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `discountIsPercentBased` field.""" + discountIsPercentBased: QuickbooksBooleanFilter + + """Filter by the object’s `discountAccountId` field.""" + discountAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `groupItemId` field.""" + groupItemId: QuickbooksBigIntFilter + + """Filter by the object’s `taxClassificationId` field.""" + taxClassificationId: QuickbooksStringFilter + + """Filter by the object’s `unitPrice` field.""" + unitPrice: QuickbooksBigFloatFilter + + """Filter by the object’s `quantity` field.""" + quantity: QuickbooksBigFloatFilter + + """Filter by the object’s `discountRate` field.""" + discountRate: QuickbooksBigFloatFilter + + """Filter by the object’s `serviceDate` field.""" + serviceDate: QuickbooksDateFilter + + """Filter by the object’s `itemAccountId` field.""" + itemAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `markupPercent` field.""" + markupPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `markupAccountId` field.""" + markupAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `taxCodeId` field.""" + taxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `itemId` field.""" + itemId: QuickbooksBigIntFilter + + """Filter by the object’s `discountAmount` field.""" + discountAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `taxInclusiveAmount` field.""" + taxInclusiveAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `index` field.""" + index: QuickbooksIntFilter + + """Filter by the object’s `lineNumber` field.""" + lineNumber: QuickbooksIntFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `type` field.""" + type: QuickbooksEstimateLineItemTypeFilter + + """Filter by the object’s `estimateId` field.""" + estimateId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksEstimateLineItemsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + ESTIMATE_ID_ASC + ESTIMATE_ID_DESC + TYPE_ASC + TYPE_DESC + AMOUNT_ASC + AMOUNT_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + LINE_NUMBER_ASC + LINE_NUMBER_DESC + INDEX_ASC + INDEX_DESC + TAX_INCLUSIVE_AMOUNT_ASC + TAX_INCLUSIVE_AMOUNT_DESC + DISCOUNT_AMOUNT_ASC + DISCOUNT_AMOUNT_DESC + ITEM_ID_ASC + ITEM_ID_DESC + CLASS_ID_ASC + CLASS_ID_DESC + TAX_CODE_ID_ASC + TAX_CODE_ID_DESC + MARKUP_ACCOUNT_ID_ASC + MARKUP_ACCOUNT_ID_DESC + MARKUP_PERCENT_ASC + MARKUP_PERCENT_DESC + ITEM_ACCOUNT_ID_ASC + ITEM_ACCOUNT_ID_DESC + SERVICE_DATE_ASC + SERVICE_DATE_DESC + DISCOUNT_RATE_ASC + DISCOUNT_RATE_DESC + QUANTITY_ASC + QUANTITY_DESC + UNIT_PRICE_ASC + UNIT_PRICE_DESC + TAX_CLASSIFICATION_ID_ASC + TAX_CLASSIFICATION_ID_DESC + GROUP_ITEM_ID_ASC + GROUP_ITEM_ID_DESC + DISCOUNT_ACCOUNT_ID_ASC + DISCOUNT_ACCOUNT_ID_DESC + DISCOUNT_IS_PERCENT_BASED_ASC + DISCOUNT_IS_PERCENT_BASED_DESC + DISCOUNT_PERCENT_ASC + DISCOUNT_PERCENT_DESC +} + +"""""" +type QuickbooksEstimateLineItemsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + estimateId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + index: Float + + """""" + taxInclusiveAmount: Float + + """""" + discountAmount: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + itemAccountId: Float + + """""" + discountRate: Float + + """""" + quantity: Float + + """""" + unitPrice: Float + + """""" + groupItemId: Float + + """""" + discountAccountId: Float + + """""" + discountPercent: Float +} + +"""""" +type QuickbooksEstimateLineItemsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + estimateId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + index: Float + + """""" + taxInclusiveAmount: Float + + """""" + discountAmount: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + itemAccountId: Float + + """""" + discountRate: Float + + """""" + quantity: Float + + """""" + unitPrice: Float + + """""" + groupItemId: Float + + """""" + discountAccountId: Float + + """""" + discountPercent: Float +} + +"""""" +type QuickbooksEstimateLineItemsConnectionAggregates { + """""" + sum: QuickbooksEstimateLineItemsConnectionSums + + """""" + avg: QuickbooksEstimateLineItemsConnectionAverages +} + +"""A `EstimateLineItem` edge in the connection.""" +type QuickbooksEstimateLineItemsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `EstimateLineItem` at the end of the edge.""" + node: QuickbooksEstimateLineItem +} + +""" +A filter to be used against `Uqc` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksUqcFilter { + """Negates the expression.""" + not: QuickbooksUqcFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksUqcFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksUqcFilter!] + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `value` field.""" + value: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksIntFilter +} + +enum QuickbooksUqcsOrderBy { + NATURAL + ID_ASC + ID_DESC + VALUE_ASC + VALUE_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksUqcsConnectionAverages { + """""" + id: Float +} + +"""""" +type QuickbooksUqcsConnectionSums { + """""" + id: Float +} + +"""""" +type QuickbooksUqcsConnectionAggregates { + """""" + sum: QuickbooksUqcsConnectionSums + + """""" + avg: QuickbooksUqcsConnectionAverages +} + +"""A `Uqc` edge in the connection.""" +type QuickbooksUqcsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Uqc` at the end of the edge.""" + node: QuickbooksUqc +} + +"""A connection to a list of `Uqc` values.""" +type QuickbooksUqcsConnection { + """A list of `Uqc` objects.""" + nodes: [QuickbooksUqc]! + + """ + A list of edges which contains the `Uqc` and cursor to aid in pagination. + """ + edges: [QuickbooksUqcsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Uqc` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksUqcsConnectionAggregates +} + +""" +A filter to be used against `TaxExemptionReason` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTaxExemptionReasonFilter { + """Negates the expression.""" + not: QuickbooksTaxExemptionReasonFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksTaxExemptionReasonFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksTaxExemptionReasonFilter!] + + """Filter by the object’s `reason` field.""" + reason: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksIntFilter +} + +enum QuickbooksTaxExemptionReasonsOrderBy { + NATURAL + ID_ASC + ID_DESC + REASON_ASC + REASON_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksTaxExemptionReasonsConnectionAverages { + """""" + id: Float +} + +"""""" +type QuickbooksTaxExemptionReasonsConnectionSums { + """""" + id: Float +} + +"""""" +type QuickbooksTaxExemptionReasonsConnectionAggregates { + """""" + sum: QuickbooksTaxExemptionReasonsConnectionSums + + """""" + avg: QuickbooksTaxExemptionReasonsConnectionAverages +} + +"""A `TaxExemptionReason` edge in the connection.""" +type QuickbooksTaxExemptionReasonsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `TaxExemptionReason` at the end of the edge.""" + node: QuickbooksTaxExemptionReason +} + +"""A connection to a list of `TaxExemptionReason` values.""" +type QuickbooksTaxExemptionReasonsConnection { + """A list of `TaxExemptionReason` objects.""" + nodes: [QuickbooksTaxExemptionReason]! + + """ + A list of edges which contains the `TaxExemptionReason` and cursor to aid in pagination. + """ + edges: [QuickbooksTaxExemptionReasonsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `TaxExemptionReason` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksTaxExemptionReasonsConnectionAggregates +} + +""" +A filter to be used against `SalesTaxRateDetail` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksSalesTaxRateDetailFilter { + """Negates the expression.""" + not: QuickbooksSalesTaxRateDetailFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksSalesTaxRateDetailFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksSalesTaxRateDetailFilter!] + + """Filter by the object’s `taxRateId` field.""" + taxRateId: QuickbooksBigIntFilter + + """Filter by the object’s `taxCodeId` field.""" + taxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `taxOrder` field.""" + taxOrder: QuickbooksIntFilter + + """Filter by the object’s `index` field.""" + index: QuickbooksIntFilter + + """Filter by the object’s `taxTypeApplicable` field.""" + taxTypeApplicable: QuickbooksTaxTypeApplicableFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksSalesTaxRateDetailsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + TAX_TYPE_APPLICABLE_ASC + TAX_TYPE_APPLICABLE_DESC + INDEX_ASC + INDEX_DESC + TAX_ORDER_ASC + TAX_ORDER_DESC + TAX_CODE_ID_ASC + TAX_CODE_ID_DESC + TAX_RATE_ID_ASC + TAX_RATE_ID_DESC +} + +"""""" +type QuickbooksSalesTaxRateDetailsConnectionAverages { + """""" + realmId: Float + + """""" + index: Float + + """""" + taxOrder: Float + + """""" + taxCodeId: Float + + """""" + taxRateId: Float +} + +"""""" +type QuickbooksSalesTaxRateDetailsConnectionSums { + """""" + realmId: Float + + """""" + index: Float + + """""" + taxOrder: Float + + """""" + taxCodeId: Float + + """""" + taxRateId: Float +} + +"""""" +type QuickbooksSalesTaxRateDetailsConnectionAggregates { + """""" + sum: QuickbooksSalesTaxRateDetailsConnectionSums + + """""" + avg: QuickbooksSalesTaxRateDetailsConnectionAverages +} + +"""A `SalesTaxRateDetail` edge in the connection.""" +type QuickbooksSalesTaxRateDetailsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `SalesTaxRateDetail` at the end of the edge.""" + node: QuickbooksSalesTaxRateDetail +} + +"""""" +type QuickbooksSalesTaxRateDetail { + """""" + realmId: String! + + """""" + taxTypeApplicable: QuickbooksTaxTypeApplicable! + + """""" + index: Int! + + """""" + taxOrder: Int! + + """""" + taxCodeId: String! + + """""" + taxRateId: String! + + """Reads a single `Realm` that is related to this `SalesTaxRateDetail`.""" + realm: QuickbooksRealm + + """Reads a single `TaxCode` that is related to this `SalesTaxRateDetail`.""" + taxCode: QuickbooksTaxCode + + """Reads a single `TaxRate` that is related to this `SalesTaxRateDetail`.""" + taxRate: QuickbooksTaxRate +} + +"""A connection to a list of `SalesTaxRateDetail` values.""" +type QuickbooksSalesTaxRateDetailsConnection { + """A list of `SalesTaxRateDetail` objects.""" + nodes: [QuickbooksSalesTaxRateDetail]! + + """ + A list of edges which contains the `SalesTaxRateDetail` and cursor to aid in pagination. + """ + edges: [QuickbooksSalesTaxRateDetailsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `SalesTaxRateDetail` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksSalesTaxRateDetailsConnectionAggregates +} + +""" +A filter to be used against `Currency` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksCurrencyFilter { + """Negates the expression.""" + not: QuickbooksCurrencyFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksCurrencyFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksCurrencyFilter!] + + """Filter by the object’s `name` field.""" + name: QuickbooksStringFilter + + """Filter by the object’s `code` field.""" + code: QuickbooksStringFilter +} + +enum QuickbooksCurrenciesOrderBy { + NATURAL + CODE_ASC + CODE_DESC + NAME_ASC + NAME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""A `Currency` edge in the connection.""" +type QuickbooksCurrenciesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Currency` at the end of the edge.""" + node: QuickbooksCurrency +} + +"""A connection to a list of `Currency` values.""" +type QuickbooksCurrenciesConnection { + """A list of `Currency` objects.""" + nodes: [QuickbooksCurrency]! + + """ + A list of edges which contains the `Currency` and cursor to aid in pagination. + """ + edges: [QuickbooksCurrenciesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Currency` you could get from the connection.""" + totalCount: Int! +} + +"""The root query type which gives access points into the data universe.""" +type QuickbooksQuery implements OneGraphNode & QuickbooksNode { + """ + Exposes the root query type nested one level down. This is helpful for Relay 1 which can only query top level fields if they are in a particular form. + """ + query: QuickbooksQuery! + + """ + The root query type must be a `Node` to work well with Relay 1 mutations. This just resolves to `query`. + """ + nodeId: ID! + + """Fetches an object given its globally unique `ID`.""" + node( + """The globally unique `ID`.""" + nodeId: ID! + ): QuickbooksNode + + """Reads and enables pagination through a set of `Account`.""" + accounts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksAccountFilter + + """The method to use when ordering `Account`.""" + orderBy: [QuickbooksAccountsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksAccountsConnection + + """Reads and enables pagination through a set of `Bill`.""" + bills( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillFilter + + """The method to use when ordering `Bill`.""" + orderBy: [QuickbooksBillsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillsConnection + + """Reads and enables pagination through a set of `BillPayment`.""" + billPayments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillPaymentFilter + + """The method to use when ordering `BillPayment`.""" + orderBy: [QuickbooksBillPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillPaymentsConnection + + """Reads and enables pagination through a set of `Class`.""" + classes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksClassFilter + + """The method to use when ordering `Class`.""" + orderBy: [QuickbooksClassesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksClassesConnection + + """Reads and enables pagination through a set of `CompanyInfo`.""" + companyInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCompanyInfoFilter + + """The method to use when ordering `CompanyInfo`.""" + orderBy: [QuickbooksCompanyInfosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCompanyInfosConnection + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection + + """Reads and enables pagination through a set of `Currency`.""" + currencies( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCurrencyFilter + + """The method to use when ordering `Currency`.""" + orderBy: [QuickbooksCurrenciesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCurrenciesConnection + + """Reads and enables pagination through a set of `Customer`.""" + customers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCustomerFilter + + """The method to use when ordering `Customer`.""" + orderBy: [QuickbooksCustomersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCustomersConnection + + """Reads and enables pagination through a set of `Department`.""" + departments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepartmentFilter + + """The method to use when ordering `Department`.""" + orderBy: [QuickbooksDepartmentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepartmentsConnection + + """Reads and enables pagination through a set of `Deposit`.""" + deposits( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepositFilter + + """The method to use when ordering `Deposit`.""" + orderBy: [QuickbooksDepositsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepositsConnection + + """Reads and enables pagination through a set of `Employee`.""" + employees( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEmployeeFilter + + """The method to use when ordering `Employee`.""" + orderBy: [QuickbooksEmployeesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEmployeesConnection + + """Reads and enables pagination through a set of `Estimate`.""" + estimates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection + + """Reads and enables pagination through a set of `Invoice`.""" + invoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection + + """Reads and enables pagination through a set of `Item`.""" + items( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksItemFilter + + """The method to use when ordering `Item`.""" + orderBy: [QuickbooksItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksItemsConnection + + """Reads and enables pagination through a set of `JournalCode`.""" + journalCodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksJournalCodeFilter + + """The method to use when ordering `JournalCode`.""" + orderBy: [QuickbooksJournalCodesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksJournalCodesConnection + + """Reads and enables pagination through a set of `JournalEntry`.""" + journalEntries( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksJournalEntryFilter + + """The method to use when ordering `JournalEntry`.""" + orderBy: [QuickbooksJournalEntriesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksJournalEntriesConnection + + """Reads and enables pagination through a set of `Payment`.""" + payments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentFilter + + """The method to use when ordering `Payment`.""" + orderBy: [QuickbooksPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentsConnection + + """Reads and enables pagination through a set of `PaymentMethod`.""" + paymentMethods( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentMethodFilter + + """The method to use when ordering `PaymentMethod`.""" + orderBy: [QuickbooksPaymentMethodsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentMethodsConnection + + """Reads and enables pagination through a set of `PhysicalAddress`.""" + physicalAddresses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPhysicalAddressFilter + + """The method to use when ordering `PhysicalAddress`.""" + orderBy: [QuickbooksPhysicalAddressesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPhysicalAddressesConnection + + """Reads and enables pagination through a set of `Purchase`.""" + purchases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseFilter + + """The method to use when ordering `Purchase`.""" + orderBy: [QuickbooksPurchasesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchasesConnection + + """Reads and enables pagination through a set of `PurchaseLineItem`.""" + purchaseLineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseLineItemFilter + + """The method to use when ordering `PurchaseLineItem`.""" + orderBy: [QuickbooksPurchaseLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchaseLineItemsConnection + + """Reads and enables pagination through a set of `RefundReceipt`.""" + refundReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptFilter + + """The method to use when ordering `RefundReceipt`.""" + orderBy: [QuickbooksRefundReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptsConnection + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection + + """Reads and enables pagination through a set of `SalesTaxRateDetail`.""" + salesTaxRateDetails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesTaxRateDetailFilter + + """The method to use when ordering `SalesTaxRateDetail`.""" + orderBy: [QuickbooksSalesTaxRateDetailsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesTaxRateDetailsConnection + + """Reads and enables pagination through a set of `TaxAgency`.""" + taxAgencies( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTaxAgencyFilter + + """The method to use when ordering `TaxAgency`.""" + orderBy: [QuickbooksTaxAgenciesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTaxAgenciesConnection + + """Reads and enables pagination through a set of `TaxClassification`.""" + taxClassifications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTaxClassificationFilter + + """The method to use when ordering `TaxClassification`.""" + orderBy: [QuickbooksTaxClassificationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTaxClassificationsConnection + + """Reads and enables pagination through a set of `TaxCode`.""" + taxCodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTaxCodeFilter + + """The method to use when ordering `TaxCode`.""" + orderBy: [QuickbooksTaxCodesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTaxCodesConnection + + """Reads and enables pagination through a set of `TaxExemptionReason`.""" + taxExemptionReasons( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTaxExemptionReasonFilter + + """The method to use when ordering `TaxExemptionReason`.""" + orderBy: [QuickbooksTaxExemptionReasonsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTaxExemptionReasonsConnection + + """Reads and enables pagination through a set of `TaxRate`.""" + taxRates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTaxRateFilter + + """The method to use when ordering `TaxRate`.""" + orderBy: [QuickbooksTaxRatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTaxRatesConnection + + """Reads and enables pagination through a set of `Term`.""" + terms( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTermFilter + + """The method to use when ordering `Term`.""" + orderBy: [QuickbooksTermsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTermsConnection + + """Reads and enables pagination through a set of `TimeActivity`.""" + timeActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTimeActivityFilter + + """The method to use when ordering `TimeActivity`.""" + orderBy: [QuickbooksTimeActivitiesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTimeActivitiesConnection + + """Reads and enables pagination through a set of `Transfer`.""" + transfers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransferFilter + + """The method to use when ordering `Transfer`.""" + orderBy: [QuickbooksTransfersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransfersConnection + + """Reads and enables pagination through a set of `Uqc`.""" + uqcs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksUqcFilter + + """The method to use when ordering `Uqc`.""" + orderBy: [QuickbooksUqcsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksUqcsConnection + + """Reads and enables pagination through a set of `Vendor`.""" + vendors( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksVendorFilter + + """The method to use when ordering `Vendor`.""" + orderBy: [QuickbooksVendorsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksVendorsConnection + + """""" + currencyByCode(code: String!): QuickbooksCurrency + + """""" + taxExemptionReasonById(id: Int!): QuickbooksTaxExemptionReason + + """""" + uqcById(id: Int!): QuickbooksUqc + + """Reads a single `Account` using its globally unique `ID`.""" + account( + """The globally unique `ID` to be used in selecting a single `Account`.""" + nodeId: ID! + ): QuickbooksAccount + + """Reads a single `Bill` using its globally unique `ID`.""" + bill( + """The globally unique `ID` to be used in selecting a single `Bill`.""" + nodeId: ID! + ): QuickbooksBill + + """Reads a single `BillPayment` using its globally unique `ID`.""" + billPayment( + """ + The globally unique `ID` to be used in selecting a single `BillPayment`. + """ + nodeId: ID! + ): QuickbooksBillPayment + + """Reads a single `Class` using its globally unique `ID`.""" + class( + """The globally unique `ID` to be used in selecting a single `Class`.""" + nodeId: ID! + ): QuickbooksClass + + """Reads a single `CompanyInfo` using its globally unique `ID`.""" + companyInfo( + """ + The globally unique `ID` to be used in selecting a single `CompanyInfo`. + """ + nodeId: ID! + ): QuickbooksCompanyInfo + + """Reads a single `CreditMemo` using its globally unique `ID`.""" + creditMemo( + """ + The globally unique `ID` to be used in selecting a single `CreditMemo`. + """ + nodeId: ID! + ): QuickbooksCreditMemo + + """Reads a single `Currency` using its globally unique `ID`.""" + currency( + """The globally unique `ID` to be used in selecting a single `Currency`.""" + nodeId: ID! + ): QuickbooksCurrency + + """Reads a single `Customer` using its globally unique `ID`.""" + customer( + """The globally unique `ID` to be used in selecting a single `Customer`.""" + nodeId: ID! + ): QuickbooksCustomer + + """Reads a single `Department` using its globally unique `ID`.""" + department( + """ + The globally unique `ID` to be used in selecting a single `Department`. + """ + nodeId: ID! + ): QuickbooksDepartment + + """Reads a single `Deposit` using its globally unique `ID`.""" + deposit( + """The globally unique `ID` to be used in selecting a single `Deposit`.""" + nodeId: ID! + ): QuickbooksDeposit + + """Reads a single `Employee` using its globally unique `ID`.""" + employee( + """The globally unique `ID` to be used in selecting a single `Employee`.""" + nodeId: ID! + ): QuickbooksEmployee + + """Reads a single `Estimate` using its globally unique `ID`.""" + estimate( + """The globally unique `ID` to be used in selecting a single `Estimate`.""" + nodeId: ID! + ): QuickbooksEstimate + + """Reads a single `Invoice` using its globally unique `ID`.""" + invoice( + """The globally unique `ID` to be used in selecting a single `Invoice`.""" + nodeId: ID! + ): QuickbooksInvoice + + """Reads a single `Item` using its globally unique `ID`.""" + item( + """The globally unique `ID` to be used in selecting a single `Item`.""" + nodeId: ID! + ): QuickbooksItem + + """Reads a single `JournalCode` using its globally unique `ID`.""" + journalCode( + """ + The globally unique `ID` to be used in selecting a single `JournalCode`. + """ + nodeId: ID! + ): QuickbooksJournalCode + + """Reads a single `JournalEntry` using its globally unique `ID`.""" + journalEntry( + """ + The globally unique `ID` to be used in selecting a single `JournalEntry`. + """ + nodeId: ID! + ): QuickbooksJournalEntry + + """Reads a single `Payment` using its globally unique `ID`.""" + payment( + """The globally unique `ID` to be used in selecting a single `Payment`.""" + nodeId: ID! + ): QuickbooksPayment + + """Reads a single `PaymentMethod` using its globally unique `ID`.""" + paymentMethod( + """ + The globally unique `ID` to be used in selecting a single `PaymentMethod`. + """ + nodeId: ID! + ): QuickbooksPaymentMethod + + """Reads a single `PhysicalAddress` using its globally unique `ID`.""" + physicalAddress( + """ + The globally unique `ID` to be used in selecting a single `PhysicalAddress`. + """ + nodeId: ID! + ): QuickbooksPhysicalAddress + + """Reads a single `Purchase` using its globally unique `ID`.""" + purchase( + """The globally unique `ID` to be used in selecting a single `Purchase`.""" + nodeId: ID! + ): QuickbooksPurchase + + """Reads a single `RefundReceipt` using its globally unique `ID`.""" + refundReceipt( + """ + The globally unique `ID` to be used in selecting a single `RefundReceipt`. + """ + nodeId: ID! + ): QuickbooksRefundReceipt + + """Reads a single `SalesReceipt` using its globally unique `ID`.""" + salesReceipt( + """ + The globally unique `ID` to be used in selecting a single `SalesReceipt`. + """ + nodeId: ID! + ): QuickbooksSalesReceipt + + """Reads a single `TaxAgency` using its globally unique `ID`.""" + taxAgency( + """The globally unique `ID` to be used in selecting a single `TaxAgency`.""" + nodeId: ID! + ): QuickbooksTaxAgency + + """Reads a single `TaxClassification` using its globally unique `ID`.""" + taxClassification( + """ + The globally unique `ID` to be used in selecting a single `TaxClassification`. + """ + nodeId: ID! + ): QuickbooksTaxClassification + + """Reads a single `TaxCode` using its globally unique `ID`.""" + taxCode( + """The globally unique `ID` to be used in selecting a single `TaxCode`.""" + nodeId: ID! + ): QuickbooksTaxCode + + """Reads a single `TaxExemptionReason` using its globally unique `ID`.""" + taxExemptionReason( + """ + The globally unique `ID` to be used in selecting a single `TaxExemptionReason`. + """ + nodeId: ID! + ): QuickbooksTaxExemptionReason + + """Reads a single `TaxRate` using its globally unique `ID`.""" + taxRate( + """The globally unique `ID` to be used in selecting a single `TaxRate`.""" + nodeId: ID! + ): QuickbooksTaxRate + + """Reads a single `Term` using its globally unique `ID`.""" + term( + """The globally unique `ID` to be used in selecting a single `Term`.""" + nodeId: ID! + ): QuickbooksTerm + + """Reads a single `TimeActivity` using its globally unique `ID`.""" + timeActivity( + """ + The globally unique `ID` to be used in selecting a single `TimeActivity`. + """ + nodeId: ID! + ): QuickbooksTimeActivity + + """Reads a single `Transfer` using its globally unique `ID`.""" + transfer( + """The globally unique `ID` to be used in selecting a single `Transfer`.""" + nodeId: ID! + ): QuickbooksTransfer + + """Reads a single `Uqc` using its globally unique `ID`.""" + uqc( + """The globally unique `ID` to be used in selecting a single `Uqc`.""" + nodeId: ID! + ): QuickbooksUqc + + """Reads a single `Vendor` using its globally unique `ID`.""" + vendor( + """The globally unique `ID` to be used in selecting a single `Vendor`.""" + nodeId: ID! + ): QuickbooksVendor + + """""" + accountById(id: String!, realmId: String): QuickbooksAccount + + """""" + billById(id: String!, realmId: String): QuickbooksBill + + """""" + billPaymentById(id: String!, realmId: String): QuickbooksBillPayment + + """""" + classById(id: String!, realmId: String): QuickbooksClass + + """""" + companyInfoBy(realmId: String): QuickbooksCompanyInfo + + """""" + companyInfoById(id: String!, realmId: String): QuickbooksCompanyInfo + + """""" + creditMemoById(id: String!, realmId: String): QuickbooksCreditMemo + + """""" + customerById(id: String!, realmId: String): QuickbooksCustomer + + """""" + departmentById(id: String!, realmId: String): QuickbooksDepartment + + """""" + depositById(id: String!, realmId: String): QuickbooksDeposit + + """""" + employeeById(id: String!, realmId: String): QuickbooksEmployee + + """""" + estimateById(id: String!, realmId: String): QuickbooksEstimate + + """""" + invoiceById(id: String!, realmId: String): QuickbooksInvoice + + """""" + itemById(id: String!, realmId: String): QuickbooksItem + + """""" + journalCodeById(id: String!, realmId: String): QuickbooksJournalCode + + """""" + journalEntryById(id: String!, realmId: String): QuickbooksJournalEntry + + """""" + paymentById(id: String!, realmId: String): QuickbooksPayment + + """""" + paymentMethodById(id: String!, realmId: String): QuickbooksPaymentMethod + + """""" + physicalAddressById(id: String!, realmId: String): QuickbooksPhysicalAddress + + """""" + purchaseById(id: String!, realmId: String): QuickbooksPurchase + + """""" + refundReceiptById(id: String!, realmId: String): QuickbooksRefundReceipt + + """""" + salesReceiptById(id: String!, realmId: String): QuickbooksSalesReceipt + + """""" + taxAgencyById(id: String!, realmId: String): QuickbooksTaxAgency + + """""" + taxClassificationById(id: String!, realmId: String): QuickbooksTaxClassification + + """""" + taxCodeById(id: String!, realmId: String): QuickbooksTaxCode + + """""" + taxRateById(id: String!, realmId: String): QuickbooksTaxRate + + """""" + termById(id: String!, realmId: String): QuickbooksTerm + + """""" + timeActivityById(id: String!, realmId: String): QuickbooksTimeActivity + + """""" + transferById(id: String!, realmId: String): QuickbooksTransfer + + """""" + vendorById(id: String!, realmId: String): QuickbooksVendor + + """""" + realm(realmId: String): QuickbooksRealm + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Id of Standard Unit of Measure (UQC:Unique Quantity Code) of the item according to GST rule. +""" +type QuickbooksUqc implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: Int! + + """""" + value: String + + """""" + description: String + + """Reads and enables pagination through a set of `Item`.""" + items( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksItemFilter + + """The method to use when ordering `Item`.""" + orderBy: [QuickbooksItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksItemsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against MonthEnum fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksMonthEnumFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksMonthEnum + + """Greater than the specified value.""" + greaterThan: QuickbooksMonthEnum + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksMonthEnum + + """Less than the specified value.""" + lessThan: QuickbooksMonthEnum + + """Not included in the specified list.""" + notIn: [QuickbooksMonthEnum!] + + """Included in the specified list.""" + in: [QuickbooksMonthEnum!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksMonthEnum + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksMonthEnum + + """Not equal to the specified value.""" + notEqualTo: QuickbooksMonthEnum + + """Equal to the specified value.""" + equalTo: QuickbooksMonthEnum + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against String List fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksStringListFilter { + """Any array item is greater than or equal to the specified value.""" + anyGreaterThanOrEqualTo: String + + """Any array item is greater than the specified value.""" + anyGreaterThan: String + + """Any array item is less than or equal to the specified value.""" + anyLessThanOrEqualTo: String + + """Any array item is less than the specified value.""" + anyLessThan: String + + """Any array item is not equal to the specified value.""" + anyNotEqualTo: String + + """Any array item is equal to the specified value.""" + anyEqualTo: String + + """Overlaps the specified list of values.""" + overlaps: [String] + + """Contained by the specified list of values.""" + containedBy: [String] + + """Contains the specified list of values.""" + contains: [String] + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: [String] + + """Greater than the specified value.""" + greaterThan: [String] + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: [String] + + """Less than the specified value.""" + lessThan: [String] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: [String] + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: [String] + + """Not equal to the specified value.""" + notEqualTo: [String] + + """Equal to the specified value.""" + equalTo: [String] + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `CompanyInfo` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksCompanyInfoFilter { + """Negates the expression.""" + not: QuickbooksCompanyInfoFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksCompanyInfoFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksCompanyInfoFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `companyStartDate` field.""" + companyStartDate: QuickbooksDateFilter + + """Filter by the object’s `legalName` field.""" + legalName: QuickbooksStringFilter + + """Filter by the object’s `primaryPhoneNumber` field.""" + primaryPhoneNumber: QuickbooksStringFilter + + """Filter by the object’s `customerCommunicationAddressId` field.""" + customerCommunicationAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `fiscalYearStartMonth` field.""" + fiscalYearStartMonth: QuickbooksMonthEnumFilter + + """Filter by the object’s `webAddress` field.""" + webAddress: QuickbooksStringFilter + + """Filter by the object’s `email` field.""" + email: QuickbooksStringFilter + + """Filter by the object’s `country` field.""" + country: QuickbooksStringFilter + + """Filter by the object’s `supportedLanguages` field.""" + supportedLanguages: QuickbooksStringListFilter + + """Filter by the object’s `legalAddressId` field.""" + legalAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `addressId` field.""" + addressId: QuickbooksBigIntFilter + + """Filter by the object’s `name` field.""" + name: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksCompanyInfosOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + ADDRESS_ID_ASC + ADDRESS_ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + LEGAL_ADDRESS_ID_ASC + LEGAL_ADDRESS_ID_DESC + SUPPORTED_LANGUAGES_ASC + SUPPORTED_LANGUAGES_DESC + COUNTRY_ASC + COUNTRY_DESC + EMAIL_ASC + EMAIL_DESC + WEB_ADDRESS_ASC + WEB_ADDRESS_DESC + PREFERENCES_ASC + PREFERENCES_DESC + FISCAL_YEAR_START_MONTH_ASC + FISCAL_YEAR_START_MONTH_DESC + CUSTOMER_COMMUNICATION_ADDRESS_ID_ASC + CUSTOMER_COMMUNICATION_ADDRESS_ID_DESC + PRIMARY_PHONE_NUMBER_ASC + PRIMARY_PHONE_NUMBER_DESC + LEGAL_NAME_ASC + LEGAL_NAME_DESC + COMPANY_START_DATE_ASC + COMPANY_START_DATE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksCompanyInfosConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + addressId: Float + + """""" + syncToken: Float + + """""" + legalAddressId: Float + + """""" + customerCommunicationAddressId: Float +} + +"""""" +type QuickbooksCompanyInfosConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + addressId: Float + + """""" + syncToken: Float + + """""" + legalAddressId: Float + + """""" + customerCommunicationAddressId: Float +} + +"""""" +type QuickbooksCompanyInfosConnectionAggregates { + """""" + sum: QuickbooksCompanyInfosConnectionSums + + """""" + avg: QuickbooksCompanyInfosConnectionAverages +} + +"""A `CompanyInfo` edge in the connection.""" +type QuickbooksCompanyInfosEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `CompanyInfo` at the end of the edge.""" + node: QuickbooksCompanyInfo +} + +"""A connection to a list of `CompanyInfo` values.""" +type QuickbooksCompanyInfosConnection { + """A list of `CompanyInfo` objects.""" + nodes: [QuickbooksCompanyInfo]! + + """ + A list of edges which contains the `CompanyInfo` and cursor to aid in pagination. + """ + edges: [QuickbooksCompanyInfosEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `CompanyInfo` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksCompanyInfosConnectionAggregates +} + +""" +A filter to be used against TimeActivityNameOf fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTimeActivityNameOfFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksTimeActivityNameOf + + """Greater than the specified value.""" + greaterThan: QuickbooksTimeActivityNameOf + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksTimeActivityNameOf + + """Less than the specified value.""" + lessThan: QuickbooksTimeActivityNameOf + + """Not included in the specified list.""" + notIn: [QuickbooksTimeActivityNameOf!] + + """Included in the specified list.""" + in: [QuickbooksTimeActivityNameOf!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksTimeActivityNameOf + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksTimeActivityNameOf + + """Not equal to the specified value.""" + notEqualTo: QuickbooksTimeActivityNameOf + + """Equal to the specified value.""" + equalTo: QuickbooksTimeActivityNameOf + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `TimeActivity` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTimeActivityFilter { + """Negates the expression.""" + not: QuickbooksTimeActivityFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksTimeActivityFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksTimeActivityFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `taxable` field.""" + taxable: QuickbooksBooleanFilter + + """Filter by the object’s `billableStatus` field.""" + billableStatus: QuickbooksStringFilter + + """Filter by the object’s `departmentId` field.""" + departmentId: QuickbooksBigIntFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `itemId` field.""" + itemId: QuickbooksBigIntFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `customerId` field.""" + customerId: QuickbooksBigIntFilter + + """Filter by the object’s `endTime` field.""" + endTime: QuickbooksDatetimeFilter + + """Filter by the object’s `breakMinutes` field.""" + breakMinutes: QuickbooksIntFilter + + """Filter by the object’s `breakHours` field.""" + breakHours: QuickbooksIntFilter + + """Filter by the object’s `hourlyRate` field.""" + hourlyRate: QuickbooksBigFloatFilter + + """Filter by the object’s `startTime` field.""" + startTime: QuickbooksDatetimeFilter + + """Filter by the object’s `minutes` field.""" + minutes: QuickbooksIntFilter + + """Filter by the object’s `hours` field.""" + hours: QuickbooksIntFilter + + """Filter by the object’s `vendorId` field.""" + vendorId: QuickbooksBigIntFilter + + """Filter by the object’s `employeeId` field.""" + employeeId: QuickbooksBigIntFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `nameOf` field.""" + nameOf: QuickbooksTimeActivityNameOfFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksTimeActivitiesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + NAME_OF_ASC + NAME_OF_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + EMPLOYEE_ID_ASC + EMPLOYEE_ID_DESC + VENDOR_ID_ASC + VENDOR_ID_DESC + HOURS_ASC + HOURS_DESC + MINUTES_ASC + MINUTES_DESC + START_TIME_ASC + START_TIME_DESC + HOURLY_RATE_ASC + HOURLY_RATE_DESC + BREAK_HOURS_ASC + BREAK_HOURS_DESC + BREAK_MINUTES_ASC + BREAK_MINUTES_DESC + END_TIME_ASC + END_TIME_DESC + CUSTOMER_ID_ASC + CUSTOMER_ID_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + ITEM_ID_ASC + ITEM_ID_DESC + CLASS_ID_ASC + CLASS_ID_DESC + DEPARTMENT_ID_ASC + DEPARTMENT_ID_DESC + BILLABLE_STATUS_ASC + BILLABLE_STATUS_DESC + TAXABLE_ASC + TAXABLE_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +""" +A filter to be used against DepositTransactionStatus fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksDepositTransactionStatusFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksDepositTransactionStatus + + """Greater than the specified value.""" + greaterThan: QuickbooksDepositTransactionStatus + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksDepositTransactionStatus + + """Less than the specified value.""" + lessThan: QuickbooksDepositTransactionStatus + + """Not included in the specified list.""" + notIn: [QuickbooksDepositTransactionStatus!] + + """Included in the specified list.""" + in: [QuickbooksDepositTransactionStatus!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksDepositTransactionStatus + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksDepositTransactionStatus + + """Not equal to the specified value.""" + notEqualTo: QuickbooksDepositTransactionStatus + + """Equal to the specified value.""" + equalTo: QuickbooksDepositTransactionStatus + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Deposit` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksDepositFilter { + """Negates the expression.""" + not: QuickbooksDepositFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksDepositFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksDepositFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `transactionTotalTax` field.""" + transactionTotalTax: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionTaxCodeId` field.""" + transactionTaxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `cashBackMemo` field.""" + cashBackMemo: QuickbooksStringFilter + + """Filter by the object’s `cashBackAmount` field.""" + cashBackAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `cashBackAccountId` field.""" + cashBackAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `transactionSource` field.""" + transactionSource: QuickbooksStringFilter + + """Filter by the object’s `departmentId` field.""" + departmentId: QuickbooksBigIntFilter + + """Filter by the object’s `homeTotalAmount` field.""" + homeTotalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `globalTaxCalculation` field.""" + globalTaxCalculation: QuickbooksGlobalTaxCalculationFilter + + """Filter by the object’s `exchangeRate` field.""" + exchangeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `totalAmount` field.""" + totalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionStatus` field.""" + transactionStatus: QuickbooksDepositTransactionStatusFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `depositToAccountId` field.""" + depositToAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksDepositsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + DEPOSIT_TO_ACCOUNT_ID_ASC + DEPOSIT_TO_ACCOUNT_ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + TRANSACTION_STATUS_ASC + TRANSACTION_STATUS_DESC + TOTAL_AMOUNT_ASC + TOTAL_AMOUNT_DESC + EXCHANGE_RATE_ASC + EXCHANGE_RATE_DESC + GLOBAL_TAX_CALCULATION_ASC + GLOBAL_TAX_CALCULATION_DESC + HOME_TOTAL_AMOUNT_ASC + HOME_TOTAL_AMOUNT_DESC + DEPARTMENT_ID_ASC + DEPARTMENT_ID_DESC + TRANSACTION_SOURCE_ASC + TRANSACTION_SOURCE_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + CASH_BACK_ACCOUNT_ID_ASC + CASH_BACK_ACCOUNT_ID_DESC + CASH_BACK_AMOUNT_ASC + CASH_BACK_AMOUNT_DESC + CASH_BACK_MEMO_ASC + CASH_BACK_MEMO_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + TRANSACTION_TAX_CODE_ID_ASC + TRANSACTION_TAX_CODE_ID_DESC + TRANSACTION_TOTAL_TAX_ASC + TRANSACTION_TOTAL_TAX_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksDepositsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + depositToAccountId: Float + + """""" + syncToken: Float + + """""" + totalAmount: Float + + """""" + exchangeRate: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + cashBackAccountId: Float + + """""" + cashBackAmount: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float +} + +"""""" +type QuickbooksDepositsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + depositToAccountId: Float + + """""" + syncToken: Float + + """""" + totalAmount: Float + + """""" + exchangeRate: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + cashBackAccountId: Float + + """""" + cashBackAmount: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float +} + +"""""" +type QuickbooksDepositsConnectionAggregates { + """""" + sum: QuickbooksDepositsConnectionSums + + """""" + avg: QuickbooksDepositsConnectionAverages +} + +"""A `Deposit` edge in the connection.""" +type QuickbooksDepositsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Deposit` at the end of the edge.""" + node: QuickbooksDeposit +} + +"""A connection to a list of `Deposit` values.""" +type QuickbooksDepositsConnection { + """A list of `Deposit` objects.""" + nodes: [QuickbooksDeposit]! + + """ + A list of edges which contains the `Deposit` and cursor to aid in pagination. + """ + edges: [QuickbooksDepositsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Deposit` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksDepositsConnectionAggregates +} + +""" +A filter to be used against `Transfer` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTransferFilter { + """Negates the expression.""" + not: QuickbooksTransferFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksTransferFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksTransferFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `fromAccountId` field.""" + fromAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `toAccountId` field.""" + toAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksTransfersOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + TO_ACCOUNT_ID_ASC + TO_ACCOUNT_ID_DESC + AMOUNT_ASC + AMOUNT_DESC + FROM_ACCOUNT_ID_ASC + FROM_ACCOUNT_ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksTransfersConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + toAccountId: Float + + """""" + amount: Float + + """""" + fromAccountId: Float + + """""" + syncToken: Float +} + +"""""" +type QuickbooksTransfersConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + toAccountId: Float + + """""" + amount: Float + + """""" + fromAccountId: Float + + """""" + syncToken: Float +} + +"""""" +type QuickbooksTransfersConnectionAggregates { + """""" + sum: QuickbooksTransfersConnectionSums + + """""" + avg: QuickbooksTransfersConnectionAverages +} + +"""A `Transfer` edge in the connection.""" +type QuickbooksTransfersEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Transfer` at the end of the edge.""" + node: QuickbooksTransfer +} + +"""A connection to a list of `Transfer` values.""" +type QuickbooksTransfersConnection { + """A list of `Transfer` objects.""" + nodes: [QuickbooksTransfer]! + + """ + A list of edges which contains the `Transfer` and cursor to aid in pagination. + """ + edges: [QuickbooksTransfersEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Transfer` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksTransfersConnectionAggregates +} + +""" +A filter to be used against `JournalEntry` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksJournalEntryFilter { + """Negates the expression.""" + not: QuickbooksJournalEntryFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksJournalEntryFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksJournalEntryFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `adjustment` field.""" + adjustment: QuickbooksBooleanFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `transactionTotalTax` field.""" + transactionTotalTax: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionTaxCodeId` field.""" + transactionTaxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `homeTotalAmount` field.""" + homeTotalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `exchangeRate` field.""" + exchangeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `totalAmount` field.""" + totalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `docNumber` field.""" + docNumber: QuickbooksStringFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksJournalEntriesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + DOC_NUMBER_ASC + DOC_NUMBER_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + TOTAL_AMOUNT_ASC + TOTAL_AMOUNT_DESC + EXCHANGE_RATE_ASC + EXCHANGE_RATE_DESC + HOME_TOTAL_AMOUNT_ASC + HOME_TOTAL_AMOUNT_DESC + TRANSACTION_TAX_CODE_ID_ASC + TRANSACTION_TAX_CODE_ID_DESC + TRANSACTION_TOTAL_TAX_ASC + TRANSACTION_TOTAL_TAX_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + ADJUSTMENT_ASC + ADJUSTMENT_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksJournalEntriesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + totalAmount: Float + + """""" + exchangeRate: Float + + """""" + homeTotalAmount: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float +} + +"""""" +type QuickbooksJournalEntriesConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + totalAmount: Float + + """""" + exchangeRate: Float + + """""" + homeTotalAmount: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float +} + +"""""" +type QuickbooksJournalEntriesConnectionAggregates { + """""" + sum: QuickbooksJournalEntriesConnectionSums + + """""" + avg: QuickbooksJournalEntriesConnectionAverages +} + +"""A `JournalEntry` edge in the connection.""" +type QuickbooksJournalEntriesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `JournalEntry` at the end of the edge.""" + node: QuickbooksJournalEntry +} + +"""A connection to a list of `JournalEntry` values.""" +type QuickbooksJournalEntriesConnection { + """A list of `JournalEntry` objects.""" + nodes: [QuickbooksJournalEntry]! + + """ + A list of edges which contains the `JournalEntry` and cursor to aid in pagination. + """ + edges: [QuickbooksJournalEntriesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `JournalEntry` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksJournalEntriesConnectionAggregates +} + +""" +A filter to be used against JournalCodeType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksJournalCodeTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksJournalCodeType + + """Greater than the specified value.""" + greaterThan: QuickbooksJournalCodeType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksJournalCodeType + + """Less than the specified value.""" + lessThan: QuickbooksJournalCodeType + + """Not included in the specified list.""" + notIn: [QuickbooksJournalCodeType!] + + """Included in the specified list.""" + in: [QuickbooksJournalCodeType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksJournalCodeType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksJournalCodeType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksJournalCodeType + + """Equal to the specified value.""" + equalTo: QuickbooksJournalCodeType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `JournalCode` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksJournalCodeFilter { + """Negates the expression.""" + not: QuickbooksJournalCodeFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksJournalCodeFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksJournalCodeFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `type` field.""" + type: QuickbooksJournalCodeTypeFilter + + """Filter by the object’s `customFields` field.""" + customFields: QuickbooksJsonFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `name` field.""" + name: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksJournalCodesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + CUSTOM_FIELDS_ASC + CUSTOM_FIELDS_DESC + TYPE_ASC + TYPE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksJournalCodesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float +} + +"""""" +type QuickbooksJournalCodesConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float +} + +"""""" +type QuickbooksJournalCodesConnectionAggregates { + """""" + sum: QuickbooksJournalCodesConnectionSums + + """""" + avg: QuickbooksJournalCodesConnectionAverages +} + +"""A `JournalCode` edge in the connection.""" +type QuickbooksJournalCodesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `JournalCode` at the end of the edge.""" + node: QuickbooksJournalCode +} + +enum QuickbooksJournalCodeType { + EXPENSES + SALES + BANK + NOUVEAUX + WAGES + CASH + OTHERS +} + +"""""" +type QuickbooksJournalCode implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + name: String + + """""" + syncToken: String + + """""" + description: String + + """""" + customFields: String + + """""" + type: QuickbooksJournalCodeType + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `JournalCode` values.""" +type QuickbooksJournalCodesConnection { + """A list of `JournalCode` objects.""" + nodes: [QuickbooksJournalCode]! + + """ + A list of edges which contains the `JournalCode` and cursor to aid in pagination. + """ + edges: [QuickbooksJournalCodesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `JournalCode` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksJournalCodesConnectionAggregates +} + +""" +A filter to be used against TransactionStatus fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTransactionStatusFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksTransactionStatus + + """Greater than the specified value.""" + greaterThan: QuickbooksTransactionStatus + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksTransactionStatus + + """Less than the specified value.""" + lessThan: QuickbooksTransactionStatus + + """Not included in the specified list.""" + notIn: [QuickbooksTransactionStatus!] + + """Included in the specified list.""" + in: [QuickbooksTransactionStatus!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksTransactionStatus + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksTransactionStatus + + """Not equal to the specified value.""" + notEqualTo: QuickbooksTransactionStatus + + """Equal to the specified value.""" + equalTo: QuickbooksTransactionStatus + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Estimate` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksEstimateFilter { + """Negates the expression.""" + not: QuickbooksEstimateFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksEstimateFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksEstimateFilter!] + + """Filter by the object’s `deliveryTime` field.""" + deliveryTime: QuickbooksDatetimeFilter + + """Filter by the object’s `deliveryType` field.""" + deliveryType: QuickbooksDeliveryTypeFilter + + """Filter by the object’s `billingEmail` field.""" + billingEmail: QuickbooksStringFilter + + """Filter by the object’s `applyTaxAfterDiscount` field.""" + applyTaxAfterDiscount: QuickbooksBooleanFilter + + """Filter by the object’s `billingAddressId` field.""" + billingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `shippingMethod` field.""" + shippingMethod: QuickbooksStringFilter + + """Filter by the object’s `departmentId` field.""" + departmentId: QuickbooksBigIntFilter + + """Filter by the object’s `homeTotalAmount` field.""" + homeTotalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `shippingAddressId` field.""" + shippingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `exchangeRate` field.""" + exchangeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `acceptedBy` field.""" + acceptedBy: QuickbooksStringFilter + + """Filter by the object’s `transactionTotalTax` field.""" + transactionTotalTax: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionTaxCodeId` field.""" + transactionTaxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `emailStatus` field.""" + emailStatus: QuickbooksEmailStatusFilter + + """Filter by the object’s `customerMemo` field.""" + customerMemo: QuickbooksStringFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `docNumber` field.""" + docNumber: QuickbooksStringFilter + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `dueDate` field.""" + dueDate: QuickbooksDateFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `expirationDate` field.""" + expirationDate: QuickbooksDateFilter + + """Filter by the object’s `acceptedDate` field.""" + acceptedDate: QuickbooksDateFilter + + """Filter by the object’s `totalAmount` field.""" + totalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `globalTaxCalculation` field.""" + globalTaxCalculation: QuickbooksGlobalTaxCalculationFilter + + """Filter by the object’s `transactionStatus` field.""" + transactionStatus: QuickbooksTransactionStatusFilter + + """Filter by the object’s `salesTermId` field.""" + salesTermId: QuickbooksBigIntFilter + + """Filter by the object’s `customFields` field.""" + customFields: QuickbooksJsonFilter + + """Filter by the object’s `printStatus` field.""" + printStatus: QuickbooksPrintStatusFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `shipDate` field.""" + shipDate: QuickbooksDateFilter + + """Filter by the object’s `shipFromAddressId` field.""" + shipFromAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `customerId` field.""" + customerId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksEstimatesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + CUSTOMER_ID_ASC + CUSTOMER_ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + SHIP_FROM_ADDRESS_ID_ASC + SHIP_FROM_ADDRESS_ID_DESC + SHIP_DATE_ASC + SHIP_DATE_DESC + CLASS_ID_ASC + CLASS_ID_DESC + PRINT_STATUS_ASC + PRINT_STATUS_DESC + CUSTOM_FIELDS_ASC + CUSTOM_FIELDS_DESC + SALES_TERM_ID_ASC + SALES_TERM_ID_DESC + TRANSACTION_STATUS_ASC + TRANSACTION_STATUS_DESC + GLOBAL_TAX_CALCULATION_ASC + GLOBAL_TAX_CALCULATION_DESC + TOTAL_AMOUNT_ASC + TOTAL_AMOUNT_DESC + ACCEPTED_DATE_ASC + ACCEPTED_DATE_DESC + EXPIRATION_DATE_ASC + EXPIRATION_DATE_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + DUE_DATE_ASC + DUE_DATE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + DOC_NUMBER_ASC + DOC_NUMBER_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + CUSTOMER_MEMO_ASC + CUSTOMER_MEMO_DESC + EMAIL_STATUS_ASC + EMAIL_STATUS_DESC + TRANSACTION_TAX_CODE_ID_ASC + TRANSACTION_TAX_CODE_ID_DESC + TRANSACTION_TOTAL_TAX_ASC + TRANSACTION_TOTAL_TAX_DESC + ACCEPTED_BY_ASC + ACCEPTED_BY_DESC + EXCHANGE_RATE_ASC + EXCHANGE_RATE_DESC + SHIPPING_ADDRESS_ID_ASC + SHIPPING_ADDRESS_ID_DESC + HOME_TOTAL_AMOUNT_ASC + HOME_TOTAL_AMOUNT_DESC + DEPARTMENT_ID_ASC + DEPARTMENT_ID_DESC + SHIPPING_METHOD_ASC + SHIPPING_METHOD_DESC + BILLING_ADDRESS_ID_ASC + BILLING_ADDRESS_ID_DESC + APPLY_TAX_AFTER_DISCOUNT_ASC + APPLY_TAX_AFTER_DISCOUNT_DESC + BILLING_EMAIL_ASC + BILLING_EMAIL_DESC + DELIVERY_TYPE_ASC + DELIVERY_TYPE_DESC + DELIVERY_TIME_ASC + DELIVERY_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +""" +A filter to be used against `Employee` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksEmployeeFilter { + """Negates the expression.""" + not: QuickbooksEmployeeFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksEmployeeFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksEmployeeFilter!] + + """Filter by the object’s `v4IdPseudonym` field.""" + v4IdPseudonym: QuickbooksStringFilter + + """Filter by the object’s `employeeNumber` field.""" + employeeNumber: QuickbooksStringFilter + + """Filter by the object’s `printOnCheckName` field.""" + printOnCheckName: QuickbooksStringFilter + + """Filter by the object’s `familyName` field.""" + familyName: QuickbooksStringFilter + + """Filter by the object’s `suffix` field.""" + suffix: QuickbooksStringFilter + + """Filter by the object’s `organization` field.""" + organization: QuickbooksBooleanFilter + + """Filter by the object’s `billRate` field.""" + billRate: QuickbooksBigFloatFilter + + """Filter by the object’s `hiredDate` field.""" + hiredDate: QuickbooksDateFilter + + """Filter by the object’s `gender` field.""" + gender: QuickbooksStringFilter + + """Filter by the object’s `mobileNumber` field.""" + mobileNumber: QuickbooksStringFilter + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `releasedDate` field.""" + releasedDate: QuickbooksDateFilter + + """Filter by the object’s `active` field.""" + active: QuickbooksBooleanFilter + + """Filter by the object’s `primaryPhoneNumber` field.""" + primaryPhoneNumber: QuickbooksStringFilter + + """Filter by the object’s `ssn` field.""" + ssn: QuickbooksStringFilter + + """Filter by the object’s `middleName` field.""" + middleName: QuickbooksStringFilter + + """Filter by the object’s `birthDate` field.""" + birthDate: QuickbooksDateFilter + + """Filter by the object’s `givenName` field.""" + givenName: QuickbooksStringFilter + + """Filter by the object’s `billableTime` field.""" + billableTime: QuickbooksBooleanFilter + + """Filter by the object’s `title` field.""" + title: QuickbooksStringFilter + + """Filter by the object’s `displayName` field.""" + displayName: QuickbooksStringFilter + + """Filter by the object’s `primaryEmailAddress` field.""" + primaryEmailAddress: QuickbooksStringFilter + + """Filter by the object’s `primaryAddressId` field.""" + primaryAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksEmployeesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + PRIMARY_ADDRESS_ID_ASC + PRIMARY_ADDRESS_ID_DESC + PRIMARY_EMAIL_ADDRESS_ASC + PRIMARY_EMAIL_ADDRESS_DESC + DISPLAY_NAME_ASC + DISPLAY_NAME_DESC + TITLE_ASC + TITLE_DESC + BILLABLE_TIME_ASC + BILLABLE_TIME_DESC + GIVEN_NAME_ASC + GIVEN_NAME_DESC + BIRTH_DATE_ASC + BIRTH_DATE_DESC + MIDDLE_NAME_ASC + MIDDLE_NAME_DESC + SSN_ASC + SSN_DESC + PRIMARY_PHONE_NUMBER_ASC + PRIMARY_PHONE_NUMBER_DESC + ACTIVE_ASC + ACTIVE_DESC + RELEASED_DATE_ASC + RELEASED_DATE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + MOBILE_NUMBER_ASC + MOBILE_NUMBER_DESC + GENDER_ASC + GENDER_DESC + HIRED_DATE_ASC + HIRED_DATE_DESC + BILL_RATE_ASC + BILL_RATE_DESC + ORGANIZATION_ASC + ORGANIZATION_DESC + SUFFIX_ASC + SUFFIX_DESC + FAMILY_NAME_ASC + FAMILY_NAME_DESC + PRINT_ON_CHECK_NAME_ASC + PRINT_ON_CHECK_NAME_DESC + EMPLOYEE_NUMBER_ASC + EMPLOYEE_NUMBER_DESC + V4_ID_PSEUDONYM_ASC + V4_ID_PSEUDONYM_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +""" +A filter to be used against TaxTypeApplicable fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTaxTypeApplicableFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksTaxTypeApplicable + + """Greater than the specified value.""" + greaterThan: QuickbooksTaxTypeApplicable + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksTaxTypeApplicable + + """Less than the specified value.""" + lessThan: QuickbooksTaxTypeApplicable + + """Not included in the specified list.""" + notIn: [QuickbooksTaxTypeApplicable!] + + """Included in the specified list.""" + in: [QuickbooksTaxTypeApplicable!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksTaxTypeApplicable + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksTaxTypeApplicable + + """Not equal to the specified value.""" + notEqualTo: QuickbooksTaxTypeApplicable + + """Equal to the specified value.""" + equalTo: QuickbooksTaxTypeApplicable + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `PurchaseTaxRateDetail` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPurchaseTaxRateDetailFilter { + """Negates the expression.""" + not: QuickbooksPurchaseTaxRateDetailFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksPurchaseTaxRateDetailFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksPurchaseTaxRateDetailFilter!] + + """Filter by the object’s `taxRateId` field.""" + taxRateId: QuickbooksBigIntFilter + + """Filter by the object’s `taxCodeId` field.""" + taxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `taxOrder` field.""" + taxOrder: QuickbooksIntFilter + + """Filter by the object’s `index` field.""" + index: QuickbooksIntFilter + + """Filter by the object’s `taxTypeApplicable` field.""" + taxTypeApplicable: QuickbooksTaxTypeApplicableFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksPurchaseTaxRateDetailsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + TAX_TYPE_APPLICABLE_ASC + TAX_TYPE_APPLICABLE_DESC + INDEX_ASC + INDEX_DESC + TAX_ORDER_ASC + TAX_ORDER_DESC + TAX_CODE_ID_ASC + TAX_CODE_ID_DESC + TAX_RATE_ID_ASC + TAX_RATE_ID_DESC +} + +"""""" +type QuickbooksPurchaseTaxRateDetailsConnectionAverages { + """""" + realmId: Float + + """""" + index: Float + + """""" + taxOrder: Float + + """""" + taxCodeId: Float + + """""" + taxRateId: Float +} + +"""""" +type QuickbooksPurchaseTaxRateDetailsConnectionSums { + """""" + realmId: Float + + """""" + index: Float + + """""" + taxOrder: Float + + """""" + taxCodeId: Float + + """""" + taxRateId: Float +} + +"""""" +type QuickbooksPurchaseTaxRateDetailsConnectionAggregates { + """""" + sum: QuickbooksPurchaseTaxRateDetailsConnectionSums + + """""" + avg: QuickbooksPurchaseTaxRateDetailsConnectionAverages +} + +"""A `PurchaseTaxRateDetail` edge in the connection.""" +type QuickbooksPurchaseTaxRateDetailsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `PurchaseTaxRateDetail` at the end of the edge.""" + node: QuickbooksPurchaseTaxRateDetail +} + +enum QuickbooksTaxTypeApplicable { + TAX_ON_AMOUNT + TAX_ON_AMOUNT_PLUS_TAX + TAX_ON_TAX +} + +"""""" +type QuickbooksPurchaseTaxRateDetail { + """""" + realmId: String! + + """""" + taxTypeApplicable: QuickbooksTaxTypeApplicable! + + """""" + index: Int! + + """""" + taxOrder: Int! + + """""" + taxCodeId: String! + + """""" + taxRateId: String! + + """ + Reads a single `Realm` that is related to this `PurchaseTaxRateDetail`. + """ + realm: QuickbooksRealm + + """ + Reads a single `TaxCode` that is related to this `PurchaseTaxRateDetail`. + """ + taxCode: QuickbooksTaxCode + + """ + Reads a single `TaxRate` that is related to this `PurchaseTaxRateDetail`. + """ + taxRate: QuickbooksTaxRate +} + +"""A connection to a list of `PurchaseTaxRateDetail` values.""" +type QuickbooksPurchaseTaxRateDetailsConnection { + """A list of `PurchaseTaxRateDetail` objects.""" + nodes: [QuickbooksPurchaseTaxRateDetail]! + + """ + A list of edges which contains the `PurchaseTaxRateDetail` and cursor to aid in pagination. + """ + edges: [QuickbooksPurchaseTaxRateDetailsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `PurchaseTaxRateDetail` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksPurchaseTaxRateDetailsConnectionAggregates +} + +""" +A filter to be used against `TaxAgency` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTaxAgencyFilter { + """Negates the expression.""" + not: QuickbooksTaxAgencyFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksTaxAgencyFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksTaxAgencyFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `taxRegistrationNumber` field.""" + taxRegistrationNumber: QuickbooksStringFilter + + """Filter by the object’s `lastFileDate` field.""" + lastFileDate: QuickbooksDateFilter + + """Filter by the object’s `taxTrackedOnPurchases` field.""" + taxTrackedOnPurchases: QuickbooksBooleanFilter + + """Filter by the object’s `taxTrackedOnSales` field.""" + taxTrackedOnSales: QuickbooksBooleanFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `displayName` field.""" + displayName: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksTaxAgenciesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + DISPLAY_NAME_ASC + DISPLAY_NAME_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + TAX_TRACKED_ON_SALES_ASC + TAX_TRACKED_ON_SALES_DESC + TAX_TRACKED_ON_PURCHASES_ASC + TAX_TRACKED_ON_PURCHASES_DESC + LAST_FILE_DATE_ASC + LAST_FILE_DATE_DESC + TAX_REGISTRATION_NUMBER_ASC + TAX_REGISTRATION_NUMBER_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksTaxAgenciesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float +} + +"""""" +type QuickbooksTaxAgenciesConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float +} + +"""""" +type QuickbooksTaxAgenciesConnectionAggregates { + """""" + sum: QuickbooksTaxAgenciesConnectionSums + + """""" + avg: QuickbooksTaxAgenciesConnectionAverages +} + +"""A `TaxAgency` edge in the connection.""" +type QuickbooksTaxAgenciesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `TaxAgency` at the end of the edge.""" + node: QuickbooksTaxAgency +} + +"""A connection to a list of `TaxAgency` values.""" +type QuickbooksTaxAgenciesConnection { + """A list of `TaxAgency` objects.""" + nodes: [QuickbooksTaxAgency]! + + """ + A list of edges which contains the `TaxAgency` and cursor to aid in pagination. + """ + edges: [QuickbooksTaxAgenciesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `TaxAgency` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksTaxAgenciesConnectionAggregates +} + +""" +A filter to be used against `TaxCode` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTaxCodeFilter { + """Negates the expression.""" + not: QuickbooksTaxCodeFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksTaxCodeFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksTaxCodeFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `hidden` field.""" + hidden: QuickbooksBooleanFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `active` field.""" + active: QuickbooksBooleanFilter + + """Filter by the object’s `taxable` field.""" + taxable: QuickbooksBooleanFilter + + """Filter by the object’s `taxGroup` field.""" + taxGroup: QuickbooksBooleanFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `name` field.""" + name: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksTaxCodesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + TAX_GROUP_ASC + TAX_GROUP_DESC + TAXABLE_ASC + TAXABLE_DESC + ACTIVE_ASC + ACTIVE_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + HIDDEN_ASC + HIDDEN_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksTaxCodesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float +} + +"""""" +type QuickbooksTaxCodesConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float +} + +"""""" +type QuickbooksTaxCodesConnectionAggregates { + """""" + sum: QuickbooksTaxCodesConnectionSums + + """""" + avg: QuickbooksTaxCodesConnectionAverages +} + +"""A `TaxCode` edge in the connection.""" +type QuickbooksTaxCodesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `TaxCode` at the end of the edge.""" + node: QuickbooksTaxCode +} + +"""A connection to a list of `TaxCode` values.""" +type QuickbooksTaxCodesConnection { + """A list of `TaxCode` objects.""" + nodes: [QuickbooksTaxCode]! + + """ + A list of edges which contains the `TaxCode` and cursor to aid in pagination. + """ + edges: [QuickbooksTaxCodesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `TaxCode` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksTaxCodesConnectionAggregates +} + +""" +A filter to be used against TermType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTermTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksTermType + + """Greater than the specified value.""" + greaterThan: QuickbooksTermType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksTermType + + """Less than the specified value.""" + lessThan: QuickbooksTermType + + """Not included in the specified list.""" + notIn: [QuickbooksTermType!] + + """Included in the specified list.""" + in: [QuickbooksTermType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksTermType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksTermType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksTermType + + """Equal to the specified value.""" + equalTo: QuickbooksTermType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Term` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTermFilter { + """Negates the expression.""" + not: QuickbooksTermFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksTermFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksTermFilter!] + + """Filter by the object’s `dueDays` field.""" + dueDays: QuickbooksIntFilter + + """Filter by the object’s `discountDayOfMonth` field.""" + discountDayOfMonth: QuickbooksIntFilter + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `type` field.""" + type: QuickbooksTermTypeFilter + + """Filter by the object’s `active` field.""" + active: QuickbooksBooleanFilter + + """Filter by the object’s `discountDays` field.""" + discountDays: QuickbooksIntFilter + + """Filter by the object’s `discountPercent` field.""" + discountPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `name` field.""" + name: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksTermsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + DISCOUNT_PERCENT_ASC + DISCOUNT_PERCENT_DESC + DISCOUNT_DAYS_ASC + DISCOUNT_DAYS_DESC + ACTIVE_ASC + ACTIVE_DESC + TYPE_ASC + TYPE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + DISCOUNT_DAY_OF_MONTH_ASC + DISCOUNT_DAY_OF_MONTH_DESC + DUE_DAYS_ASC + DUE_DAYS_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksTermsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + discountPercent: Float + + """""" + discountDays: Float + + """""" + discountDayOfMonth: Float + + """""" + dueDays: Float +} + +"""""" +type QuickbooksTermsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + discountPercent: Float + + """""" + discountDays: Float + + """""" + discountDayOfMonth: Float + + """""" + dueDays: Float +} + +"""""" +type QuickbooksTermsConnectionAggregates { + """""" + sum: QuickbooksTermsConnectionSums + + """""" + avg: QuickbooksTermsConnectionAverages +} + +"""A `Term` edge in the connection.""" +type QuickbooksTermsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Term` at the end of the edge.""" + node: QuickbooksTerm +} + +"""A connection to a list of `Term` values.""" +type QuickbooksTermsConnection { + """A list of `Term` objects.""" + nodes: [QuickbooksTerm]! + + """ + A list of edges which contains the `Term` and cursor to aid in pagination. + """ + edges: [QuickbooksTermsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Term` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksTermsConnectionAggregates +} + +""" +A filter to be used against PaymentMethodType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPaymentMethodTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksPaymentMethodType + + """Greater than the specified value.""" + greaterThan: QuickbooksPaymentMethodType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksPaymentMethodType + + """Less than the specified value.""" + lessThan: QuickbooksPaymentMethodType + + """Not included in the specified list.""" + notIn: [QuickbooksPaymentMethodType!] + + """Included in the specified list.""" + in: [QuickbooksPaymentMethodType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksPaymentMethodType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksPaymentMethodType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksPaymentMethodType + + """Equal to the specified value.""" + equalTo: QuickbooksPaymentMethodType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `PaymentMethod` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPaymentMethodFilter { + """Negates the expression.""" + not: QuickbooksPaymentMethodFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksPaymentMethodFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksPaymentMethodFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `type` field.""" + type: QuickbooksPaymentMethodTypeFilter + + """Filter by the object’s `active` field.""" + active: QuickbooksBooleanFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `name` field.""" + name: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksPaymentMethodsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + ACTIVE_ASC + ACTIVE_DESC + TYPE_ASC + TYPE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksPaymentMethodsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float +} + +"""""" +type QuickbooksPaymentMethodsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float +} + +"""""" +type QuickbooksPaymentMethodsConnectionAggregates { + """""" + sum: QuickbooksPaymentMethodsConnectionSums + + """""" + avg: QuickbooksPaymentMethodsConnectionAverages +} + +"""A `PaymentMethod` edge in the connection.""" +type QuickbooksPaymentMethodsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `PaymentMethod` at the end of the edge.""" + node: QuickbooksPaymentMethod +} + +""" +A filter to be used against PurchasePaymentType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPurchasePaymentTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksPurchasePaymentType + + """Greater than the specified value.""" + greaterThan: QuickbooksPurchasePaymentType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksPurchasePaymentType + + """Less than the specified value.""" + lessThan: QuickbooksPurchasePaymentType + + """Not included in the specified list.""" + notIn: [QuickbooksPurchasePaymentType!] + + """Included in the specified list.""" + in: [QuickbooksPurchasePaymentType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksPurchasePaymentType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksPurchasePaymentType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksPurchasePaymentType + + """Equal to the specified value.""" + equalTo: QuickbooksPurchasePaymentType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Purchase` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPurchaseFilter { + """Negates the expression.""" + not: QuickbooksPurchaseFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksPurchaseFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksPurchaseFilter!] + + """Filter by the object’s `employeeId` field.""" + employeeId: QuickbooksBigIntFilter + + """Filter by the object’s `vendorId` field.""" + vendorId: QuickbooksBigIntFilter + + """Filter by the object’s `customerId` field.""" + customerId: QuickbooksBigIntFilter + + """Filter by the object’s `departmentId` field.""" + departmentId: QuickbooksBigIntFilter + + """Filter by the object’s `exchangeRate` field.""" + exchangeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `paymentMethodId` field.""" + paymentMethodId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionTotalTax` field.""" + transactionTotalTax: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionTaxCodeId` field.""" + transactionTaxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `credit` field.""" + credit: QuickbooksBooleanFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `docNumber` field.""" + docNumber: QuickbooksStringFilter + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `totalAmount` field.""" + totalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `globalTaxCalculation` field.""" + globalTaxCalculation: QuickbooksGlobalTaxCalculationFilter + + """Filter by the object’s `transactionSource` field.""" + transactionSource: QuickbooksStringFilter + + """Filter by the object’s `remitToAddressId` field.""" + remitToAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `printStatus` field.""" + printStatus: QuickbooksPrintStatusFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `accountId` field.""" + accountId: QuickbooksBigIntFilter + + """Filter by the object’s `paymentType` field.""" + paymentType: QuickbooksPurchasePaymentTypeFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksPurchasesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + PAYMENT_TYPE_ASC + PAYMENT_TYPE_DESC + ACCOUNT_ID_ASC + ACCOUNT_ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + PRINT_STATUS_ASC + PRINT_STATUS_DESC + REMIT_TO_ADDRESS_ID_ASC + REMIT_TO_ADDRESS_ID_DESC + TRANSACTION_SOURCE_ASC + TRANSACTION_SOURCE_DESC + GLOBAL_TAX_CALCULATION_ASC + GLOBAL_TAX_CALCULATION_DESC + TOTAL_AMOUNT_ASC + TOTAL_AMOUNT_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + DOC_NUMBER_ASC + DOC_NUMBER_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + CREDIT_ASC + CREDIT_DESC + TRANSACTION_TAX_CODE_ID_ASC + TRANSACTION_TAX_CODE_ID_DESC + TRANSACTION_TOTAL_TAX_ASC + TRANSACTION_TOTAL_TAX_DESC + PAYMENT_METHOD_ID_ASC + PAYMENT_METHOD_ID_DESC + EXCHANGE_RATE_ASC + EXCHANGE_RATE_DESC + DEPARTMENT_ID_ASC + DEPARTMENT_ID_DESC + CUSTOMER_ID_ASC + CUSTOMER_ID_DESC + VENDOR_ID_ASC + VENDOR_ID_DESC + EMPLOYEE_ID_ASC + EMPLOYEE_ID_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksPurchasesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + accountId: Float + + """""" + syncToken: Float + + """""" + remitToAddressId: Float + + """""" + totalAmount: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + paymentMethodId: Float + + """""" + exchangeRate: Float + + """""" + departmentId: Float + + """""" + customerId: Float + + """""" + vendorId: Float + + """""" + employeeId: Float +} + +"""""" +type QuickbooksPurchasesConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + accountId: Float + + """""" + syncToken: Float + + """""" + remitToAddressId: Float + + """""" + totalAmount: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + paymentMethodId: Float + + """""" + exchangeRate: Float + + """""" + departmentId: Float + + """""" + customerId: Float + + """""" + vendorId: Float + + """""" + employeeId: Float +} + +"""""" +type QuickbooksPurchasesConnectionAggregates { + """""" + sum: QuickbooksPurchasesConnectionSums + + """""" + avg: QuickbooksPurchasesConnectionAverages +} + +"""A `Purchase` edge in the connection.""" +type QuickbooksPurchasesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Purchase` at the end of the edge.""" + node: QuickbooksPurchase +} + +"""A connection to a list of `Purchase` values.""" +type QuickbooksPurchasesConnection { + """A list of `Purchase` objects.""" + nodes: [QuickbooksPurchase]! + + """ + A list of edges which contains the `Purchase` and cursor to aid in pagination. + """ + edges: [QuickbooksPurchasesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Purchase` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksPurchasesConnectionAggregates +} + +""" +A filter to be used against `SalesReceipt` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksSalesReceiptFilter { + """Negates the expression.""" + not: QuickbooksSalesReceiptFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksSalesReceiptFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksSalesReceiptFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `billingAddressId` field.""" + billingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `shippingMethod` field.""" + shippingMethod: QuickbooksStringFilter + + """Filter by the object’s `departmentId` field.""" + departmentId: QuickbooksBigIntFilter + + """Filter by the object’s `homeTotalAmount` field.""" + homeTotalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `shippingAddressId` field.""" + shippingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `exchangeRate` field.""" + exchangeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `paymentMethodId` field.""" + paymentMethodId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionTotalTax` field.""" + transactionTotalTax: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionTaxCodeId` field.""" + transactionTaxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `balance` field.""" + balance: QuickbooksBigFloatFilter + + """Filter by the object’s `emailStatus` field.""" + emailStatus: QuickbooksEmailStatusFilter + + """Filter by the object’s `customerMemo` field.""" + customerMemo: QuickbooksStringFilter + + """Filter by the object’s `depositToAccountId` field.""" + depositToAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `docNumber` field.""" + docNumber: QuickbooksStringFilter + + """Filter by the object’s `applyTaxAfterDiscount` field.""" + applyTaxAfterDiscount: QuickbooksBooleanFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `totalAmount` field.""" + totalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `globalTaxCalculation` field.""" + globalTaxCalculation: QuickbooksGlobalTaxCalculationFilter + + """Filter by the object’s `transactionSource` field.""" + transactionSource: QuickbooksStringFilter + + """Filter by the object’s `deliveryTime` field.""" + deliveryTime: QuickbooksDatetimeFilter + + """Filter by the object’s `deliveryType` field.""" + deliveryType: QuickbooksDeliveryTypeFilter + + """Filter by the object’s `paymentReferenceNumber` field.""" + paymentReferenceNumber: QuickbooksStringFilter + + """Filter by the object’s `printStatus` field.""" + printStatus: QuickbooksPrintStatusFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `trackingNumber` field.""" + trackingNumber: QuickbooksStringFilter + + """Filter by the object’s `shipDate` field.""" + shipDate: QuickbooksDateFilter + + """Filter by the object’s `homeBalance` field.""" + homeBalance: QuickbooksBigFloatFilter + + """Filter by the object’s `customFields` field.""" + customFields: QuickbooksJsonFilter + + """Filter by the object’s `shipFromAddressId` field.""" + shipFromAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `billingEmail` field.""" + billingEmail: QuickbooksStringFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `customerId` field.""" + customerId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksSalesReceiptsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + CUSTOMER_ID_ASC + CUSTOMER_ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + BILLING_EMAIL_ASC + BILLING_EMAIL_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + SHIP_FROM_ADDRESS_ID_ASC + SHIP_FROM_ADDRESS_ID_DESC + CUSTOM_FIELDS_ASC + CUSTOM_FIELDS_DESC + HOME_BALANCE_ASC + HOME_BALANCE_DESC + SHIP_DATE_ASC + SHIP_DATE_DESC + TRACKING_NUMBER_ASC + TRACKING_NUMBER_DESC + CLASS_ID_ASC + CLASS_ID_DESC + PRINT_STATUS_ASC + PRINT_STATUS_DESC + PAYMENT_REFERENCE_NUMBER_ASC + PAYMENT_REFERENCE_NUMBER_DESC + DELIVERY_TYPE_ASC + DELIVERY_TYPE_DESC + DELIVERY_TIME_ASC + DELIVERY_TIME_DESC + TRANSACTION_SOURCE_ASC + TRANSACTION_SOURCE_DESC + GLOBAL_TAX_CALCULATION_ASC + GLOBAL_TAX_CALCULATION_DESC + TOTAL_AMOUNT_ASC + TOTAL_AMOUNT_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + APPLY_TAX_AFTER_DISCOUNT_ASC + APPLY_TAX_AFTER_DISCOUNT_DESC + DOC_NUMBER_ASC + DOC_NUMBER_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + DEPOSIT_TO_ACCOUNT_ID_ASC + DEPOSIT_TO_ACCOUNT_ID_DESC + CUSTOMER_MEMO_ASC + CUSTOMER_MEMO_DESC + EMAIL_STATUS_ASC + EMAIL_STATUS_DESC + CREDIT_CARD_PAYMENT_ASC + CREDIT_CARD_PAYMENT_DESC + BALANCE_ASC + BALANCE_DESC + TRANSACTION_TAX_CODE_ID_ASC + TRANSACTION_TAX_CODE_ID_DESC + TRANSACTION_TOTAL_TAX_ASC + TRANSACTION_TOTAL_TAX_DESC + PAYMENT_METHOD_ID_ASC + PAYMENT_METHOD_ID_DESC + EXCHANGE_RATE_ASC + EXCHANGE_RATE_DESC + SHIPPING_ADDRESS_ID_ASC + SHIPPING_ADDRESS_ID_DESC + HOME_TOTAL_AMOUNT_ASC + HOME_TOTAL_AMOUNT_DESC + DEPARTMENT_ID_ASC + DEPARTMENT_ID_DESC + SHIPPING_METHOD_ASC + SHIPPING_METHOD_DESC + BILLING_ADDRESS_ID_ASC + BILLING_ADDRESS_ID_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksSalesReceiptsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + shipFromAddressId: Float + + """""" + homeBalance: Float + + """""" + classId: Float + + """""" + totalAmount: Float + + """""" + depositToAccountId: Float + + """""" + balance: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + paymentMethodId: Float + + """""" + exchangeRate: Float + + """""" + shippingAddressId: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksSalesReceiptsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + shipFromAddressId: Float + + """""" + homeBalance: Float + + """""" + classId: Float + + """""" + totalAmount: Float + + """""" + depositToAccountId: Float + + """""" + balance: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + paymentMethodId: Float + + """""" + exchangeRate: Float + + """""" + shippingAddressId: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksSalesReceiptsConnectionAggregates { + """""" + sum: QuickbooksSalesReceiptsConnectionSums + + """""" + avg: QuickbooksSalesReceiptsConnectionAverages +} + +"""A `SalesReceipt` edge in the connection.""" +type QuickbooksSalesReceiptsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `SalesReceipt` at the end of the edge.""" + node: QuickbooksSalesReceipt +} + +"""A connection to a list of `SalesReceipt` values.""" +type QuickbooksSalesReceiptsConnection { + """A list of `SalesReceipt` objects.""" + nodes: [QuickbooksSalesReceipt]! + + """ + A list of edges which contains the `SalesReceipt` and cursor to aid in pagination. + """ + edges: [QuickbooksSalesReceiptsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `SalesReceipt` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksSalesReceiptsConnectionAggregates +} + +""" +A filter to be used against RefundReceiptPaymentType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksRefundReceiptPaymentTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksRefundReceiptPaymentType + + """Greater than the specified value.""" + greaterThan: QuickbooksRefundReceiptPaymentType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksRefundReceiptPaymentType + + """Less than the specified value.""" + lessThan: QuickbooksRefundReceiptPaymentType + + """Not included in the specified list.""" + notIn: [QuickbooksRefundReceiptPaymentType!] + + """Included in the specified list.""" + in: [QuickbooksRefundReceiptPaymentType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksRefundReceiptPaymentType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksRefundReceiptPaymentType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksRefundReceiptPaymentType + + """Equal to the specified value.""" + equalTo: QuickbooksRefundReceiptPaymentType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `RefundReceipt` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksRefundReceiptFilter { + """Negates the expression.""" + not: QuickbooksRefundReceiptFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksRefundReceiptFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksRefundReceiptFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `paymentType` field.""" + paymentType: QuickbooksRefundReceiptPaymentTypeFilter + + """Filter by the object’s `billingAddressId` field.""" + billingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `departmentId` field.""" + departmentId: QuickbooksBigIntFilter + + """Filter by the object’s `homeTotalAmount` field.""" + homeTotalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `shippingAddressId` field.""" + shippingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `exchangeRate` field.""" + exchangeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `paymentMethodId` field.""" + paymentMethodId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionTotalTax` field.""" + transactionTotalTax: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionTaxCodeId` field.""" + transactionTaxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `balance` field.""" + balance: QuickbooksBigFloatFilter + + """Filter by the object’s `customerMemo` field.""" + customerMemo: QuickbooksStringFilter + + """Filter by the object’s `depositToAccountId` field.""" + depositToAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `docNumber` field.""" + docNumber: QuickbooksStringFilter + + """Filter by the object’s `applyTaxAfterDiscount` field.""" + applyTaxAfterDiscount: QuickbooksBooleanFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `totalAmount` field.""" + totalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `globalTaxCalculation` field.""" + globalTaxCalculation: QuickbooksGlobalTaxCalculationFilter + + """Filter by the object’s `transactionSource` field.""" + transactionSource: QuickbooksStringFilter + + """Filter by the object’s `paymentReferenceNumber` field.""" + paymentReferenceNumber: QuickbooksStringFilter + + """Filter by the object’s `printStatus` field.""" + printStatus: QuickbooksPrintStatusFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `homeBalance` field.""" + homeBalance: QuickbooksBigFloatFilter + + """Filter by the object’s `customFields` field.""" + customFields: QuickbooksJsonFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `billingEmail` field.""" + billingEmail: QuickbooksStringFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `customerId` field.""" + customerId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksRefundReceiptsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + CUSTOMER_ID_ASC + CUSTOMER_ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + BILLING_EMAIL_ASC + BILLING_EMAIL_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + CUSTOM_FIELDS_ASC + CUSTOM_FIELDS_DESC + HOME_BALANCE_ASC + HOME_BALANCE_DESC + CLASS_ID_ASC + CLASS_ID_DESC + PRINT_STATUS_ASC + PRINT_STATUS_DESC + PAYMENT_REFERENCE_NUMBER_ASC + PAYMENT_REFERENCE_NUMBER_DESC + TRANSACTION_SOURCE_ASC + TRANSACTION_SOURCE_DESC + GLOBAL_TAX_CALCULATION_ASC + GLOBAL_TAX_CALCULATION_DESC + TOTAL_AMOUNT_ASC + TOTAL_AMOUNT_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + APPLY_TAX_AFTER_DISCOUNT_ASC + APPLY_TAX_AFTER_DISCOUNT_DESC + DOC_NUMBER_ASC + DOC_NUMBER_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + DEPOSIT_TO_ACCOUNT_ID_ASC + DEPOSIT_TO_ACCOUNT_ID_DESC + CUSTOMER_MEMO_ASC + CUSTOMER_MEMO_DESC + CREDIT_CARD_PAYMENT_ASC + CREDIT_CARD_PAYMENT_DESC + BALANCE_ASC + BALANCE_DESC + TRANSACTION_TAX_CODE_ID_ASC + TRANSACTION_TAX_CODE_ID_DESC + TRANSACTION_TOTAL_TAX_ASC + TRANSACTION_TOTAL_TAX_DESC + PAYMENT_METHOD_ID_ASC + PAYMENT_METHOD_ID_DESC + EXCHANGE_RATE_ASC + EXCHANGE_RATE_DESC + SHIPPING_ADDRESS_ID_ASC + SHIPPING_ADDRESS_ID_DESC + HOME_TOTAL_AMOUNT_ASC + HOME_TOTAL_AMOUNT_DESC + DEPARTMENT_ID_ASC + DEPARTMENT_ID_DESC + BILLING_ADDRESS_ID_ASC + BILLING_ADDRESS_ID_DESC + CHECK_PAYMENT_ASC + CHECK_PAYMENT_DESC + PAYMENT_TYPE_ASC + PAYMENT_TYPE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksRefundReceiptsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + homeBalance: Float + + """""" + classId: Float + + """""" + totalAmount: Float + + """""" + depositToAccountId: Float + + """""" + balance: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + paymentMethodId: Float + + """""" + exchangeRate: Float + + """""" + shippingAddressId: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksRefundReceiptsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + homeBalance: Float + + """""" + classId: Float + + """""" + totalAmount: Float + + """""" + depositToAccountId: Float + + """""" + balance: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + paymentMethodId: Float + + """""" + exchangeRate: Float + + """""" + shippingAddressId: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksRefundReceiptsConnectionAggregates { + """""" + sum: QuickbooksRefundReceiptsConnectionSums + + """""" + avg: QuickbooksRefundReceiptsConnectionAverages +} + +"""A `RefundReceipt` edge in the connection.""" +type QuickbooksRefundReceiptsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `RefundReceipt` at the end of the edge.""" + node: QuickbooksRefundReceipt +} + +"""A connection to a list of `RefundReceipt` values.""" +type QuickbooksRefundReceiptsConnection { + """A list of `RefundReceipt` objects.""" + nodes: [QuickbooksRefundReceipt]! + + """ + A list of edges which contains the `RefundReceipt` and cursor to aid in pagination. + """ + edges: [QuickbooksRefundReceiptsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `RefundReceipt` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksRefundReceiptsConnectionAggregates +} + +""" +A filter to be used against PaymentTransactionStatus fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPaymentTransactionStatusFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksPaymentTransactionStatus + + """Greater than the specified value.""" + greaterThan: QuickbooksPaymentTransactionStatus + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksPaymentTransactionStatus + + """Less than the specified value.""" + lessThan: QuickbooksPaymentTransactionStatus + + """Not included in the specified list.""" + notIn: [QuickbooksPaymentTransactionStatus!] + + """Included in the specified list.""" + in: [QuickbooksPaymentTransactionStatus!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksPaymentTransactionStatus + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksPaymentTransactionStatus + + """Not equal to the specified value.""" + notEqualTo: QuickbooksPaymentTransactionStatus + + """Equal to the specified value.""" + equalTo: QuickbooksPaymentTransactionStatus + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Payment` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPaymentFilter { + """Negates the expression.""" + not: QuickbooksPaymentFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksPaymentFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksPaymentFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `processPayment` field.""" + processPayment: QuickbooksBooleanFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `paymentRefNumber` field.""" + paymentRefNumber: QuickbooksStringFilter + + """Filter by the object’s `accountsReceivableAccountId` field.""" + accountsReceivableAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionSource` field.""" + transactionSource: QuickbooksStringFilter + + """Filter by the object’s `exchangeRate` field.""" + exchangeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionStatus` field.""" + transactionStatus: QuickbooksPaymentTransactionStatusFilter + + """Filter by the object’s `depositToAccountId` field.""" + depositToAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `unappliedAmount` field.""" + unappliedAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `paymentMethodId` field.""" + paymentMethodId: QuickbooksBigIntFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `customerId` field.""" + customerId: QuickbooksBigIntFilter + + """Filter by the object’s `totalAmount` field.""" + totalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksPaymentsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + TOTAL_AMOUNT_ASC + TOTAL_AMOUNT_DESC + CUSTOMER_ID_ASC + CUSTOMER_ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + PAYMENT_METHOD_ID_ASC + PAYMENT_METHOD_ID_DESC + UNAPPLIED_AMOUNT_ASC + UNAPPLIED_AMOUNT_DESC + DEPOSIT_TO_ACCOUNT_ID_ASC + DEPOSIT_TO_ACCOUNT_ID_DESC + TRANSACTION_STATUS_ASC + TRANSACTION_STATUS_DESC + EXCHANGE_RATE_ASC + EXCHANGE_RATE_DESC + TRANSACTION_SOURCE_ASC + TRANSACTION_SOURCE_DESC + ACCOUNTS_RECEIVABLE_ACCOUNT_ID_ASC + ACCOUNTS_RECEIVABLE_ACCOUNT_ID_DESC + PAYMENT_REF_NUMBER_ASC + PAYMENT_REF_NUMBER_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + CREDIT_CARD_PAYMENT_ASC + CREDIT_CARD_PAYMENT_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + PROCESS_PAYMENT_ASC + PROCESS_PAYMENT_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksPaymentsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + totalAmount: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + paymentMethodId: Float + + """""" + unappliedAmount: Float + + """""" + depositToAccountId: Float + + """""" + exchangeRate: Float + + """""" + accountsReceivableAccountId: Float +} + +"""""" +type QuickbooksPaymentsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + totalAmount: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + paymentMethodId: Float + + """""" + unappliedAmount: Float + + """""" + depositToAccountId: Float + + """""" + exchangeRate: Float + + """""" + accountsReceivableAccountId: Float +} + +"""""" +type QuickbooksPaymentsConnectionAggregates { + """""" + sum: QuickbooksPaymentsConnectionSums + + """""" + avg: QuickbooksPaymentsConnectionAverages +} + +"""A `Payment` edge in the connection.""" +type QuickbooksPaymentsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Payment` at the end of the edge.""" + node: QuickbooksPayment +} + +"""A connection to a list of `Payment` values.""" +type QuickbooksPaymentsConnection { + """A list of `Payment` objects.""" + nodes: [QuickbooksPayment]! + + """ + A list of edges which contains the `Payment` and cursor to aid in pagination. + """ + edges: [QuickbooksPaymentsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Payment` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksPaymentsConnectionAggregates +} + +""" +A filter to be used against `CreditMemo` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksCreditMemoFilter { + """Negates the expression.""" + not: QuickbooksCreditMemoFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksCreditMemoFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksCreditMemoFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `billingEmail` field.""" + billingEmail: QuickbooksStringFilter + + """Filter by the object’s `billingAddressId` field.""" + billingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `emailStatus` field.""" + emailStatus: QuickbooksEmailStatusFilter + + """Filter by the object’s `departmentId` field.""" + departmentId: QuickbooksBigIntFilter + + """Filter by the object’s `homeTotalAmount` field.""" + homeTotalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `shippingAddressId` field.""" + shippingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `exchangeRate` field.""" + exchangeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `paymentMethodId` field.""" + paymentMethodId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionTotalTax` field.""" + transactionTotalTax: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionTaxCodeId` field.""" + transactionTaxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `balance` field.""" + balance: QuickbooksBigFloatFilter + + """Filter by the object’s `customerMemo` field.""" + customerMemo: QuickbooksStringFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `docNumber` field.""" + docNumber: QuickbooksStringFilter + + """Filter by the object’s `applyTaxAfterDiscount` field.""" + applyTaxAfterDiscount: QuickbooksBooleanFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `invoiceId` field.""" + invoiceId: QuickbooksBigIntFilter + + """Filter by the object’s `remainingCredit` field.""" + remainingCredit: QuickbooksBigFloatFilter + + """Filter by the object’s `totalAmount` field.""" + totalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `globalTaxCalculation` field.""" + globalTaxCalculation: QuickbooksGlobalTaxCalculationFilter + + """Filter by the object’s `salesTermId` field.""" + salesTermId: QuickbooksBigIntFilter + + """Filter by the object’s `printStatus` field.""" + printStatus: QuickbooksPrintStatusFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `homeBalance` field.""" + homeBalance: QuickbooksBigFloatFilter + + """Filter by the object’s `customFields` field.""" + customFields: QuickbooksJsonFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `customerId` field.""" + customerId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksCreditMemosOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + CUSTOMER_ID_ASC + CUSTOMER_ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + CUSTOM_FIELDS_ASC + CUSTOM_FIELDS_DESC + HOME_BALANCE_ASC + HOME_BALANCE_DESC + CLASS_ID_ASC + CLASS_ID_DESC + PRINT_STATUS_ASC + PRINT_STATUS_DESC + SALES_TERM_ID_ASC + SALES_TERM_ID_DESC + GLOBAL_TAX_CALCULATION_ASC + GLOBAL_TAX_CALCULATION_DESC + TOTAL_AMOUNT_ASC + TOTAL_AMOUNT_DESC + REMAINING_CREDIT_ASC + REMAINING_CREDIT_DESC + INVOICE_ID_ASC + INVOICE_ID_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + APPLY_TAX_AFTER_DISCOUNT_ASC + APPLY_TAX_AFTER_DISCOUNT_DESC + DOC_NUMBER_ASC + DOC_NUMBER_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + CUSTOMER_MEMO_ASC + CUSTOMER_MEMO_DESC + BALANCE_ASC + BALANCE_DESC + TRANSACTION_TAX_CODE_ID_ASC + TRANSACTION_TAX_CODE_ID_DESC + TRANSACTION_TOTAL_TAX_ASC + TRANSACTION_TOTAL_TAX_DESC + PAYMENT_METHOD_ID_ASC + PAYMENT_METHOD_ID_DESC + EXCHANGE_RATE_ASC + EXCHANGE_RATE_DESC + SHIPPING_ADDRESS_ID_ASC + SHIPPING_ADDRESS_ID_DESC + HOME_TOTAL_AMOUNT_ASC + HOME_TOTAL_AMOUNT_DESC + DEPARTMENT_ID_ASC + DEPARTMENT_ID_DESC + EMAIL_STATUS_ASC + EMAIL_STATUS_DESC + BILLING_ADDRESS_ID_ASC + BILLING_ADDRESS_ID_DESC + BILLING_EMAIL_ASC + BILLING_EMAIL_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksCreditMemosConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + homeBalance: Float + + """""" + classId: Float + + """""" + salesTermId: Float + + """""" + totalAmount: Float + + """""" + remainingCredit: Float + + """""" + invoiceId: Float + + """""" + balance: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + paymentMethodId: Float + + """""" + exchangeRate: Float + + """""" + shippingAddressId: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksCreditMemosConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + customerId: Float + + """""" + syncToken: Float + + """""" + homeBalance: Float + + """""" + classId: Float + + """""" + salesTermId: Float + + """""" + totalAmount: Float + + """""" + remainingCredit: Float + + """""" + invoiceId: Float + + """""" + balance: Float + + """""" + transactionTaxCodeId: Float + + """""" + transactionTotalTax: Float + + """""" + paymentMethodId: Float + + """""" + exchangeRate: Float + + """""" + shippingAddressId: Float + + """""" + homeTotalAmount: Float + + """""" + departmentId: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksCreditMemosConnectionAggregates { + """""" + sum: QuickbooksCreditMemosConnectionSums + + """""" + avg: QuickbooksCreditMemosConnectionAverages +} + +"""A `CreditMemo` edge in the connection.""" +type QuickbooksCreditMemosEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `CreditMemo` at the end of the edge.""" + node: QuickbooksCreditMemo +} + +"""""" +type QuickbooksTransactionTaxDetailLinesConnectionAverages { + """""" + realmId: Float + + """""" + amount: Float + + """""" + taxRateId: Float + + """""" + netAmountTaxable: Float + + """""" + taxInclusiveAmount: Float + + """""" + overrideDeltaAmount: Float + + """""" + taxPercent: Float + + """""" + invoiceId: Float + + """""" + estimateId: Float + + """""" + creditMemoId: Float + + """""" + depositId: Float + + """""" + refundReceiptId: Float + + """""" + salesReceiptId: Float + + """""" + journalEntryId: Float +} + +"""""" +type QuickbooksTransactionTaxDetailLinesConnectionSums { + """""" + realmId: Float + + """""" + amount: Float + + """""" + taxRateId: Float + + """""" + netAmountTaxable: Float + + """""" + taxInclusiveAmount: Float + + """""" + overrideDeltaAmount: Float + + """""" + taxPercent: Float + + """""" + invoiceId: Float + + """""" + estimateId: Float + + """""" + creditMemoId: Float + + """""" + depositId: Float + + """""" + refundReceiptId: Float + + """""" + salesReceiptId: Float + + """""" + journalEntryId: Float +} + +"""""" +type QuickbooksTransactionTaxDetailLinesConnectionAggregates { + """""" + sum: QuickbooksTransactionTaxDetailLinesConnectionSums + + """""" + avg: QuickbooksTransactionTaxDetailLinesConnectionAverages +} + +"""A `TransactionTaxDetailLine` edge in the connection.""" +type QuickbooksTransactionTaxDetailLinesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `TransactionTaxDetailLine` at the end of the edge.""" + node: QuickbooksTransactionTaxDetailLine +} + +""" +A filter to be used against DepositLineItemPaymentTransactionType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksDepositLineItemPaymentTransactionTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksDepositLineItemPaymentTransactionType + + """Greater than the specified value.""" + greaterThan: QuickbooksDepositLineItemPaymentTransactionType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksDepositLineItemPaymentTransactionType + + """Less than the specified value.""" + lessThan: QuickbooksDepositLineItemPaymentTransactionType + + """Not included in the specified list.""" + notIn: [QuickbooksDepositLineItemPaymentTransactionType!] + + """Included in the specified list.""" + in: [QuickbooksDepositLineItemPaymentTransactionType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksDepositLineItemPaymentTransactionType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksDepositLineItemPaymentTransactionType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksDepositLineItemPaymentTransactionType + + """Equal to the specified value.""" + equalTo: QuickbooksDepositLineItemPaymentTransactionType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against DepositLineItemTaxApplicableOn fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksDepositLineItemTaxApplicableOnFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksDepositLineItemTaxApplicableOn + + """Greater than the specified value.""" + greaterThan: QuickbooksDepositLineItemTaxApplicableOn + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksDepositLineItemTaxApplicableOn + + """Less than the specified value.""" + lessThan: QuickbooksDepositLineItemTaxApplicableOn + + """Not included in the specified list.""" + notIn: [QuickbooksDepositLineItemTaxApplicableOn!] + + """Included in the specified list.""" + in: [QuickbooksDepositLineItemTaxApplicableOn!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksDepositLineItemTaxApplicableOn + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksDepositLineItemTaxApplicableOn + + """Not equal to the specified value.""" + notEqualTo: QuickbooksDepositLineItemTaxApplicableOn + + """Equal to the specified value.""" + equalTo: QuickbooksDepositLineItemTaxApplicableOn + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `DepositLineItem` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksDepositLineItemFilter { + """Negates the expression.""" + not: QuickbooksDepositLineItemFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksDepositLineItemFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksDepositLineItemFilter!] + + """Filter by the object’s `vendorId` field.""" + vendorId: QuickbooksBigIntFilter + + """Filter by the object’s `customerId` field.""" + customerId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionType` field.""" + transactionType: QuickbooksDepositLineItemPaymentTransactionTypeFilter + + """Filter by the object’s `taxApplicableOn` field.""" + taxApplicableOn: QuickbooksDepositLineItemTaxApplicableOnFilter + + """Filter by the object’s `taxCodeId` field.""" + taxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `checkNumber` field.""" + checkNumber: QuickbooksStringFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `paymentMethodId` field.""" + paymentMethodId: QuickbooksBigIntFilter + + """Filter by the object’s `accountId` field.""" + accountId: QuickbooksBigIntFilter + + """Filter by the object’s `customFields` field.""" + customFields: QuickbooksJsonFilter + + """Filter by the object’s `lineNumber` field.""" + lineNumber: QuickbooksIntFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `index` field.""" + index: QuickbooksIntFilter + + """Filter by the object’s `depositId` field.""" + depositId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksDepositLineItemsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + DEPOSIT_ID_ASC + DEPOSIT_ID_DESC + INDEX_ASC + INDEX_DESC + AMOUNT_ASC + AMOUNT_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + LINE_NUMBER_ASC + LINE_NUMBER_DESC + CUSTOM_FIELDS_ASC + CUSTOM_FIELDS_DESC + ACCOUNT_ID_ASC + ACCOUNT_ID_DESC + PAYMENT_METHOD_ID_ASC + PAYMENT_METHOD_ID_DESC + CLASS_ID_ASC + CLASS_ID_DESC + CHECK_NUMBER_ASC + CHECK_NUMBER_DESC + TAX_CODE_ID_ASC + TAX_CODE_ID_DESC + TAX_APPLICABLE_ON_ASC + TAX_APPLICABLE_ON_DESC + TRANSACTION_TYPE_ASC + TRANSACTION_TYPE_DESC + CUSTOMER_ID_ASC + CUSTOMER_ID_DESC + VENDOR_ID_ASC + VENDOR_ID_DESC +} + +"""""" +type QuickbooksDepositLineItemsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + depositId: Float + + """""" + index: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + accountId: Float + + """""" + paymentMethodId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + customerId: Float + + """""" + vendorId: Float +} + +"""""" +type QuickbooksDepositLineItemsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + depositId: Float + + """""" + index: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + accountId: Float + + """""" + paymentMethodId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + customerId: Float + + """""" + vendorId: Float +} + +"""""" +type QuickbooksDepositLineItemsConnectionAggregates { + """""" + sum: QuickbooksDepositLineItemsConnectionSums + + """""" + avg: QuickbooksDepositLineItemsConnectionAverages +} + +"""A `DepositLineItem` edge in the connection.""" +type QuickbooksDepositLineItemsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `DepositLineItem` at the end of the edge.""" + node: QuickbooksDepositLineItem +} + +""" +A filter to be used against DepositLineItemTransactionType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksDepositLineItemTransactionTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksDepositLineItemTransactionType + + """Greater than the specified value.""" + greaterThan: QuickbooksDepositLineItemTransactionType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksDepositLineItemTransactionType + + """Less than the specified value.""" + lessThan: QuickbooksDepositLineItemTransactionType + + """Not included in the specified list.""" + notIn: [QuickbooksDepositLineItemTransactionType!] + + """Included in the specified list.""" + in: [QuickbooksDepositLineItemTransactionType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksDepositLineItemTransactionType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksDepositLineItemTransactionType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksDepositLineItemTransactionType + + """Equal to the specified value.""" + equalTo: QuickbooksDepositLineItemTransactionType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `DepositLineItemTransaction` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksDepositLineItemTransactionFilter { + """Negates the expression.""" + not: QuickbooksDepositLineItemTransactionFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksDepositLineItemTransactionFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksDepositLineItemTransactionFilter!] + + """Filter by the object’s `journalEntryId` field.""" + journalEntryId: QuickbooksBigIntFilter + + """Filter by the object’s `refundReceiptId` field.""" + refundReceiptId: QuickbooksBigIntFilter + + """Filter by the object’s `salesReceiptId` field.""" + salesReceiptId: QuickbooksBigIntFilter + + """Filter by the object’s `paymentId` field.""" + paymentId: QuickbooksBigIntFilter + + """Filter by the object’s `transferId` field.""" + transferId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionType` field.""" + transactionType: QuickbooksDepositLineItemTransactionTypeFilter + + """Filter by the object’s `depositLineItemIndex` field.""" + depositLineItemIndex: QuickbooksIntFilter + + """Filter by the object’s `depositId` field.""" + depositId: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksDepositLineItemTransactionsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + DEPOSIT_ID_ASC + DEPOSIT_ID_DESC + DEPOSIT_LINE_ITEM_INDEX_ASC + DEPOSIT_LINE_ITEM_INDEX_DESC + TRANSACTION_TYPE_ASC + TRANSACTION_TYPE_DESC + TRANSFER_ID_ASC + TRANSFER_ID_DESC + PAYMENT_ID_ASC + PAYMENT_ID_DESC + SALES_RECEIPT_ID_ASC + SALES_RECEIPT_ID_DESC + REFUND_RECEIPT_ID_ASC + REFUND_RECEIPT_ID_DESC + JOURNAL_ENTRY_ID_ASC + JOURNAL_ENTRY_ID_DESC +} + +"""""" +type QuickbooksDepositLineItemTransactionsConnectionAverages { + """""" + realmId: Float + + """""" + depositId: Float + + """""" + depositLineItemIndex: Float + + """""" + transferId: Float + + """""" + paymentId: Float + + """""" + salesReceiptId: Float + + """""" + refundReceiptId: Float + + """""" + journalEntryId: Float +} + +"""""" +type QuickbooksDepositLineItemTransactionsConnectionSums { + """""" + realmId: Float + + """""" + depositId: Float + + """""" + depositLineItemIndex: Float + + """""" + transferId: Float + + """""" + paymentId: Float + + """""" + salesReceiptId: Float + + """""" + refundReceiptId: Float + + """""" + journalEntryId: Float +} + +"""""" +type QuickbooksDepositLineItemTransactionsConnectionAggregates { + """""" + sum: QuickbooksDepositLineItemTransactionsConnectionSums + + """""" + avg: QuickbooksDepositLineItemTransactionsConnectionAverages +} + +"""A `DepositLineItemTransaction` edge in the connection.""" +type QuickbooksDepositLineItemTransactionsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `DepositLineItemTransaction` at the end of the edge.""" + node: QuickbooksDepositLineItemTransaction +} + +""" +A filter to be used against RefundReceiptLineItemType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksRefundReceiptLineItemTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksRefundReceiptLineItemType + + """Greater than the specified value.""" + greaterThan: QuickbooksRefundReceiptLineItemType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksRefundReceiptLineItemType + + """Less than the specified value.""" + lessThan: QuickbooksRefundReceiptLineItemType + + """Not included in the specified list.""" + notIn: [QuickbooksRefundReceiptLineItemType!] + + """Included in the specified list.""" + in: [QuickbooksRefundReceiptLineItemType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksRefundReceiptLineItemType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksRefundReceiptLineItemType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksRefundReceiptLineItemType + + """Equal to the specified value.""" + equalTo: QuickbooksRefundReceiptLineItemType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `RefundReceiptLineItem` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksRefundReceiptLineItemFilter { + """Negates the expression.""" + not: QuickbooksRefundReceiptLineItemFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksRefundReceiptLineItemFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksRefundReceiptLineItemFilter!] + + """Filter by the object’s `discountPercent` field.""" + discountPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `discountIsPercentBased` field.""" + discountIsPercentBased: QuickbooksBooleanFilter + + """Filter by the object’s `discountAccountId` field.""" + discountAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `groupItemId` field.""" + groupItemId: QuickbooksBigIntFilter + + """Filter by the object’s `taxClassificationId` field.""" + taxClassificationId: QuickbooksStringFilter + + """Filter by the object’s `unitPrice` field.""" + unitPrice: QuickbooksBigFloatFilter + + """Filter by the object’s `quantity` field.""" + quantity: QuickbooksBigFloatFilter + + """Filter by the object’s `discountRate` field.""" + discountRate: QuickbooksBigFloatFilter + + """Filter by the object’s `serviceDate` field.""" + serviceDate: QuickbooksDateFilter + + """Filter by the object’s `itemAccountId` field.""" + itemAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `markupPercent` field.""" + markupPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `markupAccountId` field.""" + markupAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `taxCodeId` field.""" + taxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `itemId` field.""" + itemId: QuickbooksBigIntFilter + + """Filter by the object’s `discountAmount` field.""" + discountAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `taxInclusiveAmount` field.""" + taxInclusiveAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `index` field.""" + index: QuickbooksIntFilter + + """Filter by the object’s `lineNumber` field.""" + lineNumber: QuickbooksIntFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `type` field.""" + type: QuickbooksRefundReceiptLineItemTypeFilter + + """Filter by the object’s `refundReceiptId` field.""" + refundReceiptId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksRefundReceiptLineItemsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + REFUND_RECEIPT_ID_ASC + REFUND_RECEIPT_ID_DESC + TYPE_ASC + TYPE_DESC + AMOUNT_ASC + AMOUNT_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + LINE_NUMBER_ASC + LINE_NUMBER_DESC + INDEX_ASC + INDEX_DESC + TAX_INCLUSIVE_AMOUNT_ASC + TAX_INCLUSIVE_AMOUNT_DESC + DISCOUNT_AMOUNT_ASC + DISCOUNT_AMOUNT_DESC + ITEM_ID_ASC + ITEM_ID_DESC + CLASS_ID_ASC + CLASS_ID_DESC + TAX_CODE_ID_ASC + TAX_CODE_ID_DESC + MARKUP_ACCOUNT_ID_ASC + MARKUP_ACCOUNT_ID_DESC + MARKUP_PERCENT_ASC + MARKUP_PERCENT_DESC + ITEM_ACCOUNT_ID_ASC + ITEM_ACCOUNT_ID_DESC + SERVICE_DATE_ASC + SERVICE_DATE_DESC + DISCOUNT_RATE_ASC + DISCOUNT_RATE_DESC + QUANTITY_ASC + QUANTITY_DESC + UNIT_PRICE_ASC + UNIT_PRICE_DESC + TAX_CLASSIFICATION_ID_ASC + TAX_CLASSIFICATION_ID_DESC + GROUP_ITEM_ID_ASC + GROUP_ITEM_ID_DESC + DISCOUNT_ACCOUNT_ID_ASC + DISCOUNT_ACCOUNT_ID_DESC + DISCOUNT_IS_PERCENT_BASED_ASC + DISCOUNT_IS_PERCENT_BASED_DESC + DISCOUNT_PERCENT_ASC + DISCOUNT_PERCENT_DESC +} + +"""""" +type QuickbooksRefundReceiptLineItemsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + refundReceiptId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + index: Float + + """""" + taxInclusiveAmount: Float + + """""" + discountAmount: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + itemAccountId: Float + + """""" + discountRate: Float + + """""" + quantity: Float + + """""" + unitPrice: Float + + """""" + groupItemId: Float + + """""" + discountAccountId: Float + + """""" + discountPercent: Float +} + +"""""" +type QuickbooksRefundReceiptLineItemsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + refundReceiptId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + index: Float + + """""" + taxInclusiveAmount: Float + + """""" + discountAmount: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + itemAccountId: Float + + """""" + discountRate: Float + + """""" + quantity: Float + + """""" + unitPrice: Float + + """""" + groupItemId: Float + + """""" + discountAccountId: Float + + """""" + discountPercent: Float +} + +"""""" +type QuickbooksRefundReceiptLineItemsConnectionAggregates { + """""" + sum: QuickbooksRefundReceiptLineItemsConnectionSums + + """""" + avg: QuickbooksRefundReceiptLineItemsConnectionAverages +} + +"""A `RefundReceiptLineItem` edge in the connection.""" +type QuickbooksRefundReceiptLineItemsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `RefundReceiptLineItem` at the end of the edge.""" + node: QuickbooksRefundReceiptLineItem +} + +enum QuickbooksRefundReceiptLineItemType { + SALES_ITEM + GROUP + DESCRIPTIN_ONLY + DISCOUNT + SUB_TOTAL +} + +"""""" +type QuickbooksRefundReceiptLineItem { + """""" + realmId: String! + + """""" + id: String + + """""" + refundReceiptId: String! + + """""" + type: QuickbooksRefundReceiptLineItemType! + + """""" + amount: String + + """""" + description: String + + """""" + lineNumber: Int + + """""" + index: Int! + + """""" + taxInclusiveAmount: String + + """""" + discountAmount: String + + """""" + itemId: String + + """""" + classId: String + + """""" + taxCodeId: String + + """""" + markupAccountId: String + + """""" + markupPercent: String + + """""" + itemAccountId: String + + """""" + serviceDate: String + + """""" + discountRate: String + + """""" + quantity: String + + """""" + unitPrice: String + + """""" + taxClassificationId: String + + """""" + groupItemId: String + + """""" + discountAccountId: String + + """""" + discountIsPercentBased: Boolean + + """""" + discountPercent: String + + """ + Reads a single `RefundReceipt` that is related to this `RefundReceiptLineItem`. + """ + refundReceipt: QuickbooksRefundReceipt + + """Reads a single `Item` that is related to this `RefundReceiptLineItem`.""" + item: QuickbooksItem + + """ + Reads a single `Class` that is related to this `RefundReceiptLineItem`. + """ + class: QuickbooksClass + + """ + Reads a single `TaxCode` that is related to this `RefundReceiptLineItem`. + """ + taxCode: QuickbooksTaxCode + + """ + Reads a single `Account` that is related to this `RefundReceiptLineItem`. + """ + itemAccount: QuickbooksAccount + + """ + Reads a single `TaxClassification` that is related to this `RefundReceiptLineItem`. + """ + taxClassification: QuickbooksTaxClassification + + """Reads a single `Item` that is related to this `RefundReceiptLineItem`.""" + groupItem: QuickbooksItem + + """ + Reads a single `Account` that is related to this `RefundReceiptLineItem`. + """ + discountAccount: QuickbooksAccount +} + +"""A connection to a list of `RefundReceiptLineItem` values.""" +type QuickbooksRefundReceiptLineItemsConnection { + """A list of `RefundReceiptLineItem` objects.""" + nodes: [QuickbooksRefundReceiptLineItem]! + + """ + A list of edges which contains the `RefundReceiptLineItem` and cursor to aid in pagination. + """ + edges: [QuickbooksRefundReceiptLineItemsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `RefundReceiptLineItem` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksRefundReceiptLineItemsConnectionAggregates +} + +enum QuickbooksRefundReceiptPaymentType { + CASH + CHECK + CREDIT_CARD + OTHER +} + +"""""" +type QuickbooksCheckPayment { + """""" + checkNumber: String + + """""" + status: String + + """""" + nameOnAccount: String + + """""" + accountNumber: String + + """""" + bankName: String +} + +"""""" +type QuickbooksRefundReceipt implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + customerId: String + + """""" + syncToken: String + + """""" + currencyCode: String + + """""" + billingEmail: String + + """""" + transactionDate: String + + """""" + customFields: String + + """""" + homeBalance: String + + """""" + classId: String + + """""" + printStatus: QuickbooksPrintStatus + + """""" + paymentReferenceNumber: String + + """""" + transactionSource: String + + """""" + globalTaxCalculation: QuickbooksGlobalTaxCalculation + + """""" + totalAmount: String + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + applyTaxAfterDiscount: Boolean + + """""" + docNumber: String + + """""" + privateNote: String + + """""" + depositToAccountId: String + + """""" + customerMemo: String + + """""" + creditCardPayment: QuickbooksPaymentCreditCardPayment + + """""" + balance: String + + """""" + transactionTaxCodeId: String + + """""" + transactionTotalTax: String + + """""" + paymentMethodId: String + + """""" + exchangeRate: String + + """""" + shippingAddressId: String + + """""" + homeTotalAmount: String + + """""" + departmentId: String + + """""" + billingAddressId: String + + """""" + checkPayment: QuickbooksCheckPayment + + """""" + paymentType: QuickbooksRefundReceiptPaymentType + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `Customer` that is related to this `RefundReceipt`.""" + customer: QuickbooksCustomer + + """Reads a single `Class` that is related to this `RefundReceipt`.""" + class: QuickbooksClass + + """Reads a single `Account` that is related to this `RefundReceipt`.""" + depositToAccount: QuickbooksAccount + + """Reads a single `TaxCode` that is related to this `RefundReceipt`.""" + transactionTaxCode: QuickbooksTaxCode + + """ + Reads a single `PaymentMethod` that is related to this `RefundReceipt`. + """ + paymentMethod: QuickbooksPaymentMethod + + """ + Reads a single `PhysicalAddress` that is related to this `RefundReceipt`. + """ + shippingAddress: QuickbooksPhysicalAddress + + """Reads a single `Department` that is related to this `RefundReceipt`.""" + department: QuickbooksDepartment + + """ + Reads a single `PhysicalAddress` that is related to this `RefundReceipt`. + """ + billingAddress: QuickbooksPhysicalAddress + + """Reads a single `Currency` that is related to this `RefundReceipt`.""" + currency: QuickbooksCurrency + + """Reads and enables pagination through a set of `RefundReceiptLineItem`.""" + lineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptLineItemFilter + + """The method to use when ordering `RefundReceiptLineItem`.""" + orderBy: [QuickbooksRefundReceiptLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptLineItemsConnection! + + """ + Reads and enables pagination through a set of `TransactionTaxDetailLine`. + """ + transactionTaxDetailLines( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransactionTaxDetailLineFilter + + """The method to use when ordering `TransactionTaxDetailLine`.""" + orderBy: [QuickbooksTransactionTaxDetailLinesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransactionTaxDetailLinesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against SalesReceiptLineItemType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksSalesReceiptLineItemTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksSalesReceiptLineItemType + + """Greater than the specified value.""" + greaterThan: QuickbooksSalesReceiptLineItemType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksSalesReceiptLineItemType + + """Less than the specified value.""" + lessThan: QuickbooksSalesReceiptLineItemType + + """Not included in the specified list.""" + notIn: [QuickbooksSalesReceiptLineItemType!] + + """Included in the specified list.""" + in: [QuickbooksSalesReceiptLineItemType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksSalesReceiptLineItemType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksSalesReceiptLineItemType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksSalesReceiptLineItemType + + """Equal to the specified value.""" + equalTo: QuickbooksSalesReceiptLineItemType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `SalesReceiptLineItem` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksSalesReceiptLineItemFilter { + """Negates the expression.""" + not: QuickbooksSalesReceiptLineItemFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksSalesReceiptLineItemFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksSalesReceiptLineItemFilter!] + + """Filter by the object’s `discountPercent` field.""" + discountPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `discountIsPercentBased` field.""" + discountIsPercentBased: QuickbooksBooleanFilter + + """Filter by the object’s `discountAccountId` field.""" + discountAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `groupItemId` field.""" + groupItemId: QuickbooksBigIntFilter + + """Filter by the object’s `taxClassificationId` field.""" + taxClassificationId: QuickbooksStringFilter + + """Filter by the object’s `unitPrice` field.""" + unitPrice: QuickbooksBigFloatFilter + + """Filter by the object’s `quantity` field.""" + quantity: QuickbooksBigFloatFilter + + """Filter by the object’s `discountRate` field.""" + discountRate: QuickbooksBigFloatFilter + + """Filter by the object’s `serviceDate` field.""" + serviceDate: QuickbooksDateFilter + + """Filter by the object’s `itemAccountId` field.""" + itemAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `markupPercent` field.""" + markupPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `markupAccountId` field.""" + markupAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `taxCodeId` field.""" + taxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `itemId` field.""" + itemId: QuickbooksBigIntFilter + + """Filter by the object’s `discountAmount` field.""" + discountAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `taxInclusiveAmount` field.""" + taxInclusiveAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `index` field.""" + index: QuickbooksIntFilter + + """Filter by the object’s `lineNumber` field.""" + lineNumber: QuickbooksIntFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `type` field.""" + type: QuickbooksSalesReceiptLineItemTypeFilter + + """Filter by the object’s `salesReceiptId` field.""" + salesReceiptId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksSalesReceiptLineItemsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + SALES_RECEIPT_ID_ASC + SALES_RECEIPT_ID_DESC + TYPE_ASC + TYPE_DESC + AMOUNT_ASC + AMOUNT_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + LINE_NUMBER_ASC + LINE_NUMBER_DESC + INDEX_ASC + INDEX_DESC + TAX_INCLUSIVE_AMOUNT_ASC + TAX_INCLUSIVE_AMOUNT_DESC + DISCOUNT_AMOUNT_ASC + DISCOUNT_AMOUNT_DESC + ITEM_ID_ASC + ITEM_ID_DESC + CLASS_ID_ASC + CLASS_ID_DESC + TAX_CODE_ID_ASC + TAX_CODE_ID_DESC + MARKUP_ACCOUNT_ID_ASC + MARKUP_ACCOUNT_ID_DESC + MARKUP_PERCENT_ASC + MARKUP_PERCENT_DESC + ITEM_ACCOUNT_ID_ASC + ITEM_ACCOUNT_ID_DESC + SERVICE_DATE_ASC + SERVICE_DATE_DESC + DISCOUNT_RATE_ASC + DISCOUNT_RATE_DESC + QUANTITY_ASC + QUANTITY_DESC + UNIT_PRICE_ASC + UNIT_PRICE_DESC + TAX_CLASSIFICATION_ID_ASC + TAX_CLASSIFICATION_ID_DESC + GROUP_ITEM_ID_ASC + GROUP_ITEM_ID_DESC + DISCOUNT_ACCOUNT_ID_ASC + DISCOUNT_ACCOUNT_ID_DESC + DISCOUNT_IS_PERCENT_BASED_ASC + DISCOUNT_IS_PERCENT_BASED_DESC + DISCOUNT_PERCENT_ASC + DISCOUNT_PERCENT_DESC +} + +"""""" +type QuickbooksSalesReceiptLineItemsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + salesReceiptId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + index: Float + + """""" + taxInclusiveAmount: Float + + """""" + discountAmount: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + itemAccountId: Float + + """""" + discountRate: Float + + """""" + quantity: Float + + """""" + unitPrice: Float + + """""" + groupItemId: Float + + """""" + discountAccountId: Float + + """""" + discountPercent: Float +} + +"""""" +type QuickbooksSalesReceiptLineItemsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + salesReceiptId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + index: Float + + """""" + taxInclusiveAmount: Float + + """""" + discountAmount: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + itemAccountId: Float + + """""" + discountRate: Float + + """""" + quantity: Float + + """""" + unitPrice: Float + + """""" + groupItemId: Float + + """""" + discountAccountId: Float + + """""" + discountPercent: Float +} + +"""""" +type QuickbooksSalesReceiptLineItemsConnectionAggregates { + """""" + sum: QuickbooksSalesReceiptLineItemsConnectionSums + + """""" + avg: QuickbooksSalesReceiptLineItemsConnectionAverages +} + +"""A `SalesReceiptLineItem` edge in the connection.""" +type QuickbooksSalesReceiptLineItemsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `SalesReceiptLineItem` at the end of the edge.""" + node: QuickbooksSalesReceiptLineItem +} + +enum QuickbooksSalesReceiptLineItemType { + SALES_ITEM + GROUP + DESCRIPTIN_ONLY + DISCOUNT + SUB_TOTAL +} + +"""""" +type QuickbooksSalesReceiptLineItem { + """""" + realmId: String! + + """""" + id: String + + """""" + salesReceiptId: String! + + """""" + type: QuickbooksSalesReceiptLineItemType! + + """""" + amount: String + + """""" + description: String + + """""" + lineNumber: Int + + """""" + index: Int! + + """""" + taxInclusiveAmount: String + + """""" + discountAmount: String + + """""" + itemId: String + + """""" + classId: String + + """""" + taxCodeId: String + + """""" + markupAccountId: String + + """""" + markupPercent: String + + """""" + itemAccountId: String + + """""" + serviceDate: String + + """""" + discountRate: String + + """""" + quantity: String + + """""" + unitPrice: String + + """""" + taxClassificationId: String + + """""" + groupItemId: String + + """""" + discountAccountId: String + + """""" + discountIsPercentBased: Boolean + + """""" + discountPercent: String + + """ + Reads a single `SalesReceipt` that is related to this `SalesReceiptLineItem`. + """ + salesReceipt: QuickbooksSalesReceipt + + """Reads a single `Item` that is related to this `SalesReceiptLineItem`.""" + item: QuickbooksItem + + """Reads a single `Class` that is related to this `SalesReceiptLineItem`.""" + class: QuickbooksClass + + """ + Reads a single `TaxCode` that is related to this `SalesReceiptLineItem`. + """ + taxCode: QuickbooksTaxCode + + """ + Reads a single `Account` that is related to this `SalesReceiptLineItem`. + """ + itemAccount: QuickbooksAccount + + """ + Reads a single `TaxClassification` that is related to this `SalesReceiptLineItem`. + """ + taxClassification: QuickbooksTaxClassification + + """Reads a single `Item` that is related to this `SalesReceiptLineItem`.""" + groupItem: QuickbooksItem + + """ + Reads a single `Account` that is related to this `SalesReceiptLineItem`. + """ + discountAccount: QuickbooksAccount +} + +"""A connection to a list of `SalesReceiptLineItem` values.""" +type QuickbooksSalesReceiptLineItemsConnection { + """A list of `SalesReceiptLineItem` objects.""" + nodes: [QuickbooksSalesReceiptLineItem]! + + """ + A list of edges which contains the `SalesReceiptLineItem` and cursor to aid in pagination. + """ + edges: [QuickbooksSalesReceiptLineItemsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `SalesReceiptLineItem` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksSalesReceiptLineItemsConnectionAggregates +} + +"""""" +type QuickbooksSalesReceipt implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + customerId: String + + """""" + syncToken: String + + """""" + currencyCode: String + + """""" + billingEmail: String + + """""" + transactionDate: String + + """""" + shipFromAddressId: String + + """""" + customFields: String + + """""" + homeBalance: String + + """""" + shipDate: String + + """""" + trackingNumber: String + + """""" + classId: String + + """""" + printStatus: QuickbooksPrintStatus + + """""" + paymentReferenceNumber: String + + """""" + deliveryType: QuickbooksDeliveryType + + """""" + deliveryTime: String + + """""" + transactionSource: String + + """""" + globalTaxCalculation: QuickbooksGlobalTaxCalculation + + """""" + totalAmount: String + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + applyTaxAfterDiscount: Boolean + + """""" + docNumber: String + + """""" + privateNote: String + + """""" + depositToAccountId: String + + """""" + customerMemo: String + + """""" + emailStatus: QuickbooksEmailStatus + + """""" + creditCardPayment: QuickbooksPaymentCreditCardPayment + + """""" + balance: String + + """""" + transactionTaxCodeId: String + + """""" + transactionTotalTax: String + + """""" + paymentMethodId: String + + """""" + exchangeRate: String + + """""" + shippingAddressId: String + + """""" + homeTotalAmount: String + + """""" + departmentId: String + + """""" + shippingMethod: String + + """""" + billingAddressId: String + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `Customer` that is related to this `SalesReceipt`.""" + customer: QuickbooksCustomer + + """ + Reads a single `PhysicalAddress` that is related to this `SalesReceipt`. + """ + shipFromAddress: QuickbooksPhysicalAddress + + """Reads a single `Class` that is related to this `SalesReceipt`.""" + class: QuickbooksClass + + """Reads a single `Account` that is related to this `SalesReceipt`.""" + depositToAccount: QuickbooksAccount + + """Reads a single `TaxCode` that is related to this `SalesReceipt`.""" + transactionTaxCode: QuickbooksTaxCode + + """Reads a single `PaymentMethod` that is related to this `SalesReceipt`.""" + paymentMethod: QuickbooksPaymentMethod + + """ + Reads a single `PhysicalAddress` that is related to this `SalesReceipt`. + """ + shippingAddress: QuickbooksPhysicalAddress + + """Reads a single `Department` that is related to this `SalesReceipt`.""" + department: QuickbooksDepartment + + """ + Reads a single `PhysicalAddress` that is related to this `SalesReceipt`. + """ + billingAddress: QuickbooksPhysicalAddress + + """Reads a single `Currency` that is related to this `SalesReceipt`.""" + currency: QuickbooksCurrency + + """Reads and enables pagination through a set of `SalesReceiptLineItem`.""" + lineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptLineItemFilter + + """The method to use when ordering `SalesReceiptLineItem`.""" + orderBy: [QuickbooksSalesReceiptLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptLineItemsConnection! + + """ + Reads and enables pagination through a set of `TransactionTaxDetailLine`. + """ + transactionTaxDetailLines( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransactionTaxDetailLineFilter + + """The method to use when ordering `TransactionTaxDetailLine`.""" + orderBy: [QuickbooksTransactionTaxDetailLinesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransactionTaxDetailLinesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against `PaymentLineItem` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPaymentLineItemFilter { + """Negates the expression.""" + not: QuickbooksPaymentLineItemFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksPaymentLineItemFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksPaymentLineItemFilter!] + + """Filter by the object’s `index` field.""" + index: QuickbooksIntFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `paymentId` field.""" + paymentId: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksPaymentLineItemsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + PAYMENT_ID_ASC + PAYMENT_ID_DESC + AMOUNT_ASC + AMOUNT_DESC + INDEX_ASC + INDEX_DESC +} + +"""""" +type QuickbooksPaymentLineItemsConnectionAverages { + """""" + realmId: Float + + """""" + paymentId: Float + + """""" + amount: Float + + """""" + index: Float +} + +"""""" +type QuickbooksPaymentLineItemsConnectionSums { + """""" + realmId: Float + + """""" + paymentId: Float + + """""" + amount: Float + + """""" + index: Float +} + +"""""" +type QuickbooksPaymentLineItemsConnectionAggregates { + """""" + sum: QuickbooksPaymentLineItemsConnectionSums + + """""" + avg: QuickbooksPaymentLineItemsConnectionAverages +} + +"""A `PaymentLineItem` edge in the connection.""" +type QuickbooksPaymentLineItemsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `PaymentLineItem` at the end of the edge.""" + node: QuickbooksPaymentLineItem +} + +"""""" +type QuickbooksPaymentLineItemTransactionsConnectionAverages { + """""" + realmId: Float + + """""" + paymentId: Float + + """""" + paymentLineItemIndex: Float + + """""" + invoiceId: Float + + """""" + creditMemoId: Float + + """""" + journalEntryId: Float + + """""" + checkId: Float +} + +"""""" +type QuickbooksPaymentLineItemTransactionsConnectionSums { + """""" + realmId: Float + + """""" + paymentId: Float + + """""" + paymentLineItemIndex: Float + + """""" + invoiceId: Float + + """""" + creditMemoId: Float + + """""" + journalEntryId: Float + + """""" + checkId: Float +} + +"""""" +type QuickbooksPaymentLineItemTransactionsConnectionAggregates { + """""" + sum: QuickbooksPaymentLineItemTransactionsConnectionSums + + """""" + avg: QuickbooksPaymentLineItemTransactionsConnectionAverages +} + +"""A `PaymentLineItemTransaction` edge in the connection.""" +type QuickbooksPaymentLineItemTransactionsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `PaymentLineItemTransaction` at the end of the edge.""" + node: QuickbooksPaymentLineItemTransaction +} + +""" +A filter to be used against BillableStatus fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksBillableStatusFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksBillableStatus + + """Greater than the specified value.""" + greaterThan: QuickbooksBillableStatus + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksBillableStatus + + """Less than the specified value.""" + lessThan: QuickbooksBillableStatus + + """Not included in the specified list.""" + notIn: [QuickbooksBillableStatus!] + + """Included in the specified list.""" + in: [QuickbooksBillableStatus!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksBillableStatus + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksBillableStatus + + """Not equal to the specified value.""" + notEqualTo: QuickbooksBillableStatus + + """Equal to the specified value.""" + equalTo: QuickbooksBillableStatus + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against PurchaseLineItemExpenseType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPurchaseLineItemExpenseTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksPurchaseLineItemExpenseType + + """Greater than the specified value.""" + greaterThan: QuickbooksPurchaseLineItemExpenseType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksPurchaseLineItemExpenseType + + """Less than the specified value.""" + lessThan: QuickbooksPurchaseLineItemExpenseType + + """Not included in the specified list.""" + notIn: [QuickbooksPurchaseLineItemExpenseType!] + + """Included in the specified list.""" + in: [QuickbooksPurchaseLineItemExpenseType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksPurchaseLineItemExpenseType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksPurchaseLineItemExpenseType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksPurchaseLineItemExpenseType + + """Equal to the specified value.""" + equalTo: QuickbooksPurchaseLineItemExpenseType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `PurchaseLineItem` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPurchaseLineItemFilter { + """Negates the expression.""" + not: QuickbooksPurchaseLineItemFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksPurchaseLineItemFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksPurchaseLineItemFilter!] + + """Filter by the object’s `unitPrice` field.""" + unitPrice: QuickbooksBigFloatFilter + + """Filter by the object’s `quantity` field.""" + quantity: QuickbooksBigFloatFilter + + """Filter by the object’s `billableStatus` field.""" + billableStatus: QuickbooksBillableStatusFilter + + """Filter by the object’s `markupPercent` field.""" + markupPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `markupAccountId` field.""" + markupAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `taxCodeId` field.""" + taxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `customerId` field.""" + customerId: QuickbooksBigIntFilter + + """Filter by the object’s `accountId` field.""" + accountId: QuickbooksBigIntFilter + + """Filter by the object’s `itemId` field.""" + itemId: QuickbooksBigIntFilter + + """Filter by the object’s `expenseType` field.""" + expenseType: QuickbooksPurchaseLineItemExpenseTypeFilter + + """Filter by the object’s `taxInclusiveAmount` field.""" + taxInclusiveAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `taxAmount` field.""" + taxAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `lineNumber` field.""" + lineNumber: QuickbooksIntFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `purchaseId` field.""" + purchaseId: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksPurchaseLineItemsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + PURCHASE_ID_ASC + PURCHASE_ID_DESC + ID_ASC + ID_DESC + AMOUNT_ASC + AMOUNT_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + LINE_NUMBER_ASC + LINE_NUMBER_DESC + TAX_AMOUNT_ASC + TAX_AMOUNT_DESC + TAX_INCLUSIVE_AMOUNT_ASC + TAX_INCLUSIVE_AMOUNT_DESC + EXPENSE_TYPE_ASC + EXPENSE_TYPE_DESC + ITEM_ID_ASC + ITEM_ID_DESC + ACCOUNT_ID_ASC + ACCOUNT_ID_DESC + CUSTOMER_ID_ASC + CUSTOMER_ID_DESC + CLASS_ID_ASC + CLASS_ID_DESC + TAX_CODE_ID_ASC + TAX_CODE_ID_DESC + MARKUP_ACCOUNT_ID_ASC + MARKUP_ACCOUNT_ID_DESC + MARKUP_PERCENT_ASC + MARKUP_PERCENT_DESC + BILLABLE_STATUS_ASC + BILLABLE_STATUS_DESC + QUANTITY_ASC + QUANTITY_DESC + UNIT_PRICE_ASC + UNIT_PRICE_DESC +} + +"""""" +type QuickbooksPurchaseLineItemsConnectionAverages { + """""" + realmId: Float + + """""" + purchaseId: Float + + """""" + id: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + taxAmount: Float + + """""" + taxInclusiveAmount: Float + + """""" + itemId: Float + + """""" + accountId: Float + + """""" + customerId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + quantity: Float + + """""" + unitPrice: Float +} + +"""""" +type QuickbooksPurchaseLineItemsConnectionSums { + """""" + realmId: Float + + """""" + purchaseId: Float + + """""" + id: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + taxAmount: Float + + """""" + taxInclusiveAmount: Float + + """""" + itemId: Float + + """""" + accountId: Float + + """""" + customerId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + quantity: Float + + """""" + unitPrice: Float +} + +"""""" +type QuickbooksPurchaseLineItemsConnectionAggregates { + """""" + sum: QuickbooksPurchaseLineItemsConnectionSums + + """""" + avg: QuickbooksPurchaseLineItemsConnectionAverages +} + +"""A `PurchaseLineItem` edge in the connection.""" +type QuickbooksPurchaseLineItemsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `PurchaseLineItem` at the end of the edge.""" + node: QuickbooksPurchaseLineItem +} + +enum QuickbooksBillableStatus { + BILLABLE + NOT_BILLABLE + HAS_BEEN_BILL +} + +enum QuickbooksPurchaseLineItemExpenseType { + ACCOUNT_BASED + ITEM_BASED +} + +"""""" +type QuickbooksPurchaseLineItem { + """""" + realmId: String! + + """""" + purchaseId: String! + + """""" + id: String! + + """""" + amount: String + + """""" + description: String + + """""" + lineNumber: Int + + """""" + taxAmount: String + + """""" + taxInclusiveAmount: String + + """""" + expenseType: QuickbooksPurchaseLineItemExpenseType! + + """""" + itemId: String + + """""" + accountId: String + + """""" + customerId: String + + """""" + classId: String + + """""" + taxCodeId: String + + """""" + markupAccountId: String + + """""" + markupPercent: String + + """""" + billableStatus: QuickbooksBillableStatus + + """""" + quantity: String + + """""" + unitPrice: String + + """Reads a single `Realm` that is related to this `PurchaseLineItem`.""" + realm: QuickbooksRealm + + """Reads a single `Purchase` that is related to this `PurchaseLineItem`.""" + purchase: QuickbooksPurchase + + """Reads a single `Item` that is related to this `PurchaseLineItem`.""" + item: QuickbooksItem + + """Reads a single `Account` that is related to this `PurchaseLineItem`.""" + account: QuickbooksAccount + + """Reads a single `Customer` that is related to this `PurchaseLineItem`.""" + customer: QuickbooksCustomer + + """Reads a single `Class` that is related to this `PurchaseLineItem`.""" + class: QuickbooksClass + + """Reads a single `TaxCode` that is related to this `PurchaseLineItem`.""" + taxCode: QuickbooksTaxCode + + """Reads a single `Account` that is related to this `PurchaseLineItem`.""" + markupAccount: QuickbooksAccount +} + +"""A connection to a list of `PurchaseLineItem` values.""" +type QuickbooksPurchaseLineItemsConnection { + """A list of `PurchaseLineItem` objects.""" + nodes: [QuickbooksPurchaseLineItem]! + + """ + A list of edges which contains the `PurchaseLineItem` and cursor to aid in pagination. + """ + edges: [QuickbooksPurchaseLineItemsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `PurchaseLineItem` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksPurchaseLineItemsConnectionAggregates +} + +""" +A filter to be used against PaymentLineItemTransactionType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPaymentLineItemTransactionTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksPaymentLineItemTransactionType + + """Greater than the specified value.""" + greaterThan: QuickbooksPaymentLineItemTransactionType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksPaymentLineItemTransactionType + + """Less than the specified value.""" + lessThan: QuickbooksPaymentLineItemTransactionType + + """Not included in the specified list.""" + notIn: [QuickbooksPaymentLineItemTransactionType!] + + """Included in the specified list.""" + in: [QuickbooksPaymentLineItemTransactionType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksPaymentLineItemTransactionType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksPaymentLineItemTransactionType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksPaymentLineItemTransactionType + + """Equal to the specified value.""" + equalTo: QuickbooksPaymentLineItemTransactionType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `PaymentLineItemTransaction` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPaymentLineItemTransactionFilter { + """Negates the expression.""" + not: QuickbooksPaymentLineItemTransactionFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksPaymentLineItemTransactionFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksPaymentLineItemTransactionFilter!] + + """Filter by the object’s `checkId` field.""" + checkId: QuickbooksBigIntFilter + + """Filter by the object’s `journalEntryId` field.""" + journalEntryId: QuickbooksBigIntFilter + + """Filter by the object’s `creditMemoId` field.""" + creditMemoId: QuickbooksBigIntFilter + + """Filter by the object’s `invoiceId` field.""" + invoiceId: QuickbooksBigIntFilter + + """Filter by the object’s `paymentLineItemIndex` field.""" + paymentLineItemIndex: QuickbooksIntFilter + + """Filter by the object’s `paymentId` field.""" + paymentId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionType` field.""" + transactionType: QuickbooksPaymentLineItemTransactionTypeFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksPaymentLineItemTransactionsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + TRANSACTION_TYPE_ASC + TRANSACTION_TYPE_DESC + PAYMENT_ID_ASC + PAYMENT_ID_DESC + PAYMENT_LINE_ITEM_INDEX_ASC + PAYMENT_LINE_ITEM_INDEX_DESC + INVOICE_ID_ASC + INVOICE_ID_DESC + CREDIT_MEMO_ID_ASC + CREDIT_MEMO_ID_DESC + JOURNAL_ENTRY_ID_ASC + JOURNAL_ENTRY_ID_DESC + CHECK_ID_ASC + CHECK_ID_DESC +} + +enum QuickbooksPurchasePaymentType { + CASH + CHECK + CREDIT_CARD +} + +"""""" +type QuickbooksPurchase implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + paymentType: QuickbooksPurchasePaymentType + + """""" + accountId: String + + """""" + syncToken: String + + """""" + currencyCode: String + + """""" + transactionDate: String + + """""" + printStatus: QuickbooksPrintStatus + + """""" + remitToAddressId: String + + """""" + transactionSource: String + + """""" + globalTaxCalculation: QuickbooksGlobalTaxCalculation + + """""" + totalAmount: String + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """""" + docNumber: String + + """""" + privateNote: String + + """""" + credit: Boolean + + """""" + transactionTaxCodeId: String + + """""" + transactionTotalTax: String + + """""" + paymentMethodId: String + + """""" + exchangeRate: String + + """""" + departmentId: String + + """""" + customerId: String + + """""" + vendorId: String + + """""" + employeeId: String + + """Reads a single `Realm` that is related to this `Purchase`.""" + realm: QuickbooksRealm + + """Reads a single `Account` that is related to this `Purchase`.""" + account: QuickbooksAccount + + """Reads a single `PhysicalAddress` that is related to this `Purchase`.""" + remitToAddress: QuickbooksPhysicalAddress + + """Reads a single `PaymentMethod` that is related to this `Purchase`.""" + paymentMethod: QuickbooksPaymentMethod + + """Reads a single `Customer` that is related to this `Purchase`.""" + customer: QuickbooksCustomer + + """Reads a single `Vendor` that is related to this `Purchase`.""" + vendor: QuickbooksVendor + + """Reads a single `Employee` that is related to this `Purchase`.""" + employee: QuickbooksEmployee + + """Reads a single `Currency` that is related to this `Purchase`.""" + currency: QuickbooksCurrency + + """ + Reads and enables pagination through a set of `PaymentLineItemTransaction`. + """ + paymentLineItemTransactions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentLineItemTransactionFilter + + """The method to use when ordering `PaymentLineItemTransaction`.""" + orderBy: [QuickbooksPaymentLineItemTransactionsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentLineItemTransactionsConnection! + + """Reads and enables pagination through a set of `PurchaseLineItem`.""" + lineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseLineItemFilter + + """The method to use when ordering `PurchaseLineItem`.""" + orderBy: [QuickbooksPurchaseLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchaseLineItemsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against `TransactionTaxDetailLine` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTransactionTaxDetailLineFilter { + """Negates the expression.""" + not: QuickbooksTransactionTaxDetailLineFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksTransactionTaxDetailLineFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksTransactionTaxDetailLineFilter!] + + """Filter by the object’s `journalEntryId` field.""" + journalEntryId: QuickbooksBigIntFilter + + """Filter by the object’s `salesReceiptId` field.""" + salesReceiptId: QuickbooksBigIntFilter + + """Filter by the object’s `refundReceiptId` field.""" + refundReceiptId: QuickbooksBigIntFilter + + """Filter by the object’s `depositId` field.""" + depositId: QuickbooksBigIntFilter + + """Filter by the object’s `creditMemoId` field.""" + creditMemoId: QuickbooksBigIntFilter + + """Filter by the object’s `estimateId` field.""" + estimateId: QuickbooksBigIntFilter + + """Filter by the object’s `invoiceId` field.""" + invoiceId: QuickbooksBigIntFilter + + """Filter by the object’s `taxPercent` field.""" + taxPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `overrideDeltaAmount` field.""" + overrideDeltaAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `taxInclusiveAmount` field.""" + taxInclusiveAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `percentBased` field.""" + percentBased: QuickbooksBooleanFilter + + """Filter by the object’s `netAmountTaxable` field.""" + netAmountTaxable: QuickbooksBigFloatFilter + + """Filter by the object’s `taxRateId` field.""" + taxRateId: QuickbooksBigIntFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksTransactionTaxDetailLinesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + AMOUNT_ASC + AMOUNT_DESC + TAX_RATE_ID_ASC + TAX_RATE_ID_DESC + NET_AMOUNT_TAXABLE_ASC + NET_AMOUNT_TAXABLE_DESC + PERCENT_BASED_ASC + PERCENT_BASED_DESC + TAX_INCLUSIVE_AMOUNT_ASC + TAX_INCLUSIVE_AMOUNT_DESC + OVERRIDE_DELTA_AMOUNT_ASC + OVERRIDE_DELTA_AMOUNT_DESC + TAX_PERCENT_ASC + TAX_PERCENT_DESC + INVOICE_ID_ASC + INVOICE_ID_DESC + ESTIMATE_ID_ASC + ESTIMATE_ID_DESC + CREDIT_MEMO_ID_ASC + CREDIT_MEMO_ID_DESC + DEPOSIT_ID_ASC + DEPOSIT_ID_DESC + REFUND_RECEIPT_ID_ASC + REFUND_RECEIPT_ID_DESC + SALES_RECEIPT_ID_ASC + SALES_RECEIPT_ID_DESC + JOURNAL_ENTRY_ID_ASC + JOURNAL_ENTRY_ID_DESC +} + +"""""" +type QuickbooksJournalEntry implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + syncToken: String + + """""" + currencyCode: String + + """""" + docNumber: String + + """""" + privateNote: String + + """""" + transactionDate: String + + """""" + totalAmount: String + + """""" + exchangeRate: String + + """""" + homeTotalAmount: String + + """""" + transactionTaxCodeId: String + + """""" + transactionTotalTax: String + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + adjustment: Boolean + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `TaxCode` that is related to this `JournalEntry`.""" + transactionTaxCode: QuickbooksTaxCode + + """Reads a single `Currency` that is related to this `JournalEntry`.""" + currency: QuickbooksCurrency + + """ + Reads and enables pagination through a set of `TransactionTaxDetailLine`. + """ + transactionTaxDetailLines( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransactionTaxDetailLineFilter + + """The method to use when ordering `TransactionTaxDetailLine`.""" + orderBy: [QuickbooksTransactionTaxDetailLinesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransactionTaxDetailLinesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksPaymentLineItemTransactionType { + INVOICE + CREDIT_MEMO + PURCHASE + JOURNAL_ENTRY +} + +"""""" +type QuickbooksPaymentLineItemTransaction { + """""" + realmId: String! + + """""" + transactionType: QuickbooksPaymentLineItemTransactionType + + """""" + paymentId: String! + + """""" + paymentLineItemIndex: Int! + + """""" + invoiceId: String + + """""" + creditMemoId: String + + """""" + journalEntryId: String + + """""" + checkId: String + + """ + Reads a single `PaymentLineItem` that is related to this `PaymentLineItemTransaction`. + """ + paymentLineItem: QuickbooksPaymentLineItem + + """ + Reads a single `Invoice` that is related to this `PaymentLineItemTransaction`. + """ + invoice: QuickbooksInvoice + + """ + Reads a single `CreditMemo` that is related to this `PaymentLineItemTransaction`. + """ + creditMemo: QuickbooksCreditMemo + + """ + Reads a single `JournalEntry` that is related to this `PaymentLineItemTransaction`. + """ + journalEntry: QuickbooksJournalEntry + + """ + Reads a single `Purchase` that is related to this `PaymentLineItemTransaction`. + """ + check: QuickbooksPurchase +} + +"""A connection to a list of `PaymentLineItemTransaction` values.""" +type QuickbooksPaymentLineItemTransactionsConnection { + """A list of `PaymentLineItemTransaction` objects.""" + nodes: [QuickbooksPaymentLineItemTransaction]! + + """ + A list of edges which contains the `PaymentLineItemTransaction` and cursor to aid in pagination. + """ + edges: [QuickbooksPaymentLineItemTransactionsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `PaymentLineItemTransaction` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksPaymentLineItemTransactionsConnectionAggregates +} + +"""""" +type QuickbooksPaymentLineItem { + """""" + realmId: String! + + """""" + paymentId: String! + + """""" + amount: String + + """""" + index: Int! + + """Reads a single `Payment` that is related to this `PaymentLineItem`.""" + payment: QuickbooksPayment + + """ + Reads and enables pagination through a set of `PaymentLineItemTransaction`. + """ + linkedTransactions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentLineItemTransactionFilter + + """The method to use when ordering `PaymentLineItemTransaction`.""" + orderBy: [QuickbooksPaymentLineItemTransactionsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentLineItemTransactionsConnection! +} + +"""A connection to a list of `PaymentLineItem` values.""" +type QuickbooksPaymentLineItemsConnection { + """A list of `PaymentLineItem` objects.""" + nodes: [QuickbooksPaymentLineItem]! + + """ + A list of edges which contains the `PaymentLineItem` and cursor to aid in pagination. + """ + edges: [QuickbooksPaymentLineItemsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `PaymentLineItem` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksPaymentLineItemsConnectionAggregates +} + +"""""" +type QuickbooksCreditChargeInfo { + """""" + creditCardExpiryMonth: Int + + """""" + processPayment: Boolean + + """""" + postalCode: String + + """""" + amount: String + + """""" + nameOnAccount: String + + """""" + creditCardExpiryYear: Int + + """""" + creditCardType: String + + """""" + billingAddressStreet: String +} + +enum QuickbooksCreditCardPaymentStatus { + COMPLETED + UKNOWN +} + +"""""" +type QuickbooksCreditChargeResponse { + """""" + status: QuickbooksCreditCardPaymentStatus + + """""" + authCode: String + + """""" + transactionAuthorizationTime: String + + """""" + creditCardTransactionId: String +} + +"""""" +type QuickbooksPaymentCreditCardPayment { + """""" + creditChargeResponse: QuickbooksCreditChargeResponse + + """""" + creditChargeInfo: QuickbooksCreditChargeInfo +} + +enum QuickbooksPaymentTransactionStatus { + PAID +} + +"""""" +type QuickbooksPayment implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + totalAmount: String + + """""" + customerId: String + + """""" + syncToken: String + + """""" + currencyCode: String + + """""" + privateNote: String + + """""" + paymentMethodId: String + + """""" + unappliedAmount: String + + """""" + depositToAccountId: String + + """""" + transactionStatus: QuickbooksPaymentTransactionStatus + + """""" + exchangeRate: String + + """""" + transactionSource: String + + """""" + accountsReceivableAccountId: String + + """""" + paymentRefNumber: String + + """""" + transactionDate: String + + """""" + creditCardPayment: QuickbooksPaymentCreditCardPayment + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + processPayment: Boolean + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `Customer` that is related to this `Payment`.""" + customers: QuickbooksCustomer + + """Reads a single `PaymentMethod` that is related to this `Payment`.""" + paymentMethod: QuickbooksPaymentMethod + + """Reads a single `Account` that is related to this `Payment`.""" + depositToAccount: QuickbooksAccount + + """Reads a single `Account` that is related to this `Payment`.""" + accountsReceivableAccount: QuickbooksAccount + + """Reads a single `Currency` that is related to this `Payment`.""" + currency: QuickbooksCurrency + + """Reads and enables pagination through a set of `PaymentLineItem`.""" + lineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentLineItemFilter + + """The method to use when ordering `PaymentLineItem`.""" + orderBy: [QuickbooksPaymentLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentLineItemsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type QuickbooksTransfer implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + toAccountId: String + + """""" + amount: String + + """""" + fromAccountId: String + + """""" + syncToken: String + + """""" + privateNote: String + + """""" + transactionDate: String + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `Account` that is related to this `Transfer`.""" + toAccount: QuickbooksAccount + + """Reads a single `Account` that is related to this `Transfer`.""" + fromAccount: QuickbooksAccount + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksDepositLineItemTransactionType { + TRANSFER + PAYMENT + SALES_RECEIPT + REFUND_RECEIPT + JOURNAL_ENTRY +} + +"""""" +type QuickbooksDepositLineItemTransaction { + """""" + realmId: String! + + """""" + depositId: String! + + """""" + depositLineItemIndex: Int! + + """""" + transactionType: QuickbooksDepositLineItemTransactionType + + """""" + transferId: String + + """""" + paymentId: String + + """""" + salesReceiptId: String + + """""" + refundReceiptId: String + + """""" + journalEntryId: String + + """ + Reads a single `DepositLineItem` that is related to this `DepositLineItemTransaction`. + """ + depositLineItem: QuickbooksDepositLineItem + + """ + Reads a single `Transfer` that is related to this `DepositLineItemTransaction`. + """ + transfer: QuickbooksTransfer + + """ + Reads a single `Payment` that is related to this `DepositLineItemTransaction`. + """ + payment: QuickbooksPayment + + """ + Reads a single `SalesReceipt` that is related to this `DepositLineItemTransaction`. + """ + salesReceipt: QuickbooksSalesReceipt + + """ + Reads a single `RefundReceipt` that is related to this `DepositLineItemTransaction`. + """ + refundReceipt: QuickbooksRefundReceipt + + """ + Reads a single `JournalEntry` that is related to this `DepositLineItemTransaction`. + """ + journalEntry: QuickbooksJournalEntry +} + +"""A connection to a list of `DepositLineItemTransaction` values.""" +type QuickbooksDepositLineItemTransactionsConnection { + """A list of `DepositLineItemTransaction` objects.""" + nodes: [QuickbooksDepositLineItemTransaction]! + + """ + A list of edges which contains the `DepositLineItemTransaction` and cursor to aid in pagination. + """ + edges: [QuickbooksDepositLineItemTransactionsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `DepositLineItemTransaction` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksDepositLineItemTransactionsConnectionAggregates +} + +enum QuickbooksDepositLineItemPaymentTransactionType { + APCREDIT_CARD + ARREFUND_CREDIT_CARD + BILL + BILL_PAYMENT_CHECK + BUILD_ASSEMBLY + CARRY_OVER + CASH_PURCHASE + CHARGE + CHECK + CREDIT_MEMO + DEPOSIT + EFPLIABILITY_CHECK + EFTBILL_PAYMENT + EFTREFUND + ESTIMATE + INVENTORY_ADJUSTMENT + INVENTORY_TRANSFER + INVOICE + ITEM_RECEIPT + JOURNAL_ENTRY + LIABILITY_ADJUSTMENT + PAYCHECK + PAYROLL_LIABILITY_CHECK + PURCHASE + PURCHASE_ORDER + PRIOR_PAYMENT + RECEIVE_PAYMENT + REFUND_CHECK + REFUND_RECEIPT + SALES_ORDER + SALES_RECEIPT + SALES_TAX_PAYMENT_CHECK + TRANSFER + TIME_ACTIVITY + VENDOR_CREDIT + YTDADJUSTMENT +} + +enum QuickbooksDepositLineItemTaxApplicableOn { + SALES + PURCHASE +} + +"""""" +type QuickbooksDepositLineItem { + """""" + realmId: String! + + """""" + id: String + + """""" + depositId: String! + + """""" + index: Int! + + """""" + amount: String + + """""" + description: String + + """""" + lineNumber: Int + + """""" + customFields: String + + """""" + accountId: String + + """""" + paymentMethodId: String + + """""" + classId: String + + """""" + checkNumber: String + + """""" + taxCodeId: String + + """""" + taxApplicableOn: QuickbooksDepositLineItemTaxApplicableOn + + """""" + transactionType: QuickbooksDepositLineItemPaymentTransactionType + + """""" + customerId: String + + """""" + vendorId: String + + """Reads a single `Deposit` that is related to this `DepositLineItem`.""" + deposit: QuickbooksDeposit + + """Reads a single `Account` that is related to this `DepositLineItem`.""" + account: QuickbooksAccount + + """ + Reads a single `PaymentMethod` that is related to this `DepositLineItem`. + """ + paymentMethod: QuickbooksPaymentMethod + + """Reads a single `Class` that is related to this `DepositLineItem`.""" + class: QuickbooksClass + + """Reads a single `TaxCode` that is related to this `DepositLineItem`.""" + taxCode: QuickbooksTaxCode + + """Reads a single `Customer` that is related to this `DepositLineItem`.""" + customer: QuickbooksCustomer + + """Reads a single `Vendor` that is related to this `DepositLineItem`.""" + vendor: QuickbooksVendor + + """ + Reads and enables pagination through a set of `DepositLineItemTransaction`. + """ + linkedTransactions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepositLineItemTransactionFilter + + """The method to use when ordering `DepositLineItemTransaction`.""" + orderBy: [QuickbooksDepositLineItemTransactionsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepositLineItemTransactionsConnection! +} + +"""A connection to a list of `DepositLineItem` values.""" +type QuickbooksDepositLineItemsConnection { + """A list of `DepositLineItem` objects.""" + nodes: [QuickbooksDepositLineItem]! + + """ + A list of edges which contains the `DepositLineItem` and cursor to aid in pagination. + """ + edges: [QuickbooksDepositLineItemsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `DepositLineItem` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksDepositLineItemsConnectionAggregates +} + +enum QuickbooksDepositTransactionStatus { + DRAFT + OVERDUE + PENDING + PAYABLE + PAID + TRASH + UNPAID +} + +"""""" +type QuickbooksDeposit implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + depositToAccountId: String + + """""" + syncToken: String + + """""" + currencyCode: String + + """""" + privateNote: String + + """""" + transactionStatus: QuickbooksDepositTransactionStatus + + """""" + totalAmount: String + + """""" + exchangeRate: String + + """""" + globalTaxCalculation: QuickbooksGlobalTaxCalculation + + """""" + homeTotalAmount: String + + """""" + departmentId: String + + """""" + transactionSource: String + + """""" + transactionDate: String + + """""" + cashBackAccountId: String + + """""" + cashBackAmount: String + + """""" + cashBackMemo: String + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + transactionTaxCodeId: String + + """""" + transactionTotalTax: String + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `Account` that is related to this `Deposit`.""" + depositToAccount: QuickbooksAccount + + """Reads a single `Department` that is related to this `Deposit`.""" + department: QuickbooksDepartment + + """Reads a single `Account` that is related to this `Deposit`.""" + cashBackAccount: QuickbooksAccount + + """Reads a single `Currency` that is related to this `Deposit`.""" + currency: QuickbooksCurrency + + """Reads and enables pagination through a set of `DepositLineItem`.""" + lineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepositLineItemFilter + + """The method to use when ordering `DepositLineItem`.""" + orderBy: [QuickbooksDepositLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepositLineItemsConnection! + + """ + Reads and enables pagination through a set of `TransactionTaxDetailLine`. + """ + transactionTaxDetailLines( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransactionTaxDetailLineFilter + + """The method to use when ordering `TransactionTaxDetailLine`.""" + orderBy: [QuickbooksTransactionTaxDetailLinesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransactionTaxDetailLinesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against TaxRateDisplayType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTaxRateDisplayTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksTaxRateDisplayType + + """Greater than the specified value.""" + greaterThan: QuickbooksTaxRateDisplayType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksTaxRateDisplayType + + """Less than the specified value.""" + lessThan: QuickbooksTaxRateDisplayType + + """Not included in the specified list.""" + notIn: [QuickbooksTaxRateDisplayType!] + + """Included in the specified list.""" + in: [QuickbooksTaxRateDisplayType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksTaxRateDisplayType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksTaxRateDisplayType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksTaxRateDisplayType + + """Equal to the specified value.""" + equalTo: QuickbooksTaxRateDisplayType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `TaxRate` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTaxRateFilter { + """Negates the expression.""" + not: QuickbooksTaxRateFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksTaxRateFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksTaxRateFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `active` field.""" + active: QuickbooksBooleanFilter + + """Filter by the object’s `displayType` field.""" + displayType: QuickbooksTaxRateDisplayTypeFilter + + """Filter by the object’s `specialTaxType` field.""" + specialTaxType: QuickbooksStringFilter + + """Filter by the object’s `agencyId` field.""" + agencyId: QuickbooksBigIntFilter + + """Filter by the object’s `name` field.""" + name: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `rateValue` field.""" + rateValue: QuickbooksBigFloatFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksTaxRatesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + RATE_VALUE_ASC + RATE_VALUE_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + NAME_ASC + NAME_DESC + AGENCY_ID_ASC + AGENCY_ID_DESC + SPECIAL_TAX_TYPE_ASC + SPECIAL_TAX_TYPE_DESC + EFFECTIVE_TAX_RATE_ASC + EFFECTIVE_TAX_RATE_DESC + DISPLAY_TYPE_ASC + DISPLAY_TYPE_DESC + ACTIVE_ASC + ACTIVE_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksTaxRatesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + rateValue: Float + + """""" + syncToken: Float + + """""" + agencyId: Float +} + +"""""" +type QuickbooksTaxRatesConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + rateValue: Float + + """""" + syncToken: Float + + """""" + agencyId: Float +} + +"""""" +type QuickbooksTaxRatesConnectionAggregates { + """""" + sum: QuickbooksTaxRatesConnectionSums + + """""" + avg: QuickbooksTaxRatesConnectionAverages +} + +"""A `TaxRate` edge in the connection.""" +type QuickbooksTaxRatesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `TaxRate` at the end of the edge.""" + node: QuickbooksTaxRate +} + +"""A connection to a list of `TaxRate` values.""" +type QuickbooksTaxRatesConnection { + """A list of `TaxRate` objects.""" + nodes: [QuickbooksTaxRate]! + + """ + A list of edges which contains the `TaxRate` and cursor to aid in pagination. + """ + edges: [QuickbooksTaxRatesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `TaxRate` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksTaxRatesConnectionAggregates +} + +"""""" +type QuickbooksTaxAgency implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + displayName: String + + """""" + syncToken: String + + """""" + taxTrackedOnSales: Boolean + + """""" + taxTrackedOnPurchases: Boolean + + """""" + lastFileDate: String + + """""" + taxRegistrationNumber: String + + """""" + createTime: String + + """""" + lastUpdatedTime: String + + """Reads and enables pagination through a set of `TaxRate`.""" + taxRates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTaxRateFilter + + """The method to use when ordering `TaxRate`.""" + orderBy: [QuickbooksTaxRatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTaxRatesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksTaxRateDisplayType { + READ_ONLY + HIDE_IN_TRANSACTION_FORMS + HIDE_IN_PRINTED_FORMS + HIDE_IN_ALL +} + +"""""" +type QuickbooksEffectiveTaxRate { + """""" + rateValue: String + + """""" + endDate: String + + """""" + effectiveDate: String +} + +"""""" +type QuickbooksTaxRate implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + rateValue: String + + """""" + syncToken: String + + """""" + name: String + + """""" + agencyId: String + + """""" + specialTaxType: String + + """""" + effectiveTaxRate: QuickbooksEffectiveTaxRate + + """""" + displayType: QuickbooksTaxRateDisplayType + + """""" + active: Boolean + + """""" + description: String + + """""" + createTime: String + + """""" + lastUpdatedTime: String + + """Reads a single `TaxAgency` that is related to this `TaxRate`.""" + taxAgency: QuickbooksTaxAgency + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type QuickbooksTransactionTaxDetailLine { + """""" + realmId: String! + + """""" + amount: String + + """""" + taxRateId: String + + """""" + netAmountTaxable: String + + """""" + percentBased: Boolean + + """""" + taxInclusiveAmount: String + + """""" + overrideDeltaAmount: String + + """""" + taxPercent: String + + """""" + invoiceId: String + + """""" + estimateId: String + + """""" + creditMemoId: String + + """""" + depositId: String + + """""" + refundReceiptId: String + + """""" + salesReceiptId: String + + """""" + journalEntryId: String + + """ + Reads a single `Realm` that is related to this `TransactionTaxDetailLine`. + """ + realm: QuickbooksRealm + + """ + Reads a single `TaxRate` that is related to this `TransactionTaxDetailLine`. + """ + taxRate: QuickbooksTaxRate + + """ + Reads a single `Invoice` that is related to this `TransactionTaxDetailLine`. + """ + invoice: QuickbooksInvoice + + """ + Reads a single `Estimate` that is related to this `TransactionTaxDetailLine`. + """ + estimate: QuickbooksEstimate + + """ + Reads a single `CreditMemo` that is related to this `TransactionTaxDetailLine`. + """ + creditMemo: QuickbooksCreditMemo + + """ + Reads a single `Deposit` that is related to this `TransactionTaxDetailLine`. + """ + deposit: QuickbooksDeposit + + """ + Reads a single `RefundReceipt` that is related to this `TransactionTaxDetailLine`. + """ + refundReceipt: QuickbooksRefundReceipt + + """ + Reads a single `SalesReceipt` that is related to this `TransactionTaxDetailLine`. + """ + salesReceipt: QuickbooksSalesReceipt + + """ + Reads a single `JournalEntry` that is related to this `TransactionTaxDetailLine`. + """ + journalEntry: QuickbooksJournalEntry +} + +"""A connection to a list of `TransactionTaxDetailLine` values.""" +type QuickbooksTransactionTaxDetailLinesConnection { + """A list of `TransactionTaxDetailLine` objects.""" + nodes: [QuickbooksTransactionTaxDetailLine]! + + """ + A list of edges which contains the `TransactionTaxDetailLine` and cursor to aid in pagination. + """ + edges: [QuickbooksTransactionTaxDetailLinesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `TransactionTaxDetailLine` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksTransactionTaxDetailLinesConnectionAggregates +} + +""" +A filter to be used against CreditMemoLineItemType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksCreditMemoLineItemTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksCreditMemoLineItemType + + """Greater than the specified value.""" + greaterThan: QuickbooksCreditMemoLineItemType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksCreditMemoLineItemType + + """Less than the specified value.""" + lessThan: QuickbooksCreditMemoLineItemType + + """Not included in the specified list.""" + notIn: [QuickbooksCreditMemoLineItemType!] + + """Included in the specified list.""" + in: [QuickbooksCreditMemoLineItemType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksCreditMemoLineItemType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksCreditMemoLineItemType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksCreditMemoLineItemType + + """Equal to the specified value.""" + equalTo: QuickbooksCreditMemoLineItemType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `CreditMemoLineItem` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksCreditMemoLineItemFilter { + """Negates the expression.""" + not: QuickbooksCreditMemoLineItemFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksCreditMemoLineItemFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksCreditMemoLineItemFilter!] + + """Filter by the object’s `discountPercent` field.""" + discountPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `discountIsPercentBased` field.""" + discountIsPercentBased: QuickbooksBooleanFilter + + """Filter by the object’s `discountAccountId` field.""" + discountAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `groupItemId` field.""" + groupItemId: QuickbooksBigIntFilter + + """Filter by the object’s `taxClassificationId` field.""" + taxClassificationId: QuickbooksStringFilter + + """Filter by the object’s `unitPrice` field.""" + unitPrice: QuickbooksBigFloatFilter + + """Filter by the object’s `quantity` field.""" + quantity: QuickbooksBigFloatFilter + + """Filter by the object’s `discountRate` field.""" + discountRate: QuickbooksBigFloatFilter + + """Filter by the object’s `serviceDate` field.""" + serviceDate: QuickbooksDateFilter + + """Filter by the object’s `itemAccountId` field.""" + itemAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `markupPercent` field.""" + markupPercent: QuickbooksBigFloatFilter + + """Filter by the object’s `markupAccountId` field.""" + markupAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `taxCodeId` field.""" + taxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `itemId` field.""" + itemId: QuickbooksBigIntFilter + + """Filter by the object’s `discountAmount` field.""" + discountAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `taxInclusiveAmount` field.""" + taxInclusiveAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `index` field.""" + index: QuickbooksIntFilter + + """Filter by the object’s `lineNumber` field.""" + lineNumber: QuickbooksIntFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `amount` field.""" + amount: QuickbooksBigFloatFilter + + """Filter by the object’s `type` field.""" + type: QuickbooksCreditMemoLineItemTypeFilter + + """Filter by the object’s `creditMemoId` field.""" + creditMemoId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksCreditMemoLineItemsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + CREDIT_MEMO_ID_ASC + CREDIT_MEMO_ID_DESC + TYPE_ASC + TYPE_DESC + AMOUNT_ASC + AMOUNT_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + LINE_NUMBER_ASC + LINE_NUMBER_DESC + INDEX_ASC + INDEX_DESC + TAX_INCLUSIVE_AMOUNT_ASC + TAX_INCLUSIVE_AMOUNT_DESC + DISCOUNT_AMOUNT_ASC + DISCOUNT_AMOUNT_DESC + ITEM_ID_ASC + ITEM_ID_DESC + CLASS_ID_ASC + CLASS_ID_DESC + TAX_CODE_ID_ASC + TAX_CODE_ID_DESC + MARKUP_ACCOUNT_ID_ASC + MARKUP_ACCOUNT_ID_DESC + MARKUP_PERCENT_ASC + MARKUP_PERCENT_DESC + ITEM_ACCOUNT_ID_ASC + ITEM_ACCOUNT_ID_DESC + SERVICE_DATE_ASC + SERVICE_DATE_DESC + DISCOUNT_RATE_ASC + DISCOUNT_RATE_DESC + QUANTITY_ASC + QUANTITY_DESC + UNIT_PRICE_ASC + UNIT_PRICE_DESC + TAX_CLASSIFICATION_ID_ASC + TAX_CLASSIFICATION_ID_DESC + GROUP_ITEM_ID_ASC + GROUP_ITEM_ID_DESC + DISCOUNT_ACCOUNT_ID_ASC + DISCOUNT_ACCOUNT_ID_DESC + DISCOUNT_IS_PERCENT_BASED_ASC + DISCOUNT_IS_PERCENT_BASED_DESC + DISCOUNT_PERCENT_ASC + DISCOUNT_PERCENT_DESC +} + +"""""" +type QuickbooksCreditMemoLineItemsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + creditMemoId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + index: Float + + """""" + taxInclusiveAmount: Float + + """""" + discountAmount: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + itemAccountId: Float + + """""" + discountRate: Float + + """""" + quantity: Float + + """""" + unitPrice: Float + + """""" + groupItemId: Float + + """""" + discountAccountId: Float + + """""" + discountPercent: Float +} + +"""""" +type QuickbooksCreditMemoLineItemsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + creditMemoId: Float + + """""" + amount: Float + + """""" + lineNumber: Float + + """""" + index: Float + + """""" + taxInclusiveAmount: Float + + """""" + discountAmount: Float + + """""" + itemId: Float + + """""" + classId: Float + + """""" + taxCodeId: Float + + """""" + markupAccountId: Float + + """""" + markupPercent: Float + + """""" + itemAccountId: Float + + """""" + discountRate: Float + + """""" + quantity: Float + + """""" + unitPrice: Float + + """""" + groupItemId: Float + + """""" + discountAccountId: Float + + """""" + discountPercent: Float +} + +"""""" +type QuickbooksCreditMemoLineItemsConnectionAggregates { + """""" + sum: QuickbooksCreditMemoLineItemsConnectionSums + + """""" + avg: QuickbooksCreditMemoLineItemsConnectionAverages +} + +"""A `CreditMemoLineItem` edge in the connection.""" +type QuickbooksCreditMemoLineItemsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `CreditMemoLineItem` at the end of the edge.""" + node: QuickbooksCreditMemoLineItem +} + +enum QuickbooksCreditMemoLineItemType { + SALES_ITEM + GROUP + DESCRIPTIN_ONLY + DISCOUNT + SUB_TOTAL +} + +"""""" +type QuickbooksCreditMemoLineItem { + """""" + realmId: String! + + """""" + id: String + + """""" + creditMemoId: String! + + """""" + type: QuickbooksCreditMemoLineItemType! + + """""" + amount: String + + """""" + description: String + + """""" + lineNumber: Int + + """""" + index: Int! + + """""" + taxInclusiveAmount: String + + """""" + discountAmount: String + + """""" + itemId: String + + """""" + classId: String + + """""" + taxCodeId: String + + """""" + markupAccountId: String + + """""" + markupPercent: String + + """""" + itemAccountId: String + + """""" + serviceDate: String + + """""" + discountRate: String + + """""" + quantity: String + + """""" + unitPrice: String + + """""" + taxClassificationId: String + + """""" + groupItemId: String + + """""" + discountAccountId: String + + """""" + discountIsPercentBased: Boolean + + """""" + discountPercent: String + + """Reads a single `Realm` that is related to this `CreditMemoLineItem`.""" + realm: QuickbooksRealm + + """ + Reads a single `CreditMemo` that is related to this `CreditMemoLineItem`. + """ + creditMemo: QuickbooksCreditMemo + + """Reads a single `Item` that is related to this `CreditMemoLineItem`.""" + item: QuickbooksItem + + """Reads a single `Class` that is related to this `CreditMemoLineItem`.""" + class: QuickbooksClass + + """Reads a single `TaxCode` that is related to this `CreditMemoLineItem`.""" + taxCode: QuickbooksTaxCode + + """Reads a single `Account` that is related to this `CreditMemoLineItem`.""" + account: QuickbooksAccount + + """ + Reads a single `TaxClassification` that is related to this `CreditMemoLineItem`. + """ + taxClassification: QuickbooksTaxClassification + + """Reads a single `Item` that is related to this `CreditMemoLineItem`.""" + groupItem: QuickbooksItem + + """Reads a single `Account` that is related to this `CreditMemoLineItem`.""" + dicountAccount: QuickbooksAccount +} + +"""A connection to a list of `CreditMemoLineItem` values.""" +type QuickbooksCreditMemoLineItemsConnection { + """A list of `CreditMemoLineItem` objects.""" + nodes: [QuickbooksCreditMemoLineItem]! + + """ + A list of edges which contains the `CreditMemoLineItem` and cursor to aid in pagination. + """ + edges: [QuickbooksCreditMemoLineItemsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `CreditMemoLineItem` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksCreditMemoLineItemsConnectionAggregates +} + +"""""" +type QuickbooksCreditMemo implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + customerId: String + + """""" + syncToken: String + + """""" + currencyCode: String + + """""" + transactionDate: String + + """""" + customFields: String + + """""" + homeBalance: String + + """""" + classId: String + + """""" + printStatus: QuickbooksPrintStatus + + """""" + salesTermId: String + + """""" + globalTaxCalculation: QuickbooksGlobalTaxCalculation + + """""" + totalAmount: String + + """""" + remainingCredit: String + + """""" + invoiceId: String + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + applyTaxAfterDiscount: Boolean + + """""" + docNumber: String + + """""" + privateNote: String + + """""" + customerMemo: String + + """""" + balance: String + + """""" + transactionTaxCodeId: String + + """""" + transactionTotalTax: String + + """""" + paymentMethodId: String + + """""" + exchangeRate: String + + """""" + shippingAddressId: String + + """""" + homeTotalAmount: String + + """""" + departmentId: String + + """""" + emailStatus: QuickbooksEmailStatus + + """""" + billingAddressId: String + + """""" + billingEmail: String + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `Customer` that is related to this `CreditMemo`.""" + customer: QuickbooksCustomer + + """Reads a single `Class` that is related to this `CreditMemo`.""" + class: QuickbooksClass + + """Reads a single `Term` that is related to this `CreditMemo`.""" + salesTerm: QuickbooksTerm + + """Reads a single `Invoice` that is related to this `CreditMemo`.""" + invoice: QuickbooksInvoice + + """Reads a single `TaxCode` that is related to this `CreditMemo`.""" + transactionTaxCode: QuickbooksTaxCode + + """Reads a single `PaymentMethod` that is related to this `CreditMemo`.""" + paymentMethod: QuickbooksPaymentMethod + + """Reads a single `PhysicalAddress` that is related to this `CreditMemo`.""" + shippingAddress: QuickbooksPhysicalAddress + + """Reads a single `Department` that is related to this `CreditMemo`.""" + department: QuickbooksDepartment + + """Reads a single `PhysicalAddress` that is related to this `CreditMemo`.""" + billingAddress: QuickbooksPhysicalAddress + + """Reads a single `Currency` that is related to this `CreditMemo`.""" + currency: QuickbooksCurrency + + """Reads and enables pagination through a set of `CreditMemoLineItem`.""" + lineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoLineItemFilter + + """The method to use when ordering `CreditMemoLineItem`.""" + orderBy: [QuickbooksCreditMemoLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemoLineItemsConnection! + + """ + Reads and enables pagination through a set of `TransactionTaxDetailLine`. + """ + transactionTaxDetailLines( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransactionTaxDetailLineFilter + + """The method to use when ordering `TransactionTaxDetailLine`.""" + orderBy: [QuickbooksTransactionTaxDetailLinesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransactionTaxDetailLinesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `CreditMemo` values.""" +type QuickbooksCreditMemosConnection { + """A list of `CreditMemo` objects.""" + nodes: [QuickbooksCreditMemo]! + + """ + A list of edges which contains the `CreditMemo` and cursor to aid in pagination. + """ + edges: [QuickbooksCreditMemosEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `CreditMemo` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksCreditMemosConnectionAggregates +} + +enum QuickbooksPaymentMethodType { + CREDIT_CARD + NON_CREDIT_CARD +} + +"""""" +type QuickbooksPaymentMethod implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + name: String + + """""" + syncToken: String + + """""" + active: Boolean + + """""" + type: QuickbooksPaymentMethodType + + """""" + createTime: String + + """""" + lastUpdatedTime: String + + """Reads and enables pagination through a set of `Customer`.""" + customers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCustomerFilter + + """The method to use when ordering `Customer`.""" + orderBy: [QuickbooksCustomersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCustomersConnection! + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection! + + """Reads and enables pagination through a set of `Payment`.""" + payments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentFilter + + """The method to use when ordering `Payment`.""" + orderBy: [QuickbooksPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentsConnection! + + """Reads and enables pagination through a set of `RefundReceipt`.""" + refundReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptFilter + + """The method to use when ordering `RefundReceipt`.""" + orderBy: [QuickbooksRefundReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptsConnection! + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection! + + """Reads and enables pagination through a set of `Purchase`.""" + purchases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseFilter + + """The method to use when ordering `Purchase`.""" + orderBy: [QuickbooksPurchasesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchasesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `PaymentMethod` values.""" +type QuickbooksPaymentMethodsConnection { + """A list of `PaymentMethod` objects.""" + nodes: [QuickbooksPaymentMethod]! + + """ + A list of edges which contains the `PaymentMethod` and cursor to aid in pagination. + """ + edges: [QuickbooksPaymentMethodsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `PaymentMethod` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksPaymentMethodsConnectionAggregates +} + +""" +A filter to be used against `PhysicalAddress` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPhysicalAddressFilter { + """Negates the expression.""" + not: QuickbooksPhysicalAddressFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksPhysicalAddressFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksPhysicalAddressFilter!] + + """Filter by the object’s `countrySubDivisionCode` field.""" + countrySubDivisionCode: QuickbooksStringFilter + + """Filter by the object’s `longitude` field.""" + longitude: QuickbooksStringFilter + + """Filter by the object’s `latitude` field.""" + latitude: QuickbooksStringFilter + + """Filter by the object’s `line5` field.""" + line5: QuickbooksStringFilter + + """Filter by the object’s `line4` field.""" + line4: QuickbooksStringFilter + + """Filter by the object’s `line3` field.""" + line3: QuickbooksStringFilter + + """Filter by the object’s `line2` field.""" + line2: QuickbooksStringFilter + + """Filter by the object’s `line1` field.""" + line1: QuickbooksStringFilter + + """Filter by the object’s `country` field.""" + country: QuickbooksStringFilter + + """Filter by the object’s `city` field.""" + city: QuickbooksStringFilter + + """Filter by the object’s `postalCode` field.""" + postalCode: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksPhysicalAddressesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + POSTAL_CODE_ASC + POSTAL_CODE_DESC + CITY_ASC + CITY_DESC + COUNTRY_ASC + COUNTRY_DESC + LINE1_ASC + LINE1_DESC + LINE2_ASC + LINE2_DESC + LINE3_ASC + LINE3_DESC + LINE4_ASC + LINE4_DESC + LINE5_ASC + LINE5_DESC + LATITUDE_ASC + LATITUDE_DESC + LONGITUDE_ASC + LONGITUDE_DESC + COUNTRY_SUB_DIVISION_CODE_ASC + COUNTRY_SUB_DIVISION_CODE_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksPhysicalAddressesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float +} + +"""""" +type QuickbooksPhysicalAddressesConnectionSums { + """""" + realmId: Float + + """""" + id: Float +} + +"""""" +type QuickbooksPhysicalAddressesConnectionAggregates { + """""" + sum: QuickbooksPhysicalAddressesConnectionSums + + """""" + avg: QuickbooksPhysicalAddressesConnectionAverages +} + +"""A `PhysicalAddress` edge in the connection.""" +type QuickbooksPhysicalAddressesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `PhysicalAddress` at the end of the edge.""" + node: QuickbooksPhysicalAddress +} + +"""A connection to a list of `PhysicalAddress` values.""" +type QuickbooksPhysicalAddressesConnection { + """A list of `PhysicalAddress` objects.""" + nodes: [QuickbooksPhysicalAddress]! + + """ + A list of edges which contains the `PhysicalAddress` and cursor to aid in pagination. + """ + edges: [QuickbooksPhysicalAddressesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `PhysicalAddress` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksPhysicalAddressesConnectionAggregates +} + +"""""" +type QuickbooksRealm implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + isSandbox: Boolean! + + """Reads and enables pagination through a set of `PhysicalAddress`.""" + physicalAddresses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPhysicalAddressFilter + + """The method to use when ordering `PhysicalAddress`.""" + orderBy: [QuickbooksPhysicalAddressesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPhysicalAddressesConnection! + + """Reads and enables pagination through a set of `PaymentMethod`.""" + paymentMethods( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentMethodFilter + + """The method to use when ordering `PaymentMethod`.""" + orderBy: [QuickbooksPaymentMethodsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentMethodsConnection! + + """Reads and enables pagination through a set of `Term`.""" + terms( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTermFilter + + """The method to use when ordering `Term`.""" + orderBy: [QuickbooksTermsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTermsConnection! + + """Reads and enables pagination through a set of `TaxClassification`.""" + taxClassifications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTaxClassificationFilter + + """The method to use when ordering `TaxClassification`.""" + orderBy: [QuickbooksTaxClassificationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTaxClassificationsConnection! + + """Reads and enables pagination through a set of `TaxCode`.""" + taxCodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTaxCodeFilter + + """The method to use when ordering `TaxCode`.""" + orderBy: [QuickbooksTaxCodesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTaxCodesConnection! + + """Reads and enables pagination through a set of `TaxAgency`.""" + taxAgencies( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTaxAgencyFilter + + """The method to use when ordering `TaxAgency`.""" + orderBy: [QuickbooksTaxAgenciesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTaxAgenciesConnection! + + """Reads and enables pagination through a set of `TaxRate`.""" + taxRates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTaxRateFilter + + """The method to use when ordering `TaxRate`.""" + orderBy: [QuickbooksTaxRatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTaxRatesConnection! + + """Reads and enables pagination through a set of `PurchaseTaxRateDetail`.""" + purchaseTaxRateDetails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseTaxRateDetailFilter + + """The method to use when ordering `PurchaseTaxRateDetail`.""" + orderBy: [QuickbooksPurchaseTaxRateDetailsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchaseTaxRateDetailsConnection! + + """Reads and enables pagination through a set of `Class`.""" + classes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksClassFilter + + """The method to use when ordering `Class`.""" + orderBy: [QuickbooksClassesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksClassesConnection! + + """Reads and enables pagination through a set of `Employee`.""" + employees( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEmployeeFilter + + """The method to use when ordering `Employee`.""" + orderBy: [QuickbooksEmployeesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEmployeesConnection! + + """Reads and enables pagination through a set of `Vendor`.""" + vendors( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksVendorFilter + + """The method to use when ordering `Vendor`.""" + orderBy: [QuickbooksVendorsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksVendorsConnection! + + """Reads and enables pagination through a set of `Department`.""" + departments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepartmentFilter + + """The method to use when ordering `Department`.""" + orderBy: [QuickbooksDepartmentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepartmentsConnection! + + """Reads and enables pagination through a set of `Customer`.""" + customers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCustomerFilter + + """The method to use when ordering `Customer`.""" + orderBy: [QuickbooksCustomersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCustomersConnection! + + """Reads and enables pagination through a set of `Item`.""" + items( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksItemFilter + + """The method to use when ordering `Item`.""" + orderBy: [QuickbooksItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksItemsConnection! + + """Reads and enables pagination through a set of `Bill`.""" + bills( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillFilter + + """The method to use when ordering `Bill`.""" + orderBy: [QuickbooksBillsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillsConnection! + + """Reads and enables pagination through a set of `BillPayment`.""" + billPayments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillPaymentFilter + + """The method to use when ordering `BillPayment`.""" + orderBy: [QuickbooksBillPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillPaymentsConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + realmInvoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + realmEstimates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection! + + """Reads and enables pagination through a set of `Payment`.""" + payments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentFilter + + """The method to use when ordering `Payment`.""" + orderBy: [QuickbooksPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentsConnection! + + """Reads and enables pagination through a set of `RefundReceipt`.""" + refundReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptFilter + + """The method to use when ordering `RefundReceipt`.""" + orderBy: [QuickbooksRefundReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptsConnection! + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection! + + """Reads and enables pagination through a set of `JournalCode`.""" + journalCodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksJournalCodeFilter + + """The method to use when ordering `JournalCode`.""" + orderBy: [QuickbooksJournalCodesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksJournalCodesConnection! + + """Reads and enables pagination through a set of `JournalEntry`.""" + journalEntries( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksJournalEntryFilter + + """The method to use when ordering `JournalEntry`.""" + orderBy: [QuickbooksJournalEntriesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksJournalEntriesConnection! + + """Reads and enables pagination through a set of `Transfer`.""" + transfers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransferFilter + + """The method to use when ordering `Transfer`.""" + orderBy: [QuickbooksTransfersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransfersConnection! + + """Reads and enables pagination through a set of `Deposit`.""" + deposits( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepositFilter + + """The method to use when ordering `Deposit`.""" + orderBy: [QuickbooksDepositsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepositsConnection! + + """Reads and enables pagination through a set of `PaymentLineItem`.""" + paymentLineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentLineItemFilter + + """The method to use when ordering `PaymentLineItem`.""" + orderBy: [QuickbooksPaymentLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentLineItemsConnection! + + """ + Reads and enables pagination through a set of `TransactionTaxDetailLine`. + """ + transactionTaxDetailLines( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransactionTaxDetailLineFilter + + """The method to use when ordering `TransactionTaxDetailLine`.""" + orderBy: [QuickbooksTransactionTaxDetailLinesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransactionTaxDetailLinesConnection! + + """Reads and enables pagination through a set of `TimeActivity`.""" + timeActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTimeActivityFilter + + """The method to use when ordering `TimeActivity`.""" + orderBy: [QuickbooksTimeActivitiesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTimeActivitiesConnection! + + """Reads and enables pagination through a set of `Purchase`.""" + purchases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseFilter + + """The method to use when ordering `Purchase`.""" + orderBy: [QuickbooksPurchasesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchasesConnection! + + """Reads and enables pagination through a set of `PurchaseLineItem`.""" + purchaseLineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseLineItemFilter + + """The method to use when ordering `PurchaseLineItem`.""" + orderBy: [QuickbooksPurchaseLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchaseLineItemsConnection! + + """Reads a single `CompanyInfo` that is related to this `Realm`.""" + companyInfo: QuickbooksCompanyInfo + + """Reads and enables pagination through a set of `CompanyInfo`.""" + companyInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCompanyInfoFilter + + """The method to use when ordering `CompanyInfo`.""" + orderBy: [QuickbooksCompanyInfosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCompanyInfosConnection! @deprecated(reason: "Please use companyInfo instead") + + """Reads and enables pagination through a set of `Invoice`.""" + invoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + estimates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksMonthEnum { + JANUARY + FEBRUARY + MARCH + APRIL + MAY + JUNE + JULY + AUGUST + SEPTEMBER + OCTOBER + NOVEMBER + DECEMBER +} + +enum QuickbooksSubscriptionStatus { + TRIAL + PAID + SUBSCRIBED + TRIALOPTIN + RESTRICTED + SUSPENDED + EXPIRED + CANCELLED + UNKNOWN +} + +"""""" +type QuickbooksCompanyPreference { + """""" + neoEnabled: Boolean + + """""" + firstTransactionDate: String + + """""" + industryType: String + + """""" + industryCode: String + + """""" + companyType: String + + """""" + offeringSku: String + + """""" + subscriptionStatus: QuickbooksSubscriptionStatus + + """""" + payrollFeature: Boolean + + """""" + accountantFeature: Boolean + + """""" + itemCategoriesFeature: Boolean + + """""" + nonTracking: Boolean +} + +"""""" +type QuickbooksCompanyInfo implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + name: String + + """""" + addressId: String + + """""" + syncToken: String + + """""" + legalAddressId: String + + """""" + supportedLanguages: [String] + + """""" + country: String + + """""" + email: String + + """""" + webAddress: String + + """""" + preferences: QuickbooksCompanyPreference + + """""" + fiscalYearStartMonth: QuickbooksMonthEnum + + """""" + customerCommunicationAddressId: String + + """""" + primaryPhoneNumber: String + + """""" + legalName: String + + """""" + companyStartDate: String + + """""" + createTime: String + + """""" + lastUpdatedTime: String + + """Reads a single `Realm` that is related to this `CompanyInfo`.""" + realm: QuickbooksRealm + + """ + Reads a single `PhysicalAddress` that is related to this `CompanyInfo`. + """ + address: QuickbooksPhysicalAddress + + """ + Reads a single `PhysicalAddress` that is related to this `CompanyInfo`. + """ + legalAddress: QuickbooksPhysicalAddress + + """ + Reads a single `PhysicalAddress` that is related to this `CompanyInfo`. + """ + customerCommunicationAddress: QuickbooksPhysicalAddress + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An object with a globally unique `ID`.""" +interface QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! +} + +""" +A filter to be used against ItemServiceType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksItemServiceTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksItemServiceType + + """Greater than the specified value.""" + greaterThan: QuickbooksItemServiceType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksItemServiceType + + """Less than the specified value.""" + lessThan: QuickbooksItemServiceType + + """Not included in the specified list.""" + notIn: [QuickbooksItemServiceType!] + + """Included in the specified list.""" + in: [QuickbooksItemServiceType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksItemServiceType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksItemServiceType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksItemServiceType + + """Equal to the specified value.""" + equalTo: QuickbooksItemServiceType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against ItemType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksItemTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksItemType + + """Greater than the specified value.""" + greaterThan: QuickbooksItemType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksItemType + + """Less than the specified value.""" + lessThan: QuickbooksItemType + + """Not included in the specified list.""" + notIn: [QuickbooksItemType!] + + """Included in the specified list.""" + in: [QuickbooksItemType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksItemType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksItemType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksItemType + + """Equal to the specified value.""" + equalTo: QuickbooksItemType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against ItemCategoryType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksItemCategoryTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksItemCategoryType + + """Greater than the specified value.""" + greaterThan: QuickbooksItemCategoryType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksItemCategoryType + + """Less than the specified value.""" + lessThan: QuickbooksItemCategoryType + + """Not included in the specified list.""" + notIn: [QuickbooksItemCategoryType!] + + """Included in the specified list.""" + in: [QuickbooksItemCategoryType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksItemCategoryType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksItemCategoryType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksItemCategoryType + + """Equal to the specified value.""" + equalTo: QuickbooksItemCategoryType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Item` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksItemFilter { + """Negates the expression.""" + not: QuickbooksItemFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksItemFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksItemFilter!] + + """Filter by the object’s `expenseAccountId` field.""" + expenseAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `incomeAccountId` field.""" + incomeAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `unitPrice` field.""" + unitPrice: QuickbooksBigFloatFilter + + """Filter by the object’s `parentId` field.""" + parentId: QuickbooksBigIntFilter + + """Filter by the object’s `purchaseCost` field.""" + purchaseCost: QuickbooksBigFloatFilter + + """Filter by the object’s `serviceType` field.""" + serviceType: QuickbooksItemServiceTypeFilter + + """Filter by the object’s `purchaseTaxCodeId` field.""" + purchaseTaxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `taxClassificationId` field.""" + taxClassificationId: QuickbooksStringFilter + + """Filter by the object’s `uqcId` field.""" + uqcId: QuickbooksIntFilter + + """Filter by the object’s `active` field.""" + active: QuickbooksBooleanFilter + + """Filter by the object’s `level` field.""" + level: QuickbooksIntFilter + + """Filter by the object’s `preferredVendorId` field.""" + preferredVendorId: QuickbooksBigIntFilter + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `purchaseDesc` field.""" + purchaseDesc: QuickbooksStringFilter + + """Filter by the object’s `uqcDisplayText` field.""" + uqcDisplayText: QuickbooksStringFilter + + """Filter by the object’s `taxable` field.""" + taxable: QuickbooksBooleanFilter + + """Filter by the object’s `subItem` field.""" + subItem: QuickbooksBooleanFilter + + """Filter by the object’s `reverseChargeRate` field.""" + reverseChargeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `abatementRate` field.""" + abatementRate: QuickbooksBigFloatFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `fullyQualifiedName` field.""" + fullyQualifiedName: QuickbooksStringFilter + + """Filter by the object’s `purchaseTaxIncluded` field.""" + purchaseTaxIncluded: QuickbooksBooleanFilter + + """Filter by the object’s `salesTaxCodeId` field.""" + salesTaxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `trackQuantityOnHand` field.""" + trackQuantityOnHand: QuickbooksBooleanFilter + + """Filter by the object’s `salesTaxIncluded` field.""" + salesTaxIncluded: QuickbooksBooleanFilter + + """Filter by the object’s `sku` field.""" + sku: QuickbooksStringFilter + + """Filter by the object’s `assetAccountId` field.""" + assetAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `quantityOnHand` field.""" + quantityOnHand: QuickbooksBigFloatFilter + + """Filter by the object’s `type` field.""" + type: QuickbooksItemTypeFilter + + """Filter by the object’s `inventoryStartDate` field.""" + inventoryStartDate: QuickbooksDateFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `categoryType` field.""" + categoryType: QuickbooksItemCategoryTypeFilter + + """Filter by the object’s `name` field.""" + name: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksItemsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + CATEGORY_TYPE_ASC + CATEGORY_TYPE_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + INVENTORY_START_DATE_ASC + INVENTORY_START_DATE_DESC + TYPE_ASC + TYPE_DESC + QUANTITY_ON_HAND_ASC + QUANTITY_ON_HAND_DESC + ASSET_ACCOUNT_ID_ASC + ASSET_ACCOUNT_ID_DESC + SKU_ASC + SKU_DESC + SALES_TAX_INCLUDED_ASC + SALES_TAX_INCLUDED_DESC + TRACK_QUANTITY_ON_HAND_ASC + TRACK_QUANTITY_ON_HAND_DESC + SALES_TAX_CODE_ID_ASC + SALES_TAX_CODE_ID_DESC + PURCHASE_TAX_INCLUDED_ASC + PURCHASE_TAX_INCLUDED_DESC + FULLY_QUALIFIED_NAME_ASC + FULLY_QUALIFIED_NAME_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + ABATEMENT_RATE_ASC + ABATEMENT_RATE_DESC + REVERSE_CHARGE_RATE_ASC + REVERSE_CHARGE_RATE_DESC + SUB_ITEM_ASC + SUB_ITEM_DESC + TAXABLE_ASC + TAXABLE_DESC + UQC_DISPLAY_TEXT_ASC + UQC_DISPLAY_TEXT_DESC + PURCHASE_DESC_ASC + PURCHASE_DESC_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PREFERRED_VENDOR_ID_ASC + PREFERRED_VENDOR_ID_DESC + LEVEL_ASC + LEVEL_DESC + ACTIVE_ASC + ACTIVE_DESC + UQC_ID_ASC + UQC_ID_DESC + TAX_CLASSIFICATION_ID_ASC + TAX_CLASSIFICATION_ID_DESC + PURCHASE_TAX_CODE_ID_ASC + PURCHASE_TAX_CODE_ID_DESC + SERVICE_TYPE_ASC + SERVICE_TYPE_DESC + PURCHASE_COST_ASC + PURCHASE_COST_DESC + PARENT_ID_ASC + PARENT_ID_DESC + UNIT_PRICE_ASC + UNIT_PRICE_DESC + INCOME_ACCOUNT_ID_ASC + INCOME_ACCOUNT_ID_DESC + EXPENSE_ACCOUNT_ID_ASC + EXPENSE_ACCOUNT_ID_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +""" +A filter to be used against ItemType List fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksItemTypeListFilter { + """Any array item is greater than or equal to the specified value.""" + anyGreaterThanOrEqualTo: QuickbooksItemType + + """Any array item is greater than the specified value.""" + anyGreaterThan: QuickbooksItemType + + """Any array item is less than or equal to the specified value.""" + anyLessThanOrEqualTo: QuickbooksItemType + + """Any array item is less than the specified value.""" + anyLessThan: QuickbooksItemType + + """Any array item is not equal to the specified value.""" + anyNotEqualTo: QuickbooksItemType + + """Any array item is equal to the specified value.""" + anyEqualTo: QuickbooksItemType + + """Overlaps the specified list of values.""" + overlaps: [QuickbooksItemType] + + """Contained by the specified list of values.""" + containedBy: [QuickbooksItemType] + + """Contains the specified list of values.""" + contains: [QuickbooksItemType] + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: [QuickbooksItemType] + + """Greater than the specified value.""" + greaterThan: [QuickbooksItemType] + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: [QuickbooksItemType] + + """Less than the specified value.""" + lessThan: [QuickbooksItemType] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: [QuickbooksItemType] + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: [QuickbooksItemType] + + """Not equal to the specified value.""" + notEqualTo: [QuickbooksItemType] + + """Equal to the specified value.""" + equalTo: [QuickbooksItemType] + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `TaxClassification` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTaxClassificationFilter { + """Negates the expression.""" + not: QuickbooksTaxClassificationFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksTaxClassificationFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksTaxClassificationFilter!] + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `level` field.""" + level: QuickbooksIntFilter + + """Filter by the object’s `name` field.""" + name: QuickbooksStringFilter + + """Filter by the object’s `code` field.""" + code: QuickbooksStringFilter + + """Filter by the object’s `applicableTo` field.""" + applicableTo: QuickbooksItemTypeListFilter + + """Filter by the object’s `parentId` field.""" + parentId: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksStringFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksTaxClassificationsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + PARENT_ID_ASC + PARENT_ID_DESC + APPLICABLE_TO_ASC + APPLICABLE_TO_DESC + CODE_ASC + CODE_DESC + NAME_ASC + NAME_DESC + LEVEL_ASC + LEVEL_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksTaxClassificationsConnectionAverages { + """""" + realmId: Float + + """""" + syncToken: Float + + """""" + level: Float +} + +"""""" +type QuickbooksTaxClassificationsConnectionSums { + """""" + realmId: Float + + """""" + syncToken: Float + + """""" + level: Float +} + +"""""" +type QuickbooksTaxClassificationsConnectionAggregates { + """""" + sum: QuickbooksTaxClassificationsConnectionSums + + """""" + avg: QuickbooksTaxClassificationsConnectionAverages +} + +"""A `TaxClassification` edge in the connection.""" +type QuickbooksTaxClassificationsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `TaxClassification` at the end of the edge.""" + node: QuickbooksTaxClassification +} + +"""A connection to a list of `TaxClassification` values.""" +type QuickbooksTaxClassificationsConnection { + """A list of `TaxClassification` objects.""" + nodes: [QuickbooksTaxClassification]! + + """ + A list of edges which contains the `TaxClassification` and cursor to aid in pagination. + """ + edges: [QuickbooksTaxClassificationsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `TaxClassification` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksTaxClassificationsConnectionAggregates +} + +"""""" +type QuickbooksTaxClassification implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + syncToken: String + + """""" + parentId: String + + """""" + applicableTo: [QuickbooksItemType] + + """""" + code: String + + """""" + name: String + + """""" + level: Int + + """""" + description: String + + """ + Reads a single `TaxClassification` that is related to this `TaxClassification`. + """ + parent: QuickbooksTaxClassification + + """Reads and enables pagination through a set of `TaxClassification`.""" + subTaxClassifications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTaxClassificationFilter + + """The method to use when ordering `TaxClassification`.""" + orderBy: [QuickbooksTaxClassificationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTaxClassificationsConnection! + + """Reads and enables pagination through a set of `Item`.""" + items( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksItemFilter + + """The method to use when ordering `Item`.""" + orderBy: [QuickbooksItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksItemsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksEstimateLineItemType { + SALES_ITEM + GROUP + DESCRIPTIN_ONLY + DISCOUNT + SUB_TOTAL +} + +"""""" +type QuickbooksEstimateLineItem { + """""" + realmId: String! + + """""" + id: String + + """""" + estimateId: String! + + """""" + type: QuickbooksEstimateLineItemType! + + """""" + amount: String + + """""" + description: String + + """""" + lineNumber: Int + + """""" + index: Int! + + """""" + taxInclusiveAmount: String + + """""" + discountAmount: String + + """""" + itemId: String + + """""" + classId: String + + """""" + taxCodeId: String + + """""" + markupAccountId: String + + """""" + markupPercent: String + + """""" + itemAccountId: String + + """""" + serviceDate: String + + """""" + discountRate: String + + """""" + quantity: String + + """""" + unitPrice: String + + """""" + taxClassificationId: String + + """""" + groupItemId: String + + """""" + discountAccountId: String + + """""" + discountIsPercentBased: Boolean + + """""" + discountPercent: String + + """Reads a single `Estimate` that is related to this `EstimateLineItem`.""" + estimate: QuickbooksEstimate + + """Reads a single `Item` that is related to this `EstimateLineItem`.""" + item: QuickbooksItem + + """Reads a single `Class` that is related to this `EstimateLineItem`.""" + class: QuickbooksClass + + """Reads a single `TaxCode` that is related to this `EstimateLineItem`.""" + taxCode: QuickbooksTaxCode + + """Reads a single `Account` that is related to this `EstimateLineItem`.""" + itemAccount: QuickbooksAccount + + """ + Reads a single `TaxClassification` that is related to this `EstimateLineItem`. + """ + taxClassification: QuickbooksTaxClassification + + """Reads a single `Item` that is related to this `EstimateLineItem`.""" + groupItem: QuickbooksItem + + """Reads a single `Account` that is related to this `EstimateLineItem`.""" + discountAccount: QuickbooksAccount +} + +"""A connection to a list of `EstimateLineItem` values.""" +type QuickbooksEstimateLineItemsConnection { + """A list of `EstimateLineItem` objects.""" + nodes: [QuickbooksEstimateLineItem]! + + """ + A list of edges which contains the `EstimateLineItem` and cursor to aid in pagination. + """ + edges: [QuickbooksEstimateLineItemsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """ + The count of *all* `EstimateLineItem` you could get from the connection. + """ + totalCount: Int! + + """""" + aggregates: QuickbooksEstimateLineItemsConnectionAggregates +} + +enum QuickbooksTransactionStatus { + ACCEPTED + CLOSED + PENDING + REJECTED +} + +"""""" +type QuickbooksEstimate implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + customerId: String + + """""" + syncToken: String + + """""" + currencyCode: String + + """""" + transactionDate: String + + """""" + shipFromAddressId: String + + """""" + shipDate: String + + """""" + classId: String + + """""" + printStatus: QuickbooksPrintStatus + + """""" + customFields: String + + """""" + salesTermId: String + + """""" + transactionStatus: QuickbooksTransactionStatus + + """""" + globalTaxCalculation: QuickbooksGlobalTaxCalculation + + """""" + totalAmount: String + + """""" + acceptedDate: String + + """""" + expirationDate: String + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + dueDate: String + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """""" + docNumber: String + + """""" + privateNote: String + + """""" + customerMemo: String + + """""" + emailStatus: QuickbooksEmailStatus + + """""" + transactionTaxCodeId: String + + """""" + transactionTotalTax: String + + """""" + acceptedBy: String + + """""" + exchangeRate: String + + """""" + shippingAddressId: String + + """""" + homeTotalAmount: String + + """""" + departmentId: String + + """""" + shippingMethod: String + + """""" + billingAddressId: String + + """""" + applyTaxAfterDiscount: Boolean + + """""" + billingEmail: String + + """""" + deliveryType: QuickbooksDeliveryType + + """""" + deliveryTime: String + + """Reads a single `Customer` that is related to this `Estimate`.""" + customer: QuickbooksCustomer + + """Reads a single `PhysicalAddress` that is related to this `Estimate`.""" + shipFromAddress: QuickbooksPhysicalAddress + + """Reads a single `Class` that is related to this `Estimate`.""" + class: QuickbooksClass + + """Reads a single `Term` that is related to this `Estimate`.""" + salesTerm: QuickbooksTerm + + """Reads a single `TaxCode` that is related to this `Estimate`.""" + transactionTaxCode: QuickbooksTaxCode + + """Reads a single `PhysicalAddress` that is related to this `Estimate`.""" + shippingAddress: QuickbooksPhysicalAddress + + """Reads a single `Department` that is related to this `Estimate`.""" + department: QuickbooksDepartment + + """Reads a single `PhysicalAddress` that is related to this `Estimate`.""" + billingAddress: QuickbooksPhysicalAddress + + """Reads a single `Currency` that is related to this `Estimate`.""" + currency: QuickbooksCurrency + + """Reads and enables pagination through a set of `EstimateLineItem`.""" + lineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateLineItemFilter + + """The method to use when ordering `EstimateLineItem`.""" + orderBy: [QuickbooksEstimateLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimateLineItemsConnection! + + """ + Reads and enables pagination through a set of `TransactionTaxDetailLine`. + """ + transactionTaxDetailLines( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransactionTaxDetailLineFilter + + """The method to use when ordering `TransactionTaxDetailLine`.""" + orderBy: [QuickbooksTransactionTaxDetailLinesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransactionTaxDetailLinesConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + invoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Estimate` values.""" +type QuickbooksEstimatesConnection { + """A list of `Estimate` objects.""" + nodes: [QuickbooksEstimate]! + + """ + A list of edges which contains the `Estimate` and cursor to aid in pagination. + """ + edges: [QuickbooksEstimatesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Estimate` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksEstimatesConnectionAggregates +} + +""" +A filter to be used against JSON fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksJsonFilter { + """Contained by the specified JSON.""" + containedBy: String + + """Contains any of the specified keys.""" + containsAnyKeys: [String!] + + """Contains all of the specified keys.""" + containsAllKeys: [String!] + + """Contains the specified key.""" + containsKey: String + + """Contains the specified JSON.""" + contains: String + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Less than the specified value.""" + lessThan: String + + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against EmailStatus fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksEmailStatusFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksEmailStatus + + """Greater than the specified value.""" + greaterThan: QuickbooksEmailStatus + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksEmailStatus + + """Less than the specified value.""" + lessThan: QuickbooksEmailStatus + + """Not included in the specified list.""" + notIn: [QuickbooksEmailStatus!] + + """Included in the specified list.""" + in: [QuickbooksEmailStatus!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksEmailStatus + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksEmailStatus + + """Not equal to the specified value.""" + notEqualTo: QuickbooksEmailStatus + + """Equal to the specified value.""" + equalTo: QuickbooksEmailStatus + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against DeliveryType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksDeliveryTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksDeliveryType + + """Greater than the specified value.""" + greaterThan: QuickbooksDeliveryType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksDeliveryType + + """Less than the specified value.""" + lessThan: QuickbooksDeliveryType + + """Not included in the specified list.""" + notIn: [QuickbooksDeliveryType!] + + """Included in the specified list.""" + in: [QuickbooksDeliveryType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksDeliveryType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksDeliveryType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksDeliveryType + + """Equal to the specified value.""" + equalTo: QuickbooksDeliveryType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Invoice` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksInvoiceFilter { + """Negates the expression.""" + not: QuickbooksInvoiceFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksInvoiceFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksInvoiceFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `freeFormAddress` field.""" + freeFormAddress: QuickbooksBooleanFilter + + """Filter by the object’s `billingEmail` field.""" + billingEmail: QuickbooksStringFilter + + """Filter by the object’s `applyTaxAfterDiscount` field.""" + applyTaxAfterDiscount: QuickbooksBooleanFilter + + """Filter by the object’s `billingAddressId` field.""" + billingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `shippingMethod` field.""" + shippingMethod: QuickbooksStringFilter + + """Filter by the object’s `departmentId` field.""" + departmentId: QuickbooksBigIntFilter + + """Filter by the object’s `homeTotalAmount` field.""" + homeTotalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `shippingAddressId` field.""" + shippingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `customFields` field.""" + customFields: QuickbooksJsonFilter + + """Filter by the object’s `allowOnlineCreditCardPayment` field.""" + allowOnlineCreditCardPayment: QuickbooksBooleanFilter + + """Filter by the object’s `transactionTotalTax` field.""" + transactionTotalTax: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionTaxCodeId` field.""" + transactionTaxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `balance` field.""" + balance: QuickbooksBigFloatFilter + + """Filter by the object’s `deposit` field.""" + deposit: QuickbooksBigFloatFilter + + """Filter by the object’s `exchangeRate` field.""" + exchangeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `emailStatus` field.""" + emailStatus: QuickbooksEmailStatusFilter + + """Filter by the object’s `customerMemo` field.""" + customerMemo: QuickbooksStringFilter + + """Filter by the object’s `billingEmailBcc` field.""" + billingEmailBcc: QuickbooksStringFilter + + """Filter by the object’s `billingEmailCc` field.""" + billingEmailCc: QuickbooksStringFilter + + """Filter by the object’s `depositToAccountId` field.""" + depositToAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `dueDate` field.""" + dueDate: QuickbooksDateFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `allowOnlineAchpayment` field.""" + allowOnlineAchpayment: QuickbooksBooleanFilter + + """Filter by the object’s `invoiceLink` field.""" + invoiceLink: QuickbooksStringFilter + + """Filter by the object’s `totalAmount` field.""" + totalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `globalTaxCalculation` field.""" + globalTaxCalculation: QuickbooksGlobalTaxCalculationFilter + + """Filter by the object’s `transactionSource` field.""" + transactionSource: QuickbooksStringFilter + + """Filter by the object’s `deliveryTime` field.""" + deliveryTime: QuickbooksDatetimeFilter + + """Filter by the object’s `deliveryType` field.""" + deliveryType: QuickbooksDeliveryTypeFilter + + """Filter by the object’s `salesTermId` field.""" + salesTermId: QuickbooksBigIntFilter + + """Filter by the object’s `printStatus` field.""" + printStatus: QuickbooksPrintStatusFilter + + """Filter by the object’s `classId` field.""" + classId: QuickbooksBigIntFilter + + """Filter by the object’s `trackingNumber` field.""" + trackingNumber: QuickbooksStringFilter + + """Filter by the object’s `shipDate` field.""" + shipDate: QuickbooksDateFilter + + """Filter by the object’s `homeBalance` field.""" + homeBalance: QuickbooksBigFloatFilter + + """Filter by the object’s `shipFromAddressId` field.""" + shipFromAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `docNumber` field.""" + docNumber: QuickbooksStringFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `customerId` field.""" + customerId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksInvoicesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + CUSTOMER_ID_ASC + CUSTOMER_ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + DOC_NUMBER_ASC + DOC_NUMBER_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + SHIP_FROM_ADDRESS_ID_ASC + SHIP_FROM_ADDRESS_ID_DESC + HOME_BALANCE_ASC + HOME_BALANCE_DESC + SHIP_DATE_ASC + SHIP_DATE_DESC + TRACKING_NUMBER_ASC + TRACKING_NUMBER_DESC + CLASS_ID_ASC + CLASS_ID_DESC + PRINT_STATUS_ASC + PRINT_STATUS_DESC + SALES_TERM_ID_ASC + SALES_TERM_ID_DESC + DELIVERY_TYPE_ASC + DELIVERY_TYPE_DESC + DELIVERY_TIME_ASC + DELIVERY_TIME_DESC + TRANSACTION_SOURCE_ASC + TRANSACTION_SOURCE_DESC + GLOBAL_TAX_CALCULATION_ASC + GLOBAL_TAX_CALCULATION_DESC + TOTAL_AMOUNT_ASC + TOTAL_AMOUNT_DESC + INVOICE_LINK_ASC + INVOICE_LINK_DESC + ALLOW_ONLINE_ACHPAYMENT_ASC + ALLOW_ONLINE_ACHPAYMENT_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + DUE_DATE_ASC + DUE_DATE_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + DEPOSIT_TO_ACCOUNT_ID_ASC + DEPOSIT_TO_ACCOUNT_ID_DESC + BILLING_EMAIL_CC_ASC + BILLING_EMAIL_CC_DESC + BILLING_EMAIL_BCC_ASC + BILLING_EMAIL_BCC_DESC + CUSTOMER_MEMO_ASC + CUSTOMER_MEMO_DESC + EMAIL_STATUS_ASC + EMAIL_STATUS_DESC + EXCHANGE_RATE_ASC + EXCHANGE_RATE_DESC + DEPOSIT_ASC + DEPOSIT_DESC + BALANCE_ASC + BALANCE_DESC + TRANSACTION_TAX_CODE_ID_ASC + TRANSACTION_TAX_CODE_ID_DESC + TRANSACTION_TOTAL_TAX_ASC + TRANSACTION_TOTAL_TAX_DESC + ALLOW_ONLINE_CREDIT_CARD_PAYMENT_ASC + ALLOW_ONLINE_CREDIT_CARD_PAYMENT_DESC + CUSTOM_FIELDS_ASC + CUSTOM_FIELDS_DESC + SHIPPING_ADDRESS_ID_ASC + SHIPPING_ADDRESS_ID_DESC + HOME_TOTAL_AMOUNT_ASC + HOME_TOTAL_AMOUNT_DESC + DEPARTMENT_ID_ASC + DEPARTMENT_ID_DESC + SHIPPING_METHOD_ASC + SHIPPING_METHOD_DESC + BILLING_ADDRESS_ID_ASC + BILLING_ADDRESS_ID_DESC + APPLY_TAX_AFTER_DISCOUNT_ASC + APPLY_TAX_AFTER_DISCOUNT_DESC + BILLING_EMAIL_ASC + BILLING_EMAIL_DESC + FREE_FORM_ADDRESS_ASC + FREE_FORM_ADDRESS_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +""" +A filter to be used against `Class` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksClassFilter { + """Negates the expression.""" + not: QuickbooksClassFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksClassFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksClassFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `active` field.""" + active: QuickbooksBooleanFilter + + """Filter by the object’s `subClass` field.""" + subClass: QuickbooksBooleanFilter + + """Filter by the object’s `fullyQualifiedName` field.""" + fullyQualifiedName: QuickbooksStringFilter + + """Filter by the object’s `parentId` field.""" + parentId: QuickbooksBigIntFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `name` field.""" + name: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksClassesOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + PARENT_ID_ASC + PARENT_ID_DESC + FULLY_QUALIFIED_NAME_ASC + FULLY_QUALIFIED_NAME_DESC + SUB_CLASS_ASC + SUB_CLASS_DESC + ACTIVE_ASC + ACTIVE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksClassesConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + parentId: Float +} + +"""""" +type QuickbooksClassesConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + parentId: Float +} + +"""""" +type QuickbooksClassesConnectionAggregates { + """""" + sum: QuickbooksClassesConnectionSums + + """""" + avg: QuickbooksClassesConnectionAverages +} + +"""A `Class` edge in the connection.""" +type QuickbooksClassesEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Class` at the end of the edge.""" + node: QuickbooksClass +} + +"""A connection to a list of `Class` values.""" +type QuickbooksClassesConnection { + """A list of `Class` objects.""" + nodes: [QuickbooksClass]! + + """ + A list of edges which contains the `Class` and cursor to aid in pagination. + """ + edges: [QuickbooksClassesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Class` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksClassesConnectionAggregates +} + +"""""" +type QuickbooksClass implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + name: String + + """""" + syncToken: String + + """""" + parentId: String + + """""" + fullyQualifiedName: String + + """""" + subClass: Boolean + + """""" + active: Boolean + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `Class` that is related to this `Class`.""" + parentClass: QuickbooksClass + + """Reads and enables pagination through a set of `Class`.""" + subClasses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksClassFilter + + """The method to use when ordering `Class`.""" + orderBy: [QuickbooksClassesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksClassesConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + invoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + estimates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection! + + """Reads and enables pagination through a set of `RefundReceipt`.""" + refundReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptFilter + + """The method to use when ordering `RefundReceipt`.""" + orderBy: [QuickbooksRefundReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptsConnection! + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection! + + """Reads and enables pagination through a set of `TimeActivity`.""" + timeActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTimeActivityFilter + + """The method to use when ordering `TimeActivity`.""" + orderBy: [QuickbooksTimeActivitiesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTimeActivitiesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksTimeActivityNameOf { + VENDOR + EMPLOYEE +} + +"""""" +type QuickbooksTimeActivity implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + nameOf: QuickbooksTimeActivityNameOf + + """""" + syncToken: String + + """""" + employeeId: String + + """""" + vendorId: String + + """""" + hours: Int + + """""" + minutes: Int + + """""" + startTime: String + + """""" + hourlyRate: String + + """""" + breakHours: Int + + """""" + breakMinutes: Int + + """""" + endTime: String + + """""" + customerId: String + + """""" + transactionDate: String + + """""" + description: String + + """""" + itemId: String + + """""" + classId: String + + """""" + departmentId: String + + """""" + billableStatus: String + + """""" + taxable: Boolean + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `Employee` that is related to this `TimeActivity`.""" + employee: QuickbooksEmployee + + """Reads a single `Vendor` that is related to this `TimeActivity`.""" + vendor: QuickbooksVendor + + """Reads a single `Customer` that is related to this `TimeActivity`.""" + customer: QuickbooksCustomer + + """Reads a single `Item` that is related to this `TimeActivity`.""" + item: QuickbooksItem + + """Reads a single `Class` that is related to this `TimeActivity`.""" + class: QuickbooksClass + + """Reads a single `Department` that is related to this `TimeActivity`.""" + department: QuickbooksDepartment + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `TimeActivity` values.""" +type QuickbooksTimeActivitiesConnection { + """A list of `TimeActivity` objects.""" + nodes: [QuickbooksTimeActivity]! + + """ + A list of edges which contains the `TimeActivity` and cursor to aid in pagination. + """ + edges: [QuickbooksTimeActivitiesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `TimeActivity` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksTimeActivitiesConnectionAggregates +} + +"""""" +type QuickbooksEmployee implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + syncToken: String + + """""" + primaryAddressId: String + + """""" + primaryEmailAddress: String + + """""" + displayName: String + + """""" + title: String + + """""" + billableTime: Boolean + + """""" + givenName: String + + """""" + birthDate: String + + """""" + middleName: String + + """""" + ssn: String + + """""" + primaryPhoneNumber: String + + """""" + active: Boolean + + """""" + releasedDate: String + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """""" + mobileNumber: String + + """""" + gender: String + + """""" + hiredDate: String + + """""" + billRate: String + + """""" + organization: Boolean + + """""" + suffix: String + + """""" + familyName: String + + """""" + printOnCheckName: String + + """""" + employeeNumber: String + + """""" + v4IdPseudonym: String + + """Reads a single `PhysicalAddress` that is related to this `Employee`.""" + primaryAddress: QuickbooksPhysicalAddress + + """Reads and enables pagination through a set of `TimeActivity`.""" + timeActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTimeActivityFilter + + """The method to use when ordering `TimeActivity`.""" + orderBy: [QuickbooksTimeActivitiesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTimeActivitiesConnection! + + """Reads and enables pagination through a set of `Purchase`.""" + purchases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseFilter + + """The method to use when ordering `Purchase`.""" + orderBy: [QuickbooksPurchasesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchasesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Employee` values.""" +type QuickbooksEmployeesConnection { + """A list of `Employee` objects.""" + nodes: [QuickbooksEmployee]! + + """ + A list of edges which contains the `Employee` and cursor to aid in pagination. + """ + edges: [QuickbooksEmployeesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Employee` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksEmployeesConnectionAggregates +} + +"""""" +type QuickbooksPhysicalAddress implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + postalCode: String + + """""" + city: String + + """""" + country: String + + """""" + line1: String + + """""" + line2: String + + """""" + line3: String + + """""" + line4: String + + """""" + line5: String + + """""" + latitude: String + + """""" + longitude: String + + """""" + countrySubDivisionCode: String + + """Reads and enables pagination through a set of `Employee`.""" + employees( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEmployeeFilter + + """The method to use when ordering `Employee`.""" + orderBy: [QuickbooksEmployeesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEmployeesConnection! + + """Reads and enables pagination through a set of `Vendor`.""" + vendorsByBillingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksVendorFilter + + """The method to use when ordering `Vendor`.""" + orderBy: [QuickbooksVendorsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksVendorsConnection! + + """Reads and enables pagination through a set of `Customer`.""" + customersByShippingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCustomerFilter + + """The method to use when ordering `Customer`.""" + orderBy: [QuickbooksCustomersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCustomersConnection! + + """Reads and enables pagination through a set of `Customer`.""" + customersByBillingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCustomerFilter + + """The method to use when ordering `Customer`.""" + orderBy: [QuickbooksCustomersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCustomersConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + invoicesByShipFromAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + invoicesByShippingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + invoicesByBillingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + estimatesByShipFromAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + estimatesByShippingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + estimatesByBillingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemosByShippingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection! + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemosByBillingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection! + + """Reads and enables pagination through a set of `RefundReceipt`.""" + refundReceiptsByShippingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptFilter + + """The method to use when ordering `RefundReceipt`.""" + orderBy: [QuickbooksRefundReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptsConnection! + + """Reads and enables pagination through a set of `RefundReceipt`.""" + refundReceiptsByBillingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptFilter + + """The method to use when ordering `RefundReceipt`.""" + orderBy: [QuickbooksRefundReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptsConnection! + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceiptsByShipFromAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection! + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceiptsByShippingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection! + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceiptsByBillingAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection! + + """Reads and enables pagination through a set of `Purchase`.""" + purchasesByRemitToAddress( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseFilter + + """The method to use when ordering `Purchase`.""" + orderBy: [QuickbooksPurchasesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchasesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksEmailStatus { + NOT_SET + NEED_TO_SEND + EMAIL_SENT +} + +enum QuickbooksDeliveryType { + EMAIL +} + +"""""" +type QuickbooksInvoice implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + customerId: String + + """""" + syncToken: String + + """""" + currencyCode: String + + """""" + docNumber: String + + """""" + transactionDate: String + + """""" + shipFromAddressId: String + + """""" + homeBalance: String + + """""" + shipDate: String + + """""" + trackingNumber: String + + """""" + classId: String + + """""" + printStatus: QuickbooksPrintStatus + + """""" + salesTermId: String + + """""" + deliveryType: QuickbooksDeliveryType + + """""" + deliveryTime: String + + """""" + transactionSource: String + + """""" + globalTaxCalculation: QuickbooksGlobalTaxCalculation + + """""" + totalAmount: String + + """""" + invoiceLink: String + + """""" + allowOnlineAchpayment: Boolean + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + dueDate: String + + """""" + privateNote: String + + """""" + depositToAccountId: String + + """""" + billingEmailCc: String + + """""" + billingEmailBcc: String + + """""" + customerMemo: String + + """""" + emailStatus: QuickbooksEmailStatus + + """""" + exchangeRate: String + + """""" + deposit: String + + """""" + balance: String + + """""" + transactionTaxCodeId: String + + """""" + transactionTotalTax: String + + """""" + allowOnlineCreditCardPayment: Boolean + + """""" + customFields: String + + """""" + shippingAddressId: String + + """""" + homeTotalAmount: String + + """""" + departmentId: String + + """""" + shippingMethod: String + + """""" + billingAddressId: String + + """""" + applyTaxAfterDiscount: Boolean + + """""" + billingEmail: String + + """""" + freeFormAddress: Boolean + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `Customer` that is related to this `Invoice`.""" + customer: QuickbooksCustomer + + """Reads a single `PhysicalAddress` that is related to this `Invoice`.""" + shipFromAddress: QuickbooksPhysicalAddress + + """Reads a single `Class` that is related to this `Invoice`.""" + class: QuickbooksClass + + """Reads a single `Term` that is related to this `Invoice`.""" + salesTerm: QuickbooksTerm + + """Reads a single `Account` that is related to this `Invoice`.""" + depositToAccount: QuickbooksAccount + + """Reads a single `TaxCode` that is related to this `Invoice`.""" + transactionTaxCode: QuickbooksTaxCode + + """Reads a single `PhysicalAddress` that is related to this `Invoice`.""" + shippingAddress: QuickbooksPhysicalAddress + + """Reads a single `Department` that is related to this `Invoice`.""" + department: QuickbooksDepartment + + """Reads a single `PhysicalAddress` that is related to this `Invoice`.""" + billingAddress: QuickbooksPhysicalAddress + + """Reads a single `Currency` that is related to this `Invoice`.""" + currency: QuickbooksCurrency + + """Reads and enables pagination through a set of `InvoiceLineItem`.""" + lineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceLineItemFilter + + """The method to use when ordering `InvoiceLineItem`.""" + orderBy: [QuickbooksInvoiceLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoiceLineItemsConnection! + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection! + + """ + Reads and enables pagination through a set of `TransactionTaxDetailLine`. + """ + transactionTaxDetailLines( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransactionTaxDetailLineFilter + + """The method to use when ordering `TransactionTaxDetailLine`.""" + orderBy: [QuickbooksTransactionTaxDetailLinesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransactionTaxDetailLinesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + estimates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Invoice` values.""" +type QuickbooksInvoicesConnection { + """A list of `Invoice` objects.""" + nodes: [QuickbooksInvoice]! + + """ + A list of edges which contains the `Invoice` and cursor to aid in pagination. + """ + edges: [QuickbooksInvoicesEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Invoice` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksInvoicesConnectionAggregates +} + +""" +A filter to be used against PrintStatus fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksPrintStatusFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksPrintStatus + + """Greater than the specified value.""" + greaterThan: QuickbooksPrintStatus + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksPrintStatus + + """Less than the specified value.""" + lessThan: QuickbooksPrintStatus + + """Not included in the specified list.""" + notIn: [QuickbooksPrintStatus!] + + """Included in the specified list.""" + in: [QuickbooksPrintStatus!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksPrintStatus + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksPrintStatus + + """Not equal to the specified value.""" + notEqualTo: QuickbooksPrintStatus + + """Equal to the specified value.""" + equalTo: QuickbooksPrintStatus + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against BillPaymentPayType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksBillPaymentPayTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksBillPaymentPayType + + """Greater than the specified value.""" + greaterThan: QuickbooksBillPaymentPayType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksBillPaymentPayType + + """Less than the specified value.""" + lessThan: QuickbooksBillPaymentPayType + + """Not included in the specified list.""" + notIn: [QuickbooksBillPaymentPayType!] + + """Included in the specified list.""" + in: [QuickbooksBillPaymentPayType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksBillPaymentPayType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksBillPaymentPayType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksBillPaymentPayType + + """Equal to the specified value.""" + equalTo: QuickbooksBillPaymentPayType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `BillPayment` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksBillPaymentFilter { + """Negates the expression.""" + not: QuickbooksBillPaymentFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksBillPaymentFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksBillPaymentFilter!] + + """Filter by the object’s `creditCardPaymentAccountId` field.""" + creditCardPaymentAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `checkPaymentPrintStatus` field.""" + checkPaymentPrintStatus: QuickbooksPrintStatusFilter + + """Filter by the object’s `checkPaymentAccountId` field.""" + checkPaymentAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `processBillPayment` field.""" + processBillPayment: QuickbooksBooleanFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `departmentId` field.""" + departmentId: QuickbooksBigIntFilter + + """Filter by the object’s `accountId` field.""" + accountId: QuickbooksBigIntFilter + + """Filter by the object’s `exchangeRate` field.""" + exchangeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `docNumber` field.""" + docNumber: QuickbooksStringFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `payType` field.""" + payType: QuickbooksBillPaymentPayTypeFilter + + """Filter by the object’s `totalAmount` field.""" + totalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `vendorId` field.""" + vendorId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksBillPaymentsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + VENDOR_ID_ASC + VENDOR_ID_DESC + TOTAL_AMOUNT_ASC + TOTAL_AMOUNT_DESC + PAY_TYPE_ASC + PAY_TYPE_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + DOC_NUMBER_ASC + DOC_NUMBER_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + EXCHANGE_RATE_ASC + EXCHANGE_RATE_DESC + ACCOUNT_ID_ASC + ACCOUNT_ID_DESC + DEPARTMENT_ID_ASC + DEPARTMENT_ID_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + PROCESS_BILL_PAYMENT_ASC + PROCESS_BILL_PAYMENT_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + CHECK_PAYMENT_ACCOUNT_ID_ASC + CHECK_PAYMENT_ACCOUNT_ID_DESC + CHECK_PAYMENT_PRINT_STATUS_ASC + CHECK_PAYMENT_PRINT_STATUS_DESC + CREDIT_CARD_PAYMENT_ACCOUNT_ID_ASC + CREDIT_CARD_PAYMENT_ACCOUNT_ID_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""ISO 4127 currency codes supported by QuickBooks""" +type QuickbooksCurrency implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """3-digit ISO 4127 currency code""" + code: String! + + """Currency name""" + name: String + + """Reads and enables pagination through a set of `Account`.""" + accounts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksAccountFilter + + """The method to use when ordering `Account`.""" + orderBy: [QuickbooksAccountsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksAccountsConnection! + + """Reads and enables pagination through a set of `Vendor`.""" + vendors( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksVendorFilter + + """The method to use when ordering `Vendor`.""" + orderBy: [QuickbooksVendorsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksVendorsConnection! + + """Reads and enables pagination through a set of `Customer`.""" + customers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCustomerFilter + + """The method to use when ordering `Customer`.""" + orderBy: [QuickbooksCustomersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCustomersConnection! + + """Reads and enables pagination through a set of `Bill`.""" + bills( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillFilter + + """The method to use when ordering `Bill`.""" + orderBy: [QuickbooksBillsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillsConnection! + + """Reads and enables pagination through a set of `BillPayment`.""" + billPayments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillPaymentFilter + + """The method to use when ordering `BillPayment`.""" + orderBy: [QuickbooksBillPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillPaymentsConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + invoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + estimates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection! + + """Reads and enables pagination through a set of `Payment`.""" + payments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentFilter + + """The method to use when ordering `Payment`.""" + orderBy: [QuickbooksPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentsConnection! + + """Reads and enables pagination through a set of `RefundReceipt`.""" + refundReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptFilter + + """The method to use when ordering `RefundReceipt`.""" + orderBy: [QuickbooksRefundReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptsConnection! + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection! + + """Reads and enables pagination through a set of `JournalEntry`.""" + journalEntries( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksJournalEntryFilter + + """The method to use when ordering `JournalEntry`.""" + orderBy: [QuickbooksJournalEntriesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksJournalEntriesConnection! + + """Reads and enables pagination through a set of `Deposit`.""" + deposits( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepositFilter + + """The method to use when ordering `Deposit`.""" + orderBy: [QuickbooksDepositsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepositsConnection! + + """Reads and enables pagination through a set of `Purchase`.""" + purchases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseFilter + + """The method to use when ordering `Purchase`.""" + orderBy: [QuickbooksPurchasesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchasesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksPrintStatus { + NOT_SET + NEED_TO_PRINT + PRINT_COMPLETE +} + +enum QuickbooksBillPaymentPayType { + CHECK + CREDIT_CARD +} + +"""""" +type QuickbooksBillPayment implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + vendorId: String + + """""" + totalAmount: String + + """""" + payType: QuickbooksBillPaymentPayType + + """""" + syncToken: String + + """""" + currencyCode: String + + """""" + docNumber: String + + """""" + privateNote: String + + """""" + transactionDate: String + + """""" + exchangeRate: String + + """""" + accountId: String + + """""" + departmentId: String + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + processBillPayment: Boolean + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """""" + checkPaymentAccountId: String + + """""" + checkPaymentPrintStatus: QuickbooksPrintStatus + + """""" + creditCardPaymentAccountId: String + + """Reads a single `Vendor` that is related to this `BillPayment`.""" + vendor: QuickbooksVendor + + """Reads a single `Account` that is related to this `BillPayment`.""" + account: QuickbooksAccount + + """Reads a single `Department` that is related to this `BillPayment`.""" + department: QuickbooksDepartment + + """Reads a single `Account` that is related to this `BillPayment`.""" + checkPaymentAccount: QuickbooksAccount + + """Reads a single `Account` that is related to this `BillPayment`.""" + creditCardPaymentAccount: QuickbooksAccount + + """Reads a single `Currency` that is related to this `BillPayment`.""" + currency: QuickbooksCurrency + + """Reads and enables pagination through a set of `BillPaymentLineItem`.""" + lineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillPaymentLineItemFilter + + """The method to use when ordering `BillPaymentLineItem`.""" + orderBy: [QuickbooksBillPaymentLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillPaymentLineItemsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `BillPayment` values.""" +type QuickbooksBillPaymentsConnection { + """A list of `BillPayment` objects.""" + nodes: [QuickbooksBillPayment]! + + """ + A list of edges which contains the `BillPayment` and cursor to aid in pagination. + """ + edges: [QuickbooksBillPaymentsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `BillPayment` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksBillPaymentsConnectionAggregates +} + +""" +A filter to be used against GlobalTaxCalculation fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksGlobalTaxCalculationFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksGlobalTaxCalculation + + """Greater than the specified value.""" + greaterThan: QuickbooksGlobalTaxCalculation + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksGlobalTaxCalculation + + """Less than the specified value.""" + lessThan: QuickbooksGlobalTaxCalculation + + """Not included in the specified list.""" + notIn: [QuickbooksGlobalTaxCalculation!] + + """Included in the specified list.""" + in: [QuickbooksGlobalTaxCalculation!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksGlobalTaxCalculation + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksGlobalTaxCalculation + + """Not equal to the specified value.""" + notEqualTo: QuickbooksGlobalTaxCalculation + + """Equal to the specified value.""" + equalTo: QuickbooksGlobalTaxCalculation + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Bill` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksBillFilter { + """Negates the expression.""" + not: QuickbooksBillFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksBillFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksBillFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `dueDate` field.""" + dueDate: QuickbooksDateFilter + + """Filter by the object’s `balance` field.""" + balance: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `salesTermId` field.""" + salesTermId: QuickbooksBigIntFilter + + """Filter by the object’s `exchangeRate` field.""" + exchangeRate: QuickbooksBigFloatFilter + + """Filter by the object’s `transactionDate` field.""" + transactionDate: QuickbooksDateFilter + + """Filter by the object’s `departmentId` field.""" + departmentId: QuickbooksBigIntFilter + + """Filter by the object’s `accountId` field.""" + accountId: QuickbooksBigIntFilter + + """Filter by the object’s `globalTaxCalculation` field.""" + globalTaxCalculation: QuickbooksGlobalTaxCalculationFilter + + """Filter by the object’s `homeBalance` field.""" + homeBalance: QuickbooksBigFloatFilter + + """Filter by the object’s `totalAmount` field.""" + totalAmount: QuickbooksBigFloatFilter + + """Filter by the object’s `privateNote` field.""" + privateNote: QuickbooksStringFilter + + """Filter by the object’s `docNumber` field.""" + docNumber: QuickbooksStringFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `vendorId` field.""" + vendorId: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksBillsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + VENDOR_ID_ASC + VENDOR_ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + DOC_NUMBER_ASC + DOC_NUMBER_DESC + PRIVATE_NOTE_ASC + PRIVATE_NOTE_DESC + TOTAL_AMOUNT_ASC + TOTAL_AMOUNT_DESC + HOME_BALANCE_ASC + HOME_BALANCE_DESC + GLOBAL_TAX_CALCULATION_ASC + GLOBAL_TAX_CALCULATION_DESC + ACCOUNT_ID_ASC + ACCOUNT_ID_DESC + DEPARTMENT_ID_ASC + DEPARTMENT_ID_DESC + TRANSACTION_DATE_ASC + TRANSACTION_DATE_DESC + EXCHANGE_RATE_ASC + EXCHANGE_RATE_DESC + SALES_TERM_ID_ASC + SALES_TERM_ID_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + BALANCE_ASC + BALANCE_DESC + DUE_DATE_ASC + DUE_DATE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +""" +A filter to be used against `Department` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksDepartmentFilter { + """Negates the expression.""" + not: QuickbooksDepartmentFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksDepartmentFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksDepartmentFilter!] + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `active` field.""" + active: QuickbooksBooleanFilter + + """Filter by the object’s `subDepartment` field.""" + subDepartment: QuickbooksBooleanFilter + + """Filter by the object’s `fullyQualifiedName` field.""" + fullyQualifiedName: QuickbooksStringFilter + + """Filter by the object’s `parentId` field.""" + parentId: QuickbooksBigIntFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksDepartmentsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + PARENT_ID_ASC + PARENT_ID_DESC + FULLY_QUALIFIED_NAME_ASC + FULLY_QUALIFIED_NAME_DESC + SUB_DEPARTMENT_ASC + SUB_DEPARTMENT_DESC + ACTIVE_ASC + ACTIVE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksDepartmentsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + parentId: Float +} + +"""""" +type QuickbooksDepartmentsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + parentId: Float +} + +"""""" +type QuickbooksDepartmentsConnectionAggregates { + """""" + sum: QuickbooksDepartmentsConnectionSums + + """""" + avg: QuickbooksDepartmentsConnectionAverages +} + +"""A `Department` edge in the connection.""" +type QuickbooksDepartmentsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Department` at the end of the edge.""" + node: QuickbooksDepartment +} + +"""A connection to a list of `Department` values.""" +type QuickbooksDepartmentsConnection { + """A list of `Department` objects.""" + nodes: [QuickbooksDepartment]! + + """ + A list of edges which contains the `Department` and cursor to aid in pagination. + """ + edges: [QuickbooksDepartmentsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Department` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksDepartmentsConnectionAggregates +} + +"""""" +type QuickbooksDepartment implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + syncToken: String + + """""" + parentId: String + + """""" + fullyQualifiedName: String + + """""" + subDepartment: Boolean + + """""" + active: Boolean + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `Department` that is related to this `Department`.""" + parent: QuickbooksDepartment + + """Reads and enables pagination through a set of `Department`.""" + subDepartments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepartmentFilter + + """The method to use when ordering `Department`.""" + orderBy: [QuickbooksDepartmentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepartmentsConnection! + + """Reads and enables pagination through a set of `Bill`.""" + bills( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillFilter + + """The method to use when ordering `Bill`.""" + orderBy: [QuickbooksBillsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillsConnection! + + """Reads and enables pagination through a set of `BillPayment`.""" + billPayments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillPaymentFilter + + """The method to use when ordering `BillPayment`.""" + orderBy: [QuickbooksBillPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillPaymentsConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + invoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + estimates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection! + + """Reads and enables pagination through a set of `RefundReceipt`.""" + refundReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptFilter + + """The method to use when ordering `RefundReceipt`.""" + orderBy: [QuickbooksRefundReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptsConnection! + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection! + + """Reads and enables pagination through a set of `Deposit`.""" + deposits( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepositFilter + + """The method to use when ordering `Deposit`.""" + orderBy: [QuickbooksDepositsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepositsConnection! + + """Reads and enables pagination through a set of `TimeActivity`.""" + timeActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTimeActivityFilter + + """The method to use when ordering `TimeActivity`.""" + orderBy: [QuickbooksTimeActivitiesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTimeActivitiesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksGlobalTaxCalculation { + TAX_EXCLUDED + TAX_INCLUSIVE + NOT_APPLICABLE +} + +"""""" +type QuickbooksBill implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + vendorId: String + + """""" + syncToken: String + + """""" + currencyCode: String + + """""" + docNumber: String + + """""" + privateNote: String + + """""" + totalAmount: String + + """""" + homeBalance: String + + """""" + globalTaxCalculation: QuickbooksGlobalTaxCalculation + + """""" + accountId: String + + """""" + departmentId: String + + """""" + transactionDate: String + + """""" + exchangeRate: String + + """""" + salesTermId: String + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """""" + balance: String + + """""" + dueDate: String + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """Reads a single `Vendor` that is related to this `Bill`.""" + vendor: QuickbooksVendor + + """Reads a single `Account` that is related to this `Bill`.""" + account: QuickbooksAccount + + """Reads a single `Department` that is related to this `Bill`.""" + department: QuickbooksDepartment + + """Reads a single `Term` that is related to this `Bill`.""" + salesTerm: QuickbooksTerm + + """Reads a single `Currency` that is related to this `Bill`.""" + currency: QuickbooksCurrency + + """Reads and enables pagination through a set of `BillLineItem`.""" + lineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillLineItemFilter + + """The method to use when ordering `BillLineItem`.""" + orderBy: [QuickbooksBillLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillLineItemsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Bill` values.""" +type QuickbooksBillsConnection { + """A list of `Bill` objects.""" + nodes: [QuickbooksBill]! + + """ + A list of edges which contains the `Bill` and cursor to aid in pagination. + """ + edges: [QuickbooksBillsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Bill` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksBillsConnectionAggregates +} + +""" +A filter to be used against TaxReportingBasis fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTaxReportingBasisFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksTaxReportingBasis + + """Greater than the specified value.""" + greaterThan: QuickbooksTaxReportingBasis + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksTaxReportingBasis + + """Less than the specified value.""" + lessThan: QuickbooksTaxReportingBasis + + """Not included in the specified list.""" + notIn: [QuickbooksTaxReportingBasis!] + + """Included in the specified list.""" + in: [QuickbooksTaxReportingBasis!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksTaxReportingBasis + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksTaxReportingBasis + + """Not equal to the specified value.""" + notEqualTo: QuickbooksTaxReportingBasis + + """Equal to the specified value.""" + equalTo: QuickbooksTaxReportingBasis + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Vendor` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksVendorFilter { + """Negates the expression.""" + not: QuickbooksVendorFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksVendorFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksVendorFilter!] + + """Filter by the object’s `billingAddressId` field.""" + billingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `printOnCheckName` field.""" + printOnCheckName: QuickbooksStringFilter + + """Filter by the object’s `gstRegistrationType` field.""" + gstRegistrationType: QuickbooksGstRegistrationTypeFilter + + """Filter by the object’s `accountNumber` field.""" + accountNumber: QuickbooksStringFilter + + """Filter by the object’s `taxIdentifier` field.""" + taxIdentifier: QuickbooksStringFilter + + """Filter by the object’s `companyName` field.""" + companyName: QuickbooksStringFilter + + """Filter by the object’s `balance` field.""" + balance: QuickbooksBigFloatFilter + + """Filter by the object’s `webAddress` field.""" + webAddress: QuickbooksStringFilter + + """Filter by the object’s `vendor1099` field.""" + vendor1099: QuickbooksBooleanFilter + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `active` field.""" + active: QuickbooksBooleanFilter + + """Filter by the object’s `alternatePhoneNumber` field.""" + alternatePhoneNumber: QuickbooksStringFilter + + """Filter by the object’s `primaryPhoneNumber` field.""" + primaryPhoneNumber: QuickbooksStringFilter + + """Filter by the object’s `mobileNumber` field.""" + mobileNumber: QuickbooksStringFilter + + """Filter by the object’s `taxReportingBasis` field.""" + taxReportingBasis: QuickbooksTaxReportingBasisFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `businessNumber` field.""" + businessNumber: QuickbooksStringFilter + + """Filter by the object’s `faxNumber` field.""" + faxNumber: QuickbooksStringFilter + + """Filter by the object’s `gstin` field.""" + gstin: QuickbooksStringFilter + + """Filter by the object’s `termId` field.""" + termId: QuickbooksBigIntFilter + + """Filter by the object’s `accountId` field.""" + accountId: QuickbooksBigIntFilter + + """Filter by the object’s `telephoneNumber` field.""" + telephoneNumber: QuickbooksStringFilter + + """Filter by the object’s `displayName` field.""" + displayName: QuickbooksStringFilter + + """Filter by the object’s `primaryEmailAddress` field.""" + primaryEmailAddress: QuickbooksStringFilter + + """Filter by the object’s `familyName` field.""" + familyName: QuickbooksStringFilter + + """Filter by the object’s `suffix` field.""" + suffix: QuickbooksStringFilter + + """Filter by the object’s `middleName` field.""" + middleName: QuickbooksStringFilter + + """Filter by the object’s `givenName` field.""" + givenName: QuickbooksStringFilter + + """Filter by the object’s `title` field.""" + title: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksVendorsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + TITLE_ASC + TITLE_DESC + GIVEN_NAME_ASC + GIVEN_NAME_DESC + MIDDLE_NAME_ASC + MIDDLE_NAME_DESC + SUFFIX_ASC + SUFFIX_DESC + FAMILY_NAME_ASC + FAMILY_NAME_DESC + PRIMARY_EMAIL_ADDRESS_ASC + PRIMARY_EMAIL_ADDRESS_DESC + DISPLAY_NAME_ASC + DISPLAY_NAME_DESC + TELEPHONE_NUMBER_ASC + TELEPHONE_NUMBER_DESC + ACCOUNT_ID_ASC + ACCOUNT_ID_DESC + TERM_ID_ASC + TERM_ID_DESC + GSTIN_ASC + GSTIN_DESC + FAX_NUMBER_ASC + FAX_NUMBER_DESC + BUSINESS_NUMBER_ASC + BUSINESS_NUMBER_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + TAX_REPORTING_BASIS_ASC + TAX_REPORTING_BASIS_DESC + MOBILE_NUMBER_ASC + MOBILE_NUMBER_DESC + PRIMARY_PHONE_NUMBER_ASC + PRIMARY_PHONE_NUMBER_DESC + ALTERNATE_PHONE_NUMBER_ASC + ALTERNATE_PHONE_NUMBER_DESC + ACTIVE_ASC + ACTIVE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + VENDOR1099_ASC + VENDOR1099_DESC + WEB_ADDRESS_ASC + WEB_ADDRESS_DESC + BALANCE_ASC + BALANCE_DESC + COMPANY_NAME_ASC + COMPANY_NAME_DESC + TAX_IDENTIFIER_ASC + TAX_IDENTIFIER_DESC + ACCOUNT_NUMBER_ASC + ACCOUNT_NUMBER_DESC + GST_REGISTRATION_TYPE_ASC + GST_REGISTRATION_TYPE_DESC + PRINT_ON_CHECK_NAME_ASC + PRINT_ON_CHECK_NAME_DESC + BILLING_ADDRESS_ID_ASC + BILLING_ADDRESS_ID_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksVendorsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + accountId: Float + + """""" + termId: Float + + """""" + balance: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksVendorsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + accountId: Float + + """""" + termId: Float + + """""" + balance: Float + + """""" + billingAddressId: Float +} + +"""""" +type QuickbooksVendorsConnectionAggregates { + """""" + sum: QuickbooksVendorsConnectionSums + + """""" + avg: QuickbooksVendorsConnectionAverages +} + +"""A `Vendor` edge in the connection.""" +type QuickbooksVendorsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Vendor` at the end of the edge.""" + node: QuickbooksVendor +} + +"""A connection to a list of `Vendor` values.""" +type QuickbooksVendorsConnection { + """A list of `Vendor` objects.""" + nodes: [QuickbooksVendor]! + + """ + A list of edges which contains the `Vendor` and cursor to aid in pagination. + """ + edges: [QuickbooksVendorsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Vendor` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksVendorsConnectionAggregates +} + +enum QuickbooksTermType { + STANDARD + DATE_DRIVEN +} + +"""""" +type QuickbooksTerm implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + name: String + + """""" + syncToken: String + + """""" + discountPercent: String + + """""" + discountDays: Int + + """""" + active: Boolean + + """""" + type: QuickbooksTermType + + """""" + createTime: String + + """""" + lastUpdatedTime: String + + """""" + discountDayOfMonth: Int + + """""" + dueDays: Int + + """Reads and enables pagination through a set of `Vendor`.""" + vendors( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksVendorFilter + + """The method to use when ordering `Vendor`.""" + orderBy: [QuickbooksVendorsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksVendorsConnection! + + """Reads and enables pagination through a set of `Customer`.""" + customers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCustomerFilter + + """The method to use when ordering `Customer`.""" + orderBy: [QuickbooksCustomersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCustomersConnection! + + """Reads and enables pagination through a set of `Bill`.""" + bills( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillFilter + + """The method to use when ordering `Bill`.""" + orderBy: [QuickbooksBillsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillsConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + invoicesBySalesTerm( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + estimates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksTaxReportingBasis { + CASH + ACCRUAL +} + +"""""" +type QuickbooksVendor implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + syncToken: String + + """""" + title: String + + """""" + givenName: String + + """""" + middleName: String + + """""" + suffix: String + + """""" + familyName: String + + """""" + primaryEmailAddress: String + + """""" + displayName: String + + """""" + telephoneNumber: String + + """""" + accountId: String + + """""" + termId: String + + """""" + gstin: String + + """""" + faxNumber: String + + """""" + businessNumber: String + + """""" + currencyCode: String + + """""" + taxReportingBasis: QuickbooksTaxReportingBasis + + """""" + mobileNumber: String + + """""" + primaryPhoneNumber: String + + """""" + alternatePhoneNumber: String + + """""" + active: Boolean + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """""" + vendor1099: Boolean + + """""" + webAddress: String + + """""" + balance: String + + """""" + companyName: String + + """""" + taxIdentifier: String + + """""" + accountNumber: String + + """""" + gstRegistrationType: QuickbooksGstRegistrationType + + """""" + printOnCheckName: String + + """""" + billingAddressId: String + + """Reads a single `Account` that is related to this `Vendor`.""" + account: QuickbooksAccount + + """Reads a single `Term` that is related to this `Vendor`.""" + term: QuickbooksTerm + + """Reads a single `PhysicalAddress` that is related to this `Vendor`.""" + billingAddress: QuickbooksPhysicalAddress + + """Reads a single `Currency` that is related to this `Vendor`.""" + currency: QuickbooksCurrency + + """Reads and enables pagination through a set of `Item`.""" + items( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksItemFilter + + """The method to use when ordering `Item`.""" + orderBy: [QuickbooksItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksItemsConnection! + + """Reads and enables pagination through a set of `Bill`.""" + bills( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillFilter + + """The method to use when ordering `Bill`.""" + orderBy: [QuickbooksBillsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillsConnection! + + """Reads and enables pagination through a set of `BillPayment`.""" + billPayments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillPaymentFilter + + """The method to use when ordering `BillPayment`.""" + orderBy: [QuickbooksBillPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillPaymentsConnection! + + """Reads and enables pagination through a set of `DepositLineItem`.""" + depositLineItemsByRealmIdAndVendorId( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepositLineItemFilter + + """The method to use when ordering `DepositLineItem`.""" + orderBy: [QuickbooksDepositLineItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepositLineItemsConnection! + + """Reads and enables pagination through a set of `TimeActivity`.""" + timeActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTimeActivityFilter + + """The method to use when ordering `TimeActivity`.""" + orderBy: [QuickbooksTimeActivitiesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTimeActivitiesConnection! + + """Reads and enables pagination through a set of `Purchase`.""" + purchases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseFilter + + """The method to use when ordering `Purchase`.""" + orderBy: [QuickbooksPurchasesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchasesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksItemServiceType { + ADVT + AIRPORTSERVICES + AIRTRANSPORT + AIRTRVLAGNT + ARCHITECT + ASSTMGMT + ATMMAINTENANCE + AUCTIONSERV + AUTHSERST + BANKANDFIN + BEAUTYPARLOR + BROADCAST + BUSINESSAUX + BUSINESSEXHIBITION + BUSINESSSUPPORTSERV + CA + CABLEOPTR + CARGOHAND + CLEANINGSERV + CLEARANDFORW + CLUBSANDASSSERVICE + COMMCOACHORTRAINING + CONSENG + CONSTRCOMMERCIALCOMPLEX + CONTAINERRAILTRANS + CONVSERV + COSTACC + COURIER + CREDITCARD + CREDITRATAGNCY + CRUISESHIPTOUR + CS + CUSHOUSEAG + DESIGNSERV + DEVELOPSUPPLYCONTENT + DREDGING + DRYCLEANING + ERECTIONCOMMORINSTALL + EVENTMGMT + FASHIONDES + FOREXBROKING + FORWARDCONTRACT + FRANCHISESERV + GENERALINSURANCE + GOODSTRANSPORT + HEALTHCLUBANDFITNESS + INFORMATIONSERV + INSURAUX + INTDEC + INTELLECTUALPROPERTY + INTERNATIONALAIRTRAVEL + INTERNETCAFE + INTERNETTELEPHONY + LIFEINS + MAILLISTCOMPILE + MANDAPKEEPER + MANPWRRECRUIT + MGMTCONSUL + MGMTMAINTREPAIR + MININGOIL + MKTRESAGNCY + ONLINEINFORMRETRIEVAL + OPINIONPOLL + OUTDOORCATERING + PACKAGINGSERV + PANDALSHAMIANA + PHOTOGRAPHY + PORT + PORTSER + PROCESSCLEARHOUSE + PUBLICRELATIONMGMT + RAILTRAVELAGNT + REALESTAGT + RECOVERYAGENTS + REGISTRARSERV + RENTACAB + RENTINGIMMOVABLEPROP + RESIDENTIALCOMPLEXCONST + SALEOFSPACEFORADVT + SCANDTECHCONSUL + SECAG + SERVICESPROVIDEDFORTRANSACTION + SHARETRANSFERSERV + SHIPMGMT + SITEPREP + SOUNDRECORD + SPONSORSHIP + STAG + STOCKBROKING + STOCKEXCHGSERV + STORANDWAREHOUSING + SUPPLYTANGIBLEGOODS + SURVEYANDMAPMAKING + SURVEYMINERALS + TECHINSPECTION + TECHTESTING + TELECOMMUNICATIONSERV + TELEVISIONANDRADIO + TOUROP + TRANSPORTPIPELINE + TRAVELAGENT + ULIPMANAGEMENT + UNDERWRITER + VIDEOTAPEPROD + WORKSCONTRACT +} + +enum QuickbooksItemType { + INVENTORY + SERVICE + NON_INVENTORY + GROUP +} + +enum QuickbooksItemCategoryType { + PRODUCT + SERVICE +} + +"""""" +type QuickbooksItem implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + name: String + + """""" + categoryType: QuickbooksItemCategoryType + + """""" + syncToken: String + + """""" + inventoryStartDate: String + + """""" + type: QuickbooksItemType + + """""" + quantityOnHand: String + + """""" + assetAccountId: String + + """""" + sku: String + + """""" + salesTaxIncluded: Boolean + + """""" + trackQuantityOnHand: Boolean + + """""" + salesTaxCodeId: String + + """""" + purchaseTaxIncluded: Boolean + + """""" + fullyQualifiedName: String + + """""" + description: String + + """""" + abatementRate: String + + """""" + reverseChargeRate: String + + """""" + subItem: Boolean + + """""" + taxable: Boolean + + """""" + uqcDisplayText: String + + """""" + purchaseDesc: String + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """""" + preferredVendorId: String + + """""" + level: Int + + """""" + active: Boolean + + """""" + uqcId: Int + + """""" + taxClassificationId: String + + """""" + purchaseTaxCodeId: String + + """""" + serviceType: QuickbooksItemServiceType + + """""" + purchaseCost: String + + """""" + parentId: String + + """""" + unitPrice: String + + """""" + incomeAccountId: String + + """""" + expenseAccountId: String + + """Reads a single `Account` that is related to this `Item`.""" + assetAccount: QuickbooksAccount + + """Reads a single `TaxCode` that is related to this `Item`.""" + salesTaxCode: QuickbooksTaxCode + + """Reads a single `Vendor` that is related to this `Item`.""" + preferredVendor: QuickbooksVendor + + """Reads a single `TaxClassification` that is related to this `Item`.""" + taxClassification: QuickbooksTaxClassification + + """Reads a single `TaxCode` that is related to this `Item`.""" + purchaseTaxCode: QuickbooksTaxCode + + """Reads a single `Item` that is related to this `Item`.""" + parent: QuickbooksItem + + """Reads a single `Account` that is related to this `Item`.""" + incomeAccount: QuickbooksAccount + + """Reads a single `Account` that is related to this `Item`.""" + expenseAccount: QuickbooksAccount + + """Reads a single `Uqc` that is related to this `Item`.""" + uqc: QuickbooksUqc + + """Reads and enables pagination through a set of `Item`.""" + subItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksItemFilter + + """The method to use when ordering `Item`.""" + orderBy: [QuickbooksItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksItemsConnection! + + """Reads and enables pagination through a set of `TimeActivity`.""" + timeActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTimeActivityFilter + + """The method to use when ordering `TimeActivity`.""" + orderBy: [QuickbooksTimeActivitiesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTimeActivitiesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Item` values.""" +type QuickbooksItemsConnection { + """A list of `Item` objects.""" + nodes: [QuickbooksItem]! + + """ + A list of edges which contains the `Item` and cursor to aid in pagination. + """ + edges: [QuickbooksItemsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Item` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksItemsConnectionAggregates +} + +""" +A filter to be used against GstRegistrationType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksGstRegistrationTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksGstRegistrationType + + """Greater than the specified value.""" + greaterThan: QuickbooksGstRegistrationType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksGstRegistrationType + + """Less than the specified value.""" + lessThan: QuickbooksGstRegistrationType + + """Not included in the specified list.""" + notIn: [QuickbooksGstRegistrationType!] + + """Included in the specified list.""" + in: [QuickbooksGstRegistrationType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksGstRegistrationType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksGstRegistrationType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksGstRegistrationType + + """Equal to the specified value.""" + equalTo: QuickbooksGstRegistrationType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against Int fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksIntFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Int + + """Greater than the specified value.""" + greaterThan: Int + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: Int + + """Less than the specified value.""" + lessThan: Int + + """Not included in the specified list.""" + notIn: [Int!] + + """Included in the specified list.""" + in: [Int!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: Int + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: Int + + """Not equal to the specified value.""" + notEqualTo: Int + + """Equal to the specified value.""" + equalTo: Int + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against Date fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksDateFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Less than the specified value.""" + lessThan: String + + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against CustomerPreferredDeliveryMethod fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksCustomerPreferredDeliveryMethodFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksCustomerPreferredDeliveryMethod + + """Greater than the specified value.""" + greaterThan: QuickbooksCustomerPreferredDeliveryMethod + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksCustomerPreferredDeliveryMethod + + """Less than the specified value.""" + lessThan: QuickbooksCustomerPreferredDeliveryMethod + + """Not included in the specified list.""" + notIn: [QuickbooksCustomerPreferredDeliveryMethod!] + + """Included in the specified list.""" + in: [QuickbooksCustomerPreferredDeliveryMethod!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksCustomerPreferredDeliveryMethod + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksCustomerPreferredDeliveryMethod + + """Not equal to the specified value.""" + notEqualTo: QuickbooksCustomerPreferredDeliveryMethod + + """Equal to the specified value.""" + equalTo: QuickbooksCustomerPreferredDeliveryMethod + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Customer` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksCustomerFilter { + """Negates the expression.""" + not: QuickbooksCustomerFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksCustomerFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksCustomerFilter!] + + """Filter by the object’s `taxExemptionReasonId` field.""" + taxExemptionReasonId: QuickbooksIntFilter + + """Filter by the object’s `billingAddressId` field.""" + billingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `printOnCheckName` field.""" + printOnCheckName: QuickbooksStringFilter + + """Filter by the object’s `gstRegistrationType` field.""" + gstRegistrationType: QuickbooksGstRegistrationTypeFilter + + """Filter by the object’s `companyName` field.""" + companyName: QuickbooksStringFilter + + """Filter by the object’s `isProject` field.""" + isProject: QuickbooksBooleanFilter + + """Filter by the object’s `paymentMethodId` field.""" + paymentMethodId: QuickbooksBigIntFilter + + """Filter by the object’s `shippingAddressId` field.""" + shippingAddressId: QuickbooksBigIntFilter + + """Filter by the object’s `balance` field.""" + balance: QuickbooksBigFloatFilter + + """Filter by the object’s `active` field.""" + active: QuickbooksBooleanFilter + + """Filter by the object’s `webAddress` field.""" + webAddress: QuickbooksStringFilter + + """Filter by the object’s `notes` field.""" + notes: QuickbooksStringFilter + + """Filter by the object’s `level` field.""" + level: QuickbooksIntFilter + + """Filter by the object’s `parentId` field.""" + parentId: QuickbooksBigIntFilter + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `alternatePhoneNumber` field.""" + alternatePhoneNumber: QuickbooksStringFilter + + """Filter by the object’s `taxable` field.""" + taxable: QuickbooksBooleanFilter + + """Filter by the object’s `openBalanceDate` field.""" + openBalanceDate: QuickbooksDateFilter + + """Filter by the object’s `primaryPhoneNumber` field.""" + primaryPhoneNumber: QuickbooksStringFilter + + """Filter by the object’s `balanceWithJobs` field.""" + balanceWithJobs: QuickbooksBigFloatFilter + + """Filter by the object’s `isJob` field.""" + isJob: QuickbooksBooleanFilter + + """Filter by the object’s `mobileNumber` field.""" + mobileNumber: QuickbooksStringFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `billWithParent` field.""" + billWithParent: QuickbooksBooleanFilter + + """Filter by the object’s `businessNumber` field.""" + businessNumber: QuickbooksStringFilter + + """Filter by the object’s `faxNumber` field.""" + faxNumber: QuickbooksStringFilter + + """Filter by the object’s `fullyQualifiedName` field.""" + fullyQualifiedName: QuickbooksStringFilter + + """Filter by the object’s `salesTermId` field.""" + salesTermId: QuickbooksBigIntFilter + + """Filter by the object’s `gstin` field.""" + gstin: QuickbooksStringFilter + + """Filter by the object’s `preferredDeliveryMethod` field.""" + preferredDeliveryMethod: QuickbooksCustomerPreferredDeliveryMethodFilter + + """Filter by the object’s `defaultTaxCodeId` field.""" + defaultTaxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `accountId` field.""" + accountId: QuickbooksBigIntFilter + + """Filter by the object’s `resaleNumber` field.""" + resaleNumber: QuickbooksStringFilter + + """Filter by the object’s `primaryEmailAddress` field.""" + primaryEmailAddress: QuickbooksStringFilter + + """Filter by the object’s `familyName` field.""" + familyName: QuickbooksStringFilter + + """Filter by the object’s `suffix` field.""" + suffix: QuickbooksStringFilter + + """Filter by the object’s `middleName` field.""" + middleName: QuickbooksStringFilter + + """Filter by the object’s `givenName` field.""" + givenName: QuickbooksStringFilter + + """Filter by the object’s `title` field.""" + title: QuickbooksStringFilter + + """Filter by the object’s `displayName` field.""" + displayName: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksCustomersOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + DISPLAY_NAME_ASC + DISPLAY_NAME_DESC + TITLE_ASC + TITLE_DESC + GIVEN_NAME_ASC + GIVEN_NAME_DESC + MIDDLE_NAME_ASC + MIDDLE_NAME_DESC + SUFFIX_ASC + SUFFIX_DESC + FAMILY_NAME_ASC + FAMILY_NAME_DESC + PRIMARY_EMAIL_ADDRESS_ASC + PRIMARY_EMAIL_ADDRESS_DESC + RESALE_NUMBER_ASC + RESALE_NUMBER_DESC + ACCOUNT_ID_ASC + ACCOUNT_ID_DESC + DEFAULT_TAX_CODE_ID_ASC + DEFAULT_TAX_CODE_ID_DESC + PREFERRED_DELIVERY_METHOD_ASC + PREFERRED_DELIVERY_METHOD_DESC + GSTIN_ASC + GSTIN_DESC + SALES_TERM_ID_ASC + SALES_TERM_ID_DESC + FULLY_QUALIFIED_NAME_ASC + FULLY_QUALIFIED_NAME_DESC + FAX_NUMBER_ASC + FAX_NUMBER_DESC + BUSINESS_NUMBER_ASC + BUSINESS_NUMBER_DESC + BILL_WITH_PARENT_ASC + BILL_WITH_PARENT_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + MOBILE_NUMBER_ASC + MOBILE_NUMBER_DESC + IS_JOB_ASC + IS_JOB_DESC + BALANCE_WITH_JOBS_ASC + BALANCE_WITH_JOBS_DESC + PRIMARY_PHONE_NUMBER_ASC + PRIMARY_PHONE_NUMBER_DESC + OPEN_BALANCE_DATE_ASC + OPEN_BALANCE_DATE_DESC + TAXABLE_ASC + TAXABLE_DESC + ALTERNATE_PHONE_NUMBER_ASC + ALTERNATE_PHONE_NUMBER_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + PARENT_ID_ASC + PARENT_ID_DESC + LEVEL_ASC + LEVEL_DESC + NOTES_ASC + NOTES_DESC + WEB_ADDRESS_ASC + WEB_ADDRESS_DESC + ACTIVE_ASC + ACTIVE_DESC + BALANCE_ASC + BALANCE_DESC + SHIPPING_ADDRESS_ID_ASC + SHIPPING_ADDRESS_ID_DESC + PAYMENT_METHOD_ID_ASC + PAYMENT_METHOD_ID_DESC + IS_PROJECT_ASC + IS_PROJECT_DESC + COMPANY_NAME_ASC + COMPANY_NAME_DESC + GST_REGISTRATION_TYPE_ASC + GST_REGISTRATION_TYPE_DESC + PRINT_ON_CHECK_NAME_ASC + PRINT_ON_CHECK_NAME_DESC + BILLING_ADDRESS_ID_ASC + BILLING_ADDRESS_ID_DESC + TAX_EXEMPTION_REASON_ID_ASC + TAX_EXEMPTION_REASON_ID_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +""" +A filter to be used against AccountSubType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksAccountSubTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksAccountSubType + + """Greater than the specified value.""" + greaterThan: QuickbooksAccountSubType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksAccountSubType + + """Less than the specified value.""" + lessThan: QuickbooksAccountSubType + + """Not included in the specified list.""" + notIn: [QuickbooksAccountSubType!] + + """Included in the specified list.""" + in: [QuickbooksAccountSubType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksAccountSubType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksAccountSubType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksAccountSubType + + """Equal to the specified value.""" + equalTo: QuickbooksAccountSubType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against AccountType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksAccountTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksAccountType + + """Greater than the specified value.""" + greaterThan: QuickbooksAccountType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksAccountType + + """Less than the specified value.""" + lessThan: QuickbooksAccountType + + """Not included in the specified list.""" + notIn: [QuickbooksAccountType!] + + """Included in the specified list.""" + in: [QuickbooksAccountType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksAccountType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksAccountType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksAccountType + + """Equal to the specified value.""" + equalTo: QuickbooksAccountType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against TransactionLocationType fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksTransactionLocationTypeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksTransactionLocationType + + """Greater than the specified value.""" + greaterThan: QuickbooksTransactionLocationType + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksTransactionLocationType + + """Less than the specified value.""" + lessThan: QuickbooksTransactionLocationType + + """Not included in the specified list.""" + notIn: [QuickbooksTransactionLocationType!] + + """Included in the specified list.""" + in: [QuickbooksTransactionLocationType!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksTransactionLocationType + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksTransactionLocationType + + """Not equal to the specified value.""" + notEqualTo: QuickbooksTransactionLocationType + + """Equal to the specified value.""" + equalTo: QuickbooksTransactionLocationType + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against Datetime fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksDatetimeFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Less than the specified value.""" + lessThan: String + + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against BigFloat fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksBigFloatFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Less than the specified value.""" + lessThan: String + + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against AccountClassification fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksAccountClassificationFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: QuickbooksAccountClassification + + """Greater than the specified value.""" + greaterThan: QuickbooksAccountClassification + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: QuickbooksAccountClassification + + """Less than the specified value.""" + lessThan: QuickbooksAccountClassification + + """Not included in the specified list.""" + notIn: [QuickbooksAccountClassification!] + + """Included in the specified list.""" + in: [QuickbooksAccountClassification!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: QuickbooksAccountClassification + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: QuickbooksAccountClassification + + """Not equal to the specified value.""" + notEqualTo: QuickbooksAccountClassification + + """Equal to the specified value.""" + equalTo: QuickbooksAccountClassification + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against Boolean fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksBooleanFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Boolean + + """Greater than the specified value.""" + greaterThan: Boolean + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: Boolean + + """Less than the specified value.""" + lessThan: Boolean + + """Not included in the specified list.""" + notIn: [Boolean!] + + """Included in the specified list.""" + in: [Boolean!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: Boolean + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: Boolean + + """Not equal to the specified value.""" + notEqualTo: Boolean + + """Equal to the specified value.""" + equalTo: Boolean + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against String fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksStringFilter { + """ + Does not match the specified pattern using the SQL standard's definition of a regular expression. + """ + notSimilarTo: String + + """ + Matches the specified pattern using the SQL standard's definition of a regular expression. + """ + similarTo: String + + """ + Does not match the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + notLikeInsensitive: String + + """ + Matches the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + likeInsensitive: String + + """ + Does not match the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + notLike: String + + """ + Matches the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + like: String + + """Does not end with the specified string (case-insensitive).""" + notEndsWithInsensitive: String + + """Ends with the specified string (case-insensitive).""" + endsWithInsensitive: String + + """Does not end with the specified string (case-sensitive).""" + notEndsWith: String + + """Ends with the specified string (case-sensitive).""" + endsWith: String + + """Does not start with the specified string (case-insensitive).""" + notStartsWithInsensitive: String + + """Starts with the specified string (case-insensitive).""" + startsWithInsensitive: String + + """Does not start with the specified string (case-sensitive).""" + notStartsWith: String + + """Starts with the specified string (case-sensitive).""" + startsWith: String + + """Does not contain the specified string (case-insensitive).""" + notIncludesInsensitive: String + + """Contains the specified string (case-insensitive).""" + includesInsensitive: String + + """Does not contain the specified string (case-sensitive).""" + notIncludes: String + + """Contains the specified string (case-sensitive).""" + includes: String + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Less than the specified value.""" + lessThan: String + + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against BigInt fields. All fields are combined with a logical ‘and.’ +""" +input QuickbooksBigIntFilter { + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Less than the specified value.""" + lessThan: String + + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String + + """ + Is null (if `true` is specified) or is not null (if `false` is specified). + """ + isNull: Boolean +} + +""" +A filter to be used against `Account` object types. All fields are combined with a logical ‘and.’ +""" +input QuickbooksAccountFilter { + """Negates the expression.""" + not: QuickbooksAccountFilter + + """Checks for any expressions in this list.""" + or: [QuickbooksAccountFilter!] + + """Checks for all expressions in this list.""" + and: [QuickbooksAccountFilter!] + + """Filter by the object’s `accountSubType` field.""" + accountSubType: QuickbooksAccountSubTypeFilter + + """Filter by the object’s `taxCodeId` field.""" + taxCodeId: QuickbooksBigIntFilter + + """Filter by the object’s `alias` field.""" + alias: QuickbooksStringFilter + + """Filter by the object’s `accountType` field.""" + accountType: QuickbooksAccountTypeFilter + + """Filter by the object’s `transactionLocationType` field.""" + transactionLocationType: QuickbooksTransactionLocationTypeFilter + + """Filter by the object’s `lastUpdatedTime` field.""" + lastUpdatedTime: QuickbooksDatetimeFilter + + """Filter by the object’s `createTime` field.""" + createTime: QuickbooksDatetimeFilter + + """Filter by the object’s `active` field.""" + active: QuickbooksBooleanFilter + + """Filter by the object’s `description` field.""" + description: QuickbooksStringFilter + + """Filter by the object’s `currentBalance` field.""" + currentBalance: QuickbooksBigFloatFilter + + """Filter by the object’s `parentAccountId` field.""" + parentAccountId: QuickbooksBigIntFilter + + """Filter by the object’s `currentBalanceWithSubAccounts` field.""" + currentBalanceWithSubAccounts: QuickbooksBigFloatFilter + + """Filter by the object’s `currencyCode` field.""" + currencyCode: QuickbooksStringFilter + + """Filter by the object’s `fullyQualifiedName` field.""" + fullyQualifiedName: QuickbooksStringFilter + + """Filter by the object’s `classification` field.""" + classification: QuickbooksAccountClassificationFilter + + """Filter by the object’s `subAccount` field.""" + subAccount: QuickbooksBooleanFilter + + """Filter by the object’s `accountNumber` field.""" + accountNumber: QuickbooksStringFilter + + """Filter by the object’s `syncToken` field.""" + syncToken: QuickbooksBigIntFilter + + """Filter by the object’s `name` field.""" + name: QuickbooksStringFilter + + """Filter by the object’s `id` field.""" + id: QuickbooksBigIntFilter + + """Filter by the object’s `realmId` field.""" + realmId: QuickbooksBigIntFilter +} + +enum QuickbooksAccountsOrderBy { + NATURAL + REALM_ID_ASC + REALM_ID_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + SYNC_TOKEN_ASC + SYNC_TOKEN_DESC + ACCOUNT_NUMBER_ASC + ACCOUNT_NUMBER_DESC + SUB_ACCOUNT_ASC + SUB_ACCOUNT_DESC + CLASSIFICATION_ASC + CLASSIFICATION_DESC + FULLY_QUALIFIED_NAME_ASC + FULLY_QUALIFIED_NAME_DESC + CURRENCY_CODE_ASC + CURRENCY_CODE_DESC + CURRENT_BALANCE_WITH_SUB_ACCOUNTS_ASC + CURRENT_BALANCE_WITH_SUB_ACCOUNTS_DESC + PARENT_ACCOUNT_ID_ASC + PARENT_ACCOUNT_ID_DESC + CURRENT_BALANCE_ASC + CURRENT_BALANCE_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + ACTIVE_ASC + ACTIVE_DESC + CREATE_TIME_ASC + CREATE_TIME_DESC + LAST_UPDATED_TIME_ASC + LAST_UPDATED_TIME_DESC + TRANSACTION_LOCATION_TYPE_ASC + TRANSACTION_LOCATION_TYPE_DESC + ACCOUNT_TYPE_ASC + ACCOUNT_TYPE_DESC + ALIAS_ASC + ALIAS_DESC + TAX_CODE_ID_ASC + TAX_CODE_ID_DESC + ACCOUNT_SUB_TYPE_ASC + ACCOUNT_SUB_TYPE_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type QuickbooksAccountsConnectionAverages { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + currentBalanceWithSubAccounts: Float + + """""" + parentAccountId: Float + + """""" + currentBalance: Float + + """""" + taxCodeId: Float +} + +"""""" +type QuickbooksAccountsConnectionSums { + """""" + realmId: Float + + """""" + id: Float + + """""" + syncToken: Float + + """""" + currentBalanceWithSubAccounts: Float + + """""" + parentAccountId: Float + + """""" + currentBalance: Float + + """""" + taxCodeId: Float +} + +"""""" +type QuickbooksAccountsConnectionAggregates { + """""" + sum: QuickbooksAccountsConnectionSums + + """""" + avg: QuickbooksAccountsConnectionAverages +} + +"""Information about pagination in a connection.""" +type QuickbooksPageInfo { + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: String + + """When paginating forwards, the cursor to continue.""" + endCursor: String +} + +"""A `Account` edge in the connection.""" +type QuickbooksAccountsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Account` at the end of the edge.""" + node: QuickbooksAccount +} + +"""A connection to a list of `Account` values.""" +type QuickbooksAccountsConnection { + """A list of `Account` objects.""" + nodes: [QuickbooksAccount]! + + """ + A list of edges which contains the `Account` and cursor to aid in pagination. + """ + edges: [QuickbooksAccountsEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Account` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksAccountsConnectionAggregates +} + +"""""" +type QuickbooksTaxCode implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + name: String! + + """""" + syncToken: String + + """""" + taxGroup: Boolean + + """""" + taxable: Boolean + + """""" + active: Boolean + + """""" + description: String + + """""" + hidden: Boolean + + """""" + createTime: String + + """""" + lastUpdatedTime: String + + """Reads and enables pagination through a set of `Account`.""" + accountsUsingTaxCodeAsDefault( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksAccountFilter + + """The method to use when ordering `Account`.""" + orderBy: [QuickbooksAccountsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksAccountsConnection! + + """Reads and enables pagination through a set of `Customer`.""" + customers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCustomerFilter + + """The method to use when ordering `Customer`.""" + orderBy: [QuickbooksCustomersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCustomersConnection! + + """Reads and enables pagination through a set of `Item`.""" + itemsBySalesTaxCode( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksItemFilter + + """The method to use when ordering `Item`.""" + orderBy: [QuickbooksItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksItemsConnection! + + """Reads and enables pagination through a set of `Item`.""" + itemsByPurchaseTaxCode( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksItemFilter + + """The method to use when ordering `Item`.""" + orderBy: [QuickbooksItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksItemsConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + invoicesByTransactionTaxCode( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + estimatesByTransactionTaxCode( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection! + + """Reads and enables pagination through a set of `RefundReceipt`.""" + refundReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptFilter + + """The method to use when ordering `RefundReceipt`.""" + orderBy: [QuickbooksRefundReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptsConnection! + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection! + + """Reads and enables pagination through a set of `JournalEntry`.""" + journalEntries( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksJournalEntryFilter + + """The method to use when ordering `JournalEntry`.""" + orderBy: [QuickbooksJournalEntriesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksJournalEntriesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksAccountSubType { + ACCOUNTS_PAYABLE + ACCOUNTS_RECEIVABLE + ACCUMULATED_ADJUSTMENT + ACCUMULATED_AMORTIZATION + ACCUMULATED_AMORTIZATION_OF_OTHER_ASSETS + ACCUMULATED_DEPLETION + ACCUMULATED_DEPRECIATION + ADVERTISING_PROMOTIONAL + ALLOWANCE_FOR_BAD_DEBTS + AMORTIZATION + AUTO + BAD_DEBTS + BANK_CHARGES + BUILDINGS + CASH_ON_HAND + CHARITABLE_CONTRIBUTIONS + CHECKING + COMMON_STOCK + COST_OF_LABOR + COST_OF_LABOR_COS + CREDIT_CARD + DEPLETABLE_ASSETS + DEPRECIATION + DEVELOPMENT_COSTS + DIRECT_DEPOSIT_PAYABLE + DISCOUNTS_REFUNDS_GIVEN + DIVIDEND_INCOME + DUES_SUBSCRIPTIONS + EMPLOYEE_CASH_ADVANCES + ENTERTAINMENT + ENTERTAINMENT_MEALS + EQUIPMENT_RENTAL + EQUIPMENT_RENTAL_COS + ESTIMATED_TAXES + EXCHANGE_GAIN_OR_LOSS + FEDERAL_INCOME_TAX_PAYABLE + FINANCE_COSTS + FIXED_ASSET_COMPUTERS + FIXED_ASSET_COPIERS + FIXED_ASSET_FURNITURE + FIXED_ASSET_PHONE + FIXED_ASSET_PHOTO_VIDEO + FIXED_ASSET_SOFTWARE + FIXED_ASSET_OTHER_TOOLS_EQUIPMENT + FURNITURE_AND_FIXTURES + GLOBAL_TAX_EXPENSE + GLOBAL_TAX_PAYABLE + GLOBAL_TAX_SUSPENSE + GAS_AND_FUEL + GOODWILL + GRATUITY + HEALTHCARE + HOME_OFFICE + HOMEOWNER_RENTAL_INSURANCE + INSURANCE + INSURANCE_PAYABLE + INTANGIBLE_ASSETS + INTEREST_EARNED + INTEREST_PAID + INVENTORY + INVESTMENT_MORTGAGE_REAL_ESTATE_LOANS + INVESTMENT_OTHER + INVESTMENT_TAX_EXEMPT_SECURITIES + INVESTMENT_USGOVERNMENT_OBLIGATIONS + LAND + LEASE_BUYOUT + LEASEHOLD_IMPROVEMENTS + LEGAL_PROFESSIONAL_FEES + LICENSES + LINE_OF_CREDIT + LOAN_PAYABLE + LOANS_TO_OFFICERS + LOANS_TO_OTHERS + LOANS_TO_STOCKHOLDERS + MACHINERY_AND_EQUIPMENT + MONEY_MARKET + MORTGAGE_INTEREST_HOME_OFFICE + NON_PROFIT_INCOME + NOTES_PAYABLE + OFFICE_GENERAL_ADMINISTRATIVE_EXPENSES + OPENING_BALANCE_EQUITY + ORGANIZATIONAL_COSTS + OTHER_BUSINESS_EXPENSES + OTHER_COSTS_OF_SERVICE_COS + OTHER_CURRENT_ASSETS + OTHER_CURRENT_LIABILITIES + OTHER_FIXED_ASSETS + OTHER_HOME_OFFICE_EXPENSES + OTHER_INVESTMENT_INCOME + OTHER_LONG_TERM_ASSETS + OTHER_LONG_TERM_LIABILITIES + OTHER_MISCELLANEOUS_EXPENSE + OTHER_MISCELLANEOUS_INCOME + OTHER_MISCELLANEOUS_SERVICE_COST + OTHER_PRIMARY_INCOME + OTHER_VEHICLE_EXPENSES + OWNERS_EQUITY + PAID_IN_CAPITAL_OR_SURPLUS + PARKING_AND_TOLLS + PARTNER_CONTRIBUTIONS + PARTNER_DISTRIBUTIONS + PARTNERS_EQUITY + PAYROLL_CLEARING + PAYROLL_EXPENSES + PAYROLL_TAX_PAYABLE + PENALTIES_SETTLEMENTS + PERSONAL_EXPENSE + PERSONAL_INCOME + PREFERRED_STOCK + PREPAID_EXPENSES + PREPAID_EXPENSES_PAYABLE + PROMOTIONAL_MEALS + RENT_AND_LEASE_HOME_OFFICE + RENT_OR_LEASE_OF_BUILDINGS + RENTS_HELD_IN_TRUST + RENTS_IN_TRUST_LIABILITY + REPAIRS_AND_MAINTAINCE_HOME_OFFICE + REPAIR_MAINTENANCE + RETAINAGE + RETAINED_EARNINGS + SALES_OF_PRODUCT_INCOME + SALES_TAX_PAYABLE + SAVINGS + SECURITY_DEPOSITS + SERVICE_FEE_INCOME + SHAREHOLDER_NOTES_PAYABLE + SHIPPING_FREIGHT_DELIVERY + SHIPPING_FREIGHT_DELIVERY_COS + STATE_LOCAL_INCOME_TAX_PAYABLE + SUPPLIES_MATERIALS + SUPPLIES_MATERIALS_COGS + TAXES_PAID + TAX_EXEMPT_INTEREST + TRAVEL + TRAVEL_MEALS + TREASURY_STOCK + TRUST_ACCOUNTS + TRUST_ACCOUNTS_LIABILITIES + UNAPPLIED_CASH_BILL_PAYMENT_EXPENSE + UNAPPLIED_CASH_PAYMENT_INCOME + UNDEPOSITED_FUNDS + UTILITIES + UTILITIES_HOME_OFFICE + VEHICLE + VEHICLE_INSURANCE + VEHICLE_LEASE + VEHICLE_LOAN + VEHICLE_LOAN_INTEREST + VEHICLE_REGISTRATION + VEHICLE_REPAIRS + VEHICLES + WASH_AND_ROAD_SERVICES + WITHHOLDING_TAX_SALES + WITHHOLDING_TAX_PURCHASES + WITHHOLDING_ASSET_AMOUNT + WITHHOLDING_LIABILITY_AMOUNT + WITHHOLDING_TAX_SUSPENSE + PROVISIONS_CURRENT_ASSETS + OTHER_CONSUMABLES + EXPENDITURE_AUTHORISATIONS_AND_LETTERS_OF_CREDIT + INTERNAL_TRANSFERS + PROVISIONS_FIXED_ASSETS + ASSETS_IN_COURSE_OF_CONSTRUCTION + PARTICIPATING_INTERESTS + CUMULATIVE_DEPRECIATION_ON_INTANGIBLE_ASSETS + PROVISIONS_NON_CURRENT_ASSETS + OUTSTANDING_DUES_MICRO_SMALL_ENTERPRISE + OUTSTANDING_DUES_OTHER_THAN_MICRO_SMALL_ENTERPRISE + GLOBAL_TAX_REFUND + GLOBAL_TAX_DEFERRED + PROVISIONS_CURRENT_LIABILITIES + STAFF_AND_RELATED_LIABILITY_ACCOUNTS + SOCIAL_SECURITY_AGENCIES + SUNDRY_DEBTORS_AND_CREDITORS + PROVISIONS_NON_CURRENT_LIABILITIES + DEBTS_RELATED_TO_PARTICIPATING_INTERESTS + STAFF_AND_RELATED_LONG_TERM_LIABILITY_ACCOUNTS + GOVERNMENT_AND_OTHER_PUBLIC_AUTHORITIES + GROUP_AND_ASSOCIATES + INVESTMENT_GRANTS + CASH_RECEIPT_INCOME + OWN_WORK_CAPITALIZED + OPERATING_GRANTS + OTHER_CURRENT_OPERATING_INCOME + COST_OF_SALES + CASH_EXPENDITURE_EXPENSE + EXTERNAL_SERVICES + OTHER_EXTERNAL_SERVICES + PURCHASES_REBATES + OTHER_RENTAL_COSTS + PROJECT_STUDIES_SURVEYS_ASSESSMENTS + SUNDRY + STAFF_COSTS + OTHER_CURRENT_OPERATING_CHARGES + EXTRAORDINARY_CHARGES + APPROPRIATIONS_TO_DEPRECIATION + ACCRUALS_AND_DEFERRED_INCOME + CURRENT_TAX_LIABILITY + DEFERRED_TAX + DISTRIBUTION_COSTS + INVESTMENTS + LONG_TERM_BORROWINGS + OTHER_INTANGIBLE_ASSETS + PREPAYMENTS_AND_ACCRUED_INCOME + SHORT_TERM_BORROWINGS + PROVISION_FOR_LIABILITIES + CALLED_UP_SHARE_CAPITAL + CALLED_UP_SHARE_CAPITAL_NOT_PAID + LAND_ASSET + AVAILABLE_FOR_SALE_FINANCIAL_ASSETS + PROVISION_FOR_WARRANTY_OBLIGATIONS + CURRENT_PORTION_EMPLOYEE_BENEFITS_OBLIGATIONS + LONG_TERM_EMPLOYEE_BENEFIT_OBLIGATIONS + OBLIGATIONS_UNDER_FINANCE_LEASES + BANK_LOANS + INTEREST_PAYABLES + GAIN_LOSS_ON_SALE_OF_INVESTMENTS + GAIN_LOSS_ON_SALE_OF_FIXED_ASSETS + SHARE_CAPITAL + CURRENT_PORTION_OF_OBLIGATIONS_UNDER_FINANCE_LEASES + ASSETS_HELD_FOR_SALE + ACCRUED_LIABILITIES + ACCRUED_LONG_LERM_LIABILITIES + ACCRUED_VACATION_PAYABLE + CASH_AND_CASH_EQUIVALENTS + COMMISSIONS_AND_FEES + AMORTIZATION_EXPENSE + LOSS_ON_DISCONTINUED_OPERATIONS_NET_OF_TAX + MANAGEMENT_COMPENSATION + OTHER_SELLING_EXPENSES + LIABILITIES_RELATED_TO_ASSETS_HELD_FOR_SALE + LONG_TERM_DEBIT + EQUITY_IN_EARNINGS_OF_SUBSIDUARIES + OTHER_OPERATING_INCOME + REVENUE_GENERAL + DIVIDEND_DISBURSED + FREIGHT_AND_DELIVERY_COS + SHIPPING_AND_DELIVERY_EXPENSE + TRAVEL_EXPENSES_GENERAL_AND_ADMIN_EXPENSES + TRAVEL_EXPENSES_SELLING_EXPENSE + UNREALISED_LOSS_ON_SECURITIES_NET_OF_TAX + SALES_RETAIL + SALES_WHOLESALE + ACCUMULATED_OTHER_COMPREHENSIVE_INCOME + ASSETS_AVAILABLE_FOR_SALE + LOSS_ON_DISPOSAL_OF_ASSETS + NON_CURRENT_ASSETS + INCOME_TAX_EXPENSE + LONG_TERM_INVESTMENTS + DIVIDENDS_PAYABLE + TRADE_AND_OTHER_RECEIVABLES + TRADE_AND_OTHER_PAYABLES + CURRENT_LIABILITIES + SAVINGS_BY_TAX_SCHEME + BORROWING_COST + DEPLETION + EXCEPTIONAL_ITEMS + PRIOR_PERIOD_ITEMS + EXTRAORDINARY_ITEMS + MAT_CREDIT + OTHER_FREE_RESERVES + CAPITAL_RESERVES + FUNDS + MONEY_RECEIVED_AGAINST_SHARE_WARRANTS + SHARE_APPLICATION_MONEY_PENDING_ALLOTMENT + DEFERRED_TAX_LIABILITIES + OTHER_LONG_TERM_PROVISIONS + CAPITAL_WIP + INTANGIBLE_ASSETS_UNDER_DEVELOPMENT + OTHER_LONG_TERM_INVESTMENTS + LONG_TERM_LOANS_AND_ADVANCES_TO_RELATED_PARTIES + OTHER_LONG_TERM_LOANS_AND_ADVANCES + SHORT_TERM_INVESTMENTS_IN_RELATED_PARTIES + OTHER_EARMARKED_BANK_ACCOUNTS + SHORT_TERM_LOANS_AND_ADVANCES_TO_RELATED_PARTIES + DEFERRED_TAX_EXPENSE + INCOME_TAX_OTHER_EXPENSE + DUTIES_AND_TAXES + BAL_WITH_GOVT_AUTHORITIES + TAX_ROUNDOFF_GAIN_OR_LOSS +} + +enum QuickbooksAccountType { + BANK + ACCOUNTS_RECEIVABLE + OTHER_CURRENT_ASSET + FIXED_ASSET + OTHER_ASSET + ACCOUNTS_PAYABLE + CREDIT_CARD + OTHER_CURRENT_LIABILITY + LONG_TERM_LIABILITY + EQUITY + INCOME + COST_OF_GOODS_SOLD + EXPENSE + OTHER_INCOME + OTHER_EXPENSE + NON_POSTING +} + +enum QuickbooksTransactionLocationType { + WITHIN_FRANCE + FRANCE_OVERSEAS + OUTSIDE_FRANCE_WITH_EU + OUTSIDE_EU +} + +enum QuickbooksAccountClassification { + ASSET + EQUITY + EXPENSE + LIABILITY + REVENUE +} + +""" +An Account object is a component of a Chart Of Accounts, and is part of a ledger. It is used to record a total monetary amount allocated against a specific use. Accounts are one of five basic types: asset, liability, revenue (income), expenses, or equity. Delete is achieved by setting the Active attribute to false in an object update request; thus, making it inactive. In this type of delete, the record is not permanently deleted, but is hidden for display purposes. References to inactive objects are left intact. +""" +type QuickbooksAccount implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """The unique realmID fro the company.""" + realmId: String! + + """Unique identifier for this object""" + id: String! + + """ + User recognizable name for the Account. Name must not contain double quotes (") or colon (:). + """ + name: String! + + """ + Version number of the object. It is used to lock an object for use by one app at a time. As soon as an application modifies an object, its SyncToken is incremented. Attempts to modify an object specifying an older SyncToken fails. Only the latest version of the object is maintained by QuickBooks Online. + """ + syncToken: String! + + """ + User-defined account number to help the user in identifying the account within the chart-of-accounts and in deciding what should be posted to the account. The Account.AcctNum attribute must not contain colon (:). For France locales: + Name must be unique. + Length must be between 6 and 15 characters + Must start with the account number from the master category list. + Name limited to alpha-numeric characters. + Required for France locales. + """ + accountNumber: String + + """ + Specifies whether this object represents a parent (false) or subaccount (true). + """ + subAccount: Boolean + + """The classification of an account.""" + classification: QuickbooksAccountClassification + + """The classification of an account.""" + fullyQualifiedName: String + + """Reference to the currency in which this account holds amounts.""" + currencyCode: String + + """ + Specifies the cumulative balance amount for the current Account and all its sub-accounts. + """ + currentBalanceWithSubAccounts: String + + """Specifies the Parent AccountId if this represents a SubAccount.""" + parentAccountId: String + + """ + Specifies the balance amount for the current Account. Valid for Balance Sheet accounts. + """ + currentBalance: String + + """ + User entered description for the account, which may include user entered information to guide bookkeepers/accountants in deciding what journal entries to post to the account. + """ + description: String + + """ + Whether or not active inactive accounts may be hidden from most display purposes and may not be posted to. + """ + active: Boolean + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """""" + transactionLocationType: QuickbooksTransactionLocationType + + """ + A detailed account classification that specifies the use of this account. The type is based on the Classification. + """ + accountType: QuickbooksAccountType + + """ + A user friendly name for the account. It must be unique across all account categories. + + For France locales, only. + + For example, if an account is created under category 211 with `AccountAlias` of `Terrains`, then the system does not allow creation of an account with same `AccountAlias` of `Terrains` for any other category except 211. In other words, 211001 and 215001 accounts cannot have same `AccountAlias` because both belong to different account category. + """ + alias: String + + """Default tax code used by this account""" + taxCodeId: String + + """""" + accountSubType: QuickbooksAccountSubType + + """Reads a single `Account` that is related to this `Account`.""" + parentAccount: QuickbooksAccount + + """Reads a single `TaxCode` that is related to this `Account`.""" + taxCode: QuickbooksTaxCode + + """Reads a single `Currency` that is related to this `Account`.""" + currency: QuickbooksCurrency + + """Reads and enables pagination through a set of `Account`.""" + subAccounts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksAccountFilter + + """The method to use when ordering `Account`.""" + orderBy: [QuickbooksAccountsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksAccountsConnection! + + """Reads and enables pagination through a set of `Vendor`.""" + vendors( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksVendorFilter + + """The method to use when ordering `Vendor`.""" + orderBy: [QuickbooksVendorsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksVendorsConnection! + + """Reads and enables pagination through a set of `Customer`.""" + customers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCustomerFilter + + """The method to use when ordering `Customer`.""" + orderBy: [QuickbooksCustomersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCustomersConnection! + + """Reads and enables pagination through a set of `Item`.""" + itemsByAssetAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksItemFilter + + """The method to use when ordering `Item`.""" + orderBy: [QuickbooksItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksItemsConnection! + + """Reads and enables pagination through a set of `Item`.""" + itemsByIncomeAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksItemFilter + + """The method to use when ordering `Item`.""" + orderBy: [QuickbooksItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksItemsConnection! + + """Reads and enables pagination through a set of `Item`.""" + itemsByExpenseAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksItemFilter + + """The method to use when ordering `Item`.""" + orderBy: [QuickbooksItemsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksItemsConnection! + + """Reads and enables pagination through a set of `Bill`.""" + bills( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillFilter + + """The method to use when ordering `Bill`.""" + orderBy: [QuickbooksBillsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillsConnection! + + """Reads and enables pagination through a set of `BillPayment`.""" + billPayments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillPaymentFilter + + """The method to use when ordering `BillPayment`.""" + orderBy: [QuickbooksBillPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillPaymentsConnection! + + """Reads and enables pagination through a set of `BillPayment`.""" + billPaymentsByCheckPaymentAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillPaymentFilter + + """The method to use when ordering `BillPayment`.""" + orderBy: [QuickbooksBillPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillPaymentsConnection! + + """Reads and enables pagination through a set of `BillPayment`.""" + billPaymentsByCreditCardPaymentAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksBillPaymentFilter + + """The method to use when ordering `BillPayment`.""" + orderBy: [QuickbooksBillPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksBillPaymentsConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + invoicesByDepositToAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Payment`.""" + paymentsByDepositToAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentFilter + + """The method to use when ordering `Payment`.""" + orderBy: [QuickbooksPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentsConnection! + + """Reads and enables pagination through a set of `Payment`.""" + paymentsByAccountsReceivableAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentFilter + + """The method to use when ordering `Payment`.""" + orderBy: [QuickbooksPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentsConnection! + + """Reads and enables pagination through a set of `RefundReceipt`.""" + refundReceiptsByDepositToAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptFilter + + """The method to use when ordering `RefundReceipt`.""" + orderBy: [QuickbooksRefundReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptsConnection! + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceiptsByDepositToAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection! + + """Reads and enables pagination through a set of `Transfer`.""" + transfersByTransferToAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransferFilter + + """The method to use when ordering `Transfer`.""" + orderBy: [QuickbooksTransfersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransfersConnection! + + """Reads and enables pagination through a set of `Transfer`.""" + transfersByTransferfromAccount( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTransferFilter + + """The method to use when ordering `Transfer`.""" + orderBy: [QuickbooksTransfersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTransfersConnection! + + """Reads and enables pagination through a set of `Deposit`.""" + depositsByDepositTo( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepositFilter + + """The method to use when ordering `Deposit`.""" + orderBy: [QuickbooksDepositsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepositsConnection! + + """Reads and enables pagination through a set of `Deposit`.""" + depositsByCashBack( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksDepositFilter + + """The method to use when ordering `Deposit`.""" + orderBy: [QuickbooksDepositsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksDepositsConnection! + + """Reads and enables pagination through a set of `Purchase`.""" + purchases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseFilter + + """The method to use when ordering `Purchase`.""" + orderBy: [QuickbooksPurchasesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchasesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum QuickbooksGstRegistrationType { + GST_REG_REG + GST_REG_COMP + GST_UNREG + CONSUMER + OVERSEAS + SEZ + DEEMED +} + +enum QuickbooksCustomerPreferredDeliveryMethod { + PRINT + EMAIL + NONE +} + +"""""" +type QuickbooksCustomer implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + realmId: String! + + """""" + id: String! + + """""" + syncToken: String + + """""" + displayName: String + + """""" + title: String + + """""" + givenName: String + + """""" + middleName: String + + """""" + suffix: String + + """""" + familyName: String + + """""" + primaryEmailAddress: String + + """""" + resaleNumber: String + + """""" + accountId: String + + """""" + defaultTaxCodeId: String + + """""" + preferredDeliveryMethod: QuickbooksCustomerPreferredDeliveryMethod + + """""" + gstin: String + + """""" + salesTermId: String + + """""" + fullyQualifiedName: String + + """""" + faxNumber: String + + """""" + businessNumber: String + + """""" + billWithParent: Boolean + + """""" + currencyCode: String + + """""" + mobileNumber: String + + """""" + isJob: Boolean + + """""" + balanceWithJobs: String + + """""" + primaryPhoneNumber: String + + """""" + openBalanceDate: String + + """""" + taxable: Boolean + + """""" + alternatePhoneNumber: String + + """""" + createTime: String! + + """""" + lastUpdatedTime: String! + + """""" + parentId: String + + """""" + level: Int + + """""" + notes: String + + """""" + webAddress: String + + """""" + active: Boolean + + """""" + balance: String + + """""" + shippingAddressId: String + + """""" + paymentMethodId: String + + """""" + isProject: Boolean + + """""" + companyName: String + + """""" + gstRegistrationType: QuickbooksGstRegistrationType + + """""" + printOnCheckName: String + + """""" + billingAddressId: String + + """""" + taxExemptionReasonId: Int + + """Reads a single `Account` that is related to this `Customer`.""" + account: QuickbooksAccount + + """Reads a single `TaxCode` that is related to this `Customer`.""" + defaultTaxCode: QuickbooksTaxCode + + """Reads a single `Term` that is related to this `Customer`.""" + salesTerm: QuickbooksTerm + + """Reads a single `Customer` that is related to this `Customer`.""" + parentCustomer: QuickbooksCustomer + + """Reads a single `PhysicalAddress` that is related to this `Customer`.""" + shippingAddress: QuickbooksPhysicalAddress + + """Reads a single `PaymentMethod` that is related to this `Customer`.""" + paymentMethod: QuickbooksPaymentMethod + + """Reads a single `PhysicalAddress` that is related to this `Customer`.""" + billingAddress: QuickbooksPhysicalAddress + + """Reads a single `Currency` that is related to this `Customer`.""" + currency: QuickbooksCurrency + + """ + Reads a single `TaxExemptionReason` that is related to this `Customer`. + """ + taxExemptionReason: QuickbooksTaxExemptionReason + + """Reads and enables pagination through a set of `Customer`.""" + subCustomers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCustomerFilter + + """The method to use when ordering `Customer`.""" + orderBy: [QuickbooksCustomersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCustomersConnection! + + """Reads and enables pagination through a set of `Invoice`.""" + invoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksInvoiceFilter + + """The method to use when ordering `Invoice`.""" + orderBy: [QuickbooksInvoicesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksInvoicesConnection! + + """Reads and enables pagination through a set of `Estimate`.""" + estimates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksEstimateFilter + + """The method to use when ordering `Estimate`.""" + orderBy: [QuickbooksEstimatesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksEstimatesConnection! + + """Reads and enables pagination through a set of `CreditMemo`.""" + creditMemos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCreditMemoFilter + + """The method to use when ordering `CreditMemo`.""" + orderBy: [QuickbooksCreditMemosOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCreditMemosConnection! + + """Reads and enables pagination through a set of `Payment`.""" + payments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPaymentFilter + + """The method to use when ordering `Payment`.""" + orderBy: [QuickbooksPaymentsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPaymentsConnection! + + """Reads and enables pagination through a set of `RefundReceipt`.""" + refundReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksRefundReceiptFilter + + """The method to use when ordering `RefundReceipt`.""" + orderBy: [QuickbooksRefundReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksRefundReceiptsConnection! + + """Reads and enables pagination through a set of `SalesReceipt`.""" + salesReceipts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksSalesReceiptFilter + + """The method to use when ordering `SalesReceipt`.""" + orderBy: [QuickbooksSalesReceiptsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksSalesReceiptsConnection! + + """Reads and enables pagination through a set of `TimeActivity`.""" + timeActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksTimeActivityFilter + + """The method to use when ordering `TimeActivity`.""" + orderBy: [QuickbooksTimeActivitiesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksTimeActivitiesConnection! + + """Reads and enables pagination through a set of `Purchase`.""" + purchases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksPurchaseFilter + + """The method to use when ordering `Purchase`.""" + orderBy: [QuickbooksPurchasesOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksPurchasesConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Customer` values.""" +type QuickbooksCustomersConnection { + """A list of `Customer` objects.""" + nodes: [QuickbooksCustomer]! + + """ + A list of edges which contains the `Customer` and cursor to aid in pagination. + """ + edges: [QuickbooksCustomersEdge!]! + + """Information to aid in pagination.""" + pageInfo: QuickbooksPageInfo! + + """The count of *all* `Customer` you could get from the connection.""" + totalCount: Int! + + """""" + aggregates: QuickbooksCustomersConnectionAggregates +} + +"""""" +type QuickbooksTaxExemptionReason implements OneGraphNode & QuickbooksNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: Int! + + """""" + reason: String + + """Reads and enables pagination through a set of `Customer`.""" + customers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: QuickbooksCustomerFilter + + """The method to use when ordering `Customer`.""" + orderBy: [QuickbooksCustomersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): QuickbooksCustomersConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against `Firm` object types. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphFirmFilter { + """Negates the expression.""" + not: ImmigrationGraphFirmFilter + + """Checks for any expressions in this list.""" + or: [ImmigrationGraphFirmFilter!] + + """Checks for all expressions in this list.""" + and: [ImmigrationGraphFirmFilter!] + + """Filter by the object’s `updatedAt` field.""" + updatedAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `name` field.""" + name: ImmigrationGraphStringFilter + + """Filter by the object’s `id` field.""" + id: ImmigrationGraphUUIDFilter +} + +""" +A condition to be used against `Firm` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input ImmigrationGraphFirmCondition { + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: String + + """Checks for equality with the object’s `createdAt` field.""" + createdAt: String + + """Checks for equality with the object’s `name` field.""" + name: String + + """Checks for equality with the object’s `id` field.""" + id: String +} + +enum ImmigrationGraphFirmsOrderBy { + NATURAL + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""A `Firm` edge in the connection.""" +type ImmigrationGraphFirmsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Firm` at the end of the edge.""" + node: ImmigrationGraphFirm! +} + +"""A connection to a list of `Firm` values.""" +type ImmigrationGraphFirmsConnection { + """A list of `Firm` objects.""" + nodes: [ImmigrationGraphFirm!]! + + """ + A list of edges which contains the `Firm` and cursor to aid in pagination. + """ + edges: [ImmigrationGraphFirmsEdge!]! + + """Information to aid in pagination.""" + pageInfo: ImmigrationGraphPageInfo! + + """The count of *all* `Firm` you could get from the connection.""" + totalCount: Int +} + +""" +A filter to be used against `EmployerPoc` object types. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphEmployerPocFilter { + """Negates the expression.""" + not: ImmigrationGraphEmployerPocFilter + + """Checks for any expressions in this list.""" + or: [ImmigrationGraphEmployerPocFilter!] + + """Checks for all expressions in this list.""" + and: [ImmigrationGraphEmployerPocFilter!] + + """Filter by the object’s `jobTitle` field.""" + jobTitle: ImmigrationGraphStringFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `email` field.""" + email: ImmigrationGraphStringFilter + + """Filter by the object’s `telephoneExtension` field.""" + telephoneExtension: ImmigrationGraphStringFilter + + """Filter by the object’s `telephone` field.""" + telephone: ImmigrationGraphStringFilter + + """Filter by the object’s `addressProvince` field.""" + addressProvince: ImmigrationGraphStringFilter + + """Filter by the object’s `addressCountry` field.""" + addressCountry: ImmigrationGraphStringFilter + + """Filter by the object’s `addressPostalCode` field.""" + addressPostalCode: ImmigrationGraphStringFilter + + """Filter by the object’s `addressState` field.""" + addressState: ImmigrationGraphStringFilter + + """Filter by the object’s `addressCity` field.""" + addressCity: ImmigrationGraphStringFilter + + """Filter by the object’s `addressLine2` field.""" + addressLine2: ImmigrationGraphStringFilter + + """Filter by the object’s `addressLine1` field.""" + addressLine1: ImmigrationGraphStringFilter + + """Filter by the object’s `firstName` field.""" + firstName: ImmigrationGraphStringFilter + + """Filter by the object’s `lastName` field.""" + lastName: ImmigrationGraphStringFilter + + """Filter by the object’s `id` field.""" + id: ImmigrationGraphUUIDFilter +} + +""" +A condition to be used against `EmployerPoc` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input ImmigrationGraphEmployerPocCondition { + """Checks for equality with the object’s `jobTitle` field.""" + jobTitle: String + + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: String + + """Checks for equality with the object’s `createdAt` field.""" + createdAt: String + + """Checks for equality with the object’s `email` field.""" + email: String + + """Checks for equality with the object’s `telephoneExtension` field.""" + telephoneExtension: String + + """Checks for equality with the object’s `telephone` field.""" + telephone: String + + """Checks for equality with the object’s `addressProvince` field.""" + addressProvince: String + + """Checks for equality with the object’s `addressCountry` field.""" + addressCountry: String + + """Checks for equality with the object’s `addressPostalCode` field.""" + addressPostalCode: String + + """Checks for equality with the object’s `addressState` field.""" + addressState: String + + """Checks for equality with the object’s `addressCity` field.""" + addressCity: String + + """Checks for equality with the object’s `addressLine2` field.""" + addressLine2: String + + """Checks for equality with the object’s `addressLine1` field.""" + addressLine1: String + + """Checks for equality with the object’s `firstName` field.""" + firstName: String + + """Checks for equality with the object’s `lastName` field.""" + lastName: String + + """Checks for equality with the object’s `id` field.""" + id: String +} + +enum ImmigrationGraphEmployerPocsOrderBy { + NATURAL + ID_ASC + ID_DESC + LAST_NAME_ASC + LAST_NAME_DESC + FIRST_NAME_ASC + FIRST_NAME_DESC + ADDRESS_LINE_1_ASC + ADDRESS_LINE_1_DESC + ADDRESS_LINE_2_ASC + ADDRESS_LINE_2_DESC + ADDRESS_CITY_ASC + ADDRESS_CITY_DESC + ADDRESS_STATE_ASC + ADDRESS_STATE_DESC + ADDRESS_POSTAL_CODE_ASC + ADDRESS_POSTAL_CODE_DESC + ADDRESS_COUNTRY_ASC + ADDRESS_COUNTRY_DESC + ADDRESS_PROVINCE_ASC + ADDRESS_PROVINCE_DESC + TELEPHONE_ASC + TELEPHONE_DESC + TELEPHONE_EXTENSION_ASC + TELEPHONE_EXTENSION_DESC + EMAIL_ASC + EMAIL_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + JOB_TITLE_ASC + JOB_TITLE_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""A `EmployerPoc` edge in the connection.""" +type ImmigrationGraphEmployerPocsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `EmployerPoc` at the end of the edge.""" + node: ImmigrationGraphEmployerPoc! +} + +"""A connection to a list of `EmployerPoc` values.""" +type ImmigrationGraphEmployerPocsConnection { + """A list of `EmployerPoc` objects.""" + nodes: [ImmigrationGraphEmployerPoc!]! + + """ + A list of edges which contains the `EmployerPoc` and cursor to aid in pagination. + """ + edges: [ImmigrationGraphEmployerPocsEdge!]! + + """Information to aid in pagination.""" + pageInfo: ImmigrationGraphPageInfo! + + """The count of *all* `EmployerPoc` you could get from the connection.""" + totalCount: Int +} + +""" +A filter to be used against `Employer` object types. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphEmployerFilter { + """Negates the expression.""" + not: ImmigrationGraphEmployerFilter + + """Checks for any expressions in this list.""" + or: [ImmigrationGraphEmployerFilter!] + + """Checks for all expressions in this list.""" + and: [ImmigrationGraphEmployerFilter!] + + """Filter by the object’s `updatedAt` field.""" + updatedAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `naicsCode` field.""" + naicsCode: ImmigrationGraphStringFilter + + """Filter by the object’s `telephoneExtension` field.""" + telephoneExtension: ImmigrationGraphStringFilter + + """Filter by the object’s `telephone` field.""" + telephone: ImmigrationGraphStringFilter + + """Filter by the object’s `addressProvince` field.""" + addressProvince: ImmigrationGraphStringFilter + + """Filter by the object’s `addressCountry` field.""" + addressCountry: ImmigrationGraphStringFilter + + """Filter by the object’s `addressPostalCode` field.""" + addressPostalCode: ImmigrationGraphStringFilter + + """Filter by the object’s `addressState` field.""" + addressState: ImmigrationGraphStringFilter + + """Filter by the object’s `addressCity` field.""" + addressCity: ImmigrationGraphStringFilter + + """Filter by the object’s `addressLine2` field.""" + addressLine2: ImmigrationGraphStringFilter + + """Filter by the object’s `addressLine1` field.""" + addressLine1: ImmigrationGraphStringFilter + + """Filter by the object’s `trade` field.""" + trade: ImmigrationGraphStringFilter + + """Filter by the object’s `name` field.""" + name: ImmigrationGraphStringFilter + + """Filter by the object’s `id` field.""" + id: ImmigrationGraphUUIDFilter +} + +""" +A condition to be used against `Employer` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input ImmigrationGraphEmployerCondition { + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: String + + """Checks for equality with the object’s `createdAt` field.""" + createdAt: String + + """Checks for equality with the object’s `naicsCode` field.""" + naicsCode: String + + """Checks for equality with the object’s `telephoneExtension` field.""" + telephoneExtension: String + + """Checks for equality with the object’s `telephone` field.""" + telephone: String + + """Checks for equality with the object’s `addressProvince` field.""" + addressProvince: String + + """Checks for equality with the object’s `addressCountry` field.""" + addressCountry: String + + """Checks for equality with the object’s `addressPostalCode` field.""" + addressPostalCode: String + + """Checks for equality with the object’s `addressState` field.""" + addressState: String + + """Checks for equality with the object’s `addressCity` field.""" + addressCity: String + + """Checks for equality with the object’s `addressLine2` field.""" + addressLine2: String + + """Checks for equality with the object’s `addressLine1` field.""" + addressLine1: String + + """Checks for equality with the object’s `trade` field.""" + trade: String + + """Checks for equality with the object’s `name` field.""" + name: String + + """Checks for equality with the object’s `id` field.""" + id: String +} + +enum ImmigrationGraphEmployersOrderBy { + NATURAL + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + TRADE_ASC + TRADE_DESC + ADDRESS_LINE_1_ASC + ADDRESS_LINE_1_DESC + ADDRESS_LINE_2_ASC + ADDRESS_LINE_2_DESC + ADDRESS_CITY_ASC + ADDRESS_CITY_DESC + ADDRESS_STATE_ASC + ADDRESS_STATE_DESC + ADDRESS_POSTAL_CODE_ASC + ADDRESS_POSTAL_CODE_DESC + ADDRESS_COUNTRY_ASC + ADDRESS_COUNTRY_DESC + ADDRESS_PROVINCE_ASC + ADDRESS_PROVINCE_DESC + TELEPHONE_ASC + TELEPHONE_DESC + TELEPHONE_EXTENSION_ASC + TELEPHONE_EXTENSION_DESC + NAICS_CODE_ASC + NAICS_CODE_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""A `Employer` edge in the connection.""" +type ImmigrationGraphEmployersEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Employer` at the end of the edge.""" + node: ImmigrationGraphEmployer! +} + +"""A connection to a list of `Employer` values.""" +type ImmigrationGraphEmployersConnection { + """A list of `Employer` objects.""" + nodes: [ImmigrationGraphEmployer!]! + + """ + A list of edges which contains the `Employer` and cursor to aid in pagination. + """ + edges: [ImmigrationGraphEmployersEdge!]! + + """Information to aid in pagination.""" + pageInfo: ImmigrationGraphPageInfo! + + """The count of *all* `Employer` you could get from the connection.""" + totalCount: Int +} + +"""The root query type which gives access points into the data universe.""" +type ImmigrationGraphQuery implements OneGraphNode & ImmigrationGraphNode { + """ + Exposes the root query type nested one level down. This is helpful for Relay 1 which can only query top level fields if they are in a particular form. + """ + query: ImmigrationGraphQuery! + + """ + The root query type must be a `Node` to work well with Relay 1 mutations. This just resolves to `query`. + """ + nodeId: ID! + + """Fetches an object given its globally unique `ID`.""" + node( + """The globally unique `ID`.""" + nodeId: ID! + ): ImmigrationGraphNode + + """Reads and enables pagination through a set of `Attorney`.""" + allAttorneys( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphAttorneyFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphAttorneyCondition + + """The method to use when ordering `Attorney`.""" + orderBy: [ImmigrationGraphAttorneysOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphAttorneysConnection + + """Reads and enables pagination through a set of `Employer`.""" + allEmployers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphEmployerFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphEmployerCondition + + """The method to use when ordering `Employer`.""" + orderBy: [ImmigrationGraphEmployersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphEmployersConnection + + """Reads and enables pagination through a set of `EmployerPoc`.""" + allEmployerPocs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphEmployerPocFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphEmployerPocCondition + + """The method to use when ordering `EmployerPoc`.""" + orderBy: [ImmigrationGraphEmployerPocsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphEmployerPocsConnection + + """Reads and enables pagination through a set of `Firm`.""" + allFirms( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphFirmFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphFirmCondition + + """The method to use when ordering `Firm`.""" + orderBy: [ImmigrationGraphFirmsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphFirmsConnection + + """Reads and enables pagination through a set of `H1BApplication`.""" + allH1BApplications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphH1BApplicationFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphH1BApplicationCondition + + """The method to use when ordering `H1BApplication`.""" + orderBy: [ImmigrationGraphH1BApplicationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphH1BApplicationsConnection + + """Reads and enables pagination through a set of `Preparer`.""" + allPreparers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphPreparerFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphPreparerCondition + + """The method to use when ordering `Preparer`.""" + orderBy: [ImmigrationGraphPreparersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphPreparersConnection + + """""" + attorneyById(id: String!): ImmigrationGraphAttorney + + """""" + attorneyByEmail(email: String!): ImmigrationGraphAttorney + + """""" + employerById(id: String!): ImmigrationGraphEmployer + + """""" + employerByName(name: String!): ImmigrationGraphEmployer + + """""" + employerPocById(id: String!): ImmigrationGraphEmployerPoc + + """""" + employerPocByEmail(email: String!): ImmigrationGraphEmployerPoc + + """""" + firmById(id: String!): ImmigrationGraphFirm + + """""" + firmByName(name: String!): ImmigrationGraphFirm + + """""" + h1BApplicationById(id: String!): ImmigrationGraphH1BApplication + + """""" + h1BApplicationByCaseNumber(caseNumber: String!): ImmigrationGraphH1BApplication + + """""" + h1BApplicationByIcertId(icertId: Int!): ImmigrationGraphH1BApplication + + """""" + preparerById(id: String!): ImmigrationGraphPreparer + + """""" + preparerByEmail(email: String!): ImmigrationGraphPreparer + + """Reads a single `Attorney` using its globally unique `ID`.""" + attorney( + """The globally unique `ID` to be used in selecting a single `Attorney`.""" + nodeId: ID! + ): ImmigrationGraphAttorney + + """Reads a single `Employer` using its globally unique `ID`.""" + employer( + """The globally unique `ID` to be used in selecting a single `Employer`.""" + nodeId: ID! + ): ImmigrationGraphEmployer + + """Reads a single `EmployerPoc` using its globally unique `ID`.""" + employerPoc( + """ + The globally unique `ID` to be used in selecting a single `EmployerPoc`. + """ + nodeId: ID! + ): ImmigrationGraphEmployerPoc + + """Reads a single `Firm` using its globally unique `ID`.""" + firm( + """The globally unique `ID` to be used in selecting a single `Firm`.""" + nodeId: ID! + ): ImmigrationGraphFirm + + """Reads a single `H1BApplication` using its globally unique `ID`.""" + h1BApplication( + """ + The globally unique `ID` to be used in selecting a single `H1BApplication`. + """ + nodeId: ID! + ): ImmigrationGraphH1BApplication + + """Reads a single `Preparer` using its globally unique `ID`.""" + preparer( + """The globally unique `ID` to be used in selecting a single `Preparer`.""" + nodeId: ID! + ): ImmigrationGraphPreparer + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A `H1BApplication` edge in the connection.""" +type ImmigrationGraphH1BApplicationsEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `H1BApplication` at the end of the edge.""" + node: ImmigrationGraphH1BApplication! +} + +"""""" +type ImmigrationGraphEmployer implements OneGraphNode & ImmigrationGraphNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + name: String! + + """""" + trade: String + + """""" + addressLine1: String + + """""" + addressLine2: String + + """""" + addressCity: String + + """""" + addressState: String + + """""" + addressPostalCode: String + + """""" + addressCountry: String + + """""" + addressProvince: String + + """""" + telephone: String + + """""" + telephoneExtension: String + + """""" + naicsCode: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """Reads and enables pagination through a set of `H1BApplication`.""" + h1BApplicationsByEmployerId( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphH1BApplicationFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphH1BApplicationCondition + + """The method to use when ordering `H1BApplication`.""" + orderBy: [ImmigrationGraphH1BApplicationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphH1BApplicationsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against `Preparer` object types. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphPreparerFilter { + """Negates the expression.""" + not: ImmigrationGraphPreparerFilter + + """Checks for any expressions in this list.""" + or: [ImmigrationGraphPreparerFilter!] + + """Checks for all expressions in this list.""" + and: [ImmigrationGraphPreparerFilter!] + + """Filter by the object’s `updatedAt` field.""" + updatedAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `email` field.""" + email: ImmigrationGraphStringFilter + + """Filter by the object’s `firmId` field.""" + firmId: ImmigrationGraphUUIDFilter + + """Filter by the object’s `firstName` field.""" + firstName: ImmigrationGraphStringFilter + + """Filter by the object’s `lastName` field.""" + lastName: ImmigrationGraphStringFilter + + """Filter by the object’s `id` field.""" + id: ImmigrationGraphUUIDFilter +} + +""" +A condition to be used against `Preparer` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input ImmigrationGraphPreparerCondition { + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: String + + """Checks for equality with the object’s `createdAt` field.""" + createdAt: String + + """Checks for equality with the object’s `email` field.""" + email: String + + """Checks for equality with the object’s `firmId` field.""" + firmId: String + + """Checks for equality with the object’s `firstName` field.""" + firstName: String + + """Checks for equality with the object’s `lastName` field.""" + lastName: String + + """Checks for equality with the object’s `id` field.""" + id: String +} + +enum ImmigrationGraphPreparersOrderBy { + NATURAL + ID_ASC + ID_DESC + LAST_NAME_ASC + LAST_NAME_DESC + FIRST_NAME_ASC + FIRST_NAME_DESC + FIRM_ID_ASC + FIRM_ID_DESC + EMAIL_ASC + EMAIL_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""A `Preparer` edge in the connection.""" +type ImmigrationGraphPreparersEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Preparer` at the end of the edge.""" + node: ImmigrationGraphPreparer! +} + +""" +A filter to be used against WageRangeUnitOfPayEnum fields. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphWageRangeUnitOfPayEnumFilter { + """Checks for values not in this list.""" + notIn: [ImmigrationGraphWageRangeUnitOfPayEnum!] + + """Checks for values in this list.""" + in: [ImmigrationGraphWageRangeUnitOfPayEnum!] + + """ + Checks for values equal to this value, treating null like an ordinary value. + """ + notDistinctFrom: ImmigrationGraphWageRangeUnitOfPayEnum + + """ + Checks for values not equal to this value, treating null like an ordinary value. + """ + distinctFrom: ImmigrationGraphWageRangeUnitOfPayEnum + + """Checks for values not equal to this value.""" + notEqualTo: ImmigrationGraphWageRangeUnitOfPayEnum + + """Checks for values equal to this value.""" + equalTo: ImmigrationGraphWageRangeUnitOfPayEnum + + """ + If set to true, checks for null values. If set to false, checks for non-null values. + """ + isNull: Boolean +} + +""" +A filter to be used against Float fields. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphFloatFilter { + """Checks for values not in this list.""" + notIn: [Float!] + + """Checks for values in this list.""" + in: [Float!] + + """Checks for values greater than or equal to this value.""" + greaterThanOrEqualTo: Float + + """Checks for values greater than this value.""" + greaterThan: Float + + """Checks for values less than or equal to this value.""" + lessThanOrEqualTo: Float + + """Checks for values less than this value.""" + lessThan: Float + + """ + Checks for values equal to this value, treating null like an ordinary value. + """ + notDistinctFrom: Float + + """ + Checks for values not equal to this value, treating null like an ordinary value. + """ + distinctFrom: Float + + """Checks for values not equal to this value.""" + notEqualTo: Float + + """Checks for values equal to this value.""" + equalTo: Float + + """ + If set to true, checks for null values. If set to false, checks for non-null values. + """ + isNull: Boolean +} + +""" +A filter to be used against H1BApplicationCaseStatus fields. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphH1BApplicationCaseStatusFilter { + """Checks for values not in this list.""" + notIn: [ImmigrationGraphH1BApplicationCaseStatus!] + + """Checks for values in this list.""" + in: [ImmigrationGraphH1BApplicationCaseStatus!] + + """ + Checks for values equal to this value, treating null like an ordinary value. + """ + notDistinctFrom: ImmigrationGraphH1BApplicationCaseStatus + + """ + Checks for values not equal to this value, treating null like an ordinary value. + """ + distinctFrom: ImmigrationGraphH1BApplicationCaseStatus + + """Checks for values not equal to this value.""" + notEqualTo: ImmigrationGraphH1BApplicationCaseStatus + + """Checks for values equal to this value.""" + equalTo: ImmigrationGraphH1BApplicationCaseStatus + + """ + If set to true, checks for null values. If set to false, checks for non-null values. + """ + isNull: Boolean +} + +""" +A filter to be used against Int fields. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphIntFilter { + """Checks for values not in this list.""" + notIn: [Int!] + + """Checks for values in this list.""" + in: [Int!] + + """Checks for values greater than or equal to this value.""" + greaterThanOrEqualTo: Int + + """Checks for values greater than this value.""" + greaterThan: Int + + """Checks for values less than or equal to this value.""" + lessThanOrEqualTo: Int + + """Checks for values less than this value.""" + lessThan: Int + + """ + Checks for values equal to this value, treating null like an ordinary value. + """ + notDistinctFrom: Int + + """ + Checks for values not equal to this value, treating null like an ordinary value. + """ + distinctFrom: Int + + """Checks for values not equal to this value.""" + notEqualTo: Int + + """Checks for values equal to this value.""" + equalTo: Int + + """ + If set to true, checks for null values. If set to false, checks for non-null values. + """ + isNull: Boolean +} + +""" +A filter to be used against `H1BApplication` object types. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphH1BApplicationFilter { + """Negates the expression.""" + not: ImmigrationGraphH1BApplicationFilter + + """Checks for any expressions in this list.""" + or: [ImmigrationGraphH1BApplicationFilter!] + + """Checks for all expressions in this list.""" + and: [ImmigrationGraphH1BApplicationFilter!] + + """Filter by the object’s `wageLevel` field.""" + wageLevel: ImmigrationGraphIntFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `preparerId` field.""" + preparerId: ImmigrationGraphUUIDFilter + + """Filter by the object’s `employerPocId` field.""" + employerPocId: ImmigrationGraphUUIDFilter + + """Filter by the object’s `employerId` field.""" + employerId: ImmigrationGraphUUIDFilter + + """Filter by the object’s `attorneyId` field.""" + attorneyId: ImmigrationGraphUUIDFilter + + """Filter by the object’s `employmentEndDate` field.""" + employmentEndDate: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `employmentStartDate` field.""" + employmentStartDate: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `wageRangePeriod` field.""" + wageRangePeriod: ImmigrationGraphWageRangeUnitOfPayEnumFilter + + """Filter by the object’s `wageRangeMax` field.""" + wageRangeMax: ImmigrationGraphFloatFilter + + """Filter by the object’s `wageRangeMin` field.""" + wageRangeMin: ImmigrationGraphFloatFilter + + """Filter by the object’s `occupationTitle` field.""" + occupationTitle: ImmigrationGraphStringFilter + + """Filter by the object’s `socCode` field.""" + socCode: ImmigrationGraphStringFilter + + """Filter by the object’s `jobTitle` field.""" + jobTitle: ImmigrationGraphStringFilter + + """Filter by the object’s `status` field.""" + status: ImmigrationGraphH1BApplicationCaseStatusFilter + + """Filter by the object’s `icertId` field.""" + icertId: ImmigrationGraphIntFilter + + """Filter by the object’s `caseNumber` field.""" + caseNumber: ImmigrationGraphStringFilter + + """Filter by the object’s `id` field.""" + id: ImmigrationGraphUUIDFilter +} + +""" +A condition to be used against `H1BApplication` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input ImmigrationGraphH1BApplicationCondition { + """Checks for equality with the object’s `wageLevel` field.""" + wageLevel: Int + + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: String + + """Checks for equality with the object’s `createdAt` field.""" + createdAt: String + + """Checks for equality with the object’s `preparerId` field.""" + preparerId: String + + """Checks for equality with the object’s `employerPocId` field.""" + employerPocId: String + + """Checks for equality with the object’s `employerId` field.""" + employerId: String + + """Checks for equality with the object’s `attorneyId` field.""" + attorneyId: String + + """Checks for equality with the object’s `employmentEndDate` field.""" + employmentEndDate: String + + """Checks for equality with the object’s `employmentStartDate` field.""" + employmentStartDate: String + + """Checks for equality with the object’s `wageRangePeriod` field.""" + wageRangePeriod: ImmigrationGraphWageRangeUnitOfPayEnum + + """Checks for equality with the object’s `wageRangeMax` field.""" + wageRangeMax: Float + + """Checks for equality with the object’s `wageRangeMin` field.""" + wageRangeMin: Float + + """Checks for equality with the object’s `occupationTitle` field.""" + occupationTitle: String + + """Checks for equality with the object’s `socCode` field.""" + socCode: String + + """Checks for equality with the object’s `jobTitle` field.""" + jobTitle: String + + """Checks for equality with the object’s `status` field.""" + status: ImmigrationGraphH1BApplicationCaseStatus + + """Checks for equality with the object’s `icertId` field.""" + icertId: Int + + """Checks for equality with the object’s `caseNumber` field.""" + caseNumber: String + + """Checks for equality with the object’s `id` field.""" + id: String +} + +enum ImmigrationGraphH1BApplicationsOrderBy { + NATURAL + ID_ASC + ID_DESC + CASE_NUMBER_ASC + CASE_NUMBER_DESC + ICERT_ID_ASC + ICERT_ID_DESC + STATUS_ASC + STATUS_DESC + JOB_TITLE_ASC + JOB_TITLE_DESC + SOC_CODE_ASC + SOC_CODE_DESC + OCCUPATION_TITLE_ASC + OCCUPATION_TITLE_DESC + WAGE_RANGE_MIN_ASC + WAGE_RANGE_MIN_DESC + WAGE_RANGE_MAX_ASC + WAGE_RANGE_MAX_DESC + WAGE_RANGE_PERIOD_ASC + WAGE_RANGE_PERIOD_DESC + EMPLOYMENT_START_DATE_ASC + EMPLOYMENT_START_DATE_DESC + EMPLOYMENT_END_DATE_ASC + EMPLOYMENT_END_DATE_DESC + ATTORNEY_ID_ASC + ATTORNEY_ID_DESC + EMPLOYER_ID_ASC + EMPLOYER_ID_DESC + EMPLOYER_POC_ID_ASC + EMPLOYER_POC_ID_DESC + PREPARER_ID_ASC + PREPARER_ID_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + WAGE_LEVEL_ASC + WAGE_LEVEL_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""""" +type ImmigrationGraphPreparer implements OneGraphNode & ImmigrationGraphNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + lastName: String + + """""" + firstName: String + + """""" + firmId: String + + """""" + email: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """Reads a single `Firm` that is related to this `Preparer`.""" + firmByFirmId: ImmigrationGraphFirm + + """Reads and enables pagination through a set of `H1BApplication`.""" + h1BApplicationsByPreparerId( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphH1BApplicationFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphH1BApplicationCondition + + """The method to use when ordering `H1BApplication`.""" + orderBy: [ImmigrationGraphH1BApplicationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphH1BApplicationsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `Preparer` values.""" +type ImmigrationGraphPreparersConnection { + """A list of `Preparer` objects.""" + nodes: [ImmigrationGraphPreparer!]! + + """ + A list of edges which contains the `Preparer` and cursor to aid in pagination. + """ + edges: [ImmigrationGraphPreparersEdge!]! + + """Information to aid in pagination.""" + pageInfo: ImmigrationGraphPageInfo! + + """The count of *all* `Preparer` you could get from the connection.""" + totalCount: Int +} + +""" +A filter to be used against Datetime fields. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphDatetimeFilter { + """Checks for values not in this list.""" + notIn: [String!] + + """Checks for values in this list.""" + in: [String!] + + """Checks for values greater than or equal to this value.""" + greaterThanOrEqualTo: String + + """Checks for values greater than this value.""" + greaterThan: String + + """Checks for values less than or equal to this value.""" + lessThanOrEqualTo: String + + """Checks for values less than this value.""" + lessThan: String + + """ + Checks for values equal to this value, treating null like an ordinary value. + """ + notDistinctFrom: String + + """ + Checks for values not equal to this value, treating null like an ordinary value. + """ + distinctFrom: String + + """Checks for values not equal to this value.""" + notEqualTo: String + + """Checks for values equal to this value.""" + equalTo: String + + """ + If set to true, checks for null values. If set to false, checks for non-null values. + """ + isNull: Boolean +} + +""" +A filter to be used against String fields. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphStringFilter { + """Raw SQL 'not similar to', wildcards are not escaped""" + notSimilarTo: String + + """Raw SQL 'similar to', wildcards are not escaped""" + similarTo: String + + """Raw SQL 'not ilike', wildcards must be present and are not escaped""" + notLikeInsensitive: String + + """Raw SQL 'ilike', wildcards must be present and are not escaped""" + likeInsensitive: String + + """Raw SQL 'not like', wildcards must be present and are not escaped""" + notLike: String + + """Raw SQL 'like', wildcards must be present and are not escaped""" + like: String + + """Checks for strings that do not end with this value. Case insensitive.""" + notEndsWithInsensitive: String + + """Checks for strings ending with this value. Case insensitive.""" + endsWithInsensitive: String + + """Checks for strings that do not end with this value. Case sensitive.""" + notEndsWith: String + + """Checks for strings ending with this value. Case sensitive.""" + endsWith: String + + """ + Checks for strings that do not start with this value. Case insensitive. + """ + notStartsWithInsensitive: String + + """Checks for strings starting with this value. Case insensitive.""" + startsWithInsensitive: String + + """Checks for strings that do not start with this value. Case sensitive.""" + notStartsWith: String + + """Checks for strings starting with this value. Case sensitive.""" + startsWith: String + + """ + Checks for strings that do not not include this value. Case insensitive. + """ + notIncludesInsensitive: String + + """Checks for strings that include this value. Case insensitive.""" + includesInsensitive: String + + """Checks for strings that do not include this value. Case sensitive.""" + notIncludes: String + + """Checks for strings that include this value. Case sensitive.""" + includes: String + + """Checks for values not in this list.""" + notIn: [String!] + + """Checks for values in this list.""" + in: [String!] + + """Checks for values greater than or equal to this value.""" + greaterThanOrEqualTo: String + + """Checks for values greater than this value.""" + greaterThan: String + + """Checks for values less than or equal to this value.""" + lessThanOrEqualTo: String + + """Checks for values less than this value.""" + lessThan: String + + """ + Checks for values equal to this value, treating null like an ordinary value. + """ + notDistinctFrom: String + + """ + Checks for values not equal to this value, treating null like an ordinary value. + """ + distinctFrom: String + + """Checks for values not equal to this value.""" + notEqualTo: String + + """Checks for values equal to this value.""" + equalTo: String + + """ + If set to true, checks for null values. If set to false, checks for non-null values. + """ + isNull: Boolean +} + +""" +A filter to be used against UUID fields. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphUUIDFilter { + """Checks for values not in this list.""" + notIn: [String!] + + """Checks for values in this list.""" + in: [String!] + + """ + Checks for values equal to this value, treating null like an ordinary value. + """ + notDistinctFrom: String + + """ + Checks for values not equal to this value, treating null like an ordinary value. + """ + distinctFrom: String + + """Checks for values not equal to this value.""" + notEqualTo: String + + """Checks for values equal to this value.""" + equalTo: String + + """ + If set to true, checks for null values. If set to false, checks for non-null values. + """ + isNull: Boolean +} + +""" +A filter to be used against `Attorney` object types. All fields are combined with a logical ‘and.’ +""" +input ImmigrationGraphAttorneyFilter { + """Negates the expression.""" + not: ImmigrationGraphAttorneyFilter + + """Checks for any expressions in this list.""" + or: [ImmigrationGraphAttorneyFilter!] + + """Checks for all expressions in this list.""" + and: [ImmigrationGraphAttorneyFilter!] + + """Filter by the object’s `updatedAt` field.""" + updatedAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: ImmigrationGraphDatetimeFilter + + """Filter by the object’s `courtOfHighestGoodStanding` field.""" + courtOfHighestGoodStanding: ImmigrationGraphStringFilter + + """Filter by the object’s `stateOfHighestGoodStanding` field.""" + stateOfHighestGoodStanding: ImmigrationGraphStringFilter + + """Filter by the object’s `stateBarNumber` field.""" + stateBarNumber: ImmigrationGraphStringFilter + + """Filter by the object’s `firmId` field.""" + firmId: ImmigrationGraphUUIDFilter + + """Filter by the object’s `email` field.""" + email: ImmigrationGraphStringFilter + + """Filter by the object’s `telephoneExtension` field.""" + telephoneExtension: ImmigrationGraphStringFilter + + """Filter by the object’s `telephone` field.""" + telephone: ImmigrationGraphStringFilter + + """Filter by the object’s `addressProvince` field.""" + addressProvince: ImmigrationGraphStringFilter + + """Filter by the object’s `addressCountry` field.""" + addressCountry: ImmigrationGraphStringFilter + + """Filter by the object’s `addressPostalCode` field.""" + addressPostalCode: ImmigrationGraphStringFilter + + """Filter by the object’s `addressState` field.""" + addressState: ImmigrationGraphStringFilter + + """Filter by the object’s `addressCity` field.""" + addressCity: ImmigrationGraphStringFilter + + """Filter by the object’s `addressLine2` field.""" + addressLine2: ImmigrationGraphStringFilter + + """Filter by the object’s `addressLine1` field.""" + addressLine1: ImmigrationGraphStringFilter + + """Filter by the object’s `firstName` field.""" + firstName: ImmigrationGraphStringFilter + + """Filter by the object’s `lastName` field.""" + lastName: ImmigrationGraphStringFilter + + """Filter by the object’s `id` field.""" + id: ImmigrationGraphUUIDFilter +} + +""" +A condition to be used against `Attorney` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input ImmigrationGraphAttorneyCondition { + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: String + + """Checks for equality with the object’s `createdAt` field.""" + createdAt: String + + """ + Checks for equality with the object’s `courtOfHighestGoodStanding` field. + """ + courtOfHighestGoodStanding: String + + """ + Checks for equality with the object’s `stateOfHighestGoodStanding` field. + """ + stateOfHighestGoodStanding: String + + """Checks for equality with the object’s `stateBarNumber` field.""" + stateBarNumber: String + + """Checks for equality with the object’s `firmId` field.""" + firmId: String + + """Checks for equality with the object’s `email` field.""" + email: String + + """Checks for equality with the object’s `telephoneExtension` field.""" + telephoneExtension: String + + """Checks for equality with the object’s `telephone` field.""" + telephone: String + + """Checks for equality with the object’s `addressProvince` field.""" + addressProvince: String + + """Checks for equality with the object’s `addressCountry` field.""" + addressCountry: String + + """Checks for equality with the object’s `addressPostalCode` field.""" + addressPostalCode: String + + """Checks for equality with the object’s `addressState` field.""" + addressState: String + + """Checks for equality with the object’s `addressCity` field.""" + addressCity: String + + """Checks for equality with the object’s `addressLine2` field.""" + addressLine2: String + + """Checks for equality with the object’s `addressLine1` field.""" + addressLine1: String + + """Checks for equality with the object’s `firstName` field.""" + firstName: String + + """Checks for equality with the object’s `lastName` field.""" + lastName: String + + """Checks for equality with the object’s `id` field.""" + id: String +} + +enum ImmigrationGraphAttorneysOrderBy { + NATURAL + ID_ASC + ID_DESC + LAST_NAME_ASC + LAST_NAME_DESC + FIRST_NAME_ASC + FIRST_NAME_DESC + ADDRESS_LINE_1_ASC + ADDRESS_LINE_1_DESC + ADDRESS_LINE_2_ASC + ADDRESS_LINE_2_DESC + ADDRESS_CITY_ASC + ADDRESS_CITY_DESC + ADDRESS_STATE_ASC + ADDRESS_STATE_DESC + ADDRESS_POSTAL_CODE_ASC + ADDRESS_POSTAL_CODE_DESC + ADDRESS_COUNTRY_ASC + ADDRESS_COUNTRY_DESC + ADDRESS_PROVINCE_ASC + ADDRESS_PROVINCE_DESC + TELEPHONE_ASC + TELEPHONE_DESC + TELEPHONE_EXTENSION_ASC + TELEPHONE_EXTENSION_DESC + EMAIL_ASC + EMAIL_DESC + FIRM_ID_ASC + FIRM_ID_DESC + STATE_BAR_NUMBER_ASC + STATE_BAR_NUMBER_DESC + STATE_OF_HIGHEST_GOOD_STANDING_ASC + STATE_OF_HIGHEST_GOOD_STANDING_DESC + COURT_OF_HIGHEST_GOOD_STANDING_ASC + COURT_OF_HIGHEST_GOOD_STANDING_DESC + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""Information about pagination in a connection.""" +type ImmigrationGraphPageInfo { + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: String + + """When paginating forwards, the cursor to continue.""" + endCursor: String +} + +"""A `Attorney` edge in the connection.""" +type ImmigrationGraphAttorneysEdge { + """A cursor for use in pagination.""" + cursor: String + + """The `Attorney` at the end of the edge.""" + node: ImmigrationGraphAttorney! +} + +"""A connection to a list of `Attorney` values.""" +type ImmigrationGraphAttorneysConnection { + """A list of `Attorney` objects.""" + nodes: [ImmigrationGraphAttorney!]! + + """ + A list of edges which contains the `Attorney` and cursor to aid in pagination. + """ + edges: [ImmigrationGraphAttorneysEdge!]! + + """Information to aid in pagination.""" + pageInfo: ImmigrationGraphPageInfo! + + """The count of *all* `Attorney` you could get from the connection.""" + totalCount: Int +} + +"""""" +type ImmigrationGraphFirm implements OneGraphNode & ImmigrationGraphNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + name: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """Reads and enables pagination through a set of `Attorney`.""" + attorneysByFirmId( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphAttorneyFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphAttorneyCondition + + """The method to use when ordering `Attorney`.""" + orderBy: [ImmigrationGraphAttorneysOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphAttorneysConnection! + + """Reads and enables pagination through a set of `Preparer`.""" + preparersByFirmId( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphPreparerFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphPreparerCondition + + """The method to use when ordering `Preparer`.""" + orderBy: [ImmigrationGraphPreparersOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphPreparersConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type ImmigrationGraphAttorney implements OneGraphNode & ImmigrationGraphNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + lastName: String + + """""" + firstName: String + + """""" + addressLine1: String + + """""" + addressLine2: String + + """""" + addressCity: String + + """""" + addressState: String + + """""" + addressPostalCode: String + + """""" + addressCountry: String + + """""" + addressProvince: String + + """""" + telephone: String + + """""" + telephoneExtension: String + + """""" + email: String + + """""" + firmId: String + + """""" + stateBarNumber: String + + """""" + stateOfHighestGoodStanding: String + + """""" + courtOfHighestGoodStanding: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """Reads a single `Firm` that is related to this `Attorney`.""" + firmByFirmId: ImmigrationGraphFirm + + """Reads and enables pagination through a set of `H1BApplication`.""" + h1BApplicationsByAttorneyId( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphH1BApplicationFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphH1BApplicationCondition + + """The method to use when ordering `H1BApplication`.""" + orderBy: [ImmigrationGraphH1BApplicationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphH1BApplicationsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum ImmigrationGraphWageRangeUnitOfPayEnum { + YEAR + HOUR + MONTH + BI_WEEKLY + WEEK + WEEKLY +} + +enum ImmigrationGraphH1BApplicationCaseStatus { + CERTIFIED_WITHDRAWN + WITHDRAWN + CERTIFIED + DENIED + PENDING + VOIDED + IN_PROCESS + REJECTED + CERTIFIED_MAIL_NOT_SENT + ANALYST_REVIEW_ASSIGNED + PENDING_CO_DECISION_UNASSIGNED + PENDING_QUALITY_AND_COMPLIANCE_REVIEW_UNASSIGNED + ANALYST_REVIEW_UNASSIGNED + CO_DECISION_ISSUED_PENDING_ANALYST_DENIAL +} + +"""""" +type ImmigrationGraphH1BApplication implements OneGraphNode & ImmigrationGraphNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + caseNumber: String + + """""" + icertId: Int + + """""" + status: ImmigrationGraphH1BApplicationCaseStatus + + """""" + jobTitle: String + + """""" + socCode: String + + """""" + occupationTitle: String + + """""" + wageRangeMin: Float + + """""" + wageRangeMax: Float + + """""" + wageRangePeriod: ImmigrationGraphWageRangeUnitOfPayEnum + + """""" + employmentStartDate: String + + """""" + employmentEndDate: String + + """""" + attorneyId: String + + """""" + employerId: String + + """""" + employerPocId: String + + """""" + preparerId: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + wageLevel: Int + + """Reads a single `Attorney` that is related to this `H1BApplication`.""" + attorneyByAttorneyId: ImmigrationGraphAttorney + + """Reads a single `Employer` that is related to this `H1BApplication`.""" + employerByEmployerId: ImmigrationGraphEmployer + + """Reads a single `EmployerPoc` that is related to this `H1BApplication`.""" + employerPocByEmployerPocId: ImmigrationGraphEmployerPoc + + """Reads a single `Preparer` that is related to this `H1BApplication`.""" + preparerByPreparerId: ImmigrationGraphPreparer + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A connection to a list of `H1BApplication` values.""" +type ImmigrationGraphH1BApplicationsConnection { + """A list of `H1BApplication` objects.""" + nodes: [ImmigrationGraphH1BApplication!]! + + """ + A list of edges which contains the `H1BApplication` and cursor to aid in pagination. + """ + edges: [ImmigrationGraphH1BApplicationsEdge!]! + + """Information to aid in pagination.""" + pageInfo: ImmigrationGraphPageInfo! + + """The count of *all* `H1BApplication` you could get from the connection.""" + totalCount: Int +} + +"""""" +type ImmigrationGraphEmployerPoc implements OneGraphNode & ImmigrationGraphNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + id: String! + + """""" + lastName: String + + """""" + firstName: String + + """""" + addressLine1: String + + """""" + addressLine2: String + + """""" + addressCity: String + + """""" + addressState: String + + """""" + addressPostalCode: String + + """""" + addressCountry: String + + """""" + addressProvince: String + + """""" + telephone: String + + """""" + telephoneExtension: String + + """""" + email: String + + """""" + createdAt: String + + """""" + updatedAt: String + + """""" + jobTitle: String + + """Reads and enables pagination through a set of `H1BApplication`.""" + h1BApplicationsByEmployerPocId( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: ImmigrationGraphH1BApplicationFilter + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ImmigrationGraphH1BApplicationCondition + + """The method to use when ordering `H1BApplication`.""" + orderBy: [ImmigrationGraphH1BApplicationsOrderBy!] + + """Read all values in the set after (below) this cursor.""" + after: String + + """Read all values in the set before (above) this cursor.""" + before: String + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor based pagination. May not be used with `last`. + """ + offset: Int + + """Only read the last `n` values of the set.""" + last: Int + + """Only read the first `n` values of the set.""" + first: Int + ): ImmigrationGraphH1BApplicationsConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An object with a globally unique `ID`.""" +interface ImmigrationGraphNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! +} + +enum ImmigrationGraphScrapingStatusMigrateStatus { + NOT_MIGRATED + MIGRATING + MIGRATED +} + +enum ImmigrationGraphParsingStatusEnum { + PARSED + NOT_PARSED + PARSING +} + +enum ImmigrationGraphFetchingStatusEnum { + NOT_FETCHED + FETCHING + FETCHED +} + +"""""" +type ImmigrationGraphScrapingStatus implements OneGraphNode & ImmigrationGraphNode { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + + """""" + icertId: Int! + + """""" + fetchingStatus: ImmigrationGraphFetchingStatusEnum! + + """""" + createdAt: String! + + """""" + updatedAt: String! + + """""" + lastFetchTime: String + + """""" + scraperVersion: Int + + """""" + caseNumber: String + + """""" + caseStatus: String + + """""" + jobTitle: String + + """""" + socCode: String + + """""" + occupationTitle: String + + """""" + employmentBeginDate: String + + """""" + employmentEndDate: String + + """""" + employerBusinessName: String + + """""" + employerTradeName: String + + """""" + employerAddressOne: String + + """""" + employerAddressTwo: String + + """""" + employerCity: String + + """""" + employerState: String + + """""" + employerPostalCode: String + + """""" + employerCountry: String + + """""" + employerProvince: String + + """""" + employerTelephoneNumber: String + + """""" + employerTelephoneExtension: String + + """""" + employerNaicsCode: String + + """""" + employerPocFamilyName: String + + """""" + employerPocGivenName: String + + """""" + employerPocMiddleName: String + + """""" + employerPocAddressOne: String + + """""" + employerPocAddressTwo: String + + """""" + employerPocCity: String + + """""" + employerPocState: String + + """""" + employerPocPostalCode: String + + """""" + employerPocCountry: String + + """""" + employerPocProvince: String + + """""" + employerPocTelephoneNumber: String + + """""" + employerPocTelephoneExtension: String + + """""" + employerPocEmail: String + + """""" + attorneyFamilyName: String + + """""" + attorneyGivenName: String + + """""" + attorneyMiddleName: String + + """""" + attorneyAddressOne: String + + """""" + attorneyAddressTwo: String + + """""" + attorneyCity: String + + """""" + attorneyState: String + + """""" + attorneyPostalCode: String + + """""" + attorneyCountry: String + + """""" + attorneyProvince: String + + """""" + attorneyTelephoneNumber: String + + """""" + attorneyTelephoneExtension: String + + """""" + attorneyEmail: String + + """""" + attorneyFirmName: String + + """""" + attorneyStateBarNumber: String + + """""" + attorneyStateOfHighestGoodStanding: String + + """""" + attorneyCourtOfHighestGoodStanding: String + + """""" + wageRangePeriod: String + + """""" + preparerFamilyName: String + + """""" + preparerGivenName: String + + """""" + preparerMiddleInitial: String + + """""" + preparerFirm: String + + """""" + preparerEmail: String + + """""" + wageRangeFrom: String + + """""" + wageRangeTo: String + + """""" + parsingStatus: ImmigrationGraphParsingStatusEnum + + """""" + migrateStatus: ImmigrationGraphScrapingStatusMigrateStatus! + + """""" + migrateVersion: Int + + """""" + migratedAt: String + + """""" + employerPocJobTitle: String + + """""" + lastParseTime: String + + """""" + needsParse: Boolean + + """""" + needsMigrationToApplication: Boolean + + """""" + wageLevel: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubEnterpriseUserAccountEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubEnterpriseUserAccount +} + +"""The connection type for EnterpriseUserAccount.""" +type GitHubEnterpriseUserAccountConnection { + """A list of edges.""" + edges: [GitHubEnterpriseUserAccountEdge] + + """A list of nodes.""" + nodes: [GitHubEnterpriseUserAccount] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubEnterpriseEnabledSettingValue { + """The setting is enabled for organizations in the enterprise.""" + ENABLED + + """There is no policy set for organizations in the enterprise.""" + NO_POLICY +} + +enum GitHubIdentityProviderConfigurationState { + """Authentication with an identity provider is configured and enforced.""" + ENFORCED + + """ + Authentication with an identity provider is configured but not enforced. + """ + CONFIGURED + + """Authentication with an identity provider is not configured.""" + UNCONFIGURED +} + +enum GitHubSamlSignatureAlgorithm { + """RSA-SHA1""" + RSA_SHA1 + + """RSA-SHA256""" + RSA_SHA256 + + """RSA-SHA384""" + RSA_SHA384 + + """RSA-SHA512""" + RSA_SHA512 +} + +enum GitHubSamlDigestAlgorithm { + """SHA1""" + SHA1 + + """SHA256""" + SHA256 + + """SHA384""" + SHA384 + + """SHA512""" + SHA512 +} + +""" +An identity provider configured to provision identities for an enterprise. +""" +type GitHubEnterpriseIdentityProvider implements OneGraphNode & GitHubNode { + """ + The digest algorithm used to sign SAML requests for the identity provider. + """ + digestMethod: GitHubSamlDigestAlgorithm + + """The enterprise this identity provider belongs to.""" + enterprise: GitHubEnterprise + + """ExternalIdentities provisioned by this identity provider.""" + externalIdentities( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubExternalIdentityConnection! + + """""" + id: ID! + + """ + The x509 certificate used by the identity provider to sign assertions and responses. + """ + idpCertificate: String + + """The Issuer Entity ID for the SAML identity provider.""" + issuer: String + + """ + Recovery codes that can be used by admins to access the enterprise if the identity provider is unavailable. + """ + recoveryCodes: [String!] + + """ + The signature algorithm used to sign SAML requests for the identity provider. + """ + signatureMethod: GitHubSamlSignatureAlgorithm + + """The URL endpoint for the identity provider's SAML SSO.""" + ssoUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An invitation to be a member in an enterprise organization.""" +type GitHubEnterprisePendingMemberInvitationEdge { + """A cursor for use in pagination.""" + cursor: String! + + """Whether the invitation has a license for the enterprise.""" + isUnlicensed: Boolean! + + """The item at the end of the edge.""" + node: GitHubOrganizationInvitation +} + +"""The connection type for OrganizationInvitation.""" +type GitHubEnterprisePendingMemberInvitationConnection { + """A list of edges.""" + edges: [GitHubEnterprisePendingMemberInvitationEdge] + + """A list of nodes.""" + nodes: [GitHubOrganizationInvitation] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! + + """Identifies the total count of unique users in the connection.""" + totalUniqueUserCount: Int! +} + +enum GitHubRepositoryInvitationOrderField { + """Order repository invitations by creation time""" + CREATED_AT + + """Order repository invitations by invitee login""" + INVITEE_LOGIN +} + +"""Ordering options for repository invitation connections.""" +input GitHubRepositoryInvitationOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order repository invitations by.""" + field: GitHubRepositoryInvitationOrderField! +} + +""" +A user with an invitation to be a collaborator on a repository owned by an organization in an enterprise. +""" +type GitHubEnterprisePendingCollaboratorEdge { + """A cursor for use in pagination.""" + cursor: String! + + """ + Whether the invited collaborator does not have a license for the enterprise. + """ + isUnlicensed: Boolean! + + """The item at the end of the edge.""" + node: GitHubUser + + """The enterprise organization repositories this user is a member of.""" + repositories( + """Ordering options for repositories.""" + orderBy: GitHubRepositoryOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubEnterpriseRepositoryInfoConnection! +} + +"""The connection type for User.""" +type GitHubEnterprisePendingCollaboratorConnection { + """A list of edges.""" + edges: [GitHubEnterprisePendingCollaboratorEdge] + + """A list of nodes.""" + nodes: [GitHubUser] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubEnterpriseAdministratorInvitationOrderField { + """Order enterprise administrator member invitations by creation time""" + CREATED_AT +} + +"""Ordering options for enterprise administrator invitation connections""" +input GitHubEnterpriseAdministratorInvitationOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order enterprise administrator invitations by.""" + field: GitHubEnterpriseAdministratorInvitationOrderField! +} + +""" +An invitation for a user to become an owner or billing manager of an enterprise. +""" +type GitHubEnterpriseAdministratorInvitation implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The email of the person who was invited to the enterprise.""" + email: String + + """The enterprise the invitation is for.""" + enterprise: GitHubEnterprise! + + """""" + id: ID! + + """The user who was invited to the enterprise.""" + invitee: GitHubUser + + """The user who created the invitation.""" + inviter: GitHubUser + + """ + The invitee's pending role in the enterprise (owner or billing_manager). + """ + role: GitHubEnterpriseAdministratorRole! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubEnterpriseAdministratorInvitationEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubEnterpriseAdministratorInvitation +} + +"""The connection type for EnterpriseAdministratorInvitation.""" +type GitHubEnterpriseAdministratorInvitationConnection { + """A list of edges.""" + edges: [GitHubEnterpriseAdministratorInvitationEdge] + + """A list of nodes.""" + nodes: [GitHubEnterpriseAdministratorInvitation] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubRepositoryVisibility { + """The repository is visible only to those with explicit access.""" + PRIVATE + + """The repository is visible to everyone.""" + PUBLIC + + """The repository is visible only to users in the same business.""" + INTERNAL +} + +"""A subset of repository information queryable from an enterprise.""" +type GitHubEnterpriseRepositoryInfo implements OneGraphNode & GitHubNode { + """""" + id: ID! + + """Identifies if the repository is private.""" + isPrivate: Boolean! + + """The repository's name.""" + name: String! + + """The repository's name with owner.""" + nameWithOwner: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubEnterpriseRepositoryInfoEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubEnterpriseRepositoryInfo +} + +"""The connection type for EnterpriseRepositoryInfo.""" +type GitHubEnterpriseRepositoryInfoConnection { + """A list of edges.""" + edges: [GitHubEnterpriseRepositoryInfoEdge] + + """A list of nodes.""" + nodes: [GitHubEnterpriseRepositoryInfo] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +A User who is an outside collaborator of an enterprise through one or more organizations. +""" +type GitHubEnterpriseOutsideCollaboratorEdge { + """A cursor for use in pagination.""" + cursor: String! + + """ + Whether the outside collaborator does not have a license for the enterprise. + """ + isUnlicensed: Boolean! + + """The item at the end of the edge.""" + node: GitHubUser + + """The enterprise organization repositories this user is a member of.""" + repositories( + """Ordering options for repositories.""" + orderBy: GitHubRepositoryOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubEnterpriseRepositoryInfoConnection! +} + +"""The connection type for User.""" +type GitHubEnterpriseOutsideCollaboratorConnection { + """A list of edges.""" + edges: [GitHubEnterpriseOutsideCollaboratorEdge] + + """A list of nodes.""" + nodes: [GitHubUser] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubEnterpriseMembersCanMakePurchasesSettingValue { + """The setting is enabled for organizations in the enterprise.""" + ENABLED + + """The setting is disabled for organizations in the enterprise.""" + DISABLED +} + +enum GitHubOrganizationMembersCanCreateRepositoriesSettingValue { + """Members will be able to create public and private repositories.""" + ALL + + """Members will be able to create only private repositories.""" + PRIVATE + + """Members will not be able to create public or private repositories.""" + DISABLED +} + +enum GitHubEnterpriseMembersCanCreateRepositoriesSettingValue { + """ + Organization administrators choose whether to allow members to create repositories. + """ + NO_POLICY + + """Members will be able to create public and private repositories.""" + ALL + + """Members will be able to create only public repositories.""" + PUBLIC + + """Members will be able to create only private repositories.""" + PRIVATE + + """Members will not be able to create public or private repositories.""" + DISABLED +} + +enum GitHubIpAllowListEntryOrderField { + """Order IP allow list entries by creation time.""" + CREATED_AT + + """Order IP allow list entries by the allow list value.""" + ALLOW_LIST_VALUE +} + +"""Ordering options for IP allow list entry connections.""" +input GitHubIpAllowListEntryOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order IP allow list entries by.""" + field: GitHubIpAllowListEntryOrderField! +} + +"""An edge in a connection.""" +type GitHubIpAllowListEntryEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubIpAllowListEntry +} + +"""The connection type for IpAllowListEntry.""" +type GitHubIpAllowListEntryConnection { + """A list of edges.""" + edges: [GitHubIpAllowListEntryEdge] + + """A list of nodes.""" + nodes: [GitHubIpAllowListEntry] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubIpAllowListEnabledSettingValue { + """The setting is enabled for the owner.""" + ENABLED + + """The setting is disabled for the owner.""" + DISABLED +} + +enum GitHubEnterpriseServerInstallationOrderField { + """Order Enterprise Server installations by host name""" + HOST_NAME + + """Order Enterprise Server installations by customer name""" + CUSTOMER_NAME + + """Order Enterprise Server installations by creation time""" + CREATED_AT +} + +"""Ordering options for Enterprise Server installation connections.""" +input GitHubEnterpriseServerInstallationOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order Enterprise Server installations by.""" + field: GitHubEnterpriseServerInstallationOrderField! +} + +enum GitHubEnterpriseServerUserAccountsUploadOrderField { + """Order user accounts uploads by creation time""" + CREATED_AT +} + +""" +Ordering options for Enterprise Server user accounts upload connections. +""" +input GitHubEnterpriseServerUserAccountsUploadOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order user accounts uploads by.""" + field: GitHubEnterpriseServerUserAccountsUploadOrderField! +} + +enum GitHubEnterpriseServerUserAccountsUploadSyncState { + """The synchronization of the upload is pending.""" + PENDING + + """The synchronization of the upload succeeded.""" + SUCCESS + + """The synchronization of the upload failed.""" + FAILURE +} + +"""A user accounts upload from an Enterprise Server installation.""" +type GitHubEnterpriseServerUserAccountsUpload implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The enterprise to which this upload belongs.""" + enterprise: GitHubEnterprise! + + """ + The Enterprise Server installation for which this upload was generated. + """ + enterpriseServerInstallation: GitHubEnterpriseServerInstallation! + + """""" + id: ID! + + """The name of the file uploaded.""" + name: String! + + """The synchronization state of the upload""" + syncState: GitHubEnterpriseServerUserAccountsUploadSyncState! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubEnterpriseServerUserAccountsUploadEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubEnterpriseServerUserAccountsUpload +} + +"""The connection type for EnterpriseServerUserAccountsUpload.""" +type GitHubEnterpriseServerUserAccountsUploadConnection { + """A list of edges.""" + edges: [GitHubEnterpriseServerUserAccountsUploadEdge] + + """A list of nodes.""" + nodes: [GitHubEnterpriseServerUserAccountsUpload] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubEnterpriseServerUserAccountOrderField { + """Order user accounts by login""" + LOGIN + + """ + Order user accounts by creation time on the Enterprise Server installation + """ + REMOTE_CREATED_AT +} + +"""Ordering options for Enterprise Server user account connections.""" +input GitHubEnterpriseServerUserAccountOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order user accounts by.""" + field: GitHubEnterpriseServerUserAccountOrderField! +} + +enum GitHubEnterpriseServerUserAccountEmailOrderField { + """Order emails by email""" + EMAIL +} + +"""Ordering options for Enterprise Server user account email connections.""" +input GitHubEnterpriseServerUserAccountEmailOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order emails by.""" + field: GitHubEnterpriseServerUserAccountEmailOrderField! +} + +""" +An email belonging to a user account on an Enterprise Server installation. +""" +type GitHubEnterpriseServerUserAccountEmail implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The email address.""" + email: String! + + """""" + id: ID! + + """ + Indicates whether this is the primary email of the associated user account. + """ + isPrimary: Boolean! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The user account to which the email belongs.""" + userAccount: GitHubEnterpriseServerUserAccount! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubEnterpriseServerUserAccountEmailEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubEnterpriseServerUserAccountEmail +} + +"""The connection type for EnterpriseServerUserAccountEmail.""" +type GitHubEnterpriseServerUserAccountEmailConnection { + """A list of edges.""" + edges: [GitHubEnterpriseServerUserAccountEmailEdge] + + """A list of nodes.""" + nodes: [GitHubEnterpriseServerUserAccountEmail] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A user account on an Enterprise Server installation.""" +type GitHubEnterpriseServerUserAccount implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """User emails belonging to this user account.""" + emails( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Ordering options for Enterprise Server user account emails returned from the connection. + """ + orderBy: GitHubEnterpriseServerUserAccountEmailOrder + ): GitHubEnterpriseServerUserAccountEmailConnection! + + """The Enterprise Server installation on which this user account exists.""" + enterpriseServerInstallation: GitHubEnterpriseServerInstallation! + + """""" + id: ID! + + """ + Whether the user account is a site administrator on the Enterprise Server installation. + """ + isSiteAdmin: Boolean! + + """The login of the user account on the Enterprise Server installation.""" + login: String! + + """ + The profile name of the user account on the Enterprise Server installation. + """ + profileName: String + + """ + The date and time when the user account was created on the Enterprise Server installation. + """ + remoteCreatedAt: String! + + """The ID of the user account on the Enterprise Server installation.""" + remoteUserId: Int! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubEnterpriseServerUserAccountEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubEnterpriseServerUserAccount +} + +"""The connection type for EnterpriseServerUserAccount.""" +type GitHubEnterpriseServerUserAccountConnection { + """A list of edges.""" + edges: [GitHubEnterpriseServerUserAccountEdge] + + """A list of nodes.""" + nodes: [GitHubEnterpriseServerUserAccount] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An Enterprise Server installation.""" +type GitHubEnterpriseServerInstallation implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The customer name to which the Enterprise Server installation belongs.""" + customerName: String! + + """The host name of the Enterprise Server installation.""" + hostName: String! + + """""" + id: ID! + + """ + Whether or not the installation is connected to an Enterprise Server installation via GitHub Connect. + """ + isConnected: Boolean! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """User accounts on this Enterprise Server installation.""" + userAccounts( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Ordering options for Enterprise Server user accounts returned from the connection. + """ + orderBy: GitHubEnterpriseServerUserAccountOrder + ): GitHubEnterpriseServerUserAccountConnection! + + """User accounts uploads for the Enterprise Server installation.""" + userAccountsUploads( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Ordering options for Enterprise Server user accounts uploads returned from the connection. + """ + orderBy: GitHubEnterpriseServerUserAccountsUploadOrder + ): GitHubEnterpriseServerUserAccountsUploadConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubEnterpriseServerInstallationEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubEnterpriseServerInstallation +} + +"""The connection type for EnterpriseServerInstallation.""" +type GitHubEnterpriseServerInstallationConnection { + """A list of edges.""" + edges: [GitHubEnterpriseServerInstallationEdge] + + """A list of nodes.""" + nodes: [GitHubEnterpriseServerInstallation] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubEnterpriseDefaultRepositoryPermissionSettingValue { + """ + Organizations in the enterprise choose default repository permissions for their members. + """ + NO_POLICY + + """ + Organization members will be able to clone, pull, push, and add new collaborators to all organization repositories. + """ + ADMIN + + """ + Organization members will be able to clone, pull, and push all organization repositories. + """ + WRITE + + """ + Organization members will be able to clone and pull all organization repositories. + """ + READ + + """ + Organization members will only be able to clone and pull public repositories. + """ + NONE +} + +enum GitHubEnterpriseEnabledDisabledSettingValue { + """The setting is enabled for organizations in the enterprise.""" + ENABLED + + """The setting is disabled for organizations in the enterprise.""" + DISABLED + + """There is no policy set for organizations in the enterprise.""" + NO_POLICY +} + +enum GitHubEnterpriseAdministratorRole { + """Represents an owner of the enterprise account.""" + OWNER + + """Represents a billing manager of the enterprise account.""" + BILLING_MANAGER +} + +"""A User who is an administrator of an enterprise.""" +type GitHubEnterpriseAdministratorEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubUser + + """The role of the administrator.""" + role: GitHubEnterpriseAdministratorRole! +} + +"""The connection type for User.""" +type GitHubEnterpriseAdministratorConnection { + """A list of edges.""" + edges: [GitHubEnterpriseAdministratorEdge] + + """A list of nodes.""" + nodes: [GitHubUser] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Enterprise information only visible to enterprise owners.""" +type GitHubEnterpriseOwnerInfo { + """ + A list of enterprise organizations configured with the provided action execution capabilities setting value. + """ + actionExecutionCapabilitySettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """A list of all of the administrators for this enterprise.""" + admins( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for administrators returned from the connection.""" + orderBy: GitHubEnterpriseMemberOrder + + """The role to filter by.""" + role: GitHubEnterpriseAdministratorRole + + """The search string to look for.""" + query: String + ): GitHubEnterpriseAdministratorConnection! + + """ + A list of users in the enterprise who currently have two-factor authentication disabled. + """ + affiliatedUsersWithTwoFactorDisabled( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserConnection! + + """ + Whether or not affiliated users with two-factor authentication disabled exist in the enterprise. + """ + affiliatedUsersWithTwoFactorDisabledExist: Boolean! + + """ + The setting value for whether private repository forking is enabled for repositories in organizations in this enterprise. + """ + allowPrivateRepositoryForkingSetting: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + A list of enterprise organizations configured with the provided private repository forking setting value. + """ + allowPrivateRepositoryForkingSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: Boolean! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """ + The setting value for base repository permissions for organizations in this enterprise. + """ + defaultRepositoryPermissionSetting: GitHubEnterpriseDefaultRepositoryPermissionSettingValue! + + """ + A list of enterprise organizations configured with the provided default repository permission. + """ + defaultRepositoryPermissionSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The permission to find organizations for.""" + value: GitHubDefaultRepositoryPermissionField! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """Enterprise Server installations owned by the enterprise.""" + enterpriseServerInstallations( + """Ordering options for Enterprise Server installations returned.""" + orderBy: GitHubEnterpriseServerInstallationOrder + + """ + Whether or not to only return installations discovered via GitHub Connect. + """ + connectedOnly: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubEnterpriseServerInstallationConnection! + + """ + The setting value for whether the enterprise has an IP allow list enabled. + """ + ipAllowListEnabledSetting: GitHubIpAllowListEnabledSettingValue! + + """ + The IP addresses that are allowed to access resources owned by the enterprise. + """ + ipAllowListEntries( + """Ordering options for IP allow list entries returned.""" + orderBy: GitHubIpAllowListEntryOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubIpAllowListEntryConnection! + + """ + Whether or not the default repository permission is currently being updated. + """ + isUpdatingDefaultRepositoryPermission: Boolean! + + """ + Whether the two-factor authentication requirement is currently being enforced. + """ + isUpdatingTwoFactorRequirement: Boolean! + + """ + The setting value for whether organization members with admin permissions on a repository can change repository visibility. + """ + membersCanChangeRepositoryVisibilitySetting: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + A list of enterprise organizations configured with the provided can change repository visibility setting value. + """ + membersCanChangeRepositoryVisibilitySettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: Boolean! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """ + The setting value for whether members of organizations in the enterprise can create internal repositories. + """ + membersCanCreateInternalRepositoriesSetting: Boolean + + """ + The setting value for whether members of organizations in the enterprise can create private repositories. + """ + membersCanCreatePrivateRepositoriesSetting: Boolean + + """ + The setting value for whether members of organizations in the enterprise can create public repositories. + """ + membersCanCreatePublicRepositoriesSetting: Boolean + + """ + The setting value for whether members of organizations in the enterprise can create repositories. + """ + membersCanCreateRepositoriesSetting: GitHubEnterpriseMembersCanCreateRepositoriesSettingValue + + """ + A list of enterprise organizations configured with the provided repository creation setting value. + """ + membersCanCreateRepositoriesSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting to find organizations for.""" + value: GitHubOrganizationMembersCanCreateRepositoriesSettingValue! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """ + The setting value for whether members with admin permissions for repositories can delete issues. + """ + membersCanDeleteIssuesSetting: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + A list of enterprise organizations configured with the provided members can delete issues setting value. + """ + membersCanDeleteIssuesSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: Boolean! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """ + The setting value for whether members with admin permissions for repositories can delete or transfer repositories. + """ + membersCanDeleteRepositoriesSetting: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + A list of enterprise organizations configured with the provided members can delete repositories setting value. + """ + membersCanDeleteRepositoriesSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: Boolean! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """ + The setting value for whether members of organizations in the enterprise can invite outside collaborators. + """ + membersCanInviteCollaboratorsSetting: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + A list of enterprise organizations configured with the provided members can invite collaborators setting value. + """ + membersCanInviteCollaboratorsSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: Boolean! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """ + Indicates whether members of this enterprise's organizations can purchase additional services for those organizations. + """ + membersCanMakePurchasesSetting: GitHubEnterpriseMembersCanMakePurchasesSettingValue! + + """ + The setting value for whether members with admin permissions for repositories can update protected branches. + """ + membersCanUpdateProtectedBranchesSetting: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + A list of enterprise organizations configured with the provided members can update protected branches setting value. + """ + membersCanUpdateProtectedBranchesSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: Boolean! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """The setting value for whether members can view dependency insights.""" + membersCanViewDependencyInsightsSetting: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + A list of enterprise organizations configured with the provided members can view dependency insights setting value. + """ + membersCanViewDependencyInsightsSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: Boolean! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """ + The setting value for whether organization projects are enabled for organizations in this enterprise. + """ + organizationProjectsSetting: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + A list of enterprise organizations configured with the provided organization projects setting value. + """ + organizationProjectsSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: Boolean! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """ + A list of outside collaborators across the repositories in the enterprise. + """ + outsideCollaborators( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Only return outside collaborators on repositories with this visibility. + """ + visibility: GitHubRepositoryVisibility + + """ + Ordering options for outside collaborators returned from the connection. + """ + orderBy: GitHubEnterpriseMemberOrder + + """The search string to look for.""" + query: String + + """The login of one specific outside collaborator.""" + login: String + ): GitHubEnterpriseOutsideCollaboratorConnection! + + """A list of pending administrator invitations for the enterprise.""" + pendingAdminInvitations( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """The role to filter by.""" + role: GitHubEnterpriseAdministratorRole + + """ + Ordering options for pending enterprise administrator invitations returned from the connection. + """ + orderBy: GitHubEnterpriseAdministratorInvitationOrder + + """The search string to look for.""" + query: String + ): GitHubEnterpriseAdministratorInvitationConnection! + + """ + A list of pending collaborators across the repositories in the enterprise. + """ + pendingCollaborators( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Ordering options for pending repository collaborator invitations returned from the connection. + """ + orderBy: GitHubRepositoryInvitationOrder + + """The search string to look for.""" + query: String + ): GitHubEnterprisePendingCollaboratorConnection! + + """ + A list of pending member invitations for organizations in the enterprise. + """ + pendingMemberInvitations( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """The search string to look for.""" + query: String + ): GitHubEnterprisePendingMemberInvitationConnection! + + """ + The setting value for whether repository projects are enabled in this enterprise. + """ + repositoryProjectsSetting: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + A list of enterprise organizations configured with the provided repository projects setting value. + """ + repositoryProjectsSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: Boolean! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """The SAML Identity Provider for the enterprise.""" + samlIdentityProvider: GitHubEnterpriseIdentityProvider + + """ + A list of enterprise organizations configured with the SAML single sign-on setting value. + """ + samlIdentityProviderSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: GitHubIdentityProviderConfigurationState! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """ + The setting value for whether team discussions are enabled for organizations in this enterprise. + """ + teamDiscussionsSetting: GitHubEnterpriseEnabledDisabledSettingValue! + + """ + A list of enterprise organizations configured with the provided team discussions setting value. + """ + teamDiscussionsSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: Boolean! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """ + The setting value for whether the enterprise requires two-factor authentication for its organizations and users. + """ + twoFactorRequiredSetting: GitHubEnterpriseEnabledSettingValue! + + """ + A list of enterprise organizations configured with the two-factor authentication setting value. + """ + twoFactorRequiredSettingOrganizations( + """Ordering options for organizations with this setting.""" + orderBy: GitHubOrganizationOrder + + """The setting value to find organizations for.""" + value: Boolean! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! +} + +enum GitHubEnterpriseUserDeployment { + """The user is part of a GitHub Enterprise Cloud deployment.""" + CLOUD + + """The user is part of a GitHub Enterprise Server deployment.""" + SERVER +} + +enum GitHubEnterpriseMemberOrderField { + """Order enterprise members by login""" + LOGIN + + """Order enterprise members by creation time""" + CREATED_AT +} + +"""Ordering options for enterprise member connections.""" +input GitHubEnterpriseMemberOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order enterprise members by.""" + field: GitHubEnterpriseMemberOrderField! +} + +enum GitHubOrganizationOrderField { + """Order organizations by creation time""" + CREATED_AT + + """Order organizations by login""" + LOGIN +} + +"""Ordering options for organization connections.""" +input GitHubOrganizationOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order organizations by.""" + field: GitHubOrganizationOrderField! +} + +enum GitHubEnterpriseUserAccountMembershipRole { + """The user is a member of the enterprise membership.""" + MEMBER + + """The user is an owner of the enterprise membership.""" + OWNER +} + +"""An enterprise organization that a user is a member of.""" +type GitHubEnterpriseOrganizationMembershipEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubOrganization + + """The role of the user in the enterprise membership.""" + role: GitHubEnterpriseUserAccountMembershipRole! +} + +"""The connection type for Organization.""" +type GitHubEnterpriseOrganizationMembershipConnection { + """A list of edges.""" + edges: [GitHubEnterpriseOrganizationMembershipEdge] + + """A list of nodes.""" + nodes: [GitHubOrganization] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +An account for a user who is an admin of an enterprise or a member of an enterprise through one or more organizations. +""" +type GitHubEnterpriseUserAccount implements OneGraphNode & GitHubNode & GitHubActor { + """A URL pointing to the enterprise user account's public avatar.""" + avatarUrl( + """The size of the resulting square image.""" + size: Int + ): String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The enterprise in which this user account exists.""" + enterprise: GitHubEnterprise! + + """""" + id: ID! + + """ + An identifier for the enterprise user account, a login or email address + """ + login: String! + + """The name of the enterprise user account""" + name: String + + """A list of enterprise organizations this user is a member of.""" + organizations( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """The role of the user in the enterprise organization.""" + role: GitHubEnterpriseUserAccountMembershipRole + + """Ordering options for organizations returned from the connection.""" + orderBy: GitHubOrganizationOrder + + """The search string to look for.""" + query: String + ): GitHubEnterpriseOrganizationMembershipConnection! + + """The HTTP path for this user.""" + resourcePath: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this user.""" + url: String! + + """The user within the enterprise.""" + user: GitHubUser + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An object that is a member of an enterprise.""" +union GitHubEnterpriseMember = GitHubUser | GitHubEnterpriseUserAccount + +""" +A User who is a member of an enterprise through one or more organizations. +""" +type GitHubEnterpriseMemberEdge { + """A cursor for use in pagination.""" + cursor: String! + + """Whether the user does not have a license for the enterprise.""" + isUnlicensed: Boolean! + + """The item at the end of the edge.""" + node: GitHubEnterpriseMember +} + +"""The connection type for EnterpriseMember.""" +type GitHubEnterpriseMemberConnection { + """A list of edges.""" + edges: [GitHubEnterpriseMemberEdge] + + """A list of nodes.""" + nodes: [GitHubEnterpriseMember] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +Enterprise billing information visible to enterprise billing managers and owners. +""" +type GitHubEnterpriseBillingInfo { + """The number of licenseable users/emails across the enterprise.""" + allLicensableUsersCount: Int! + + """ + The number of data packs used by all organizations owned by the enterprise. + """ + assetPacks: Int! + + """ + The number of available seats across all owned organizations based on the unique number of billable users. + """ + availableSeats: Int! @deprecated(reason: "`availableSeats` will be replaced with `totalAvailableLicenses` to provide more clarity on the value being returned Use EnterpriseBillingInfo.totalAvailableLicenses instead. Removal on 2020-01-01 UTC.") + + """ + The bandwidth quota in GB for all organizations owned by the enterprise. + """ + bandwidthQuota: Float! + + """ + The bandwidth usage in GB for all organizations owned by the enterprise. + """ + bandwidthUsage: Float! + + """The bandwidth usage as a percentage of the bandwidth quota.""" + bandwidthUsagePercentage: Int! + + """The total seats across all organizations owned by the enterprise.""" + seats: Int! @deprecated(reason: "`seats` will be replaced with `totalLicenses` to provide more clarity on the value being returned Use EnterpriseBillingInfo.totalLicenses instead. Removal on 2020-01-01 UTC.") + + """The storage quota in GB for all organizations owned by the enterprise.""" + storageQuota: Float! + + """The storage usage in GB for all organizations owned by the enterprise.""" + storageUsage: Float! + + """The storage usage as a percentage of the storage quota.""" + storageUsagePercentage: Int! + + """ + The number of available licenses across all owned organizations based on the unique number of billable users. + """ + totalAvailableLicenses: Int! + + """The total number of licenses allocated.""" + totalLicenses: Int! +} + +""" +An account to manage multiple organizations with consolidated policy and billing. +""" +type GitHubEnterprise implements OneGraphNode & GitHubNode { + """A URL pointing to the enterprise's public avatar.""" + avatarUrl( + """The size of the resulting square image.""" + size: Int + ): String! + + """Enterprise billing information visible to enterprise billing managers.""" + billingInfo: GitHubEnterpriseBillingInfo + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The description of the enterprise.""" + description: String + + """The description of the enterprise as HTML.""" + descriptionHTML: String! + + """""" + id: ID! + + """The location of the enterprise.""" + location: String + + """A list of users who are members of this enterprise.""" + members( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Only return members within the selected GitHub Enterprise deployment""" + deployment: GitHubEnterpriseUserDeployment + + """The role of the user in the enterprise organization or server.""" + role: GitHubEnterpriseUserAccountMembershipRole + + """Ordering options for members returned from the connection.""" + orderBy: GitHubEnterpriseMemberOrder + + """The search string to look for.""" + query: String + + """Only return members within the organizations with these logins""" + organizationLogins: [String!] + ): GitHubEnterpriseMemberConnection! + + """The name of the enterprise.""" + name: String! + + """A list of organizations that belong to this enterprise.""" + organizations( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for organizations returned from the connection.""" + orderBy: GitHubOrganizationOrder + + """The search string to look for.""" + query: String + ): GitHubOrganizationConnection! + + """Enterprise information only visible to enterprise owners.""" + ownerInfo: GitHubEnterpriseOwnerInfo + + """The HTTP path for this enterprise.""" + resourcePath: String! + + """The URL-friendly identifier for the enterprise.""" + slug: String! + + """The HTTP URL for this enterprise.""" + url: String! + + """A list of user accounts on this enterprise.""" + userAccounts( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubEnterpriseUserAccountConnection! + + """Is the current viewer an admin of this enterprise?""" + viewerIsAdmin: Boolean! + + """The URL of the enterprise website.""" + websiteUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Types that can own an IP allow list.""" +union GitHubIpAllowListOwner = GitHubOrganization | GitHubEnterprise + +""" +An IP address or range of addresses that is allowed to access an owner's resources. +""" +type GitHubIpAllowListEntry implements OneGraphNode & GitHubNode { + """A single IP address or range of IP addresses in CIDR notation.""" + allowListValue: String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Whether the entry is currently active.""" + isActive: Boolean! + + """The name of the IP allow list entry.""" + name: String + + """The owner of the IP allow list entry.""" + owner: GitHubIpAllowListOwner! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""SCIM attributes for the External Identity""" +type GitHubExternalIdentityScimAttributes { + """The userName of the SCIM identity""" + username: String +} + +"""SAML attributes for the External Identity""" +type GitHubExternalIdentitySamlAttributes { + """The NameID of the SAML identity""" + nameId: String +} + +"""An external identity provisioned by SAML SSO or SCIM.""" +type GitHubExternalIdentity implements OneGraphNode & GitHubNode { + """The GUID for this identity""" + guid: String! + + """""" + id: ID! + + """Organization invitation for this SCIM-provisioned external identity""" + organizationInvitation: GitHubOrganizationInvitation + + """SAML Identity attributes""" + samlIdentity: GitHubExternalIdentitySamlAttributes + + """SCIM Identity attributes""" + scimIdentity: GitHubExternalIdentityScimAttributes + + """ + User linked to this external identity. Will be NULL if this identity has not been claimed by an organization member. + """ + user: GitHubUser + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubExternalIdentityEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubExternalIdentity +} + +"""The connection type for ExternalIdentity.""" +type GitHubExternalIdentityConnection { + """A list of edges.""" + edges: [GitHubExternalIdentityEdge] + + """A list of nodes.""" + nodes: [GitHubExternalIdentity] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +An Identity Provider configured to provision SAML and SCIM identities for Organizations +""" +type GitHubOrganizationIdentityProvider implements OneGraphNode & GitHubNode { + """ + The digest algorithm used to sign SAML requests for the Identity Provider. + """ + digestMethod: String + + """External Identities provisioned by this Identity Provider""" + externalIdentities( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubExternalIdentityConnection! + + """""" + id: ID! + + """ + The x509 certificate used by the Identity Provder to sign assertions and responses. + """ + idpCertificate: String + + """The Issuer Entity ID for the SAML Identity Provider""" + issuer: String + + """Organization this Identity Provider belongs to""" + organization: GitHubOrganization + + """ + The signature algorithm used to sign SAML requests for the Identity Provider. + """ + signatureMethod: String + + """The URL endpoint for the Identity Provider's SAML SSO.""" + ssoUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A user's public key.""" +type GitHubPublicKey implements OneGraphNode & GitHubNode { + """ + The last time this authorization was used to perform an action. Values will be null for keys not owned by the user. + """ + accessedAt: String + + """ + Identifies the date and time when the key was created. Keys created before March 5th, 2014 have inaccurate values. Values will be null for keys not owned by the user. + """ + createdAt: String + + """The fingerprint for this PublicKey.""" + fingerprint: String! + + """""" + id: ID! + + """ + Whether this PublicKey is read-only or not. Values will be null for keys not owned by the user. + """ + isReadOnly: Boolean + + """The public key string.""" + key: String! + + """ + Identifies the date and time when the key was updated. Keys created before March 5th, 2014 may have inaccurate values. Values will be null for keys not owned by the user. + """ + updatedAt: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An invitation for a user to be added to a repository.""" +type GitHubRepositoryInvitation implements OneGraphNode & GitHubNode { + """""" + id: ID! + + """The user who received the invitation.""" + invitee: GitHubUser! + + """The user who created the invitation.""" + inviter: GitHubUser! + + """The permission granted on this repository by this invitation.""" + permission: GitHubRepositoryPermission! + + """The Repository the user is invited to.""" + repository: GitHubRepositoryInfo + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A Saved Reply is text a user can use to reply quickly.""" +type GitHubSavedReply implements OneGraphNode & GitHubNode { + """The body of the saved reply.""" + body: String! + + """The saved reply body rendered to HTML.""" + bodyHTML: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + + """The title of the saved reply.""" + title: String! + + """The user that saved this reply.""" + user: GitHubActor + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubSponsorsTierOrderField { + """Order tiers by creation time.""" + CREATED_AT + + """Order tiers by their monthly price in cents""" + MONTHLY_PRICE_IN_CENTS +} + +"""Ordering options for Sponsors tiers connections.""" +input GitHubSponsorsTierOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order tiers by.""" + field: GitHubSponsorsTierOrderField! +} + +"""An edge in a connection.""" +type GitHubSponsorsTierEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubSponsorsTier +} + +"""The connection type for SponsorsTier.""" +type GitHubSponsorsTierConnection { + """A list of edges.""" + edges: [GitHubSponsorsTierEdge] + + """A list of nodes.""" + nodes: [GitHubSponsorsTier] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A GitHub Sponsors listing.""" +type GitHubSponsorsListing implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The full description of the listing.""" + fullDescription: String! + + """The full description of the listing rendered to HTML.""" + fullDescriptionHTML: String! + + """""" + id: ID! + + """The listing's full name.""" + name: String! + + """The short description of the listing.""" + shortDescription: String! + + """The short name of the listing.""" + slug: String! + + """The published tiers for this GitHub Sponsors listing.""" + tiers( + """Ordering options for Sponsors tiers returned from the connection.""" + orderBy: GitHubSponsorsTierOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSponsorsTierConnection + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubSponsorshipOrderField { + """Order sponsorship by creation time.""" + CREATED_AT +} + +"""Ordering options for sponsorship connections.""" +input GitHubSponsorshipOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order sponsorship by.""" + field: GitHubSponsorshipOrderField! +} + +"""An edge in a connection.""" +type GitHubSponsorshipEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubSponsorship +} + +"""The connection type for Sponsorship.""" +type GitHubSponsorshipConnection { + """A list of edges.""" + edges: [GitHubSponsorshipEdge] + + """A list of nodes.""" + nodes: [GitHubSponsorship] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +SponsorsTier information only visible to users that can administer the associated Sponsors listing. +""" +type GitHubSponsorsTierAdminInfo { + """The sponsorships associated with this tier.""" + sponsorships( + """ + Ordering options for sponsorships returned from this connection. If left blank, the sponsorships will be ordered based on relevancy to the viewer. + """ + orderBy: GitHubSponsorshipOrder + + """Whether or not to include private sponsorships in the result set""" + includePrivate: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSponsorshipConnection! +} + +"""A GitHub Sponsors tier associated with a GitHub Sponsors listing.""" +type GitHubSponsorsTier implements OneGraphNode & GitHubNode { + """ + SponsorsTier information only visible to users that can administer the associated Sponsors listing. + """ + adminInfo: GitHubSponsorsTierAdminInfo + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The description of the tier.""" + description: String! + + """The tier description rendered to HTML""" + descriptionHTML: String! + + """""" + id: ID! + + """How much this tier costs per month in cents.""" + monthlyPriceInCents: Int! + + """How much this tier costs per month in dollars.""" + monthlyPriceInDollars: Int! + + """The name of the tier.""" + name: String! + + """The sponsors listing that this tier belongs to.""" + sponsorsListing: GitHubSponsorsListing! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Entities that can be sponsored through GitHub Sponsors""" +interface GitHubSponsorable { + """The GitHub Sponsors listing for this user.""" + sponsorsListing: GitHubSponsorsListing + + """This object's sponsorships as the maintainer.""" + sponsorshipsAsMaintainer( + """ + Ordering options for sponsorships returned from this connection. If left blank, the sponsorships will be ordered based on relevancy to the viewer. + """ + orderBy: GitHubSponsorshipOrder + + """Whether or not to include private sponsorships in the result set""" + includePrivate: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSponsorshipConnection! + + """This object's sponsorships as the sponsor.""" + sponsorshipsAsSponsor( + """ + Ordering options for sponsorships returned from this connection. If left blank, the sponsorships will be ordered based on relevancy to the viewer. + """ + orderBy: GitHubSponsorshipOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSponsorshipConnection! +} + +enum GitHubSponsorshipPrivacy { + """Public""" + PUBLIC + + """Private""" + PRIVATE +} + +"""A sponsorship relationship between a sponsor and a maintainer""" +type GitHubSponsorship implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """The entity that is being sponsored""" + maintainer: GitHubUser! @deprecated(reason: "`Sponsorship.maintainer` will be removed. Use `Sponsorship.sponsorable` instead. Removal on 2020-04-01 UTC.") + + """The privacy level for this sponsorship.""" + privacyLevel: GitHubSponsorshipPrivacy! + + """ + The entity that is sponsoring. Returns null if the sponsorship is private + """ + sponsor: GitHubUser + + """The entity that is being sponsored""" + sponsorable: GitHubSponsorable! + + """The associated sponsorship tier""" + tier: GitHubSponsorsTier + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.add_billing_manager""" +type GitHubOrgAddBillingManagerAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """ + The email address used to invite a billing manager for the organization. + """ + invitationEmail: String + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubOrgAddMemberAuditEntryPermission { + """Can read and clone repositories.""" + READ + + """Can read, clone, push, and add collaborators to repositories.""" + ADMIN +} + +"""Audit log entry for a org.add_member""" +type GitHubOrgAddMemberAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The permission level of the member added to the organization.""" + permission: GitHubOrgAddMemberAuditEntryPermission + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.block_user""" +type GitHubOrgBlockUserAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The blocked user.""" + blockedUser: GitHubUser + + """The username of the blocked user.""" + blockedUserName: String + + """The HTTP path for the blocked user.""" + blockedUserResourcePath: String + + """The HTTP URL for the blocked user.""" + blockedUserUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.config.disable_collaborators_only event.""" +type GitHubOrgConfigDisableCollaboratorsOnlyAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.config.enable_collaborators_only event.""" +type GitHubOrgConfigEnableCollaboratorsOnlyAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubOrgCreateAuditEntryBillingPlan { + """Free Plan""" + FREE + + """Team Plan""" + BUSINESS + + """Enterprise Cloud Plan""" + BUSINESS_PLUS + + """Legacy Unlimited Plan""" + UNLIMITED + + """Tiered Per Seat Plan""" + TIERED_PER_SEAT +} + +"""Audit log entry for a org.create event.""" +type GitHubOrgCreateAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The billing plan for the Organization.""" + billingPlan: GitHubOrgCreateAuditEntryBillingPlan + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.disable_oauth_app_restrictions event.""" +type GitHubOrgDisableOauthAppRestrictionsAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.disable_saml event.""" +type GitHubOrgDisableSamlAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The SAML provider's digest algorithm URL.""" + digestMethodUrl: String + + """""" + id: ID! + + """The SAML provider's issuer URL.""" + issuerUrl: String + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The SAML provider's signature algorithm URL.""" + signatureMethodUrl: String + + """The SAML provider's single sign-on URL.""" + singleSignOnUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.disable_two_factor_requirement event.""" +type GitHubOrgDisableTwoFactorRequirementAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.enable_oauth_app_restrictions event.""" +type GitHubOrgEnableOauthAppRestrictionsAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.enable_saml event.""" +type GitHubOrgEnableSamlAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The SAML provider's digest algorithm URL.""" + digestMethodUrl: String + + """""" + id: ID! + + """The SAML provider's issuer URL.""" + issuerUrl: String + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The SAML provider's signature algorithm URL.""" + signatureMethodUrl: String + + """The SAML provider's single sign-on URL.""" + singleSignOnUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.enable_two_factor_requirement event.""" +type GitHubOrgEnableTwoFactorRequirementAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.invite_member event.""" +type GitHubOrgInviteMemberAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The email address of the organization invitation.""" + email: String + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The organization invitation.""" + organizationInvitation: GitHubOrganizationInvitation + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubOauthApplicationCreateAuditEntryState { + """The OAuth Application was active and allowed to have OAuth Accesses.""" + ACTIVE + + """ + The OAuth Application was suspended from generating OAuth Accesses due to abuse or security concerns. + """ + SUSPENDED + + """The OAuth Application was in the process of being deleted.""" + PENDING_DELETION +} + +"""Audit log entry for a oauth_application.create event.""" +type GitHubOauthApplicationCreateAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubOauthApplicationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The application URL of the OAuth Application.""" + applicationUrl: String + + """The callback URL of the OAuth Application.""" + callbackUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The name of the OAuth Application.""" + oauthApplicationName: String + + """The HTTP path for the OAuth Application""" + oauthApplicationResourcePath: String + + """The HTTP URL for the OAuth Application""" + oauthApplicationUrl: String + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The rate limit of the OAuth Application.""" + rateLimit: Int + + """The state of the OAuth Application.""" + state: GitHubOauthApplicationCreateAuditEntryState + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.oauth_app_access_approved event.""" +type GitHubOrgOauthAppAccessApprovedAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubOauthApplicationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The name of the OAuth Application.""" + oauthApplicationName: String + + """The HTTP path for the OAuth Application""" + oauthApplicationResourcePath: String + + """The HTTP URL for the OAuth Application""" + oauthApplicationUrl: String + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.oauth_app_access_denied event.""" +type GitHubOrgOauthAppAccessDeniedAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubOauthApplicationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The name of the OAuth Application.""" + oauthApplicationName: String + + """The HTTP path for the OAuth Application""" + oauthApplicationResourcePath: String + + """The HTTP URL for the OAuth Application""" + oauthApplicationUrl: String + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Metadata for an audit entry with action oauth_application.*""" +interface GitHubOauthApplicationAuditEntryData { + """The name of the OAuth Application.""" + oauthApplicationName: String + + """The HTTP path for the OAuth Application""" + oauthApplicationResourcePath: String + + """The HTTP URL for the OAuth Application""" + oauthApplicationUrl: String +} + +"""Audit log entry for a org.oauth_app_access_requested event.""" +type GitHubOrgOauthAppAccessRequestedAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubOauthApplicationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The name of the OAuth Application.""" + oauthApplicationName: String + + """The HTTP path for the OAuth Application""" + oauthApplicationResourcePath: String + + """The HTTP URL for the OAuth Application""" + oauthApplicationUrl: String + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubOrgRemoveBillingManagerAuditEntryReason { + """ + The organization required 2FA of its billing managers and this user did not have 2FA enabled. + """ + TWO_FACTOR_REQUIREMENT_NON_COMPLIANCE + + """SAML external identity missing""" + SAML_EXTERNAL_IDENTITY_MISSING + + """SAML SSO enforcement requires an external identity""" + SAML_SSO_ENFORCEMENT_REQUIRES_EXTERNAL_IDENTITY +} + +"""Audit log entry for a org.remove_billing_manager event.""" +type GitHubOrgRemoveBillingManagerAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The reason for the billing manager being removed.""" + reason: GitHubOrgRemoveBillingManagerAuditEntryReason + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubOrgRemoveMemberAuditEntryReason { + """ + The organization required 2FA of its billing managers and this user did not have 2FA enabled. + """ + TWO_FACTOR_REQUIREMENT_NON_COMPLIANCE + + """SAML external identity missing""" + SAML_EXTERNAL_IDENTITY_MISSING + + """SAML SSO enforcement requires an external identity""" + SAML_SSO_ENFORCEMENT_REQUIRES_EXTERNAL_IDENTITY +} + +enum GitHubOrgRemoveMemberAuditEntryMembershipType { + """A direct member is a user that is a member of the Organization.""" + DIRECT_MEMBER + + """ + Organization administrators have full access and can change several settings, including the names of repositories that belong to the Organization and Owners team membership. In addition, organization admins can delete the organization and all of its repositories. + """ + ADMIN + + """ + A billing manager is a user who manages the billing settings for the Organization, such as updating payment information. + """ + BILLING_MANAGER + + """ + An unaffiliated collaborator is a person who is not a member of the Organization and does not have access to any repositories in the Organization. + """ + UNAFFILIATED + + """ + An outside collaborator is a person who isn't explicitly a member of the Organization, but who has Read, Write, or Admin permissions to one or more repositories in the organization. + """ + OUTSIDE_COLLABORATOR +} + +"""Audit log entry for a org.remove_member event.""" +type GitHubOrgRemoveMemberAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The types of membership the member has with the organization.""" + membershipTypes: [GitHubOrgRemoveMemberAuditEntryMembershipType!] + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The reason for the member being removed.""" + reason: GitHubOrgRemoveMemberAuditEntryReason + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubOrgRemoveOutsideCollaboratorAuditEntryReason { + """ + The organization required 2FA of its billing managers and this user did not have 2FA enabled. + """ + TWO_FACTOR_REQUIREMENT_NON_COMPLIANCE + + """SAML external identity missing""" + SAML_EXTERNAL_IDENTITY_MISSING +} + +enum GitHubOrgRemoveOutsideCollaboratorAuditEntryMembershipType { + """ + An outside collaborator is a person who isn't explicitly a member of the Organization, but who has Read, Write, or Admin permissions to one or more repositories in the organization. + """ + OUTSIDE_COLLABORATOR + + """ + An unaffiliated collaborator is a person who is not a member of the Organization and does not have access to any repositories in the organization. + """ + UNAFFILIATED + + """ + A billing manager is a user who manages the billing settings for the Organization, such as updating payment information. + """ + BILLING_MANAGER +} + +"""Audit log entry for a org.remove_outside_collaborator event.""" +type GitHubOrgRemoveOutsideCollaboratorAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """ + The types of membership the outside collaborator has with the organization. + """ + membershipTypes: [GitHubOrgRemoveOutsideCollaboratorAuditEntryMembershipType!] + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """ + The reason for the outside collaborator being removed from the Organization. + """ + reason: GitHubOrgRemoveOutsideCollaboratorAuditEntryReason + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Metadata for an organization membership for org.restore_member actions""" +type GitHubOrgRestoreMemberMembershipOrganizationAuditEntryData implements GitHubOrganizationAuditEntryData { + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String +} + +"""Metadata for a repository membership for org.restore_member actions""" +type GitHubOrgRestoreMemberMembershipRepositoryAuditEntryData implements GitHubRepositoryAuditEntryData { + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String +} + +"""Metadata for a team membership for org.restore_member actions""" +type GitHubOrgRestoreMemberMembershipTeamAuditEntryData implements GitHubTeamAuditEntryData { + """The team associated with the action""" + team: GitHubTeam + + """The name of the team""" + teamName: String + + """The HTTP path for this team""" + teamResourcePath: String + + """The HTTP URL for this team""" + teamUrl: String +} + +"""Types of memberships that can be restored for an Organization member.""" +union GitHubOrgRestoreMemberAuditEntryMembership = GitHubOrgRestoreMemberMembershipTeamAuditEntryData | GitHubOrgRestoreMemberMembershipRepositoryAuditEntryData | GitHubOrgRestoreMemberMembershipOrganizationAuditEntryData + +"""Audit log entry for a org.restore_member event.""" +type GitHubOrgRestoreMemberAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The number of custom email routings for the restored member.""" + restoredCustomEmailRoutingsCount: Int + + """The number of issue assignemnts for the restored member.""" + restoredIssueAssignmentsCount: Int + + """Restored organization membership objects.""" + restoredMemberships: [GitHubOrgRestoreMemberAuditEntryMembership!] + + """The number of restored memberships.""" + restoredMembershipsCount: Int + + """The number of repositories of the restored member.""" + restoredRepositoriesCount: Int + + """The number of starred repositories for the restored member.""" + restoredRepositoryStarsCount: Int + + """The number of watched repositories for the restored member.""" + restoredRepositoryWatchesCount: Int + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.unblock_user""" +type GitHubOrgUnblockUserAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The user being unblocked by the organization.""" + blockedUser: GitHubUser + + """The username of the blocked user.""" + blockedUserName: String + + """The HTTP path for the blocked user.""" + blockedUserResourcePath: String + + """The HTTP URL for the blocked user.""" + blockedUserUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubOrgUpdateDefaultRepositoryPermissionAuditEntryPermission { + """Can read and clone repositories.""" + READ + + """Can read, clone and push to repositories.""" + WRITE + + """Can read, clone, push, and add collaborators to repositories.""" + ADMIN + + """No default permission value.""" + NONE +} + +"""Audit log entry for a org.update_default_repository_permission""" +type GitHubOrgUpdateDefaultRepositoryPermissionAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The new default repository permission level for the organization.""" + permission: GitHubOrgUpdateDefaultRepositoryPermissionAuditEntryPermission + + """The former default repository permission level for the organization.""" + permissionWas: GitHubOrgUpdateDefaultRepositoryPermissionAuditEntryPermission + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubOrgUpdateMemberAuditEntryPermission { + """Can read and clone repositories.""" + READ + + """Can read, clone, push, and add collaborators to repositories.""" + ADMIN +} + +"""Audit log entry for a org.update_member event.""" +type GitHubOrgUpdateMemberAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The new member permission level for the organization.""" + permission: GitHubOrgUpdateMemberAuditEntryPermission + + """The former member permission level for the organization.""" + permissionWas: GitHubOrgUpdateMemberAuditEntryPermission + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubOrgUpdateMemberRepositoryCreationPermissionAuditEntryVisibility { + """ + All organization members are restricted from creating any repositories. + """ + ALL + + """ + All organization members are restricted from creating public repositories. + """ + PUBLIC +} + +""" +Audit log entry for a org.update_member_repository_creation_permission event. +""" +type GitHubOrgUpdateMemberRepositoryCreationPermissionAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """Can members create repositories in the organization.""" + canCreateRepositories: Boolean + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + + """ + The permission for visibility level of repositories for this organization. + """ + visibility: GitHubOrgUpdateMemberRepositoryCreationPermissionAuditEntryVisibility + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Audit log entry for a org.update_member_repository_invitation_permission event. +""" +type GitHubOrgUpdateMemberRepositoryInvitationPermissionAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """ + Can outside collaborators be invited to repositories in the organization. + """ + canInviteOutsideCollaboratorsToRepositories: Boolean + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubRepoAccessAuditEntryVisibility { + """The repository is visible only to users in the same business.""" + INTERNAL + + """The repository is visible only to those with explicit access.""" + PRIVATE + + """The repository is visible to everyone.""" + PUBLIC +} + +"""Audit log entry for a repo.access event.""" +type GitHubRepoAccessAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + + """The visibility of the repository""" + visibility: GitHubRepoAccessAuditEntryVisibility + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubRepoAddMemberAuditEntryVisibility { + """The repository is visible only to users in the same business.""" + INTERNAL + + """The repository is visible only to those with explicit access.""" + PRIVATE + + """The repository is visible to everyone.""" + PUBLIC +} + +"""Audit log entry for a repo.add_member event.""" +type GitHubRepoAddMemberAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + + """The visibility of the repository""" + visibility: GitHubRepoAddMemberAuditEntryVisibility + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubRepoArchivedAuditEntryVisibility { + """The repository is visible only to users in the same business.""" + INTERNAL + + """The repository is visible only to those with explicit access.""" + PRIVATE + + """The repository is visible to everyone.""" + PUBLIC +} + +"""Audit log entry for a repo.archived event.""" +type GitHubRepoArchivedAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + + """The visibility of the repository""" + visibility: GitHubRepoArchivedAuditEntryVisibility + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubRepoChangeMergeSettingAuditEntryMergeType { + """The pull request is added to the base branch in a merge commit.""" + MERGE + + """ + Commits from the pull request are added onto the base branch individually without a merge commit. + """ + REBASE + + """ + The pull request's commits are squashed into a single commit before they are merged to the base branch. + """ + SQUASH +} + +"""Audit log entry for a repo.change_merge_setting event.""" +type GitHubRepoChangeMergeSettingAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """ + Whether the change was to enable (true) or disable (false) the merge type + """ + isEnabled: Boolean + + """The merge method affected by the change""" + mergeType: GitHubRepoChangeMergeSettingAuditEntryMergeType + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a repo.config.disable_anonymous_git_access event.""" +type GitHubRepoConfigDisableAnonymousGitAccessAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a repo.config.disable_collaborators_only event.""" +type GitHubRepoConfigDisableCollaboratorsOnlyAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a repo.config.disable_contributors_only event.""" +type GitHubRepoConfigDisableContributorsOnlyAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a repo.config.disable_sockpuppet_disallowed event.""" +type GitHubRepoConfigDisableSockpuppetDisallowedAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a repo.config.enable_anonymous_git_access event.""" +type GitHubRepoConfigEnableAnonymousGitAccessAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a repo.config.enable_collaborators_only event.""" +type GitHubRepoConfigEnableCollaboratorsOnlyAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a repo.config.enable_contributors_only event.""" +type GitHubRepoConfigEnableContributorsOnlyAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a repo.config.enable_sockpuppet_disallowed event.""" +type GitHubRepoConfigEnableSockpuppetDisallowedAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a repo.config.lock_anonymous_git_access event.""" +type GitHubRepoConfigLockAnonymousGitAccessAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a repo.config.unlock_anonymous_git_access event.""" +type GitHubRepoConfigUnlockAnonymousGitAccessAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubRepoCreateAuditEntryVisibility { + """The repository is visible only to users in the same business.""" + INTERNAL + + """The repository is visible only to those with explicit access.""" + PRIVATE + + """The repository is visible to everyone.""" + PUBLIC +} + +"""Audit log entry for a repo.create event.""" +type GitHubRepoCreateAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The name of the parent repository for this forked repository.""" + forkParentName: String + + """The name of the root repository for this netork.""" + forkSourceName: String + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + + """The visibility of the repository""" + visibility: GitHubRepoCreateAuditEntryVisibility + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubRepoDestroyAuditEntryVisibility { + """The repository is visible only to users in the same business.""" + INTERNAL + + """The repository is visible only to those with explicit access.""" + PRIVATE + + """The repository is visible to everyone.""" + PUBLIC +} + +"""Audit log entry for a repo.destroy event.""" +type GitHubRepoDestroyAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + + """The visibility of the repository""" + visibility: GitHubRepoDestroyAuditEntryVisibility + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubRepoRemoveMemberAuditEntryVisibility { + """The repository is visible only to users in the same business.""" + INTERNAL + + """The repository is visible only to those with explicit access.""" + PRIVATE + + """The repository is visible to everyone.""" + PUBLIC +} + +"""Audit log entry for a repo.remove_member event.""" +type GitHubRepoRemoveMemberAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + + """The visibility of the repository""" + visibility: GitHubRepoRemoveMemberAuditEntryVisibility + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a members_can_delete_repos.clear event.""" +type GitHubMembersCanDeleteReposClearAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubEnterpriseAuditEntryData & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The HTTP path for this enterprise.""" + enterpriseResourcePath: String + + """The slug of the enterprise.""" + enterpriseSlug: String + + """The HTTP URL for this enterprise.""" + enterpriseUrl: String + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a members_can_delete_repos.disable event.""" +type GitHubMembersCanDeleteReposDisableAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubEnterpriseAuditEntryData & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The HTTP path for this enterprise.""" + enterpriseResourcePath: String + + """The slug of the enterprise.""" + enterpriseSlug: String + + """The HTTP URL for this enterprise.""" + enterpriseUrl: String + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a members_can_delete_repos.enable event.""" +type GitHubMembersCanDeleteReposEnableAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubEnterpriseAuditEntryData & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The HTTP path for this enterprise.""" + enterpriseResourcePath: String + + """The slug of the enterprise.""" + enterpriseSlug: String + + """The HTTP URL for this enterprise.""" + enterpriseUrl: String + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a org.invite_to_business event.""" +type GitHubOrgInviteToBusinessAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubEnterpriseAuditEntryData & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The HTTP path for this enterprise.""" + enterpriseResourcePath: String + + """The slug of the enterprise.""" + enterpriseSlug: String + + """The HTTP URL for this enterprise.""" + enterpriseUrl: String + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a private_repository_forking.disable event.""" +type GitHubPrivateRepositoryForkingDisableAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubEnterpriseAuditEntryData & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The HTTP path for this enterprise.""" + enterpriseResourcePath: String + + """The slug of the enterprise.""" + enterpriseSlug: String + + """The HTTP URL for this enterprise.""" + enterpriseUrl: String + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a private_repository_forking.enable event.""" +type GitHubPrivateRepositoryForkingEnableAuditEntry implements OneGraphNode & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubEnterpriseAuditEntryData & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The HTTP path for this enterprise.""" + enterpriseResourcePath: String + + """The slug of the enterprise.""" + enterpriseSlug: String + + """The HTTP URL for this enterprise.""" + enterpriseUrl: String + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a repository_visibility_change.disable event.""" +type GitHubRepositoryVisibilityChangeDisableAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubEnterpriseAuditEntryData & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The HTTP path for this enterprise.""" + enterpriseResourcePath: String + + """The slug of the enterprise.""" + enterpriseSlug: String + + """The HTTP URL for this enterprise.""" + enterpriseUrl: String + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Metadata for an audit entry containing enterprise account information.""" +interface GitHubEnterpriseAuditEntryData { + """The HTTP path for this enterprise.""" + enterpriseResourcePath: String + + """The slug of the enterprise.""" + enterpriseSlug: String + + """The HTTP URL for this enterprise.""" + enterpriseUrl: String +} + +"""Audit log entry for a repository_visibility_change.enable event.""" +type GitHubRepositoryVisibilityChangeEnableAuditEntry implements OneGraphNode & GitHubOrganizationAuditEntryData & GitHubNode & GitHubEnterpriseAuditEntryData & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The HTTP path for this enterprise.""" + enterpriseResourcePath: String + + """The slug of the enterprise.""" + enterpriseSlug: String + + """The HTTP URL for this enterprise.""" + enterpriseUrl: String + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Audit log entry for a team.add_member event.""" +type GitHubTeamAddMemberAuditEntry implements OneGraphNode & GitHubTeamAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """Whether the team was mapped to an LDAP Group.""" + isLdapMapped: Boolean + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The team associated with the action""" + team: GitHubTeam + + """The name of the team""" + teamName: String + + """The HTTP path for this team""" + teamResourcePath: String + + """The HTTP URL for this team""" + teamUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An entry in the audit log.""" +interface GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String +} + +"""Audit log entry for a repo.add_topic event.""" +type GitHubRepoAddTopicAuditEntry implements OneGraphNode & GitHubTopicAuditEntryData & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The name of the topic added to the repository""" + topic: GitHubTopic + + """The name of the topic added to the repository""" + topicName: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Metadata for an audit entry with a topic.""" +interface GitHubTopicAuditEntryData { + """The name of the topic added to the repository""" + topic: GitHubTopic + + """The name of the topic added to the repository""" + topicName: String +} + +"""Audit log entry for a repo.remove_topic event.""" +type GitHubRepoRemoveTopicAuditEntry implements OneGraphNode & GitHubTopicAuditEntryData & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The name of the topic added to the repository""" + topic: GitHubTopic + + """The name of the topic added to the repository""" + topicName: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Metadata for an audit entry with action repo.*""" +interface GitHubRepositoryAuditEntryData { + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String +} + +"""Audit log entry for a team.add_repository event.""" +type GitHubTeamAddRepositoryAuditEntry implements OneGraphNode & GitHubTeamAuditEntryData & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """Whether the team was mapped to an LDAP Group.""" + isLdapMapped: Boolean + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The team associated with the action""" + team: GitHubTeam + + """The name of the team""" + teamName: String + + """The HTTP path for this team""" + teamResourcePath: String + + """The HTTP URL for this team""" + teamUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Metadata for an audit entry with action org.*""" +interface GitHubOrganizationAuditEntryData { + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String +} + +"""Audit log entry for a team.change_parent_team event.""" +type GitHubTeamChangeParentTeamAuditEntry implements OneGraphNode & GitHubTeamAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """Whether the team was mapped to an LDAP Group.""" + isLdapMapped: Boolean + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The new parent team.""" + parentTeam: GitHubTeam + + """The name of the new parent team""" + parentTeamName: String + + """The name of the former parent team""" + parentTeamNameWas: String + + """The HTTP path for the parent team""" + parentTeamResourcePath: String + + """The HTTP URL for the parent team""" + parentTeamUrl: String + + """The former parent team.""" + parentTeamWas: GitHubTeam + + """The HTTP path for the previous parent team""" + parentTeamWasResourcePath: String + + """The HTTP URL for the previous parent team""" + parentTeamWasUrl: String + + """The team associated with the action""" + team: GitHubTeam + + """The name of the team""" + teamName: String + + """The HTTP path for this team""" + teamResourcePath: String + + """The HTTP URL for this team""" + teamUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Metadata for an audit entry with action team.*""" +interface GitHubTeamAuditEntryData { + """The team associated with the action""" + team: GitHubTeam + + """The name of the team""" + teamName: String + + """The HTTP path for this team""" + teamResourcePath: String + + """The HTTP URL for this team""" + teamUrl: String +} + +enum GitHubOperationType { + """An existing resource was accessed""" + ACCESS + + """A resource performed an authentication event""" + AUTHENTICATION + + """A new resource was created""" + CREATE + + """An existing resource was modified""" + MODIFY + + """An existing resource was removed""" + REMOVE + + """An existing resource was restored""" + RESTORE + + """An existing resource was transferred between multiple resources""" + TRANSFER +} + +"""Location information for an actor""" +type GitHubActorLocation { + """City""" + city: String + + """Country name""" + country: String + + """Country code""" + countryCode: String + + """Region name""" + region: String + + """Region or state code""" + regionCode: String +} + +"""Audit log entry for a team.remove_member event.""" +type GitHubTeamRemoveMemberAuditEntry implements OneGraphNode & GitHubTeamAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """Whether the team was mapped to an LDAP Group.""" + isLdapMapped: Boolean + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The team associated with the action""" + team: GitHubTeam + + """The name of the team""" + teamName: String + + """The HTTP path for this team""" + teamResourcePath: String + + """The HTTP URL for this team""" + teamUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Represents a 'base_ref_changed' event on a given issue or pull request. +""" +type GitHubBaseRefChangedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Represents the latest point in the pull request timeline for which the viewer has seen the pull request's commits. +""" +type GitHubPullRequestRevisionMarker { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The last commit the viewer has seen.""" + lastSeenCommit: GitHubCommit! + + """The pull request to which the marker belongs.""" + pullRequest: GitHubPullRequest! +} + +enum GitHubTeamDiscussionCommentOrderField { + """ + Allows sequential ordering of team discussion comments (which is equivalent to chronological ordering). + """ + NUMBER +} + +"""Ways in which team discussion comment connections can be ordered.""" +input GitHubTeamDiscussionCommentOrder { + """The direction in which to order nodes.""" + direction: GitHubOrderDirection! + + """The field by which to order nodes.""" + field: GitHubTeamDiscussionCommentOrderField! +} + +"""Represents a user that's made a reaction.""" +type GitHubReactingUserEdge { + """A cursor for use in pagination.""" + cursor: String! + + """""" + node: GitHubUser! + + """The moment when the user made the reaction.""" + reactedAt: String! +} + +"""The connection type for User.""" +type GitHubReactingUserConnection { + """A list of edges.""" + edges: [GitHubReactingUserEdge] + + """A list of nodes.""" + nodes: [GitHubUser] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubPullRequestReviewCommentState { + """A comment that is part of a pending review""" + PENDING + + """A comment that is part of a submitted review""" + SUBMITTED +} + +"""An edge in a connection.""" +type GitHubStatusCheckRollupContextEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubStatusCheckRollupContext +} + +"""The connection type for StatusCheckRollupContext.""" +type GitHubStatusCheckRollupContextConnection { + """A list of edges.""" + edges: [GitHubStatusCheckRollupContextEdge] + + """A list of nodes.""" + nodes: [GitHubStatusCheckRollupContext] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Represents the rollup for both the check runs and status for a commit.""" +type GitHubStatusCheckRollup implements OneGraphNode & GitHubNode { + """The commit the status and check runs are attached to.""" + commit: GitHubCommit + + """A list of status contexts and check runs for this commit.""" + contexts( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubStatusCheckRollupContextConnection! + + """""" + id: ID! + + """The combined status for the commit.""" + state: GitHubStatusState! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Types that can be inside a StatusCheckRollup context.""" +union GitHubStatusCheckRollupContext = GitHubStatusContext + +enum GitHubStatusState { + """Status is expected.""" + EXPECTED + + """Status is errored.""" + ERROR + + """Status is failing.""" + FAILURE + + """Status is pending.""" + PENDING + + """Status is successful.""" + SUCCESS +} + +"""Represents an individual commit status context""" +type GitHubStatusContext implements OneGraphNode & GitHubNode { + """ + The avatar of the OAuth application or the user that created the status + """ + avatarUrl( + """The size of the resulting square image.""" + size: Int + ): String + + """This commit this status context is attached to.""" + commit: GitHubCommit + + """The name of this status context.""" + context: String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The actor who created this status context.""" + creator: GitHubActor + + """The description for this status context.""" + description: String + + """""" + id: ID! + + """The state of this status context.""" + state: GitHubStatusState! + + """The URL for this status context.""" + targetUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a commit status.""" +type GitHubStatus implements OneGraphNode & GitHubNode { + """The commit this status is attached to.""" + commit: GitHubCommit + + """Looks up an individual status context by context name.""" + context( + """The context name.""" + name: String! + ): GitHubStatusContext + + """The individual status contexts for this commit.""" + contexts: [GitHubStatusContext!]! + + """""" + id: ID! + + """The combined commit status.""" + state: GitHubStatusState! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a GPG signature on a Commit or Tag.""" +type GitHubGpgSignature implements GitHubGitSignature { + """Email used to sign this object.""" + email: String! + + """True if the signature is valid and verified by GitHub.""" + isValid: Boolean! + + """Hex-encoded ID of the key that signed this object.""" + keyId: String + + """ + Payload for GPG signing object. Raw ODB object without the signature header. + """ + payload: String! + + """ASCII-armored signature header from object.""" + signature: String! + + """GitHub user corresponding to the email signing this commit.""" + signer: GitHubUser + + """ + The state of this signature. `VALID` if signature is valid and verified by GitHub, otherwise represents reason why signature is considered invalid. + """ + state: GitHubGitSignatureState! + + """True if the signature was made with GitHub's signing key.""" + wasSignedByGitHub: Boolean! +} + +"""Represents an S/MIME signature on a Commit or Tag.""" +type GitHubSmimeSignature implements GitHubGitSignature { + """Email used to sign this object.""" + email: String! + + """True if the signature is valid and verified by GitHub.""" + isValid: Boolean! + + """ + Payload for GPG signing object. Raw ODB object without the signature header. + """ + payload: String! + + """ASCII-armored signature header from object.""" + signature: String! + + """GitHub user corresponding to the email signing this commit.""" + signer: GitHubUser + + """ + The state of this signature. `VALID` if signature is valid and verified by GitHub, otherwise represents reason why signature is considered invalid. + """ + state: GitHubGitSignatureState! + + """True if the signature was made with GitHub's signing key.""" + wasSignedByGitHub: Boolean! +} + +enum GitHubGitSignatureState { + """Valid signature and verified by GitHub""" + VALID + + """Invalid signature""" + INVALID + + """Malformed signature""" + MALFORMED_SIG + + """Key used for signing not known to GitHub""" + UNKNOWN_KEY + + """Invalid email used for signing""" + BAD_EMAIL + + """Email used for signing unverified on GitHub""" + UNVERIFIED_EMAIL + + """Email used for signing not known to GitHub""" + NO_USER + + """Unknown signature type""" + UNKNOWN_SIG_TYPE + + """Unsigned""" + UNSIGNED + + """ + Internal error - the GPG verification service is unavailable at the moment + """ + GPGVERIFY_UNAVAILABLE + + """Internal error - the GPG verification service misbehaved""" + GPGVERIFY_ERROR + + """The usage flags for the key that signed this don't allow signing""" + NOT_SIGNING_KEY + + """Signing key expired""" + EXPIRED_KEY + + """Valid signature, pending certificate revocation checking""" + OCSP_PENDING + + """Valid siganture, though certificate revocation check failed""" + OCSP_ERROR + + """The signing certificate or its chain could not be verified""" + BAD_CERT + + """One or more certificates in chain has been revoked""" + OCSP_REVOKED +} + +"""Represents an unknown signature on a Commit or Tag.""" +type GitHubUnknownSignature implements GitHubGitSignature { + """Email used to sign this object.""" + email: String! + + """True if the signature is valid and verified by GitHub.""" + isValid: Boolean! + + """ + Payload for GPG signing object. Raw ODB object without the signature header. + """ + payload: String! + + """ASCII-armored signature header from object.""" + signature: String! + + """GitHub user corresponding to the email signing this commit.""" + signer: GitHubUser + + """ + The state of this signature. `VALID` if signature is valid and verified by GitHub, otherwise represents reason why signature is considered invalid. + """ + state: GitHubGitSignatureState! + + """True if the signature was made with GitHub's signing key.""" + wasSignedByGitHub: Boolean! +} + +"""Information about a signature (GPG or S/MIME) on a Commit or Tag.""" +interface GitHubGitSignature { + """Email used to sign this object.""" + email: String! + + """True if the signature is valid and verified by GitHub.""" + isValid: Boolean! + + """ + Payload for GPG signing object. Raw ODB object without the signature header. + """ + payload: String! + + """ASCII-armored signature header from object.""" + signature: String! + + """GitHub user corresponding to the email signing this commit.""" + signer: GitHubUser + + """ + The state of this signature. `VALID` if signature is valid and verified by GitHub, otherwise represents reason why signature is considered invalid. + """ + state: GitHubGitSignatureState! + + """True if the signature was made with GitHub's signing key.""" + wasSignedByGitHub: Boolean! +} + +"""The connection type for Commit.""" +type GitHubCommitConnection { + """A list of edges.""" + edges: [GitHubCommitEdge] + + """A list of nodes.""" + nodes: [GitHubCommit] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Specifies an author for filtering Git commits.""" +input GitHubCommitAuthor { + """ + Email addresses to filter by. Commits authored by any of the specified email addresses will be returned. + """ + emails: [String!] + + """ + ID of a User to filter by. If non-null, only commits authored by this user will be returned. This field takes precedence over emails. + """ + id: ID +} + +"""An edge in a connection.""" +type GitHubCommitEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubCommit +} + +"""The connection type for Commit.""" +type GitHubCommitHistoryConnection { + """A list of edges.""" + edges: [GitHubCommitEdge] + + """A list of nodes.""" + nodes: [GitHubCommit] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Represents a range of information from a Git blame.""" +type GitHubBlameRange { + """ + Identifies the recency of the change, from 1 (new) to 10 (old). This is calculated as a 2-quantile and determines the length of distance between the median age of all the changes in the file and the recency of the current range's change. + """ + age: Int! + + """Identifies the line author""" + commit: GitHubCommit! + + """The ending line for the range""" + endingLine: Int! + + """The starting line for the range""" + startingLine: Int! +} + +"""Represents a Git blame.""" +type GitHubBlame { + """The list of ranges from a Git blame.""" + ranges: [GitHubBlameRange!]! +} + +enum GitHubPullRequestOrderField { + """Order pull_requests by creation time""" + CREATED_AT + + """Order pull_requests by update time""" + UPDATED_AT +} + +"""Ways in which lists of issues can be ordered upon return.""" +input GitHubPullRequestOrder { + """The direction in which to order pull requests by the specified field.""" + direction: GitHubOrderDirection! + + """The field in which to order pull requests by.""" + field: GitHubPullRequestOrderField! +} + +enum GitHubPullRequestTimelineItemsItemType { + """Represents a Git commit part of a pull request.""" + PULL_REQUEST_COMMIT + + """Represents a commit comment thread part of a pull request.""" + PULL_REQUEST_COMMIT_COMMENT_THREAD + + """A review object for a given pull request.""" + PULL_REQUEST_REVIEW + + """A threaded list of comments for a given pull request.""" + PULL_REQUEST_REVIEW_THREAD + + """ + Represents the latest point in the pull request timeline for which the viewer has seen the pull request's commits. + """ + PULL_REQUEST_REVISION_MARKER + + """ + Represents a 'base_ref_changed' event on a given issue or pull request. + """ + BASE_REF_CHANGED_EVENT + + """Represents a 'base_ref_force_pushed' event on a given pull request.""" + BASE_REF_FORCE_PUSHED_EVENT + + """Represents a 'deployed' event on a given pull request.""" + DEPLOYED_EVENT + + """ + Represents a 'deployment_environment_changed' event on a given pull request. + """ + DEPLOYMENT_ENVIRONMENT_CHANGED_EVENT + + """Represents a 'head_ref_deleted' event on a given pull request.""" + HEAD_REF_DELETED_EVENT + + """Represents a 'head_ref_force_pushed' event on a given pull request.""" + HEAD_REF_FORCE_PUSHED_EVENT + + """Represents a 'head_ref_restored' event on a given pull request.""" + HEAD_REF_RESTORED_EVENT + + """Represents a 'merged' event on a given pull request.""" + MERGED_EVENT + + """ + Represents a 'review_dismissed' event on a given issue or pull request. + """ + REVIEW_DISMISSED_EVENT + + """Represents an 'review_requested' event on a given pull request.""" + REVIEW_REQUESTED_EVENT + + """Represents an 'review_request_removed' event on a given pull request.""" + REVIEW_REQUEST_REMOVED_EVENT + + """Represents a 'ready_for_review' event on a given pull request.""" + READY_FOR_REVIEW_EVENT + + """Represents a comment on an Issue.""" + ISSUE_COMMENT + + """Represents a mention made by one issue or pull request to another.""" + CROSS_REFERENCED_EVENT + + """ + Represents a 'added_to_project' event on a given issue or pull request. + """ + ADDED_TO_PROJECT_EVENT + + """Represents an 'assigned' event on any assignable object.""" + ASSIGNED_EVENT + + """Represents a 'closed' event on any `Closable`.""" + CLOSED_EVENT + + """Represents a 'comment_deleted' event on a given issue or pull request.""" + COMMENT_DELETED_EVENT + + """Represents a 'connected' event on a given issue or pull request.""" + CONNECTED_EVENT + + """ + Represents a 'converted_note_to_issue' event on a given issue or pull request. + """ + CONVERTED_NOTE_TO_ISSUE_EVENT + + """Represents a 'demilestoned' event on a given issue or pull request.""" + DEMILESTONED_EVENT + + """Represents a 'disconnected' event on a given issue or pull request.""" + DISCONNECTED_EVENT + + """Represents a 'labeled' event on a given issue or pull request.""" + LABELED_EVENT + + """Represents a 'locked' event on a given issue or pull request.""" + LOCKED_EVENT + + """ + Represents a 'marked_as_duplicate' event on a given issue or pull request. + """ + MARKED_AS_DUPLICATE_EVENT + + """Represents a 'mentioned' event on a given issue or pull request.""" + MENTIONED_EVENT + + """Represents a 'milestoned' event on a given issue or pull request.""" + MILESTONED_EVENT + + """ + Represents a 'moved_columns_in_project' event on a given issue or pull request. + """ + MOVED_COLUMNS_IN_PROJECT_EVENT + + """Represents a 'pinned' event on a given issue or pull request.""" + PINNED_EVENT + + """Represents a 'referenced' event on a given `ReferencedSubject`.""" + REFERENCED_EVENT + + """ + Represents a 'removed_from_project' event on a given issue or pull request. + """ + REMOVED_FROM_PROJECT_EVENT + + """Represents a 'renamed' event on a given issue or pull request""" + RENAMED_TITLE_EVENT + + """Represents a 'reopened' event on any `Closable`.""" + REOPENED_EVENT + + """Represents a 'subscribed' event on a given `Subscribable`.""" + SUBSCRIBED_EVENT + + """Represents a 'transferred' event on a given issue or pull request.""" + TRANSFERRED_EVENT + + """Represents an 'unassigned' event on any assignable object.""" + UNASSIGNED_EVENT + + """Represents an 'unlabeled' event on a given issue or pull request.""" + UNLABELED_EVENT + + """Represents an 'unlocked' event on a given issue or pull request.""" + UNLOCKED_EVENT + + """Represents a 'user_blocked' event on a given user.""" + USER_BLOCKED_EVENT + + """ + Represents an 'unmarked_as_duplicate' event on a given issue or pull request. + """ + UNMARKED_AS_DUPLICATE_EVENT + + """Represents an 'unpinned' event on a given issue or pull request.""" + UNPINNED_EVENT + + """Represents an 'unsubscribed' event on a given `Subscribable`.""" + UNSUBSCRIBED_EVENT +} + +"""An edge in a connection.""" +type GitHubPullRequestTimelineItemsEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubPullRequestTimelineItems +} + +"""The connection type for PullRequestTimelineItems.""" +type GitHubPullRequestTimelineItemsConnection { + """A list of edges.""" + edges: [GitHubPullRequestTimelineItemsEdge] + + """ + Identifies the count of items after applying `before` and `after` filters. + """ + filteredCount: Int! + + """A list of nodes.""" + nodes: [GitHubPullRequestTimelineItems] + + """ + Identifies the count of items after applying `before`/`after` filters and `first`/`last`/`skip` slicing. + """ + pageCount: Int! + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! + + """Identifies the date and time when the timeline was last updated.""" + updatedAt: String! +} + +"""An edge in a connection.""" +type GitHubPullRequestTimelineItemEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubPullRequestTimelineItem +} + +"""The connection type for PullRequestTimelineItem.""" +type GitHubPullRequestTimelineConnection { + """A list of edges.""" + edges: [GitHubPullRequestTimelineItemEdge] + + """A list of nodes.""" + nodes: [GitHubPullRequestTimelineItem] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +A suggestion to review a pull request based on a user's commit history and review comments. +""" +type GitHubSuggestedReviewer { + """Is this suggestion based on past commits?""" + isAuthor: Boolean! + + """Is this suggestion based on past review comments?""" + isCommenter: Boolean! + + """Identifies the user suggested to review the pull request.""" + reviewer: GitHubUser! +} + +"""An edge in a connection.""" +type GitHubPullRequestReviewEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubPullRequestReview +} + +"""The connection type for PullRequestReview.""" +type GitHubPullRequestReviewConnection { + """A list of edges.""" + edges: [GitHubPullRequestReviewEdge] + + """A list of nodes.""" + nodes: [GitHubPullRequestReview] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type GitHubPullRequestReviewThreadEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubPullRequestReviewThread +} + +"""Review comment threads for a pull request review.""" +type GitHubPullRequestReviewThreadConnection { + """A list of edges.""" + edges: [GitHubPullRequestReviewThreadEdge] + + """A list of nodes.""" + nodes: [GitHubPullRequestReviewThread] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A request for a user to review a pull request.""" +type GitHubReviewRequest implements OneGraphNode & GitHubNode { + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + + """Identifies the pull request associated with this review request.""" + pullRequest: GitHubPullRequest! + + """The reviewer that is requested.""" + requestedReviewer: GitHubRequestedReviewer + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubReviewRequestEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubReviewRequest +} + +"""The connection type for ReviewRequest.""" +type GitHubReviewRequestConnection { + """A list of edges.""" + edges: [GitHubReviewRequestEdge] + + """A list of nodes.""" + nodes: [GitHubReviewRequest] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubMergeableState { + """The pull request can be merged.""" + MERGEABLE + + """The pull request cannot be merged due to merge conflicts.""" + CONFLICTING + + """The mergeability of the pull request is still being calculated.""" + UNKNOWN +} + +"""A file changed in a pull request.""" +type GitHubPullRequestChangedFile { + """The number of additions to the file.""" + additions: Int! + + """The number of deletions to the file.""" + deletions: Int! + + """The path of the file.""" + path: String! +} + +"""An edge in a connection.""" +type GitHubPullRequestChangedFileEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubPullRequestChangedFile +} + +"""The connection type for PullRequestChangedFile.""" +type GitHubPullRequestChangedFileConnection { + """A list of edges.""" + edges: [GitHubPullRequestChangedFileEdge] + + """A list of nodes.""" + nodes: [GitHubPullRequestChangedFile] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type GitHubPullRequestCommitEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubPullRequestCommit +} + +"""The connection type for PullRequestCommit.""" +type GitHubPullRequestCommitConnection { + """A list of edges.""" + edges: [GitHubPullRequestCommitEdge] + + """A list of nodes.""" + nodes: [GitHubPullRequestCommit] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Represents an owner of a registry package.""" +interface GitHubRegistryPackageOwner { + """""" + id: ID! + + """A list of registry packages under the owner.""" + registryPackages( + """Filter registry package by whether it is publicly visible""" + publicOnly: Boolean + + """Filter registry package by type (string).""" + registryPackageType: String + + """Filter registry package by type.""" + packageType: GitHubRegistryPackageType + + """Find registry packages in a repository.""" + repositoryId: ID + + """Find registry packages by their names.""" + names: [String] + + """Find registry package by name.""" + name: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageOwner` object instead. Removal on 2020-04-01 UTC.") +} + +"""Represents an interface to search packages on an object.""" +interface GitHubRegistryPackageSearch { + """""" + id: ID! + + """A list of registry packages for a particular search query.""" + registryPackagesForQuery( + """Filter registry package by type.""" + packageType: GitHubRegistryPackageType + + """Find registry package by search query.""" + query: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageSearch` object instead. Removal on 2020-04-01 UTC.") +} + +"""A subset of repository info.""" +interface GitHubRepositoryInfo { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The description of the repository.""" + description: String + + """The description of the repository rendered to HTML.""" + descriptionHTML: String! + + """ + Returns how many forks there are of this repository in the whole network. + """ + forkCount: Int! + + """Indicates if the repository has issues feature enabled.""" + hasIssuesEnabled: Boolean! + + """Indicates if the repository has the Projects feature enabled.""" + hasProjectsEnabled: Boolean! + + """Indicates if the repository has wiki feature enabled.""" + hasWikiEnabled: Boolean! + + """The repository's URL.""" + homepageUrl: String + + """Indicates if the repository is unmaintained.""" + isArchived: Boolean! + + """Identifies if the repository is a fork.""" + isFork: Boolean! + + """Indicates if the repository has been locked or not.""" + isLocked: Boolean! + + """Identifies if the repository is a mirror.""" + isMirror: Boolean! + + """Identifies if the repository is private.""" + isPrivate: Boolean! + + """ + Identifies if the repository is a template that can be used to generate new repositories. + """ + isTemplate: Boolean! + + """The license associated with the repository""" + licenseInfo: GitHubLicense + + """The reason the repository has been locked.""" + lockReason: GitHubRepositoryLockReason + + """The repository's original mirror URL.""" + mirrorUrl: String + + """The name of the repository.""" + name: String! + + """The repository's name with owner.""" + nameWithOwner: String! + + """The image used to represent this repository in Open Graph data.""" + openGraphImageUrl: String! + + """The User owner of the repository.""" + owner: GitHubRepositoryOwner! + + """Identifies when the repository was last pushed to.""" + pushedAt: String + + """The HTTP path for this repository""" + resourcePath: String! + + """ + A description of the repository, rendered to HTML without any links in it. + """ + shortDescriptionHTML( + """How many characters to return.""" + limit: Int + ): String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this repository""" + url: String! + + """ + Whether this repository has a custom image to use with Open Graph as opposed to being represented by the owner's avatar. + """ + usesCustomOpenGraphImage: Boolean! +} + +union NpmPackageSourceRepository = GitHubRepository + +union NetlifySiteSourceRepository = GitHubRepository + +type GitHubRepositoryContributorOneGraph { + """The GitHub id of this contributor.""" + id: String! + login: String! + avatarUrl: String + siteAdmin: Boolean! + contributionCount: Int! + user: GitHubUser +} + +type GitHubRepositoryContributorConnection { + """A list of contributors to a repository.""" + nodes: [GitHubRepositoryContributorOneGraph!]! + + """Pagination information for the result""" + pageInfo: PageInfo! +} + +"""An edge in a connection.""" +type GitHubRepositoryVulnerabilityAlertEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubRepositoryVulnerabilityAlert +} + +"""The connection type for RepositoryVulnerabilityAlert.""" +type GitHubRepositoryVulnerabilityAlertConnection { + """A list of edges.""" + edges: [GitHubRepositoryVulnerabilityAlertEdge] + + """A list of nodes.""" + nodes: [GitHubRepositoryVulnerabilityAlert] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type GitHubSubmoduleEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubSubmodule +} + +"""The connection type for Submodule.""" +type GitHubSubmoduleConnection { + """A list of edges.""" + edges: [GitHubSubmoduleEdge] + + """A list of nodes.""" + nodes: [GitHubSubmodule] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type GitHubRepositoryTopicEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubRepositoryTopic +} + +"""The connection type for RepositoryTopic.""" +type GitHubRepositoryTopicConnection { + """A list of edges.""" + edges: [GitHubRepositoryTopicEdge] + + """A list of nodes.""" + nodes: [GitHubRepositoryTopic] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubReleaseOrderField { + """Order releases by creation time""" + CREATED_AT + + """Order releases alphabetically by name""" + NAME +} + +"""Ways in which lists of releases can be ordered upon return.""" +input GitHubReleaseOrder { + """The direction in which to order releases by the specified field.""" + direction: GitHubOrderDirection! + + """The field in which to order releases by.""" + field: GitHubReleaseOrderField! +} + +"""An edge in a connection.""" +type GitHubReleaseEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubRelease +} + +"""The connection type for Release.""" +type GitHubReleaseConnection { + """A list of edges.""" + edges: [GitHubReleaseEdge] + + """A list of nodes.""" + nodes: [GitHubRelease] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Represents a single registry metadatum""" +input GitHubRegistryPackageMetadatum { + """True, if the metadatum can be updated if it already exists""" + update: Boolean + + """Value of the metadatum.""" + value: String! + + """Name of the metadatum.""" + name: String! +} + +"""An edge in a connection.""" +type GitHubTopicEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubTopic +} + +"""The connection type for Topic.""" +type GitHubTopicConnection { + """A list of edges.""" + edges: [GitHubTopicEdge] + + """A list of nodes.""" + nodes: [GitHubTopic] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A version tag contains the mapping between a tag name and a version.""" +type GitHubRegistryPackageTag implements OneGraphNode & GitHubNode { + """""" + id: ID! + + """Identifies the tag name of the version.""" + name: String! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageTag` object instead. Removal on 2020-04-01 UTC.") + + """version that the tag is associated with""" + version: GitHubRegistryPackageVersion @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageTag` object instead. Removal on 2020-04-01 UTC.") + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubRegistryPackageTagEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubRegistryPackageTag +} + +"""The connection type for RegistryPackageTag.""" +type GitHubRegistryPackageTagConnection { + """A list of edges.""" + edges: [GitHubRegistryPackageTagEdge] + + """A list of nodes.""" + nodes: [GitHubRegistryPackageTag] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +Represents a object that contains package activity statistics such as downloads. +""" +type GitHubRegistryPackageStatistics { + """Number of times the package was downloaded this month.""" + downloadsThisMonth: Int! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageStatistics` object instead. Removal on 2020-04-01 UTC.") + + """Number of times the package was downloaded this week.""" + downloadsThisWeek: Int! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageStatistics` object instead. Removal on 2020-04-01 UTC.") + + """Number of times the package was downloaded this year.""" + downloadsThisYear: Int! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageStatistics` object instead. Removal on 2020-04-01 UTC.") + + """Number of times the package was downloaded today.""" + downloadsToday: Int! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageStatistics` object instead. Removal on 2020-04-01 UTC.") + + """Number of times the package was downloaded since it was created.""" + downloadsTotalCount: Int! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageStatistics` object instead. Removal on 2020-04-01 UTC.") +} + +"""An edge in a connection.""" +type GitHubRegistryPackageVersionEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubRegistryPackageVersion +} + +"""The connection type for RegistryPackageVersion.""" +type GitHubRegistryPackageVersionConnection { + """A list of edges.""" + edges: [GitHubRegistryPackageVersionEdge] + + """A list of nodes.""" + nodes: [GitHubRegistryPackageVersion] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubRegistryPackageType { + """An npm registry package.""" + NPM + + """A rubygems registry package.""" + RUBYGEMS + + """A maven registry package.""" + MAVEN + + """A docker image.""" + DOCKER + + """A debian package.""" + DEBIAN + + """A nuget package.""" + NUGET + + """A python package.""" + PYTHON +} + +""" +Represents a object that contains package version activity statistics such as downloads. +""" +type GitHubRegistryPackageVersionStatistics { + """Number of times the package was downloaded this month.""" + downloadsThisMonth: Int! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersionStatistics` object instead. Removal on 2020-04-01 UTC.") + + """Number of times the package was downloaded this week.""" + downloadsThisWeek: Int! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersionStatistics` object instead. Removal on 2020-04-01 UTC.") + + """Number of times the package was downloaded this year.""" + downloadsThisYear: Int! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersionStatistics` object instead. Removal on 2020-04-01 UTC.") + + """Number of times the package was downloaded today.""" + downloadsToday: Int! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersionStatistics` object instead. Removal on 2020-04-01 UTC.") + + """Number of times the package was downloaded since it was created.""" + downloadsTotalCount: Int! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersionStatistics` object instead. Removal on 2020-04-01 UTC.") +} + +"""An edge in a connection.""" +type GitHubRegistryPackageFileEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubRegistryPackageFile +} + +"""The connection type for RegistryPackageFile.""" +type GitHubRegistryPackageFileConnection { + """A list of edges.""" + edges: [GitHubRegistryPackageFileEdge] + + """A list of nodes.""" + nodes: [GitHubRegistryPackageFile] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A file in a specific registry package version.""" +type GitHubRegistryPackageFile implements OneGraphNode & GitHubNode { + """A unique identifier for this file.""" + guid: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageFile` object instead. Removal on 2020-04-01 UTC.") + + """""" + id: ID! + + """Identifies the md5.""" + md5: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageFile` object instead. Removal on 2020-04-01 UTC.") + + """URL to download the asset metadata.""" + metadataUrl: String! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageFile` object instead. Removal on 2020-04-01 UTC.") + + """Name of the file""" + name: String! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageFile` object instead. Removal on 2020-04-01 UTC.") + + """The package version this file belongs to.""" + packageVersion: GitHubRegistryPackageVersion! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageFile` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the sha1.""" + sha1: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageFile` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the sha256.""" + sha256: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageFile` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the size.""" + size: Int @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageFile` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """URL to download the asset.""" + url: String! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageFile` object instead. Removal on 2020-04-01 UTC.") + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubRegistryPackageDependencyType { + """A default registry package dependency type.""" + DEFAULT + + """A dev registry package dependency type.""" + DEV + + """A test registry package dependency type.""" + TEST + + """A peer registry package dependency type.""" + PEER + + """An optional registry package dependency type.""" + OPTIONAL + + """An optional registry package dependency type.""" + BUNDLED +} + +""" +A package dependency contains the information needed to satisfy a dependency. +""" +type GitHubRegistryPackageDependency implements OneGraphNode & GitHubNode { + """Identifies the type of dependency.""" + dependencyType: GitHubRegistryPackageDependencyType! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageDependency` object instead. Removal on 2020-04-01 UTC.") + + """""" + id: ID! + + """Identifies the name of the dependency.""" + name: String! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageDependency` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the version of the dependency.""" + version: String! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageDependency` object instead. Removal on 2020-04-01 UTC.") + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubRegistryPackageDependencyEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubRegistryPackageDependency +} + +"""The connection type for RegistryPackageDependency.""" +type GitHubRegistryPackageDependencyConnection { + """A list of edges.""" + edges: [GitHubRegistryPackageDependencyEdge] + + """A list of nodes.""" + nodes: [GitHubRegistryPackageDependency] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +A package version contains the information about a specific package version. +""" +type GitHubRegistryPackageVersion implements OneGraphNode & GitHubNode { + """list of dependencies for this package""" + dependencies( + """Find dependencies by type.""" + type: GitHubRegistryPackageDependencyType + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageDependencyConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """A file associated with this registry package version""" + fileByName( + """A specific file to find.""" + filename: String! + ): GitHubRegistryPackageFile @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """List of files associated with this registry package version""" + files( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageFileConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """""" + id: ID! + + """A single line of text to install this package version.""" + installationCommand: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the package manifest for this package version.""" + manifest: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the platform this version was built for.""" + platform: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """Indicates whether this version is a pre-release.""" + preRelease: Boolean! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """The README of this package version""" + readme: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """The HTML README of this package version""" + readmeHtml: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """Registry package associated with this version.""" + registryPackage: GitHubRegistryPackage @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """Release associated with this package.""" + release: GitHubRelease @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the sha256.""" + sha256: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the size.""" + size: Int @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """Statistics about package activity.""" + statistics: GitHubRegistryPackageVersionStatistics @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the package version summary.""" + summary: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """ + Time at which the most recent file upload for this package version finished + """ + updatedAt: String! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the version number.""" + version: String! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + + """Can the current viewer edit this Package version.""" + viewerCanEdit: Boolean! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageVersion` object instead. Removal on 2020-04-01 UTC.") + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A registry package contains the content for an uploaded package.""" +type GitHubRegistryPackage implements OneGraphNode & GitHubNode { + """The package type color""" + color: String! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """""" + id: ID! + + """Find the latest version for the package.""" + latestVersion: GitHubRegistryPackageVersion @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the title of the package.""" + name: String! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """Identifies the title of the package, with the owner prefixed.""" + nameWithOwner: String! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """Find the package file identified by the guid.""" + packageFileByGuid( + """The unique identifier of the package_file""" + guid: String! + ): GitHubRegistryPackageFile @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object. Removal on 2020-04-01 UTC.") + + """Find the package file identified by the sha256.""" + packageFileBySha256( + """The SHA256 of the package_file""" + sha256: String! + ): GitHubRegistryPackageFile @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object. Removal on 2020-04-01 UTC.") + + """Identifies the type of the package.""" + packageType: GitHubRegistryPackageType! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """List the prerelease versions for this package.""" + preReleaseVersions( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageVersionConnection @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """The type of the package.""" + registryPackageType: String @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """repository that the release is associated with""" + repository: GitHubRepository @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """Statistics about package activity.""" + statistics: GitHubRegistryPackageStatistics @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """list of tags for this package""" + tags( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageTagConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object. Removal on 2020-04-01 UTC.") + + """List the topics for this package.""" + topics( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubTopicConnection @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object. Removal on 2020-04-01 UTC.") + + """Find package version by version string.""" + version( + """The package version.""" + version: String! + ): GitHubRegistryPackageVersion @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """Find package version by version string.""" + versionByPlatform( + """Find a registry package for a specific platform.""" + platform: String! + + """The package version.""" + version: String! + ): GitHubRegistryPackageVersion @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """Find package version by manifest SHA256.""" + versionBySha256( + """The package SHA256 digest.""" + sha256: String! + ): GitHubRegistryPackageVersion @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """list of versions for this package""" + versions( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageVersionConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + + """List package versions with a specific metadatum.""" + versionsByMetadatum( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filter on a specific metadatum.""" + metadatum: GitHubRegistryPackageMetadatum! + ): GitHubRegistryPackageVersionConnection @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `Package` object instead. Removal on 2020-04-01 UTC.") + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubRegistryPackageEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubRegistryPackage +} + +"""The connection type for RegistryPackage.""" +type GitHubRegistryPackageConnection { + """A list of edges.""" + edges: [GitHubRegistryPackageEdge] + + """A list of nodes.""" + nodes: [GitHubRegistryPackage] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubRefOrderField { + """Order refs by underlying commit date if the ref prefix is refs/tags/""" + TAG_COMMIT_DATE + + """Order refs by their alphanumeric name""" + ALPHABETICAL +} + +"""Ways in which lists of git refs can be ordered upon return.""" +input GitHubRefOrder { + """The direction in which to order refs by the specified field.""" + direction: GitHubOrderDirection! + + """The field in which to order refs by.""" + field: GitHubRefOrderField! +} + +enum GitHubProjectOrderField { + """Order projects by creation time""" + CREATED_AT + + """Order projects by update time""" + UPDATED_AT + + """Order projects by name""" + NAME +} + +"""Ways in which lists of projects can be ordered upon return.""" +input GitHubProjectOrder { + """The direction in which to order projects by the specified field.""" + direction: GitHubOrderDirection! + + """The field in which to order projects by.""" + field: GitHubProjectOrderField! +} + +"""An edge in a connection.""" +type GitHubProjectEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubProject +} + +"""A list of projects associated with the owner.""" +type GitHubProjectConnection { + """A list of edges.""" + edges: [GitHubProjectEdge] + + """A list of nodes.""" + nodes: [GitHubProject] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Represents a Git blob.""" +type GitHubBlob implements OneGraphNode & GitHubNode & GitHubGitObject { + """An abbreviated version of the Git object ID""" + abbreviatedOid: String! + + """Byte size of Blob object""" + byteSize: Int! + + """The HTTP path for this Git object""" + commitResourcePath: String! + + """The HTTP URL for this Git object""" + commitUrl: String! + + """""" + id: ID! + + """Indicates whether the Blob is binary or text""" + isBinary: Boolean! + + """Indicates whether the contents is truncated""" + isTruncated: Boolean! + + """The Git object ID""" + oid: String! + + """The Repository the Git object belongs to""" + repository: GitHubRepository! + + """UTF8 text data or null if the Blob is binary""" + text: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents an actor in a Git commit (ie. an author or committer).""" +type GitHubGitActor { + """A URL pointing to the author's public avatar.""" + avatarUrl( + """The size of the resulting square image.""" + size: Int + ): String! + + """The timestamp of the Git action (authoring or committing).""" + date: String + + """The email in the Git commit.""" + email: String + + """The name in the Git commit.""" + name: String + + """ + The GitHub user corresponding to the email field. Null if no such user exists. + """ + user: GitHubUser +} + +"""Represents a Git tag.""" +type GitHubTag implements OneGraphNode & GitHubNode & GitHubGitObject { + """An abbreviated version of the Git object ID""" + abbreviatedOid: String! + + """The HTTP path for this Git object""" + commitResourcePath: String! + + """The HTTP URL for this Git object""" + commitUrl: String! + + """""" + id: ID! + + """The Git tag message.""" + message: String + + """The Git tag name.""" + name: String! + + """The Git object ID""" + oid: String! + + """The Repository the Git object belongs to""" + repository: GitHubRepository! + + """Details about the tag author.""" + tagger: GitHubGitActor + + """The Git object the tag points to.""" + target: GitHubGitObject! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A pointer to a repository at a specific revision embedded inside another repository. +""" +type GitHubSubmodule { + """The branch of the upstream submodule for tracking updates""" + branch: String + + """The git URL of the submodule repository""" + gitUrl: String! + + """The name of the submodule in .gitmodules""" + name: String! + + """The path in the superproject that this submodule is located in""" + path: String! + + """ + The commit revision of the subproject repository being tracked by the submodule + """ + subprojectCommitOid: String +} + +"""Represents a Git tree entry.""" +type GitHubTreeEntry { + """Entry file mode.""" + mode: Int! + + """Entry file name.""" + name: String! + + """Entry file object.""" + object: GitHubGitObject + + """Entry file Git object ID.""" + oid: String! + + """The Repository the tree entry belongs to""" + repository: GitHubRepository! + + """ + If the TreeEntry is for a directory occupied by a submodule project, this returns the corresponding submodule + """ + submodule: GitHubSubmodule + + """Entry file type.""" + type: String! +} + +"""Represents a Git tree.""" +type GitHubTree implements OneGraphNode & GitHubNode & GitHubGitObject { + """An abbreviated version of the Git object ID""" + abbreviatedOid: String! + + """The HTTP path for this Git object""" + commitResourcePath: String! + + """The HTTP URL for this Git object""" + commitUrl: String! + + """A list of tree entries.""" + entries: [GitHubTreeEntry!] + + """""" + id: ID! + + """The Git object ID""" + oid: String! + + """The Repository the Git object belongs to""" + repository: GitHubRepository! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a Git object.""" +interface GitHubGitObject { + """An abbreviated version of the Git object ID""" + abbreviatedOid: String! + + """The HTTP path for this Git object""" + commitResourcePath: String! + + """The HTTP URL for this Git object""" + commitUrl: String! + + """""" + id: ID! + + """The Git object ID""" + oid: String! + + """The Repository the Git object belongs to""" + repository: GitHubRepository! +} + +enum GitHubMilestoneOrderField { + """Order milestones by when they are due.""" + DUE_DATE + + """Order milestones by when they were created.""" + CREATED_AT + + """Order milestones by when they were last updated.""" + UPDATED_AT + + """Order milestones by their number.""" + NUMBER +} + +"""Ordering options for milestone connections.""" +input GitHubMilestoneOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order milestones by.""" + field: GitHubMilestoneOrderField! +} + +"""An edge in a connection.""" +type GitHubMilestoneEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubMilestone +} + +"""The connection type for Milestone.""" +type GitHubMilestoneConnection { + """A list of edges.""" + edges: [GitHubMilestoneEdge] + + """A list of nodes.""" + nodes: [GitHubMilestone] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubRepositoryLockReason { + """The repository is locked due to a move.""" + MOVING + + """The repository is locked due to a billing related reason.""" + BILLING + + """The repository is locked due to a rename.""" + RENAME + + """The repository is locked due to a migration.""" + MIGRATING +} + +"""Describes a License's conditions, permissions, and limitations""" +type GitHubLicenseRule { + """A description of the rule""" + description: String! + + """The machine-readable rule key""" + key: String! + + """The human-readable rule label""" + label: String! +} + +"""A repository's open source license""" +type GitHubLicense implements OneGraphNode & GitHubNode { + """The full text of the license""" + body: String! + + """The conditions set by the license""" + conditions: [GitHubLicenseRule]! + + """A human-readable description of the license""" + description: String + + """Whether the license should be featured""" + featured: Boolean! + + """Whether the license should be displayed in license pickers""" + hidden: Boolean! + + """""" + id: ID! + + """Instructions on how to implement the license""" + implementation: String + + """The lowercased SPDX ID of the license""" + key: String! + + """The limitations set by the license""" + limitations: [GitHubLicenseRule]! + + """The license full name specified by <https://spdx.org/licenses>""" + name: String! + + """Customary short name if applicable (e.g, GPLv3)""" + nickname: String + + """The permissions set by the license""" + permissions: [GitHubLicenseRule]! + + """ + Whether the license is a pseudo-license placeholder (e.g., other, no-license) + """ + pseudoLicense: Boolean! + + """Short identifier specified by <https://spdx.org/licenses>""" + spdxId: String + + """URL to the license on <https://choosealicense.com>""" + url: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubLanguageOrderField { + """Order languages by the size of all files containing the language""" + SIZE +} + +"""Ordering options for language connections.""" +input GitHubLanguageOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order languages by.""" + field: GitHubLanguageOrderField! +} + +"""Represents the language of a repository.""" +type GitHubLanguageEdge { + """""" + cursor: String! + + """""" + node: GitHubLanguage! + + """The number of bytes of code written in the language.""" + size: Int! +} + +"""A list of languages associated with the parent.""" +type GitHubLanguageConnection { + """A list of edges.""" + edges: [GitHubLanguageEdge] + + """A list of nodes.""" + nodes: [GitHubLanguage] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! + + """The total size in bytes of files written in that language.""" + totalSize: Int! +} + +enum GitHubFundingPlatform { + """GitHub funding platform.""" + GITHUB + + """Patreon funding platform.""" + PATREON + + """Open Collective funding platform.""" + OPEN_COLLECTIVE + + """Ko-fi funding platform.""" + KO_FI + + """Tidelift funding platform.""" + TIDELIFT + + """Community Bridge funding platform.""" + COMMUNITY_BRIDGE + + """Liberapay funding platform.""" + LIBERAPAY + + """IssueHunt funding platform.""" + ISSUEHUNT + + """Otechie funding platform.""" + OTECHIE + + """Custom funding platform.""" + CUSTOM +} + +"""A funding platform link for a repository.""" +type GitHubFundingLink { + """The funding platform this link is for.""" + platform: GitHubFundingPlatform! + + """The configured URL for this funding link.""" + url: String! +} + +enum GitHubRepositoryAffiliation { + """Repositories that are owned by the authenticated user.""" + OWNER + + """Repositories that the user has been added to as a collaborator.""" + COLLABORATOR + + """ + Repositories that the user has access to through being a member of an organization. This includes every repository on every team that the user is on. + """ + ORGANIZATION_MEMBER +} + +enum GitHubRepositoryOrderField { + """Order repositories by creation time""" + CREATED_AT + + """Order repositories by update time""" + UPDATED_AT + + """Order repositories by push time""" + PUSHED_AT + + """Order repositories by name""" + NAME + + """Order repositories by number of stargazers""" + STARGAZERS +} + +"""Ordering options for repository connections""" +input GitHubRepositoryOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order repositories by.""" + field: GitHubRepositoryOrderField! +} + +enum GitHubRepositoryPrivacy { + """Public""" + PUBLIC + + """Private""" + PRIVATE +} + +"""An edge in a connection.""" +type GitHubRepositoryEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubRepository +} + +"""A list of repositories owned by the subject.""" +type GitHubRepositoryConnection { + """A list of edges.""" + edges: [GitHubRepositoryEdge] + + """A list of nodes.""" + nodes: [GitHubRepository] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! + + """The total size in kilobytes of all repositories in the connection.""" + totalDiskUsage: Int! +} + +enum GitHubDeploymentOrderField { + """Order collection by creation time""" + CREATED_AT +} + +"""Ordering options for deployment connections""" +input GitHubDeploymentOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order deployments by.""" + field: GitHubDeploymentOrderField! +} + +"""An edge in a connection.""" +type GitHubDeploymentEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubDeployment +} + +"""The connection type for Deployment.""" +type GitHubDeploymentConnection { + """A list of edges.""" + edges: [GitHubDeploymentEdge] + + """A list of nodes.""" + nodes: [GitHubDeployment] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A repository deploy key.""" +type GitHubDeployKey implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """The deploy key.""" + key: String! + + """Whether or not the deploy key is read only.""" + readOnly: Boolean! + + """The deploy key title.""" + title: String! + + """Whether or not the deploy key has been verified.""" + verified: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubDeployKeyEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubDeployKey +} + +"""The connection type for DeployKey.""" +type GitHubDeployKeyConnection { + """A list of edges.""" + edges: [GitHubDeployKeyEdge] + + """A list of nodes.""" + nodes: [GitHubDeployKey] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubCollaboratorAffiliation { + """All outside collaborators of an organization-owned subject.""" + OUTSIDE + + """ + All collaborators with permissions to an organization-owned subject, regardless of organization membership status. + """ + DIRECT + + """All collaborators the authenticated user can see.""" + ALL +} + +enum GitHubDefaultRepositoryPermissionField { + """No access""" + NONE + + """Can read repos by default""" + READ + + """Can read and write repos by default""" + WRITE + + """Can read, write, and administrate repos by default""" + ADMIN +} + +"""A level of permission and source for a user's access to a repository.""" +type GitHubPermissionSource { + """The organization the repository belongs to.""" + organization: GitHubOrganization! + + """The level of access this source has granted to the user.""" + permission: GitHubDefaultRepositoryPermissionField! + + """The source of this permission.""" + source: GitHubPermissionGranter! +} + +"""Represents a user who is a collaborator of a repository.""" +type GitHubRepositoryCollaboratorEdge { + """A cursor for use in pagination.""" + cursor: String! + + """""" + node: GitHubUser! + + """The permission the user has on the repository.""" + permission: GitHubRepositoryPermission! + + """A list of sources for the user's access to the repository.""" + permissionSources: [GitHubPermissionSource!] +} + +"""The connection type for User.""" +type GitHubRepositoryCollaboratorConnection { + """A list of edges.""" + edges: [GitHubRepositoryCollaboratorEdge] + + """A list of nodes.""" + nodes: [GitHubUser] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""The Code of Conduct for a repository""" +type GitHubCodeOfConduct implements OneGraphNode & GitHubNode { + """The body of the Code of Conduct""" + body: String + + """""" + id: ID! + + """The key for the Code of Conduct""" + key: String! + + """The formal name of the Code of Conduct""" + name: String! + + """The HTTP path for this Code of Conduct""" + resourcePath: String + + """The HTTP URL for this Code of Conduct""" + url: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A team or user who has the ability to dismiss a review on a protected branch. +""" +type GitHubReviewDismissalAllowance implements OneGraphNode & GitHubNode { + """The actor that can dismiss.""" + actor: GitHubReviewDismissalAllowanceActor + + """ + Identifies the branch protection rule associated with the allowed user or team. + """ + branchProtectionRule: GitHubBranchProtectionRule + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubReviewDismissalAllowanceEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubReviewDismissalAllowance +} + +"""The connection type for ReviewDismissalAllowance.""" +type GitHubReviewDismissalAllowanceConnection { + """A list of edges.""" + edges: [GitHubReviewDismissalAllowanceEdge] + + """A list of nodes.""" + nodes: [GitHubReviewDismissalAllowance] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Entities that have members who can set status messages.""" +interface GitHubMemberStatusable { + """ + Get the status messages members of this entity have set that are either public or visible only to the organization. + """ + memberStatuses( + """Ordering options for user statuses returned from the connection.""" + orderBy: GitHubUserStatusOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserStatusConnection! +} + +"""Types that can grant permissions on a repository to a user""" +union GitHubPermissionGranter = GitHubTeam | GitHubRepository | GitHubOrganization + +"""Represents a 'ready_for_review' event on a given pull request.""" +type GitHubReadyForReviewEvent implements OneGraphNode & GitHubUniformResourceLocatable & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """PullRequest referenced by event.""" + pullRequest: GitHubPullRequest! + + """The HTTP path for this ready for review event.""" + resourcePath: String! + + """The HTTP URL for this ready for review event.""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A release asset contains the content for a release asset.""" +type GitHubReleaseAsset implements OneGraphNode & GitHubNode { + """The asset's content-type""" + contentType: String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The number of times this asset was downloaded""" + downloadCount: Int! + + """ + Identifies the URL where you can download the release asset via the browser. + """ + downloadUrl: String! + + """""" + id: ID! + + """Identifies the title of the release asset.""" + name: String! + + """Release that the asset is associated with""" + release: GitHubRelease + + """The size (in bytes) of the asset""" + size: Int! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The user that performed the upload""" + uploadedBy: GitHubUser! + + """Identifies the URL of the release asset.""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubReleaseAssetEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubReleaseAsset +} + +"""The connection type for ReleaseAsset.""" +type GitHubReleaseAssetConnection { + """A list of edges.""" + edges: [GitHubReleaseAssetEdge] + + """A list of nodes.""" + nodes: [GitHubReleaseAsset] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A release contains the content for a release.""" +type GitHubRelease implements OneGraphNode & GitHubUniformResourceLocatable & GitHubNode { + """The author of the release""" + author: GitHubUser + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The description of the release.""" + description: String + + """The description of this release rendered to HTML.""" + descriptionHTML: String + + """""" + id: ID! + + """Whether or not the release is a draft""" + isDraft: Boolean! + + """Whether or not the release is a prerelease""" + isPrerelease: Boolean! + + """The title of the release.""" + name: String + + """Identifies the date and time when the release was created.""" + publishedAt: String + + """List of releases assets which are dependent on this release.""" + releaseAssets( + """A list of names to filter the assets by.""" + name: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReleaseAssetConnection! + + """The HTTP path for this issue""" + resourcePath: String! + + """ + A description of the release, rendered to HTML without any links in it. + """ + shortDescriptionHTML( + """How many characters to return.""" + limit: Int + ): String + + """The Git tag the release points to""" + tag: GitHubRef + + """The name of the release's Git tag""" + tagName: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this issue""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A repository-topic connects a repository to a topic.""" +type GitHubRepositoryTopic implements OneGraphNode & GitHubUniformResourceLocatable & GitHubNode { + """""" + id: ID! + + """The HTTP path for this repository-topic.""" + resourcePath: String! + + """The topic.""" + topic: GitHubTopic! + + """The HTTP URL for this repository-topic.""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Used for return value of Repository.issueOrPullRequest.""" +union GitHubIssueOrPullRequest = GitHubPullRequest | GitHubIssue + +"""A public description of a Marketplace category.""" +type GitHubMarketplaceCategory implements OneGraphNode & GitHubNode { + """The category's description.""" + description: String + + """ + The technical description of how apps listed in this category work with GitHub. + """ + howItWorks: String + + """""" + id: ID! + + """The category's name.""" + name: String! + + """How many Marketplace listings have this as their primary category.""" + primaryListingCount: Int! + + """The HTTP path for this Marketplace category.""" + resourcePath: String! + + """How many Marketplace listings have this as their secondary category.""" + secondaryListingCount: Int! + + """The short name of the category used in its URL.""" + slug: String! + + """The HTTP URL for this Marketplace category.""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A GitHub App.""" +type GitHubApp implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The description of the app.""" + description: String + + """""" + id: ID! + + """The hex color code, without the leading '#', for the logo background.""" + logoBackgroundColor: String! + + """A URL pointing to the app's logo.""" + logoUrl( + """The size of the resulting image.""" + size: Int + ): String! + + """The name of the app.""" + name: String! + + """A slug based on the name of the app for use in URLs.""" + slug: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The URL to the app's homepage.""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A listing in the GitHub integration marketplace.""" +type GitHubMarketplaceListing implements OneGraphNode & GitHubNode { + """The GitHub App this listing represents.""" + app: GitHubApp + + """URL to the listing owner's company site.""" + companyUrl: String + + """ + The HTTP path for configuring access to the listing's integration or OAuth app + """ + configurationResourcePath: String! + + """ + The HTTP URL for configuring access to the listing's integration or OAuth app + """ + configurationUrl: String! + + """URL to the listing's documentation.""" + documentationUrl: String + + """The listing's detailed description.""" + extendedDescription: String + + """The listing's detailed description rendered to HTML.""" + extendedDescriptionHTML: String! + + """The listing's introductory description.""" + fullDescription: String! + + """The listing's introductory description rendered to HTML.""" + fullDescriptionHTML: String! + + """ + Whether this listing has been submitted for review from GitHub for approval to be displayed in the Marketplace. + """ + hasApprovalBeenRequested: Boolean! @deprecated(reason: "`hasApprovalBeenRequested` will be removed. Use `isVerificationPendingFromDraft` instead. Removal on 2019-10-01 UTC.") + + """Does this listing have any plans with a free trial?""" + hasPublishedFreeTrialPlans: Boolean! + + """Does this listing have a terms of service link?""" + hasTermsOfService: Boolean! + + """A technical description of how this app works with GitHub.""" + howItWorks: String + + """The listing's technical description rendered to HTML.""" + howItWorksHTML: String! + + """""" + id: ID! + + """URL to install the product to the viewer's account or organization.""" + installationUrl: String + + """Whether this listing's app has been installed for the current viewer""" + installedForViewer: Boolean! + + """Whether this listing has been approved for display in the Marketplace.""" + isApproved: Boolean! @deprecated(reason: "`isApproved` will be removed. Use `isPublic` instead. Removal on 2019-10-01 UTC.") + + """Whether this listing has been removed from the Marketplace.""" + isArchived: Boolean! + + """Whether this listing has been removed from the Marketplace.""" + isDelisted: Boolean! @deprecated(reason: "`isDelisted` will be removed. Use `isArchived` instead. Removal on 2019-10-01 UTC.") + + """ + Whether this listing is still an editable draft that has not been submitted for review and is not publicly visible in the Marketplace. + """ + isDraft: Boolean! + + """ + Whether the product this listing represents is available as part of a paid plan. + """ + isPaid: Boolean! + + """Whether this listing has been approved for display in the Marketplace.""" + isPublic: Boolean! + + """ + Whether this listing has been rejected by GitHub for display in the Marketplace. + """ + isRejected: Boolean! + + """ + Whether this listing has been approved for unverified display in the Marketplace. + """ + isUnverified: Boolean! + + """ + Whether this draft listing has been submitted for review for approval to be unverified in the Marketplace. + """ + isUnverifiedPending: Boolean! + + """ + Whether this draft listing has been submitted for review from GitHub for approval to be verified in the Marketplace. + """ + isVerificationPendingFromDraft: Boolean! + + """ + Whether this unverified listing has been submitted for review from GitHub for approval to be verified in the Marketplace. + """ + isVerificationPendingFromUnverified: Boolean! + + """ + Whether this listing has been approved for verified display in the Marketplace. + """ + isVerified: Boolean! + + """The hex color code, without the leading '#', for the logo background.""" + logoBackgroundColor: String! + + """URL for the listing's logo image.""" + logoUrl( + """The size in pixels of the resulting square image.""" + size: Int + ): String + + """The listing's full name.""" + name: String! + + """ + The listing's very short description without a trailing period or ampersands. + """ + normalizedShortDescription: String! + + """URL to the listing's detailed pricing.""" + pricingUrl: String + + """The category that best describes the listing.""" + primaryCategory: GitHubMarketplaceCategory! + + """ + URL to the listing's privacy policy, may return an empty string for listings that do not require a privacy policy URL. + """ + privacyPolicyUrl: String! + + """The HTTP path for the Marketplace listing.""" + resourcePath: String! + + """The URLs for the listing's screenshots.""" + screenshotUrls: [String]! + + """An alternate category that describes the listing.""" + secondaryCategory: GitHubMarketplaceCategory + + """The listing's very short description.""" + shortDescription: String! + + """The short name of the listing used in its URL.""" + slug: String! + + """URL to the listing's status page.""" + statusUrl: String + + """An email address for support for this listing's app.""" + supportEmail: String + + """ + Either a URL or an email address for support for this listing's app, may return an empty string for listings that do not require a support URL. + """ + supportUrl: String! + + """URL to the listing's terms of service.""" + termsOfServiceUrl: String + + """The HTTP URL for the Marketplace listing.""" + url: String! + + """Can the current viewer add plans for this Marketplace listing.""" + viewerCanAddPlans: Boolean! + + """Can the current viewer approve this Marketplace listing.""" + viewerCanApprove: Boolean! + + """Can the current viewer delist this Marketplace listing.""" + viewerCanDelist: Boolean! + + """Can the current viewer edit this Marketplace listing.""" + viewerCanEdit: Boolean! + + """ + Can the current viewer edit the primary and secondary category of this + Marketplace listing. + + """ + viewerCanEditCategories: Boolean! + + """Can the current viewer edit the plans for this Marketplace listing.""" + viewerCanEditPlans: Boolean! + + """ + Can the current viewer return this Marketplace listing to draft state + so it becomes editable again. + + """ + viewerCanRedraft: Boolean! + + """ + Can the current viewer reject this Marketplace listing by returning it to + an editable draft state or rejecting it entirely. + + """ + viewerCanReject: Boolean! + + """ + Can the current viewer request this listing be reviewed for display in + the Marketplace as verified. + + """ + viewerCanRequestApproval: Boolean! + + """ + Indicates whether the current user has an active subscription to this Marketplace listing. + + """ + viewerHasPurchased: Boolean! + + """ + Indicates if the current user has purchased a subscription to this Marketplace listing + for all of the organizations the user owns. + + """ + viewerHasPurchasedForAllOrganizations: Boolean! + + """ + Does the current viewer role allow them to administer this Marketplace listing. + + """ + viewerIsListingAdmin: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""The results of a search.""" +union GitHubSearchResultItem = GitHubUser | GitHubRepository | GitHubPullRequest | GitHubOrganization | GitHubMarketplaceListing | GitHubIssue | GitHubApp + +union StripeTransferReversalSourceRefundUnion = StripeRefund + +union StripeOrderReturnRefundUnion = StripeRefund + +union StripeCreditNoteRefundUnion = StripeRefund + +union StripeTransferReversalDestinationPaymentRefundUnion = StripeRefund + +union StripePayoutBalanceTransactionUnion = StripeBalanceTransaction + +union StripeRefundFailureBalanceTransactionUnion = StripeBalanceTransaction + +union StripeTransferReversalBalanceTransactionUnion = StripeBalanceTransaction + +union StripeTopupBalanceTransactionUnion = StripeBalanceTransaction + +union StripeIssuingTransactionBalanceTransactionUnion = StripeBalanceTransaction + +union StripeFeeRefundBalanceTransactionUnion = StripeBalanceTransaction + +union StripeApplicationFeeBalanceTransactionUnion = StripeBalanceTransaction + +union StripePayoutFailureBalanceTransactionUnion = StripeBalanceTransaction + +union StripeTransferBalanceTransactionUnion = StripeBalanceTransaction + +union StripeRefundBalanceTransactionUnion = StripeBalanceTransaction + +union StripeChargeBalanceTransactionUnion = StripeBalanceTransaction + +"""""" +type StripeFee { + """Amount of the fee, in cents.""" + amount: Int! + + """""" + application: String + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String + + """Type of the fee, one of: `application_fee`, `stripe_fee` or `tax`.""" + type: String! +} + +enum StripeBalanceTransactionTypeEnum { + adjustment + advance + advance_funding + application_fee + application_fee_refund + charge + connect_collection_transfer + issuing_authorization_hold + issuing_authorization_release + issuing_transaction + payment + payment_failure_refund + payment_refund + payout + payout_cancel + payout_failure + refund + refund_failure + reserve_transaction + reserved_funds + stripe_fee + stripe_fx_fee + tax_fee + topup + topup_reversal + transfer + transfer_cancel + transfer_failure + transfer_refund +} + +enum StripeConnectCollectionTransferObjectEnum { + connect_collection_transfer +} + +"""""" +type StripeConnectCollectionTransfer { + """Amount transferred, in %s.""" + amount: Int! + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ID of the account that funds are being collected for.""" + destination: StripeAccount! + + """Unique identifier for the object.""" + id: String! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeConnectCollectionTransferObjectEnum! +} + +union StripeIssuingDisputeDisputedTransactionUnion = StripeIssuingTransaction + +union StripeIssuingTransactionAuthorizationUnion = StripeIssuingAuthorization + +"""""" +type StripeIssuingAuthorizationMerchantData { + """ + A categorization of the seller's type of business. See our [merchant categories guide](https://stripe.com/docs/issuing/merchant-categories) for a list of possible values. + """ + category: String! + + """City where the seller is located""" + city: String + + """Country where the seller is located""" + country: String + + """Name of the seller""" + name: String + + """Identifier assigned to the seller by the card brand""" + networkId: String! + + """Postal code where the seller is located""" + postalCode: String + + """State where the seller is located""" + state: String + + """The url an online purchase was made from""" + url: String +} + +"""""" +type StripeIssuingAuthorizationRequest { + """Whether this request was approved.""" + approved: Boolean! + + """The amount that was authorized at the time of this request""" + authorizedAmount: Int! + + """ + The currency that was presented to the cardholder for the authorization. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + authorizedCurrency: String! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + The amount Stripe held from your account to fund the authorization, if the request was approved + """ + heldAmount: Int! + + """ + The currency of the [held amount](https://stripe.com/docs/api#issuing_authorization_object-held_amount) + """ + heldCurrency: String! + + """ + One of `authentication_failed`, `authorization_controls`, `card_active`, `card_inactive`, `insufficient_funds`, `account_compliance_disabled`, `account_inactive`, `suspected_fraud`, `webhook_approved`, `webhook_declined`, or `webhook_timeout`. + """ + reason: String! +} + +union StripeIssuingTransactionCardUnion = StripeIssuingCard + +union StripeIssuingCardReplacementForUnion = StripeIssuingCard + +"""""" +type StripeIssuingCardShipping { + """""" + address: StripeAddress! + + """ + The delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc. + """ + carrier: String + + """ + A unix timestamp representing a best estimate of when the card will be delivered. + """ + eta: Int + + """Recipient name.""" + name: String! + + """ + The delivery status of the card. One of `pending`, `shipped`, `delivered`, `returned`, `failure`, or `canceled`. + """ + status: String + + """A tracking number for a card shipment.""" + trackingNumber: String + + """ + A link to the shipping carrier's site where you can view detailed information about a card shipment. + """ + trackingUrl: String + + """ + One of `bulk` or `individual`. Bulk shipments will be grouped and mailed together, while individual ones will not. + """ + type: String! +} + +enum StripeIssuingCardSpendingLimitIntervalEnum { + all_time + daily + monthly + per_authorization + weekly + yearly +} + +"""""" +type StripeIssuingCardSpendingLimit { + """Maximum amount allowed to spend per time interval.""" + amount: Int! + + """ + Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) on which to apply the spending limit. Leave this blank to limit all charges. + """ + categories: [String!] + + """ + The time interval with which to apply this spending limit towards. Allowed values are `per_authorization`, `daily`, `weekly`, `monthly`, `yearly`, or `all_time`. + """ + interval: StripeIssuingCardSpendingLimitIntervalEnum! +} + +"""""" +type StripeIssuingCardAuthorizationControls { + """ + Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) of authorizations permitted on this card. + """ + allowedCategories: [String!] + + """ + Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) of authorizations to always decline on this card. + """ + blockedCategories: [String!] + + """ + The currency of the card. See [max_amount](https://stripe.com/docs/api#issuing_card_object-authorization_controls-max_amount) + """ + currency: String + + """ + Maximum amount allowed per authorization on this card, in the currency of the card. Authorization amounts in a different currency will be converted to the card's currency when evaluating this control. + """ + maxAmount: Int + + """ + Maximum count of approved authorizations on this card. Counts all authorizations retroactively. + """ + maxApprovals: Int + + """Limit the spending with rules based on time intervals and categories.""" + spendingLimits: [StripeIssuingCardSpendingLimit!] + + """ + Currency for the amounts within spending_limits. Locked to the currency of the card. + """ + spendingLimitsCurrency: String +} + +enum StripeIssuingCardReplacementReasonEnum { + damage + expiration + loss + theft +} + +enum StripeIssuingCardStatusEnum { + active + canceled + inactive + lost + pending + stolen +} + +enum StripeIssuingCardObjectEnum { + issuing_card +} + +"""""" +type StripeIssuingCard { + """The expiration year of the card.""" + expYear: Int! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeIssuingCardObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """The last 4 digits of the card number.""" + last4: String! + + """The brand of the card.""" + brand: String! + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """Unique identifier for the object.""" + id: String! + + """The name of the cardholder, printed on the card.""" + name: String! + + """The card this card replaces, if any.""" + replacementFor: StripeIssuingCard + + """One of `active`, `inactive`, `canceled`, `lost`, or `stolen`.""" + status: StripeIssuingCardStatusEnum! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + Why the card that this card replaces (if any) needed to be replaced. One of `damage`, `expiration`, `loss`, or `theft`. + """ + replacementReason: StripeIssuingCardReplacementReasonEnum + + """""" + authorizationControls: StripeIssuingCardAuthorizationControls! + + """ + The [Cardholder](https://stripe.com/docs/api#issuing_cardholder_object) object to which the card belongs. + """ + cardholder: StripeIssuingCardholder + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """One of `virtual` or `physical`.""" + type: String! + + """Where and how the card will be shipped.""" + shipping: StripeIssuingCardShipping + + """The expiration month of the card.""" + expMonth: Int! +} + +"""""" +type StripeIssuingAuthorizationVerificationData { + """One of `match`, `mismatch`, or `not_provided`.""" + addressLine1Check: String! + + """One of `match`, `mismatch`, or `not_provided`.""" + addressZipCheck: String! + + """One of `success`, `failure`, `exempt`, or `none`.""" + authentication: String! + + """One of `match`, `mismatch`, or `not_provided`.""" + cvcCheck: String! +} + +enum StripeIssuingAuthorizationObjectEnum { + issuing_authorization +} + +"""""" +type StripeIssuingAuthorization { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeIssuingAuthorizationObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """""" + balanceTransactions: [StripeBalanceTransaction!]! + + """""" + isHeldAmountControllable: Boolean! + + """Whether the authorization has been approved.""" + approved: Boolean! + + """ + The amount the user is requesting to be authorized. This field will only be non-zero during an `issuing.authorization.request` webhook. + """ + pendingAuthorizedAmount: Int! + + """Unique identifier for the object.""" + id: String! + + """ + The additional amount Stripe will hold if the authorization is approved. This field will only be non-zero during an `issuing.authorization.request` webhook. + """ + pendingHeldAmount: Int! + + """ + How the card details were provided. One of `chip`, `contactless`, `keyed_in`, `online`, or `swipe`. + """ + authorizationMethod: String! + + """""" + verificationData: StripeIssuingAuthorizationVerificationData! + + """ + The currency that was presented to the cardholder for the authorization. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + authorizedCurrency: String! + + """One of `pending`, `reversed`, or `closed`.""" + status: String! + + """ + The currency of the [held amount](https://stripe.com/docs/api#issuing_authorization_object-held_amount). This will always be the card currency. + """ + heldCurrency: String! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """The cardholder to whom this authorization belongs.""" + cardholder: StripeIssuingCardholder + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """""" + card: StripeIssuingCard! + + """""" + transactions: [StripeIssuingTransaction!]! + + """ + The amount that has been authorized. This will be `0` when the object is created, and increase after it has been approved. + """ + authorizedAmount: Int! + + """ + The amount the authorization is expected to be in `held_currency`. When Stripe holds funds from you, this is the amount reserved for the authorization. This will be `0` when the object is created, and increase after it has been approved. For multi-currency transactions, `held_amount` can be used to determine the expected exchange rate. + """ + heldAmount: Int! + + """""" + requestHistory: [StripeIssuingAuthorizationRequest!]! + + """""" + merchantData: StripeIssuingAuthorizationMerchantData! + + """ + What, if any, digital wallet was used for this authorization. One of `apple_pay`, `google_pay`, or `samsung_pay`. + """ + walletProvider: String +} + +union StripeIssuingTransactionCardholderUnion = StripeIssuingCardholder + +union StripeIssuingAuthorizationCardholderUnion = StripeIssuingCardholder + +enum StripeIssuingCardholderTypeEnum { + business_entity + individual +} + +enum StripeIssuingCardholderSpendingLimitIntervalEnum { + all_time + daily + monthly + per_authorization + weekly + yearly +} + +"""""" +type StripeIssuingCardholderSpendingLimit { + """Maximum amount allowed to spend per time interval.""" + amount: Int! + + """ + Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) on which to apply the spending limit. Leave this blank to limit all charges. + """ + categories: [String!] + + """ + The time interval with which to apply this spending limit towards. Allowed values are `per_authorization`, `daily`, `weekly`, `monthly`, `yearly`, or `all_time`. + """ + interval: StripeIssuingCardholderSpendingLimitIntervalEnum! +} + +"""""" +type StripeIssuingCardholderAuthorizationControls { + """ + Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) of authorizations permitted on this card. + """ + allowedCategories: [String!] + + """ + Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) of authorizations to always decline on this card. + """ + blockedCategories: [String!] + + """Limit the spending with rules based on time intervals and categories.""" + spendingLimits: [StripeIssuingCardholderSpendingLimit!] + + """Currency for the amounts within spending_limits.""" + spendingLimitsCurrency: String +} + +enum StripeIssuingCardholderStatusEnum { + active + blocked + inactive + pending +} + +"""""" +type StripeIssuingCardholderAddress { + """""" + address: StripeAddress! + + """""" + name: String +} + +enum StripeIssuingCardholderRequirementsDisabledReasonEnum { + listed + rejected_listed + under_review +} + +"""""" +type StripeIssuingCardholderRequirements { + """ + If the cardholder is disabled, this string describes why. Can be one of `listed`, `rejected.listed`, or `under_review`. + """ + disabledReason: StripeIssuingCardholderRequirementsDisabledReasonEnum + + """ + If not empty, this field contains the list of fields that need to be collected in order to verify and re-enabled the cardholder. + """ + pastDue: [String!] +} + +enum StripeIssuingCardholderObjectEnum { + issuing_cardholder +} + +"""""" +type StripeIssuingCardholder { + """Whether or not this cardholder is the default cardholder.""" + isDefault: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeIssuingCardholderObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """""" + requirements: StripeIssuingCardholderRequirements! + + """The cardholder's phone number.""" + phoneNumber: String + + """""" + billing: StripeIssuingCardholderAddress! + + """Unique identifier for the object.""" + id: String! + + """The cardholder's email address.""" + email: String + + """The cardholder's name. This will be printed on cards issued to them.""" + name: String! + + """One of `active`, `inactive`, or `blocked`.""" + status: StripeIssuingCardholderStatusEnum! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """""" + authorizationControls: StripeIssuingCardholderAuthorizationControls + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """One of `individual` or `business_entity`.""" + type: StripeIssuingCardholderTypeEnum! +} + +union StripeIssuingTransactionDisputeUnion = StripeIssuingDispute + +"""""" +type StripeIssuingDisputeOtherEvidence { + """Brief freeform text explaining why you are disputing this transaction.""" + disputeExplanation: String! + + """ + (ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Additional file evidence supporting your dispute. + """ + uncategorizedFile: StripeFile +} + +"""""" +type StripeIssuingDisputeFraudulentEvidence { + """Brief freeform text explaining why you are disputing this transaction.""" + disputeExplanation: String + + """ + (ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Additional file evidence supporting your dispute. + """ + uncategorizedFile: StripeFile +} + +"""""" +type StripeIssuingDisputeEvidence { + """ + Evidence to support a fraudulent dispute. This will only be present if your dispute's `reason` is `fraudulent`. + """ + fraudulent: StripeIssuingDisputeFraudulentEvidence + + """ + Evidence to support an uncategorized dispute. This will only be present if your dispute's `reason` is `other`. + """ + other: StripeIssuingDisputeOtherEvidence +} + +enum StripeIssuingDisputeStatusEnum { + lost + under_review + unsubmitted + won +} + +enum StripeIssuingDisputeObjectEnum { + issuing_dispute +} + +"""""" +type StripeIssuingDispute { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeIssuingDisputeObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """The currency the `disputed_transaction` was made in.""" + currency: String! + + """Unique identifier for the object.""" + id: String! + + """The transaction being disputed.""" + disputedTransaction: StripeIssuingTransaction! + + """ + Current status of dispute. One of `lost`, `under_review`, `unsubmitted`, or `won`. + """ + status: StripeIssuingDisputeStatusEnum! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`. + """ + metadata: String! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + Disputed amount. Usually the amount of the `disputed_transaction`, but can differ (usually because of currency fluctuation or because only part of the order is disputed). + """ + amount: Int! + + """Reason for this dispute. One of `other` or `fraudulent`.""" + reason: String! + + """""" + evidence: StripeIssuingDisputeEvidence! +} + +enum StripeIssuingTransactionObjectEnum { + issuing_transaction +} + +"""""" +type StripeIssuingTransaction { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeIssuingTransactionObjectEnum! + + """""" + balanceTransaction: StripeBalanceTransaction + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """Unique identifier for the object.""" + id: String! + + """""" + merchantCurrency: String! + + """""" + dispute: StripeIssuingDispute + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """The cardholder to whom this transaction belongs.""" + cardholder: StripeIssuingCardholder + + """The `Authorization` object that led to this transaction.""" + authorization: StripeIssuingAuthorization + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + One of `capture`, `refund`, `cash_withdrawal`, `refund_reversal`, `dispute`, or `dispute_loss`. + """ + type: String! + + """""" + amount: Int! + + """The card used to make this transaction.""" + card: StripeIssuingCard! + + """""" + merchantAmount: Int! + + """""" + merchantData: StripeIssuingAuthorizationMerchantData! +} + +enum StripePayoutTypeEnum { + bank_account + card +} + +enum StripePayoutObjectEnum { + payout +} + +"""""" +type StripePayout { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripePayoutObjectEnum! + + """ + ID of the balance transaction that describes the impact of this payout on your account balance. + """ + balanceTransaction: StripeBalanceTransaction + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ID of the bank account or card the payout was sent to.""" + destination: StripePayoutDestinationUnion + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ + The source balance this payout came from. One of `card` or `bank_account`. + """ + sourceType: String! + + """ + Date the payout is expected to arrive in the bank. This factors in delays like weekends or bank holidays. + """ + arrivalDate: Int! + + """ + The method used to send this payout, which can be `standard` or `instant`. `instant` is only supported for payouts to debit cards. (See [Instant payouts for marketplaces](/blog/instant-payouts-for-marketplaces) for more information.) + """ + method: String! + + """ + Error code explaining reason for payout failure if available. See [Types of payout failures](https://stripe.com/docs/api#payout_failures) for a list of failure codes. + """ + failureCode: String + + """Unique identifier for the object.""" + id: String! + + """ + Message to user further explaining reason for payout failure if available. + """ + failureMessage: String + + """ + Current status of the payout (`paid`, `pending`, `in_transit`, `canceled` or `failed`). A payout will be `pending` until it is submitted to the bank, at which point it becomes `in_transit`. It will then change to `paid` if the transaction goes through. If it does not go through successfully, its status will change to `failed` or `canceled`. + """ + status: String! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + Extra information about a payout to be displayed on the user's bank statement. + """ + statementDescriptor: String + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """Can be `bank_account` or `card`.""" + type: StripePayoutTypeEnum! + + """Amount (in %s) to be transferred to your bank account or debit card.""" + amount: Int! + + """ + Returns `true` if the payout was created by an [automated payout schedule](https://stripe.com/docs/payouts#payout-schedule), and `false` if it was [requested manually](https://stripe.com/docs/payouts#manual-payouts). + """ + automatic: Boolean! + + """ + If the payout failed or was canceled, this will be the ID of the balance transaction that reversed the initial balance transaction, and puts the funds from the failed payout back in your balance. + """ + failureBalanceTransaction: StripeBalanceTransaction + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String +} + +enum StripePlatformTaxFeeObjectEnum { + platform_tax_fee +} + +"""""" +type StripePlatformTaxFee { + """The Connected account that incurred this charge.""" + account: String! + + """Unique identifier for the object.""" + id: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripePlatformTaxFeeObjectEnum! + + """The payment object that caused this tax to be inflicted.""" + sourceTransaction: String! + + """The type of tax (VAT).""" + type: String! +} + +enum StripeReserveTransactionObjectEnum { + reserve_transaction +} + +"""""" +type StripeReserveTransaction { + """""" + amount: Int! + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String + + """Unique identifier for the object.""" + id: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeReserveTransactionObjectEnum! +} + +enum StripeTaxDeductedAtSourceObjectEnum { + tax_deducted_at_source +} + +"""""" +type StripeTaxDeductedAtSource { + """Unique identifier for the object.""" + id: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeTaxDeductedAtSourceObjectEnum! + + """ + The end of the invoicing period. This TDS applies to Stripe fees collected during this invoicing period. + """ + periodEnd: Int! + + """ + The start of the invoicing period. This TDS applies to Stripe fees collected during this invoicing period. + """ + periodStart: Int! + + """The TAN that was supplied to Stripe when TDS was assessed""" + taxDeductionAccountNumber: String! +} + +enum StripeTopupStatusEnum { + canceled + failed + pending + reversed + succeeded +} + +enum StripeTopupObjectEnum { + topup +} + +"""""" +type StripeTopup { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeTopupObjectEnum! + + """ + ID of the balance transaction that describes the impact of this top-up on your account balance. May not be specified depending on status of top-up. + """ + balanceTransaction: StripeBalanceTransaction + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """A string that identifies this top-up as part of a group.""" + transferGroup: String + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ + Error code explaining reason for top-up failure if available (see [the errors section](https://stripe.com/docs/api#errors) for a list of codes). + """ + failureCode: String + + """Unique identifier for the object.""" + id: String! + + """ + Message to user further explaining reason for top-up failure if available. + """ + failureMessage: String + + """ + The status of the top-up is either `canceled`, `failed`, `pending`, `reversed`, or `succeeded`. + """ + status: StripeTopupStatusEnum! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + Extra information about a top-up. This will appear on your source's bank statement. It must contain at least one letter. + """ + statementDescriptor: String + + """""" + source: StripeSource! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """Amount transferred.""" + amount: Int! + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String + + """ + Date the funds are expected to arrive in your Stripe account for payouts. This factors in delays like weekends or bank holidays. May not be specified depending on status of top-up. + """ + expectedAvailabilityDate: Int +} + +union StripeRefundSourceTransferReversalUnion = StripeTransferReversal + +union StripeRefundTransferReversalUnion = StripeTransferReversal + +union StripeChargeTransferUnion = StripeTransfer + +union StripeChargeSourceTransferUnion = StripeTransfer + +union StripeTransferReversalTransferUnion = StripeTransfer + +union StripeInvoiceChargeUnion = StripeCharge + +union StripeIssuerFraudRecordChargeUnion = StripeCharge + +union StripeOrderChargeUnion = StripeCharge + +union StripeReviewChargeUnion = StripeCharge + +union StripeRadarEarlyFraudWarningChargeUnion = StripeCharge + +union StripeDisputeChargeUnion = StripeCharge + +union StripeTransferSourceTransactionUnion = StripeCharge + +union StripeRefundChargeUnion = StripeCharge + +union StripeTransferDestinationPaymentUnion = StripeCharge + +union StripeApplicationFeeChargeUnion = StripeCharge + +union StripeApplicationFeeOriginatingTransactionUnion = StripeCharge + +"""""" +type StripeRefundsEdge { + """node""" + node: StripeRefund! + + """cursor""" + cursor: String! +} + +"""""" +type StripeRefundsConnection { + """cursor""" + cursor: String + + """nodes""" + nodes: [StripeRefund!]! + + """edges""" + edges: [StripeRefundsEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +union StripeChargeOutcomeRuleUnion = StripeRule + +"""""" +type StripeRule { + """The action taken on the payment.""" + action: String! + + """Unique identifier for the object.""" + id: String! + + """The predicate to evaluate the payment against.""" + predicate: String! +} + +"""""" +type StripeChargeOutcome { + """ + Possible values are `approved_by_network`, `declined_by_network`, `not_sent_to_network`, and `reversed_after_approval`. The value `reversed_after_approval` indicates the payment was [blocked by Stripe](https://stripe.com/docs/declines#blocked-payments) after bank authorization, and may temporarily appear as "pending" on a cardholder's statement. + """ + networkStatus: String + + """ + An enumerated value providing a more detailed explanation of the outcome's `type`. Charges blocked by Radar's default block rule have the value `highest_risk_level`. Charges placed in review by Radar's default review rule have the value `elevated_risk_level`. Charges authorized, blocked, or placed in review by custom rules have the value `rule`. See [understanding declines](https://stripe.com/docs/declines) for more details. + """ + reason: String + + """ + Stripe's evaluation of the riskiness of the payment. Possible values for evaluated payments are `normal`, `elevated`, `highest`. For non-card payments, and card-based payments predating the public assignment of risk levels, this field will have the value `not_assessed`. In the event of an error in the evaluation, this field will have the value `unknown`. + """ + riskLevel: String + + """ + Stripe's evaluation of the riskiness of the payment. Possible values for evaluated payments are between 0 and 100. For non-card payments, card-based payments predating the public assignment of risk scores, or in the event of an error during evaluation, this field will not be present. This field is only available with Radar for Fraud Teams. + """ + riskScore: Int + + """The ID of the Radar rule that matched the payment, if applicable.""" + rule: StripeRule + + """ + A human-readable description of the outcome type and reason, designed for you (the recipient of the payment), not your customer. + """ + sellerMessage: String + + """ + Possible values are `authorized`, `manual_review`, `issuer_declined`, `blocked`, and `invalid`. See [understanding declines](https://stripe.com/docs/declines) and [Radar reviews](radar/review) for details. + """ + type: String! +} + +union StripeOrderReturnOrderUnion = StripeOrder + +union StripeChargeOrderUnion = StripeOrder + +"""""" +type StripeDeliveryEstimate { + """ + If `type` is `"exact"`, `date` will be the expected delivery date in the format YYYY-MM-DD. + """ + date: String + + """ + If `type` is `"range"`, `earliest` will be be the earliest delivery date in the format YYYY-MM-DD. + """ + earliest: String + + """ + If `type` is `"range"`, `latest` will be the latest delivery date in the format YYYY-MM-DD. + """ + latest: String + + """The type of estimate. Must be either `"range"` or `"exact"`.""" + type: String! +} + +"""""" +type StripeShippingMethod { + """ + A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount for the line item. + """ + amount: Int! + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ + The estimated delivery date for the given shipping method. Can be either a specific date or a range. + """ + deliveryEstimate: StripeDeliveryEstimate + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String! + + """Unique identifier for the object.""" + id: String! +} + +"""""" +type StripeStatusTransitions { + """""" + canceled: Int + + """""" + fulfiled: Int + + """""" + paid: Int + + """""" + returned: Int +} + +enum StripeOrderReturnsObjectEnum { + list +} + +union StripeOrderItemParentUnion = StripeSku + +"""""" +type StripeInventory { + """ + The count of inventory available. Will be present if and only if `type` is `finite`. + """ + quantity: Int + + """ + Inventory type. Possible values are `finite`, `bucket` (not quantified), and `infinite`. + """ + type: String! + + """ + An indicator of the inventory available. Possible values are `in_stock`, `limited`, and `out_of_stock`. Will be present if and only if `type` is `bucket`. + """ + value: String +} + +enum StripeSkuObjectEnum { + sku +} + +"""""" +type StripeSku { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeSkuObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + The URL of an image for this SKU, meant to be displayable to the customer. + """ + image: String + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """The dimensions of this SKU for shipping purposes.""" + packageDimensions: StripePackageDimensions + + """Unique identifier for the object.""" + id: String! + + """ + The ID of the product this SKU is associated with. The product must be currently active. + """ + product: StripeProduct! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """""" + inventory: StripeInventory! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """""" + updated: Int! + + """Whether the SKU is available for purchase.""" + active: Boolean! + + """ + The cost of the item as a positive integer in the smallest currency unit (that is, 100 cents to charge $1.00, or 100 to charge ¥100, Japanese Yen being a zero-decimal currency). + """ + price: Int! +} + +enum StripeOrderItemObjectEnum { + order_item +} + +"""""" +type StripeOrderItem { + """ + A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount for the line item. + """ + amount: Int! + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ + Description of the line item, meant to be displayable to the user (e.g., `"Express shipping"`). + """ + description: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeOrderItemObjectEnum! + + """ + The ID of the associated object for this line item. Expandable if not null (e.g., expandable to a SKU). + """ + parent: StripeSku + + """ + A positive integer representing the number of instances of `parent` that are included in this order item. Applicable/present only if `type` is `sku`. + """ + quantity: Int + + """The type of line item. One of `sku`, `tax`, `shipping`, or `discount`.""" + type: String! +} + +enum StripeOrderReturnObjectEnum { + order_return +} + +"""""" +type StripeOrderReturn { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeOrderReturnObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """The ID of the refund issued for this return.""" + refund: StripeRefund + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """Unique identifier for the object.""" + id: String! + + """The items included in this order return.""" + items: [StripeOrderItem!]! + + """The order that this return includes items from.""" + order: StripeOrder + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount for the returned line item. + """ + amount: Int! +} + +"""""" +type StripeOrderReturns { + """""" + data: [StripeOrderReturn!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripeOrderReturnsObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +enum StripeOrderObjectEnum { + order +} + +"""""" +type StripeOrder { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeOrderObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """""" + returns: StripeOrderReturns + + """""" + externalCouponCode: String + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """The timestamps at which the order status was updated.""" + statusTransitions: StripeStatusTransitions + + """ + A list of supported shipping methods for this order. The desired shipping method can be specified either by updating the order, or when paying it. + """ + shippingMethods: [StripeShippingMethod!] + + """Unique identifier for the object.""" + id: String! + + """The email address of the customer placing the order.""" + email: String + + """ + The ID of the payment used to pay for the order. Present if the order status is `paid`, `fulfilled`, or `refunded`. + """ + charge: StripeCharge + + """""" + applicationFee: Int + + """ + List of items constituting the order. An order can have up to 25 items. + """ + items: [StripeOrderItem!]! + + """The user's order ID if it is different from the Stripe order ID.""" + upstreamId: String + + """ID of the Connect Application that created the order.""" + application: String + + """ + Current order status. One of `created`, `paid`, `canceled`, `fulfilled`, or `returned`. More details in the [Orders Guide](https://stripe.com/docs/orders/guide#understanding-order-statuses). + """ + status: String! + + """ + The shipping method that is currently selected for this order, if any. If present, it is equal to one of the `id`s of shipping methods in the `shipping_methods` array. At order creation time, if there are multiple shipping methods, Stripe will automatically selected the first method. + """ + selectedShippingMethod: String + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """""" + amountReturned: Int + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount for the order. + """ + amount: Int! + + """ + The shipping address for the order. Present if the order is for goods to be shipped. + """ + shipping: StripeShipping + + """""" + updated: Int + + """The customer used for the order.""" + customer: StripeOrderCustomerUnion +} + +union StripeChargeDisputeUnion = StripeDispute + +union StripeDisputeEvidenceReceiptUnion = StripeFile + +union StripeIssuingDisputeOtherEvidenceUncategorizedFileUnion = StripeFile + +union StripeLegalEntityPersonVerificationDocumentBackUnion = StripeFile + +union StripeLegalEntityPersonVerificationDocumentFrontUnion = StripeFile + +union StripeDisputeEvidenceRefundPolicyUnion = StripeFile + +union StripeDisputeEvidenceShippingDocumentationUnion = StripeFile + +union StripeDisputeEvidenceUncategorizedFileUnion = StripeFile + +union StripeDisputeEvidenceCancellationPolicyUnion = StripeFile + +union StripeDisputeEvidenceCustomerSignatureUnion = StripeFile + +union StripeDisputeEvidenceCustomerCommunicationUnion = StripeFile + +union StripeFileLinkFileUnion = StripeFile + +union StripeIssuingDisputeFraudulentEvidenceUncategorizedFileUnion = StripeFile + +union StripeAccountBrandingSettingsLogoUnion = StripeFile + +union StripeDisputeEvidenceServiceDocumentationUnion = StripeFile + +union StripeLegalEntityCompanyVerificationDocumentFrontUnion = StripeFile + +union StripeDisputeEvidenceDuplicateChargeDocumentationUnion = StripeFile + +union StripeAccountBrandingSettingsIconUnion = StripeFile + +union StripeLegalEntityCompanyVerificationDocumentBackUnion = StripeFile + +enum StripeFileLinksObjectEnum { + list +} + +enum StripeFileLinkObjectEnum { + file_link +} + +"""""" +type StripeFileLink { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeFileLinkObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """The publicly accessible URL to download the file.""" + url: String + + """Whether this link is already expired.""" + expired: Boolean! + + """Unique identifier for the object.""" + id: String! + + """Time at which the link expires.""" + expiresAt: Int + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """The file object this link points to.""" + file: StripeFile! +} + +"""""" +type StripeFileLinks { + """""" + data: [StripeFileLink!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripeFileLinksObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +enum StripeFileObjectEnum { + file +} + +"""""" +type StripeFile { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeFileObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + The URL from which the file can be downloaded using your live secret API key. + """ + url: String + + """Unique identifier for the object.""" + id: String! + + """""" + links: StripeFileLinks + + """A user friendly title for the document.""" + title: String + + """The type of the file returned (e.g., `csv`, `pdf`, `jpg`, or `png`).""" + type: String + + """The size in bytes of the file object.""" + size: Int! + + """A filename for the file, suitable for saving to a filesystem.""" + filename: String + + """ + The purpose of the file. Possible values are `business_icon`, `business_logo`, `customer_signature`, `dispute_evidence`, `finance_report_run`, `identity_document`, `pci_document`, `sigma_scheduled_query`, or `tax_document_user_upload`. + """ + purpose: String! +} + +"""""" +type StripeDisputeEvidence { + """The billing address provided by the customer.""" + billingAddress: String + + """The IP address that the customer used when making the purchase.""" + customerPurchaseIp: String + + """ + The tracking number for a physical product, obtained from the delivery service. If multiple tracking numbers were generated for this purchase, please separate them with commas. + """ + shippingTrackingNumber: String + + """ + An explanation of how and when the customer was shown your refund policy prior to purchase. + """ + cancellationPolicyDisclosure: String + + """A description of the product or service that was sold.""" + productDescription: String + + """ + (ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Any receipt or message sent to the customer notifying them of the charge. + """ + receipt: StripeFile + + """ + An explanation of the difference between the disputed charge versus the prior charge that appears to be a duplicate. + """ + duplicateChargeExplanation: String + + """ + The date on which the customer received or began receiving the purchased service, in a clear human-readable format. + """ + serviceDate: String + + """ + (ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Documentation showing proof that a service was provided to the customer. This could include a copy of a signed contract, work order, or other form of written agreement. + """ + serviceDocumentation: StripeFile + + """ + The delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc. If multiple carriers were used for this purchase, please separate them with commas. + """ + shippingCarrier: String + + """ + (ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Documentation showing proof that a product was shipped to the customer at the same address the customer provided to you. This could include a copy of the shipment receipt, shipping label, etc. It should show the customer's full shipping address, if possible. + """ + shippingDocumentation: StripeFile + + """ + The date on which a physical product began its route to the shipping address, in a clear human-readable format. + """ + shippingDate: String + + """ + Documentation demonstrating that the customer was shown your refund policy prior to purchase. + """ + refundPolicyDisclosure: String + + """A justification for why the customer is not entitled to a refund.""" + refundRefusalExplanation: String + + """A justification for why the customer's subscription was not canceled.""" + cancellationRebuttal: String + + """ + (ID of a [file upload](https://stripe.com/docs/guides/file-upload)) A relevant document or contract showing the customer's signature. + """ + customerSignature: StripeFile + + """ + (ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Your refund policy, as shown to the customer. + """ + refundPolicy: StripeFile + + """ + Any server or activity logs showing proof that the customer accessed or downloaded the purchased digital product. This information should include IP addresses, corresponding timestamps, and any detailed recorded activity. + """ + accessActivityLog: String + + """ + (ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Documentation for the prior charge that can uniquely identify the charge, such as a receipt, shipping label, work order, etc. This document should be paired with a similar document from the disputed payment that proves the two payments are separate. + """ + duplicateChargeDocumentation: StripeFile + + """The name of the customer.""" + customerName: String + + """ + (ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Any communication with the customer that you feel is relevant to your case. Examples include emails proving that the customer received the product or service, or demonstrating their use of or satisfaction with the product or service. + """ + customerCommunication: StripeFile + + """The email address of the customer.""" + customerEmailAddress: String + + """ + (ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Your subscription cancellation policy, as shown to the customer. + """ + cancellationPolicy: StripeFile + + """ + (ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Any additional evidence or statements. + """ + uncategorizedFile: StripeFile + + """Any additional evidence or statements.""" + uncategorizedText: String + + """ + The address to which a physical product was shipped. You should try to include as complete address information as possible. + """ + shippingAddress: String + + """ + The Stripe ID for the prior charge which appears to be a duplicate of the disputed charge. + """ + duplicateChargeId: String +} + +enum StripeDisputeStatusEnum { + charge_refunded + lost + needs_response + under_review + warning_closed + warning_needs_response + warning_under_review + won +} + +"""""" +type StripeDisputeEvidenceDetails { + """ + Date by which evidence must be submitted in order to successfully challenge dispute. Will be null if the customer's bank or credit card company doesn't allow a response for this particular dispute. + """ + dueBy: Int + + """Whether evidence has been staged for this dispute.""" + hasEvidence: Boolean! + + """ + Whether the last evidence submission was submitted past the due date. Defaults to `false` if no evidence submissions have occurred. If `true`, then delivery of the latest evidence is *not* guaranteed. + """ + pastDue: Boolean! + + """ + The number of times evidence has been submitted. Typically, you may only submit evidence once. + """ + submissionCount: Int! +} + +enum StripeDisputeObjectEnum { + dispute +} + +"""""" +type StripeDispute { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeDisputeObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + List of zero, one, or two balance transactions that show funds withdrawn and reinstated to your Stripe account as a result of this dispute. + """ + balanceTransactions: [StripeBalanceTransaction!]! + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """Unique identifier for the object.""" + id: String! + + """ID of the charge that was disputed.""" + charge: StripeCharge! + + """""" + evidenceDetails: StripeDisputeEvidenceDetails! + + """ + Current status of dispute. Possible values are `warning_needs_response`, `warning_under_review`, `warning_closed`, `needs_response`, `under_review`, `charge_refunded`, `won`, or `lost`. + """ + status: StripeDisputeStatusEnum! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + Disputed amount. Usually the amount of the charge, but can differ (usually because of currency fluctuation or because only part of the order is disputed). + """ + amount: Int! + + """ + If true, it is still possible to refund the disputed payment. Once the payment has been fully refunded, no further funds will be withdrawn from your Stripe account as a result of this dispute. + """ + isChargeRefundable: Boolean! + + """ + Reason given by cardholder for dispute. Possible values are `bank_cannot_process`, `check_returned`, `credit_not_processed`, `customer_initiated`, `debit_not_authorized`, `duplicate`, `fraudulent`, `general`, `incorrect_account_details`, `insufficient_funds`, `product_not_received`, `product_unacceptable`, `subscription_canceled`, or `unrecognized`. Read more about [dispute reasons](https://stripe.com/docs/disputes/categories). + """ + reason: String! + + """""" + evidence: StripeDisputeEvidence! +} + +union StripeFeeRefundFeeUnion = StripeApplicationFee + +union StripeChargeApplicationFeeUnion = StripeApplicationFee + +enum StripeApplicationFeeRefundsObjectEnum { + list +} + +enum StripeFeeRefundObjectEnum { + fee_refund +} + +"""""" +type StripeFeeRefund { + """Amount, in %s.""" + amount: Int! + + """Balance transaction that describes the impact on your account balance.""" + balanceTransaction: StripeBalanceTransaction + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ID of the application fee that was refunded.""" + fee: StripeApplicationFee! + + """Unique identifier for the object.""" + id: String! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeFeeRefundObjectEnum! +} + +"""""" +type StripeApplicationFeeRefunds { + """""" + data: [StripeFeeRefund!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripeApplicationFeeRefundsObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +enum StripeApplicationFeeObjectEnum { + application_fee +} + +"""""" +type StripeApplicationFee { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeApplicationFeeObjectEnum! + + """ + Balance transaction that describes the impact of this collected application fee on your account balance (not including refunds). + """ + balanceTransaction: StripeBalanceTransaction + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """Unique identifier for the object.""" + id: String! + + """ID of the charge that the application fee was taken from.""" + charge: StripeCharge! + + """ID of the Connect application that earned the fee.""" + application: StripeApplication! + + """ + ID of the corresponding charge on the platform account, if this fee was the result of a charge using the `destination` parameter. + """ + originatingTransaction: StripeCharge + + """A list of refunds that have been applied to the fee.""" + refunds: StripeApplicationFeeRefunds! + + """ID of the Stripe account this fee was taken from.""" + account: StripeAccount! + + """ + Whether the fee has been fully refunded. If the fee is only partially refunded, this attribute will still be false. + """ + refunded: Boolean! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """Amount earned, in %s.""" + amount: Int! + + """ + Amount in %s refunded (can be less than the amount attribute on the fee if a partial refund was issued) + """ + amountRefunded: Int! +} + +union StripeChargeReviewUnion = StripeReview + +union StripePaymentIntentReviewUnion = StripeReview + +"""""" +type StripeRadarReviewResourceSession { + """The browser used in this browser session (e.g., `Chrome`).""" + browser: String + + """ + Information about the device used for the browser session (e.g., `Samsung SM-G930T`). + """ + device: String + + """The platform for the browser session (e.g., `Macintosh`).""" + platform: String + + """The version for the browser session (e.g., `61.0.3163.100`).""" + version: String +} + +"""""" +type StripeRadarReviewResourceLocation { + """The city where the payment originated.""" + city: String + + """ + Two-letter ISO code representing the country where the payment originated. + """ + country: String + + """The geographic latitude where the payment originated.""" + latitude: Float + + """The geographic longitude where the payment originated.""" + longitude: Float + + """The state/county/province/region where the payment originated.""" + region: String +} + +enum StripeReviewOpenedReasonEnum { + manual + rule +} + +union StripeInvoicePaymentIntentUnion = StripePaymentIntent + +union StripeReviewPaymentIntentUnion = StripePaymentIntent + +union StripeCheckoutSessionPaymentIntentUnion = StripePaymentIntent + +enum StripePaymentIntentCancellationReasonEnum { + abandoned + automatic + duplicate + failed_invoice + fraudulent + requested_by_customer + void_invoice +} + +enum StripePaymentIntentCaptureMethodEnum { + automatic + manual +} + +enum StripePaymentIntentStatusEnum { + canceled + processing + requires_action + requires_capture + requires_confirmation + requires_payment_method + succeeded +} + +enum StripePaymentIntentConfirmationMethodEnum { + automatic + manual +} + +enum StripePaymentIntentChargesObjectEnum { + list +} + +"""""" +type StripePaymentIntentCharges { + """ + This list only contains the latest charge, even if there were previously multiple unsuccessful charges. To view all previous charges for a PaymentIntent, you can filter the charges list using the `payment_intent` [parameter](https://stripe.com/docs/api/charges/list#list_charges-payment_intent). + """ + data: [StripeCharge!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripePaymentIntentChargesObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +union StripeChargeInvoiceUnion = StripeInvoice + +union StripeCustomerBalanceTransactionInvoiceUnion = StripeInvoice + +union StripePaymentIntentInvoiceUnion = StripeInvoice + +union StripeCreditNoteInvoiceUnion = StripeInvoice + +union StripeSubscriptionLatestInvoiceUnion = StripeInvoice + +union StripeInvoiceitemInvoiceUnion = StripeInvoice + +union StripeInvoiceItemInvoiceUnion = StripeInvoice + +enum StripeInvoiceCustomerTaxExemptEnum { + exempt + none + reverse +} + +enum StripeInvoiceCollectionMethodEnum { + charge_automatically + send_invoice +} + +enum StripeInvoiceStatusEnum { + deleted + draft + open + paid + uncollectible + void +} + +enum StripeInvoicesResourceInvoiceTaxIdTypeEnum { + au_abn + ch_vat + eu_vat + in_gst + no_vat + nz_gst + unknown + za_vat +} + +"""""" +type StripeInvoicesResourceInvoiceTaxId { + """ + The type of the tax ID, one of `au_abn`, `ch_vat`, `eu_vat`, `in_gst`, `no_vat`, `nz_gst`, `unknown`, or `za_vat` + """ + type: StripeInvoicesResourceInvoiceTaxIdTypeEnum! + + """The value of the tax ID.""" + value: String +} + +"""""" +type StripeInvoicesStatusTransitions { + """The time that the invoice draft was finalized.""" + finalizedAt: Int + + """The time that the invoice was marked uncollectible.""" + markedUncollectibleAt: Int + + """The time that the invoice was paid.""" + paidAt: Int + + """The time that the invoice was voided.""" + voidedAt: Int +} + +enum StripeInvoiceLinesObjectEnum { + list +} + +"""""" +type StripeInvoiceLineItemPeriod { + """End of the line item's billing period""" + end: Int! + + """Start of the line item's billing period""" + start: Int! +} + +enum StripeLineItemTypeEnum { + invoiceitem + subscription +} + +"""""" +type StripeInvoiceTaxAmount { + """The amount, in %s, of the tax.""" + amount: Int! + + """Whether this tax amount is inclusive or exclusive.""" + inclusive: Boolean! + + """The tax rate that was applied to get this tax amount.""" + taxRate: StripeTaxRate! +} + +enum StripeLineItemObjectEnum { + line_item +} + +"""""" +type StripeLineItem { + """ + For prorations this indicates whether Stripe automatically grouped multiple related debit and credit line items into a single combined line item. + """ + unifiedProration: Boolean + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeLineItemObjectEnum! + + """""" + invoiceItem: String + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ + If true, discounts will apply to this line item. Always false for prorations. + """ + discountable: Boolean! + + """Unique identifier for the object.""" + id: String! + + """The tax rates which apply to the line item.""" + taxRates: [StripeTaxRate!] + + """ + The quantity of the subscription, if the line item is a subscription or a proration. + """ + quantity: Int + + """The subscription that the invoice item pertains to, if any.""" + subscription: String + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Note that for line items with `type=subscription` this will reflect the metadata of the subscription that caused the line item to be created. + """ + metadata: String! + + """Whether this is a proration.""" + proration: Boolean! + + """ + The subscription item that generated this invoice item. Left empty if the line item is not an explicit result of a subscription. + """ + subscriptionItem: String + + """The amount of tax calculated per tax rate for this line item""" + taxAmounts: [StripeInvoiceTaxAmount!] + + """Whether this is a test line item.""" + livemode: Boolean! + + """ + A string identifying the type of the source of this line item, either an `invoiceitem` or a `subscription`. + """ + type: StripeLineItemTypeEnum! + + """The amount, in %s.""" + amount: Int! + + """ + The plan of the subscription, if the line item is a subscription or a proration. + """ + plan: StripePlan + + """""" + period: StripeInvoiceLineItemPeriod! + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String +} + +"""""" +type StripeInvoiceLines { + """""" + data: [StripeLineItem!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripeInvoiceLinesObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +union StripeSubscriptionSchedulePhaseConfigurationDefaultPaymentMethodUnion = StripePaymentMethod + +union StripeInvoiceSettingCustomerSettingDefaultPaymentMethodUnion = StripePaymentMethod + +union StripeSubscriptionScheduleDefaultPaymentMethodUnion = StripePaymentMethod + +union StripeSubscriptionDefaultPaymentMethodUnion = StripePaymentMethod + +union StripePaymentIntentPaymentMethodUnion = StripePaymentMethod + +union StripeSetupIntentPaymentMethodUnion = StripePaymentMethod + +union StripeInvoiceDefaultPaymentMethodUnion = StripePaymentMethod + +"""""" +type StripeBillingDetails { + """Billing address.""" + address: StripeAddress + + """Email address.""" + email: String + + """Full name.""" + name: String + + """Billing phone number (including extension).""" + phone: String +} + +union StripePaymentMethodCustomerUnion = StripeCustomer + +union StripeCheckoutSessionCustomerUnion = StripeCustomer + +union StripeTaxIdCustomerUnion = StripeCustomer + +union StripeCreditNoteCustomerUnion = StripeCustomer + +union StripeCustomerBalanceTransactionCustomerUnion = StripeCustomer + +"""""" +type StripePaymentIntentsEdge { + """node""" + node: StripePaymentIntent! + + """cursor""" + cursor: String! +} + +"""""" +type StripePaymentIntentsConnection { + """cursor""" + cursor: String + + """nodes""" + nodes: [StripePaymentIntent!]! + + """edges""" + edges: [StripePaymentIntentsEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +"""""" +type StripeInvoicesEdge { + """node""" + node: StripeInvoice! + + """cursor""" + cursor: String +} + +"""""" +type StripeInvoicesConnection { + """cursor""" + cursor: String + + """nodes""" + nodes: [StripeInvoice!]! + + """edges""" + edges: [StripeInvoicesEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +"""""" +type StripeChargesEdge { + """node""" + node: StripeCharge! + + """cursor""" + cursor: String! +} + +"""""" +type StripeChargesConnection { + """cursor""" + cursor: String + + """nodes""" + nodes: [StripeCharge!]! + + """edges""" + edges: [StripeChargesEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +enum StripeCustomerSubscriptionsObjectEnum { + list +} + +union StripeCheckoutSessionSubscriptionUnion = StripeSubscription + +union StripeInvoiceSubscriptionUnion = StripeSubscription + +union StripeInvoiceitemSubscriptionUnion = StripeSubscription + +union StripeSubscriptionScheduleSubscriptionUnion = StripeSubscription + +union StripeInvoiceItemSubscriptionUnion = StripeSubscription + +enum StripeSubscriptionCollectionMethodEnum { + charge_automatically + send_invoice +} + +enum StripeSubscriptionItemsObjectEnum { + list +} + +enum StripeSubscriptionItemObjectEnum { + subscription_item +} + +"""""" +type StripeSubscriptionItem { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeSubscriptionItemObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """Unique identifier for the object.""" + id: String! + + """ + The tax rates which apply to this `subscription_item`. When set, the `default_tax_rates` on the subscription do not apply to this `subscription_item`. + """ + taxRates: [StripeTaxRate!] + + """ + The [quantity](https://stripe.com/docs/subscriptions/quantities) of the plan to which the customer should be subscribed. + """ + quantity: Int + + """The `subscription` this `subscription_item` belongs to.""" + subscription: String! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """""" + plan: StripePlan! + + """ + Define thresholds at which an invoice will be sent, and the related subscription advanced to a new billing period + """ + billingThresholds: StripeSubscriptionItemBillingThresholds +} + +"""""" +type StripeSubscriptionItems { + """""" + data: [StripeSubscriptionItem!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripeSubscriptionItemsObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +union StripeSubscriptionScheduleUnion = StripeSubscriptionSchedule + +enum StripeSubscriptionStatusEnum { + active + canceled + incomplete + incomplete_expired + past_due + trialing + unpaid +} + +"""""" +type StripeSubscriptionsEdge { + """node""" + node: StripeSubscription! + + """cursor""" + cursor: String! +} + +"""""" +type StripeSubscriptionsConnection { + """cursor""" + cursor: String + + """nodes""" + nodes: [StripeSubscription!]! + + """edges""" + edges: [StripeSubscriptionsEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +enum StripeTransformUsageRoundEnum { + down + up +} + +"""""" +type StripeTransformUsage { + """Divide usage by this number.""" + divideBy: Int! + + """After division, either round the result `up` or `down`.""" + round: StripeTransformUsageRoundEnum! +} + +"""""" +type StripePlanTier { + """Price for the entire tier.""" + flatAmount: Int + + """ + Same as `flat_amount`, but contains a decimal value with at most 12 decimal places. + """ + flatAmountDecimal: String + + """Per unit price for units relevant to the tier.""" + unitAmount: Int + + """ + Same as `unit_amount`, but contains a decimal value with at most 12 decimal places. + """ + unitAmountDecimal: String + + """Up to and including to this quantity will be contained in the tier.""" + upTo: Int +} + +enum StripePlanBillingSchemeEnum { + per_unit + tiered +} + +enum StripePlanAggregateUsageEnum { + last_during_period + last_ever + max + sum +} + +enum StripePlanIntervalEnum { + day + month + week + year +} + +union StripeSkuProductUnion = StripeProduct + +enum StripeProductTypeEnum { + good + service +} + +"""""" +type StripePackageDimensions { + """Height, in inches.""" + height: Float! + + """Length, in inches.""" + length: Float! + + """Weight, in ounces.""" + weight: Float! + + """Width, in inches.""" + width: Float! +} + +enum StripeProductObjectEnum { + product +} + +"""""" +type StripeProduct { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeProductObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + A URL of a publicly-accessible webpage for this product. Only applicable to products of `type=good`. + """ + url: String + + """ + Whether this product is a shipped good. Only applicable to products of `type=good`. + """ + shippable: Boolean + + """ + The dimensions of this product for shipping purposes. A SKU associated with this product can override this value by having its own `package_dimensions`. Only applicable to products of `type=good`. + """ + packageDimensions: StripePackageDimensions + + """ + A label that represents units of this product, such as seat(s), in Stripe and on customers’ receipts and invoices. Only available on products of type=`service`. + """ + unitLabel: String + + """Unique identifier for the object.""" + id: String! + + """ + The product's name, meant to be displayable to the customer. Applicable to both `service` and `good` types. + """ + name: String! + + """ + An array of connect application identifiers that cannot purchase this product. Only applicable to products of `type=good`. + """ + deactivateOn: [String!] + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + A list of up to 5 attributes that each SKU can provide values for (e.g., `["color", "size"]`). Only applicable to products of `type=good`. + """ + attributes: [String!] + + """ + Extra information about a product which will appear on your customer's credit card statement. In the case that multiple products are billed at once, the first statement descriptor will be used. Only available on products of type=`service`. + """ + statementDescriptor: String + + """ + A list of up to 8 URLs of images for this product, meant to be displayable to the customer. Only applicable to products of `type=good`. + """ + images: [String!]! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + The type of the product. The product is either of type `good`, which is eligible for use with Orders and SKUs, or `service`, which is eligible for use with Subscriptions and Plans. + """ + type: StripeProductTypeEnum! + + """""" + updated: Int! + + """Whether the product is currently available for purchase.""" + active: Boolean + + """ + A short one-line description of the product, meant to be displayable to the customer. Only applicable to products of `type=good`. + """ + caption: String + + """ + The product's description, meant to be displayable to the customer. Only applicable to products of `type=good`. + """ + description: String +} + +enum StripeDeletedProductObjectEnum { + product +} + +"""""" +type StripeDeletedProduct { + """Always true for a deleted object""" + deleted: Boolean! + + """Unique identifier for the object.""" + id: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeDeletedProductObjectEnum! +} + +union StripePlanProductUnion = StripeDeletedProduct | StripeProduct + +enum StripePlanUsageTypeEnum { + licensed + metered +} + +enum StripePlanTiersModeEnum { + graduated + volume +} + +enum StripePlanObjectEnum { + plan +} + +"""""" +type StripePlan { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripePlanObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """A brief description of the plan, hidden from customers.""" + nickname: String + + """ + Default number of trial days when subscribing a customer to this plan using [`trial_from_plan=true`](https://stripe.com/docs/api#create_subscription-trial_from_plan). + """ + trialPeriodDays: Int + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ + Defines if the tiering price should be `graduated` or `volume` based. In `volume`-based tiering, the maximum quantity within a period determines the per unit price, in `graduated` tiering pricing can successively change as the quantity grows. + """ + tiersMode: StripePlanTiersModeEnum + + """Unique identifier for the object.""" + id: String! + + """ + Configures how the quantity per period should be determined, can be either `metered` or `licensed`. `licensed` will automatically bill the `quantity` set for a plan when adding it to a subscription, `metered` will aggregate the total usage based on usage records. Defaults to `licensed`. + """ + usageType: StripePlanUsageTypeEnum! + + """The product whose pricing this plan determines.""" + product: StripePlanProductUnion + + """ + One of `day`, `week`, `month` or `year`. The frequency with which a subscription should be billed. + """ + interval: StripePlanIntervalEnum! + + """ + The number of intervals (specified in the `interval` property) between subscription billings. For example, `interval=month` and `interval_count=3` bills every 3 months. + """ + intervalCount: Int! + + """ + Same as `amount`, but contains a decimal value with at most 12 decimal places. + """ + amountDecimal: String + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + Specifies a usage aggregation strategy for plans of `usage_type=metered`. Allowed values are `sum` for summing up all usage during a period, `last_during_period` for picking the last usage record reported within a period, `last_ever` for picking the last usage record ever (across period bounds) or `max` which picks the usage record with the maximum reported usage during a period. Defaults to `sum`. + """ + aggregateUsage: StripePlanAggregateUsageEnum + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """The amount in %s to be charged on the interval specified.""" + amount: Int + + """ + Describes how to compute the price per period. Either `per_unit` or `tiered`. `per_unit` indicates that the fixed amount (specified in `amount`) will be charged per unit in `quantity` (for plans with `usage_type=licensed`), or per unit of total usage (for plans with `usage_type=metered`). `tiered` indicates that the unit pricing will be computed using a tiering strategy as defined using the `tiers` and `tiers_mode` attributes. + """ + billingScheme: StripePlanBillingSchemeEnum + + """ + Each element represents a pricing tier. This parameter requires `billing_scheme` to be set to `tiered`. See also the documentation for `billing_scheme`. + """ + tiers: [StripePlanTier!] + + """Whether the plan is currently available for new subscriptions.""" + active: Boolean! + + """ + Apply a transformation to the reported usage or set quantity before computing the billed price. Cannot be combined with `tiers`. + """ + transformUsage: StripeTransformUsage + subscriptions(status: StripeSubscriptionStatusEnum, after: String, before: String, first: Int): StripeSubscriptionsConnection +} + +enum StripeDeletedPlanObjectEnum { + plan +} + +"""""" +type StripeDeletedPlan { + """Always true for a deleted object""" + deleted: Boolean! + + """Unique identifier for the object.""" + id: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeDeletedPlanObjectEnum! +} + +union StripeSubscriptionScheduleConfigurationItemPlanUnion = StripeDeletedPlan | StripePlan + +"""""" +type StripeSubscriptionItemBillingThresholds { + """Usage threshold that triggers the subscription to create an invoice""" + usageGte: Int +} + +"""""" +type StripeSubscriptionScheduleConfigurationItem { + """ + Define thresholds at which an invoice will be sent, and the related subscription advanced to a new billing period + """ + billingThresholds: StripeSubscriptionItemBillingThresholds + + """ID of the plan to which the customer should be subscribed.""" + plan: StripeSubscriptionScheduleConfigurationItemPlanUnion! + + """Quantity of the plan to which the customer should be subscribed.""" + quantity: Int + + """ + The tax rates which apply to this `phase_item`. When set, the `default_tax_rates` on the phase do not apply to this `phase_item`. + """ + taxRates: [StripeTaxRate!] +} + +union StripeInvoiceTaxAmountTaxRateUnion = StripeTaxRate + +enum StripeTaxRateObjectEnum { + tax_rate +} + +"""""" +type StripeTaxRate { + """This represents the tax rate percent out of 100.""" + percentage: Float! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeTaxRateObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """This specifies if the tax rate is inclusive or exclusive.""" + inclusive: Boolean! + + """Unique identifier for the object.""" + id: String! + + """ + The display name of the tax rates as it will appear to your customer on their receipt email, PDF, and the hosted invoice page. + """ + displayName: String! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """The jurisdiction for the tax rate.""" + jurisdiction: String + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + Defaults to `true`. When set to `false`, this tax rate cannot be applied to objects in the API, but will still be applied to subscriptions and invoices that already have it set. + """ + active: Boolean! + + """ + An arbitrary string attached to the tax rate for your internal use only. It will not be visible to your customers. + """ + description: String +} + +enum StripeSubscriptionSchedulePhaseConfigurationCollectionMethodEnum { + charge_automatically + send_invoice +} + +"""""" +type StripeSubscriptionSchedulePhaseConfiguration { + """ + ID of the coupon to use during this phase of the subscription schedule. + """ + coupon: StripeCoupon + + """ + ID of the default payment method for the subscription schedule. It must belong to the customer associated with the subscription schedule. If not set, invoices will use the default payment method in the customer's invoice settings. + """ + defaultPaymentMethod: StripePaymentMethod + + """The end of this phase of the subscription schedule.""" + endDate: Int! + + """When the trial ends within the phase.""" + trialEnd: Int + + """ + Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay the underlying subscription at the end of each billing cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions. + """ + collectionMethod: StripeSubscriptionSchedulePhaseConfigurationCollectionMethodEnum + + """ + A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice subtotal that will be transferred to the application owner's Stripe account during this phase of the schedule. + """ + applicationFeePercent: Float + + """""" + defaultTaxRates: [StripeTaxRate!] + + """The start of this phase of the subscription schedule.""" + startDate: Int! + + """Plans to subscribe during this phase of the subscription schedule.""" + plans: [StripeSubscriptionScheduleConfigurationItem!]! + + """The subscription schedule's default invoice settings.""" + invoiceSettings: StripeInvoiceSettingSubscriptionScheduleSetting + + """ + If provided, each invoice created during this phase of the subscription schedule will apply the tax rate, increasing the amount billed to the customer. + """ + taxPercent: Float + + """ + Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period + """ + billingThresholds: StripeSubscriptionBillingThresholds +} + +"""""" +type StripeSubscriptionScheduleCurrentPhase { + """""" + endDate: Int! + + """""" + startDate: Int! +} + +"""""" +type StripeSubscriptionBillingThresholds { + """Monetary threshold that triggers the subscription to create an invoice""" + amountGte: Int + + """ + Indicates if the `billing_cycle_anchor` should be reset when a threshold is reached. If true, `billing_cycle_anchor` will be updated to the date/time the threshold was last reached; otherwise, the value will remain unchanged. This value may not be `true` if the subscription contains items with plans that have `aggregate_usage=last_ever`. + """ + resetBillingCycleAnchor: Boolean +} + +"""""" +type StripeInvoiceSettingSubscriptionScheduleSetting { + """ + Number of days within which a customer must pay invoices generated by this subscription schedule. This value will be `null` for subscription schedules where `billing=charge_automatically`. + """ + daysUntilDue: Int +} + +enum StripeSubscriptionScheduleEndBehaviorEnum { + cancel + none + release + renew +} + +enum StripeSubscriptionScheduleCollectionMethodEnum { + charge_automatically + send_invoice +} + +enum StripeSubscriptionScheduleStatusEnum { + active + canceled + completed + not_started + released +} + +enum StripeSubscriptionScheduleObjectEnum { + subscription_schedule +} + +"""""" +type StripeSubscriptionSchedule { + """ + Time at which the subscription schedule was released. Measured in seconds since the Unix epoch. + """ + releasedAt: Int + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeSubscriptionScheduleObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + ID of the default payment method for the subscription schedule. It must belong to the customer associated with the subscription schedule. If not set, invoices will use the default payment method in the customer's invoice settings. + """ + defaultPaymentMethod: StripePaymentMethod + + """ + ID of the subscription once managed by the subscription schedule (if it is released). + """ + releasedSubscription: String + + """Unique identifier for the object.""" + id: String! + + """ + Possible values are `not_started`, `active`, `completed`, `released`, and `canceled`. + """ + status: StripeSubscriptionScheduleStatusEnum! + + """ID of the subscription managed by the subscription schedule.""" + subscription: StripeSubscription + + """ + Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay the underlying subscription at the end of each billing cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions. + """ + collectionMethod: StripeSubscriptionScheduleCollectionMethodEnum + + """ + Behavior of the subscription schedule and underlying subscription when it ends. + """ + endBehavior: StripeSubscriptionScheduleEndBehaviorEnum! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ID of the customer who owns the subscription schedule.""" + customer: StripeSubscriptionScheduleCustomerUnion! + + """The subscription schedule's default invoice settings.""" + invoiceSettings: StripeInvoiceSettingSubscriptionScheduleSetting + + """ + Time at which the subscription schedule was completed. Measured in seconds since the Unix epoch. + """ + completedAt: Int + + """ + Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period + """ + billingThresholds: StripeSubscriptionBillingThresholds + + """ + Object representing the start and end dates for the current phase of the subscription schedule, if it is `active`. + """ + currentPhase: StripeSubscriptionScheduleCurrentPhase + + """Configuration for the subscription schedule's phases.""" + phases: [StripeSubscriptionSchedulePhaseConfiguration!]! + + """ + Time at which the subscription schedule was canceled. Measured in seconds since the Unix epoch. + """ + canceledAt: Int +} + +union StripeCheckoutSessionSetupIntentUnion = StripeSetupIntent + +union StripeSubscriptionPendingSetupIntentUnion = StripeSetupIntent + +enum StripeSetupIntentCancellationReasonEnum { + abandoned + duplicate + requested_by_customer +} + +enum StripeSetupIntentStatusEnum { + canceled + processing + requires_action + requires_confirmation + requires_payment_method + succeeded +} + +union StripePaymentIntentApplicationUnion = StripeApplication + +union StripeChargeApplicationUnion = StripeApplication + +union StripeSetupIntentApplicationUnion = StripeApplication + +union StripeApplicationFeeApplicationUnion = StripeApplication + +enum StripeApplicationObjectEnum { + application +} + +"""""" +type StripeApplication { + """Unique identifier for the object.""" + id: String! + + """The name of the application.""" + name: String + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeApplicationObjectEnum! +} + +enum StripeApiErrorsTypeEnum { + api_connection_error + api_error + authentication_error + card_error + idempotency_error + invalid_request_error + rate_limit_error +} + +"""""" +type StripeApiErrors { + """ + A human-readable message providing more details about the error. For card errors, these messages can be shown to your users. + """ + message: String + + """""" + paymentIntent: StripePaymentIntent + + """ + A URL to more information about the [error code](https://stripe.com/docs/error-codes) reported. + """ + docUrl: String + + """""" + paymentMethod: StripePaymentMethod + + """For card errors, the ID of the failed charge.""" + charge: String + + """ + If the error is parameter-specific, the parameter related to the error. For example, you can use this to display a message near the correct form field. + """ + param: String + + """ + For card errors resulting from a card issuer decline, a short string indicating the [card issuer's reason for the decline](https://stripe.com/docs/declines#issuer-declines) if they provide one. + """ + declineCode: String + + """The source object for errors returned on a request involving a source.""" + source: StripeApiErrorsSourceUnion + + """ + The type of error returned. One of `api_connection_error`, `api_error`, `authentication_error`, `card_error`, `idempotency_error`, `invalid_request_error`, or `rate_limit_error` + """ + type: StripeApiErrorsTypeEnum! + + """""" + setupIntent: StripeSetupIntent + + """ + For some errors that could be handled programmatically, a short string indicating the [error code](https://stripe.com/docs/error-codes) reported. + """ + code: String +} + +enum StripeSetupIntentPaymentMethodOptionsCardRequestThreeDSecureEnum { + any + automatic + challenge_only +} + +"""""" +type StripeSetupIntentPaymentMethodOptionsCard { + """ + We strongly recommend that you rely on our SCA Engine to automatically prompt your customers for authentication based on risk level and [other requirements](https://stripe.com/docs/strong-customer-authentication). However, if you wish to request 3D Secure based on logic from your own fraud engine, provide this option. Permitted values include: `automatic` or `any`. If not provided, defaults to `automatic`. Read our guide on [manually requesting 3D Secure](https://stripe.com/docs/payments/3d-secure#manual-three-ds) for more information on how this configuration interacts with Radar and our SCA Engine. + """ + requestThreeDSecure: StripeSetupIntentPaymentMethodOptionsCardRequestThreeDSecureEnum +} + +"""""" +type StripeSetupIntentPaymentMethodOptions { + """""" + card: StripeSetupIntentPaymentMethodOptionsCard +} + +enum StripeSetupIntentObjectEnum { + setup_intent +} + +"""""" +type StripeSetupIntent { + """The account (if any) for which the setup is intended.""" + onBehalfOf: StripeAccount + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeSetupIntentObjectEnum! + + """ + Indicates how the payment method is intended to be used in the future. + + Use `on_session` if you intend to only reuse the payment method when the customer is in your checkout flow. Use `off_session` if your customer may or may not be in your checkout flow. If not provided, this value defaults to `off_session`. + """ + usage: String! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """Payment-method-specific configuration for this SetupIntent.""" + paymentMethodOptions: StripeSetupIntentPaymentMethodOptions + + """ID of the payment method used with this SetupIntent.""" + paymentMethod: StripePaymentMethod + + """Unique identifier for the object.""" + id: String! + + """ + The list of payment method types (e.g. card) that this SetupIntent is allowed to set up. + """ + paymentMethodTypes: [String!]! + + """The error encountered in the previous SetupIntent confirmation.""" + lastSetupError: StripeApiErrors + + """ID of the Connect application that created the SetupIntent.""" + application: StripeApplication + + """ + [Status](https://stripe.com/docs/payments/intents#intent-statuses) of this SetupIntent, one of `requires_payment_method`, `requires_confirmation`, `requires_action`, `processing`, `canceled`, or `succeeded`. + """ + status: StripeSetupIntentStatusEnum! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String + + """ + Reason for cancellation of this SetupIntent, one of `abandoned`, `requested_by_customer`, or `duplicate`. + """ + cancellationReason: StripeSetupIntentCancellationReasonEnum + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + ID of the Customer this SetupIntent belongs to, if one exists. + + If present, payment methods used with this SetupIntent can only be attached to this Customer, and payment methods attached to other Customers cannot be used with this SetupIntent. + """ + customer: StripeSetupIntentCustomerUnion + + """ + The client secret of this SetupIntent. Used for client-side retrieval using a publishable key. + + The client secret can be used to complete payment setup from your frontend. It should not be stored, logged, embedded in URLs, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret. + """ + clientSecret: String + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String +} + +enum StripeSubscriptionObjectEnum { + subscription +} + +"""""" +type StripeSubscription { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeSubscriptionObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + ID of the default payment method for the subscription. It must belong to the customer associated with the subscription. If not set, invoices will use the default payment method in the customer's invoice settings. + """ + defaultPaymentMethod: StripePaymentMethod + + """ + Number of days a customer has to pay invoices generated by this subscription. This value will be `null` for subscriptions where `collection_method=charge_automatically`. + """ + daysUntilDue: Int + + """ + Describes the current discount applied to this subscription, if there is one. When billing, a discount applied to a subscription overrides a discount applied on a customer-wide basis. + """ + discount: StripeDiscount + + """ + If the subscription has been canceled with the `at_period_end` flag set to `true`, `cancel_at_period_end` on the subscription will be true. You can use this attribute to determine whether a subscription that has a status of active is scheduled to be canceled at the end of the current period. + """ + cancelAtPeriodEnd: Boolean! + + """If the subscription has a trial, the end of that trial.""" + trialEnd: Int + + """If the subscription has a trial, the beginning of that trial.""" + trialStart: Int + + """ + You can use this [SetupIntent](https://stripe.com/docs/api/setup_intents) to collect user authentication when creating a subscription without immediate payment or updating a subscription's payment method, allowing you to optimize for off-session payments. Learn more in the [SCA Migration Guide](https://stripe.com/docs/billing/migration/strong-customer-authentication#scenario-2). + """ + pendingSetupIntent: StripeSetupIntent + + """Unique identifier for the object.""" + id: String! + + """ + ID of the default payment source for the subscription. It must belong to the customer associated with the subscription and be in a chargeable state. If not set, defaults to the customer's default source. + """ + defaultSource: StripeSubscriptionDefaultSourceUnion + + """If the subscription has ended, the date the subscription ended.""" + endedAt: Int + + """The schedule attached to the subscription""" + schedule: StripeSubscriptionSchedule + + """ + The quantity of the plan to which the customer is subscribed. For example, if your plan is $10/user/month, and your customer has 5 users, you could pass 5 as the quantity to have the customer charged $50 (5 x $10) monthly. Only set if the subscription contains a single plan. + """ + quantity: Int + + """List of subscription items, each with an attached plan.""" + items: StripeSubscriptionItems! + + """ + Possible values are `incomplete`, `incomplete_expired`, `trialing`, `active`, `past_due`, `canceled`, or `unpaid`. + + For `collection_method=charge_automatically` a subscription moves into `incomplete` if the initial payment attempt fails. A subscription in this state can only have metadata and default_source updated. Once the first invoice is paid, the subscription moves into an `active` state. If the first invoice is not paid within 23 hours, the subscription transitions to `incomplete_expired`. This is a terminal state, the open invoice will be voided and no further invoices will be generated. + + A subscription that is currently in a trial period is `trialing` and moves to `active` when the trial period is over. + + If subscription `collection_method=charge_automatically` it becomes `past_due` when payment to renew it fails and `canceled` or `unpaid` (depending on your subscriptions settings) when Stripe has exhausted all payment retry attempts. + + If subscription `collection_method=send_invoice` it becomes `past_due` when its invoice is not paid by the due date, and `canceled` or `unpaid` if it is still not paid by an additional deadline after that. Note that when a subscription has a status of `unpaid`, no subsequent invoices will be attempted (invoices will be created, but then immediately automatically closed). After receiving updated payment information from a customer, you may choose to reopen and pay their closed invoices. + """ + status: StripeSubscriptionStatusEnum! + + """ + Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay this subscription at the end of the cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions. + """ + collectionMethod: StripeSubscriptionCollectionMethodEnum + + """ + Start of the current period that the subscription has been invoiced for. + """ + currentPeriodStart: Int! + + """The most recent invoice this subscription has generated.""" + latestInvoice: StripeInvoice + + """ + A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice subtotal that will be transferred to the application owner's Stripe account. + """ + applicationFeePercent: Float + + """ + The tax rates that will apply to any subscription item that does not have `tax_rates` set. Invoices created will have their `default_tax_rates` populated from the subscription. + """ + defaultTaxRates: [StripeTaxRate!] + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + Determines the date of the first full invoice, and, for plans with `month` or `year` intervals, the day of the month for subsequent invoices. + """ + billingCycleAnchor: Int! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + A date in the future at which the subscription will automatically get canceled + """ + cancelAt: Int + + """ + Date when the subscription was first created. The date might differ from the `created` date due to backdating. + """ + startDate: Int! + + """ + Hash describing the plan the customer is subscribed to. Only set if the subscription contains a single plan. + """ + plan: StripePlan + + """ID of the customer who owns the subscription.""" + customer: StripeSubscriptionCustomerUnion! + + """ + End of the current period that the subscription has been invoiced for. At the end of this period, a new invoice will be created. + """ + currentPeriodEnd: Int! + + """ + If provided, each invoice created by this subscription will apply the tax rate, increasing the amount billed to the customer. + """ + taxPercent: Float + + """ + Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period + """ + billingThresholds: StripeSubscriptionBillingThresholds + + """ + If the subscription has been canceled, the date of that cancellation. If the subscription was canceled with `cancel_at_period_end`, `canceled_at` will still reflect the date of the initial cancellation request, not the end of the subscription period when the subscription is automatically moved to a canceled state. + """ + canceledAt: Int +} + +"""""" +type StripeCustomerSubscriptions { + """""" + data: [StripeSubscription!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripeCustomerSubscriptionsObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +"""""" +type StripeInvoiceSettingCustomField { + """The name of the custom field.""" + name: String! + + """The value of the custom field.""" + value: String! +} + +"""""" +type StripeInvoiceSettingCustomerSetting { + """Default custom fields to be displayed on invoices for this customer.""" + customFields: [StripeInvoiceSettingCustomField!] + + """ + ID of the default payment method used for subscriptions and invoices for the customer. + """ + defaultPaymentMethod: StripePaymentMethod + + """Default footer to be displayed on invoices for this customer.""" + footer: String +} + +enum StripeCustomerTaxExemptEnum { + exempt + none + reverse +} + +"""""" +type StripeTaxInfo { + """The customer's tax ID number.""" + taxId: String + + """The type of ID number.""" + type: String! +} + +"""""" +type StripeTaxInfoVerification { + """ + The state of verification for this customer. Possible values are `unverified`, `pending`, or `verified`. + """ + status: String + + """ + The official name associated with the tax ID returned from the external provider. + """ + verifiedName: String +} + +enum StripeCustomerTaxIdsObjectEnum { + list +} + +enum StripeTaxIdTypeEnum { + au_abn + ch_vat + eu_vat + in_gst + no_vat + nz_gst + unknown + za_vat +} + +enum StripeTaxIdVerificationStatusEnum { + pending + unavailable + unverified + verified +} + +"""""" +type StripeTaxIdVerification { + """ + Verification status, one of `pending`, `unavailable`, `unverified`, or `verified`. + """ + status: StripeTaxIdVerificationStatusEnum! + + """Verified address.""" + verifiedAddress: String + + """Verified name.""" + verifiedName: String +} + +enum StripeTaxIdObjectEnum { + tax_id +} + +"""""" +type StripeTaxId { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeTaxIdObjectEnum! + + """""" + verification: StripeTaxIdVerification! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """Two-letter ISO code representing the country of the tax ID.""" + country: String + + """Unique identifier for the object.""" + id: String! + + """Value of the tax ID.""" + value: String! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + Type of the tax ID, one of `au_abn`, `ch_vat`, `eu_vat`, `in_gst`, `no_vat`, `nz_gst`, `unknown`, or `za_vat` + """ + type: StripeTaxIdTypeEnum! + + """ID of the customer.""" + customer: StripeCustomer! +} + +"""""" +type StripeCustomerTaxIds { + """""" + data: [StripeTaxId!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripeCustomerTaxIdsObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +enum StripeDiscountObjectEnum { + discount +} + +union StripeSubscriptionSchedulePhaseConfigurationCouponUnion = StripeCoupon + +enum StripeCouponDurationEnum { + forever + once + repeating +} + +enum StripeCouponObjectEnum { + coupon +} + +"""""" +type StripeCoupon { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeCouponObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + If `amount_off` has been set, the three-letter [ISO code for the currency](https://stripe.com/docs/currencies) of the amount to take off. + """ + currency: String + + """Unique identifier for the object.""" + id: String! + + """Date after which the coupon can no longer be redeemed.""" + redeemBy: Int + + """ + If `duration` is `repeating`, the number of months the coupon applies. Null if coupon `duration` is `forever` or `once`. + """ + durationInMonths: Int + + """ + Name of the coupon displayed to customers on for instance invoices or receipts. + """ + name: String + + """ + Percent that will be taken off the subtotal of any invoices for this customer for the duration of the coupon. For example, a coupon with percent_off of 50 will make a %s100 invoice %s50 instead. + """ + percentOff: Float + + """ + Taking account of the above properties, whether this coupon can still be applied to a customer. + """ + valid: Boolean! + + """Number of times this coupon has been applied to a customer.""" + timesRedeemed: Int! + + """ + Maximum number of times this coupon can be redeemed, in total, across all customers, before it is no longer valid. + """ + maxRedemptions: Int + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + One of `forever`, `once`, and `repeating`. Describes how long a customer who applies this coupon will get the discount. + """ + duration: StripeCouponDurationEnum! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + Amount (in the `currency` specified) that will be taken off the subtotal of any invoices for this customer. + """ + amountOff: Int +} + +"""""" +type StripeDiscount { + """""" + coupon: StripeCoupon! + + """""" + customer: StripeDiscountCustomerUnion + + """ + If the coupon has a duration of `repeating`, the date that this discount will end. If the coupon has a duration of `once` or `forever`, this attribute will be null. + """ + end: Int + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeDiscountObjectEnum! + + """Date that the coupon was applied.""" + start: Int! + + """ + The subscription that this coupon is applied to, if it is applied to a particular subscription. + """ + subscription: String +} + +enum StripeCustomerObjectEnum { + customer +} + +enum StripeCustomerSourcesObjectEnum { + list +} + +union StripeRecipientDefaultCardUnion = StripeCard + +union StripeCardRecipientUnion = StripeRecipient + +enum StripeRecipientCardsObjectEnum { + list +} + +"""""" +type StripeRecipientCards { + """""" + data: [StripeCard!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripeRecipientCardsObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +union StripeExternalAccountUnion = StripeBankAccount | StripeCard + +union StripeAccountExternalAccountsDataUnion = StripeCard | StripeBankAccount + +union StripeCustomerDefaultSourceUnion = StripeSource | StripeCard | StripeBitcoinReceiver | StripeBankAccount | StripeAlipayAccount + +union StripeInvoiceDefaultSourceUnion = StripeSource | StripeCard | StripeBitcoinReceiver | StripeBankAccount | StripeAlipayAccount + +enum StripeAlipayAccountObjectEnum { + alipay_account +} + +"""""" +type StripeAlipayAccount { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeAlipayAccountObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + If the Alipay account object is not reusable, the exact currency that you can create a charge for. + """ + paymentCurrency: String + + """ + Uniquely identifies the account and will be the same across all Alipay account objects that are linked to the same Alipay account. + """ + fingerprint: String! + + """The username for the Alipay account.""" + username: String! + + """ + True if you can create multiple payments using this account. If the account is reusable, then you can freely choose the amount of each payment. + """ + reusable: Boolean! + + """Unique identifier for the object.""" + id: String! + + """Whether this Alipay account object has ever been used for a payment.""" + used: Boolean! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """""" + customer: StripeAlipayAccountCustomerUnion + + """ + If the Alipay account object is not reusable, the exact amount that you can create a charge for. + """ + paymentAmount: Int +} + +union StripePaymentSourceUnion = StripeBankAccount | StripeAlipayAccount | StripeSource | StripeCard | StripeAccount | StripeBitcoinReceiver + +enum StripeBitcoinReceiverTransactionsObjectEnum { + list +} + +enum StripeBitcoinTransactionObjectEnum { + bitcoin_transaction +} + +"""""" +type StripeBitcoinTransaction { + """ + The amount of `currency` that the transaction was converted to in real-time. + """ + amount: Int! + + """The amount of bitcoin contained in the transaction.""" + bitcoinAmount: Int! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + Three-letter [ISO code for the currency](https://stripe.com/docs/currencies) to which this transaction was converted. + """ + currency: String! + + """Unique identifier for the object.""" + id: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeBitcoinTransactionObjectEnum! + + """The receiver to which this transaction was sent.""" + receiver: String! +} + +"""""" +type StripeBitcoinReceiverTransactions { + """""" + data: [StripeBitcoinTransaction!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripeBitcoinReceiverTransactionsObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +enum StripeBitcoinReceiverObjectEnum { + bitcoin_receiver +} + +"""""" +type StripeBitcoinReceiver { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeBitcoinReceiverObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + The amount of bitcoin that the customer should send to fill the receiver. The `bitcoin_amount` is denominated in Satoshi: there are 10^8 Satoshi in one bitcoin. + """ + bitcoinAmount: Int! + + """""" + usedForPayment: Boolean + + """ + Three-letter [ISO code for the currency](https://stripe.com/docs/currencies) to which the bitcoin will be converted. + """ + currency: String! + + """Unique identifier for the object.""" + id: String! + + """ + The customer's email address, set by the API call that creates the receiver. + """ + email: String + + """ + This receiver contains uncaptured funds that can be used for a payment or refunded. + """ + uncapturedFunds: Boolean! + + """ + A bitcoin address that is specific to this receiver. The customer can send bitcoin to this address to fill the receiver. + """ + inboundAddress: String! + + """ + This URI can be displayed to the customer as a clickable link (to activate their bitcoin client) or as a QR code (for mobile wallets). + """ + bitcoinUri: String! + + """ + The amount of bitcoin that has been sent by the customer to this receiver. + """ + bitcoinAmountReceived: Int! + + """ + This flag is initially false and updates to true when the customer sends the `bitcoin_amount` to this receiver. + """ + filled: Boolean! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """""" + refundAddress: String + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """The amount of `currency` that you are collecting as payment.""" + amount: Int! + + """ + A list with one entry for each time that the customer sent bitcoin to the receiver. Hidden when viewing the receiver with a publishable key. + """ + transactions: StripeBitcoinReceiverTransactions + + """""" + customer: String + + """ + True when this bitcoin receiver has received a non-zero amount of bitcoin. + """ + active: Boolean! + + """ + The amount of `currency` to which `bitcoin_amount_received` has been converted. + """ + amountReceived: Int! + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String + + """ + The ID of the payment created from the receiver, if any. Hidden when viewing the receiver with a publishable key. + """ + payment: String +} + +union StripeSubscriptionDefaultSourceUnion = StripeSource | StripeCard | StripeBitcoinReceiver | StripeBankAccount | StripeAlipayAccount + +enum StripeDeletedBitcoinReceiverObjectEnum { + bitcoin_receiver +} + +"""""" +type StripeDeletedBitcoinReceiver { + """Always true for a deleted object""" + deleted: Boolean! + + """Unique identifier for the object.""" + id: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeDeletedBitcoinReceiverObjectEnum! +} + +enum StripeDeletedAlipayAccountObjectEnum { + alipay_account +} + +"""""" +type StripeDeletedAlipayAccount { + """Always true for a deleted object""" + deleted: Boolean! + + """Unique identifier for the object.""" + id: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeDeletedAlipayAccountObjectEnum! +} + +union StripeDeletedPaymentSourceUnion = StripeDeletedAlipayAccount | StripeDeletedCard | StripeDeletedBitcoinReceiver | StripeDeletedBankAccount + +enum StripeDeletedBankAccountObjectEnum { + bank_account +} + +"""""" +type StripeDeletedBankAccount { + """ + Three-letter [ISO code for the currency](https://stripe.com/docs/payouts) paid out to the bank account. + """ + currency: String + + """Always true for a deleted object""" + deleted: Boolean! + + """Unique identifier for the object.""" + id: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeDeletedBankAccountObjectEnum! +} + +union StripeDeletedExternalAccountUnion = StripeDeletedCard | StripeDeletedBankAccount + +enum StripeDeletedCardObjectEnum { + card +} + +"""""" +type StripeDeletedCard { + """ + Three-letter [ISO code for the currency](https://stripe.com/docs/payouts) paid out to the bank account. + """ + currency: String + + """Always true for a deleted object""" + deleted: Boolean! + + """Unique identifier for the object.""" + id: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeDeletedCardObjectEnum! +} + +union StripePayoutDestinationUnion = StripeDeletedCard | StripeDeletedBankAccount | StripeCard | StripeBankAccount + +union StripeChargeCustomerUnion = StripeDeletedCustomer | StripeCustomer + +union StripeOrderCustomerUnion = StripeDeletedCustomer | StripeCustomer + +union StripeInvoiceCustomerUnion = StripeDeletedCustomer | StripeCustomer + +union StripeCardCustomerUnion = StripeDeletedCustomer | StripeCustomer + +union StripeAlipayAccountCustomerUnion = StripeDeletedCustomer | StripeCustomer + +union StripeSubscriptionScheduleCustomerUnion = StripeDeletedCustomer | StripeCustomer + +union StripeDiscountCustomerUnion = StripeDeletedCustomer | StripeCustomer + +union StripeInvoiceItemCustomerUnion = StripeDeletedCustomer | StripeCustomer + +union StripePaymentIntentCustomerUnion = StripeDeletedCustomer | StripeCustomer + +union StripeSetupIntentCustomerUnion = StripeDeletedCustomer | StripeCustomer + +union StripeSubscriptionCustomerUnion = StripeDeletedCustomer | StripeCustomer + +union StripeInvoiceitemCustomerUnion = StripeDeletedCustomer | StripeCustomer + +enum StripeDeletedCustomerObjectEnum { + customer +} + +"""""" +type StripeDeletedCustomer { + """Always true for a deleted object""" + deleted: Boolean! + + """Unique identifier for the object.""" + id: String! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeDeletedCustomerObjectEnum! +} + +union StripeBankAccountCustomerUnion = StripeDeletedCustomer | StripeCustomer + +enum StripeBankAccountObjectEnum { + bank_account +} + +"""""" +type StripeBankAccount { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeBankAccountObjectEnum! + + """""" + last4: String! + + """ + Two-letter ISO code representing the country the bank account is located in. + """ + country: String! + + """ + Whether this bank account is the default external account for its currency. + """ + defaultForCurrency: Boolean + + """ + Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same. + """ + fingerprint: String + + """ + Three-letter [ISO code for the currency](https://stripe.com/docs/payouts) paid out to the bank account. + """ + currency: String! + + """Unique identifier for the object.""" + id: String! + + """ + Name of the bank associated with the routing number (e.g., `WELLS FARGO`). + """ + bankName: String + + """ + The type of entity that holds the account. This can be either `individual` or `company`. + """ + accountHolderType: String + + """ + For bank accounts, possible values are `new`, `validated`, `verified`, `verification_failed`, or `errored`. A bank account that hasn't had any activity or validation performed is `new`. If Stripe can determine that the bank account exists, its status will be `validated`. Note that there often isn’t enough information to know (e.g., for smaller credit unions), and the validation is not always run. If customer bank account verification has succeeded, the bank account status will be `verified`. If the verification failed for any reason, such as microdeposit failure, the status will be `verification_failed`. If a transfer sent to this bank account fails, we'll set the status to `errored` and will not continue to send transfers until the bank details are updated. + + For external accounts, possible values are `new` and `errored`. Validations aren't run against external accounts because they're only used for payouts. This means the other statuses don't apply. If a transfer fails, the status is set to `errored` and transfers are stopped until account details are updated. + """ + status: String! + + """""" + account: StripeAccount + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String + + """The routing transit number for the bank account.""" + routingNumber: String + + """""" + customer: StripeBankAccountCustomerUnion + + """The name of the person or business that owns the bank account.""" + accountHolderName: String +} + +enum StripeRecipientObjectEnum { + recipient +} + +"""""" +type StripeRecipient { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeRecipientObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """Unique identifier for the object.""" + id: String! + + """""" + email: String + + """The default card to use for creating transfers to this recipient.""" + defaultCard: StripeCard + + """Full, legal name of the recipient.""" + name: String + + """ + The ID of the [Custom account](https://stripe.com/docs/connect/custom-accounts) this recipient was migrated to. If set, the recipient can no longer be updated, nor can transfers be made to it: use the Custom account instead. + """ + migratedTo: StripeAccount + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """""" + rolledBackFrom: StripeAccount + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """Type of the recipient, one of `individual` or `corporation`.""" + type: String! + + """Hash describing the current account on the recipient, if there is one.""" + activeAccount: StripeBankAccount + + """""" + cards: StripeRecipientCards + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String +} + +enum StripeCardObjectEnum { + card +} + +"""""" +type StripeCard { + """Four-digit number representing the card's expiration year.""" + expYear: Int! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeCardObjectEnum! + + """The last four digits of the card.""" + last4: String! + + """ + Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected. + """ + country: String + + """ + (For tokenized numbers only.) The last four digits of the device account number. + """ + dynamicLast4: String + + """ + Card brand. Can be `American Express`, `Diners Club`, `Discover`, `JCB`, `MasterCard`, `UnionPay`, `Visa`, or `Unknown`. + """ + brand: String! + + """Whether this card is the default external account for its currency.""" + defaultForCurrency: Boolean + + """ + Uniquely identifies this particular card number. You can use this attribute to check whether two customers who've signed up with you are using the same card number, for example. + """ + fingerprint: String + + """""" + currency: String + + """ + The recipient that this card belongs to. This attribute will not be in the card object if the card belongs to a customer or account instead. + """ + recipient: StripeRecipient + + """Unique identifier for the object.""" + id: String! + + """Address line 1 (Street address/PO Box/Company name).""" + addressLine1: String + + """ + If the card number is tokenized, this is the method that was used. Can be `apple_pay` or `google_pay`. + """ + tokenizationMethod: String + + """Cardholder name.""" + name: String + + """ + A set of available payout methods for this card. Will be either `["standard"]` or `["standard", "instant"]`. Only values from this set should be passed as the `method` when creating a transfer. + """ + availablePayoutMethods: [String!] + + """Billing address country, if provided when creating card.""" + addressCountry: String + + """ + If `address_zip` was provided, results of the check: `pass`, `fail`, `unavailable`, or `unchecked`. + """ + addressZipCheck: String + + """Address line 2 (Apartment/Suite/Unit/Building).""" + addressLine2: String + + """ + If a CVC was provided, results of the check: `pass`, `fail`, `unavailable`, or `unchecked`. + """ + cvcCheck: String + + """ + The account this card belongs to. This attribute will not be in the card object if the card belongs to a customer or recipient instead. + """ + account: StripeAccount + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """State/County/Province/Region.""" + addressState: String + + """ZIP or postal code.""" + addressZip: String + + """Two-digit number representing the card's expiration month.""" + expMonth: Int! + + """ + The customer that this card belongs to. This attribute will not be in the card object if the card belongs to an account or recipient instead. + """ + customer: StripeCardCustomerUnion + + """Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.""" + funding: String! + + """City/District/Suburb/Town/Village.""" + addressCity: String + + """ + If `address_line1` was provided, results of the check: `pass`, `fail`, `unavailable`, or `unchecked`. + """ + addressLine1Check: String +} + +union StripeApiErrorsSourceUnion = StripeSource | StripeCard | StripeBankAccount + +"""""" +type StripeSourceTypeCardPresent { + """""" + expYear: Int + + """""" + applicationPreferredName: String + + """""" + last4: String + + """""" + readMethod: String + + """""" + country: String + + """""" + dataType: String + + """""" + brand: String + + """""" + reader: String + + """""" + posDeviceId: String + + """""" + fingerprint: String + + """""" + evidenceCustomerSignature: String + + """""" + emvAuthData: String + + """""" + authorizationCode: String + + """""" + transactionStatusInformation: String + + """""" + dedicatedFileName: String + + """""" + authorizationResponseCode: String + + """""" + expMonth: Int + + """""" + cvmType: String + + """""" + funding: String + + """""" + terminalVerificationResults: String + + """""" + evidenceTransactionCertificate: String + + """""" + posEntryMode: String + + """""" + applicationCryptogram: String +} + +"""""" +type StripeSourceTypeP24 { + """""" + reference: String +} + +"""""" +type StripeSourceTypeMultibanco { + """""" + refundAccountHolderAddressCountry: String + + """""" + refundAccountHolderAddressCity: String + + """""" + refundAccountHolderName: String + + """""" + refundAccountHolderAddressState: String + + """""" + refundIban: String + + """""" + refundAccountHolderAddressLine2: String + + """""" + reference: String + + """""" + refundAccountHolderAddressPostalCode: String + + """""" + entity: String + + """""" + refundAccountHolderAddressLine1: String +} + +"""""" +type StripeSourceTypeBancontact { + """""" + bankCode: String + + """""" + bankName: String + + """""" + bic: String + + """""" + ibanLast4: String + + """""" + preferredLanguage: String + + """""" + statementDescriptor: String +} + +"""""" +type StripeSourceCodeVerificationFlow { + """ + The number of attempts remaining to authenticate the source object with a verification code. + """ + attemptsRemaining: Int! + + """ + The status of the code verification, either `pending` (awaiting verification, `attempts_remaining` should be greater than 0), `succeeded` (successful verification) or `failed` (failed verification, cannot be verified anymore as `attempts_remaining` should be 0). + """ + status: String! +} + +"""""" +type StripeSourceTypeCard { + """""" + expYear: Int + + """""" + threeDSecure: String + + """""" + last4: String + + """""" + country: String + + """""" + dynamicLast4: String + + """""" + brand: String + + """""" + fingerprint: String + + """""" + tokenizationMethod: String + + """""" + name: String + + """""" + addressZipCheck: String + + """""" + cvcCheck: String + + """""" + expMonth: Int + + """""" + funding: String + + """""" + addressLine1Check: String +} + +"""""" +type StripeSourceTypeWechat { + """""" + prepayId: String + + """""" + qrCodeUrl: String + + """""" + statementDescriptor: String +} + +enum StripeSourceTypeEnum { + ach_credit_transfer + ach_debit + alipay + bancontact + card + card_present + eps + giropay + ideal + klarna + multibanco + p24 + sepa_debit + sofort + three_d_secure + wechat +} + +"""""" +type StripeSourceReceiverFlow { + """ + The address of the receiver source. This is the value that should be communicated to the customer to send their funds to. + """ + address: String + + """ + The total amount that was charged by you. The amount charged is expressed in the source's currency. + """ + amountCharged: Int! + + """ + The total amount received by the receiver source. `amount_received = amount_returned + amount_charged` is true at all time. The amount received is expressed in the source's currency. + """ + amountReceived: Int! + + """ + The total amount that was returned to the customer. The amount returned is expressed in the source's currency. + """ + amountReturned: Int! + + """Type of refund attribute method, one of `email`, `manual`, or `none`.""" + refundAttributesMethod: String! + + """ + Type of refund attribute status, one of `missing`, `requested`, or `available`. + """ + refundAttributesStatus: String! +} + +"""""" +type StripeSourceTypeAchCreditTransfer { + """""" + accountNumber: String + + """""" + bankName: String + + """""" + fingerprint: String + + """""" + refundAccountHolderName: String + + """""" + refundAccountHolderType: String + + """""" + refundRoutingNumber: String + + """""" + routingNumber: String + + """""" + swiftCode: String +} + +"""""" +type StripeSourceTypeAchDebit { + """""" + bankName: String + + """""" + country: String + + """""" + fingerprint: String + + """""" + last4: String + + """""" + routingNumber: String + + """""" + type: String +} + +"""""" +type StripeSourceTypeSofort { + """""" + bankCode: String + + """""" + bankName: String + + """""" + bic: String + + """""" + country: String + + """""" + ibanLast4: String + + """""" + preferredLanguage: String + + """""" + statementDescriptor: String +} + +"""""" +type StripeSourceTypeSepaDebit { + """""" + bankCode: String + + """""" + branchCode: String + + """""" + country: String + + """""" + fingerprint: String + + """""" + last4: String + + """""" + mandateReference: String + + """""" + mandateUrl: String +} + +"""""" +type StripeSourceTypeEps { + """""" + reference: String + + """""" + statementDescriptor: String +} + +"""""" +type StripeSourceRedirectFlow { + """ + The failure reason for the redirect, either `user_abort` (the customer aborted or dropped out of the redirect flow), `declined` (the authentication failed or the transaction was declined), or `processing_error` (the redirect failed due to a technical error). Present only if the redirect status is `failed`. + """ + failureReason: String + + """ + The URL you provide to redirect the customer to after they authenticated their payment. + """ + returnUrl: String! + + """ + The status of the redirect, either `pending` (ready to be used by your customer to authenticate the transaction), `succeeded` (succesful authentication, cannot be reused) or `not_required` (redirect should not be used) or `failed` (failed authentication, cannot be reused). + """ + status: String! + + """ + The URL provided to you to redirect a customer to as part of a `redirect` authentication flow. + """ + url: String! +} + +"""""" +type StripeSourceTypeGiropay { + """""" + bankCode: String + + """""" + bankName: String + + """""" + bic: String + + """""" + statementDescriptor: String +} + +"""""" +type StripeSourceTypeThreeDSecure { + """""" + expYear: Int + + """""" + threeDSecure: String + + """""" + last4: String + + """""" + country: String + + """""" + dynamicLast4: String + + """""" + brand: String + + """""" + fingerprint: String + + """""" + tokenizationMethod: String + + """""" + name: String + + """""" + addressZipCheck: String + + """""" + cvcCheck: String + + """""" + card: String + + """""" + expMonth: Int + + """""" + customer: String + + """""" + funding: String + + """""" + addressLine1Check: String + + """""" + authenticated: Boolean +} + +"""""" +type StripeSourceTypeIdeal { + """""" + bank: String + + """""" + bic: String + + """""" + ibanLast4: String + + """""" + statementDescriptor: String +} + +"""""" +type StripeSourceOrderItem { + """The amount (price) for this order item.""" + amount: Int + + """This currency of this order item. Required when `amount` is present.""" + currency: String + + """Human-readable description for this order item.""" + description: String + + """ + The quantity of this order item. When type is `sku`, this is the number of instances of the SKU to be ordered. + """ + quantity: Int + + """The type of this order item. Must be `sku`, `tax`, or `shipping`.""" + type: String +} + +"""""" +type StripeSourceOrder { + """ + A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount for the order. + """ + amount: Int! + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """The email address of the customer placing the order.""" + email: String + + """List of items constituting the order.""" + items: [StripeSourceOrderItem!] + + """""" + shipping: StripeShipping +} + +"""""" +type StripeSourceTypeAlipay { + """""" + dataString: String + + """""" + nativeUrl: String + + """""" + statementDescriptor: String +} + +"""""" +type StripeSourceTypeKlarna { + """""" + payNowAssetUrlsStandard: String + + """""" + shippingFirstName: String + + """""" + clientToken: String + + """""" + payLaterAssetUrlsStandard: String + + """""" + purchaseCountry: String + + """""" + redirectUrl: String + + """""" + payOverTimeAssetUrlsDescriptive: String + + """""" + payLaterName: String + + """""" + payOverTimeName: String + + """""" + payNowName: String + + """""" + payLaterRedirectUrl: String + + """""" + pageTitle: String + + """""" + payOverTimeRedirectUrl: String + + """""" + locale: String + + """""" + purchaseType: String + + """""" + shippingLastName: String + + """""" + backgroundImageUrl: String + + """""" + lastName: String + + """""" + firstName: String + + """""" + paymentMethodCategories: String + + """""" + payLaterAssetUrlsDescriptive: String + + """""" + logoUrl: String + + """""" + payOverTimeAssetUrlsStandard: String + + """""" + payNowAssetUrlsDescriptive: String + + """""" + payNowRedirectUrl: String +} + +"""""" +type StripeSourceOwner { + """Owner's address.""" + address: StripeAddress + + """Owner's email address.""" + email: String + + """Owner's full name.""" + name: String + + """Owner's phone number (including extension).""" + phone: String + + """ + Verified owner's address. Verified values are verified or provided by the payment method directly (and if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + verifiedAddress: StripeAddress + + """ + Verified owner's email address. Verified values are verified or provided by the payment method directly (and if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + verifiedEmail: String + + """ + Verified owner's full name. Verified values are verified or provided by the payment method directly (and if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + verifiedName: String + + """ + Verified owner's phone number (including extension). Verified values are verified or provided by the payment method directly (and if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + verifiedPhone: String +} + +enum StripeSourceObjectEnum { + source +} + +"""""" +type StripeSource { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeSourceObjectEnum! + + """ + Either `reusable` or `single_use`. Whether this source should be reusable or not. Some source types may or may not be reusable by construction, while others may leave the option at creation. If an incompatible value is passed, an error will be returned. + """ + usage: String + + """ + Information about the owner of the payment instrument that may be used or required by particular source types. + """ + owner: StripeSourceOwner + + """""" + klarna: StripeSourceTypeKlarna + + """""" + alipay: StripeSourceTypeAlipay + + """""" + sourceOrder: StripeSourceOrder + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """""" + ideal: StripeSourceTypeIdeal + + """""" + threeDSecure: StripeSourceTypeThreeDSecure + + """""" + giropay: StripeSourceTypeGiropay + + """ + Three-letter [ISO code for the currency](https://stripe.com/docs/currencies) associated with the source. This is the currency for which the source will be chargeable once ready. Required for `single_use` sources. + """ + currency: String + + """""" + redirect: StripeSourceRedirectFlow + + """Unique identifier for the object.""" + id: String! + + """""" + eps: StripeSourceTypeEps + + """""" + sepaDebit: StripeSourceTypeSepaDebit + + """""" + sofort: StripeSourceTypeSofort + + """""" + achDebit: StripeSourceTypeAchDebit + + """ + The status of the source, one of `canceled`, `chargeable`, `consumed`, `failed`, or `pending`. Only `chargeable` sources can be used to create a charge. + """ + status: String! + + """""" + achCreditTransfer: StripeSourceTypeAchCreditTransfer + + """""" + receiver: StripeSourceReceiverFlow + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String + + """ + Extra information about a source. This will appear on your customer's statement every time you charge the source. + """ + statementDescriptor: String + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + The `type` of the source. The `type` is a payment method, one of `ach_credit_transfer`, `ach_debit`, `alipay`, `bancontact`, `card`, `card_present`, `eps`, `giropay`, `ideal`, `multibanco`, `klarna`, `p24`, `sepa_debit`, `sofort`, `three_d_secure`, or `wechat`. An additional hash is included on the source with a name matching this value. It contains additional information specific to the [payment method](https://stripe.com/docs/sources) used. + """ + type: StripeSourceTypeEnum! + + """ + A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount associated with the source. This is the amount for which the source will be chargeable once ready. Required for `single_use` sources. + """ + amount: Int + + """""" + wechat: StripeSourceTypeWechat + + """""" + card: StripeSourceTypeCard + + """""" + codeVerification: StripeSourceCodeVerificationFlow + + """""" + bancontact: StripeSourceTypeBancontact + + """ + The ID of the customer to which this source is attached. This will not be present when the source has not been attached to a customer. + """ + customer: String + + """ + The client secret of the source. Used for client-side retrieval using a publishable key. + """ + clientSecret: String! + + """""" + multibanco: StripeSourceTypeMultibanco + + """""" + p24: StripeSourceTypeP24 + + """ + The authentication `flow` of the source. `flow` is one of `redirect`, `receiver`, `code_verification`, `none`. + """ + flow: String! + + """""" + cardPresent: StripeSourceTypeCardPresent +} + +union StripeCustomerSourcesDataUnion = StripeSource | StripeCard | StripeBitcoinReceiver | StripeBankAccount | StripeAlipayAccount + +"""""" +type StripeCustomerSources { + """ + The list contains all payment sources that have been attached to the customer. + """ + data: [StripeCustomerSourcesDataUnion!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripeCustomerSourcesObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +""" +A conversation rating contains information relating to a customer's satisfaction with their interaction with your team. For more info on conversation ratings please see [here](https://docs.intercom.com/support-and-retain-customers/see-your-team-s-progress/measure-customer-satisfaction-with-conversation-ratings) +""" +type IntercomConversationRating { + """The rating, between 1 and 5, for the conversation""" + rating: Int + + """An optional field to add a remark to correspond to the number rating""" + remark: String + + """The time the conversation that is being rated was created""" + createdAt: Int + + """ + An object containing the ID and type of the customer (e.g. it could be a user or lead) + """ + customer: IntercomUser + + """ + An object containing the ID and type of the Intercom teammate associated with the conversation when it was rated + """ + teammate: IntercomAdmin +} + +"""A conversation part describes an element of the conversation.""" +type IntercomConversationPart { + """The value is 'conversation_part'""" + type: String + + """The id representing the conversation part""" + id: String + + """The type of conversation part""" + partType: String + + """The html encoded body of the comment""" + body: String + + """The time the conversation part was created""" + createdAt: Int + + """The last time the conversation part was updated""" + updatedAt: Int + + """The time the user was notified with the conversation part""" + notifiedAt: Int + + """ + The admin that the conversation is assigned to (not null only when part_type: assignment). + """ + assignedTo: IntercomAdmin + + """The user or admin that created the part""" + author: IntercomAuthor + + """A list of attachments for the part""" + attachments: [IntercomAttachment!] +} + +""" +A conversation rating contains information relating to a customer's satisfaction with their interaction with your team. For more info on conversation ratings please see [here](https://docs.intercom.com/support-and-retain-customers/see-your-team-s-progress/measure-customer-satisfaction-with-conversation-ratings) +""" +type IntercomAttachment { + """The name for the attachment, e.g. "signature".""" + name: String + + """The url for the attachment, e.g. "http://example.org/signature.jpg".""" + url: String +} + +"""Lead object""" +type IntercomLead implements IntercomAuthor { + """value is 'contact'""" + type: String + + """The Intercom defined id representing the Lead""" + id: String + + """The time the Lead was added to Intercom""" + createdAt: Int + + """The last time the Lead was updated""" + updatedAt: Int + + """Automatically generated identifier for the Lead""" + userId: String + + """The email you have defined for the Lead""" + email: String + + """The phone number you have defined for the lead""" + phone: String + + """The name of the Lead""" + name: String + + """The custom attributes you have set on the Lead""" + customAttributes: JSON + + """The time the Lead last recorded making a request""" + lastRequestAt: Int + + """An avatar object for the Lead""" + avatar: IntercomAvatar + + """Whether the Lead is unsubscribed from emails""" + unsubscribedFromEmails: Boolean + + """A Location Object relating to the Lead""" + locationData: IntercomLocation + + """A list of companies for the Lead""" + companies: [IntercomCompany!] + + """A list of social profiles associated with the Lead""" + socialProfiles: [IntercomSocialProfile!] + + """A list of segments the Lead.""" + segments: [IntercomSegment!] + + """A list of tags associated with the Lead.""" + tags: [IntercomTag!] + + """The URL of the page the lead was last on""" + referrer: String + + """Identifies which site sent the traffic""" + utmSource: String + + """Identifies what type of link was used""" + utmMedium: String + + """Identifies a specific product promotion or strategic campaign""" + utmCampaign: String + + """Identifies search terms""" + utmTerm: String + + """Identifies what specifically was clicked to bring the user to the site""" + utmContent: String +} + +"""Bot object""" +type IntercomBot implements IntercomAuthor { + """Value is `bot`.""" + type: String + + """""" + id: String +} + +interface IntercomAuthor { + id: String + type: String +} + +"""What field to sort the results by""" +enum IntercomConversationSortByField { + CREATED_AT + UPDATED_AT + WAITING_SINCE +} + +"""An admin on Intercom""" +type IntercomAdmin implements IntercomAuthor { + """value is 'admin'""" + type: String + + """The id of the admin""" + id: String + + """The name of the admin""" + name: String + + """The email address of the admin""" + email: String + + """ + This field will indicate whether the Intercom user has verified their email or not + """ + emailVerified: Boolean + + """value is 'app'""" + appType: String + + """The id of the app""" + appIdCode: String + + """The name of the app""" + appName: String + + """When the app was created""" + appCreatedAt: Int + + """Whether or not the app uses identity verification""" + appIdentityVerification: Boolean + + """ + Conversations for this admin. + + Conversation are how you can communicate with users in Intercom. + """ + conversations( + """ + When true, retrieves conversation messages in plain text. Defaults to false. + """ + displayAsPlaintext: Boolean + + """ + Defaults to true. When true, fetches just open conversations. When false, fetches just closed conversations. + """ + open: Boolean + + """What field to sort the results by. Defaults to UPDATED_AT.""" + sortByField: IntercomConversationSortByField + + """ + Return the conversations in ascending or descending order. Defaults to DESC. + """ + orderBy: IntercomSortOrderBy + ): IntercomConversationsConnection +} + +"""Message object""" +type IntercomMessage { + """_value is 'conversation_message'_""" + type: String + + """The id representing the message""" + id: String + + """Optional. The message subject""" + subject: String + + """The message body, which may contain HTML""" + body: String + + """The Admin that created the message""" + author: IntercomAdmin + + """A list of attachments for the part""" + attachments: [IntercomAttachment!] + + """The URL the User started a conversation on""" + url: String +} + +"""Conversation are how you can communicate with users in Intercom.""" +type IntercomConversation { + """value is 'conversation'""" + type: String + + """The id representing the conversation""" + id: String + + """The time the conversation was created""" + createdAt: Int + + """The last time the conversation was updated""" + updatedAt: Int + + """ + The last time a customer responded to an admin. + In other words, the time a customer started waiting for a response. + """ + waitingSince: Int + + """ + If set this is the time in the future when this conversation will be marked as open. + i.e. it will be in a snoozed state until this time + """ + snoozedUntil: Int + + """The message that started the conversation rendered for presentation.""" + conversationMessage: IntercomMessage + + """The user the conversation concerns""" + user: IntercomUser + + """ + The list of customers (users or leads) involved in this conversation. + This will only contain one customer unless more were added via the group conversation feature + """ + customers: [IntercomUser!] + + """ + The admin the conversation is currently assigned to. + Note nobody_admin indicates the conversation is assigned to Nobody. + """ + assignee: IntercomAdmin + + """A conversation part object with a list of conversation parts""" + conversationParts: [IntercomConversationPart!] + + """Indicates whether a conversation is open (true) or closed (false)""" + open: Boolean + + """Can be set to "open", "closed" or "snoozed".""" + state: String + + """Indicates whether a conversation has been read""" + read: Boolean + + """A list of tags associated with the conversation.""" + tags: [IntercomTag!] + + """The number of conversation parts in this conversation.""" + totalCount: Int + + """ + A conversation rating object which contains information on the rating and/or remark added by a customer and the admin assigned to the conversation + """ + conversationRating: IntercomConversationRating +} + +"""Conversations on Intercom""" +type IntercomConversationsConnection { + """Conversations""" + nodes: [IntercomConversation!]! +} + +""" +Events are how you can submit user activity to Intercom. Once you're sending Intercom event data, you can filter your user base with those events and create Auto Messages to send whenever an event occurs. Every event is associated with an event name, the time it happened, the user that caused the event, and optionally some extra metadata. Events record the count, first and last occurrence of an event. +""" +type IntercomEvent { + """Unique id for the event.""" + id: String + + """ + The name of the event that occurred. This is presented to your App's admins when filtering and creating segments - a good event name is typically a past tense 'verb-noun' combination, to improve readability, for example updated-plan. + """ + eventName: String + + """The time the event occurred as a UTC Unix timestamp""" + createdAt: Int + + """Your identifier for the user.""" + userId: String + + """Intercom's identifier for the user.""" + intercomUserId: String + + """ + An email address for your user. An email should only be used where your application uses email to uniquely identify users + """ + email: String + + """optional metadata about the event.""" + metadata: JSON +} + +"""Events on Intercom, with pagination.""" +type IntercomEventssConnection { + """List of events.""" + nodes: [IntercomEvent!]! + + """Page info""" + pageInfo: PageInfo! +} + +"""Counts of the different events for a user""" +type IntercomEventSummary { + """ + The name of the event that occurred. This is presented to your App's admins when filtering and creating segments - a good event name is typically a past tense 'verb-noun' combination, to improve readability, for example updated-plan. + """ + name: String + + """The date of the first time the event was recorded, in rfc3339 format.""" + first: String + + """The date of the last time the event was recorded, in rfc3339 format.""" + last: String + + """The number of times the event has occured for the user.""" + count: Int + + """Description of the event""" + description: String +} + +"""Defaults to `ASC`""" +enum ZendeskSearchSortOrder { + DESC + ASC +} + +"""Field to sort tickets by""" +enum ZendeskTicketsSortBy { + ASSIGNEE + ASSIGNEE_NAME + CREATED_AT + GROUP + ID + LOCALE + REQUESTER + REQUESTER_NAME + STATUS + SUBJECT + UPDATED_AT +} + +union ZendeskSearchResult = ZendeskUser | ZendeskTicket + +""" +Tickets are the means through which your end users (customers) communicate with agents in Zendesk Support. Tickets can originate from a number of channels, including email, Help Center, chat, phone call, Twitter, Facebook, or the API. All tickets have a core set of properties. +""" +type ZendeskTicket { + """""" + id: Int + + """""" + url: String + + """""" + externalId: String + + """""" + type: String + + """""" + subject: String + + """""" + rawSubject: String + + """""" + description: String + + """""" + priority: String + + """""" + status: String + + """""" + recipient: String + + """""" + requesterId: Int! + + """""" + submitterId: Int + + """""" + assigneeId: Int + + """""" + organizationId: Int + + """""" + groupId: Int + + """""" + forumTopicId: Int + + """""" + problemId: Int + + """""" + hasIncidents: Boolean + + """""" + dueAt: String + + """""" + viaFollowupSourceId: Int + + """""" + ticketFormId: Int + + """""" + brandId: Int + + """""" + allowChannelback: Boolean + + """""" + isPublic: Boolean + + """""" + createdAt: String + + """""" + updatedAt: String + assignee: ZendeskUser + requester: ZendeskUser + submitter: ZendeskUser +} + +"""""" +type ZendeskTicketsEdge { + """node""" + node: ZendeskTicket! + + """cursor""" + cursor: String! +} + +"""""" +type ZendeskTicketsConnection { + """Total number of tickets""" + totalResults: Int! + + """edges""" + edges: [ZendeskTicketsEdge!]! + + """pageInfo""" + pageInfo: PageInfo! +} + +union SalesforceOpenActivityWhoUnion = SalesforceLead | SalesforceContact + +union SalesforceEmailStatusWhoUnion = SalesforceLead | SalesforceContact + +union SalesforceLookedUpFromActivityWhoUnion = SalesforceLead | SalesforceContact + +union SalesforceActivityHistoryWhoUnion = SalesforceLead | SalesforceContact + +union SalesforceOutgoingEmailRelationRelationUnion = SalesforceUser | SalesforceLead | SalesforceContact + +""" +A filter to be used against WaveCompatibilityCheckItem object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceWaveCompatibilityCheckItemConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the WaveCompatibilityCheckItem's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the WaveCompatibilityCheckItem's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the WaveCompatibilityCheckItem's id field""" + id: SalesforceIdFilter + + """Filter by the WaveCompatibilityCheckItem's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the WaveCompatibilityCheckItem's name field""" + name: SalesforceStringFilter + + """Filter by the WaveCompatibilityCheckItem's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the WaveCompatibilityCheckItem's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the WaveCompatibilityCheckItem's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the WaveCompatibilityCheckItem's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the WaveCompatibilityCheckItem's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the WaveCompatibilityCheckItem's taskName field""" + taskName: SalesforceStringFilter + + """Filter by the WaveCompatibilityCheckItem's taskResult field""" + taskResult: SalesforceStringFilter + + """Filter by the WaveCompatibilityCheckItem's templateApiName field""" + templateApiName: SalesforceStringFilter + + """Filter by the WaveCompatibilityCheckItem's templateVersion field""" + templateVersion: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceWaveCompatibilityCheckItemConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceWaveCompatibilityCheckItemConnectionFilter!] +} + +"""Field that Wave Compatibility Check Items can be sorted by""" +enum SalesforceWaveCompatibilityCheckItemSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + TASK_NAME + TASK_RESULT + TEMPLATE_API_NAME + TEMPLATE_VERSION +} + +"""An edge in a connection.""" +type SalesforceWaveCompatibilityCheckItemEdge { + """The item at the end of the edge.""" + node: SalesforceWaveCompatibilityCheckItem! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Wave Compatibility Check Items connection, for use in pagination. +""" +type SalesforceWaveCompatibilityCheckItemsConnection { + """ + The count of all Wave Compatibility Check Item you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Wave Compatibility Check Items""" + nodes: [SalesforceWaveCompatibilityCheckItem!]! + + """List of Wave Compatibility Check Item edges""" + edges: [SalesforceWaveCompatibilityCheckItemEdge!]! +} + +""" +A filter to be used against UserProvMockTarget object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserProvMockTargetConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserProvMockTarget's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserProvMockTarget's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserProvMockTarget's id field""" + id: SalesforceIdFilter + + """Filter by the UserProvMockTarget's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UserProvMockTarget's name field""" + name: SalesforceStringFilter + + """Filter by the UserProvMockTarget's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserProvMockTarget's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserProvMockTarget's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserProvMockTarget's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserProvMockTarget's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserProvMockTarget's externalUserId field""" + externalUserId: SalesforceStringFilter + + """Filter by the UserProvMockTarget's externalUsername field""" + externalUsername: SalesforceStringFilter + + """Filter by the UserProvMockTarget's externalEmail field""" + externalEmail: SalesforceStringFilter + + """Filter by the UserProvMockTarget's externalFirstName field""" + externalFirstName: SalesforceStringFilter + + """Filter by the UserProvMockTarget's externalLastName field""" + externalLastName: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserProvMockTargetConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserProvMockTargetConnectionFilter!] +} + +"""Field that User Provisioning Mock Targets can be sorted by""" +enum SalesforceUserProvMockTargetSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + EXTERNAL_USER_ID + EXTERNAL_USERNAME + EXTERNAL_EMAIL + EXTERNAL_FIRST_NAME + EXTERNAL_LAST_NAME +} + +"""An edge in a connection.""" +type SalesforceUserProvMockTargetEdge { + """The item at the end of the edge.""" + node: SalesforceUserProvMockTarget! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce User Provisioning Mock Targets connection, for use in pagination. +""" +type SalesforceUserProvMockTargetsConnection { + """ + The count of all User Provisioning Mock Target you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Provisioning Mock Targets""" + nodes: [SalesforceUserProvMockTarget!]! + + """List of User Provisioning Mock Target edges""" + edges: [SalesforceUserProvMockTargetEdge!]! +} + +""" +A filter to be used against UserPreference object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserPreferenceConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserPreference's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the UserPreference's id field""" + id: SalesforceIdFilter + + """Filter by the UserPreference's userId field""" + userId: SalesforceIdFilter + + """Filter by the UserPreference's preference field""" + preference: SalesforceStringFilter + + """Filter by the UserPreference's value field""" + value: SalesforceStringFilter + + """Filter by the UserPreference's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserPreferenceConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserPreferenceConnectionFilter!] +} + +"""Field that User Preferences can be sorted by""" +enum SalesforceUserPreferenceSortByFieldEnum { + ID + USER_ID + PREFERENCE + VALUE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceUserPreferenceEdge { + """The item at the end of the edge.""" + node: SalesforceUserPreference! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce User Preferences connection, for use in pagination.""" +type SalesforceUserPreferencesConnection { + """The count of all User Preference you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Preferences""" + nodes: [SalesforceUserPreference!]! + + """List of User Preference edges""" + edges: [SalesforceUserPreferenceEdge!]! +} + +""" +A filter to be used against UserLogin object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserLoginConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserLogin's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserLogin's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the UserLogin's id field""" + id: SalesforceIdFilter + + """Filter by the UserLogin's userId field""" + userId: SalesforceIdFilter + + """Filter by the UserLogin's isFrozen field""" + isFrozen: SalesforceBooleanFilter + + """Filter by the UserLogin's isPasswordLocked field""" + isPasswordLocked: SalesforceBooleanFilter + + """Filter by the UserLogin's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserLogin's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserLoginConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserLoginConnectionFilter!] +} + +"""Field that User Logins can be sorted by""" +enum SalesforceUserLoginSortByFieldEnum { + ID + USER_ID + IS_FROZEN + IS_PASSWORD_LOCKED + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceUserLoginEdge { + """The item at the end of the edge.""" + node: SalesforceUserLogin! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce User Logins connection, for use in pagination.""" +type SalesforceUserLoginsConnection { + """The count of all User Login you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Logins""" + nodes: [SalesforceUserLogin!]! + + """List of User Login edges""" + edges: [SalesforceUserLoginEdge!]! +} + +""" +A filter to be used against UserAppInfo object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserAppInfoConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserAppInfo's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the UserAppInfo's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserAppInfo's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserAppInfo's id field""" + id: SalesforceIdFilter + + """Filter by the UserAppInfo's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UserAppInfo's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserAppInfo's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserAppInfo's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserAppInfo's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserAppInfo's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserAppInfo's userId field""" + userId: SalesforceIdFilter + + """Filter by the UserAppInfo's formFactor field""" + formFactor: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserAppInfoConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserAppInfoConnectionFilter!] +} + +"""Field that Last Used Apps can be sorted by""" +enum SalesforceUserAppInfoSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + USER_ID + FORM_FACTOR +} + +"""An edge in a connection.""" +type SalesforceUserAppInfoEdge { + """The item at the end of the edge.""" + node: SalesforceUserAppInfo! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Last Used Apps connection, for use in pagination.""" +type SalesforceUserAppInfosConnection { + """The count of all Last Used App you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Last Used Apps""" + nodes: [SalesforceUserAppInfo!]! + + """List of Last Used App edges""" + edges: [SalesforceUserAppInfoEdge!]! +} + +"""Field that Topics can be sorted by""" +enum SalesforceTopicSortByFieldEnum { + ID + NAME + DESCRIPTION + CREATED_DATE + CREATED_BY_ID + TALKING_ABOUT + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceTopicEdge { + """The item at the end of the edge.""" + node: SalesforceTopic! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Topics connection, for use in pagination.""" +type SalesforceTopicsConnection { + """The count of all Topic you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Topics""" + nodes: [SalesforceTopic!]! + + """List of Topic edges""" + edges: [SalesforceTopicEdge!]! +} + +"""Field that Goals can be sorted by""" +enum SalesforceTodayGoalSortByFieldEnum { + ID + OWNER_ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + VALUE + USER_ID +} + +"""An edge in a connection.""" +type SalesforceTodayGoalEdge { + """The item at the end of the edge.""" + node: SalesforceTodayGoal! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Goals connection, for use in pagination.""" +type SalesforceTodayGoalsConnection { + """The count of all Goal you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Goals""" + nodes: [SalesforceTodayGoal!]! + + """List of Goal edges""" + edges: [SalesforceTodayGoalEdge!]! +} + +""" +A filter to be used against TenantUsageEntitlement object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTenantUsageEntitlementConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the TenantUsageEntitlement's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the TenantUsageEntitlement's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the TenantUsageEntitlement's id field""" + id: SalesforceIdFilter + + """Filter by the TenantUsageEntitlement's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the TenantUsageEntitlement's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the TenantUsageEntitlement's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the TenantUsageEntitlement's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the TenantUsageEntitlement's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the TenantUsageEntitlement's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the TenantUsageEntitlement's resourceGroupKey field""" + resourceGroupKey: SalesforceStringFilter + + """Filter by the TenantUsageEntitlement's setting field""" + setting: SalesforceStringFilter + + """Filter by the TenantUsageEntitlement's startDate field""" + startDate: SalesforceDateFilter + + """Filter by the TenantUsageEntitlement's endDate field""" + endDate: SalesforceDateFilter + + """Filter by the TenantUsageEntitlement's currentAmountAllowed field""" + currentAmountAllowed: SalesforceFloatFilter + + """Filter by the TenantUsageEntitlement's frequency field""" + frequency: SalesforceStringFilter + + """Filter by the TenantUsageEntitlement's isPersistentResource field""" + isPersistentResource: SalesforceBooleanFilter + + """Filter by the TenantUsageEntitlement's hasRollover field""" + hasRollover: SalesforceBooleanFilter + + """Filter by the TenantUsageEntitlement's overageGrace field""" + overageGrace: SalesforceFloatFilter + + """Filter by the TenantUsageEntitlement's amountUsed field""" + amountUsed: SalesforceFloatFilter + + """Filter by the TenantUsageEntitlement's usageDate field""" + usageDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTenantUsageEntitlementConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTenantUsageEntitlementConnectionFilter!] +} + +"""Field that Tenant Usage Entitlements can be sorted by""" +enum SalesforceTenantUsageEntitlementSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + RESOURCE_GROUP_KEY + SETTING + START_DATE + END_DATE + CURRENT_AMOUNT_ALLOWED + FREQUENCY + IS_PERSISTENT_RESOURCE + HAS_ROLLOVER + OVERAGE_GRACE + AMOUNT_USED + USAGE_DATE +} + +"""An edge in a connection.""" +type SalesforceTenantUsageEntitlementEdge { + """The item at the end of the edge.""" + node: SalesforceTenantUsageEntitlement! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Tenant Usage Entitlements connection, for use in pagination. +""" +type SalesforceTenantUsageEntitlementsConnection { + """ + The count of all Tenant Usage Entitlement you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Tenant Usage Entitlements""" + nodes: [SalesforceTenantUsageEntitlement!]! + + """List of Tenant Usage Entitlement edges""" + edges: [SalesforceTenantUsageEntitlementEdge!]! +} + +""" +A filter to be used against TaskStatus object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTaskStatusConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the TaskStatus's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the TaskStatus's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the TaskStatus's id field""" + id: SalesforceIdFilter + + """Filter by the TaskStatus's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the TaskStatus's apiName field""" + apiName: SalesforceStringFilter + + """Filter by the TaskStatus's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the TaskStatus's isDefault field""" + isDefault: SalesforceBooleanFilter + + """Filter by the TaskStatus's isClosed field""" + isClosed: SalesforceBooleanFilter + + """Filter by the TaskStatus's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the TaskStatus's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the TaskStatus's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the TaskStatus's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the TaskStatus's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTaskStatusConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTaskStatusConnectionFilter!] +} + +"""Field that Task Status Values can be sorted by""" +enum SalesforceTaskStatusSortByFieldEnum { + ID + MASTER_LABEL + API_NAME + SORT_ORDER + IS_DEFAULT + IS_CLOSED + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceTaskStatusEdge { + """The item at the end of the edge.""" + node: SalesforceTaskStatus! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Task Status Values connection, for use in pagination.""" +type SalesforceTaskStatussConnection { + """The count of all Task Status Value you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Task Status Values""" + nodes: [SalesforceTaskStatus!]! + + """List of Task Status Value edges""" + edges: [SalesforceTaskStatusEdge!]! +} + +""" +A filter to be used against TaskPriority object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTaskPriorityConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the TaskPriority's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the TaskPriority's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the TaskPriority's id field""" + id: SalesforceIdFilter + + """Filter by the TaskPriority's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the TaskPriority's apiName field""" + apiName: SalesforceStringFilter + + """Filter by the TaskPriority's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the TaskPriority's isDefault field""" + isDefault: SalesforceBooleanFilter + + """Filter by the TaskPriority's isHighPriority field""" + isHighPriority: SalesforceBooleanFilter + + """Filter by the TaskPriority's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the TaskPriority's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the TaskPriority's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the TaskPriority's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the TaskPriority's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTaskPriorityConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTaskPriorityConnectionFilter!] +} + +"""Field that Task Priority Values can be sorted by""" +enum SalesforceTaskPrioritySortByFieldEnum { + ID + MASTER_LABEL + API_NAME + SORT_ORDER + IS_DEFAULT + IS_HIGH_PRIORITY + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceTaskPriorityEdge { + """The item at the end of the edge.""" + node: SalesforceTaskPriority! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Task Priority Values connection, for use in pagination.""" +type SalesforceTaskPrioritysConnection { + """ + The count of all Task Priority Value you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Task Priority Values""" + nodes: [SalesforceTaskPriority!]! + + """List of Task Priority Value edges""" + edges: [SalesforceTaskPriorityEdge!]! +} + +"""Field that Streaming Channels can be sorted by""" +enum SalesforceStreamingChannelSortByFieldEnum { + ID + OWNER_ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + IS_DYNAMIC + DESCRIPTION +} + +"""An edge in a connection.""" +type SalesforceStreamingChannelEdge { + """The item at the end of the edge.""" + node: SalesforceStreamingChannel! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Streaming Channels connection, for use in pagination.""" +type SalesforceStreamingChannelsConnection { + """The count of all Streaming Channel you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Streaming Channels""" + nodes: [SalesforceStreamingChannel!]! + + """List of Streaming Channel edges""" + edges: [SalesforceStreamingChannelEdge!]! +} + +"""Field that Static Resources can be sorted by""" +enum SalesforceStaticResourceSortByFieldEnum { + ID + NAMESPACE_PREFIX + NAME + CONTENT_TYPE + BODY_LENGTH + DESCRIPTION + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + CACHE_CONTROL +} + +"""An edge in a connection.""" +type SalesforceStaticResourceEdge { + """The item at the end of the edge.""" + node: SalesforceStaticResource! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Static Resources connection, for use in pagination.""" +type SalesforceStaticResourcesConnection { + """The count of all Static Resource you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Static Resources""" + nodes: [SalesforceStaticResource!]! + + """List of Static Resource edges""" + edges: [SalesforceStaticResourceEdge!]! +} + +""" +A filter to be used against SolutionStatus object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSolutionStatusConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SolutionStatus's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the SolutionStatus's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SolutionStatus's id field""" + id: SalesforceIdFilter + + """Filter by the SolutionStatus's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the SolutionStatus's apiName field""" + apiName: SalesforceStringFilter + + """Filter by the SolutionStatus's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the SolutionStatus's isDefault field""" + isDefault: SalesforceBooleanFilter + + """Filter by the SolutionStatus's isReviewed field""" + isReviewed: SalesforceBooleanFilter + + """Filter by the SolutionStatus's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SolutionStatus's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SolutionStatus's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the SolutionStatus's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SolutionStatus's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSolutionStatusConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSolutionStatusConnectionFilter!] +} + +"""Field that Solution Status Values can be sorted by""" +enum SalesforceSolutionStatusSortByFieldEnum { + ID + MASTER_LABEL + API_NAME + SORT_ORDER + IS_DEFAULT + IS_REVIEWED + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceSolutionStatusEdge { + """The item at the end of the edge.""" + node: SalesforceSolutionStatus! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Solution Status Values connection, for use in pagination.""" +type SalesforceSolutionStatussConnection { + """ + The count of all Solution Status Value you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Solution Status Values""" + nodes: [SalesforceSolutionStatus!]! + + """List of Solution Status Value edges""" + edges: [SalesforceSolutionStatusEdge!]! +} + +"""Field that Solutions can be sorted by""" +enum SalesforceSolutionSortByFieldEnum { + ID + IS_DELETED + SOLUTION_NUMBER + SOLUTION_NAME + IS_PUBLISHED + IS_PUBLISHED_IN_PUBLIC_KB + STATUS + IS_REVIEWED + OWNER_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + TIMES_USED + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + IS_HTML +} + +"""An edge in a connection.""" +type SalesforceSolutionEdge { + """The item at the end of the edge.""" + node: SalesforceSolution! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Solutions connection, for use in pagination.""" +type SalesforceSolutionsConnection { + """The count of all Solution you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Solutions""" + nodes: [SalesforceSolution!]! + + """List of Solution edges""" + edges: [SalesforceSolutionEdge!]! +} + +"""Field that Sites can be sorted by""" +enum SalesforceSiteSortByFieldEnum { + ID + NAME + SUBDOMAIN + URL_PATH_PREFIX + GUEST_USER_ID + STATUS + ADMIN_ID + DESCRIPTION + MASTER_LABEL + ANALYTICS_TRACKING_CODE + SITE_TYPE + CLICKJACK_PROTECTION_LEVEL + DAILY_BANDWIDTH_LIMIT + DAILY_BANDWIDTH_USED + DAILY_REQUEST_TIME_LIMIT + DAILY_REQUEST_TIME_USED + MONTHLY_PAGE_VIEWS_ENTITLEMENT + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceSiteEdge { + """The item at the end of the edge.""" + node: SalesforceSite! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Sites connection, for use in pagination.""" +type SalesforceSitesConnection { + """The count of all Site you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Sites""" + nodes: [SalesforceSite!]! + + """List of Site edges""" + edges: [SalesforceSiteEdge!]! +} + +""" +A filter to be used against SetupAuditTrail object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSetupAuditTrailConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SetupAuditTrail's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SetupAuditTrail's id field""" + id: SalesforceIdFilter + + """Filter by the SetupAuditTrail's action field""" + action: SalesforceStringFilter + + """Filter by the SetupAuditTrail's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SetupAuditTrail's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SetupAuditTrail's delegateUser field""" + delegateUser: SalesforceStringFilter + + """Filter by the SetupAuditTrail's responsibleNamespacePrefix field""" + responsibleNamespacePrefix: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSetupAuditTrailConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSetupAuditTrailConnectionFilter!] +} + +"""Field that Setup Audit Trail Entries can be sorted by""" +enum SalesforceSetupAuditTrailSortByFieldEnum { + ID + ACTION + SECTION + CREATED_DATE + CREATED_BY_ID + DISPLAY + DELEGATE_USER + RESPONSIBLE_NAMESPACE_PREFIX +} + +"""An edge in a connection.""" +type SalesforceSetupAuditTrailEdge { + """The item at the end of the edge.""" + node: SalesforceSetupAuditTrail! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Setup Audit Trail Entries connection, for use in pagination. +""" +type SalesforceSetupAuditTrailsConnection { + """ + The count of all Setup Audit Trail Entry you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Setup Audit Trail Entries""" + nodes: [SalesforceSetupAuditTrail!]! + + """List of Setup Audit Trail Entry edges""" + edges: [SalesforceSetupAuditTrailEdge!]! +} + +""" +A filter to be used against SecurityCustomBaseline object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSecurityCustomBaselineConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SecurityCustomBaseline's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the SecurityCustomBaseline's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SecurityCustomBaseline's id field""" + id: SalesforceIdFilter + + """Filter by the SecurityCustomBaseline's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SecurityCustomBaseline's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the SecurityCustomBaseline's language field""" + language: SalesforceStringFilter + + """Filter by the SecurityCustomBaseline's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the SecurityCustomBaseline's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the SecurityCustomBaseline's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SecurityCustomBaseline's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SecurityCustomBaseline's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SecurityCustomBaseline's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the SecurityCustomBaseline's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the SecurityCustomBaseline's isDefault field""" + isDefault: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSecurityCustomBaselineConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSecurityCustomBaselineConnectionFilter!] +} + +"""Field that Security Custom Baselines can be sorted by""" +enum SalesforceSecurityCustomBaselineSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DEFAULT +} + +"""An edge in a connection.""" +type SalesforceSecurityCustomBaselineEdge { + """The item at the end of the edge.""" + node: SalesforceSecurityCustomBaseline! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Security Custom Baselines connection, for use in pagination. +""" +type SalesforceSecurityCustomBaselinesConnection { + """ + The count of all Security Custom Baseline you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Security Custom Baselines""" + nodes: [SalesforceSecurityCustomBaseline!]! + + """List of Security Custom Baseline edges""" + edges: [SalesforceSecurityCustomBaselineEdge!]! +} + +"""Field that Secure Agent Clusters can be sorted by""" +enum SalesforceSecureAgentsClusterSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + DESCRIPTION +} + +"""An edge in a connection.""" +type SalesforceSecureAgentsClusterEdge { + """The item at the end of the edge.""" + node: SalesforceSecureAgentsCluster! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Secure Agent Clusters connection, for use in pagination.""" +type SalesforceSecureAgentsClustersConnection { + """ + The count of all Secure Agent Cluster you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Secure Agent Clusters""" + nodes: [SalesforceSecureAgentsCluster!]! + + """List of Secure Agent Cluster edges""" + edges: [SalesforceSecureAgentsClusterEdge!]! +} + +""" +A filter to be used against SearchPromotionRule object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSearchPromotionRuleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SearchPromotionRule's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the SearchPromotionRule's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SearchPromotionRule's id field""" + id: SalesforceIdFilter + + """Filter by the SearchPromotionRule's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SearchPromotionRule's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SearchPromotionRule's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SearchPromotionRule's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SearchPromotionRule's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the SearchPromotionRule's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the SearchPromotionRule's query field""" + query: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSearchPromotionRuleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSearchPromotionRuleConnectionFilter!] +} + +"""Field that Promoted Search Terms can be sorted by""" +enum SalesforceSearchPromotionRuleSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + QUERY +} + +"""An edge in a connection.""" +type SalesforceSearchPromotionRuleEdge { + """The item at the end of the edge.""" + node: SalesforceSearchPromotionRule! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Promoted Search Terms connection, for use in pagination.""" +type SalesforceSearchPromotionRulesConnection { + """ + The count of all Promoted Search Term you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Promoted Search Terms""" + nodes: [SalesforceSearchPromotionRule!]! + + """List of Promoted Search Term edges""" + edges: [SalesforceSearchPromotionRuleEdge!]! +} + +""" +A filter to be used against SearchActivity object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSearchActivityConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SearchActivity's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the SearchActivity's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SearchActivity's id field""" + id: SalesforceIdFilter + + """Filter by the SearchActivity's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SearchActivity's name field""" + name: SalesforceStringFilter + + """Filter by the SearchActivity's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SearchActivity's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SearchActivity's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SearchActivity's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the SearchActivity's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the SearchActivity's searchTerm field""" + searchTerm: SalesforceStringFilter + + """Filter by the SearchActivity's queryDate field""" + queryDate: SalesforceDateFilter + + """Filter by the SearchActivity's countQueries field""" + countQueries: SalesforceIntFilter + + """Filter by the SearchActivity's countUsers field""" + countUsers: SalesforceIntFilter + + """Filter by the SearchActivity's avgNumResults field""" + avgNumResults: SalesforceFloatFilter + + """Filter by the SearchActivity's kbChannel field""" + kbChannel: SalesforceStringFilter + + """Filter by the SearchActivity's period field""" + period: SalesforceStringFilter + + """Filter by the SearchActivity's clickRank field""" + clickRank: SalesforceFloatFilter + + """Filter by the SearchActivity's queryLanguage field""" + queryLanguage: SalesforceStringFilter + + """Filter by the SearchActivity's clickedRecordName field""" + clickedRecordName: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSearchActivityConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSearchActivityConnectionFilter!] +} + +"""Field that SearchActivities can be sorted by""" +enum SalesforceSearchActivitySortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + SEARCH_TERM + QUERY_DATE + COUNT_QUERIES + COUNT_USERS + AVG_NUM_RESULTS + KB_CHANNEL + PERIOD + CLICK_RANK + QUERY_LANGUAGE + CLICKED_RECORD_NAME +} + +"""An edge in a connection.""" +type SalesforceSearchActivityEdge { + """The item at the end of the edge.""" + node: SalesforceSearchActivity! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce SearchActivities connection, for use in pagination.""" +type SalesforceSearchActivitysConnection { + """The count of all SearchActivity you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce SearchActivities""" + nodes: [SalesforceSearchActivity!]! + + """List of SearchActivity edges""" + edges: [SalesforceSearchActivityEdge!]! +} + +""" +A filter to be used against Scontrol object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceScontrolConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Scontrol's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Scontrol's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Scontrol's id field""" + id: SalesforceIdFilter + + """Filter by the Scontrol's name field""" + name: SalesforceStringFilter + + """Filter by the Scontrol's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the Scontrol's description field""" + description: SalesforceStringFilter + + """Filter by the Scontrol's encodingKey field""" + encodingKey: SalesforceStringFilter + + """Filter by the Scontrol's filename field""" + filename: SalesforceStringFilter + + """Filter by the Scontrol's bodyLength field""" + bodyLength: SalesforceIntFilter + + """Filter by the Scontrol's contentSource field""" + contentSource: SalesforceStringFilter + + """Filter by the Scontrol's supportsCaching field""" + supportsCaching: SalesforceBooleanFilter + + """Filter by the Scontrol's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the Scontrol's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Scontrol's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Scontrol's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Scontrol's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Scontrol's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Scontrol's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceScontrolConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceScontrolConnectionFilter!] +} + +"""Field that Custom S-Controls can be sorted by""" +enum SalesforceScontrolSortByFieldEnum { + ID + NAME + DEVELOPER_NAME + DESCRIPTION + ENCODING_KEY + FILENAME + BODY_LENGTH + CONTENT_SOURCE + SUPPORTS_CACHING + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceScontrolEdge { + """The item at the end of the edge.""" + node: SalesforceScontrol! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Custom S-Controls connection, for use in pagination.""" +type SalesforceScontrolsConnection { + """The count of all Custom S-Control you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Custom S-Controls""" + nodes: [SalesforceScontrol!]! + + """List of Custom S-Control edges""" + edges: [SalesforceScontrolEdge!]! +} + +"""Field that Quick Texts can be sorted by""" +enum SalesforceQuickTextSortByFieldEnum { + ID + OWNER_ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + CATEGORY +} + +"""An edge in a connection.""" +type SalesforceQuickTextEdge { + """The item at the end of the edge.""" + node: SalesforceQuickText! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Quick Texts connection, for use in pagination.""" +type SalesforceQuickTextsConnection { + """The count of all Quick Text you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Quick Texts""" + nodes: [SalesforceQuickText!]! + + """List of Quick Text edges""" + edges: [SalesforceQuickTextEdge!]! +} + +""" +A filter to be used against PushTopic object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePushTopicConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the PushTopic's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the PushTopic's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the PushTopic's id field""" + id: SalesforceIdFilter + + """Filter by the PushTopic's name field""" + name: SalesforceStringFilter + + """Filter by the PushTopic's query field""" + query: SalesforceStringFilter + + """Filter by the PushTopic's apiVersion field""" + apiVersion: SalesforceFloatFilter + + """Filter by the PushTopic's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the PushTopic's notifyForFields field""" + notifyForFields: SalesforceStringFilter + + """Filter by the PushTopic's notifyForOperations field""" + notifyForOperations: SalesforceStringFilter + + """Filter by the PushTopic's description field""" + description: SalesforceStringFilter + + """Filter by the PushTopic's notifyForOperationCreate field""" + notifyForOperationCreate: SalesforceBooleanFilter + + """Filter by the PushTopic's notifyForOperationUpdate field""" + notifyForOperationUpdate: SalesforceBooleanFilter + + """Filter by the PushTopic's notifyForOperationDelete field""" + notifyForOperationDelete: SalesforceBooleanFilter + + """Filter by the PushTopic's notifyForOperationUndelete field""" + notifyForOperationUndelete: SalesforceBooleanFilter + + """Filter by the PushTopic's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the PushTopic's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the PushTopic's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the PushTopic's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the PushTopic's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the PushTopic's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePushTopicConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePushTopicConnectionFilter!] +} + +"""Field that Push Topics can be sorted by""" +enum SalesforcePushTopicSortByFieldEnum { + ID + NAME + QUERY + API_VERSION + IS_ACTIVE + NOTIFY_FOR_FIELDS + NOTIFY_FOR_OPERATIONS + DESCRIPTION + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforcePushTopicEdge { + """The item at the end of the edge.""" + node: SalesforcePushTopic! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Push Topics connection, for use in pagination.""" +type SalesforcePushTopicsConnection { + """The count of all Push Topic you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Push Topics""" + nodes: [SalesforcePushTopic!]! + + """List of Push Topic edges""" + edges: [SalesforcePushTopicEdge!]! +} + +"""Field that Process Definitions can be sorted by""" +enum SalesforceProcessDefinitionSortByFieldEnum { + ID + NAME + DEVELOPER_NAME + TYPE + DESCRIPTION + TABLE_ENUM_OR_ID + LOCK_TYPE + STATE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceProcessDefinitionEdge { + """The item at the end of the edge.""" + node: SalesforceProcessDefinition! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Process Definitions connection, for use in pagination.""" +type SalesforceProcessDefinitionsConnection { + """The count of all Process Definition you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Process Definitions""" + nodes: [SalesforceProcessDefinition!]! + + """List of Process Definition edges""" + edges: [SalesforceProcessDefinitionEdge!]! +} + +"""Field that Price Books can be sorted by""" +enum SalesforcePricebook2SortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + IS_ACTIVE + IS_ARCHIVED + DESCRIPTION + IS_STANDARD +} + +"""An edge in a connection.""" +type SalesforcePricebook2Edge { + """The item at the end of the edge.""" + node: SalesforcePricebook2! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Price Books connection, for use in pagination.""" +type SalesforcePricebook2sConnection { + """The count of all Price Book you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Price Books""" + nodes: [SalesforcePricebook2!]! + + """List of Price Book edges""" + edges: [SalesforcePricebook2Edge!]! +} + +"""Field that Platform Cache Partitions can be sorted by""" +enum SalesforcePlatformCachePartitionSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DEFAULT_PARTITION +} + +"""An edge in a connection.""" +type SalesforcePlatformCachePartitionEdge { + """The item at the end of the edge.""" + node: SalesforcePlatformCachePartition! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Platform Cache Partitions connection, for use in pagination. +""" +type SalesforcePlatformCachePartitionsConnection { + """ + The count of all Platform Cache Partition you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Platform Cache Partitions""" + nodes: [SalesforcePlatformCachePartition!]! + + """List of Platform Cache Partition edges""" + edges: [SalesforcePlatformCachePartitionEdge!]! +} + +"""Field that Permission Set Licenses can be sorted by""" +enum SalesforcePermissionSetLicenseSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + PERMISSION_SET_LICENSE_KEY + TOTAL_LICENSES + STATUS + EXPIRATION_DATE + USED_LICENSES +} + +"""An edge in a connection.""" +type SalesforcePermissionSetLicenseEdge { + """The item at the end of the edge.""" + node: SalesforcePermissionSetLicense! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Permission Set Licenses connection, for use in pagination.""" +type SalesforcePermissionSetLicensesConnection { + """ + The count of all Permission Set License you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Permission Set Licenses""" + nodes: [SalesforcePermissionSetLicense!]! + + """List of Permission Set License edges""" + edges: [SalesforcePermissionSetLicenseEdge!]! +} + +""" +A filter to be used against PartnerRole object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePartnerRoleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the PartnerRole's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the PartnerRole's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the PartnerRole's id field""" + id: SalesforceIdFilter + + """Filter by the PartnerRole's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the PartnerRole's apiName field""" + apiName: SalesforceStringFilter + + """Filter by the PartnerRole's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the PartnerRole's reverseRole field""" + reverseRole: SalesforceStringFilter + + """Filter by the PartnerRole's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the PartnerRole's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the PartnerRole's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the PartnerRole's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the PartnerRole's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePartnerRoleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePartnerRoleConnectionFilter!] +} + +"""Field that Partner Role Values can be sorted by""" +enum SalesforcePartnerRoleSortByFieldEnum { + ID + MASTER_LABEL + API_NAME + SORT_ORDER + REVERSE_ROLE + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforcePartnerRoleEdge { + """The item at the end of the edge.""" + node: SalesforcePartnerRole! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Partner Role Values connection, for use in pagination.""" +type SalesforcePartnerRolesConnection { + """The count of all Partner Role Value you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Partner Role Values""" + nodes: [SalesforcePartnerRole!]! + + """List of Partner Role Value edges""" + edges: [SalesforcePartnerRoleEdge!]! +} + +"""Field that Organizations can be sorted by""" +enum SalesforceOrganizationSortByFieldEnum { + ID + NAME + DIVISION + STREET + CITY + STATE + POSTAL_CODE + COUNTRY + LATITUDE + LONGITUDE + GEOCODE_ACCURACY + PHONE + FAX + PRIMARY_CONTACT + DEFAULT_LOCALE_SID_KEY + LANGUAGE_LOCALE_KEY + RECEIVES_INFO_EMAILS + RECEIVES_ADMIN_INFO_EMAILS + FISCAL_YEAR_START_MONTH + USES_START_DATE_AS_FISCAL_YEAR_NAME + DEFAULT_ACCOUNT_ACCESS + DEFAULT_CONTACT_ACCESS + DEFAULT_OPPORTUNITY_ACCESS + DEFAULT_LEAD_ACCESS + DEFAULT_CASE_ACCESS + DEFAULT_CALENDAR_ACCESS + DEFAULT_PRICEBOOK_ACCESS + DEFAULT_CAMPAIGN_ACCESS + SYSTEM_MODSTAMP + COMPLIANCE_BCC_EMAIL + UI_SKIN + SIGNUP_COUNTRY_ISO_CODE + TRIAL_EXPIRATION_DATE + NUM_KNOWLEDGE_SERVICE + ORGANIZATION_TYPE + NAMESPACE_PREFIX + INSTANCE_NAME + IS_SANDBOX + WEB_TO_CASE_DEFAULT_ORIGIN + MONTHLY_PAGE_VIEWS_USED + MONTHLY_PAGE_VIEWS_ENTITLEMENT + IS_READ_ONLY + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceOrganizationEdge { + """The item at the end of the edge.""" + node: SalesforceOrganization! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Organizations connection, for use in pagination.""" +type SalesforceOrganizationsConnection { + """The count of all Organization you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Organizations""" + nodes: [SalesforceOrganization!]! + + """List of Organization edges""" + edges: [SalesforceOrganizationEdge!]! +} + +""" +A filter to be used against OrgWideEmailAddress object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOrgWideEmailAddressConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OrgWideEmailAddress's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the OrgWideEmailAddress's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OrgWideEmailAddress's id field""" + id: SalesforceIdFilter + + """Filter by the OrgWideEmailAddress's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OrgWideEmailAddress's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OrgWideEmailAddress's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OrgWideEmailAddress's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the OrgWideEmailAddress's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the OrgWideEmailAddress's address field""" + address: SalesforceStringFilter + + """Filter by the OrgWideEmailAddress's displayName field""" + displayName: SalesforceStringFilter + + """Filter by the OrgWideEmailAddress's isAllowAllProfiles field""" + isAllowAllProfiles: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOrgWideEmailAddressConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOrgWideEmailAddressConnectionFilter!] +} + +"""Field that Organization-wide From Email Addresses can be sorted by""" +enum SalesforceOrgWideEmailAddressSortByFieldEnum { + ID + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + ADDRESS + DISPLAY_NAME + IS_ALLOW_ALL_PROFILES +} + +"""An edge in a connection.""" +type SalesforceOrgWideEmailAddressEdge { + """The item at the end of the edge.""" + node: SalesforceOrgWideEmailAddress! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Organization-wide From Email Addresses connection, for use in pagination. +""" +type SalesforceOrgWideEmailAddresssConnection { + """ + The count of all Organization-wide From Email Address you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Organization-wide From Email Addresses""" + nodes: [SalesforceOrgWideEmailAddress!]! + + """List of Organization-wide From Email Address edges""" + edges: [SalesforceOrgWideEmailAddressEdge!]! +} + +"""Field that Org Delete Requests can be sorted by""" +enum SalesforceOrgDeleteRequestSortByFieldEnum { + ID + OWNER_ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + REQUEST_TYPE +} + +"""An edge in a connection.""" +type SalesforceOrgDeleteRequestEdge { + """The item at the end of the edge.""" + node: SalesforceOrgDeleteRequest! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Org Delete Requests connection, for use in pagination.""" +type SalesforceOrgDeleteRequestsConnection { + """The count of all Org Delete Request you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Org Delete Requests""" + nodes: [SalesforceOrgDeleteRequest!]! + + """List of Org Delete Request edges""" + edges: [SalesforceOrgDeleteRequestEdge!]! +} + +""" +A filter to be used against OpportunityStage object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOpportunityStageConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OpportunityStage's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityStage's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityStage's id field""" + id: SalesforceIdFilter + + """Filter by the OpportunityStage's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the OpportunityStage's apiName field""" + apiName: SalesforceStringFilter + + """Filter by the OpportunityStage's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the OpportunityStage's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the OpportunityStage's isClosed field""" + isClosed: SalesforceBooleanFilter + + """Filter by the OpportunityStage's isWon field""" + isWon: SalesforceBooleanFilter + + """Filter by the OpportunityStage's forecastCategory field""" + forecastCategory: SalesforceStringFilter + + """Filter by the OpportunityStage's forecastCategoryName field""" + forecastCategoryName: SalesforceStringFilter + + """Filter by the OpportunityStage's defaultProbability field""" + defaultProbability: SalesforceFloatFilter + + """Filter by the OpportunityStage's description field""" + description: SalesforceStringFilter + + """Filter by the OpportunityStage's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OpportunityStage's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OpportunityStage's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the OpportunityStage's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OpportunityStage's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOpportunityStageConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOpportunityStageConnectionFilter!] +} + +"""Field that Opportunity Stages can be sorted by""" +enum SalesforceOpportunityStageSortByFieldEnum { + ID + MASTER_LABEL + API_NAME + IS_ACTIVE + SORT_ORDER + IS_CLOSED + IS_WON + FORECAST_CATEGORY + FORECAST_CATEGORY_NAME + DEFAULT_PROBABILITY + DESCRIPTION + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceOpportunityStageEdge { + """The item at the end of the edge.""" + node: SalesforceOpportunityStage! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Opportunity Stages connection, for use in pagination.""" +type SalesforceOpportunityStagesConnection { + """The count of all Opportunity Stage you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Opportunity Stages""" + nodes: [SalesforceOpportunityStage!]! + + """List of Opportunity Stage edges""" + edges: [SalesforceOpportunityStageEdge!]! +} + +"""Field that Matching Rules can be sorted by""" +enum SalesforceMatchingRuleSortByFieldEnum { + ID + IS_DELETED + SOBJECT_TYPE + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + MATCH_ENGINE + BOOLEAN_FILTER + DESCRIPTION + RULE_STATUS + SOBJECT_SUBTYPE +} + +"""An edge in a connection.""" +type SalesforceMatchingRuleEdge { + """The item at the end of the edge.""" + node: SalesforceMatchingRule! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Matching Rules connection, for use in pagination.""" +type SalesforceMatchingRulesConnection { + """The count of all Matching Rule you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Matching Rules""" + nodes: [SalesforceMatchingRule!]! + + """List of Matching Rule edges""" + edges: [SalesforceMatchingRuleEdge!]! +} + +""" +A filter to be used against MailmergeTemplate object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceMailmergeTemplateConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the MailmergeTemplate's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the MailmergeTemplate's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the MailmergeTemplate's id field""" + id: SalesforceIdFilter + + """Filter by the MailmergeTemplate's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the MailmergeTemplate's name field""" + name: SalesforceStringFilter + + """Filter by the MailmergeTemplate's description field""" + description: SalesforceStringFilter + + """Filter by the MailmergeTemplate's filename field""" + filename: SalesforceStringFilter + + """Filter by the MailmergeTemplate's bodyLength field""" + bodyLength: SalesforceIntFilter + + """Filter by the MailmergeTemplate's lastUsedDate field""" + lastUsedDate: SalesforceDateTimeFilter + + """Filter by the MailmergeTemplate's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the MailmergeTemplate's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the MailmergeTemplate's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the MailmergeTemplate's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the MailmergeTemplate's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """ + Filter by the MailmergeTemplate's securityOptionsAttachmentScannedForXss field + """ + securityOptionsAttachmentScannedForXss: SalesforceBooleanFilter + + """ + Filter by the MailmergeTemplate's securityOptionsAttachmentHasXssThreat field + """ + securityOptionsAttachmentHasXssThreat: SalesforceBooleanFilter + + """ + Filter by the MailmergeTemplate's securityOptionsAttachmentScannedforFlash field + """ + securityOptionsAttachmentScannedforFlash: SalesforceBooleanFilter + + """ + Filter by the MailmergeTemplate's securityOptionsAttachmentHasFlash field + """ + securityOptionsAttachmentHasFlash: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceMailmergeTemplateConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceMailmergeTemplateConnectionFilter!] +} + +"""Field that Mail Merge Templates can be sorted by""" +enum SalesforceMailmergeTemplateSortByFieldEnum { + ID + IS_DELETED + NAME + DESCRIPTION + FILENAME + BODY_LENGTH + LAST_USED_DATE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceMailmergeTemplateEdge { + """The item at the end of the edge.""" + node: SalesforceMailmergeTemplate! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Mail Merge Templates connection, for use in pagination.""" +type SalesforceMailmergeTemplatesConnection { + """ + The count of all Mail Merge Template you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Mail Merge Templates""" + nodes: [SalesforceMailmergeTemplate!]! + + """List of Mail Merge Template edges""" + edges: [SalesforceMailmergeTemplateEdge!]! +} + +"""Field that Macros can be sorted by""" +enum SalesforceMacroSortByFieldEnum { + ID + OWNER_ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + STARTING_CONTEXT +} + +"""An edge in a connection.""" +type SalesforceMacroEdge { + """The item at the end of the edge.""" + node: SalesforceMacro! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Macros connection, for use in pagination.""" +type SalesforceMacrosConnection { + """The count of all Macro you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Macros""" + nodes: [SalesforceMacro!]! + + """List of Macro edges""" + edges: [SalesforceMacroEdge!]! +} + +""" +A filter to be used against LoginIp object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceLoginIpConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the LoginIp's users relation.""" + users: SalesforceUserConnectionFilter + + """Filter by the LoginIp's id field""" + id: SalesforceIdFilter + + """Filter by the LoginIp's usersId field""" + usersId: SalesforceIdFilter + + """Filter by the LoginIp's sourceIp field""" + sourceIp: SalesforceStringFilter + + """Filter by the LoginIp's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the LoginIp's isAuthenticated field""" + isAuthenticated: SalesforceBooleanFilter + + """Filter by the LoginIp's challengeSentDate field""" + challengeSentDate: SalesforceDateTimeFilter + + """Filter by the LoginIp's challengeMethod field""" + challengeMethod: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceLoginIpConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceLoginIpConnectionFilter!] +} + +"""Field that Login IPs can be sorted by""" +enum SalesforceLoginIpSortByFieldEnum { + ID + USERS_ID + SOURCE_IP + CREATED_DATE + IS_AUTHENTICATED + CHALLENGE_SENT_DATE + CHALLENGE_METHOD +} + +"""An edge in a connection.""" +type SalesforceLoginIpEdge { + """The item at the end of the edge.""" + node: SalesforceLoginIp! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Login IPs connection, for use in pagination.""" +type SalesforceLoginIpsConnection { + """The count of all Login IP you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Login IPs""" + nodes: [SalesforceLoginIp!]! + + """List of Login IP edges""" + edges: [SalesforceLoginIpEdge!]! +} + +"""Field that Login Geo Datas can be sorted by""" +enum SalesforceLoginGeoSortByFieldEnum { + ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + IS_DELETED + SYSTEM_MODSTAMP + LOGIN_TIME + COUNTRY_ISO + COUNTRY + LATITUDE + LONGITUDE + CITY + POSTAL_CODE + SUBDIVISION +} + +"""An edge in a connection.""" +type SalesforceLoginGeoEdge { + """The item at the end of the edge.""" + node: SalesforceLoginGeo! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Login Geo Datas connection, for use in pagination.""" +type SalesforceLoginGeosConnection { + """The count of all Login Geo Data you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Login Geo Datas""" + nodes: [SalesforceLoginGeo!]! + + """List of Login Geo Data edges""" + edges: [SalesforceLoginGeoEdge!]! +} + +""" +A filter to be used against ListViewChart object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceListViewChartConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ListViewChart's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the ListViewChart's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ListViewChart's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ListViewChart's id field""" + id: SalesforceIdFilter + + """Filter by the ListViewChart's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ListViewChart's sobjectType field""" + sobjectType: SalesforceStringFilter + + """Filter by the ListViewChart's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the ListViewChart's language field""" + language: SalesforceStringFilter + + """Filter by the ListViewChart's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the ListViewChart's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ListViewChart's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ListViewChart's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ListViewChart's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ListViewChart's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ListViewChart's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the ListViewChart's chartType field""" + chartType: SalesforceStringFilter + + """Filter by the ListViewChart's groupingField field""" + groupingField: SalesforceStringFilter + + """Filter by the ListViewChart's aggregateField field""" + aggregateField: SalesforceStringFilter + + """Filter by the ListViewChart's aggregateType field""" + aggregateType: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceListViewChartConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceListViewChartConnectionFilter!] +} + +"""Field that List View Charts can be sorted by""" +enum SalesforceListViewChartSortByFieldEnum { + ID + IS_DELETED + SOBJECT_TYPE + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + OWNER_ID + CHART_TYPE + GROUPING_FIELD + AGGREGATE_FIELD + AGGREGATE_TYPE +} + +"""An edge in a connection.""" +type SalesforceListViewChartEdge { + """The item at the end of the edge.""" + node: SalesforceListViewChart! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce List View Charts connection, for use in pagination.""" +type SalesforceListViewChartsConnection { + """The count of all List View Chart you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce List View Charts""" + nodes: [SalesforceListViewChart!]! + + """List of List View Chart edges""" + edges: [SalesforceListViewChartEdge!]! +} + +"""Field that List Views can be sorted by""" +enum SalesforceListViewSortByFieldEnum { + ID + NAME + DEVELOPER_NAME + NAMESPACE_PREFIX + SOBJECT_TYPE + IS_SOQL_COMPATIBLE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_VIEWED_DATE + LAST_REFERENCED_DATE +} + +"""An edge in a connection.""" +type SalesforceListViewEdge { + """The item at the end of the edge.""" + node: SalesforceListView! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce List Views connection, for use in pagination.""" +type SalesforceListViewsConnection { + """The count of all List View you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce List Views""" + nodes: [SalesforceListView!]! + + """List of List View edges""" + edges: [SalesforceListViewEdge!]! +} + +"""Field that List Emails can be sorted by""" +enum SalesforceListEmailSortByFieldEnum { + ID + OWNER_ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + FROM_NAME + STATUS + HAS_ATTACHMENT + SCHEDULED_DATE + TOTAL_SENT +} + +"""An edge in a connection.""" +type SalesforceListEmailEdge { + """The item at the end of the edge.""" + node: SalesforceListEmail! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce List Emails connection, for use in pagination.""" +type SalesforceListEmailsConnection { + """The count of all List Email you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce List Emails""" + nodes: [SalesforceListEmail!]! + + """List of List Email edges""" + edges: [SalesforceListEmailEdge!]! +} + +"""Field that LightningComponentBundles can be sorted by""" +enum SalesforceLightningComponentBundleSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + API_VERSION + MIN_VERSION + IS_EXPOSED + AVAILABLE_FOR +} + +"""An edge in a connection.""" +type SalesforceLightningComponentBundleEdge { + """The item at the end of the edge.""" + node: SalesforceLightningComponentBundle! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce LightningComponentBundles connection, for use in pagination. +""" +type SalesforceLightningComponentBundlesConnection { + """ + The count of all LightningComponentBundle you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce LightningComponentBundles""" + nodes: [SalesforceLightningComponentBundle!]! + + """List of LightningComponentBundle edges""" + edges: [SalesforceLightningComponentBundleEdge!]! +} + +""" +A filter to be used against LeadStatus object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceLeadStatusConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the LeadStatus's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the LeadStatus's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the LeadStatus's id field""" + id: SalesforceIdFilter + + """Filter by the LeadStatus's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the LeadStatus's apiName field""" + apiName: SalesforceStringFilter + + """Filter by the LeadStatus's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the LeadStatus's isDefault field""" + isDefault: SalesforceBooleanFilter + + """Filter by the LeadStatus's isConverted field""" + isConverted: SalesforceBooleanFilter + + """Filter by the LeadStatus's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the LeadStatus's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the LeadStatus's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the LeadStatus's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the LeadStatus's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceLeadStatusConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceLeadStatusConnectionFilter!] +} + +"""Field that Lead Status Values can be sorted by""" +enum SalesforceLeadStatusSortByFieldEnum { + ID + MASTER_LABEL + API_NAME + SORT_ORDER + IS_DEFAULT + IS_CONVERTED + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceLeadStatusEdge { + """The item at the end of the edge.""" + node: SalesforceLeadStatus! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Lead Status Values connection, for use in pagination.""" +type SalesforceLeadStatussConnection { + """The count of all Lead Status Value you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Lead Status Values""" + nodes: [SalesforceLeadStatus!]! + + """List of Lead Status Value edges""" + edges: [SalesforceLeadStatusEdge!]! +} + +""" +A filter to be used against LeadHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceLeadHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the LeadHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the LeadHistory's lead relation.""" + lead: SalesforceLeadConnectionFilter + + """Filter by the LeadHistory's id field""" + id: SalesforceIdFilter + + """Filter by the LeadHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the LeadHistory's leadId field""" + leadId: SalesforceIdFilter + + """Filter by the LeadHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the LeadHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the LeadHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceLeadHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceLeadHistoryConnectionFilter!] +} + +"""Field that Lead Histories can be sorted by""" +enum SalesforceLeadHistorySortByFieldEnum { + ID + IS_DELETED + LEAD_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceLeadHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceLeadHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Lead Histories connection, for use in pagination.""" +type SalesforceLeadHistorysConnection { + """The count of all Lead History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Lead Histories""" + nodes: [SalesforceLeadHistory!]! + + """List of Lead History edges""" + edges: [SalesforceLeadHistoryEdge!]! +} + +""" +A filter to be used against LeadCleanInfo object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceLeadCleanInfoConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the LeadCleanInfo's lastStatusChangedBy relation.""" + lastStatusChangedBy: SalesforceUserConnectionFilter + + """Filter by the LeadCleanInfo's lead relation.""" + lead: SalesforceLeadConnectionFilter + + """Filter by the LeadCleanInfo's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the LeadCleanInfo's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the LeadCleanInfo's id field""" + id: SalesforceIdFilter + + """Filter by the LeadCleanInfo's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's name field""" + name: SalesforceStringFilter + + """Filter by the LeadCleanInfo's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the LeadCleanInfo's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the LeadCleanInfo's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the LeadCleanInfo's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the LeadCleanInfo's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the LeadCleanInfo's leadId field""" + leadId: SalesforceIdFilter + + """Filter by the LeadCleanInfo's lastMatchedDate field""" + lastMatchedDate: SalesforceDateTimeFilter + + """Filter by the LeadCleanInfo's lastStatusChangedDate field""" + lastStatusChangedDate: SalesforceDateTimeFilter + + """Filter by the LeadCleanInfo's lastStatusChangedById field""" + lastStatusChangedById: SalesforceIdFilter + + """Filter by the LeadCleanInfo's isInactive field""" + isInactive: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's firstName field""" + firstName: SalesforceStringFilter + + """Filter by the LeadCleanInfo's lastName field""" + lastName: SalesforceStringFilter + + """Filter by the LeadCleanInfo's email field""" + email: SalesforceStringFilter + + """Filter by the LeadCleanInfo's phone field""" + phone: SalesforceStringFilter + + """Filter by the LeadCleanInfo's street field""" + street: SalesforceStringFilter + + """Filter by the LeadCleanInfo's city field""" + city: SalesforceStringFilter + + """Filter by the LeadCleanInfo's state field""" + state: SalesforceStringFilter + + """Filter by the LeadCleanInfo's postalCode field""" + postalCode: SalesforceStringFilter + + """Filter by the LeadCleanInfo's country field""" + country: SalesforceStringFilter + + """Filter by the LeadCleanInfo's latitude field""" + latitude: SalesforceFloatFilter + + """Filter by the LeadCleanInfo's longitude field""" + longitude: SalesforceFloatFilter + + """Filter by the LeadCleanInfo's geocodeAccuracy field""" + geocodeAccuracy: SalesforceStringFilter + + """Filter by the LeadCleanInfo's title field""" + title: SalesforceStringFilter + + """Filter by the LeadCleanInfo's annualRevenue field""" + annualRevenue: SalesforceFloatFilter + + """Filter by the LeadCleanInfo's numberOfEmployees field""" + numberOfEmployees: SalesforceIntFilter + + """Filter by the LeadCleanInfo's industry field""" + industry: SalesforceStringFilter + + """Filter by the LeadCleanInfo's companyName field""" + companyName: SalesforceStringFilter + + """Filter by the LeadCleanInfo's companyDunsNumber field""" + companyDunsNumber: SalesforceStringFilter + + """Filter by the LeadCleanInfo's contactStatusDataDotCom field""" + contactStatusDataDotCom: SalesforceStringFilter + + """Filter by the LeadCleanInfo's isReviewedName field""" + isReviewedName: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isReviewedEmail field""" + isReviewedEmail: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isReviewedPhone field""" + isReviewedPhone: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isReviewedAddress field""" + isReviewedAddress: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isReviewedTitle field""" + isReviewedTitle: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isReviewedAnnualRevenue field""" + isReviewedAnnualRevenue: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isReviewedNumberOfEmployees field""" + isReviewedNumberOfEmployees: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isReviewedIndustry field""" + isReviewedIndustry: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isReviewedCompanyName field""" + isReviewedCompanyName: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isReviewedCompanyDunsNumber field""" + isReviewedCompanyDunsNumber: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isReviewedDandBCompanyDunsNumber field""" + isReviewedDandBCompanyDunsNumber: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentFirstName field""" + isDifferentFirstName: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentLastName field""" + isDifferentLastName: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentEmail field""" + isDifferentEmail: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentPhone field""" + isDifferentPhone: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentStreet field""" + isDifferentStreet: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentCity field""" + isDifferentCity: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentState field""" + isDifferentState: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentPostalCode field""" + isDifferentPostalCode: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentCountry field""" + isDifferentCountry: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentTitle field""" + isDifferentTitle: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentAnnualRevenue field""" + isDifferentAnnualRevenue: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentNumberOfEmployees field""" + isDifferentNumberOfEmployees: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentIndustry field""" + isDifferentIndustry: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentCompanyName field""" + isDifferentCompanyName: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentCompanyDunsNumber field""" + isDifferentCompanyDunsNumber: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentDandBCompanyDunsNumber field""" + isDifferentDandBCompanyDunsNumber: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentStateCode field""" + isDifferentStateCode: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isDifferentCountryCode field""" + isDifferentCountryCode: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's cleanedByJob field""" + cleanedByJob: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's cleanedByUser field""" + cleanedByUser: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's dandBCompanyDunsNumber field""" + dandBCompanyDunsNumber: SalesforceStringFilter + + """Filter by the LeadCleanInfo's dataDotComCompanyId field""" + dataDotComCompanyId: SalesforceStringFilter + + """Filter by the LeadCleanInfo's isFlaggedWrongName field""" + isFlaggedWrongName: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isFlaggedWrongEmail field""" + isFlaggedWrongEmail: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isFlaggedWrongPhone field""" + isFlaggedWrongPhone: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isFlaggedWrongAddress field""" + isFlaggedWrongAddress: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isFlaggedWrongTitle field""" + isFlaggedWrongTitle: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isFlaggedWrongAnnualRevenue field""" + isFlaggedWrongAnnualRevenue: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isFlaggedWrongNumberOfEmployees field""" + isFlaggedWrongNumberOfEmployees: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isFlaggedWrongIndustry field""" + isFlaggedWrongIndustry: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isFlaggedWrongCompanyName field""" + isFlaggedWrongCompanyName: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's isFlaggedWrongCompanyDunsNumber field""" + isFlaggedWrongCompanyDunsNumber: SalesforceBooleanFilter + + """Filter by the LeadCleanInfo's dataDotComId field""" + dataDotComId: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceLeadCleanInfoConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceLeadCleanInfoConnectionFilter!] +} + +"""Field that Lead Clean Infos can be sorted by""" +enum SalesforceLeadCleanInfoSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LEAD_ID + LAST_MATCHED_DATE + LAST_STATUS_CHANGED_DATE + LAST_STATUS_CHANGED_BY_ID + IS_INACTIVE + FIRST_NAME + LAST_NAME + EMAIL + PHONE + STREET + CITY + STATE + POSTAL_CODE + COUNTRY + LATITUDE + LONGITUDE + GEOCODE_ACCURACY + TITLE + ANNUAL_REVENUE + NUMBER_OF_EMPLOYEES + INDUSTRY + COMPANY_NAME + COMPANY_DUNS_NUMBER + CONTACT_STATUS_DATA_DOT_COM + DAND_B_COMPANY_DUNS_NUMBER + DATA_DOT_COM_COMPANY_ID + DATA_DOT_COM_ID +} + +"""An edge in a connection.""" +type SalesforceLeadCleanInfoEdge { + """The item at the end of the edge.""" + node: SalesforceLeadCleanInfo! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Lead Clean Infos connection, for use in pagination.""" +type SalesforceLeadCleanInfosConnection { + """The count of all Lead Clean Info you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Lead Clean Infos""" + nodes: [SalesforceLeadCleanInfo!]! + + """List of Lead Clean Info edges""" + edges: [SalesforceLeadCleanInfoEdge!]! +} + +""" +A filter to be used against Holiday object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceHolidayConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Holiday's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Holiday's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Holiday's id field""" + id: SalesforceIdFilter + + """Filter by the Holiday's name field""" + name: SalesforceStringFilter + + """Filter by the Holiday's description field""" + description: SalesforceStringFilter + + """Filter by the Holiday's isAllDay field""" + isAllDay: SalesforceBooleanFilter + + """Filter by the Holiday's activityDate field""" + activityDate: SalesforceDateFilter + + """Filter by the Holiday's startTimeInMinutes field""" + startTimeInMinutes: SalesforceIntFilter + + """Filter by the Holiday's endTimeInMinutes field""" + endTimeInMinutes: SalesforceIntFilter + + """Filter by the Holiday's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Holiday's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Holiday's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Holiday's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Holiday's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Holiday's isRecurrence field""" + isRecurrence: SalesforceBooleanFilter + + """Filter by the Holiday's recurrenceStartDate field""" + recurrenceStartDate: SalesforceDateFilter + + """Filter by the Holiday's recurrenceEndDateOnly field""" + recurrenceEndDateOnly: SalesforceDateFilter + + """Filter by the Holiday's recurrenceType field""" + recurrenceType: SalesforceStringFilter + + """Filter by the Holiday's recurrenceInterval field""" + recurrenceInterval: SalesforceIntFilter + + """Filter by the Holiday's recurrenceDayOfWeekMask field""" + recurrenceDayOfWeekMask: SalesforceIntFilter + + """Filter by the Holiday's recurrenceDayOfMonth field""" + recurrenceDayOfMonth: SalesforceIntFilter + + """Filter by the Holiday's recurrenceInstance field""" + recurrenceInstance: SalesforceStringFilter + + """Filter by the Holiday's recurrenceMonthOfYear field""" + recurrenceMonthOfYear: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceHolidayConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceHolidayConnectionFilter!] +} + +"""Field that Holidays can be sorted by""" +enum SalesforceHolidaySortByFieldEnum { + ID + NAME + DESCRIPTION + IS_ALL_DAY + ACTIVITY_DATE + START_TIME_IN_MINUTES + END_TIME_IN_MINUTES + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_RECURRENCE + RECURRENCE_START_DATE + RECURRENCE_END_DATE_ONLY + RECURRENCE_TYPE + RECURRENCE_INTERVAL + RECURRENCE_DAY_OF_WEEK_MASK + RECURRENCE_DAY_OF_MONTH + RECURRENCE_INSTANCE + RECURRENCE_MONTH_OF_YEAR +} + +"""An edge in a connection.""" +type SalesforceHolidayEdge { + """The item at the end of the edge.""" + node: SalesforceHoliday! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Holidays connection, for use in pagination.""" +type SalesforceHolidaysConnection { + """The count of all Holiday you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Holidays""" + nodes: [SalesforceHoliday!]! + + """List of Holiday edges""" + edges: [SalesforceHolidayEdge!]! +} + +""" +A filter to be used against Folder object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFolderConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Folder's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Folder's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Folder's id field""" + id: SalesforceIdFilter + + """Filter by the Folder's name field""" + name: SalesforceStringFilter + + """Filter by the Folder's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the Folder's accessType field""" + accessType: SalesforceStringFilter + + """Filter by the Folder's isReadonly field""" + isReadonly: SalesforceBooleanFilter + + """Filter by the Folder's type field""" + type: SalesforceStringFilter + + """Filter by the Folder's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the Folder's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Folder's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Folder's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Folder's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Folder's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFolderConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFolderConnectionFilter!] +} + +"""Field that Folders can be sorted by""" +enum SalesforceFolderSortByFieldEnum { + ID + NAME + DEVELOPER_NAME + ACCESS_TYPE + IS_READONLY + TYPE + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceFolderEdge { + """The item at the end of the edge.""" + node: SalesforceFolder! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Folders connection, for use in pagination.""" +type SalesforceFoldersConnection { + """The count of all Folder you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Folders""" + nodes: [SalesforceFolder!]! + + """List of Folder edges""" + edges: [SalesforceFolderEdge!]! +} + +"""Field that Flow Interviews can be sorted by""" +enum SalesforceFlowInterviewSortByFieldEnum { + ID + OWNER_ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + CURRENT_ELEMENT + INTERVIEW_LABEL + PAUSE_LABEL + GUID +} + +"""An edge in a connection.""" +type SalesforceFlowInterviewEdge { + """The item at the end of the edge.""" + node: SalesforceFlowInterview! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Flow Interviews connection, for use in pagination.""" +type SalesforceFlowInterviewsConnection { + """The count of all Flow Interview you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Flow Interviews""" + nodes: [SalesforceFlowInterview!]! + + """List of Flow Interview edges""" + edges: [SalesforceFlowInterviewEdge!]! +} + +""" +A filter to be used against FileSearchActivity object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFileSearchActivityConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FileSearchActivity's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the FileSearchActivity's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the FileSearchActivity's id field""" + id: SalesforceIdFilter + + """Filter by the FileSearchActivity's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the FileSearchActivity's name field""" + name: SalesforceStringFilter + + """Filter by the FileSearchActivity's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the FileSearchActivity's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the FileSearchActivity's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the FileSearchActivity's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the FileSearchActivity's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the FileSearchActivity's searchTerm field""" + searchTerm: SalesforceStringFilter + + """Filter by the FileSearchActivity's queryDate field""" + queryDate: SalesforceDateFilter + + """Filter by the FileSearchActivity's countQueries field""" + countQueries: SalesforceIntFilter + + """Filter by the FileSearchActivity's countUsers field""" + countUsers: SalesforceIntFilter + + """Filter by the FileSearchActivity's avgNumResults field""" + avgNumResults: SalesforceFloatFilter + + """Filter by the FileSearchActivity's period field""" + period: SalesforceStringFilter + + """Filter by the FileSearchActivity's queryLanguage field""" + queryLanguage: SalesforceStringFilter + + """Filter by the FileSearchActivity's clickRank field""" + clickRank: SalesforceFloatFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFileSearchActivityConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFileSearchActivityConnectionFilter!] +} + +"""Field that FileSearchActivities can be sorted by""" +enum SalesforceFileSearchActivitySortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + SEARCH_TERM + QUERY_DATE + COUNT_QUERIES + COUNT_USERS + AVG_NUM_RESULTS + PERIOD + QUERY_LANGUAGE + CLICK_RANK +} + +"""An edge in a connection.""" +type SalesforceFileSearchActivityEdge { + """The item at the end of the edge.""" + node: SalesforceFileSearchActivity! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce FileSearchActivities connection, for use in pagination.""" +type SalesforceFileSearchActivitysConnection { + """The count of all FileSearchActivity you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce FileSearchActivities""" + nodes: [SalesforceFileSearchActivity!]! + + """List of FileSearchActivity edges""" + edges: [SalesforceFileSearchActivityEdge!]! +} + +""" +A filter to be used against EventLogFile object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEventLogFileConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the EventLogFile's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the EventLogFile's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the EventLogFile's id field""" + id: SalesforceIdFilter + + """Filter by the EventLogFile's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the EventLogFile's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the EventLogFile's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the EventLogFile's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the EventLogFile's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the EventLogFile's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the EventLogFile's eventType field""" + eventType: SalesforceStringFilter + + """Filter by the EventLogFile's logDate field""" + logDate: SalesforceDateTimeFilter + + """Filter by the EventLogFile's logFileLength field""" + logFileLength: SalesforceFloatFilter + + """Filter by the EventLogFile's logFileContentType field""" + logFileContentType: SalesforceStringFilter + + """Filter by the EventLogFile's apiVersion field""" + apiVersion: SalesforceFloatFilter + + """Filter by the EventLogFile's sequence field""" + sequence: SalesforceIntFilter + + """Filter by the EventLogFile's interval field""" + interval: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEventLogFileConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEventLogFileConnectionFilter!] +} + +"""Field that Event Log Files can be sorted by""" +enum SalesforceEventLogFileSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + EVENT_TYPE + LOG_DATE + LOG_FILE_LENGTH + LOG_FILE_CONTENT_TYPE + API_VERSION + SEQUENCE + INTERVAL +} + +"""An edge in a connection.""" +type SalesforceEventLogFileEdge { + """The item at the end of the edge.""" + node: SalesforceEventLogFile! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Event Log Files connection, for use in pagination.""" +type SalesforceEventLogFilesConnection { + """The count of all Event Log File you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Event Log Files""" + nodes: [SalesforceEventLogFile!]! + + """List of Event Log File edges""" + edges: [SalesforceEventLogFileEdge!]! +} + +""" +A filter to be used against EmailDomainKey object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEmailDomainKeyConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the EmailDomainKey's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the EmailDomainKey's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the EmailDomainKey's id field""" + id: SalesforceIdFilter + + """Filter by the EmailDomainKey's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the EmailDomainKey's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the EmailDomainKey's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the EmailDomainKey's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the EmailDomainKey's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the EmailDomainKey's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the EmailDomainKey's selector field""" + selector: SalesforceStringFilter + + """Filter by the EmailDomainKey's domain field""" + domain: SalesforceStringFilter + + """Filter by the EmailDomainKey's domainMatch field""" + domainMatch: SalesforceStringFilter + + """Filter by the EmailDomainKey's isActive field""" + isActive: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEmailDomainKeyConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEmailDomainKeyConnectionFilter!] +} + +"""Field that Email Domain Keys can be sorted by""" +enum SalesforceEmailDomainKeySortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + SELECTOR + DOMAIN + DOMAIN_MATCH + IS_ACTIVE +} + +"""An edge in a connection.""" +type SalesforceEmailDomainKeyEdge { + """The item at the end of the edge.""" + node: SalesforceEmailDomainKey! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Email Domain Keys connection, for use in pagination.""" +type SalesforceEmailDomainKeysConnection { + """The count of all Email Domain Key you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Email Domain Keys""" + nodes: [SalesforceEmailDomainKey!]! + + """List of Email Domain Key edges""" + edges: [SalesforceEmailDomainKeyEdge!]! +} + +""" +A filter to be used against EmailCapture object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEmailCaptureConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the EmailCapture's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the EmailCapture's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the EmailCapture's id field""" + id: SalesforceIdFilter + + """Filter by the EmailCapture's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the EmailCapture's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the EmailCapture's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the EmailCapture's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the EmailCapture's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the EmailCapture's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the EmailCapture's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the EmailCapture's toPattern field""" + toPattern: SalesforceStringFilter + + """Filter by the EmailCapture's fromPattern field""" + fromPattern: SalesforceStringFilter + + """Filter by the EmailCapture's sender field""" + sender: SalesforceStringFilter + + """Filter by the EmailCapture's recipient field""" + recipient: SalesforceStringFilter + + """Filter by the EmailCapture's captureDate field""" + captureDate: SalesforceDateTimeFilter + + """Filter by the EmailCapture's rawMessageLength field""" + rawMessageLength: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEmailCaptureConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEmailCaptureConnectionFilter!] +} + +"""Field that EmailCaptures can be sorted by""" +enum SalesforceEmailCaptureSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_ACTIVE + TO_PATTERN + FROM_PATTERN + SENDER + RECIPIENT + CAPTURE_DATE + RAW_MESSAGE_LENGTH +} + +"""An edge in a connection.""" +type SalesforceEmailCaptureEdge { + """The item at the end of the edge.""" + node: SalesforceEmailCapture! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce EmailCaptures connection, for use in pagination.""" +type SalesforceEmailCapturesConnection { + """The count of all EmailCapture you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce EmailCaptures""" + nodes: [SalesforceEmailCapture!]! + + """List of EmailCapture edges""" + edges: [SalesforceEmailCaptureEdge!]! +} + +"""Field that Duplicate Rules can be sorted by""" +enum SalesforceDuplicateRuleSortByFieldEnum { + ID + IS_DELETED + SOBJECT_TYPE + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_ACTIVE + SOBJECT_SUBTYPE + LAST_VIEWED_DATE +} + +"""An edge in a connection.""" +type SalesforceDuplicateRuleEdge { + """The item at the end of the edge.""" + node: SalesforceDuplicateRule! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Duplicate Rules connection, for use in pagination.""" +type SalesforceDuplicateRulesConnection { + """The count of all Duplicate Rule you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Duplicate Rules""" + nodes: [SalesforceDuplicateRule!]! + + """List of Duplicate Rule edges""" + edges: [SalesforceDuplicateRuleEdge!]! +} + +"""Field that Domains can be sorted by""" +enum SalesforceDomainSortByFieldEnum { + ID + DOMAIN_TYPE + DOMAIN + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceDomainEdge { + """The item at the end of the edge.""" + node: SalesforceDomain! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Domains connection, for use in pagination.""" +type SalesforceDomainsConnection { + """The count of all Domain you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Domains""" + nodes: [SalesforceDomain!]! + + """List of Domain edges""" + edges: [SalesforceDomainEdge!]! +} + +"""Field that Data.com Usages can be sorted by""" +enum SalesforceDatacloudPurchaseUsageSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + USER_ID + USER_TYPE + PURCHASE_TYPE + DATACLOUD_ENTITY_TYPE + USAGE + DESCRIPTION +} + +"""An edge in a connection.""" +type SalesforceDatacloudPurchaseUsageEdge { + """The item at the end of the edge.""" + node: SalesforceDatacloudPurchaseUsage! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Data.com Usages connection, for use in pagination.""" +type SalesforceDatacloudPurchaseUsagesConnection { + """The count of all Data.com Usage you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Data.com Usages""" + nodes: [SalesforceDatacloudPurchaseUsage!]! + + """List of Data.com Usage edges""" + edges: [SalesforceDatacloudPurchaseUsageEdge!]! +} + +"""Field that Data Assessment Metrics can be sorted by""" +enum SalesforceDataAssessmentMetricSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + NUM_TOTAL + NUM_PROCESSED + NUM_MATCHED + NUM_MATCHED_DIFFERENT + NUM_UNMATCHED + NUM_DUPLICATES +} + +"""An edge in a connection.""" +type SalesforceDataAssessmentMetricEdge { + """The item at the end of the edge.""" + node: SalesforceDataAssessmentMetric! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Data Assessment Metrics connection, for use in pagination.""" +type SalesforceDataAssessmentMetricsConnection { + """ + The count of all Data Assessment Metric you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Data Assessment Metrics""" + nodes: [SalesforceDataAssessmentMetric!]! + + """List of Data Assessment Metric edges""" + edges: [SalesforceDataAssessmentMetricEdge!]! +} + +"""Field that D&B Companies can be sorted by""" +enum SalesforceDandBCompanySortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + DUNS_NUMBER + STREET + CITY + STATE + POSTAL_CODE + COUNTRY + GEOCODE_ACCURACY_STANDARD + PHONE + FAX + COUNTRY_ACCESS_CODE + PUBLIC_INDICATOR + STOCK_SYMBOL + STOCK_EXCHANGE + SALES_VOLUME + URL + OUT_OF_BUSINESS + EMPLOYEES_TOTAL + FIPS_MSA_CODE + FIPS_MSA_DESC + TRADE_STYLE_1 + YEAR_STARTED + MAILING_STREET + MAILING_CITY + MAILING_STATE + MAILING_POSTAL_CODE + MAILING_COUNTRY + MAILING_GEOCODE_ACCURACY + LATITUDE + LONGITUDE + PRIMARY_SIC + PRIMARY_SIC_DESC + SECOND_SIC + SECOND_SIC_DESC + THIRD_SIC + THIRD_SIC_DESC + FOURTH_SIC + FOURTH_SIC_DESC + FIFTH_SIC + FIFTH_SIC_DESC + SIXTH_SIC + SIXTH_SIC_DESC + PRIMARY_NAICS + PRIMARY_NAICS_DESC + SECOND_NAICS + SECOND_NAICS_DESC + THIRD_NAICS + THIRD_NAICS_DESC + FOURTH_NAICS + FOURTH_NAICS_DESC + FIFTH_NAICS + FIFTH_NAICS_DESC + SIXTH_NAICS + SIXTH_NAICS_DESC + OWN_OR_RENT + EMPLOYEES_HERE + EMPLOYEES_HERE_RELIABILITY + SALES_VOLUME_RELIABILITY + CURRENCY_CODE + LEGAL_STATUS + GLOBAL_ULTIMATE_TOTAL_EMPLOYEES + EMPLOYEES_TOTAL_RELIABILITY + MINORITY_OWNED + WOMEN_OWNED + SMALL_BUSINESS + MARKETING_SEGMENTATION_CLUSTER + IMPORT_EXPORT_AGENT + SUBSIDIARY + TRADE_STYLE_2 + TRADE_STYLE_3 + TRADE_STYLE_4 + TRADE_STYLE_5 + NATIONAL_ID + NATIONAL_ID_TYPE + US_TAX_ID + GEO_CODE_ACCURACY + FAMILY_MEMBERS + MARKETING_PRE_SCREEN + GLOBAL_ULTIMATE_DUNS_NUMBER + GLOBAL_ULTIMATE_BUSINESS_NAME + PARENT_OR_HQ_DUNS_NUMBER + PARENT_OR_HQ_BUSINESS_NAME + DOMESTIC_ULTIMATE_DUNS_NUMBER + DOMESTIC_ULTIMATE_BUSINESS_NAME + LOCATION_STATUS + COMPANY_CURRENCY_ISO_CODE + FORTUNE_RANK + INCLUDED_IN_SN_P_500 + PREMISES_MEASURE + PREMISES_MEASURE_RELIABILITY + PREMISES_MEASURE_UNIT + EMPLOYEE_QUANTITY_GROWTH_RATE + SALES_TURNOVER_GROWTH_RATE + PRIMARY_SIC_8 + PRIMARY_SIC_8_DESC + SECOND_SIC_8 + SECOND_SIC_8_DESC + THIRD_SIC_8 + THIRD_SIC_8_DESC + FOURTH_SIC_8 + FOURTH_SIC_8_DESC + FIFTH_SIC_8 + FIFTH_SIC_8_DESC + SIXTH_SIC_8 + SIXTH_SIC_8_DESC + PRIOR_YEAR_EMPLOYEES + PRIOR_YEAR_REVENUE +} + +"""An edge in a connection.""" +type SalesforceDandBCompanyEdge { + """The item at the end of the edge.""" + node: SalesforceDandBCompany! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce D&B Companies connection, for use in pagination.""" +type SalesforceDandBCompanysConnection { + """The count of all D&B Company you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce D&B Companies""" + nodes: [SalesforceDandBCompany!]! + + """List of D&B Company edges""" + edges: [SalesforceDandBCompanyEdge!]! +} + +"""Field that Custom Permissions can be sorted by""" +enum SalesforceCustomPermissionSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + IS_PROTECTED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + DESCRIPTION +} + +"""An edge in a connection.""" +type SalesforceCustomPermissionEdge { + """The item at the end of the edge.""" + node: SalesforceCustomPermission! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Custom Permissions connection, for use in pagination.""" +type SalesforceCustomPermissionsConnection { + """The count of all Custom Permission you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Custom Permissions""" + nodes: [SalesforceCustomPermission!]! + + """List of Custom Permission edges""" + edges: [SalesforceCustomPermissionEdge!]! +} + +""" +A filter to be used against CspTrustedSite object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCspTrustedSiteConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CspTrustedSite's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CspTrustedSite's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CspTrustedSite's id field""" + id: SalesforceIdFilter + + """Filter by the CspTrustedSite's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CspTrustedSite's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the CspTrustedSite's language field""" + language: SalesforceStringFilter + + """Filter by the CspTrustedSite's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the CspTrustedSite's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the CspTrustedSite's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CspTrustedSite's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CspTrustedSite's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CspTrustedSite's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CspTrustedSite's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CspTrustedSite's endpointUrl field""" + endpointUrl: SalesforceStringFilter + + """Filter by the CspTrustedSite's description field""" + description: SalesforceStringFilter + + """Filter by the CspTrustedSite's isActive field""" + isActive: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCspTrustedSiteConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCspTrustedSiteConnectionFilter!] +} + +"""Field that Content Security Policy Trusted Sites can be sorted by""" +enum SalesforceCspTrustedSiteSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + ENDPOINT_URL + DESCRIPTION + IS_ACTIVE +} + +"""An edge in a connection.""" +type SalesforceCspTrustedSiteEdge { + """The item at the end of the edge.""" + node: SalesforceCspTrustedSite! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Content Security Policy Trusted Sites connection, for use in pagination. +""" +type SalesforceCspTrustedSitesConnection { + """ + The count of all Content Security Policy Trusted Site you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Security Policy Trusted Sites""" + nodes: [SalesforceCspTrustedSite!]! + + """List of Content Security Policy Trusted Site edges""" + edges: [SalesforceCspTrustedSiteEdge!]! +} + +""" +A filter to be used against CorsWhitelistEntry object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCorsWhitelistEntryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CorsWhitelistEntry's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CorsWhitelistEntry's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CorsWhitelistEntry's id field""" + id: SalesforceIdFilter + + """Filter by the CorsWhitelistEntry's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CorsWhitelistEntry's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the CorsWhitelistEntry's language field""" + language: SalesforceStringFilter + + """Filter by the CorsWhitelistEntry's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the CorsWhitelistEntry's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the CorsWhitelistEntry's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CorsWhitelistEntry's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CorsWhitelistEntry's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CorsWhitelistEntry's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CorsWhitelistEntry's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CorsWhitelistEntry's urlPattern field""" + urlPattern: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCorsWhitelistEntryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCorsWhitelistEntryConnectionFilter!] +} + +"""Field that CORS Whitelist Origins can be sorted by""" +enum SalesforceCorsWhitelistEntrySortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + URL_PATTERN +} + +"""An edge in a connection.""" +type SalesforceCorsWhitelistEntryEdge { + """The item at the end of the edge.""" + node: SalesforceCorsWhitelistEntry! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce CORS Whitelist Origins connection, for use in pagination.""" +type SalesforceCorsWhitelistEntrysConnection { + """ + The count of all CORS Whitelist Origin you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce CORS Whitelist Origins""" + nodes: [SalesforceCorsWhitelistEntry!]! + + """List of CORS Whitelist Origin edges""" + edges: [SalesforceCorsWhitelistEntryEdge!]! +} + +""" +A filter to be used against ContractStatus object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContractStatusConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContractStatus's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContractStatus's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContractStatus's id field""" + id: SalesforceIdFilter + + """Filter by the ContractStatus's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the ContractStatus's apiName field""" + apiName: SalesforceStringFilter + + """Filter by the ContractStatus's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the ContractStatus's isDefault field""" + isDefault: SalesforceBooleanFilter + + """Filter by the ContractStatus's statusCode field""" + statusCode: SalesforceStringFilter + + """Filter by the ContractStatus's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContractStatus's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContractStatus's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContractStatus's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContractStatus's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContractStatusConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContractStatusConnectionFilter!] +} + +"""Field that Contract Status Values can be sorted by""" +enum SalesforceContractStatusSortByFieldEnum { + ID + MASTER_LABEL + API_NAME + SORT_ORDER + IS_DEFAULT + STATUS_CODE + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceContractStatusEdge { + """The item at the end of the edge.""" + node: SalesforceContractStatus! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Contract Status Values connection, for use in pagination.""" +type SalesforceContractStatussConnection { + """ + The count of all Contract Status Value you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Contract Status Values""" + nodes: [SalesforceContractStatus!]! + + """List of Contract Status Value edges""" + edges: [SalesforceContractStatusEdge!]! +} + +"""Field that Library Permissions can be sorted by""" +enum SalesforceContentWorkspacePermissionSortByFieldEnum { + ID + NAME + TYPE + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + LAST_MODIFIED_BY_ID + DESCRIPTION +} + +"""An edge in a connection.""" +type SalesforceContentWorkspacePermissionEdge { + """The item at the end of the edge.""" + node: SalesforceContentWorkspacePermission! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Library Permissions connection, for use in pagination.""" +type SalesforceContentWorkspacePermissionsConnection { + """The count of all Library Permission you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Library Permissions""" + nodes: [SalesforceContentWorkspacePermission!]! + + """List of Library Permission edges""" + edges: [SalesforceContentWorkspacePermissionEdge!]! +} + +""" +A filter to be used against ContentUserSubscription object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentUserSubscriptionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentUserSubscription's subscribedToUser relation.""" + subscribedToUser: SalesforceUserConnectionFilter + + """Filter by the ContentUserSubscription's subscriberUser relation.""" + subscriberUser: SalesforceUserConnectionFilter + + """Filter by the ContentUserSubscription's id field""" + id: SalesforceIdFilter + + """Filter by the ContentUserSubscription's subscriberUserId field""" + subscriberUserId: SalesforceIdFilter + + """Filter by the ContentUserSubscription's subscribedToUserId field""" + subscribedToUserId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentUserSubscriptionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentUserSubscriptionConnectionFilter!] +} + +"""Field that Content User Subscriptions can be sorted by""" +enum SalesforceContentUserSubscriptionSortByFieldEnum { + ID + SUBSCRIBER_USER_ID + SUBSCRIBED_TO_USER_ID +} + +"""An edge in a connection.""" +type SalesforceContentUserSubscriptionEdge { + """The item at the end of the edge.""" + node: SalesforceContentUserSubscription! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Content User Subscriptions connection, for use in pagination. +""" +type SalesforceContentUserSubscriptionsConnection { + """ + The count of all Content User Subscription you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content User Subscriptions""" + nodes: [SalesforceContentUserSubscription!]! + + """List of Content User Subscription edges""" + edges: [SalesforceContentUserSubscriptionEdge!]! +} + +""" +A filter to be used against ContentTagSubscription object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentTagSubscriptionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentTagSubscription's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the ContentTagSubscription's id field""" + id: SalesforceIdFilter + + """Filter by the ContentTagSubscription's userId field""" + userId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentTagSubscriptionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentTagSubscriptionConnectionFilter!] +} + +"""Field that Content Tag Subscriptions can be sorted by""" +enum SalesforceContentTagSubscriptionSortByFieldEnum { + ID + USER_ID +} + +"""An edge in a connection.""" +type SalesforceContentTagSubscriptionEdge { + """The item at the end of the edge.""" + node: SalesforceContentTagSubscription! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Content Tag Subscriptions connection, for use in pagination. +""" +type SalesforceContentTagSubscriptionsConnection { + """ + The count of all Content Tag Subscription you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Tag Subscriptions""" + nodes: [SalesforceContentTagSubscription!]! + + """List of Content Tag Subscription edges""" + edges: [SalesforceContentTagSubscriptionEdge!]! +} + +""" +A filter to be used against ContactHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContactHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContactHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContactHistory's contact relation.""" + contact: SalesforceContactConnectionFilter + + """Filter by the ContactHistory's id field""" + id: SalesforceIdFilter + + """Filter by the ContactHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContactHistory's contactId field""" + contactId: SalesforceIdFilter + + """Filter by the ContactHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContactHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContactHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContactHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContactHistoryConnectionFilter!] +} + +"""Field that Contact Histories can be sorted by""" +enum SalesforceContactHistorySortByFieldEnum { + ID + IS_DELETED + CONTACT_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceContactHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceContactHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Contact Histories connection, for use in pagination.""" +type SalesforceContactHistorysConnection { + """The count of all Contact History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Contact Histories""" + nodes: [SalesforceContactHistory!]! + + """List of Contact History edges""" + edges: [SalesforceContactHistoryEdge!]! +} + +""" +A filter to be used against ContactCleanInfo object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContactCleanInfoConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContactCleanInfo's lastStatusChangedBy relation.""" + lastStatusChangedBy: SalesforceUserConnectionFilter + + """Filter by the ContactCleanInfo's contact relation.""" + contact: SalesforceContactConnectionFilter + + """Filter by the ContactCleanInfo's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContactCleanInfo's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContactCleanInfo's id field""" + id: SalesforceIdFilter + + """Filter by the ContactCleanInfo's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's name field""" + name: SalesforceStringFilter + + """Filter by the ContactCleanInfo's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContactCleanInfo's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContactCleanInfo's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContactCleanInfo's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContactCleanInfo's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContactCleanInfo's contactId field""" + contactId: SalesforceIdFilter + + """Filter by the ContactCleanInfo's lastMatchedDate field""" + lastMatchedDate: SalesforceDateTimeFilter + + """Filter by the ContactCleanInfo's lastStatusChangedDate field""" + lastStatusChangedDate: SalesforceDateTimeFilter + + """Filter by the ContactCleanInfo's lastStatusChangedById field""" + lastStatusChangedById: SalesforceIdFilter + + """Filter by the ContactCleanInfo's isInactive field""" + isInactive: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's firstName field""" + firstName: SalesforceStringFilter + + """Filter by the ContactCleanInfo's lastName field""" + lastName: SalesforceStringFilter + + """Filter by the ContactCleanInfo's email field""" + email: SalesforceStringFilter + + """Filter by the ContactCleanInfo's phone field""" + phone: SalesforceStringFilter + + """Filter by the ContactCleanInfo's street field""" + street: SalesforceStringFilter + + """Filter by the ContactCleanInfo's city field""" + city: SalesforceStringFilter + + """Filter by the ContactCleanInfo's state field""" + state: SalesforceStringFilter + + """Filter by the ContactCleanInfo's postalCode field""" + postalCode: SalesforceStringFilter + + """Filter by the ContactCleanInfo's country field""" + country: SalesforceStringFilter + + """Filter by the ContactCleanInfo's latitude field""" + latitude: SalesforceFloatFilter + + """Filter by the ContactCleanInfo's longitude field""" + longitude: SalesforceFloatFilter + + """Filter by the ContactCleanInfo's geocodeAccuracy field""" + geocodeAccuracy: SalesforceStringFilter + + """Filter by the ContactCleanInfo's title field""" + title: SalesforceStringFilter + + """Filter by the ContactCleanInfo's contactStatusDataDotCom field""" + contactStatusDataDotCom: SalesforceStringFilter + + """Filter by the ContactCleanInfo's isReviewedName field""" + isReviewedName: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isReviewedEmail field""" + isReviewedEmail: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isReviewedPhone field""" + isReviewedPhone: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isReviewedAddress field""" + isReviewedAddress: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isReviewedTitle field""" + isReviewedTitle: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentFirstName field""" + isDifferentFirstName: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentLastName field""" + isDifferentLastName: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentEmail field""" + isDifferentEmail: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentPhone field""" + isDifferentPhone: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentStreet field""" + isDifferentStreet: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentCity field""" + isDifferentCity: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentState field""" + isDifferentState: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentPostalCode field""" + isDifferentPostalCode: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentCountry field""" + isDifferentCountry: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentTitle field""" + isDifferentTitle: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentStateCode field""" + isDifferentStateCode: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isDifferentCountryCode field""" + isDifferentCountryCode: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's cleanedByJob field""" + cleanedByJob: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's cleanedByUser field""" + cleanedByUser: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isFlaggedWrongName field""" + isFlaggedWrongName: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isFlaggedWrongEmail field""" + isFlaggedWrongEmail: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isFlaggedWrongPhone field""" + isFlaggedWrongPhone: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isFlaggedWrongAddress field""" + isFlaggedWrongAddress: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's isFlaggedWrongTitle field""" + isFlaggedWrongTitle: SalesforceBooleanFilter + + """Filter by the ContactCleanInfo's dataDotComId field""" + dataDotComId: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContactCleanInfoConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContactCleanInfoConnectionFilter!] +} + +"""Field that Contact Clean Infos can be sorted by""" +enum SalesforceContactCleanInfoSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + CONTACT_ID + LAST_MATCHED_DATE + LAST_STATUS_CHANGED_DATE + LAST_STATUS_CHANGED_BY_ID + IS_INACTIVE + FIRST_NAME + LAST_NAME + EMAIL + PHONE + STREET + CITY + STATE + POSTAL_CODE + COUNTRY + LATITUDE + LONGITUDE + GEOCODE_ACCURACY + TITLE + CONTACT_STATUS_DATA_DOT_COM + DATA_DOT_COM_ID +} + +"""An edge in a connection.""" +type SalesforceContactCleanInfoEdge { + """The item at the end of the edge.""" + node: SalesforceContactCleanInfo! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Contact Clean Infos connection, for use in pagination.""" +type SalesforceContactCleanInfosConnection { + """The count of all Contact Clean Info you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Contact Clean Infos""" + nodes: [SalesforceContactCleanInfo!]! + + """List of Contact Clean Info edges""" + edges: [SalesforceContactCleanInfoEdge!]! +} + +"""Field that Contacts can be sorted by""" +enum SalesforceContactSortByFieldEnum { + ID + IS_DELETED + MASTER_RECORD_ID + ACCOUNT_ID + LAST_NAME + FIRST_NAME + SALUTATION + NAME + OTHER_STREET + OTHER_CITY + OTHER_STATE + OTHER_POSTAL_CODE + OTHER_COUNTRY + OTHER_LATITUDE + OTHER_LONGITUDE + OTHER_GEOCODE_ACCURACY + MAILING_STREET + MAILING_CITY + MAILING_STATE + MAILING_POSTAL_CODE + MAILING_COUNTRY + MAILING_LATITUDE + MAILING_LONGITUDE + MAILING_GEOCODE_ACCURACY + PHONE + FAX + MOBILE_PHONE + HOME_PHONE + OTHER_PHONE + ASSISTANT_PHONE + REPORTS_TO_ID + EMAIL + TITLE + DEPARTMENT + ASSISTANT_NAME + LEAD_SOURCE + BIRTHDATE + OWNER_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_ACTIVITY_DATE + LAST_CU_REQUEST_DATE + LAST_CU_UPDATE_DATE + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + EMAIL_BOUNCED_REASON + EMAIL_BOUNCED_DATE + IS_EMAIL_BOUNCED + PHOTO_URL + JIGSAW + JIGSAW_CONTACT_ID + CLEAN_STATUS +} + +"""An edge in a connection.""" +type SalesforceContactEdge { + """The item at the end of the edge.""" + node: SalesforceContact! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Contacts connection, for use in pagination.""" +type SalesforceContactsConnection { + """The count of all Contact you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Contacts""" + nodes: [SalesforceContact!]! + + """List of Contact edges""" + edges: [SalesforceContactEdge!]! +} + +"""Field that Connected Apps can be sorted by""" +enum SalesforceConnectedApplicationSortByFieldEnum { + ID + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + MOBILE_SESSION_TIMEOUT + PIN_LENGTH + START_URL + MOBILE_START_URL + REFRESH_TOKEN_VALIDITY_PERIOD +} + +"""An edge in a connection.""" +type SalesforceConnectedApplicationEdge { + """The item at the end of the edge.""" + node: SalesforceConnectedApplication! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Connected Apps connection, for use in pagination.""" +type SalesforceConnectedApplicationsConnection { + """The count of all Connected App you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Connected Apps""" + nodes: [SalesforceConnectedApplication!]! + + """List of Connected App edges""" + edges: [SalesforceConnectedApplicationEdge!]! +} + +"""Field that Zones can be sorted by""" +enum SalesforceCommunitySortByFieldEnum { + ID + SYSTEM_MODSTAMP + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + NAME + DESCRIPTION + IS_ACTIVE + IS_PUBLISHED +} + +"""An edge in a connection.""" +type SalesforceCommunityEdge { + """The item at the end of the edge.""" + node: SalesforceCommunity! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Zones connection, for use in pagination.""" +type SalesforceCommunitysConnection { + """The count of all Zone you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Zones""" + nodes: [SalesforceCommunity!]! + + """List of Zone edges""" + edges: [SalesforceCommunityEdge!]! +} + +""" +A filter to be used against ClientBrowser object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceClientBrowserConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ClientBrowser's users relation.""" + users: SalesforceUserConnectionFilter + + """Filter by the ClientBrowser's id field""" + id: SalesforceIdFilter + + """Filter by the ClientBrowser's usersId field""" + usersId: SalesforceIdFilter + + """Filter by the ClientBrowser's fullUserAgent field""" + fullUserAgent: SalesforceStringFilter + + """Filter by the ClientBrowser's proxyInfo field""" + proxyInfo: SalesforceStringFilter + + """Filter by the ClientBrowser's lastUpdate field""" + lastUpdate: SalesforceDateTimeFilter + + """Filter by the ClientBrowser's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceClientBrowserConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceClientBrowserConnectionFilter!] +} + +"""Field that Client Browsers can be sorted by""" +enum SalesforceClientBrowserSortByFieldEnum { + ID + USERS_ID + FULL_USER_AGENT + PROXY_INFO + LAST_UPDATE + CREATED_DATE +} + +"""An edge in a connection.""" +type SalesforceClientBrowserEdge { + """The item at the end of the edge.""" + node: SalesforceClientBrowser! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Client Browsers connection, for use in pagination.""" +type SalesforceClientBrowsersConnection { + """The count of all Client Browser you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Client Browsers""" + nodes: [SalesforceClientBrowser!]! + + """List of Client Browser edges""" + edges: [SalesforceClientBrowserEdge!]! +} + +""" +A filter to be used against ChatterActivity object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceChatterActivityConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ChatterActivity's parent relation.""" + parent: SalesforceUserConnectionFilter + + """Filter by the ChatterActivity's id field""" + id: SalesforceIdFilter + + """Filter by the ChatterActivity's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the ChatterActivity's postCount field""" + postCount: SalesforceIntFilter + + """Filter by the ChatterActivity's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the ChatterActivity's commentReceivedCount field""" + commentReceivedCount: SalesforceIntFilter + + """Filter by the ChatterActivity's likeReceivedCount field""" + likeReceivedCount: SalesforceIntFilter + + """Filter by the ChatterActivity's influenceRawRank field""" + influenceRawRank: SalesforceIntFilter + + """Filter by the ChatterActivity's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceChatterActivityConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceChatterActivityConnectionFilter!] +} + +"""Field that Chatter Activities can be sorted by""" +enum SalesforceChatterActivitySortByFieldEnum { + ID + PARENT_ID + POST_COUNT + COMMENT_COUNT + COMMENT_RECEIVED_COUNT + LIKE_RECEIVED_COUNT + INFLUENCE_RAW_RANK + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceChatterActivityEdge { + """The item at the end of the edge.""" + node: SalesforceChatterActivity! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Chatter Activities connection, for use in pagination.""" +type SalesforceChatterActivitysConnection { + """The count of all Chatter Activity you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Chatter Activities""" + nodes: [SalesforceChatterActivity!]! + + """List of Chatter Activity edges""" + edges: [SalesforceChatterActivityEdge!]! +} + +""" +A filter to be used against CaseTeamTemplateRecord object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseTeamTemplateRecordConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseTeamTemplateRecord's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CaseTeamTemplateRecord's teamTemplate relation.""" + teamTemplate: SalesforceCaseTeamTemplateConnectionFilter + + """Filter by the CaseTeamTemplateRecord's parent relation.""" + parent: SalesforceCaseConnectionFilter + + """Filter by the CaseTeamTemplateRecord's id field""" + id: SalesforceIdFilter + + """Filter by the CaseTeamTemplateRecord's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the CaseTeamTemplateRecord's teamTemplateId field""" + teamTemplateId: SalesforceIdFilter + + """Filter by the CaseTeamTemplateRecord's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CaseTeamTemplateRecord's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CaseTeamTemplateRecord's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseTeamTemplateRecordConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseTeamTemplateRecordConnectionFilter!] +} + +"""Field that Predefined Case Team Records can be sorted by""" +enum SalesforceCaseTeamTemplateRecordSortByFieldEnum { + ID + PARENT_ID + TEAM_TEMPLATE_ID + CREATED_DATE + CREATED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceCaseTeamTemplateRecordEdge { + """The item at the end of the edge.""" + node: SalesforceCaseTeamTemplateRecord! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Predefined Case Team Records connection, for use in pagination. +""" +type SalesforceCaseTeamTemplateRecordsConnection { + """ + The count of all Predefined Case Team Record you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Predefined Case Team Records""" + nodes: [SalesforceCaseTeamTemplateRecord!]! + + """List of Predefined Case Team Record edges""" + edges: [SalesforceCaseTeamTemplateRecordEdge!]! +} + +"""Field that Predefined Case Team Members can be sorted by""" +enum SalesforceCaseTeamTemplateMemberSortByFieldEnum { + ID + TEAM_TEMPLATE_ID + MEMBER_ID + TEAM_ROLE_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceCaseTeamTemplateMemberEdge { + """The item at the end of the edge.""" + node: SalesforceCaseTeamTemplateMember! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Predefined Case Team Members connection, for use in pagination. +""" +type SalesforceCaseTeamTemplateMembersConnection { + """ + The count of all Predefined Case Team Member you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Predefined Case Team Members""" + nodes: [SalesforceCaseTeamTemplateMember!]! + + """List of Predefined Case Team Member edges""" + edges: [SalesforceCaseTeamTemplateMemberEdge!]! +} + +"""Field that Predefined Case Teams can be sorted by""" +enum SalesforceCaseTeamTemplateSortByFieldEnum { + ID + NAME + DESCRIPTION + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceCaseTeamTemplateEdge { + """The item at the end of the edge.""" + node: SalesforceCaseTeamTemplate! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Predefined Case Teams connection, for use in pagination.""" +type SalesforceCaseTeamTemplatesConnection { + """ + The count of all Predefined Case Team you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Predefined Case Teams""" + nodes: [SalesforceCaseTeamTemplate!]! + + """List of Predefined Case Team edges""" + edges: [SalesforceCaseTeamTemplateEdge!]! +} + +"""Field that Case Team Member Roles can be sorted by""" +enum SalesforceCaseTeamRoleSortByFieldEnum { + ID + NAME + ACCESS_LEVEL + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceCaseTeamRoleEdge { + """The item at the end of the edge.""" + node: SalesforceCaseTeamRole! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Case Team Member Roles connection, for use in pagination.""" +type SalesforceCaseTeamRolesConnection { + """ + The count of all Case Team Member Role you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Case Team Member Roles""" + nodes: [SalesforceCaseTeamRole!]! + + """List of Case Team Member Role edges""" + edges: [SalesforceCaseTeamRoleEdge!]! +} + +""" +A filter to be used against CaseTeamRole object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseTeamRoleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseTeamRole's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CaseTeamRole's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CaseTeamRole's id field""" + id: SalesforceIdFilter + + """Filter by the CaseTeamRole's name field""" + name: SalesforceStringFilter + + """Filter by the CaseTeamRole's accessLevel field""" + accessLevel: SalesforceStringFilter + + """Filter by the CaseTeamRole's preferencesVisibleInCsp field""" + preferencesVisibleInCsp: SalesforceBooleanFilter + + """Filter by the CaseTeamRole's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CaseTeamRole's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CaseTeamRole's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CaseTeamRole's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CaseTeamRole's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseTeamRoleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseTeamRoleConnectionFilter!] +} + +""" +A filter to be used against CaseTeamTemplate object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseTeamTemplateConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseTeamTemplate's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CaseTeamTemplate's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CaseTeamTemplate's id field""" + id: SalesforceIdFilter + + """Filter by the CaseTeamTemplate's name field""" + name: SalesforceStringFilter + + """Filter by the CaseTeamTemplate's description field""" + description: SalesforceStringFilter + + """Filter by the CaseTeamTemplate's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CaseTeamTemplate's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CaseTeamTemplate's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CaseTeamTemplate's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CaseTeamTemplate's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseTeamTemplateConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseTeamTemplateConnectionFilter!] +} + +""" +A filter to be used against CaseTeamTemplateMember object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseTeamTemplateMemberConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseTeamTemplateMember's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CaseTeamTemplateMember's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CaseTeamTemplateMember's teamRole relation.""" + teamRole: SalesforceCaseTeamRoleConnectionFilter + + """Filter by the CaseTeamTemplateMember's teamTemplate relation.""" + teamTemplate: SalesforceCaseTeamTemplateConnectionFilter + + """Filter by the CaseTeamTemplateMember's id field""" + id: SalesforceIdFilter + + """Filter by the CaseTeamTemplateMember's teamTemplateId field""" + teamTemplateId: SalesforceIdFilter + + """Filter by the CaseTeamTemplateMember's memberId field""" + memberId: SalesforceIdFilter + + """Filter by the CaseTeamTemplateMember's teamRoleId field""" + teamRoleId: SalesforceIdFilter + + """Filter by the CaseTeamTemplateMember's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CaseTeamTemplateMember's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CaseTeamTemplateMember's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CaseTeamTemplateMember's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CaseTeamTemplateMember's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseTeamTemplateMemberConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseTeamTemplateMemberConnectionFilter!] +} + +""" +A filter to be used against CaseTeamMember object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseTeamMemberConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseTeamMember's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CaseTeamMember's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CaseTeamMember's teamRole relation.""" + teamRole: SalesforceCaseTeamRoleConnectionFilter + + """Filter by the CaseTeamMember's teamTemplateMember relation.""" + teamTemplateMember: SalesforceCaseTeamTemplateMemberConnectionFilter + + """Filter by the CaseTeamMember's parent relation.""" + parent: SalesforceCaseConnectionFilter + + """Filter by the CaseTeamMember's id field""" + id: SalesforceIdFilter + + """Filter by the CaseTeamMember's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the CaseTeamMember's memberId field""" + memberId: SalesforceIdFilter + + """Filter by the CaseTeamMember's teamTemplateMemberId field""" + teamTemplateMemberId: SalesforceIdFilter + + """Filter by the CaseTeamMember's teamRoleId field""" + teamRoleId: SalesforceIdFilter + + """Filter by the CaseTeamMember's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CaseTeamMember's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CaseTeamMember's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CaseTeamMember's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CaseTeamMember's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseTeamMemberConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseTeamMemberConnectionFilter!] +} + +"""Field that Case Team Members can be sorted by""" +enum SalesforceCaseTeamMemberSortByFieldEnum { + ID + PARENT_ID + MEMBER_ID + TEAM_TEMPLATE_MEMBER_ID + TEAM_ROLE_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceCaseTeamMemberEdge { + """The item at the end of the edge.""" + node: SalesforceCaseTeamMember! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Case Team Members connection, for use in pagination.""" +type SalesforceCaseTeamMembersConnection { + """The count of all Case Team Member you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Case Team Members""" + nodes: [SalesforceCaseTeamMember!]! + + """List of Case Team Member edges""" + edges: [SalesforceCaseTeamMemberEdge!]! +} + +""" +A filter to be used against CaseStatus object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseStatusConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseStatus's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CaseStatus's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CaseStatus's id field""" + id: SalesforceIdFilter + + """Filter by the CaseStatus's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the CaseStatus's apiName field""" + apiName: SalesforceStringFilter + + """Filter by the CaseStatus's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the CaseStatus's isDefault field""" + isDefault: SalesforceBooleanFilter + + """Filter by the CaseStatus's isClosed field""" + isClosed: SalesforceBooleanFilter + + """Filter by the CaseStatus's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CaseStatus's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CaseStatus's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CaseStatus's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CaseStatus's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseStatusConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseStatusConnectionFilter!] +} + +"""Field that Case Status Values can be sorted by""" +enum SalesforceCaseStatusSortByFieldEnum { + ID + MASTER_LABEL + API_NAME + SORT_ORDER + IS_DEFAULT + IS_CLOSED + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceCaseStatusEdge { + """The item at the end of the edge.""" + node: SalesforceCaseStatus! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Case Status Values connection, for use in pagination.""" +type SalesforceCaseStatussConnection { + """The count of all Case Status Value you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Case Status Values""" + nodes: [SalesforceCaseStatus!]! + + """List of Case Status Value edges""" + edges: [SalesforceCaseStatusEdge!]! +} + +""" +A filter to be used against CaseHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CaseHistory's case relation.""" + case: SalesforceCaseConnectionFilter + + """Filter by the CaseHistory's id field""" + id: SalesforceIdFilter + + """Filter by the CaseHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CaseHistory's caseId field""" + caseId: SalesforceIdFilter + + """Filter by the CaseHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CaseHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CaseHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseHistoryConnectionFilter!] +} + +"""Field that Case Histories can be sorted by""" +enum SalesforceCaseHistorySortByFieldEnum { + ID + IS_DELETED + CASE_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceCaseHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceCaseHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Case Histories connection, for use in pagination.""" +type SalesforceCaseHistorysConnection { + """The count of all Case History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Case Histories""" + nodes: [SalesforceCaseHistory!]! + + """List of Case History edges""" + edges: [SalesforceCaseHistoryEdge!]! +} + +""" +A filter to be used against CaseContactRole object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseContactRoleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseContactRole's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CaseContactRole's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CaseContactRole's contact relation.""" + contact: SalesforceContactConnectionFilter + + """Filter by the CaseContactRole's cases relation.""" + cases: SalesforceCaseConnectionFilter + + """Filter by the CaseContactRole's id field""" + id: SalesforceIdFilter + + """Filter by the CaseContactRole's casesId field""" + casesId: SalesforceIdFilter + + """Filter by the CaseContactRole's contactId field""" + contactId: SalesforceIdFilter + + """Filter by the CaseContactRole's role field""" + role: SalesforceStringFilter + + """Filter by the CaseContactRole's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CaseContactRole's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CaseContactRole's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CaseContactRole's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CaseContactRole's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CaseContactRole's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseContactRoleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseContactRoleConnectionFilter!] +} + +"""Field that Case Contact Roles can be sorted by""" +enum SalesforceCaseContactRoleSortByFieldEnum { + ID + CASES_ID + CONTACT_ID + ROLE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceCaseContactRoleEdge { + """The item at the end of the edge.""" + node: SalesforceCaseContactRole! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Case Contact Roles connection, for use in pagination.""" +type SalesforceCaseContactRolesConnection { + """The count of all Case Contact Role you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Case Contact Roles""" + nodes: [SalesforceCaseContactRole!]! + + """List of Case Contact Role edges""" + edges: [SalesforceCaseContactRoleEdge!]! +} + +""" +A filter to be used against CaseComment object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseCommentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseComment's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CaseComment's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CaseComment's parent relation.""" + parent: SalesforceCaseConnectionFilter + + """Filter by the CaseComment's id field""" + id: SalesforceIdFilter + + """Filter by the CaseComment's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the CaseComment's isPublished field""" + isPublished: SalesforceBooleanFilter + + """Filter by the CaseComment's commentBody field""" + commentBody: SalesforceStringFilter + + """Filter by the CaseComment's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CaseComment's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CaseComment's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CaseComment's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CaseComment's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CaseComment's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseCommentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseCommentConnectionFilter!] +} + +"""Field that Case Comments can be sorted by""" +enum SalesforceCaseCommentSortByFieldEnum { + ID + PARENT_ID + IS_PUBLISHED + COMMENT_BODY + CREATED_BY_ID + CREATED_DATE + SYSTEM_MODSTAMP + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceCaseCommentEdge { + """The item at the end of the edge.""" + node: SalesforceCaseComment! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Case Comments connection, for use in pagination.""" +type SalesforceCaseCommentsConnection { + """The count of all Case Comment you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Case Comments""" + nodes: [SalesforceCaseComment!]! + + """List of Case Comment edges""" + edges: [SalesforceCaseCommentEdge!]! +} + +"""Field that Call Centers can be sorted by""" +enum SalesforceCallCenterSortByFieldEnum { + ID + NAME + INTERNAL_NAME + VERSION + ADAPTER_URL + CUSTOM_SETTINGS + SYSTEM_MODSTAMP + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceCallCenterEdge { + """The item at the end of the edge.""" + node: SalesforceCallCenter! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Call Centers connection, for use in pagination.""" +type SalesforceCallCentersConnection { + """The count of all Call Center you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Call Centers""" + nodes: [SalesforceCallCenter!]! + + """List of Call Center edges""" + edges: [SalesforceCallCenterEdge!]! +} + +"""Field that Business Processes can be sorted by""" +enum SalesforceBusinessProcessSortByFieldEnum { + ID + NAME + NAMESPACE_PREFIX + DESCRIPTION + TABLE_ENUM_OR_ID + IS_ACTIVE + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceBusinessProcessEdge { + """The item at the end of the edge.""" + node: SalesforceBusinessProcess! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Business Processes connection, for use in pagination.""" +type SalesforceBusinessProcesssConnection { + """The count of all Business Process you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Business Processes""" + nodes: [SalesforceBusinessProcess!]! + + """List of Business Process edges""" + edges: [SalesforceBusinessProcessEdge!]! +} + +""" +A filter to be used against BusinessHours object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceBusinessHoursConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the BusinessHours's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the BusinessHours's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the BusinessHours's id field""" + id: SalesforceIdFilter + + """Filter by the BusinessHours's name field""" + name: SalesforceStringFilter + + """Filter by the BusinessHours's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the BusinessHours's isDefault field""" + isDefault: SalesforceBooleanFilter + + """Filter by the BusinessHours's timeZoneSidKey field""" + timeZoneSidKey: SalesforceStringFilter + + """Filter by the BusinessHours's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the BusinessHours's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the BusinessHours's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the BusinessHours's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the BusinessHours's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the BusinessHours's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceBusinessHoursConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceBusinessHoursConnectionFilter!] +} + +"""Field that Business Hours can be sorted by""" +enum SalesforceBusinessHoursSortByFieldEnum { + ID + NAME + IS_ACTIVE + IS_DEFAULT + SUNDAY_START_TIME + SUNDAY_END_TIME + MONDAY_START_TIME + MONDAY_END_TIME + TUESDAY_START_TIME + TUESDAY_END_TIME + WEDNESDAY_START_TIME + WEDNESDAY_END_TIME + THURSDAY_START_TIME + THURSDAY_END_TIME + FRIDAY_START_TIME + FRIDAY_END_TIME + SATURDAY_START_TIME + SATURDAY_END_TIME + TIME_ZONE_SID_KEY + SYSTEM_MODSTAMP + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + LAST_VIEWED_DATE +} + +"""An edge in a connection.""" +type SalesforceBusinessHoursEdge { + """The item at the end of the edge.""" + node: SalesforceBusinessHours! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Business Hours connection, for use in pagination.""" +type SalesforceBusinessHourssConnection { + """The count of all Business Hours you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Business Hours""" + nodes: [SalesforceBusinessHours!]! + + """List of Business Hours edges""" + edges: [SalesforceBusinessHoursEdge!]! +} + +"""Field that Letterheads can be sorted by""" +enum SalesforceBrandTemplateSortByFieldEnum { + ID + NAME + DEVELOPER_NAME + IS_ACTIVE + DESCRIPTION + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceBrandTemplateEdge { + """The item at the end of the edge.""" + node: SalesforceBrandTemplate! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Letterheads connection, for use in pagination.""" +type SalesforceBrandTemplatesConnection { + """The count of all Letterhead you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Letterheads""" + nodes: [SalesforceBrandTemplate!]! + + """List of Letterhead edges""" + edges: [SalesforceBrandTemplateEdge!]! +} + +"""Field that Authentication Configurations can be sorted by""" +enum SalesforceAuthConfigSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + URL + IS_ACTIVE + TYPE +} + +"""An edge in a connection.""" +type SalesforceAuthConfigEdge { + """The item at the end of the edge.""" + node: SalesforceAuthConfig! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Authentication Configurations connection, for use in pagination. +""" +type SalesforceAuthConfigsConnection { + """ + The count of all Authentication Configuration you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Authentication Configurations""" + nodes: [SalesforceAuthConfig!]! + + """List of Authentication Configuration edges""" + edges: [SalesforceAuthConfigEdge!]! +} + +"""Field that Lightning Component Bundles can be sorted by""" +enum SalesforceAuraDefinitionBundleSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + API_VERSION + DESCRIPTION +} + +"""An edge in a connection.""" +type SalesforceAuraDefinitionBundleEdge { + """The item at the end of the edge.""" + node: SalesforceAuraDefinitionBundle! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Lightning Component Bundles connection, for use in pagination. +""" +type SalesforceAuraDefinitionBundlesConnection { + """ + The count of all Lightning Component Bundle you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Lightning Component Bundles""" + nodes: [SalesforceAuraDefinitionBundle!]! + + """List of Lightning Component Bundle edges""" + edges: [SalesforceAuraDefinitionBundleEdge!]! +} + +""" +A filter to be used against AssignmentRule object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAssignmentRuleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AssignmentRule's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AssignmentRule's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AssignmentRule's id field""" + id: SalesforceIdFilter + + """Filter by the AssignmentRule's name field""" + name: SalesforceStringFilter + + """Filter by the AssignmentRule's sobjectType field""" + sobjectType: SalesforceStringFilter + + """Filter by the AssignmentRule's active field""" + active: SalesforceBooleanFilter + + """Filter by the AssignmentRule's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AssignmentRule's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AssignmentRule's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AssignmentRule's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AssignmentRule's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAssignmentRuleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAssignmentRuleConnectionFilter!] +} + +"""Field that Assignment Rules can be sorted by""" +enum SalesforceAssignmentRuleSortByFieldEnum { + ID + NAME + SOBJECT_TYPE + ACTIVE + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceAssignmentRuleEdge { + """The item at the end of the edge.""" + node: SalesforceAssignmentRule! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Assignment Rules connection, for use in pagination.""" +type SalesforceAssignmentRulesConnection { + """The count of all Assignment Rule you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Assignment Rules""" + nodes: [SalesforceAssignmentRule!]! + + """List of Assignment Rule edges""" + edges: [SalesforceAssignmentRuleEdge!]! +} + +""" +A filter to be used against AppMenuItem object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAppMenuItemConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AppMenuItem's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AppMenuItem's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AppMenuItem's id field""" + id: SalesforceIdFilter + + """Filter by the AppMenuItem's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AppMenuItem's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AppMenuItem's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AppMenuItem's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AppMenuItem's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AppMenuItem's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AppMenuItem's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the AppMenuItem's name field""" + name: SalesforceStringFilter + + """Filter by the AppMenuItem's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the AppMenuItem's label field""" + label: SalesforceStringFilter + + """Filter by the AppMenuItem's description field""" + description: SalesforceStringFilter + + """Filter by the AppMenuItem's startUrl field""" + startUrl: SalesforceStringFilter + + """Filter by the AppMenuItem's mobileStartUrl field""" + mobileStartUrl: SalesforceStringFilter + + """Filter by the AppMenuItem's logoUrl field""" + logoUrl: SalesforceStringFilter + + """Filter by the AppMenuItem's iconUrl field""" + iconUrl: SalesforceStringFilter + + """Filter by the AppMenuItem's infoUrl field""" + infoUrl: SalesforceStringFilter + + """Filter by the AppMenuItem's isUsingAdminAuthorization field""" + isUsingAdminAuthorization: SalesforceBooleanFilter + + """Filter by the AppMenuItem's mobilePlatform field""" + mobilePlatform: SalesforceStringFilter + + """Filter by the AppMenuItem's mobileMinOsVer field""" + mobileMinOsVer: SalesforceStringFilter + + """Filter by the AppMenuItem's mobileDeviceType field""" + mobileDeviceType: SalesforceStringFilter + + """Filter by the AppMenuItem's isRegisteredDeviceOnly field""" + isRegisteredDeviceOnly: SalesforceBooleanFilter + + """Filter by the AppMenuItem's mobileAppVer field""" + mobileAppVer: SalesforceStringFilter + + """Filter by the AppMenuItem's mobileAppInstalledDate field""" + mobileAppInstalledDate: SalesforceDateTimeFilter + + """Filter by the AppMenuItem's mobileAppInstalledVersion field""" + mobileAppInstalledVersion: SalesforceStringFilter + + """Filter by the AppMenuItem's mobileAppBinaryId field""" + mobileAppBinaryId: SalesforceStringFilter + + """Filter by the AppMenuItem's mobileAppInstallUrl field""" + mobileAppInstallUrl: SalesforceStringFilter + + """Filter by the AppMenuItem's canvasEnabled field""" + canvasEnabled: SalesforceBooleanFilter + + """Filter by the AppMenuItem's canvasReferenceId field""" + canvasReferenceId: SalesforceStringFilter + + """Filter by the AppMenuItem's canvasUrl field""" + canvasUrl: SalesforceStringFilter + + """Filter by the AppMenuItem's canvasAccessMethod field""" + canvasAccessMethod: SalesforceStringFilter + + """Filter by the AppMenuItem's canvasSelectedLocations field""" + canvasSelectedLocations: SalesforceStringFilter + + """Filter by the AppMenuItem's canvasOptions field""" + canvasOptions: SalesforceStringFilter + + """Filter by the AppMenuItem's type field""" + type: SalesforceStringFilter + + """Filter by the AppMenuItem's applicationId field""" + applicationId: SalesforceIdFilter + + """Filter by the AppMenuItem's userSortOrder field""" + userSortOrder: SalesforceIntFilter + + """Filter by the AppMenuItem's isVisible field""" + isVisible: SalesforceBooleanFilter + + """Filter by the AppMenuItem's isAccessible field""" + isAccessible: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAppMenuItemConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAppMenuItemConnectionFilter!] +} + +"""Field that AppMenuItems can be sorted by""" +enum SalesforceAppMenuItemSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + SORT_ORDER + NAME + NAMESPACE_PREFIX + LABEL + DESCRIPTION + START_URL + MOBILE_START_URL + LOGO_URL + ICON_URL + INFO_URL + IS_USING_ADMIN_AUTHORIZATION + MOBILE_PLATFORM + MOBILE_MIN_OS_VER + MOBILE_DEVICE_TYPE + IS_REGISTERED_DEVICE_ONLY + MOBILE_APP_VER + MOBILE_APP_INSTALLED_DATE + MOBILE_APP_INSTALLED_VERSION + MOBILE_APP_BINARY_ID + MOBILE_APP_INSTALL_URL + CANVAS_ENABLED + CANVAS_REFERENCE_ID + CANVAS_URL + CANVAS_ACCESS_METHOD + CANVAS_SELECTED_LOCATIONS + CANVAS_OPTIONS + TYPE + APPLICATION_ID + USER_SORT_ORDER + IS_VISIBLE + IS_ACCESSIBLE +} + +"""An edge in a connection.""" +type SalesforceAppMenuItemEdge { + """The item at the end of the edge.""" + node: SalesforceAppMenuItem! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce AppMenuItems connection, for use in pagination.""" +type SalesforceAppMenuItemsConnection { + """The count of all AppMenuItem you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce AppMenuItems""" + nodes: [SalesforceAppMenuItem!]! + + """List of AppMenuItem edges""" + edges: [SalesforceAppMenuItemEdge!]! +} + +""" +A filter to be used against ApexTrigger object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceApexTriggerConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ApexTrigger's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ApexTrigger's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ApexTrigger's id field""" + id: SalesforceIdFilter + + """Filter by the ApexTrigger's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the ApexTrigger's name field""" + name: SalesforceStringFilter + + """Filter by the ApexTrigger's tableEnumOrId field""" + tableEnumOrId: SalesforceStringFilter + + """Filter by the ApexTrigger's usageBeforeInsert field""" + usageBeforeInsert: SalesforceBooleanFilter + + """Filter by the ApexTrigger's usageAfterInsert field""" + usageAfterInsert: SalesforceBooleanFilter + + """Filter by the ApexTrigger's usageBeforeUpdate field""" + usageBeforeUpdate: SalesforceBooleanFilter + + """Filter by the ApexTrigger's usageAfterUpdate field""" + usageAfterUpdate: SalesforceBooleanFilter + + """Filter by the ApexTrigger's usageBeforeDelete field""" + usageBeforeDelete: SalesforceBooleanFilter + + """Filter by the ApexTrigger's usageAfterDelete field""" + usageAfterDelete: SalesforceBooleanFilter + + """Filter by the ApexTrigger's usageIsBulk field""" + usageIsBulk: SalesforceBooleanFilter + + """Filter by the ApexTrigger's usageAfterUndelete field""" + usageAfterUndelete: SalesforceBooleanFilter + + """Filter by the ApexTrigger's apiVersion field""" + apiVersion: SalesforceFloatFilter + + """Filter by the ApexTrigger's status field""" + status: SalesforceStringFilter + + """Filter by the ApexTrigger's isValid field""" + isValid: SalesforceBooleanFilter + + """Filter by the ApexTrigger's bodyCrc field""" + bodyCrc: SalesforceFloatFilter + + """Filter by the ApexTrigger's lengthWithoutComments field""" + lengthWithoutComments: SalesforceIntFilter + + """Filter by the ApexTrigger's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ApexTrigger's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ApexTrigger's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ApexTrigger's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ApexTrigger's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceApexTriggerConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceApexTriggerConnectionFilter!] +} + +"""Field that Apex Triggers can be sorted by""" +enum SalesforceApexTriggerSortByFieldEnum { + ID + NAMESPACE_PREFIX + NAME + TABLE_ENUM_OR_ID + API_VERSION + STATUS + IS_VALID + BODY_CRC + LENGTH_WITHOUT_COMMENTS + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceApexTriggerEdge { + """The item at the end of the edge.""" + node: SalesforceApexTrigger! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Apex Triggers connection, for use in pagination.""" +type SalesforceApexTriggersConnection { + """The count of all Apex Trigger you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Apex Triggers""" + nodes: [SalesforceApexTrigger!]! + + """List of Apex Trigger edges""" + edges: [SalesforceApexTriggerEdge!]! +} + +"""Field that Apex Test Suites can be sorted by""" +enum SalesforceApexTestSuiteSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + TEST_SUITE_NAME +} + +"""An edge in a connection.""" +type SalesforceApexTestSuiteEdge { + """The item at the end of the edge.""" + node: SalesforceApexTestSuite! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Apex Test Suites connection, for use in pagination.""" +type SalesforceApexTestSuitesConnection { + """The count of all Apex Test Suite you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Apex Test Suites""" + nodes: [SalesforceApexTestSuite!]! + + """List of Apex Test Suite edges""" + edges: [SalesforceApexTestSuiteEdge!]! +} + +"""Field that Visualforce Pages can be sorted by""" +enum SalesforceApexPageSortByFieldEnum { + ID + NAMESPACE_PREFIX + NAME + API_VERSION + MASTER_LABEL + DESCRIPTION + CONTROLLER_TYPE + CONTROLLER_KEY + IS_AVAILABLE_IN_TOUCH + IS_CONFIRMATION_TOKEN_REQUIRED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceApexPageEdge { + """The item at the end of the edge.""" + node: SalesforceApexPage! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Visualforce Pages connection, for use in pagination.""" +type SalesforceApexPagesConnection { + """The count of all Visualforce Page you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Visualforce Pages""" + nodes: [SalesforceApexPage!]! + + """List of Visualforce Page edges""" + edges: [SalesforceApexPageEdge!]! +} + +"""Field that Apex Debug Logs can be sorted by""" +enum SalesforceApexLogSortByFieldEnum { + ID + LOG_USER_ID + LOG_LENGTH + LAST_MODIFIED_DATE + REQUEST + OPERATION + APPLICATION + STATUS + DURATION_MILLISECONDS + SYSTEM_MODSTAMP + START_TIME + LOCATION +} + +"""An edge in a connection.""" +type SalesforceApexLogEdge { + """The item at the end of the edge.""" + node: SalesforceApexLog! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Apex Debug Logs connection, for use in pagination.""" +type SalesforceApexLogsConnection { + """The count of all Apex Debug Log you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Apex Debug Logs""" + nodes: [SalesforceApexLog!]! + + """List of Apex Debug Log edges""" + edges: [SalesforceApexLogEdge!]! +} + +""" +A filter to be used against ApexEmailNotification object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceApexEmailNotificationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ApexEmailNotification's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the ApexEmailNotification's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ApexEmailNotification's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ApexEmailNotification's id field""" + id: SalesforceIdFilter + + """Filter by the ApexEmailNotification's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ApexEmailNotification's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ApexEmailNotification's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ApexEmailNotification's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ApexEmailNotification's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ApexEmailNotification's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ApexEmailNotification's userId field""" + userId: SalesforceIdFilter + + """Filter by the ApexEmailNotification's email field""" + email: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceApexEmailNotificationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceApexEmailNotificationConnectionFilter!] +} + +"""Field that Apex Email Notifications can be sorted by""" +enum SalesforceApexEmailNotificationSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + USER_ID + EMAIL +} + +"""An edge in a connection.""" +type SalesforceApexEmailNotificationEdge { + """The item at the end of the edge.""" + node: SalesforceApexEmailNotification! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Apex Email Notifications connection, for use in pagination.""" +type SalesforceApexEmailNotificationsConnection { + """ + The count of all Apex Email Notification you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Apex Email Notifications""" + nodes: [SalesforceApexEmailNotification!]! + + """List of Apex Email Notification edges""" + edges: [SalesforceApexEmailNotificationEdge!]! +} + +""" +A filter to be used against ApexComponent object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceApexComponentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ApexComponent's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ApexComponent's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ApexComponent's id field""" + id: SalesforceIdFilter + + """Filter by the ApexComponent's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the ApexComponent's name field""" + name: SalesforceStringFilter + + """Filter by the ApexComponent's apiVersion field""" + apiVersion: SalesforceFloatFilter + + """Filter by the ApexComponent's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the ApexComponent's description field""" + description: SalesforceStringFilter + + """Filter by the ApexComponent's controllerType field""" + controllerType: SalesforceStringFilter + + """Filter by the ApexComponent's controllerKey field""" + controllerKey: SalesforceStringFilter + + """Filter by the ApexComponent's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ApexComponent's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ApexComponent's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ApexComponent's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ApexComponent's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceApexComponentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceApexComponentConnectionFilter!] +} + +"""Field that Visualforce Components can be sorted by""" +enum SalesforceApexComponentSortByFieldEnum { + ID + NAMESPACE_PREFIX + NAME + API_VERSION + MASTER_LABEL + DESCRIPTION + CONTROLLER_TYPE + CONTROLLER_KEY + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceApexComponentEdge { + """The item at the end of the edge.""" + node: SalesforceApexComponent! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Visualforce Components connection, for use in pagination.""" +type SalesforceApexComponentsConnection { + """ + The count of all Visualforce Component you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Visualforce Components""" + nodes: [SalesforceApexComponent!]! + + """List of Visualforce Component edges""" + edges: [SalesforceApexComponentEdge!]! +} + +"""Field that Apex Classes can be sorted by""" +enum SalesforceApexClassSortByFieldEnum { + ID + NAMESPACE_PREFIX + NAME + API_VERSION + STATUS + IS_VALID + BODY_CRC + LENGTH_WITHOUT_COMMENTS + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceApexClassEdge { + """The item at the end of the edge.""" + node: SalesforceApexClass! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Apex Classes connection, for use in pagination.""" +type SalesforceApexClasssConnection { + """The count of all Apex Class you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Apex Classes""" + nodes: [SalesforceApexClass!]! + + """List of Apex Class edges""" + edges: [SalesforceApexClassEdge!]! +} + +"""Field that Action Link Group Templates can be sorted by""" +enum SalesforceActionLinkGroupTemplateSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + EXECUTIONS_ALLOWED + HOURS_UNTIL_EXPIRATION + CATEGORY + IS_PUBLISHED +} + +"""An edge in a connection.""" +type SalesforceActionLinkGroupTemplateEdge { + """The item at the end of the edge.""" + node: SalesforceActionLinkGroupTemplate! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Action Link Group Templates connection, for use in pagination. +""" +type SalesforceActionLinkGroupTemplatesConnection { + """ + The count of all Action Link Group Template you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Action Link Group Templates""" + nodes: [SalesforceActionLinkGroupTemplate!]! + + """List of Action Link Group Template edges""" + edges: [SalesforceActionLinkGroupTemplateEdge!]! +} + +""" +A filter to be used against AccountHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAccountHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AccountHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AccountHistory's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the AccountHistory's id field""" + id: SalesforceIdFilter + + """Filter by the AccountHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AccountHistory's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the AccountHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AccountHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AccountHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAccountHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAccountHistoryConnectionFilter!] +} + +"""Field that Account Histories can be sorted by""" +enum SalesforceAccountHistorySortByFieldEnum { + ID + IS_DELETED + ACCOUNT_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceAccountHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceAccountHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Account Histories connection, for use in pagination.""" +type SalesforceAccountHistorysConnection { + """The count of all Account History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Account Histories""" + nodes: [SalesforceAccountHistory!]! + + """List of Account History edges""" + edges: [SalesforceAccountHistoryEdge!]! +} + +""" +A filter to be used against AccountContactRole object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAccountContactRoleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AccountContactRole's contact relation.""" + contact: SalesforceContactConnectionFilter + + """Filter by the AccountContactRole's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the AccountContactRole's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AccountContactRole's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AccountContactRole's id field""" + id: SalesforceIdFilter + + """Filter by the AccountContactRole's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AccountContactRole's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AccountContactRole's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AccountContactRole's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AccountContactRole's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AccountContactRole's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AccountContactRole's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the AccountContactRole's contactId field""" + contactId: SalesforceIdFilter + + """Filter by the AccountContactRole's role field""" + role: SalesforceStringFilter + + """Filter by the AccountContactRole's isPrimary field""" + isPrimary: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAccountContactRoleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAccountContactRoleConnectionFilter!] +} + +"""Field that Account Contact Roles can be sorted by""" +enum SalesforceAccountContactRoleSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + ACCOUNT_ID + CONTACT_ID + ROLE + IS_PRIMARY +} + +"""An edge in a connection.""" +type SalesforceAccountContactRoleEdge { + """The item at the end of the edge.""" + node: SalesforceAccountContactRole! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Account Contact Roles connection, for use in pagination.""" +type SalesforceAccountContactRolesConnection { + """ + The count of all Account Contact Role you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Account Contact Roles""" + nodes: [SalesforceAccountContactRole!]! + + """List of Account Contact Role edges""" + edges: [SalesforceAccountContactRoleEdge!]! +} + +""" +A filter to be used against AccountCleanInfo object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAccountCleanInfoConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AccountCleanInfo's lastStatusChangedBy relation.""" + lastStatusChangedBy: SalesforceUserConnectionFilter + + """Filter by the AccountCleanInfo's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the AccountCleanInfo's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AccountCleanInfo's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AccountCleanInfo's id field""" + id: SalesforceIdFilter + + """Filter by the AccountCleanInfo's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's name field""" + name: SalesforceStringFilter + + """Filter by the AccountCleanInfo's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AccountCleanInfo's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AccountCleanInfo's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AccountCleanInfo's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AccountCleanInfo's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AccountCleanInfo's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the AccountCleanInfo's lastMatchedDate field""" + lastMatchedDate: SalesforceDateTimeFilter + + """Filter by the AccountCleanInfo's lastStatusChangedDate field""" + lastStatusChangedDate: SalesforceDateTimeFilter + + """Filter by the AccountCleanInfo's lastStatusChangedById field""" + lastStatusChangedById: SalesforceIdFilter + + """Filter by the AccountCleanInfo's isInactive field""" + isInactive: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's companyName field""" + companyName: SalesforceStringFilter + + """Filter by the AccountCleanInfo's phone field""" + phone: SalesforceStringFilter + + """Filter by the AccountCleanInfo's street field""" + street: SalesforceStringFilter + + """Filter by the AccountCleanInfo's city field""" + city: SalesforceStringFilter + + """Filter by the AccountCleanInfo's state field""" + state: SalesforceStringFilter + + """Filter by the AccountCleanInfo's postalCode field""" + postalCode: SalesforceStringFilter + + """Filter by the AccountCleanInfo's country field""" + country: SalesforceStringFilter + + """Filter by the AccountCleanInfo's latitude field""" + latitude: SalesforceFloatFilter + + """Filter by the AccountCleanInfo's longitude field""" + longitude: SalesforceFloatFilter + + """Filter by the AccountCleanInfo's geocodeAccuracy field""" + geocodeAccuracy: SalesforceStringFilter + + """Filter by the AccountCleanInfo's website field""" + website: SalesforceStringFilter + + """Filter by the AccountCleanInfo's tickerSymbol field""" + tickerSymbol: SalesforceStringFilter + + """Filter by the AccountCleanInfo's annualRevenue field""" + annualRevenue: SalesforceFloatFilter + + """Filter by the AccountCleanInfo's numberOfEmployees field""" + numberOfEmployees: SalesforceIntFilter + + """Filter by the AccountCleanInfo's industry field""" + industry: SalesforceStringFilter + + """Filter by the AccountCleanInfo's ownership field""" + ownership: SalesforceStringFilter + + """Filter by the AccountCleanInfo's dunsNumber field""" + dunsNumber: SalesforceStringFilter + + """Filter by the AccountCleanInfo's sic field""" + sic: SalesforceStringFilter + + """Filter by the AccountCleanInfo's sicDescription field""" + sicDescription: SalesforceStringFilter + + """Filter by the AccountCleanInfo's naicsCode field""" + naicsCode: SalesforceStringFilter + + """Filter by the AccountCleanInfo's naicsDescription field""" + naicsDescription: SalesforceStringFilter + + """Filter by the AccountCleanInfo's yearStarted field""" + yearStarted: SalesforceStringFilter + + """Filter by the AccountCleanInfo's fax field""" + fax: SalesforceStringFilter + + """Filter by the AccountCleanInfo's accountSite field""" + accountSite: SalesforceStringFilter + + """Filter by the AccountCleanInfo's tradestyle field""" + tradestyle: SalesforceStringFilter + + """Filter by the AccountCleanInfo's dandBCompanyDunsNumber field""" + dandBCompanyDunsNumber: SalesforceStringFilter + + """Filter by the AccountCleanInfo's dunsRightMatchGrade field""" + dunsRightMatchGrade: SalesforceStringFilter + + """Filter by the AccountCleanInfo's dunsRightMatchConfidence field""" + dunsRightMatchConfidence: SalesforceIntFilter + + """Filter by the AccountCleanInfo's companyStatusDataDotCom field""" + companyStatusDataDotCom: SalesforceStringFilter + + """Filter by the AccountCleanInfo's isReviewedCompanyName field""" + isReviewedCompanyName: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedPhone field""" + isReviewedPhone: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedAddress field""" + isReviewedAddress: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedWebsite field""" + isReviewedWebsite: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedTickerSymbol field""" + isReviewedTickerSymbol: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedAnnualRevenue field""" + isReviewedAnnualRevenue: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedNumberOfEmployees field""" + isReviewedNumberOfEmployees: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedIndustry field""" + isReviewedIndustry: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedOwnership field""" + isReviewedOwnership: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedDunsNumber field""" + isReviewedDunsNumber: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedSic field""" + isReviewedSic: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedSicDescription field""" + isReviewedSicDescription: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedNaicsCode field""" + isReviewedNaicsCode: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedNaicsDescription field""" + isReviewedNaicsDescription: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedYearStarted field""" + isReviewedYearStarted: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedFax field""" + isReviewedFax: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedAccountSite field""" + isReviewedAccountSite: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedDescription field""" + isReviewedDescription: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isReviewedTradestyle field""" + isReviewedTradestyle: SalesforceBooleanFilter + + """ + Filter by the AccountCleanInfo's isReviewedDandBCompanyDunsNumber field + """ + isReviewedDandBCompanyDunsNumber: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentCompanyName field""" + isDifferentCompanyName: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentPhone field""" + isDifferentPhone: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentStreet field""" + isDifferentStreet: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentCity field""" + isDifferentCity: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentState field""" + isDifferentState: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentPostalCode field""" + isDifferentPostalCode: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentCountry field""" + isDifferentCountry: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentWebsite field""" + isDifferentWebsite: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentTickerSymbol field""" + isDifferentTickerSymbol: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentAnnualRevenue field""" + isDifferentAnnualRevenue: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentNumberOfEmployees field""" + isDifferentNumberOfEmployees: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentIndustry field""" + isDifferentIndustry: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentOwnership field""" + isDifferentOwnership: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentDunsNumber field""" + isDifferentDunsNumber: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentSic field""" + isDifferentSic: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentSicDescription field""" + isDifferentSicDescription: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentNaicsCode field""" + isDifferentNaicsCode: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentNaicsDescription field""" + isDifferentNaicsDescription: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentYearStarted field""" + isDifferentYearStarted: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentFax field""" + isDifferentFax: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentAccountSite field""" + isDifferentAccountSite: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentDescription field""" + isDifferentDescription: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentTradestyle field""" + isDifferentTradestyle: SalesforceBooleanFilter + + """ + Filter by the AccountCleanInfo's isDifferentDandBCompanyDunsNumber field + """ + isDifferentDandBCompanyDunsNumber: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentStateCode field""" + isDifferentStateCode: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isDifferentCountryCode field""" + isDifferentCountryCode: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's cleanedByJob field""" + cleanedByJob: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's cleanedByUser field""" + cleanedByUser: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongCompanyName field""" + isFlaggedWrongCompanyName: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongPhone field""" + isFlaggedWrongPhone: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongAddress field""" + isFlaggedWrongAddress: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongWebsite field""" + isFlaggedWrongWebsite: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongTickerSymbol field""" + isFlaggedWrongTickerSymbol: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongAnnualRevenue field""" + isFlaggedWrongAnnualRevenue: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongNumberOfEmployees field""" + isFlaggedWrongNumberOfEmployees: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongIndustry field""" + isFlaggedWrongIndustry: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongOwnership field""" + isFlaggedWrongOwnership: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongDunsNumber field""" + isFlaggedWrongDunsNumber: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongSic field""" + isFlaggedWrongSic: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongSicDescription field""" + isFlaggedWrongSicDescription: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongNaicsCode field""" + isFlaggedWrongNaicsCode: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongNaicsDescription field""" + isFlaggedWrongNaicsDescription: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongYearStarted field""" + isFlaggedWrongYearStarted: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongFax field""" + isFlaggedWrongFax: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongAccountSite field""" + isFlaggedWrongAccountSite: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongDescription field""" + isFlaggedWrongDescription: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's isFlaggedWrongTradestyle field""" + isFlaggedWrongTradestyle: SalesforceBooleanFilter + + """Filter by the AccountCleanInfo's dataDotComId field""" + dataDotComId: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAccountCleanInfoConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAccountCleanInfoConnectionFilter!] +} + +"""Field that Account Clean Infos can be sorted by""" +enum SalesforceAccountCleanInfoSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + ACCOUNT_ID + LAST_MATCHED_DATE + LAST_STATUS_CHANGED_DATE + LAST_STATUS_CHANGED_BY_ID + IS_INACTIVE + COMPANY_NAME + PHONE + STREET + CITY + STATE + POSTAL_CODE + COUNTRY + LATITUDE + LONGITUDE + GEOCODE_ACCURACY + WEBSITE + TICKER_SYMBOL + ANNUAL_REVENUE + NUMBER_OF_EMPLOYEES + INDUSTRY + OWNERSHIP + DUNS_NUMBER + SIC + SIC_DESCRIPTION + NAICS_CODE + NAICS_DESCRIPTION + YEAR_STARTED + FAX + ACCOUNT_SITE + TRADESTYLE + DAND_B_COMPANY_DUNS_NUMBER + DUNS_RIGHT_MATCH_GRADE + DUNS_RIGHT_MATCH_CONFIDENCE + COMPANY_STATUS_DATA_DOT_COM + DATA_DOT_COM_ID +} + +"""An edge in a connection.""" +type SalesforceAccountCleanInfoEdge { + """The item at the end of the edge.""" + node: SalesforceAccountCleanInfo! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Account Clean Infos connection, for use in pagination.""" +type SalesforceAccountCleanInfosConnection { + """The count of all Account Clean Info you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Account Clean Infos""" + nodes: [SalesforceAccountCleanInfo!]! + + """List of Account Clean Info edges""" + edges: [SalesforceAccountCleanInfoEdge!]! +} + +"""Field that Roles can be sorted by""" +enum SalesforceUserRoleSortByFieldEnum { + ID + NAME + PARENT_ROLE_ID + ROLLUP_DESCRIPTION + OPPORTUNITY_ACCESS_FOR_ACCOUNT_OWNER + CASE_ACCESS_FOR_ACCOUNT_OWNER + CONTACT_ACCESS_FOR_ACCOUNT_OWNER + FORECAST_USER_ID + MAY_FORECAST_MANAGER_SHARE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + DEVELOPER_NAME + PORTAL_ACCOUNT_ID + PORTAL_TYPE + PORTAL_ACCOUNT_OWNER_ID +} + +"""An edge in a connection.""" +type SalesforceUserRoleEdge { + """The item at the end of the edge.""" + node: SalesforceUserRole! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Roles connection, for use in pagination.""" +type SalesforceUserRolesConnection { + """The count of all Role you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Roles""" + nodes: [SalesforceUserRole!]! + + """List of Role edges""" + edges: [SalesforceUserRoleEdge!]! +} + +"""An edge in a connection.""" +type SalesforceForecastShareEdge { + """The item at the end of the edge.""" + node: SalesforceForecastShare! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceCaseOwnerUnion = SalesforceUser | SalesforceGroup + +union SalesforceFieldDefinitionBusinessOwnerUnion = SalesforceUser | SalesforceGroup + +union SalesforceUserDelegatedApproverUnion = SalesforceUser | SalesforceGroup + +union SalesforceEntityDefinitionDataStewardUnion = SalesforceUser | SalesforceGroup + +union SalesforceLeadOwnerUnion = SalesforceUser | SalesforceGroup + +union SalesforceProcessInstanceHistoryOriginalActorUnion = SalesforceUser | SalesforceGroup + +union SalesforceProcessInstanceHistoryActorUnion = SalesforceUser | SalesforceGroup + +""" +A filter to be used against UserShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserShare's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the UserShare's id field""" + id: SalesforceIdFilter + + """Filter by the UserShare's userId field""" + userId: SalesforceIdFilter + + """Filter by the UserShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the UserShare's userAccessLevel field""" + userAccessLevel: SalesforceStringFilter + + """Filter by the UserShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the UserShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserShare's isActive field""" + isActive: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserShareConnectionFilter!] +} + +"""Field that User Shares can be sorted by""" +enum SalesforceUserShareSortByFieldEnum { + ID + USER_ID + USER_OR_GROUP_ID + USER_ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_ACTIVE +} + +"""An edge in a connection.""" +type SalesforceUserShareEdge { + """The item at the end of the edge.""" + node: SalesforceUserShare! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce User Shares connection, for use in pagination.""" +type SalesforceUserSharesConnection { + """The count of all User Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Shares""" + nodes: [SalesforceUserShare!]! + + """List of User Share edges""" + edges: [SalesforceUserShareEdge!]! +} + +""" +A filter to be used against UserProvisioningRequestShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserProvisioningRequestShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserProvisioningRequestShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserProvisioningRequestShare's parent relation.""" + parent: SalesforceUserProvisioningRequestConnectionFilter + + """Filter by the UserProvisioningRequestShare's id field""" + id: SalesforceIdFilter + + """Filter by the UserProvisioningRequestShare's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the UserProvisioningRequestShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the UserProvisioningRequestShare's accessLevel field""" + accessLevel: SalesforceStringFilter + + """Filter by the UserProvisioningRequestShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the UserProvisioningRequestShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserProvisioningRequestShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserProvisioningRequestShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserProvisioningRequestShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserProvisioningRequestShareConnectionFilter!] +} + +"""Field that User Provisioning Request Shares can be sorted by""" +enum SalesforceUserProvisioningRequestShareSortByFieldEnum { + ID + PARENT_ID + USER_OR_GROUP_ID + ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceUserProvisioningRequestShareEdge { + """The item at the end of the edge.""" + node: SalesforceUserProvisioningRequestShare! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce User Provisioning Request Shares connection, for use in pagination. +""" +type SalesforceUserProvisioningRequestSharesConnection { + """ + The count of all User Provisioning Request Share you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Provisioning Request Shares""" + nodes: [SalesforceUserProvisioningRequestShare!]! + + """List of User Provisioning Request Share edges""" + edges: [SalesforceUserProvisioningRequestShareEdge!]! +} + +""" +A filter to be used against UserAppMenuCustomizationShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserAppMenuCustomizationShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserAppMenuCustomizationShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserAppMenuCustomizationShare's parent relation.""" + parent: SalesforceUserAppMenuCustomizationConnectionFilter + + """Filter by the UserAppMenuCustomizationShare's id field""" + id: SalesforceIdFilter + + """Filter by the UserAppMenuCustomizationShare's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the UserAppMenuCustomizationShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the UserAppMenuCustomizationShare's accessLevel field""" + accessLevel: SalesforceStringFilter + + """Filter by the UserAppMenuCustomizationShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the UserAppMenuCustomizationShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserAppMenuCustomizationShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserAppMenuCustomizationShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserAppMenuCustomizationShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserAppMenuCustomizationShareConnectionFilter!] +} + +"""Field that UserAppMenuCustomization Shares can be sorted by""" +enum SalesforceUserAppMenuCustomizationShareSortByFieldEnum { + ID + PARENT_ID + USER_OR_GROUP_ID + ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceUserAppMenuCustomizationShareEdge { + """The item at the end of the edge.""" + node: SalesforceUserAppMenuCustomizationShare! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce UserAppMenuCustomization Shares connection, for use in pagination. +""" +type SalesforceUserAppMenuCustomizationSharesConnection { + """ + The count of all UserAppMenuCustomization Share you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce UserAppMenuCustomization Shares""" + nodes: [SalesforceUserAppMenuCustomizationShare!]! + + """List of UserAppMenuCustomization Share edges""" + edges: [SalesforceUserAppMenuCustomizationShareEdge!]! +} + +""" +A filter to be used against TodayGoal object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTodayGoalConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the TodayGoal's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the TodayGoal's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the TodayGoal's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the TodayGoal's id field""" + id: SalesforceIdFilter + + """Filter by the TodayGoal's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the TodayGoal's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the TodayGoal's name field""" + name: SalesforceStringFilter + + """Filter by the TodayGoal's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the TodayGoal's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the TodayGoal's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the TodayGoal's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the TodayGoal's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the TodayGoal's value field""" + value: SalesforceFloatFilter + + """Filter by the TodayGoal's userId field""" + userId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTodayGoalConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTodayGoalConnectionFilter!] +} + +""" +A filter to be used against TodayGoalShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTodayGoalShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the TodayGoalShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the TodayGoalShare's parent relation.""" + parent: SalesforceTodayGoalConnectionFilter + + """Filter by the TodayGoalShare's id field""" + id: SalesforceIdFilter + + """Filter by the TodayGoalShare's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the TodayGoalShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the TodayGoalShare's accessLevel field""" + accessLevel: SalesforceStringFilter + + """Filter by the TodayGoalShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the TodayGoalShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the TodayGoalShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the TodayGoalShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTodayGoalShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTodayGoalShareConnectionFilter!] +} + +"""Field that Goal Shares can be sorted by""" +enum SalesforceTodayGoalShareSortByFieldEnum { + ID + PARENT_ID + USER_OR_GROUP_ID + ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceTodayGoalShareEdge { + """The item at the end of the edge.""" + node: SalesforceTodayGoalShare! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Goal Shares connection, for use in pagination.""" +type SalesforceTodayGoalSharesConnection { + """The count of all Goal Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Goal Shares""" + nodes: [SalesforceTodayGoalShare!]! + + """List of Goal Share edges""" + edges: [SalesforceTodayGoalShareEdge!]! +} + +""" +A filter to be used against StreamingChannel object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceStreamingChannelConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the StreamingChannel's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the StreamingChannel's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the StreamingChannel's id field""" + id: SalesforceIdFilter + + """Filter by the StreamingChannel's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the StreamingChannel's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the StreamingChannel's name field""" + name: SalesforceStringFilter + + """Filter by the StreamingChannel's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the StreamingChannel's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the StreamingChannel's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the StreamingChannel's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the StreamingChannel's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the StreamingChannel's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the StreamingChannel's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the StreamingChannel's isDynamic field""" + isDynamic: SalesforceBooleanFilter + + """Filter by the StreamingChannel's description field""" + description: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceStreamingChannelConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceStreamingChannelConnectionFilter!] +} + +""" +A filter to be used against StreamingChannelShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceStreamingChannelShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the StreamingChannelShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the StreamingChannelShare's parent relation.""" + parent: SalesforceStreamingChannelConnectionFilter + + """Filter by the StreamingChannelShare's id field""" + id: SalesforceIdFilter + + """Filter by the StreamingChannelShare's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the StreamingChannelShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the StreamingChannelShare's accessLevel field""" + accessLevel: SalesforceStringFilter + + """Filter by the StreamingChannelShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the StreamingChannelShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the StreamingChannelShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the StreamingChannelShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceStreamingChannelShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceStreamingChannelShareConnectionFilter!] +} + +"""Field that Streaming Channel Shares can be sorted by""" +enum SalesforceStreamingChannelShareSortByFieldEnum { + ID + PARENT_ID + USER_OR_GROUP_ID + ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceStreamingChannelShareEdge { + """The item at the end of the edge.""" + node: SalesforceStreamingChannelShare! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Streaming Channel Shares connection, for use in pagination.""" +type SalesforceStreamingChannelSharesConnection { + """ + The count of all Streaming Channel Share you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Streaming Channel Shares""" + nodes: [SalesforceStreamingChannelShare!]! + + """List of Streaming Channel Share edges""" + edges: [SalesforceStreamingChannelShareEdge!]! +} + +""" +A filter to be used against QuickTextShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceQuickTextShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the QuickTextShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the QuickTextShare's parent relation.""" + parent: SalesforceQuickTextConnectionFilter + + """Filter by the QuickTextShare's id field""" + id: SalesforceIdFilter + + """Filter by the QuickTextShare's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the QuickTextShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the QuickTextShare's accessLevel field""" + accessLevel: SalesforceStringFilter + + """Filter by the QuickTextShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the QuickTextShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the QuickTextShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the QuickTextShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceQuickTextShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceQuickTextShareConnectionFilter!] +} + +"""Field that Quick Text Shares can be sorted by""" +enum SalesforceQuickTextShareSortByFieldEnum { + ID + PARENT_ID + USER_OR_GROUP_ID + ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceQuickTextShareEdge { + """The item at the end of the edge.""" + node: SalesforceQuickTextShare! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Quick Text Shares connection, for use in pagination.""" +type SalesforceQuickTextSharesConnection { + """The count of all Quick Text Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Quick Text Shares""" + nodes: [SalesforceQuickTextShare!]! + + """List of Quick Text Share edges""" + edges: [SalesforceQuickTextShareEdge!]! +} + +""" +A filter to be used against QueueSobject object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceQueueSobjectConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the QueueSobject's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the QueueSobject's queue relation.""" + queue: SalesforceGroupConnectionFilter + + """Filter by the QueueSobject's id field""" + id: SalesforceIdFilter + + """Filter by the QueueSobject's queueId field""" + queueId: SalesforceIdFilter + + """Filter by the QueueSobject's sobjectType field""" + sobjectType: SalesforceStringFilter + + """Filter by the QueueSobject's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the QueueSobject's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceQueueSobjectConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceQueueSobjectConnectionFilter!] +} + +"""Field that Queue Sobjects can be sorted by""" +enum SalesforceQueueSobjectSortByFieldEnum { + ID + QUEUE_ID + SOBJECT_TYPE + CREATED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceQueueSobjectEdge { + """The item at the end of the edge.""" + node: SalesforceQueueSobject! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Queue Sobjects connection, for use in pagination.""" +type SalesforceQueueSobjectsConnection { + """The count of all Queue Sobject you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Queue Sobjects""" + nodes: [SalesforceQueueSobject!]! + + """List of Queue Sobject edges""" + edges: [SalesforceQueueSobjectEdge!]! +} + +""" +A filter to be used against OrgDeleteRequest object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOrgDeleteRequestConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OrgDeleteRequest's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the OrgDeleteRequest's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OrgDeleteRequest's id field""" + id: SalesforceIdFilter + + """Filter by the OrgDeleteRequest's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the OrgDeleteRequest's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the OrgDeleteRequest's name field""" + name: SalesforceStringFilter + + """Filter by the OrgDeleteRequest's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OrgDeleteRequest's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OrgDeleteRequest's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OrgDeleteRequest's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the OrgDeleteRequest's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the OrgDeleteRequest's requestType field""" + requestType: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOrgDeleteRequestConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOrgDeleteRequestConnectionFilter!] +} + +""" +A filter to be used against OrgDeleteRequestShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOrgDeleteRequestShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OrgDeleteRequestShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the OrgDeleteRequestShare's parent relation.""" + parent: SalesforceOrgDeleteRequestConnectionFilter + + """Filter by the OrgDeleteRequestShare's id field""" + id: SalesforceIdFilter + + """Filter by the OrgDeleteRequestShare's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the OrgDeleteRequestShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the OrgDeleteRequestShare's accessLevel field""" + accessLevel: SalesforceStringFilter + + """Filter by the OrgDeleteRequestShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the OrgDeleteRequestShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OrgDeleteRequestShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the OrgDeleteRequestShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOrgDeleteRequestShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOrgDeleteRequestShareConnectionFilter!] +} + +"""Field that Org Delete Request Shares can be sorted by""" +enum SalesforceOrgDeleteRequestShareSortByFieldEnum { + ID + PARENT_ID + USER_OR_GROUP_ID + ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceOrgDeleteRequestShareEdge { + """The item at the end of the edge.""" + node: SalesforceOrgDeleteRequestShare! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Org Delete Request Shares connection, for use in pagination. +""" +type SalesforceOrgDeleteRequestSharesConnection { + """ + The count of all Org Delete Request Share you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Org Delete Request Shares""" + nodes: [SalesforceOrgDeleteRequestShare!]! + + """List of Org Delete Request Share edges""" + edges: [SalesforceOrgDeleteRequestShareEdge!]! +} + +""" +A filter to be used against MacroShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceMacroShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the MacroShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the MacroShare's parent relation.""" + parent: SalesforceMacroConnectionFilter + + """Filter by the MacroShare's id field""" + id: SalesforceIdFilter + + """Filter by the MacroShare's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the MacroShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the MacroShare's accessLevel field""" + accessLevel: SalesforceStringFilter + + """Filter by the MacroShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the MacroShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the MacroShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the MacroShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceMacroShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceMacroShareConnectionFilter!] +} + +"""Field that Macro Shares can be sorted by""" +enum SalesforceMacroShareSortByFieldEnum { + ID + PARENT_ID + USER_OR_GROUP_ID + ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceMacroShareEdge { + """The item at the end of the edge.""" + node: SalesforceMacroShare! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Macro Shares connection, for use in pagination.""" +type SalesforceMacroSharesConnection { + """The count of all Macro Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Macro Shares""" + nodes: [SalesforceMacroShare!]! + + """List of Macro Share edges""" + edges: [SalesforceMacroShareEdge!]! +} + +""" +A filter to be used against ListEmailShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceListEmailShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ListEmailShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ListEmailShare's parent relation.""" + parent: SalesforceListEmailConnectionFilter + + """Filter by the ListEmailShare's id field""" + id: SalesforceIdFilter + + """Filter by the ListEmailShare's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the ListEmailShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the ListEmailShare's accessLevel field""" + accessLevel: SalesforceStringFilter + + """Filter by the ListEmailShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the ListEmailShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ListEmailShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ListEmailShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceListEmailShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceListEmailShareConnectionFilter!] +} + +"""Field that List Email Shares can be sorted by""" +enum SalesforceListEmailShareSortByFieldEnum { + ID + PARENT_ID + USER_OR_GROUP_ID + ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceListEmailShareEdge { + """The item at the end of the edge.""" + node: SalesforceListEmailShare! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce List Email Shares connection, for use in pagination.""" +type SalesforceListEmailSharesConnection { + """The count of all List Email Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce List Email Shares""" + nodes: [SalesforceListEmailShare!]! + + """List of List Email Share edges""" + edges: [SalesforceListEmailShareEdge!]! +} + +""" +A filter to be used against LeadShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceLeadShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the LeadShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the LeadShare's lead relation.""" + lead: SalesforceLeadConnectionFilter + + """Filter by the LeadShare's id field""" + id: SalesforceIdFilter + + """Filter by the LeadShare's leadId field""" + leadId: SalesforceIdFilter + + """Filter by the LeadShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the LeadShare's leadAccessLevel field""" + leadAccessLevel: SalesforceStringFilter + + """Filter by the LeadShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the LeadShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the LeadShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the LeadShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceLeadShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceLeadShareConnectionFilter!] +} + +"""Field that Lead Shares can be sorted by""" +enum SalesforceLeadShareSortByFieldEnum { + ID + LEAD_ID + USER_OR_GROUP_ID + LEAD_ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceLeadShareEdge { + """The item at the end of the edge.""" + node: SalesforceLeadShare! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Lead Shares connection, for use in pagination.""" +type SalesforceLeadSharesConnection { + """The count of all Lead Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Lead Shares""" + nodes: [SalesforceLeadShare!]! + + """List of Lead Share edges""" + edges: [SalesforceLeadShareEdge!]! +} + +""" +A filter to be used against GroupMember object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceGroupMemberConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the GroupMember's group relation.""" + group: SalesforceGroupConnectionFilter + + """Filter by the GroupMember's id field""" + id: SalesforceIdFilter + + """Filter by the GroupMember's groupId field""" + groupId: SalesforceIdFilter + + """Filter by the GroupMember's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the GroupMember's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceGroupMemberConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceGroupMemberConnectionFilter!] +} + +"""Field that Group Members can be sorted by""" +enum SalesforceGroupMemberSortByFieldEnum { + ID + GROUP_ID + USER_OR_GROUP_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceGroupMemberEdge { + """The item at the end of the edge.""" + node: SalesforceGroupMember! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Group Members connection, for use in pagination.""" +type SalesforceGroupMembersConnection { + """The count of all Group Member you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Group Members""" + nodes: [SalesforceGroupMember!]! + + """List of Group Member edges""" + edges: [SalesforceGroupMemberEdge!]! +} + +""" +A filter to be used against ForecastShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceForecastShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ForecastShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ForecastShare's userRole relation.""" + userRole: SalesforceUserRoleConnectionFilter + + """Filter by the ForecastShare's id field""" + id: SalesforceIdFilter + + """Filter by the ForecastShare's userRoleId field""" + userRoleId: SalesforceIdFilter + + """Filter by the ForecastShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the ForecastShare's accessLevel field""" + accessLevel: SalesforceStringFilter + + """Filter by the ForecastShare's canSubmit field""" + canSubmit: SalesforceBooleanFilter + + """Filter by the ForecastShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the ForecastShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ForecastShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceForecastShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceForecastShareConnectionFilter!] +} + +"""Field that Forecast Shares can be sorted by""" +enum SalesforceForecastShareSortByFieldEnum { + ID + USER_ROLE_ID + USER_OR_GROUP_ID + ACCESS_LEVEL + CAN_SUBMIT + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID +} + +""" +A filter to be used against FlowInterviewShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFlowInterviewShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FlowInterviewShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the FlowInterviewShare's parent relation.""" + parent: SalesforceFlowInterviewConnectionFilter + + """Filter by the FlowInterviewShare's id field""" + id: SalesforceIdFilter + + """Filter by the FlowInterviewShare's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the FlowInterviewShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the FlowInterviewShare's accessLevel field""" + accessLevel: SalesforceStringFilter + + """Filter by the FlowInterviewShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the FlowInterviewShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the FlowInterviewShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the FlowInterviewShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFlowInterviewShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFlowInterviewShareConnectionFilter!] +} + +"""Field that Flow Interview Shares can be sorted by""" +enum SalesforceFlowInterviewShareSortByFieldEnum { + ID + PARENT_ID + USER_OR_GROUP_ID + ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceFlowInterviewShareEdge { + """The item at the end of the edge.""" + node: SalesforceFlowInterviewShare! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Flow Interview Shares connection, for use in pagination.""" +type SalesforceFlowInterviewSharesConnection { + """ + The count of all Flow Interview Share you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Flow Interview Shares""" + nodes: [SalesforceFlowInterviewShare!]! + + """List of Flow Interview Share edges""" + edges: [SalesforceFlowInterviewShareEdge!]! +} + +""" +A filter to be used against ContactShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContactShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContactShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContactShare's contact relation.""" + contact: SalesforceContactConnectionFilter + + """Filter by the ContactShare's id field""" + id: SalesforceIdFilter + + """Filter by the ContactShare's contactId field""" + contactId: SalesforceIdFilter + + """Filter by the ContactShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the ContactShare's contactAccessLevel field""" + contactAccessLevel: SalesforceStringFilter + + """Filter by the ContactShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the ContactShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContactShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContactShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContactShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContactShareConnectionFilter!] +} + +"""Field that Contact Shares can be sorted by""" +enum SalesforceContactShareSortByFieldEnum { + ID + CONTACT_ID + USER_OR_GROUP_ID + CONTACT_ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceContactShareEdge { + """The item at the end of the edge.""" + node: SalesforceContactShare! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Contact Shares connection, for use in pagination.""" +type SalesforceContactSharesConnection { + """The count of all Contact Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Contact Shares""" + nodes: [SalesforceContactShare!]! + + """List of Contact Share edges""" + edges: [SalesforceContactShareEdge!]! +} + +""" +A filter to be used against CaseShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CaseShare's case relation.""" + case: SalesforceCaseConnectionFilter + + """Filter by the CaseShare's id field""" + id: SalesforceIdFilter + + """Filter by the CaseShare's caseId field""" + caseId: SalesforceIdFilter + + """Filter by the CaseShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the CaseShare's caseAccessLevel field""" + caseAccessLevel: SalesforceStringFilter + + """Filter by the CaseShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the CaseShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CaseShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CaseShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseShareConnectionFilter!] +} + +"""Field that Case Shares can be sorted by""" +enum SalesforceCaseShareSortByFieldEnum { + ID + CASE_ID + USER_OR_GROUP_ID + CASE_ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceCaseShareEdge { + """The item at the end of the edge.""" + node: SalesforceCaseShare! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Case Shares connection, for use in pagination.""" +type SalesforceCaseSharesConnection { + """The count of all Case Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Case Shares""" + nodes: [SalesforceCaseShare!]! + + """List of Case Share edges""" + edges: [SalesforceCaseShareEdge!]! +} + +""" +A filter to be used against AccountShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAccountShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AccountShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AccountShare's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the AccountShare's id field""" + id: SalesforceIdFilter + + """Filter by the AccountShare's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the AccountShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the AccountShare's accountAccessLevel field""" + accountAccessLevel: SalesforceStringFilter + + """Filter by the AccountShare's opportunityAccessLevel field""" + opportunityAccessLevel: SalesforceStringFilter + + """Filter by the AccountShare's caseAccessLevel field""" + caseAccessLevel: SalesforceStringFilter + + """Filter by the AccountShare's contactAccessLevel field""" + contactAccessLevel: SalesforceStringFilter + + """Filter by the AccountShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the AccountShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AccountShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AccountShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAccountShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAccountShareConnectionFilter!] +} + +"""Field that Account Shares can be sorted by""" +enum SalesforceAccountShareSortByFieldEnum { + ID + ACCOUNT_ID + USER_OR_GROUP_ID + ACCOUNT_ACCESS_LEVEL + OPPORTUNITY_ACCESS_LEVEL + CASE_ACCESS_LEVEL + CONTACT_ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceAccountShareEdge { + """The item at the end of the edge.""" + node: SalesforceAccountShare! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Account Shares connection, for use in pagination.""" +type SalesforceAccountSharesConnection { + """The count of all Account Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Account Shares""" + nodes: [SalesforceAccountShare!]! + + """List of Account Share edges""" + edges: [SalesforceAccountShareEdge!]! +} + +"""Field that Stamps can be sorted by""" +enum SalesforceStampSortByFieldEnum { + ID + IS_DELETED + PARENT_ID + MASTER_LABEL + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + DESCRIPTION +} + +"""An edge in a connection.""" +type SalesforceStampEdge { + """The item at the end of the edge.""" + node: SalesforceStamp! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Stamps connection, for use in pagination.""" +type SalesforceStampsConnection { + """The count of all Stamp you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Stamps""" + nodes: [SalesforceStamp!]! + + """List of Stamp edges""" + edges: [SalesforceStampEdge!]! +} + +""" +A filter to be used against Group object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceGroupConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Group's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Group's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Group's id field""" + id: SalesforceIdFilter + + """Filter by the Group's name field""" + name: SalesforceStringFilter + + """Filter by the Group's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the Group's relatedId field""" + relatedId: SalesforceIdFilter + + """Filter by the Group's type field""" + type: SalesforceStringFilter + + """Filter by the Group's email field""" + email: SalesforceStringFilter + + """Filter by the Group's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Group's doesSendEmailToMembers field""" + doesSendEmailToMembers: SalesforceBooleanFilter + + """Filter by the Group's doesIncludeBosses field""" + doesIncludeBosses: SalesforceBooleanFilter + + """Filter by the Group's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Group's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Group's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Group's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Group's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceGroupConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceGroupConnectionFilter!] +} + +"""Field that Groups can be sorted by""" +enum SalesforceGroupSortByFieldEnum { + ID + NAME + DEVELOPER_NAME + RELATED_ID + TYPE + EMAIL + OWNER_ID + DOES_SEND_EMAIL_TO_MEMBERS + DOES_INCLUDE_BOSSES + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceGroupEdge { + """The item at the end of the edge.""" + node: SalesforceGroup! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Groups connection, for use in pagination.""" +type SalesforceGroupsConnection { + """The count of all Group you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Groups""" + nodes: [SalesforceGroup!]! + + """List of Group edges""" + edges: [SalesforceGroupEdge!]! +} + +"""An edge in a connection.""" +type SalesforceContentDocumentLinkEdge { + """The item at the end of the edge.""" + node: SalesforceContentDocumentLink! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against TopicUserEvent object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTopicUserEventConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the TopicUserEvent's topic relation.""" + topic: SalesforceTopicConnectionFilter + + """Filter by the TopicUserEvent's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the TopicUserEvent's id field""" + id: SalesforceIdFilter + + """Filter by the TopicUserEvent's userId field""" + userId: SalesforceIdFilter + + """Filter by the TopicUserEvent's topicId field""" + topicId: SalesforceIdFilter + + """Filter by the TopicUserEvent's actionEnum field""" + actionEnum: SalesforceStringFilter + + """Filter by the TopicUserEvent's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTopicUserEventConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTopicUserEventConnectionFilter!] +} + +"""Field that Topic User Events can be sorted by""" +enum SalesforceTopicUserEventSortByFieldEnum { + ID + USER_ID + TOPIC_ID + ACTION_ENUM + CREATED_DATE +} + +"""An edge in a connection.""" +type SalesforceTopicUserEventEdge { + """The item at the end of the edge.""" + node: SalesforceTopicUserEvent! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Topic User Events connection, for use in pagination.""" +type SalesforceTopicUserEventsConnection { + """The count of all Topic User Event you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Topic User Events""" + nodes: [SalesforceTopicUserEvent!]! + + """List of Topic User Event edges""" + edges: [SalesforceTopicUserEventEdge!]! +} + +""" +A filter to be used against KnowledgeableUser object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceKnowledgeableUserConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the KnowledgeableUser's topic relation.""" + topic: SalesforceTopicConnectionFilter + + """Filter by the KnowledgeableUser's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the KnowledgeableUser's id field""" + id: SalesforceIdFilter + + """Filter by the KnowledgeableUser's userId field""" + userId: SalesforceIdFilter + + """Filter by the KnowledgeableUser's topicId field""" + topicId: SalesforceIdFilter + + """Filter by the KnowledgeableUser's rawRank field""" + rawRank: SalesforceIntFilter + + """Filter by the KnowledgeableUser's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceKnowledgeableUserConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceKnowledgeableUserConnectionFilter!] +} + +"""Field that Knowledgeable Users can be sorted by""" +enum SalesforceKnowledgeableUserSortByFieldEnum { + ID + USER_ID + TOPIC_ID + RAW_RANK + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceKnowledgeableUserEdge { + """The item at the end of the edge.""" + node: SalesforceKnowledgeableUser! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Knowledgeable Users connection, for use in pagination.""" +type SalesforceKnowledgeableUsersConnection { + """The count of all Knowledgeable User you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Knowledgeable Users""" + nodes: [SalesforceKnowledgeableUser!]! + + """List of Knowledgeable User edges""" + edges: [SalesforceKnowledgeableUserEdge!]! +} + +"""An edge in a connection.""" +type SalesforceContentVersionEdge { + """The item at the end of the edge.""" + node: SalesforceContentVersion! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against UserFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the UserFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the UserFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserFeed's parent relation.""" + parent: SalesforceUserConnectionFilter + + """Filter by the UserFeed's id field""" + id: SalesforceIdFilter + + """Filter by the UserFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the UserFeed's type field""" + type: SalesforceStringFilter + + """Filter by the UserFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UserFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the UserFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the UserFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserFeedConnectionFilter!] +} + +"""Field that User Feeds can be sorted by""" +enum SalesforceUserFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceUserFeedEdge { + """The item at the end of the edge.""" + node: SalesforceUserFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce User Feeds connection, for use in pagination.""" +type SalesforceUserFeedsConnection { + """The count of all User Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Feeds""" + nodes: [SalesforceUserFeed!]! + + """List of User Feed edges""" + edges: [SalesforceUserFeedEdge!]! +} + +""" +A filter to be used against TopicFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTopicFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the TopicFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the TopicFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the TopicFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the TopicFeed's parent relation.""" + parent: SalesforceTopicConnectionFilter + + """Filter by the TopicFeed's id field""" + id: SalesforceIdFilter + + """Filter by the TopicFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the TopicFeed's type field""" + type: SalesforceStringFilter + + """Filter by the TopicFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the TopicFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the TopicFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the TopicFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the TopicFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the TopicFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the TopicFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the TopicFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTopicFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTopicFeedConnectionFilter!] +} + +"""Field that Topic Feeds can be sorted by""" +enum SalesforceTopicFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceTopicFeedEdge { + """The item at the end of the edge.""" + node: SalesforceTopicFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Topic Feeds connection, for use in pagination.""" +type SalesforceTopicFeedsConnection { + """The count of all Topic Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Topic Feeds""" + nodes: [SalesforceTopicFeed!]! + + """List of Topic Feed edges""" + edges: [SalesforceTopicFeedEdge!]! +} + +""" +A filter to be used against LeadFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceLeadFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the LeadFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the LeadFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the LeadFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the LeadFeed's parent relation.""" + parent: SalesforceLeadConnectionFilter + + """Filter by the LeadFeed's id field""" + id: SalesforceIdFilter + + """Filter by the LeadFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the LeadFeed's type field""" + type: SalesforceStringFilter + + """Filter by the LeadFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the LeadFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the LeadFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the LeadFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the LeadFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the LeadFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the LeadFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the LeadFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceLeadFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceLeadFeedConnectionFilter!] +} + +"""Field that Lead Feeds can be sorted by""" +enum SalesforceLeadFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceLeadFeedEdge { + """The item at the end of the edge.""" + node: SalesforceLeadFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Lead Feeds connection, for use in pagination.""" +type SalesforceLeadFeedsConnection { + """The count of all Lead Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Lead Feeds""" + nodes: [SalesforceLeadFeed!]! + + """List of Lead Feed edges""" + edges: [SalesforceLeadFeedEdge!]! +} + +""" +A filter to be used against ContentVersionRating object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentVersionRatingConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentVersionRating's contentVersion relation.""" + contentVersion: SalesforceContentVersionConnectionFilter + + """Filter by the ContentVersionRating's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the ContentVersionRating's id field""" + id: SalesforceIdFilter + + """Filter by the ContentVersionRating's userId field""" + userId: SalesforceIdFilter + + """Filter by the ContentVersionRating's contentVersionId field""" + contentVersionId: SalesforceIdFilter + + """Filter by the ContentVersionRating's rating field""" + rating: SalesforceIntFilter + + """Filter by the ContentVersionRating's userComment field""" + userComment: SalesforceStringFilter + + """Filter by the ContentVersionRating's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentVersionRatingConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentVersionRatingConnectionFilter!] +} + +"""Field that Content Version Ratings can be sorted by""" +enum SalesforceContentVersionRatingSortByFieldEnum { + ID + USER_ID + CONTENT_VERSION_ID + RATING + USER_COMMENT + LAST_MODIFIED_DATE +} + +"""An edge in a connection.""" +type SalesforceContentVersionRatingEdge { + """The item at the end of the edge.""" + node: SalesforceContentVersionRating! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Content Version Ratings connection, for use in pagination.""" +type SalesforceContentVersionRatingsConnection { + """ + The count of all Content Version Rating you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Version Ratings""" + nodes: [SalesforceContentVersionRating!]! + + """List of Content Version Rating edges""" + edges: [SalesforceContentVersionRatingEdge!]! +} + +""" +A filter to be used against ContentVersionHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentVersionHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentVersionHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentVersionHistory's contentVersion relation.""" + contentVersion: SalesforceContentVersionConnectionFilter + + """Filter by the ContentVersionHistory's id field""" + id: SalesforceIdFilter + + """Filter by the ContentVersionHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentVersionHistory's contentVersionId field""" + contentVersionId: SalesforceIdFilter + + """Filter by the ContentVersionHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentVersionHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentVersionHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentVersionHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentVersionHistoryConnectionFilter!] +} + +"""Field that Content Version Histories can be sorted by""" +enum SalesforceContentVersionHistorySortByFieldEnum { + ID + IS_DELETED + CONTENT_VERSION_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceContentVersionHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceContentVersionHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Content Version Histories connection, for use in pagination. +""" +type SalesforceContentVersionHistorysConnection { + """ + The count of all Content Version History you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Version Histories""" + nodes: [SalesforceContentVersionHistory!]! + + """List of Content Version History edges""" + edges: [SalesforceContentVersionHistoryEdge!]! +} + +""" +A filter to be used against ContactFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContactFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContactFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the ContactFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the ContactFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContactFeed's parent relation.""" + parent: SalesforceContactConnectionFilter + + """Filter by the ContactFeed's id field""" + id: SalesforceIdFilter + + """Filter by the ContactFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the ContactFeed's type field""" + type: SalesforceStringFilter + + """Filter by the ContactFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContactFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContactFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContactFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContactFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContactFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the ContactFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the ContactFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContactFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContactFeedConnectionFilter!] +} + +"""Field that Contact Feeds can be sorted by""" +enum SalesforceContactFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceContactFeedEdge { + """The item at the end of the edge.""" + node: SalesforceContactFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Contact Feeds connection, for use in pagination.""" +type SalesforceContactFeedsConnection { + """The count of all Contact Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Contact Feeds""" + nodes: [SalesforceContactFeed!]! + + """List of Contact Feed edges""" + edges: [SalesforceContactFeedEdge!]! +} + +""" +A filter to be used against CaseFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the CaseFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the CaseFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CaseFeed's parent relation.""" + parent: SalesforceCaseConnectionFilter + + """Filter by the CaseFeed's id field""" + id: SalesforceIdFilter + + """Filter by the CaseFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the CaseFeed's type field""" + type: SalesforceStringFilter + + """Filter by the CaseFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CaseFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CaseFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CaseFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CaseFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CaseFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the CaseFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the CaseFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseFeedConnectionFilter!] +} + +"""Field that Case Feeds can be sorted by""" +enum SalesforceCaseFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceCaseFeedEdge { + """The item at the end of the edge.""" + node: SalesforceCaseFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Case Feeds connection, for use in pagination.""" +type SalesforceCaseFeedsConnection { + """The count of all Case Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Case Feeds""" + nodes: [SalesforceCaseFeed!]! + + """List of Case Feed edges""" + edges: [SalesforceCaseFeedEdge!]! +} + +""" +A filter to be used against AccountFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAccountFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AccountFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the AccountFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the AccountFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AccountFeed's parent relation.""" + parent: SalesforceAccountConnectionFilter + + """Filter by the AccountFeed's id field""" + id: SalesforceIdFilter + + """Filter by the AccountFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the AccountFeed's type field""" + type: SalesforceStringFilter + + """Filter by the AccountFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AccountFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AccountFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AccountFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AccountFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AccountFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the AccountFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the AccountFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAccountFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAccountFeedConnectionFilter!] +} + +"""Field that Account Feeds can be sorted by""" +enum SalesforceAccountFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceAccountFeedEdge { + """The item at the end of the edge.""" + node: SalesforceAccountFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Account Feeds connection, for use in pagination.""" +type SalesforceAccountFeedsConnection { + """The count of all Account Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Account Feeds""" + nodes: [SalesforceAccountFeed!]! + + """List of Account Feed edges""" + edges: [SalesforceAccountFeedEdge!]! +} + +"""Content Body""" +type SalesforceContentBody { + """Content Body ID""" + id: String! + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! +} + +""" +A filter to be used against ContentVersionComment object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentVersionCommentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentVersionComment's contentVersion relation.""" + contentVersion: SalesforceContentVersionConnectionFilter + + """Filter by the ContentVersionComment's contentDocument relation.""" + contentDocument: SalesforceContentDocumentConnectionFilter + + """Filter by the ContentVersionComment's id field""" + id: SalesforceIdFilter + + """Filter by the ContentVersionComment's contentDocumentId field""" + contentDocumentId: SalesforceIdFilter + + """Filter by the ContentVersionComment's contentVersionId field""" + contentVersionId: SalesforceIdFilter + + """Filter by the ContentVersionComment's userComment field""" + userComment: SalesforceStringFilter + + """Filter by the ContentVersionComment's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentVersionCommentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentVersionCommentConnectionFilter!] +} + +"""Field that Content Version Comments can be sorted by""" +enum SalesforceContentVersionCommentSortByFieldEnum { + ID + CONTENT_DOCUMENT_ID + CONTENT_VERSION_ID + USER_COMMENT + CREATED_DATE +} + +"""An edge in a connection.""" +type SalesforceContentVersionCommentEdge { + """The item at the end of the edge.""" + node: SalesforceContentVersionComment! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Content Version Comments connection, for use in pagination.""" +type SalesforceContentVersionCommentsConnection { + """ + The count of all Content Version Comment you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Version Comments""" + nodes: [SalesforceContentVersionComment!]! + + """List of Content Version Comment edges""" + edges: [SalesforceContentVersionCommentEdge!]! +} + +""" +A filter to be used against ContentDocumentSubscription object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentDocumentSubscriptionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentDocumentSubscription's contentDocument relation.""" + contentDocument: SalesforceContentDocumentConnectionFilter + + """Filter by the ContentDocumentSubscription's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the ContentDocumentSubscription's id field""" + id: SalesforceIdFilter + + """Filter by the ContentDocumentSubscription's userId field""" + userId: SalesforceIdFilter + + """Filter by the ContentDocumentSubscription's contentDocumentId field""" + contentDocumentId: SalesforceIdFilter + + """Filter by the ContentDocumentSubscription's isCommentSub field""" + isCommentSub: SalesforceBooleanFilter + + """Filter by the ContentDocumentSubscription's isDocumentSub field""" + isDocumentSub: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentDocumentSubscriptionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentDocumentSubscriptionConnectionFilter!] +} + +"""Field that Content Document Subscriptions can be sorted by""" +enum SalesforceContentDocumentSubscriptionSortByFieldEnum { + ID + USER_ID + CONTENT_DOCUMENT_ID + IS_COMMENT_SUB + IS_DOCUMENT_SUB +} + +"""An edge in a connection.""" +type SalesforceContentDocumentSubscriptionEdge { + """The item at the end of the edge.""" + node: SalesforceContentDocumentSubscription! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Content Document Subscriptions connection, for use in pagination. +""" +type SalesforceContentDocumentSubscriptionsConnection { + """ + The count of all Content Document Subscription you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Document Subscriptions""" + nodes: [SalesforceContentDocumentSubscription!]! + + """List of Content Document Subscription edges""" + edges: [SalesforceContentDocumentSubscriptionEdge!]! +} + +""" +A filter to be used against ContentDocumentHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentDocumentHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentDocumentHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentDocumentHistory's contentDocument relation.""" + contentDocument: SalesforceContentDocumentConnectionFilter + + """Filter by the ContentDocumentHistory's id field""" + id: SalesforceIdFilter + + """Filter by the ContentDocumentHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentDocumentHistory's contentDocumentId field""" + contentDocumentId: SalesforceIdFilter + + """Filter by the ContentDocumentHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentDocumentHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentDocumentHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentDocumentHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentDocumentHistoryConnectionFilter!] +} + +"""Field that Content Document Histories can be sorted by""" +enum SalesforceContentDocumentHistorySortByFieldEnum { + ID + IS_DELETED + CONTENT_DOCUMENT_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceContentDocumentHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceContentDocumentHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Content Document Histories connection, for use in pagination. +""" +type SalesforceContentDocumentHistorysConnection { + """ + The count of all Content Document History you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Document Histories""" + nodes: [SalesforceContentDocumentHistory!]! + + """List of Content Document History edges""" + edges: [SalesforceContentDocumentHistoryEdge!]! +} + +""" +A filter to be used against ContentDocumentFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentDocumentFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentDocumentFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the ContentDocumentFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the ContentDocumentFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentDocumentFeed's parent relation.""" + parent: SalesforceContentDocumentConnectionFilter + + """Filter by the ContentDocumentFeed's id field""" + id: SalesforceIdFilter + + """Filter by the ContentDocumentFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the ContentDocumentFeed's type field""" + type: SalesforceStringFilter + + """Filter by the ContentDocumentFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentDocumentFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentDocumentFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentDocumentFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContentDocumentFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentDocumentFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the ContentDocumentFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the ContentDocumentFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentDocumentFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentDocumentFeedConnectionFilter!] +} + +"""Field that ContentDocument Feeds can be sorted by""" +enum SalesforceContentDocumentFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceContentDocumentFeedEdge { + """The item at the end of the edge.""" + node: SalesforceContentDocumentFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce ContentDocument Feeds connection, for use in pagination.""" +type SalesforceContentDocumentFeedsConnection { + """ + The count of all ContentDocument Feed you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce ContentDocument Feeds""" + nodes: [SalesforceContentDocumentFeed!]! + + """List of ContentDocument Feed edges""" + edges: [SalesforceContentDocumentFeedEdge!]! +} + +"""Field that Asset Files can be sorted by""" +enum SalesforceContentAssetSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + CONTENT_DOCUMENT_ID + IS_VISIBLE_BY_EXTERNAL_USERS +} + +"""An edge in a connection.""" +type SalesforceContentAssetEdge { + """The item at the end of the edge.""" + node: SalesforceContentAsset! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Asset Files connection, for use in pagination.""" +type SalesforceContentAssetsConnection { + """The count of all Asset File you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Asset Files""" + nodes: [SalesforceContentAsset!]! + + """List of Asset File edges""" + edges: [SalesforceContentAssetEdge!]! +} + +""" +A filter to be used against ContentWorkspaceSubscription object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentWorkspaceSubscriptionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """ + Filter by the ContentWorkspaceSubscription's contentWorkspace relation. + """ + contentWorkspace: SalesforceContentWorkspaceConnectionFilter + + """Filter by the ContentWorkspaceSubscription's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the ContentWorkspaceSubscription's id field""" + id: SalesforceIdFilter + + """Filter by the ContentWorkspaceSubscription's userId field""" + userId: SalesforceIdFilter + + """Filter by the ContentWorkspaceSubscription's contentWorkspaceId field""" + contentWorkspaceId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentWorkspaceSubscriptionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentWorkspaceSubscriptionConnectionFilter!] +} + +"""Field that Content Workspace Subscriptions can be sorted by""" +enum SalesforceContentWorkspaceSubscriptionSortByFieldEnum { + ID + USER_ID + CONTENT_WORKSPACE_ID +} + +"""An edge in a connection.""" +type SalesforceContentWorkspaceSubscriptionEdge { + """The item at the end of the edge.""" + node: SalesforceContentWorkspaceSubscription! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Content Workspace Subscriptions connection, for use in pagination. +""" +type SalesforceContentWorkspaceSubscriptionsConnection { + """ + The count of all Content Workspace Subscription you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Workspace Subscriptions""" + nodes: [SalesforceContentWorkspaceSubscription!]! + + """List of Content Workspace Subscription edges""" + edges: [SalesforceContentWorkspaceSubscriptionEdge!]! +} + +""" +A filter to be used against ContentWorkspaceDoc object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentWorkspaceDocConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentWorkspaceDoc's contentDocument relation.""" + contentDocument: SalesforceContentDocumentConnectionFilter + + """Filter by the ContentWorkspaceDoc's contentWorkspace relation.""" + contentWorkspace: SalesforceContentWorkspaceConnectionFilter + + """Filter by the ContentWorkspaceDoc's id field""" + id: SalesforceIdFilter + + """Filter by the ContentWorkspaceDoc's contentWorkspaceId field""" + contentWorkspaceId: SalesforceIdFilter + + """Filter by the ContentWorkspaceDoc's contentDocumentId field""" + contentDocumentId: SalesforceIdFilter + + """Filter by the ContentWorkspaceDoc's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentWorkspaceDoc's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentWorkspaceDoc's isOwner field""" + isOwner: SalesforceBooleanFilter + + """Filter by the ContentWorkspaceDoc's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentWorkspaceDocConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentWorkspaceDocConnectionFilter!] +} + +"""Field that Library Documents can be sorted by""" +enum SalesforceContentWorkspaceDocSortByFieldEnum { + ID + CONTENT_WORKSPACE_ID + CONTENT_DOCUMENT_ID + CREATED_DATE + SYSTEM_MODSTAMP + IS_OWNER + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceContentWorkspaceDocEdge { + """The item at the end of the edge.""" + node: SalesforceContentWorkspaceDoc! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Library Documents connection, for use in pagination.""" +type SalesforceContentWorkspaceDocsConnection { + """The count of all Library Document you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Library Documents""" + nodes: [SalesforceContentWorkspaceDoc!]! + + """List of Library Document edges""" + edges: [SalesforceContentWorkspaceDocEdge!]! +} + +union SalesforceStreamingChannelShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Streaming Channel Share""" +type SalesforceStreamingChannelShare implements OneGraphNode { + """Custom Object Share ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceStreamingChannel! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceStreamingChannelShareUserOrGroupUnion! + + """Custom Object Access""" + accessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Case Comment""" +type SalesforceCaseComment implements OneGraphNode { + """Linked Github IssueComment""" + gitHubIssueComment: GitHubIssueComment + + """Case Comment ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceCase! + + """Published""" + isPublished: Boolean! + + """Body""" + commentBody: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content User Subscription""" +type SalesforceContentUserSubscription implements OneGraphNode { + """ContentUserSubscription ID""" + id: String! + + """User ID""" + subscriberUserId: String! + + """User ID""" + subscriberUser: SalesforceUser! + + """User ID""" + subscribedToUserId: String! + + """User ID""" + subscribedToUser: SalesforceUser! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Visualforce Component""" +type SalesforceApexComponent implements OneGraphNode { + """Component ID""" + id: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Name""" + name: String! + + """Api Version""" + apiVersion: Float! + + """Label""" + masterLabel: String! + + """Description""" + description: String + + """Controller Type""" + controllerType: String! + + """Controller Key""" + controllerKey: String + + """Markup""" + markup: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceMacroShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Macro Share""" +type SalesforceMacroShare implements OneGraphNode { + """Custom Object Share ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceMacro! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceMacroShareUserOrGroupUnion! + + """Custom Object Access""" + accessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""User Login""" +type SalesforceUserLogin implements OneGraphNode { + """User Login ID""" + id: String! + + """User ID""" + userId: String + + """User ID""" + user: SalesforceUser + + """Is Frozen""" + isFrozen: Boolean! + + """Is Password Locked""" + isPasswordLocked: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Apex Trigger""" +type SalesforceApexTrigger implements OneGraphNode { + """Trigger ID""" + id: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Name""" + name: String! + + """Custom Object Definition ID""" + tableEnumOrId: String + + """BeforeInsert""" + usageBeforeInsert: Boolean! + + """AfterInsert""" + usageAfterInsert: Boolean! + + """BeforeUpdate""" + usageBeforeUpdate: Boolean! + + """AfterUpdate""" + usageAfterUpdate: Boolean! + + """BeforeDelete""" + usageBeforeDelete: Boolean! + + """AfterDelete""" + usageAfterDelete: Boolean! + + """IsBulk""" + usageIsBulk: Boolean! + + """AfterUndelete""" + usageAfterUndelete: Boolean! + + """Api Version""" + apiVersion: Float! + + """Status""" + status: String! + + """Is Valid""" + isValid: Boolean! + + """Body CRC""" + bodyCrc: Float + + """Body""" + body: String + + """Size Without Comments""" + lengthWithoutComments: Int! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceAccountShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Account Share""" +type SalesforceAccountShare implements OneGraphNode { + """Account Share ID""" + id: String! + + """Account ID""" + accountId: String! + + """Account ID""" + account: SalesforceAccount! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceAccountShareUserOrGroupUnion! + + """Account Access""" + accountAccessLevel: String! + + """Opportunity Access""" + opportunityAccessLevel: String! + + """Case Access""" + caseAccessLevel: String! + + """Contact Access""" + contactAccessLevel: String + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceUserAppMenuCustomizationShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""UserAppMenuCustomization Share""" +type SalesforceUserAppMenuCustomizationShare implements OneGraphNode { + """Custom Object Share ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceUserAppMenuCustomization! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceUserAppMenuCustomizationShareUserOrGroupUnion! + + """Custom Object Access""" + accessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""AppMenuItem""" +type SalesforceAppMenuItem implements OneGraphNode { + """AppMenuItem ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Sort Order""" + sortOrder: Int! + + """Developer Name""" + name: String + + """Namespace Prefix""" + namespacePrefix: String + + """Label""" + label: String + + """Description""" + description: String + + """Start Url""" + startUrl: String + + """Mobile Start Url""" + mobileStartUrl: String + + """Logo Image URL""" + logoUrl: String + + """Icon Url""" + iconUrl: String + + """Info URL""" + infoUrl: String + + """IsUsingAdminAuthorization""" + isUsingAdminAuthorization: Boolean! + + """Mobile device OS platform""" + mobilePlatform: String + + """Minimum required mobile device OS version""" + mobileMinOsVer: String + + """Type of mobile device""" + mobileDeviceType: String + + """App requires a registered mobile device""" + isRegisteredDeviceOnly: Boolean! + + """Version of the mobile app""" + mobileAppVer: String + + """Date the mobile app was most recently installed""" + mobileAppInstalledDate: String + + """Most recently installed version of the mobile app""" + mobileAppInstalledVersion: String + + """ID for the related mobile app binary""" + mobileAppBinaryId: String + + """URL to install the mobile app""" + mobileAppInstallUrl: String + + """Is this a canvas-enabled application""" + canvasEnabled: Boolean! + + """The identifier used to render the canvas application.""" + canvasReferenceId: String + + """The canvas url for the canvas application""" + canvasUrl: String + + """The configured access method for the canvas application""" + canvasAccessMethod: String + + """The selected/supported locations of the canvas application""" + canvasSelectedLocations: String + + """The options to hide publisher header or publisher share button""" + canvasOptions: String + + """App Type""" + type: String + + """Application ID""" + applicationId: String + + """User Sort Order""" + userSortOrder: Int + + """Is Visible""" + isVisible: Boolean! + + """Is Accessible""" + isAccessible: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceUserProvisioningRequestShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""User Provisioning Request Share""" +type SalesforceUserProvisioningRequestShare implements OneGraphNode { + """Custom Object Share ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceUserProvisioningRequest! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceUserProvisioningRequestShareUserOrGroupUnion! + + """Custom Object Access""" + accessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Apex Email Notification""" +type SalesforceApexEmailNotification implements OneGraphNode { + """ApexEmailNotification ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """User ID""" + userId: String + + """User ID""" + user: SalesforceUser + + """email""" + email: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Contact History""" +type SalesforceContactHistory implements OneGraphNode { + """Contact History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Contact ID""" + contactId: String! + + """Contact ID""" + contact: SalesforceContact! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content Version History""" +type SalesforceContentVersionHistory implements OneGraphNode { + """Content Version ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """ContentVersion ID""" + contentVersionId: String! + + """ContentVersion ID""" + contentVersion: SalesforceContentVersion! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Assignment Rule""" +type SalesforceAssignmentRule implements OneGraphNode { + """Rule ID""" + id: String! + + """Name""" + name: String + + """SObject Type""" + sobjectType: String + + """Active""" + active: Boolean! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFlowInterviewShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Flow Interview Share""" +type SalesforceFlowInterviewShare implements OneGraphNode { + """Custom Object Share ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceFlowInterview! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceFlowInterviewShareUserOrGroupUnion! + + """Custom Object Access""" + accessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceOrgDeleteRequestShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Org Delete Request Share""" +type SalesforceOrgDeleteRequestShare implements OneGraphNode { + """Custom Object Share ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceOrgDeleteRequest! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceOrgDeleteRequestShareUserOrGroupUnion! + + """Custom Object Access""" + accessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceQuickTextShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Quick Text Share""" +type SalesforceQuickTextShare implements OneGraphNode { + """Custom Object Share ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceQuickText! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceQuickTextShareUserOrGroupUnion! + + """Custom Object Access""" + accessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Lead Status Value""" +type SalesforceLeadStatus implements OneGraphNode { + """Lead Status Value ID""" + id: String! + + """Master Label""" + masterLabel: String + + """Api Name""" + apiName: String! + + """Sort Order""" + sortOrder: Int + + """Is Default""" + isDefault: Boolean! + + """Is Converted""" + isConverted: Boolean! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Organization-wide From Email Address""" +type SalesforceOrgWideEmailAddress implements OneGraphNode { + """Organization-wide From Email Address ID""" + id: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Email Address""" + address: String! + + """Display Name""" + displayName: String! + + """Allow All Profiles""" + isAllowAllProfiles: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Knowledgeable User""" +type SalesforceKnowledgeableUser implements OneGraphNode { + """Knowledgeable User ID""" + id: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Topic ID""" + topicId: String! + + """Topic ID""" + topic: SalesforceTopic! + + """Rank""" + rawRank: Int + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Setup Audit Trail Entry""" +type SalesforceSetupAuditTrail implements OneGraphNode { + """Setup Audit Trail ID""" + id: String! + + """Action""" + action: String! + + """Section""" + section: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Display""" + display: String + + """Delegate User""" + delegateUser: String + + """Source Namespace Prefix""" + responsibleNamespacePrefix: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content Security Policy Trusted Site""" +type SalesforceCspTrustedSite implements OneGraphNode { + """Trusted Site ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Trusted Site Name""" + developerName: String! + + """Master Language""" + language: String + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Trusted Site URL""" + endpointUrl: String! + + """Description""" + description: String + + """Active""" + isActive: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content Tag Subscription""" +type SalesforceContentTagSubscription implements OneGraphNode { + """ContentTagSubscription ID""" + id: String! + + """User ID""" + userId: String + + """User ID""" + user: SalesforceUser + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Business Hours""" +type SalesforceBusinessHours implements OneGraphNode { + """Business Hours ID""" + id: String! + + """Business Hours Name""" + name: String! + + """Active""" + isActive: Boolean! + + """Default Business Hours""" + isDefault: Boolean! + + """Sunday Start""" + sundayStartTime: String + + """Sunday End""" + sundayEndTime: String + + """Monday Start""" + mondayStartTime: String + + """Monday End""" + mondayEndTime: String + + """Tuesday Start""" + tuesdayStartTime: String + + """Tuesday End""" + tuesdayEndTime: String + + """Wednesday Start""" + wednesdayStartTime: String + + """Wednesday End""" + wednesdayEndTime: String + + """Thursday Start""" + thursdayStartTime: String + + """Thursday End""" + thursdayEndTime: String + + """Friday Start""" + fridayStartTime: String + + """Friday End""" + fridayEndTime: String + + """Saturday Start""" + saturdayStartTime: String + + """Saturday End""" + saturdayEndTime: String + + """Time Zone""" + timeZoneSidKey: String! + + """System Modstamp""" + systemModstamp: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Viewed Date""" + lastViewedDate: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Topic User Event""" +type SalesforceTopicUserEvent implements OneGraphNode { + """Event ID""" + id: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Topic ID""" + topicId: String! + + """Topic ID""" + topic: SalesforceTopic! + + """Action""" + actionEnum: String! + + """Create Date""" + createdDate: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Security Custom Baseline""" +type SalesforceSecurityCustomBaseline implements OneGraphNode { + """Security Custom Baseline ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Baseline""" + baseline: String + + """Is Default Baseline""" + isDefault: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Lead History""" +type SalesforceLeadHistory implements OneGraphNode { + """Lead History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Lead ID""" + leadId: String! + + """Lead ID""" + lead: SalesforceLead! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Task Priority Value""" +type SalesforceTaskPriority implements OneGraphNode { + """Task Priority Value ID""" + id: String! + + """Master Label""" + masterLabel: String + + """Api Name""" + apiName: String! + + """Sort Order""" + sortOrder: Int + + """Is Default""" + isDefault: Boolean! + + """Is High Priority""" + isHighPriority: Boolean! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Queue Sobject""" +type SalesforceQueueSobject implements OneGraphNode { + """Queue Sobject ID""" + id: String! + + """Group ID""" + queueId: String! + + """Group ID""" + queue: SalesforceGroup! + + """Sobject Type""" + sobjectType: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against AdditionalNumber object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAdditionalNumberConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AdditionalNumber's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AdditionalNumber's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AdditionalNumber's callCenter relation.""" + callCenter: SalesforceCallCenterConnectionFilter + + """Filter by the AdditionalNumber's id field""" + id: SalesforceIdFilter + + """Filter by the AdditionalNumber's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AdditionalNumber's callCenterId field""" + callCenterId: SalesforceIdFilter + + """Filter by the AdditionalNumber's name field""" + name: SalesforceStringFilter + + """Filter by the AdditionalNumber's description field""" + description: SalesforceStringFilter + + """Filter by the AdditionalNumber's phone field""" + phone: SalesforceStringFilter + + """Filter by the AdditionalNumber's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AdditionalNumber's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AdditionalNumber's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AdditionalNumber's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AdditionalNumber's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAdditionalNumberConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAdditionalNumberConnectionFilter!] +} + +"""Field that Additional Directory Numbers can be sorted by""" +enum SalesforceAdditionalNumberSortByFieldEnum { + ID + IS_DELETED + CALL_CENTER_ID + NAME + DESCRIPTION + PHONE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceAdditionalNumberEdge { + """The item at the end of the edge.""" + node: SalesforceAdditionalNumber! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Additional Directory Number""" +type SalesforceAdditionalNumber implements OneGraphNode { + """Additional Directory Number ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Call Center ID""" + callCenterId: String + + """Call Center ID""" + callCenter: SalesforceCallCenter + + """Name""" + name: String! + + """Description""" + description: String + + """Phone""" + phone: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Additional Directory Numbers connection, for use in pagination. +""" +type SalesforceAdditionalNumbersConnection { + """ + The count of all Additional Directory Number you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Additional Directory Numbers""" + nodes: [SalesforceAdditionalNumber!]! + + """List of Additional Directory Number edges""" + edges: [SalesforceAdditionalNumberEdge!]! +} + +"""Call Center""" +type SalesforceCallCenter implements OneGraphNode { + """Call Center ID""" + id: String! + + """Name""" + name: String! + + """Internal Name""" + internalName: String! + + """Version""" + version: Float + + """CTI Adapter URL""" + adapterUrl: String + + """Custom Settings""" + customSettings: String + + """System Modstamp""" + systemModstamp: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Collection of Salesforce AdditionalNumber""" + additionalNumbers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAdditionalNumberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAdditionalNumberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAdditionalNumberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AdditionalNumbers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAdditionalNumbersConnection + + """Collection of Salesforce User""" + users( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Users to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUsersConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceCaseTeamMemberMemberUnion = SalesforceUser | SalesforceContact + +"""Case Team Member""" +type SalesforceCaseTeamMember implements OneGraphNode { + """Team Member Id""" + id: String! + + """Case ID""" + parentId: String! + + """Case ID""" + parent: SalesforceCase! + + """Member ID""" + memberId: String! + + """Member ID""" + member: SalesforceCaseTeamMemberMemberUnion! + + """Team Template Member ID""" + teamTemplateMemberId: String + + """Team Template Member ID""" + teamTemplateMember: SalesforceCaseTeamTemplateMember + + """Team Role ID""" + teamRoleId: String! + + """Team Role ID""" + teamRole: SalesforceCaseTeamRole! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Mail Merge Template""" +type SalesforceMailmergeTemplate implements OneGraphNode { + """Mail Merge Template ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Description""" + description: String + + """File""" + filename: String! + + """Body Length""" + bodyLength: Int + + """Body""" + body: String! + + """Last Used Date""" + lastUsedDate: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Attachment has been scanned for XSS""" + securityOptionsAttachmentScannedForXss: Boolean! + + """XSS threat was detected in the attachment""" + securityOptionsAttachmentHasXssThreat: Boolean! + + """Attachment has been scanned for Flash Injection""" + securityOptionsAttachmentScannedforFlash: Boolean! + + """Flash Injection was detected in the attachment""" + securityOptionsAttachmentHasFlash: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""User Preference""" +type SalesforceUserPreference implements OneGraphNode { + """User Preference ID""" + id: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Preference""" + preference: String! + + """Value""" + value: String + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Account History""" +type SalesforceAccountHistory implements OneGraphNode { + """Account History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Account ID""" + accountId: String! + + """Account ID""" + account: SalesforceAccount! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Event Log File""" +type SalesforceEventLogFile implements OneGraphNode { + """Event Log File ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Event Type""" + eventType: String! + + """Log Date""" + logDate: String! + + """Log File Length""" + logFileLength: Float! + + """Log File Content Type""" + logFileContentType: String! + + """API Version""" + apiVersion: Float! + + """Sequence""" + sequence: Int! + + """Interval""" + interval: String + + """Log File Field Names""" + logFileFieldNames: String + + """Log File Field Types""" + logFileFieldTypes: String + + """Log File""" + logFile: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""EmailCapture""" +type SalesforceEmailCapture implements OneGraphNode { + """Email Capture ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Active""" + isActive: Boolean! + + """To""" + toPattern: String! + + """From""" + fromPattern: String + + """Sender""" + sender: String + + """Recipient""" + recipient: String + + """Capture Date""" + captureDate: String + + """Raw Message Length""" + rawMessageLength: Int + + """Raw Message""" + rawMessage: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Opportunity Stage""" +type SalesforceOpportunityStage implements OneGraphNode { + """Opportunity Stage ID""" + id: String! + + """Master Label""" + masterLabel: String + + """Api Name""" + apiName: String! + + """Is Active""" + isActive: Boolean! + + """Sort Order""" + sortOrder: Int + + """Closed""" + isClosed: Boolean! + + """Won""" + isWon: Boolean! + + """Forecast Category""" + forecastCategory: String! + + """Forecast Category Name""" + forecastCategoryName: String! + + """Probability (%)""" + defaultProbability: Float + + """Description""" + description: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against ActionLinkGroupTemplate object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceActionLinkGroupTemplateConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ActionLinkGroupTemplate's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ActionLinkGroupTemplate's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ActionLinkGroupTemplate's id field""" + id: SalesforceIdFilter + + """Filter by the ActionLinkGroupTemplate's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ActionLinkGroupTemplate's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the ActionLinkGroupTemplate's language field""" + language: SalesforceStringFilter + + """Filter by the ActionLinkGroupTemplate's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the ActionLinkGroupTemplate's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the ActionLinkGroupTemplate's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ActionLinkGroupTemplate's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ActionLinkGroupTemplate's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ActionLinkGroupTemplate's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ActionLinkGroupTemplate's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ActionLinkGroupTemplate's executionsAllowed field""" + executionsAllowed: SalesforceStringFilter + + """Filter by the ActionLinkGroupTemplate's hoursUntilExpiration field""" + hoursUntilExpiration: SalesforceIntFilter + + """Filter by the ActionLinkGroupTemplate's category field""" + category: SalesforceStringFilter + + """Filter by the ActionLinkGroupTemplate's isPublished field""" + isPublished: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceActionLinkGroupTemplateConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceActionLinkGroupTemplateConnectionFilter!] +} + +""" +A filter to be used against ActionLinkTemplate object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceActionLinkTemplateConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ActionLinkTemplate's actionLinkGroupTemplate relation.""" + actionLinkGroupTemplate: SalesforceActionLinkGroupTemplateConnectionFilter + + """Filter by the ActionLinkTemplate's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ActionLinkTemplate's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ActionLinkTemplate's id field""" + id: SalesforceIdFilter + + """Filter by the ActionLinkTemplate's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ActionLinkTemplate's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ActionLinkTemplate's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ActionLinkTemplate's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ActionLinkTemplate's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ActionLinkTemplate's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ActionLinkTemplate's actionLinkGroupTemplateId field""" + actionLinkGroupTemplateId: SalesforceIdFilter + + """Filter by the ActionLinkTemplate's labelKey field""" + labelKey: SalesforceStringFilter + + """Filter by the ActionLinkTemplate's method field""" + method: SalesforceStringFilter + + """Filter by the ActionLinkTemplate's linkType field""" + linkType: SalesforceStringFilter + + """Filter by the ActionLinkTemplate's position field""" + position: SalesforceIntFilter + + """Filter by the ActionLinkTemplate's isConfirmationRequired field""" + isConfirmationRequired: SalesforceBooleanFilter + + """Filter by the ActionLinkTemplate's isGroupDefault field""" + isGroupDefault: SalesforceBooleanFilter + + """Filter by the ActionLinkTemplate's userVisibility field""" + userVisibility: SalesforceStringFilter + + """Filter by the ActionLinkTemplate's userAlias field""" + userAlias: SalesforceStringFilter + + """Filter by the ActionLinkTemplate's label field""" + label: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceActionLinkTemplateConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceActionLinkTemplateConnectionFilter!] +} + +"""Field that Action Link Templates can be sorted by""" +enum SalesforceActionLinkTemplateSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + ACTION_LINK_GROUP_TEMPLATE_ID + LABEL_KEY + METHOD + LINK_TYPE + POSITION + IS_CONFIRMATION_REQUIRED + IS_GROUP_DEFAULT + USER_VISIBILITY + USER_ALIAS + LABEL +} + +"""An edge in a connection.""" +type SalesforceActionLinkTemplateEdge { + """The item at the end of the edge.""" + node: SalesforceActionLinkTemplate! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Action Link Templates connection, for use in pagination.""" +type SalesforceActionLinkTemplatesConnection { + """ + The count of all Action Link Template you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Action Link Templates""" + nodes: [SalesforceActionLinkTemplate!]! + + """List of Action Link Template edges""" + edges: [SalesforceActionLinkTemplateEdge!]! +} + +"""Action Link Group Template""" +type SalesforceActionLinkGroupTemplate implements OneGraphNode { + """Action Link Group Template ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Developer Name""" + developerName: String! + + """Master Language""" + language: String + + """Name""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Executions Allowed""" + executionsAllowed: String! + + """Hours until Expiration""" + hoursUntilExpiration: Int + + """Category""" + category: String! + + """Published""" + isPublished: Boolean! + + """Collection of Salesforce ActionLinkTemplate""" + actionLinkTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceActionLinkTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceActionLinkTemplateSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceActionLinkTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ActionLinkTemplates to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceActionLinkTemplatesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Action Link Template""" +type SalesforceActionLinkTemplate implements OneGraphNode { + """Action Link Template ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Action Link Group Template ID""" + actionLinkGroupTemplateId: String! + + """Action Link Group Template ID""" + actionLinkGroupTemplate: SalesforceActionLinkGroupTemplate! + + """Label Key""" + labelKey: String! + + """HTTP Method""" + method: String! + + """Action Type""" + linkType: String! + + """Position""" + position: Int! + + """Confirmation Required""" + isConfirmationRequired: Boolean! + + """Default Link in Group""" + isGroupDefault: Boolean! + + """User Visibility""" + userVisibility: String! + + """Custom User Alias""" + userAlias: String + + """Label""" + label: String + + """Action URL""" + actionUrl: String! + + """HTTP Request Body""" + requestBody: String + + """HTTP Headers""" + headers: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceContactShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Contact Share""" +type SalesforceContactShare implements OneGraphNode { + """Contact Share ID""" + id: String! + + """Contact ID""" + contactId: String! + + """Contact ID""" + contact: SalesforceContact! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceContactShareUserOrGroupUnion! + + """Contact Access""" + contactAccessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceUserShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""User Share""" +type SalesforceUserShare implements OneGraphNode { + """User Share ID""" + id: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceUserShareUserOrGroupUnion! + + """User Access Level""" + userAccessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Active""" + isActive: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against PackageLicense object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePackageLicenseConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the PackageLicense's id field""" + id: SalesforceIdFilter + + """Filter by the PackageLicense's status field""" + status: SalesforceStringFilter + + """Filter by the PackageLicense's isProvisioned field""" + isProvisioned: SalesforceBooleanFilter + + """Filter by the PackageLicense's allowedLicenses field""" + allowedLicenses: SalesforceIntFilter + + """Filter by the PackageLicense's usedLicenses field""" + usedLicenses: SalesforceIntFilter + + """Filter by the PackageLicense's expirationDate field""" + expirationDate: SalesforceDateTimeFilter + + """Filter by the PackageLicense's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the PackageLicense's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the PackageLicense's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the PackageLicense's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePackageLicenseConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePackageLicenseConnectionFilter!] +} + +""" +A filter to be used against UserPackageLicense object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserPackageLicenseConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserPackageLicense's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserPackageLicense's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserPackageLicense's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the UserPackageLicense's packageLicense relation.""" + packageLicense: SalesforcePackageLicenseConnectionFilter + + """Filter by the UserPackageLicense's id field""" + id: SalesforceIdFilter + + """Filter by the UserPackageLicense's packageLicenseId field""" + packageLicenseId: SalesforceIdFilter + + """Filter by the UserPackageLicense's userId field""" + userId: SalesforceIdFilter + + """Filter by the UserPackageLicense's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserPackageLicense's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserPackageLicense's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserPackageLicense's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserPackageLicense's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserPackageLicenseConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserPackageLicenseConnectionFilter!] +} + +"""Field that User Package Licenses can be sorted by""" +enum SalesforceUserPackageLicenseSortByFieldEnum { + ID + PACKAGE_LICENSE_ID + USER_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceUserPackageLicenseEdge { + """The item at the end of the edge.""" + node: SalesforceUserPackageLicense! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce User Package Licenses connection, for use in pagination.""" +type SalesforceUserPackageLicensesConnection { + """ + The count of all User Package License you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Package Licenses""" + nodes: [SalesforceUserPackageLicense!]! + + """List of User Package License edges""" + edges: [SalesforceUserPackageLicenseEdge!]! +} + +"""Package License""" +type SalesforcePackageLicense implements OneGraphNode { + """Package License ID""" + id: String! + + """Status""" + status: String! + + """Is Provisioned""" + isProvisioned: Boolean! + + """Allowed Licenses""" + allowedLicenses: Int! + + """Used Licenses""" + usedLicenses: Int! + + """Expiration Date""" + expirationDate: String + + """Created Date""" + createdDate: String! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Namespace Prefix""" + namespacePrefix: String! + + """Collection of Salesforce UserPackageLicense""" + userPackageLicenses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserPackageLicenseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserPackageLicenseSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserPackageLicenseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserPackageLicenses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserPackageLicensesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""User Package License""" +type SalesforceUserPackageLicense implements OneGraphNode { + """User Package License ID""" + id: String! + + """Package License ID""" + packageLicenseId: String! + + """Package License ID""" + packageLicense: SalesforcePackageLicense! + + """Assigned User ID""" + userId: String! + + """Assigned User ID""" + user: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Partner Role Value""" +type SalesforcePartnerRole implements OneGraphNode { + """Partner Role Value ID""" + id: String! + + """Master Label""" + masterLabel: String + + """Api Name""" + apiName: String! + + """Sort Order""" + sortOrder: Int + + """Reverse Role""" + reverseRole: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Client Browser""" +type SalesforceClientBrowser implements OneGraphNode { + """Client Browser ID""" + id: String! + + """User ID""" + usersId: String! + + """User ID""" + users: SalesforceUser! + + """Full User Agent""" + fullUserAgent: String + + """Proxy Info""" + proxyInfo: String + + """Last Update""" + lastUpdate: String + + """Created Date""" + createdDate: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content Workspace Subscription""" +type SalesforceContentWorkspaceSubscription implements OneGraphNode { + """ContentWorkspaceSubscription ID""" + id: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Workspace ID""" + contentWorkspaceId: String! + + """Workspace ID""" + contentWorkspace: SalesforceContentWorkspace! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Tenant Usage Entitlement""" +type SalesforceTenantUsageEntitlement implements OneGraphNode { + """Tenant Usage Entitlement ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Resource Group Key""" + resourceGroupKey: String! + + """Setting""" + setting: String! + + """Start Date""" + startDate: String! + + """End Date""" + endDate: String + + """Current Amount Allowed""" + currentAmountAllowed: Float! + + """Frequency""" + frequency: String + + """Is Persistent Resource""" + isPersistentResource: Boolean! + + """Has Rollover""" + hasRollover: Boolean! + + """Overage Grace""" + overageGrace: Float + + """Amount Used""" + amountUsed: Float + + """Usage Date""" + usageDate: String + + """Setting Label""" + masterLabel: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content Document History""" +type SalesforceContentDocumentHistory implements OneGraphNode { + """Content Document ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """ContentDocument ID""" + contentDocumentId: String! + + """ContentDocument ID""" + contentDocument: SalesforceContentDocument! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceListEmailShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""List Email Share""" +type SalesforceListEmailShare implements OneGraphNode { + """Custom Object Share ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceListEmail! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceListEmailShareUserOrGroupUnion! + + """Custom Object Access""" + accessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Field that Periods can be sorted by""" +enum SalesforcePeriodSortByFieldEnum { + ID + FISCAL_YEAR_SETTINGS_ID + TYPE + START_DATE + END_DATE + SYSTEM_MODSTAMP + IS_FORECAST_PERIOD + QUARTER_LABEL + PERIOD_LABEL + NUMBER +} + +"""An edge in a connection.""" +type SalesforcePeriodEdge { + """The item at the end of the edge.""" + node: SalesforcePeriod! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Periods connection, for use in pagination.""" +type SalesforcePeriodsConnection { + """The count of all Period you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Periods""" + nodes: [SalesforcePeriod!]! + + """List of Period edges""" + edges: [SalesforcePeriodEdge!]! +} + +""" +A filter to be used against Period object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePeriodConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Period's fiscalYearSettings relation.""" + fiscalYearSettings: SalesforceFiscalYearSettingsConnectionFilter + + """Filter by the Period's id field""" + id: SalesforceIdFilter + + """Filter by the Period's fiscalYearSettingsId field""" + fiscalYearSettingsId: SalesforceIdFilter + + """Filter by the Period's type field""" + type: SalesforceStringFilter + + """Filter by the Period's startDate field""" + startDate: SalesforceDateFilter + + """Filter by the Period's endDate field""" + endDate: SalesforceDateFilter + + """Filter by the Period's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Period's isForecastPeriod field""" + isForecastPeriod: SalesforceBooleanFilter + + """Filter by the Period's quarterLabel field""" + quarterLabel: SalesforceStringFilter + + """Filter by the Period's periodLabel field""" + periodLabel: SalesforceStringFilter + + """Filter by the Period's number field""" + number: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePeriodConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePeriodConnectionFilter!] +} + +""" +A filter to be used against FiscalYearSettings object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFiscalYearSettingsConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FiscalYearSettings's period relation.""" + period: SalesforcePeriodConnectionFilter + + """Filter by the FiscalYearSettings's id field""" + id: SalesforceIdFilter + + """Filter by the FiscalYearSettings's periodId field""" + periodId: SalesforceIdFilter + + """Filter by the FiscalYearSettings's startDate field""" + startDate: SalesforceDateFilter + + """Filter by the FiscalYearSettings's endDate field""" + endDate: SalesforceDateFilter + + """Filter by the FiscalYearSettings's name field""" + name: SalesforceStringFilter + + """Filter by the FiscalYearSettings's isStandardYear field""" + isStandardYear: SalesforceBooleanFilter + + """Filter by the FiscalYearSettings's yearType field""" + yearType: SalesforceStringFilter + + """Filter by the FiscalYearSettings's quarterLabelScheme field""" + quarterLabelScheme: SalesforceStringFilter + + """Filter by the FiscalYearSettings's periodLabelScheme field""" + periodLabelScheme: SalesforceStringFilter + + """Filter by the FiscalYearSettings's weekLabelScheme field""" + weekLabelScheme: SalesforceStringFilter + + """Filter by the FiscalYearSettings's quarterPrefix field""" + quarterPrefix: SalesforceStringFilter + + """Filter by the FiscalYearSettings's periodPrefix field""" + periodPrefix: SalesforceStringFilter + + """Filter by the FiscalYearSettings's weekStartDay field""" + weekStartDay: SalesforceIntFilter + + """Filter by the FiscalYearSettings's description field""" + description: SalesforceStringFilter + + """Filter by the FiscalYearSettings's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFiscalYearSettingsConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFiscalYearSettingsConnectionFilter!] +} + +"""Field that Fiscal Year Settings can be sorted by""" +enum SalesforceFiscalYearSettingsSortByFieldEnum { + ID + PERIOD_ID + START_DATE + END_DATE + NAME + IS_STANDARD_YEAR + YEAR_TYPE + QUARTER_LABEL_SCHEME + PERIOD_LABEL_SCHEME + WEEK_LABEL_SCHEME + QUARTER_PREFIX + PERIOD_PREFIX + WEEK_START_DAY + DESCRIPTION + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceFiscalYearSettingsEdge { + """The item at the end of the edge.""" + node: SalesforceFiscalYearSettings! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Fiscal Year Settings connection, for use in pagination.""" +type SalesforceFiscalYearSettingssConnection { + """ + The count of all Fiscal Year Settings you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Fiscal Year Settings""" + nodes: [SalesforceFiscalYearSettings!]! + + """List of Fiscal Year Settings edges""" + edges: [SalesforceFiscalYearSettingsEdge!]! +} + +"""Period""" +type SalesforcePeriod implements OneGraphNode { + """Period ID""" + id: String! + + """Fiscal Year Settings ID""" + fiscalYearSettingsId: String + + """Fiscal Year Settings ID""" + fiscalYearSettings: SalesforceFiscalYearSettings + + """Type""" + type: String + + """Start Date""" + startDate: String! + + """End Date""" + endDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Is Forecast Period""" + isForecastPeriod: Boolean! + + """Quarter Name""" + quarterLabel: String + + """Period Name""" + periodLabel: String + + """Number""" + number: Int + + """Fully Qualified Label""" + fullyQualifiedLabel: String + + """Collection of Salesforce FiscalYearSettings""" + fiscalYearSettingsPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFiscalYearSettingsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFiscalYearSettingsSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFiscalYearSettingsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FiscalYearSettings to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFiscalYearSettingssConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Fiscal Year Settings""" +type SalesforceFiscalYearSettings implements OneGraphNode { + """Fiscal Year Settings ID""" + id: String! + + """Period ID""" + periodId: String + + """Period ID""" + period: SalesforcePeriod + + """Start Date""" + startDate: String + + """End Date""" + endDate: String + + """Name""" + name: String! + + """Is Standard Year""" + isStandardYear: Boolean! + + """Year Type""" + yearType: String + + """Quarter Name Scheme""" + quarterLabelScheme: String + + """Period Name Scheme""" + periodLabelScheme: String + + """Week Name Scheme""" + weekLabelScheme: String + + """Quarter Prefix""" + quarterPrefix: String + + """Period Prefix""" + periodPrefix: String + + """Week Start Day""" + weekStartDay: Int + + """Description""" + description: String + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce Period""" + periods( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePeriodConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePeriodSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePeriodSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Periods to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePeriodsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceTodayGoalShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Goal Share""" +type SalesforceTodayGoalShare implements OneGraphNode { + """Custom Object Share ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceTodayGoal! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceTodayGoalShareUserOrGroupUnion! + + """Custom Object Access""" + accessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Solution Status Value""" +type SalesforceSolutionStatus implements OneGraphNode { + """Solution Status Value ID""" + id: String! + + """Master Label""" + masterLabel: String + + """Api Name""" + apiName: String! + + """Sort Order""" + sortOrder: Int + + """Is Default""" + isDefault: Boolean! + + """Is Reviewed""" + isReviewed: Boolean! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against CronJobDetail object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCronJobDetailConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CronJobDetail's id field""" + id: SalesforceIdFilter + + """Filter by the CronJobDetail's name field""" + name: SalesforceStringFilter + + """Filter by the CronJobDetail's jobType field""" + jobType: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCronJobDetailConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCronJobDetailConnectionFilter!] +} + +""" +A filter to be used against CronTrigger object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCronTriggerConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CronTrigger's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CronTrigger's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CronTrigger's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the CronTrigger's cronJobDetail relation.""" + cronJobDetail: SalesforceCronJobDetailConnectionFilter + + """Filter by the CronTrigger's id field""" + id: SalesforceIdFilter + + """Filter by the CronTrigger's cronJobDetailId field""" + cronJobDetailId: SalesforceIdFilter + + """Filter by the CronTrigger's nextFireTime field""" + nextFireTime: SalesforceDateTimeFilter + + """Filter by the CronTrigger's previousFireTime field""" + previousFireTime: SalesforceDateTimeFilter + + """Filter by the CronTrigger's state field""" + state: SalesforceStringFilter + + """Filter by the CronTrigger's startTime field""" + startTime: SalesforceDateTimeFilter + + """Filter by the CronTrigger's endTime field""" + endTime: SalesforceDateTimeFilter + + """Filter by the CronTrigger's cronExpression field""" + cronExpression: SalesforceStringFilter + + """Filter by the CronTrigger's timeZoneSidKey field""" + timeZoneSidKey: SalesforceStringFilter + + """Filter by the CronTrigger's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the CronTrigger's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CronTrigger's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CronTrigger's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CronTrigger's timesTriggered field""" + timesTriggered: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCronTriggerConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCronTriggerConnectionFilter!] +} + +"""Field that Scheduled Jobs can be sorted by""" +enum SalesforceCronTriggerSortByFieldEnum { + ID + CRON_JOB_DETAIL_ID + NEXT_FIRE_TIME + PREVIOUS_FIRE_TIME + STATE + START_TIME + END_TIME + CRON_EXPRESSION + TIME_ZONE_SID_KEY + OWNER_ID + LAST_MODIFIED_BY_ID + CREATED_BY_ID + CREATED_DATE + TIMES_TRIGGERED +} + +"""An edge in a connection.""" +type SalesforceCronTriggerEdge { + """The item at the end of the edge.""" + node: SalesforceCronTrigger! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Scheduled Jobs""" +type SalesforceCronTrigger implements OneGraphNode { + """Scheduled Job ID""" + id: String! + + """Job ID""" + cronJobDetailId: String + + """Job ID""" + cronJobDetail: SalesforceCronJobDetail + + """Next Run Time""" + nextFireTime: String + + """Previous Run Time""" + previousFireTime: String + + """Job State""" + state: String + + """Start Time""" + startTime: String + + """End Time""" + endTime: String + + """Cron Expression""" + cronExpression: String + + """Java Time Zone Id""" + timeZoneSidKey: String + + """User ID""" + ownerId: String + + """User ID""" + owner: SalesforceUser + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Job Fired Count""" + timesTriggered: Int + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Scheduled Jobs connection, for use in pagination.""" +type SalesforceCronTriggersConnection { + """The count of all Scheduled Jobs you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Scheduled Jobs""" + nodes: [SalesforceCronTrigger!]! + + """List of Scheduled Jobs edges""" + edges: [SalesforceCronTriggerEdge!]! +} + +"""Cron Job""" +type SalesforceCronJobDetail implements OneGraphNode { + """Job ID""" + id: String! + + """Job Name""" + name: String! + + """Type""" + jobType: String + + """Collection of Salesforce CronTrigger""" + cronTriggers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCronTriggerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCronTriggerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCronTriggerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CronTriggers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCronTriggersConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceCaseShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Case Share""" +type SalesforceCaseShare implements OneGraphNode { + """Case Share ID""" + id: String! + + """Case ID""" + caseId: String! + + """Case ID""" + case: SalesforceCase! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceCaseShareUserOrGroupUnion! + + """Case Access""" + caseAccessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Login IP""" +type SalesforceLoginIp implements OneGraphNode { + """Login IP ID""" + id: String! + + """User ID""" + usersId: String! + + """User ID""" + users: SalesforceUser! + + """Source IP""" + sourceIp: String + + """Created Date""" + createdDate: String! + + """IsAuthenticated""" + isAuthenticated: Boolean! + + """Challenge SentDate""" + challengeSentDate: String + + """Challenge Method""" + challengeMethod: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Email Domain Key""" +type SalesforceEmailDomainKey implements OneGraphNode { + """Email Domain Key ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Selector""" + selector: String! + + """Domain""" + domain: String! + + """Domain Match""" + domainMatch: String! + + """Active""" + isActive: Boolean! + + """Public Key""" + publicKey: String + + """Private Key""" + privateKey: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Chatter Activity""" +type SalesforceChatterActivity implements OneGraphNode { + """Chatter Activity ID""" + id: String! + + """Parent ID""" + parentId: String + + """Parent ID""" + parent: SalesforceUser + + """Post Count""" + postCount: Int! + + """Comment Count""" + commentCount: Int! + + """Comment Received Count""" + commentReceivedCount: Int! + + """Like Received Count""" + likeReceivedCount: Int! + + """Influence Raw Rank""" + influenceRawRank: Int! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Case History""" +type SalesforceCaseHistory implements OneGraphNode { + """Case History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Case ID""" + caseId: String! + + """Case ID""" + case: SalesforceCase! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""List View Chart""" +type SalesforceListViewChart implements OneGraphNode { + """List View Chart ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Custom Object Definition ID""" + sobjectType: String! + + """API Name""" + developerName: String! + + """Master Language""" + language: String + + """Label""" + masterLabel: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """User ID""" + ownerId: String! + + """User ID""" + owner: SalesforceUser! + + """Chart Type""" + chartType: String! + + """Custom Field Definition ID""" + groupingField: String + + """Custom Field Definition ID""" + aggregateField: String + + """Aggregate Type""" + aggregateType: String! + + """Collection of Salesforce UserListView""" + userListViews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserListViewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserListViewSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserListViewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserListViews to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserListViewsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Case Team Member Role""" +type SalesforceCaseTeamRole implements OneGraphNode { + """Team Role Id""" + id: String! + + """Name""" + name: String! + + """Access Level""" + accessLevel: String! + + """Visible in Customer Portal""" + preferencesVisibleInCsp: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceCaseTeamTemplateMemberMemberUnion = SalesforceUser | SalesforceContact + +"""Predefined Case Team Member""" +type SalesforceCaseTeamTemplateMember implements OneGraphNode { + """Team Template Member Id""" + id: String! + + """Team Template ID""" + teamTemplateId: String! + + """Team Template ID""" + teamTemplate: SalesforceCaseTeamTemplate! + + """Member ID""" + memberId: String! + + """Member ID""" + member: SalesforceCaseTeamTemplateMemberMemberUnion! + + """Team Role ID""" + teamRoleId: String + + """Team Role ID""" + teamRole: SalesforceCaseTeamRole + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceGroupMemberUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Group Member""" +type SalesforceGroupMember implements OneGraphNode { + """Group Member ID""" + id: String! + + """Group ID""" + groupId: String! + + """Group ID""" + group: SalesforceGroup! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceGroupMemberUserOrGroupUnion! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Predefined Case Team""" +type SalesforceCaseTeamTemplate implements OneGraphNode { + """Team Template Id""" + id: String! + + """Name""" + name: String! + + """Description""" + description: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Predefined Case Team Record""" +type SalesforceCaseTeamTemplateRecord implements OneGraphNode { + """Predefined Team Record Id""" + id: String! + + """Case ID""" + parentId: String! + + """Case ID""" + parent: SalesforceCase! + + """Team Template ID""" + teamTemplateId: String! + + """Team Template ID""" + teamTemplate: SalesforceCaseTeamTemplate! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""CORS Whitelist Origin""" +type SalesforceCorsWhitelistEntry implements OneGraphNode { + """CORS Whitelist Origin ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Origin URL Pattern""" + urlPattern: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceLeadShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Lead Share""" +type SalesforceLeadShare implements OneGraphNode { + """Lead Share ID""" + id: String! + + """Lead ID""" + leadId: String! + + """Lead ID""" + lead: SalesforceLead! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceLeadShareUserOrGroupUnion! + + """Lead Access""" + leadAccessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against PlatformCachePartition object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePlatformCachePartitionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the PlatformCachePartition's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the PlatformCachePartition's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the PlatformCachePartition's id field""" + id: SalesforceIdFilter + + """Filter by the PlatformCachePartition's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the PlatformCachePartition's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the PlatformCachePartition's language field""" + language: SalesforceStringFilter + + """Filter by the PlatformCachePartition's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the PlatformCachePartition's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the PlatformCachePartition's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the PlatformCachePartition's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the PlatformCachePartition's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the PlatformCachePartition's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the PlatformCachePartition's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the PlatformCachePartition's isDefaultPartition field""" + isDefaultPartition: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePlatformCachePartitionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePlatformCachePartitionConnectionFilter!] +} + +""" +A filter to be used against PlatformCachePartitionType object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePlatformCachePartitionTypeConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """ + Filter by the PlatformCachePartitionType's platformCachePartition relation. + """ + platformCachePartition: SalesforcePlatformCachePartitionConnectionFilter + + """Filter by the PlatformCachePartitionType's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the PlatformCachePartitionType's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the PlatformCachePartitionType's id field""" + id: SalesforceIdFilter + + """Filter by the PlatformCachePartitionType's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the PlatformCachePartitionType's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the PlatformCachePartitionType's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the PlatformCachePartitionType's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the PlatformCachePartitionType's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the PlatformCachePartitionType's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """ + Filter by the PlatformCachePartitionType's platformCachePartitionId field + """ + platformCachePartitionId: SalesforceIdFilter + + """Filter by the PlatformCachePartitionType's cacheType field""" + cacheType: SalesforceStringFilter + + """Filter by the PlatformCachePartitionType's allocatedCapacity field""" + allocatedCapacity: SalesforceIntFilter + + """ + Filter by the PlatformCachePartitionType's allocatedPurchasedCapacity field + """ + allocatedPurchasedCapacity: SalesforceIntFilter + + """ + Filter by the PlatformCachePartitionType's allocatedTrialCapacity field + """ + allocatedTrialCapacity: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePlatformCachePartitionTypeConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePlatformCachePartitionTypeConnectionFilter!] +} + +"""Field that Platform Cache Partition Types can be sorted by""" +enum SalesforcePlatformCachePartitionTypeSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + PLATFORM_CACHE_PARTITION_ID + CACHE_TYPE + ALLOCATED_CAPACITY + ALLOCATED_PURCHASED_CAPACITY + ALLOCATED_TRIAL_CAPACITY +} + +"""An edge in a connection.""" +type SalesforcePlatformCachePartitionTypeEdge { + """The item at the end of the edge.""" + node: SalesforcePlatformCachePartitionType! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Platform Cache Partition Types connection, for use in pagination. +""" +type SalesforcePlatformCachePartitionTypesConnection { + """ + The count of all Platform Cache Partition Type you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Platform Cache Partition Types""" + nodes: [SalesforcePlatformCachePartitionType!]! + + """List of Platform Cache Partition Type edges""" + edges: [SalesforcePlatformCachePartitionTypeEdge!]! +} + +"""Platform Cache Partition""" +type SalesforcePlatformCachePartition implements OneGraphNode { + """Platform Cache Partition ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Description""" + description: String + + """Default Partition""" + isDefaultPartition: Boolean! + + """Collection of Salesforce PlatformCachePartitionType""" + platforCachePartitionTypes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePlatformCachePartitionTypeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePlatformCachePartitionTypeSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePlatformCachePartitionTypeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of PlatformCachePartitionTypes to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePlatformCachePartitionTypesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Platform Cache Partition Type""" +type SalesforcePlatformCachePartitionType implements OneGraphNode { + """Platform Cache Partition Type ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Platform Cache Partition ID""" + platformCachePartitionId: String! + + """Platform Cache Partition ID""" + platformCachePartition: SalesforcePlatformCachePartition! + + """Cache Type""" + cacheType: String! + + """Allocated Capacity""" + allocatedCapacity: Int + + """Allocated Namespaced Purchased Capacity""" + allocatedPurchasedCapacity: Int + + """Allocated Trial Capacity""" + allocatedTrialCapacity: Int + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Contract Status Value""" +type SalesforceContractStatus implements OneGraphNode { + """Contract Status Value ID""" + id: String! + + """Master Label""" + masterLabel: String + + """Api Name""" + apiName: String! + + """Sort Order""" + sortOrder: Int + + """Is Default""" + isDefault: Boolean! + + """Status Code""" + statusCode: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Case Status Value""" +type SalesforceCaseStatus implements OneGraphNode { + """Case Status Value ID""" + id: String! + + """Master Label""" + masterLabel: String + + """Api Name""" + apiName: String! + + """Sort Order""" + sortOrder: Int + + """Is Default""" + isDefault: Boolean! + + """Is Closed""" + isClosed: Boolean! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Holiday""" +type SalesforceHoliday implements OneGraphNode { + """Holiday ID""" + id: String! + + """Holiday Name""" + name: String! + + """Description""" + description: String + + """All Day""" + isAllDay: Boolean! + + """Holiday Date""" + activityDate: String + + """Start Time In Minutes From Midnight""" + startTimeInMinutes: Int + + """End Time In Minutes From Midnight""" + endTimeInMinutes: Int + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Recurring Holiday""" + isRecurrence: Boolean! + + """Recurrence Start""" + recurrenceStartDate: String + + """Recurrence End""" + recurrenceEndDateOnly: String + + """Recurrence Type""" + recurrenceType: String + + """Recurrence Interval""" + recurrenceInterval: Int + + """Recurrence Day of Week Mask""" + recurrenceDayOfWeekMask: Int + + """Recurrence Day of Month""" + recurrenceDayOfMonth: Int + + """Recurrence Instance""" + recurrenceInstance: String + + """Recurrence Month of Year""" + recurrenceMonthOfYear: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against MatchingRule object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceMatchingRuleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the MatchingRule's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the MatchingRule's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the MatchingRule's id field""" + id: SalesforceIdFilter + + """Filter by the MatchingRule's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the MatchingRule's sobjectType field""" + sobjectType: SalesforceStringFilter + + """Filter by the MatchingRule's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the MatchingRule's language field""" + language: SalesforceStringFilter + + """Filter by the MatchingRule's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the MatchingRule's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the MatchingRule's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the MatchingRule's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the MatchingRule's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the MatchingRule's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the MatchingRule's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the MatchingRule's matchEngine field""" + matchEngine: SalesforceStringFilter + + """Filter by the MatchingRule's booleanFilter field""" + booleanFilter: SalesforceStringFilter + + """Filter by the MatchingRule's description field""" + description: SalesforceStringFilter + + """Filter by the MatchingRule's ruleStatus field""" + ruleStatus: SalesforceStringFilter + + """Filter by the MatchingRule's sobjectSubtype field""" + sobjectSubtype: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceMatchingRuleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceMatchingRuleConnectionFilter!] +} + +""" +A filter to be used against MatchingRuleItem object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceMatchingRuleItemConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the MatchingRuleItem's matchingRule relation.""" + matchingRule: SalesforceMatchingRuleConnectionFilter + + """Filter by the MatchingRuleItem's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the MatchingRuleItem's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the MatchingRuleItem's id field""" + id: SalesforceIdFilter + + """Filter by the MatchingRuleItem's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the MatchingRuleItem's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the MatchingRuleItem's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the MatchingRuleItem's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the MatchingRuleItem's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the MatchingRuleItem's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the MatchingRuleItem's matchingRuleId field""" + matchingRuleId: SalesforceIdFilter + + """Filter by the MatchingRuleItem's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the MatchingRuleItem's field field""" + field: SalesforceStringFilter + + """Filter by the MatchingRuleItem's matchingMethod field""" + matchingMethod: SalesforceStringFilter + + """Filter by the MatchingRuleItem's blankValueBehavior field""" + blankValueBehavior: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceMatchingRuleItemConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceMatchingRuleItemConnectionFilter!] +} + +"""Field that Matching Rule Items can be sorted by""" +enum SalesforceMatchingRuleItemSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + MATCHING_RULE_ID + SORT_ORDER + FIELD + MATCHING_METHOD + BLANK_VALUE_BEHAVIOR +} + +"""An edge in a connection.""" +type SalesforceMatchingRuleItemEdge { + """The item at the end of the edge.""" + node: SalesforceMatchingRuleItem! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Matching Rule Items connection, for use in pagination.""" +type SalesforceMatchingRuleItemsConnection { + """The count of all Matching Rule Item you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Matching Rule Items""" + nodes: [SalesforceMatchingRuleItem!]! + + """List of Matching Rule Item edges""" + edges: [SalesforceMatchingRuleItemEdge!]! +} + +"""Matching Rule""" +type SalesforceMatchingRule implements OneGraphNode { + """Matching Rule ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Custom Object Definition ID""" + sobjectType: String! + + """Unique Name""" + developerName: String! + + """Master Language""" + language: String! + + """Rule Name""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Custom Object Definition ID""" + matchEngine: String + + """Advanced Logic""" + booleanFilter: String + + """Description""" + description: String + + """Status""" + ruleStatus: String! + + """Object Subtype""" + sobjectSubtype: String + + """Collection of Salesforce MatchingRuleItem""" + matchingRuleItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMatchingRuleItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceMatchingRuleItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMatchingRuleItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of MatchingRuleItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMatchingRuleItemsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Matching Rule Item""" +type SalesforceMatchingRuleItem implements OneGraphNode { + """Matching Rule Item ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Matching Rule ID""" + matchingRuleId: String! + + """Matching Rule ID""" + matchingRule: SalesforceMatchingRule! + + """Sort Order""" + sortOrder: Int! + + """Field""" + field: String + + """Custom Object Definition ID""" + matchingMethod: String + + """Blank Value Behavior""" + blankValueBehavior: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Task Status Value""" +type SalesforceTaskStatus implements OneGraphNode { + """Task Status Value ID""" + id: String! + + """Master Label""" + masterLabel: String + + """Api Name""" + apiName: String! + + """Sort Order""" + sortOrder: Int + + """Is Default""" + isDefault: Boolean! + + """Is Closed""" + isClosed: Boolean! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against SecureAgentPluginProperty object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSecureAgentPluginPropertyConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SecureAgentPluginProperty's secureAgentPlugin relation.""" + secureAgentPlugin: SalesforceSecureAgentPluginConnectionFilter + + """Filter by the SecureAgentPluginProperty's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the SecureAgentPluginProperty's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SecureAgentPluginProperty's id field""" + id: SalesforceIdFilter + + """Filter by the SecureAgentPluginProperty's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SecureAgentPluginProperty's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SecureAgentPluginProperty's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SecureAgentPluginProperty's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SecureAgentPluginProperty's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the SecureAgentPluginProperty's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the SecureAgentPluginProperty's secureAgentPluginId field""" + secureAgentPluginId: SalesforceIdFilter + + """Filter by the SecureAgentPluginProperty's propertyName field""" + propertyName: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSecureAgentPluginPropertyConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSecureAgentPluginPropertyConnectionFilter!] +} + +"""Field that Secure Agent Plug-in Properties can be sorted by""" +enum SalesforceSecureAgentPluginPropertySortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + SECURE_AGENT_PLUGIN_ID + PROPERTY_NAME +} + +"""An edge in a connection.""" +type SalesforceSecureAgentPluginPropertyEdge { + """The item at the end of the edge.""" + node: SalesforceSecureAgentPluginProperty! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Secure Agent Plug-in Property""" +type SalesforceSecureAgentPluginProperty implements OneGraphNode { + """Secure Agent Plug-in Property ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Secure Agent Plug-in ID""" + secureAgentPluginId: String! + + """Secure Agent Plug-in ID""" + secureAgentPlugin: SalesforceSecureAgentPlugin! + + """Property Name""" + propertyName: String + + """Property Value""" + propertyValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Secure Agent Plug-in Properties connection, for use in pagination. +""" +type SalesforceSecureAgentPluginPropertysConnection { + """ + The count of all Secure Agent Plug-in Property you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Secure Agent Plug-in Properties""" + nodes: [SalesforceSecureAgentPluginProperty!]! + + """List of Secure Agent Plug-in Property edges""" + edges: [SalesforceSecureAgentPluginPropertyEdge!]! +} + +""" +A filter to be used against SecureAgentPlugin object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSecureAgentPluginConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SecureAgentPlugin's secureAgent relation.""" + secureAgent: SalesforceSecureAgentConnectionFilter + + """Filter by the SecureAgentPlugin's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the SecureAgentPlugin's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SecureAgentPlugin's id field""" + id: SalesforceIdFilter + + """Filter by the SecureAgentPlugin's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SecureAgentPlugin's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SecureAgentPlugin's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SecureAgentPlugin's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SecureAgentPlugin's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the SecureAgentPlugin's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the SecureAgentPlugin's secureAgentId field""" + secureAgentId: SalesforceIdFilter + + """Filter by the SecureAgentPlugin's pluginName field""" + pluginName: SalesforceStringFilter + + """Filter by the SecureAgentPlugin's pluginType field""" + pluginType: SalesforceStringFilter + + """Filter by the SecureAgentPlugin's requestedVersion field""" + requestedVersion: SalesforceStringFilter + + """Filter by the SecureAgentPlugin's updateWindowStart field""" + updateWindowStart: SalesforceDateTimeFilter + + """Filter by the SecureAgentPlugin's updateWindowEnd field""" + updateWindowEnd: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSecureAgentPluginConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSecureAgentPluginConnectionFilter!] +} + +"""Field that Secure Agent Plug-ins can be sorted by""" +enum SalesforceSecureAgentPluginSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + SECURE_AGENT_ID + PLUGIN_NAME + PLUGIN_TYPE + REQUESTED_VERSION + UPDATE_WINDOW_START + UPDATE_WINDOW_END +} + +"""An edge in a connection.""" +type SalesforceSecureAgentPluginEdge { + """The item at the end of the edge.""" + node: SalesforceSecureAgentPlugin! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Secure Agent Plug-ins connection, for use in pagination.""" +type SalesforceSecureAgentPluginsConnection { + """ + The count of all Secure Agent Plug-in you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Secure Agent Plug-ins""" + nodes: [SalesforceSecureAgentPlugin!]! + + """List of Secure Agent Plug-in edges""" + edges: [SalesforceSecureAgentPluginEdge!]! +} + +""" +A filter to be used against SecureAgentsCluster object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSecureAgentsClusterConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SecureAgentsCluster's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the SecureAgentsCluster's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SecureAgentsCluster's id field""" + id: SalesforceIdFilter + + """Filter by the SecureAgentsCluster's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SecureAgentsCluster's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the SecureAgentsCluster's language field""" + language: SalesforceStringFilter + + """Filter by the SecureAgentsCluster's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the SecureAgentsCluster's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SecureAgentsCluster's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SecureAgentsCluster's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SecureAgentsCluster's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the SecureAgentsCluster's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the SecureAgentsCluster's description field""" + description: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSecureAgentsClusterConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSecureAgentsClusterConnectionFilter!] +} + +""" +A filter to be used against SecureAgent object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSecureAgentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SecureAgent's secureAgentsCluster relation.""" + secureAgentsCluster: SalesforceSecureAgentsClusterConnectionFilter + + """Filter by the SecureAgent's proxyUser relation.""" + proxyUser: SalesforceUserConnectionFilter + + """Filter by the SecureAgent's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the SecureAgent's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SecureAgent's id field""" + id: SalesforceIdFilter + + """Filter by the SecureAgent's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SecureAgent's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the SecureAgent's language field""" + language: SalesforceStringFilter + + """Filter by the SecureAgent's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the SecureAgent's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SecureAgent's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SecureAgent's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SecureAgent's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the SecureAgent's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the SecureAgent's agentKey field""" + agentKey: SalesforceStringFilter + + """Filter by the SecureAgent's proxyUserId field""" + proxyUserId: SalesforceIdFilter + + """Filter by the SecureAgent's secureAgentsClusterId field""" + secureAgentsClusterId: SalesforceIdFilter + + """Filter by the SecureAgent's priority field""" + priority: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSecureAgentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSecureAgentConnectionFilter!] +} + +"""Field that Secure Agents can be sorted by""" +enum SalesforceSecureAgentSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + AGENT_KEY + PROXY_USER_ID + SECURE_AGENTS_CLUSTER_ID + PRIORITY +} + +"""An edge in a connection.""" +type SalesforceSecureAgentEdge { + """The item at the end of the edge.""" + node: SalesforceSecureAgent! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Secure Agents connection, for use in pagination.""" +type SalesforceSecureAgentsConnection { + """The count of all Secure Agent you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Secure Agents""" + nodes: [SalesforceSecureAgent!]! + + """List of Secure Agent edges""" + edges: [SalesforceSecureAgentEdge!]! +} + +"""Secure Agent Cluster""" +type SalesforceSecureAgentsCluster implements OneGraphNode { + """Secure Agent Cluster ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String! + + """Label""" + masterLabel: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Description""" + description: String + + """Collection of Salesforce SecureAgent""" + secureAgents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecureAgentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSecureAgentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecureAgentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SecureAgents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSecureAgentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Secure Agent""" +type SalesforceSecureAgent implements OneGraphNode { + """Secure Agent ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String! + + """Label""" + masterLabel: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Agent Key""" + agentKey: String + + """User ID""" + proxyUserId: String + + """User ID""" + proxyUser: SalesforceUser + + """Secure Agent Cluster ID""" + secureAgentsClusterId: String + + """Secure Agent Cluster ID""" + secureAgentsCluster: SalesforceSecureAgentsCluster + + """Priority""" + priority: Int + + """Collection of Salesforce SecureAgentPlugin""" + secureAgentPlugins( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecureAgentPluginConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSecureAgentPluginSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecureAgentPluginSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SecureAgentPlugins to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSecureAgentPluginsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Secure Agent Plug-in""" +type SalesforceSecureAgentPlugin implements OneGraphNode { + """Secure Agent Plug-in ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Secure Agent ID""" + secureAgentId: String! + + """Secure Agent ID""" + secureAgent: SalesforceSecureAgent! + + """Name""" + pluginName: String + + """Type""" + pluginType: String + + """Requested Version""" + requestedVersion: String + + """Update Window Start""" + updateWindowStart: String + + """Update Window End""" + updateWindowEnd: String + + """Collection of Salesforce SecureAgentPluginProperty""" + secureAgentPluginProperties( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecureAgentPluginPropertyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSecureAgentPluginPropertySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecureAgentPluginPropertySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of SecureAgentPluginProperties to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSecureAgentPluginPropertysConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against LightningComponentBundle object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceLightningComponentBundleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the LightningComponentBundle's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the LightningComponentBundle's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the LightningComponentBundle's id field""" + id: SalesforceIdFilter + + """Filter by the LightningComponentBundle's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the LightningComponentBundle's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the LightningComponentBundle's language field""" + language: SalesforceStringFilter + + """Filter by the LightningComponentBundle's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the LightningComponentBundle's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the LightningComponentBundle's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the LightningComponentBundle's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the LightningComponentBundle's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the LightningComponentBundle's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the LightningComponentBundle's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the LightningComponentBundle's apiVersion field""" + apiVersion: SalesforceFloatFilter + + """Filter by the LightningComponentBundle's minVersion field""" + minVersion: SalesforceFloatFilter + + """Filter by the LightningComponentBundle's isExposed field""" + isExposed: SalesforceBooleanFilter + + """Filter by the LightningComponentBundle's availableFor field""" + availableFor: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceLightningComponentBundleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceLightningComponentBundleConnectionFilter!] +} + +""" +A filter to be used against LightningComponentResource object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceLightningComponentResourceConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """ + Filter by the LightningComponentResource's lightningComponentBundle relation. + """ + lightningComponentBundle: SalesforceLightningComponentBundleConnectionFilter + + """Filter by the LightningComponentResource's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the LightningComponentResource's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the LightningComponentResource's id field""" + id: SalesforceIdFilter + + """Filter by the LightningComponentResource's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the LightningComponentResource's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the LightningComponentResource's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the LightningComponentResource's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the LightningComponentResource's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the LightningComponentResource's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """ + Filter by the LightningComponentResource's lightningComponentBundleId field + """ + lightningComponentBundleId: SalesforceIdFilter + + """Filter by the LightningComponentResource's filePath field""" + filePath: SalesforceStringFilter + + """Filter by the LightningComponentResource's format field""" + format: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceLightningComponentResourceConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceLightningComponentResourceConnectionFilter!] +} + +"""Field that LightningComponentResources can be sorted by""" +enum SalesforceLightningComponentResourceSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LIGHTNING_COMPONENT_BUNDLE_ID + FILE_PATH + FORMAT +} + +"""An edge in a connection.""" +type SalesforceLightningComponentResourceEdge { + """The item at the end of the edge.""" + node: SalesforceLightningComponentResource! + + """A cursor for use in pagination""" + cursor: String! +} + +"""LightningComponentResource""" +type SalesforceLightningComponentResource implements OneGraphNode { + """Lightning Component Resource ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Lightning Component Bundle ID""" + lightningComponentBundleId: String! + + """Lightning Component Bundle ID""" + lightningComponentBundle: SalesforceLightningComponentBundle! + + """File Path""" + filePath: String! + + """Format""" + format: String! + + """Source""" + source: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce LightningComponentResources connection, for use in pagination. +""" +type SalesforceLightningComponentResourcesConnection { + """ + The count of all LightningComponentResource you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce LightningComponentResources""" + nodes: [SalesforceLightningComponentResource!]! + + """List of LightningComponentResource edges""" + edges: [SalesforceLightningComponentResourceEdge!]! +} + +"""LightningComponentBundle""" +type SalesforceLightningComponentBundle implements OneGraphNode { + """Lightning Component Bundle ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Api Version""" + apiVersion: Float + + """Minimum Version""" + minVersion: Float + + """IsExposed""" + isExposed: Boolean! + + """Available For""" + availableFor: String + + """Collection of Salesforce LightningComponentResource""" + lightningComponentResources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLightningComponentResourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLightningComponentResourceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLightningComponentResourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of LightningComponentResources to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceLightningComponentResourcesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type SalesforceChatterExtensionEdge { + """The item at the end of the edge.""" + node: SalesforceChatterExtension! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against ChatterExtensionConfig object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceChatterExtensionConfigConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ChatterExtensionConfig's chatterExtension relation.""" + chatterExtension: SalesforceChatterExtensionConnectionFilter + + """Filter by the ChatterExtensionConfig's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ChatterExtensionConfig's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ChatterExtensionConfig's id field""" + id: SalesforceIdFilter + + """Filter by the ChatterExtensionConfig's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ChatterExtensionConfig's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ChatterExtensionConfig's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ChatterExtensionConfig's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ChatterExtensionConfig's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ChatterExtensionConfig's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ChatterExtensionConfig's chatterExtensionId field""" + chatterExtensionId: SalesforceIdFilter + + """Filter by the ChatterExtensionConfig's canCreate field""" + canCreate: SalesforceBooleanFilter + + """Filter by the ChatterExtensionConfig's canRead field""" + canRead: SalesforceBooleanFilter + + """Filter by the ChatterExtensionConfig's position field""" + position: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceChatterExtensionConfigConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceChatterExtensionConfigConnectionFilter!] +} + +"""Field that Chatter Extension Configurations can be sorted by""" +enum SalesforceChatterExtensionConfigSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + CHATTER_EXTENSION_ID + CAN_CREATE + CAN_READ + POSITION +} + +"""An edge in a connection.""" +type SalesforceChatterExtensionConfigEdge { + """The item at the end of the edge.""" + node: SalesforceChatterExtensionConfig! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Chatter Extension Configuration""" +type SalesforceChatterExtensionConfig implements OneGraphNode { + """Chatter Extension Configuration ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Chatter Extension ID""" + chatterExtensionId: String + + """Chatter Extension ID""" + chatterExtension: SalesforceChatterExtension + + """Can Create""" + canCreate: Boolean! + + """Can Read""" + canRead: Boolean! + + """Position""" + position: Int + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Chatter Extension Configurations connection, for use in pagination. +""" +type SalesforceChatterExtensionConfigsConnection { + """ + The count of all Chatter Extension Configuration you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Chatter Extension Configurations""" + nodes: [SalesforceChatterExtensionConfig!]! + + """List of Chatter Extension Configuration edges""" + edges: [SalesforceChatterExtensionConfigEdge!]! +} + +"""An edge in a connection.""" +type SalesforceCustomBrandAssetEdge { + """The item at the end of the edge.""" + node: SalesforceCustomBrandAsset! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Field that Reports can be sorted by""" +enum SalesforceReportSortByFieldEnum { + ID + OWNER_ID + FOLDER_NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED + NAME + DESCRIPTION + DEVELOPER_NAME + NAMESPACE_PREFIX + LAST_RUN_DATE + SYSTEM_MODSTAMP + FORMAT + LAST_VIEWED_DATE + LAST_REFERENCED_DATE +} + +"""An edge in a connection.""" +type SalesforceReportEdge { + """The item at the end of the edge.""" + node: SalesforceReport! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Reports connection, for use in pagination.""" +type SalesforceReportsConnection { + """The count of all Report you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Reports""" + nodes: [SalesforceReport!]! + + """List of Report edges""" + edges: [SalesforceReportEdge!]! +} + +"""Field that Documents can be sorted by""" +enum SalesforceDocumentSortByFieldEnum { + ID + FOLDER_ID + IS_DELETED + NAME + DEVELOPER_NAME + NAMESPACE_PREFIX + CONTENT_TYPE + TYPE + IS_PUBLIC + BODY_LENGTH + URL + DESCRIPTION + KEYWORDS + IS_INTERNAL_USE_ONLY + AUTHOR_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_BODY_SEARCHABLE + LAST_VIEWED_DATE + LAST_REFERENCED_DATE +} + +"""An edge in a connection.""" +type SalesforceDocumentEdge { + """The item at the end of the edge.""" + node: SalesforceDocument! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Documents connection, for use in pagination.""" +type SalesforceDocumentsConnection { + """The count of all Document you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Documents""" + nodes: [SalesforceDocument!]! + + """List of Document edges""" + edges: [SalesforceDocumentEdge!]! +} + +"""Field that Dashboards can be sorted by""" +enum SalesforceDashboardSortByFieldEnum { + ID + IS_DELETED + FOLDER_ID + FOLDER_NAME + TITLE + DEVELOPER_NAME + NAMESPACE_PREFIX + DESCRIPTION + LEFT_SIZE + MIDDLE_SIZE + RIGHT_SIZE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + RUNNING_USER_ID + TITLE_COLOR + TITLE_SIZE + TEXT_COLOR + BACKGROUND_START + BACKGROUND_END + BACKGROUND_DIRECTION + TYPE + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + COLOR_PALETTE + CHART_THEME +} + +"""An edge in a connection.""" +type SalesforceDashboardEdge { + """The item at the end of the edge.""" + node: SalesforceDashboard! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against DashboardFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDashboardFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DashboardFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the DashboardFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the DashboardFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DashboardFeed's parent relation.""" + parent: SalesforceDashboardConnectionFilter + + """Filter by the DashboardFeed's id field""" + id: SalesforceIdFilter + + """Filter by the DashboardFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the DashboardFeed's type field""" + type: SalesforceStringFilter + + """Filter by the DashboardFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DashboardFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DashboardFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DashboardFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DashboardFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the DashboardFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the DashboardFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the DashboardFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDashboardFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDashboardFeedConnectionFilter!] +} + +"""Field that Dashboard Feeds can be sorted by""" +enum SalesforceDashboardFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceDashboardFeedEdge { + """The item at the end of the edge.""" + node: SalesforceDashboardFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Dashboard Feeds connection, for use in pagination.""" +type SalesforceDashboardFeedsConnection { + """The count of all Dashboard Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Dashboard Feeds""" + nodes: [SalesforceDashboardFeed!]! + + """List of Dashboard Feed edges""" + edges: [SalesforceDashboardFeedEdge!]! +} + +"""An edge in a connection.""" +type SalesforceDashboardComponentEdge { + """The item at the end of the edge.""" + node: SalesforceDashboardComponent! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against DashboardComponentFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDashboardComponentFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DashboardComponentFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the DashboardComponentFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the DashboardComponentFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DashboardComponentFeed's parent relation.""" + parent: SalesforceDashboardComponentConnectionFilter + + """Filter by the DashboardComponentFeed's id field""" + id: SalesforceIdFilter + + """Filter by the DashboardComponentFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the DashboardComponentFeed's type field""" + type: SalesforceStringFilter + + """Filter by the DashboardComponentFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DashboardComponentFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DashboardComponentFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DashboardComponentFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DashboardComponentFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the DashboardComponentFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the DashboardComponentFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the DashboardComponentFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDashboardComponentFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDashboardComponentFeedConnectionFilter!] +} + +"""Field that Dashboard Component Feeds can be sorted by""" +enum SalesforceDashboardComponentFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceDashboardComponentFeedEdge { + """The item at the end of the edge.""" + node: SalesforceDashboardComponentFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Dashboard Component Feeds connection, for use in pagination. +""" +type SalesforceDashboardComponentFeedsConnection { + """ + The count of all Dashboard Component Feed you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Dashboard Component Feeds""" + nodes: [SalesforceDashboardComponentFeed!]! + + """List of Dashboard Component Feed edges""" + edges: [SalesforceDashboardComponentFeedEdge!]! +} + +""" +A filter to be used against ReportFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceReportFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ReportFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the ReportFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the ReportFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ReportFeed's parent relation.""" + parent: SalesforceReportConnectionFilter + + """Filter by the ReportFeed's id field""" + id: SalesforceIdFilter + + """Filter by the ReportFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the ReportFeed's type field""" + type: SalesforceStringFilter + + """Filter by the ReportFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ReportFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ReportFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ReportFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ReportFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ReportFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the ReportFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the ReportFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceReportFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceReportFeedConnectionFilter!] +} + +"""Field that Report Feeds can be sorted by""" +enum SalesforceReportFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceReportFeedEdge { + """The item at the end of the edge.""" + node: SalesforceReportFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Report Feeds connection, for use in pagination.""" +type SalesforceReportFeedsConnection { + """The count of all Report Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Report Feeds""" + nodes: [SalesforceReportFeed!]! + + """List of Report Feed edges""" + edges: [SalesforceReportFeedEdge!]! +} + +"""An edge in a connection.""" +type SalesforceEntitySubscriptionEdge { + """The item at the end of the edge.""" + node: SalesforceEntitySubscription! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against TaskFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTaskFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the TaskFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the TaskFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the TaskFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the TaskFeed's parent relation.""" + parent: SalesforceTaskConnectionFilter + + """Filter by the TaskFeed's id field""" + id: SalesforceIdFilter + + """Filter by the TaskFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the TaskFeed's type field""" + type: SalesforceStringFilter + + """Filter by the TaskFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the TaskFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the TaskFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the TaskFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the TaskFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the TaskFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the TaskFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the TaskFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTaskFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTaskFeedConnectionFilter!] +} + +"""Field that Task Feeds can be sorted by""" +enum SalesforceTaskFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceTaskFeedEdge { + """The item at the end of the edge.""" + node: SalesforceTaskFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Task Feeds connection, for use in pagination.""" +type SalesforceTaskFeedsConnection { + """The count of all Task Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Task Feeds""" + nodes: [SalesforceTaskFeed!]! + + """List of Task Feed edges""" + edges: [SalesforceTaskFeedEdge!]! +} + +""" +A filter to be used against SolutionHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSolutionHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SolutionHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SolutionHistory's solution relation.""" + solution: SalesforceSolutionConnectionFilter + + """Filter by the SolutionHistory's id field""" + id: SalesforceIdFilter + + """Filter by the SolutionHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SolutionHistory's solutionId field""" + solutionId: SalesforceIdFilter + + """Filter by the SolutionHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SolutionHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SolutionHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSolutionHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSolutionHistoryConnectionFilter!] +} + +"""Field that Solution Histories can be sorted by""" +enum SalesforceSolutionHistorySortByFieldEnum { + ID + IS_DELETED + SOLUTION_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceSolutionHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceSolutionHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Solution History""" +type SalesforceSolutionHistory implements OneGraphNode { + """Solution History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Solution ID""" + solutionId: String! + + """Solution ID""" + solution: SalesforceSolution! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Solution Histories connection, for use in pagination.""" +type SalesforceSolutionHistorysConnection { + """The count of all Solution History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Solution Histories""" + nodes: [SalesforceSolutionHistory!]! + + """List of Solution History edges""" + edges: [SalesforceSolutionHistoryEdge!]! +} + +""" +A filter to be used against SolutionFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSolutionFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SolutionFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the SolutionFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the SolutionFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SolutionFeed's parent relation.""" + parent: SalesforceSolutionConnectionFilter + + """Filter by the SolutionFeed's id field""" + id: SalesforceIdFilter + + """Filter by the SolutionFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the SolutionFeed's type field""" + type: SalesforceStringFilter + + """Filter by the SolutionFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SolutionFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SolutionFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SolutionFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SolutionFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the SolutionFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the SolutionFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the SolutionFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSolutionFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSolutionFeedConnectionFilter!] +} + +"""Field that Solution Feeds can be sorted by""" +enum SalesforceSolutionFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceSolutionFeedEdge { + """The item at the end of the edge.""" + node: SalesforceSolutionFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Solution Feeds connection, for use in pagination.""" +type SalesforceSolutionFeedsConnection { + """The count of all Solution Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Solution Feeds""" + nodes: [SalesforceSolutionFeed!]! + + """List of Solution Feed edges""" + edges: [SalesforceSolutionFeedEdge!]! +} + +"""An edge in a connection.""" +type SalesforceCategoryDataEdge { + """The item at the end of the edge.""" + node: SalesforceCategoryData! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Field that Category Nodes can be sorted by""" +enum SalesforceCategoryNodeSortByFieldEnum { + ID + PARENT_ID + MASTER_LABEL + SORT_ORDER + SORT_STYLE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceCategoryNodeEdge { + """The item at the end of the edge.""" + node: SalesforceCategoryNode! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Category Nodes connection, for use in pagination.""" +type SalesforceCategoryNodesConnection { + """The count of all Category Node you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Category Nodes""" + nodes: [SalesforceCategoryNode!]! + + """List of Category Node edges""" + edges: [SalesforceCategoryNodeEdge!]! +} + +""" +A filter to be used against CategoryNode object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCategoryNodeConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CategoryNode's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CategoryNode's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CategoryNode's parent relation.""" + parent: SalesforceCategoryNodeConnectionFilter + + """Filter by the CategoryNode's id field""" + id: SalesforceIdFilter + + """Filter by the CategoryNode's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the CategoryNode's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the CategoryNode's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the CategoryNode's sortStyle field""" + sortStyle: SalesforceStringFilter + + """Filter by the CategoryNode's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CategoryNode's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CategoryNode's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CategoryNode's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CategoryNode's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCategoryNodeConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCategoryNodeConnectionFilter!] +} + +""" +A filter to be used against CategoryData object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCategoryDataConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CategoryData's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CategoryData's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CategoryData's relatedSobject relation.""" + relatedSobject: SalesforceSolutionConnectionFilter + + """Filter by the CategoryData's categoryNode relation.""" + categoryNode: SalesforceCategoryNodeConnectionFilter + + """Filter by the CategoryData's id field""" + id: SalesforceIdFilter + + """Filter by the CategoryData's categoryNodeId field""" + categoryNodeId: SalesforceIdFilter + + """Filter by the CategoryData's relatedSobjectId field""" + relatedSobjectId: SalesforceIdFilter + + """Filter by the CategoryData's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CategoryData's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CategoryData's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CategoryData's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CategoryData's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CategoryData's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCategoryDataConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCategoryDataConnectionFilter!] +} + +"""Field that Category Datas can be sorted by""" +enum SalesforceCategoryDataSortByFieldEnum { + ID + CATEGORY_NODE_ID + RELATED_SOBJECT_ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""Category Node""" +type SalesforceCategoryNode implements OneGraphNode { + """Category Node ID""" + id: String! + + """Parent Category Node ID""" + parentId: String + + """Parent Category Node ID""" + parent: SalesforceCategoryNode + + """Name""" + masterLabel: String! + + """Sort Order""" + sortOrder: Int + + """Subcategory Sort Style""" + sortStyle: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce CategoryData""" + categoryDatas( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCategoryDataConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCategoryDataSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCategoryDataSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CategoryDatas to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCategoryDatasConnection + + """Collection of Salesforce CategoryNode""" + categoryNodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCategoryNodeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCategoryNodeSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCategoryNodeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CategoryNodes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCategoryNodesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Category Data""" +type SalesforceCategoryData implements OneGraphNode { + """Category Data ID""" + id: String! + + """Category Node ID""" + categoryNodeId: String! + + """Category Node ID""" + categoryNode: SalesforceCategoryNode! + + """SObject ID""" + relatedSobjectId: String! + + """SObject ID""" + relatedSobject: SalesforceSolution! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Category Datas connection, for use in pagination.""" +type SalesforceCategoryDatasConnection { + """The count of all Category Data you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Category Datas""" + nodes: [SalesforceCategoryData!]! + + """List of Category Data edges""" + edges: [SalesforceCategoryDataEdge!]! +} + +""" +A filter to be used against Solution object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSolutionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Solution's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Solution's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Solution's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the Solution's id field""" + id: SalesforceIdFilter + + """Filter by the Solution's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Solution's solutionNumber field""" + solutionNumber: SalesforceStringFilter + + """Filter by the Solution's solutionName field""" + solutionName: SalesforceStringFilter + + """Filter by the Solution's isPublished field""" + isPublished: SalesforceBooleanFilter + + """Filter by the Solution's isPublishedInPublicKb field""" + isPublishedInPublicKb: SalesforceBooleanFilter + + """Filter by the Solution's status field""" + status: SalesforceStringFilter + + """Filter by the Solution's isReviewed field""" + isReviewed: SalesforceBooleanFilter + + """Filter by the Solution's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Solution's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Solution's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Solution's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Solution's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Solution's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Solution's timesUsed field""" + timesUsed: SalesforceIntFilter + + """Filter by the Solution's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Solution's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the Solution's isHtml field""" + isHtml: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSolutionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSolutionConnectionFilter!] +} + +""" +A filter to be used against CaseSolution object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseSolutionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CaseSolution's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CaseSolution's solution relation.""" + solution: SalesforceSolutionConnectionFilter + + """Filter by the CaseSolution's case relation.""" + case: SalesforceCaseConnectionFilter + + """Filter by the CaseSolution's id field""" + id: SalesforceIdFilter + + """Filter by the CaseSolution's caseId field""" + caseId: SalesforceIdFilter + + """Filter by the CaseSolution's solutionId field""" + solutionId: SalesforceIdFilter + + """Filter by the CaseSolution's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CaseSolution's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CaseSolution's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CaseSolution's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseSolutionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseSolutionConnectionFilter!] +} + +"""Field that Case Solutions can be sorted by""" +enum SalesforceCaseSolutionSortByFieldEnum { + ID + CASE_ID + SOLUTION_ID + CREATED_BY_ID + CREATED_DATE + SYSTEM_MODSTAMP + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceCaseSolutionEdge { + """The item at the end of the edge.""" + node: SalesforceCaseSolution! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Case Solutions connection, for use in pagination.""" +type SalesforceCaseSolutionsConnection { + """The count of all Case Solution you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Case Solutions""" + nodes: [SalesforceCaseSolution!]! + + """List of Case Solution edges""" + edges: [SalesforceCaseSolutionEdge!]! +} + +"""An edge in a connection.""" +type SalesforceAttachmentEdge { + """The item at the end of the edge.""" + node: SalesforceAttachment! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against Product2History object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceProduct2HistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Product2History's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Product2History's product2 relation.""" + product2: SalesforceProduct2ConnectionFilter + + """Filter by the Product2History's id field""" + id: SalesforceIdFilter + + """Filter by the Product2History's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Product2History's product2Id field""" + product2Id: SalesforceIdFilter + + """Filter by the Product2History's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Product2History's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Product2History's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceProduct2HistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceProduct2HistoryConnectionFilter!] +} + +"""Field that Product Histories can be sorted by""" +enum SalesforceProduct2HistorySortByFieldEnum { + ID + IS_DELETED + PRODUCT_2_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceProduct2HistoryEdge { + """The item at the end of the edge.""" + node: SalesforceProduct2History! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Product History""" +type SalesforceProduct2History implements OneGraphNode { + """Product Stage ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Product ID""" + product2Id: String! + + """Product ID""" + product2: SalesforceProduct2! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Product Histories connection, for use in pagination.""" +type SalesforceProduct2HistorysConnection { + """The count of all Product History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Product Histories""" + nodes: [SalesforceProduct2History!]! + + """List of Product History edges""" + edges: [SalesforceProduct2HistoryEdge!]! +} + +""" +A filter to be used against Product2Feed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceProduct2FeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Product2Feed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the Product2Feed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the Product2Feed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Product2Feed's parent relation.""" + parent: SalesforceProduct2ConnectionFilter + + """Filter by the Product2Feed's id field""" + id: SalesforceIdFilter + + """Filter by the Product2Feed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the Product2Feed's type field""" + type: SalesforceStringFilter + + """Filter by the Product2Feed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Product2Feed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Product2Feed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Product2Feed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Product2Feed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Product2Feed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the Product2Feed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the Product2Feed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceProduct2FeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceProduct2FeedConnectionFilter!] +} + +"""Field that Product Feeds can be sorted by""" +enum SalesforceProduct2FeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceProduct2FeedEdge { + """The item at the end of the edge.""" + node: SalesforceProduct2Feed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Product Feeds connection, for use in pagination.""" +type SalesforceProduct2FeedsConnection { + """The count of all Product Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Product Feeds""" + nodes: [SalesforceProduct2Feed!]! + + """List of Product Feed edges""" + edges: [SalesforceProduct2FeedEdge!]! +} + +"""Field that Products can be sorted by""" +enum SalesforceProduct2SortByFieldEnum { + ID + NAME + PRODUCT_CODE + DESCRIPTION + IS_ACTIVE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + FAMILY + EXTERNAL_DATA_SOURCE_ID + EXTERNAL_ID + DISPLAY_URL + QUANTITY_UNIT_OF_MEASURE + IS_DELETED + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + STOCK_KEEPING_UNIT +} + +"""An edge in a connection.""" +type SalesforceProduct2Edge { + """The item at the end of the edge.""" + node: SalesforceProduct2! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Products connection, for use in pagination.""" +type SalesforceProduct2sConnection { + """The count of all Product you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Products""" + nodes: [SalesforceProduct2!]! + + """List of Product edges""" + edges: [SalesforceProduct2Edge!]! +} + +"""Static Resource""" +type SalesforceStaticResource implements OneGraphNode { + """Static Resource ID""" + id: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Name""" + name: String! + + """MIME Type""" + contentType: String! + + """Size""" + bodyLength: Int! + + """Body""" + body: String + + """Description""" + description: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Cache Control""" + cacheControl: String! + + """Collection of Salesforce ExternalDataSource""" + externalDataSources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceExternalDataSourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceExternalDataSourceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceExternalDataSourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ExternalDataSources to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceExternalDataSourcesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Field that Named Credentials can be sorted by""" +enum SalesforceNamedCredentialSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + PRINCIPAL_TYPE + AUTH_PROVIDER_ID +} + +"""An edge in a connection.""" +type SalesforceNamedCredentialEdge { + """The item at the end of the edge.""" + node: SalesforceNamedCredential! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Named Credentials connection, for use in pagination.""" +type SalesforceNamedCredentialsConnection { + """The count of all Named Credential you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Named Credentials""" + nodes: [SalesforceNamedCredential!]! + + """List of Named Credential edges""" + edges: [SalesforceNamedCredentialEdge!]! +} + +""" +A filter to be used against TransactionSecurityPolicy object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTransactionSecurityPolicyConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the TransactionSecurityPolicy's executionUser relation.""" + executionUser: SalesforceUserConnectionFilter + + """Filter by the TransactionSecurityPolicy's apexPolicy relation.""" + apexPolicy: SalesforceApexClassConnectionFilter + + """Filter by the TransactionSecurityPolicy's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the TransactionSecurityPolicy's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the TransactionSecurityPolicy's id field""" + id: SalesforceIdFilter + + """Filter by the TransactionSecurityPolicy's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the TransactionSecurityPolicy's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the TransactionSecurityPolicy's language field""" + language: SalesforceStringFilter + + """Filter by the TransactionSecurityPolicy's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the TransactionSecurityPolicy's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the TransactionSecurityPolicy's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the TransactionSecurityPolicy's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the TransactionSecurityPolicy's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the TransactionSecurityPolicy's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the TransactionSecurityPolicy's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the TransactionSecurityPolicy's type field""" + type: SalesforceStringFilter + + """Filter by the TransactionSecurityPolicy's state field""" + state: SalesforceStringFilter + + """Filter by the TransactionSecurityPolicy's apexPolicyId field""" + apexPolicyId: SalesforceIdFilter + + """Filter by the TransactionSecurityPolicy's eventType field""" + eventType: SalesforceStringFilter + + """Filter by the TransactionSecurityPolicy's resourceName field""" + resourceName: SalesforceStringFilter + + """Filter by the TransactionSecurityPolicy's executionUserId field""" + executionUserId: SalesforceIdFilter + + """Filter by the TransactionSecurityPolicy's description field""" + description: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTransactionSecurityPolicyConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTransactionSecurityPolicyConnectionFilter!] +} + +"""Field that Transaction Security Policies can be sorted by""" +enum SalesforceTransactionSecurityPolicySortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + TYPE + STATE + APEX_POLICY_ID + EVENT_TYPE + RESOURCE_NAME + EXECUTION_USER_ID + DESCRIPTION +} + +"""An edge in a connection.""" +type SalesforceTransactionSecurityPolicyEdge { + """The item at the end of the edge.""" + node: SalesforceTransactionSecurityPolicy! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Transaction Security Policy""" +type SalesforceTransactionSecurityPolicy implements OneGraphNode { + """Transaction Security Policy ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Policy type""" + type: String! + + """State""" + state: String! + + """Action Configuration""" + actionConfig: String! + + """Class ID""" + apexPolicyId: String + + """Class ID""" + apexPolicy: SalesforceApexClass + + """Event Type""" + eventType: String + + """Resource Name""" + resourceName: String + + """User ID""" + executionUserId: String + + """User ID""" + executionUser: SalesforceUser + + """Description""" + description: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Transaction Security Policies connection, for use in pagination. +""" +type SalesforceTransactionSecurityPolicysConnection { + """ + The count of all Transaction Security Policy you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Transaction Security Policies""" + nodes: [SalesforceTransactionSecurityPolicy!]! + + """List of Transaction Security Policy edges""" + edges: [SalesforceTransactionSecurityPolicyEdge!]! +} + +"""An edge in a connection.""" +type SalesforceTestSuiteMembershipEdge { + """The item at the end of the edge.""" + node: SalesforceTestSuiteMembership! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against ApexTestSuite object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceApexTestSuiteConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ApexTestSuite's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ApexTestSuite's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ApexTestSuite's id field""" + id: SalesforceIdFilter + + """Filter by the ApexTestSuite's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ApexTestSuite's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ApexTestSuite's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ApexTestSuite's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ApexTestSuite's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ApexTestSuite's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ApexTestSuite's testSuiteName field""" + testSuiteName: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceApexTestSuiteConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceApexTestSuiteConnectionFilter!] +} + +""" +A filter to be used against TestSuiteMembership object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTestSuiteMembershipConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the TestSuiteMembership's apexClass relation.""" + apexClass: SalesforceApexClassConnectionFilter + + """Filter by the TestSuiteMembership's apexTestSuite relation.""" + apexTestSuite: SalesforceApexTestSuiteConnectionFilter + + """Filter by the TestSuiteMembership's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the TestSuiteMembership's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the TestSuiteMembership's id field""" + id: SalesforceIdFilter + + """Filter by the TestSuiteMembership's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the TestSuiteMembership's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the TestSuiteMembership's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the TestSuiteMembership's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the TestSuiteMembership's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the TestSuiteMembership's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the TestSuiteMembership's apexTestSuiteId field""" + apexTestSuiteId: SalesforceIdFilter + + """Filter by the TestSuiteMembership's apexClassId field""" + apexClassId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTestSuiteMembershipConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTestSuiteMembershipConnectionFilter!] +} + +"""Field that Test Suite Memberships can be sorted by""" +enum SalesforceTestSuiteMembershipSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + APEX_TEST_SUITE_ID + APEX_CLASS_ID +} + +"""Apex Test Suite""" +type SalesforceApexTestSuite implements OneGraphNode { + """Test Suite ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Test Suite Name""" + testSuiteName: String! + + """Collection of Salesforce TestSuiteMembership""" + apexClassJunctions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTestSuiteMembershipConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTestSuiteMembershipSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTestSuiteMembershipSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of TestSuiteMemberships to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceTestSuiteMembershipsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Test Suite Membership""" +type SalesforceTestSuiteMembership implements OneGraphNode { + """Test Suite Membership ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Test Suite ID""" + apexTestSuiteId: String! + + """Test Suite ID""" + apexTestSuite: SalesforceApexTestSuite! + + """Class ID""" + apexClassId: String! + + """Class ID""" + apexClass: SalesforceApexClass! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Test Suite Memberships connection, for use in pagination.""" +type SalesforceTestSuiteMembershipsConnection { + """ + The count of all Test Suite Membership you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Test Suite Memberships""" + nodes: [SalesforceTestSuiteMembership!]! + + """List of Test Suite Membership edges""" + edges: [SalesforceTestSuiteMembershipEdge!]! +} + +""" +A filter to be used against SamlSsoConfig object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSamlSsoConfigConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SamlSsoConfig's executionUser relation.""" + executionUser: SalesforceUserConnectionFilter + + """Filter by the SamlSsoConfig's samlJitHandler relation.""" + samlJitHandler: SalesforceApexClassConnectionFilter + + """Filter by the SamlSsoConfig's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the SamlSsoConfig's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SamlSsoConfig's id field""" + id: SalesforceIdFilter + + """Filter by the SamlSsoConfig's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SamlSsoConfig's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the SamlSsoConfig's language field""" + language: SalesforceStringFilter + + """Filter by the SamlSsoConfig's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the SamlSsoConfig's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the SamlSsoConfig's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SamlSsoConfig's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SamlSsoConfig's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SamlSsoConfig's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the SamlSsoConfig's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the SamlSsoConfig's version field""" + version: SalesforceStringFilter + + """Filter by the SamlSsoConfig's issuer field""" + issuer: SalesforceStringFilter + + """Filter by the SamlSsoConfig's optionsSpInitBinding field""" + optionsSpInitBinding: SalesforceBooleanFilter + + """Filter by the SamlSsoConfig's optionsUserProvisioning field""" + optionsUserProvisioning: SalesforceBooleanFilter + + """Filter by the SamlSsoConfig's attributeFormat field""" + attributeFormat: SalesforceStringFilter + + """Filter by the SamlSsoConfig's attributeName field""" + attributeName: SalesforceStringFilter + + """Filter by the SamlSsoConfig's audience field""" + audience: SalesforceStringFilter + + """Filter by the SamlSsoConfig's identityMapping field""" + identityMapping: SalesforceStringFilter + + """Filter by the SamlSsoConfig's identityLocation field""" + identityLocation: SalesforceStringFilter + + """Filter by the SamlSsoConfig's samlJitHandlerId field""" + samlJitHandlerId: SalesforceIdFilter + + """Filter by the SamlSsoConfig's executionUserId field""" + executionUserId: SalesforceIdFilter + + """Filter by the SamlSsoConfig's loginUrl field""" + loginUrl: SalesforceStringFilter + + """Filter by the SamlSsoConfig's logoutUrl field""" + logoutUrl: SalesforceStringFilter + + """Filter by the SamlSsoConfig's errorUrl field""" + errorUrl: SalesforceStringFilter + + """Filter by the SamlSsoConfig's validationCert field""" + validationCert: SalesforceStringFilter + + """Filter by the SamlSsoConfig's requestSignatureMethod field""" + requestSignatureMethod: SalesforceStringFilter + + """Filter by the SamlSsoConfig's singleLogoutUrl field""" + singleLogoutUrl: SalesforceStringFilter + + """Filter by the SamlSsoConfig's singleLogoutBinding field""" + singleLogoutBinding: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSamlSsoConfigConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSamlSsoConfigConnectionFilter!] +} + +"""Field that SAML Single Sign-On Settings can be sorted by""" +enum SalesforceSamlSsoConfigSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + VERSION + ISSUER + ATTRIBUTE_FORMAT + ATTRIBUTE_NAME + AUDIENCE + IDENTITY_MAPPING + IDENTITY_LOCATION + SAML_JIT_HANDLER_ID + EXECUTION_USER_ID + LOGIN_URL + LOGOUT_URL + ERROR_URL + VALIDATION_CERT + REQUEST_SIGNATURE_METHOD + SINGLE_LOGOUT_URL + SINGLE_LOGOUT_BINDING +} + +"""An edge in a connection.""" +type SalesforceSamlSsoConfigEdge { + """The item at the end of the edge.""" + node: SalesforceSamlSsoConfig! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce SAML Single Sign-On Settings connection, for use in pagination. +""" +type SalesforceSamlSsoConfigsConnection { + """ + The count of all SAML Single Sign-On Setting you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce SAML Single Sign-On Settings""" + nodes: [SalesforceSamlSsoConfig!]! + + """List of SAML Single Sign-On Setting edges""" + edges: [SalesforceSamlSsoConfigEdge!]! +} + +"""Field that External Data Sources can be sorted by""" +enum SalesforceExternalDataSourceSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + TYPE + REPOSITORY + IS_WRITABLE + PRINCIPAL_TYPE + PROTOCOL + AUTH_PROVIDER_ID + LARGE_ICON_ID + SMALL_ICON_ID +} + +"""An edge in a connection.""" +type SalesforceExternalDataSourceEdge { + """The item at the end of the edge.""" + node: SalesforceExternalDataSource! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce External Data Sources connection, for use in pagination.""" +type SalesforceExternalDataSourcesConnection { + """ + The count of all External Data Source you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce External Data Sources""" + nodes: [SalesforceExternalDataSource!]! + + """List of External Data Source edges""" + edges: [SalesforceExternalDataSourceEdge!]! +} + +"""Field that Email Services can be sorted by""" +enum SalesforceEmailServicesFunctionSortByFieldEnum { + ID + IS_ACTIVE + FUNCTION_NAME + AUTHORIZED_SENDERS + IS_AUTHENTICATION_REQUIRED + IS_TLS_REQUIRED + ATTACHMENT_OPTION + APEX_CLASS_ID + OVER_LIMIT_ACTION + FUNCTION_INACTIVE_ACTION + ADDRESS_INACTIVE_ACTION + AUTHENTICATION_FAILURE_ACTION + AUTHORIZATION_FAILURE_ACTION + IS_ERROR_ROUTING_ENABLED + ERROR_ROUTING_ADDRESS + IS_TEXT_ATTACHMENTS_AS_BINARY + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceEmailServicesFunctionEdge { + """The item at the end of the edge.""" + node: SalesforceEmailServicesFunction! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against EmailServicesFunction object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEmailServicesFunctionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the EmailServicesFunction's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the EmailServicesFunction's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the EmailServicesFunction's apexClass relation.""" + apexClass: SalesforceApexClassConnectionFilter + + """Filter by the EmailServicesFunction's id field""" + id: SalesforceIdFilter + + """Filter by the EmailServicesFunction's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the EmailServicesFunction's functionName field""" + functionName: SalesforceStringFilter + + """Filter by the EmailServicesFunction's authorizedSenders field""" + authorizedSenders: SalesforceStringFilter + + """Filter by the EmailServicesFunction's isAuthenticationRequired field""" + isAuthenticationRequired: SalesforceBooleanFilter + + """Filter by the EmailServicesFunction's isTlsRequired field""" + isTlsRequired: SalesforceBooleanFilter + + """Filter by the EmailServicesFunction's attachmentOption field""" + attachmentOption: SalesforceStringFilter + + """Filter by the EmailServicesFunction's apexClassId field""" + apexClassId: SalesforceIdFilter + + """Filter by the EmailServicesFunction's overLimitAction field""" + overLimitAction: SalesforceStringFilter + + """Filter by the EmailServicesFunction's functionInactiveAction field""" + functionInactiveAction: SalesforceStringFilter + + """Filter by the EmailServicesFunction's addressInactiveAction field""" + addressInactiveAction: SalesforceStringFilter + + """ + Filter by the EmailServicesFunction's authenticationFailureAction field + """ + authenticationFailureAction: SalesforceStringFilter + + """Filter by the EmailServicesFunction's authorizationFailureAction field""" + authorizationFailureAction: SalesforceStringFilter + + """Filter by the EmailServicesFunction's isErrorRoutingEnabled field""" + isErrorRoutingEnabled: SalesforceBooleanFilter + + """Filter by the EmailServicesFunction's errorRoutingAddress field""" + errorRoutingAddress: SalesforceStringFilter + + """Filter by the EmailServicesFunction's isTextAttachmentsAsBinary field""" + isTextAttachmentsAsBinary: SalesforceBooleanFilter + + """Filter by the EmailServicesFunction's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the EmailServicesFunction's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the EmailServicesFunction's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the EmailServicesFunction's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the EmailServicesFunction's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEmailServicesFunctionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEmailServicesFunctionConnectionFilter!] +} + +""" +A filter to be used against EmailServicesAddress object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEmailServicesAddressConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the EmailServicesAddress's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the EmailServicesAddress's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the EmailServicesAddress's function relation.""" + function: SalesforceEmailServicesFunctionConnectionFilter + + """Filter by the EmailServicesAddress's runAsUser relation.""" + runAsUser: SalesforceUserConnectionFilter + + """Filter by the EmailServicesAddress's id field""" + id: SalesforceIdFilter + + """Filter by the EmailServicesAddress's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the EmailServicesAddress's localPart field""" + localPart: SalesforceStringFilter + + """Filter by the EmailServicesAddress's emailDomainName field""" + emailDomainName: SalesforceStringFilter + + """Filter by the EmailServicesAddress's authorizedSenders field""" + authorizedSenders: SalesforceStringFilter + + """Filter by the EmailServicesAddress's runAsUserId field""" + runAsUserId: SalesforceIdFilter + + """Filter by the EmailServicesAddress's functionId field""" + functionId: SalesforceIdFilter + + """Filter by the EmailServicesAddress's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the EmailServicesAddress's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the EmailServicesAddress's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the EmailServicesAddress's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the EmailServicesAddress's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the EmailServicesAddress's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEmailServicesAddressConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEmailServicesAddressConnectionFilter!] +} + +"""Field that Email Services Addresses can be sorted by""" +enum SalesforceEmailServicesAddressSortByFieldEnum { + ID + IS_ACTIVE + LOCAL_PART + EMAIL_DOMAIN_NAME + AUTHORIZED_SENDERS + RUN_AS_USER_ID + FUNCTION_ID + DEVELOPER_NAME + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceEmailServicesAddressEdge { + """The item at the end of the edge.""" + node: SalesforceEmailServicesAddress! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Email Services Address""" +type SalesforceEmailServicesAddress implements OneGraphNode { + """Address ID""" + id: String! + + """Active""" + isActive: Boolean! + + """Email address""" + localPart: String! + + """Email address domain""" + emailDomainName: String + + """Accept Email From""" + authorizedSenders: String + + """User ID""" + runAsUserId: String! + + """User ID""" + runAsUser: SalesforceUser! + + """Service ID""" + functionId: String! + + """Service ID""" + function: SalesforceEmailServicesFunction! + + """Email Address Name""" + developerName: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Email Services Addresses connection, for use in pagination.""" +type SalesforceEmailServicesAddresssConnection { + """ + The count of all Email Services Address you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Email Services Addresses""" + nodes: [SalesforceEmailServicesAddress!]! + + """List of Email Services Address edges""" + edges: [SalesforceEmailServicesAddressEdge!]! +} + +"""Email Service""" +type SalesforceEmailServicesFunction implements OneGraphNode { + """Service ID""" + id: String! + + """Active""" + isActive: Boolean! + + """Email Service Name""" + functionName: String! + + """Accept Email From""" + authorizedSenders: String + + """Advanced Email Security Settings""" + isAuthenticationRequired: Boolean! + + """TLS Required""" + isTlsRequired: Boolean! + + """Accept Attachments""" + attachmentOption: String! + + """Class ID""" + apexClassId: String + + """Class ID""" + apexClass: SalesforceApexClass + + """Over Email Rate Limit Action""" + overLimitAction: String + + """Deactivated Email Service Action""" + functionInactiveAction: String + + """Deactivated Email Address Action""" + addressInactiveAction: String + + """Unauthenticated Sender Action""" + authenticationFailureAction: String + + """Unauthorized Sender Action""" + authorizationFailureAction: String + + """Enable Error Routing""" + isErrorRoutingEnabled: Boolean! + + """Route Error Emails to This Email Address""" + errorRoutingAddress: String + + """Convert Text Attachments to Binary Attachments""" + isTextAttachmentsAsBinary: Boolean! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce EmailServicesAddress""" + addresses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailServicesAddressConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailServicesAddressSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailServicesAddressSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of EmailServicesAddresses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceEmailServicesAddresssConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Email Services connection, for use in pagination.""" +type SalesforceEmailServicesFunctionsConnection { + """The count of all Email Service you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Email Services""" + nodes: [SalesforceEmailServicesFunction!]! + + """List of Email Service edges""" + edges: [SalesforceEmailServicesFunctionEdge!]! +} + +"""Field that Auth. Providers can be sorted by""" +enum SalesforceAuthProviderSortByFieldEnum { + ID + CREATED_DATE + PROVIDER_TYPE + FRIENDLY_NAME + DEVELOPER_NAME + REGISTRATION_HANDLER_ID + EXECUTION_USER_ID + CONSUMER_KEY + ERROR_URL + AUTHORIZE_URL + TOKEN_URL + USER_INFO_URL + DEFAULT_SCOPES + ID_TOKEN_ISSUER + ICON_URL + LOGOUT_URL + PLUGIN_ID + CUSTOM_METADATA_TYPE_RECORD +} + +"""An edge in a connection.""" +type SalesforceAuthProviderEdge { + """The item at the end of the edge.""" + node: SalesforceAuthProvider! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Auth. Providers connection, for use in pagination.""" +type SalesforceAuthProvidersConnection { + """The count of all Auth. Provider you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Auth. Providers""" + nodes: [SalesforceAuthProvider!]! + + """List of Auth. Provider edges""" + edges: [SalesforceAuthProviderEdge!]! +} + +"""An edge in a connection.""" +type SalesforceApexTestQueueItemEdge { + """The item at the end of the edge.""" + node: SalesforceApexTestQueueItem! + + """A cursor for use in pagination""" + cursor: String! +} + +"""An edge in a connection.""" +type SalesforceFlowRecordRelationEdge { + """The item at the end of the edge.""" + node: SalesforceFlowRecordRelation! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Account Clean Info""" +type SalesforceAccountCleanInfo implements OneGraphNode { + """Account Clean Info ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Account Clean Info Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Account ID""" + accountId: String! + + """Account ID""" + account: SalesforceAccount! + + """Last Matched Date""" + lastMatchedDate: String! + + """Last Status Changed Date""" + lastStatusChangedDate: String + + """User ID""" + lastStatusChangedById: String + + """User ID""" + lastStatusChangedBy: SalesforceUser + + """Company Status in Salesforce""" + isInactive: Boolean! + + """Company Name""" + companyName: String + + """Phone""" + phone: String + + """Street""" + street: String + + """City""" + city: String + + """State""" + state: String + + """Zip""" + postalCode: String + + """Country""" + country: String + + """Latitude""" + latitude: Float + + """Longitude""" + longitude: Float + + """Geocode Accuracy""" + geocodeAccuracy: String + + """Address""" + address: SalesforceAddress + + """Website""" + website: String + + """Ticker Symbol""" + tickerSymbol: String + + """Annual Revenue""" + annualRevenue: Float + + """Number of Employees""" + numberOfEmployees: Int + + """Industry""" + industry: String + + """Ownership""" + ownership: String + + """D-U-N-S Number""" + dunsNumber: String + + """SIC Code""" + sic: String + + """SIC Description""" + sicDescription: String + + """NAICS Code""" + naicsCode: String + + """NAICS Description""" + naicsDescription: String + + """Year Started""" + yearStarted: String + + """Fax""" + fax: String + + """Account Site""" + accountSite: String + + """Description""" + description: String + + """Tradestyle""" + tradestyle: String + + """D&B Company D-U-N-S Number""" + dandBCompanyDunsNumber: String + + """DUNSRight™ Match Grade""" + dunsRightMatchGrade: String + + """DUNSRight™ Match Confidence""" + dunsRightMatchConfidence: Int + + """Company Status per Data.com""" + companyStatusDataDotCom: String + + """Company Name is Reviewed""" + isReviewedCompanyName: Boolean! + + """Phone is Reviewed""" + isReviewedPhone: Boolean! + + """Address is Reviewed""" + isReviewedAddress: Boolean! + + """Website is Reviewed""" + isReviewedWebsite: Boolean! + + """Ticker Symbol is Reviewed""" + isReviewedTickerSymbol: Boolean! + + """Annual Revenue is Reviewed""" + isReviewedAnnualRevenue: Boolean! + + """Number of Employees is Reviewed""" + isReviewedNumberOfEmployees: Boolean! + + """Industry is Reviewed""" + isReviewedIndustry: Boolean! + + """Ownership is Reviewed""" + isReviewedOwnership: Boolean! + + """D-U-N-S Number is Reviewed""" + isReviewedDunsNumber: Boolean! + + """SIC Code is Reviewed""" + isReviewedSic: Boolean! + + """SIC Description is Reviewed""" + isReviewedSicDescription: Boolean! + + """NAICS Code is Reviewed""" + isReviewedNaicsCode: Boolean! + + """NAICS Description is Reviewed""" + isReviewedNaicsDescription: Boolean! + + """Year Started is Reviewed""" + isReviewedYearStarted: Boolean! + + """Fax is Reviewed""" + isReviewedFax: Boolean! + + """Account Site is Reviewed""" + isReviewedAccountSite: Boolean! + + """Description is Reviewed""" + isReviewedDescription: Boolean! + + """Tradestyle is Reviewed""" + isReviewedTradestyle: Boolean! + + """D&B Company D-U-N-S Number is Reviewed""" + isReviewedDandBCompanyDunsNumber: Boolean! + + """Company Name is Different""" + isDifferentCompanyName: Boolean! + + """Phone is Different""" + isDifferentPhone: Boolean! + + """Street is Different""" + isDifferentStreet: Boolean! + + """City is Different""" + isDifferentCity: Boolean! + + """State is Different""" + isDifferentState: Boolean! + + """ZIP is Different""" + isDifferentPostalCode: Boolean! + + """Country is Different""" + isDifferentCountry: Boolean! + + """Website is Different""" + isDifferentWebsite: Boolean! + + """Ticker Symbol is Different""" + isDifferentTickerSymbol: Boolean! + + """Annual Revenue is Different""" + isDifferentAnnualRevenue: Boolean! + + """Number of Employees is Different""" + isDifferentNumberOfEmployees: Boolean! + + """Industry is Different""" + isDifferentIndustry: Boolean! + + """Ownership is Different""" + isDifferentOwnership: Boolean! + + """D-U-N-S Number is Different""" + isDifferentDunsNumber: Boolean! + + """SIC Code is Different""" + isDifferentSic: Boolean! + + """SIC Description is Different""" + isDifferentSicDescription: Boolean! + + """NAICS Code is Different""" + isDifferentNaicsCode: Boolean! + + """NAICS Description is Different""" + isDifferentNaicsDescription: Boolean! + + """Year Started is Different""" + isDifferentYearStarted: Boolean! + + """Fax is Different""" + isDifferentFax: Boolean! + + """Account Site is Different""" + isDifferentAccountSite: Boolean! + + """Description is Different""" + isDifferentDescription: Boolean! + + """Tradestyle is Different""" + isDifferentTradestyle: Boolean! + + """D&B Company D-U-N-S Number is Different""" + isDifferentDandBCompanyDunsNumber: Boolean! + + """State Code is Different""" + isDifferentStateCode: Boolean! + + """Country Code is Different""" + isDifferentCountryCode: Boolean! + + """Cleaned by Job""" + cleanedByJob: Boolean! + + """Cleaned by User""" + cleanedByUser: Boolean! + + """Company Name is Flagged Wrong""" + isFlaggedWrongCompanyName: Boolean! + + """Phone is Flagged Wrong""" + isFlaggedWrongPhone: Boolean! + + """Address is Flagged Wrong""" + isFlaggedWrongAddress: Boolean! + + """Website is Flagged Wrong""" + isFlaggedWrongWebsite: Boolean! + + """Ticker Symbol is Flagged Wrong""" + isFlaggedWrongTickerSymbol: Boolean! + + """Annual Revenue is Flagged Wrong""" + isFlaggedWrongAnnualRevenue: Boolean! + + """Number of Employees is Flagged Wrong""" + isFlaggedWrongNumberOfEmployees: Boolean! + + """Industry is Flagged Wrong""" + isFlaggedWrongIndustry: Boolean! + + """Ownership is Flagged Wrong""" + isFlaggedWrongOwnership: Boolean! + + """D-U-N-S Number is Flagged Wrong""" + isFlaggedWrongDunsNumber: Boolean! + + """SIC Code is Flagged Wrong""" + isFlaggedWrongSic: Boolean! + + """SIC Description is Flagged Wrong""" + isFlaggedWrongSicDescription: Boolean! + + """NAICS Code is Flagged Wrong""" + isFlaggedWrongNaicsCode: Boolean! + + """NAICS Description is Flagged Wrong""" + isFlaggedWrongNaicsDescription: Boolean! + + """Year Started is Flagged Wrong""" + isFlaggedWrongYearStarted: Boolean! + + """Fax is Flagged Wrong""" + isFlaggedWrongFax: Boolean! + + """Account Site is Flagged Wrong""" + isFlaggedWrongAccountSite: Boolean! + + """Description is Flagged Wrong""" + isFlaggedWrongDescription: Boolean! + + """Tradestyle is Flagged Wrong""" + isFlaggedWrongTradestyle: Boolean! + + """Data.com ID""" + dataDotComId: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Account Contact Role""" +type SalesforceAccountContactRole implements OneGraphNode { + """Contact Role ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Account ID""" + accountId: String! + + """Account ID""" + account: SalesforceAccount! + + """Contact ID""" + contactId: String! + + """Contact ID""" + contact: SalesforceContact! + + """Role""" + role: String + + """Primary""" + isPrimary: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against BackgroundOperation object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceBackgroundOperationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the BackgroundOperation's groupLeader relation.""" + groupLeader: SalesforceBackgroundOperationConnectionFilter + + """Filter by the BackgroundOperation's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the BackgroundOperation's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the BackgroundOperation's id field""" + id: SalesforceIdFilter + + """Filter by the BackgroundOperation's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the BackgroundOperation's name field""" + name: SalesforceStringFilter + + """Filter by the BackgroundOperation's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the BackgroundOperation's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the BackgroundOperation's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the BackgroundOperation's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the BackgroundOperation's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the BackgroundOperation's submittedAt field""" + submittedAt: SalesforceDateTimeFilter + + """Filter by the BackgroundOperation's status field""" + status: SalesforceStringFilter + + """Filter by the BackgroundOperation's executionGroup field""" + executionGroup: SalesforceStringFilter + + """Filter by the BackgroundOperation's sequenceGroup field""" + sequenceGroup: SalesforceStringFilter + + """Filter by the BackgroundOperation's sequenceNumber field""" + sequenceNumber: SalesforceIntFilter + + """Filter by the BackgroundOperation's groupLeaderId field""" + groupLeaderId: SalesforceIdFilter + + """Filter by the BackgroundOperation's startedAt field""" + startedAt: SalesforceDateTimeFilter + + """Filter by the BackgroundOperation's finishedAt field""" + finishedAt: SalesforceDateTimeFilter + + """Filter by the BackgroundOperation's workerUri field""" + workerUri: SalesforceStringFilter + + """Filter by the BackgroundOperation's timeout field""" + timeout: SalesforceIntFilter + + """Filter by the BackgroundOperation's expiresAt field""" + expiresAt: SalesforceDateTimeFilter + + """Filter by the BackgroundOperation's numFollowers field""" + numFollowers: SalesforceIntFilter + + """Filter by the BackgroundOperation's processAfter field""" + processAfter: SalesforceDateTimeFilter + + """Filter by the BackgroundOperation's parentKey field""" + parentKey: SalesforceStringFilter + + """Filter by the BackgroundOperation's retryLimit field""" + retryLimit: SalesforceIntFilter + + """Filter by the BackgroundOperation's retryCount field""" + retryCount: SalesforceIntFilter + + """Filter by the BackgroundOperation's retryBackoff field""" + retryBackoff: SalesforceIntFilter + + """Filter by the BackgroundOperation's error field""" + error: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceBackgroundOperationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceBackgroundOperationConnectionFilter!] +} + +"""Field that Background Operations can be sorted by""" +enum SalesforceBackgroundOperationSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + SUBMITTED_AT + STATUS + EXECUTION_GROUP + SEQUENCE_GROUP + SEQUENCE_NUMBER + GROUP_LEADER_ID + STARTED_AT + FINISHED_AT + WORKER_URI + TIMEOUT + EXPIRES_AT + NUM_FOLLOWERS + PROCESS_AFTER + PARENT_KEY + RETRY_LIMIT + RETRY_COUNT + RETRY_BACKOFF + ERROR +} + +"""An edge in a connection.""" +type SalesforceBackgroundOperationEdge { + """The item at the end of the edge.""" + node: SalesforceBackgroundOperation! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Background Operations connection, for use in pagination.""" +type SalesforceBackgroundOperationsConnection { + """ + The count of all Background Operation you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Background Operations""" + nodes: [SalesforceBackgroundOperation!]! + + """List of Background Operation edges""" + edges: [SalesforceBackgroundOperationEdge!]! +} + +"""Background Operation""" +type SalesforceBackgroundOperation implements OneGraphNode { + """Background Operation ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Background Operation Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Submitted""" + submittedAt: String + + """Status""" + status: String + + """Execution Group""" + executionGroup: String + + """Sequence Group""" + sequenceGroup: String + + """Sequence Number""" + sequenceNumber: Int + + """Background Operation ID""" + groupLeaderId: String + + """Background Operation ID""" + groupLeader: SalesforceBackgroundOperation + + """Started""" + startedAt: String + + """Finished""" + finishedAt: String + + """Worker URI""" + workerUri: String + + """Timeout""" + timeout: Int + + """ExpiresAt""" + expiresAt: String + + """NumFollowers""" + numFollowers: Int + + """ProcessAfter""" + processAfter: String + + """ParentKey""" + parentKey: String + + """RetryLimit""" + retryLimit: Int + + """RetryCount""" + retryCount: Int + + """RetryBackoff""" + retryBackoff: Int + + """Error""" + error: String + + """Collection of Salesforce BackgroundOperation""" + mergedOperations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceBackgroundOperationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceBackgroundOperationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceBackgroundOperationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of BackgroundOperations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceBackgroundOperationsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Case Contact Role""" +type SalesforceCaseContactRole implements OneGraphNode { + """Contact Role ID""" + id: String! + + """Case ID""" + casesId: String! + + """Case ID""" + cases: SalesforceCase! + + """Contact ID""" + contactId: String! + + """Contact ID""" + contact: SalesforceContact! + + """Role""" + role: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Case Solution""" +type SalesforceCaseSolution implements OneGraphNode { + """Case Solution ID""" + id: String! + + """Case ID""" + caseId: String! + + """Case ID""" + case: SalesforceCase! + + """Solution ID""" + solutionId: String! + + """Solution ID""" + solution: SalesforceSolution! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Contact Clean Info""" +type SalesforceContactCleanInfo implements OneGraphNode { + """Contact Clean Info ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Contact Clean Info Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Contact ID""" + contactId: String! + + """Contact ID""" + contact: SalesforceContact! + + """Last Matched Date""" + lastMatchedDate: String! + + """Last Status Changed Date""" + lastStatusChangedDate: String + + """User ID""" + lastStatusChangedById: String + + """User ID""" + lastStatusChangedBy: SalesforceUser + + """Contact Status in Salesforce""" + isInactive: Boolean! + + """First Name""" + firstName: String + + """Last Name""" + lastName: String + + """Email""" + email: String + + """Phone""" + phone: String + + """Street""" + street: String + + """City""" + city: String + + """State""" + state: String + + """Zip""" + postalCode: String + + """Country""" + country: String + + """Latitude""" + latitude: Float + + """Longitude""" + longitude: Float + + """Geocode Accuracy""" + geocodeAccuracy: String + + """Address""" + address: SalesforceAddress + + """Title""" + title: String + + """Contact Status per Data.com""" + contactStatusDataDotCom: String + + """Name is Reviewed""" + isReviewedName: Boolean! + + """Email is Reviewed""" + isReviewedEmail: Boolean! + + """Phone is Reviewed""" + isReviewedPhone: Boolean! + + """Address is Reviewed""" + isReviewedAddress: Boolean! + + """Title is Reviewed""" + isReviewedTitle: Boolean! + + """First Name is Different""" + isDifferentFirstName: Boolean! + + """Last Name is Different""" + isDifferentLastName: Boolean! + + """Email is Different""" + isDifferentEmail: Boolean! + + """Phone is Different""" + isDifferentPhone: Boolean! + + """Street is Different""" + isDifferentStreet: Boolean! + + """City is Different""" + isDifferentCity: Boolean! + + """State is Different""" + isDifferentState: Boolean! + + """ZIP is Different""" + isDifferentPostalCode: Boolean! + + """Country is Different""" + isDifferentCountry: Boolean! + + """Title is Different""" + isDifferentTitle: Boolean! + + """State Code is Different""" + isDifferentStateCode: Boolean! + + """Country Code is Different""" + isDifferentCountryCode: Boolean! + + """Cleaned by Job""" + cleanedByJob: Boolean! + + """Cleaned by User""" + cleanedByUser: Boolean! + + """Name is Flagged Wrong""" + isFlaggedWrongName: Boolean! + + """Email is Flagged Wrong""" + isFlaggedWrongEmail: Boolean! + + """Phone is Flagged Wrong""" + isFlaggedWrongPhone: Boolean! + + """Address is Flagged Wrong""" + isFlaggedWrongAddress: Boolean! + + """Title is Flagged Wrong""" + isFlaggedWrongTitle: Boolean! + + """Data.com ID""" + dataDotComId: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content Document Subscription""" +type SalesforceContentDocumentSubscription implements OneGraphNode { + """ContentDocumentSubscription ID""" + id: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Document ID""" + contentDocumentId: String! + + """Document ID""" + contentDocument: SalesforceContentDocument! + + """Is Comment Subscription""" + isCommentSub: Boolean! + + """Is Document Subscription""" + isDocumentSub: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Field that Libraries can be sorted by""" +enum SalesforceContentWorkspaceSortByFieldEnum { + ID + NAME + DESCRIPTION + TAG_MODEL + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_MODIFIED_DATE + DEFAULT_RECORD_TYPE_ID + IS_RESTRICT_CONTENT_TYPES + IS_RESTRICT_LINKED_CONTENT_TYPES + WORKSPACE_TYPE + LAST_WORKSPACE_ACTIVITY_DATE + ROOT_CONTENT_FOLDER_ID + NAMESPACE_PREFIX + DEVELOPER_NAME +} + +"""An edge in a connection.""" +type SalesforceContentWorkspaceEdge { + """The item at the end of the edge.""" + node: SalesforceContentWorkspace! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Libraries connection, for use in pagination.""" +type SalesforceContentWorkspacesConnection { + """The count of all Library you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Libraries""" + nodes: [SalesforceContentWorkspace!]! + + """List of Library edges""" + edges: [SalesforceContentWorkspaceEdge!]! +} + +""" +A filter to be used against ContentFolderMember object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentFolderMemberConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentFolderMember's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContentFolderMember's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentFolderMember's childRecord relation.""" + childRecord: SalesforceContentDocumentConnectionFilter + + """Filter by the ContentFolderMember's parentContentFolder relation.""" + parentContentFolder: SalesforceContentFolderConnectionFilter + + """Filter by the ContentFolderMember's id field""" + id: SalesforceIdFilter + + """Filter by the ContentFolderMember's parentContentFolderId field""" + parentContentFolderId: SalesforceIdFilter + + """Filter by the ContentFolderMember's childRecordId field""" + childRecordId: SalesforceIdFilter + + """Filter by the ContentFolderMember's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentFolderMember's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentFolderMember's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentFolderMember's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentFolderMember's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContentFolderMember's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentFolderMemberConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentFolderMemberConnectionFilter!] +} + +"""Field that Content Folder Members can be sorted by""" +enum SalesforceContentFolderMemberSortByFieldEnum { + ID + PARENT_CONTENT_FOLDER_ID + CHILD_RECORD_ID + IS_DELETED + SYSTEM_MODSTAMP + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE +} + +"""An edge in a connection.""" +type SalesforceContentFolderMemberEdge { + """The item at the end of the edge.""" + node: SalesforceContentFolderMember! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Content Folder Members connection, for use in pagination.""" +type SalesforceContentFolderMembersConnection { + """ + The count of all Content Folder Member you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Folder Members""" + nodes: [SalesforceContentFolderMember!]! + + """List of Content Folder Member edges""" + edges: [SalesforceContentFolderMemberEdge!]! +} + +""" +A filter to be used against ContentFolderLink object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentFolderLinkConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentFolderLink's contentFolder relation.""" + contentFolder: SalesforceContentFolderConnectionFilter + + """Filter by the ContentFolderLink's parentEntity relation.""" + parentEntity: SalesforceContentWorkspaceConnectionFilter + + """Filter by the ContentFolderLink's id field""" + id: SalesforceIdFilter + + """Filter by the ContentFolderLink's parentEntityId field""" + parentEntityId: SalesforceIdFilter + + """Filter by the ContentFolderLink's contentFolderId field""" + contentFolderId: SalesforceIdFilter + + """Filter by the ContentFolderLink's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentFolderLink's enableFolderStatus field""" + enableFolderStatus: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentFolderLinkConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentFolderLinkConnectionFilter!] +} + +"""Field that Content Folder Links can be sorted by""" +enum SalesforceContentFolderLinkSortByFieldEnum { + ID + PARENT_ENTITY_ID + CONTENT_FOLDER_ID + IS_DELETED + ENABLE_FOLDER_STATUS +} + +"""An edge in a connection.""" +type SalesforceContentFolderLinkEdge { + """The item at the end of the edge.""" + node: SalesforceContentFolderLink! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Content Folder Link""" +type SalesforceContentFolderLink implements OneGraphNode { + """Content Folder Link ID""" + id: String! + + """Parent Entity ID""" + parentEntityId: String! + + """Parent Entity ID""" + parentEntity: SalesforceContentWorkspace! + + """Content Folder ID""" + contentFolderId: String! + + """Content Folder ID""" + contentFolder: SalesforceContentFolder! + + """Is Deleted""" + isDeleted: Boolean! + + """Enable Folder Status""" + enableFolderStatus: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Content Folder Links connection, for use in pagination.""" +type SalesforceContentFolderLinksConnection { + """ + The count of all Content Folder Link you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Folder Links""" + nodes: [SalesforceContentFolderLink!]! + + """List of Content Folder Link edges""" + edges: [SalesforceContentFolderLinkEdge!]! +} + +""" +A filter to be used against ContentFolderItem object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentFolderItemConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentFolderItem's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContentFolderItem's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentFolderItem's parentContentFolder relation.""" + parentContentFolder: SalesforceContentFolderConnectionFilter + + """Filter by the ContentFolderItem's id field""" + id: SalesforceIdFilter + + """Filter by the ContentFolderItem's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentFolderItem's isFolder field""" + isFolder: SalesforceBooleanFilter + + """Filter by the ContentFolderItem's parentContentFolderId field""" + parentContentFolderId: SalesforceIdFilter + + """Filter by the ContentFolderItem's title field""" + title: SalesforceStringFilter + + """Filter by the ContentFolderItem's fileType field""" + fileType: SalesforceStringFilter + + """Filter by the ContentFolderItem's contentSize field""" + contentSize: SalesforceIntFilter + + """Filter by the ContentFolderItem's fileExtension field""" + fileExtension: SalesforceStringFilter + + """Filter by the ContentFolderItem's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentFolderItem's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentFolderItem's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContentFolderItem's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContentFolderItem's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentFolderItemConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentFolderItemConnectionFilter!] +} + +"""Field that Content Folder Items can be sorted by""" +enum SalesforceContentFolderItemSortByFieldEnum { + ID + IS_DELETED + IS_FOLDER + PARENT_CONTENT_FOLDER_ID + TITLE + FILE_TYPE + CONTENT_SIZE + FILE_EXTENSION + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceContentFolderItemEdge { + """The item at the end of the edge.""" + node: SalesforceContentFolderItem! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Content Folder Item""" +type SalesforceContentFolderItem implements OneGraphNode { + """Content Folder Item ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Is Folder""" + isFolder: Boolean! + + """Parent Content Folder ID""" + parentContentFolderId: String + + """Parent Content Folder ID""" + parentContentFolder: SalesforceContentFolder + + """Title""" + title: String! + + """File Type""" + fileType: String + + """Size""" + contentSize: Int + + """File Extension""" + fileExtension: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Content Folder Items connection, for use in pagination.""" +type SalesforceContentFolderItemsConnection { + """ + The count of all Content Folder Item you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Folder Items""" + nodes: [SalesforceContentFolderItem!]! + + """List of Content Folder Item edges""" + edges: [SalesforceContentFolderItemEdge!]! +} + +"""Field that Content Folders can be sorted by""" +enum SalesforceContentFolderSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + PARENT_CONTENT_FOLDER_ID +} + +"""An edge in a connection.""" +type SalesforceContentFolderEdge { + """The item at the end of the edge.""" + node: SalesforceContentFolder! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Content Folders connection, for use in pagination.""" +type SalesforceContentFoldersConnection { + """The count of all Content Folder you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Folders""" + nodes: [SalesforceContentFolder!]! + + """List of Content Folder edges""" + edges: [SalesforceContentFolderEdge!]! +} + +"""Content Folder""" +type SalesforceContentFolder implements OneGraphNode { + """Content Folder ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Parent Content Folder ID""" + parentContentFolderId: String + + """Parent Content Folder ID""" + parentContentFolder: SalesforceContentFolder + + """Collection of Salesforce ContentFolder""" + contentFolders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentFolderSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentFolders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentFoldersConnection + + """Collection of Salesforce ContentFolderItem""" + contentFolderItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentFolderItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentFolderItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentFolderItemsConnection + + """Collection of Salesforce ContentFolderLink""" + contentFolderLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentFolderLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentFolderLinks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentFolderLinksConnection + + """Collection of Salesforce ContentFolderMember""" + contentFolderMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentFolderMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentFolderMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentFolderMembersConnection + + """Collection of Salesforce ContentWorkspace""" + contentWorkspaces( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspaceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentWorkspaces to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentWorkspacesConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content Folder Member""" +type SalesforceContentFolderMember implements OneGraphNode { + """Content Folder Member ID""" + id: String! + + """Parent Content Folder ID""" + parentContentFolderId: String! + + """Parent Content Folder ID""" + parentContentFolder: SalesforceContentFolder! + + """Child Record ID""" + childRecordId: String! + + """Child Record ID""" + childRecord: SalesforceContentDocument! + + """Deleted""" + isDeleted: Boolean! + + """System Modstamp""" + systemModstamp: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against ContentWorkspacePermission object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentWorkspacePermissionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentWorkspacePermission's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContentWorkspacePermission's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentWorkspacePermission's id field""" + id: SalesforceIdFilter + + """Filter by the ContentWorkspacePermission's name field""" + name: SalesforceStringFilter + + """Filter by the ContentWorkspacePermission's type field""" + type: SalesforceStringFilter + + """ + Filter by the ContentWorkspacePermission's permissionsManageWorkspace field + """ + permissionsManageWorkspace: SalesforceBooleanFilter + + """Filter by the ContentWorkspacePermission's permissionsAddContent field""" + permissionsAddContent: SalesforceBooleanFilter + + """ + Filter by the ContentWorkspacePermission's permissionsAddContentObo field + """ + permissionsAddContentObo: SalesforceBooleanFilter + + """ + Filter by the ContentWorkspacePermission's permissionsArchiveContent field + """ + permissionsArchiveContent: SalesforceBooleanFilter + + """ + Filter by the ContentWorkspacePermission's permissionsDeleteContent field + """ + permissionsDeleteContent: SalesforceBooleanFilter + + """ + Filter by the ContentWorkspacePermission's permissionsFeatureContent field + """ + permissionsFeatureContent: SalesforceBooleanFilter + + """ + Filter by the ContentWorkspacePermission's permissionsViewComments field + """ + permissionsViewComments: SalesforceBooleanFilter + + """Filter by the ContentWorkspacePermission's permissionsAddComment field""" + permissionsAddComment: SalesforceBooleanFilter + + """ + Filter by the ContentWorkspacePermission's permissionsModifyComments field + """ + permissionsModifyComments: SalesforceBooleanFilter + + """Filter by the ContentWorkspacePermission's permissionsTagContent field""" + permissionsTagContent: SalesforceBooleanFilter + + """ + Filter by the ContentWorkspacePermission's permissionsDeliverContent field + """ + permissionsDeliverContent: SalesforceBooleanFilter + + """ + Filter by the ContentWorkspacePermission's permissionsChatterSharing field + """ + permissionsChatterSharing: SalesforceBooleanFilter + + """ + Filter by the ContentWorkspacePermission's permissionsOrganizeFileAndFolder field + """ + permissionsOrganizeFileAndFolder: SalesforceBooleanFilter + + """Filter by the ContentWorkspacePermission's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentWorkspacePermission's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentWorkspacePermission's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContentWorkspacePermission's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentWorkspacePermission's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContentWorkspacePermission's description field""" + description: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentWorkspacePermissionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentWorkspacePermissionConnectionFilter!] +} + +""" +A filter to be used against ContentWorkspaceMember object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentWorkspaceMemberConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentWorkspaceMember's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """ + Filter by the ContentWorkspaceMember's contentWorkspacePermission relation. + """ + contentWorkspacePermission: SalesforceContentWorkspacePermissionConnectionFilter + + """Filter by the ContentWorkspaceMember's contentWorkspace relation.""" + contentWorkspace: SalesforceContentWorkspaceConnectionFilter + + """Filter by the ContentWorkspaceMember's id field""" + id: SalesforceIdFilter + + """Filter by the ContentWorkspaceMember's contentWorkspaceId field""" + contentWorkspaceId: SalesforceIdFilter + + """ + Filter by the ContentWorkspaceMember's contentWorkspacePermissionId field + """ + contentWorkspacePermissionId: SalesforceIdFilter + + """Filter by the ContentWorkspaceMember's memberId field""" + memberId: SalesforceIdFilter + + """Filter by the ContentWorkspaceMember's memberType field""" + memberType: SalesforceStringFilter + + """Filter by the ContentWorkspaceMember's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentWorkspaceMember's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentWorkspaceMemberConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentWorkspaceMemberConnectionFilter!] +} + +"""Field that Library Members can be sorted by""" +enum SalesforceContentWorkspaceMemberSortByFieldEnum { + ID + CONTENT_WORKSPACE_ID + CONTENT_WORKSPACE_PERMISSION_ID + MEMBER_ID + MEMBER_TYPE + CREATED_BY_ID + CREATED_DATE +} + +"""An edge in a connection.""" +type SalesforceContentWorkspaceMemberEdge { + """The item at the end of the edge.""" + node: SalesforceContentWorkspaceMember! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceContentWorkspaceMemberMemberUnion = SalesforceUser | SalesforceGroup + +"""Library Member""" +type SalesforceContentWorkspaceMember implements OneGraphNode { + """Library Member ID""" + id: String! + + """Library ID""" + contentWorkspaceId: String! + + """Library ID""" + contentWorkspace: SalesforceContentWorkspace! + + """Library Permission ID""" + contentWorkspacePermissionId: String + + """Library Permission ID""" + contentWorkspacePermission: SalesforceContentWorkspacePermission + + """Member ID""" + memberId: String! + + """Member ID""" + member: SalesforceContentWorkspaceMemberMemberUnion! + + """Member Type""" + memberType: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Library Members connection, for use in pagination.""" +type SalesforceContentWorkspaceMembersConnection { + """The count of all Library Member you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Library Members""" + nodes: [SalesforceContentWorkspaceMember!]! + + """List of Library Member edges""" + edges: [SalesforceContentWorkspaceMemberEdge!]! +} + +""" +A filter to be used against ContentNotification object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentNotificationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentNotification's users relation.""" + users: SalesforceUserConnectionFilter + + """Filter by the ContentNotification's id field""" + id: SalesforceIdFilter + + """Filter by the ContentNotification's nature field""" + nature: SalesforceStringFilter + + """Filter by the ContentNotification's usersId field""" + usersId: SalesforceIdFilter + + """Filter by the ContentNotification's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentNotification's entityType field""" + entityType: SalesforceStringFilter + + """Filter by the ContentNotification's entityIdentifierId field""" + entityIdentifierId: SalesforceIdFilter + + """Filter by the ContentNotification's subject field""" + subject: SalesforceStringFilter + + """Filter by the ContentNotification's text field""" + text: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentNotificationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentNotificationConnectionFilter!] +} + +"""Field that Content Notifications can be sorted by""" +enum SalesforceContentNotificationSortByFieldEnum { + ID + NATURE + USERS_ID + CREATED_DATE + ENTITY_TYPE + ENTITY_IDENTIFIER_ID + SUBJECT + TEXT +} + +"""An edge in a connection.""" +type SalesforceContentNotificationEdge { + """The item at the end of the edge.""" + node: SalesforceContentNotification! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Content Notifications connection, for use in pagination.""" +type SalesforceContentNotificationsConnection { + """ + The count of all Content Notification you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Notifications""" + nodes: [SalesforceContentNotification!]! + + """List of Content Notification edges""" + edges: [SalesforceContentNotificationEdge!]! +} + +"""Library Permission""" +type SalesforceContentWorkspacePermission implements OneGraphNode { + """Library Permission ID""" + id: String! + + """Name""" + name: String! + + """Type""" + type: String + + """Manage Library""" + permissionsManageWorkspace: Boolean! + + """Add Content""" + permissionsAddContent: Boolean! + + """Add Content on Behalf of Others""" + permissionsAddContentObo: Boolean! + + """Archive Content""" + permissionsArchiveContent: Boolean! + + """Delete Content""" + permissionsDeleteContent: Boolean! + + """Feature Content""" + permissionsFeatureContent: Boolean! + + """View Comment""" + permissionsViewComments: Boolean! + + """Add Comment""" + permissionsAddComment: Boolean! + + """Modify Comments""" + permissionsModifyComments: Boolean! + + """Tag Content""" + permissionsTagContent: Boolean! + + """Deliver Content""" + permissionsDeliverContent: Boolean! + + """Attach or Share Content""" + permissionsChatterSharing: Boolean! + + """Organize File and Content Folder""" + permissionsOrganizeFileAndFolder: Boolean! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Description""" + description: String + + """Collection of Salesforce ContentNotification""" + contentNotifications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentNotificationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentNotificationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentNotificationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentNotifications to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentNotificationsConnection + + """Collection of Salesforce ContentWorkspaceMember""" + contentWorkspaceMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspaceMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentWorkspaceMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentWorkspaceMembersConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceContentNotificationEntityIdentifierUnion = SalesforceUser | SalesforceContentWorkspacePermission | SalesforceContentWorkspace | SalesforceContentVersion | SalesforceContentDocument + +"""Content Notification""" +type SalesforceContentNotification implements OneGraphNode { + """ContentNotification ID""" + id: String! + + """Nature""" + nature: String + + """User ID""" + usersId: String! + + """User ID""" + users: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Entity Type""" + entityType: String + + """Entity ID""" + entityIdentifierId: String + + """Entity ID""" + entityIdentifier: SalesforceContentNotificationEntityIdentifierUnion + + """Subject""" + subject: String + + """Text""" + text: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content Version Comment""" +type SalesforceContentVersionComment implements OneGraphNode { + """ContentVersionComment ID""" + id: String! + + """ContentDocument ID""" + contentDocumentId: String! + + """ContentDocument ID""" + contentDocument: SalesforceContentDocument! + + """ContentVersion ID""" + contentVersionId: String! + + """ContentVersion ID""" + contentVersion: SalesforceContentVersion! + + """Version Comment""" + userComment: String + + """Created Date""" + createdDate: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content Version Rating""" +type SalesforceContentVersionRating implements OneGraphNode { + """ContentVersionRating ID""" + id: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Version ID""" + contentVersionId: String! + + """Version ID""" + contentVersion: SalesforceContentVersion! + + """Rating""" + rating: Int + + """User Comment""" + userComment: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Library Document""" +type SalesforceContentWorkspaceDoc implements OneGraphNode { + """Library Document ID""" + id: String! + + """Library ID""" + contentWorkspaceId: String! + + """Library ID""" + contentWorkspace: SalesforceContentWorkspace! + + """ContentDocument ID""" + contentDocumentId: String! + + """ContentDocument ID""" + contentDocument: SalesforceContentDocument! + + """Created Date""" + createdDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Is Owning Library""" + isOwner: Boolean! + + """Is Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Field that Accounts can be sorted by""" +enum SalesforceAccountSortByFieldEnum { + ID + IS_DELETED + MASTER_RECORD_ID + NAME + TYPE + PARENT_ID + BILLING_STREET + BILLING_CITY + BILLING_STATE + BILLING_POSTAL_CODE + BILLING_COUNTRY + BILLING_LATITUDE + BILLING_LONGITUDE + BILLING_GEOCODE_ACCURACY + SHIPPING_STREET + SHIPPING_CITY + SHIPPING_STATE + SHIPPING_POSTAL_CODE + SHIPPING_COUNTRY + SHIPPING_LATITUDE + SHIPPING_LONGITUDE + SHIPPING_GEOCODE_ACCURACY + PHONE + FAX + ACCOUNT_NUMBER + WEBSITE + PHOTO_URL + SIC + INDUSTRY + ANNUAL_REVENUE + NUMBER_OF_EMPLOYEES + OWNERSHIP + TICKER_SYMBOL + RATING + SITE + OWNER_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_ACTIVITY_DATE + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + JIGSAW + JIGSAW_COMPANY_ID + CLEAN_STATUS + ACCOUNT_SOURCE + DUNS_NUMBER + TRADESTYLE + NAICS_CODE + NAICS_DESC + YEAR_STARTED + SIC_DESC + DANDB_COMPANY_ID +} + +"""An edge in a connection.""" +type SalesforceAccountEdge { + """The item at the end of the edge.""" + node: SalesforceAccount! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Accounts connection, for use in pagination.""" +type SalesforceAccountsConnection { + """The count of all Account you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Accounts""" + nodes: [SalesforceAccount!]! + + """List of Account edges""" + edges: [SalesforceAccountEdge!]! +} + +"""D&B Company""" +type SalesforceDandBCompany implements OneGraphNode { + """D&B Company ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Primary Business Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """D-U-N-S Number""" + dunsNumber: String! + + """Street Address""" + street: String + + """City""" + city: String + + """State""" + state: String + + """Postal Code""" + postalCode: String + + """Country""" + country: String + + """Geocode Accuracy""" + geocodeAccuracyStandard: String + + """Primary Address""" + address: SalesforceAddress + + """Telephone Number""" + phone: String + + """Facsimile Number""" + fax: String + + """International Dialing Code""" + countryAccessCode: String + + """Ownership Type Indicator""" + publicIndicator: String + + """Ticker Symbol""" + stockSymbol: String + + """Stock Exchange""" + stockExchange: String + + """Annual Sales Volume""" + salesVolume: Float + + """URL""" + url: String + + """Out Of Business Indicator""" + outOfBusiness: String + + """Number of Employees - Total""" + employeesTotal: Float + + """FIPS MSA Code""" + fipsMsaCode: String + + """FIPS MSA Code Description""" + fipsMsaDesc: String + + """Primary Tradestyle""" + tradeStyle1: String + + """Year Started""" + yearStarted: String + + """Mailing Street Address""" + mailingStreet: String + + """Mailing City""" + mailingCity: String + + """Mailing State""" + mailingState: String + + """Mailing Postal Code""" + mailingPostalCode: String + + """Mailing Country""" + mailingCountry: String + + """Mailing Geocode Accuracy""" + mailingGeocodeAccuracy: String + + """Mailing Address""" + mailingAddress: SalesforceAddress + + """Latitude""" + latitude: String + + """Longitude""" + longitude: String + + """Primary SIC Code""" + primarySic: String + + """Primary SIC Description""" + primarySicDesc: String + + """Second SIC Code""" + secondSic: String + + """Second SIC Description""" + secondSicDesc: String + + """Third SIC Code""" + thirdSic: String + + """Third SIC Description""" + thirdSicDesc: String + + """Fourth SIC Code""" + fourthSic: String + + """Fourth SIC Description""" + fourthSicDesc: String + + """Fifth SIC Code""" + fifthSic: String + + """Fifth SIC Description""" + fifthSicDesc: String + + """Sixth SIC Code""" + sixthSic: String + + """Sixth SIC Description""" + sixthSicDesc: String + + """Primary NAICS Code""" + primaryNaics: String + + """Primary NAICS Description""" + primaryNaicsDesc: String + + """Second NAICS Code""" + secondNaics: String + + """Second NAICS Description""" + secondNaicsDesc: String + + """Third NAICS Code""" + thirdNaics: String + + """Third NAICS Description""" + thirdNaicsDesc: String + + """Fourth NAICS Code""" + fourthNaics: String + + """Fourth NAICS Description""" + fourthNaicsDesc: String + + """Fifth NAICS Code""" + fifthNaics: String + + """Fifth NAICS Description""" + fifthNaicsDesc: String + + """Sixth NAICS Code""" + sixthNaics: String + + """Sixth NAICS Description""" + sixthNaicsDesc: String + + """Location Ownership Indicator""" + ownOrRent: String + + """Number of Employees - Location""" + employeesHere: Float + + """Number of Employees - Location Indicator""" + employeesHereReliability: String + + """Annual Sales Volume Indicator""" + salesVolumeReliability: String + + """Local Currency Code""" + currencyCode: String + + """Legal Structure""" + legalStatus: String + + """Number of Employees - Global""" + globalUltimateTotalEmployees: Float + + """Number of Employees - Total Indicator""" + employeesTotalReliability: String + + """Minority-Owned Indicator""" + minorityOwned: String + + """Woman-Owned Indicator""" + womenOwned: String + + """Small Business Indicator""" + smallBusiness: String + + """Marketing Segmentation Cluster""" + marketingSegmentationCluster: String + + """Import/Export""" + importExportAgent: String + + """Subsidiary Indicator""" + subsidiary: String + + """Second Tradestyle""" + tradeStyle2: String + + """Third Tradestyle""" + tradeStyle3: String + + """Fourth Tradestyle""" + tradeStyle4: String + + """Fifth Tradestyle""" + tradeStyle5: String + + """National Identification Number""" + nationalId: String + + """National Identification System""" + nationalIdType: String + + """US Tax ID Number""" + usTaxId: String + + """Geocode Accuracy""" + geoCodeAccuracy: String + + """Number of Business Family Members""" + familyMembers: Int + + """Delinquency Risk""" + marketingPreScreen: String + + """Global Ultimate D-U-N-S Number""" + globalUltimateDunsNumber: String + + """Global Ultimate Business Name""" + globalUltimateBusinessName: String + + """Parent Company D-U-N-S Number""" + parentOrHqDunsNumber: String + + """Parent Company Business Name""" + parentOrHqBusinessName: String + + """Domestic Ultimate D-U-N-S Number""" + domesticUltimateDunsNumber: String + + """Domestic Ultimate Business Name""" + domesticUltimateBusinessName: String + + """Location Type""" + locationStatus: String + + """Local Currency ISO Code""" + companyCurrencyIsoCode: String + + """Company Description""" + description: String + + """Fortune 1000 Rank""" + fortuneRank: Int + + """S&P 500""" + includedInSnP500: String + + """Location Size""" + premisesMeasure: Int + + """Location Size Accuracy""" + premisesMeasureReliability: String + + """Location Size Unit of Measure""" + premisesMeasureUnit: String + + """Employee Growth""" + employeeQuantityGrowthRate: Float + + """Annual Revenue Growth""" + salesTurnoverGrowthRate: Float + + """Primary SIC8 Code""" + primarySic8: String + + """Primary SIC8 Description""" + primarySic8Desc: String + + """Second SIC8 Code""" + secondSic8: String + + """Second SIC8 Description """ + secondSic8Desc: String + + """Third SIC8 Code""" + thirdSic8: String + + """Third SIC8 Description""" + thirdSic8Desc: String + + """Fourth SIC8 Code""" + fourthSic8: String + + """Fourth SIC8 Description""" + fourthSic8Desc: String + + """Fifth SIC8 Code""" + fifthSic8: String + + """Fifth SIC8 Description""" + fifthSic8Desc: String + + """Sixth SIC8 Code""" + sixthSic8: String + + """Sixth SIC8 Description""" + sixthSic8Desc: String + + """Prior Year Number of Employees - Total""" + priorYearEmployees: Int + + """Prior Year Revenue""" + priorYearRevenue: Float + + """Collection of Salesforce Account""" + accounts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Accounts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Lead""" + leads( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Leads to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against DataAssessmentValueMetric object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDataAssessmentValueMetricConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """ + Filter by the DataAssessmentValueMetric's dataAssessmentFieldMetric relation. + """ + dataAssessmentFieldMetric: SalesforceDataAssessmentFieldMetricConnectionFilter + + """Filter by the DataAssessmentValueMetric's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the DataAssessmentValueMetric's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DataAssessmentValueMetric's id field""" + id: SalesforceIdFilter + + """Filter by the DataAssessmentValueMetric's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DataAssessmentValueMetric's name field""" + name: SalesforceStringFilter + + """Filter by the DataAssessmentValueMetric's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DataAssessmentValueMetric's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DataAssessmentValueMetric's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DataAssessmentValueMetric's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the DataAssessmentValueMetric's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """ + Filter by the DataAssessmentValueMetric's dataAssessmentFieldMetricId field + """ + dataAssessmentFieldMetricId: SalesforceIdFilter + + """Filter by the DataAssessmentValueMetric's fieldValue field""" + fieldValue: SalesforceStringFilter + + """Filter by the DataAssessmentValueMetric's valueCount field""" + valueCount: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDataAssessmentValueMetricConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDataAssessmentValueMetricConnectionFilter!] +} + +"""Field that Data Assessment Field Value Metrics can be sorted by""" +enum SalesforceDataAssessmentValueMetricSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + DATA_ASSESSMENT_FIELD_METRIC_ID + FIELD_VALUE + VALUE_COUNT +} + +"""An edge in a connection.""" +type SalesforceDataAssessmentValueMetricEdge { + """The item at the end of the edge.""" + node: SalesforceDataAssessmentValueMetric! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Data Assessment Field Value Metrics connection, for use in pagination. +""" +type SalesforceDataAssessmentValueMetricsConnection { + """ + The count of all Data Assessment Field Value Metric you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Data Assessment Field Value Metrics""" + nodes: [SalesforceDataAssessmentValueMetric!]! + + """List of Data Assessment Field Value Metric edges""" + edges: [SalesforceDataAssessmentValueMetricEdge!]! +} + +""" +A filter to be used against DataAssessmentMetric object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDataAssessmentMetricConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DataAssessmentMetric's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the DataAssessmentMetric's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DataAssessmentMetric's id field""" + id: SalesforceIdFilter + + """Filter by the DataAssessmentMetric's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DataAssessmentMetric's name field""" + name: SalesforceStringFilter + + """Filter by the DataAssessmentMetric's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DataAssessmentMetric's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DataAssessmentMetric's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DataAssessmentMetric's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the DataAssessmentMetric's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the DataAssessmentMetric's numTotal field""" + numTotal: SalesforceIntFilter + + """Filter by the DataAssessmentMetric's numProcessed field""" + numProcessed: SalesforceIntFilter + + """Filter by the DataAssessmentMetric's numMatched field""" + numMatched: SalesforceIntFilter + + """Filter by the DataAssessmentMetric's numMatchedDifferent field""" + numMatchedDifferent: SalesforceIntFilter + + """Filter by the DataAssessmentMetric's numUnmatched field""" + numUnmatched: SalesforceIntFilter + + """Filter by the DataAssessmentMetric's numDuplicates field""" + numDuplicates: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDataAssessmentMetricConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDataAssessmentMetricConnectionFilter!] +} + +""" +A filter to be used against DataAssessmentFieldMetric object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDataAssessmentFieldMetricConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """ + Filter by the DataAssessmentFieldMetric's dataAssessmentMetric relation. + """ + dataAssessmentMetric: SalesforceDataAssessmentMetricConnectionFilter + + """Filter by the DataAssessmentFieldMetric's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the DataAssessmentFieldMetric's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DataAssessmentFieldMetric's id field""" + id: SalesforceIdFilter + + """Filter by the DataAssessmentFieldMetric's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DataAssessmentFieldMetric's name field""" + name: SalesforceStringFilter + + """Filter by the DataAssessmentFieldMetric's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DataAssessmentFieldMetric's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DataAssessmentFieldMetric's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DataAssessmentFieldMetric's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the DataAssessmentFieldMetric's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the DataAssessmentFieldMetric's dataAssessmentMetricId field""" + dataAssessmentMetricId: SalesforceIdFilter + + """Filter by the DataAssessmentFieldMetric's fieldName field""" + fieldName: SalesforceStringFilter + + """Filter by the DataAssessmentFieldMetric's numMatchedInSync field""" + numMatchedInSync: SalesforceIntFilter + + """Filter by the DataAssessmentFieldMetric's numMatchedDifferent field""" + numMatchedDifferent: SalesforceIntFilter + + """Filter by the DataAssessmentFieldMetric's numMatchedBlanks field""" + numMatchedBlanks: SalesforceIntFilter + + """Filter by the DataAssessmentFieldMetric's numUnmatchedBlanks field""" + numUnmatchedBlanks: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDataAssessmentFieldMetricConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDataAssessmentFieldMetricConnectionFilter!] +} + +"""Field that Data Assessment Field Metrics can be sorted by""" +enum SalesforceDataAssessmentFieldMetricSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + DATA_ASSESSMENT_METRIC_ID + FIELD_NAME + NUM_MATCHED_IN_SYNC + NUM_MATCHED_DIFFERENT + NUM_MATCHED_BLANKS + NUM_UNMATCHED_BLANKS +} + +"""An edge in a connection.""" +type SalesforceDataAssessmentFieldMetricEdge { + """The item at the end of the edge.""" + node: SalesforceDataAssessmentFieldMetric! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce Data Assessment Field Metrics connection, for use in pagination. +""" +type SalesforceDataAssessmentFieldMetricsConnection { + """ + The count of all Data Assessment Field Metric you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Data Assessment Field Metrics""" + nodes: [SalesforceDataAssessmentFieldMetric!]! + + """List of Data Assessment Field Metric edges""" + edges: [SalesforceDataAssessmentFieldMetricEdge!]! +} + +"""Data Assessment Metric""" +type SalesforceDataAssessmentMetric implements OneGraphNode { + """Data Assessment Metric ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Data Assessment Metric""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Total Number of Records to access""" + numTotal: Int + + """Number of Processed Records""" + numProcessed: Int + + """Number of Matched Records""" + numMatched: Int + + """Number of Matched Records with different field values""" + numMatchedDifferent: Int + + """Number of Unmatched Records""" + numUnmatched: Int + + """Number of Duplicates""" + numDuplicates: Int + + """Collection of Salesforce DataAssessmentFieldMetric""" + dataAssessmentMetrics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDataAssessmentFieldMetricConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDataAssessmentFieldMetricSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDataAssessmentFieldMetricSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DataAssessmentFieldMetrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDataAssessmentFieldMetricsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Data Assessment Field Metric""" +type SalesforceDataAssessmentFieldMetric implements OneGraphNode { + """Data Assessment Field Metric ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Data Assessment Field Metric""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Data Assessment Metric ID""" + dataAssessmentMetricId: String! + + """Data Assessment Metric ID""" + dataAssessmentMetric: SalesforceDataAssessmentMetric! + + """Field Name""" + fieldName: String + + """ + Number of Matched Records that have the same value for this field as Data.com + """ + numMatchedInSync: Int + + """ + Number of Matched Records that have different value for this field than Data.com + """ + numMatchedDifferent: Int + + """Number of Matched Records that have blanks for this field""" + numMatchedBlanks: Int + + """Number of Unmatched Records that have blanks for this field""" + numUnmatchedBlanks: Int + + """Collection of Salesforce DataAssessmentValueMetric""" + dataAssessmentValueMetrics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDataAssessmentValueMetricConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDataAssessmentValueMetricSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDataAssessmentValueMetricSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DataAssessmentValueMetrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDataAssessmentValueMetricsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Data Assessment Field Value Metric""" +type SalesforceDataAssessmentValueMetric implements OneGraphNode { + """Data Assessment Field Value Metric ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Data Assessment Field Value Metric""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Data Assessment Field Metric ID""" + dataAssessmentFieldMetricId: String! + + """Data Assessment Field Metric ID""" + dataAssessmentFieldMetric: SalesforceDataAssessmentFieldMetric! + + """Field Value""" + fieldValue: String + + """Number of times this value appears in this field""" + valueCount: Int + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against DatacloudPurchaseUsage object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDatacloudPurchaseUsageConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DatacloudPurchaseUsage's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the DatacloudPurchaseUsage's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the DatacloudPurchaseUsage's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DatacloudPurchaseUsage's id field""" + id: SalesforceIdFilter + + """Filter by the DatacloudPurchaseUsage's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DatacloudPurchaseUsage's name field""" + name: SalesforceStringFilter + + """Filter by the DatacloudPurchaseUsage's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DatacloudPurchaseUsage's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DatacloudPurchaseUsage's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DatacloudPurchaseUsage's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the DatacloudPurchaseUsage's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the DatacloudPurchaseUsage's userId field""" + userId: SalesforceIdFilter + + """Filter by the DatacloudPurchaseUsage's userType field""" + userType: SalesforceStringFilter + + """Filter by the DatacloudPurchaseUsage's purchaseType field""" + purchaseType: SalesforceStringFilter + + """Filter by the DatacloudPurchaseUsage's datacloudEntityType field""" + datacloudEntityType: SalesforceStringFilter + + """Filter by the DatacloudPurchaseUsage's usage field""" + usage: SalesforceFloatFilter + + """Filter by the DatacloudPurchaseUsage's description field""" + description: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDatacloudPurchaseUsageConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDatacloudPurchaseUsageConnectionFilter!] +} + +""" +A filter to be used against DatacloudOwnedEntity object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDatacloudOwnedEntityConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DatacloudOwnedEntity's purchaseUsage relation.""" + purchaseUsage: SalesforceDatacloudPurchaseUsageConnectionFilter + + """Filter by the DatacloudOwnedEntity's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the DatacloudOwnedEntity's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the DatacloudOwnedEntity's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DatacloudOwnedEntity's id field""" + id: SalesforceIdFilter + + """Filter by the DatacloudOwnedEntity's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DatacloudOwnedEntity's name field""" + name: SalesforceStringFilter + + """Filter by the DatacloudOwnedEntity's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DatacloudOwnedEntity's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DatacloudOwnedEntity's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DatacloudOwnedEntity's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the DatacloudOwnedEntity's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the DatacloudOwnedEntity's dataDotComKey field""" + dataDotComKey: SalesforceStringFilter + + """Filter by the DatacloudOwnedEntity's datacloudEntityType field""" + datacloudEntityType: SalesforceStringFilter + + """Filter by the DatacloudOwnedEntity's userId field""" + userId: SalesforceIdFilter + + """Filter by the DatacloudOwnedEntity's purchaseUsageId field""" + purchaseUsageId: SalesforceIdFilter + + """Filter by the DatacloudOwnedEntity's purchaseType field""" + purchaseType: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDatacloudOwnedEntityConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDatacloudOwnedEntityConnectionFilter!] +} + +"""Field that Data.com Owned Entities can be sorted by""" +enum SalesforceDatacloudOwnedEntitySortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + DATA_DOT_COM_KEY + DATACLOUD_ENTITY_TYPE + USER_ID + PURCHASE_USAGE_ID + PURCHASE_TYPE +} + +"""An edge in a connection.""" +type SalesforceDatacloudOwnedEntityEdge { + """The item at the end of the edge.""" + node: SalesforceDatacloudOwnedEntity! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Data.com Owned Entity""" +type SalesforceDatacloudOwnedEntity implements OneGraphNode { + """Data.com Owned Entity ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Description""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Data.com key""" + dataDotComKey: String! + + """Data.com Object Type""" + datacloudEntityType: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Data.com Usage ID""" + purchaseUsageId: String + + """Data.com Usage ID""" + purchaseUsage: SalesforceDatacloudPurchaseUsage + + """Data.com Purchase Type""" + purchaseType: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Data.com Owned Entities connection, for use in pagination.""" +type SalesforceDatacloudOwnedEntitysConnection { + """ + The count of all Data.com Owned Entity you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Data.com Owned Entities""" + nodes: [SalesforceDatacloudOwnedEntity!]! + + """List of Data.com Owned Entity edges""" + edges: [SalesforceDatacloudOwnedEntityEdge!]! +} + +"""Data.com Usage""" +type SalesforceDatacloudPurchaseUsage implements OneGraphNode { + """Data.com Usage ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Sequence ID""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Data.com Usage Type""" + userType: String! + + """Data.com Purchase Type""" + purchaseType: String! + + """Data.com Object Type""" + datacloudEntityType: String! + + """Purchase Count""" + usage: Float! + + """Description""" + description: String + + """Collection of Salesforce DatacloudOwnedEntity""" + datacloudOwnedEntities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDatacloudOwnedEntityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDatacloudOwnedEntitySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDatacloudOwnedEntitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DatacloudOwnedEntities to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDatacloudOwnedEntitysConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""FileSearchActivity""" +type SalesforceFileSearchActivity implements OneGraphNode { + """Search Activity Id""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Search Activity Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Search Term""" + searchTerm: String! + + """Search Date""" + queryDate: String! + + """Number of Searches""" + countQueries: Int! + + """Number of Users""" + countUsers: Int! + + """Average Number of Results""" + avgNumResults: Float! + + """Duration""" + period: String! + + """Language""" + queryLanguage: String! + + """Average Click Rank""" + clickRank: Float + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Field that Idea Comments can be sorted by""" +enum SalesforceIdeaCommentSortByFieldEnum { + ID + IDEA_ID + COMMUNITY_ID + COMMENT_BODY + CREATED_BY_ID + CREATED_DATE + SYSTEM_MODSTAMP + IS_DELETED + IS_HTML + CREATOR_FULL_PHOTO_URL + CREATOR_SMALL_PHOTO_URL + CREATOR_NAME + UP_VOTES +} + +"""An edge in a connection.""" +type SalesforceIdeaCommentEdge { + """The item at the end of the edge.""" + node: SalesforceIdeaComment! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against Vote object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceVoteConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Vote's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Vote's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Vote's id field""" + id: SalesforceIdFilter + + """Filter by the Vote's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Vote's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the Vote's type field""" + type: SalesforceStringFilter + + """Filter by the Vote's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Vote's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Vote's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Vote's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Vote's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceVoteConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceVoteConnectionFilter!] +} + +"""Field that Votes can be sorted by""" +enum SalesforceVoteSortByFieldEnum { + ID + IS_DELETED + PARENT_ID + TYPE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceVoteEdge { + """The item at the end of the edge.""" + node: SalesforceVote! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceVoteParentUnion = SalesforceSolution | SalesforceIdeaComment | SalesforceIdea + +"""Vote""" +type SalesforceVote implements OneGraphNode { + """Vote ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceVoteParentUnion! + + """Vote Type""" + type: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Votes connection, for use in pagination.""" +type SalesforceVotesConnection { + """The count of all Vote you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Votes""" + nodes: [SalesforceVote!]! + + """List of Vote edges""" + edges: [SalesforceVoteEdge!]! +} + +"""Idea Comment""" +type SalesforceIdeaComment implements OneGraphNode { + """Idea Comment ID""" + id: String! + + """Idea ID""" + ideaId: String! + + """Idea ID""" + idea: SalesforceIdea! + + """Zone ID""" + communityId: String + + """Zone ID""" + community: SalesforceCommunity + + """Comment Body""" + commentBody: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """IsHtml""" + isHtml: Boolean! + + """Url of Creator's Profile Photo""" + creatorFullPhotoUrl: String + + """Url of Creator's Thumbnail Photo""" + creatorSmallPhotoUrl: String + + """Name of Creator""" + creatorName: String + + """Up Votes""" + upVotes: Int + + """Collection of Salesforce Idea""" + ideas( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdeaConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceIdeaSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdeaSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Ideas to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdeasConnection + + """Collection of Salesforce Vote""" + votes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Votes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Idea Comments connection, for use in pagination.""" +type SalesforceIdeaCommentsConnection { + """The count of all Idea Comment you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Idea Comments""" + nodes: [SalesforceIdeaComment!]! + + """List of Idea Comment edges""" + edges: [SalesforceIdeaCommentEdge!]! +} + +""" +A filter to be used against IdeaComment object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceIdeaCommentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the IdeaComment's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the IdeaComment's community relation.""" + community: SalesforceCommunityConnectionFilter + + """Filter by the IdeaComment's idea relation.""" + idea: SalesforceIdeaConnectionFilter + + """Filter by the IdeaComment's id field""" + id: SalesforceIdFilter + + """Filter by the IdeaComment's ideaId field""" + ideaId: SalesforceIdFilter + + """Filter by the IdeaComment's communityId field""" + communityId: SalesforceIdFilter + + """Filter by the IdeaComment's commentBody field""" + commentBody: SalesforceStringFilter + + """Filter by the IdeaComment's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the IdeaComment's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the IdeaComment's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the IdeaComment's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the IdeaComment's isHtml field""" + isHtml: SalesforceBooleanFilter + + """Filter by the IdeaComment's creatorFullPhotoUrl field""" + creatorFullPhotoUrl: SalesforceStringFilter + + """Filter by the IdeaComment's creatorSmallPhotoUrl field""" + creatorSmallPhotoUrl: SalesforceStringFilter + + """Filter by the IdeaComment's creatorName field""" + creatorName: SalesforceStringFilter + + """Filter by the IdeaComment's upVotes field""" + upVotes: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceIdeaCommentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceIdeaCommentConnectionFilter!] +} + +""" +A filter to be used against Community object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCommunityConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Community's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Community's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Community's id field""" + id: SalesforceIdFilter + + """Filter by the Community's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Community's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Community's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Community's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Community's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Community's name field""" + name: SalesforceStringFilter + + """Filter by the Community's description field""" + description: SalesforceStringFilter + + """Filter by the Community's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the Community's isPublished field""" + isPublished: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCommunityConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCommunityConnectionFilter!] +} + +""" +A filter to be used against Idea object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceIdeaConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Idea's parentIdea relation.""" + parentIdea: SalesforceIdeaConnectionFilter + + """Filter by the Idea's lastComment relation.""" + lastComment: SalesforceIdeaCommentConnectionFilter + + """Filter by the Idea's community relation.""" + community: SalesforceCommunityConnectionFilter + + """Filter by the Idea's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Idea's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Idea's recordType relation.""" + recordType: SalesforceRecordTypeConnectionFilter + + """Filter by the Idea's id field""" + id: SalesforceIdFilter + + """Filter by the Idea's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Idea's title field""" + title: SalesforceStringFilter + + """Filter by the Idea's recordTypeId field""" + recordTypeId: SalesforceIdFilter + + """Filter by the Idea's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Idea's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Idea's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Idea's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Idea's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Idea's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Idea's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the Idea's communityId field""" + communityId: SalesforceIdFilter + + """Filter by the Idea's numComments field""" + numComments: SalesforceIntFilter + + """Filter by the Idea's voteScore field""" + voteScore: SalesforceFloatFilter + + """Filter by the Idea's voteTotal field""" + voteTotal: SalesforceFloatFilter + + """Filter by the Idea's status field""" + status: SalesforceStringFilter + + """Filter by the Idea's lastCommentDate field""" + lastCommentDate: SalesforceDateTimeFilter + + """Filter by the Idea's lastCommentId field""" + lastCommentId: SalesforceIdFilter + + """Filter by the Idea's parentIdeaId field""" + parentIdeaId: SalesforceIdFilter + + """Filter by the Idea's isHtml field""" + isHtml: SalesforceBooleanFilter + + """Filter by the Idea's isMerged field""" + isMerged: SalesforceBooleanFilter + + """Filter by the Idea's creatorFullPhotoUrl field""" + creatorFullPhotoUrl: SalesforceStringFilter + + """Filter by the Idea's creatorSmallPhotoUrl field""" + creatorSmallPhotoUrl: SalesforceStringFilter + + """Filter by the Idea's creatorName field""" + creatorName: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceIdeaConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceIdeaConnectionFilter!] +} + +"""Field that Ideas can be sorted by""" +enum SalesforceIdeaSortByFieldEnum { + ID + IS_DELETED + TITLE + RECORD_TYPE_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + COMMUNITY_ID + NUM_COMMENTS + VOTE_SCORE + VOTE_TOTAL + STATUS + LAST_COMMENT_DATE + LAST_COMMENT_ID + PARENT_IDEA_ID + IS_HTML + IS_MERGED + CREATOR_FULL_PHOTO_URL + CREATOR_SMALL_PHOTO_URL + CREATOR_NAME +} + +"""An edge in a connection.""" +type SalesforceIdeaEdge { + """The item at the end of the edge.""" + node: SalesforceIdea! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Ideas connection, for use in pagination.""" +type SalesforceIdeasConnection { + """The count of all Idea you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Ideas""" + nodes: [SalesforceIdea!]! + + """List of Idea edges""" + edges: [SalesforceIdeaEdge!]! +} + +"""Zone""" +type SalesforceCommunity implements OneGraphNode { + """Zone ID""" + id: String! + + """System Modstamp""" + systemModstamp: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Name""" + name: String! + + """Description""" + description: String + + """Active""" + isActive: Boolean! + + """Show In Portal""" + isPublished: Boolean! + + """Collection of Salesforce Idea""" + ideas( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdeaConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceIdeaSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdeaSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Ideas to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdeasConnection + + """Collection of Salesforce IdeaComment""" + ideaComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdeaCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceIdeaCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdeaCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of IdeaComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdeaCommentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Idea""" +type SalesforceIdea implements OneGraphNode { + """Idea ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Title""" + title: String! + + """Record Type ID""" + recordTypeId: String + + """Record Type ID""" + recordType: SalesforceRecordType + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Zone ID""" + communityId: String! + + """Zone ID""" + community: SalesforceCommunity! + + """Idea Body""" + body: String + + """Number of Comments""" + numComments: Int + + """Vote Score""" + voteScore: Float + + """Vote Total""" + voteTotal: Float + + """Categories""" + categories: String + + """Status""" + status: String + + """Last Idea Comment Date""" + lastCommentDate: String + + """Idea Comment ID""" + lastCommentId: String + + """Idea Comment ID""" + lastComment: SalesforceIdeaComment + + """Idea ID""" + parentIdeaId: String + + """Idea ID""" + parentIdea: SalesforceIdea + + """IsHtml""" + isHtml: Boolean! + + """Is Merged""" + isMerged: Boolean! + + """Url of Creator's Profile Photo""" + creatorFullPhotoUrl: String + + """Url of Creator's Thumbnail Photo""" + creatorSmallPhotoUrl: String + + """Name of Creator""" + creatorName: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Idea""" + ideas( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdeaConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceIdeaSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdeaSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Ideas to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdeasConnection + + """Collection of Salesforce IdeaComment""" + comments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdeaCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceIdeaCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdeaCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of IdeaComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdeaCommentsConnection + + """Collection of Salesforce Vote""" + votes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Votes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Lead Clean Info""" +type SalesforceLeadCleanInfo implements OneGraphNode { + """Lead Clean Info ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Lead Clean Info Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Lead ID""" + leadId: String! + + """Lead ID""" + lead: SalesforceLead! + + """Last Matched Date""" + lastMatchedDate: String! + + """Last Status Changed Date""" + lastStatusChangedDate: String + + """User ID""" + lastStatusChangedById: String + + """User ID""" + lastStatusChangedBy: SalesforceUser + + """Contact Status in Salesforce""" + isInactive: Boolean! + + """First Name""" + firstName: String + + """Last Name""" + lastName: String + + """Email""" + email: String + + """Phone""" + phone: String + + """Street""" + street: String + + """City""" + city: String + + """State""" + state: String + + """Zip""" + postalCode: String + + """Country""" + country: String + + """Latitude""" + latitude: Float + + """Longitude""" + longitude: Float + + """Geocode Accuracy""" + geocodeAccuracy: String + + """Address""" + address: SalesforceAddress + + """Title""" + title: String + + """Annual Revenue""" + annualRevenue: Float + + """Number of Employees""" + numberOfEmployees: Int + + """Industry""" + industry: String + + """Company Name""" + companyName: String + + """Company D-U-N-S Number""" + companyDunsNumber: String + + """Contact Status per Data.com""" + contactStatusDataDotCom: String + + """Name is Reviewed""" + isReviewedName: Boolean! + + """Email is Reviewed""" + isReviewedEmail: Boolean! + + """Phone is Reviewed""" + isReviewedPhone: Boolean! + + """Address is Reviewed""" + isReviewedAddress: Boolean! + + """Title is Reviewed""" + isReviewedTitle: Boolean! + + """Annual Revenue is Reviewed""" + isReviewedAnnualRevenue: Boolean! + + """Number of Employees is Reviewed""" + isReviewedNumberOfEmployees: Boolean! + + """Industry is Reviewed""" + isReviewedIndustry: Boolean! + + """Company Name is Reviewed""" + isReviewedCompanyName: Boolean! + + """Company D-U-N-S Number is Reviewed""" + isReviewedCompanyDunsNumber: Boolean! + + """D&B Company D-U-N-S Number is Reviewed""" + isReviewedDandBCompanyDunsNumber: Boolean! + + """First Name is Different""" + isDifferentFirstName: Boolean! + + """Last Name is Different""" + isDifferentLastName: Boolean! + + """Email is Different""" + isDifferentEmail: Boolean! + + """Phone is Different""" + isDifferentPhone: Boolean! + + """Street is Different""" + isDifferentStreet: Boolean! + + """City is Different""" + isDifferentCity: Boolean! + + """State is Different""" + isDifferentState: Boolean! + + """ZIP is Different""" + isDifferentPostalCode: Boolean! + + """Country is Different""" + isDifferentCountry: Boolean! + + """Title is Different""" + isDifferentTitle: Boolean! + + """Annual Revenue is Different""" + isDifferentAnnualRevenue: Boolean! + + """Number of Employees is Different""" + isDifferentNumberOfEmployees: Boolean! + + """Industry is Different""" + isDifferentIndustry: Boolean! + + """Company Name is Different""" + isDifferentCompanyName: Boolean! + + """Company D-U-N-S Number is Different""" + isDifferentCompanyDunsNumber: Boolean! + + """D&B Company D-U-N-S Number is Different""" + isDifferentDandBCompanyDunsNumber: Boolean! + + """State Code is Different""" + isDifferentStateCode: Boolean! + + """Country Code is Different""" + isDifferentCountryCode: Boolean! + + """Cleaned by Job""" + cleanedByJob: Boolean! + + """Cleaned by User""" + cleanedByUser: Boolean! + + """D&B Company D-U-N-S Number""" + dandBCompanyDunsNumber: String + + """Data.com Company ID""" + dataDotComCompanyId: String + + """Name is Flagged Wrong""" + isFlaggedWrongName: Boolean! + + """Email is Flagged Wrong""" + isFlaggedWrongEmail: Boolean! + + """Phone is Flagged Wrong""" + isFlaggedWrongPhone: Boolean! + + """Address is Flagged Wrong""" + isFlaggedWrongAddress: Boolean! + + """Title is Flagged Wrong""" + isFlaggedWrongTitle: Boolean! + + """Annual Revenue is Flagged Wrong""" + isFlaggedWrongAnnualRevenue: Boolean! + + """Number of Employees is Flagged Wrong""" + isFlaggedWrongNumberOfEmployees: Boolean! + + """Industry is Flagged Wrong""" + isFlaggedWrongIndustry: Boolean! + + """Company Name is Flagged Wrong""" + isFlaggedWrongCompanyName: Boolean! + + """Company D-U-N-S Number is Flagged Wrong""" + isFlaggedWrongCompanyDunsNumber: Boolean! + + """Data.com ID""" + dataDotComId: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against MacroInstruction object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceMacroInstructionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the MacroInstruction's macro relation.""" + macro: SalesforceMacroConnectionFilter + + """Filter by the MacroInstruction's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the MacroInstruction's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the MacroInstruction's id field""" + id: SalesforceIdFilter + + """Filter by the MacroInstruction's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the MacroInstruction's name field""" + name: SalesforceStringFilter + + """Filter by the MacroInstruction's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the MacroInstruction's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the MacroInstruction's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the MacroInstruction's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the MacroInstruction's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the MacroInstruction's macroId field""" + macroId: SalesforceIdFilter + + """Filter by the MacroInstruction's operation field""" + operation: SalesforceStringFilter + + """Filter by the MacroInstruction's target field""" + target: SalesforceStringFilter + + """Filter by the MacroInstruction's value field""" + value: SalesforceStringFilter + + """Filter by the MacroInstruction's valueRecord field""" + valueRecord: SalesforceStringFilter + + """Filter by the MacroInstruction's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceMacroInstructionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceMacroInstructionConnectionFilter!] +} + +"""Field that Macro Instructions can be sorted by""" +enum SalesforceMacroInstructionSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + MACRO_ID + OPERATION + TARGET + VALUE + VALUE_RECORD + SORT_ORDER +} + +"""An edge in a connection.""" +type SalesforceMacroInstructionEdge { + """The item at the end of the edge.""" + node: SalesforceMacroInstruction! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Macro Instructions connection, for use in pagination.""" +type SalesforceMacroInstructionsConnection { + """The count of all Macro Instruction you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Macro Instructions""" + nodes: [SalesforceMacroInstruction!]! + + """List of Macro Instruction edges""" + edges: [SalesforceMacroInstructionEdge!]! +} + +""" +A filter to be used against Macro object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceMacroConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Macro's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Macro's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Macro's id field""" + id: SalesforceIdFilter + + """Filter by the Macro's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Macro's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Macro's name field""" + name: SalesforceStringFilter + + """Filter by the Macro's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Macro's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Macro's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Macro's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Macro's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Macro's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Macro's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the Macro's isAlohaSupported field""" + isAlohaSupported: SalesforceBooleanFilter + + """Filter by the Macro's isLightningSupported field""" + isLightningSupported: SalesforceBooleanFilter + + """Filter by the Macro's startingContext field""" + startingContext: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceMacroConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceMacroConnectionFilter!] +} + +""" +A filter to be used against MacroHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceMacroHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the MacroHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the MacroHistory's macro relation.""" + macro: SalesforceMacroConnectionFilter + + """Filter by the MacroHistory's id field""" + id: SalesforceIdFilter + + """Filter by the MacroHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the MacroHistory's macroId field""" + macroId: SalesforceIdFilter + + """Filter by the MacroHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the MacroHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the MacroHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceMacroHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceMacroHistoryConnectionFilter!] +} + +"""Field that Macro Histories can be sorted by""" +enum SalesforceMacroHistorySortByFieldEnum { + ID + IS_DELETED + MACRO_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceMacroHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceMacroHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Macro History""" +type SalesforceMacroHistory implements OneGraphNode { + """Macro History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Macro ID""" + macroId: String! + + """Macro ID""" + macro: SalesforceMacro! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Macro Histories connection, for use in pagination.""" +type SalesforceMacroHistorysConnection { + """The count of all Macro History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Macro Histories""" + nodes: [SalesforceMacroHistory!]! + + """List of Macro History edges""" + edges: [SalesforceMacroHistoryEdge!]! +} + +union SalesforceMacroOwnerUnion = SalesforceUser | SalesforceGroup + +"""Macro""" +type SalesforceMacro implements OneGraphNode { + """Macro ID""" + id: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceMacroOwnerUnion! + + """Deleted""" + isDeleted: Boolean! + + """Macro Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Description""" + description: String + + """Supports Classic""" + isAlohaSupported: Boolean! + + """Supports Lightning""" + isLightningSupported: Boolean! + + """Apply To""" + startingContext: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce MacroHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMacroHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceMacroHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMacroHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of MacroHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMacroHistorysConnection + + """Collection of Salesforce MacroInstruction""" + macroInstructions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMacroInstructionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceMacroInstructionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMacroInstructionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of MacroInstructions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMacroInstructionsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Macro Instruction""" +type SalesforceMacroInstruction implements OneGraphNode { + """Macro Instruction ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Macro Instruction Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Macro ID""" + macroId: String! + + """Macro ID""" + macro: SalesforceMacro! + + """Operation""" + operation: String! + + """Target""" + target: String + + """Value""" + value: String + + """Value Record ID""" + valueRecord: String + + """Sort Order""" + sortOrder: Int! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Push Topic""" +type SalesforcePushTopic implements OneGraphNode { + """Push Topic ID""" + id: String! + + """Topic Name""" + name: String! + + """SOQL Query""" + query: String! + + """API Version""" + apiVersion: Float! + + """Is Active""" + isActive: Boolean! + + """Notify For Fields""" + notifyForFields: String! + + """Notify For Operations""" + notifyForOperations: String! + + """Description""" + description: String + + """Create""" + notifyForOperationCreate: Boolean! + + """Update""" + notifyForOperationUpdate: Boolean! + + """Delete""" + notifyForOperationDelete: Boolean! + + """Undelete""" + notifyForOperationUndelete: Boolean! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against QuickText object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceQuickTextConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the QuickText's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the QuickText's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the QuickText's id field""" + id: SalesforceIdFilter + + """Filter by the QuickText's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the QuickText's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the QuickText's name field""" + name: SalesforceStringFilter + + """Filter by the QuickText's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the QuickText's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the QuickText's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the QuickText's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the QuickText's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the QuickText's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the QuickText's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the QuickText's category field""" + category: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceQuickTextConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceQuickTextConnectionFilter!] +} + +""" +A filter to be used against QuickTextHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceQuickTextHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the QuickTextHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the QuickTextHistory's quickText relation.""" + quickText: SalesforceQuickTextConnectionFilter + + """Filter by the QuickTextHistory's id field""" + id: SalesforceIdFilter + + """Filter by the QuickTextHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the QuickTextHistory's quickTextId field""" + quickTextId: SalesforceIdFilter + + """Filter by the QuickTextHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the QuickTextHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the QuickTextHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceQuickTextHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceQuickTextHistoryConnectionFilter!] +} + +"""Field that Quick Text Histories can be sorted by""" +enum SalesforceQuickTextHistorySortByFieldEnum { + ID + IS_DELETED + QUICK_TEXT_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceQuickTextHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceQuickTextHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Quick Text History""" +type SalesforceQuickTextHistory implements OneGraphNode { + """Quick Text History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Quick Text ID""" + quickTextId: String! + + """Quick Text ID""" + quickText: SalesforceQuickText! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Quick Text Histories connection, for use in pagination.""" +type SalesforceQuickTextHistorysConnection { + """The count of all Quick Text History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Quick Text Histories""" + nodes: [SalesforceQuickTextHistory!]! + + """List of Quick Text History edges""" + edges: [SalesforceQuickTextHistoryEdge!]! +} + +union SalesforceQuickTextOwnerUnion = SalesforceUser | SalesforceGroup + +"""Quick Text""" +type SalesforceQuickText implements OneGraphNode { + """Quick Text ID""" + id: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceQuickTextOwnerUnion! + + """Deleted""" + isDeleted: Boolean! + + """Quick Text Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Message""" + message: String! + + """Category""" + category: String + + """Channel""" + channel: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce QuickTextHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceQuickTextHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceQuickTextHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceQuickTextHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of QuickTextHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceQuickTextHistorysConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""SearchActivity""" +type SalesforceSearchActivity implements OneGraphNode { + """Search Activity Id""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Search Activity Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Search Term""" + searchTerm: String! + + """Search Date""" + queryDate: String! + + """Number of Searches""" + countQueries: Int! + + """Number of Users""" + countUsers: Int! + + """Number of Results""" + avgNumResults: Float! + + """Channel""" + kbChannel: String! + + """Duration""" + period: String! + + """Average Click Rank""" + clickRank: Float + + """Language""" + queryLanguage: String! + + """Clicked Article Title""" + clickedRecordName: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Promoted Search Term""" +type SalesforceSearchPromotionRule implements OneGraphNode { + """Promoted Term Id""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Term""" + query: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceTodayGoalOwnerUnion = SalesforceUser | SalesforceGroup + +"""Goal""" +type SalesforceTodayGoal implements OneGraphNode { + """Goal ID""" + id: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceTodayGoalOwnerUnion! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Value""" + value: Float + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Last Used App""" +type SalesforceUserAppInfo implements OneGraphNode { + """Last Used App ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Form Factor""" + formFactor: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""User Provisioning Mock Target""" +type SalesforceUserProvMockTarget implements OneGraphNode { + """UserProvMockTarget ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """External User Id""" + externalUserId: String + + """External Username""" + externalUsername: String + + """External Email""" + externalEmail: String + + """External First Name""" + externalFirstName: String + + """External Last Name""" + externalLastName: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against UserProvisioningLog object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserProvisioningLogConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserProvisioningLog's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the UserProvisioningLog's userProvisioningRequest relation.""" + userProvisioningRequest: SalesforceUserProvisioningRequestConnectionFilter + + """Filter by the UserProvisioningLog's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserProvisioningLog's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserProvisioningLog's id field""" + id: SalesforceIdFilter + + """Filter by the UserProvisioningLog's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UserProvisioningLog's name field""" + name: SalesforceStringFilter + + """Filter by the UserProvisioningLog's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserProvisioningLog's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserProvisioningLog's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserProvisioningLog's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserProvisioningLog's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserProvisioningLog's userProvisioningRequestId field""" + userProvisioningRequestId: SalesforceIdFilter + + """Filter by the UserProvisioningLog's externalUserId field""" + externalUserId: SalesforceStringFilter + + """Filter by the UserProvisioningLog's externalUsername field""" + externalUsername: SalesforceStringFilter + + """Filter by the UserProvisioningLog's userId field""" + userId: SalesforceIdFilter + + """Filter by the UserProvisioningLog's status field""" + status: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserProvisioningLogConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserProvisioningLogConnectionFilter!] +} + +"""Field that User Provisioning Logs can be sorted by""" +enum SalesforceUserProvisioningLogSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + USER_PROVISIONING_REQUEST_ID + EXTERNAL_USER_ID + EXTERNAL_USERNAME + USER_ID + STATUS +} + +"""An edge in a connection.""" +type SalesforceUserProvisioningLogEdge { + """The item at the end of the edge.""" + node: SalesforceUserProvisioningLog! + + """A cursor for use in pagination""" + cursor: String! +} + +"""User Provisioning Log""" +type SalesforceUserProvisioningLog implements OneGraphNode { + """UserProvisioningLog ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """UserProvisioningRequest ID""" + userProvisioningRequestId: String + + """UserProvisioningRequest ID""" + userProvisioningRequest: SalesforceUserProvisioningRequest + + """External User Id""" + externalUserId: String + + """External Username""" + externalUsername: String + + """User ID""" + userId: String + + """User ID""" + user: SalesforceUser + + """Status""" + status: String + + """Details""" + details: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce User Provisioning Logs connection, for use in pagination.""" +type SalesforceUserProvisioningLogsConnection { + """ + The count of all User Provisioning Log you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Provisioning Logs""" + nodes: [SalesforceUserProvisioningLog!]! + + """List of User Provisioning Log edges""" + edges: [SalesforceUserProvisioningLogEdge!]! +} + +"""An edge in a connection.""" +type SalesforceProcessInstanceEdge { + """The item at the end of the edge.""" + node: SalesforceProcessInstance! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against ProcessInstanceWorkitem object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceProcessInstanceWorkitemConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ProcessInstanceWorkitem's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ProcessInstanceWorkitem's processInstance relation.""" + processInstance: SalesforceProcessInstanceConnectionFilter + + """Filter by the ProcessInstanceWorkitem's id field""" + id: SalesforceIdFilter + + """Filter by the ProcessInstanceWorkitem's processInstanceId field""" + processInstanceId: SalesforceIdFilter + + """Filter by the ProcessInstanceWorkitem's originalActorId field""" + originalActorId: SalesforceIdFilter + + """Filter by the ProcessInstanceWorkitem's actorId field""" + actorId: SalesforceIdFilter + + """Filter by the ProcessInstanceWorkitem's elapsedTimeInDays field""" + elapsedTimeInDays: SalesforceFloatFilter + + """Filter by the ProcessInstanceWorkitem's elapsedTimeInHours field""" + elapsedTimeInHours: SalesforceFloatFilter + + """Filter by the ProcessInstanceWorkitem's elapsedTimeInMinutes field""" + elapsedTimeInMinutes: SalesforceFloatFilter + + """Filter by the ProcessInstanceWorkitem's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ProcessInstanceWorkitem's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ProcessInstanceWorkitem's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ProcessInstanceWorkitem's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceProcessInstanceWorkitemConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceProcessInstanceWorkitemConnectionFilter!] +} + +"""Field that Approval Requests can be sorted by""" +enum SalesforceProcessInstanceWorkitemSortByFieldEnum { + ID + PROCESS_INSTANCE_ID + ORIGINAL_ACTOR_ID + ACTOR_ID + ELAPSED_TIME_IN_DAYS + ELAPSED_TIME_IN_HOURS + ELAPSED_TIME_IN_MINUTES + IS_DELETED + CREATED_DATE + CREATED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceProcessInstanceWorkitemEdge { + """The item at the end of the edge.""" + node: SalesforceProcessInstanceWorkitem! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceProcessInstanceWorkitemActorUnion = SalesforceUser | SalesforceGroup + +union SalesforceProcessInstanceWorkitemOriginalActorUnion = SalesforceUser | SalesforceGroup + +"""Approval Request""" +type SalesforceProcessInstanceWorkitem implements OneGraphNode { + """Process Instance Workitem ID""" + id: String! + + """Process Instance ID""" + processInstanceId: String! + + """Process Instance ID""" + processInstance: SalesforceProcessInstance! + + """Original Actor ID""" + originalActorId: String! + + """Original Actor ID""" + originalActor: SalesforceProcessInstanceWorkitemOriginalActorUnion! + + """Actor ID""" + actorId: String! + + """Actor ID""" + actor: SalesforceProcessInstanceWorkitemActorUnion! + + """Elapsed Time in Days""" + elapsedTimeInDays: Float + + """Elapsed Time in Hours""" + elapsedTimeInHours: Float + + """Elapsed Time in Minutes""" + elapsedTimeInMinutes: Float + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Approval Requests connection, for use in pagination.""" +type SalesforceProcessInstanceWorkitemsConnection { + """The count of all Approval Request you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Approval Requests""" + nodes: [SalesforceProcessInstanceWorkitem!]! + + """List of Approval Request edges""" + edges: [SalesforceProcessInstanceWorkitemEdge!]! +} + +""" +A filter to be used against DuplicateRecordItem object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDuplicateRecordItemConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DuplicateRecordItem's duplicateRecordSet relation.""" + duplicateRecordSet: SalesforceDuplicateRecordSetConnectionFilter + + """Filter by the DuplicateRecordItem's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the DuplicateRecordItem's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DuplicateRecordItem's id field""" + id: SalesforceIdFilter + + """Filter by the DuplicateRecordItem's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DuplicateRecordItem's name field""" + name: SalesforceStringFilter + + """Filter by the DuplicateRecordItem's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DuplicateRecordItem's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DuplicateRecordItem's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DuplicateRecordItem's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the DuplicateRecordItem's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the DuplicateRecordItem's duplicateRecordSetId field""" + duplicateRecordSetId: SalesforceIdFilter + + """Filter by the DuplicateRecordItem's recordId field""" + recordId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDuplicateRecordItemConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDuplicateRecordItemConnectionFilter!] +} + +"""Field that Duplicate Record Items can be sorted by""" +enum SalesforceDuplicateRecordItemSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + DUPLICATE_RECORD_SET_ID + RECORD_ID +} + +"""An edge in a connection.""" +type SalesforceDuplicateRecordItemEdge { + """The item at the end of the edge.""" + node: SalesforceDuplicateRecordItem! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceDuplicateRecordItemRecordUnion = SalesforceLead | SalesforceContact | SalesforceAccount + +"""Duplicate Record Item""" +type SalesforceDuplicateRecordItem implements OneGraphNode { + """Duplicate Record Item ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Duplicate Record Item Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Duplicate Record Set ID""" + duplicateRecordSetId: String! + + """Duplicate Record Set ID""" + duplicateRecordSet: SalesforceDuplicateRecordSet! + + """Record ID""" + recordId: String! + + """Record ID""" + record: SalesforceDuplicateRecordItemRecordUnion! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Duplicate Record Items connection, for use in pagination.""" +type SalesforceDuplicateRecordItemsConnection { + """ + The count of all Duplicate Record Item you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Duplicate Record Items""" + nodes: [SalesforceDuplicateRecordItem!]! + + """List of Duplicate Record Item edges""" + edges: [SalesforceDuplicateRecordItemEdge!]! +} + +""" +A filter to be used against DuplicateRule object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDuplicateRuleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DuplicateRule's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the DuplicateRule's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DuplicateRule's id field""" + id: SalesforceIdFilter + + """Filter by the DuplicateRule's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DuplicateRule's sobjectType field""" + sobjectType: SalesforceStringFilter + + """Filter by the DuplicateRule's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the DuplicateRule's language field""" + language: SalesforceStringFilter + + """Filter by the DuplicateRule's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the DuplicateRule's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the DuplicateRule's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DuplicateRule's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DuplicateRule's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DuplicateRule's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the DuplicateRule's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the DuplicateRule's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the DuplicateRule's sobjectSubtype field""" + sobjectSubtype: SalesforceStringFilter + + """Filter by the DuplicateRule's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDuplicateRuleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDuplicateRuleConnectionFilter!] +} + +""" +A filter to be used against DuplicateRecordSet object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDuplicateRecordSetConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DuplicateRecordSet's duplicateRule relation.""" + duplicateRule: SalesforceDuplicateRuleConnectionFilter + + """Filter by the DuplicateRecordSet's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the DuplicateRecordSet's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DuplicateRecordSet's id field""" + id: SalesforceIdFilter + + """Filter by the DuplicateRecordSet's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DuplicateRecordSet's name field""" + name: SalesforceStringFilter + + """Filter by the DuplicateRecordSet's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DuplicateRecordSet's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DuplicateRecordSet's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DuplicateRecordSet's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the DuplicateRecordSet's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the DuplicateRecordSet's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the DuplicateRecordSet's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the DuplicateRecordSet's duplicateRuleId field""" + duplicateRuleId: SalesforceIdFilter + + """Filter by the DuplicateRecordSet's recordCount field""" + recordCount: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDuplicateRecordSetConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDuplicateRecordSetConnectionFilter!] +} + +"""Field that Duplicate Record Sets can be sorted by""" +enum SalesforceDuplicateRecordSetSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + DUPLICATE_RULE_ID + RECORD_COUNT +} + +"""An edge in a connection.""" +type SalesforceDuplicateRecordSetEdge { + """The item at the end of the edge.""" + node: SalesforceDuplicateRecordSet! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Duplicate Record Sets connection, for use in pagination.""" +type SalesforceDuplicateRecordSetsConnection { + """ + The count of all Duplicate Record Set you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Duplicate Record Sets""" + nodes: [SalesforceDuplicateRecordSet!]! + + """List of Duplicate Record Set edges""" + edges: [SalesforceDuplicateRecordSetEdge!]! +} + +"""Duplicate Rule""" +type SalesforceDuplicateRule implements OneGraphNode { + """Duplicate Rule ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Custom Object Definition ID""" + sobjectType: String! + + """Object Name""" + developerName: String! + + """Master Language""" + language: String! + + """Rule Name""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Active""" + isActive: Boolean! + + """Object Subtype""" + sobjectSubtype: String + + """Last Viewed Date""" + lastViewedDate: String + + """Collection of Salesforce DuplicateRecordSet""" + duplicateRecordSets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDuplicateRecordSetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDuplicateRecordSetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDuplicateRecordSetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DuplicateRecordSets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDuplicateRecordSetsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Duplicate Record Set""" +type SalesforceDuplicateRecordSet implements OneGraphNode { + """Duplicate Record Set ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Duplicate Record Set Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Duplicate Rule ID""" + duplicateRuleId: String + + """Duplicate Rule ID""" + duplicateRule: SalesforceDuplicateRule + + """Record Count""" + recordCount: Int + + """Collection of Salesforce DuplicateRecordItem""" + duplicateRecordItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDuplicateRecordItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDuplicateRecordItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDuplicateRecordItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DuplicateRecordItems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDuplicateRecordItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against OrderShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOrderShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OrderShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the OrderShare's order relation.""" + order: SalesforceOrderConnectionFilter + + """Filter by the OrderShare's id field""" + id: SalesforceIdFilter + + """Filter by the OrderShare's orderId field""" + orderId: SalesforceIdFilter + + """Filter by the OrderShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the OrderShare's orderAccessLevel field""" + orderAccessLevel: SalesforceStringFilter + + """Filter by the OrderShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the OrderShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OrderShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the OrderShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOrderShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOrderShareConnectionFilter!] +} + +"""Field that Order Shares can be sorted by""" +enum SalesforceOrderShareSortByFieldEnum { + ID + ORDER_ID + USER_OR_GROUP_ID + ORDER_ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceOrderShareEdge { + """The item at the end of the edge.""" + node: SalesforceOrderShare! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceOrderShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Order Share""" +type SalesforceOrderShare implements OneGraphNode { + """Order Share ID""" + id: String! + + """Order ID""" + orderId: String! + + """Order ID""" + order: SalesforceOrder! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceOrderShareUserOrGroupUnion! + + """Order Access Level""" + orderAccessLevel: String! + + """Apex Sharing Reason ID""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Order Shares connection, for use in pagination.""" +type SalesforceOrderSharesConnection { + """The count of all Order Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Order Shares""" + nodes: [SalesforceOrderShare!]! + + """List of Order Share edges""" + edges: [SalesforceOrderShareEdge!]! +} + +""" +A filter to be used against OrderHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOrderHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OrderHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OrderHistory's order relation.""" + order: SalesforceOrderConnectionFilter + + """Filter by the OrderHistory's id field""" + id: SalesforceIdFilter + + """Filter by the OrderHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the OrderHistory's orderId field""" + orderId: SalesforceIdFilter + + """Filter by the OrderHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OrderHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OrderHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOrderHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOrderHistoryConnectionFilter!] +} + +"""Field that Order Histories can be sorted by""" +enum SalesforceOrderHistorySortByFieldEnum { + ID + IS_DELETED + ORDER_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceOrderHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceOrderHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Order History""" +type SalesforceOrderHistory implements OneGraphNode { + """Order History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Order ID""" + orderId: String! + + """Order ID""" + order: SalesforceOrder! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Order Histories connection, for use in pagination.""" +type SalesforceOrderHistorysConnection { + """The count of all Order History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Order Histories""" + nodes: [SalesforceOrderHistory!]! + + """List of Order History edges""" + edges: [SalesforceOrderHistoryEdge!]! +} + +""" +A filter to be used against OrderFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOrderFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OrderFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the OrderFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the OrderFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OrderFeed's parent relation.""" + parent: SalesforceOrderConnectionFilter + + """Filter by the OrderFeed's id field""" + id: SalesforceIdFilter + + """Filter by the OrderFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the OrderFeed's type field""" + type: SalesforceStringFilter + + """Filter by the OrderFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OrderFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OrderFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the OrderFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OrderFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the OrderFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the OrderFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the OrderFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOrderFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOrderFeedConnectionFilter!] +} + +"""Field that Order Feeds can be sorted by""" +enum SalesforceOrderFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceOrderFeedEdge { + """The item at the end of the edge.""" + node: SalesforceOrderFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Order Feeds connection, for use in pagination.""" +type SalesforceOrderFeedsConnection { + """The count of all Order Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Order Feeds""" + nodes: [SalesforceOrderFeed!]! + + """List of Order Feed edges""" + edges: [SalesforceOrderFeedEdge!]! +} + +""" +A filter to be used against ContractHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContractHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContractHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContractHistory's contract relation.""" + contract: SalesforceContractConnectionFilter + + """Filter by the ContractHistory's id field""" + id: SalesforceIdFilter + + """Filter by the ContractHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContractHistory's contractId field""" + contractId: SalesforceIdFilter + + """Filter by the ContractHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContractHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContractHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContractHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContractHistoryConnectionFilter!] +} + +"""Field that Contract Histories can be sorted by""" +enum SalesforceContractHistorySortByFieldEnum { + ID + IS_DELETED + CONTRACT_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceContractHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceContractHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Contract History""" +type SalesforceContractHistory implements OneGraphNode { + """Contract History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Contract ID""" + contractId: String! + + """Contract ID""" + contract: SalesforceContract! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Contract Histories connection, for use in pagination.""" +type SalesforceContractHistorysConnection { + """The count of all Contract History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Contract Histories""" + nodes: [SalesforceContractHistory!]! + + """List of Contract History edges""" + edges: [SalesforceContractHistoryEdge!]! +} + +""" +A filter to be used against ContractFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContractFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContractFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the ContractFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the ContractFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContractFeed's parent relation.""" + parent: SalesforceContractConnectionFilter + + """Filter by the ContractFeed's id field""" + id: SalesforceIdFilter + + """Filter by the ContractFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the ContractFeed's type field""" + type: SalesforceStringFilter + + """Filter by the ContractFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContractFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContractFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContractFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContractFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContractFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the ContractFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the ContractFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContractFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContractFeedConnectionFilter!] +} + +"""Field that Contract Feeds can be sorted by""" +enum SalesforceContractFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceContractFeedEdge { + """The item at the end of the edge.""" + node: SalesforceContractFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Contract Feeds connection, for use in pagination.""" +type SalesforceContractFeedsConnection { + """The count of all Contract Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Contract Feeds""" + nodes: [SalesforceContractFeed!]! + + """List of Contract Feed edges""" + edges: [SalesforceContractFeedEdge!]! +} + +""" +A filter to be used against ContractContactRole object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContractContactRoleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContractContactRole's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContractContactRole's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContractContactRole's contact relation.""" + contact: SalesforceContactConnectionFilter + + """Filter by the ContractContactRole's contract relation.""" + contract: SalesforceContractConnectionFilter + + """Filter by the ContractContactRole's id field""" + id: SalesforceIdFilter + + """Filter by the ContractContactRole's contractId field""" + contractId: SalesforceIdFilter + + """Filter by the ContractContactRole's contactId field""" + contactId: SalesforceIdFilter + + """Filter by the ContractContactRole's role field""" + role: SalesforceStringFilter + + """Filter by the ContractContactRole's isPrimary field""" + isPrimary: SalesforceBooleanFilter + + """Filter by the ContractContactRole's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContractContactRole's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContractContactRole's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContractContactRole's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContractContactRole's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContractContactRole's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContractContactRoleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContractContactRoleConnectionFilter!] +} + +"""Field that Contract Contact Roles can be sorted by""" +enum SalesforceContractContactRoleSortByFieldEnum { + ID + CONTRACT_ID + CONTACT_ID + ROLE + IS_PRIMARY + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceContractContactRoleEdge { + """The item at the end of the edge.""" + node: SalesforceContractContactRole! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Contract Contact Role""" +type SalesforceContractContactRole implements OneGraphNode { + """Contact Role ID""" + id: String! + + """Contract ID""" + contractId: String! + + """Contract ID""" + contract: SalesforceContract! + + """Contact ID""" + contactId: String! + + """Contact ID""" + contact: SalesforceContact! + + """Role""" + role: String + + """Primary""" + isPrimary: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Contract Contact Roles connection, for use in pagination.""" +type SalesforceContractContactRolesConnection { + """ + The count of all Contract Contact Role you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Contract Contact Roles""" + nodes: [SalesforceContractContactRole!]! + + """List of Contract Contact Role edges""" + edges: [SalesforceContractContactRoleEdge!]! +} + +"""Field that Price Book Entries can be sorted by""" +enum SalesforcePricebookEntrySortByFieldEnum { + ID + NAME + PRICEBOOK_2_ID + PRODUCT_2_ID + UNIT_PRICE + IS_ACTIVE + USE_STANDARD_PRICE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + PRODUCT_CODE + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforcePricebookEntryEdge { + """The item at the end of the edge.""" + node: SalesforcePricebookEntry! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Price Book Entries connection, for use in pagination.""" +type SalesforcePricebookEntrysConnection { + """The count of all Price Book Entry you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Price Book Entries""" + nodes: [SalesforcePricebookEntry!]! + + """List of Price Book Entry edges""" + edges: [SalesforcePricebookEntryEdge!]! +} + +""" +A filter to be used against Pricebook2History object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePricebook2HistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Pricebook2History's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Pricebook2History's pricebook2 relation.""" + pricebook2: SalesforcePricebook2ConnectionFilter + + """Filter by the Pricebook2History's id field""" + id: SalesforceIdFilter + + """Filter by the Pricebook2History's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Pricebook2History's pricebook2Id field""" + pricebook2Id: SalesforceIdFilter + + """Filter by the Pricebook2History's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Pricebook2History's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Pricebook2History's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePricebook2HistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePricebook2HistoryConnectionFilter!] +} + +"""Field that Price Book Histories can be sorted by""" +enum SalesforcePricebook2HistorySortByFieldEnum { + ID + IS_DELETED + PRICEBOOK_2_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforcePricebook2HistoryEdge { + """The item at the end of the edge.""" + node: SalesforcePricebook2History! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Price Book History""" +type SalesforcePricebook2History implements OneGraphNode { + """Price Book History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Price Book ID""" + pricebook2Id: String! + + """Price Book ID""" + pricebook2: SalesforcePricebook2! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Price Book Histories connection, for use in pagination.""" +type SalesforcePricebook2HistorysConnection { + """The count of all Price Book History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Price Book Histories""" + nodes: [SalesforcePricebook2History!]! + + """List of Price Book History edges""" + edges: [SalesforcePricebook2HistoryEdge!]! +} + +"""Field that Orders can be sorted by""" +enum SalesforceOrderSortByFieldEnum { + ID + OWNER_ID + CONTRACT_ID + ACCOUNT_ID + PRICEBOOK_2_ID + ORIGINAL_ORDER_ID + EFFECTIVE_DATE + END_DATE + IS_REDUCTION_ORDER + STATUS + CUSTOMER_AUTHORIZED_BY_ID + CUSTOMER_AUTHORIZED_DATE + COMPANY_AUTHORIZED_BY_ID + COMPANY_AUTHORIZED_DATE + TYPE + BILLING_STREET + BILLING_CITY + BILLING_STATE + BILLING_POSTAL_CODE + BILLING_COUNTRY + BILLING_LATITUDE + BILLING_LONGITUDE + BILLING_GEOCODE_ACCURACY + SHIPPING_STREET + SHIPPING_CITY + SHIPPING_STATE + SHIPPING_POSTAL_CODE + SHIPPING_COUNTRY + SHIPPING_LATITUDE + SHIPPING_LONGITUDE + SHIPPING_GEOCODE_ACCURACY + NAME + PO_DATE + PO_NUMBER + ORDER_REFERENCE_NUMBER + BILL_TO_CONTACT_ID + SHIP_TO_CONTACT_ID + ACTIVATED_DATE + ACTIVATED_BY_ID + STATUS_CODE + ORDER_NUMBER + TOTAL_AMOUNT + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED + SYSTEM_MODSTAMP + LAST_VIEWED_DATE + LAST_REFERENCED_DATE +} + +"""An edge in a connection.""" +type SalesforceOrderEdge { + """The item at the end of the edge.""" + node: SalesforceOrder! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Orders connection, for use in pagination.""" +type SalesforceOrdersConnection { + """The count of all Order you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Orders""" + nodes: [SalesforceOrder!]! + + """List of Order edges""" + edges: [SalesforceOrderEdge!]! +} + +"""An edge in a connection.""" +type SalesforceOpportunityEdge { + """The item at the end of the edge.""" + node: SalesforceOpportunity! + + """A cursor for use in pagination""" + cursor: String! +} + +"""An edge in a connection.""" +type SalesforcePartnerEdge { + """The item at the end of the edge.""" + node: SalesforcePartner! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against Partner object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePartnerConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Partner's reversePartner relation.""" + reversePartner: SalesforcePartnerConnectionFilter + + """Filter by the Partner's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Partner's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Partner's accountTo relation.""" + accountTo: SalesforceAccountConnectionFilter + + """Filter by the Partner's accountFrom relation.""" + accountFrom: SalesforceAccountConnectionFilter + + """Filter by the Partner's opportunity relation.""" + opportunity: SalesforceOpportunityConnectionFilter + + """Filter by the Partner's id field""" + id: SalesforceIdFilter + + """Filter by the Partner's opportunityId field""" + opportunityId: SalesforceIdFilter + + """Filter by the Partner's accountFromId field""" + accountFromId: SalesforceIdFilter + + """Filter by the Partner's accountToId field""" + accountToId: SalesforceIdFilter + + """Filter by the Partner's role field""" + role: SalesforceStringFilter + + """Filter by the Partner's isPrimary field""" + isPrimary: SalesforceBooleanFilter + + """Filter by the Partner's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Partner's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Partner's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Partner's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Partner's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Partner's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Partner's reversePartnerId field""" + reversePartnerId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePartnerConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePartnerConnectionFilter!] +} + +"""Field that Partners can be sorted by""" +enum SalesforcePartnerSortByFieldEnum { + ID + OPPORTUNITY_ID + ACCOUNT_FROM_ID + ACCOUNT_TO_ID + ROLE + IS_PRIMARY + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED + REVERSE_PARTNER_ID +} + +"""Partner""" +type SalesforcePartner implements OneGraphNode { + """Partner ID""" + id: String! + + """Opportunity ID""" + opportunityId: String + + """Opportunity ID""" + opportunity: SalesforceOpportunity + + """Account From ID""" + accountFromId: String + + """Account From ID""" + accountFrom: SalesforceAccount + + """Account To ID""" + accountToId: String! + + """Account To ID""" + accountTo: SalesforceAccount! + + """Role""" + role: String + + """Primary""" + isPrimary: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Reverse Partner ID""" + reversePartnerId: String + + """Reverse Partner ID""" + reversePartner: SalesforcePartner + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Partner""" + partners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Partners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePartnersConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Partners connection, for use in pagination.""" +type SalesforcePartnersConnection { + """The count of all Partner you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Partners""" + nodes: [SalesforcePartner!]! + + """List of Partner edges""" + edges: [SalesforcePartnerEdge!]! +} + +""" +A filter to be used against OpportunityShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOpportunityShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OpportunityShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityShare's opportunity relation.""" + opportunity: SalesforceOpportunityConnectionFilter + + """Filter by the OpportunityShare's id field""" + id: SalesforceIdFilter + + """Filter by the OpportunityShare's opportunityId field""" + opportunityId: SalesforceIdFilter + + """Filter by the OpportunityShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the OpportunityShare's opportunityAccessLevel field""" + opportunityAccessLevel: SalesforceStringFilter + + """Filter by the OpportunityShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the OpportunityShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OpportunityShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the OpportunityShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOpportunityShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOpportunityShareConnectionFilter!] +} + +"""Field that Opportunity Shares can be sorted by""" +enum SalesforceOpportunityShareSortByFieldEnum { + ID + OPPORTUNITY_ID + USER_OR_GROUP_ID + OPPORTUNITY_ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceOpportunityShareEdge { + """The item at the end of the edge.""" + node: SalesforceOpportunityShare! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceOpportunityShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Opportunity Share""" +type SalesforceOpportunityShare implements OneGraphNode { + """Opportunity Share ID""" + id: String! + + """Opportunity ID""" + opportunityId: String! + + """Opportunity ID""" + opportunity: SalesforceOpportunity! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceOpportunityShareUserOrGroupUnion! + + """Opportunity Access""" + opportunityAccessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Opportunity Shares connection, for use in pagination.""" +type SalesforceOpportunitySharesConnection { + """The count of all Opportunity Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Opportunity Shares""" + nodes: [SalesforceOpportunityShare!]! + + """List of Opportunity Share edges""" + edges: [SalesforceOpportunityShareEdge!]! +} + +"""An edge in a connection.""" +type SalesforceOpportunityPartnerEdge { + """The item at the end of the edge.""" + node: SalesforceOpportunityPartner! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against OpportunityPartner object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOpportunityPartnerConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OpportunityPartner's reversePartner relation.""" + reversePartner: SalesforceOpportunityPartnerConnectionFilter + + """Filter by the OpportunityPartner's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityPartner's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityPartner's accountTo relation.""" + accountTo: SalesforceAccountConnectionFilter + + """Filter by the OpportunityPartner's opportunity relation.""" + opportunity: SalesforceOpportunityConnectionFilter + + """Filter by the OpportunityPartner's id field""" + id: SalesforceIdFilter + + """Filter by the OpportunityPartner's opportunityId field""" + opportunityId: SalesforceIdFilter + + """Filter by the OpportunityPartner's accountToId field""" + accountToId: SalesforceIdFilter + + """Filter by the OpportunityPartner's role field""" + role: SalesforceStringFilter + + """Filter by the OpportunityPartner's isPrimary field""" + isPrimary: SalesforceBooleanFilter + + """Filter by the OpportunityPartner's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OpportunityPartner's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OpportunityPartner's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OpportunityPartner's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the OpportunityPartner's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the OpportunityPartner's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the OpportunityPartner's reversePartnerId field""" + reversePartnerId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOpportunityPartnerConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOpportunityPartnerConnectionFilter!] +} + +"""Field that Opportunity Partners can be sorted by""" +enum SalesforceOpportunityPartnerSortByFieldEnum { + ID + OPPORTUNITY_ID + ACCOUNT_TO_ID + ROLE + IS_PRIMARY + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED + REVERSE_PARTNER_ID +} + +"""Opportunity Partner""" +type SalesforceOpportunityPartner implements OneGraphNode { + """Opportunity Partner ID""" + id: String! + + """Opportunity ID""" + opportunityId: String! + + """Opportunity ID""" + opportunity: SalesforceOpportunity! + + """Account ID""" + accountToId: String! + + """Account ID""" + accountTo: SalesforceAccount! + + """Role""" + role: String + + """Primary""" + isPrimary: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Reverse Partner ID""" + reversePartnerId: String + + """Reverse Partner ID""" + reversePartner: SalesforceOpportunityPartner + + """Collection of Salesforce OpportunityPartner""" + opportunityPartners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityPartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityPartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityPartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OpportunityPartners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunityPartnersConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Opportunity Partners connection, for use in pagination.""" +type SalesforceOpportunityPartnersConnection { + """ + The count of all Opportunity Partner you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Opportunity Partners""" + nodes: [SalesforceOpportunityPartner!]! + + """List of Opportunity Partner edges""" + edges: [SalesforceOpportunityPartnerEdge!]! +} + +""" +A filter to be used against OpportunityHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOpportunityHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OpportunityHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityHistory's opportunity relation.""" + opportunity: SalesforceOpportunityConnectionFilter + + """Filter by the OpportunityHistory's id field""" + id: SalesforceIdFilter + + """Filter by the OpportunityHistory's opportunityId field""" + opportunityId: SalesforceIdFilter + + """Filter by the OpportunityHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OpportunityHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OpportunityHistory's stageName field""" + stageName: SalesforceStringFilter + + """Filter by the OpportunityHistory's amount field""" + amount: SalesforceFloatFilter + + """Filter by the OpportunityHistory's expectedRevenue field""" + expectedRevenue: SalesforceFloatFilter + + """Filter by the OpportunityHistory's closeDate field""" + closeDate: SalesforceDateFilter + + """Filter by the OpportunityHistory's probability field""" + probability: SalesforceFloatFilter + + """Filter by the OpportunityHistory's forecastCategory field""" + forecastCategory: SalesforceStringFilter + + """Filter by the OpportunityHistory's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the OpportunityHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOpportunityHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOpportunityHistoryConnectionFilter!] +} + +"""Field that Opportunity Histories can be sorted by""" +enum SalesforceOpportunityHistorySortByFieldEnum { + ID + OPPORTUNITY_ID + CREATED_BY_ID + CREATED_DATE + STAGE_NAME + AMOUNT + EXPECTED_REVENUE + CLOSE_DATE + PROBABILITY + FORECAST_CATEGORY + SYSTEM_MODSTAMP + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceOpportunityHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceOpportunityHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Opportunity History""" +type SalesforceOpportunityHistory implements OneGraphNode { + """Opportunity History ID""" + id: String! + + """Opportunity ID""" + opportunityId: String! + + """Opportunity ID""" + opportunity: SalesforceOpportunity! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Stage Name""" + stageName: String! + + """Amount""" + amount: Float + + """Expected Revenue""" + expectedRevenue: Float + + """Close Date""" + closeDate: String + + """Probability""" + probability: Float + + """To ForecastCategory""" + forecastCategory: String + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Opportunity Histories connection, for use in pagination.""" +type SalesforceOpportunityHistorysConnection { + """ + The count of all Opportunity History you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Opportunity Histories""" + nodes: [SalesforceOpportunityHistory!]! + + """List of Opportunity History edges""" + edges: [SalesforceOpportunityHistoryEdge!]! +} + +""" +A filter to be used against OpportunityFieldHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOpportunityFieldHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OpportunityFieldHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityFieldHistory's opportunity relation.""" + opportunity: SalesforceOpportunityConnectionFilter + + """Filter by the OpportunityFieldHistory's id field""" + id: SalesforceIdFilter + + """Filter by the OpportunityFieldHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the OpportunityFieldHistory's opportunityId field""" + opportunityId: SalesforceIdFilter + + """Filter by the OpportunityFieldHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OpportunityFieldHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OpportunityFieldHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOpportunityFieldHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOpportunityFieldHistoryConnectionFilter!] +} + +"""Field that Opportunity Field Histories can be sorted by""" +enum SalesforceOpportunityFieldHistorySortByFieldEnum { + ID + IS_DELETED + OPPORTUNITY_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceOpportunityFieldHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceOpportunityFieldHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Opportunity Field History""" +type SalesforceOpportunityFieldHistory implements OneGraphNode { + """Opportunity History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Opportunity ID""" + opportunityId: String! + + """Opportunity ID""" + opportunity: SalesforceOpportunity! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Opportunity Field Histories connection, for use in pagination. +""" +type SalesforceOpportunityFieldHistorysConnection { + """ + The count of all Opportunity Field History you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Opportunity Field Histories""" + nodes: [SalesforceOpportunityFieldHistory!]! + + """List of Opportunity Field History edges""" + edges: [SalesforceOpportunityFieldHistoryEdge!]! +} + +""" +A filter to be used against OpportunityFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOpportunityFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OpportunityFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the OpportunityFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityFeed's parent relation.""" + parent: SalesforceOpportunityConnectionFilter + + """Filter by the OpportunityFeed's id field""" + id: SalesforceIdFilter + + """Filter by the OpportunityFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the OpportunityFeed's type field""" + type: SalesforceStringFilter + + """Filter by the OpportunityFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OpportunityFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OpportunityFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the OpportunityFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OpportunityFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the OpportunityFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the OpportunityFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the OpportunityFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOpportunityFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOpportunityFeedConnectionFilter!] +} + +"""Field that Opportunity Feeds can be sorted by""" +enum SalesforceOpportunityFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceOpportunityFeedEdge { + """The item at the end of the edge.""" + node: SalesforceOpportunityFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Opportunity Feeds connection, for use in pagination.""" +type SalesforceOpportunityFeedsConnection { + """The count of all Opportunity Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Opportunity Feeds""" + nodes: [SalesforceOpportunityFeed!]! + + """List of Opportunity Feed edges""" + edges: [SalesforceOpportunityFeedEdge!]! +} + +""" +A filter to be used against OpportunityContactRole object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOpportunityContactRoleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OpportunityContactRole's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityContactRole's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityContactRole's contact relation.""" + contact: SalesforceContactConnectionFilter + + """Filter by the OpportunityContactRole's opportunity relation.""" + opportunity: SalesforceOpportunityConnectionFilter + + """Filter by the OpportunityContactRole's id field""" + id: SalesforceIdFilter + + """Filter by the OpportunityContactRole's opportunityId field""" + opportunityId: SalesforceIdFilter + + """Filter by the OpportunityContactRole's contactId field""" + contactId: SalesforceIdFilter + + """Filter by the OpportunityContactRole's role field""" + role: SalesforceStringFilter + + """Filter by the OpportunityContactRole's isPrimary field""" + isPrimary: SalesforceBooleanFilter + + """Filter by the OpportunityContactRole's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OpportunityContactRole's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OpportunityContactRole's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OpportunityContactRole's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the OpportunityContactRole's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the OpportunityContactRole's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOpportunityContactRoleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOpportunityContactRoleConnectionFilter!] +} + +"""Field that Opportunity Contact Roles can be sorted by""" +enum SalesforceOpportunityContactRoleSortByFieldEnum { + ID + OPPORTUNITY_ID + CONTACT_ID + ROLE + IS_PRIMARY + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceOpportunityContactRoleEdge { + """The item at the end of the edge.""" + node: SalesforceOpportunityContactRole! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Opportunity Contact Role""" +type SalesforceOpportunityContactRole implements OneGraphNode { + """Contact Role ID""" + id: String! + + """Opportunity ID""" + opportunityId: String! + + """Opportunity ID""" + opportunity: SalesforceOpportunity! + + """Contact ID""" + contactId: String! + + """Contact ID""" + contact: SalesforceContact! + + """Role""" + role: String + + """Primary""" + isPrimary: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Opportunity Contact Roles connection, for use in pagination. +""" +type SalesforceOpportunityContactRolesConnection { + """ + The count of all Opportunity Contact Role you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Opportunity Contact Roles""" + nodes: [SalesforceOpportunityContactRole!]! + + """List of Opportunity Contact Role edges""" + edges: [SalesforceOpportunityContactRoleEdge!]! +} + +""" +A filter to be used against OpportunityCompetitor object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOpportunityCompetitorConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OpportunityCompetitor's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityCompetitor's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityCompetitor's opportunity relation.""" + opportunity: SalesforceOpportunityConnectionFilter + + """Filter by the OpportunityCompetitor's id field""" + id: SalesforceIdFilter + + """Filter by the OpportunityCompetitor's opportunityId field""" + opportunityId: SalesforceIdFilter + + """Filter by the OpportunityCompetitor's strengths field""" + strengths: SalesforceStringFilter + + """Filter by the OpportunityCompetitor's weaknesses field""" + weaknesses: SalesforceStringFilter + + """Filter by the OpportunityCompetitor's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OpportunityCompetitor's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OpportunityCompetitor's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the OpportunityCompetitor's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OpportunityCompetitor's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the OpportunityCompetitor's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOpportunityCompetitorConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOpportunityCompetitorConnectionFilter!] +} + +"""Field that Opportunity: Competitors can be sorted by""" +enum SalesforceOpportunityCompetitorSortByFieldEnum { + ID + OPPORTUNITY_ID + COMPETITOR_NAME + STRENGTHS + WEAKNESSES + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceOpportunityCompetitorEdge { + """The item at the end of the edge.""" + node: SalesforceOpportunityCompetitor! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Opportunity: Competitor""" +type SalesforceOpportunityCompetitor implements OneGraphNode { + """Opportunity: Competitor ID""" + id: String! + + """Opportunity ID""" + opportunityId: String! + + """Opportunity ID""" + opportunity: SalesforceOpportunity! + + """Competitor Name""" + competitorName: String + + """Strengths""" + strengths: String + + """Weaknesses""" + weaknesses: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Opportunity: Competitors connection, for use in pagination.""" +type SalesforceOpportunityCompetitorsConnection { + """ + The count of all Opportunity: Competitor you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Opportunity: Competitors""" + nodes: [SalesforceOpportunityCompetitor!]! + + """List of Opportunity: Competitor edges""" + edges: [SalesforceOpportunityCompetitorEdge!]! +} + +"""Field that Leads can be sorted by""" +enum SalesforceLeadSortByFieldEnum { + ID + IS_DELETED + MASTER_RECORD_ID + LAST_NAME + FIRST_NAME + SALUTATION + NAME + TITLE + COMPANY + STREET + CITY + STATE + POSTAL_CODE + COUNTRY + LATITUDE + LONGITUDE + GEOCODE_ACCURACY + PHONE + MOBILE_PHONE + FAX + EMAIL + WEBSITE + PHOTO_URL + LEAD_SOURCE + STATUS + INDUSTRY + RATING + ANNUAL_REVENUE + NUMBER_OF_EMPLOYEES + OWNER_ID + IS_CONVERTED + CONVERTED_DATE + CONVERTED_ACCOUNT_ID + CONVERTED_CONTACT_ID + CONVERTED_OPPORTUNITY_ID + IS_UNREAD_BY_OWNER + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_ACTIVITY_DATE + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + JIGSAW + JIGSAW_CONTACT_ID + CLEAN_STATUS + COMPANY_DUNS_NUMBER + DANDB_COMPANY_ID + EMAIL_BOUNCED_REASON + EMAIL_BOUNCED_DATE +} + +"""An edge in a connection.""" +type SalesforceLeadEdge { + """The item at the end of the edge.""" + node: SalesforceLead! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Leads connection, for use in pagination.""" +type SalesforceLeadsConnection { + """The count of all Lead you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Leads""" + nodes: [SalesforceLead!]! + + """List of Lead edges""" + edges: [SalesforceLeadEdge!]! +} + +"""An edge in a connection.""" +type SalesforceAccountPartnerEdge { + """The item at the end of the edge.""" + node: SalesforceAccountPartner! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against AccountPartner object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAccountPartnerConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AccountPartner's reversePartner relation.""" + reversePartner: SalesforceAccountPartnerConnectionFilter + + """Filter by the AccountPartner's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AccountPartner's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AccountPartner's opportunity relation.""" + opportunity: SalesforceOpportunityConnectionFilter + + """Filter by the AccountPartner's accountTo relation.""" + accountTo: SalesforceAccountConnectionFilter + + """Filter by the AccountPartner's accountFrom relation.""" + accountFrom: SalesforceAccountConnectionFilter + + """Filter by the AccountPartner's id field""" + id: SalesforceIdFilter + + """Filter by the AccountPartner's accountFromId field""" + accountFromId: SalesforceIdFilter + + """Filter by the AccountPartner's accountToId field""" + accountToId: SalesforceIdFilter + + """Filter by the AccountPartner's opportunityId field""" + opportunityId: SalesforceIdFilter + + """Filter by the AccountPartner's role field""" + role: SalesforceStringFilter + + """Filter by the AccountPartner's isPrimary field""" + isPrimary: SalesforceBooleanFilter + + """Filter by the AccountPartner's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AccountPartner's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AccountPartner's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AccountPartner's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AccountPartner's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AccountPartner's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AccountPartner's reversePartnerId field""" + reversePartnerId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAccountPartnerConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAccountPartnerConnectionFilter!] +} + +"""Field that Account Partners can be sorted by""" +enum SalesforceAccountPartnerSortByFieldEnum { + ID + ACCOUNT_FROM_ID + ACCOUNT_TO_ID + OPPORTUNITY_ID + ROLE + IS_PRIMARY + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED + REVERSE_PARTNER_ID +} + +"""Account Partner""" +type SalesforceAccountPartner implements OneGraphNode { + """Account Partner ID""" + id: String! + + """Account ID""" + accountFromId: String! + + """Account ID""" + accountFrom: SalesforceAccount! + + """Account ID""" + accountToId: String + + """Account ID""" + accountTo: SalesforceAccount + + """Opportunity ID""" + opportunityId: String + + """Opportunity ID""" + opportunity: SalesforceOpportunity + + """Role""" + role: String + + """Primary""" + isPrimary: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Reverse Partner ID""" + reversePartnerId: String + + """Reverse Partner ID""" + reversePartner: SalesforceAccountPartner + + """Collection of Salesforce AccountPartner""" + accountPartners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountPartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountPartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountPartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountPartners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountPartnersConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Account Partners connection, for use in pagination.""" +type SalesforceAccountPartnersConnection { + """The count of all Account Partner you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Account Partners""" + nodes: [SalesforceAccountPartner!]! + + """List of Account Partner edges""" + edges: [SalesforceAccountPartnerEdge!]! +} + +"""Field that Opportunities can be sorted by""" +enum SalesforceOpportunitySortByFieldEnum { + ID + IS_DELETED + ACCOUNT_ID + IS_PRIVATE + NAME + STAGE_NAME + AMOUNT + PROBABILITY + EXPECTED_REVENUE + TOTAL_OPPORTUNITY_QUANTITY + CLOSE_DATE + TYPE + NEXT_STEP + LEAD_SOURCE + IS_CLOSED + IS_WON + FORECAST_CATEGORY + FORECAST_CATEGORY_NAME + CAMPAIGN_ID + HAS_OPPORTUNITY_LINE_ITEM + PRICEBOOK_2_ID + OWNER_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_ACTIVITY_DATE + FISCAL_QUARTER + FISCAL_YEAR + FISCAL + LAST_VIEWED_DATE + LAST_REFERENCED_DATE +} + +""" +A filter to be used against CampaignShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCampaignShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CampaignShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CampaignShare's campaign relation.""" + campaign: SalesforceCampaignConnectionFilter + + """Filter by the CampaignShare's id field""" + id: SalesforceIdFilter + + """Filter by the CampaignShare's campaignId field""" + campaignId: SalesforceIdFilter + + """Filter by the CampaignShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the CampaignShare's campaignAccessLevel field""" + campaignAccessLevel: SalesforceStringFilter + + """Filter by the CampaignShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the CampaignShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CampaignShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CampaignShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCampaignShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCampaignShareConnectionFilter!] +} + +"""Field that Campaign Shares can be sorted by""" +enum SalesforceCampaignShareSortByFieldEnum { + ID + CAMPAIGN_ID + USER_OR_GROUP_ID + CAMPAIGN_ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceCampaignShareEdge { + """The item at the end of the edge.""" + node: SalesforceCampaignShare! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceCampaignShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Campaign Share""" +type SalesforceCampaignShare implements OneGraphNode { + """Campaign Share ID""" + id: String! + + """Campaign ID""" + campaignId: String! + + """Campaign ID""" + campaign: SalesforceCampaign! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceCampaignShareUserOrGroupUnion! + + """Campaign Access""" + campaignAccessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Campaign Shares connection, for use in pagination.""" +type SalesforceCampaignSharesConnection { + """The count of all Campaign Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Campaign Shares""" + nodes: [SalesforceCampaignShare!]! + + """List of Campaign Share edges""" + edges: [SalesforceCampaignShareEdge!]! +} + +""" +A filter to be used against CampaignMemberStatus object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCampaignMemberStatusConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CampaignMemberStatus's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CampaignMemberStatus's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CampaignMemberStatus's campaign relation.""" + campaign: SalesforceCampaignConnectionFilter + + """Filter by the CampaignMemberStatus's id field""" + id: SalesforceIdFilter + + """Filter by the CampaignMemberStatus's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CampaignMemberStatus's campaignId field""" + campaignId: SalesforceIdFilter + + """Filter by the CampaignMemberStatus's label field""" + label: SalesforceStringFilter + + """Filter by the CampaignMemberStatus's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the CampaignMemberStatus's isDefault field""" + isDefault: SalesforceBooleanFilter + + """Filter by the CampaignMemberStatus's hasResponded field""" + hasResponded: SalesforceBooleanFilter + + """Filter by the CampaignMemberStatus's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CampaignMemberStatus's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CampaignMemberStatus's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CampaignMemberStatus's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CampaignMemberStatus's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCampaignMemberStatusConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCampaignMemberStatusConnectionFilter!] +} + +"""Field that Campaign Member Statuses can be sorted by""" +enum SalesforceCampaignMemberStatusSortByFieldEnum { + ID + IS_DELETED + CAMPAIGN_ID + LABEL + SORT_ORDER + IS_DEFAULT + HAS_RESPONDED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceCampaignMemberStatusEdge { + """The item at the end of the edge.""" + node: SalesforceCampaignMemberStatus! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Campaign Member Status""" +type SalesforceCampaignMemberStatus implements OneGraphNode { + """Campaign Member Status ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Campaign ID""" + campaignId: String! + + """Campaign ID""" + campaign: SalesforceCampaign! + + """Member Status""" + label: String! + + """Sort Order""" + sortOrder: Int + + """Is Default""" + isDefault: Boolean! + + """Responded""" + hasResponded: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Campaign Member Statuses connection, for use in pagination.""" +type SalesforceCampaignMemberStatussConnection { + """ + The count of all Campaign Member Status you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Campaign Member Statuses""" + nodes: [SalesforceCampaignMemberStatus!]! + + """List of Campaign Member Status edges""" + edges: [SalesforceCampaignMemberStatusEdge!]! +} + +""" +A filter to be used against Lead object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceLeadConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Lead's dandbCompany relation.""" + dandbCompany: SalesforceDandBCompanyConnectionFilter + + """Filter by the Lead's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Lead's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Lead's convertedOpportunity relation.""" + convertedOpportunity: SalesforceOpportunityConnectionFilter + + """Filter by the Lead's convertedContact relation.""" + convertedContact: SalesforceContactConnectionFilter + + """Filter by the Lead's convertedAccount relation.""" + convertedAccount: SalesforceAccountConnectionFilter + + """Filter by the Lead's masterRecord relation.""" + masterRecord: SalesforceLeadConnectionFilter + + """Filter by the Lead's id field""" + id: SalesforceIdFilter + + """Filter by the Lead's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Lead's masterRecordId field""" + masterRecordId: SalesforceIdFilter + + """Filter by the Lead's lastName field""" + lastName: SalesforceStringFilter + + """Filter by the Lead's firstName field""" + firstName: SalesforceStringFilter + + """Filter by the Lead's salutation field""" + salutation: SalesforceStringFilter + + """Filter by the Lead's name field""" + name: SalesforceStringFilter + + """Filter by the Lead's title field""" + title: SalesforceStringFilter + + """Filter by the Lead's company field""" + company: SalesforceStringFilter + + """Filter by the Lead's street field""" + street: SalesforceStringFilter + + """Filter by the Lead's city field""" + city: SalesforceStringFilter + + """Filter by the Lead's state field""" + state: SalesforceStringFilter + + """Filter by the Lead's postalCode field""" + postalCode: SalesforceStringFilter + + """Filter by the Lead's country field""" + country: SalesforceStringFilter + + """Filter by the Lead's latitude field""" + latitude: SalesforceFloatFilter + + """Filter by the Lead's longitude field""" + longitude: SalesforceFloatFilter + + """Filter by the Lead's geocodeAccuracy field""" + geocodeAccuracy: SalesforceStringFilter + + """Filter by the Lead's phone field""" + phone: SalesforceStringFilter + + """Filter by the Lead's mobilePhone field""" + mobilePhone: SalesforceStringFilter + + """Filter by the Lead's fax field""" + fax: SalesforceStringFilter + + """Filter by the Lead's email field""" + email: SalesforceStringFilter + + """Filter by the Lead's website field""" + website: SalesforceStringFilter + + """Filter by the Lead's photoUrl field""" + photoUrl: SalesforceStringFilter + + """Filter by the Lead's leadSource field""" + leadSource: SalesforceStringFilter + + """Filter by the Lead's status field""" + status: SalesforceStringFilter + + """Filter by the Lead's industry field""" + industry: SalesforceStringFilter + + """Filter by the Lead's rating field""" + rating: SalesforceStringFilter + + """Filter by the Lead's annualRevenue field""" + annualRevenue: SalesforceFloatFilter + + """Filter by the Lead's numberOfEmployees field""" + numberOfEmployees: SalesforceIntFilter + + """Filter by the Lead's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Lead's isConverted field""" + isConverted: SalesforceBooleanFilter + + """Filter by the Lead's convertedDate field""" + convertedDate: SalesforceDateFilter + + """Filter by the Lead's convertedAccountId field""" + convertedAccountId: SalesforceIdFilter + + """Filter by the Lead's convertedContactId field""" + convertedContactId: SalesforceIdFilter + + """Filter by the Lead's convertedOpportunityId field""" + convertedOpportunityId: SalesforceIdFilter + + """Filter by the Lead's isUnreadByOwner field""" + isUnreadByOwner: SalesforceBooleanFilter + + """Filter by the Lead's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Lead's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Lead's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Lead's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Lead's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Lead's lastActivityDate field""" + lastActivityDate: SalesforceDateFilter + + """Filter by the Lead's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Lead's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the Lead's jigsaw field""" + jigsaw: SalesforceStringFilter + + """Filter by the Lead's jigsawContactId field""" + jigsawContactId: SalesforceStringFilter + + """Filter by the Lead's cleanStatus field""" + cleanStatus: SalesforceStringFilter + + """Filter by the Lead's companyDunsNumber field""" + companyDunsNumber: SalesforceStringFilter + + """Filter by the Lead's dandbCompanyId field""" + dandbCompanyId: SalesforceIdFilter + + """Filter by the Lead's emailBouncedReason field""" + emailBouncedReason: SalesforceStringFilter + + """Filter by the Lead's emailBouncedDate field""" + emailBouncedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceLeadConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceLeadConnectionFilter!] +} + +""" +A filter to be used against CampaignMember object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCampaignMemberConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CampaignMember's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CampaignMember's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CampaignMember's contact relation.""" + contact: SalesforceContactConnectionFilter + + """Filter by the CampaignMember's lead relation.""" + lead: SalesforceLeadConnectionFilter + + """Filter by the CampaignMember's campaign relation.""" + campaign: SalesforceCampaignConnectionFilter + + """Filter by the CampaignMember's id field""" + id: SalesforceIdFilter + + """Filter by the CampaignMember's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CampaignMember's campaignId field""" + campaignId: SalesforceIdFilter + + """Filter by the CampaignMember's leadId field""" + leadId: SalesforceIdFilter + + """Filter by the CampaignMember's contactId field""" + contactId: SalesforceIdFilter + + """Filter by the CampaignMember's status field""" + status: SalesforceStringFilter + + """Filter by the CampaignMember's hasResponded field""" + hasResponded: SalesforceBooleanFilter + + """Filter by the CampaignMember's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CampaignMember's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CampaignMember's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CampaignMember's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CampaignMember's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CampaignMember's firstRespondedDate field""" + firstRespondedDate: SalesforceDateFilter + + """Filter by the CampaignMember's salutation field""" + salutation: SalesforceStringFilter + + """Filter by the CampaignMember's name field""" + name: SalesforceStringFilter + + """Filter by the CampaignMember's firstName field""" + firstName: SalesforceStringFilter + + """Filter by the CampaignMember's lastName field""" + lastName: SalesforceStringFilter + + """Filter by the CampaignMember's title field""" + title: SalesforceStringFilter + + """Filter by the CampaignMember's street field""" + street: SalesforceStringFilter + + """Filter by the CampaignMember's city field""" + city: SalesforceStringFilter + + """Filter by the CampaignMember's state field""" + state: SalesforceStringFilter + + """Filter by the CampaignMember's postalCode field""" + postalCode: SalesforceStringFilter + + """Filter by the CampaignMember's country field""" + country: SalesforceStringFilter + + """Filter by the CampaignMember's email field""" + email: SalesforceStringFilter + + """Filter by the CampaignMember's phone field""" + phone: SalesforceStringFilter + + """Filter by the CampaignMember's fax field""" + fax: SalesforceStringFilter + + """Filter by the CampaignMember's mobilePhone field""" + mobilePhone: SalesforceStringFilter + + """Filter by the CampaignMember's doNotCall field""" + doNotCall: SalesforceBooleanFilter + + """Filter by the CampaignMember's hasOptedOutOfEmail field""" + hasOptedOutOfEmail: SalesforceBooleanFilter + + """Filter by the CampaignMember's hasOptedOutOfFax field""" + hasOptedOutOfFax: SalesforceBooleanFilter + + """Filter by the CampaignMember's leadSource field""" + leadSource: SalesforceStringFilter + + """Filter by the CampaignMember's companyOrAccount field""" + companyOrAccount: SalesforceStringFilter + + """Filter by the CampaignMember's type field""" + type: SalesforceStringFilter + + """Filter by the CampaignMember's leadOrContactId field""" + leadOrContactId: SalesforceIdFilter + + """Filter by the CampaignMember's leadOrContactOwnerId field""" + leadOrContactOwnerId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCampaignMemberConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCampaignMemberConnectionFilter!] +} + +"""Field that Campaign Members can be sorted by""" +enum SalesforceCampaignMemberSortByFieldEnum { + ID + IS_DELETED + CAMPAIGN_ID + LEAD_ID + CONTACT_ID + STATUS + HAS_RESPONDED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + FIRST_RESPONDED_DATE + SALUTATION + NAME + FIRST_NAME + LAST_NAME + TITLE + STREET + CITY + STATE + POSTAL_CODE + COUNTRY + EMAIL + PHONE + FAX + MOBILE_PHONE + DO_NOT_CALL + HAS_OPTED_OUT_OF_EMAIL + HAS_OPTED_OUT_OF_FAX + LEAD_SOURCE + COMPANY_OR_ACCOUNT + TYPE + LEAD_OR_CONTACT_ID + LEAD_OR_CONTACT_OWNER_ID +} + +"""An edge in a connection.""" +type SalesforceCampaignMemberEdge { + """The item at the end of the edge.""" + node: SalesforceCampaignMember! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceCampaignMemberLeadOrContactOwnerUnion = SalesforceUser | SalesforceGroup + +union SalesforceCampaignMemberLeadOrContactUnion = SalesforceLead | SalesforceContact + +"""Campaign Member""" +type SalesforceCampaignMember implements OneGraphNode { + """Campaign Member ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Campaign ID""" + campaignId: String! + + """Campaign ID""" + campaign: SalesforceCampaign! + + """Lead ID""" + leadId: String + + """Lead ID""" + lead: SalesforceLead + + """Contact ID""" + contactId: String + + """Contact ID""" + contact: SalesforceContact + + """Status""" + status: String + + """Responded""" + hasResponded: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """First Responded Date""" + firstRespondedDate: String + + """Salutation""" + salutation: String + + """Name""" + name: String + + """First Name""" + firstName: String + + """Last Name""" + lastName: String + + """Title""" + title: String + + """Street""" + street: String + + """City""" + city: String + + """State/Province""" + state: String + + """Zip/Postal Code""" + postalCode: String + + """Country""" + country: String + + """Email""" + email: String + + """Phone""" + phone: String + + """Fax""" + fax: String + + """Mobile""" + mobilePhone: String + + """Description""" + description: String + + """Do Not Call""" + doNotCall: Boolean! + + """Email Opt Out""" + hasOptedOutOfEmail: Boolean! + + """Fax Opt Out""" + hasOptedOutOfFax: Boolean! + + """Lead Source""" + leadSource: String + + """Company (Account)""" + companyOrAccount: String + + """Type""" + type: String + + """Lead/Contact ID""" + leadOrContactId: String + + """Lead/Contact ID""" + leadOrContact: SalesforceCampaignMemberLeadOrContactUnion + + """Lead/Contact Owner ID""" + leadOrContactOwnerId: String + + """Lead/Contact Owner ID""" + leadOrContactOwner: SalesforceCampaignMemberLeadOrContactOwnerUnion + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Campaign Members connection, for use in pagination.""" +type SalesforceCampaignMembersConnection { + """The count of all Campaign Member you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Campaign Members""" + nodes: [SalesforceCampaignMember!]! + + """List of Campaign Member edges""" + edges: [SalesforceCampaignMemberEdge!]! +} + +""" +A filter to be used against CampaignHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCampaignHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CampaignHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CampaignHistory's campaign relation.""" + campaign: SalesforceCampaignConnectionFilter + + """Filter by the CampaignHistory's id field""" + id: SalesforceIdFilter + + """Filter by the CampaignHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CampaignHistory's campaignId field""" + campaignId: SalesforceIdFilter + + """Filter by the CampaignHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CampaignHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CampaignHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCampaignHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCampaignHistoryConnectionFilter!] +} + +"""Field that Campaign Field Histories can be sorted by""" +enum SalesforceCampaignHistorySortByFieldEnum { + ID + IS_DELETED + CAMPAIGN_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceCampaignHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceCampaignHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Campaign Field History""" +type SalesforceCampaignHistory implements OneGraphNode { + """Campaign Field History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Campaign ID""" + campaignId: String! + + """Campaign ID""" + campaign: SalesforceCampaign! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Campaign Field Histories connection, for use in pagination.""" +type SalesforceCampaignHistorysConnection { + """ + The count of all Campaign Field History you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Campaign Field Histories""" + nodes: [SalesforceCampaignHistory!]! + + """List of Campaign Field History edges""" + edges: [SalesforceCampaignHistoryEdge!]! +} + +""" +A filter to be used against CampaignFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCampaignFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CampaignFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the CampaignFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the CampaignFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CampaignFeed's parent relation.""" + parent: SalesforceCampaignConnectionFilter + + """Filter by the CampaignFeed's id field""" + id: SalesforceIdFilter + + """Filter by the CampaignFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the CampaignFeed's type field""" + type: SalesforceStringFilter + + """Filter by the CampaignFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CampaignFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CampaignFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CampaignFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CampaignFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CampaignFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the CampaignFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the CampaignFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCampaignFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCampaignFeedConnectionFilter!] +} + +"""Field that Campaign Feeds can be sorted by""" +enum SalesforceCampaignFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceCampaignFeedEdge { + """The item at the end of the edge.""" + node: SalesforceCampaignFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""An edge in a connection.""" +type SalesforceFeedAttachmentEdge { + """The item at the end of the edge.""" + node: SalesforceFeedAttachment! + + """A cursor for use in pagination""" + cursor: String! +} + +"""An edge in a connection.""" +type SalesforceFeedCommentEdge { + """The item at the end of the edge.""" + node: SalesforceFeedComment! + + """A cursor for use in pagination""" + cursor: String! +} + +"""An edge in a connection.""" +type SalesforceFeedPollChoiceEdge { + """The item at the end of the edge.""" + node: SalesforceFeedPollChoice! + + """A cursor for use in pagination""" + cursor: String! +} + +"""An edge in a connection.""" +type SalesforceFeedPollVoteEdge { + """The item at the end of the edge.""" + node: SalesforceFeedPollVote! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against SiteHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSiteHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SiteHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SiteHistory's site relation.""" + site: SalesforceSiteConnectionFilter + + """Filter by the SiteHistory's id field""" + id: SalesforceIdFilter + + """Filter by the SiteHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SiteHistory's siteId field""" + siteId: SalesforceIdFilter + + """Filter by the SiteHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SiteHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SiteHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSiteHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSiteHistoryConnectionFilter!] +} + +"""Field that Site Histories can be sorted by""" +enum SalesforceSiteHistorySortByFieldEnum { + ID + IS_DELETED + SITE_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceSiteHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceSiteHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Site History""" +type SalesforceSiteHistory implements OneGraphNode { + """Custom Site ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Site ID""" + siteId: String! + + """Site ID""" + site: SalesforceSite! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Site Histories connection, for use in pagination.""" +type SalesforceSiteHistorysConnection { + """The count of all Site History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Site Histories""" + nodes: [SalesforceSiteHistory!]! + + """List of Site History edges""" + edges: [SalesforceSiteHistoryEdge!]! +} + +""" +A filter to be used against SiteFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSiteFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SiteFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the SiteFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the SiteFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SiteFeed's parent relation.""" + parent: SalesforceSiteConnectionFilter + + """Filter by the SiteFeed's id field""" + id: SalesforceIdFilter + + """Filter by the SiteFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the SiteFeed's type field""" + type: SalesforceStringFilter + + """Filter by the SiteFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SiteFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SiteFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SiteFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SiteFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the SiteFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the SiteFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the SiteFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSiteFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSiteFeedConnectionFilter!] +} + +"""Field that Sites can be sorted by""" +enum SalesforceSiteFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceSiteFeedEdge { + """The item at the end of the edge.""" + node: SalesforceSiteFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Sites connection, for use in pagination.""" +type SalesforceSiteFeedsConnection { + """The count of all Site you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Sites""" + nodes: [SalesforceSiteFeed!]! + + """List of Site edges""" + edges: [SalesforceSiteFeedEdge!]! +} + +"""An edge in a connection.""" +type SalesforceFeedItemEdge { + """The item at the end of the edge.""" + node: SalesforceFeedItem! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceFeedAttachmentRecordUnion = SalesforceFeedItem | SalesforceContentVersion | SalesforceContentDocument + +""" +A filter to be used against FeedRevision object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFeedRevisionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FeedRevision's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the FeedRevision's id field""" + id: SalesforceIdFilter + + """Filter by the FeedRevision's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the FeedRevision's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the FeedRevision's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the FeedRevision's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the FeedRevision's feedEntityId field""" + feedEntityId: SalesforceIdFilter + + """Filter by the FeedRevision's revision field""" + revision: SalesforceIntFilter + + """Filter by the FeedRevision's action field""" + action: SalesforceStringFilter + + """Filter by the FeedRevision's editedAttribute field""" + editedAttribute: SalesforceStringFilter + + """Filter by the FeedRevision's isValueRichText field""" + isValueRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFeedRevisionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFeedRevisionConnectionFilter!] +} + +"""Field that Feed Revisions can be sorted by""" +enum SalesforceFeedRevisionSortByFieldEnum { + ID + CREATED_DATE + CREATED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED + FEED_ENTITY_ID + REVISION + ACTION + EDITED_ATTRIBUTE + IS_VALUE_RICH_TEXT +} + +"""An edge in a connection.""" +type SalesforceFeedRevisionEdge { + """The item at the end of the edge.""" + node: SalesforceFeedRevision! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceFeedRevisionFeedEntityUnion = SalesforceFeedItem | SalesforceFeedComment + +"""Feed Revision""" +type SalesforceFeedRevision implements OneGraphNode { + """Feed Revision ID""" + id: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Feed Entity ID""" + feedEntityId: String! + + """Feed Entity ID""" + feedEntity: SalesforceFeedRevisionFeedEntityUnion! + + """Revision""" + revision: Int + + """Action""" + action: String + + """Edited Attribute""" + editedAttribute: String + + """Value""" + value: String + + """Is Value RichText""" + isValueRichText: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Feed Revisions connection, for use in pagination.""" +type SalesforceFeedRevisionsConnection { + """The count of all Feed Revision you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Feed Revisions""" + nodes: [SalesforceFeedRevision!]! + + """List of Feed Revision edges""" + edges: [SalesforceFeedRevisionEdge!]! +} + +""" +A filter to be used against OrderItemHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOrderItemHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OrderItemHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OrderItemHistory's orderItem relation.""" + orderItem: SalesforceOrderItemConnectionFilter + + """Filter by the OrderItemHistory's id field""" + id: SalesforceIdFilter + + """Filter by the OrderItemHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the OrderItemHistory's orderItemId field""" + orderItemId: SalesforceIdFilter + + """Filter by the OrderItemHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OrderItemHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OrderItemHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOrderItemHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOrderItemHistoryConnectionFilter!] +} + +"""Field that Order Product Histories can be sorted by""" +enum SalesforceOrderItemHistorySortByFieldEnum { + ID + IS_DELETED + ORDER_ITEM_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceOrderItemHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceOrderItemHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Order Product History""" +type SalesforceOrderItemHistory implements OneGraphNode { + """Order Product History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Order Product ID""" + orderItemId: String! + + """Order Product ID""" + orderItem: SalesforceOrderItem! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Order Product Histories connection, for use in pagination.""" +type SalesforceOrderItemHistorysConnection { + """ + The count of all Order Product History you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Order Product Histories""" + nodes: [SalesforceOrderItemHistory!]! + + """List of Order Product History edges""" + edges: [SalesforceOrderItemHistoryEdge!]! +} + +""" +A filter to be used against OrderItemFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOrderItemFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OrderItemFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the OrderItemFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the OrderItemFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OrderItemFeed's parent relation.""" + parent: SalesforceOrderItemConnectionFilter + + """Filter by the OrderItemFeed's id field""" + id: SalesforceIdFilter + + """Filter by the OrderItemFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the OrderItemFeed's type field""" + type: SalesforceStringFilter + + """Filter by the OrderItemFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OrderItemFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OrderItemFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the OrderItemFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OrderItemFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the OrderItemFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the OrderItemFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the OrderItemFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOrderItemFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOrderItemFeedConnectionFilter!] +} + +"""Field that Order Product Feeds can be sorted by""" +enum SalesforceOrderItemFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceOrderItemFeedEdge { + """The item at the end of the edge.""" + node: SalesforceOrderItemFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Account Feed""" +type SalesforceAccountFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceAccount! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Case Feed""" +type SalesforceCaseFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceCase! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Contact Feed""" +type SalesforceContactFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceContact! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""ContentDocument Feed""" +type SalesforceContentDocumentFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceContentDocument! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Contract Feed""" +type SalesforceContractFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceContract! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Dashboard Component Feed""" +type SalesforceDashboardComponentFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceDashboardComponent! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Dashboard Feed""" +type SalesforceDashboardFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceDashboard! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against UndecidedEventRelation object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUndecidedEventRelationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UndecidedEventRelation's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UndecidedEventRelation's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UndecidedEventRelation's event relation.""" + event: SalesforceEventConnectionFilter + + """Filter by the UndecidedEventRelation's id field""" + id: SalesforceIdFilter + + """Filter by the UndecidedEventRelation's relationId field""" + relationId: SalesforceIdFilter + + """Filter by the UndecidedEventRelation's eventId field""" + eventId: SalesforceIdFilter + + """Filter by the UndecidedEventRelation's respondedDate field""" + respondedDate: SalesforceDateTimeFilter + + """Filter by the UndecidedEventRelation's response field""" + response: SalesforceStringFilter + + """Filter by the UndecidedEventRelation's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UndecidedEventRelation's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UndecidedEventRelation's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UndecidedEventRelation's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UndecidedEventRelation's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UndecidedEventRelation's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UndecidedEventRelation's type field""" + type: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUndecidedEventRelationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUndecidedEventRelationConnectionFilter!] +} + +"""Field that Undecided Event Relations can be sorted by""" +enum SalesforceUndecidedEventRelationSortByFieldEnum { + ID + RELATION_ID + EVENT_ID + RESPONDED_DATE + RESPONSE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED + TYPE +} + +"""An edge in a connection.""" +type SalesforceUndecidedEventRelationEdge { + """The item at the end of the edge.""" + node: SalesforceUndecidedEventRelation! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceUndecidedEventRelationRelationUnion = SalesforceUser | SalesforceLead | SalesforceContact + +"""Undecided Event Relation""" +type SalesforceUndecidedEventRelation implements OneGraphNode { + """Event Relation ID""" + id: String! + + """Relation ID""" + relationId: String + + """Relation ID""" + relation: SalesforceUndecidedEventRelationRelationUnion + + """Event ID""" + eventId: String + + """Event ID""" + event: SalesforceEvent + + """Response Date""" + respondedDate: String + + """Response""" + response: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Type""" + type: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Undecided Event Relations connection, for use in pagination. +""" +type SalesforceUndecidedEventRelationsConnection { + """ + The count of all Undecided Event Relation you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Undecided Event Relations""" + nodes: [SalesforceUndecidedEventRelation!]! + + """List of Undecided Event Relation edges""" + edges: [SalesforceUndecidedEventRelationEdge!]! +} + +""" +A filter to be used against EventRelation object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEventRelationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the EventRelation's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the EventRelation's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the EventRelation's event relation.""" + event: SalesforceEventConnectionFilter + + """Filter by the EventRelation's id field""" + id: SalesforceIdFilter + + """Filter by the EventRelation's relationId field""" + relationId: SalesforceIdFilter + + """Filter by the EventRelation's eventId field""" + eventId: SalesforceIdFilter + + """Filter by the EventRelation's status field""" + status: SalesforceStringFilter + + """Filter by the EventRelation's respondedDate field""" + respondedDate: SalesforceDateTimeFilter + + """Filter by the EventRelation's response field""" + response: SalesforceStringFilter + + """Filter by the EventRelation's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the EventRelation's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the EventRelation's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the EventRelation's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the EventRelation's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the EventRelation's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEventRelationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEventRelationConnectionFilter!] +} + +"""Field that Event Relations can be sorted by""" +enum SalesforceEventRelationSortByFieldEnum { + ID + RELATION_ID + EVENT_ID + STATUS + RESPONDED_DATE + RESPONSE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceEventRelationEdge { + """The item at the end of the edge.""" + node: SalesforceEventRelation! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceEventRelationRelationUnion = SalesforceUser | SalesforceLead | SalesforceContact + +"""Event Relation""" +type SalesforceEventRelation implements OneGraphNode { + """Event Relation ID""" + id: String! + + """Relation ID""" + relationId: String! + + """Relation ID""" + relation: SalesforceEventRelationRelationUnion! + + """Event ID""" + eventId: String! + + """Event ID""" + event: SalesforceEvent! + + """Status""" + status: String + + """Response Date""" + respondedDate: String + + """Response""" + response: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Event Relations connection, for use in pagination.""" +type SalesforceEventRelationsConnection { + """The count of all Event Relation you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Event Relations""" + nodes: [SalesforceEventRelation!]! + + """List of Event Relation edges""" + edges: [SalesforceEventRelationEdge!]! +} + +""" +A filter to be used against EventFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEventFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the EventFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the EventFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the EventFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the EventFeed's parent relation.""" + parent: SalesforceEventConnectionFilter + + """Filter by the EventFeed's id field""" + id: SalesforceIdFilter + + """Filter by the EventFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the EventFeed's type field""" + type: SalesforceStringFilter + + """Filter by the EventFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the EventFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the EventFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the EventFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the EventFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the EventFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the EventFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the EventFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEventFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEventFeedConnectionFilter!] +} + +"""Field that Event Feeds can be sorted by""" +enum SalesforceEventFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceEventFeedEdge { + """The item at the end of the edge.""" + node: SalesforceEventFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Event Feeds connection, for use in pagination.""" +type SalesforceEventFeedsConnection { + """The count of all Event Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Event Feeds""" + nodes: [SalesforceEventFeed!]! + + """List of Event Feed edges""" + edges: [SalesforceEventFeedEdge!]! +} + +""" +A filter to be used against DeclinedEventRelation object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDeclinedEventRelationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DeclinedEventRelation's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the DeclinedEventRelation's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DeclinedEventRelation's event relation.""" + event: SalesforceEventConnectionFilter + + """Filter by the DeclinedEventRelation's id field""" + id: SalesforceIdFilter + + """Filter by the DeclinedEventRelation's relationId field""" + relationId: SalesforceIdFilter + + """Filter by the DeclinedEventRelation's eventId field""" + eventId: SalesforceIdFilter + + """Filter by the DeclinedEventRelation's respondedDate field""" + respondedDate: SalesforceDateTimeFilter + + """Filter by the DeclinedEventRelation's response field""" + response: SalesforceStringFilter + + """Filter by the DeclinedEventRelation's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DeclinedEventRelation's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DeclinedEventRelation's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DeclinedEventRelation's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the DeclinedEventRelation's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the DeclinedEventRelation's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DeclinedEventRelation's type field""" + type: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDeclinedEventRelationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDeclinedEventRelationConnectionFilter!] +} + +"""Field that Declined Event Relations can be sorted by""" +enum SalesforceDeclinedEventRelationSortByFieldEnum { + ID + RELATION_ID + EVENT_ID + RESPONDED_DATE + RESPONSE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED + TYPE +} + +"""An edge in a connection.""" +type SalesforceDeclinedEventRelationEdge { + """The item at the end of the edge.""" + node: SalesforceDeclinedEventRelation! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceDeclinedEventRelationRelationUnion = SalesforceUser | SalesforceLead | SalesforceContact + +"""Declined Event Relation""" +type SalesforceDeclinedEventRelation implements OneGraphNode { + """Event Relation ID""" + id: String! + + """Relation ID""" + relationId: String + + """Relation ID""" + relation: SalesforceDeclinedEventRelationRelationUnion + + """Event ID""" + eventId: String + + """Event ID""" + event: SalesforceEvent + + """Response Date""" + respondedDate: String + + """Response""" + response: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Type""" + type: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Declined Event Relations connection, for use in pagination.""" +type SalesforceDeclinedEventRelationsConnection { + """ + The count of all Declined Event Relation you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Declined Event Relations""" + nodes: [SalesforceDeclinedEventRelation!]! + + """List of Declined Event Relation edges""" + edges: [SalesforceDeclinedEventRelationEdge!]! +} + +""" +A filter to be used against AcceptedEventRelation object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAcceptedEventRelationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AcceptedEventRelation's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AcceptedEventRelation's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AcceptedEventRelation's event relation.""" + event: SalesforceEventConnectionFilter + + """Filter by the AcceptedEventRelation's id field""" + id: SalesforceIdFilter + + """Filter by the AcceptedEventRelation's relationId field""" + relationId: SalesforceIdFilter + + """Filter by the AcceptedEventRelation's eventId field""" + eventId: SalesforceIdFilter + + """Filter by the AcceptedEventRelation's respondedDate field""" + respondedDate: SalesforceDateTimeFilter + + """Filter by the AcceptedEventRelation's response field""" + response: SalesforceStringFilter + + """Filter by the AcceptedEventRelation's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AcceptedEventRelation's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AcceptedEventRelation's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AcceptedEventRelation's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AcceptedEventRelation's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AcceptedEventRelation's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AcceptedEventRelation's type field""" + type: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAcceptedEventRelationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAcceptedEventRelationConnectionFilter!] +} + +"""Field that Accepted Event Relations can be sorted by""" +enum SalesforceAcceptedEventRelationSortByFieldEnum { + ID + RELATION_ID + EVENT_ID + RESPONDED_DATE + RESPONSE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED + TYPE +} + +"""An edge in a connection.""" +type SalesforceAcceptedEventRelationEdge { + """The item at the end of the edge.""" + node: SalesforceAcceptedEventRelation! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceAcceptedEventRelationRelationUnion = SalesforceUser | SalesforceLead | SalesforceContact + +"""Accepted Event Relation""" +type SalesforceAcceptedEventRelation implements OneGraphNode { + """Event Relation ID""" + id: String! + + """Relation ID""" + relationId: String + + """Relation ID""" + relation: SalesforceAcceptedEventRelationRelationUnion + + """Event ID""" + eventId: String + + """Event ID""" + event: SalesforceEvent + + """Response Date""" + respondedDate: String + + """Response""" + response: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Type""" + type: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Accepted Event Relations connection, for use in pagination.""" +type SalesforceAcceptedEventRelationsConnection { + """ + The count of all Accepted Event Relation you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Accepted Event Relations""" + nodes: [SalesforceAcceptedEventRelation!]! + + """List of Accepted Event Relation edges""" + edges: [SalesforceAcceptedEventRelationEdge!]! +} + +""" +A filter to be used against AssetRelationshipHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAssetRelationshipHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AssetRelationshipHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AssetRelationshipHistory's assetRelationship relation.""" + assetRelationship: SalesforceAssetRelationshipConnectionFilter + + """Filter by the AssetRelationshipHistory's id field""" + id: SalesforceIdFilter + + """Filter by the AssetRelationshipHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AssetRelationshipHistory's assetRelationshipId field""" + assetRelationshipId: SalesforceIdFilter + + """Filter by the AssetRelationshipHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AssetRelationshipHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AssetRelationshipHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAssetRelationshipHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAssetRelationshipHistoryConnectionFilter!] +} + +"""Field that Asset Relationship Histories can be sorted by""" +enum SalesforceAssetRelationshipHistorySortByFieldEnum { + ID + IS_DELETED + ASSET_RELATIONSHIP_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceAssetRelationshipHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceAssetRelationshipHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Asset Relationship History""" +type SalesforceAssetRelationshipHistory implements OneGraphNode { + """Asset Relationship History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Asset Relationship ID""" + assetRelationshipId: String! + + """Asset Relationship ID""" + assetRelationship: SalesforceAssetRelationship! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Asset Relationship Histories connection, for use in pagination. +""" +type SalesforceAssetRelationshipHistorysConnection { + """ + The count of all Asset Relationship History you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Asset Relationship Histories""" + nodes: [SalesforceAssetRelationshipHistory!]! + + """List of Asset Relationship History edges""" + edges: [SalesforceAssetRelationshipHistoryEdge!]! +} + +""" +A filter to be used against AssetRelationshipFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAssetRelationshipFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AssetRelationshipFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the AssetRelationshipFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the AssetRelationshipFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AssetRelationshipFeed's parent relation.""" + parent: SalesforceAssetRelationshipConnectionFilter + + """Filter by the AssetRelationshipFeed's id field""" + id: SalesforceIdFilter + + """Filter by the AssetRelationshipFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the AssetRelationshipFeed's type field""" + type: SalesforceStringFilter + + """Filter by the AssetRelationshipFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AssetRelationshipFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AssetRelationshipFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AssetRelationshipFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AssetRelationshipFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AssetRelationshipFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the AssetRelationshipFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the AssetRelationshipFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAssetRelationshipFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAssetRelationshipFeedConnectionFilter!] +} + +"""Field that Asset Relationship Feeds can be sorted by""" +enum SalesforceAssetRelationshipFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceAssetRelationshipFeedEdge { + """The item at the end of the edge.""" + node: SalesforceAssetRelationshipFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Asset Relationship Feed""" +type SalesforceAssetRelationshipFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceAssetRelationship! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Asset Relationship Feeds connection, for use in pagination.""" +type SalesforceAssetRelationshipFeedsConnection { + """ + The count of all Asset Relationship Feed you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Asset Relationship Feeds""" + nodes: [SalesforceAssetRelationshipFeed!]! + + """List of Asset Relationship Feed edges""" + edges: [SalesforceAssetRelationshipFeedEdge!]! +} + +union SalesforceNoteAndAttachmentParentUnion = SalesforceProduct2 | SalesforceOrder | SalesforceOpportunity | SalesforceLead | SalesforceContract | SalesforceContact | SalesforceAsset | SalesforceAccount + +union SalesforceOpenActivityWhatUnion = SalesforceSolution | SalesforceProduct2 | SalesforceOrder | SalesforceOpportunity | SalesforceContract | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +union SalesforceLookedUpFromActivityWhatUnion = SalesforceSolution | SalesforceProduct2 | SalesforceOrder | SalesforceOpportunity | SalesforceContract | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +union SalesforceActivityHistoryWhatUnion = SalesforceSolution | SalesforceProduct2 | SalesforceOrder | SalesforceOpportunity | SalesforceContract | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +""" +A filter to be used against Topic object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTopicConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Topic's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Topic's id field""" + id: SalesforceIdFilter + + """Filter by the Topic's name field""" + name: SalesforceStringFilter + + """Filter by the Topic's description field""" + description: SalesforceStringFilter + + """Filter by the Topic's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Topic's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Topic's talkingAbout field""" + talkingAbout: SalesforceIntFilter + + """Filter by the Topic's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTopicConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTopicConnectionFilter!] +} + +""" +A filter to be used against TopicAssignment object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTopicAssignmentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the TopicAssignment's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the TopicAssignment's topic relation.""" + topic: SalesforceTopicConnectionFilter + + """Filter by the TopicAssignment's id field""" + id: SalesforceIdFilter + + """Filter by the TopicAssignment's topicId field""" + topicId: SalesforceIdFilter + + """Filter by the TopicAssignment's entityId field""" + entityId: SalesforceIdFilter + + """Filter by the TopicAssignment's entityKeyPrefix field""" + entityKeyPrefix: SalesforceStringFilter + + """Filter by the TopicAssignment's entityType field""" + entityType: SalesforceStringFilter + + """Filter by the TopicAssignment's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the TopicAssignment's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the TopicAssignment's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the TopicAssignment's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTopicAssignmentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTopicAssignmentConnectionFilter!] +} + +"""Field that Records can be sorted by""" +enum SalesforceTopicAssignmentSortByFieldEnum { + ID + TOPIC_ID + ENTITY_ID + ENTITY_KEY_PREFIX + ENTITY_TYPE + CREATED_DATE + CREATED_BY_ID + IS_DELETED + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceTopicAssignmentEdge { + """The item at the end of the edge.""" + node: SalesforceTopicAssignment! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceTopicAssignmentEntityUnion = SalesforceTask | SalesforceSolution | SalesforceOrder | SalesforceOpportunity | SalesforceLead | SalesforceFeedItem | SalesforceEvent | SalesforceContract | SalesforceContentDocument | SalesforceContact | SalesforceCase | SalesforceCampaign | SalesforceAsset | SalesforceAccount + +"""Record""" +type SalesforceTopicAssignment implements OneGraphNode { + """Topic Assignment Id""" + id: String! + + """Topic ID""" + topicId: String! + + """Topic ID""" + topic: SalesforceTopic! + + """Entity ID""" + entityId: String! + + """Entity ID""" + entity: SalesforceTopicAssignmentEntityUnion! + + """Record Key Prefix""" + entityKeyPrefix: String! + + """Object Type""" + entityType: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Records connection, for use in pagination.""" +type SalesforceTopicAssignmentsConnection { + """The count of all Record you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Records""" + nodes: [SalesforceTopicAssignment!]! + + """List of Record edges""" + edges: [SalesforceTopicAssignmentEdge!]! +} + +"""Field that Tasks can be sorted by""" +enum SalesforceTaskSortByFieldEnum { + ID + WHO_ID + WHAT_ID + SUBJECT + ACTIVITY_DATE + STATUS + PRIORITY + IS_HIGH_PRIORITY + OWNER_ID + IS_DELETED + ACCOUNT_ID + IS_CLOSED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_ARCHIVED + CALL_DURATION_IN_SECONDS + CALL_TYPE + CALL_DISPOSITION + CALL_OBJECT + REMINDER_DATE_TIME + IS_REMINDER_SET + RECURRENCE_ACTIVITY_ID + IS_RECURRENCE + RECURRENCE_START_DATE_ONLY + RECURRENCE_END_DATE_ONLY + RECURRENCE_TIME_ZONE_SID_KEY + RECURRENCE_TYPE + RECURRENCE_INTERVAL + RECURRENCE_DAY_OF_WEEK_MASK + RECURRENCE_DAY_OF_MONTH + RECURRENCE_INSTANCE + RECURRENCE_MONTH_OF_YEAR + RECURRENCE_REGENERATED_TYPE + TASK_SUBTYPE +} + +"""An edge in a connection.""" +type SalesforceTaskEdge { + """The item at the end of the edge.""" + node: SalesforceTask! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Tasks connection, for use in pagination.""" +type SalesforceTasksConnection { + """The count of all Task you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Tasks""" + nodes: [SalesforceTask!]! + + """List of Task edges""" + edges: [SalesforceTaskEdge!]! +} + +""" +A filter to be used against Note object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceNoteConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Note's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Note's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Note's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the Note's id field""" + id: SalesforceIdFilter + + """Filter by the Note's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Note's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the Note's title field""" + title: SalesforceStringFilter + + """Filter by the Note's isPrivate field""" + isPrivate: SalesforceBooleanFilter + + """Filter by the Note's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Note's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Note's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Note's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Note's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Note's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceNoteConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceNoteConnectionFilter!] +} + +"""Field that Notes can be sorted by""" +enum SalesforceNoteSortByFieldEnum { + ID + IS_DELETED + PARENT_ID + TITLE + IS_PRIVATE + OWNER_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceNoteEdge { + """The item at the end of the edge.""" + node: SalesforceNote! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceNoteParentUnion = SalesforceProduct2 | SalesforceOrder | SalesforceOpportunity | SalesforceLead | SalesforceContract | SalesforceContact | SalesforceAsset | SalesforceAccount + +"""Note""" +type SalesforceNote implements OneGraphNode { + """Note Id""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceNoteParentUnion! + + """Title""" + title: String! + + """Private""" + isPrivate: Boolean! + + """Body""" + body: String + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Notes connection, for use in pagination.""" +type SalesforceNotesConnection { + """The count of all Note you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Notes""" + nodes: [SalesforceNote!]! + + """List of Note edges""" + edges: [SalesforceNoteEdge!]! +} + +""" +A filter to be used against Event object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEventConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Event's recurrenceActivity relation.""" + recurrenceActivity: SalesforceEventConnectionFilter + + """Filter by the Event's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Event's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Event's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the Event's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the Event's id field""" + id: SalesforceIdFilter + + """Filter by the Event's whoId field""" + whoId: SalesforceIdFilter + + """Filter by the Event's whatId field""" + whatId: SalesforceIdFilter + + """Filter by the Event's location field""" + location: SalesforceStringFilter + + """Filter by the Event's isAllDayEvent field""" + isAllDayEvent: SalesforceBooleanFilter + + """Filter by the Event's activityDateTime field""" + activityDateTime: SalesforceDateTimeFilter + + """Filter by the Event's activityDate field""" + activityDate: SalesforceDateFilter + + """Filter by the Event's durationInMinutes field""" + durationInMinutes: SalesforceIntFilter + + """Filter by the Event's startDateTime field""" + startDateTime: SalesforceDateTimeFilter + + """Filter by the Event's endDateTime field""" + endDateTime: SalesforceDateTimeFilter + + """Filter by the Event's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the Event's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Event's isPrivate field""" + isPrivate: SalesforceBooleanFilter + + """Filter by the Event's showAs field""" + showAs: SalesforceStringFilter + + """Filter by the Event's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Event's isChild field""" + isChild: SalesforceBooleanFilter + + """Filter by the Event's isGroupEvent field""" + isGroupEvent: SalesforceBooleanFilter + + """Filter by the Event's groupEventType field""" + groupEventType: SalesforceStringFilter + + """Filter by the Event's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Event's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Event's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Event's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Event's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Event's isArchived field""" + isArchived: SalesforceBooleanFilter + + """Filter by the Event's recurrenceActivityId field""" + recurrenceActivityId: SalesforceIdFilter + + """Filter by the Event's isRecurrence field""" + isRecurrence: SalesforceBooleanFilter + + """Filter by the Event's recurrenceStartDateTime field""" + recurrenceStartDateTime: SalesforceDateTimeFilter + + """Filter by the Event's recurrenceEndDateOnly field""" + recurrenceEndDateOnly: SalesforceDateFilter + + """Filter by the Event's recurrenceTimeZoneSidKey field""" + recurrenceTimeZoneSidKey: SalesforceStringFilter + + """Filter by the Event's recurrenceType field""" + recurrenceType: SalesforceStringFilter + + """Filter by the Event's recurrenceInterval field""" + recurrenceInterval: SalesforceIntFilter + + """Filter by the Event's recurrenceDayOfWeekMask field""" + recurrenceDayOfWeekMask: SalesforceIntFilter + + """Filter by the Event's recurrenceDayOfMonth field""" + recurrenceDayOfMonth: SalesforceIntFilter + + """Filter by the Event's recurrenceInstance field""" + recurrenceInstance: SalesforceStringFilter + + """Filter by the Event's recurrenceMonthOfYear field""" + recurrenceMonthOfYear: SalesforceStringFilter + + """Filter by the Event's reminderDateTime field""" + reminderDateTime: SalesforceDateTimeFilter + + """Filter by the Event's isReminderSet field""" + isReminderSet: SalesforceBooleanFilter + + """Filter by the Event's eventSubtype field""" + eventSubtype: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEventConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEventConnectionFilter!] +} + +"""Field that Events can be sorted by""" +enum SalesforceEventSortByFieldEnum { + ID + WHO_ID + WHAT_ID + SUBJECT + LOCATION + IS_ALL_DAY_EVENT + ACTIVITY_DATE_TIME + ACTIVITY_DATE + DURATION_IN_MINUTES + START_DATE_TIME + END_DATE_TIME + ACCOUNT_ID + OWNER_ID + IS_PRIVATE + SHOW_AS + IS_DELETED + IS_CHILD + IS_GROUP_EVENT + GROUP_EVENT_TYPE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_ARCHIVED + RECURRENCE_ACTIVITY_ID + IS_RECURRENCE + RECURRENCE_START_DATE_TIME + RECURRENCE_END_DATE_ONLY + RECURRENCE_TIME_ZONE_SID_KEY + RECURRENCE_TYPE + RECURRENCE_INTERVAL + RECURRENCE_DAY_OF_WEEK_MASK + RECURRENCE_DAY_OF_MONTH + RECURRENCE_INSTANCE + RECURRENCE_MONTH_OF_YEAR + REMINDER_DATE_TIME + IS_REMINDER_SET + EVENT_SUBTYPE +} + +"""An edge in a connection.""" +type SalesforceEventEdge { + """The item at the end of the edge.""" + node: SalesforceEvent! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Events connection, for use in pagination.""" +type SalesforceEventsConnection { + """The count of all Event you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Events""" + nodes: [SalesforceEvent!]! + + """List of Event edges""" + edges: [SalesforceEventEdge!]! +} + +"""An edge in a connection.""" +type SalesforceEmailMessageEdge { + """The item at the end of the edge.""" + node: SalesforceEmailMessage! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against EmailMessageRelation object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEmailMessageRelationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the EmailMessageRelation's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the EmailMessageRelation's emailMessage relation.""" + emailMessage: SalesforceEmailMessageConnectionFilter + + """Filter by the EmailMessageRelation's id field""" + id: SalesforceIdFilter + + """Filter by the EmailMessageRelation's emailMessageId field""" + emailMessageId: SalesforceIdFilter + + """Filter by the EmailMessageRelation's relationId field""" + relationId: SalesforceIdFilter + + """Filter by the EmailMessageRelation's relationType field""" + relationType: SalesforceStringFilter + + """Filter by the EmailMessageRelation's relationAddress field""" + relationAddress: SalesforceStringFilter + + """Filter by the EmailMessageRelation's relationObjectType field""" + relationObjectType: SalesforceStringFilter + + """Filter by the EmailMessageRelation's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the EmailMessageRelation's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the EmailMessageRelation's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the EmailMessageRelation's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEmailMessageRelationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEmailMessageRelationConnectionFilter!] +} + +"""Field that Email Message Relations can be sorted by""" +enum SalesforceEmailMessageRelationSortByFieldEnum { + ID + EMAIL_MESSAGE_ID + RELATION_ID + RELATION_TYPE + RELATION_ADDRESS + RELATION_OBJECT_TYPE + CREATED_DATE + CREATED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceEmailMessageRelationEdge { + """The item at the end of the edge.""" + node: SalesforceEmailMessageRelation! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceEmailMessageRelationRelationUnion = SalesforceUser | SalesforceLead | SalesforceContact + +"""Email Message Relation""" +type SalesforceEmailMessageRelation implements OneGraphNode { + """Email Message Relation ID""" + id: String! + + """Email Message ID""" + emailMessageId: String! + + """Email Message ID""" + emailMessage: SalesforceEmailMessage! + + """Relation ID""" + relationId: String + + """Relation ID""" + relation: SalesforceEmailMessageRelationRelationUnion + + """Relation Type""" + relationType: String! + + """Relation Address""" + relationAddress: String + + """Relation Object Type""" + relationObjectType: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Email Message Relations connection, for use in pagination.""" +type SalesforceEmailMessageRelationsConnection { + """ + The count of all Email Message Relation you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Email Message Relations""" + nodes: [SalesforceEmailMessageRelation!]! + + """List of Email Message Relation edges""" + edges: [SalesforceEmailMessageRelationEdge!]! +} + +""" +A filter to be used against Task object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceTaskConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Task's recurrenceActivity relation.""" + recurrenceActivity: SalesforceTaskConnectionFilter + + """Filter by the Task's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Task's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Task's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the Task's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the Task's id field""" + id: SalesforceIdFilter + + """Filter by the Task's whoId field""" + whoId: SalesforceIdFilter + + """Filter by the Task's whatId field""" + whatId: SalesforceIdFilter + + """Filter by the Task's activityDate field""" + activityDate: SalesforceDateFilter + + """Filter by the Task's status field""" + status: SalesforceStringFilter + + """Filter by the Task's priority field""" + priority: SalesforceStringFilter + + """Filter by the Task's isHighPriority field""" + isHighPriority: SalesforceBooleanFilter + + """Filter by the Task's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Task's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Task's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the Task's isClosed field""" + isClosed: SalesforceBooleanFilter + + """Filter by the Task's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Task's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Task's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Task's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Task's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Task's isArchived field""" + isArchived: SalesforceBooleanFilter + + """Filter by the Task's callDurationInSeconds field""" + callDurationInSeconds: SalesforceIntFilter + + """Filter by the Task's callType field""" + callType: SalesforceStringFilter + + """Filter by the Task's callDisposition field""" + callDisposition: SalesforceStringFilter + + """Filter by the Task's callObject field""" + callObject: SalesforceStringFilter + + """Filter by the Task's reminderDateTime field""" + reminderDateTime: SalesforceDateTimeFilter + + """Filter by the Task's isReminderSet field""" + isReminderSet: SalesforceBooleanFilter + + """Filter by the Task's recurrenceActivityId field""" + recurrenceActivityId: SalesforceIdFilter + + """Filter by the Task's isRecurrence field""" + isRecurrence: SalesforceBooleanFilter + + """Filter by the Task's recurrenceStartDateOnly field""" + recurrenceStartDateOnly: SalesforceDateFilter + + """Filter by the Task's recurrenceEndDateOnly field""" + recurrenceEndDateOnly: SalesforceDateFilter + + """Filter by the Task's recurrenceTimeZoneSidKey field""" + recurrenceTimeZoneSidKey: SalesforceStringFilter + + """Filter by the Task's recurrenceType field""" + recurrenceType: SalesforceStringFilter + + """Filter by the Task's recurrenceInterval field""" + recurrenceInterval: SalesforceIntFilter + + """Filter by the Task's recurrenceDayOfWeekMask field""" + recurrenceDayOfWeekMask: SalesforceIntFilter + + """Filter by the Task's recurrenceDayOfMonth field""" + recurrenceDayOfMonth: SalesforceIntFilter + + """Filter by the Task's recurrenceInstance field""" + recurrenceInstance: SalesforceStringFilter + + """Filter by the Task's recurrenceMonthOfYear field""" + recurrenceMonthOfYear: SalesforceStringFilter + + """Filter by the Task's recurrenceRegeneratedType field""" + recurrenceRegeneratedType: SalesforceStringFilter + + """Filter by the Task's taskSubtype field""" + taskSubtype: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceTaskConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceTaskConnectionFilter!] +} + +""" +A filter to be used against EmailMessage object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEmailMessageConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the EmailMessage's replyToEmailMessage relation.""" + replyToEmailMessage: SalesforceEmailMessageConnectionFilter + + """Filter by the EmailMessage's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the EmailMessage's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the EmailMessage's activity relation.""" + activity: SalesforceTaskConnectionFilter + + """Filter by the EmailMessage's parent relation.""" + parent: SalesforceCaseConnectionFilter + + """Filter by the EmailMessage's id field""" + id: SalesforceIdFilter + + """Filter by the EmailMessage's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the EmailMessage's activityId field""" + activityId: SalesforceIdFilter + + """Filter by the EmailMessage's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the EmailMessage's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the EmailMessage's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the EmailMessage's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the EmailMessage's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the EmailMessage's subject field""" + subject: SalesforceStringFilter + + """Filter by the EmailMessage's fromName field""" + fromName: SalesforceStringFilter + + """Filter by the EmailMessage's fromAddress field""" + fromAddress: SalesforceStringFilter + + """Filter by the EmailMessage's validatedFromAddress field""" + validatedFromAddress: SalesforceStringFilter + + """Filter by the EmailMessage's toAddress field""" + toAddress: SalesforceStringFilter + + """Filter by the EmailMessage's ccAddress field""" + ccAddress: SalesforceStringFilter + + """Filter by the EmailMessage's bccAddress field""" + bccAddress: SalesforceStringFilter + + """Filter by the EmailMessage's incoming field""" + incoming: SalesforceBooleanFilter + + """Filter by the EmailMessage's hasAttachment field""" + hasAttachment: SalesforceBooleanFilter + + """Filter by the EmailMessage's status field""" + status: SalesforceStringFilter + + """Filter by the EmailMessage's messageDate field""" + messageDate: SalesforceDateTimeFilter + + """Filter by the EmailMessage's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the EmailMessage's replyToEmailMessageId field""" + replyToEmailMessageId: SalesforceIdFilter + + """Filter by the EmailMessage's isExternallyVisible field""" + isExternallyVisible: SalesforceBooleanFilter + + """Filter by the EmailMessage's messageIdentifier field""" + messageIdentifier: SalesforceStringFilter + + """Filter by the EmailMessage's threadIdentifier field""" + threadIdentifier: SalesforceStringFilter + + """Filter by the EmailMessage's isClientManaged field""" + isClientManaged: SalesforceBooleanFilter + + """Filter by the EmailMessage's relatedToId field""" + relatedToId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEmailMessageConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEmailMessageConnectionFilter!] +} + +"""Field that Email Messages can be sorted by""" +enum SalesforceEmailMessageSortByFieldEnum { + ID + PARENT_ID + ACTIVITY_ID + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + SUBJECT + FROM_NAME + FROM_ADDRESS + VALIDATED_FROM_ADDRESS + TO_ADDRESS + CC_ADDRESS + BCC_ADDRESS + INCOMING + HAS_ATTACHMENT + STATUS + MESSAGE_DATE + IS_DELETED + REPLY_TO_EMAIL_MESSAGE_ID + IS_EXTERNALLY_VISIBLE + MESSAGE_IDENTIFIER + THREAD_IDENTIFIER + IS_CLIENT_MANAGED + RELATED_TO_ID +} + +"""An edge in a connection.""" +type SalesforceContentDistributionEdge { + """The item at the end of the edge.""" + node: SalesforceContentDistribution! + + """A cursor for use in pagination""" + cursor: String! +} + +"""An edge in a connection.""" +type SalesforceContentDistributionViewEdge { + """The item at the end of the edge.""" + node: SalesforceContentDistributionView! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against ContentDistributionView object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentDistributionViewConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentDistributionView's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentDistributionView's parentView relation.""" + parentView: SalesforceContentDistributionViewConnectionFilter + + """Filter by the ContentDistributionView's distribution relation.""" + distribution: SalesforceContentDistributionConnectionFilter + + """Filter by the ContentDistributionView's id field""" + id: SalesforceIdFilter + + """Filter by the ContentDistributionView's distributionId field""" + distributionId: SalesforceIdFilter + + """Filter by the ContentDistributionView's parentViewId field""" + parentViewId: SalesforceIdFilter + + """Filter by the ContentDistributionView's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentDistributionView's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentDistributionView's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentDistributionView's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentDistributionView's isInternal field""" + isInternal: SalesforceBooleanFilter + + """Filter by the ContentDistributionView's isDownload field""" + isDownload: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentDistributionViewConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentDistributionViewConnectionFilter!] +} + +"""Field that Content Delivery Views can be sorted by""" +enum SalesforceContentDistributionViewSortByFieldEnum { + ID + DISTRIBUTION_ID + PARENT_VIEW_ID + CREATED_DATE + CREATED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED + IS_INTERNAL + IS_DOWNLOAD +} + +"""Content Delivery View""" +type SalesforceContentDistributionView implements OneGraphNode { + """Content Delivery View ID""" + id: String! + + """Content Delivery ID""" + distributionId: String! + + """Content Delivery ID""" + distribution: SalesforceContentDistribution! + + """Content Delivery View ID""" + parentViewId: String + + """Content Delivery View ID""" + parentView: SalesforceContentDistributionView + + """View Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Internal View""" + isInternal: Boolean! + + """File Downloaded""" + isDownload: Boolean! + + """Collection of Salesforce ContentDistributionView""" + contentDistributionViews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionViewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionViewSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionViewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributionViews to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionViewsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Content Delivery Views connection, for use in pagination.""" +type SalesforceContentDistributionViewsConnection { + """ + The count of all Content Delivery View you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Delivery Views""" + nodes: [SalesforceContentDistributionView!]! + + """List of Content Delivery View edges""" + edges: [SalesforceContentDistributionViewEdge!]! +} + +union SalesforceOutgoingEmailWhoUnion = SalesforceLead | SalesforceContact + +union SalesforceOutgoingEmailRelatedToUnion = SalesforceSolution | SalesforceProduct2 | SalesforceOrder | SalesforceOpportunity | SalesforceContract | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +"""Outgoing Email""" +type SalesforceOutgoingEmail { + """Outgoing Email ID""" + id: String! + + """External ID""" + externalId: String + + """From""" + validatedFromAddress: String + + """To""" + toAddress: String + + """CC""" + ccAddress: String + + """BCC""" + bccAddress: String + + """Subject""" + subject: String + + """Text Body""" + textBody: String + + """HTML Body""" + htmlBody: String + + """Related To ID""" + relatedToId: String + + """Related To ID""" + relatedTo: SalesforceOutgoingEmailRelatedToUnion + + """Name ID""" + whoId: String + + """Name ID""" + who: SalesforceOutgoingEmailWhoUnion + + """Email Template ID""" + emailTemplateId: String + + """Email Template ID""" + emailTemplate: SalesforceEmailTemplate + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! +} + +union SalesforceContentVersionFirstPublishLocationUnion = SalesforceUser | SalesforceTopic | SalesforceTask | SalesforceSolution | SalesforceSite | SalesforceReport | SalesforceProduct2 | SalesforceOutgoingEmail | SalesforceOrganization | SalesforceOrderItem | SalesforceOrder | SalesforceOpportunity | SalesforceListEmail | SalesforceLead | SalesforceEvent | SalesforceEmailTemplate | SalesforceEmailMessage | SalesforceDashboardComponent | SalesforceDashboard | SalesforceContract | SalesforceContentWorkspace | SalesforceContact | SalesforceCollaborationGroup | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +union SalesforceFeedCommentParentUnion = SalesforceUser | SalesforceTopic | SalesforceTask | SalesforceSolution | SalesforceSite | SalesforceReport | SalesforceProduct2 | SalesforceOrderItem | SalesforceOrder | SalesforceOpportunity | SalesforceLead | SalesforceEvent | SalesforceDashboardComponent | SalesforceDashboard | SalesforceContract | SalesforceContentDocument | SalesforceContact | SalesforceCollaborationGroup | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +"""An edge in a connection.""" +type SalesforceCollaborationInvitationEdge { + """The item at the end of the edge.""" + node: SalesforceCollaborationInvitation! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against CollaborationInvitation object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCollaborationInvitationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CollaborationInvitation's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationInvitation's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationInvitation's inviter relation.""" + inviter: SalesforceUserConnectionFilter + + """Filter by the CollaborationInvitation's parent relation.""" + parent: SalesforceCollaborationInvitationConnectionFilter + + """Filter by the CollaborationInvitation's id field""" + id: SalesforceIdFilter + + """Filter by the CollaborationInvitation's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the CollaborationInvitation's sharedEntityId field""" + sharedEntityId: SalesforceIdFilter + + """Filter by the CollaborationInvitation's inviterId field""" + inviterId: SalesforceIdFilter + + """Filter by the CollaborationInvitation's invitedUserEmail field""" + invitedUserEmail: SalesforceStringFilter + + """ + Filter by the CollaborationInvitation's invitedUserEmailNormalized field + """ + invitedUserEmailNormalized: SalesforceStringFilter + + """Filter by the CollaborationInvitation's status field""" + status: SalesforceStringFilter + + """Filter by the CollaborationInvitation's optionalMessage field""" + optionalMessage: SalesforceStringFilter + + """Filter by the CollaborationInvitation's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CollaborationInvitation's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CollaborationInvitation's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CollaborationInvitation's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CollaborationInvitation's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCollaborationInvitationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCollaborationInvitationConnectionFilter!] +} + +"""Field that Chatter Invitations can be sorted by""" +enum SalesforceCollaborationInvitationSortByFieldEnum { + ID + PARENT_ID + SHARED_ENTITY_ID + INVITER_ID + INVITED_USER_EMAIL + INVITED_USER_EMAIL_NORMALIZED + STATUS + OPTIONAL_MESSAGE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +union SalesforceCollaborationInvitationSharedEntityUnion = SalesforceUser | SalesforceCollaborationGroup + +"""Chatter Invitation""" +type SalesforceCollaborationInvitation implements OneGraphNode { + """Chatter Invitation Id""" + id: String! + + """Parent ID""" + parentId: String + + """Parent ID""" + parent: SalesforceCollaborationInvitation + + """Shared Entity ID""" + sharedEntityId: String! + + """Shared Entity ID""" + sharedEntity: SalesforceCollaborationInvitationSharedEntityUnion! + + """Inviter User ID""" + inviterId: String! + + """Inviter User ID""" + inviter: SalesforceUser! + + """Invited Email""" + invitedUserEmail: String! + + """Invited Email (Normalized)""" + invitedUserEmailNormalized: String! + + """Invitation Status""" + status: String! + + """Optional Message""" + optionalMessage: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce CollaborationInvitation""" + collaborationInvitations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationInvitationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationInvitationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationInvitationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationInvitations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationInvitationsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Chatter Invitations connection, for use in pagination.""" +type SalesforceCollaborationInvitationsConnection { + """The count of all Chatter Invitation you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Chatter Invitations""" + nodes: [SalesforceCollaborationInvitation!]! + + """List of Chatter Invitation edges""" + edges: [SalesforceCollaborationInvitationEdge!]! +} + +""" +A filter to be used against CollaborationGroupRecord object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCollaborationGroupRecordConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CollaborationGroupRecord's collaborationGroup relation.""" + collaborationGroup: SalesforceCollaborationGroupConnectionFilter + + """Filter by the CollaborationGroupRecord's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroupRecord's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroupRecord's id field""" + id: SalesforceIdFilter + + """Filter by the CollaborationGroupRecord's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CollaborationGroupRecord's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroupRecord's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CollaborationGroupRecord's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroupRecord's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CollaborationGroupRecord's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CollaborationGroupRecord's collaborationGroupId field""" + collaborationGroupId: SalesforceIdFilter + + """Filter by the CollaborationGroupRecord's recordId field""" + recordId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCollaborationGroupRecordConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCollaborationGroupRecordConnectionFilter!] +} + +"""Field that Group Records can be sorted by""" +enum SalesforceCollaborationGroupRecordSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + COLLABORATION_GROUP_ID + RECORD_ID +} + +"""An edge in a connection.""" +type SalesforceCollaborationGroupRecordEdge { + """The item at the end of the edge.""" + node: SalesforceCollaborationGroupRecord! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceCollaborationGroupRecordRecordUnion = SalesforceOpportunity | SalesforceLead | SalesforceContract | SalesforceContact | SalesforceCase | SalesforceCampaign | SalesforceAccount + +"""Group Record""" +type SalesforceCollaborationGroupRecord implements OneGraphNode { + """Group Record ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Chatter Group ID""" + collaborationGroupId: String! + + """Chatter Group ID""" + collaborationGroup: SalesforceCollaborationGroup! + + """Record ID""" + recordId: String! + + """Record ID""" + record: SalesforceCollaborationGroupRecordRecordUnion! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Group Records connection, for use in pagination.""" +type SalesforceCollaborationGroupRecordsConnection { + """The count of all Group Record you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Group Records""" + nodes: [SalesforceCollaborationGroupRecord!]! + + """List of Group Record edges""" + edges: [SalesforceCollaborationGroupRecordEdge!]! +} + +""" +A filter to be used against CollaborationGroupMemberRequest object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCollaborationGroupMemberRequestConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """ + Filter by the CollaborationGroupMemberRequest's lastModifiedBy relation. + """ + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroupMemberRequest's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroupMemberRequest's requester relation.""" + requester: SalesforceUserConnectionFilter + + """ + Filter by the CollaborationGroupMemberRequest's collaborationGroup relation. + """ + collaborationGroup: SalesforceCollaborationGroupConnectionFilter + + """Filter by the CollaborationGroupMemberRequest's id field""" + id: SalesforceIdFilter + + """ + Filter by the CollaborationGroupMemberRequest's collaborationGroupId field + """ + collaborationGroupId: SalesforceIdFilter + + """Filter by the CollaborationGroupMemberRequest's requesterId field""" + requesterId: SalesforceIdFilter + + """Filter by the CollaborationGroupMemberRequest's responseMessage field""" + responseMessage: SalesforceStringFilter + + """Filter by the CollaborationGroupMemberRequest's status field""" + status: SalesforceStringFilter + + """Filter by the CollaborationGroupMemberRequest's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroupMemberRequest's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CollaborationGroupMemberRequest's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroupMemberRequest's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CollaborationGroupMemberRequest's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCollaborationGroupMemberRequestConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCollaborationGroupMemberRequestConnectionFilter!] +} + +"""Field that Group Member Requests can be sorted by""" +enum SalesforceCollaborationGroupMemberRequestSortByFieldEnum { + ID + COLLABORATION_GROUP_ID + REQUESTER_ID + RESPONSE_MESSAGE + STATUS + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceCollaborationGroupMemberRequestEdge { + """The item at the end of the edge.""" + node: SalesforceCollaborationGroupMemberRequest! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Group Member Request""" +type SalesforceCollaborationGroupMemberRequest implements OneGraphNode { + """Group Member Request Id""" + id: String! + + """CollaborationGroup ID""" + collaborationGroupId: String! + + """CollaborationGroup ID""" + collaborationGroup: SalesforceCollaborationGroup! + + """User ID""" + requesterId: String! + + """User ID""" + requester: SalesforceUser! + + """Response Message""" + responseMessage: String + + """Status""" + status: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Group Member Requests connection, for use in pagination.""" +type SalesforceCollaborationGroupMemberRequestsConnection { + """ + The count of all Group Member Request you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Group Member Requests""" + nodes: [SalesforceCollaborationGroupMemberRequest!]! + + """List of Group Member Request edges""" + edges: [SalesforceCollaborationGroupMemberRequestEdge!]! +} + +""" +A filter to be used against CollaborationGroupMember object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCollaborationGroupMemberConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CollaborationGroupMember's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroupMember's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroupMember's member relation.""" + member: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroupMember's collaborationGroup relation.""" + collaborationGroup: SalesforceCollaborationGroupConnectionFilter + + """Filter by the CollaborationGroupMember's id field""" + id: SalesforceIdFilter + + """Filter by the CollaborationGroupMember's collaborationGroupId field""" + collaborationGroupId: SalesforceIdFilter + + """Filter by the CollaborationGroupMember's memberId field""" + memberId: SalesforceIdFilter + + """Filter by the CollaborationGroupMember's collaborationRole field""" + collaborationRole: SalesforceStringFilter + + """Filter by the CollaborationGroupMember's notificationFrequency field""" + notificationFrequency: SalesforceStringFilter + + """Filter by the CollaborationGroupMember's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroupMember's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CollaborationGroupMember's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroupMember's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CollaborationGroupMember's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CollaborationGroupMember's lastFeedAccessDate field""" + lastFeedAccessDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCollaborationGroupMemberConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCollaborationGroupMemberConnectionFilter!] +} + +"""Field that Group Members can be sorted by""" +enum SalesforceCollaborationGroupMemberSortByFieldEnum { + ID + COLLABORATION_GROUP_ID + MEMBER_ID + COLLABORATION_ROLE + NOTIFICATION_FREQUENCY + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_FEED_ACCESS_DATE +} + +"""An edge in a connection.""" +type SalesforceCollaborationGroupMemberEdge { + """The item at the end of the edge.""" + node: SalesforceCollaborationGroupMember! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Group Member""" +type SalesforceCollaborationGroupMember implements OneGraphNode { + """Group Member Id""" + id: String! + + """CollaborationGroup ID""" + collaborationGroupId: String! + + """CollaborationGroup ID""" + collaborationGroup: SalesforceCollaborationGroup! + + """Member ID""" + memberId: String! + + """Member ID""" + member: SalesforceUser! + + """Group Member Role""" + collaborationRole: String + + """Notification Frequency""" + notificationFrequency: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Feed Access Date""" + lastFeedAccessDate: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Group Members connection, for use in pagination.""" +type SalesforceCollaborationGroupMembersConnection { + """The count of all Group Member you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Group Members""" + nodes: [SalesforceCollaborationGroupMember!]! + + """List of Group Member edges""" + edges: [SalesforceCollaborationGroupMemberEdge!]! +} + +""" +A filter to be used against CollaborationGroupFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCollaborationGroupFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CollaborationGroupFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroupFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the CollaborationGroupFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroupFeed's parent relation.""" + parent: SalesforceCollaborationGroupConnectionFilter + + """Filter by the CollaborationGroupFeed's id field""" + id: SalesforceIdFilter + + """Filter by the CollaborationGroupFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the CollaborationGroupFeed's type field""" + type: SalesforceStringFilter + + """Filter by the CollaborationGroupFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CollaborationGroupFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroupFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CollaborationGroupFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroupFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CollaborationGroupFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the CollaborationGroupFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the CollaborationGroupFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCollaborationGroupFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCollaborationGroupFeedConnectionFilter!] +} + +"""Field that Group Feeds can be sorted by""" +enum SalesforceCollaborationGroupFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceCollaborationGroupFeedEdge { + """The item at the end of the edge.""" + node: SalesforceCollaborationGroupFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Group Feed""" +type SalesforceCollaborationGroupFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceCollaborationGroup! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Group Feeds connection, for use in pagination.""" +type SalesforceCollaborationGroupFeedsConnection { + """The count of all Group Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Group Feeds""" + nodes: [SalesforceCollaborationGroupFeed!]! + + """List of Group Feed edges""" + edges: [SalesforceCollaborationGroupFeedEdge!]! +} + +"""Field that Announcements can be sorted by""" +enum SalesforceAnnouncementSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + FEED_ITEM_ID + EXPIRATION_DATE + SEND_EMAILS + IS_ARCHIVED + PARENT_ID +} + +"""An edge in a connection.""" +type SalesforceAnnouncementEdge { + """The item at the end of the edge.""" + node: SalesforceAnnouncement! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Announcements connection, for use in pagination.""" +type SalesforceAnnouncementsConnection { + """The count of all Announcement you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Announcements""" + nodes: [SalesforceAnnouncement!]! + + """List of Announcement edges""" + edges: [SalesforceAnnouncementEdge!]! +} + +""" +A filter to be used against Announcement object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAnnouncementConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Announcement's parent relation.""" + parent: SalesforceCollaborationGroupConnectionFilter + + """Filter by the Announcement's feedItem relation.""" + feedItem: SalesforceFeedItemConnectionFilter + + """Filter by the Announcement's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Announcement's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Announcement's id field""" + id: SalesforceIdFilter + + """Filter by the Announcement's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Announcement's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Announcement's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Announcement's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Announcement's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Announcement's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Announcement's feedItemId field""" + feedItemId: SalesforceIdFilter + + """Filter by the Announcement's expirationDate field""" + expirationDate: SalesforceDateTimeFilter + + """Filter by the Announcement's sendEmails field""" + sendEmails: SalesforceBooleanFilter + + """Filter by the Announcement's isArchived field""" + isArchived: SalesforceBooleanFilter + + """Filter by the Announcement's parentId field""" + parentId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAnnouncementConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAnnouncementConnectionFilter!] +} + +""" +A filter to be used against CollaborationGroup object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCollaborationGroupConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CollaborationGroup's announcement relation.""" + announcement: SalesforceAnnouncementConnectionFilter + + """Filter by the CollaborationGroup's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroup's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroup's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the CollaborationGroup's id field""" + id: SalesforceIdFilter + + """Filter by the CollaborationGroup's name field""" + name: SalesforceStringFilter + + """Filter by the CollaborationGroup's memberCount field""" + memberCount: SalesforceIntFilter + + """Filter by the CollaborationGroup's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the CollaborationGroup's collaborationType field""" + collaborationType: SalesforceStringFilter + + """Filter by the CollaborationGroup's description field""" + description: SalesforceStringFilter + + """Filter by the CollaborationGroup's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroup's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CollaborationGroup's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroup's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CollaborationGroup's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CollaborationGroup's fullPhotoUrl field""" + fullPhotoUrl: SalesforceStringFilter + + """Filter by the CollaborationGroup's mediumPhotoUrl field""" + mediumPhotoUrl: SalesforceStringFilter + + """Filter by the CollaborationGroup's smallPhotoUrl field""" + smallPhotoUrl: SalesforceStringFilter + + """Filter by the CollaborationGroup's lastFeedModifiedDate field""" + lastFeedModifiedDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroup's informationTitle field""" + informationTitle: SalesforceStringFilter + + """Filter by the CollaborationGroup's hasPrivateFieldsAccess field""" + hasPrivateFieldsAccess: SalesforceBooleanFilter + + """Filter by the CollaborationGroup's canHaveGuests field""" + canHaveGuests: SalesforceBooleanFilter + + """Filter by the CollaborationGroup's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroup's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the CollaborationGroup's isArchived field""" + isArchived: SalesforceBooleanFilter + + """Filter by the CollaborationGroup's isAutoArchiveDisabled field""" + isAutoArchiveDisabled: SalesforceBooleanFilter + + """Filter by the CollaborationGroup's announcementId field""" + announcementId: SalesforceIdFilter + + """Filter by the CollaborationGroup's bannerPhotoUrl field""" + bannerPhotoUrl: SalesforceStringFilter + + """Filter by the CollaborationGroup's isBroadcast field""" + isBroadcast: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCollaborationGroupConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCollaborationGroupConnectionFilter!] +} + +"""Field that Groups can be sorted by""" +enum SalesforceCollaborationGroupSortByFieldEnum { + ID + NAME + MEMBER_COUNT + OWNER_ID + COLLABORATION_TYPE + DESCRIPTION + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + FULL_PHOTO_URL + MEDIUM_PHOTO_URL + SMALL_PHOTO_URL + LAST_FEED_MODIFIED_DATE + INFORMATION_TITLE + HAS_PRIVATE_FIELDS_ACCESS + CAN_HAVE_GUESTS + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + IS_ARCHIVED + IS_AUTO_ARCHIVE_DISABLED + ANNOUNCEMENT_ID + GROUP_EMAIL + BANNER_PHOTO_URL + IS_BROADCAST +} + +"""An edge in a connection.""" +type SalesforceCollaborationGroupEdge { + """The item at the end of the edge.""" + node: SalesforceCollaborationGroup! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Groups connection, for use in pagination.""" +type SalesforceCollaborationGroupsConnection { + """The count of all Group you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Groups""" + nodes: [SalesforceCollaborationGroup!]! + + """List of Group edges""" + edges: [SalesforceCollaborationGroupEdge!]! +} + +"""Announcement""" +type SalesforceAnnouncement implements OneGraphNode { + """Announcement ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Feed Item ID""" + feedItemId: String! + + """Feed Item ID""" + feedItem: SalesforceFeedItem! + + """Expiration Date""" + expirationDate: String! + + """Send Emails on Announcement""" + sendEmails: Boolean! + + """Is Announcement Archived""" + isArchived: Boolean! + + """Parent ID""" + parentId: String + + """Parent ID""" + parent: SalesforceCollaborationGroup + + """Collection of Salesforce CollaborationGroup""" + collaborationGroups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CollaborationGroups to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCollaborationGroupsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Group""" +type SalesforceCollaborationGroup implements OneGraphNode { + """Group Id""" + id: String! + + """Name""" + name: String! + + """Member Count""" + memberCount: Int + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Access Type""" + collaborationType: String! + + """Description""" + description: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Url for full-sized Photo""" + fullPhotoUrl: String + + """Url for medium profile photo""" + mediumPhotoUrl: String + + """Photo""" + smallPhotoUrl: String + + """Last Feed Modified Date""" + lastFeedModifiedDate: String! + + """Information Title""" + informationTitle: String + + """Information""" + informationBody: String + + """Has Private Fields Access""" + hasPrivateFieldsAccess: Boolean! + + """Allow customers""" + canHaveGuests: Boolean! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Archive""" + isArchived: Boolean! + + """Disable automatic archiving""" + isAutoArchiveDisabled: Boolean! + + """Announcement ID""" + announcementId: String + + """Announcement ID""" + announcement: SalesforceAnnouncement + + """Group Email""" + groupEmail: String + + """Banner Photo Url""" + bannerPhotoUrl: String + + """Broadcast Only""" + isBroadcast: Boolean! + + """Collection of Salesforce Announcement""" + announcements( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAnnouncementConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAnnouncementSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAnnouncementSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Announcements to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAnnouncementsConnection + + """Collection of Salesforce CollaborationGroupFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupFeedsConnection + + """Collection of Salesforce CollaborationGroupMember""" + groupMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupMembersConnection + + """Collection of Salesforce CollaborationGroupMemberRequest""" + groupMemberRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupMemberRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupMemberRequestSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupMemberRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupMemberRequests to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupMemberRequestsConnection + + """Collection of Salesforce CollaborationGroupRecord""" + collaborationGroupRecords( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupRecords to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupRecordsConnection + + """Collection of Salesforce CollaborationInvitation""" + collaborationInvitations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationInvitationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationInvitationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationInvitationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationInvitations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationInvitationsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceCombinedAttachmentParentUnion = SalesforceUser | SalesforceTask | SalesforceSolution | SalesforceSite | SalesforceReport | SalesforceProduct2 | SalesforceOrganization | SalesforceOrderItem | SalesforceOrder | SalesforceOpportunity | SalesforceListEmail | SalesforceLead | SalesforceEvent | SalesforceEmailTemplate | SalesforceEmailMessage | SalesforceDashboardComponent | SalesforceDashboard | SalesforceContract | SalesforceContentWorkspace | SalesforceContact | SalesforceCollaborationGroup | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +""" +A filter to be used against Document object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDocumentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Document's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Document's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Document's author relation.""" + author: SalesforceUserConnectionFilter + + """Filter by the Document's id field""" + id: SalesforceIdFilter + + """Filter by the Document's folderId field""" + folderId: SalesforceIdFilter + + """Filter by the Document's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Document's name field""" + name: SalesforceStringFilter + + """Filter by the Document's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the Document's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the Document's contentType field""" + contentType: SalesforceStringFilter + + """Filter by the Document's type field""" + type: SalesforceStringFilter + + """Filter by the Document's isPublic field""" + isPublic: SalesforceBooleanFilter + + """Filter by the Document's bodyLength field""" + bodyLength: SalesforceIntFilter + + """Filter by the Document's url field""" + url: SalesforceStringFilter + + """Filter by the Document's description field""" + description: SalesforceStringFilter + + """Filter by the Document's keywords field""" + keywords: SalesforceStringFilter + + """Filter by the Document's isInternalUseOnly field""" + isInternalUseOnly: SalesforceBooleanFilter + + """Filter by the Document's authorId field""" + authorId: SalesforceIdFilter + + """Filter by the Document's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Document's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Document's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Document's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Document's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Document's isBodySearchable field""" + isBodySearchable: SalesforceBooleanFilter + + """Filter by the Document's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Document's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDocumentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDocumentConnectionFilter!] +} + +""" +A filter to be used against DocumentAttachmentMap object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDocumentAttachmentMapConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DocumentAttachmentMap's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DocumentAttachmentMap's document relation.""" + document: SalesforceDocumentConnectionFilter + + """Filter by the DocumentAttachmentMap's parent relation.""" + parent: SalesforceEmailTemplateConnectionFilter + + """Filter by the DocumentAttachmentMap's id field""" + id: SalesforceIdFilter + + """Filter by the DocumentAttachmentMap's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the DocumentAttachmentMap's documentId field""" + documentId: SalesforceIdFilter + + """Filter by the DocumentAttachmentMap's documentSequence field""" + documentSequence: SalesforceIntFilter + + """Filter by the DocumentAttachmentMap's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DocumentAttachmentMap's createdById field""" + createdById: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDocumentAttachmentMapConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDocumentAttachmentMapConnectionFilter!] +} + +"""Field that Document Entity Maps can be sorted by""" +enum SalesforceDocumentAttachmentMapSortByFieldEnum { + ID + PARENT_ID + DOCUMENT_ID + DOCUMENT_SEQUENCE + CREATED_DATE + CREATED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceDocumentAttachmentMapEdge { + """The item at the end of the edge.""" + node: SalesforceDocumentAttachmentMap! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Document Entity Map""" +type SalesforceDocumentAttachmentMap implements OneGraphNode { + """Document Entity Map Id""" + id: String! + + """Entity ID""" + parentId: String! + + """Entity ID""" + parent: SalesforceEmailTemplate! + + """Document ID""" + documentId: String! + + """Document ID""" + document: SalesforceDocument! + + """Attachment Sequence""" + documentSequence: Int! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Document Entity Maps connection, for use in pagination.""" +type SalesforceDocumentAttachmentMapsConnection { + """ + The count of all Document Entity Map you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Document Entity Maps""" + nodes: [SalesforceDocumentAttachmentMap!]! + + """List of Document Entity Map edges""" + edges: [SalesforceDocumentAttachmentMapEdge!]! +} + +""" +A filter to be used against BrandTemplate object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceBrandTemplateConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the BrandTemplate's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the BrandTemplate's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the BrandTemplate's id field""" + id: SalesforceIdFilter + + """Filter by the BrandTemplate's name field""" + name: SalesforceStringFilter + + """Filter by the BrandTemplate's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the BrandTemplate's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the BrandTemplate's description field""" + description: SalesforceStringFilter + + """Filter by the BrandTemplate's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the BrandTemplate's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the BrandTemplate's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the BrandTemplate's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the BrandTemplate's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the BrandTemplate's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceBrandTemplateConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceBrandTemplateConnectionFilter!] +} + +""" +A filter to be used against EmailTemplate object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEmailTemplateConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the EmailTemplate's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the EmailTemplate's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the EmailTemplate's brandTemplate relation.""" + brandTemplate: SalesforceBrandTemplateConnectionFilter + + """Filter by the EmailTemplate's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the EmailTemplate's id field""" + id: SalesforceIdFilter + + """Filter by the EmailTemplate's name field""" + name: SalesforceStringFilter + + """Filter by the EmailTemplate's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the EmailTemplate's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the EmailTemplate's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the EmailTemplate's folderId field""" + folderId: SalesforceIdFilter + + """Filter by the EmailTemplate's brandTemplateId field""" + brandTemplateId: SalesforceIdFilter + + """Filter by the EmailTemplate's templateStyle field""" + templateStyle: SalesforceStringFilter + + """Filter by the EmailTemplate's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the EmailTemplate's templateType field""" + templateType: SalesforceStringFilter + + """Filter by the EmailTemplate's encoding field""" + encoding: SalesforceStringFilter + + """Filter by the EmailTemplate's description field""" + description: SalesforceStringFilter + + """Filter by the EmailTemplate's timesUsed field""" + timesUsed: SalesforceIntFilter + + """Filter by the EmailTemplate's lastUsedDate field""" + lastUsedDate: SalesforceDateTimeFilter + + """Filter by the EmailTemplate's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the EmailTemplate's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the EmailTemplate's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the EmailTemplate's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the EmailTemplate's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the EmailTemplate's apiVersion field""" + apiVersion: SalesforceFloatFilter + + """Filter by the EmailTemplate's uiType field""" + uiType: SalesforceStringFilter + + """Filter by the EmailTemplate's relatedEntityType field""" + relatedEntityType: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEmailTemplateConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEmailTemplateConnectionFilter!] +} + +"""Field that Email Templates can be sorted by""" +enum SalesforceEmailTemplateSortByFieldEnum { + ID + NAME + DEVELOPER_NAME + NAMESPACE_PREFIX + OWNER_ID + FOLDER_ID + BRAND_TEMPLATE_ID + TEMPLATE_STYLE + IS_ACTIVE + TEMPLATE_TYPE + ENCODING + DESCRIPTION + SUBJECT + TIMES_USED + LAST_USED_DATE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + API_VERSION + UI_TYPE + RELATED_ENTITY_TYPE +} + +"""An edge in a connection.""" +type SalesforceEmailTemplateEdge { + """The item at the end of the edge.""" + node: SalesforceEmailTemplate! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Email Templates connection, for use in pagination.""" +type SalesforceEmailTemplatesConnection { + """The count of all Email Template you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Email Templates""" + nodes: [SalesforceEmailTemplate!]! + + """List of Email Template edges""" + edges: [SalesforceEmailTemplateEdge!]! +} + +"""Letterhead""" +type SalesforceBrandTemplate implements OneGraphNode { + """Letterhead ID""" + id: String! + + """Brand Template Name""" + name: String! + + """Letterhead Unique Name""" + developerName: String! + + """Active""" + isActive: Boolean! + + """Description""" + description: String + + """Value""" + value: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce EmailTemplate""" + emailTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailTemplateSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailTemplates to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailTemplatesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceEmailTemplateFolderUnion = SalesforceUser | SalesforceOrganization | SalesforceFolder + +"""Email Template""" +type SalesforceEmailTemplate implements OneGraphNode { + """Email Template ID""" + id: String! + + """Email Template Name""" + name: String! + + """Template Unique Name""" + developerName: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Folder ID""" + folderId: String! + + """Folder ID""" + folder: SalesforceEmailTemplateFolderUnion! + + """Letterhead ID""" + brandTemplateId: String + + """Letterhead ID""" + brandTemplate: SalesforceBrandTemplate + + """Style""" + templateStyle: String! + + """Available For Use""" + isActive: Boolean! + + """Template Type""" + templateType: String! + + """Encoding""" + encoding: String + + """Description""" + description: String + + """Subject""" + subject: String + + """HTML Value""" + htmlValue: String + + """Email Body""" + body: String + + """Times Used""" + timesUsed: Int + + """Last Used Date""" + lastUsedDate: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """API Version""" + apiVersion: Float + + """Markup""" + markup: String + + """UI Type""" + uiType: String + + """Custom Object Definition ID""" + relatedEntityType: String + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce DocumentAttachmentMap""" + documentAttachmentMaps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDocumentAttachmentMapConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDocumentAttachmentMapSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDocumentAttachmentMapSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DocumentAttachmentMaps to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDocumentAttachmentMapsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceAttachedContentDocumentLinkedEntityUnion = SalesforceUser | SalesforceTask | SalesforceSolution | SalesforceSite | SalesforceReport | SalesforceProduct2 | SalesforceOrganization | SalesforceOrderItem | SalesforceOrder | SalesforceOpportunity | SalesforceListEmail | SalesforceLead | SalesforceEvent | SalesforceEmailTemplate | SalesforceEmailMessage | SalesforceDashboardComponent | SalesforceDashboard | SalesforceContract | SalesforceContentWorkspace | SalesforceContact | SalesforceCollaborationGroup | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +"""An edge in a connection.""" +type SalesforceListEmailRecipientSourceEdge { + """The item at the end of the edge.""" + node: SalesforceListEmailRecipientSource! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Field that User List Views can be sorted by""" +enum SalesforceUserListViewSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + USER_ID + LIST_VIEW_ID + SOBJECT_TYPE + LAST_VIEWED_CHART +} + +"""An edge in a connection.""" +type SalesforceUserListViewEdge { + """The item at the end of the edge.""" + node: SalesforceUserListView! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against UserListView object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserListViewConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserListView's listView relation.""" + listView: SalesforceListViewConnectionFilter + + """Filter by the UserListView's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the UserListView's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserListView's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserListView's id field""" + id: SalesforceIdFilter + + """Filter by the UserListView's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UserListView's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserListView's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserListView's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserListView's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserListView's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserListView's userId field""" + userId: SalesforceIdFilter + + """Filter by the UserListView's listViewId field""" + listViewId: SalesforceIdFilter + + """Filter by the UserListView's sobjectType field""" + sobjectType: SalesforceStringFilter + + """Filter by the UserListView's lastViewedChart field""" + lastViewedChart: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserListViewConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserListViewConnectionFilter!] +} + +""" +A filter to be used against UserListViewCriterion object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserListViewCriterionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserListViewCriterion's userListView relation.""" + userListView: SalesforceUserListViewConnectionFilter + + """Filter by the UserListViewCriterion's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserListViewCriterion's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserListViewCriterion's id field""" + id: SalesforceIdFilter + + """Filter by the UserListViewCriterion's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UserListViewCriterion's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserListViewCriterion's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserListViewCriterion's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserListViewCriterion's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserListViewCriterion's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserListViewCriterion's userListViewId field""" + userListViewId: SalesforceIdFilter + + """Filter by the UserListViewCriterion's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the UserListViewCriterion's columnName field""" + columnName: SalesforceStringFilter + + """Filter by the UserListViewCriterion's operation field""" + operation: SalesforceStringFilter + + """Filter by the UserListViewCriterion's value field""" + value: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserListViewCriterionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserListViewCriterionConnectionFilter!] +} + +"""Field that User List View Criterias can be sorted by""" +enum SalesforceUserListViewCriterionSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + USER_LIST_VIEW_ID + SORT_ORDER + COLUMN_NAME + OPERATION + VALUE +} + +"""An edge in a connection.""" +type SalesforceUserListViewCriterionEdge { + """The item at the end of the edge.""" + node: SalesforceUserListViewCriterion! + + """A cursor for use in pagination""" + cursor: String! +} + +"""User List View Criteria""" +type SalesforceUserListViewCriterion implements OneGraphNode { + """User List View Criteria Id""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """User List View ID""" + userListViewId: String! + + """User List View ID""" + userListView: SalesforceUserListView! + + """Sort Order""" + sortOrder: Int! + + """Column Name""" + columnName: String! + + """Operation""" + operation: String! + + """Value""" + value: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce User List View Criterias connection, for use in pagination.""" +type SalesforceUserListViewCriterionsConnection { + """ + The count of all User List View Criteria you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User List View Criterias""" + nodes: [SalesforceUserListViewCriterion!]! + + """List of User List View Criteria edges""" + edges: [SalesforceUserListViewCriterionEdge!]! +} + +"""User List View""" +type SalesforceUserListView implements OneGraphNode { + """User List View Id""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """List View ID""" + listViewId: String! + + """List View ID""" + listView: SalesforceListView! + + """Custom Object Definition ID""" + sobjectType: String + + """List View Chart ID""" + lastViewedChart: String + + """Collection of Salesforce UserListViewCriterion""" + userListViewCriterions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserListViewCriterionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserListViewCriterionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserListViewCriterionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserListViewCriterions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserListViewCriterionsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce User List Views connection, for use in pagination.""" +type SalesforceUserListViewsConnection { + """The count of all User List View you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User List Views""" + nodes: [SalesforceUserListView!]! + + """List of User List View edges""" + edges: [SalesforceUserListViewEdge!]! +} + +""" +A filter to be used against ListView object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceListViewConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ListView's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ListView's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ListView's id field""" + id: SalesforceIdFilter + + """Filter by the ListView's name field""" + name: SalesforceStringFilter + + """Filter by the ListView's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the ListView's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the ListView's sobjectType field""" + sobjectType: SalesforceStringFilter + + """Filter by the ListView's isSoqlCompatible field""" + isSoqlCompatible: SalesforceBooleanFilter + + """Filter by the ListView's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ListView's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ListView's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ListView's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ListView's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ListView's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the ListView's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceListViewConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceListViewConnectionFilter!] +} + +""" +A filter to be used against ListEmail object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceListEmailConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ListEmail's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ListEmail's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ListEmail's id field""" + id: SalesforceIdFilter + + """Filter by the ListEmail's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the ListEmail's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ListEmail's name field""" + name: SalesforceStringFilter + + """Filter by the ListEmail's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ListEmail's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ListEmail's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ListEmail's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ListEmail's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ListEmail's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the ListEmail's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the ListEmail's subject field""" + subject: SalesforceStringFilter + + """Filter by the ListEmail's fromName field""" + fromName: SalesforceStringFilter + + """Filter by the ListEmail's fromAddress field""" + fromAddress: SalesforceStringFilter + + """Filter by the ListEmail's status field""" + status: SalesforceStringFilter + + """Filter by the ListEmail's hasAttachment field""" + hasAttachment: SalesforceBooleanFilter + + """Filter by the ListEmail's scheduledDate field""" + scheduledDate: SalesforceDateTimeFilter + + """Filter by the ListEmail's totalSent field""" + totalSent: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceListEmailConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceListEmailConnectionFilter!] +} + +""" +A filter to be used against ListEmailRecipientSource object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceListEmailRecipientSourceConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ListEmailRecipientSource's sourceList relation.""" + sourceList: SalesforceListViewConnectionFilter + + """Filter by the ListEmailRecipientSource's listEmail relation.""" + listEmail: SalesforceListEmailConnectionFilter + + """Filter by the ListEmailRecipientSource's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ListEmailRecipientSource's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ListEmailRecipientSource's id field""" + id: SalesforceIdFilter + + """Filter by the ListEmailRecipientSource's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ListEmailRecipientSource's name field""" + name: SalesforceStringFilter + + """Filter by the ListEmailRecipientSource's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ListEmailRecipientSource's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ListEmailRecipientSource's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ListEmailRecipientSource's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ListEmailRecipientSource's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ListEmailRecipientSource's listEmailId field""" + listEmailId: SalesforceIdFilter + + """Filter by the ListEmailRecipientSource's sourceListId field""" + sourceListId: SalesforceIdFilter + + """Filter by the ListEmailRecipientSource's sourceType field""" + sourceType: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceListEmailRecipientSourceConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceListEmailRecipientSourceConnectionFilter!] +} + +"""Field that List Email Recipient Sources can be sorted by""" +enum SalesforceListEmailRecipientSourceSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LIST_EMAIL_ID + SOURCE_LIST_ID + SOURCE_TYPE +} + +"""List View""" +type SalesforceListView implements OneGraphNode { + """List View ID""" + id: String! + + """View Name""" + name: String! + + """View Unique Name""" + developerName: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Custom Object Definition ID""" + sobjectType: String + + """Is SOQL Compatible""" + isSoqlCompatible: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Collection of Salesforce ListEmailRecipientSource""" + listEmailRecipientSources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListEmailRecipientSourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceListEmailRecipientSourceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListEmailRecipientSourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ListEmailRecipientSources to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceListEmailRecipientSourcesConnection + + """Collection of Salesforce UserListView""" + userListViews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserListViewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserListViewSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserListViewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserListViews to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserListViewsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""List Email Recipient Source""" +type SalesforceListEmailRecipientSource implements OneGraphNode { + """List Email Recipient Source ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """List Email ID""" + listEmailId: String! + + """List Email ID""" + listEmail: SalesforceListEmail! + + """SourceList ID""" + sourceListId: String! + + """SourceList ID""" + sourceList: SalesforceListView! + + """Type""" + sourceType: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce List Email Recipient Sources connection, for use in pagination. +""" +type SalesforceListEmailRecipientSourcesConnection { + """ + The count of all List Email Recipient Source you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce List Email Recipient Sources""" + nodes: [SalesforceListEmailRecipientSource!]! + + """List of List Email Recipient Source edges""" + edges: [SalesforceListEmailRecipientSourceEdge!]! +} + +""" +A filter to be used against ContentDistribution object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentDistributionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentDistribution's contentDocument relation.""" + contentDocument: SalesforceContentDocumentConnectionFilter + + """Filter by the ContentDistribution's contentVersion relation.""" + contentVersion: SalesforceContentVersionConnectionFilter + + """Filter by the ContentDistribution's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContentDistribution's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the ContentDistribution's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentDistribution's id field""" + id: SalesforceIdFilter + + """Filter by the ContentDistribution's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentDistribution's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentDistribution's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the ContentDistribution's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContentDistribution's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContentDistribution's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentDistribution's name field""" + name: SalesforceStringFilter + + """Filter by the ContentDistribution's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentDistribution's contentVersionId field""" + contentVersionId: SalesforceIdFilter + + """Filter by the ContentDistribution's contentDocumentId field""" + contentDocumentId: SalesforceIdFilter + + """Filter by the ContentDistribution's relatedRecordId field""" + relatedRecordId: SalesforceIdFilter + + """Filter by the ContentDistribution's preferencesAllowPdfDownload field""" + preferencesAllowPdfDownload: SalesforceBooleanFilter + + """ + Filter by the ContentDistribution's preferencesAllowOriginalDownload field + """ + preferencesAllowOriginalDownload: SalesforceBooleanFilter + + """Filter by the ContentDistribution's preferencesPasswordRequired field""" + preferencesPasswordRequired: SalesforceBooleanFilter + + """Filter by the ContentDistribution's preferencesNotifyOnVisit field""" + preferencesNotifyOnVisit: SalesforceBooleanFilter + + """Filter by the ContentDistribution's preferencesLinkLatestVersion field""" + preferencesLinkLatestVersion: SalesforceBooleanFilter + + """ + Filter by the ContentDistribution's preferencesAllowViewInBrowser field + """ + preferencesAllowViewInBrowser: SalesforceBooleanFilter + + """Filter by the ContentDistribution's preferencesExpires field""" + preferencesExpires: SalesforceBooleanFilter + + """ + Filter by the ContentDistribution's preferencesNotifyRndtnComplete field + """ + preferencesNotifyRndtnComplete: SalesforceBooleanFilter + + """Filter by the ContentDistribution's expiryDate field""" + expiryDate: SalesforceDateTimeFilter + + """Filter by the ContentDistribution's viewCount field""" + viewCount: SalesforceIntFilter + + """Filter by the ContentDistribution's firstViewDate field""" + firstViewDate: SalesforceDateTimeFilter + + """Filter by the ContentDistribution's lastViewDate field""" + lastViewDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentDistributionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentDistributionConnectionFilter!] +} + +"""Field that Content Deliveries can be sorted by""" +enum SalesforceContentDistributionSortByFieldEnum { + ID + CREATED_DATE + CREATED_BY_ID + OWNER_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + NAME + IS_DELETED + CONTENT_VERSION_ID + CONTENT_DOCUMENT_ID + RELATED_RECORD_ID + EXPIRY_DATE + PASSWORD + VIEW_COUNT + FIRST_VIEW_DATE + LAST_VIEW_DATE + DISTRIBUTION_PUBLIC_URL + CONTENT_DOWNLOAD_URL + PDF_DOWNLOAD_URL +} + +union SalesforceListEmailOwnerUnion = SalesforceUser | SalesforceGroup + +"""List Email""" +type SalesforceListEmail implements OneGraphNode { + """List Email ID""" + id: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceListEmailOwnerUnion! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Subject""" + subject: String + + """Html Body""" + htmlBody: String + + """Text Body""" + textBody: String + + """From Name""" + fromName: String + + """From Address""" + fromAddress: String! + + """Status""" + status: String! + + """Has Attachment""" + hasAttachment: Boolean! + + """Scheduled Date""" + scheduledDate: String + + """Total Sent""" + totalSent: Int + + """Collection of Salesforce ContentDistribution""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ListEmailRecipientSource""" + listEmailRecipientSources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListEmailRecipientSourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceListEmailRecipientSourceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListEmailRecipientSourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ListEmailRecipientSources to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceListEmailRecipientSourcesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceContentDistributionRelatedRecordUnion = SalesforceOpportunity | SalesforceListEmail | SalesforceLead | SalesforceEmailMessage | SalesforceContact | SalesforceCase | SalesforceCampaign | SalesforceAccount + +"""Content Delivery""" +type SalesforceContentDistribution implements OneGraphNode { + """Content Delivery ID""" + id: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Content Delivery Name""" + name: String! + + """Deleted""" + isDeleted: Boolean! + + """ContentVersion ID""" + contentVersionId: String! + + """ContentVersion ID""" + contentVersion: SalesforceContentVersion! + + """ContentDocument ID""" + contentDocumentId: String + + """ContentDocument ID""" + contentDocument: SalesforceContentDocument + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentDistributionRelatedRecordUnion + + """Allow Download as PDF""" + preferencesAllowPdfDownload: Boolean! + + """Allow Download in Original Format""" + preferencesAllowOriginalDownload: Boolean! + + """Require Password to Access Content""" + preferencesPasswordRequired: Boolean! + + """Notify Me of First View or Download""" + preferencesNotifyOnVisit: Boolean! + + """Content Delivery Opens Latest Version""" + preferencesLinkLatestVersion: Boolean! + + """Allow View in the Browser""" + preferencesAllowViewInBrowser: Boolean! + + """Content Delivery Expires""" + preferencesExpires: Boolean! + + """Email when Preview Images are Ready""" + preferencesNotifyRndtnComplete: Boolean! + + """Expiration Date""" + expiryDate: String + + """Password""" + password: String + + """View Count""" + viewCount: Int + + """First Viewed""" + firstViewDate: String + + """Last Viewed""" + lastViewDate: String + + """External Link""" + distributionPublicUrl: String + + """File Download Link""" + contentDownloadUrl: String + + """PDF Download Link""" + pdfDownloadUrl: String + + """Collection of Salesforce ContentDistributionView""" + contentDistributionViews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionViewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionViewSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionViewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributionViews to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionViewsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Content Deliveries connection, for use in pagination.""" +type SalesforceContentDistributionsConnection { + """The count of all Content Delivery you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Deliveries""" + nodes: [SalesforceContentDistribution!]! + + """List of Content Delivery edges""" + edges: [SalesforceContentDistributionEdge!]! +} + +union SalesforceEmailMessageRelatedToUnion = SalesforceSolution | SalesforceProduct2 | SalesforceOrder | SalesforceOpportunity | SalesforceContract | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +"""Email Message""" +type SalesforceEmailMessage implements OneGraphNode { + """Email Message ID""" + id: String! + + """Case ID""" + parentId: String + + """Case ID""" + parent: SalesforceCase + + """Activity ID""" + activityId: String + + """Activity ID""" + activity: SalesforceTask + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Text Body""" + textBody: String + + """HTML Body""" + htmlBody: String + + """Headers""" + headers: String + + """Subject""" + subject: String + + """From Name""" + fromName: String + + """From Address""" + fromAddress: String + + """From""" + validatedFromAddress: String + + """To Address""" + toAddress: String + + """CC Address""" + ccAddress: String + + """BCC Address""" + bccAddress: String + + """Is Incoming""" + incoming: Boolean! + + """Has Attachment""" + hasAttachment: Boolean! + + """Status""" + status: String! + + """Message Date""" + messageDate: String + + """Deleted""" + isDeleted: Boolean! + + """Email Message ID""" + replyToEmailMessageId: String + + """Email Message ID""" + replyToEmailMessage: SalesforceEmailMessage + + """Is Externally Visible""" + isExternallyVisible: Boolean! + + """Message ID""" + messageIdentifier: String + + """Thread ID""" + threadIdentifier: String + + """Is Client Managed""" + isClientManaged: Boolean! + + """Related To ID""" + relatedToId: String + + """Related To ID""" + relatedTo: SalesforceEmailMessageRelatedToUnion + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce ContentDistribution""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EmailMessage""" + emailMessages( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EmailMessageRelation""" + emailMessageRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of EmailMessageRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceEmailMessageRelationsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Email Messages connection, for use in pagination.""" +type SalesforceEmailMessagesConnection { + """The count of all Email Message you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Email Messages""" + nodes: [SalesforceEmailMessage!]! + + """List of Email Message edges""" + edges: [SalesforceEmailMessageEdge!]! +} + +""" +A filter to be used against Case object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCaseConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Case's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Case's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Case's parent relation.""" + parent: SalesforceCaseConnectionFilter + + """Filter by the Case's asset relation.""" + asset: SalesforceAssetConnectionFilter + + """Filter by the Case's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the Case's contact relation.""" + contact: SalesforceContactConnectionFilter + + """Filter by the Case's id field""" + id: SalesforceIdFilter + + """Filter by the Case's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Case's caseNumber field""" + caseNumber: SalesforceStringFilter + + """Filter by the Case's contactId field""" + contactId: SalesforceIdFilter + + """Filter by the Case's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the Case's assetId field""" + assetId: SalesforceIdFilter + + """Filter by the Case's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the Case's suppliedName field""" + suppliedName: SalesforceStringFilter + + """Filter by the Case's suppliedEmail field""" + suppliedEmail: SalesforceStringFilter + + """Filter by the Case's suppliedPhone field""" + suppliedPhone: SalesforceStringFilter + + """Filter by the Case's suppliedCompany field""" + suppliedCompany: SalesforceStringFilter + + """Filter by the Case's type field""" + type: SalesforceStringFilter + + """Filter by the Case's status field""" + status: SalesforceStringFilter + + """Filter by the Case's reason field""" + reason: SalesforceStringFilter + + """Filter by the Case's origin field""" + origin: SalesforceStringFilter + + """Filter by the Case's subject field""" + subject: SalesforceStringFilter + + """Filter by the Case's priority field""" + priority: SalesforceStringFilter + + """Filter by the Case's isClosed field""" + isClosed: SalesforceBooleanFilter + + """Filter by the Case's closedDate field""" + closedDate: SalesforceDateTimeFilter + + """Filter by the Case's isEscalated field""" + isEscalated: SalesforceBooleanFilter + + """Filter by the Case's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Case's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Case's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Case's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Case's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Case's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Case's contactPhone field""" + contactPhone: SalesforceStringFilter + + """Filter by the Case's contactMobile field""" + contactMobile: SalesforceStringFilter + + """Filter by the Case's contactEmail field""" + contactEmail: SalesforceStringFilter + + """Filter by the Case's contactFax field""" + contactFax: SalesforceStringFilter + + """Filter by the Case's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Case's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCaseConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCaseConnectionFilter!] +} + +"""Field that Cases can be sorted by""" +enum SalesforceCaseSortByFieldEnum { + ID + IS_DELETED + CASE_NUMBER + CONTACT_ID + ACCOUNT_ID + ASSET_ID + PARENT_ID + SUPPLIED_NAME + SUPPLIED_EMAIL + SUPPLIED_PHONE + SUPPLIED_COMPANY + TYPE + STATUS + REASON + ORIGIN + SUBJECT + PRIORITY + IS_CLOSED + CLOSED_DATE + IS_ESCALATED + OWNER_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + CONTACT_PHONE + CONTACT_MOBILE + CONTACT_EMAIL + CONTACT_FAX + LAST_VIEWED_DATE + LAST_REFERENCED_DATE +} + +"""An edge in a connection.""" +type SalesforceCaseEdge { + """The item at the end of the edge.""" + node: SalesforceCase! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Cases connection, for use in pagination.""" +type SalesforceCasesConnection { + """The count of all Case you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Cases""" + nodes: [SalesforceCase!]! + + """List of Case edges""" + edges: [SalesforceCaseEdge!]! +} + +""" +A filter to be used against AssetShare object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAssetShareConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AssetShare's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AssetShare's asset relation.""" + asset: SalesforceAssetConnectionFilter + + """Filter by the AssetShare's id field""" + id: SalesforceIdFilter + + """Filter by the AssetShare's assetId field""" + assetId: SalesforceIdFilter + + """Filter by the AssetShare's userOrGroupId field""" + userOrGroupId: SalesforceIdFilter + + """Filter by the AssetShare's assetAccessLevel field""" + assetAccessLevel: SalesforceStringFilter + + """Filter by the AssetShare's rowCause field""" + rowCause: SalesforceStringFilter + + """Filter by the AssetShare's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AssetShare's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AssetShare's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAssetShareConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAssetShareConnectionFilter!] +} + +"""Field that Asset Shares can be sorted by""" +enum SalesforceAssetShareSortByFieldEnum { + ID + ASSET_ID + USER_OR_GROUP_ID + ASSET_ACCESS_LEVEL + ROW_CAUSE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceAssetShareEdge { + """The item at the end of the edge.""" + node: SalesforceAssetShare! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceAssetShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Asset Share""" +type SalesforceAssetShare implements OneGraphNode { + """Asset Share ID""" + id: String! + + """Asset ID""" + assetId: String! + + """Asset ID""" + asset: SalesforceAsset! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceAssetShareUserOrGroupUnion! + + """Asset Access""" + assetAccessLevel: String! + + """Row Cause""" + rowCause: String + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Asset Shares connection, for use in pagination.""" +type SalesforceAssetSharesConnection { + """The count of all Asset Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Asset Shares""" + nodes: [SalesforceAssetShare!]! + + """List of Asset Share edges""" + edges: [SalesforceAssetShareEdge!]! +} + +""" +A filter to be used against AssetRelationship object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAssetRelationshipConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AssetRelationship's relatedAsset relation.""" + relatedAsset: SalesforceAssetConnectionFilter + + """Filter by the AssetRelationship's asset relation.""" + asset: SalesforceAssetConnectionFilter + + """Filter by the AssetRelationship's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AssetRelationship's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AssetRelationship's id field""" + id: SalesforceIdFilter + + """Filter by the AssetRelationship's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AssetRelationship's assetRelationshipNumber field""" + assetRelationshipNumber: SalesforceStringFilter + + """Filter by the AssetRelationship's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AssetRelationship's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AssetRelationship's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AssetRelationship's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AssetRelationship's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AssetRelationship's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the AssetRelationship's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the AssetRelationship's assetId field""" + assetId: SalesforceIdFilter + + """Filter by the AssetRelationship's relatedAssetId field""" + relatedAssetId: SalesforceIdFilter + + """Filter by the AssetRelationship's fromDate field""" + fromDate: SalesforceDateTimeFilter + + """Filter by the AssetRelationship's toDate field""" + toDate: SalesforceDateTimeFilter + + """Filter by the AssetRelationship's relationshipType field""" + relationshipType: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAssetRelationshipConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAssetRelationshipConnectionFilter!] +} + +"""Field that Asset Relationships can be sorted by""" +enum SalesforceAssetRelationshipSortByFieldEnum { + ID + IS_DELETED + ASSET_RELATIONSHIP_NUMBER + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + ASSET_ID + RELATED_ASSET_ID + FROM_DATE + TO_DATE + RELATIONSHIP_TYPE +} + +"""An edge in a connection.""" +type SalesforceAssetRelationshipEdge { + """The item at the end of the edge.""" + node: SalesforceAssetRelationship! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Asset Relationships connection, for use in pagination.""" +type SalesforceAssetRelationshipsConnection { + """The count of all Asset Relationship you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Asset Relationships""" + nodes: [SalesforceAssetRelationship!]! + + """List of Asset Relationship edges""" + edges: [SalesforceAssetRelationshipEdge!]! +} + +""" +A filter to be used against AssetHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAssetHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AssetHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AssetHistory's asset relation.""" + asset: SalesforceAssetConnectionFilter + + """Filter by the AssetHistory's id field""" + id: SalesforceIdFilter + + """Filter by the AssetHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AssetHistory's assetId field""" + assetId: SalesforceIdFilter + + """Filter by the AssetHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AssetHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AssetHistory's field field""" + field: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAssetHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAssetHistoryConnectionFilter!] +} + +"""Field that Asset Histories can be sorted by""" +enum SalesforceAssetHistorySortByFieldEnum { + ID + IS_DELETED + ASSET_ID + CREATED_BY_ID + CREATED_DATE + FIELD + OLD_VALUE + NEW_VALUE +} + +"""An edge in a connection.""" +type SalesforceAssetHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceAssetHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Asset History""" +type SalesforceAssetHistory implements OneGraphNode { + """Asset History ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Asset ID""" + assetId: String! + + """Asset ID""" + asset: SalesforceAsset! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Changed Field""" + field: String! + + """Old Value""" + oldValue: String + + """New Value""" + newValue: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Asset Histories connection, for use in pagination.""" +type SalesforceAssetHistorysConnection { + """The count of all Asset History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Asset Histories""" + nodes: [SalesforceAssetHistory!]! + + """List of Asset History edges""" + edges: [SalesforceAssetHistoryEdge!]! +} + +""" +A filter to be used against AssetFeed object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAssetFeedConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AssetFeed's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the AssetFeed's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the AssetFeed's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AssetFeed's parent relation.""" + parent: SalesforceAssetConnectionFilter + + """Filter by the AssetFeed's id field""" + id: SalesforceIdFilter + + """Filter by the AssetFeed's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the AssetFeed's type field""" + type: SalesforceStringFilter + + """Filter by the AssetFeed's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AssetFeed's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AssetFeed's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AssetFeed's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AssetFeed's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AssetFeed's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the AssetFeed's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the AssetFeed's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAssetFeedConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAssetFeedConnectionFilter!] +} + +"""Field that Asset Feeds can be sorted by""" +enum SalesforceAssetFeedSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceAssetFeedEdge { + """The item at the end of the edge.""" + node: SalesforceAssetFeed! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Asset Feed""" +type SalesforceAssetFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceAsset! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Asset Feeds connection, for use in pagination.""" +type SalesforceAssetFeedsConnection { + """The count of all Asset Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Asset Feeds""" + nodes: [SalesforceAssetFeed!]! + + """List of Asset Feed edges""" + edges: [SalesforceAssetFeedEdge!]! +} + +""" +A filter to be used against Asset object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAssetConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Asset's assetServicedBy relation.""" + assetServicedBy: SalesforceAccountConnectionFilter + + """Filter by the Asset's assetProvidedBy relation.""" + assetProvidedBy: SalesforceAccountConnectionFilter + + """Filter by the Asset's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the Asset's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Asset's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Asset's product2 relation.""" + product2: SalesforceProduct2ConnectionFilter + + """Filter by the Asset's rootAsset relation.""" + rootAsset: SalesforceAssetConnectionFilter + + """Filter by the Asset's parent relation.""" + parent: SalesforceAssetConnectionFilter + + """Filter by the Asset's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the Asset's contact relation.""" + contact: SalesforceContactConnectionFilter + + """Filter by the Asset's id field""" + id: SalesforceIdFilter + + """Filter by the Asset's contactId field""" + contactId: SalesforceIdFilter + + """Filter by the Asset's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the Asset's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the Asset's rootAssetId field""" + rootAssetId: SalesforceIdFilter + + """Filter by the Asset's product2Id field""" + product2Id: SalesforceIdFilter + + """Filter by the Asset's productCode field""" + productCode: SalesforceStringFilter + + """Filter by the Asset's isCompetitorProduct field""" + isCompetitorProduct: SalesforceBooleanFilter + + """Filter by the Asset's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Asset's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Asset's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Asset's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Asset's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Asset's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Asset's name field""" + name: SalesforceStringFilter + + """Filter by the Asset's serialNumber field""" + serialNumber: SalesforceStringFilter + + """Filter by the Asset's installDate field""" + installDate: SalesforceDateFilter + + """Filter by the Asset's purchaseDate field""" + purchaseDate: SalesforceDateFilter + + """Filter by the Asset's usageEndDate field""" + usageEndDate: SalesforceDateFilter + + """Filter by the Asset's status field""" + status: SalesforceStringFilter + + """Filter by the Asset's price field""" + price: SalesforceFloatFilter + + """Filter by the Asset's quantity field""" + quantity: SalesforceFloatFilter + + """Filter by the Asset's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Asset's assetProvidedById field""" + assetProvidedById: SalesforceIdFilter + + """Filter by the Asset's assetServicedById field""" + assetServicedById: SalesforceIdFilter + + """Filter by the Asset's isInternal field""" + isInternal: SalesforceBooleanFilter + + """Filter by the Asset's assetLevel field""" + assetLevel: SalesforceIntFilter + + """Filter by the Asset's stockKeepingUnit field""" + stockKeepingUnit: SalesforceStringFilter + + """Filter by the Asset's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Asset's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAssetConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAssetConnectionFilter!] +} + +"""Field that Assets can be sorted by""" +enum SalesforceAssetSortByFieldEnum { + ID + CONTACT_ID + ACCOUNT_ID + PARENT_ID + ROOT_ASSET_ID + PRODUCT_2_ID + PRODUCT_CODE + IS_COMPETITOR_PRODUCT + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED + NAME + SERIAL_NUMBER + INSTALL_DATE + PURCHASE_DATE + USAGE_END_DATE + STATUS + PRICE + QUANTITY + OWNER_ID + ASSET_PROVIDED_BY_ID + ASSET_SERVICED_BY_ID + IS_INTERNAL + ASSET_LEVEL + STOCK_KEEPING_UNIT + LAST_VIEWED_DATE + LAST_REFERENCED_DATE +} + +"""An edge in a connection.""" +type SalesforceAssetEdge { + """The item at the end of the edge.""" + node: SalesforceAsset! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Assets connection, for use in pagination.""" +type SalesforceAssetsConnection { + """The count of all Asset you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Assets""" + nodes: [SalesforceAsset!]! + + """List of Asset edges""" + edges: [SalesforceAssetEdge!]! +} + +"""Asset""" +type SalesforceAsset implements OneGraphNode { + """Asset ID""" + id: String! + + """Contact ID""" + contactId: String + + """Contact ID""" + contact: SalesforceContact + + """Account ID""" + accountId: String + + """Account ID""" + account: SalesforceAccount + + """Parent Asset ID""" + parentId: String + + """Parent Asset ID""" + parent: SalesforceAsset + + """Root Asset ID""" + rootAssetId: String + + """Root Asset ID""" + rootAsset: SalesforceAsset + + """Product ID""" + product2Id: String + + """Product ID""" + product2: SalesforceProduct2 + + """Product Code""" + productCode: String + + """Competitor Asset""" + isCompetitorProduct: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Asset Name""" + name: String! + + """Serial Number""" + serialNumber: String + + """Install Date""" + installDate: String + + """Purchase Date""" + purchaseDate: String + + """Usage End Date""" + usageEndDate: String + + """Status""" + status: String + + """Price""" + price: Float + + """Quantity""" + quantity: Float + + """Description""" + description: String + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Asset Provided By ID""" + assetProvidedById: String + + """Asset Provided By ID""" + assetProvidedBy: SalesforceAccount + + """Asset Serviced By ID""" + assetServicedById: String + + """Asset Serviced By ID""" + assetServicedBy: SalesforceAccount + + """Internal Asset""" + isInternal: Boolean! + + """Asset Level""" + assetLevel: Int + + """Product SKU""" + stockKeepingUnit: String + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Collection of Salesforce Asset""" + childAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Assets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetsConnection + + """Collection of Salesforce Asset""" + assets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Assets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetsConnection + + """Collection of Salesforce AssetFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssetFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetFeedsConnection + + """Collection of Salesforce AssetHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssetHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetHistorysConnection + + """Collection of Salesforce AssetRelationship""" + primaryAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetRelationshipConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetRelationshipSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetRelationshipSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssetRelationships to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetRelationshipsConnection + + """Collection of Salesforce AssetRelationship""" + relatedAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetRelationshipConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetRelationshipSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetRelationshipSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssetRelationships to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetRelationshipsConnection + + """Collection of Salesforce AssetShare""" + shares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssetShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetSharesConnection + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce Case""" + cases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Cases to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCasesConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EmailMessage""" + emails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Note""" + notes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceNoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Notes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNotesConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Asset Relationship""" +type SalesforceAssetRelationship implements OneGraphNode { + """Asset Relationship ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Asset Relationship Number""" + assetRelationshipNumber: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Asset ID""" + assetId: String! + + """Asset ID""" + asset: SalesforceAsset! + + """Asset ID""" + relatedAssetId: String! + + """Asset ID""" + relatedAsset: SalesforceAsset! + + """From Date""" + fromDate: String + + """To Date""" + toDate: String + + """Relationship Type""" + relationshipType: String + + """Collection of Salesforce AssetRelationshipFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetRelationshipFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetRelationshipFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetRelationshipFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of AssetRelationshipFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAssetRelationshipFeedsConnection + + """Collection of Salesforce AssetRelationshipHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetRelationshipHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetRelationshipHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetRelationshipHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of AssetRelationshipHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAssetRelationshipHistorysConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EmailMessage""" + emails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceEventWhatUnion = SalesforceSolution | SalesforceProduct2 | SalesforceOrder | SalesforceOpportunity | SalesforceContract | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +union SalesforceEventWhoUnion = SalesforceLead | SalesforceContact + +"""Event""" +type SalesforceEvent implements OneGraphNode { + """Activity ID""" + id: String! + + """Name ID""" + whoId: String + + """Name ID""" + who: SalesforceEventWhoUnion + + """Related To ID""" + whatId: String + + """Related To ID""" + what: SalesforceEventWhatUnion + + """Subject""" + subject: String + + """Location""" + location: String + + """All-Day Event""" + isAllDayEvent: Boolean! + + """Due Date Time""" + activityDateTime: String + + """Due Date Only""" + activityDate: String + + """Duration""" + durationInMinutes: Int + + """Start Date Time""" + startDateTime: String + + """End Date Time""" + endDateTime: String + + """Description""" + description: String + + """Account ID""" + accountId: String + + """Account ID""" + account: SalesforceAccount + + """Assigned To ID""" + ownerId: String! + + """Assigned To ID""" + owner: SalesforceUser! + + """Private""" + isPrivate: Boolean! + + """Show Time As""" + showAs: String + + """Deleted""" + isDeleted: Boolean! + + """Is Child""" + isChild: Boolean! + + """Is Group Event""" + isGroupEvent: Boolean! + + """Group Event Type""" + groupEventType: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Archived""" + isArchived: Boolean! + + """Recurrence Activity ID""" + recurrenceActivityId: String + + """Recurrence Activity ID""" + recurrenceActivity: SalesforceEvent + + """Create Recurring Series of Events""" + isRecurrence: Boolean! + + """Recurrence Start""" + recurrenceStartDateTime: String + + """Recurrence End""" + recurrenceEndDateOnly: String + + """Recurrence Time Zone""" + recurrenceTimeZoneSidKey: String + + """Recurrence Type""" + recurrenceType: String + + """Recurrence Interval""" + recurrenceInterval: Int + + """Recurrence Day of Week Mask""" + recurrenceDayOfWeekMask: Int + + """Recurrence Day of Month""" + recurrenceDayOfMonth: Int + + """Recurrence Instance""" + recurrenceInstance: String + + """Recurrence Month of Year""" + recurrenceMonthOfYear: String + + """Reminder Date/Time""" + reminderDateTime: String + + """Reminder Set""" + isReminderSet: Boolean! + + """Event Subtype""" + eventSubtype: String + + """Collection of Salesforce AcceptedEventRelation""" + acceptedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAcceptedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAcceptedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAcceptedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of AcceptedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAcceptedEventRelationsConnection + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce DeclinedEventRelation""" + declinedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDeclinedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDeclinedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDeclinedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DeclinedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDeclinedEventRelationsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + recurringEvents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce EventFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EventFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventFeedsConnection + + """Collection of Salesforce EventRelation""" + eventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EventRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventRelationsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + + """Collection of Salesforce UndecidedEventRelation""" + undecidedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUndecidedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUndecidedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUndecidedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UndecidedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUndecidedEventRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Event Feed""" +type SalesforceEventFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceEvent! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Lead Feed""" +type SalesforceLeadFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceLead! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Opportunity Feed""" +type SalesforceOpportunityFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceOpportunity! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFeedTrackedChangeFeedItemUnion = SalesforceUserFeed | SalesforceTopicFeed | SalesforceTaskFeed | SalesforceSolutionFeed | SalesforceSiteFeed | SalesforceReportFeed | SalesforceProduct2Feed | SalesforceOrderItemFeed | SalesforceOrderFeed | SalesforceOpportunityFeed | SalesforceLeadFeed | SalesforceFeedItem | SalesforceEventFeed | SalesforceDashboardFeed | SalesforceDashboardComponentFeed | SalesforceContractFeed | SalesforceContentDocumentFeed | SalesforceContactFeed | SalesforceCollaborationGroupFeed | SalesforceCaseFeed | SalesforceCampaignFeed | SalesforceAssetRelationshipFeed | SalesforceAssetFeed | SalesforceAccountFeed + +"""Order Feed""" +type SalesforceOrderFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceOrder! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFeedSignalFeedItemUnion = SalesforceUserFeed | SalesforceTopicFeed | SalesforceTaskFeed | SalesforceSolutionFeed | SalesforceSiteFeed | SalesforceReportFeed | SalesforceProduct2Feed | SalesforceOrderItemFeed | SalesforceOrderFeed | SalesforceOpportunityFeed | SalesforceLeadFeed | SalesforceFeedItem | SalesforceEventFeed | SalesforceDashboardFeed | SalesforceDashboardComponentFeed | SalesforceContractFeed | SalesforceContentDocumentFeed | SalesforceContactFeed | SalesforceCollaborationGroupFeed | SalesforceCaseFeed | SalesforceCampaignFeed | SalesforceAssetRelationshipFeed | SalesforceAssetFeed | SalesforceAccountFeed + +"""Product Feed""" +type SalesforceProduct2Feed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceProduct2! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFeedSignalFeedEntityUnion = SalesforceUserFeed | SalesforceTopicFeed | SalesforceTaskFeed | SalesforceSolutionFeed | SalesforceSiteFeed | SalesforceReportFeed | SalesforceProduct2Feed | SalesforceOrderItemFeed | SalesforceOrderFeed | SalesforceOpportunityFeed | SalesforceLeadFeed | SalesforceFeedItem | SalesforceFeedComment | SalesforceEventFeed | SalesforceDashboardFeed | SalesforceDashboardComponentFeed | SalesforceContractFeed | SalesforceContentDocumentFeed | SalesforceContactFeed | SalesforceCollaborationGroupFeed | SalesforceCaseFeed | SalesforceCampaignFeed | SalesforceAssetRelationshipFeed | SalesforceAssetFeed | SalesforceAccountFeed + +"""Report Feed""" +type SalesforceReportFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceReport! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFeedLikeFeedItemUnion = SalesforceUserFeed | SalesforceTopicFeed | SalesforceTaskFeed | SalesforceSolutionFeed | SalesforceSiteFeed | SalesforceReportFeed | SalesforceProduct2Feed | SalesforceOrderItemFeed | SalesforceOrderFeed | SalesforceOpportunityFeed | SalesforceLeadFeed | SalesforceFeedItem | SalesforceEventFeed | SalesforceDashboardFeed | SalesforceDashboardComponentFeed | SalesforceContractFeed | SalesforceContentDocumentFeed | SalesforceContactFeed | SalesforceCollaborationGroupFeed | SalesforceCaseFeed | SalesforceCampaignFeed | SalesforceAssetRelationshipFeed | SalesforceAssetFeed | SalesforceAccountFeed + +"""Order Product Feed""" +type SalesforceOrderItemFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceOrderItem! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Order Product Feeds connection, for use in pagination.""" +type SalesforceOrderItemFeedsConnection { + """The count of all Order Product Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Order Product Feeds""" + nodes: [SalesforceOrderItemFeed!]! + + """List of Order Product Feed edges""" + edges: [SalesforceOrderItemFeedEdge!]! +} + +""" +A filter to be used against FeedItem object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFeedItemConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FeedItem's bestComment relation.""" + bestComment: SalesforceFeedCommentConnectionFilter + + """Filter by the FeedItem's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the FeedItem's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the FeedItem's lastEditBy relation.""" + lastEditBy: SalesforceUserConnectionFilter + + """Filter by the FeedItem's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the FeedItem's id field""" + id: SalesforceIdFilter + + """Filter by the FeedItem's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the FeedItem's type field""" + type: SalesforceStringFilter + + """Filter by the FeedItem's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the FeedItem's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the FeedItem's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the FeedItem's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the FeedItem's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the FeedItem's revision field""" + revision: SalesforceIntFilter + + """Filter by the FeedItem's lastEditById field""" + lastEditById: SalesforceIdFilter + + """Filter by the FeedItem's lastEditDate field""" + lastEditDate: SalesforceDateTimeFilter + + """Filter by the FeedItem's commentCount field""" + commentCount: SalesforceIntFilter + + """Filter by the FeedItem's likeCount field""" + likeCount: SalesforceIntFilter + + """Filter by the FeedItem's title field""" + title: SalesforceStringFilter + + """Filter by the FeedItem's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Filter by the FeedItem's insertedById field""" + insertedById: SalesforceIdFilter + + """Filter by the FeedItem's bestCommentId field""" + bestCommentId: SalesforceIdFilter + + """Filter by the FeedItem's hasContent field""" + hasContent: SalesforceBooleanFilter + + """Filter by the FeedItem's hasLink field""" + hasLink: SalesforceBooleanFilter + + """Filter by the FeedItem's hasFeedEntity field""" + hasFeedEntity: SalesforceBooleanFilter + + """Filter by the FeedItem's hasVerifiedComment field""" + hasVerifiedComment: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFeedItemConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFeedItemConnectionFilter!] +} + +"""Field that Feed Items can be sorted by""" +enum SalesforceFeedItemSortByFieldEnum { + ID + PARENT_ID + TYPE + CREATED_BY_ID + CREATED_DATE + IS_DELETED + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + REVISION + LAST_EDIT_BY_ID + LAST_EDIT_DATE + COMMENT_COUNT + LIKE_COUNT + TITLE + BODY + LINK_URL + IS_RICH_TEXT + RELATED_RECORD_ID + INSERTED_BY_ID + BEST_COMMENT_ID + HAS_CONTENT + HAS_LINK + HAS_FEED_ENTITY + HAS_VERIFIED_COMMENT + STATUS +} + +""" +A filter to be used against Order object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOrderConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Order's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Order's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Order's activatedBy relation.""" + activatedBy: SalesforceUserConnectionFilter + + """Filter by the Order's shipToContact relation.""" + shipToContact: SalesforceContactConnectionFilter + + """Filter by the Order's billToContact relation.""" + billToContact: SalesforceContactConnectionFilter + + """Filter by the Order's companyAuthorizedBy relation.""" + companyAuthorizedBy: SalesforceUserConnectionFilter + + """Filter by the Order's customerAuthorizedBy relation.""" + customerAuthorizedBy: SalesforceContactConnectionFilter + + """Filter by the Order's originalOrder relation.""" + originalOrder: SalesforceOrderConnectionFilter + + """Filter by the Order's pricebook2 relation.""" + pricebook2: SalesforcePricebook2ConnectionFilter + + """Filter by the Order's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the Order's contract relation.""" + contract: SalesforceContractConnectionFilter + + """Filter by the Order's id field""" + id: SalesforceIdFilter + + """Filter by the Order's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Order's contractId field""" + contractId: SalesforceIdFilter + + """Filter by the Order's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the Order's pricebook2Id field""" + pricebook2Id: SalesforceIdFilter + + """Filter by the Order's originalOrderId field""" + originalOrderId: SalesforceIdFilter + + """Filter by the Order's effectiveDate field""" + effectiveDate: SalesforceDateFilter + + """Filter by the Order's endDate field""" + endDate: SalesforceDateFilter + + """Filter by the Order's isReductionOrder field""" + isReductionOrder: SalesforceBooleanFilter + + """Filter by the Order's status field""" + status: SalesforceStringFilter + + """Filter by the Order's customerAuthorizedById field""" + customerAuthorizedById: SalesforceIdFilter + + """Filter by the Order's customerAuthorizedDate field""" + customerAuthorizedDate: SalesforceDateFilter + + """Filter by the Order's companyAuthorizedById field""" + companyAuthorizedById: SalesforceIdFilter + + """Filter by the Order's companyAuthorizedDate field""" + companyAuthorizedDate: SalesforceDateFilter + + """Filter by the Order's type field""" + type: SalesforceStringFilter + + """Filter by the Order's billingStreet field""" + billingStreet: SalesforceStringFilter + + """Filter by the Order's billingCity field""" + billingCity: SalesforceStringFilter + + """Filter by the Order's billingState field""" + billingState: SalesforceStringFilter + + """Filter by the Order's billingPostalCode field""" + billingPostalCode: SalesforceStringFilter + + """Filter by the Order's billingCountry field""" + billingCountry: SalesforceStringFilter + + """Filter by the Order's billingLatitude field""" + billingLatitude: SalesforceFloatFilter + + """Filter by the Order's billingLongitude field""" + billingLongitude: SalesforceFloatFilter + + """Filter by the Order's billingGeocodeAccuracy field""" + billingGeocodeAccuracy: SalesforceStringFilter + + """Filter by the Order's shippingStreet field""" + shippingStreet: SalesforceStringFilter + + """Filter by the Order's shippingCity field""" + shippingCity: SalesforceStringFilter + + """Filter by the Order's shippingState field""" + shippingState: SalesforceStringFilter + + """Filter by the Order's shippingPostalCode field""" + shippingPostalCode: SalesforceStringFilter + + """Filter by the Order's shippingCountry field""" + shippingCountry: SalesforceStringFilter + + """Filter by the Order's shippingLatitude field""" + shippingLatitude: SalesforceFloatFilter + + """Filter by the Order's shippingLongitude field""" + shippingLongitude: SalesforceFloatFilter + + """Filter by the Order's shippingGeocodeAccuracy field""" + shippingGeocodeAccuracy: SalesforceStringFilter + + """Filter by the Order's name field""" + name: SalesforceStringFilter + + """Filter by the Order's poDate field""" + poDate: SalesforceDateFilter + + """Filter by the Order's poNumber field""" + poNumber: SalesforceStringFilter + + """Filter by the Order's orderReferenceNumber field""" + orderReferenceNumber: SalesforceStringFilter + + """Filter by the Order's billToContactId field""" + billToContactId: SalesforceIdFilter + + """Filter by the Order's shipToContactId field""" + shipToContactId: SalesforceIdFilter + + """Filter by the Order's activatedDate field""" + activatedDate: SalesforceDateTimeFilter + + """Filter by the Order's activatedById field""" + activatedById: SalesforceIdFilter + + """Filter by the Order's statusCode field""" + statusCode: SalesforceStringFilter + + """Filter by the Order's orderNumber field""" + orderNumber: SalesforceStringFilter + + """Filter by the Order's totalAmount field""" + totalAmount: SalesforceFloatFilter + + """Filter by the Order's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Order's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Order's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Order's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Order's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Order's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Order's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Order's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOrderConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOrderConnectionFilter!] +} + +""" +A filter to be used against OrderItem object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOrderItemConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OrderItem's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the OrderItem's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OrderItem's originalOrderItem relation.""" + originalOrderItem: SalesforceOrderItemConnectionFilter + + """Filter by the OrderItem's pricebookEntry relation.""" + pricebookEntry: SalesforcePricebookEntryConnectionFilter + + """Filter by the OrderItem's order relation.""" + order: SalesforceOrderConnectionFilter + + """Filter by the OrderItem's product2 relation.""" + product2: SalesforceProduct2ConnectionFilter + + """Filter by the OrderItem's id field""" + id: SalesforceIdFilter + + """Filter by the OrderItem's product2Id field""" + product2Id: SalesforceIdFilter + + """Filter by the OrderItem's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the OrderItem's orderId field""" + orderId: SalesforceIdFilter + + """Filter by the OrderItem's pricebookEntryId field""" + pricebookEntryId: SalesforceIdFilter + + """Filter by the OrderItem's originalOrderItemId field""" + originalOrderItemId: SalesforceIdFilter + + """Filter by the OrderItem's availableQuantity field""" + availableQuantity: SalesforceFloatFilter + + """Filter by the OrderItem's quantity field""" + quantity: SalesforceFloatFilter + + """Filter by the OrderItem's unitPrice field""" + unitPrice: SalesforceFloatFilter + + """Filter by the OrderItem's listPrice field""" + listPrice: SalesforceFloatFilter + + """Filter by the OrderItem's totalPrice field""" + totalPrice: SalesforceFloatFilter + + """Filter by the OrderItem's serviceDate field""" + serviceDate: SalesforceDateFilter + + """Filter by the OrderItem's endDate field""" + endDate: SalesforceDateFilter + + """Filter by the OrderItem's description field""" + description: SalesforceStringFilter + + """Filter by the OrderItem's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OrderItem's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OrderItem's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OrderItem's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the OrderItem's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the OrderItem's orderItemNumber field""" + orderItemNumber: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOrderItemConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOrderItemConnectionFilter!] +} + +"""Field that Order Products can be sorted by""" +enum SalesforceOrderItemSortByFieldEnum { + ID + PRODUCT_2_ID + IS_DELETED + ORDER_ID + PRICEBOOK_ENTRY_ID + ORIGINAL_ORDER_ITEM_ID + AVAILABLE_QUANTITY + QUANTITY + UNIT_PRICE + LIST_PRICE + TOTAL_PRICE + SERVICE_DATE + END_DATE + DESCRIPTION + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + ORDER_ITEM_NUMBER +} + +"""An edge in a connection.""" +type SalesforceOrderItemEdge { + """The item at the end of the edge.""" + node: SalesforceOrderItem! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Order Products connection, for use in pagination.""" +type SalesforceOrderItemsConnection { + """The count of all Order Product you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Order Products""" + nodes: [SalesforceOrderItem!]! + + """List of Order Product edges""" + edges: [SalesforceOrderItemEdge!]! +} + +""" +A filter to be used against Product2 object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceProduct2ConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Product2's externalDataSource relation.""" + externalDataSource: SalesforceExternalDataSourceConnectionFilter + + """Filter by the Product2's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Product2's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Product2's id field""" + id: SalesforceIdFilter + + """Filter by the Product2's name field""" + name: SalesforceStringFilter + + """Filter by the Product2's productCode field""" + productCode: SalesforceStringFilter + + """Filter by the Product2's description field""" + description: SalesforceStringFilter + + """Filter by the Product2's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the Product2's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Product2's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Product2's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Product2's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Product2's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Product2's family field""" + family: SalesforceStringFilter + + """Filter by the Product2's externalDataSourceId field""" + externalDataSourceId: SalesforceIdFilter + + """Filter by the Product2's externalId field""" + externalId: SalesforceStringFilter + + """Filter by the Product2's displayUrl field""" + displayUrl: SalesforceStringFilter + + """Filter by the Product2's quantityUnitOfMeasure field""" + quantityUnitOfMeasure: SalesforceStringFilter + + """Filter by the Product2's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Product2's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Product2's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the Product2's stockKeepingUnit field""" + stockKeepingUnit: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceProduct2ConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceProduct2ConnectionFilter!] +} + +""" +A filter to be used against PricebookEntry object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePricebookEntryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the PricebookEntry's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the PricebookEntry's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the PricebookEntry's product2 relation.""" + product2: SalesforceProduct2ConnectionFilter + + """Filter by the PricebookEntry's pricebook2 relation.""" + pricebook2: SalesforcePricebook2ConnectionFilter + + """Filter by the PricebookEntry's id field""" + id: SalesforceIdFilter + + """Filter by the PricebookEntry's name field""" + name: SalesforceStringFilter + + """Filter by the PricebookEntry's pricebook2Id field""" + pricebook2Id: SalesforceIdFilter + + """Filter by the PricebookEntry's product2Id field""" + product2Id: SalesforceIdFilter + + """Filter by the PricebookEntry's unitPrice field""" + unitPrice: SalesforceFloatFilter + + """Filter by the PricebookEntry's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the PricebookEntry's useStandardPrice field""" + useStandardPrice: SalesforceBooleanFilter + + """Filter by the PricebookEntry's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the PricebookEntry's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the PricebookEntry's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the PricebookEntry's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the PricebookEntry's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the PricebookEntry's productCode field""" + productCode: SalesforceStringFilter + + """Filter by the PricebookEntry's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePricebookEntryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePricebookEntryConnectionFilter!] +} + +""" +A filter to be used against Opportunity object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOpportunityConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Opportunity's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Opportunity's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Opportunity's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the Opportunity's pricebook2 relation.""" + pricebook2: SalesforcePricebook2ConnectionFilter + + """Filter by the Opportunity's campaign relation.""" + campaign: SalesforceCampaignConnectionFilter + + """Filter by the Opportunity's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the Opportunity's id field""" + id: SalesforceIdFilter + + """Filter by the Opportunity's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Opportunity's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the Opportunity's isPrivate field""" + isPrivate: SalesforceBooleanFilter + + """Filter by the Opportunity's name field""" + name: SalesforceStringFilter + + """Filter by the Opportunity's stageName field""" + stageName: SalesforceStringFilter + + """Filter by the Opportunity's amount field""" + amount: SalesforceFloatFilter + + """Filter by the Opportunity's probability field""" + probability: SalesforceFloatFilter + + """Filter by the Opportunity's expectedRevenue field""" + expectedRevenue: SalesforceFloatFilter + + """Filter by the Opportunity's totalOpportunityQuantity field""" + totalOpportunityQuantity: SalesforceFloatFilter + + """Filter by the Opportunity's closeDate field""" + closeDate: SalesforceDateFilter + + """Filter by the Opportunity's type field""" + type: SalesforceStringFilter + + """Filter by the Opportunity's nextStep field""" + nextStep: SalesforceStringFilter + + """Filter by the Opportunity's leadSource field""" + leadSource: SalesforceStringFilter + + """Filter by the Opportunity's isClosed field""" + isClosed: SalesforceBooleanFilter + + """Filter by the Opportunity's isWon field""" + isWon: SalesforceBooleanFilter + + """Filter by the Opportunity's forecastCategory field""" + forecastCategory: SalesforceStringFilter + + """Filter by the Opportunity's forecastCategoryName field""" + forecastCategoryName: SalesforceStringFilter + + """Filter by the Opportunity's campaignId field""" + campaignId: SalesforceIdFilter + + """Filter by the Opportunity's hasOpportunityLineItem field""" + hasOpportunityLineItem: SalesforceBooleanFilter + + """Filter by the Opportunity's pricebook2Id field""" + pricebook2Id: SalesforceIdFilter + + """Filter by the Opportunity's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Opportunity's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Opportunity's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Opportunity's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Opportunity's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Opportunity's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Opportunity's lastActivityDate field""" + lastActivityDate: SalesforceDateFilter + + """Filter by the Opportunity's fiscalQuarter field""" + fiscalQuarter: SalesforceIntFilter + + """Filter by the Opportunity's fiscalYear field""" + fiscalYear: SalesforceIntFilter + + """Filter by the Opportunity's fiscal field""" + fiscal: SalesforceStringFilter + + """Filter by the Opportunity's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Opportunity's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOpportunityConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOpportunityConnectionFilter!] +} + +""" +A filter to be used against OpportunityLineItem object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOpportunityLineItemConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the OpportunityLineItem's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityLineItem's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the OpportunityLineItem's product2 relation.""" + product2: SalesforceProduct2ConnectionFilter + + """Filter by the OpportunityLineItem's pricebookEntry relation.""" + pricebookEntry: SalesforcePricebookEntryConnectionFilter + + """Filter by the OpportunityLineItem's opportunity relation.""" + opportunity: SalesforceOpportunityConnectionFilter + + """Filter by the OpportunityLineItem's id field""" + id: SalesforceIdFilter + + """Filter by the OpportunityLineItem's opportunityId field""" + opportunityId: SalesforceIdFilter + + """Filter by the OpportunityLineItem's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Filter by the OpportunityLineItem's pricebookEntryId field""" + pricebookEntryId: SalesforceIdFilter + + """Filter by the OpportunityLineItem's product2Id field""" + product2Id: SalesforceIdFilter + + """Filter by the OpportunityLineItem's productCode field""" + productCode: SalesforceStringFilter + + """Filter by the OpportunityLineItem's name field""" + name: SalesforceStringFilter + + """Filter by the OpportunityLineItem's quantity field""" + quantity: SalesforceFloatFilter + + """Filter by the OpportunityLineItem's totalPrice field""" + totalPrice: SalesforceFloatFilter + + """Filter by the OpportunityLineItem's unitPrice field""" + unitPrice: SalesforceFloatFilter + + """Filter by the OpportunityLineItem's listPrice field""" + listPrice: SalesforceFloatFilter + + """Filter by the OpportunityLineItem's serviceDate field""" + serviceDate: SalesforceDateFilter + + """Filter by the OpportunityLineItem's description field""" + description: SalesforceStringFilter + + """Filter by the OpportunityLineItem's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the OpportunityLineItem's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the OpportunityLineItem's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the OpportunityLineItem's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the OpportunityLineItem's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the OpportunityLineItem's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOpportunityLineItemConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOpportunityLineItemConnectionFilter!] +} + +"""Field that Opportunity Products can be sorted by""" +enum SalesforceOpportunityLineItemSortByFieldEnum { + ID + OPPORTUNITY_ID + SORT_ORDER + PRICEBOOK_ENTRY_ID + PRODUCT_2_ID + PRODUCT_CODE + NAME + QUANTITY + TOTAL_PRICE + UNIT_PRICE + LIST_PRICE + SERVICE_DATE + DESCRIPTION + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceOpportunityLineItemEdge { + """The item at the end of the edge.""" + node: SalesforceOpportunityLineItem! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Opportunity Product""" +type SalesforceOpportunityLineItem implements OneGraphNode { + """Line Item ID""" + id: String! + + """Opportunity ID""" + opportunityId: String! + + """Opportunity ID""" + opportunity: SalesforceOpportunity! + + """Sort Order""" + sortOrder: Int + + """Price Book Entry ID""" + pricebookEntryId: String + + """Price Book Entry ID""" + pricebookEntry: SalesforcePricebookEntry + + """Product ID""" + product2Id: String + + """Product ID""" + product2: SalesforceProduct2 + + """Product Code""" + productCode: String + + """Opportunity Product Name""" + name: String + + """Quantity""" + quantity: Float! + + """Total Price""" + totalPrice: Float + + """Sales Price""" + unitPrice: Float + + """List Price""" + listPrice: Float + + """Date""" + serviceDate: String + + """Line Description""" + description: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Opportunity Products connection, for use in pagination.""" +type SalesforceOpportunityLineItemsConnection { + """ + The count of all Opportunity Product you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Opportunity Products""" + nodes: [SalesforceOpportunityLineItem!]! + + """List of Opportunity Product edges""" + edges: [SalesforceOpportunityLineItemEdge!]! +} + +"""Price Book Entry""" +type SalesforcePricebookEntry implements OneGraphNode { + """Price Book Entry ID""" + id: String! + + """Product Name""" + name: String + + """Price Book ID""" + pricebook2Id: String! + + """Price Book ID""" + pricebook2: SalesforcePricebook2! + + """Product ID""" + product2Id: String! + + """Product ID""" + product2: SalesforceProduct2! + + """List Price""" + unitPrice: Float! + + """Active""" + isActive: Boolean! + + """Use Standard Price""" + useStandardPrice: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Product Code""" + productCode: String + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce OpportunityLineItem""" + opportunityLineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityLineItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityLineItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityLineItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityLineItems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityLineItemsConnection + + """Collection of Salesforce OrderItem""" + orderItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Order Product""" +type SalesforceOrderItem implements OneGraphNode { + """Order Product ID""" + id: String! + + """Product ID""" + product2Id: String + + """Product ID""" + product2: SalesforceProduct2 + + """Deleted""" + isDeleted: Boolean! + + """Order ID""" + orderId: String! + + """Order ID""" + order: SalesforceOrder! + + """Price Book Entry ID""" + pricebookEntryId: String! + + """Price Book Entry ID""" + pricebookEntry: SalesforcePricebookEntry! + + """Original Order Item ID""" + originalOrderItemId: String + + """Original Order Item ID""" + originalOrderItem: SalesforceOrderItem + + """Available Quantity""" + availableQuantity: Float + + """Quantity""" + quantity: Float! + + """Unit Price""" + unitPrice: Float + + """List Price""" + listPrice: Float + + """Total Price""" + totalPrice: Float + + """Start Date""" + serviceDate: String + + """End Date""" + endDate: String + + """Line Description""" + description: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Order Product Number""" + orderItemNumber: String! + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce OrderItem""" + childOrderItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemsConnection + + """Collection of Salesforce OrderItemFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderItemFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderItemFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemFeedsConnection + + """Collection of Salesforce OrderItemHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderItemHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderItemHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemHistorysConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFeedItemParentUnion = SalesforceUser | SalesforceTopic | SalesforceTask | SalesforceSolution | SalesforceSite | SalesforceReport | SalesforceProduct2 | SalesforceOrderItem | SalesforceOrder | SalesforceOpportunity | SalesforceLead | SalesforceEvent | SalesforceDashboardComponent | SalesforceDashboard | SalesforceContract | SalesforceContentDocument | SalesforceContact | SalesforceCollaborationGroup | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +"""Feed Item""" +type SalesforceFeedItem implements OneGraphNode { + """Linked Github IssueComment""" + gitHubIssueComment: GitHubIssueComment + + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceFeedItemParentUnion! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Revision""" + revision: Int + + """Last Edit By ID""" + lastEditById: String + + """Last Edit By ID""" + lastEditBy: SalesforceUser + + """Last Edit Date""" + lastEditDate: String + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String! + + """InsertedBy ID""" + insertedBy: SalesforceUser! + + """Best Comment ID""" + bestCommentId: String + + """Best Comment ID""" + bestComment: SalesforceFeedComment + + """Has Content""" + hasContent: Boolean! + + """Has Link""" + hasLink: Boolean! + + """Has Feed Entity Attachment""" + hasFeedEntity: Boolean! + + """Has Verified Comment""" + hasVerifiedComment: Boolean! + + """Status""" + status: String + + """Collection of Salesforce Announcement""" + announcements( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAnnouncementConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAnnouncementSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAnnouncementSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Announcements to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAnnouncementsConnection + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + + """Collection of Salesforce FeedRevision""" + feedRevisions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedRevisionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedRevisionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedRevisionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedRevisions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedRevisionsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Feed Items connection, for use in pagination.""" +type SalesforceFeedItemsConnection { + """The count of all Feed Item you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Feed Items""" + nodes: [SalesforceFeedItem!]! + + """List of Feed Item edges""" + edges: [SalesforceFeedItemEdge!]! +} + +""" +A filter to be used against EntitySubscription object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceEntitySubscriptionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the EntitySubscription's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the EntitySubscription's subscriber relation.""" + subscriber: SalesforceUserConnectionFilter + + """Filter by the EntitySubscription's id field""" + id: SalesforceIdFilter + + """Filter by the EntitySubscription's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the EntitySubscription's subscriberId field""" + subscriberId: SalesforceIdFilter + + """Filter by the EntitySubscription's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the EntitySubscription's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the EntitySubscription's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceEntitySubscriptionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceEntitySubscriptionConnectionFilter!] +} + +"""Field that Entity Subscriptions can be sorted by""" +enum SalesforceEntitySubscriptionSortByFieldEnum { + ID + PARENT_ID + SUBSCRIBER_ID + CREATED_BY_ID + CREATED_DATE + IS_DELETED +} + +"""An edge in a connection.""" +type SalesforceDomainSiteEdge { + """The item at the end of the edge.""" + node: SalesforceDomainSite! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against Site object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSiteConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Site's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Site's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Site's admin relation.""" + admin: SalesforceUserConnectionFilter + + """Filter by the Site's guestUser relation.""" + guestUser: SalesforceUserConnectionFilter + + """Filter by the Site's id field""" + id: SalesforceIdFilter + + """Filter by the Site's name field""" + name: SalesforceStringFilter + + """Filter by the Site's subdomain field""" + subdomain: SalesforceStringFilter + + """Filter by the Site's urlPathPrefix field""" + urlPathPrefix: SalesforceStringFilter + + """Filter by the Site's guestUserId field""" + guestUserId: SalesforceIdFilter + + """Filter by the Site's status field""" + status: SalesforceStringFilter + + """Filter by the Site's adminId field""" + adminId: SalesforceIdFilter + + """Filter by the Site's optionsEnableFeeds field""" + optionsEnableFeeds: SalesforceBooleanFilter + + """Filter by the Site's optionsRequireHttps field""" + optionsRequireHttps: SalesforceBooleanFilter + + """Filter by the Site's optionsAllowHomePage field""" + optionsAllowHomePage: SalesforceBooleanFilter + + """Filter by the Site's optionsAllowStandardIdeasPages field""" + optionsAllowStandardIdeasPages: SalesforceBooleanFilter + + """Filter by the Site's optionsAllowStandardSearch field""" + optionsAllowStandardSearch: SalesforceBooleanFilter + + """Filter by the Site's optionsAllowStandardLookups field""" + optionsAllowStandardLookups: SalesforceBooleanFilter + + """Filter by the Site's optionsAllowStandardAnswersPages field""" + optionsAllowStandardAnswersPages: SalesforceBooleanFilter + + """Filter by the Site's optionsAllowGuestSupportApi field""" + optionsAllowGuestSupportApi: SalesforceBooleanFilter + + """Filter by the Site's optionsAllowStandardPortalPages field""" + optionsAllowStandardPortalPages: SalesforceBooleanFilter + + """Filter by the Site's optionsCspUpgradeInsecureRequests field""" + optionsCspUpgradeInsecureRequests: SalesforceBooleanFilter + + """Filter by the Site's optionsContentSniffingProtection field""" + optionsContentSniffingProtection: SalesforceBooleanFilter + + """Filter by the Site's optionsBrowserXssProtection field""" + optionsBrowserXssProtection: SalesforceBooleanFilter + + """Filter by the Site's optionsReferrerPolicyOriginWhenCrossOrigin field""" + optionsReferrerPolicyOriginWhenCrossOrigin: SalesforceBooleanFilter + + """Filter by the Site's description field""" + description: SalesforceStringFilter + + """Filter by the Site's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the Site's analyticsTrackingCode field""" + analyticsTrackingCode: SalesforceStringFilter + + """Filter by the Site's siteType field""" + siteType: SalesforceStringFilter + + """Filter by the Site's clickjackProtectionLevel field""" + clickjackProtectionLevel: SalesforceStringFilter + + """Filter by the Site's dailyBandwidthLimit field""" + dailyBandwidthLimit: SalesforceIntFilter + + """Filter by the Site's dailyBandwidthUsed field""" + dailyBandwidthUsed: SalesforceIntFilter + + """Filter by the Site's dailyRequestTimeLimit field""" + dailyRequestTimeLimit: SalesforceIntFilter + + """Filter by the Site's dailyRequestTimeUsed field""" + dailyRequestTimeUsed: SalesforceIntFilter + + """Filter by the Site's monthlyPageViewsEntitlement field""" + monthlyPageViewsEntitlement: SalesforceIntFilter + + """Filter by the Site's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Site's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Site's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Site's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Site's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSiteConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSiteConnectionFilter!] +} + +""" +A filter to be used against Domain object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDomainConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Domain's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Domain's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Domain's id field""" + id: SalesforceIdFilter + + """Filter by the Domain's domainType field""" + domainType: SalesforceStringFilter + + """Filter by the Domain's domain field""" + domain: SalesforceStringFilter + + """Filter by the Domain's optionsExternalHttps field""" + optionsExternalHttps: SalesforceBooleanFilter + + """Filter by the Domain's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Domain's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Domain's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Domain's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Domain's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDomainConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDomainConnectionFilter!] +} + +""" +A filter to be used against DomainSite object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDomainSiteConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DomainSite's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the DomainSite's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DomainSite's site relation.""" + site: SalesforceSiteConnectionFilter + + """Filter by the DomainSite's domain relation.""" + domain: SalesforceDomainConnectionFilter + + """Filter by the DomainSite's id field""" + id: SalesforceIdFilter + + """Filter by the DomainSite's domainId field""" + domainId: SalesforceIdFilter + + """Filter by the DomainSite's siteId field""" + siteId: SalesforceIdFilter + + """Filter by the DomainSite's pathPrefix field""" + pathPrefix: SalesforceStringFilter + + """Filter by the DomainSite's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DomainSite's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DomainSite's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DomainSite's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the DomainSite's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDomainSiteConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDomainSiteConnectionFilter!] +} + +"""Field that Custom URLs can be sorted by""" +enum SalesforceDomainSiteSortByFieldEnum { + ID + DOMAIN_ID + SITE_ID + PATH_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""Domain""" +type SalesforceDomain implements OneGraphNode { + """Domain ID""" + id: String! + + """Domain Type""" + domainType: String! + + """Domain Name""" + domain: String! + + """Enable External HTTPS""" + optionsExternalHttps: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce DomainSite""" + domainSites( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDomainSiteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDomainSiteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDomainSiteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DomainSites to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDomainSitesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Custom URL""" +type SalesforceDomainSite implements OneGraphNode { + """Custom URL ID""" + id: String! + + """Domain ID""" + domainId: String! + + """Domain ID""" + domain: SalesforceDomain! + + """Site ID""" + siteId: String! + + """Site ID""" + site: SalesforceSite! + + """Path""" + pathPrefix: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Custom URLs connection, for use in pagination.""" +type SalesforceDomainSitesConnection { + """The count of all Custom URL you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Custom URLs""" + nodes: [SalesforceDomainSite!]! + + """List of Custom URL edges""" + edges: [SalesforceDomainSiteEdge!]! +} + +"""Site""" +type SalesforceSite implements OneGraphNode { + """Site ID""" + id: String! + + """Site Name""" + name: String! + + """Site Subdomain Prefix""" + subdomain: String + + """Default Web Address""" + urlPathPrefix: String + + """User ID""" + guestUserId: String + + """User ID""" + guestUser: SalesforceUser + + """Site Status""" + status: String! + + """User ID""" + adminId: String! + + """User ID""" + admin: SalesforceUser! + + """Enable Feeds""" + optionsEnableFeeds: Boolean! + + """Require Secure Connections (HTTPS)""" + optionsRequireHttps: Boolean! + + """Enable Standard Home Page""" + optionsAllowHomePage: Boolean! + + """Enable Standard Ideas Pages""" + optionsAllowStandardIdeasPages: Boolean! + + """Enable Standard Lookup Pages""" + optionsAllowStandardSearch: Boolean! + + """Enable Standard Search Pages""" + optionsAllowStandardLookups: Boolean! + + """Enable Standard Answers Pages""" + optionsAllowStandardAnswersPages: Boolean! + + """Guest Access to the Support API""" + optionsAllowGuestSupportApi: Boolean! + + """Allow Access to Standard Salesforce Pages""" + optionsAllowStandardPortalPages: Boolean! + + """Upgrade all requests to HTTPS""" + optionsCspUpgradeInsecureRequests: Boolean! + + """Enable Content Sniffing Protection""" + optionsContentSniffingProtection: Boolean! + + """Enable Browser Cross Site Scripting Protection""" + optionsBrowserXssProtection: Boolean! + + """Referrer URL Protection""" + optionsReferrerPolicyOriginWhenCrossOrigin: Boolean! + + """Site Description""" + description: String + + """Site Label""" + masterLabel: String! + + """Analytics Tracking Code""" + analyticsTrackingCode: String + + """Site Type""" + siteType: String! + + """Clickjack Protection Level""" + clickjackProtectionLevel: String! + + """Daily Bandwidth Limit (MB)""" + dailyBandwidthLimit: Int + + """Daily Bandwidth Used""" + dailyBandwidthUsed: Int + + """Daily Request Time Limit (min)""" + dailyRequestTimeLimit: Int + + """Daily Request Time Used""" + dailyRequestTimeUsed: Int + + """Monthly Page Views Allowed""" + monthlyPageViewsEntitlement: Int + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce DomainSite""" + siteDomainPaths( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDomainSiteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDomainSiteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDomainSiteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DomainSites to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDomainSitesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce SiteFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSiteFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSiteFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSiteFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SiteFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSiteFeedsConnection + + """Collection of Salesforce SiteHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSiteHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSiteHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSiteHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SiteHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSiteHistorysConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Site""" +type SalesforceSiteFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceSite! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFeedLikeFeedEntityUnion = SalesforceUserFeed | SalesforceTopicFeed | SalesforceTaskFeed | SalesforceSolutionFeed | SalesforceSiteFeed | SalesforceReportFeed | SalesforceProduct2Feed | SalesforceOrderItemFeed | SalesforceOrderFeed | SalesforceOpportunityFeed | SalesforceLeadFeed | SalesforceFeedItem | SalesforceFeedComment | SalesforceEventFeed | SalesforceDashboardFeed | SalesforceDashboardComponentFeed | SalesforceContractFeed | SalesforceContentDocumentFeed | SalesforceContactFeed | SalesforceCollaborationGroupFeed | SalesforceCaseFeed | SalesforceCampaignFeed | SalesforceAssetRelationshipFeed | SalesforceAssetFeed | SalesforceAccountFeed + +""" +A filter to be used against FeedPollVote object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFeedPollVoteConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FeedPollVote's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the FeedPollVote's choice relation.""" + choice: SalesforceFeedPollChoiceConnectionFilter + + """Filter by the FeedPollVote's id field""" + id: SalesforceIdFilter + + """Filter by the FeedPollVote's feedItemId field""" + feedItemId: SalesforceIdFilter + + """Filter by the FeedPollVote's choiceId field""" + choiceId: SalesforceIdFilter + + """Filter by the FeedPollVote's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the FeedPollVote's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the FeedPollVote's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the FeedPollVote's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFeedPollVoteConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFeedPollVoteConnectionFilter!] +} + +"""Field that Feed Poll Votes can be sorted by""" +enum SalesforceFeedPollVoteSortByFieldEnum { + ID + FEED_ITEM_ID + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_DATE + IS_DELETED +} + +"""Solution Feed""" +type SalesforceSolutionFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceSolution! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFeedPollVoteFeedItemUnion = SalesforceUserFeed | SalesforceTopicFeed | SalesforceTaskFeed | SalesforceSolutionFeed | SalesforceSiteFeed | SalesforceReportFeed | SalesforceProduct2Feed | SalesforceOrderItemFeed | SalesforceOrderFeed | SalesforceOpportunityFeed | SalesforceLeadFeed | SalesforceFeedItem | SalesforceEventFeed | SalesforceDashboardFeed | SalesforceDashboardComponentFeed | SalesforceContractFeed | SalesforceContentDocumentFeed | SalesforceContactFeed | SalesforceCollaborationGroupFeed | SalesforceCaseFeed | SalesforceCampaignFeed | SalesforceAssetRelationshipFeed | SalesforceAssetFeed | SalesforceAccountFeed + +"""Feed Poll Vote""" +type SalesforceFeedPollVote implements OneGraphNode { + """Feed Poll Vote ID""" + id: String! + + """Feed Item ID""" + feedItemId: String! + + """Feed Item ID""" + feedItem: SalesforceFeedPollVoteFeedItemUnion! + + """Feed Poll Choice ID""" + choiceId: String! + + """Feed Poll Choice ID""" + choice: SalesforceFeedPollChoice! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified Date""" + lastModifiedDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Feed Poll Votes connection, for use in pagination.""" +type SalesforceFeedPollVotesConnection { + """The count of all Feed Poll Vote you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Feed Poll Votes""" + nodes: [SalesforceFeedPollVote!]! + + """List of Feed Poll Vote edges""" + edges: [SalesforceFeedPollVoteEdge!]! +} + +""" +A filter to be used against FeedPollChoice object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFeedPollChoiceConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FeedPollChoice's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the FeedPollChoice's id field""" + id: SalesforceIdFilter + + """Filter by the FeedPollChoice's feedItemId field""" + feedItemId: SalesforceIdFilter + + """Filter by the FeedPollChoice's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the FeedPollChoice's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the FeedPollChoice's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFeedPollChoiceConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFeedPollChoiceConnectionFilter!] +} + +"""Field that Feed Poll Choices can be sorted by""" +enum SalesforceFeedPollChoiceSortByFieldEnum { + ID + FEED_ITEM_ID + POSITION + CREATED_BY_ID + CREATED_DATE + IS_DELETED +} + +"""Task Feed""" +type SalesforceTaskFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceTask! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFeedPollChoiceFeedItemUnion = SalesforceUserFeed | SalesforceTopicFeed | SalesforceTaskFeed | SalesforceSolutionFeed | SalesforceSiteFeed | SalesforceReportFeed | SalesforceProduct2Feed | SalesforceOrderItemFeed | SalesforceOrderFeed | SalesforceOpportunityFeed | SalesforceLeadFeed | SalesforceFeedItem | SalesforceEventFeed | SalesforceDashboardFeed | SalesforceDashboardComponentFeed | SalesforceContractFeed | SalesforceContentDocumentFeed | SalesforceContactFeed | SalesforceCollaborationGroupFeed | SalesforceCaseFeed | SalesforceCampaignFeed | SalesforceAssetRelationshipFeed | SalesforceAssetFeed | SalesforceAccountFeed + +"""Feed Poll Choice""" +type SalesforceFeedPollChoice implements OneGraphNode { + """Feed Poll Choice ID""" + id: String! + + """Feed Item ID""" + feedItemId: String! + + """Feed Item ID""" + feedItem: SalesforceFeedPollChoiceFeedItemUnion! + + """Position""" + position: Int! + + """ChoiceBody""" + choiceBody: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Feed Poll Choices connection, for use in pagination.""" +type SalesforceFeedPollChoicesConnection { + """The count of all Feed Poll Choice you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Feed Poll Choices""" + nodes: [SalesforceFeedPollChoice!]! + + """List of Feed Poll Choice edges""" + edges: [SalesforceFeedPollChoiceEdge!]! +} + +""" +A filter to be used against FeedComment object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFeedCommentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FeedComment's relatedRecord relation.""" + relatedRecord: SalesforceContentVersionConnectionFilter + + """Filter by the FeedComment's insertedBy relation.""" + insertedBy: SalesforceUserConnectionFilter + + """Filter by the FeedComment's lastEditBy relation.""" + lastEditBy: SalesforceUserConnectionFilter + + """Filter by the FeedComment's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the FeedComment's id field""" + id: SalesforceIdFilter + + """Filter by the FeedComment's feedItemId field""" + feedItemId: SalesforceIdFilter + + """Filter by the FeedComment's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the FeedComment's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the FeedComment's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the FeedComment's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the FeedComment's revision field""" + revision: SalesforceIntFilter + + """Filter by the FeedComment's lastEditById field""" + lastEditById: SalesforceIdFilter + + """Filter by the FeedComment's lastEditDate field""" + lastEditDate: SalesforceDateTimeFilter + + """Filter by the FeedComment's commentBody field""" + commentBody: SalesforceStringFilter + + """Filter by the FeedComment's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the FeedComment's insertedById field""" + insertedById: SalesforceIdFilter + + """Filter by the FeedComment's commentType field""" + commentType: SalesforceStringFilter + + """Filter by the FeedComment's isRichText field""" + isRichText: SalesforceBooleanFilter + + """Filter by the FeedComment's isVerified field""" + isVerified: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFeedCommentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFeedCommentConnectionFilter!] +} + +"""Field that Feed Comments can be sorted by""" +enum SalesforceFeedCommentSortByFieldEnum { + ID + FEED_ITEM_ID + PARENT_ID + CREATED_BY_ID + CREATED_DATE + SYSTEM_MODSTAMP + REVISION + LAST_EDIT_BY_ID + LAST_EDIT_DATE + COMMENT_BODY + IS_DELETED + INSERTED_BY_ID + COMMENT_TYPE + RELATED_RECORD_ID + IS_RICH_TEXT + IS_VERIFIED + STATUS +} + +"""Topic Feed""" +type SalesforceTopicFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceTopic! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFeedCommentFeedItemUnion = SalesforceUserFeed | SalesforceTopicFeed | SalesforceTaskFeed | SalesforceSolutionFeed | SalesforceSiteFeed | SalesforceReportFeed | SalesforceProduct2Feed | SalesforceOrderItemFeed | SalesforceOrderFeed | SalesforceOpportunityFeed | SalesforceLeadFeed | SalesforceFeedItem | SalesforceEventFeed | SalesforceDashboardFeed | SalesforceDashboardComponentFeed | SalesforceContractFeed | SalesforceContentDocumentFeed | SalesforceContactFeed | SalesforceCollaborationGroupFeed | SalesforceCaseFeed | SalesforceCampaignFeed | SalesforceAssetRelationshipFeed | SalesforceAssetFeed | SalesforceAccountFeed + +"""Feed Comment""" +type SalesforceFeedComment implements OneGraphNode { + """Linked Github IssueComment""" + gitHubIssueComment: GitHubIssueComment + + """Feed Comment ID""" + id: String! + + """Feed Item ID""" + feedItemId: String! + + """Feed Item ID""" + feedItem: SalesforceFeedCommentFeedItemUnion! + + """Parent ID""" + parentId: String + + """Parent ID""" + parent: SalesforceFeedCommentParentUnion + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Revision""" + revision: Int + + """Last Edit By ID""" + lastEditById: String + + """Last Edit By ID""" + lastEditBy: SalesforceUser + + """Last Edit Date""" + lastEditDate: String + + """Comment Body""" + commentBody: String! + + """Deleted""" + isDeleted: Boolean! + + """InsertedBy ID""" + insertedById: String! + + """InsertedBy ID""" + insertedBy: SalesforceUser! + + """Comment Type""" + commentType: String + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """Is Rich Text""" + isRichText: Boolean! + + """Is a Verified Comment""" + isVerified: Boolean! + + """Status""" + status: String + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FeedRevision""" + feedRevisions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedRevisionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedRevisionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedRevisionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedRevisions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedRevisionsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Feed Comments connection, for use in pagination.""" +type SalesforceFeedCommentsConnection { + """The count of all Feed Comment you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Feed Comments""" + nodes: [SalesforceFeedComment!]! + + """List of Feed Comment edges""" + edges: [SalesforceFeedCommentEdge!]! +} + +""" +A filter to be used against FeedAttachment object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFeedAttachmentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FeedAttachment's id field""" + id: SalesforceIdFilter + + """Filter by the FeedAttachment's feedEntityId field""" + feedEntityId: SalesforceIdFilter + + """Filter by the FeedAttachment's type field""" + type: SalesforceStringFilter + + """Filter by the FeedAttachment's recordId field""" + recordId: SalesforceIdFilter + + """Filter by the FeedAttachment's title field""" + title: SalesforceStringFilter + + """Filter by the FeedAttachment's value field""" + value: SalesforceStringFilter + + """Filter by the FeedAttachment's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFeedAttachmentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFeedAttachmentConnectionFilter!] +} + +"""Field that Feed Attachments can be sorted by""" +enum SalesforceFeedAttachmentSortByFieldEnum { + ID + FEED_ENTITY_ID + TYPE + RECORD_ID + TITLE + VALUE + IS_DELETED +} + +"""User Feed""" +type SalesforceUserFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceUser! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFeedAttachmentFeedEntityUnion = SalesforceUserFeed | SalesforceTopicFeed | SalesforceTaskFeed | SalesforceSolutionFeed | SalesforceSiteFeed | SalesforceReportFeed | SalesforceProduct2Feed | SalesforceOrderItemFeed | SalesforceOrderFeed | SalesforceOpportunityFeed | SalesforceLeadFeed | SalesforceFeedItem | SalesforceFeedComment | SalesforceEventFeed | SalesforceDashboardFeed | SalesforceDashboardComponentFeed | SalesforceContractFeed | SalesforceContentDocumentFeed | SalesforceContactFeed | SalesforceCollaborationGroupFeed | SalesforceCaseFeed | SalesforceCampaignFeed | SalesforceAssetRelationshipFeed | SalesforceAssetFeed | SalesforceAccountFeed + +"""Feed Attachment""" +type SalesforceFeedAttachment implements OneGraphNode { + """Feed Attachment ID""" + id: String! + + """Feed Entity ID""" + feedEntityId: String! + + """Feed Entity ID""" + feedEntity: SalesforceFeedAttachmentFeedEntityUnion! + + """Feed Attachment Type""" + type: String! + + """Attachment Record ID""" + recordId: String + + """Attachment Record ID""" + record: SalesforceFeedAttachmentRecordUnion + + """Feed Attachment Title""" + title: String + + """Feed Attachment Value""" + value: String + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Feed Attachments connection, for use in pagination.""" +type SalesforceFeedAttachmentsConnection { + """The count of all Feed Attachment you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Feed Attachments""" + nodes: [SalesforceFeedAttachment!]! + + """List of Feed Attachment edges""" + edges: [SalesforceFeedAttachmentEdge!]! +} + +"""Campaign Feed""" +type SalesforceCampaignFeed implements OneGraphNode { + """Feed Item ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceCampaign! + + """Feed Item Type""" + type: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Comment Count""" + commentCount: Int! + + """Like Count""" + likeCount: Int! + + """Title""" + title: String + + """Body""" + body: String + + """Link Url""" + linkUrl: String + + """Is Rich Text""" + isRichText: Boolean! + + """Related Record ID""" + relatedRecordId: String + + """Related Record ID""" + relatedRecord: SalesforceContentVersion + + """InsertedBy ID""" + insertedById: String + + """InsertedBy ID""" + insertedBy: SalesforceUser + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Campaign Feeds connection, for use in pagination.""" +type SalesforceCampaignFeedsConnection { + """The count of all Campaign Feed you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Campaign Feeds""" + nodes: [SalesforceCampaignFeed!]! + + """List of Campaign Feed edges""" + edges: [SalesforceCampaignFeedEdge!]! +} + +""" +A filter to be used against Campaign object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCampaignConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Campaign's campaignMemberRecordType relation.""" + campaignMemberRecordType: SalesforceRecordTypeConnectionFilter + + """Filter by the Campaign's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Campaign's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Campaign's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the Campaign's parent relation.""" + parent: SalesforceCampaignConnectionFilter + + """Filter by the Campaign's id field""" + id: SalesforceIdFilter + + """Filter by the Campaign's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Campaign's name field""" + name: SalesforceStringFilter + + """Filter by the Campaign's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the Campaign's type field""" + type: SalesforceStringFilter + + """Filter by the Campaign's status field""" + status: SalesforceStringFilter + + """Filter by the Campaign's startDate field""" + startDate: SalesforceDateFilter + + """Filter by the Campaign's endDate field""" + endDate: SalesforceDateFilter + + """Filter by the Campaign's expectedRevenue field""" + expectedRevenue: SalesforceFloatFilter + + """Filter by the Campaign's budgetedCost field""" + budgetedCost: SalesforceFloatFilter + + """Filter by the Campaign's actualCost field""" + actualCost: SalesforceFloatFilter + + """Filter by the Campaign's expectedResponse field""" + expectedResponse: SalesforceFloatFilter + + """Filter by the Campaign's numberSent field""" + numberSent: SalesforceFloatFilter + + """Filter by the Campaign's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the Campaign's numberOfLeads field""" + numberOfLeads: SalesforceIntFilter + + """Filter by the Campaign's numberOfConvertedLeads field""" + numberOfConvertedLeads: SalesforceIntFilter + + """Filter by the Campaign's numberOfContacts field""" + numberOfContacts: SalesforceIntFilter + + """Filter by the Campaign's numberOfResponses field""" + numberOfResponses: SalesforceIntFilter + + """Filter by the Campaign's numberOfOpportunities field""" + numberOfOpportunities: SalesforceIntFilter + + """Filter by the Campaign's numberOfWonOpportunities field""" + numberOfWonOpportunities: SalesforceIntFilter + + """Filter by the Campaign's amountAllOpportunities field""" + amountAllOpportunities: SalesforceFloatFilter + + """Filter by the Campaign's amountWonOpportunities field""" + amountWonOpportunities: SalesforceFloatFilter + + """Filter by the Campaign's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Campaign's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Campaign's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Campaign's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Campaign's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Campaign's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Campaign's lastActivityDate field""" + lastActivityDate: SalesforceDateFilter + + """Filter by the Campaign's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Campaign's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the Campaign's campaignMemberRecordTypeId field""" + campaignMemberRecordTypeId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCampaignConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCampaignConnectionFilter!] +} + +"""Field that Campaigns can be sorted by""" +enum SalesforceCampaignSortByFieldEnum { + ID + IS_DELETED + NAME + PARENT_ID + TYPE + STATUS + START_DATE + END_DATE + EXPECTED_REVENUE + BUDGETED_COST + ACTUAL_COST + EXPECTED_RESPONSE + NUMBER_SENT + IS_ACTIVE + NUMBER_OF_LEADS + NUMBER_OF_CONVERTED_LEADS + NUMBER_OF_CONTACTS + NUMBER_OF_RESPONSES + NUMBER_OF_OPPORTUNITIES + NUMBER_OF_WON_OPPORTUNITIES + AMOUNT_ALL_OPPORTUNITIES + AMOUNT_WON_OPPORTUNITIES + OWNER_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_ACTIVITY_DATE + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + CAMPAIGN_MEMBER_RECORD_TYPE_ID +} + +"""An edge in a connection.""" +type SalesforceCampaignEdge { + """The item at the end of the edge.""" + node: SalesforceCampaign! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Campaigns connection, for use in pagination.""" +type SalesforceCampaignsConnection { + """The count of all Campaign you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Campaigns""" + nodes: [SalesforceCampaign!]! + + """List of Campaign edges""" + edges: [SalesforceCampaignEdge!]! +} + +""" +A filter to be used against Attachment object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAttachmentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Attachment's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Attachment's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Attachment's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the Attachment's id field""" + id: SalesforceIdFilter + + """Filter by the Attachment's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Attachment's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the Attachment's name field""" + name: SalesforceStringFilter + + """Filter by the Attachment's isPrivate field""" + isPrivate: SalesforceBooleanFilter + + """Filter by the Attachment's contentType field""" + contentType: SalesforceStringFilter + + """Filter by the Attachment's bodyLength field""" + bodyLength: SalesforceIntFilter + + """Filter by the Attachment's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Attachment's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Attachment's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Attachment's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Attachment's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Attachment's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Attachment's description field""" + description: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAttachmentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAttachmentConnectionFilter!] +} + +"""Field that Attachments can be sorted by""" +enum SalesforceAttachmentSortByFieldEnum { + ID + IS_DELETED + PARENT_ID + NAME + IS_PRIVATE + CONTENT_TYPE + BODY_LENGTH + OWNER_ID + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + DESCRIPTION +} + +"""Campaign""" +type SalesforceCampaign implements OneGraphNode { + """Campaign ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Parent Campaign ID""" + parentId: String + + """Parent Campaign ID""" + parent: SalesforceCampaign + + """Type""" + type: String + + """Status""" + status: String + + """Start Date""" + startDate: String + + """End Date""" + endDate: String + + """Expected Revenue in Campaign""" + expectedRevenue: Float + + """Budgeted Cost in Campaign""" + budgetedCost: Float + + """Actual Cost in Campaign""" + actualCost: Float + + """Expected Response (%)""" + expectedResponse: Float + + """Num Sent in Campaign""" + numberSent: Float + + """Active""" + isActive: Boolean! + + """Description""" + description: String + + """Leads in Campaign""" + numberOfLeads: Int! + + """Converted Leads in Campaign""" + numberOfConvertedLeads: Int! + + """Contacts in Campaign""" + numberOfContacts: Int! + + """Responses in Campaign""" + numberOfResponses: Int! + + """Opportunities in Campaign""" + numberOfOpportunities: Int! + + """Won Opportunities in Campaign""" + numberOfWonOpportunities: Int! + + """Value Opportunities in Campaign""" + amountAllOpportunities: Float! + + """Value Won Opportunities in Campaign""" + amountWonOpportunities: Float! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Activity""" + lastActivityDate: String + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Record Type ID""" + campaignMemberRecordTypeId: String + + """Record Type ID""" + campaignMemberRecordType: SalesforceRecordType + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce Campaign""" + childCampaigns( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Campaigns to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignsConnection + + """Collection of Salesforce CampaignFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignFeedsConnection + + """Collection of Salesforce CampaignHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignHistorysConnection + + """Collection of Salesforce CampaignMember""" + campaignMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignMembers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignMembersConnection + + """Collection of Salesforce CampaignMemberStatus""" + campaignMemberStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignMemberStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignMemberStatusSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignMemberStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CampaignMemberStatuses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCampaignMemberStatussConnection + + """Collection of Salesforce CampaignShare""" + shares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignSharesConnection + + """Collection of Salesforce CollaborationGroupRecord""" + recordAssociatedGroups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupRecords to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupRecordsConnection + + """Collection of Salesforce ContentDistribution""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EmailMessage""" + emails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Opportunity""" + opportunities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunitySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Opportunities to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunitysConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Opportunity""" +type SalesforceOpportunity implements OneGraphNode { + """Opportunity ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Account ID""" + accountId: String + + """Account ID""" + account: SalesforceAccount + + """Private""" + isPrivate: Boolean! + + """Name""" + name: String! + + """Description""" + description: String + + """Stage""" + stageName: String! + + """Amount""" + amount: Float + + """Probability (%)""" + probability: Float + + """Expected Amount""" + expectedRevenue: Float + + """Quantity""" + totalOpportunityQuantity: Float + + """Close Date""" + closeDate: String! + + """Opportunity Type""" + type: String + + """Next Step""" + nextStep: String + + """Lead Source""" + leadSource: String + + """Closed""" + isClosed: Boolean! + + """Won""" + isWon: Boolean! + + """Forecast Category""" + forecastCategory: String! + + """Forecast Category""" + forecastCategoryName: String + + """Campaign ID""" + campaignId: String + + """Campaign ID""" + campaign: SalesforceCampaign + + """Has Line Item""" + hasOpportunityLineItem: Boolean! + + """Price Book ID""" + pricebook2Id: String + + """Price Book ID""" + pricebook2: SalesforcePricebook2 + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Activity""" + lastActivityDate: String + + """Fiscal Quarter""" + fiscalQuarter: Int + + """Fiscal Year""" + fiscalYear: Int + + """Fiscal Period""" + fiscal: String + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Has Open Activity""" + hasOpenActivity: Boolean! + + """Has Overdue Task""" + hasOverdueTask: Boolean! + + """Collection of Salesforce AccountPartner""" + accountPartners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountPartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountPartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountPartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountPartners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountPartnersConnection + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce CollaborationGroupRecord""" + recordAssociatedGroups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupRecords to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupRecordsConnection + + """Collection of Salesforce ContentDistribution""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EmailMessage""" + emails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Lead""" + leads( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Leads to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadsConnection + + """Collection of Salesforce Note""" + notes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceNoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Notes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNotesConnection + + """Collection of Salesforce OpportunityCompetitor""" + opportunityCompetitors( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityCompetitorConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityCompetitorSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityCompetitorSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityCompetitors to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityCompetitorsConnection + + """Collection of Salesforce OpportunityContactRole""" + opportunityContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityContactRoles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityContactRolesConnection + + """Collection of Salesforce OpportunityFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OpportunityFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunityFeedsConnection + + """Collection of Salesforce OpportunityFieldHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityFieldHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityFieldHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityFieldHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityFieldHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityFieldHistorysConnection + + """Collection of Salesforce OpportunityHistory""" + opportunityHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityHistorysConnection + + """Collection of Salesforce OpportunityLineItem""" + opportunityLineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityLineItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityLineItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityLineItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityLineItems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityLineItemsConnection + + """Collection of Salesforce OpportunityPartner""" + opportunityPartnersFrom( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityPartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityPartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityPartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OpportunityPartners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunityPartnersConnection + + """Collection of Salesforce OpportunityShare""" + shares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OpportunityShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunitySharesConnection + + """Collection of Salesforce Partner""" + partners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Partners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePartnersConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Opportunities connection, for use in pagination.""" +type SalesforceOpportunitysConnection { + """The count of all Opportunity you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Opportunities""" + nodes: [SalesforceOpportunity!]! + + """List of Opportunity edges""" + edges: [SalesforceOpportunityEdge!]! +} + +""" +A filter to be used against Pricebook2 object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePricebook2ConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Pricebook2's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Pricebook2's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Pricebook2's id field""" + id: SalesforceIdFilter + + """Filter by the Pricebook2's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Pricebook2's name field""" + name: SalesforceStringFilter + + """Filter by the Pricebook2's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Pricebook2's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Pricebook2's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Pricebook2's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Pricebook2's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Pricebook2's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Pricebook2's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the Pricebook2's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the Pricebook2's isArchived field""" + isArchived: SalesforceBooleanFilter + + """Filter by the Pricebook2's description field""" + description: SalesforceStringFilter + + """Filter by the Pricebook2's isStandard field""" + isStandard: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePricebook2ConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePricebook2ConnectionFilter!] +} + +""" +A filter to be used against Contract object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContractConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Contract's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Contract's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Contract's activatedBy relation.""" + activatedBy: SalesforceUserConnectionFilter + + """Filter by the Contract's customerSigned relation.""" + customerSigned: SalesforceContactConnectionFilter + + """Filter by the Contract's companySigned relation.""" + companySigned: SalesforceUserConnectionFilter + + """Filter by the Contract's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the Contract's pricebook2 relation.""" + pricebook2: SalesforcePricebook2ConnectionFilter + + """Filter by the Contract's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the Contract's id field""" + id: SalesforceIdFilter + + """Filter by the Contract's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the Contract's pricebook2Id field""" + pricebook2Id: SalesforceIdFilter + + """Filter by the Contract's ownerExpirationNotice field""" + ownerExpirationNotice: SalesforceStringFilter + + """Filter by the Contract's startDate field""" + startDate: SalesforceDateFilter + + """Filter by the Contract's endDate field""" + endDate: SalesforceDateFilter + + """Filter by the Contract's billingStreet field""" + billingStreet: SalesforceStringFilter + + """Filter by the Contract's billingCity field""" + billingCity: SalesforceStringFilter + + """Filter by the Contract's billingState field""" + billingState: SalesforceStringFilter + + """Filter by the Contract's billingPostalCode field""" + billingPostalCode: SalesforceStringFilter + + """Filter by the Contract's billingCountry field""" + billingCountry: SalesforceStringFilter + + """Filter by the Contract's billingLatitude field""" + billingLatitude: SalesforceFloatFilter + + """Filter by the Contract's billingLongitude field""" + billingLongitude: SalesforceFloatFilter + + """Filter by the Contract's billingGeocodeAccuracy field""" + billingGeocodeAccuracy: SalesforceStringFilter + + """Filter by the Contract's contractTerm field""" + contractTerm: SalesforceIntFilter + + """Filter by the Contract's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Contract's status field""" + status: SalesforceStringFilter + + """Filter by the Contract's companySignedId field""" + companySignedId: SalesforceIdFilter + + """Filter by the Contract's companySignedDate field""" + companySignedDate: SalesforceDateFilter + + """Filter by the Contract's customerSignedId field""" + customerSignedId: SalesforceIdFilter + + """Filter by the Contract's customerSignedTitle field""" + customerSignedTitle: SalesforceStringFilter + + """Filter by the Contract's customerSignedDate field""" + customerSignedDate: SalesforceDateFilter + + """Filter by the Contract's specialTerms field""" + specialTerms: SalesforceStringFilter + + """Filter by the Contract's activatedById field""" + activatedById: SalesforceIdFilter + + """Filter by the Contract's activatedDate field""" + activatedDate: SalesforceDateTimeFilter + + """Filter by the Contract's statusCode field""" + statusCode: SalesforceStringFilter + + """Filter by the Contract's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Contract's contractNumber field""" + contractNumber: SalesforceStringFilter + + """Filter by the Contract's lastApprovedDate field""" + lastApprovedDate: SalesforceDateTimeFilter + + """Filter by the Contract's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Contract's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Contract's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Contract's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Contract's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Contract's lastActivityDate field""" + lastActivityDate: SalesforceDateFilter + + """Filter by the Contract's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Contract's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContractConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContractConnectionFilter!] +} + +"""Field that Contracts can be sorted by""" +enum SalesforceContractSortByFieldEnum { + ID + ACCOUNT_ID + PRICEBOOK_2_ID + OWNER_EXPIRATION_NOTICE + START_DATE + END_DATE + BILLING_STREET + BILLING_CITY + BILLING_STATE + BILLING_POSTAL_CODE + BILLING_COUNTRY + BILLING_LATITUDE + BILLING_LONGITUDE + BILLING_GEOCODE_ACCURACY + CONTRACT_TERM + OWNER_ID + STATUS + COMPANY_SIGNED_ID + COMPANY_SIGNED_DATE + CUSTOMER_SIGNED_ID + CUSTOMER_SIGNED_TITLE + CUSTOMER_SIGNED_DATE + SPECIAL_TERMS + ACTIVATED_BY_ID + ACTIVATED_DATE + STATUS_CODE + IS_DELETED + CONTRACT_NUMBER + LAST_APPROVED_DATE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + LAST_ACTIVITY_DATE + LAST_VIEWED_DATE + LAST_REFERENCED_DATE +} + +"""An edge in a connection.""" +type SalesforceContractEdge { + """The item at the end of the edge.""" + node: SalesforceContract! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Contracts connection, for use in pagination.""" +type SalesforceContractsConnection { + """The count of all Contract you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Contracts""" + nodes: [SalesforceContract!]! + + """List of Contract edges""" + edges: [SalesforceContractEdge!]! +} + +"""Price Book""" +type SalesforcePricebook2 implements OneGraphNode { + """Price Book ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Price Book Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Active""" + isActive: Boolean! + + """Archived""" + isArchived: Boolean! + + """Description""" + description: String + + """Is Standard Price Book""" + isStandard: Boolean! + + """Collection of Salesforce Contract""" + contracts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contracts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Opportunity""" + opportunities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunitySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Opportunities to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunitysConnection + + """Collection of Salesforce Order""" + orders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Orders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrdersConnection + + """Collection of Salesforce Pricebook2History""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePricebook2HistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePricebook2HistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePricebook2HistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Pricebook2Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePricebook2HistorysConnection + + """Collection of Salesforce PricebookEntry""" + pricebookEntries( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePricebookEntryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePricebookEntrySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePricebookEntrySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of PricebookEntries to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePricebookEntrysConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Contract""" +type SalesforceContract implements OneGraphNode { + """Contract ID""" + id: String! + + """Account ID""" + accountId: String! + + """Account ID""" + account: SalesforceAccount! + + """Price Book ID""" + pricebook2Id: String + + """Price Book ID""" + pricebook2: SalesforcePricebook2 + + """Owner Expiration Notice""" + ownerExpirationNotice: String + + """Contract Start Date""" + startDate: String + + """Contract End Date""" + endDate: String + + """Billing Street""" + billingStreet: String + + """Billing City""" + billingCity: String + + """Billing State/Province""" + billingState: String + + """Billing Zip/Postal Code""" + billingPostalCode: String + + """Billing Country""" + billingCountry: String + + """Billing Latitude""" + billingLatitude: Float + + """Billing Longitude""" + billingLongitude: Float + + """Billing Geocode Accuracy""" + billingGeocodeAccuracy: String + + """Billing Address""" + billingAddress: SalesforceAddress + + """Contract Term""" + contractTerm: Int + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Status""" + status: String! + + """Company Signed By ID""" + companySignedId: String + + """Company Signed By ID""" + companySigned: SalesforceUser + + """Company Signed Date""" + companySignedDate: String + + """Customer Signed By ID""" + customerSignedId: String + + """Customer Signed By ID""" + customerSigned: SalesforceContact + + """Customer Signed Title""" + customerSignedTitle: String + + """Customer Signed Date""" + customerSignedDate: String + + """Special Terms""" + specialTerms: String + + """Activated By ID""" + activatedById: String + + """Activated By ID""" + activatedBy: SalesforceUser + + """Activated Date""" + activatedDate: String + + """Status Category""" + statusCode: String! + + """Description""" + description: String + + """Deleted""" + isDeleted: Boolean! + + """Contract Number""" + contractNumber: String! + + """Last Approved Date""" + lastApprovedDate: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Activity""" + lastActivityDate: String + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce CollaborationGroupRecord""" + recordAssociatedGroups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupRecords to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupRecordsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce ContractContactRole""" + contractContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContractContactRoles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContractContactRolesConnection + + """Collection of Salesforce ContractFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContractFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractFeedsConnection + + """Collection of Salesforce ContractHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContractHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractHistorysConnection + + """Collection of Salesforce EmailMessage""" + emails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Note""" + notes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceNoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Notes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNotesConnection + + """Collection of Salesforce Order""" + orders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Orders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrdersConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceOrderOwnerUnion = SalesforceUser | SalesforceGroup + +"""Order""" +type SalesforceOrder implements OneGraphNode { + """Order ID""" + id: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceOrderOwnerUnion! + + """Contract ID""" + contractId: String + + """Contract ID""" + contract: SalesforceContract + + """Account ID""" + accountId: String + + """Account ID""" + account: SalesforceAccount + + """Price Book ID""" + pricebook2Id: String + + """Price Book ID""" + pricebook2: SalesforcePricebook2 + + """Order ID""" + originalOrderId: String + + """Order ID""" + originalOrder: SalesforceOrder + + """Order Start Date""" + effectiveDate: String! + + """Order End Date""" + endDate: String + + """Reduction Order""" + isReductionOrder: Boolean! + + """Status""" + status: String! + + """Internal Comments""" + description: String + + """Customer Authorized By ID""" + customerAuthorizedById: String + + """Customer Authorized By ID""" + customerAuthorizedBy: SalesforceContact + + """Customer Authorized Date""" + customerAuthorizedDate: String + + """Company Authorized By ID""" + companyAuthorizedById: String + + """Company Authorized By ID""" + companyAuthorizedBy: SalesforceUser + + """Company Authorized Date""" + companyAuthorizedDate: String + + """Order Type""" + type: String + + """Billing Street""" + billingStreet: String + + """Billing City""" + billingCity: String + + """Billing State/Province""" + billingState: String + + """Billing Zip/Postal Code""" + billingPostalCode: String + + """Billing Country""" + billingCountry: String + + """Billing Latitude""" + billingLatitude: Float + + """Billing Longitude""" + billingLongitude: Float + + """Billing Geocode Accuracy""" + billingGeocodeAccuracy: String + + """Billing Address""" + billingAddress: SalesforceAddress + + """Shipping Street""" + shippingStreet: String + + """Shipping City""" + shippingCity: String + + """Shipping State/Province""" + shippingState: String + + """Shipping Zip/Postal Code""" + shippingPostalCode: String + + """Shipping Country""" + shippingCountry: String + + """Shipping Latitude""" + shippingLatitude: Float + + """Shipping Longitude""" + shippingLongitude: Float + + """Shipping Geocode Accuracy""" + shippingGeocodeAccuracy: String + + """Shipping Address""" + shippingAddress: SalesforceAddress + + """Order Name""" + name: String + + """PO Date""" + poDate: String + + """PO Number""" + poNumber: String + + """Order Reference Number""" + orderReferenceNumber: String + + """Bill To Contact ID""" + billToContactId: String + + """Bill To Contact ID""" + billToContact: SalesforceContact + + """Ship To Contact ID""" + shipToContactId: String + + """Ship To Contact ID""" + shipToContact: SalesforceContact + + """Activated Date""" + activatedDate: String + + """Activated By ID""" + activatedById: String + + """Activated By ID""" + activatedBy: SalesforceUser + + """Status Category""" + statusCode: String! + + """Order Number""" + orderNumber: String! + + """Order Amount""" + totalAmount: Float! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + + """System Modstamp""" + systemModstamp: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EmailMessage""" + emails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Note""" + notes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceNoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Notes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNotesConnection + + """Collection of Salesforce Order""" + orders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Orders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrdersConnection + + """Collection of Salesforce OrderFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderFeedsConnection + + """Collection of Salesforce OrderHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderHistorysConnection + + """Collection of Salesforce OrderItem""" + orderItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemsConnection + + """Collection of Salesforce OrderShare""" + shares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderSharesConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceOrgDeleteRequestOwnerUnion = SalesforceUser | SalesforceGroup + +"""Org Delete Request""" +type SalesforceOrgDeleteRequest implements OneGraphNode { + """Org Delete Request ID""" + id: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceOrgDeleteRequestOwnerUnion! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Request Type""" + requestType: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceProcessInstanceHistoryTargetObjectUnion = SalesforceUserProvisioningRequest | SalesforceStreamingChannel | SalesforceSolution | SalesforceProduct2 | SalesforceOrgDeleteRequest | SalesforceOrder | SalesforceOpportunity | SalesforceLead | SalesforceEmailMessage | SalesforceDuplicateRecordSet | SalesforceDuplicateRecordItem | SalesforceContract | SalesforceContact | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +union SalesforceStreamingChannelOwnerUnion = SalesforceUser | SalesforceGroup + +"""Streaming Channel""" +type SalesforceStreamingChannel implements OneGraphNode { + """Streaming Channel Id""" + id: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceStreamingChannelOwnerUnion! + + """Is Deleted""" + isDeleted: Boolean! + + """Streaming Channel Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Is Dynamically Created""" + isDynamic: Boolean! + + """Description""" + description: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceProcessInstanceTargetObjectUnion = SalesforceUserProvisioningRequest | SalesforceStreamingChannel | SalesforceSolution | SalesforceProduct2 | SalesforceOrgDeleteRequest | SalesforceOrder | SalesforceOpportunity | SalesforceLead | SalesforceEmailMessage | SalesforceDuplicateRecordSet | SalesforceDuplicateRecordItem | SalesforceContract | SalesforceContact | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +"""Field that Process Nodes can be sorted by""" +enum SalesforceProcessNodeSortByFieldEnum { + ID + NAME + DEVELOPER_NAME + PROCESS_DEFINITION_ID + DESCRIPTION + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceProcessNodeEdge { + """The item at the end of the edge.""" + node: SalesforceProcessNode! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against ProcessInstanceStep object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceProcessInstanceStepConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ProcessInstanceStep's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ProcessInstanceStep's stepNode relation.""" + stepNode: SalesforceProcessNodeConnectionFilter + + """Filter by the ProcessInstanceStep's processInstance relation.""" + processInstance: SalesforceProcessInstanceConnectionFilter + + """Filter by the ProcessInstanceStep's id field""" + id: SalesforceIdFilter + + """Filter by the ProcessInstanceStep's processInstanceId field""" + processInstanceId: SalesforceIdFilter + + """Filter by the ProcessInstanceStep's stepStatus field""" + stepStatus: SalesforceStringFilter + + """Filter by the ProcessInstanceStep's originalActorId field""" + originalActorId: SalesforceIdFilter + + """Filter by the ProcessInstanceStep's actorId field""" + actorId: SalesforceIdFilter + + """Filter by the ProcessInstanceStep's comments field""" + comments: SalesforceStringFilter + + """Filter by the ProcessInstanceStep's stepNodeId field""" + stepNodeId: SalesforceIdFilter + + """Filter by the ProcessInstanceStep's elapsedTimeInDays field""" + elapsedTimeInDays: SalesforceFloatFilter + + """Filter by the ProcessInstanceStep's elapsedTimeInHours field""" + elapsedTimeInHours: SalesforceFloatFilter + + """Filter by the ProcessInstanceStep's elapsedTimeInMinutes field""" + elapsedTimeInMinutes: SalesforceFloatFilter + + """Filter by the ProcessInstanceStep's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ProcessInstanceStep's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ProcessInstanceStep's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceProcessInstanceStepConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceProcessInstanceStepConnectionFilter!] +} + +"""Field that Process Instance Steps can be sorted by""" +enum SalesforceProcessInstanceStepSortByFieldEnum { + ID + PROCESS_INSTANCE_ID + STEP_STATUS + ORIGINAL_ACTOR_ID + ACTOR_ID + COMMENTS + STEP_NODE_ID + ELAPSED_TIME_IN_DAYS + ELAPSED_TIME_IN_HOURS + ELAPSED_TIME_IN_MINUTES + CREATED_DATE + CREATED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceProcessInstanceStepEdge { + """The item at the end of the edge.""" + node: SalesforceProcessInstanceStep! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceProcessInstanceStepActorUnion = SalesforceUser | SalesforceGroup + +union SalesforceProcessInstanceStepOriginalActorUnion = SalesforceUser | SalesforceGroup + +"""Process Instance Step""" +type SalesforceProcessInstanceStep implements OneGraphNode { + """Process Instance Step ID""" + id: String! + + """Process Instance ID""" + processInstanceId: String! + + """Process Instance ID""" + processInstance: SalesforceProcessInstance! + + """Step Status""" + stepStatus: String + + """Original Actor ID""" + originalActorId: String! + + """Original Actor ID""" + originalActor: SalesforceProcessInstanceStepOriginalActorUnion! + + """Actor ID""" + actorId: String! + + """Actor ID""" + actor: SalesforceProcessInstanceStepActorUnion! + + """Comments""" + comments: String + + """Process Node ID""" + stepNodeId: String + + """Process Node ID""" + stepNode: SalesforceProcessNode + + """Elapsed Time in Days""" + elapsedTimeInDays: Float + + """Elapsed Time in Hours""" + elapsedTimeInHours: Float + + """Elapsed Time in Minutes""" + elapsedTimeInMinutes: Float + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Process Instance Steps connection, for use in pagination.""" +type SalesforceProcessInstanceStepsConnection { + """ + The count of all Process Instance Step you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Process Instance Steps""" + nodes: [SalesforceProcessInstanceStep!]! + + """List of Process Instance Step edges""" + edges: [SalesforceProcessInstanceStepEdge!]! +} + +""" +A filter to be used against ProcessNode object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceProcessNodeConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ProcessNode's processDefinition relation.""" + processDefinition: SalesforceProcessDefinitionConnectionFilter + + """Filter by the ProcessNode's id field""" + id: SalesforceIdFilter + + """Filter by the ProcessNode's name field""" + name: SalesforceStringFilter + + """Filter by the ProcessNode's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the ProcessNode's processDefinitionId field""" + processDefinitionId: SalesforceIdFilter + + """Filter by the ProcessNode's description field""" + description: SalesforceStringFilter + + """Filter by the ProcessNode's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceProcessNodeConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceProcessNodeConnectionFilter!] +} + +""" +A filter to be used against ProcessInstanceNode object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceProcessInstanceNodeConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ProcessInstanceNode's lastActor relation.""" + lastActor: SalesforceUserConnectionFilter + + """Filter by the ProcessInstanceNode's processNode relation.""" + processNode: SalesforceProcessNodeConnectionFilter + + """Filter by the ProcessInstanceNode's processInstance relation.""" + processInstance: SalesforceProcessInstanceConnectionFilter + + """Filter by the ProcessInstanceNode's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ProcessInstanceNode's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ProcessInstanceNode's id field""" + id: SalesforceIdFilter + + """Filter by the ProcessInstanceNode's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ProcessInstanceNode's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ProcessInstanceNode's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ProcessInstanceNode's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ProcessInstanceNode's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ProcessInstanceNode's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ProcessInstanceNode's processInstanceId field""" + processInstanceId: SalesforceIdFilter + + """Filter by the ProcessInstanceNode's processNodeId field""" + processNodeId: SalesforceIdFilter + + """Filter by the ProcessInstanceNode's nodeStatus field""" + nodeStatus: SalesforceStringFilter + + """Filter by the ProcessInstanceNode's completedDate field""" + completedDate: SalesforceDateTimeFilter + + """Filter by the ProcessInstanceNode's lastActorId field""" + lastActorId: SalesforceIdFilter + + """Filter by the ProcessInstanceNode's processNodeName field""" + processNodeName: SalesforceStringFilter + + """Filter by the ProcessInstanceNode's elapsedTimeInDays field""" + elapsedTimeInDays: SalesforceFloatFilter + + """Filter by the ProcessInstanceNode's elapsedTimeInHours field""" + elapsedTimeInHours: SalesforceFloatFilter + + """Filter by the ProcessInstanceNode's elapsedTimeInMinutes field""" + elapsedTimeInMinutes: SalesforceFloatFilter + + """Checks for any expressions in this list.""" + or: [SalesforceProcessInstanceNodeConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceProcessInstanceNodeConnectionFilter!] +} + +"""Field that Process Instance Nodes can be sorted by""" +enum SalesforceProcessInstanceNodeSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + PROCESS_INSTANCE_ID + PROCESS_NODE_ID + NODE_STATUS + COMPLETED_DATE + LAST_ACTOR_ID + PROCESS_NODE_NAME + ELAPSED_TIME_IN_DAYS + ELAPSED_TIME_IN_HOURS + ELAPSED_TIME_IN_MINUTES +} + +"""An edge in a connection.""" +type SalesforceProcessInstanceNodeEdge { + """The item at the end of the edge.""" + node: SalesforceProcessInstanceNode! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Process Instance Node""" +type SalesforceProcessInstanceNode implements OneGraphNode { + """Process Instance Node ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Process Instance ID""" + processInstanceId: String! + + """Process Instance ID""" + processInstance: SalesforceProcessInstance! + + """Process Node ID""" + processNodeId: String! + + """Process Node ID""" + processNode: SalesforceProcessNode! + + """Node Status""" + nodeStatus: String + + """Completed Date""" + completedDate: String + + """User ID""" + lastActorId: String + + """User ID""" + lastActor: SalesforceUser + + """Name""" + processNodeName: String + + """Elapsed Time in Days""" + elapsedTimeInDays: Float + + """Elapsed Time in Hours""" + elapsedTimeInHours: Float + + """Elapsed Time in Minutes""" + elapsedTimeInMinutes: Float + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Process Instance Nodes connection, for use in pagination.""" +type SalesforceProcessInstanceNodesConnection { + """ + The count of all Process Instance Node you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Process Instance Nodes""" + nodes: [SalesforceProcessInstanceNode!]! + + """List of Process Instance Node edges""" + edges: [SalesforceProcessInstanceNodeEdge!]! +} + +"""Process Node""" +type SalesforceProcessNode implements OneGraphNode { + """Process Node ID""" + id: String! + + """Name""" + name: String! + + """Unique Name""" + developerName: String! + + """Approval Process ID""" + processDefinitionId: String! + + """Approval Process ID""" + processDefinition: SalesforceProcessDefinition! + + """Description""" + description: String + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce ProcessInstanceNode""" + processInstanceNodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceNodeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceNodeSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceNodeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ProcessInstanceNodes to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceProcessInstanceNodesConnection + + """Collection of Salesforce ProcessInstanceStep""" + processInstanceSteps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceStepConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceStepSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceStepSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ProcessInstanceSteps to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceProcessInstanceStepsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Process Nodes connection, for use in pagination.""" +type SalesforceProcessNodesConnection { + """The count of all Process Node you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Process Nodes""" + nodes: [SalesforceProcessNode!]! + + """List of Process Node edges""" + edges: [SalesforceProcessNodeEdge!]! +} + +""" +A filter to be used against ProcessDefinition object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceProcessDefinitionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ProcessDefinition's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ProcessDefinition's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ProcessDefinition's id field""" + id: SalesforceIdFilter + + """Filter by the ProcessDefinition's name field""" + name: SalesforceStringFilter + + """Filter by the ProcessDefinition's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the ProcessDefinition's type field""" + type: SalesforceStringFilter + + """Filter by the ProcessDefinition's description field""" + description: SalesforceStringFilter + + """Filter by the ProcessDefinition's tableEnumOrId field""" + tableEnumOrId: SalesforceStringFilter + + """Filter by the ProcessDefinition's lockType field""" + lockType: SalesforceStringFilter + + """Filter by the ProcessDefinition's state field""" + state: SalesforceStringFilter + + """Filter by the ProcessDefinition's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ProcessDefinition's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ProcessDefinition's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ProcessDefinition's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ProcessDefinition's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceProcessDefinitionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceProcessDefinitionConnectionFilter!] +} + +""" +A filter to be used against ProcessInstance object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceProcessInstanceConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ProcessInstance's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ProcessInstance's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ProcessInstance's submittedBy relation.""" + submittedBy: SalesforceUserConnectionFilter + + """Filter by the ProcessInstance's lastActor relation.""" + lastActor: SalesforceUserConnectionFilter + + """Filter by the ProcessInstance's processDefinition relation.""" + processDefinition: SalesforceProcessDefinitionConnectionFilter + + """Filter by the ProcessInstance's id field""" + id: SalesforceIdFilter + + """Filter by the ProcessInstance's processDefinitionId field""" + processDefinitionId: SalesforceIdFilter + + """Filter by the ProcessInstance's targetObjectId field""" + targetObjectId: SalesforceIdFilter + + """Filter by the ProcessInstance's status field""" + status: SalesforceStringFilter + + """Filter by the ProcessInstance's completedDate field""" + completedDate: SalesforceDateTimeFilter + + """Filter by the ProcessInstance's lastActorId field""" + lastActorId: SalesforceIdFilter + + """Filter by the ProcessInstance's elapsedTimeInDays field""" + elapsedTimeInDays: SalesforceFloatFilter + + """Filter by the ProcessInstance's elapsedTimeInHours field""" + elapsedTimeInHours: SalesforceFloatFilter + + """Filter by the ProcessInstance's elapsedTimeInMinutes field""" + elapsedTimeInMinutes: SalesforceFloatFilter + + """Filter by the ProcessInstance's submittedById field""" + submittedById: SalesforceIdFilter + + """Filter by the ProcessInstance's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ProcessInstance's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ProcessInstance's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ProcessInstance's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ProcessInstance's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ProcessInstance's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceProcessInstanceConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceProcessInstanceConnectionFilter!] +} + +"""Field that Process Instances can be sorted by""" +enum SalesforceProcessInstanceSortByFieldEnum { + ID + PROCESS_DEFINITION_ID + TARGET_OBJECT_ID + STATUS + COMPLETED_DATE + LAST_ACTOR_ID + ELAPSED_TIME_IN_DAYS + ELAPSED_TIME_IN_HOURS + ELAPSED_TIME_IN_MINUTES + SUBMITTED_BY_ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""Process Definition""" +type SalesforceProcessDefinition implements OneGraphNode { + """Approval Process ID""" + id: String! + + """Name""" + name: String! + + """Unique Name""" + developerName: String! + + """Process Definition Type""" + type: String! + + """Description""" + description: String + + """Custom Object Definition ID""" + tableEnumOrId: String! + + """Lock Type""" + lockType: String! + + """State""" + state: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce ProcessNode""" + processNodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessNodeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessNodeSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessNodeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessNodes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessNodesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Process Instance""" +type SalesforceProcessInstance implements OneGraphNode { + """Process Instance ID""" + id: String! + + """Approval Process ID""" + processDefinitionId: String! + + """Approval Process ID""" + processDefinition: SalesforceProcessDefinition! + + """Target Object ID""" + targetObjectId: String! + + """Target Object ID""" + targetObject: SalesforceProcessInstanceTargetObjectUnion! + + """Status""" + status: String! + + """Completed Date""" + completedDate: String + + """User ID""" + lastActorId: String + + """User ID""" + lastActor: SalesforceUser + + """Elapsed Time in Days""" + elapsedTimeInDays: Float + + """Elapsed Time in Hours""" + elapsedTimeInHours: Float + + """Elapsed Time in Minutes""" + elapsedTimeInMinutes: Float + + """User ID""" + submittedById: String + + """User ID""" + submittedBy: SalesforceUser + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ProcessInstanceNode""" + nodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceNodeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceNodeSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceNodeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ProcessInstanceNodes to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceProcessInstanceNodesConnection + + """Collection of Salesforce ProcessInstanceStep""" + steps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceStepConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceStepSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceStepSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ProcessInstanceSteps to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceProcessInstanceStepsConnection + + """Collection of Salesforce ProcessInstanceWorkitem""" + workitems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceWorkitemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceWorkitemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceWorkitemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ProcessInstanceWorkitems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceProcessInstanceWorkitemsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Process Instances connection, for use in pagination.""" +type SalesforceProcessInstancesConnection { + """The count of all Process Instance you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Process Instances""" + nodes: [SalesforceProcessInstance!]! + + """List of Process Instance edges""" + edges: [SalesforceProcessInstanceEdge!]! +} + +""" +A filter to be used against UserProvAccountStaging object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserProvAccountStagingConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserProvAccountStaging's salesforceUser relation.""" + salesforceUser: SalesforceUserConnectionFilter + + """Filter by the UserProvAccountStaging's connectedApp relation.""" + connectedApp: SalesforceConnectedApplicationConnectionFilter + + """Filter by the UserProvAccountStaging's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserProvAccountStaging's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserProvAccountStaging's id field""" + id: SalesforceIdFilter + + """Filter by the UserProvAccountStaging's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UserProvAccountStaging's name field""" + name: SalesforceStringFilter + + """Filter by the UserProvAccountStaging's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserProvAccountStaging's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserProvAccountStaging's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserProvAccountStaging's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserProvAccountStaging's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserProvAccountStaging's connectedAppId field""" + connectedAppId: SalesforceIdFilter + + """Filter by the UserProvAccountStaging's salesforceUserId field""" + salesforceUserId: SalesforceIdFilter + + """Filter by the UserProvAccountStaging's externalUserId field""" + externalUserId: SalesforceStringFilter + + """Filter by the UserProvAccountStaging's externalUsername field""" + externalUsername: SalesforceStringFilter + + """Filter by the UserProvAccountStaging's externalEmail field""" + externalEmail: SalesforceStringFilter + + """Filter by the UserProvAccountStaging's externalFirstName field""" + externalFirstName: SalesforceStringFilter + + """Filter by the UserProvAccountStaging's externalLastName field""" + externalLastName: SalesforceStringFilter + + """Filter by the UserProvAccountStaging's linkState field""" + linkState: SalesforceStringFilter + + """Filter by the UserProvAccountStaging's status field""" + status: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserProvAccountStagingConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserProvAccountStagingConnectionFilter!] +} + +"""Field that User Provisioning Account Stagings can be sorted by""" +enum SalesforceUserProvAccountStagingSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + CONNECTED_APP_ID + SALESFORCE_USER_ID + EXTERNAL_USER_ID + EXTERNAL_USERNAME + EXTERNAL_EMAIL + EXTERNAL_FIRST_NAME + EXTERNAL_LAST_NAME + LINK_STATE + STATUS +} + +"""An edge in a connection.""" +type SalesforceUserProvAccountStagingEdge { + """The item at the end of the edge.""" + node: SalesforceUserProvAccountStaging! + + """A cursor for use in pagination""" + cursor: String! +} + +"""User Provisioning Account Staging""" +type SalesforceUserProvAccountStaging implements OneGraphNode { + """User Provisioning Account Staging Id""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Connected App ID""" + connectedAppId: String + + """Connected App ID""" + connectedApp: SalesforceConnectedApplication + + """User ID""" + salesforceUserId: String + + """User ID""" + salesforceUser: SalesforceUser + + """External User Id""" + externalUserId: String + + """External Username""" + externalUsername: String + + """External Email""" + externalEmail: String + + """External First Name""" + externalFirstName: String + + """External Last Name""" + externalLastName: String + + """Link State""" + linkState: String! + + """Status""" + status: String! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce User Provisioning Account Stagings connection, for use in pagination. +""" +type SalesforceUserProvAccountStagingsConnection { + """ + The count of all User Provisioning Account Staging you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Provisioning Account Stagings""" + nodes: [SalesforceUserProvAccountStaging!]! + + """List of User Provisioning Account Staging edges""" + edges: [SalesforceUserProvAccountStagingEdge!]! +} + +"""Field that User Provisioning Accounts can be sorted by""" +enum SalesforceUserProvAccountSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + SALESFORCE_USER_ID + CONNECTED_APP_ID + EXTERNAL_USER_ID + EXTERNAL_USERNAME + EXTERNAL_EMAIL + EXTERNAL_FIRST_NAME + EXTERNAL_LAST_NAME + LINK_STATE + STATUS + DELETED_DATE + IS_KNOWN_LINK +} + +"""An edge in a connection.""" +type SalesforceUserProvAccountEdge { + """The item at the end of the edge.""" + node: SalesforceUserProvAccount! + + """A cursor for use in pagination""" + cursor: String! +} + +"""User Provisioning Account""" +type SalesforceUserProvAccount implements OneGraphNode { + """User Provisioning Account ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """User ID""" + salesforceUserId: String + + """User ID""" + salesforceUser: SalesforceUser + + """Connected App ID""" + connectedAppId: String + + """Connected App ID""" + connectedApp: SalesforceConnectedApplication + + """External User Id""" + externalUserId: String + + """External Username""" + externalUsername: String + + """External Email""" + externalEmail: String + + """External First Name""" + externalFirstName: String + + """External Last Name""" + externalLastName: String + + """Link State""" + linkState: String! + + """Status""" + status: String! + + """Deleted Date""" + deletedDate: String + + """Manual Override""" + isKnownLink: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce UserProvisioningRequest""" + userProvisioningRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningRequestSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningRequests to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningRequestsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce User Provisioning Accounts connection, for use in pagination. +""" +type SalesforceUserProvAccountsConnection { + """ + The count of all User Provisioning Account you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Provisioning Accounts""" + nodes: [SalesforceUserProvAccount!]! + + """List of User Provisioning Account edges""" + edges: [SalesforceUserProvAccountEdge!]! +} + +""" +A filter to be used against UserAppMenuCustomization object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserAppMenuCustomizationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserAppMenuCustomization's application relation.""" + application: SalesforceConnectedApplicationConnectionFilter + + """Filter by the UserAppMenuCustomization's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserAppMenuCustomization's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserAppMenuCustomization's id field""" + id: SalesforceIdFilter + + """Filter by the UserAppMenuCustomization's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the UserAppMenuCustomization's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UserAppMenuCustomization's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserAppMenuCustomization's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserAppMenuCustomization's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserAppMenuCustomization's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserAppMenuCustomization's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserAppMenuCustomization's applicationId field""" + applicationId: SalesforceIdFilter + + """Filter by the UserAppMenuCustomization's sortOrder field""" + sortOrder: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserAppMenuCustomizationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserAppMenuCustomizationConnectionFilter!] +} + +"""Field that UserAppMenuCustomizations can be sorted by""" +enum SalesforceUserAppMenuCustomizationSortByFieldEnum { + ID + OWNER_ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + APPLICATION_ID + SORT_ORDER +} + +"""An edge in a connection.""" +type SalesforceUserAppMenuCustomizationEdge { + """The item at the end of the edge.""" + node: SalesforceUserAppMenuCustomization! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceUserAppMenuCustomizationOwnerUnion = SalesforceUser | SalesforceGroup + +"""UserAppMenuCustomization""" +type SalesforceUserAppMenuCustomization implements OneGraphNode { + """UserAppMenuCustomization ID""" + id: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUserAppMenuCustomizationOwnerUnion! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Application ID""" + applicationId: String + + """Application ID""" + application: SalesforceConnectedApplication + + """Sort Order""" + sortOrder: Int + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce UserAppMenuCustomizations connection, for use in pagination. +""" +type SalesforceUserAppMenuCustomizationsConnection { + """ + The count of all UserAppMenuCustomization you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce UserAppMenuCustomizations""" + nodes: [SalesforceUserAppMenuCustomization!]! + + """List of UserAppMenuCustomization edges""" + edges: [SalesforceUserAppMenuCustomizationEdge!]! +} + +""" +A filter to be used against InstalledMobileApp object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceInstalledMobileAppConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the InstalledMobileApp's connectedApplication relation.""" + connectedApplication: SalesforceConnectedApplicationConnectionFilter + + """Filter by the InstalledMobileApp's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the InstalledMobileApp's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the InstalledMobileApp's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the InstalledMobileApp's id field""" + id: SalesforceIdFilter + + """Filter by the InstalledMobileApp's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the InstalledMobileApp's name field""" + name: SalesforceStringFilter + + """Filter by the InstalledMobileApp's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the InstalledMobileApp's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the InstalledMobileApp's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the InstalledMobileApp's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the InstalledMobileApp's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the InstalledMobileApp's status field""" + status: SalesforceStringFilter + + """Filter by the InstalledMobileApp's userId field""" + userId: SalesforceIdFilter + + """Filter by the InstalledMobileApp's connectedApplicationId field""" + connectedApplicationId: SalesforceIdFilter + + """Filter by the InstalledMobileApp's version field""" + version: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceInstalledMobileAppConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceInstalledMobileAppConnectionFilter!] +} + +"""Field that Installed Mobile Apps can be sorted by""" +enum SalesforceInstalledMobileAppSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + STATUS + USER_ID + CONNECTED_APPLICATION_ID + VERSION +} + +"""An edge in a connection.""" +type SalesforceInstalledMobileAppEdge { + """The item at the end of the edge.""" + node: SalesforceInstalledMobileApp! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Installed Mobile App""" +type SalesforceInstalledMobileApp implements OneGraphNode { + """Installed Mobile App Id""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Installed Mobile App Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Status""" + status: String! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Connected Application ID""" + connectedApplicationId: String! + + """Connected Application ID""" + connectedApplication: SalesforceConnectedApplication! + + """Version""" + version: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Installed Mobile Apps connection, for use in pagination.""" +type SalesforceInstalledMobileAppsConnection { + """ + The count of all Installed Mobile App you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Installed Mobile Apps""" + nodes: [SalesforceInstalledMobileApp!]! + + """List of Installed Mobile App edges""" + edges: [SalesforceInstalledMobileAppEdge!]! +} + +"""An edge in a connection.""" +type SalesforceIdpEventLogEdge { + """The item at the end of the edge.""" + node: SalesforceIdpEventLog! + + """A cursor for use in pagination""" + cursor: String! +} + +"""An edge in a connection.""" +type SalesforceSessionPermSetActivationEdge { + """The item at the end of the edge.""" + node: SalesforceSessionPermSetActivation! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against SessionPermSetActivation object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSessionPermSetActivationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SessionPermSetActivation's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the SessionPermSetActivation's permissionSet relation.""" + permissionSet: SalesforcePermissionSetConnectionFilter + + """Filter by the SessionPermSetActivation's authSession relation.""" + authSession: SalesforceAuthSessionConnectionFilter + + """Filter by the SessionPermSetActivation's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the SessionPermSetActivation's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the SessionPermSetActivation's id field""" + id: SalesforceIdFilter + + """Filter by the SessionPermSetActivation's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the SessionPermSetActivation's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the SessionPermSetActivation's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the SessionPermSetActivation's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the SessionPermSetActivation's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the SessionPermSetActivation's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the SessionPermSetActivation's authSessionId field""" + authSessionId: SalesforceIdFilter + + """Filter by the SessionPermSetActivation's permissionSetId field""" + permissionSetId: SalesforceIdFilter + + """Filter by the SessionPermSetActivation's userId field""" + userId: SalesforceIdFilter + + """Filter by the SessionPermSetActivation's description field""" + description: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSessionPermSetActivationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSessionPermSetActivationConnectionFilter!] +} + +"""Field that Session Permission Set Activations can be sorted by""" +enum SalesforceSessionPermSetActivationSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + AUTH_SESSION_ID + PERMISSION_SET_ID + USER_ID + DESCRIPTION +} + +""" +A filter to be used against PermissionSetAssignment object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePermissionSetAssignmentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the PermissionSetAssignment's assignee relation.""" + assignee: SalesforceUserConnectionFilter + + """Filter by the PermissionSetAssignment's permissionSet relation.""" + permissionSet: SalesforcePermissionSetConnectionFilter + + """Filter by the PermissionSetAssignment's id field""" + id: SalesforceIdFilter + + """Filter by the PermissionSetAssignment's permissionSetId field""" + permissionSetId: SalesforceIdFilter + + """Filter by the PermissionSetAssignment's assigneeId field""" + assigneeId: SalesforceIdFilter + + """Filter by the PermissionSetAssignment's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePermissionSetAssignmentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePermissionSetAssignmentConnectionFilter!] +} + +"""Field that Permission Set Assignments can be sorted by""" +enum SalesforcePermissionSetAssignmentSortByFieldEnum { + ID + PERMISSION_SET_ID + ASSIGNEE_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforcePermissionSetAssignmentEdge { + """The item at the end of the edge.""" + node: SalesforcePermissionSetAssignment! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Permission Set Assignment""" +type SalesforcePermissionSetAssignment implements OneGraphNode { + """PermissionSetAssignment ID""" + id: String! + + """PermissionSet ID""" + permissionSetId: String + + """PermissionSet ID""" + permissionSet: SalesforcePermissionSet + + """Assignee ID""" + assigneeId: String! + + """Assignee ID""" + assignee: SalesforceUser! + + """Date Assigned""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Permission Set Assignments connection, for use in pagination. +""" +type SalesforcePermissionSetAssignmentsConnection { + """ + The count of all Permission Set Assignment you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Permission Set Assignments""" + nodes: [SalesforcePermissionSetAssignment!]! + + """List of Permission Set Assignment edges""" + edges: [SalesforcePermissionSetAssignmentEdge!]! +} + +""" +A filter to be used against ObjectPermissions object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceObjectPermissionsConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ObjectPermissions's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ObjectPermissions's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ObjectPermissions's parent relation.""" + parent: SalesforcePermissionSetConnectionFilter + + """Filter by the ObjectPermissions's id field""" + id: SalesforceIdFilter + + """Filter by the ObjectPermissions's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the ObjectPermissions's sobjectType field""" + sobjectType: SalesforceStringFilter + + """Filter by the ObjectPermissions's permissionsCreate field""" + permissionsCreate: SalesforceBooleanFilter + + """Filter by the ObjectPermissions's permissionsRead field""" + permissionsRead: SalesforceBooleanFilter + + """Filter by the ObjectPermissions's permissionsEdit field""" + permissionsEdit: SalesforceBooleanFilter + + """Filter by the ObjectPermissions's permissionsDelete field""" + permissionsDelete: SalesforceBooleanFilter + + """Filter by the ObjectPermissions's permissionsViewAllRecords field""" + permissionsViewAllRecords: SalesforceBooleanFilter + + """Filter by the ObjectPermissions's permissionsModifyAllRecords field""" + permissionsModifyAllRecords: SalesforceBooleanFilter + + """Filter by the ObjectPermissions's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ObjectPermissions's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ObjectPermissions's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ObjectPermissions's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ObjectPermissions's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceObjectPermissionsConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceObjectPermissionsConnectionFilter!] +} + +"""Field that Object Permissions can be sorted by""" +enum SalesforceObjectPermissionsSortByFieldEnum { + ID + PARENT_ID + SOBJECT_TYPE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceObjectPermissionsEdge { + """The item at the end of the edge.""" + node: SalesforceObjectPermissions! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Object Permissions""" +type SalesforceObjectPermissions implements OneGraphNode { + """ObjectPermissions ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforcePermissionSet! + + """Sobject Type Name""" + sobjectType: String! + + """Create Records""" + permissionsCreate: Boolean! + + """Read Records""" + permissionsRead: Boolean! + + """Edit Records""" + permissionsEdit: Boolean! + + """Delete Records""" + permissionsDelete: Boolean! + + """Read All Records""" + permissionsViewAllRecords: Boolean! + + """Edit All Records""" + permissionsModifyAllRecords: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Object Permissions connection, for use in pagination.""" +type SalesforceObjectPermissionssConnection { + """The count of all Object Permissions you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Object Permissions""" + nodes: [SalesforceObjectPermissions!]! + + """List of Object Permissions edges""" + edges: [SalesforceObjectPermissionsEdge!]! +} + +""" +A filter to be used against FieldPermissions object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFieldPermissionsConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FieldPermissions's parent relation.""" + parent: SalesforcePermissionSetConnectionFilter + + """Filter by the FieldPermissions's id field""" + id: SalesforceIdFilter + + """Filter by the FieldPermissions's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the FieldPermissions's sobjectType field""" + sobjectType: SalesforceStringFilter + + """Filter by the FieldPermissions's field field""" + field: SalesforceStringFilter + + """Filter by the FieldPermissions's permissionsEdit field""" + permissionsEdit: SalesforceBooleanFilter + + """Filter by the FieldPermissions's permissionsRead field""" + permissionsRead: SalesforceBooleanFilter + + """Filter by the FieldPermissions's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFieldPermissionsConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFieldPermissionsConnectionFilter!] +} + +"""Field that Field Permissions can be sorted by""" +enum SalesforceFieldPermissionsSortByFieldEnum { + ID + PARENT_ID + SOBJECT_TYPE + FIELD + PERMISSIONS_EDIT + PERMISSIONS_READ + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceFieldPermissionsEdge { + """The item at the end of the edge.""" + node: SalesforceFieldPermissions! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Field Permissions""" +type SalesforceFieldPermissions implements OneGraphNode { + """Field Permissions ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforcePermissionSet! + + """Sobject Type Name""" + sobjectType: String! + + """Field Name""" + field: String! + + """Edit Field""" + permissionsEdit: Boolean! + + """Read Field""" + permissionsRead: Boolean! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Field Permissions connection, for use in pagination.""" +type SalesforceFieldPermissionssConnection { + """The count of all Field Permissions you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Field Permissions""" + nodes: [SalesforceFieldPermissions!]! + + """List of Field Permissions edges""" + edges: [SalesforceFieldPermissionsEdge!]! +} + +""" +A filter to be used against PermissionSetLicenseAssign object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePermissionSetLicenseAssignConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the PermissionSetLicenseAssign's assignee relation.""" + assignee: SalesforceUserConnectionFilter + + """ + Filter by the PermissionSetLicenseAssign's permissionSetLicense relation. + """ + permissionSetLicense: SalesforcePermissionSetLicenseConnectionFilter + + """Filter by the PermissionSetLicenseAssign's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the PermissionSetLicenseAssign's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the PermissionSetLicenseAssign's id field""" + id: SalesforceIdFilter + + """Filter by the PermissionSetLicenseAssign's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the PermissionSetLicenseAssign's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the PermissionSetLicenseAssign's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the PermissionSetLicenseAssign's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the PermissionSetLicenseAssign's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the PermissionSetLicenseAssign's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """ + Filter by the PermissionSetLicenseAssign's permissionSetLicenseId field + """ + permissionSetLicenseId: SalesforceIdFilter + + """Filter by the PermissionSetLicenseAssign's assigneeId field""" + assigneeId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePermissionSetLicenseAssignConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePermissionSetLicenseAssignConnectionFilter!] +} + +"""Field that Permission Set License Assignments can be sorted by""" +enum SalesforcePermissionSetLicenseAssignSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + PERMISSION_SET_LICENSE_ID + ASSIGNEE_ID +} + +"""An edge in a connection.""" +type SalesforcePermissionSetLicenseAssignEdge { + """The item at the end of the edge.""" + node: SalesforcePermissionSetLicenseAssign! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Permission Set License Assignment""" +type SalesforcePermissionSetLicenseAssign implements OneGraphNode { + """Permission Set License Assignment ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Date Assigned""" + systemModstamp: String! + + """Permission Set License ID""" + permissionSetLicenseId: String! + + """Permission Set License ID""" + permissionSetLicense: SalesforcePermissionSetLicense! + + """User ID""" + assigneeId: String! + + """User ID""" + assignee: SalesforceUser! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Permission Set License Assignments connection, for use in pagination. +""" +type SalesforcePermissionSetLicenseAssignsConnection { + """ + The count of all Permission Set License Assignment you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Permission Set License Assignments""" + nodes: [SalesforcePermissionSetLicenseAssign!]! + + """List of Permission Set License Assignment edges""" + edges: [SalesforcePermissionSetLicenseAssignEdge!]! +} + +"""An edge in a connection.""" +type SalesforceGrantedByLicenseEdge { + """The item at the end of the edge.""" + node: SalesforceGrantedByLicense! + + """A cursor for use in pagination""" + cursor: String! +} + +"""An edge in a connection.""" +type SalesforceSetupEntityAccessEdge { + """The item at the end of the edge.""" + node: SalesforceSetupEntityAccess! + + """A cursor for use in pagination""" + cursor: String! +} + +"""An edge in a connection.""" +type SalesforceWebLinkEdge { + """The item at the end of the edge.""" + node: SalesforceWebLink! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against WebLink object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceWebLinkConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the WebLink's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the WebLink's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the WebLink's id field""" + id: SalesforceIdFilter + + """Filter by the WebLink's pageOrSobjectType field""" + pageOrSobjectType: SalesforceStringFilter + + """Filter by the WebLink's name field""" + name: SalesforceStringFilter + + """Filter by the WebLink's isProtected field""" + isProtected: SalesforceBooleanFilter + + """Filter by the WebLink's encodingKey field""" + encodingKey: SalesforceStringFilter + + """Filter by the WebLink's linkType field""" + linkType: SalesforceStringFilter + + """Filter by the WebLink's openType field""" + openType: SalesforceStringFilter + + """Filter by the WebLink's height field""" + height: SalesforceIntFilter + + """Filter by the WebLink's width field""" + width: SalesforceIntFilter + + """Filter by the WebLink's showsLocation field""" + showsLocation: SalesforceBooleanFilter + + """Filter by the WebLink's hasScrollbars field""" + hasScrollbars: SalesforceBooleanFilter + + """Filter by the WebLink's hasToolbar field""" + hasToolbar: SalesforceBooleanFilter + + """Filter by the WebLink's hasMenubar field""" + hasMenubar: SalesforceBooleanFilter + + """Filter by the WebLink's showsStatus field""" + showsStatus: SalesforceBooleanFilter + + """Filter by the WebLink's isResizable field""" + isResizable: SalesforceBooleanFilter + + """Filter by the WebLink's position field""" + position: SalesforceStringFilter + + """Filter by the WebLink's scontrolId field""" + scontrolId: SalesforceIdFilter + + """Filter by the WebLink's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the WebLink's description field""" + description: SalesforceStringFilter + + """Filter by the WebLink's displayType field""" + displayType: SalesforceStringFilter + + """Filter by the WebLink's requireRowSelection field""" + requireRowSelection: SalesforceBooleanFilter + + """Filter by the WebLink's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the WebLink's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the WebLink's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the WebLink's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the WebLink's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the WebLink's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceWebLinkConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceWebLinkConnectionFilter!] +} + +"""Field that Custom Button or Links can be sorted by""" +enum SalesforceWebLinkSortByFieldEnum { + ID + PAGE_OR_SOBJECT_TYPE + NAME + IS_PROTECTED + ENCODING_KEY + LINK_TYPE + OPEN_TYPE + HEIGHT + WIDTH + SHOWS_LOCATION + HAS_SCROLLBARS + HAS_TOOLBAR + HAS_MENUBAR + SHOWS_STATUS + IS_RESIZABLE + POSITION + SCONTROL_ID + MASTER_LABEL + DESCRIPTION + DISPLAY_TYPE + REQUIRE_ROW_SELECTION + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP +} + +"""Custom S-Control""" +type SalesforceScontrol implements OneGraphNode { + """Custom S-Control ID""" + id: String! + + """Label""" + name: String! + + """S-Control Name""" + developerName: String! + + """Description""" + description: String + + """Encoding""" + encodingKey: String! + + """HTML Body""" + htmlWrapper: String! + + """Filename""" + filename: String + + """Binary Length""" + bodyLength: Int! + + """Binary""" + binary: String + + """Type""" + contentSource: String + + """Prebuild In Page""" + supportsCaching: Boolean! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce WebLink""" + webLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceWebLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceWebLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceWebLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of WebLinks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceWebLinksConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceWebLinkScontrolUnion = SalesforceScontrol | SalesforceApexPage + +"""Custom Button or Link""" +type SalesforceWebLink implements OneGraphNode { + """Custom Link ID""" + id: String! + + """Page Or sObject Type Name""" + pageOrSobjectType: String! + + """Name""" + name: String! + + """Protected Component""" + isProtected: Boolean! + + """URL""" + url: String + + """Link Encoding""" + encodingKey: String! + + """Content Source""" + linkType: String! + + """Behavior""" + openType: String! + + """Height (in pixels)""" + height: Int + + """Width (in pixels)""" + width: Int + + """Show Address Bar""" + showsLocation: Boolean! + + """Show Scrollbars""" + hasScrollbars: Boolean! + + """Show Toolbars""" + hasToolbar: Boolean! + + """Show Menu Bar""" + hasMenubar: Boolean! + + """Show Status Bar""" + showsStatus: Boolean! + + """Resizeable""" + isResizable: Boolean! + + """Window Position""" + position: String + + """Custom S-Control ID""" + scontrolId: String + + """Custom S-Control ID""" + scontrol: SalesforceWebLinkScontrolUnion + + """Label""" + masterLabel: String + + """Description""" + description: String + + """Display Type""" + displayType: String! + + """Require Row Selection""" + requireRowSelection: Boolean! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Custom Button or Links connection, for use in pagination.""" +type SalesforceWebLinksConnection { + """ + The count of all Custom Button or Link you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Custom Button or Links""" + nodes: [SalesforceWebLink!]! + + """List of Custom Button or Link edges""" + edges: [SalesforceWebLinkEdge!]! +} + +""" +A filter to be used against ApexPage object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceApexPageConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ApexPage's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ApexPage's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ApexPage's id field""" + id: SalesforceIdFilter + + """Filter by the ApexPage's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the ApexPage's name field""" + name: SalesforceStringFilter + + """Filter by the ApexPage's apiVersion field""" + apiVersion: SalesforceFloatFilter + + """Filter by the ApexPage's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the ApexPage's description field""" + description: SalesforceStringFilter + + """Filter by the ApexPage's controllerType field""" + controllerType: SalesforceStringFilter + + """Filter by the ApexPage's controllerKey field""" + controllerKey: SalesforceStringFilter + + """Filter by the ApexPage's isAvailableInTouch field""" + isAvailableInTouch: SalesforceBooleanFilter + + """Filter by the ApexPage's isConfirmationTokenRequired field""" + isConfirmationTokenRequired: SalesforceBooleanFilter + + """Filter by the ApexPage's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ApexPage's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ApexPage's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ApexPage's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ApexPage's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceApexPageConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceApexPageConnectionFilter!] +} + +""" +A filter to be used against VisualforceAccessMetrics object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceVisualforceAccessMetricsConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the VisualforceAccessMetrics's apexPage relation.""" + apexPage: SalesforceApexPageConnectionFilter + + """Filter by the VisualforceAccessMetrics's id field""" + id: SalesforceIdFilter + + """Filter by the VisualforceAccessMetrics's metricsDate field""" + metricsDate: SalesforceDateFilter + + """Filter by the VisualforceAccessMetrics's apexPageId field""" + apexPageId: SalesforceIdFilter + + """Filter by the VisualforceAccessMetrics's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the VisualforceAccessMetrics's dailyPageViewCount field""" + dailyPageViewCount: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceVisualforceAccessMetricsConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceVisualforceAccessMetricsConnectionFilter!] +} + +"""Field that Visualforce Access Metrics can be sorted by""" +enum SalesforceVisualforceAccessMetricsSortByFieldEnum { + ID + METRICS_DATE + APEX_PAGE_ID + SYSTEM_MODSTAMP + DAILY_PAGE_VIEW_COUNT +} + +"""An edge in a connection.""" +type SalesforceVisualforceAccessMetricsEdge { + """The item at the end of the edge.""" + node: SalesforceVisualforceAccessMetrics! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Visualforce Access Metric""" +type SalesforceVisualforceAccessMetrics implements OneGraphNode { + """Visualforce Access Metric Id""" + id: String! + + """Metrics Date""" + metricsDate: String! + + """Page ID""" + apexPageId: String! + + """Page ID""" + apexPage: SalesforceApexPage! + + """System Modstamp""" + systemModstamp: String! + + """Daily Page View Count""" + dailyPageViewCount: Int + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Visualforce Access Metrics connection, for use in pagination. +""" +type SalesforceVisualforceAccessMetricssConnection { + """ + The count of all Visualforce Access Metric you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Visualforce Access Metrics""" + nodes: [SalesforceVisualforceAccessMetrics!]! + + """List of Visualforce Access Metric edges""" + edges: [SalesforceVisualforceAccessMetricsEdge!]! +} + +"""Visualforce Page""" +type SalesforceApexPage implements OneGraphNode { + """Page ID""" + id: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Name""" + name: String! + + """Api Version""" + apiVersion: Float! + + """Label""" + masterLabel: String! + + """Description""" + description: String + + """Controller Type""" + controllerType: String! + + """Controller Key""" + controllerKey: String + + """ + Available for Lightning Experience, Lightning Communities, and the mobile app + """ + isAvailableInTouch: Boolean! + + """Require CSRF protection on GET requests""" + isConfirmationTokenRequired: Boolean! + + """Markup""" + markup: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce SetupEntityAccess""" + setupEntityAccessItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSetupEntityAccessConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSetupEntityAccessSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSetupEntityAccessSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SetupEntityAccesses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSetupEntityAccesssConnection + + """Collection of Salesforce VisualforceAccessMetrics""" + visualforceAccessMetricsPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVisualforceAccessMetricsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceVisualforceAccessMetricsSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVisualforceAccessMetricsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of VisualforceAccessMetrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceVisualforceAccessMetricssConnection + + """Collection of Salesforce WebLink""" + webLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceWebLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceWebLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceWebLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of WebLinks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceWebLinksConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Field that User Provisioning Configs can be sorted by""" +enum SalesforceUserProvisioningConfigSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + CONNECTED_APP_ID + ENABLED + LAST_RECON_DATE_TIME + NAMED_CREDENTIAL_ID + RECON_FILTER +} + +"""An edge in a connection.""" +type SalesforceUserProvisioningConfigEdge { + """The item at the end of the edge.""" + node: SalesforceUserProvisioningConfig! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against UserProvAccount object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserProvAccountConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserProvAccount's connectedApp relation.""" + connectedApp: SalesforceConnectedApplicationConnectionFilter + + """Filter by the UserProvAccount's salesforceUser relation.""" + salesforceUser: SalesforceUserConnectionFilter + + """Filter by the UserProvAccount's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserProvAccount's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserProvAccount's id field""" + id: SalesforceIdFilter + + """Filter by the UserProvAccount's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UserProvAccount's name field""" + name: SalesforceStringFilter + + """Filter by the UserProvAccount's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserProvAccount's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserProvAccount's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserProvAccount's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserProvAccount's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserProvAccount's salesforceUserId field""" + salesforceUserId: SalesforceIdFilter + + """Filter by the UserProvAccount's connectedAppId field""" + connectedAppId: SalesforceIdFilter + + """Filter by the UserProvAccount's externalUserId field""" + externalUserId: SalesforceStringFilter + + """Filter by the UserProvAccount's externalUsername field""" + externalUsername: SalesforceStringFilter + + """Filter by the UserProvAccount's externalEmail field""" + externalEmail: SalesforceStringFilter + + """Filter by the UserProvAccount's externalFirstName field""" + externalFirstName: SalesforceStringFilter + + """Filter by the UserProvAccount's externalLastName field""" + externalLastName: SalesforceStringFilter + + """Filter by the UserProvAccount's linkState field""" + linkState: SalesforceStringFilter + + """Filter by the UserProvAccount's status field""" + status: SalesforceStringFilter + + """Filter by the UserProvAccount's deletedDate field""" + deletedDate: SalesforceDateTimeFilter + + """Filter by the UserProvAccount's isKnownLink field""" + isKnownLink: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserProvAccountConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserProvAccountConnectionFilter!] +} + +""" +A filter to be used against NamedCredential object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceNamedCredentialConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the NamedCredential's authProvider relation.""" + authProvider: SalesforceAuthProviderConnectionFilter + + """Filter by the NamedCredential's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the NamedCredential's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the NamedCredential's id field""" + id: SalesforceIdFilter + + """Filter by the NamedCredential's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the NamedCredential's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the NamedCredential's language field""" + language: SalesforceStringFilter + + """Filter by the NamedCredential's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the NamedCredential's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the NamedCredential's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the NamedCredential's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the NamedCredential's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the NamedCredential's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the NamedCredential's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the NamedCredential's principalType field""" + principalType: SalesforceStringFilter + + """ + Filter by the NamedCredential's calloutOptionsGenerateAuthorizationHeader field + """ + calloutOptionsGenerateAuthorizationHeader: SalesforceBooleanFilter + + """ + Filter by the NamedCredential's calloutOptionsAllowMergeFieldsInHeader field + """ + calloutOptionsAllowMergeFieldsInHeader: SalesforceBooleanFilter + + """ + Filter by the NamedCredential's calloutOptionsAllowMergeFieldsInBody field + """ + calloutOptionsAllowMergeFieldsInBody: SalesforceBooleanFilter + + """Filter by the NamedCredential's authProviderId field""" + authProviderId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceNamedCredentialConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceNamedCredentialConnectionFilter!] +} + +""" +A filter to be used against UserProvisioningConfig object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserProvisioningConfigConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserProvisioningConfig's namedCredential relation.""" + namedCredential: SalesforceNamedCredentialConnectionFilter + + """Filter by the UserProvisioningConfig's connectedApp relation.""" + connectedApp: SalesforceConnectedApplicationConnectionFilter + + """Filter by the UserProvisioningConfig's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserProvisioningConfig's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserProvisioningConfig's id field""" + id: SalesforceIdFilter + + """Filter by the UserProvisioningConfig's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UserProvisioningConfig's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the UserProvisioningConfig's language field""" + language: SalesforceStringFilter + + """Filter by the UserProvisioningConfig's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the UserProvisioningConfig's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the UserProvisioningConfig's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserProvisioningConfig's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserProvisioningConfig's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserProvisioningConfig's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserProvisioningConfig's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserProvisioningConfig's connectedAppId field""" + connectedAppId: SalesforceIdFilter + + """Filter by the UserProvisioningConfig's enabled field""" + enabled: SalesforceBooleanFilter + + """Filter by the UserProvisioningConfig's lastReconDateTime field""" + lastReconDateTime: SalesforceDateTimeFilter + + """Filter by the UserProvisioningConfig's namedCredentialId field""" + namedCredentialId: SalesforceIdFilter + + """Filter by the UserProvisioningConfig's reconFilter field""" + reconFilter: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserProvisioningConfigConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserProvisioningConfigConnectionFilter!] +} + +""" +A filter to be used against UserProvisioningRequest object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserProvisioningRequestConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserProvisioningRequest's parent relation.""" + parent: SalesforceUserProvisioningRequestConnectionFilter + + """Filter by the UserProvisioningRequest's manager relation.""" + manager: SalesforceUserConnectionFilter + + """Filter by the UserProvisioningRequest's userProvAccount relation.""" + userProvAccount: SalesforceUserProvAccountConnectionFilter + + """Filter by the UserProvisioningRequest's userProvConfig relation.""" + userProvConfig: SalesforceUserProvisioningConfigConnectionFilter + + """Filter by the UserProvisioningRequest's connectedApp relation.""" + connectedApp: SalesforceConnectedApplicationConnectionFilter + + """Filter by the UserProvisioningRequest's salesforceUser relation.""" + salesforceUser: SalesforceUserConnectionFilter + + """Filter by the UserProvisioningRequest's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserProvisioningRequest's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the UserProvisioningRequest's id field""" + id: SalesforceIdFilter + + """Filter by the UserProvisioningRequest's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the UserProvisioningRequest's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the UserProvisioningRequest's name field""" + name: SalesforceStringFilter + + """Filter by the UserProvisioningRequest's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserProvisioningRequest's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the UserProvisioningRequest's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserProvisioningRequest's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserProvisioningRequest's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserProvisioningRequest's salesforceUserId field""" + salesforceUserId: SalesforceIdFilter + + """Filter by the UserProvisioningRequest's externalUserId field""" + externalUserId: SalesforceStringFilter + + """Filter by the UserProvisioningRequest's appName field""" + appName: SalesforceStringFilter + + """Filter by the UserProvisioningRequest's state field""" + state: SalesforceStringFilter + + """Filter by the UserProvisioningRequest's operation field""" + operation: SalesforceStringFilter + + """Filter by the UserProvisioningRequest's scheduleDate field""" + scheduleDate: SalesforceDateTimeFilter + + """Filter by the UserProvisioningRequest's connectedAppId field""" + connectedAppId: SalesforceIdFilter + + """Filter by the UserProvisioningRequest's userProvConfigId field""" + userProvConfigId: SalesforceIdFilter + + """Filter by the UserProvisioningRequest's userProvAccountId field""" + userProvAccountId: SalesforceIdFilter + + """Filter by the UserProvisioningRequest's approvalStatus field""" + approvalStatus: SalesforceStringFilter + + """Filter by the UserProvisioningRequest's managerId field""" + managerId: SalesforceIdFilter + + """Filter by the UserProvisioningRequest's retryCount field""" + retryCount: SalesforceIntFilter + + """Filter by the UserProvisioningRequest's parentId field""" + parentId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserProvisioningRequestConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserProvisioningRequestConnectionFilter!] +} + +"""Field that User Provisioning Requests can be sorted by""" +enum SalesforceUserProvisioningRequestSortByFieldEnum { + ID + OWNER_ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + SALESFORCE_USER_ID + EXTERNAL_USER_ID + APP_NAME + STATE + OPERATION + SCHEDULE_DATE + CONNECTED_APP_ID + USER_PROV_CONFIG_ID + USER_PROV_ACCOUNT_ID + APPROVAL_STATUS + MANAGER_ID + RETRY_COUNT + PARENT_ID +} + +"""An edge in a connection.""" +type SalesforceUserProvisioningRequestEdge { + """The item at the end of the edge.""" + node: SalesforceUserProvisioningRequest! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +Salesforce User Provisioning Requests connection, for use in pagination. +""" +type SalesforceUserProvisioningRequestsConnection { + """ + The count of all User Provisioning Request you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Provisioning Requests""" + nodes: [SalesforceUserProvisioningRequest!]! + + """List of User Provisioning Request edges""" + edges: [SalesforceUserProvisioningRequestEdge!]! +} + +"""User Provisioning Config""" +type SalesforceUserProvisioningConfig implements OneGraphNode { + """UserProvisioningConfig ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Connected App ID""" + connectedAppId: String + + """Connected App ID""" + connectedApp: SalesforceConnectedApplication + + """Notes""" + notes: String + + """Enabled""" + enabled: Boolean! + + """Approval Required""" + approvalRequired: String + + """User Account Mapping""" + userAccountMapping: String + + """Enabled Operations""" + enabledOperations: String + + """On Update Attributes""" + onUpdateAttributes: String + + """Last Recon Date""" + lastReconDateTime: String + + """Named Credential ID""" + namedCredentialId: String + + """Named Credential ID""" + namedCredential: SalesforceNamedCredential + + """Recon Filter""" + reconFilter: String + + """Collection of Salesforce UserProvisioningRequest""" + userProvisioningRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningRequestSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningRequests to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningRequestsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce User Provisioning Configs connection, for use in pagination. +""" +type SalesforceUserProvisioningConfigsConnection { + """ + The count of all User Provisioning Config you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce User Provisioning Configs""" + nodes: [SalesforceUserProvisioningConfig!]! + + """List of User Provisioning Config edges""" + edges: [SalesforceUserProvisioningConfigEdge!]! +} + +""" +A filter to be used against SetupEntityAccess object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceSetupEntityAccessConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the SetupEntityAccess's parent relation.""" + parent: SalesforcePermissionSetConnectionFilter + + """Filter by the SetupEntityAccess's id field""" + id: SalesforceIdFilter + + """Filter by the SetupEntityAccess's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the SetupEntityAccess's setupEntityId field""" + setupEntityId: SalesforceIdFilter + + """Filter by the SetupEntityAccess's setupEntityType field""" + setupEntityType: SalesforceStringFilter + + """Filter by the SetupEntityAccess's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceSetupEntityAccessConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceSetupEntityAccessConnectionFilter!] +} + +"""Field that Setup Entity Accesses can be sorted by""" +enum SalesforceSetupEntityAccessSortByFieldEnum { + ID + PARENT_ID + SETUP_ENTITY_ID + SETUP_ENTITY_TYPE + SYSTEM_MODSTAMP +} + +""" +A filter to be used against ExternalDataUserAuth object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceExternalDataUserAuthConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ExternalDataUserAuth's authProvider relation.""" + authProvider: SalesforceAuthProviderConnectionFilter + + """Filter by the ExternalDataUserAuth's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the ExternalDataUserAuth's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ExternalDataUserAuth's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ExternalDataUserAuth's id field""" + id: SalesforceIdFilter + + """Filter by the ExternalDataUserAuth's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ExternalDataUserAuth's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ExternalDataUserAuth's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ExternalDataUserAuth's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ExternalDataUserAuth's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ExternalDataUserAuth's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ExternalDataUserAuth's externalDataSourceId field""" + externalDataSourceId: SalesforceIdFilter + + """Filter by the ExternalDataUserAuth's userId field""" + userId: SalesforceIdFilter + + """Filter by the ExternalDataUserAuth's protocol field""" + protocol: SalesforceStringFilter + + """Filter by the ExternalDataUserAuth's username field""" + username: SalesforceStringFilter + + """Filter by the ExternalDataUserAuth's authProviderId field""" + authProviderId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceExternalDataUserAuthConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceExternalDataUserAuthConnectionFilter!] +} + +"""Field that External Data User Authentications can be sorted by""" +enum SalesforceExternalDataUserAuthSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + EXTERNAL_DATA_SOURCE_ID + USER_ID + PROTOCOL + USERNAME + AUTH_PROVIDER_ID +} + +"""An edge in a connection.""" +type SalesforceExternalDataUserAuthEdge { + """The item at the end of the edge.""" + node: SalesforceExternalDataUserAuth! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceExternalDataUserAuthExternalDataSourceUnion = SalesforceNamedCredential | SalesforceExternalDataSource + +"""External Data User Authentication""" +type SalesforceExternalDataUserAuth implements OneGraphNode { + """External Data User Authentication ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """External Data Source ID""" + externalDataSourceId: String! + + """External Data Source ID""" + externalDataSource: SalesforceExternalDataUserAuthExternalDataSourceUnion! + + """User ID""" + userId: String + + """User ID""" + user: SalesforceUser + + """Authentication Protocol""" + protocol: String + + """Username""" + username: String + + """Password""" + password: String + + """Auth. Provider ID""" + authProviderId: String + + """Auth. Provider ID""" + authProvider: SalesforceAuthProvider + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce External Data User Authentications connection, for use in pagination. +""" +type SalesforceExternalDataUserAuthsConnection { + """ + The count of all External Data User Authentication you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce External Data User Authentications""" + nodes: [SalesforceExternalDataUserAuth!]! + + """List of External Data User Authentication edges""" + edges: [SalesforceExternalDataUserAuthEdge!]! +} + +"""Named Credential""" +type SalesforceNamedCredential implements OneGraphNode { + """Named Credential ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String! + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """URL""" + endpoint: String + + """Identity Type""" + principalType: String! + + """GenerateAuthorizationHeader""" + calloutOptionsGenerateAuthorizationHeader: Boolean! + + """AllowMergeFieldsInHeader""" + calloutOptionsAllowMergeFieldsInHeader: Boolean! + + """AllowMergeFieldsInBody""" + calloutOptionsAllowMergeFieldsInBody: Boolean! + + """Auth. Provider ID""" + authProviderId: String + + """Auth. Provider ID""" + authProvider: SalesforceAuthProvider + + """Collection of Salesforce ExternalDataUserAuth""" + userAuths( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceExternalDataUserAuthConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceExternalDataUserAuthSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceExternalDataUserAuthSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ExternalDataUserAuths to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceExternalDataUserAuthsConnection + + """Collection of Salesforce SetupEntityAccess""" + setupEntityAccessItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSetupEntityAccessConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSetupEntityAccessSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSetupEntityAccessSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SetupEntityAccesses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSetupEntityAccesssConnection + + """Collection of Salesforce UserProvisioningConfig""" + userProvisioningConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningConfigSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningConfigs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningConfigsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceSetupEntityAccessSetupEntityUnion = SalesforceNamedCredential | SalesforceExternalDataSource | SalesforceCustomPermission | SalesforceConnectedApplication | SalesforceApexPage | SalesforceApexClass + +"""Setup Entity Access""" +type SalesforceSetupEntityAccess implements OneGraphNode { + """SetupEntityAccess ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforcePermissionSet! + + """Setup Entity ID""" + setupEntityId: String! + + """Setup Entity ID""" + setupEntity: SalesforceSetupEntityAccessSetupEntityUnion! + + """Setup Entity Type""" + setupEntityType: String + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Setup Entity Accesses connection, for use in pagination.""" +type SalesforceSetupEntityAccesssConnection { + """ + The count of all Setup Entity Access you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Setup Entity Accesses""" + nodes: [SalesforceSetupEntityAccess!]! + + """List of Setup Entity Access edges""" + edges: [SalesforceSetupEntityAccessEdge!]! +} + +""" +A filter to be used against PermissionSetLicense object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePermissionSetLicenseConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the PermissionSetLicense's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the PermissionSetLicense's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the PermissionSetLicense's id field""" + id: SalesforceIdFilter + + """Filter by the PermissionSetLicense's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the PermissionSetLicense's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the PermissionSetLicense's language field""" + language: SalesforceStringFilter + + """Filter by the PermissionSetLicense's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the PermissionSetLicense's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the PermissionSetLicense's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the PermissionSetLicense's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the PermissionSetLicense's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the PermissionSetLicense's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the PermissionSetLicense's permissionSetLicenseKey field""" + permissionSetLicenseKey: SalesforceStringFilter + + """Filter by the PermissionSetLicense's totalLicenses field""" + totalLicenses: SalesforceIntFilter + + """Filter by the PermissionSetLicense's status field""" + status: SalesforceStringFilter + + """Filter by the PermissionSetLicense's expirationDate field""" + expirationDate: SalesforceDateFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEmailSingle field + """ + maximumPermissionsEmailSingle: SalesforceBooleanFilter + + """Filter by the PermissionSetLicense's maximumPermissionsEmailMass field""" + maximumPermissionsEmailMass: SalesforceBooleanFilter + + """Filter by the PermissionSetLicense's maximumPermissionsEditTask field""" + maximumPermissionsEditTask: SalesforceBooleanFilter + + """Filter by the PermissionSetLicense's maximumPermissionsEditEvent field""" + maximumPermissionsEditEvent: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsExportReport field + """ + maximumPermissionsExportReport: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsImportPersonal field + """ + maximumPermissionsImportPersonal: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsDataExport field + """ + maximumPermissionsDataExport: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageUsers field + """ + maximumPermissionsManageUsers: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditPublicFilters field + """ + maximumPermissionsEditPublicFilters: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditPublicTemplates field + """ + maximumPermissionsEditPublicTemplates: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsModifyAllData field + """ + maximumPermissionsModifyAllData: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageCases field + """ + maximumPermissionsManageCases: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsMassInlineEdit field + """ + maximumPermissionsMassInlineEdit: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditKnowledge field + """ + maximumPermissionsEditKnowledge: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageKnowledge field + """ + maximumPermissionsManageKnowledge: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageSolutions field + """ + maximumPermissionsManageSolutions: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCustomizeApplication field + """ + maximumPermissionsCustomizeApplication: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditReadonlyFields field + """ + maximumPermissionsEditReadonlyFields: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsRunReports field + """ + maximumPermissionsRunReports: SalesforceBooleanFilter + + """Filter by the PermissionSetLicense's maximumPermissionsViewSetup field""" + maximumPermissionsViewSetup: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsTransferAnyEntity field + """ + maximumPermissionsTransferAnyEntity: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsNewReportBuilder field + """ + maximumPermissionsNewReportBuilder: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsActivateContract field + """ + maximumPermissionsActivateContract: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsActivateOrder field + """ + maximumPermissionsActivateOrder: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsImportLeads field + """ + maximumPermissionsImportLeads: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageLeads field + """ + maximumPermissionsManageLeads: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsTransferAnyLead field + """ + maximumPermissionsTransferAnyLead: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewAllData field + """ + maximumPermissionsViewAllData: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditPublicDocuments field + """ + maximumPermissionsEditPublicDocuments: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewEncryptedData field + """ + maximumPermissionsViewEncryptedData: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditBrandTemplates field + """ + maximumPermissionsEditBrandTemplates: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditHtmlTemplates field + """ + maximumPermissionsEditHtmlTemplates: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsChatterInternalUser field + """ + maximumPermissionsChatterInternalUser: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageEncryptionKeys field + """ + maximumPermissionsManageEncryptionKeys: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsDeleteActivatedContract field + """ + maximumPermissionsDeleteActivatedContract: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsChatterInviteExternalUsers field + """ + maximumPermissionsChatterInviteExternalUsers: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsSendSitRequests field + """ + maximumPermissionsSendSitRequests: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageRemoteAccess field + """ + maximumPermissionsManageRemoteAccess: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCanUseNewDashboardBuilder field + """ + maximumPermissionsCanUseNewDashboardBuilder: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageCategories field + """ + maximumPermissionsManageCategories: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsConvertLeads field + """ + maximumPermissionsConvertLeads: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsPasswordNeverExpires field + """ + maximumPermissionsPasswordNeverExpires: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsUseTeamReassignWizards field + """ + maximumPermissionsUseTeamReassignWizards: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditActivatedOrders field + """ + maximumPermissionsEditActivatedOrders: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsInstallPackaging field + """ + maximumPermissionsInstallPackaging: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsPublishPackaging field + """ + maximumPermissionsPublishPackaging: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsChatterOwnGroups field + """ + maximumPermissionsChatterOwnGroups: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditOppLineItemUnitPrice field + """ + maximumPermissionsEditOppLineItemUnitPrice: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCreatePackaging field + """ + maximumPermissionsCreatePackaging: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsBulkApiHardDelete field + """ + maximumPermissionsBulkApiHardDelete: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsSolutionImport field + """ + maximumPermissionsSolutionImport: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageCallCenters field + """ + maximumPermissionsManageCallCenters: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageSynonyms field + """ + maximumPermissionsManageSynonyms: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewContent field + """ + maximumPermissionsViewContent: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageEmailClientConfig field + """ + maximumPermissionsManageEmailClientConfig: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEnableNotifications field + """ + maximumPermissionsEnableNotifications: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageDataIntegrations field + """ + maximumPermissionsManageDataIntegrations: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsDistributeFromPersWksp field + """ + maximumPermissionsDistributeFromPersWksp: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewDataCategories field + """ + maximumPermissionsViewDataCategories: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageDataCategories field + """ + maximumPermissionsManageDataCategories: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsAuthorApex field + """ + maximumPermissionsAuthorApex: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageMobile field + """ + maximumPermissionsManageMobile: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsApiEnabled field + """ + maximumPermissionsApiEnabled: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageCustomReportTypes field + """ + maximumPermissionsManageCustomReportTypes: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditCaseComments field + """ + maximumPermissionsEditCaseComments: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsTransferAnyCase field + """ + maximumPermissionsTransferAnyCase: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsContentAdministrator field + """ + maximumPermissionsContentAdministrator: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCreateWorkspaces field + """ + maximumPermissionsCreateWorkspaces: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageContentPermissions field + """ + maximumPermissionsManageContentPermissions: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageContentProperties field + """ + maximumPermissionsManageContentProperties: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageContentTypes field + """ + maximumPermissionsManageContentTypes: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageExchangeConfig field + """ + maximumPermissionsManageExchangeConfig: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageAnalyticSnapshots field + """ + maximumPermissionsManageAnalyticSnapshots: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsScheduleReports field + """ + maximumPermissionsScheduleReports: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageBusinessHourHolidays field + """ + maximumPermissionsManageBusinessHourHolidays: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageDynamicDashboards field + """ + maximumPermissionsManageDynamicDashboards: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCustomSidebarOnAllPages field + """ + maximumPermissionsCustomSidebarOnAllPages: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageInteraction field + """ + maximumPermissionsManageInteraction: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewMyTeamsDashboards field + """ + maximumPermissionsViewMyTeamsDashboards: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsModerateChatter field + """ + maximumPermissionsModerateChatter: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsResetPasswords field + """ + maximumPermissionsResetPasswords: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsFlowUflRequired field + """ + maximumPermissionsFlowUflRequired: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCanInsertFeedSystemFields field + """ + maximumPermissionsCanInsertFeedSystemFields: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageKnowledgeImportExport field + """ + maximumPermissionsManageKnowledgeImportExport: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEmailTemplateManagement field + """ + maximumPermissionsEmailTemplateManagement: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEmailAdministration field + """ + maximumPermissionsEmailAdministration: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageChatterMessages field + """ + maximumPermissionsManageChatterMessages: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsAllowEmailIc field + """ + maximumPermissionsAllowEmailIc: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsChatterFileLink field + """ + maximumPermissionsChatterFileLink: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsForceTwoFactor field + """ + maximumPermissionsForceTwoFactor: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewEventLogFiles field + """ + maximumPermissionsViewEventLogFiles: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageNetworks field + """ + maximumPermissionsManageNetworks: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageAuthProviders field + """ + maximumPermissionsManageAuthProviders: SalesforceBooleanFilter + + """Filter by the PermissionSetLicense's maximumPermissionsRunFlow field""" + maximumPermissionsRunFlow: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCreateCustomizeDashboards field + """ + maximumPermissionsCreateCustomizeDashboards: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCreateDashboardFolders field + """ + maximumPermissionsCreateDashboardFolders: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewPublicDashboards field + """ + maximumPermissionsViewPublicDashboards: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageDashbdsInPubFolders field + """ + maximumPermissionsManageDashbdsInPubFolders: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCreateCustomizeReports field + """ + maximumPermissionsCreateCustomizeReports: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCreateReportFolders field + """ + maximumPermissionsCreateReportFolders: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewPublicReports field + """ + maximumPermissionsViewPublicReports: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageReportsInPubFolders field + """ + maximumPermissionsManageReportsInPubFolders: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditMyDashboards field + """ + maximumPermissionsEditMyDashboards: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditMyReports field + """ + maximumPermissionsEditMyReports: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewAllUsers field + """ + maximumPermissionsViewAllUsers: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsAllowUniversalSearch field + """ + maximumPermissionsAllowUniversalSearch: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsConnectOrgToEnvironmentHub field + """ + maximumPermissionsConnectOrgToEnvironmentHub: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsWorkCalibrationUser field + """ + maximumPermissionsWorkCalibrationUser: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCreateCustomizeFilters field + """ + maximumPermissionsCreateCustomizeFilters: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsWorkDotComUserPerm field + """ + maximumPermissionsWorkDotComUserPerm: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsGovernNetworks field + """ + maximumPermissionsGovernNetworks: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsSalesConsole field + """ + maximumPermissionsSalesConsole: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsTwoFactorApi field + """ + maximumPermissionsTwoFactorApi: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsDeleteTopics field + """ + maximumPermissionsDeleteTopics: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEditTopics field + """ + maximumPermissionsEditTopics: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCreateTopics field + """ + maximumPermissionsCreateTopics: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsAssignTopics field + """ + maximumPermissionsAssignTopics: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsIdentityEnabled field + """ + maximumPermissionsIdentityEnabled: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsIdentityConnect field + """ + maximumPermissionsIdentityConnect: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsAllowViewKnowledge field + """ + maximumPermissionsAllowViewKnowledge: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsContentWorkspaces field + """ + maximumPermissionsContentWorkspaces: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageSearchPromotionRules field + """ + maximumPermissionsManageSearchPromotionRules: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCustomMobileAppsAccess field + """ + maximumPermissionsCustomMobileAppsAccess: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewHelpLink field + """ + maximumPermissionsViewHelpLink: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageProfilesPermissionsets field + """ + maximumPermissionsManageProfilesPermissionsets: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsAssignPermissionSets field + """ + maximumPermissionsAssignPermissionSets: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageRoles field + """ + maximumPermissionsManageRoles: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageIpAddresses field + """ + maximumPermissionsManageIpAddresses: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageSharing field + """ + maximumPermissionsManageSharing: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageInternalUsers field + """ + maximumPermissionsManageInternalUsers: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManagePasswordPolicies field + """ + maximumPermissionsManagePasswordPolicies: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageLoginAccessPolicies field + """ + maximumPermissionsManageLoginAccessPolicies: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageCustomPermissions field + """ + maximumPermissionsManageCustomPermissions: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCanVerifyComment field + """ + maximumPermissionsCanVerifyComment: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageUnlistedGroups field + """ + maximumPermissionsManageUnlistedGroups: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsModifySecureAgents field + """ + maximumPermissionsModifySecureAgents: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageTwoFactor field + """ + maximumPermissionsManageTwoFactor: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsChatterForSharePoint field + """ + maximumPermissionsChatterForSharePoint: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsLightningExperienceUser field + """ + maximumPermissionsLightningExperienceUser: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsConfigCustomRecs field + """ + maximumPermissionsConfigCustomRecs: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsSubmitMacrosAllowed field + """ + maximumPermissionsSubmitMacrosAllowed: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsBulkMacrosAllowed field + """ + maximumPermissionsBulkMacrosAllowed: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsShareInternalArticles field + """ + maximumPermissionsShareInternalArticles: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageSessionPermissionSets field + """ + maximumPermissionsManageSessionPermissionSets: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsSendAnnouncementEmails field + """ + maximumPermissionsSendAnnouncementEmails: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsChatterEditOwnPost field + """ + maximumPermissionsChatterEditOwnPost: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsChatterEditOwnRecordPost field + """ + maximumPermissionsChatterEditOwnRecordPost: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsImportCustomObjects field + """ + maximumPermissionsImportCustomObjects: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsDelegatedTwoFactor field + """ + maximumPermissionsDelegatedTwoFactor: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsChatterComposeUiCodesnippet field + """ + maximumPermissionsChatterComposeUiCodesnippet: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsSelectFilesFromSalesforce field + """ + maximumPermissionsSelectFilesFromSalesforce: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsModerateNetworkUsers field + """ + maximumPermissionsModerateNetworkUsers: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsMergeTopics field + """ + maximumPermissionsMergeTopics: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsSubscribeToLightningReports field + """ + maximumPermissionsSubscribeToLightningReports: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManagePvtRptsAndDashbds field + """ + maximumPermissionsManagePvtRptsAndDashbds: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsAllowLightningLogin field + """ + maximumPermissionsAllowLightningLogin: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCampaignInfluence2 field + """ + maximumPermissionsCampaignInfluence2: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewDataAssessment field + """ + maximumPermissionsViewDataAssessment: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsRemoveDirectMessageMembers field + """ + maximumPermissionsRemoveDirectMessageMembers: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCanApproveFeedPost field + """ + maximumPermissionsCanApproveFeedPost: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsAddDirectMessageMembers field + """ + maximumPermissionsAddDirectMessageMembers: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsAllowViewEditConvertedLeads field + """ + maximumPermissionsAllowViewEditConvertedLeads: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsShowCompanyNameAsUserBadge field + """ + maximumPermissionsShowCompanyNameAsUserBadge: SalesforceBooleanFilter + + """Filter by the PermissionSetLicense's maximumPermissionsAccessCmc field""" + maximumPermissionsAccessCmc: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewHealthCheck field + """ + maximumPermissionsViewHealthCheck: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageHealthCheck field + """ + maximumPermissionsManageHealthCheck: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsPackaging2 field + """ + maximumPermissionsPackaging2: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageCertificates field + """ + maximumPermissionsManageCertificates: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsCreateReportInLightning field + """ + maximumPermissionsCreateReportInLightning: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsPreventClassicExperience field + """ + maximumPermissionsPreventClassicExperience: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsHideReadByList field + """ + maximumPermissionsHideReadByList: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsListEmailSend field + """ + maximumPermissionsListEmailSend: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsFeedPinning field + """ + maximumPermissionsFeedPinning: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsChangeDashboardColors field + """ + maximumPermissionsChangeDashboardColors: SalesforceBooleanFilter + + """Filter by the PermissionSetLicense's maximumPermissionsIotUser field""" + maximumPermissionsIotUser: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsUseWebLink field + """ + maximumPermissionsUseWebLink: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsViewAllActivities field + """ + maximumPermissionsViewAllActivities: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsSubscribeReportToOtherUsers field + """ + maximumPermissionsSubscribeReportToOtherUsers: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsLightningConsoleAllowedForUser field + """ + maximumPermissionsLightningConsoleAllowedForUser: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsSubscribeReportsRunAsUser field + """ + maximumPermissionsSubscribeReportsRunAsUser: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsSubscribeToLightningDashboards field + """ + maximumPermissionsSubscribeToLightningDashboards: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsApexRestServices field + """ + maximumPermissionsApexRestServices: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsEnableCommunityAppLauncher field + """ + maximumPermissionsEnableCommunityAppLauncher: SalesforceBooleanFilter + + """ + Filter by the PermissionSetLicense's maximumPermissionsManageSurveys field + """ + maximumPermissionsManageSurveys: SalesforceBooleanFilter + + """Filter by the PermissionSetLicense's maximumPermissionsViewRoles field""" + maximumPermissionsViewRoles: SalesforceBooleanFilter + + """Filter by the PermissionSetLicense's usedLicenses field""" + usedLicenses: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePermissionSetLicenseConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePermissionSetLicenseConnectionFilter!] +} + +""" +A filter to be used against GrantedByLicense object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceGrantedByLicenseConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the GrantedByLicense's customPermission relation.""" + customPermission: SalesforceCustomPermissionConnectionFilter + + """Filter by the GrantedByLicense's permissionSetLicense relation.""" + permissionSetLicense: SalesforcePermissionSetLicenseConnectionFilter + + """Filter by the GrantedByLicense's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the GrantedByLicense's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the GrantedByLicense's id field""" + id: SalesforceIdFilter + + """Filter by the GrantedByLicense's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the GrantedByLicense's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the GrantedByLicense's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the GrantedByLicense's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the GrantedByLicense's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the GrantedByLicense's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the GrantedByLicense's permissionSetLicenseId field""" + permissionSetLicenseId: SalesforceIdFilter + + """Filter by the GrantedByLicense's customPermissionId field""" + customPermissionId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceGrantedByLicenseConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceGrantedByLicenseConnectionFilter!] +} + +"""Field that Setting Granted By Licenses can be sorted by""" +enum SalesforceGrantedByLicenseSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + PERMISSION_SET_LICENSE_ID + CUSTOM_PERMISSION_ID +} + +""" +A filter to be used against CustomPermission object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCustomPermissionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CustomPermission's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CustomPermission's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CustomPermission's id field""" + id: SalesforceIdFilter + + """Filter by the CustomPermission's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CustomPermission's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the CustomPermission's language field""" + language: SalesforceStringFilter + + """Filter by the CustomPermission's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the CustomPermission's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the CustomPermission's isProtected field""" + isProtected: SalesforceBooleanFilter + + """Filter by the CustomPermission's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CustomPermission's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CustomPermission's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CustomPermission's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CustomPermission's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CustomPermission's description field""" + description: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCustomPermissionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCustomPermissionConnectionFilter!] +} + +""" +A filter to be used against CustomPermissionDependency object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCustomPermissionDependencyConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """ + Filter by the CustomPermissionDependency's requiredCustomPermission relation. + """ + requiredCustomPermission: SalesforceCustomPermissionConnectionFilter + + """Filter by the CustomPermissionDependency's customPermission relation.""" + customPermission: SalesforceCustomPermissionConnectionFilter + + """Filter by the CustomPermissionDependency's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CustomPermissionDependency's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CustomPermissionDependency's id field""" + id: SalesforceIdFilter + + """Filter by the CustomPermissionDependency's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the CustomPermissionDependency's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CustomPermissionDependency's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CustomPermissionDependency's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CustomPermissionDependency's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the CustomPermissionDependency's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CustomPermissionDependency's customPermissionId field""" + customPermissionId: SalesforceIdFilter + + """ + Filter by the CustomPermissionDependency's requiredCustomPermissionId field + """ + requiredCustomPermissionId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCustomPermissionDependencyConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCustomPermissionDependencyConnectionFilter!] +} + +"""Field that Custom Permission Dependencies can be sorted by""" +enum SalesforceCustomPermissionDependencySortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + CUSTOM_PERMISSION_ID + REQUIRED_CUSTOM_PERMISSION_ID +} + +"""An edge in a connection.""" +type SalesforceCustomPermissionDependencyEdge { + """The item at the end of the edge.""" + node: SalesforceCustomPermissionDependency! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Custom Permission Dependency""" +type SalesforceCustomPermissionDependency implements OneGraphNode { + """Custom Permission Dependency ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Custom Permission ID""" + customPermissionId: String! + + """Custom Permission ID""" + customPermission: SalesforceCustomPermission! + + """Custom Permission ID""" + requiredCustomPermissionId: String! + + """Custom Permission ID""" + requiredCustomPermission: SalesforceCustomPermission! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Custom Permission Dependencies connection, for use in pagination. +""" +type SalesforceCustomPermissionDependencysConnection { + """ + The count of all Custom Permission Dependency you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Custom Permission Dependencies""" + nodes: [SalesforceCustomPermissionDependency!]! + + """List of Custom Permission Dependency edges""" + edges: [SalesforceCustomPermissionDependencyEdge!]! +} + +"""Custom Permission""" +type SalesforceCustomPermission implements OneGraphNode { + """Custom Permission ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String! + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Protected Component""" + isProtected: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Description""" + description: String + + """Collection of Salesforce CustomPermissionDependency""" + customPermissionItem( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomPermissionDependencyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomPermissionDependencySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomPermissionDependencySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CustomPermissionDependencies to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCustomPermissionDependencysConnection + + """Collection of Salesforce CustomPermissionDependency""" + customPermissionDependencyItem( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomPermissionDependencyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomPermissionDependencySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomPermissionDependencySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CustomPermissionDependencies to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCustomPermissionDependencysConnection + + """Collection of Salesforce GrantedByLicense""" + grantedByLicenses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceGrantedByLicenseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceGrantedByLicenseSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceGrantedByLicenseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of GrantedByLicenses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceGrantedByLicensesConnection + + """Collection of Salesforce SetupEntityAccess""" + setupEntityAccessItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSetupEntityAccessConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSetupEntityAccessSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSetupEntityAccessSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SetupEntityAccesses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSetupEntityAccesssConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Setting Granted By License""" +type SalesforceGrantedByLicense implements OneGraphNode { + """Setting Granted By License ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Permission Set License ID""" + permissionSetLicenseId: String! + + """Permission Set License ID""" + permissionSetLicense: SalesforcePermissionSetLicense! + + """Custom Permission ID""" + customPermissionId: String! + + """Custom Permission ID""" + customPermission: SalesforceCustomPermission! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Setting Granted By Licenses connection, for use in pagination. +""" +type SalesforceGrantedByLicensesConnection { + """ + The count of all Setting Granted By License you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Setting Granted By Licenses""" + nodes: [SalesforceGrantedByLicense!]! + + """List of Setting Granted By License edges""" + edges: [SalesforceGrantedByLicenseEdge!]! +} + +"""Permission Set License""" +type SalesforcePermissionSetLicense implements OneGraphNode { + """Permission Set License ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Developer Name""" + developerName: String! + + """Master Language""" + language: String! + + """Permission Set License Label""" + masterLabel: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Permission Set License Key""" + permissionSetLicenseKey: String! + + """Total Licenses""" + totalLicenses: Int! + + """Status""" + status: String! + + """Expiration Date""" + expirationDate: String + + """Send Email""" + maximumPermissionsEmailSingle: Boolean! + + """Mass Email""" + maximumPermissionsEmailMass: Boolean! + + """Edit Tasks""" + maximumPermissionsEditTask: Boolean! + + """Edit Events""" + maximumPermissionsEditEvent: Boolean! + + """Export Reports""" + maximumPermissionsExportReport: Boolean! + + """Import Personal Contacts""" + maximumPermissionsImportPersonal: Boolean! + + """Weekly Data Export""" + maximumPermissionsDataExport: Boolean! + + """Manage Users""" + maximumPermissionsManageUsers: Boolean! + + """Manage Public List Views""" + maximumPermissionsEditPublicFilters: Boolean! + + """Manage Public Templates""" + maximumPermissionsEditPublicTemplates: Boolean! + + """Modify All Data""" + maximumPermissionsModifyAllData: Boolean! + + """Manage Cases""" + maximumPermissionsManageCases: Boolean! + + """Mass Edits from Lists""" + maximumPermissionsMassInlineEdit: Boolean! + + """Manage Articles""" + maximumPermissionsEditKnowledge: Boolean! + + """Manage Salesforce Knowledge""" + maximumPermissionsManageKnowledge: Boolean! + + """Manage Published Solutions""" + maximumPermissionsManageSolutions: Boolean! + + """Customize Application""" + maximumPermissionsCustomizeApplication: Boolean! + + """Edit Read Only Fields""" + maximumPermissionsEditReadonlyFields: Boolean! + + """Run Reports""" + maximumPermissionsRunReports: Boolean! + + """View Setup and Configuration""" + maximumPermissionsViewSetup: Boolean! + + """Transfer Record""" + maximumPermissionsTransferAnyEntity: Boolean! + + """Report Builder""" + maximumPermissionsNewReportBuilder: Boolean! + + """Activate Contracts""" + maximumPermissionsActivateContract: Boolean! + + """Activate Orders""" + maximumPermissionsActivateOrder: Boolean! + + """Import Leads""" + maximumPermissionsImportLeads: Boolean! + + """Manage Leads""" + maximumPermissionsManageLeads: Boolean! + + """Transfer Leads""" + maximumPermissionsTransferAnyLead: Boolean! + + """View All Data""" + maximumPermissionsViewAllData: Boolean! + + """Manage Public Documents""" + maximumPermissionsEditPublicDocuments: Boolean! + + """View Encrypted Data""" + maximumPermissionsViewEncryptedData: Boolean! + + """Manage Letterheads""" + maximumPermissionsEditBrandTemplates: Boolean! + + """Edit HTML Templates""" + maximumPermissionsEditHtmlTemplates: Boolean! + + """Chatter Internal User""" + maximumPermissionsChatterInternalUser: Boolean! + + """Manage Encryption Keys""" + maximumPermissionsManageEncryptionKeys: Boolean! + + """Delete Activated Contracts""" + maximumPermissionsDeleteActivatedContract: Boolean! + + """Invite Customers To Chatter""" + maximumPermissionsChatterInviteExternalUsers: Boolean! + + """Send Stay-in-Touch Requests""" + maximumPermissionsSendSitRequests: Boolean! + + """Manage Connected Apps""" + maximumPermissionsManageRemoteAccess: Boolean! + + """Drag-and-Drop Dashboard Builder""" + maximumPermissionsCanUseNewDashboardBuilder: Boolean! + + """Manage Categories""" + maximumPermissionsManageCategories: Boolean! + + """Convert Leads""" + maximumPermissionsConvertLeads: Boolean! + + """Password Never Expires""" + maximumPermissionsPasswordNeverExpires: Boolean! + + """Use Team Reassignment Wizards""" + maximumPermissionsUseTeamReassignWizards: Boolean! + + """Edit Activated Orders""" + maximumPermissionsEditActivatedOrders: Boolean! + + """Download AppExchange Packages""" + maximumPermissionsInstallPackaging: Boolean! + + """Upload AppExchange Packages""" + maximumPermissionsPublishPackaging: Boolean! + + """Create and Own New Chatter Groups""" + maximumPermissionsChatterOwnGroups: Boolean! + + """Edit Opportunity Product Sales Price""" + maximumPermissionsEditOppLineItemUnitPrice: Boolean! + + """Create AppExchange Packages""" + maximumPermissionsCreatePackaging: Boolean! + + """Bulk API Hard Delete""" + maximumPermissionsBulkApiHardDelete: Boolean! + + """Import Solutions""" + maximumPermissionsSolutionImport: Boolean! + + """Manage Call Centers""" + maximumPermissionsManageCallCenters: Boolean! + + """Manage Synonyms""" + maximumPermissionsManageSynonyms: Boolean! + + """View Content in Portals""" + maximumPermissionsViewContent: Boolean! + + """Manage Email Client Configurations""" + maximumPermissionsManageEmailClientConfig: Boolean! + + """Send Outbound Messages""" + maximumPermissionsEnableNotifications: Boolean! + + """Manage Data Integrations""" + maximumPermissionsManageDataIntegrations: Boolean! + + """Create Content Deliveries""" + maximumPermissionsDistributeFromPersWksp: Boolean! + + """View Data Categories""" + maximumPermissionsViewDataCategories: Boolean! + + """Manage Data Categories""" + maximumPermissionsManageDataCategories: Boolean! + + """Author Apex""" + maximumPermissionsAuthorApex: Boolean! + + """Manage Mobile Configurations""" + maximumPermissionsManageMobile: Boolean! + + """API Enabled""" + maximumPermissionsApiEnabled: Boolean! + + """Manage Custom Report Types""" + maximumPermissionsManageCustomReportTypes: Boolean! + + """Edit Case Comments""" + maximumPermissionsEditCaseComments: Boolean! + + """Transfer Cases""" + maximumPermissionsTransferAnyCase: Boolean! + + """Manage Salesforce CRM Content""" + maximumPermissionsContentAdministrator: Boolean! + + """Create Libraries""" + maximumPermissionsCreateWorkspaces: Boolean! + + """Manage Content Permissions""" + maximumPermissionsManageContentPermissions: Boolean! + + """Manage Content Properties""" + maximumPermissionsManageContentProperties: Boolean! + + """Manage record types and layouts for Files""" + maximumPermissionsManageContentTypes: Boolean! + + """Manage Lightning Sync""" + maximumPermissionsManageExchangeConfig: Boolean! + + """Manage Reporting Snapshots""" + maximumPermissionsManageAnalyticSnapshots: Boolean! + + """Schedule Reports""" + maximumPermissionsScheduleReports: Boolean! + + """Manage Business Hours Holidays""" + maximumPermissionsManageBusinessHourHolidays: Boolean! + + """Manage Dynamic Dashboards""" + maximumPermissionsManageDynamicDashboards: Boolean! + + """Show Custom Sidebar On All Pages""" + maximumPermissionsCustomSidebarOnAllPages: Boolean! + + """Manage Flow""" + maximumPermissionsManageInteraction: Boolean! + + """View My Team's Dashboards""" + maximumPermissionsViewMyTeamsDashboards: Boolean! + + """Moderate Chatter""" + maximumPermissionsModerateChatter: Boolean! + + """Reset User Passwords and Unlock Users""" + maximumPermissionsResetPasswords: Boolean! + + """Require Flow User Feature License""" + maximumPermissionsFlowUflRequired: Boolean! + + """Insert System Field Values for Chatter Feeds""" + maximumPermissionsCanInsertFeedSystemFields: Boolean! + + """Manage Knowledge Article Import/Export""" + maximumPermissionsManageKnowledgeImportExport: Boolean! + + """Manage Email Templates""" + maximumPermissionsEmailTemplateManagement: Boolean! + + """Email Administration""" + maximumPermissionsEmailAdministration: Boolean! + + """Manage Chatter Messages and Direct Messages""" + maximumPermissionsManageChatterMessages: Boolean! + + """Email-Based Identity Verification Option""" + maximumPermissionsAllowEmailIc: Boolean! + + """Create Public Links""" + maximumPermissionsChatterFileLink: Boolean! + + """Two-Factor Authentication for User Interface Logins""" + maximumPermissionsForceTwoFactor: Boolean! + + """View Event Log Files""" + maximumPermissionsViewEventLogFiles: Boolean! + + """Create and Set Up Communities""" + maximumPermissionsManageNetworks: Boolean! + + """Manage Auth. Providers""" + maximumPermissionsManageAuthProviders: Boolean! + + """Run Flows""" + maximumPermissionsRunFlow: Boolean! + + """Create and Customize Dashboards""" + maximumPermissionsCreateCustomizeDashboards: Boolean! + + """Create Dashboard Folders""" + maximumPermissionsCreateDashboardFolders: Boolean! + + """View Dashboards in Public Folders""" + maximumPermissionsViewPublicDashboards: Boolean! + + """Manage Dashboards in Public Folders""" + maximumPermissionsManageDashbdsInPubFolders: Boolean! + + """Create and Customize Reports""" + maximumPermissionsCreateCustomizeReports: Boolean! + + """Create Report Folders""" + maximumPermissionsCreateReportFolders: Boolean! + + """View Reports in Public Folders""" + maximumPermissionsViewPublicReports: Boolean! + + """Manage Reports in Public Folders""" + maximumPermissionsManageReportsInPubFolders: Boolean! + + """Edit My Dashboards""" + maximumPermissionsEditMyDashboards: Boolean! + + """Edit My Reports""" + maximumPermissionsEditMyReports: Boolean! + + """View All Users""" + maximumPermissionsViewAllUsers: Boolean! + + """Knowledge One""" + maximumPermissionsAllowUniversalSearch: Boolean! + + """Connect Organization to Environment Hub""" + maximumPermissionsConnectOrgToEnvironmentHub: Boolean! + + """Enable Work.com Calibration""" + maximumPermissionsWorkCalibrationUser: Boolean! + + """Create and Customize List Views""" + maximumPermissionsCreateCustomizeFilters: Boolean! + + """Enable Work.com""" + maximumPermissionsWorkDotComUserPerm: Boolean! + + """Manage Communities""" + maximumPermissionsGovernNetworks: Boolean! + + """Sales Console""" + maximumPermissionsSalesConsole: Boolean! + + """Two-Factor Authentication for API Logins""" + maximumPermissionsTwoFactorApi: Boolean! + + """Delete Topics""" + maximumPermissionsDeleteTopics: Boolean! + + """Edit Topics""" + maximumPermissionsEditTopics: Boolean! + + """Create Topics""" + maximumPermissionsCreateTopics: Boolean! + + """Assign Topics""" + maximumPermissionsAssignTopics: Boolean! + + """Use Identity Features""" + maximumPermissionsIdentityEnabled: Boolean! + + """Use Identity Connect""" + maximumPermissionsIdentityConnect: Boolean! + + """Allow View Knowledge""" + maximumPermissionsAllowViewKnowledge: Boolean! + + """Access Libraries""" + maximumPermissionsContentWorkspaces: Boolean! + + """Manage Promoted Search Terms""" + maximumPermissionsManageSearchPromotionRules: Boolean! + + """Access Custom Mobile Apps""" + maximumPermissionsCustomMobileAppsAccess: Boolean! + + """View Help Link""" + maximumPermissionsViewHelpLink: Boolean! + + """Manage Profiles and Permission Sets""" + maximumPermissionsManageProfilesPermissionsets: Boolean! + + """Assign Permission Sets""" + maximumPermissionsAssignPermissionSets: Boolean! + + """Manage Roles""" + maximumPermissionsManageRoles: Boolean! + + """Manage IP Addresses""" + maximumPermissionsManageIpAddresses: Boolean! + + """Manage Sharing""" + maximumPermissionsManageSharing: Boolean! + + """Manage Internal Users""" + maximumPermissionsManageInternalUsers: Boolean! + + """Manage Password Policies""" + maximumPermissionsManagePasswordPolicies: Boolean! + + """Manage Login Access Policies""" + maximumPermissionsManageLoginAccessPolicies: Boolean! + + """Manage Custom Permissions""" + maximumPermissionsManageCustomPermissions: Boolean! + + """Verify Answers to Chatter Questions""" + maximumPermissionsCanVerifyComment: Boolean! + + """Manage Unlisted Groups""" + maximumPermissionsManageUnlistedGroups: Boolean! + + """Modify Secure Agents""" + maximumPermissionsModifySecureAgents: Boolean! + + """Manage Two-Factor Authentication in API""" + maximumPermissionsManageTwoFactor: Boolean! + + """Access Chatter For SharePoint""" + maximumPermissionsChatterForSharePoint: Boolean! + + """Lightning Experience User""" + maximumPermissionsLightningExperienceUser: Boolean! + + """Configure Custom Recommendations""" + maximumPermissionsConfigCustomRecs: Boolean! + + """Manage Macros Users Can't Undo""" + maximumPermissionsSubmitMacrosAllowed: Boolean! + + """Run Macros on Multiple Records""" + maximumPermissionsBulkMacrosAllowed: Boolean! + + """Share internal Knowledge articles externally""" + maximumPermissionsShareInternalArticles: Boolean! + + """Manage Session Permission Set Activations""" + maximumPermissionsManageSessionPermissionSets: Boolean! + + """Send announcement emails""" + maximumPermissionsSendAnnouncementEmails: Boolean! + + """Edit My Own Posts""" + maximumPermissionsChatterEditOwnPost: Boolean! + + """Edit Posts on Records I Own""" + maximumPermissionsChatterEditOwnRecordPost: Boolean! + + """Import Custom Objects""" + maximumPermissionsImportCustomObjects: Boolean! + + """Manage Two-Factor Authentication in User Interface""" + maximumPermissionsDelegatedTwoFactor: Boolean! + + """Allow Inclusion of Code Snippets from UI""" + maximumPermissionsChatterComposeUiCodesnippet: Boolean! + + """Select Files from Salesforce""" + maximumPermissionsSelectFilesFromSalesforce: Boolean! + + """Moderate Community Users""" + maximumPermissionsModerateNetworkUsers: Boolean! + + """Merge Topics""" + maximumPermissionsMergeTopics: Boolean! + + """Subscribe to Reports""" + maximumPermissionsSubscribeToLightningReports: Boolean! + + """Manage All Private Reports and Dashboards""" + maximumPermissionsManagePvtRptsAndDashbds: Boolean! + + """Lightning Login User""" + maximumPermissionsAllowLightningLogin: Boolean! + + """Campaign Influence""" + maximumPermissionsCampaignInfluence2: Boolean! + + """Access to view Data Assessment""" + maximumPermissionsViewDataAssessment: Boolean! + + """Remove People from Direct Messages""" + maximumPermissionsRemoveDirectMessageMembers: Boolean! + + """Can Approve Feed Post and Comment""" + maximumPermissionsCanApproveFeedPost: Boolean! + + """Add People to Direct Messages""" + maximumPermissionsAddDirectMessageMembers: Boolean! + + """View and Edit Converted Leads""" + maximumPermissionsAllowViewEditConvertedLeads: Boolean! + + """Show Company Name as Community Role""" + maximumPermissionsShowCompanyNameAsUserBadge: Boolean! + + """Access Community Management""" + maximumPermissionsAccessCmc: Boolean! + + """View Health Check""" + maximumPermissionsViewHealthCheck: Boolean! + + """Manage Health Check""" + maximumPermissionsManageHealthCheck: Boolean! + + """Create and Update Second-Generation Packages""" + maximumPermissionsPackaging2: Boolean! + + """Manage Certificates""" + maximumPermissionsManageCertificates: Boolean! + + """Report Builder (Lightning Experience)""" + maximumPermissionsCreateReportInLightning: Boolean! + + """Hide Option to Switch to Salesforce Classic""" + maximumPermissionsPreventClassicExperience: Boolean! + + """Hide the Seen By List""" + maximumPermissionsHideReadByList: Boolean! + + """Allow sending of List Emails""" + maximumPermissionsListEmailSend: Boolean! + + """Pin Posts in Feeds""" + maximumPermissionsFeedPinning: Boolean! + + """Change Dashboard Colors""" + maximumPermissionsChangeDashboardColors: Boolean! + + """IoT User""" + maximumPermissionsIotUser: Boolean! + + """Allow Access to Customized Actions""" + maximumPermissionsUseWebLink: Boolean! + + """View All Activities""" + maximumPermissionsViewAllActivities: Boolean! + + """Subscribe to Reports: Add Recipients""" + maximumPermissionsSubscribeReportToOtherUsers: Boolean! + + """Lightning Console User""" + maximumPermissionsLightningConsoleAllowedForUser: Boolean! + + """Subscribe to Reports: Set Running User""" + maximumPermissionsSubscribeReportsRunAsUser: Boolean! + + """Subscribe to Dashboards""" + maximumPermissionsSubscribeToLightningDashboards: Boolean! + + """Apex REST Services""" + maximumPermissionsApexRestServices: Boolean! + + """Show App Launcher in Communities""" + maximumPermissionsEnableCommunityAppLauncher: Boolean! + + """Manage Surveys""" + maximumPermissionsManageSurveys: Boolean! + + """View Roles and Role Hierarchy""" + maximumPermissionsViewRoles: Boolean! + + """Used Licenses""" + usedLicenses: Int! + + """Collection of Salesforce GrantedByLicense""" + grantedByLicenses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceGrantedByLicenseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceGrantedByLicenseSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceGrantedByLicenseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of GrantedByLicenses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceGrantedByLicensesConnection + + """Collection of Salesforce PermissionSet""" + permissionSets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePermissionSetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of PermissionSets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePermissionSetsConnection + + """Collection of Salesforce PermissionSetLicenseAssign""" + permissionSetLicenseAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetLicenseAssignConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePermissionSetLicenseAssignSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetLicenseAssignSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of PermissionSetLicenseAssigns to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePermissionSetLicenseAssignsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Field that Profiles can be sorted by""" +enum SalesforceProfileSortByFieldEnum { + ID + NAME + USER_LICENSE_ID + USER_TYPE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + DESCRIPTION + LAST_VIEWED_DATE + LAST_REFERENCED_DATE +} + +"""An edge in a connection.""" +type SalesforceProfileEdge { + """The item at the end of the edge.""" + node: SalesforceProfile! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Field that Users can be sorted by""" +enum SalesforceUserSortByFieldEnum { + ID + USERNAME + LAST_NAME + FIRST_NAME + NAME + COMPANY_NAME + DIVISION + DEPARTMENT + TITLE + STREET + CITY + STATE + POSTAL_CODE + COUNTRY + LATITUDE + LONGITUDE + GEOCODE_ACCURACY + EMAIL + SENDER_EMAIL + SENDER_NAME + SIGNATURE + STAY_IN_TOUCH_SUBJECT + STAY_IN_TOUCH_SIGNATURE + STAY_IN_TOUCH_NOTE + PHONE + FAX + MOBILE_PHONE + ALIAS + COMMUNITY_NICKNAME + BADGE_TEXT + IS_ACTIVE + TIME_ZONE_SID_KEY + USER_ROLE_ID + LOCALE_SID_KEY + RECEIVES_INFO_EMAILS + RECEIVES_ADMIN_INFO_EMAILS + EMAIL_ENCODING_KEY + PROFILE_ID + USER_TYPE + LANGUAGE_LOCALE_KEY + EMPLOYEE_NUMBER + DELEGATED_APPROVER_ID + MANAGER_ID + LAST_LOGIN_DATE + LAST_PASSWORD_CHANGE_DATE + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + OFFLINE_TRIAL_EXPIRATION_DATE + OFFLINE_PDA_TRIAL_EXPIRATION_DATE + FORECAST_ENABLED + CONTACT_ID + ACCOUNT_ID + CALL_CENTER_ID + EXTENSION + FEDERATION_IDENTIFIER + ABOUT_ME + FULL_PHOTO_URL + SMALL_PHOTO_URL + IS_EXT_INDICATOR_VISIBLE + OUT_OF_OFFICE_MESSAGE + MEDIUM_PHOTO_URL + DIGEST_FREQUENCY + DEFAULT_GROUP_NOTIFICATION_FREQUENCY + JIGSAW_IMPORT_LIMIT_OVERRIDE + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + BANNER_PHOTO_URL + SMALL_BANNER_PHOTO_URL + MEDIUM_BANNER_PHOTO_URL + IS_PROFILE_PHOTO_ACTIVE +} + +"""An edge in a connection.""" +type SalesforceUserEdge { + """The item at the end of the edge.""" + node: SalesforceUser! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Users connection, for use in pagination.""" +type SalesforceUsersConnection { + """The count of all User you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Users""" + nodes: [SalesforceUser!]! + + """List of User edges""" + edges: [SalesforceUserEdge!]! +} + +"""Profile""" +type SalesforceProfile implements OneGraphNode { + """Profile ID""" + id: String! + + """Name""" + name: String! + + """Send Email""" + permissionsEmailSingle: Boolean! + + """Mass Email""" + permissionsEmailMass: Boolean! + + """Edit Tasks""" + permissionsEditTask: Boolean! + + """Edit Events""" + permissionsEditEvent: Boolean! + + """Export Reports""" + permissionsExportReport: Boolean! + + """Import Personal Contacts""" + permissionsImportPersonal: Boolean! + + """Weekly Data Export""" + permissionsDataExport: Boolean! + + """Manage Users""" + permissionsManageUsers: Boolean! + + """Manage Public List Views""" + permissionsEditPublicFilters: Boolean! + + """Manage Public Templates""" + permissionsEditPublicTemplates: Boolean! + + """Modify All Data""" + permissionsModifyAllData: Boolean! + + """Manage Cases""" + permissionsManageCases: Boolean! + + """Mass Edits from Lists""" + permissionsMassInlineEdit: Boolean! + + """Manage Articles""" + permissionsEditKnowledge: Boolean! + + """Manage Salesforce Knowledge""" + permissionsManageKnowledge: Boolean! + + """Manage Published Solutions""" + permissionsManageSolutions: Boolean! + + """Customize Application""" + permissionsCustomizeApplication: Boolean! + + """Edit Read Only Fields""" + permissionsEditReadonlyFields: Boolean! + + """Run Reports""" + permissionsRunReports: Boolean! + + """View Setup and Configuration""" + permissionsViewSetup: Boolean! + + """Transfer Record""" + permissionsTransferAnyEntity: Boolean! + + """Report Builder""" + permissionsNewReportBuilder: Boolean! + + """Activate Contracts""" + permissionsActivateContract: Boolean! + + """Activate Orders""" + permissionsActivateOrder: Boolean! + + """Import Leads""" + permissionsImportLeads: Boolean! + + """Manage Leads""" + permissionsManageLeads: Boolean! + + """Transfer Leads""" + permissionsTransferAnyLead: Boolean! + + """View All Data""" + permissionsViewAllData: Boolean! + + """Manage Public Documents""" + permissionsEditPublicDocuments: Boolean! + + """View Encrypted Data""" + permissionsViewEncryptedData: Boolean! + + """Manage Letterheads""" + permissionsEditBrandTemplates: Boolean! + + """Edit HTML Templates""" + permissionsEditHtmlTemplates: Boolean! + + """Chatter Internal User""" + permissionsChatterInternalUser: Boolean! + + """Manage Encryption Keys""" + permissionsManageEncryptionKeys: Boolean! + + """Delete Activated Contracts""" + permissionsDeleteActivatedContract: Boolean! + + """Invite Customers To Chatter""" + permissionsChatterInviteExternalUsers: Boolean! + + """Send Stay-in-Touch Requests""" + permissionsSendSitRequests: Boolean! + + """Manage Connected Apps""" + permissionsManageRemoteAccess: Boolean! + + """Drag-and-Drop Dashboard Builder""" + permissionsCanUseNewDashboardBuilder: Boolean! + + """Manage Categories""" + permissionsManageCategories: Boolean! + + """Convert Leads""" + permissionsConvertLeads: Boolean! + + """Password Never Expires""" + permissionsPasswordNeverExpires: Boolean! + + """Use Team Reassignment Wizards""" + permissionsUseTeamReassignWizards: Boolean! + + """Edit Activated Orders""" + permissionsEditActivatedOrders: Boolean! + + """Download AppExchange Packages""" + permissionsInstallMultiforce: Boolean! + + """Upload AppExchange Packages""" + permissionsPublishMultiforce: Boolean! + + """Create and Own New Chatter Groups""" + permissionsChatterOwnGroups: Boolean! + + """Edit Opportunity Product Sales Price""" + permissionsEditOppLineItemUnitPrice: Boolean! + + """Create AppExchange Packages""" + permissionsCreateMultiforce: Boolean! + + """Bulk API Hard Delete""" + permissionsBulkApiHardDelete: Boolean! + + """Import Solutions""" + permissionsSolutionImport: Boolean! + + """Manage Call Centers""" + permissionsManageCallCenters: Boolean! + + """Manage Synonyms""" + permissionsManageSynonyms: Boolean! + + """View Content in Portals""" + permissionsViewContent: Boolean! + + """Manage Email Client Configurations""" + permissionsManageEmailClientConfig: Boolean! + + """Send Outbound Messages""" + permissionsEnableNotifications: Boolean! + + """Manage Data Integrations""" + permissionsManageDataIntegrations: Boolean! + + """Create Content Deliveries""" + permissionsDistributeFromPersWksp: Boolean! + + """View Data Categories""" + permissionsViewDataCategories: Boolean! + + """Manage Data Categories""" + permissionsManageDataCategories: Boolean! + + """Author Apex""" + permissionsAuthorApex: Boolean! + + """Manage Mobile Configurations""" + permissionsManageMobile: Boolean! + + """API Enabled""" + permissionsApiEnabled: Boolean! + + """Manage Custom Report Types""" + permissionsManageCustomReportTypes: Boolean! + + """Edit Case Comments""" + permissionsEditCaseComments: Boolean! + + """Transfer Cases""" + permissionsTransferAnyCase: Boolean! + + """Manage Salesforce CRM Content""" + permissionsContentAdministrator: Boolean! + + """Create Libraries""" + permissionsCreateWorkspaces: Boolean! + + """Manage Content Permissions""" + permissionsManageContentPermissions: Boolean! + + """Manage Content Properties""" + permissionsManageContentProperties: Boolean! + + """Manage record types and layouts for Files""" + permissionsManageContentTypes: Boolean! + + """Manage Lightning Sync""" + permissionsManageExchangeConfig: Boolean! + + """Manage Reporting Snapshots""" + permissionsManageAnalyticSnapshots: Boolean! + + """Schedule Reports""" + permissionsScheduleReports: Boolean! + + """Manage Business Hours Holidays""" + permissionsManageBusinessHourHolidays: Boolean! + + """Manage Dynamic Dashboards""" + permissionsManageDynamicDashboards: Boolean! + + """Show Custom Sidebar On All Pages""" + permissionsCustomSidebarOnAllPages: Boolean! + + """Manage Flow""" + permissionsManageInteraction: Boolean! + + """View My Team's Dashboards""" + permissionsViewMyTeamsDashboards: Boolean! + + """Moderate Chatter""" + permissionsModerateChatter: Boolean! + + """Reset User Passwords and Unlock Users""" + permissionsResetPasswords: Boolean! + + """Require Flow User Feature License""" + permissionsFlowUflRequired: Boolean! + + """Insert System Field Values for Chatter Feeds""" + permissionsCanInsertFeedSystemFields: Boolean! + + """Manage Knowledge Article Import/Export""" + permissionsManageKnowledgeImportExport: Boolean! + + """Manage Email Templates""" + permissionsEmailTemplateManagement: Boolean! + + """Email Administration""" + permissionsEmailAdministration: Boolean! + + """Manage Chatter Messages and Direct Messages""" + permissionsManageChatterMessages: Boolean! + + """Email-Based Identity Verification Option""" + permissionsAllowEmailIc: Boolean! + + """Create Public Links""" + permissionsChatterFileLink: Boolean! + + """Two-Factor Authentication for User Interface Logins""" + permissionsForceTwoFactor: Boolean! + + """View Event Log Files""" + permissionsViewEventLogFiles: Boolean! + + """Create and Set Up Communities""" + permissionsManageNetworks: Boolean! + + """Manage Auth. Providers""" + permissionsManageAuthProviders: Boolean! + + """Run Flows""" + permissionsRunFlow: Boolean! + + """Create and Customize Dashboards""" + permissionsCreateCustomizeDashboards: Boolean! + + """Create Dashboard Folders""" + permissionsCreateDashboardFolders: Boolean! + + """View Dashboards in Public Folders""" + permissionsViewPublicDashboards: Boolean! + + """Manage Dashboards in Public Folders""" + permissionsManageDashbdsInPubFolders: Boolean! + + """Create and Customize Reports""" + permissionsCreateCustomizeReports: Boolean! + + """Create Report Folders""" + permissionsCreateReportFolders: Boolean! + + """View Reports in Public Folders""" + permissionsViewPublicReports: Boolean! + + """Manage Reports in Public Folders""" + permissionsManageReportsInPubFolders: Boolean! + + """Edit My Dashboards""" + permissionsEditMyDashboards: Boolean! + + """Edit My Reports""" + permissionsEditMyReports: Boolean! + + """View All Users""" + permissionsViewAllUsers: Boolean! + + """Knowledge One""" + permissionsAllowUniversalSearch: Boolean! + + """Connect Organization to Environment Hub""" + permissionsConnectOrgToEnvironmentHub: Boolean! + + """Enable Work.com Calibration""" + permissionsWorkCalibrationUser: Boolean! + + """Create and Customize List Views""" + permissionsCreateCustomizeFilters: Boolean! + + """Enable Work.com""" + permissionsWorkDotComUserPerm: Boolean! + + """Manage Communities""" + permissionsGovernNetworks: Boolean! + + """Sales Console""" + permissionsSalesConsole: Boolean! + + """Two-Factor Authentication for API Logins""" + permissionsTwoFactorApi: Boolean! + + """Delete Topics""" + permissionsDeleteTopics: Boolean! + + """Edit Topics""" + permissionsEditTopics: Boolean! + + """Create Topics""" + permissionsCreateTopics: Boolean! + + """Assign Topics""" + permissionsAssignTopics: Boolean! + + """Use Identity Features""" + permissionsIdentityEnabled: Boolean! + + """Use Identity Connect""" + permissionsIdentityConnect: Boolean! + + """Allow View Knowledge""" + permissionsAllowViewKnowledge: Boolean! + + """Access Libraries""" + permissionsContentWorkspaces: Boolean! + + """Manage Promoted Search Terms""" + permissionsManageSearchPromotionRules: Boolean! + + """Access Custom Mobile Apps""" + permissionsCustomMobileAppsAccess: Boolean! + + """View Help Link""" + permissionsViewHelpLink: Boolean! + + """Manage Profiles and Permission Sets""" + permissionsManageProfilesPermissionsets: Boolean! + + """Assign Permission Sets""" + permissionsAssignPermissionSets: Boolean! + + """Manage Roles""" + permissionsManageRoles: Boolean! + + """Manage IP Addresses""" + permissionsManageIpAddresses: Boolean! + + """Manage Sharing""" + permissionsManageSharing: Boolean! + + """Manage Internal Users""" + permissionsManageInternalUsers: Boolean! + + """Manage Password Policies""" + permissionsManagePasswordPolicies: Boolean! + + """Manage Login Access Policies""" + permissionsManageLoginAccessPolicies: Boolean! + + """Manage Custom Permissions""" + permissionsManageCustomPermissions: Boolean! + + """Verify Answers to Chatter Questions""" + permissionsCanVerifyComment: Boolean! + + """Manage Unlisted Groups""" + permissionsManageUnlistedGroups: Boolean! + + """Modify Secure Agents""" + permissionsModifySecureAgents: Boolean! + + """Manage Two-Factor Authentication in API""" + permissionsManageTwoFactor: Boolean! + + """Access Chatter For SharePoint""" + permissionsChatterForSharePoint: Boolean! + + """Lightning Experience User""" + permissionsLightningExperienceUser: Boolean! + + """Configure Custom Recommendations""" + permissionsConfigCustomRecs: Boolean! + + """Manage Macros Users Can't Undo""" + permissionsSubmitMacrosAllowed: Boolean! + + """Run Macros on Multiple Records""" + permissionsBulkMacrosAllowed: Boolean! + + """Share internal Knowledge articles externally""" + permissionsShareInternalArticles: Boolean! + + """Manage Session Permission Set Activations""" + permissionsManageSessionPermissionSets: Boolean! + + """Send announcement emails""" + permissionsSendAnnouncementEmails: Boolean! + + """Edit My Own Posts""" + permissionsChatterEditOwnPost: Boolean! + + """Edit Posts on Records I Own""" + permissionsChatterEditOwnRecordPost: Boolean! + + """Import Custom Objects""" + permissionsImportCustomObjects: Boolean! + + """Manage Two-Factor Authentication in User Interface""" + permissionsDelegatedTwoFactor: Boolean! + + """Allow Inclusion of Code Snippets from UI""" + permissionsChatterComposeUiCodesnippet: Boolean! + + """Select Files from Salesforce""" + permissionsSelectFilesFromSalesforce: Boolean! + + """Moderate Community Users""" + permissionsModerateNetworkUsers: Boolean! + + """Merge Topics""" + permissionsMergeTopics: Boolean! + + """Subscribe to Reports""" + permissionsSubscribeToLightningReports: Boolean! + + """Manage All Private Reports and Dashboards""" + permissionsManagePvtRptsAndDashbds: Boolean! + + """Lightning Login User""" + permissionsAllowLightningLogin: Boolean! + + """Campaign Influence""" + permissionsCampaignInfluence2: Boolean! + + """Access to view Data Assessment""" + permissionsViewDataAssessment: Boolean! + + """Remove People from Direct Messages""" + permissionsRemoveDirectMessageMembers: Boolean! + + """Can Approve Feed Post and Comment""" + permissionsCanApproveFeedPost: Boolean! + + """Add People to Direct Messages""" + permissionsAddDirectMessageMembers: Boolean! + + """View and Edit Converted Leads""" + permissionsAllowViewEditConvertedLeads: Boolean! + + """Show Company Name as Community Role""" + permissionsShowCompanyNameAsUserBadge: Boolean! + + """Access Community Management""" + permissionsAccessCmc: Boolean! + + """View Health Check""" + permissionsViewHealthCheck: Boolean! + + """Manage Health Check""" + permissionsManageHealthCheck: Boolean! + + """Create and Update Second-Generation Packages""" + permissionsPackaging2: Boolean! + + """Manage Certificates""" + permissionsManageCertificates: Boolean! + + """Report Builder (Lightning Experience)""" + permissionsCreateReportInLightning: Boolean! + + """Hide Option to Switch to Salesforce Classic""" + permissionsPreventClassicExperience: Boolean! + + """Hide the Seen By List""" + permissionsHideReadByList: Boolean! + + """Allow sending of List Emails""" + permissionsListEmailSend: Boolean! + + """Pin Posts in Feeds""" + permissionsFeedPinning: Boolean! + + """Change Dashboard Colors""" + permissionsChangeDashboardColors: Boolean! + + """IoT User""" + permissionsIotUser: Boolean! + + """Allow Access to Customized Actions""" + permissionsUseWebLink: Boolean! + + """View All Activities""" + permissionsViewAllActivities: Boolean! + + """Subscribe to Reports: Add Recipients""" + permissionsSubscribeReportToOtherUsers: Boolean! + + """Lightning Console User""" + permissionsLightningConsoleAllowedForUser: Boolean! + + """Subscribe to Reports: Set Running User""" + permissionsSubscribeReportsRunAsUser: Boolean! + + """Subscribe to Dashboards""" + permissionsSubscribeToLightningDashboards: Boolean! + + """Apex REST Services""" + permissionsApexRestServices: Boolean! + + """Show App Launcher in Communities""" + permissionsEnableCommunityAppLauncher: Boolean! + + """Manage Surveys""" + permissionsManageSurveys: Boolean! + + """View Roles and Role Hierarchy""" + permissionsViewRoles: Boolean! + + """User License ID""" + userLicenseId: String! + + """User License ID""" + userLicense: SalesforceUserLicense! + + """User Type""" + userType: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Description""" + description: String + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Collection of Salesforce PermissionSet""" + permissionSets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePermissionSetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of PermissionSets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePermissionSetsConnection + + """Collection of Salesforce User""" + users( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Users to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUsersConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Profiles connection, for use in pagination.""" +type SalesforceProfilesConnection { + """The count of all Profile you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Profiles""" + nodes: [SalesforceProfile!]! + + """List of Profile edges""" + edges: [SalesforceProfileEdge!]! +} + +""" +A filter to be used against PermissionSet object types. All fields are combined with a logical ‘and.’ +""" +input SalesforcePermissionSetConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the PermissionSet's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the PermissionSet's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the PermissionSet's profile relation.""" + profile: SalesforceProfileConnectionFilter + + """Filter by the PermissionSet's id field""" + id: SalesforceIdFilter + + """Filter by the PermissionSet's name field""" + name: SalesforceStringFilter + + """Filter by the PermissionSet's label field""" + label: SalesforceStringFilter + + """Filter by the PermissionSet's licenseId field""" + licenseId: SalesforceIdFilter + + """Filter by the PermissionSet's profileId field""" + profileId: SalesforceIdFilter + + """Filter by the PermissionSet's isOwnedByProfile field""" + isOwnedByProfile: SalesforceBooleanFilter + + """Filter by the PermissionSet's isCustom field""" + isCustom: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEmailSingle field""" + permissionsEmailSingle: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEmailMass field""" + permissionsEmailMass: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditTask field""" + permissionsEditTask: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditEvent field""" + permissionsEditEvent: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsExportReport field""" + permissionsExportReport: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsImportPersonal field""" + permissionsImportPersonal: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsDataExport field""" + permissionsDataExport: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageUsers field""" + permissionsManageUsers: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditPublicFilters field""" + permissionsEditPublicFilters: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditPublicTemplates field""" + permissionsEditPublicTemplates: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsModifyAllData field""" + permissionsModifyAllData: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageCases field""" + permissionsManageCases: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsMassInlineEdit field""" + permissionsMassInlineEdit: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditKnowledge field""" + permissionsEditKnowledge: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageKnowledge field""" + permissionsManageKnowledge: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageSolutions field""" + permissionsManageSolutions: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCustomizeApplication field""" + permissionsCustomizeApplication: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditReadonlyFields field""" + permissionsEditReadonlyFields: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsRunReports field""" + permissionsRunReports: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewSetup field""" + permissionsViewSetup: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsTransferAnyEntity field""" + permissionsTransferAnyEntity: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsNewReportBuilder field""" + permissionsNewReportBuilder: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsActivateContract field""" + permissionsActivateContract: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsActivateOrder field""" + permissionsActivateOrder: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsImportLeads field""" + permissionsImportLeads: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageLeads field""" + permissionsManageLeads: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsTransferAnyLead field""" + permissionsTransferAnyLead: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewAllData field""" + permissionsViewAllData: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditPublicDocuments field""" + permissionsEditPublicDocuments: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewEncryptedData field""" + permissionsViewEncryptedData: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditBrandTemplates field""" + permissionsEditBrandTemplates: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditHtmlTemplates field""" + permissionsEditHtmlTemplates: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsChatterInternalUser field""" + permissionsChatterInternalUser: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageEncryptionKeys field""" + permissionsManageEncryptionKeys: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsDeleteActivatedContract field""" + permissionsDeleteActivatedContract: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsChatterInviteExternalUsers field + """ + permissionsChatterInviteExternalUsers: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsSendSitRequests field""" + permissionsSendSitRequests: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageRemoteAccess field""" + permissionsManageRemoteAccess: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsCanUseNewDashboardBuilder field + """ + permissionsCanUseNewDashboardBuilder: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageCategories field""" + permissionsManageCategories: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsConvertLeads field""" + permissionsConvertLeads: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsPasswordNeverExpires field""" + permissionsPasswordNeverExpires: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsUseTeamReassignWizards field""" + permissionsUseTeamReassignWizards: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditActivatedOrders field""" + permissionsEditActivatedOrders: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsInstallPackaging field""" + permissionsInstallPackaging: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsPublishPackaging field""" + permissionsPublishPackaging: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsChatterOwnGroups field""" + permissionsChatterOwnGroups: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsEditOppLineItemUnitPrice field + """ + permissionsEditOppLineItemUnitPrice: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCreatePackaging field""" + permissionsCreatePackaging: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsBulkApiHardDelete field""" + permissionsBulkApiHardDelete: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsSolutionImport field""" + permissionsSolutionImport: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageCallCenters field""" + permissionsManageCallCenters: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageSynonyms field""" + permissionsManageSynonyms: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewContent field""" + permissionsViewContent: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageEmailClientConfig field""" + permissionsManageEmailClientConfig: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEnableNotifications field""" + permissionsEnableNotifications: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageDataIntegrations field""" + permissionsManageDataIntegrations: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsDistributeFromPersWksp field""" + permissionsDistributeFromPersWksp: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewDataCategories field""" + permissionsViewDataCategories: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageDataCategories field""" + permissionsManageDataCategories: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsAuthorApex field""" + permissionsAuthorApex: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageMobile field""" + permissionsManageMobile: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsApiEnabled field""" + permissionsApiEnabled: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageCustomReportTypes field""" + permissionsManageCustomReportTypes: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditCaseComments field""" + permissionsEditCaseComments: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsTransferAnyCase field""" + permissionsTransferAnyCase: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsContentAdministrator field""" + permissionsContentAdministrator: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCreateWorkspaces field""" + permissionsCreateWorkspaces: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsManageContentPermissions field + """ + permissionsManageContentPermissions: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageContentProperties field""" + permissionsManageContentProperties: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageContentTypes field""" + permissionsManageContentTypes: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageExchangeConfig field""" + permissionsManageExchangeConfig: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageAnalyticSnapshots field""" + permissionsManageAnalyticSnapshots: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsScheduleReports field""" + permissionsScheduleReports: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsManageBusinessHourHolidays field + """ + permissionsManageBusinessHourHolidays: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageDynamicDashboards field""" + permissionsManageDynamicDashboards: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCustomSidebarOnAllPages field""" + permissionsCustomSidebarOnAllPages: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageInteraction field""" + permissionsManageInteraction: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewMyTeamsDashboards field""" + permissionsViewMyTeamsDashboards: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsModerateChatter field""" + permissionsModerateChatter: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsResetPasswords field""" + permissionsResetPasswords: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsFlowUflRequired field""" + permissionsFlowUflRequired: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsCanInsertFeedSystemFields field + """ + permissionsCanInsertFeedSystemFields: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsManageKnowledgeImportExport field + """ + permissionsManageKnowledgeImportExport: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEmailTemplateManagement field""" + permissionsEmailTemplateManagement: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEmailAdministration field""" + permissionsEmailAdministration: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageChatterMessages field""" + permissionsManageChatterMessages: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsAllowEmailIc field""" + permissionsAllowEmailIc: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsChatterFileLink field""" + permissionsChatterFileLink: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsForceTwoFactor field""" + permissionsForceTwoFactor: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewEventLogFiles field""" + permissionsViewEventLogFiles: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageNetworks field""" + permissionsManageNetworks: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageAuthProviders field""" + permissionsManageAuthProviders: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsRunFlow field""" + permissionsRunFlow: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsCreateCustomizeDashboards field + """ + permissionsCreateCustomizeDashboards: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCreateDashboardFolders field""" + permissionsCreateDashboardFolders: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewPublicDashboards field""" + permissionsViewPublicDashboards: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsManageDashbdsInPubFolders field + """ + permissionsManageDashbdsInPubFolders: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCreateCustomizeReports field""" + permissionsCreateCustomizeReports: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCreateReportFolders field""" + permissionsCreateReportFolders: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewPublicReports field""" + permissionsViewPublicReports: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsManageReportsInPubFolders field + """ + permissionsManageReportsInPubFolders: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditMyDashboards field""" + permissionsEditMyDashboards: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditMyReports field""" + permissionsEditMyReports: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewAllUsers field""" + permissionsViewAllUsers: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsAllowUniversalSearch field""" + permissionsAllowUniversalSearch: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsConnectOrgToEnvironmentHub field + """ + permissionsConnectOrgToEnvironmentHub: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsWorkCalibrationUser field""" + permissionsWorkCalibrationUser: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCreateCustomizeFilters field""" + permissionsCreateCustomizeFilters: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsWorkDotComUserPerm field""" + permissionsWorkDotComUserPerm: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsGovernNetworks field""" + permissionsGovernNetworks: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsSalesConsole field""" + permissionsSalesConsole: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsTwoFactorApi field""" + permissionsTwoFactorApi: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsDeleteTopics field""" + permissionsDeleteTopics: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsEditTopics field""" + permissionsEditTopics: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCreateTopics field""" + permissionsCreateTopics: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsAssignTopics field""" + permissionsAssignTopics: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsIdentityEnabled field""" + permissionsIdentityEnabled: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsIdentityConnect field""" + permissionsIdentityConnect: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsAllowViewKnowledge field""" + permissionsAllowViewKnowledge: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsContentWorkspaces field""" + permissionsContentWorkspaces: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsManageSearchPromotionRules field + """ + permissionsManageSearchPromotionRules: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCustomMobileAppsAccess field""" + permissionsCustomMobileAppsAccess: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewHelpLink field""" + permissionsViewHelpLink: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsManageProfilesPermissionsets field + """ + permissionsManageProfilesPermissionsets: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsAssignPermissionSets field""" + permissionsAssignPermissionSets: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageRoles field""" + permissionsManageRoles: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageIpAddresses field""" + permissionsManageIpAddresses: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageSharing field""" + permissionsManageSharing: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageInternalUsers field""" + permissionsManageInternalUsers: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManagePasswordPolicies field""" + permissionsManagePasswordPolicies: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsManageLoginAccessPolicies field + """ + permissionsManageLoginAccessPolicies: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageCustomPermissions field""" + permissionsManageCustomPermissions: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCanVerifyComment field""" + permissionsCanVerifyComment: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageUnlistedGroups field""" + permissionsManageUnlistedGroups: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsModifySecureAgents field""" + permissionsModifySecureAgents: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageTwoFactor field""" + permissionsManageTwoFactor: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsChatterForSharePoint field""" + permissionsChatterForSharePoint: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsLightningExperienceUser field""" + permissionsLightningExperienceUser: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsConfigCustomRecs field""" + permissionsConfigCustomRecs: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsSubmitMacrosAllowed field""" + permissionsSubmitMacrosAllowed: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsBulkMacrosAllowed field""" + permissionsBulkMacrosAllowed: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsShareInternalArticles field""" + permissionsShareInternalArticles: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsManageSessionPermissionSets field + """ + permissionsManageSessionPermissionSets: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsSendAnnouncementEmails field""" + permissionsSendAnnouncementEmails: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsChatterEditOwnPost field""" + permissionsChatterEditOwnPost: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsChatterEditOwnRecordPost field + """ + permissionsChatterEditOwnRecordPost: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsImportCustomObjects field""" + permissionsImportCustomObjects: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsDelegatedTwoFactor field""" + permissionsDelegatedTwoFactor: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsChatterComposeUiCodesnippet field + """ + permissionsChatterComposeUiCodesnippet: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsSelectFilesFromSalesforce field + """ + permissionsSelectFilesFromSalesforce: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsModerateNetworkUsers field""" + permissionsModerateNetworkUsers: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsMergeTopics field""" + permissionsMergeTopics: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsSubscribeToLightningReports field + """ + permissionsSubscribeToLightningReports: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManagePvtRptsAndDashbds field""" + permissionsManagePvtRptsAndDashbds: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsAllowLightningLogin field""" + permissionsAllowLightningLogin: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCampaignInfluence2 field""" + permissionsCampaignInfluence2: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewDataAssessment field""" + permissionsViewDataAssessment: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsRemoveDirectMessageMembers field + """ + permissionsRemoveDirectMessageMembers: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCanApproveFeedPost field""" + permissionsCanApproveFeedPost: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsAddDirectMessageMembers field""" + permissionsAddDirectMessageMembers: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsAllowViewEditConvertedLeads field + """ + permissionsAllowViewEditConvertedLeads: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsShowCompanyNameAsUserBadge field + """ + permissionsShowCompanyNameAsUserBadge: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsAccessCmc field""" + permissionsAccessCmc: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewHealthCheck field""" + permissionsViewHealthCheck: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageHealthCheck field""" + permissionsManageHealthCheck: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsPackaging2 field""" + permissionsPackaging2: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageCertificates field""" + permissionsManageCertificates: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsCreateReportInLightning field""" + permissionsCreateReportInLightning: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsPreventClassicExperience field + """ + permissionsPreventClassicExperience: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsHideReadByList field""" + permissionsHideReadByList: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsListEmailSend field""" + permissionsListEmailSend: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsFeedPinning field""" + permissionsFeedPinning: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsChangeDashboardColors field""" + permissionsChangeDashboardColors: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsIotUser field""" + permissionsIotUser: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsUseWebLink field""" + permissionsUseWebLink: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewAllActivities field""" + permissionsViewAllActivities: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsSubscribeReportToOtherUsers field + """ + permissionsSubscribeReportToOtherUsers: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsLightningConsoleAllowedForUser field + """ + permissionsLightningConsoleAllowedForUser: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsSubscribeReportsRunAsUser field + """ + permissionsSubscribeReportsRunAsUser: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsSubscribeToLightningDashboards field + """ + permissionsSubscribeToLightningDashboards: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsApexRestServices field""" + permissionsApexRestServices: SalesforceBooleanFilter + + """ + Filter by the PermissionSet's permissionsEnableCommunityAppLauncher field + """ + permissionsEnableCommunityAppLauncher: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsManageSurveys field""" + permissionsManageSurveys: SalesforceBooleanFilter + + """Filter by the PermissionSet's permissionsViewRoles field""" + permissionsViewRoles: SalesforceBooleanFilter + + """Filter by the PermissionSet's description field""" + description: SalesforceStringFilter + + """Filter by the PermissionSet's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the PermissionSet's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the PermissionSet's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the PermissionSet's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the PermissionSet's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the PermissionSet's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the PermissionSet's hasActivationRequired field""" + hasActivationRequired: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforcePermissionSetConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforcePermissionSetConnectionFilter!] +} + +"""Field that Permission Sets can be sorted by""" +enum SalesforcePermissionSetSortByFieldEnum { + ID + NAME + LABEL + LICENSE_ID + PROFILE_ID + IS_OWNED_BY_PROFILE + IS_CUSTOM + DESCRIPTION + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + NAMESPACE_PREFIX + HAS_ACTIVATION_REQUIRED +} + +"""An edge in a connection.""" +type SalesforcePermissionSetEdge { + """The item at the end of the edge.""" + node: SalesforcePermissionSet! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Permission Sets connection, for use in pagination.""" +type SalesforcePermissionSetsConnection { + """The count of all Permission Set you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Permission Sets""" + nodes: [SalesforcePermissionSet!]! + + """List of Permission Set edges""" + edges: [SalesforcePermissionSetEdge!]! +} + +""" +A filter to be used against CustomObjectUserLicenseMetrics object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCustomObjectUserLicenseMetricsConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CustomObjectUserLicenseMetrics's userLicense relation.""" + userLicense: SalesforceUserLicenseConnectionFilter + + """Filter by the CustomObjectUserLicenseMetrics's id field""" + id: SalesforceIdFilter + + """Filter by the CustomObjectUserLicenseMetrics's metricsDate field""" + metricsDate: SalesforceDateFilter + + """Filter by the CustomObjectUserLicenseMetrics's userLicenseId field""" + userLicenseId: SalesforceIdFilter + + """Filter by the CustomObjectUserLicenseMetrics's customObjectId field""" + customObjectId: SalesforceStringFilter + + """Filter by the CustomObjectUserLicenseMetrics's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CustomObjectUserLicenseMetrics's customObjectType field""" + customObjectType: SalesforceStringFilter + + """Filter by the CustomObjectUserLicenseMetrics's customObjectName field""" + customObjectName: SalesforceStringFilter + + """Filter by the CustomObjectUserLicenseMetrics's objectCount field""" + objectCount: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCustomObjectUserLicenseMetricsConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCustomObjectUserLicenseMetricsConnectionFilter!] +} + +""" +Field that Custom Object Usage By User License Metrics can be sorted by +""" +enum SalesforceCustomObjectUserLicenseMetricsSortByFieldEnum { + ID + METRICS_DATE + USER_LICENSE_ID + CUSTOM_OBJECT_ID + SYSTEM_MODSTAMP + CUSTOM_OBJECT_TYPE + CUSTOM_OBJECT_NAME + OBJECT_COUNT +} + +"""An edge in a connection.""" +type SalesforceCustomObjectUserLicenseMetricsEdge { + """The item at the end of the edge.""" + node: SalesforceCustomObjectUserLicenseMetrics! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Custom Object Usage By User License Metric""" +type SalesforceCustomObjectUserLicenseMetrics implements OneGraphNode { + """Custom Object Usage By User License Metrics Id""" + id: String! + + """Metrics Date""" + metricsDate: String! + + """User License ID""" + userLicenseId: String! + + """User License ID""" + userLicense: SalesforceUserLicense! + + """Custom Object Id""" + customObjectId: String + + """System Modstamp""" + systemModstamp: String! + + """Custom Object Type""" + customObjectType: String + + """Custom Object Name""" + customObjectName: String + + """Count of Objects assigned""" + objectCount: Int + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Custom Object Usage By User License Metrics connection, for use in pagination. +""" +type SalesforceCustomObjectUserLicenseMetricssConnection { + """ + The count of all Custom Object Usage By User License Metric you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Custom Object Usage By User License Metrics""" + nodes: [SalesforceCustomObjectUserLicenseMetrics!]! + + """List of Custom Object Usage By User License Metric edges""" + edges: [SalesforceCustomObjectUserLicenseMetricsEdge!]! +} + +"""User License""" +type SalesforceUserLicense implements OneGraphNode { + """User License ID""" + id: String! + + """License Def. ID""" + licenseDefinitionKey: String! + + """Total Licenses""" + totalLicenses: Int! + + """Status""" + status: String! + + """Used Licenses""" + usedLicenses: Int! + + """Used Licenses Last Updated""" + usedLicensesLastUpdated: String! + + """Name""" + name: String! + + """Master Label""" + masterLabel: String! + + """Created Date""" + createdDate: String! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce CustomObjectUserLicenseMetrics""" + customObjectUserLicenseMetricsPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomObjectUserLicenseMetricsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomObjectUserLicenseMetricsSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomObjectUserLicenseMetricsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CustomObjectUserLicenseMetrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCustomObjectUserLicenseMetricssConnection + + """Collection of Salesforce PermissionSet""" + permissionSets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePermissionSetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of PermissionSets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePermissionSetsConnection + + """Collection of Salesforce Profile""" + profiles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProfileConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProfileSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProfileSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Profiles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProfilesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforcePermissionSetLicenseUnion = SalesforceUserLicense | SalesforcePermissionSetLicense + +"""Permission Set""" +type SalesforcePermissionSet implements OneGraphNode { + """PermissionSet ID""" + id: String! + + """Permission Set Name""" + name: String! + + """Permission Set Label""" + label: String! + + """License ID""" + licenseId: String + + """License ID""" + license: SalesforcePermissionSetLicenseUnion + + """Profile ID""" + profileId: String + + """Profile ID""" + profile: SalesforceProfile + + """Is Owned By Profile""" + isOwnedByProfile: Boolean! + + """Is Custom""" + isCustom: Boolean! + + """Send Email""" + permissionsEmailSingle: Boolean! + + """Mass Email""" + permissionsEmailMass: Boolean! + + """Edit Tasks""" + permissionsEditTask: Boolean! + + """Edit Events""" + permissionsEditEvent: Boolean! + + """Export Reports""" + permissionsExportReport: Boolean! + + """Import Personal Contacts""" + permissionsImportPersonal: Boolean! + + """Weekly Data Export""" + permissionsDataExport: Boolean! + + """Manage Users""" + permissionsManageUsers: Boolean! + + """Manage Public List Views""" + permissionsEditPublicFilters: Boolean! + + """Manage Public Templates""" + permissionsEditPublicTemplates: Boolean! + + """Modify All Data""" + permissionsModifyAllData: Boolean! + + """Manage Cases""" + permissionsManageCases: Boolean! + + """Mass Edits from Lists""" + permissionsMassInlineEdit: Boolean! + + """Manage Articles""" + permissionsEditKnowledge: Boolean! + + """Manage Salesforce Knowledge""" + permissionsManageKnowledge: Boolean! + + """Manage Published Solutions""" + permissionsManageSolutions: Boolean! + + """Customize Application""" + permissionsCustomizeApplication: Boolean! + + """Edit Read Only Fields""" + permissionsEditReadonlyFields: Boolean! + + """Run Reports""" + permissionsRunReports: Boolean! + + """View Setup and Configuration""" + permissionsViewSetup: Boolean! + + """Transfer Record""" + permissionsTransferAnyEntity: Boolean! + + """Report Builder""" + permissionsNewReportBuilder: Boolean! + + """Activate Contracts""" + permissionsActivateContract: Boolean! + + """Activate Orders""" + permissionsActivateOrder: Boolean! + + """Import Leads""" + permissionsImportLeads: Boolean! + + """Manage Leads""" + permissionsManageLeads: Boolean! + + """Transfer Leads""" + permissionsTransferAnyLead: Boolean! + + """View All Data""" + permissionsViewAllData: Boolean! + + """Manage Public Documents""" + permissionsEditPublicDocuments: Boolean! + + """View Encrypted Data""" + permissionsViewEncryptedData: Boolean! + + """Manage Letterheads""" + permissionsEditBrandTemplates: Boolean! + + """Edit HTML Templates""" + permissionsEditHtmlTemplates: Boolean! + + """Chatter Internal User""" + permissionsChatterInternalUser: Boolean! + + """Manage Encryption Keys""" + permissionsManageEncryptionKeys: Boolean! + + """Delete Activated Contracts""" + permissionsDeleteActivatedContract: Boolean! + + """Invite Customers To Chatter""" + permissionsChatterInviteExternalUsers: Boolean! + + """Send Stay-in-Touch Requests""" + permissionsSendSitRequests: Boolean! + + """Manage Connected Apps""" + permissionsManageRemoteAccess: Boolean! + + """Drag-and-Drop Dashboard Builder""" + permissionsCanUseNewDashboardBuilder: Boolean! + + """Manage Categories""" + permissionsManageCategories: Boolean! + + """Convert Leads""" + permissionsConvertLeads: Boolean! + + """Password Never Expires""" + permissionsPasswordNeverExpires: Boolean! + + """Use Team Reassignment Wizards""" + permissionsUseTeamReassignWizards: Boolean! + + """Edit Activated Orders""" + permissionsEditActivatedOrders: Boolean! + + """Download AppExchange Packages""" + permissionsInstallPackaging: Boolean! + + """Upload AppExchange Packages""" + permissionsPublishPackaging: Boolean! + + """Create and Own New Chatter Groups""" + permissionsChatterOwnGroups: Boolean! + + """Edit Opportunity Product Sales Price""" + permissionsEditOppLineItemUnitPrice: Boolean! + + """Create AppExchange Packages""" + permissionsCreatePackaging: Boolean! + + """Bulk API Hard Delete""" + permissionsBulkApiHardDelete: Boolean! + + """Import Solutions""" + permissionsSolutionImport: Boolean! + + """Manage Call Centers""" + permissionsManageCallCenters: Boolean! + + """Manage Synonyms""" + permissionsManageSynonyms: Boolean! + + """View Content in Portals""" + permissionsViewContent: Boolean! + + """Manage Email Client Configurations""" + permissionsManageEmailClientConfig: Boolean! + + """Send Outbound Messages""" + permissionsEnableNotifications: Boolean! + + """Manage Data Integrations""" + permissionsManageDataIntegrations: Boolean! + + """Create Content Deliveries""" + permissionsDistributeFromPersWksp: Boolean! + + """View Data Categories""" + permissionsViewDataCategories: Boolean! + + """Manage Data Categories""" + permissionsManageDataCategories: Boolean! + + """Author Apex""" + permissionsAuthorApex: Boolean! + + """Manage Mobile Configurations""" + permissionsManageMobile: Boolean! + + """API Enabled""" + permissionsApiEnabled: Boolean! + + """Manage Custom Report Types""" + permissionsManageCustomReportTypes: Boolean! + + """Edit Case Comments""" + permissionsEditCaseComments: Boolean! + + """Transfer Cases""" + permissionsTransferAnyCase: Boolean! + + """Manage Salesforce CRM Content""" + permissionsContentAdministrator: Boolean! + + """Create Libraries""" + permissionsCreateWorkspaces: Boolean! + + """Manage Content Permissions""" + permissionsManageContentPermissions: Boolean! + + """Manage Content Properties""" + permissionsManageContentProperties: Boolean! + + """Manage record types and layouts for Files""" + permissionsManageContentTypes: Boolean! + + """Manage Lightning Sync""" + permissionsManageExchangeConfig: Boolean! + + """Manage Reporting Snapshots""" + permissionsManageAnalyticSnapshots: Boolean! + + """Schedule Reports""" + permissionsScheduleReports: Boolean! + + """Manage Business Hours Holidays""" + permissionsManageBusinessHourHolidays: Boolean! + + """Manage Dynamic Dashboards""" + permissionsManageDynamicDashboards: Boolean! + + """Show Custom Sidebar On All Pages""" + permissionsCustomSidebarOnAllPages: Boolean! + + """Manage Flow""" + permissionsManageInteraction: Boolean! + + """View My Team's Dashboards""" + permissionsViewMyTeamsDashboards: Boolean! + + """Moderate Chatter""" + permissionsModerateChatter: Boolean! + + """Reset User Passwords and Unlock Users""" + permissionsResetPasswords: Boolean! + + """Require Flow User Feature License""" + permissionsFlowUflRequired: Boolean! + + """Insert System Field Values for Chatter Feeds""" + permissionsCanInsertFeedSystemFields: Boolean! + + """Manage Knowledge Article Import/Export""" + permissionsManageKnowledgeImportExport: Boolean! + + """Manage Email Templates""" + permissionsEmailTemplateManagement: Boolean! + + """Email Administration""" + permissionsEmailAdministration: Boolean! + + """Manage Chatter Messages and Direct Messages""" + permissionsManageChatterMessages: Boolean! + + """Email-Based Identity Verification Option""" + permissionsAllowEmailIc: Boolean! + + """Create Public Links""" + permissionsChatterFileLink: Boolean! + + """Two-Factor Authentication for User Interface Logins""" + permissionsForceTwoFactor: Boolean! + + """View Event Log Files""" + permissionsViewEventLogFiles: Boolean! + + """Create and Set Up Communities""" + permissionsManageNetworks: Boolean! + + """Manage Auth. Providers""" + permissionsManageAuthProviders: Boolean! + + """Run Flows""" + permissionsRunFlow: Boolean! + + """Create and Customize Dashboards""" + permissionsCreateCustomizeDashboards: Boolean! + + """Create Dashboard Folders""" + permissionsCreateDashboardFolders: Boolean! + + """View Dashboards in Public Folders""" + permissionsViewPublicDashboards: Boolean! + + """Manage Dashboards in Public Folders""" + permissionsManageDashbdsInPubFolders: Boolean! + + """Create and Customize Reports""" + permissionsCreateCustomizeReports: Boolean! + + """Create Report Folders""" + permissionsCreateReportFolders: Boolean! + + """View Reports in Public Folders""" + permissionsViewPublicReports: Boolean! + + """Manage Reports in Public Folders""" + permissionsManageReportsInPubFolders: Boolean! + + """Edit My Dashboards""" + permissionsEditMyDashboards: Boolean! + + """Edit My Reports""" + permissionsEditMyReports: Boolean! + + """View All Users""" + permissionsViewAllUsers: Boolean! + + """Knowledge One""" + permissionsAllowUniversalSearch: Boolean! + + """Connect Organization to Environment Hub""" + permissionsConnectOrgToEnvironmentHub: Boolean! + + """Enable Work.com Calibration""" + permissionsWorkCalibrationUser: Boolean! + + """Create and Customize List Views""" + permissionsCreateCustomizeFilters: Boolean! + + """Enable Work.com""" + permissionsWorkDotComUserPerm: Boolean! + + """Manage Communities""" + permissionsGovernNetworks: Boolean! + + """Sales Console""" + permissionsSalesConsole: Boolean! + + """Two-Factor Authentication for API Logins""" + permissionsTwoFactorApi: Boolean! + + """Delete Topics""" + permissionsDeleteTopics: Boolean! + + """Edit Topics""" + permissionsEditTopics: Boolean! + + """Create Topics""" + permissionsCreateTopics: Boolean! + + """Assign Topics""" + permissionsAssignTopics: Boolean! + + """Use Identity Features""" + permissionsIdentityEnabled: Boolean! + + """Use Identity Connect""" + permissionsIdentityConnect: Boolean! + + """Allow View Knowledge""" + permissionsAllowViewKnowledge: Boolean! + + """Access Libraries""" + permissionsContentWorkspaces: Boolean! + + """Manage Promoted Search Terms""" + permissionsManageSearchPromotionRules: Boolean! + + """Access Custom Mobile Apps""" + permissionsCustomMobileAppsAccess: Boolean! + + """View Help Link""" + permissionsViewHelpLink: Boolean! + + """Manage Profiles and Permission Sets""" + permissionsManageProfilesPermissionsets: Boolean! + + """Assign Permission Sets""" + permissionsAssignPermissionSets: Boolean! + + """Manage Roles""" + permissionsManageRoles: Boolean! + + """Manage IP Addresses""" + permissionsManageIpAddresses: Boolean! + + """Manage Sharing""" + permissionsManageSharing: Boolean! + + """Manage Internal Users""" + permissionsManageInternalUsers: Boolean! + + """Manage Password Policies""" + permissionsManagePasswordPolicies: Boolean! + + """Manage Login Access Policies""" + permissionsManageLoginAccessPolicies: Boolean! + + """Manage Custom Permissions""" + permissionsManageCustomPermissions: Boolean! + + """Verify Answers to Chatter Questions""" + permissionsCanVerifyComment: Boolean! + + """Manage Unlisted Groups""" + permissionsManageUnlistedGroups: Boolean! + + """Modify Secure Agents""" + permissionsModifySecureAgents: Boolean! + + """Manage Two-Factor Authentication in API""" + permissionsManageTwoFactor: Boolean! + + """Access Chatter For SharePoint""" + permissionsChatterForSharePoint: Boolean! + + """Lightning Experience User""" + permissionsLightningExperienceUser: Boolean! + + """Configure Custom Recommendations""" + permissionsConfigCustomRecs: Boolean! + + """Manage Macros Users Can't Undo""" + permissionsSubmitMacrosAllowed: Boolean! + + """Run Macros on Multiple Records""" + permissionsBulkMacrosAllowed: Boolean! + + """Share internal Knowledge articles externally""" + permissionsShareInternalArticles: Boolean! + + """Manage Session Permission Set Activations""" + permissionsManageSessionPermissionSets: Boolean! + + """Send announcement emails""" + permissionsSendAnnouncementEmails: Boolean! + + """Edit My Own Posts""" + permissionsChatterEditOwnPost: Boolean! + + """Edit Posts on Records I Own""" + permissionsChatterEditOwnRecordPost: Boolean! + + """Import Custom Objects""" + permissionsImportCustomObjects: Boolean! + + """Manage Two-Factor Authentication in User Interface""" + permissionsDelegatedTwoFactor: Boolean! + + """Allow Inclusion of Code Snippets from UI""" + permissionsChatterComposeUiCodesnippet: Boolean! + + """Select Files from Salesforce""" + permissionsSelectFilesFromSalesforce: Boolean! + + """Moderate Community Users""" + permissionsModerateNetworkUsers: Boolean! + + """Merge Topics""" + permissionsMergeTopics: Boolean! + + """Subscribe to Reports""" + permissionsSubscribeToLightningReports: Boolean! + + """Manage All Private Reports and Dashboards""" + permissionsManagePvtRptsAndDashbds: Boolean! + + """Lightning Login User""" + permissionsAllowLightningLogin: Boolean! + + """Campaign Influence""" + permissionsCampaignInfluence2: Boolean! + + """Access to view Data Assessment""" + permissionsViewDataAssessment: Boolean! + + """Remove People from Direct Messages""" + permissionsRemoveDirectMessageMembers: Boolean! + + """Can Approve Feed Post and Comment""" + permissionsCanApproveFeedPost: Boolean! + + """Add People to Direct Messages""" + permissionsAddDirectMessageMembers: Boolean! + + """View and Edit Converted Leads""" + permissionsAllowViewEditConvertedLeads: Boolean! + + """Show Company Name as Community Role""" + permissionsShowCompanyNameAsUserBadge: Boolean! + + """Access Community Management""" + permissionsAccessCmc: Boolean! + + """View Health Check""" + permissionsViewHealthCheck: Boolean! + + """Manage Health Check""" + permissionsManageHealthCheck: Boolean! + + """Create and Update Second-Generation Packages""" + permissionsPackaging2: Boolean! + + """Manage Certificates""" + permissionsManageCertificates: Boolean! + + """Report Builder (Lightning Experience)""" + permissionsCreateReportInLightning: Boolean! + + """Hide Option to Switch to Salesforce Classic""" + permissionsPreventClassicExperience: Boolean! + + """Hide the Seen By List""" + permissionsHideReadByList: Boolean! + + """Allow sending of List Emails""" + permissionsListEmailSend: Boolean! + + """Pin Posts in Feeds""" + permissionsFeedPinning: Boolean! + + """Change Dashboard Colors""" + permissionsChangeDashboardColors: Boolean! + + """IoT User""" + permissionsIotUser: Boolean! + + """Allow Access to Customized Actions""" + permissionsUseWebLink: Boolean! + + """View All Activities""" + permissionsViewAllActivities: Boolean! + + """Subscribe to Reports: Add Recipients""" + permissionsSubscribeReportToOtherUsers: Boolean! + + """Lightning Console User""" + permissionsLightningConsoleAllowedForUser: Boolean! + + """Subscribe to Reports: Set Running User""" + permissionsSubscribeReportsRunAsUser: Boolean! + + """Subscribe to Dashboards""" + permissionsSubscribeToLightningDashboards: Boolean! + + """Apex REST Services""" + permissionsApexRestServices: Boolean! + + """Show App Launcher in Communities""" + permissionsEnableCommunityAppLauncher: Boolean! + + """Manage Surveys""" + permissionsManageSurveys: Boolean! + + """View Roles and Role Hierarchy""" + permissionsViewRoles: Boolean! + + """Description""" + description: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Session Activation Required""" + hasActivationRequired: Boolean! + + """Collection of Salesforce FieldPermissions""" + fieldPerms( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFieldPermissionsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFieldPermissionsSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFieldPermissionsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FieldPermissions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFieldPermissionssConnection + + """Collection of Salesforce ObjectPermissions""" + objectPerms( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceObjectPermissionsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceObjectPermissionsSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceObjectPermissionsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ObjectPermissions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceObjectPermissionssConnection + + """Collection of Salesforce PermissionSetAssignment""" + assignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePermissionSetAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of PermissionSetAssignments to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePermissionSetAssignmentsConnection + + """Collection of Salesforce SessionPermSetActivation""" + sessionActivations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSessionPermSetActivationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSessionPermSetActivationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSessionPermSetActivationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of SessionPermSetActivations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSessionPermSetActivationsConnection + + """Collection of Salesforce SetupEntityAccess""" + setupEntityAccessItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSetupEntityAccessConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSetupEntityAccessSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSetupEntityAccessSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SetupEntityAccesses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSetupEntityAccesssConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Session Permission Set Activation""" +type SalesforceSessionPermSetActivation implements OneGraphNode { + """SessionPermSetActivation ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Auth Session ID""" + authSessionId: String! + + """Auth Session ID""" + authSession: SalesforceAuthSession! + + """PermissionSet ID""" + permissionSetId: String! + + """PermissionSet ID""" + permissionSet: SalesforcePermissionSet! + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """Description""" + description: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Session Permission Set Activations connection, for use in pagination. +""" +type SalesforceSessionPermSetActivationsConnection { + """ + The count of all Session Permission Set Activation you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Session Permission Set Activations""" + nodes: [SalesforceSessionPermSetActivation!]! + + """List of Session Permission Set Activation edges""" + edges: [SalesforceSessionPermSetActivationEdge!]! +} + +""" +A filter to be used against IdpEventLog object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceIdpEventLogConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the IdpEventLog's app relation.""" + app: SalesforceConnectedApplicationConnectionFilter + + """Filter by the IdpEventLog's authSession relation.""" + authSession: SalesforceAuthSessionConnectionFilter + + """Filter by the IdpEventLog's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the IdpEventLog's id field""" + id: SalesforceIdFilter + + """Filter by the IdpEventLog's initiatedBy field""" + initiatedBy: SalesforceStringFilter + + """Filter by the IdpEventLog's timestamp field""" + timestamp: SalesforceDateTimeFilter + + """Filter by the IdpEventLog's errorCode field""" + errorCode: SalesforceStringFilter + + """Filter by the IdpEventLog's samlEntityUrl field""" + samlEntityUrl: SalesforceStringFilter + + """Filter by the IdpEventLog's userId field""" + userId: SalesforceIdFilter + + """Filter by the IdpEventLog's authSessionId field""" + authSessionId: SalesforceIdFilter + + """Filter by the IdpEventLog's ssoType field""" + ssoType: SalesforceStringFilter + + """Filter by the IdpEventLog's appId field""" + appId: SalesforceIdFilter + + """Filter by the IdpEventLog's identityUsed field""" + identityUsed: SalesforceStringFilter + + """Filter by the IdpEventLog's optionsHasLogoutUrl field""" + optionsHasLogoutUrl: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceIdpEventLogConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceIdpEventLogConnectionFilter!] +} + +"""Field that Identity Provider Event Logs can be sorted by""" +enum SalesforceIdpEventLogSortByFieldEnum { + ID + INITIATED_BY + TIMESTAMP + ERROR_CODE + SAML_ENTITY_URL + USER_ID + AUTH_SESSION_ID + SSO_TYPE + APP_ID + IDENTITY_USED +} + +""" +A filter to be used against ConnectedApplication object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceConnectedApplicationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ConnectedApplication's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ConnectedApplication's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ConnectedApplication's id field""" + id: SalesforceIdFilter + + """Filter by the ConnectedApplication's name field""" + name: SalesforceStringFilter + + """Filter by the ConnectedApplication's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ConnectedApplication's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ConnectedApplication's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ConnectedApplication's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ConnectedApplication's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """ + Filter by the ConnectedApplication's optionsAllowAdminApprovedUsersOnly field + """ + optionsAllowAdminApprovedUsersOnly: SalesforceBooleanFilter + + """ + Filter by the ConnectedApplication's optionsRefreshTokenValidityMetric field + """ + optionsRefreshTokenValidityMetric: SalesforceBooleanFilter + + """ + Filter by the ConnectedApplication's optionsHasSessionLevelPolicy field + """ + optionsHasSessionLevelPolicy: SalesforceBooleanFilter + + """Filter by the ConnectedApplication's optionsIsInternal field""" + optionsIsInternal: SalesforceBooleanFilter + + """Filter by the ConnectedApplication's mobileSessionTimeout field""" + mobileSessionTimeout: SalesforceStringFilter + + """Filter by the ConnectedApplication's pinLength field""" + pinLength: SalesforceStringFilter + + """Filter by the ConnectedApplication's startUrl field""" + startUrl: SalesforceStringFilter + + """Filter by the ConnectedApplication's mobileStartUrl field""" + mobileStartUrl: SalesforceStringFilter + + """Filter by the ConnectedApplication's refreshTokenValidityPeriod field""" + refreshTokenValidityPeriod: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceConnectedApplicationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceConnectedApplicationConnectionFilter!] +} + +""" +A filter to be used against VerificationHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceVerificationHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the VerificationHistory's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the VerificationHistory's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the VerificationHistory's resource relation.""" + resource: SalesforceConnectedApplicationConnectionFilter + + """Filter by the VerificationHistory's loginGeo relation.""" + loginGeo: SalesforceLoginGeoConnectionFilter + + """Filter by the VerificationHistory's loginHistory relation.""" + loginHistory: SalesforceLoginHistoryConnectionFilter + + """Filter by the VerificationHistory's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the VerificationHistory's id field""" + id: SalesforceIdFilter + + """Filter by the VerificationHistory's eventGroup field""" + eventGroup: SalesforceIntFilter + + """Filter by the VerificationHistory's verificationTime field""" + verificationTime: SalesforceDateTimeFilter + + """Filter by the VerificationHistory's verificationMethod field""" + verificationMethod: SalesforceStringFilter + + """Filter by the VerificationHistory's userId field""" + userId: SalesforceIdFilter + + """Filter by the VerificationHistory's activity field""" + activity: SalesforceStringFilter + + """Filter by the VerificationHistory's status field""" + status: SalesforceStringFilter + + """Filter by the VerificationHistory's loginHistoryId field""" + loginHistoryId: SalesforceIdFilter + + """Filter by the VerificationHistory's sourceIp field""" + sourceIp: SalesforceStringFilter + + """Filter by the VerificationHistory's loginGeoId field""" + loginGeoId: SalesforceIdFilter + + """Filter by the VerificationHistory's remarks field""" + remarks: SalesforceStringFilter + + """Filter by the VerificationHistory's resourceId field""" + resourceId: SalesforceIdFilter + + """Filter by the VerificationHistory's policy field""" + policy: SalesforceStringFilter + + """Filter by the VerificationHistory's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the VerificationHistory's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the VerificationHistory's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the VerificationHistory's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the VerificationHistory's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the VerificationHistory's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceVerificationHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceVerificationHistoryConnectionFilter!] +} + +"""Field that Identity Verification Histories can be sorted by""" +enum SalesforceVerificationHistorySortByFieldEnum { + ID + EVENT_GROUP + VERIFICATION_TIME + VERIFICATION_METHOD + USER_ID + ACTIVITY + STATUS + LOGIN_HISTORY_ID + SOURCE_IP + LOGIN_GEO_ID + REMARKS + RESOURCE_ID + POLICY + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + IS_DELETED + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceVerificationHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceVerificationHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Identity Verification History""" +type SalesforceVerificationHistory implements OneGraphNode { + """Identity Verification ID""" + id: String! + + """Verification Attempt""" + eventGroup: Int! + + """Time""" + verificationTime: String! + + """Method""" + verificationMethod: String + + """User ID""" + userId: String! + + """User ID""" + user: SalesforceUser! + + """User Activity""" + activity: String! + + """Status""" + status: String! + + """Login History ID""" + loginHistoryId: String! + + """Login History ID""" + loginHistory: SalesforceLoginHistory! + + """Source IP""" + sourceIp: String! + + """Login Geo Data ID""" + loginGeoId: String + + """Login Geo Data ID""" + loginGeo: SalesforceLoginGeo + + """Activity Message""" + remarks: String + + """Connected App ID""" + resourceId: String + + """Connected App ID""" + resource: SalesforceConnectedApplication + + """Triggered By""" + policy: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Deleted""" + isDeleted: Boolean! + + """System Modstamp""" + systemModstamp: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Identity Verification Histories connection, for use in pagination. +""" +type SalesforceVerificationHistorysConnection { + """ + The count of all Identity Verification History you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Identity Verification Histories""" + nodes: [SalesforceVerificationHistory!]! + + """List of Identity Verification History edges""" + edges: [SalesforceVerificationHistoryEdge!]! +} + +""" +A filter to be used against AuthSession object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAuthSessionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AuthSession's loginGeo relation.""" + loginGeo: SalesforceLoginGeoConnectionFilter + + """Filter by the AuthSession's loginHistory relation.""" + loginHistory: SalesforceLoginHistoryConnectionFilter + + """Filter by the AuthSession's parent relation.""" + parent: SalesforceAuthSessionConnectionFilter + + """Filter by the AuthSession's users relation.""" + users: SalesforceUserConnectionFilter + + """Filter by the AuthSession's id field""" + id: SalesforceIdFilter + + """Filter by the AuthSession's usersId field""" + usersId: SalesforceIdFilter + + """Filter by the AuthSession's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AuthSession's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AuthSession's numSecondsValid field""" + numSecondsValid: SalesforceIntFilter + + """Filter by the AuthSession's userType field""" + userType: SalesforceStringFilter + + """Filter by the AuthSession's sourceIp field""" + sourceIp: SalesforceStringFilter + + """Filter by the AuthSession's loginType field""" + loginType: SalesforceStringFilter + + """Filter by the AuthSession's sessionType field""" + sessionType: SalesforceStringFilter + + """Filter by the AuthSession's sessionSecurityLevel field""" + sessionSecurityLevel: SalesforceStringFilter + + """Filter by the AuthSession's logoutUrl field""" + logoutUrl: SalesforceStringFilter + + """Filter by the AuthSession's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the AuthSession's loginHistoryId field""" + loginHistoryId: SalesforceIdFilter + + """Filter by the AuthSession's loginGeoId field""" + loginGeoId: SalesforceIdFilter + + """Filter by the AuthSession's isCurrent field""" + isCurrent: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAuthSessionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAuthSessionConnectionFilter!] +} + +"""Field that Auth Sessions can be sorted by""" +enum SalesforceAuthSessionSortByFieldEnum { + ID + USERS_ID + CREATED_DATE + LAST_MODIFIED_DATE + NUM_SECONDS_VALID + USER_TYPE + SOURCE_IP + LOGIN_TYPE + SESSION_TYPE + SESSION_SECURITY_LEVEL + LOGOUT_URL + PARENT_ID + LOGIN_HISTORY_ID + LOGIN_GEO_ID + IS_CURRENT +} + +"""An edge in a connection.""" +type SalesforceAuthSessionEdge { + """The item at the end of the edge.""" + node: SalesforceAuthSession! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Auth Sessions connection, for use in pagination.""" +type SalesforceAuthSessionsConnection { + """The count of all Auth Session you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Auth Sessions""" + nodes: [SalesforceAuthSession!]! + + """List of Auth Session edges""" + edges: [SalesforceAuthSessionEdge!]! +} + +"""Login Geo Data""" +type SalesforceLoginGeo implements OneGraphNode { + """Login Geo Data ID""" + id: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Deleted""" + isDeleted: Boolean! + + """System Modstamp""" + systemModstamp: String! + + """Login Time""" + loginTime: String! + + """Country Code""" + countryIso: String + + """Country""" + country: String + + """Latitude""" + latitude: Float + + """Longitude""" + longitude: Float + + """City""" + city: String + + """PostalCode""" + postalCode: String + + """Subdivision""" + subdivision: String + + """Collection of Salesforce AuthSession""" + authSessions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthSessionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuthSessionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthSessionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuthSessions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthSessionsConnection + + """Collection of Salesforce LoginHistory""" + loginHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLoginHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLoginHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLoginHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LoginHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLoginHistorysConnection + + """Collection of Salesforce VerificationHistory""" + verificationHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVerificationHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceVerificationHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVerificationHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of VerificationHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceVerificationHistorysConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against LoginGeo object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceLoginGeoConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the LoginGeo's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the LoginGeo's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the LoginGeo's id field""" + id: SalesforceIdFilter + + """Filter by the LoginGeo's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the LoginGeo's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the LoginGeo's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the LoginGeo's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the LoginGeo's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the LoginGeo's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the LoginGeo's loginTime field""" + loginTime: SalesforceDateTimeFilter + + """Filter by the LoginGeo's countryIso field""" + countryIso: SalesforceStringFilter + + """Filter by the LoginGeo's country field""" + country: SalesforceStringFilter + + """Filter by the LoginGeo's latitude field""" + latitude: SalesforceFloatFilter + + """Filter by the LoginGeo's longitude field""" + longitude: SalesforceFloatFilter + + """Filter by the LoginGeo's city field""" + city: SalesforceStringFilter + + """Filter by the LoginGeo's postalCode field""" + postalCode: SalesforceStringFilter + + """Filter by the LoginGeo's subdivision field""" + subdivision: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceLoginGeoConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceLoginGeoConnectionFilter!] +} + +""" +A filter to be used against LoginHistory object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceLoginHistoryConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the LoginHistory's loginGeo relation.""" + loginGeo: SalesforceLoginGeoConnectionFilter + + """Filter by the LoginHistory's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the LoginHistory's id field""" + id: SalesforceIdFilter + + """Filter by the LoginHistory's userId field""" + userId: SalesforceIdFilter + + """Filter by the LoginHistory's loginTime field""" + loginTime: SalesforceDateTimeFilter + + """Filter by the LoginHistory's loginType field""" + loginType: SalesforceStringFilter + + """Filter by the LoginHistory's sourceIp field""" + sourceIp: SalesforceStringFilter + + """Filter by the LoginHistory's loginUrl field""" + loginUrl: SalesforceStringFilter + + """Filter by the LoginHistory's authenticationServiceId field""" + authenticationServiceId: SalesforceIdFilter + + """Filter by the LoginHistory's loginGeoId field""" + loginGeoId: SalesforceIdFilter + + """Filter by the LoginHistory's tlsProtocol field""" + tlsProtocol: SalesforceStringFilter + + """Filter by the LoginHistory's cipherSuite field""" + cipherSuite: SalesforceStringFilter + + """Filter by the LoginHistory's countryIso field""" + countryIso: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceLoginHistoryConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceLoginHistoryConnectionFilter!] +} + +"""Field that Login Histories can be sorted by""" +enum SalesforceLoginHistorySortByFieldEnum { + ID + USER_ID + LOGIN_TIME + LOGIN_TYPE + SOURCE_IP + LOGIN_URL + AUTHENTICATION_SERVICE_ID + LOGIN_GEO_ID + TLS_PROTOCOL + CIPHER_SUITE + BROWSER + PLATFORM + STATUS + APPLICATION + CLIENT_VERSION + API_TYPE + API_VERSION + COUNTRY_ISO +} + +"""An edge in a connection.""" +type SalesforceLoginHistoryEdge { + """The item at the end of the edge.""" + node: SalesforceLoginHistory! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Login Histories connection, for use in pagination.""" +type SalesforceLoginHistorysConnection { + """The count of all Login History you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Login Histories""" + nodes: [SalesforceLoginHistory!]! + + """List of Login History edges""" + edges: [SalesforceLoginHistoryEdge!]! +} + +"""An edge in a connection.""" +type SalesforceAuthConfigProvidersEdge { + """The item at the end of the edge.""" + node: SalesforceAuthConfigProviders! + + """A cursor for use in pagination""" + cursor: String! +} + +union SalesforceAuthConfigProvidersAuthProviderUnion = SalesforceSamlSsoConfig | SalesforceAuthProvider + +""" +A filter to be used against AuthConfig object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAuthConfigConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AuthConfig's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AuthConfig's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AuthConfig's id field""" + id: SalesforceIdFilter + + """Filter by the AuthConfig's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AuthConfig's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the AuthConfig's language field""" + language: SalesforceStringFilter + + """Filter by the AuthConfig's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the AuthConfig's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the AuthConfig's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AuthConfig's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AuthConfig's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AuthConfig's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AuthConfig's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AuthConfig's url field""" + url: SalesforceStringFilter + + """Filter by the AuthConfig's authOptionsUsernamePassword field""" + authOptionsUsernamePassword: SalesforceBooleanFilter + + """Filter by the AuthConfig's authOptionsSaml field""" + authOptionsSaml: SalesforceBooleanFilter + + """Filter by the AuthConfig's authOptionsAuthProvider field""" + authOptionsAuthProvider: SalesforceBooleanFilter + + """Filter by the AuthConfig's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the AuthConfig's type field""" + type: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAuthConfigConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAuthConfigConnectionFilter!] +} + +""" +A filter to be used against AuthConfigProviders object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAuthConfigProvidersConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AuthConfigProviders's authConfig relation.""" + authConfig: SalesforceAuthConfigConnectionFilter + + """Filter by the AuthConfigProviders's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AuthConfigProviders's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AuthConfigProviders's id field""" + id: SalesforceIdFilter + + """Filter by the AuthConfigProviders's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AuthConfigProviders's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AuthConfigProviders's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AuthConfigProviders's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AuthConfigProviders's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AuthConfigProviders's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AuthConfigProviders's authConfigId field""" + authConfigId: SalesforceIdFilter + + """Filter by the AuthConfigProviders's authProviderId field""" + authProviderId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAuthConfigProvidersConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAuthConfigProvidersConnectionFilter!] +} + +""" +Field that Authentication Configuration Auth. Providers can be sorted by +""" +enum SalesforceAuthConfigProvidersSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + AUTH_CONFIG_ID + AUTH_PROVIDER_ID +} + +"""Authentication Configuration""" +type SalesforceAuthConfig implements OneGraphNode { + """Authentication Configuration ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String! + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """URL""" + url: String! + + """UsernamePassword""" + authOptionsUsernamePassword: Boolean! + + """Saml""" + authOptionsSaml: Boolean! + + """AuthProvider""" + authOptionsAuthProvider: Boolean! + + """Is Active""" + isActive: Boolean! + + """Authentication Configuration Type""" + type: String! + + """Collection of Salesforce AuthConfigProviders""" + authProvidersForConfig( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthConfigProvidersConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuthConfigProvidersSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthConfigProvidersSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuthConfigProviders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthConfigProviderssConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Authentication Configuration Auth. Provider""" +type SalesforceAuthConfigProviders implements OneGraphNode { + """Auth Config Provider ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Authentication Configuration ID""" + authConfigId: String! + + """Authentication Configuration ID""" + authConfig: SalesforceAuthConfig! + + """Authentication Provider ID""" + authProviderId: String! + + """Authentication Provider ID""" + authProvider: SalesforceAuthConfigProvidersAuthProviderUnion! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Authentication Configuration Auth. Providers connection, for use in pagination. +""" +type SalesforceAuthConfigProviderssConnection { + """ + The count of all Authentication Configuration Auth. Provider you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Authentication Configuration Auth. Providers""" + nodes: [SalesforceAuthConfigProviders!]! + + """List of Authentication Configuration Auth. Provider edges""" + edges: [SalesforceAuthConfigProvidersEdge!]! +} + +"""SAML Single Sign-On Setting""" +type SalesforceSamlSsoConfig implements OneGraphNode { + """SAML Single Sign-On Setting ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String! + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """SAML Version""" + version: String! + + """Issuer""" + issuer: String! + + """SpInitBinding""" + optionsSpInitBinding: Boolean! + + """UserProvisioning""" + optionsUserProvisioning: Boolean! + + """Name ID Format""" + attributeFormat: String + + """Attribute Name""" + attributeName: String + + """Entity ID""" + audience: String! + + """SAML Identity Type""" + identityMapping: String! + + """SAML Identity Location""" + identityLocation: String! + + """Class ID""" + samlJitHandlerId: String + + """Class ID""" + samlJitHandler: SalesforceApexClass + + """User ID""" + executionUserId: String + + """User ID""" + executionUser: SalesforceUser + + """Identity Provider Login URL""" + loginUrl: String + + """Identity Provider Logout URL""" + logoutUrl: String + + """Custom Error URL""" + errorUrl: String + + """Identity Provider Certificate""" + validationCert: String! + + """Request Signature Method""" + requestSignatureMethod: String + + """Identity Provider Single Logout URL""" + singleLogoutUrl: String + + """Single Logout Request Binding""" + singleLogoutBinding: String + + """Collection of Salesforce AuthConfigProviders""" + authConfigProvidersPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthConfigProvidersConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuthConfigProvidersSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthConfigProvidersSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuthConfigProviders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthConfigProviderssConnection + + """Collection of Salesforce LoginHistory""" + loginHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLoginHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLoginHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLoginHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LoginHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLoginHistorysConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceLoginHistoryAuthenticationServiceUnion = SalesforceSamlSsoConfig | SalesforceAuthProvider + +"""Login History""" +type SalesforceLoginHistory implements OneGraphNode { + """Login History Id""" + id: String! + + """User ID""" + userId: String + + """User ID""" + user: SalesforceUser + + """Login Time""" + loginTime: String! + + """Login Type""" + loginType: String! + + """Source IP""" + sourceIp: String + + """Login URL""" + loginUrl: String + + """Authentication Service ID""" + authenticationServiceId: String + + """Authentication Service ID""" + authenticationService: SalesforceLoginHistoryAuthenticationServiceUnion + + """Login Geo Data ID""" + loginGeoId: String + + """Login Geo Data ID""" + loginGeo: SalesforceLoginGeo + + """TLS Protocol""" + tlsProtocol: String + + """TLS Cipher Suite""" + cipherSuite: String + + """Browser""" + browser: String + + """Platform""" + platform: String + + """Status""" + status: String + + """Application""" + application: String + + """Client Version""" + clientVersion: String + + """API Type""" + apiType: String + + """API Version""" + apiVersion: String + + """Country Code""" + countryIso: String + + """Collection of Salesforce AuthSession""" + authSessions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthSessionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuthSessionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthSessionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuthSessions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthSessionsConnection + + """Collection of Salesforce VerificationHistory""" + verificationHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVerificationHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceVerificationHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVerificationHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of VerificationHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceVerificationHistorysConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Auth Session""" +type SalesforceAuthSession implements OneGraphNode { + """Auth Session ID""" + id: String! + + """User ID""" + usersId: String + + """User ID""" + users: SalesforceUser + + """Created""" + createdDate: String! + + """Updated""" + lastModifiedDate: String! + + """Valid For""" + numSecondsValid: Int! + + """User Type""" + userType: String! + + """Source IP""" + sourceIp: String! + + """Login""" + loginType: String + + """Session Type""" + sessionType: String + + """Session Security Level""" + sessionSecurityLevel: String + + """Logout URL""" + logoutUrl: String + + """Auth Session ID""" + parentId: String + + """Auth Session ID""" + parent: SalesforceAuthSession + + """Login History ID""" + loginHistoryId: String + + """Login History ID""" + loginHistory: SalesforceLoginHistory + + """Login Geo Data ID""" + loginGeoId: String + + """Login Geo Data ID""" + loginGeo: SalesforceLoginGeo + + """Current Session""" + isCurrent: Boolean! + + """Collection of Salesforce AuthSession""" + authSessions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthSessionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuthSessionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthSessionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuthSessions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthSessionsConnection + + """Collection of Salesforce IdpEventLog""" + idpEventLogs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdpEventLogConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceIdpEventLogSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdpEventLogSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of IdpEventLogs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdpEventLogsConnection + + """Collection of Salesforce SessionPermSetActivation""" + sessionPermSetActivations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSessionPermSetActivationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSessionPermSetActivationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSessionPermSetActivationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of SessionPermSetActivations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSessionPermSetActivationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Identity Provider Event Log""" +type SalesforceIdpEventLog implements OneGraphNode { + """Event Log Entry ID""" + id: String! + + """Usage Type""" + initiatedBy: String! + + """Timestamp""" + timestamp: String + + """Status""" + errorCode: String! + + """Entity ID""" + samlEntityUrl: String! + + """User ID""" + userId: String + + """User ID""" + user: SalesforceUser + + """Auth Session ID""" + authSessionId: String + + """Auth Session ID""" + authSession: SalesforceAuthSession + + """SSO Type""" + ssoType: String + + """Connected App ID""" + appId: String + + """Connected App ID""" + app: SalesforceConnectedApplication + + """Identity Used""" + identityUsed: String + + """Has Logout URL""" + optionsHasLogoutUrl: Boolean! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Identity Provider Event Logs connection, for use in pagination. +""" +type SalesforceIdpEventLogsConnection { + """ + The count of all Identity Provider Event Log you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Identity Provider Event Logs""" + nodes: [SalesforceIdpEventLog!]! + + """List of Identity Provider Event Log edges""" + edges: [SalesforceIdpEventLogEdge!]! +} + +"""Connected App""" +type SalesforceConnectedApplication implements OneGraphNode { + """Connected App ID""" + id: String! + + """Connected App Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """AllowAdminApprovedUsersOnly""" + optionsAllowAdminApprovedUsersOnly: Boolean! + + """RefreshTokenValidityMetric""" + optionsRefreshTokenValidityMetric: Boolean! + + """HasSessionLevelPolicy""" + optionsHasSessionLevelPolicy: Boolean! + + """isInternal""" + optionsIsInternal: Boolean! + + """Require PIN after:""" + mobileSessionTimeout: String + + """Pin Length""" + pinLength: String + + """Start URL""" + startUrl: String + + """Mobile Start URL""" + mobileStartUrl: String + + """Refresh Token Policy:""" + refreshTokenValidityPeriod: Int + + """Collection of Salesforce IdpEventLog""" + idpEventLogs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdpEventLogConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceIdpEventLogSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdpEventLogSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of IdpEventLogs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdpEventLogsConnection + + """Collection of Salesforce InstalledMobileApp""" + installedMobileApps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceInstalledMobileAppConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceInstalledMobileAppSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceInstalledMobileAppSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of InstalledMobileApps to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceInstalledMobileAppsConnection + + """Collection of Salesforce SetupEntityAccess""" + setupEntityAccessItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSetupEntityAccessConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSetupEntityAccessSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSetupEntityAccessSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SetupEntityAccesses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSetupEntityAccesssConnection + + """Collection of Salesforce UserAppMenuCustomization""" + userAppMenuCustomizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserAppMenuCustomizationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserAppMenuCustomizationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserAppMenuCustomizationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserAppMenuCustomizations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserAppMenuCustomizationsConnection + + """Collection of Salesforce UserProvAccount""" + userProvAccounts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvAccountConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvAccountSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvAccountSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserProvAccounts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserProvAccountsConnection + + """Collection of Salesforce UserProvAccountStaging""" + userProvAccountStagings( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvAccountStagingConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvAccountStagingSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvAccountStagingSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvAccountStagings to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvAccountStagingsConnection + + """Collection of Salesforce UserProvisioningConfig""" + userProvisioningConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningConfigSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningConfigs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningConfigsConnection + + """Collection of Salesforce UserProvisioningRequest""" + userProvisioningRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningRequestSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningRequests to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningRequestsConnection + + """Collection of Salesforce VerificationHistory""" + verificationHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVerificationHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceVerificationHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVerificationHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of VerificationHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceVerificationHistorysConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceUserProvisioningRequestOwnerUnion = SalesforceUser | SalesforceGroup + +"""User Provisioning Request""" +type SalesforceUserProvisioningRequest implements OneGraphNode { + """UserProvisioningRequest ID""" + id: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUserProvisioningRequestOwnerUnion! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """User ID""" + salesforceUserId: String + + """User ID""" + salesforceUser: SalesforceUser + + """External User Id""" + externalUserId: String + + """App Name""" + appName: String + + """State""" + state: String! + + """Operation""" + operation: String! + + """Scheduled Provisioning Time""" + scheduleDate: String + + """Connected App ID""" + connectedAppId: String + + """Connected App ID""" + connectedApp: SalesforceConnectedApplication + + """UserProvisioningConfig ID""" + userProvConfigId: String + + """UserProvisioningConfig ID""" + userProvConfig: SalesforceUserProvisioningConfig + + """User Provisioning Account ID""" + userProvAccountId: String + + """User Provisioning Account ID""" + userProvAccount: SalesforceUserProvAccount + + """Approval Status""" + approvalStatus: String! + + """User ID""" + managerId: String + + """User ID""" + manager: SalesforceUser + + """Retry Count""" + retryCount: Int + + """UserProvisioningRequest ID""" + parentId: String + + """UserProvisioningRequest ID""" + parent: SalesforceUserProvisioningRequest + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce UserProvisioningLog""" + userProvisioningLogs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningLogConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningLogSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningLogSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningLogs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningLogsConnection + + """Collection of Salesforce UserProvisioningRequest""" + userProvisioningRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningRequestSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningRequests to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningRequestsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Wave Compatibility Check Item""" +type SalesforceWaveCompatibilityCheckItem implements OneGraphNode { + """Checklist Item Id""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Checklist Item Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Checklist Item Task Name""" + taskName: String! + + """Checklist Item Result""" + taskResult: String! + + """Wave Template Api Name""" + templateApiName: String! + + """Wave Template Version""" + templateVersion: String + + """Checklist Task Payload""" + payload: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceFlowRecordRelationRelatedRecordUnion = SalesforceWaveCompatibilityCheckItem | SalesforceUserProvisioningRequest | SalesforceUserProvisioningLog | SalesforceUserProvMockTarget | SalesforceUserProvAccountStaging | SalesforceUserProvAccount | SalesforceUserAppMenuCustomization | SalesforceUserAppInfo | SalesforceTopicAssignment | SalesforceTopic | SalesforceTodayGoal | SalesforceTask | SalesforceStreamingChannel | SalesforceSolution | SalesforceSearchPromotionRule | SalesforceSearchActivity | SalesforceReport | SalesforceQuickText | SalesforcePushTopic | SalesforceProduct2 | SalesforceProcessInstanceNode | SalesforceProcessInstance | SalesforcePricebookEntry | SalesforcePricebook2 | SalesforcePartner | SalesforceOrgDeleteRequest | SalesforceOrderItem | SalesforceOrder | SalesforceOpportunityLineItem | SalesforceOpportunityContactRole | SalesforceOpportunity | SalesforceNote | SalesforceMacroInstruction | SalesforceMacro | SalesforceListEmailRecipientSource | SalesforceListEmail | SalesforceLeadCleanInfo | SalesforceLead | SalesforceInstalledMobileApp | SalesforceIdea | SalesforceForecastShare | SalesforceFileSearchActivity | SalesforceFeedRevision | SalesforceFeedPollVote | SalesforceFeedPollChoice | SalesforceFeedItem | SalesforceFeedComment | SalesforceFeedAttachment | SalesforceEventRelation | SalesforceEvent | SalesforceEntitySubscription | SalesforceEmailMessageRelation | SalesforceEmailMessage | SalesforceDuplicateRecordSet | SalesforceDuplicateRecordItem | SalesforceDocument | SalesforceDatacloudPurchaseUsage | SalesforceDatacloudOwnedEntity | SalesforceDataAssessmentValueMetric | SalesforceDataAssessmentMetric | SalesforceDataAssessmentFieldMetric | SalesforceDashboardComponent | SalesforceDashboard | SalesforceDandBCompany | SalesforceContractContactRole | SalesforceContract | SalesforceContentWorkspaceDoc | SalesforceContentVersionRating | SalesforceContentVersionComment | SalesforceContentVersion | SalesforceContentNotification | SalesforceContentFolderMember | SalesforceContentFolderLink | SalesforceContentFolder | SalesforceContentDocumentSubscription | SalesforceContentDocumentLink | SalesforceContentDocument | SalesforceContentDistribution | SalesforceContactCleanInfo | SalesforceContact | SalesforceCollaborationInvitation | SalesforceCollaborationGroupRecord | SalesforceCollaborationGroupMemberRequest | SalesforceCollaborationGroupMember | SalesforceCollaborationGroup | SalesforceCaseSolution | SalesforceCaseContactRole | SalesforceCase | SalesforceCampaignMember | SalesforceCampaign | SalesforceBackgroundOperation | SalesforceAttachment | SalesforceAsyncApexJob | SalesforceAssetRelationship | SalesforceAsset | SalesforceApexTestQueueItem | SalesforceAnnouncement | SalesforceAccountContactRole | SalesforceAccountCleanInfo | SalesforceAccount + +""" +A filter to be used against FlowInterview object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFlowInterviewConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FlowInterview's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the FlowInterview's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the FlowInterview's id field""" + id: SalesforceIdFilter + + """Filter by the FlowInterview's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the FlowInterview's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the FlowInterview's name field""" + name: SalesforceStringFilter + + """Filter by the FlowInterview's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the FlowInterview's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the FlowInterview's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the FlowInterview's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the FlowInterview's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the FlowInterview's currentElement field""" + currentElement: SalesforceStringFilter + + """Filter by the FlowInterview's interviewLabel field""" + interviewLabel: SalesforceStringFilter + + """Filter by the FlowInterview's pauseLabel field""" + pauseLabel: SalesforceStringFilter + + """Filter by the FlowInterview's guid field""" + guid: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFlowInterviewConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFlowInterviewConnectionFilter!] +} + +""" +A filter to be used against FlowRecordRelation object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceFlowRecordRelationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the FlowRecordRelation's parent relation.""" + parent: SalesforceFlowInterviewConnectionFilter + + """Filter by the FlowRecordRelation's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the FlowRecordRelation's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the FlowRecordRelation's id field""" + id: SalesforceIdFilter + + """Filter by the FlowRecordRelation's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the FlowRecordRelation's name field""" + name: SalesforceStringFilter + + """Filter by the FlowRecordRelation's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the FlowRecordRelation's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the FlowRecordRelation's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the FlowRecordRelation's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the FlowRecordRelation's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the FlowRecordRelation's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the FlowRecordRelation's relatedRecordId field""" + relatedRecordId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceFlowRecordRelationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceFlowRecordRelationConnectionFilter!] +} + +"""Field that Flow Record Relations can be sorted by""" +enum SalesforceFlowRecordRelationSortByFieldEnum { + ID + IS_DELETED + NAME + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + PARENT_ID + RELATED_RECORD_ID +} + +union SalesforceFlowInterviewOwnerUnion = SalesforceUser | SalesforceGroup + +"""Flow Interview""" +type SalesforceFlowInterview implements OneGraphNode { + """Flow Interview Id""" + id: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceFlowInterviewOwnerUnion! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Current Element""" + currentElement: String + + """Interview Label""" + interviewLabel: String + + """Pause Reason""" + pauseLabel: String + + """Flow Interview Guid""" + guid: String + + """Collection of Salesforce FlowRecordRelation""" + recordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Flow Record Relation""" +type SalesforceFlowRecordRelation implements OneGraphNode { + """Flow Record Relation ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + name: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Flow Interview ID""" + parentId: String! + + """Flow Interview ID""" + parent: SalesforceFlowInterview! + + """Record ID""" + relatedRecordId: String! + + """Record ID""" + relatedRecord: SalesforceFlowRecordRelationRelatedRecordUnion! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Flow Record Relations connection, for use in pagination.""" +type SalesforceFlowRecordRelationsConnection { + """ + The count of all Flow Record Relation you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Flow Record Relations""" + nodes: [SalesforceFlowRecordRelation!]! + + """List of Flow Record Relation edges""" + edges: [SalesforceFlowRecordRelationEdge!]! +} + +"""Field that Apex Jobs can be sorted by""" +enum SalesforceAsyncApexJobSortByFieldEnum { + ID + CREATED_DATE + CREATED_BY_ID + JOB_TYPE + APEX_CLASS_ID + STATUS + JOB_ITEMS_PROCESSED + TOTAL_JOB_ITEMS + NUMBER_OF_ERRORS + COMPLETED_DATE + METHOD_NAME + EXTENDED_STATUS + PARENT_JOB_ID + LAST_PROCESSED + LAST_PROCESSED_OFFSET +} + +"""An edge in a connection.""" +type SalesforceAsyncApexJobEdge { + """The item at the end of the edge.""" + node: SalesforceAsyncApexJob! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Apex Jobs connection, for use in pagination.""" +type SalesforceAsyncApexJobsConnection { + """The count of all Apex Job you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Apex Jobs""" + nodes: [SalesforceAsyncApexJob!]! + + """List of Apex Job edges""" + edges: [SalesforceAsyncApexJobEdge!]! +} + +"""Field that Apex Test Run Results can be sorted by""" +enum SalesforceApexTestRunResultSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + ASYNC_APEX_JOB_ID + USER_ID + JOB_NAME + IS_ALL_TESTS + SOURCE + START_TIME + END_TIME + TEST_TIME + STATUS + CLASSES_ENQUEUED + CLASSES_COMPLETED + METHODS_ENQUEUED + METHODS_COMPLETED + METHODS_FAILED +} + +"""An edge in a connection.""" +type SalesforceApexTestRunResultEdge { + """The item at the end of the edge.""" + node: SalesforceApexTestRunResult! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Apex Test Run Results connection, for use in pagination.""" +type SalesforceApexTestRunResultsConnection { + """ + The count of all Apex Test Run Result you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Apex Test Run Results""" + nodes: [SalesforceApexTestRunResult!]! + + """List of Apex Test Run Result edges""" + edges: [SalesforceApexTestRunResultEdge!]! +} + +"""An edge in a connection.""" +type SalesforceApexTestResultEdge { + """The item at the end of the edge.""" + node: SalesforceApexTestResult! + + """A cursor for use in pagination""" + cursor: String! +} + +""" +A filter to be used against ApexTestResultLimits object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceApexTestResultLimitsConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ApexTestResultLimits's apexTestResult relation.""" + apexTestResult: SalesforceApexTestResultConnectionFilter + + """Filter by the ApexTestResultLimits's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ApexTestResultLimits's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ApexTestResultLimits's id field""" + id: SalesforceIdFilter + + """Filter by the ApexTestResultLimits's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ApexTestResultLimits's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ApexTestResultLimits's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ApexTestResultLimits's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ApexTestResultLimits's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ApexTestResultLimits's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ApexTestResultLimits's apexTestResultId field""" + apexTestResultId: SalesforceIdFilter + + """Filter by the ApexTestResultLimits's soql field""" + soql: SalesforceIntFilter + + """Filter by the ApexTestResultLimits's queryRows field""" + queryRows: SalesforceIntFilter + + """Filter by the ApexTestResultLimits's sosl field""" + sosl: SalesforceIntFilter + + """Filter by the ApexTestResultLimits's dml field""" + dml: SalesforceIntFilter + + """Filter by the ApexTestResultLimits's dmlRows field""" + dmlRows: SalesforceIntFilter + + """Filter by the ApexTestResultLimits's cpu field""" + cpu: SalesforceIntFilter + + """Filter by the ApexTestResultLimits's callouts field""" + callouts: SalesforceIntFilter + + """Filter by the ApexTestResultLimits's email field""" + email: SalesforceIntFilter + + """Filter by the ApexTestResultLimits's asyncCalls field""" + asyncCalls: SalesforceIntFilter + + """Filter by the ApexTestResultLimits's mobilePush field""" + mobilePush: SalesforceIntFilter + + """Filter by the ApexTestResultLimits's limitContext field""" + limitContext: SalesforceStringFilter + + """Filter by the ApexTestResultLimits's limitExceptions field""" + limitExceptions: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceApexTestResultLimitsConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceApexTestResultLimitsConnectionFilter!] +} + +"""Field that Apex Test Result Limits can be sorted by""" +enum SalesforceApexTestResultLimitsSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + APEX_TEST_RESULT_ID + SOQL + QUERY_ROWS + SOSL + DML + DML_ROWS + CPU + CALLOUTS + EMAIL + ASYNC_CALLS + MOBILE_PUSH + LIMIT_CONTEXT + LIMIT_EXCEPTIONS +} + +"""An edge in a connection.""" +type SalesforceApexTestResultLimitsEdge { + """The item at the end of the edge.""" + node: SalesforceApexTestResultLimits! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Apex Test Result Limit""" +type SalesforceApexTestResultLimits implements OneGraphNode { + """ApexTestResultLimits ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Apex Test Result ID""" + apexTestResultId: String! + + """Apex Test Result ID""" + apexTestResult: SalesforceApexTestResult! + + """Total number of SOQL queries issued""" + soql: Int! + + """Total number of records retrieved by SOQL queries""" + queryRows: Int! + + """Total number of SOSL queries issued""" + sosl: Int! + + """Total number of DML statements issued""" + dml: Int! + + """Total number of records processed as a result of DML statements""" + dmlRows: Int! + + """Maximum CPU time on the Salesforce servers""" + cpu: Int! + + """Total number of callouts""" + callouts: Int! + + """Total number of sendEmail methods allowed""" + email: Int! + + """Total number of async calls""" + asyncCalls: Int! + + """ + Maximum number of push notification method calls allowed per Apex transaction + """ + mobilePush: Int! + + """LimitContext""" + limitContext: String + + """LimitExceptions""" + limitExceptions: String + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Apex Test Result Limits connection, for use in pagination.""" +type SalesforceApexTestResultLimitssConnection { + """ + The count of all Apex Test Result Limit you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Apex Test Result Limits""" + nodes: [SalesforceApexTestResultLimits!]! + + """List of Apex Test Result Limit edges""" + edges: [SalesforceApexTestResultLimitsEdge!]! +} + +"""Apex Test Run Result""" +type SalesforceApexTestRunResult implements OneGraphNode { + """ApexTestRunResult ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Apex Job ID""" + asyncApexJobId: String + + """Apex Job ID""" + asyncApexJob: SalesforceAsyncApexJob + + """User ID""" + userId: String + + """User ID""" + user: SalesforceUser + + """Name of the job""" + jobName: String + + """allTests""" + isAllTests: Boolean! + + """Client that kicked off the test run""" + source: String + + """Start time of the test run""" + startTime: String! + + """End time of the test run""" + endTime: String + + """Time(ms) actually spent running tests""" + testTime: Int + + """Status of the test run""" + status: String! + + """Number of classes enqueued in this test run""" + classesEnqueued: Int! + + """Number of classes completed in this test run""" + classesCompleted: Int + + """Number of methods enqueued in this test run""" + methodsEnqueued: Int + + """Number of methods completed in this test run""" + methodsCompleted: Int + + """Number of methods failed in this test run""" + methodsFailed: Int + + """Collection of Salesforce ApexTestQueueItem""" + apexTestQueueItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestQueueItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestQueueItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestQueueItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestQueueItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestQueueItemsConnection + + """Collection of Salesforce ApexTestResult""" + apexTestResults( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestResultConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestResultSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestResultSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestResults to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestResultsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +A filter to be used against ApexLog object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceApexLogConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ApexLog's logUser relation.""" + logUser: SalesforceUserConnectionFilter + + """Filter by the ApexLog's id field""" + id: SalesforceIdFilter + + """Filter by the ApexLog's logUserId field""" + logUserId: SalesforceIdFilter + + """Filter by the ApexLog's logLength field""" + logLength: SalesforceIntFilter + + """Filter by the ApexLog's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ApexLog's request field""" + request: SalesforceStringFilter + + """Filter by the ApexLog's operation field""" + operation: SalesforceStringFilter + + """Filter by the ApexLog's application field""" + application: SalesforceStringFilter + + """Filter by the ApexLog's status field""" + status: SalesforceStringFilter + + """Filter by the ApexLog's durationMilliseconds field""" + durationMilliseconds: SalesforceIntFilter + + """Filter by the ApexLog's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ApexLog's startTime field""" + startTime: SalesforceDateTimeFilter + + """Filter by the ApexLog's location field""" + location: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceApexLogConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceApexLogConnectionFilter!] +} + +""" +A filter to be used against ApexTestResult object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceApexTestResultConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ApexTestResult's apexTestRunResult relation.""" + apexTestRunResult: SalesforceApexTestRunResultConnectionFilter + + """Filter by the ApexTestResult's apexLog relation.""" + apexLog: SalesforceApexLogConnectionFilter + + """Filter by the ApexTestResult's queueItem relation.""" + queueItem: SalesforceApexTestQueueItemConnectionFilter + + """Filter by the ApexTestResult's asyncApexJob relation.""" + asyncApexJob: SalesforceAsyncApexJobConnectionFilter + + """Filter by the ApexTestResult's apexClass relation.""" + apexClass: SalesforceApexClassConnectionFilter + + """Filter by the ApexTestResult's id field""" + id: SalesforceIdFilter + + """Filter by the ApexTestResult's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ApexTestResult's testTimestamp field""" + testTimestamp: SalesforceDateTimeFilter + + """Filter by the ApexTestResult's outcome field""" + outcome: SalesforceStringFilter + + """Filter by the ApexTestResult's apexClassId field""" + apexClassId: SalesforceIdFilter + + """Filter by the ApexTestResult's methodName field""" + methodName: SalesforceStringFilter + + """Filter by the ApexTestResult's message field""" + message: SalesforceStringFilter + + """Filter by the ApexTestResult's stackTrace field""" + stackTrace: SalesforceStringFilter + + """Filter by the ApexTestResult's asyncApexJobId field""" + asyncApexJobId: SalesforceIdFilter + + """Filter by the ApexTestResult's queueItemId field""" + queueItemId: SalesforceIdFilter + + """Filter by the ApexTestResult's apexLogId field""" + apexLogId: SalesforceIdFilter + + """Filter by the ApexTestResult's apexTestRunResultId field""" + apexTestRunResultId: SalesforceIdFilter + + """Filter by the ApexTestResult's runTime field""" + runTime: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceApexTestResultConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceApexTestResultConnectionFilter!] +} + +"""Field that Apex Test Results can be sorted by""" +enum SalesforceApexTestResultSortByFieldEnum { + ID + SYSTEM_MODSTAMP + TEST_TIMESTAMP + OUTCOME + APEX_CLASS_ID + METHOD_NAME + MESSAGE + STACK_TRACE + ASYNC_APEX_JOB_ID + QUEUE_ITEM_ID + APEX_LOG_ID + APEX_TEST_RUN_RESULT_ID + RUN_TIME +} + +"""Apex Debug Log""" +type SalesforceApexLog implements OneGraphNode { + """Log ID""" + id: String! + + """Log User ID""" + logUserId: String + + """Log User ID""" + logUser: SalesforceUser + + """Log Size (bytes)""" + logLength: Int! + + """Date""" + lastModifiedDate: String! + + """Request Type""" + request: String! + + """Operation""" + operation: String! + + """Application""" + application: String! + + """Status""" + status: String! + + """Duration (ms)""" + durationMilliseconds: Int! + + """System Modstamp""" + systemModstamp: String! + + """Start Time""" + startTime: String! + + """Location""" + location: String + + """Collection of Salesforce ApexTestResult""" + apexTestResults( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestResultConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestResultSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestResultSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestResults to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestResultsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Apex Test Result""" +type SalesforceApexTestResult implements OneGraphNode { + """Apex Test Result ID""" + id: String! + + """System Modstamp""" + systemModstamp: String! + + """Time Started""" + testTimestamp: String! + + """Pass/Fail""" + outcome: String! + + """Class ID""" + apexClassId: String! + + """Class ID""" + apexClass: SalesforceApexClass! + + """Method Name""" + methodName: String + + """Error Message""" + message: String + + """Stack Trace""" + stackTrace: String + + """Apex Job ID""" + asyncApexJobId: String + + """Apex Job ID""" + asyncApexJob: SalesforceAsyncApexJob + + """Apex Test Queue Item ID""" + queueItemId: String + + """Apex Test Queue Item ID""" + queueItem: SalesforceApexTestQueueItem + + """Log ID""" + apexLogId: String + + """Log ID""" + apexLog: SalesforceApexLog + + """ApexTestRunResult ID""" + apexTestRunResultId: String + + """ApexTestRunResult ID""" + apexTestRunResult: SalesforceApexTestRunResult + + """Run Time""" + runTime: Int + + """Collection of Salesforce ApexTestResultLimits""" + apexTestResults( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestResultLimitsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestResultLimitsSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestResultLimitsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ApexTestResultLimits to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceApexTestResultLimitssConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Apex Test Results connection, for use in pagination.""" +type SalesforceApexTestResultsConnection { + """The count of all Apex Test Result you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Apex Test Results""" + nodes: [SalesforceApexTestResult!]! + + """List of Apex Test Result edges""" + edges: [SalesforceApexTestResultEdge!]! +} + +""" +A filter to be used against ApexTestRunResult object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceApexTestRunResultConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ApexTestRunResult's user relation.""" + user: SalesforceUserConnectionFilter + + """Filter by the ApexTestRunResult's asyncApexJob relation.""" + asyncApexJob: SalesforceAsyncApexJobConnectionFilter + + """Filter by the ApexTestRunResult's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ApexTestRunResult's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ApexTestRunResult's id field""" + id: SalesforceIdFilter + + """Filter by the ApexTestRunResult's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ApexTestRunResult's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ApexTestRunResult's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ApexTestRunResult's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ApexTestRunResult's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ApexTestRunResult's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ApexTestRunResult's asyncApexJobId field""" + asyncApexJobId: SalesforceIdFilter + + """Filter by the ApexTestRunResult's userId field""" + userId: SalesforceIdFilter + + """Filter by the ApexTestRunResult's jobName field""" + jobName: SalesforceStringFilter + + """Filter by the ApexTestRunResult's isAllTests field""" + isAllTests: SalesforceBooleanFilter + + """Filter by the ApexTestRunResult's source field""" + source: SalesforceStringFilter + + """Filter by the ApexTestRunResult's startTime field""" + startTime: SalesforceDateTimeFilter + + """Filter by the ApexTestRunResult's endTime field""" + endTime: SalesforceDateTimeFilter + + """Filter by the ApexTestRunResult's testTime field""" + testTime: SalesforceIntFilter + + """Filter by the ApexTestRunResult's status field""" + status: SalesforceStringFilter + + """Filter by the ApexTestRunResult's classesEnqueued field""" + classesEnqueued: SalesforceIntFilter + + """Filter by the ApexTestRunResult's classesCompleted field""" + classesCompleted: SalesforceIntFilter + + """Filter by the ApexTestRunResult's methodsEnqueued field""" + methodsEnqueued: SalesforceIntFilter + + """Filter by the ApexTestRunResult's methodsCompleted field""" + methodsCompleted: SalesforceIntFilter + + """Filter by the ApexTestRunResult's methodsFailed field""" + methodsFailed: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceApexTestRunResultConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceApexTestRunResultConnectionFilter!] +} + +""" +A filter to be used against AsyncApexJob object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAsyncApexJobConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AsyncApexJob's parentJob relation.""" + parentJob: SalesforceAsyncApexJobConnectionFilter + + """Filter by the AsyncApexJob's apexClass relation.""" + apexClass: SalesforceApexClassConnectionFilter + + """Filter by the AsyncApexJob's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AsyncApexJob's id field""" + id: SalesforceIdFilter + + """Filter by the AsyncApexJob's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AsyncApexJob's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AsyncApexJob's jobType field""" + jobType: SalesforceStringFilter + + """Filter by the AsyncApexJob's apexClassId field""" + apexClassId: SalesforceIdFilter + + """Filter by the AsyncApexJob's status field""" + status: SalesforceStringFilter + + """Filter by the AsyncApexJob's jobItemsProcessed field""" + jobItemsProcessed: SalesforceIntFilter + + """Filter by the AsyncApexJob's totalJobItems field""" + totalJobItems: SalesforceIntFilter + + """Filter by the AsyncApexJob's numberOfErrors field""" + numberOfErrors: SalesforceIntFilter + + """Filter by the AsyncApexJob's completedDate field""" + completedDate: SalesforceDateTimeFilter + + """Filter by the AsyncApexJob's methodName field""" + methodName: SalesforceStringFilter + + """Filter by the AsyncApexJob's extendedStatus field""" + extendedStatus: SalesforceStringFilter + + """Filter by the AsyncApexJob's parentJobId field""" + parentJobId: SalesforceIdFilter + + """Filter by the AsyncApexJob's lastProcessed field""" + lastProcessed: SalesforceStringFilter + + """Filter by the AsyncApexJob's lastProcessedOffset field""" + lastProcessedOffset: SalesforceIntFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAsyncApexJobConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAsyncApexJobConnectionFilter!] +} + +""" +A filter to be used against ApexTestQueueItem object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceApexTestQueueItemConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ApexTestQueueItem's testRunResult relation.""" + testRunResult: SalesforceApexTestRunResultConnectionFilter + + """Filter by the ApexTestQueueItem's parentJob relation.""" + parentJob: SalesforceAsyncApexJobConnectionFilter + + """Filter by the ApexTestQueueItem's apexClass relation.""" + apexClass: SalesforceApexClassConnectionFilter + + """Filter by the ApexTestQueueItem's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ApexTestQueueItem's id field""" + id: SalesforceIdFilter + + """Filter by the ApexTestQueueItem's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ApexTestQueueItem's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ApexTestQueueItem's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ApexTestQueueItem's apexClassId field""" + apexClassId: SalesforceIdFilter + + """Filter by the ApexTestQueueItem's status field""" + status: SalesforceStringFilter + + """Filter by the ApexTestQueueItem's extendedStatus field""" + extendedStatus: SalesforceStringFilter + + """Filter by the ApexTestQueueItem's parentJobId field""" + parentJobId: SalesforceIdFilter + + """Filter by the ApexTestQueueItem's testRunResultId field""" + testRunResultId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceApexTestQueueItemConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceApexTestQueueItemConnectionFilter!] +} + +"""Field that Apex Test Queue Items can be sorted by""" +enum SalesforceApexTestQueueItemSortByFieldEnum { + ID + CREATED_DATE + CREATED_BY_ID + SYSTEM_MODSTAMP + APEX_CLASS_ID + STATUS + EXTENDED_STATUS + PARENT_JOB_ID + TEST_RUN_RESULT_ID +} + +"""Apex Job""" +type SalesforceAsyncApexJob implements OneGraphNode { + """Apex Job ID""" + id: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Job Type""" + jobType: String! + + """Class ID""" + apexClassId: String + + """Class ID""" + apexClass: SalesforceApexClass + + """Status""" + status: String! + + """Batches Processed""" + jobItemsProcessed: Int! + + """Total Batches""" + totalJobItems: Int + + """Failures""" + numberOfErrors: Int + + """Completion Date""" + completedDate: String + + """Apex Method""" + methodName: String + + """Status Detail""" + extendedStatus: String + + """Apex Job ID""" + parentJobId: String + + """Apex Job ID""" + parentJob: SalesforceAsyncApexJob + + """Last ID processed and committed""" + lastProcessed: String + + """Offset of last ID processed and committed""" + lastProcessedOffset: Int + + """Collection of Salesforce ApexTestQueueItem""" + apexTestQueueItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestQueueItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestQueueItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestQueueItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestQueueItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestQueueItemsConnection + + """Collection of Salesforce ApexTestResult""" + apexTestResults( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestResultConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestResultSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestResultSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestResults to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestResultsConnection + + """Collection of Salesforce ApexTestRunResult""" + asyncApex( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestRunResultConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestRunResultSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestRunResultSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestRunResults to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestRunResultsConnection + + """Collection of Salesforce AsyncApexJob""" + asyncApexJobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAsyncApexJobConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAsyncApexJobSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAsyncApexJobSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AsyncApexJobs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAsyncApexJobsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Apex Test Queue Item""" +type SalesforceApexTestQueueItem implements OneGraphNode { + """Apex Test Queue Item ID""" + id: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Class ID""" + apexClassId: String! + + """Class ID""" + apexClass: SalesforceApexClass! + + """Status""" + status: String! + + """Status Detail""" + extendedStatus: String + + """Apex Job ID""" + parentJobId: String + + """Apex Job ID""" + parentJob: SalesforceAsyncApexJob + + """ApexTestRunResult ID""" + testRunResultId: String + + """ApexTestRunResult ID""" + testRunResult: SalesforceApexTestRunResult + + """Collection of Salesforce ApexTestResult""" + apexTestResults( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestResultConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestResultSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestResultSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestResults to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestResultsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Apex Test Queue Items connection, for use in pagination.""" +type SalesforceApexTestQueueItemsConnection { + """ + The count of all Apex Test Queue Item you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Apex Test Queue Items""" + nodes: [SalesforceApexTestQueueItem!]! + + """List of Apex Test Queue Item edges""" + edges: [SalesforceApexTestQueueItemEdge!]! +} + +"""Apex Class""" +type SalesforceApexClass implements OneGraphNode { + """Class ID""" + id: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Name""" + name: String! + + """Api Version""" + apiVersion: Float! + + """Status""" + status: String! + + """Is Valid""" + isValid: Boolean! + + """Body CRC""" + bodyCrc: Float + + """Body""" + body: String + + """Size Without Comments""" + lengthWithoutComments: Int! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce ApexTestQueueItem""" + apexTestQueueItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestQueueItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestQueueItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestQueueItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestQueueItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestQueueItemsConnection + + """Collection of Salesforce ApexTestResult""" + apexTestResults( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestResultConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestResultSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestResultSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestResults to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestResultsConnection + + """Collection of Salesforce AsyncApexJob""" + asyncApexJobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAsyncApexJobConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAsyncApexJobSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAsyncApexJobSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AsyncApexJobs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAsyncApexJobsConnection + + """Collection of Salesforce AuthProvider""" + authProviders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthProviderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuthProviderSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthProviderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuthProviders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthProvidersConnection + + """Collection of Salesforce EmailServicesFunction""" + emailServicesFunctions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailServicesFunctionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailServicesFunctionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailServicesFunctionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of EmailServicesFunctions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceEmailServicesFunctionsConnection + + """Collection of Salesforce ExternalDataSource""" + externalDataSources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceExternalDataSourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceExternalDataSourceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceExternalDataSourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ExternalDataSources to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceExternalDataSourcesConnection + + """Collection of Salesforce SamlSsoConfig""" + samlSsoConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSamlSsoConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSamlSsoConfigSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSamlSsoConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SamlSsoConfigs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSamlSsoConfigsConnection + + """Collection of Salesforce SetupEntityAccess""" + setupEntityAccessItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSetupEntityAccessConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSetupEntityAccessSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSetupEntityAccessSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SetupEntityAccesses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSetupEntityAccesssConnection + + """Collection of Salesforce TestSuiteMembership""" + testSuiteMemberships( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTestSuiteMembershipConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTestSuiteMembershipSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTestSuiteMembershipSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of TestSuiteMemberships to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceTestSuiteMembershipsConnection + + """Collection of Salesforce TransactionSecurityPolicy""" + transactionSecurityPolicies( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTransactionSecurityPolicyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTransactionSecurityPolicySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTransactionSecurityPolicySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of TransactionSecurityPolicies to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceTransactionSecurityPolicysConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Auth. Provider""" +type SalesforceAuthProvider implements OneGraphNode { + """Auth. Provider ID""" + id: String! + + """Created Date""" + createdDate: String! + + """Provider Type""" + providerType: String! + + """Name""" + friendlyName: String! + + """URL Suffix""" + developerName: String! + + """Class ID""" + registrationHandlerId: String + + """Class ID""" + registrationHandler: SalesforceApexClass + + """User ID""" + executionUserId: String + + """User ID""" + executionUser: SalesforceUser + + """Consumer Key""" + consumerKey: String + + """Consumer Secret""" + consumerSecret: String + + """Custom Error URL""" + errorUrl: String + + """Authorize Endpoint URL""" + authorizeUrl: String + + """Token Endpoint URL""" + tokenUrl: String + + """User Info Endpoint URL""" + userInfoUrl: String + + """Default Scopes""" + defaultScopes: String + + """Token Issuer""" + idTokenIssuer: String + + """Send access token in header""" + optionsSendAccessTokenInHeader: Boolean! + + """Send client credentials in header""" + optionsSendClientCredentialsInHeader: Boolean! + + """ + Include identity organization's organization ID for third-party account linkage + """ + optionsIncludeOrgIdInId: Boolean! + + """Icon URL""" + iconUrl: String + + """Custom Logout URL""" + logoutUrl: String + + """Class ID""" + pluginId: String + + """Class ID""" + plugin: SalesforceApexClass + + """Custom Metadata Type Record""" + customMetadataTypeRecord: String + + """Collection of Salesforce AuthConfigProviders""" + authConfigProvidersPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthConfigProvidersConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuthConfigProvidersSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthConfigProvidersSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuthConfigProviders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthConfigProviderssConnection + + """Collection of Salesforce ExternalDataSource""" + externalDataSources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceExternalDataSourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceExternalDataSourceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceExternalDataSourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ExternalDataSources to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceExternalDataSourcesConnection + + """Collection of Salesforce ExternalDataUserAuth""" + externalDataUserAuths( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceExternalDataUserAuthConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceExternalDataUserAuthSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceExternalDataUserAuthSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ExternalDataUserAuths to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceExternalDataUserAuthsConnection + + """Collection of Salesforce LoginHistory""" + loginHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLoginHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLoginHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLoginHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LoginHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLoginHistorysConnection + + """Collection of Salesforce NamedCredential""" + namedCredentials( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNamedCredentialConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceNamedCredentialSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNamedCredentialSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of NamedCredentials to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNamedCredentialsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""External Data Source""" +type SalesforceExternalDataSource implements OneGraphNode { + """External Data Source ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String! + + """External Data Source""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Class ID""" + type: String! + + """URL""" + endpoint: String + + """Default External Repository""" + repository: String + + """Writable External Objects""" + isWritable: Boolean! + + """Identity Type""" + principalType: String! + + """Authentication Protocol""" + protocol: String! + + """Auth. Provider ID""" + authProviderId: String + + """Auth. Provider ID""" + authProvider: SalesforceAuthProvider + + """Static Resource ID""" + largeIconId: String + + """Static Resource ID""" + largeIcon: SalesforceStaticResource + + """Static Resource ID""" + smallIconId: String + + """Static Resource ID""" + smallIcon: SalesforceStaticResource + + """Custom Configuration""" + customConfiguration: String + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce ExternalDataUserAuth""" + userAuths( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceExternalDataUserAuthConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceExternalDataUserAuthSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceExternalDataUserAuthSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ExternalDataUserAuths to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceExternalDataUserAuthsConnection + + """Collection of Salesforce Product2""" + product2s( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProduct2ConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProduct2SortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProduct2SortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Product2s to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProduct2sConnection + + """Collection of Salesforce SetupEntityAccess""" + setupEntityAccessItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSetupEntityAccessConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSetupEntityAccessSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSetupEntityAccessSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SetupEntityAccesses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSetupEntityAccesssConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Product""" +type SalesforceProduct2 implements OneGraphNode { + """Product ID""" + id: String! + + """Product Name""" + name: String! + + """Product Code""" + productCode: String + + """Product Description""" + description: String + + """Active""" + isActive: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Product Family""" + family: String + + """External Data Source ID""" + externalDataSourceId: String + + """External Data Source ID""" + externalDataSource: SalesforceExternalDataSource + + """External ID""" + externalId: String + + """Display URL""" + displayUrl: String + + """Quantity Unit Of Measure""" + quantityUnitOfMeasure: String + + """Deleted""" + isDeleted: Boolean! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Product SKU""" + stockKeepingUnit: String + + """Collection of Salesforce Asset""" + assets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Assets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetsConnection + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EmailMessage""" + emails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Note""" + notes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceNoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Notes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNotesConnection + + """Collection of Salesforce OpportunityLineItem""" + opportunityLineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityLineItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityLineItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityLineItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityLineItems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityLineItemsConnection + + """Collection of Salesforce OrderItem""" + orderItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemsConnection + + """Collection of Salesforce PricebookEntry""" + pricebookEntries( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePricebookEntryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePricebookEntrySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePricebookEntrySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of PricebookEntries to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePricebookEntrysConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Product2Feed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProduct2FeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProduct2FeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProduct2FeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Product2Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProduct2FeedsConnection + + """Collection of Salesforce Product2History""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProduct2HistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProduct2HistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProduct2HistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Product2Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProduct2HistorysConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceAttachmentParentUnion = SalesforceTask | SalesforceSolution | SalesforceProduct2 | SalesforceOrder | SalesforceOpportunity | SalesforceLead | SalesforceEvent | SalesforceEmailTemplate | SalesforceEmailMessage | SalesforceContract | SalesforceContact | SalesforceCase | SalesforceCampaign | SalesforceAsset | SalesforceAccount + +"""Attachment""" +type SalesforceAttachment implements OneGraphNode { + """Attachment ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceAttachmentParentUnion! + + """File Name""" + name: String! + + """Private""" + isPrivate: Boolean! + + """Content Type""" + contentType: String + + """Body Length""" + bodyLength: Int + + """Body""" + body: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Description""" + description: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Attachments connection, for use in pagination.""" +type SalesforceAttachmentsConnection { + """The count of all Attachment you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Attachments""" + nodes: [SalesforceAttachment!]! + + """List of Attachment edges""" + edges: [SalesforceAttachmentEdge!]! +} + +"""Solution""" +type SalesforceSolution implements OneGraphNode { + """Solution ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Solution Number""" + solutionNumber: String! + + """Title""" + solutionName: String! + + """Public""" + isPublished: Boolean! + + """Visible in Public Knowledge Base""" + isPublishedInPublicKb: Boolean! + + """Status""" + status: String! + + """Reviewed""" + isReviewed: Boolean! + + """Description""" + solutionNote: String + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Num Related Cases""" + timesUsed: Int! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Is Html""" + isHtml: Boolean! + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce CaseSolution""" + caseSolutions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseSolutionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseSolutionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseSolutionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseSolutions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseSolutionsConnection + + """Collection of Salesforce CategoryData""" + categoryDatas( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCategoryDataConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCategoryDataSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCategoryDataSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CategoryDatas to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCategoryDatasConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EmailMessage""" + emails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce SolutionFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSolutionFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSolutionFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSolutionFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SolutionFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSolutionFeedsConnection + + """Collection of Salesforce SolutionHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSolutionHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSolutionHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSolutionHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SolutionHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSolutionHistorysConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + + """Collection of Salesforce Vote""" + votes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Votes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceVotesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceTaskWhatUnion = SalesforceSolution | SalesforceProduct2 | SalesforceOrder | SalesforceOpportunity | SalesforceContract | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +union SalesforceTaskWhoUnion = SalesforceLead | SalesforceContact + +"""Task""" +type SalesforceTask implements OneGraphNode { + """Activity ID""" + id: String! + + """Name ID""" + whoId: String + + """Name ID""" + who: SalesforceTaskWhoUnion + + """Related To ID""" + whatId: String + + """Related To ID""" + what: SalesforceTaskWhatUnion + + """Subject""" + subject: String + + """Due Date Only""" + activityDate: String + + """Status""" + status: String! + + """Priority""" + priority: String! + + """High Priority""" + isHighPriority: Boolean! + + """Assigned To ID""" + ownerId: String! + + """Assigned To ID""" + owner: SalesforceUser! + + """Description""" + description: String + + """Deleted""" + isDeleted: Boolean! + + """Account ID""" + accountId: String + + """Account ID""" + account: SalesforceAccount + + """Closed""" + isClosed: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Archived""" + isArchived: Boolean! + + """Call Duration""" + callDurationInSeconds: Int + + """Call Type""" + callType: String + + """Call Result""" + callDisposition: String + + """Call Object Identifier""" + callObject: String + + """Reminder Date/Time""" + reminderDateTime: String + + """Reminder Set""" + isReminderSet: Boolean! + + """Recurrence Activity ID""" + recurrenceActivityId: String + + """Recurrence Activity ID""" + recurrenceActivity: SalesforceTask + + """Create Recurring Series of Tasks""" + isRecurrence: Boolean! + + """Recurrence Start""" + recurrenceStartDateOnly: String + + """Recurrence End""" + recurrenceEndDateOnly: String + + """Recurrence Time Zone""" + recurrenceTimeZoneSidKey: String + + """Recurrence Type""" + recurrenceType: String + + """Recurrence Interval""" + recurrenceInterval: Int + + """Recurrence Day of Week Mask""" + recurrenceDayOfWeekMask: Int + + """Recurrence Day of Month""" + recurrenceDayOfMonth: Int + + """Recurrence Instance""" + recurrenceInstance: String + + """Recurrence Month of Year""" + recurrenceMonthOfYear: String + + """Repeat This Task""" + recurrenceRegeneratedType: String + + """Task Subtype""" + taskSubtype: String + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EmailMessage""" + emailMessages( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Task""" + recurringTasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TaskFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TaskFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTaskFeedsConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceEntitySubscriptionParentUnion = SalesforceUser | SalesforceTopic | SalesforceTask | SalesforceSolution | SalesforceSite | SalesforceReport | SalesforceProduct2 | SalesforceOrderItem | SalesforceOrder | SalesforceOpportunity | SalesforceLead | SalesforceEvent | SalesforceDashboardComponent | SalesforceDashboard | SalesforceContract | SalesforceContentDocument | SalesforceContact | SalesforceCollaborationGroup | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +"""Entity Subscription""" +type SalesforceEntitySubscription implements OneGraphNode { + """Entity Subscription ID""" + id: String! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceEntitySubscriptionParentUnion! + + """Subscriber ID""" + subscriberId: String! + + """Subscriber ID""" + subscriber: SalesforceUser! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Deleted""" + isDeleted: Boolean! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Entity Subscriptions connection, for use in pagination.""" +type SalesforceEntitySubscriptionsConnection { + """ + The count of all Entity Subscription you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Entity Subscriptions""" + nodes: [SalesforceEntitySubscription!]! + + """List of Entity Subscription edges""" + edges: [SalesforceEntitySubscriptionEdge!]! +} + +""" +A filter to be used against Report object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceReportConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Report's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Report's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Report's id field""" + id: SalesforceIdFilter + + """Filter by the Report's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Report's folderName field""" + folderName: SalesforceStringFilter + + """Filter by the Report's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Report's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Report's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Report's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Report's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Report's name field""" + name: SalesforceStringFilter + + """Filter by the Report's description field""" + description: SalesforceStringFilter + + """Filter by the Report's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the Report's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the Report's lastRunDate field""" + lastRunDate: SalesforceDateTimeFilter + + """Filter by the Report's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Report's format field""" + format: SalesforceStringFilter + + """Filter by the Report's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Report's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceReportConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceReportConnectionFilter!] +} + +""" +A filter to be used against Dashboard object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDashboardConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Dashboard's runningUser relation.""" + runningUser: SalesforceUserConnectionFilter + + """Filter by the Dashboard's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Dashboard's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Dashboard's id field""" + id: SalesforceIdFilter + + """Filter by the Dashboard's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Dashboard's folderId field""" + folderId: SalesforceIdFilter + + """Filter by the Dashboard's folderName field""" + folderName: SalesforceStringFilter + + """Filter by the Dashboard's title field""" + title: SalesforceStringFilter + + """Filter by the Dashboard's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the Dashboard's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the Dashboard's description field""" + description: SalesforceStringFilter + + """Filter by the Dashboard's leftSize field""" + leftSize: SalesforceStringFilter + + """Filter by the Dashboard's middleSize field""" + middleSize: SalesforceStringFilter + + """Filter by the Dashboard's rightSize field""" + rightSize: SalesforceStringFilter + + """Filter by the Dashboard's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Dashboard's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Dashboard's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Dashboard's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Dashboard's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Dashboard's runningUserId field""" + runningUserId: SalesforceIdFilter + + """Filter by the Dashboard's titleColor field""" + titleColor: SalesforceIntFilter + + """Filter by the Dashboard's titleSize field""" + titleSize: SalesforceIntFilter + + """Filter by the Dashboard's textColor field""" + textColor: SalesforceIntFilter + + """Filter by the Dashboard's backgroundStart field""" + backgroundStart: SalesforceIntFilter + + """Filter by the Dashboard's backgroundEnd field""" + backgroundEnd: SalesforceIntFilter + + """Filter by the Dashboard's backgroundDirection field""" + backgroundDirection: SalesforceStringFilter + + """Filter by the Dashboard's type field""" + type: SalesforceStringFilter + + """Filter by the Dashboard's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Dashboard's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the Dashboard's colorPalette field""" + colorPalette: SalesforceStringFilter + + """Filter by the Dashboard's chartTheme field""" + chartTheme: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDashboardConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDashboardConnectionFilter!] +} + +""" +A filter to be used against DashboardComponent object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDashboardComponentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DashboardComponent's customReport relation.""" + customReport: SalesforceReportConnectionFilter + + """Filter by the DashboardComponent's dashboard relation.""" + dashboard: SalesforceDashboardConnectionFilter + + """Filter by the DashboardComponent's id field""" + id: SalesforceIdFilter + + """Filter by the DashboardComponent's name field""" + name: SalesforceStringFilter + + """Filter by the DashboardComponent's dashboardId field""" + dashboardId: SalesforceIdFilter + + """Filter by the DashboardComponent's customReportId field""" + customReportId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDashboardComponentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDashboardComponentConnectionFilter!] +} + +"""Field that Dashboard Components can be sorted by""" +enum SalesforceDashboardComponentSortByFieldEnum { + ID + NAME + DASHBOARD_ID + CUSTOM_REPORT_ID +} + +union SalesforceReportOwnerUnion = SalesforceUser | SalesforceOrganization | SalesforceFolder + +"""Report""" +type SalesforceReport implements OneGraphNode { + """Report ID""" + id: String! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceReportOwnerUnion! + + """Folder Name""" + folderName: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Deleted""" + isDeleted: Boolean! + + """Report Name""" + name: String! + + """Description""" + description: String + + """Report Unique Name""" + developerName: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Last Run""" + lastRunDate: String + + """System Modstamp""" + systemModstamp: String! + + """Format""" + format: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce DashboardComponent""" + dashboardComponents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardComponentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDashboardComponentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardComponentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DashboardComponents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDashboardComponentsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ReportFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceReportFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceReportFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceReportFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ReportFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceReportFeedsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Dashboard Component""" +type SalesforceDashboardComponent implements OneGraphNode { + """Dashboard Component ID""" + id: String! + + """Dashboard Component Name""" + name: String + + """Dashboard ID""" + dashboardId: String! + + """Dashboard ID""" + dashboard: SalesforceDashboard! + + """Report ID""" + customReportId: String + + """Report ID""" + customReport: SalesforceReport + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce DashboardComponentFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardComponentFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDashboardComponentFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardComponentFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DashboardComponentFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDashboardComponentFeedsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Dashboard Components connection, for use in pagination.""" +type SalesforceDashboardComponentsConnection { + """ + The count of all Dashboard Component you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Dashboard Components""" + nodes: [SalesforceDashboardComponent!]! + + """List of Dashboard Component edges""" + edges: [SalesforceDashboardComponentEdge!]! +} + +"""Field that Content Versions can be sorted by""" +enum SalesforceContentVersionSortByFieldEnum { + ID + CONTENT_DOCUMENT_ID + IS_LATEST + CONTENT_URL + CONTENT_BODY_ID + VERSION_NUMBER + TITLE + DESCRIPTION + REASON_FOR_CHANGE + SHARING_OPTION + SHARING_PRIVACY + PATH_ON_CLIENT + RATING_COUNT + IS_DELETED + CONTENT_MODIFIED_DATE + CONTENT_MODIFIED_BY_ID + POSITIVE_RATING_COUNT + NEGATIVE_RATING_COUNT + FEATURED_CONTENT_BOOST + FEATURED_CONTENT_DATE + OWNER_ID + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP + TAG_CSV + FILE_TYPE + PUBLISH_STATUS + CONTENT_SIZE + FILE_EXTENSION + FIRST_PUBLISH_LOCATION_ID + ORIGIN + CONTENT_LOCATION + TEXT_PREVIEW + EXTERNAL_DOCUMENT_INFO_1 + EXTERNAL_DOCUMENT_INFO_2 + EXTERNAL_DATA_SOURCE_ID + CHECKSUM + IS_MAJOR_VERSION +} + +union SalesforceDashboardFolderUnion = SalesforceUser | SalesforceFolder + +"""Dashboard""" +type SalesforceDashboard implements OneGraphNode { + """Dashboard ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Folder ID""" + folderId: String! + + """Folder ID""" + folder: SalesforceDashboardFolderUnion! + + """Folder Name""" + folderName: String + + """Title""" + title: String! + + """Dashboard Unique Name""" + developerName: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Description""" + description: String + + """Left Size""" + leftSize: String! + + """Middle Size""" + middleSize: String + + """Right Size""" + rightSize: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Running User ID""" + runningUserId: String! + + """Running User ID""" + runningUser: SalesforceUser! + + """Title Color""" + titleColor: Int! + + """Title Size""" + titleSize: Int! + + """Text Color""" + textColor: Int! + + """Starting Color""" + backgroundStart: Int! + + """Ending Color""" + backgroundEnd: Int! + + """Background Fade Direction""" + backgroundDirection: String! + + """Dashboard Running User""" + type: String! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Last refreshed for this user""" + dashboardResultRefreshedDate: String + + """Running as""" + dashboardResultRunningUser: String + + """Color Palette""" + colorPalette: String + + """Chart Background""" + chartTheme: String + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce DashboardComponent""" + dashboardComponents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardComponentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDashboardComponentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardComponentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DashboardComponents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDashboardComponentsConnection + + """Collection of Salesforce DashboardFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDashboardFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DashboardFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDashboardFeedsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Dashboards connection, for use in pagination.""" +type SalesforceDashboardsConnection { + """The count of all Dashboard you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Dashboards""" + nodes: [SalesforceDashboard!]! + + """List of Dashboard edges""" + edges: [SalesforceDashboardEdge!]! +} + +"""Folder""" +type SalesforceFolder implements OneGraphNode { + """Folder ID""" + id: String! + + """Name""" + name: String! + + """Folder Unique Name""" + developerName: String + + """Access Type""" + accessType: String! + + """Read Only""" + isReadonly: Boolean! + + """Type""" + type: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce Dashboard""" + dashboards( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDashboardSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Dashboards to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDashboardsConnection + + """Collection of Salesforce Document""" + documents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDocumentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDocumentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDocumentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Documents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDocumentsConnection + + """Collection of Salesforce EmailTemplate""" + emailTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailTemplateSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailTemplates to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailTemplatesConnection + + """Collection of Salesforce Report""" + reports( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceReportConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceReportSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceReportSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Reports to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceReportsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceDocumentFolderUnion = SalesforceUser | SalesforceFolder + +"""Document""" +type SalesforceDocument implements OneGraphNode { + """Document ID""" + id: String! + + """Folder ID""" + folderId: String! + + """Folder ID""" + folder: SalesforceDocumentFolderUnion! + + """Deleted""" + isDeleted: Boolean! + + """Document Name""" + name: String! + + """Document Unique Name""" + developerName: String! + + """Namespace Prefix""" + namespacePrefix: String + + """MIME Type""" + contentType: String + + """File Extension""" + type: String + + """Externally Available""" + isPublic: Boolean! + + """Body Length""" + bodyLength: Int! + + """Body""" + body: String + + """Url""" + url: String + + """Description""" + description: String + + """Keywords""" + keywords: String + + """Internal Use Only""" + isInternalUseOnly: Boolean! + + """Author ID""" + authorId: String! + + """Author ID""" + author: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Document Content Searchable""" + isBodySearchable: Boolean! + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Collection of Salesforce CustomBrandAsset""" + customBrandAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomBrandAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomBrandAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomBrandAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CustomBrandAssets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomBrandAssetsConnection + + """Collection of Salesforce DocumentAttachmentMap""" + documentAttachmentMaps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDocumentAttachmentMapConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDocumentAttachmentMapSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDocumentAttachmentMapSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DocumentAttachmentMaps to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDocumentAttachmentMapsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceCustomBrandAssetAssetSourceUnion = SalesforceDocument | SalesforceContentAsset + +""" +A filter to be used against CustomBrandAsset object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCustomBrandAssetConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CustomBrandAsset's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CustomBrandAsset's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CustomBrandAsset's customBrand relation.""" + customBrand: SalesforceCustomBrandConnectionFilter + + """Filter by the CustomBrandAsset's id field""" + id: SalesforceIdFilter + + """Filter by the CustomBrandAsset's customBrandId field""" + customBrandId: SalesforceIdFilter + + """Filter by the CustomBrandAsset's assetCategory field""" + assetCategory: SalesforceStringFilter + + """Filter by the CustomBrandAsset's textAsset field""" + textAsset: SalesforceStringFilter + + """Filter by the CustomBrandAsset's assetSourceId field""" + assetSourceId: SalesforceIdFilter + + """Filter by the CustomBrandAsset's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CustomBrandAsset's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CustomBrandAsset's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CustomBrandAsset's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCustomBrandAssetConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCustomBrandAssetConnectionFilter!] +} + +"""Field that Custom Brand Assets can be sorted by""" +enum SalesforceCustomBrandAssetSortByFieldEnum { + ID + CUSTOM_BRAND_ID + ASSET_CATEGORY + TEXT_ASSET + ASSET_SOURCE_ID + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID +} + +""" +A filter to be used against Organization object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceOrganizationConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Organization's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Organization's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Organization's id field""" + id: SalesforceIdFilter + + """Filter by the Organization's name field""" + name: SalesforceStringFilter + + """Filter by the Organization's division field""" + division: SalesforceStringFilter + + """Filter by the Organization's street field""" + street: SalesforceStringFilter + + """Filter by the Organization's city field""" + city: SalesforceStringFilter + + """Filter by the Organization's state field""" + state: SalesforceStringFilter + + """Filter by the Organization's postalCode field""" + postalCode: SalesforceStringFilter + + """Filter by the Organization's country field""" + country: SalesforceStringFilter + + """Filter by the Organization's latitude field""" + latitude: SalesforceFloatFilter + + """Filter by the Organization's longitude field""" + longitude: SalesforceFloatFilter + + """Filter by the Organization's geocodeAccuracy field""" + geocodeAccuracy: SalesforceStringFilter + + """Filter by the Organization's phone field""" + phone: SalesforceStringFilter + + """Filter by the Organization's fax field""" + fax: SalesforceStringFilter + + """Filter by the Organization's primaryContact field""" + primaryContact: SalesforceStringFilter + + """Filter by the Organization's defaultLocaleSidKey field""" + defaultLocaleSidKey: SalesforceStringFilter + + """Filter by the Organization's languageLocaleKey field""" + languageLocaleKey: SalesforceStringFilter + + """Filter by the Organization's receivesInfoEmails field""" + receivesInfoEmails: SalesforceBooleanFilter + + """Filter by the Organization's receivesAdminInfoEmails field""" + receivesAdminInfoEmails: SalesforceBooleanFilter + + """ + Filter by the Organization's preferencesRequireOpportunityProducts field + """ + preferencesRequireOpportunityProducts: SalesforceBooleanFilter + + """ + Filter by the Organization's preferencesTransactionSecurityPolicy field + """ + preferencesTransactionSecurityPolicy: SalesforceBooleanFilter + + """Filter by the Organization's preferencesTerminateOldestSession field""" + preferencesTerminateOldestSession: SalesforceBooleanFilter + + """Filter by the Organization's preferencesConsentManagementEnabled field""" + preferencesConsentManagementEnabled: SalesforceBooleanFilter + + """ + Filter by the Organization's preferencesIndividualAutoCreateEnabled field + """ + preferencesIndividualAutoCreateEnabled: SalesforceBooleanFilter + + """Filter by the Organization's preferencesLightningLoginEnabled field""" + preferencesLightningLoginEnabled: SalesforceBooleanFilter + + """Filter by the Organization's preferencesOnlyLlPermUserAllowed field""" + preferencesOnlyLlPermUserAllowed: SalesforceBooleanFilter + + """Filter by the Organization's fiscalYearStartMonth field""" + fiscalYearStartMonth: SalesforceIntFilter + + """Filter by the Organization's usesStartDateAsFiscalYearName field""" + usesStartDateAsFiscalYearName: SalesforceBooleanFilter + + """Filter by the Organization's defaultAccountAccess field""" + defaultAccountAccess: SalesforceStringFilter + + """Filter by the Organization's defaultContactAccess field""" + defaultContactAccess: SalesforceStringFilter + + """Filter by the Organization's defaultOpportunityAccess field""" + defaultOpportunityAccess: SalesforceStringFilter + + """Filter by the Organization's defaultLeadAccess field""" + defaultLeadAccess: SalesforceStringFilter + + """Filter by the Organization's defaultCaseAccess field""" + defaultCaseAccess: SalesforceStringFilter + + """Filter by the Organization's defaultCalendarAccess field""" + defaultCalendarAccess: SalesforceStringFilter + + """Filter by the Organization's defaultPricebookAccess field""" + defaultPricebookAccess: SalesforceStringFilter + + """Filter by the Organization's defaultCampaignAccess field""" + defaultCampaignAccess: SalesforceStringFilter + + """Filter by the Organization's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Organization's complianceBccEmail field""" + complianceBccEmail: SalesforceStringFilter + + """Filter by the Organization's uiSkin field""" + uiSkin: SalesforceStringFilter + + """Filter by the Organization's signupCountryIsoCode field""" + signupCountryIsoCode: SalesforceStringFilter + + """Filter by the Organization's trialExpirationDate field""" + trialExpirationDate: SalesforceDateTimeFilter + + """Filter by the Organization's numKnowledgeService field""" + numKnowledgeService: SalesforceIntFilter + + """Filter by the Organization's organizationType field""" + organizationType: SalesforceStringFilter + + """Filter by the Organization's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the Organization's instanceName field""" + instanceName: SalesforceStringFilter + + """Filter by the Organization's isSandbox field""" + isSandbox: SalesforceBooleanFilter + + """Filter by the Organization's webToCaseDefaultOrigin field""" + webToCaseDefaultOrigin: SalesforceStringFilter + + """Filter by the Organization's monthlyPageViewsUsed field""" + monthlyPageViewsUsed: SalesforceIntFilter + + """Filter by the Organization's monthlyPageViewsEntitlement field""" + monthlyPageViewsEntitlement: SalesforceIntFilter + + """Filter by the Organization's isReadOnly field""" + isReadOnly: SalesforceBooleanFilter + + """Filter by the Organization's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Organization's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Organization's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Organization's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceOrganizationConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceOrganizationConnectionFilter!] +} + +""" +A filter to be used against Stamp object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceStampConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Stamp's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Stamp's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Stamp's parent relation.""" + parent: SalesforceOrganizationConnectionFilter + + """Filter by the Stamp's id field""" + id: SalesforceIdFilter + + """Filter by the Stamp's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Stamp's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the Stamp's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the Stamp's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Stamp's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Stamp's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Stamp's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Stamp's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Stamp's description field""" + description: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceStampConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceStampConnectionFilter!] +} + +""" +A filter to be used against StampAssignment object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceStampAssignmentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the StampAssignment's subject relation.""" + subject: SalesforceUserConnectionFilter + + """Filter by the StampAssignment's stamp relation.""" + stamp: SalesforceStampConnectionFilter + + """Filter by the StampAssignment's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the StampAssignment's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the StampAssignment's id field""" + id: SalesforceIdFilter + + """Filter by the StampAssignment's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the StampAssignment's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the StampAssignment's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the StampAssignment's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the StampAssignment's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the StampAssignment's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the StampAssignment's stampId field""" + stampId: SalesforceIdFilter + + """Filter by the StampAssignment's subjectId field""" + subjectId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceStampAssignmentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceStampAssignmentConnectionFilter!] +} + +"""Field that Stamp Assignments can be sorted by""" +enum SalesforceStampAssignmentSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + STAMP_ID + SUBJECT_ID +} + +"""An edge in a connection.""" +type SalesforceStampAssignmentEdge { + """The item at the end of the edge.""" + node: SalesforceStampAssignment! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Stamp Assignment""" +type SalesforceStampAssignment implements OneGraphNode { + """StampAssignment ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Stamp ID""" + stampId: String! + + """Stamp ID""" + stamp: SalesforceStamp! + + """User ID""" + subjectId: String! + + """User ID""" + subject: SalesforceUser! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Stamp Assignments connection, for use in pagination.""" +type SalesforceStampAssignmentsConnection { + """The count of all Stamp Assignment you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Stamp Assignments""" + nodes: [SalesforceStampAssignment!]! + + """List of Stamp Assignment edges""" + edges: [SalesforceStampAssignmentEdge!]! +} + +""" +A filter to be used against CustomBrand object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCustomBrandConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CustomBrand's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CustomBrand's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CustomBrand's id field""" + id: SalesforceIdFilter + + """Filter by the CustomBrand's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the CustomBrand's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CustomBrand's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CustomBrand's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CustomBrand's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCustomBrandConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCustomBrandConnectionFilter!] +} + +"""Field that Custom Brands can be sorted by""" +enum SalesforceCustomBrandSortByFieldEnum { + ID + PARENT_ID + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID +} + +"""An edge in a connection.""" +type SalesforceCustomBrandEdge { + """The item at the end of the edge.""" + node: SalesforceCustomBrand! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Custom Brands connection, for use in pagination.""" +type SalesforceCustomBrandsConnection { + """The count of all Custom Brand you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Custom Brands""" + nodes: [SalesforceCustomBrand!]! + + """List of Custom Brand edges""" + edges: [SalesforceCustomBrandEdge!]! +} + +"""Stamp""" +type SalesforceStamp implements OneGraphNode { + """Stamp ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Parent ID""" + parentId: String! + + """Parent ID""" + parent: SalesforceOrganization! + + """Label""" + masterLabel: String! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Description""" + description: String + + """Collection of Salesforce CustomBrand""" + customBrands( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomBrandConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomBrandSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomBrandSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CustomBrands to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomBrandsConnection + + """Collection of Salesforce StampAssignment""" + stampAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStampAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceStampAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStampAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of StampAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceStampAssignmentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceCustomBrandParentUnion = SalesforceTopic | SalesforceStamp | SalesforceOrganization + +"""Custom Brand""" +type SalesforceCustomBrand implements OneGraphNode { + """Custom Brand ID""" + id: String! + + """Branded Entity ID""" + parentId: String! + + """Branded Entity ID""" + parent: SalesforceCustomBrandParentUnion! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Collection of Salesforce CustomBrandAsset""" + customBrandAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomBrandAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomBrandAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomBrandAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CustomBrandAssets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomBrandAssetsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Custom Brand Asset""" +type SalesforceCustomBrandAsset implements OneGraphNode { + """Custom Brand Asset ID""" + id: String! + + """Custom Brand ID""" + customBrandId: String! + + """Custom Brand ID""" + customBrand: SalesforceCustomBrand! + + """Asset Category""" + assetCategory: String! + + """Text Asset""" + textAsset: String + + """Asset source ID""" + assetSourceId: String + + """Asset source ID""" + assetSource: SalesforceCustomBrandAssetAssetSourceUnion + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Custom Brand Assets connection, for use in pagination.""" +type SalesforceCustomBrandAssetsConnection { + """The count of all Custom Brand Asset you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Custom Brand Assets""" + nodes: [SalesforceCustomBrandAsset!]! + + """List of Custom Brand Asset edges""" + edges: [SalesforceCustomBrandAssetEdge!]! +} + +"""Field that Content Documents can be sorted by""" +enum SalesforceContentDocumentSortByFieldEnum { + ID + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + IS_ARCHIVED + ARCHIVED_BY_ID + ARCHIVED_DATE + IS_DELETED + OWNER_ID + SYSTEM_MODSTAMP + TITLE + PUBLISH_STATUS + LATEST_PUBLISHED_VERSION_ID + PARENT_ID + LAST_VIEWED_DATE + LAST_REFERENCED_DATE + DESCRIPTION + CONTENT_SIZE + FILE_TYPE + FILE_EXTENSION + SHARING_OPTION + SHARING_PRIVACY + CONTENT_MODIFIED_DATE + CONTENT_ASSET_ID +} + +"""An edge in a connection.""" +type SalesforceContentDocumentEdge { + """The item at the end of the edge.""" + node: SalesforceContentDocument! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Content Documents connection, for use in pagination.""" +type SalesforceContentDocumentsConnection { + """The count of all Content Document you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Documents""" + nodes: [SalesforceContentDocument!]! + + """List of Content Document edges""" + edges: [SalesforceContentDocumentEdge!]! +} + +""" +A filter to be used against ChatterExtension object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceChatterExtensionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ChatterExtension's icon relation.""" + icon: SalesforceContentAssetConnectionFilter + + """Filter by the ChatterExtension's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ChatterExtension's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ChatterExtension's id field""" + id: SalesforceIdFilter + + """Filter by the ChatterExtension's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ChatterExtension's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the ChatterExtension's language field""" + language: SalesforceStringFilter + + """Filter by the ChatterExtension's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the ChatterExtension's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the ChatterExtension's isProtected field""" + isProtected: SalesforceBooleanFilter + + """Filter by the ChatterExtension's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ChatterExtension's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ChatterExtension's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ChatterExtension's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ChatterExtension's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ChatterExtension's extensionName field""" + extensionName: SalesforceStringFilter + + """Filter by the ChatterExtension's type field""" + type: SalesforceStringFilter + + """Filter by the ChatterExtension's iconId field""" + iconId: SalesforceIdFilter + + """Filter by the ChatterExtension's description field""" + description: SalesforceStringFilter + + """Filter by the ChatterExtension's compositionComponentEnumOrId field""" + compositionComponentEnumOrId: SalesforceStringFilter + + """Filter by the ChatterExtension's renderComponentEnumOrId field""" + renderComponentEnumOrId: SalesforceStringFilter + + """Filter by the ChatterExtension's hoverText field""" + hoverText: SalesforceStringFilter + + """Filter by the ChatterExtension's headerText field""" + headerText: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceChatterExtensionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceChatterExtensionConnectionFilter!] +} + +"""Field that Chatter Extensions can be sorted by""" +enum SalesforceChatterExtensionSortByFieldEnum { + ID + IS_DELETED + DEVELOPER_NAME + LANGUAGE + MASTER_LABEL + NAMESPACE_PREFIX + IS_PROTECTED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + EXTENSION_NAME + TYPE + ICON_ID + DESCRIPTION + COMPOSITION_COMPONENT_ENUM_OR_ID + RENDER_COMPONENT_ENUM_OR_ID + HOVER_TEXT + HEADER_TEXT +} + +"""Asset File""" +type SalesforceContentAsset implements OneGraphNode { + """Asset File ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Unique Name""" + developerName: String! + + """Master Language""" + language: String + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """ContentDocument ID""" + contentDocumentId: String + + """ContentDocument ID""" + contentDocument: SalesforceContentDocument + + """Let unauthenticated users see this asset file""" + isVisibleByExternalUsers: Boolean! + + """Collection of Salesforce ChatterExtension""" + chatterExtensions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceChatterExtensionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceChatterExtensionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceChatterExtensionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ChatterExtensions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceChatterExtensionsConnection + + """Collection of Salesforce ContentDocument""" + contentDocuments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentDocuments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentDocumentsConnection + + """Collection of Salesforce CustomBrandAsset""" + customBrandAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomBrandAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomBrandAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomBrandAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CustomBrandAssets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomBrandAssetsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Chatter Extension""" +type SalesforceChatterExtension implements OneGraphNode { + """Chatter Extension ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Protected Component""" + isProtected: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Name""" + extensionName: String! + + """Type""" + type: String! + + """Asset File ID""" + iconId: String + + """Asset File ID""" + icon: SalesforceContentAsset + + """Description""" + description: String! + + """Lightning Definition Bundle ID""" + compositionComponentEnumOrId: String + + """Lightning Definition Bundle ID""" + renderComponentEnumOrId: String + + """Hover Text""" + hoverText: String + + """Header Text""" + headerText: String + + """Collection of Salesforce ChatterExtensionConfig""" + chatterExtensionConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceChatterExtensionConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceChatterExtensionConfigSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceChatterExtensionConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ChatterExtensionConfigs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceChatterExtensionConfigsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Chatter Extensions connection, for use in pagination.""" +type SalesforceChatterExtensionsConnection { + """The count of all Chatter Extension you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Chatter Extensions""" + nodes: [SalesforceChatterExtension!]! + + """List of Chatter Extension edges""" + edges: [SalesforceChatterExtensionEdge!]! +} + +""" +A filter to be used against AuraDefinitionBundle object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAuraDefinitionBundleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AuraDefinitionBundle's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AuraDefinitionBundle's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AuraDefinitionBundle's id field""" + id: SalesforceIdFilter + + """Filter by the AuraDefinitionBundle's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AuraDefinitionBundle's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the AuraDefinitionBundle's language field""" + language: SalesforceStringFilter + + """Filter by the AuraDefinitionBundle's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the AuraDefinitionBundle's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the AuraDefinitionBundle's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AuraDefinitionBundle's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AuraDefinitionBundle's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AuraDefinitionBundle's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AuraDefinitionBundle's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AuraDefinitionBundle's apiVersion field""" + apiVersion: SalesforceFloatFilter + + """Filter by the AuraDefinitionBundle's description field""" + description: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAuraDefinitionBundleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAuraDefinitionBundleConnectionFilter!] +} + +""" +A filter to be used against AuraDefinition object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAuraDefinitionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AuraDefinition's auraDefinitionBundle relation.""" + auraDefinitionBundle: SalesforceAuraDefinitionBundleConnectionFilter + + """Filter by the AuraDefinition's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the AuraDefinition's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the AuraDefinition's id field""" + id: SalesforceIdFilter + + """Filter by the AuraDefinition's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the AuraDefinition's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AuraDefinition's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the AuraDefinition's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the AuraDefinition's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the AuraDefinition's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the AuraDefinition's auraDefinitionBundleId field""" + auraDefinitionBundleId: SalesforceIdFilter + + """Filter by the AuraDefinition's defType field""" + defType: SalesforceStringFilter + + """Filter by the AuraDefinition's format field""" + format: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAuraDefinitionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAuraDefinitionConnectionFilter!] +} + +"""Field that Lightning Component Definitions can be sorted by""" +enum SalesforceAuraDefinitionSortByFieldEnum { + ID + IS_DELETED + CREATED_DATE + CREATED_BY_ID + LAST_MODIFIED_DATE + LAST_MODIFIED_BY_ID + SYSTEM_MODSTAMP + AURA_DEFINITION_BUNDLE_ID + DEF_TYPE + FORMAT +} + +"""An edge in a connection.""" +type SalesforceAuraDefinitionEdge { + """The item at the end of the edge.""" + node: SalesforceAuraDefinition! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Lightning Component Definition""" +type SalesforceAuraDefinition implements OneGraphNode { + """Lightning Definition ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Lightning Definition Bundle ID""" + auraDefinitionBundleId: String! + + """Lightning Definition Bundle ID""" + auraDefinitionBundle: SalesforceAuraDefinitionBundle! + + """Definition Type""" + defType: String! + + """Format""" + format: String! + + """Source""" + source: String! + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Salesforce Lightning Component Definitions connection, for use in pagination. +""" +type SalesforceAuraDefinitionsConnection { + """ + The count of all Lightning Component Definition you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Lightning Component Definitions""" + nodes: [SalesforceAuraDefinition!]! + + """List of Lightning Component Definition edges""" + edges: [SalesforceAuraDefinitionEdge!]! +} + +"""Lightning Component Bundle""" +type SalesforceAuraDefinitionBundle implements OneGraphNode { + """Lightning Definition Bundle ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Name""" + developerName: String! + + """Master Language""" + language: String + + """Label""" + masterLabel: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Api Version""" + apiVersion: Float! + + """Description""" + description: String! + + """Collection of Salesforce AuraDefinition""" + auraDefinitions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuraDefinitionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuraDefinitionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuraDefinitionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuraDefinitions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuraDefinitionsConnection + + """Collection of Salesforce ChatterExtension""" + chatterExtensions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceChatterExtensionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceChatterExtensionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceChatterExtensionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ChatterExtensions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceChatterExtensionsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceSobject = SalesforceAuraDefinitionBundle | SalesforceApexTestRunResult | SalesforceDataAssessmentMetric | SalesforceTopicAssignment | SalesforceLightningComponentBundle | SalesforceLeadFeed | SalesforceFeedRevision | SalesforceScontrol | SalesforceDuplicateRule | SalesforceSecureAgentPlugin | SalesforceApexLog | SalesforceCollaborationGroupRecord | SalesforceEmailMessage | SalesforceOrderItem | SalesforceUserListViewCriterion | SalesforceAsyncApexJob | SalesforceSearchActivity | SalesforceCampaignShare | SalesforcePermissionSetAssignment | SalesforceDuplicateRecordItem | SalesforceDeclinedEventRelation | SalesforceUserProvisioningConfig | SalesforceTask | SalesforceCampaignHistory | SalesforceTaskStatus | SalesforceUserFeed | SalesforceMatchingRuleItem | SalesforceContentVersionComment | SalesforceStreamingChannel | SalesforceStamp | SalesforceApexTestQueueItem | SalesforceFieldPermissions | SalesforceSecureAgentPluginProperty | SalesforceMacro | SalesforceEmailServicesAddress | SalesforceContractHistory | SalesforceHoliday | SalesforcePushTopic | SalesforceCaseStatus | SalesforceLoginGeo | SalesforceTransactionSecurityPolicy | SalesforceUserProvisioningLog | SalesforceDandBCompany | SalesforceContractStatus | SalesforceProcessInstanceNode | SalesforcePlatformCachePartitionType | SalesforceContentWorkspaceDoc | SalesforceGroup | SalesforceOpportunityFeed | SalesforceDocument | SalesforceSetupEntityAccess | SalesforceContactCleanInfo | SalesforceDuplicateRecordSet | SalesforceLeadShare | SalesforceSecureAgent | SalesforceContactFeed | SalesforceProduct2Feed | SalesforceQuickText | SalesforceSecureAgentsCluster | SalesforceFeedPollVote | SalesforceCorsWhitelistEntry | SalesforceOrderHistory | SalesforceChatterExtension | SalesforceContentDocumentLink | SalesforceOpportunityCompetitor | SalesforceIdeaComment | SalesforceBackgroundOperation | SalesforceCaseTeamTemplateRecord | SalesforceGroupMember | SalesforceWaveCompatibilityCheckItem | SalesforceCaseTeamTemplateMember | SalesforceApexTestResultLimits | SalesforceCaseTeamTemplate | SalesforceProcessInstanceStep | SalesforceObjectPermissions | SalesforceListViewChart | SalesforceOrderItemFeed | SalesforceProcessNode | SalesforceUserProvMockTarget | SalesforcePricebook2 | SalesforceLoginHistory | SalesforceCaseHistory | SalesforceChatterActivity | SalesforceEmailDomainKey | SalesforceInstalledMobileApp | SalesforceLoginIp | SalesforceSite | SalesforceExternalDataSource | SalesforceFeedComment | SalesforceLead | SalesforceOrderItemHistory | SalesforceFeedPollChoice | SalesforceWebLink | SalesforceCaseShare | SalesforcePricebook2History | SalesforceCronJobDetail | SalesforceEventRelation | SalesforceSolutionFeed | SalesforceStaticResource | SalesforceSolutionStatus | SalesforceFlowInterview | SalesforceIdpEventLog | SalesforceTodayGoalShare | SalesforceContentFolder | SalesforceAccountPartner | SalesforceContentDistribution | SalesforceCategoryData | SalesforceFiscalYearSettings | SalesforceListEmailShare | SalesforceCampaignFeed | SalesforceChatterExtensionConfig | SalesforcePricebookEntry | SalesforceDomainSite | SalesforceContentDocumentHistory | SalesforceTenantUsageEntitlement | SalesforceFeedAttachment | SalesforceCaseTeamRole | SalesforceContentWorkspaceSubscription | SalesforceTopicFeed | SalesforceRecordType | SalesforceListEmail | SalesforceAccountContactRole | SalesforceClientBrowser | SalesforceAssetFeed | SalesforcePartnerRole | SalesforceCaseFeed | SalesforceFileSearchActivity | SalesforceUserPackageLicense | SalesforceUserProvisioningRequest | SalesforcePermissionSetLicenseAssign | SalesforceUserShare | SalesforcePackageLicense | SalesforceAccountCleanInfo | SalesforceAssetShare | SalesforceContactShare | SalesforceProduct2History | SalesforceCampaignMember | SalesforceAssetRelationshipFeed | SalesforcePermissionSet | SalesforceActionLinkTemplate | SalesforceContentFolderItem | SalesforceOpportunityStage | SalesforceProfile | SalesforceAccount | SalesforceEmailCapture | SalesforceCaseSolution | SalesforceOpportunityContactRole | SalesforceUserRole | SalesforceEventFeed | SalesforceAssetRelationship | SalesforceEventLogFile | SalesforceOpportunityShare | SalesforceSamlSsoConfig | SalesforceAccountHistory | SalesforceOpportunityFieldHistory | SalesforceCollaborationGroupMember | SalesforceUserPreference | SalesforceCollaborationGroupFeed | SalesforceOrgDeleteRequest | SalesforceListView | SalesforceCustomObjectUserLicenseMetrics | SalesforceMailmergeTemplate | SalesforceCaseTeamMember | SalesforceCallCenter | SalesforceAssetRelationshipHistory | SalesforceContentFolderMember | SalesforceContentWorkspace | SalesforceContentDocumentFeed | SalesforceDashboardComponent | SalesforceConnectedApplication | SalesforceDomain | SalesforceVerificationHistory | SalesforceQueueSobject | SalesforceContentWorkspaceMember | SalesforceAuthSession | SalesforceVisualforceAccessMetrics | SalesforceReport | SalesforceApexTestSuite | SalesforceTaskPriority | SalesforceTopic | SalesforceAuthConfig | SalesforceQuickTextHistory | SalesforceContentVersionRating | SalesforceEmailTemplate | SalesforceLeadHistory | SalesforceContentDocument | SalesforceContact | SalesforceDatacloudPurchaseUsage | SalesforceAuraDefinition | SalesforceDataAssessmentFieldMetric | SalesforceSecurityCustomBaseline | SalesforceContentVersion | SalesforceCampaignMemberStatus | SalesforcePermissionSetLicense | SalesforceProcessDefinition | SalesforceEvent | SalesforceLeadCleanInfo | SalesforceSearchPromotionRule | SalesforceExternalDataUserAuth | SalesforceAnnouncement | SalesforceTopicUserEvent | SalesforceUserAppMenuCustomization | SalesforceOrderShare | SalesforceTestSuiteMembership | SalesforceCaseContactRole | SalesforceContentNotification | SalesforceDashboard | SalesforceUser | SalesforceMacroHistory | SalesforceBusinessHours | SalesforceContentWorkspacePermission | SalesforceContractFeed | SalesforceCustomPermission | SalesforceMacroInstruction | SalesforceDocumentAttachmentMap | SalesforceContract | SalesforceContentTagSubscription | SalesforceSolutionHistory | SalesforceCspTrustedSite | SalesforceGrantedByLicense | SalesforceCronTrigger | SalesforceSetupAuditTrail | SalesforceKnowledgeableUser | SalesforceEmailMessageRelation | SalesforceOrgWideEmailAddress | SalesforceMatchingRule | SalesforceEmailServicesFunction | SalesforceLeadStatus | SalesforceCommunity | SalesforceSessionPermSetActivation | SalesforceAcceptedEventRelation | SalesforceProduct2 | SalesforceAuthConfigProviders | SalesforceQuickTextShare | SalesforceFolder | SalesforceApexTestResult | SalesforceOrgDeleteRequestShare | SalesforceFlowInterviewShare | SalesforceUserProvAccountStaging | SalesforceBusinessProcess | SalesforceSolution | SalesforceSiteHistory | SalesforceVote | SalesforceContractContactRole | SalesforceAssignmentRule | SalesforceNote | SalesforceCustomBrand | SalesforceDataAssessmentValueMetric | SalesforceReportFeed | SalesforceContentVersionHistory | SalesforceIdea | SalesforceCollaborationGroup | SalesforceOpportunity | SalesforceContentDocumentSubscription | SalesforceContactHistory | SalesforceListEmailRecipientSource | SalesforceNamedCredential | SalesforceTodayGoal | SalesforceOrganization | SalesforceTaskFeed | SalesforceOpportunityLineItem | SalesforceFlowRecordRelation | SalesforceAdditionalNumber | SalesforceCollaborationInvitation | SalesforcePartner | SalesforceEntitySubscription | SalesforceCategoryNode | SalesforceApexEmailNotification | SalesforceUserListView | SalesforceUserProvAccount | SalesforceProcessInstanceWorkitem | SalesforceAsset | SalesforceDatacloudOwnedEntity | SalesforceUserProvisioningRequestShare | SalesforceActionLinkGroupTemplate | SalesforceUserAppInfo | SalesforceAppMenuItem | SalesforceUserAppMenuCustomizationShare | SalesforceAssetHistory | SalesforceOpportunityHistory | SalesforceDashboardComponentFeed | SalesforcePeriod | SalesforceContentFolderLink | SalesforceFeedItem | SalesforceAccountShare | SalesforceApexClass | SalesforceDashboardFeed | SalesforceSiteFeed | SalesforceApexTrigger | SalesforceStampAssignment | SalesforceUserLogin | SalesforceCustomBrandAsset | SalesforceAccountFeed | SalesforceCustomPermissionDependency | SalesforceContentAsset | SalesforceMacroShare | SalesforceCollaborationGroupMemberRequest | SalesforceCampaign | SalesforceOrder | SalesforceOrderFeed | SalesforceOpportunityPartner | SalesforceAttachment | SalesforceForecastShare | SalesforceApexComponent | SalesforceLightningComponentResource | SalesforceApexPage | SalesforceCase | SalesforceProcessInstance | SalesforceContentUserSubscription | SalesforceUserLicense | SalesforceContentDistributionView | SalesforceUndecidedEventRelation | SalesforceBrandTemplate | SalesforceCaseComment | SalesforceStreamingChannelShare | SalesforcePlatformCachePartition | SalesforceAuthProvider + +"""Field that Record Types can be sorted by""" +enum SalesforceRecordTypeSortByFieldEnum { + ID + NAME + DEVELOPER_NAME + NAMESPACE_PREFIX + DESCRIPTION + BUSINESS_PROCESS_ID + SOBJECT_TYPE + IS_ACTIVE + CREATED_BY_ID + CREATED_DATE + LAST_MODIFIED_BY_ID + LAST_MODIFIED_DATE + SYSTEM_MODSTAMP +} + +"""An edge in a connection.""" +type SalesforceRecordTypeEdge { + """The item at the end of the edge.""" + node: SalesforceRecordType! + + """A cursor for use in pagination""" + cursor: String! +} + +"""Salesforce Record Types connection, for use in pagination.""" +type SalesforceRecordTypesConnection { + """The count of all Record Type you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Record Types""" + nodes: [SalesforceRecordType!]! + + """List of Record Type edges""" + edges: [SalesforceRecordTypeEdge!]! +} + +"""Business Process""" +type SalesforceBusinessProcess implements OneGraphNode { + """Business Process ID""" + id: String! + + """Name""" + name: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Description""" + description: String + + """Entity Enumeration Or ID""" + tableEnumOrId: String! + + """Active""" + isActive: Boolean! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce RecordType""" + recordTypes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceRecordTypeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceRecordTypeSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceRecordTypeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of RecordTypes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceRecordTypesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Record Type""" +type SalesforceRecordType implements OneGraphNode { + """Record Type ID""" + id: String! + + """Name""" + name: String! + + """Record Type Name""" + developerName: String! + + """Namespace Prefix""" + namespacePrefix: String + + """Description""" + description: String + + """Business Process ID""" + businessProcessId: String + + """Business Process ID""" + businessProcess: SalesforceBusinessProcess + + """Sobject Type Name""" + sobjectType: String! + + """Active""" + isActive: Boolean! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce Campaign""" + campaigns( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Campaigns to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignsConnection + + """Collection of Salesforce ContentWorkspace""" + contentWorkspaces( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspaceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentWorkspaces to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentWorkspacesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Library""" +type SalesforceContentWorkspace implements OneGraphNode { + """Library ID""" + id: String! + + """Name""" + name: String! + + """Description""" + description: String + + """Tag Model""" + tagModel: String + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Modified Date""" + lastModifiedDate: String! + + """Record Type ID""" + defaultRecordTypeId: String + + """Record Type ID""" + defaultRecordType: SalesforceRecordType + + """Restrict Record Types""" + isRestrictContentTypes: Boolean! + + """Restrict Linked Record Types""" + isRestrictLinkedContentTypes: Boolean! + + """Library Type""" + workspaceType: String + + """Add Creator Membership""" + shouldAddCreatorMembership: Boolean! + + """Last Activity""" + lastWorkspaceActivityDate: String + + """Content Folder ID""" + rootContentFolderId: String + + """Content Folder ID""" + rootContentFolder: SalesforceContentFolder + + """Namespace Prefix""" + namespacePrefix: String + + """Unique Name""" + developerName: String + + """Collection of Salesforce ContentDocument""" + contentDocuments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentDocuments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentDocumentsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentFolderLink""" + contentFolderLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentFolderLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentFolderLinks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentFolderLinksConnection + + """Collection of Salesforce ContentNotification""" + contentNotifications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentNotificationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentNotificationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentNotificationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentNotifications to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentNotificationsConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce ContentWorkspaceDoc""" + contentWorkspaceDocs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceDocConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspaceDocSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceDocSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentWorkspaceDocs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentWorkspaceDocsConnection + + """Collection of Salesforce ContentWorkspaceMember""" + contentWorkspaceMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspaceMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentWorkspaceMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentWorkspaceMembersConnection + + """Collection of Salesforce ContentWorkspaceSubscription""" + contentWorkspaceSubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceSubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspaceSubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceSubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentWorkspaceSubscriptions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentWorkspaceSubscriptionsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content Document""" +type SalesforceContentDocument implements OneGraphNode { + """ContentDocument ID""" + id: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Is Archived""" + isArchived: Boolean! + + """User ID""" + archivedById: String + + """User ID""" + archivedBy: SalesforceUser + + """Archived Date""" + archivedDate: String + + """Is Deleted""" + isDeleted: Boolean! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Title""" + title: String! + + """Publish Status""" + publishStatus: String! + + """Latest Published Version ID""" + latestPublishedVersionId: String + + """Latest Published Version ID""" + latestPublishedVersion: SalesforceContentVersion + + """Parent ID""" + parentId: String + + """Parent ID""" + parent: SalesforceContentWorkspace + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Description""" + description: String + + """Size""" + contentSize: Int + + """File Type""" + fileType: String + + """File Extension""" + fileExtension: String + + """Prevent others from sharing and unsharing""" + sharingOption: String + + """File Privacy on Records""" + sharingPrivacy: String + + """Content Modified Date""" + contentModifiedDate: String + + """Asset File ID""" + contentAssetId: String + + """Asset File ID""" + contentAsset: SalesforceContentAsset + + """Collection of Salesforce ContentAsset""" + contentAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentAssets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentAssetsConnection + + """Collection of Salesforce ContentDistribution""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce ContentDocumentFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentFeedsConnection + + """Collection of Salesforce ContentDocumentHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentHistorysConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentDocumentSubscription""" + contentDocumentSubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentSubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentSubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentSubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentSubscriptions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentSubscriptionsConnection + + """Collection of Salesforce ContentFolderMember""" + contentFolderMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentFolderMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentFolderMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentFolderMembersConnection + + """Collection of Salesforce ContentNotification""" + contentNotifications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentNotificationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentNotificationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentNotificationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentNotifications to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentNotificationsConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce ContentVersionComment""" + contentVersionComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentVersionComments to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentVersionCommentsConnection + + """Collection of Salesforce ContentWorkspaceDoc""" + contentWorkspaceDocs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceDocConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspaceDocSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceDocSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentWorkspaceDocs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentWorkspaceDocsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Content Version""" +type SalesforceContentVersion implements OneGraphNode { + """ContentVersion ID""" + id: String! + + """ContentDocument ID""" + contentDocumentId: String! + + """ContentDocument ID""" + contentDocument: SalesforceContentDocument! + + """Is Latest""" + isLatest: Boolean! + + """Content URL""" + contentUrl: String + + """Content Body ID""" + contentBodyId: String + + """Content Body ID""" + contentBody: SalesforceContentBody + + """Version Number""" + versionNumber: String + + """Title""" + title: String! + + """Description""" + description: String + + """Reason For Change""" + reasonForChange: String + + """Prevent others from sharing and unsharing""" + sharingOption: String! + + """File Privacy on Records""" + sharingPrivacy: String! + + """Path On Client""" + pathOnClient: String + + """Rating Count""" + ratingCount: Int + + """Is Deleted""" + isDeleted: Boolean! + + """Content Modified Date""" + contentModifiedDate: String + + """User ID""" + contentModifiedById: String + + """User ID""" + contentModifiedBy: SalesforceUser + + """Positive Rating Count""" + positiveRatingCount: Int + + """Negative Rating Count""" + negativeRatingCount: Int + + """Featured Content Boost""" + featuredContentBoost: Int + + """Featured Content Date""" + featuredContentDate: String + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """System Modstamp""" + systemModstamp: String! + + """Tags""" + tagCsv: String + + """File Type""" + fileType: String! + + """Publish Status""" + publishStatus: String! + + """Version Data""" + versionData: String + + """Size""" + contentSize: Int + + """File Extension""" + fileExtension: String + + """First Publish Location ID""" + firstPublishLocationId: String + + """First Publish Location ID""" + firstPublishLocation: SalesforceContentVersionFirstPublishLocationUnion + + """Content Origin""" + origin: String! + + """Content Location""" + contentLocation: String! + + """Text Preview""" + textPreview: String + + """External Document Info1""" + externalDocumentInfo1: String + + """External Document Info2""" + externalDocumentInfo2: String + + """External Data Source ID""" + externalDataSourceId: String + + """External Data Source ID""" + externalDataSource: SalesforceExternalDataSource + + """Checksum""" + checksum: String + + """Major Version""" + isMajorVersion: Boolean! + + """Asset File Enabled""" + isAssetEnabled: Boolean! + + """Collection of Salesforce AccountFeed""" + accountFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountFeedsConnection + + """Collection of Salesforce AssetFeed""" + assetFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssetFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetFeedsConnection + + """Collection of Salesforce AssetRelationshipFeed""" + assetRelationshipFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetRelationshipFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetRelationshipFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetRelationshipFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of AssetRelationshipFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAssetRelationshipFeedsConnection + + """Collection of Salesforce CampaignFeed""" + campaignFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignFeedsConnection + + """Collection of Salesforce CaseFeed""" + caseFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseFeedsConnection + + """Collection of Salesforce CollaborationGroupFeed""" + collaborationGroupFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupFeedsConnection + + """Collection of Salesforce ContactFeed""" + contactFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContactFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactFeedsConnection + + """Collection of Salesforce ContentDistribution""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce ContentDocument""" + contentDocuments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentDocuments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentDocumentsConnection + + """Collection of Salesforce ContentDocumentFeed""" + contentDocumentFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentFeedsConnection + + """Collection of Salesforce ContentNotification""" + contentNotifications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentNotificationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentNotificationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentNotificationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentNotifications to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentNotificationsConnection + + """Collection of Salesforce ContentVersionComment""" + contentVersionComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentVersionComments to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentVersionCommentsConnection + + """Collection of Salesforce ContentVersionHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentVersionHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentVersionHistorysConnection + + """Collection of Salesforce ContentVersionRating""" + contentVersionRatings( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionRatingConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionRatingSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionRatingSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentVersionRatings to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentVersionRatingsConnection + + """Collection of Salesforce ContractFeed""" + contractFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContractFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractFeedsConnection + + """Collection of Salesforce DashboardComponentFeed""" + dashboardComponentFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardComponentFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDashboardComponentFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardComponentFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DashboardComponentFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDashboardComponentFeedsConnection + + """Collection of Salesforce DashboardFeed""" + dashboardFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDashboardFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DashboardFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDashboardFeedsConnection + + """Collection of Salesforce EventFeed""" + eventFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EventFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventFeedsConnection + + """Collection of Salesforce FeedAttachment""" + feedAttachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedAttachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedAttachmentsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce LeadFeed""" + leadFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadFeedsConnection + + """Collection of Salesforce OpportunityFeed""" + opportunityFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OpportunityFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunityFeedsConnection + + """Collection of Salesforce OrderFeed""" + orderFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderFeedsConnection + + """Collection of Salesforce OrderItemFeed""" + orderItemFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderItemFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderItemFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemFeedsConnection + + """Collection of Salesforce Product2Feed""" + product2Feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProduct2FeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProduct2FeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProduct2FeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Product2Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProduct2FeedsConnection + + """Collection of Salesforce ReportFeed""" + reportFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceReportFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceReportFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceReportFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ReportFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceReportFeedsConnection + + """Collection of Salesforce SiteFeed""" + siteFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSiteFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSiteFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSiteFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SiteFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSiteFeedsConnection + + """Collection of Salesforce SolutionFeed""" + solutionFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSolutionFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSolutionFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSolutionFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SolutionFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSolutionFeedsConnection + + """Collection of Salesforce TaskFeed""" + taskFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TaskFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTaskFeedsConnection + + """Collection of Salesforce TopicFeed""" + topicFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicFeedsConnection + + """Collection of Salesforce UserFeed""" + userFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserFeedsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Content Versions connection, for use in pagination.""" +type SalesforceContentVersionsConnection { + """The count of all Content Version you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Versions""" + nodes: [SalesforceContentVersion!]! + + """List of Content Version edges""" + edges: [SalesforceContentVersionEdge!]! +} + +""" +A filter to be used against ContentAsset object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentAssetConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentAsset's contentDocument relation.""" + contentDocument: SalesforceContentDocumentConnectionFilter + + """Filter by the ContentAsset's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContentAsset's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentAsset's id field""" + id: SalesforceIdFilter + + """Filter by the ContentAsset's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentAsset's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the ContentAsset's language field""" + language: SalesforceStringFilter + + """Filter by the ContentAsset's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the ContentAsset's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the ContentAsset's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentAsset's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentAsset's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContentAsset's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContentAsset's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentAsset's contentDocumentId field""" + contentDocumentId: SalesforceIdFilter + + """Filter by the ContentAsset's isVisibleByExternalUsers field""" + isVisibleByExternalUsers: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentAssetConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentAssetConnectionFilter!] +} + +""" +A filter to be used against ContentFolder object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentFolderConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentFolder's parentContentFolder relation.""" + parentContentFolder: SalesforceContentFolderConnectionFilter + + """Filter by the ContentFolder's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContentFolder's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentFolder's id field""" + id: SalesforceIdFilter + + """Filter by the ContentFolder's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentFolder's name field""" + name: SalesforceStringFilter + + """Filter by the ContentFolder's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentFolder's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentFolder's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContentFolder's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContentFolder's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentFolder's parentContentFolderId field""" + parentContentFolderId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentFolderConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentFolderConnectionFilter!] +} + +""" +A filter to be used against BusinessProcess object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceBusinessProcessConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the BusinessProcess's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the BusinessProcess's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the BusinessProcess's id field""" + id: SalesforceIdFilter + + """Filter by the BusinessProcess's name field""" + name: SalesforceStringFilter + + """Filter by the BusinessProcess's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the BusinessProcess's description field""" + description: SalesforceStringFilter + + """Filter by the BusinessProcess's tableEnumOrId field""" + tableEnumOrId: SalesforceStringFilter + + """Filter by the BusinessProcess's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the BusinessProcess's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the BusinessProcess's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the BusinessProcess's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the BusinessProcess's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the BusinessProcess's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceBusinessProcessConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceBusinessProcessConnectionFilter!] +} + +""" +A filter to be used against RecordType object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceRecordTypeConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the RecordType's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the RecordType's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the RecordType's businessProcess relation.""" + businessProcess: SalesforceBusinessProcessConnectionFilter + + """Filter by the RecordType's id field""" + id: SalesforceIdFilter + + """Filter by the RecordType's name field""" + name: SalesforceStringFilter + + """Filter by the RecordType's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the RecordType's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the RecordType's description field""" + description: SalesforceStringFilter + + """Filter by the RecordType's businessProcessId field""" + businessProcessId: SalesforceIdFilter + + """Filter by the RecordType's sobjectType field""" + sobjectType: SalesforceStringFilter + + """Filter by the RecordType's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the RecordType's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the RecordType's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the RecordType's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the RecordType's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the RecordType's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceRecordTypeConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceRecordTypeConnectionFilter!] +} + +""" +A filter to be used against ContentWorkspace object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentWorkspaceConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentWorkspace's rootContentFolder relation.""" + rootContentFolder: SalesforceContentFolderConnectionFilter + + """Filter by the ContentWorkspace's defaultRecordType relation.""" + defaultRecordType: SalesforceRecordTypeConnectionFilter + + """Filter by the ContentWorkspace's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContentWorkspace's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentWorkspace's id field""" + id: SalesforceIdFilter + + """Filter by the ContentWorkspace's name field""" + name: SalesforceStringFilter + + """Filter by the ContentWorkspace's description field""" + description: SalesforceStringFilter + + """Filter by the ContentWorkspace's tagModel field""" + tagModel: SalesforceStringFilter + + """Filter by the ContentWorkspace's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentWorkspace's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentWorkspace's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContentWorkspace's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentWorkspace's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContentWorkspace's defaultRecordTypeId field""" + defaultRecordTypeId: SalesforceIdFilter + + """Filter by the ContentWorkspace's isRestrictContentTypes field""" + isRestrictContentTypes: SalesforceBooleanFilter + + """Filter by the ContentWorkspace's isRestrictLinkedContentTypes field""" + isRestrictLinkedContentTypes: SalesforceBooleanFilter + + """Filter by the ContentWorkspace's workspaceType field""" + workspaceType: SalesforceStringFilter + + """Filter by the ContentWorkspace's rootContentFolderId field""" + rootContentFolderId: SalesforceIdFilter + + """Filter by the ContentWorkspace's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the ContentWorkspace's developerName field""" + developerName: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentWorkspaceConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentWorkspaceConnectionFilter!] +} + +""" +A filter to be used against StaticResource object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceStaticResourceConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the StaticResource's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the StaticResource's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the StaticResource's id field""" + id: SalesforceIdFilter + + """Filter by the StaticResource's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the StaticResource's name field""" + name: SalesforceStringFilter + + """Filter by the StaticResource's contentType field""" + contentType: SalesforceStringFilter + + """Filter by the StaticResource's bodyLength field""" + bodyLength: SalesforceIntFilter + + """Filter by the StaticResource's description field""" + description: SalesforceStringFilter + + """Filter by the StaticResource's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the StaticResource's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the StaticResource's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the StaticResource's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the StaticResource's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the StaticResource's cacheControl field""" + cacheControl: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceStaticResourceConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceStaticResourceConnectionFilter!] +} + +""" +A filter to be used against ApexClass object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceApexClassConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ApexClass's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ApexClass's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ApexClass's id field""" + id: SalesforceIdFilter + + """Filter by the ApexClass's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the ApexClass's name field""" + name: SalesforceStringFilter + + """Filter by the ApexClass's apiVersion field""" + apiVersion: SalesforceFloatFilter + + """Filter by the ApexClass's status field""" + status: SalesforceStringFilter + + """Filter by the ApexClass's isValid field""" + isValid: SalesforceBooleanFilter + + """Filter by the ApexClass's bodyCrc field""" + bodyCrc: SalesforceFloatFilter + + """Filter by the ApexClass's lengthWithoutComments field""" + lengthWithoutComments: SalesforceIntFilter + + """Filter by the ApexClass's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ApexClass's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ApexClass's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ApexClass's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ApexClass's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceApexClassConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceApexClassConnectionFilter!] +} + +""" +A filter to be used against AuthProvider object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAuthProviderConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the AuthProvider's plugin relation.""" + plugin: SalesforceApexClassConnectionFilter + + """Filter by the AuthProvider's executionUser relation.""" + executionUser: SalesforceUserConnectionFilter + + """Filter by the AuthProvider's registrationHandler relation.""" + registrationHandler: SalesforceApexClassConnectionFilter + + """Filter by the AuthProvider's id field""" + id: SalesforceIdFilter + + """Filter by the AuthProvider's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the AuthProvider's providerType field""" + providerType: SalesforceStringFilter + + """Filter by the AuthProvider's friendlyName field""" + friendlyName: SalesforceStringFilter + + """Filter by the AuthProvider's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the AuthProvider's registrationHandlerId field""" + registrationHandlerId: SalesforceIdFilter + + """Filter by the AuthProvider's executionUserId field""" + executionUserId: SalesforceIdFilter + + """Filter by the AuthProvider's consumerKey field""" + consumerKey: SalesforceStringFilter + + """Filter by the AuthProvider's errorUrl field""" + errorUrl: SalesforceStringFilter + + """Filter by the AuthProvider's authorizeUrl field""" + authorizeUrl: SalesforceStringFilter + + """Filter by the AuthProvider's tokenUrl field""" + tokenUrl: SalesforceStringFilter + + """Filter by the AuthProvider's userInfoUrl field""" + userInfoUrl: SalesforceStringFilter + + """Filter by the AuthProvider's defaultScopes field""" + defaultScopes: SalesforceStringFilter + + """Filter by the AuthProvider's idTokenIssuer field""" + idTokenIssuer: SalesforceStringFilter + + """Filter by the AuthProvider's optionsSendAccessTokenInHeader field""" + optionsSendAccessTokenInHeader: SalesforceBooleanFilter + + """ + Filter by the AuthProvider's optionsSendClientCredentialsInHeader field + """ + optionsSendClientCredentialsInHeader: SalesforceBooleanFilter + + """Filter by the AuthProvider's optionsIncludeOrgIdInId field""" + optionsIncludeOrgIdInId: SalesforceBooleanFilter + + """Filter by the AuthProvider's iconUrl field""" + iconUrl: SalesforceStringFilter + + """Filter by the AuthProvider's logoutUrl field""" + logoutUrl: SalesforceStringFilter + + """Filter by the AuthProvider's pluginId field""" + pluginId: SalesforceIdFilter + + """Filter by the AuthProvider's customMetadataTypeRecord field""" + customMetadataTypeRecord: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAuthProviderConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAuthProviderConnectionFilter!] +} + +""" +A filter to be used against ExternalDataSource object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceExternalDataSourceConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ExternalDataSource's smallIcon relation.""" + smallIcon: SalesforceStaticResourceConnectionFilter + + """Filter by the ExternalDataSource's largeIcon relation.""" + largeIcon: SalesforceStaticResourceConnectionFilter + + """Filter by the ExternalDataSource's authProvider relation.""" + authProvider: SalesforceAuthProviderConnectionFilter + + """Filter by the ExternalDataSource's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ExternalDataSource's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ExternalDataSource's id field""" + id: SalesforceIdFilter + + """Filter by the ExternalDataSource's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ExternalDataSource's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the ExternalDataSource's language field""" + language: SalesforceStringFilter + + """Filter by the ExternalDataSource's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the ExternalDataSource's namespacePrefix field""" + namespacePrefix: SalesforceStringFilter + + """Filter by the ExternalDataSource's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ExternalDataSource's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ExternalDataSource's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ExternalDataSource's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ExternalDataSource's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ExternalDataSource's type field""" + type: SalesforceStringFilter + + """Filter by the ExternalDataSource's repository field""" + repository: SalesforceStringFilter + + """Filter by the ExternalDataSource's isWritable field""" + isWritable: SalesforceBooleanFilter + + """Filter by the ExternalDataSource's principalType field""" + principalType: SalesforceStringFilter + + """Filter by the ExternalDataSource's protocol field""" + protocol: SalesforceStringFilter + + """Filter by the ExternalDataSource's authProviderId field""" + authProviderId: SalesforceIdFilter + + """Filter by the ExternalDataSource's largeIconId field""" + largeIconId: SalesforceIdFilter + + """Filter by the ExternalDataSource's smallIconId field""" + smallIconId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceExternalDataSourceConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceExternalDataSourceConnectionFilter!] +} + +""" +A filter to be used against ContentVersion object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentVersionConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentVersion's externalDataSource relation.""" + externalDataSource: SalesforceExternalDataSourceConnectionFilter + + """Filter by the ContentVersion's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContentVersion's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentVersion's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the ContentVersion's contentModifiedBy relation.""" + contentModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContentVersion's contentDocument relation.""" + contentDocument: SalesforceContentDocumentConnectionFilter + + """Filter by the ContentVersion's id field""" + id: SalesforceIdFilter + + """Filter by the ContentVersion's contentDocumentId field""" + contentDocumentId: SalesforceIdFilter + + """Filter by the ContentVersion's isLatest field""" + isLatest: SalesforceBooleanFilter + + """Filter by the ContentVersion's contentUrl field""" + contentUrl: SalesforceStringFilter + + """Filter by the ContentVersion's contentBodyId field""" + contentBodyId: SalesforceIdFilter + + """Filter by the ContentVersion's versionNumber field""" + versionNumber: SalesforceStringFilter + + """Filter by the ContentVersion's title field""" + title: SalesforceStringFilter + + """Filter by the ContentVersion's description field""" + description: SalesforceStringFilter + + """Filter by the ContentVersion's reasonForChange field""" + reasonForChange: SalesforceStringFilter + + """Filter by the ContentVersion's sharingOption field""" + sharingOption: SalesforceStringFilter + + """Filter by the ContentVersion's sharingPrivacy field""" + sharingPrivacy: SalesforceStringFilter + + """Filter by the ContentVersion's pathOnClient field""" + pathOnClient: SalesforceStringFilter + + """Filter by the ContentVersion's ratingCount field""" + ratingCount: SalesforceIntFilter + + """Filter by the ContentVersion's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentVersion's contentModifiedDate field""" + contentModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContentVersion's contentModifiedById field""" + contentModifiedById: SalesforceIdFilter + + """Filter by the ContentVersion's positiveRatingCount field""" + positiveRatingCount: SalesforceIntFilter + + """Filter by the ContentVersion's negativeRatingCount field""" + negativeRatingCount: SalesforceIntFilter + + """Filter by the ContentVersion's featuredContentBoost field""" + featuredContentBoost: SalesforceIntFilter + + """Filter by the ContentVersion's featuredContentDate field""" + featuredContentDate: SalesforceDateFilter + + """Filter by the ContentVersion's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the ContentVersion's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentVersion's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentVersion's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContentVersion's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContentVersion's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentVersion's fileType field""" + fileType: SalesforceStringFilter + + """Filter by the ContentVersion's publishStatus field""" + publishStatus: SalesforceStringFilter + + """Filter by the ContentVersion's contentSize field""" + contentSize: SalesforceIntFilter + + """Filter by the ContentVersion's fileExtension field""" + fileExtension: SalesforceStringFilter + + """Filter by the ContentVersion's firstPublishLocationId field""" + firstPublishLocationId: SalesforceIdFilter + + """Filter by the ContentVersion's origin field""" + origin: SalesforceStringFilter + + """Filter by the ContentVersion's contentLocation field""" + contentLocation: SalesforceStringFilter + + """Filter by the ContentVersion's textPreview field""" + textPreview: SalesforceStringFilter + + """Filter by the ContentVersion's externalDocumentInfo1 field""" + externalDocumentInfo1: SalesforceStringFilter + + """Filter by the ContentVersion's externalDocumentInfo2 field""" + externalDocumentInfo2: SalesforceStringFilter + + """Filter by the ContentVersion's externalDataSourceId field""" + externalDataSourceId: SalesforceIdFilter + + """Filter by the ContentVersion's checksum field""" + checksum: SalesforceStringFilter + + """Filter by the ContentVersion's isMajorVersion field""" + isMajorVersion: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentVersionConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentVersionConnectionFilter!] +} + +""" +A filter to be used against CallCenter object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceCallCenterConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the CallCenter's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the CallCenter's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the CallCenter's id field""" + id: SalesforceIdFilter + + """Filter by the CallCenter's name field""" + name: SalesforceStringFilter + + """Filter by the CallCenter's internalName field""" + internalName: SalesforceStringFilter + + """Filter by the CallCenter's version field""" + version: SalesforceFloatFilter + + """Filter by the CallCenter's adapterUrl field""" + adapterUrl: SalesforceStringFilter + + """Filter by the CallCenter's customSettings field""" + customSettings: SalesforceStringFilter + + """Filter by the CallCenter's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the CallCenter's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the CallCenter's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the CallCenter's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the CallCenter's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceCallCenterConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceCallCenterConnectionFilter!] +} + +""" +A filter to be used against Contact object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContactConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Contact's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Contact's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Contact's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the Contact's reportsTo relation.""" + reportsTo: SalesforceContactConnectionFilter + + """Filter by the Contact's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the Contact's masterRecord relation.""" + masterRecord: SalesforceContactConnectionFilter + + """Filter by the Contact's id field""" + id: SalesforceIdFilter + + """Filter by the Contact's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Contact's masterRecordId field""" + masterRecordId: SalesforceIdFilter + + """Filter by the Contact's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the Contact's lastName field""" + lastName: SalesforceStringFilter + + """Filter by the Contact's firstName field""" + firstName: SalesforceStringFilter + + """Filter by the Contact's salutation field""" + salutation: SalesforceStringFilter + + """Filter by the Contact's name field""" + name: SalesforceStringFilter + + """Filter by the Contact's otherStreet field""" + otherStreet: SalesforceStringFilter + + """Filter by the Contact's otherCity field""" + otherCity: SalesforceStringFilter + + """Filter by the Contact's otherState field""" + otherState: SalesforceStringFilter + + """Filter by the Contact's otherPostalCode field""" + otherPostalCode: SalesforceStringFilter + + """Filter by the Contact's otherCountry field""" + otherCountry: SalesforceStringFilter + + """Filter by the Contact's otherLatitude field""" + otherLatitude: SalesforceFloatFilter + + """Filter by the Contact's otherLongitude field""" + otherLongitude: SalesforceFloatFilter + + """Filter by the Contact's otherGeocodeAccuracy field""" + otherGeocodeAccuracy: SalesforceStringFilter + + """Filter by the Contact's mailingStreet field""" + mailingStreet: SalesforceStringFilter + + """Filter by the Contact's mailingCity field""" + mailingCity: SalesforceStringFilter + + """Filter by the Contact's mailingState field""" + mailingState: SalesforceStringFilter + + """Filter by the Contact's mailingPostalCode field""" + mailingPostalCode: SalesforceStringFilter + + """Filter by the Contact's mailingCountry field""" + mailingCountry: SalesforceStringFilter + + """Filter by the Contact's mailingLatitude field""" + mailingLatitude: SalesforceFloatFilter + + """Filter by the Contact's mailingLongitude field""" + mailingLongitude: SalesforceFloatFilter + + """Filter by the Contact's mailingGeocodeAccuracy field""" + mailingGeocodeAccuracy: SalesforceStringFilter + + """Filter by the Contact's phone field""" + phone: SalesforceStringFilter + + """Filter by the Contact's fax field""" + fax: SalesforceStringFilter + + """Filter by the Contact's mobilePhone field""" + mobilePhone: SalesforceStringFilter + + """Filter by the Contact's homePhone field""" + homePhone: SalesforceStringFilter + + """Filter by the Contact's otherPhone field""" + otherPhone: SalesforceStringFilter + + """Filter by the Contact's assistantPhone field""" + assistantPhone: SalesforceStringFilter + + """Filter by the Contact's reportsToId field""" + reportsToId: SalesforceIdFilter + + """Filter by the Contact's email field""" + email: SalesforceStringFilter + + """Filter by the Contact's title field""" + title: SalesforceStringFilter + + """Filter by the Contact's department field""" + department: SalesforceStringFilter + + """Filter by the Contact's assistantName field""" + assistantName: SalesforceStringFilter + + """Filter by the Contact's leadSource field""" + leadSource: SalesforceStringFilter + + """Filter by the Contact's birthdate field""" + birthdate: SalesforceDateFilter + + """Filter by the Contact's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Contact's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Contact's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Contact's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Contact's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Contact's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Contact's lastActivityDate field""" + lastActivityDate: SalesforceDateFilter + + """Filter by the Contact's lastCuRequestDate field""" + lastCuRequestDate: SalesforceDateTimeFilter + + """Filter by the Contact's lastCuUpdateDate field""" + lastCuUpdateDate: SalesforceDateTimeFilter + + """Filter by the Contact's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Contact's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the Contact's emailBouncedReason field""" + emailBouncedReason: SalesforceStringFilter + + """Filter by the Contact's emailBouncedDate field""" + emailBouncedDate: SalesforceDateTimeFilter + + """Filter by the Contact's isEmailBounced field""" + isEmailBounced: SalesforceBooleanFilter + + """Filter by the Contact's photoUrl field""" + photoUrl: SalesforceStringFilter + + """Filter by the Contact's jigsaw field""" + jigsaw: SalesforceStringFilter + + """Filter by the Contact's jigsawContactId field""" + jigsawContactId: SalesforceStringFilter + + """Filter by the Contact's cleanStatus field""" + cleanStatus: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContactConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContactConnectionFilter!] +} + +""" +A filter to be used against UserLicense object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserLicenseConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserLicense's id field""" + id: SalesforceIdFilter + + """Filter by the UserLicense's licenseDefinitionKey field""" + licenseDefinitionKey: SalesforceStringFilter + + """Filter by the UserLicense's totalLicenses field""" + totalLicenses: SalesforceIntFilter + + """Filter by the UserLicense's status field""" + status: SalesforceStringFilter + + """Filter by the UserLicense's usedLicenses field""" + usedLicenses: SalesforceIntFilter + + """Filter by the UserLicense's usedLicensesLastUpdated field""" + usedLicensesLastUpdated: SalesforceDateTimeFilter + + """Filter by the UserLicense's name field""" + name: SalesforceStringFilter + + """Filter by the UserLicense's masterLabel field""" + masterLabel: SalesforceStringFilter + + """Filter by the UserLicense's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the UserLicense's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserLicense's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserLicenseConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserLicenseConnectionFilter!] +} + +""" +A filter to be used against Profile object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceProfileConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Profile's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Profile's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Profile's userLicense relation.""" + userLicense: SalesforceUserLicenseConnectionFilter + + """Filter by the Profile's id field""" + id: SalesforceIdFilter + + """Filter by the Profile's name field""" + name: SalesforceStringFilter + + """Filter by the Profile's permissionsEmailSingle field""" + permissionsEmailSingle: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEmailMass field""" + permissionsEmailMass: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditTask field""" + permissionsEditTask: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditEvent field""" + permissionsEditEvent: SalesforceBooleanFilter + + """Filter by the Profile's permissionsExportReport field""" + permissionsExportReport: SalesforceBooleanFilter + + """Filter by the Profile's permissionsImportPersonal field""" + permissionsImportPersonal: SalesforceBooleanFilter + + """Filter by the Profile's permissionsDataExport field""" + permissionsDataExport: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageUsers field""" + permissionsManageUsers: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditPublicFilters field""" + permissionsEditPublicFilters: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditPublicTemplates field""" + permissionsEditPublicTemplates: SalesforceBooleanFilter + + """Filter by the Profile's permissionsModifyAllData field""" + permissionsModifyAllData: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageCases field""" + permissionsManageCases: SalesforceBooleanFilter + + """Filter by the Profile's permissionsMassInlineEdit field""" + permissionsMassInlineEdit: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditKnowledge field""" + permissionsEditKnowledge: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageKnowledge field""" + permissionsManageKnowledge: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageSolutions field""" + permissionsManageSolutions: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCustomizeApplication field""" + permissionsCustomizeApplication: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditReadonlyFields field""" + permissionsEditReadonlyFields: SalesforceBooleanFilter + + """Filter by the Profile's permissionsRunReports field""" + permissionsRunReports: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewSetup field""" + permissionsViewSetup: SalesforceBooleanFilter + + """Filter by the Profile's permissionsTransferAnyEntity field""" + permissionsTransferAnyEntity: SalesforceBooleanFilter + + """Filter by the Profile's permissionsNewReportBuilder field""" + permissionsNewReportBuilder: SalesforceBooleanFilter + + """Filter by the Profile's permissionsActivateContract field""" + permissionsActivateContract: SalesforceBooleanFilter + + """Filter by the Profile's permissionsActivateOrder field""" + permissionsActivateOrder: SalesforceBooleanFilter + + """Filter by the Profile's permissionsImportLeads field""" + permissionsImportLeads: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageLeads field""" + permissionsManageLeads: SalesforceBooleanFilter + + """Filter by the Profile's permissionsTransferAnyLead field""" + permissionsTransferAnyLead: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewAllData field""" + permissionsViewAllData: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditPublicDocuments field""" + permissionsEditPublicDocuments: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewEncryptedData field""" + permissionsViewEncryptedData: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditBrandTemplates field""" + permissionsEditBrandTemplates: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditHtmlTemplates field""" + permissionsEditHtmlTemplates: SalesforceBooleanFilter + + """Filter by the Profile's permissionsChatterInternalUser field""" + permissionsChatterInternalUser: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageEncryptionKeys field""" + permissionsManageEncryptionKeys: SalesforceBooleanFilter + + """Filter by the Profile's permissionsDeleteActivatedContract field""" + permissionsDeleteActivatedContract: SalesforceBooleanFilter + + """Filter by the Profile's permissionsChatterInviteExternalUsers field""" + permissionsChatterInviteExternalUsers: SalesforceBooleanFilter + + """Filter by the Profile's permissionsSendSitRequests field""" + permissionsSendSitRequests: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageRemoteAccess field""" + permissionsManageRemoteAccess: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCanUseNewDashboardBuilder field""" + permissionsCanUseNewDashboardBuilder: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageCategories field""" + permissionsManageCategories: SalesforceBooleanFilter + + """Filter by the Profile's permissionsConvertLeads field""" + permissionsConvertLeads: SalesforceBooleanFilter + + """Filter by the Profile's permissionsPasswordNeverExpires field""" + permissionsPasswordNeverExpires: SalesforceBooleanFilter + + """Filter by the Profile's permissionsUseTeamReassignWizards field""" + permissionsUseTeamReassignWizards: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditActivatedOrders field""" + permissionsEditActivatedOrders: SalesforceBooleanFilter + + """Filter by the Profile's permissionsInstallMultiforce field""" + permissionsInstallMultiforce: SalesforceBooleanFilter + + """Filter by the Profile's permissionsPublishMultiforce field""" + permissionsPublishMultiforce: SalesforceBooleanFilter + + """Filter by the Profile's permissionsChatterOwnGroups field""" + permissionsChatterOwnGroups: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditOppLineItemUnitPrice field""" + permissionsEditOppLineItemUnitPrice: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCreateMultiforce field""" + permissionsCreateMultiforce: SalesforceBooleanFilter + + """Filter by the Profile's permissionsBulkApiHardDelete field""" + permissionsBulkApiHardDelete: SalesforceBooleanFilter + + """Filter by the Profile's permissionsSolutionImport field""" + permissionsSolutionImport: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageCallCenters field""" + permissionsManageCallCenters: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageSynonyms field""" + permissionsManageSynonyms: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewContent field""" + permissionsViewContent: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageEmailClientConfig field""" + permissionsManageEmailClientConfig: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEnableNotifications field""" + permissionsEnableNotifications: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageDataIntegrations field""" + permissionsManageDataIntegrations: SalesforceBooleanFilter + + """Filter by the Profile's permissionsDistributeFromPersWksp field""" + permissionsDistributeFromPersWksp: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewDataCategories field""" + permissionsViewDataCategories: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageDataCategories field""" + permissionsManageDataCategories: SalesforceBooleanFilter + + """Filter by the Profile's permissionsAuthorApex field""" + permissionsAuthorApex: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageMobile field""" + permissionsManageMobile: SalesforceBooleanFilter + + """Filter by the Profile's permissionsApiEnabled field""" + permissionsApiEnabled: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageCustomReportTypes field""" + permissionsManageCustomReportTypes: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditCaseComments field""" + permissionsEditCaseComments: SalesforceBooleanFilter + + """Filter by the Profile's permissionsTransferAnyCase field""" + permissionsTransferAnyCase: SalesforceBooleanFilter + + """Filter by the Profile's permissionsContentAdministrator field""" + permissionsContentAdministrator: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCreateWorkspaces field""" + permissionsCreateWorkspaces: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageContentPermissions field""" + permissionsManageContentPermissions: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageContentProperties field""" + permissionsManageContentProperties: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageContentTypes field""" + permissionsManageContentTypes: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageExchangeConfig field""" + permissionsManageExchangeConfig: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageAnalyticSnapshots field""" + permissionsManageAnalyticSnapshots: SalesforceBooleanFilter + + """Filter by the Profile's permissionsScheduleReports field""" + permissionsScheduleReports: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageBusinessHourHolidays field""" + permissionsManageBusinessHourHolidays: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageDynamicDashboards field""" + permissionsManageDynamicDashboards: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCustomSidebarOnAllPages field""" + permissionsCustomSidebarOnAllPages: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageInteraction field""" + permissionsManageInteraction: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewMyTeamsDashboards field""" + permissionsViewMyTeamsDashboards: SalesforceBooleanFilter + + """Filter by the Profile's permissionsModerateChatter field""" + permissionsModerateChatter: SalesforceBooleanFilter + + """Filter by the Profile's permissionsResetPasswords field""" + permissionsResetPasswords: SalesforceBooleanFilter + + """Filter by the Profile's permissionsFlowUflRequired field""" + permissionsFlowUflRequired: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCanInsertFeedSystemFields field""" + permissionsCanInsertFeedSystemFields: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageKnowledgeImportExport field""" + permissionsManageKnowledgeImportExport: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEmailTemplateManagement field""" + permissionsEmailTemplateManagement: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEmailAdministration field""" + permissionsEmailAdministration: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageChatterMessages field""" + permissionsManageChatterMessages: SalesforceBooleanFilter + + """Filter by the Profile's permissionsAllowEmailIc field""" + permissionsAllowEmailIc: SalesforceBooleanFilter + + """Filter by the Profile's permissionsChatterFileLink field""" + permissionsChatterFileLink: SalesforceBooleanFilter + + """Filter by the Profile's permissionsForceTwoFactor field""" + permissionsForceTwoFactor: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewEventLogFiles field""" + permissionsViewEventLogFiles: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageNetworks field""" + permissionsManageNetworks: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageAuthProviders field""" + permissionsManageAuthProviders: SalesforceBooleanFilter + + """Filter by the Profile's permissionsRunFlow field""" + permissionsRunFlow: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCreateCustomizeDashboards field""" + permissionsCreateCustomizeDashboards: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCreateDashboardFolders field""" + permissionsCreateDashboardFolders: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewPublicDashboards field""" + permissionsViewPublicDashboards: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageDashbdsInPubFolders field""" + permissionsManageDashbdsInPubFolders: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCreateCustomizeReports field""" + permissionsCreateCustomizeReports: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCreateReportFolders field""" + permissionsCreateReportFolders: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewPublicReports field""" + permissionsViewPublicReports: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageReportsInPubFolders field""" + permissionsManageReportsInPubFolders: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditMyDashboards field""" + permissionsEditMyDashboards: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditMyReports field""" + permissionsEditMyReports: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewAllUsers field""" + permissionsViewAllUsers: SalesforceBooleanFilter + + """Filter by the Profile's permissionsAllowUniversalSearch field""" + permissionsAllowUniversalSearch: SalesforceBooleanFilter + + """Filter by the Profile's permissionsConnectOrgToEnvironmentHub field""" + permissionsConnectOrgToEnvironmentHub: SalesforceBooleanFilter + + """Filter by the Profile's permissionsWorkCalibrationUser field""" + permissionsWorkCalibrationUser: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCreateCustomizeFilters field""" + permissionsCreateCustomizeFilters: SalesforceBooleanFilter + + """Filter by the Profile's permissionsWorkDotComUserPerm field""" + permissionsWorkDotComUserPerm: SalesforceBooleanFilter + + """Filter by the Profile's permissionsGovernNetworks field""" + permissionsGovernNetworks: SalesforceBooleanFilter + + """Filter by the Profile's permissionsSalesConsole field""" + permissionsSalesConsole: SalesforceBooleanFilter + + """Filter by the Profile's permissionsTwoFactorApi field""" + permissionsTwoFactorApi: SalesforceBooleanFilter + + """Filter by the Profile's permissionsDeleteTopics field""" + permissionsDeleteTopics: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEditTopics field""" + permissionsEditTopics: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCreateTopics field""" + permissionsCreateTopics: SalesforceBooleanFilter + + """Filter by the Profile's permissionsAssignTopics field""" + permissionsAssignTopics: SalesforceBooleanFilter + + """Filter by the Profile's permissionsIdentityEnabled field""" + permissionsIdentityEnabled: SalesforceBooleanFilter + + """Filter by the Profile's permissionsIdentityConnect field""" + permissionsIdentityConnect: SalesforceBooleanFilter + + """Filter by the Profile's permissionsAllowViewKnowledge field""" + permissionsAllowViewKnowledge: SalesforceBooleanFilter + + """Filter by the Profile's permissionsContentWorkspaces field""" + permissionsContentWorkspaces: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageSearchPromotionRules field""" + permissionsManageSearchPromotionRules: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCustomMobileAppsAccess field""" + permissionsCustomMobileAppsAccess: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewHelpLink field""" + permissionsViewHelpLink: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageProfilesPermissionsets field""" + permissionsManageProfilesPermissionsets: SalesforceBooleanFilter + + """Filter by the Profile's permissionsAssignPermissionSets field""" + permissionsAssignPermissionSets: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageRoles field""" + permissionsManageRoles: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageIpAddresses field""" + permissionsManageIpAddresses: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageSharing field""" + permissionsManageSharing: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageInternalUsers field""" + permissionsManageInternalUsers: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManagePasswordPolicies field""" + permissionsManagePasswordPolicies: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageLoginAccessPolicies field""" + permissionsManageLoginAccessPolicies: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageCustomPermissions field""" + permissionsManageCustomPermissions: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCanVerifyComment field""" + permissionsCanVerifyComment: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageUnlistedGroups field""" + permissionsManageUnlistedGroups: SalesforceBooleanFilter + + """Filter by the Profile's permissionsModifySecureAgents field""" + permissionsModifySecureAgents: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageTwoFactor field""" + permissionsManageTwoFactor: SalesforceBooleanFilter + + """Filter by the Profile's permissionsChatterForSharePoint field""" + permissionsChatterForSharePoint: SalesforceBooleanFilter + + """Filter by the Profile's permissionsLightningExperienceUser field""" + permissionsLightningExperienceUser: SalesforceBooleanFilter + + """Filter by the Profile's permissionsConfigCustomRecs field""" + permissionsConfigCustomRecs: SalesforceBooleanFilter + + """Filter by the Profile's permissionsSubmitMacrosAllowed field""" + permissionsSubmitMacrosAllowed: SalesforceBooleanFilter + + """Filter by the Profile's permissionsBulkMacrosAllowed field""" + permissionsBulkMacrosAllowed: SalesforceBooleanFilter + + """Filter by the Profile's permissionsShareInternalArticles field""" + permissionsShareInternalArticles: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageSessionPermissionSets field""" + permissionsManageSessionPermissionSets: SalesforceBooleanFilter + + """Filter by the Profile's permissionsSendAnnouncementEmails field""" + permissionsSendAnnouncementEmails: SalesforceBooleanFilter + + """Filter by the Profile's permissionsChatterEditOwnPost field""" + permissionsChatterEditOwnPost: SalesforceBooleanFilter + + """Filter by the Profile's permissionsChatterEditOwnRecordPost field""" + permissionsChatterEditOwnRecordPost: SalesforceBooleanFilter + + """Filter by the Profile's permissionsImportCustomObjects field""" + permissionsImportCustomObjects: SalesforceBooleanFilter + + """Filter by the Profile's permissionsDelegatedTwoFactor field""" + permissionsDelegatedTwoFactor: SalesforceBooleanFilter + + """Filter by the Profile's permissionsChatterComposeUiCodesnippet field""" + permissionsChatterComposeUiCodesnippet: SalesforceBooleanFilter + + """Filter by the Profile's permissionsSelectFilesFromSalesforce field""" + permissionsSelectFilesFromSalesforce: SalesforceBooleanFilter + + """Filter by the Profile's permissionsModerateNetworkUsers field""" + permissionsModerateNetworkUsers: SalesforceBooleanFilter + + """Filter by the Profile's permissionsMergeTopics field""" + permissionsMergeTopics: SalesforceBooleanFilter + + """Filter by the Profile's permissionsSubscribeToLightningReports field""" + permissionsSubscribeToLightningReports: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManagePvtRptsAndDashbds field""" + permissionsManagePvtRptsAndDashbds: SalesforceBooleanFilter + + """Filter by the Profile's permissionsAllowLightningLogin field""" + permissionsAllowLightningLogin: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCampaignInfluence2 field""" + permissionsCampaignInfluence2: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewDataAssessment field""" + permissionsViewDataAssessment: SalesforceBooleanFilter + + """Filter by the Profile's permissionsRemoveDirectMessageMembers field""" + permissionsRemoveDirectMessageMembers: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCanApproveFeedPost field""" + permissionsCanApproveFeedPost: SalesforceBooleanFilter + + """Filter by the Profile's permissionsAddDirectMessageMembers field""" + permissionsAddDirectMessageMembers: SalesforceBooleanFilter + + """Filter by the Profile's permissionsAllowViewEditConvertedLeads field""" + permissionsAllowViewEditConvertedLeads: SalesforceBooleanFilter + + """Filter by the Profile's permissionsShowCompanyNameAsUserBadge field""" + permissionsShowCompanyNameAsUserBadge: SalesforceBooleanFilter + + """Filter by the Profile's permissionsAccessCmc field""" + permissionsAccessCmc: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewHealthCheck field""" + permissionsViewHealthCheck: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageHealthCheck field""" + permissionsManageHealthCheck: SalesforceBooleanFilter + + """Filter by the Profile's permissionsPackaging2 field""" + permissionsPackaging2: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageCertificates field""" + permissionsManageCertificates: SalesforceBooleanFilter + + """Filter by the Profile's permissionsCreateReportInLightning field""" + permissionsCreateReportInLightning: SalesforceBooleanFilter + + """Filter by the Profile's permissionsPreventClassicExperience field""" + permissionsPreventClassicExperience: SalesforceBooleanFilter + + """Filter by the Profile's permissionsHideReadByList field""" + permissionsHideReadByList: SalesforceBooleanFilter + + """Filter by the Profile's permissionsListEmailSend field""" + permissionsListEmailSend: SalesforceBooleanFilter + + """Filter by the Profile's permissionsFeedPinning field""" + permissionsFeedPinning: SalesforceBooleanFilter + + """Filter by the Profile's permissionsChangeDashboardColors field""" + permissionsChangeDashboardColors: SalesforceBooleanFilter + + """Filter by the Profile's permissionsIotUser field""" + permissionsIotUser: SalesforceBooleanFilter + + """Filter by the Profile's permissionsUseWebLink field""" + permissionsUseWebLink: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewAllActivities field""" + permissionsViewAllActivities: SalesforceBooleanFilter + + """Filter by the Profile's permissionsSubscribeReportToOtherUsers field""" + permissionsSubscribeReportToOtherUsers: SalesforceBooleanFilter + + """ + Filter by the Profile's permissionsLightningConsoleAllowedForUser field + """ + permissionsLightningConsoleAllowedForUser: SalesforceBooleanFilter + + """Filter by the Profile's permissionsSubscribeReportsRunAsUser field""" + permissionsSubscribeReportsRunAsUser: SalesforceBooleanFilter + + """ + Filter by the Profile's permissionsSubscribeToLightningDashboards field + """ + permissionsSubscribeToLightningDashboards: SalesforceBooleanFilter + + """Filter by the Profile's permissionsApexRestServices field""" + permissionsApexRestServices: SalesforceBooleanFilter + + """Filter by the Profile's permissionsEnableCommunityAppLauncher field""" + permissionsEnableCommunityAppLauncher: SalesforceBooleanFilter + + """Filter by the Profile's permissionsManageSurveys field""" + permissionsManageSurveys: SalesforceBooleanFilter + + """Filter by the Profile's permissionsViewRoles field""" + permissionsViewRoles: SalesforceBooleanFilter + + """Filter by the Profile's userLicenseId field""" + userLicenseId: SalesforceIdFilter + + """Filter by the Profile's userType field""" + userType: SalesforceStringFilter + + """Filter by the Profile's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Profile's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Profile's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Profile's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Profile's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Profile's description field""" + description: SalesforceStringFilter + + """Filter by the Profile's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Profile's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Checks for any expressions in this list.""" + or: [SalesforceProfileConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceProfileConnectionFilter!] +} + +"""A filter to be used against custom fields of type `datetime`.""" +input SalesforceCustomFieldDateTimeFilter { + filter: SalesforceDateTimeFilter! + + """Name of the custom field, e.g. `CustomerPriority__c`""" + fieldName: String! +} + +"""A filter to be used against custom fields of type `date`.""" +input SalesforceCustomFieldDateFilter { + filter: SalesforceDateFilter! + + """Name of the custom field, e.g. `CustomerPriority__c`""" + fieldName: String! +} + +"""A filter to be used against custom fields of type `boolean`.""" +input SalesforceCustomFieldBooleanFilter { + filter: SalesforceBooleanFilter! + + """Name of the custom field, e.g. `CustomerPriority__c`""" + fieldName: String! +} + +"""A filter to be used against custom fields of type `string`.""" +input SalesforceCustomFieldStringFilter { + filter: SalesforceStringFilter! + + """Name of the custom field, e.g. `CustomerPriority__c`""" + fieldName: String! +} + +"""A filter to be used against custom fields of type `float`.""" +input SalesforceCustomFieldFloatFilter { + filter: SalesforceFloatFilter! + + """Name of the custom field, e.g. `CustomerPriority__c`""" + fieldName: String! +} + +"""A filter to be used against custom fields of type `int`.""" +input SalesforceCustomFieldIntFilter { + filter: SalesforceIntFilter! + + """Name of the custom field, e.g. `CustomerPriority__c`""" + fieldName: String! +} + +"""A filter to be used against custom fields.""" +input SalesforceCustomFieldFilter { + """Filter for custom field of type `datetime`.""" + dateTimeField: SalesforceCustomFieldDateTimeFilter + + """Filter for custom field of type `date`.""" + dateField: SalesforceCustomFieldDateFilter + + """Filter for custom field of type `boolean`.""" + booleanField: SalesforceCustomFieldBooleanFilter + + """Filter for custom field of type `string`.""" + stringField: SalesforceCustomFieldStringFilter + + """Filter for custom field of type `float`.""" + floatField: SalesforceCustomFieldFloatFilter + + """Filter for custom field of type `int`.""" + intField: SalesforceCustomFieldIntFilter +} + +""" +A filter to be used against DandBCompany object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceDandBCompanyConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the DandBCompany's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the DandBCompany's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the DandBCompany's id field""" + id: SalesforceIdFilter + + """Filter by the DandBCompany's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the DandBCompany's name field""" + name: SalesforceStringFilter + + """Filter by the DandBCompany's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the DandBCompany's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the DandBCompany's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the DandBCompany's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the DandBCompany's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the DandBCompany's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the DandBCompany's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the DandBCompany's dunsNumber field""" + dunsNumber: SalesforceStringFilter + + """Filter by the DandBCompany's street field""" + street: SalesforceStringFilter + + """Filter by the DandBCompany's city field""" + city: SalesforceStringFilter + + """Filter by the DandBCompany's state field""" + state: SalesforceStringFilter + + """Filter by the DandBCompany's postalCode field""" + postalCode: SalesforceStringFilter + + """Filter by the DandBCompany's country field""" + country: SalesforceStringFilter + + """Filter by the DandBCompany's geocodeAccuracyStandard field""" + geocodeAccuracyStandard: SalesforceStringFilter + + """Filter by the DandBCompany's phone field""" + phone: SalesforceStringFilter + + """Filter by the DandBCompany's fax field""" + fax: SalesforceStringFilter + + """Filter by the DandBCompany's countryAccessCode field""" + countryAccessCode: SalesforceStringFilter + + """Filter by the DandBCompany's publicIndicator field""" + publicIndicator: SalesforceStringFilter + + """Filter by the DandBCompany's stockSymbol field""" + stockSymbol: SalesforceStringFilter + + """Filter by the DandBCompany's stockExchange field""" + stockExchange: SalesforceStringFilter + + """Filter by the DandBCompany's salesVolume field""" + salesVolume: SalesforceFloatFilter + + """Filter by the DandBCompany's url field""" + url: SalesforceStringFilter + + """Filter by the DandBCompany's outOfBusiness field""" + outOfBusiness: SalesforceStringFilter + + """Filter by the DandBCompany's employeesTotal field""" + employeesTotal: SalesforceFloatFilter + + """Filter by the DandBCompany's fipsMsaCode field""" + fipsMsaCode: SalesforceStringFilter + + """Filter by the DandBCompany's fipsMsaDesc field""" + fipsMsaDesc: SalesforceStringFilter + + """Filter by the DandBCompany's tradeStyle1 field""" + tradeStyle1: SalesforceStringFilter + + """Filter by the DandBCompany's yearStarted field""" + yearStarted: SalesforceStringFilter + + """Filter by the DandBCompany's mailingStreet field""" + mailingStreet: SalesforceStringFilter + + """Filter by the DandBCompany's mailingCity field""" + mailingCity: SalesforceStringFilter + + """Filter by the DandBCompany's mailingState field""" + mailingState: SalesforceStringFilter + + """Filter by the DandBCompany's mailingPostalCode field""" + mailingPostalCode: SalesforceStringFilter + + """Filter by the DandBCompany's mailingCountry field""" + mailingCountry: SalesforceStringFilter + + """Filter by the DandBCompany's mailingGeocodeAccuracy field""" + mailingGeocodeAccuracy: SalesforceStringFilter + + """Filter by the DandBCompany's latitude field""" + latitude: SalesforceStringFilter + + """Filter by the DandBCompany's longitude field""" + longitude: SalesforceStringFilter + + """Filter by the DandBCompany's primarySic field""" + primarySic: SalesforceStringFilter + + """Filter by the DandBCompany's primarySicDesc field""" + primarySicDesc: SalesforceStringFilter + + """Filter by the DandBCompany's secondSic field""" + secondSic: SalesforceStringFilter + + """Filter by the DandBCompany's secondSicDesc field""" + secondSicDesc: SalesforceStringFilter + + """Filter by the DandBCompany's thirdSic field""" + thirdSic: SalesforceStringFilter + + """Filter by the DandBCompany's thirdSicDesc field""" + thirdSicDesc: SalesforceStringFilter + + """Filter by the DandBCompany's fourthSic field""" + fourthSic: SalesforceStringFilter + + """Filter by the DandBCompany's fourthSicDesc field""" + fourthSicDesc: SalesforceStringFilter + + """Filter by the DandBCompany's fifthSic field""" + fifthSic: SalesforceStringFilter + + """Filter by the DandBCompany's fifthSicDesc field""" + fifthSicDesc: SalesforceStringFilter + + """Filter by the DandBCompany's sixthSic field""" + sixthSic: SalesforceStringFilter + + """Filter by the DandBCompany's sixthSicDesc field""" + sixthSicDesc: SalesforceStringFilter + + """Filter by the DandBCompany's primaryNaics field""" + primaryNaics: SalesforceStringFilter + + """Filter by the DandBCompany's primaryNaicsDesc field""" + primaryNaicsDesc: SalesforceStringFilter + + """Filter by the DandBCompany's secondNaics field""" + secondNaics: SalesforceStringFilter + + """Filter by the DandBCompany's secondNaicsDesc field""" + secondNaicsDesc: SalesforceStringFilter + + """Filter by the DandBCompany's thirdNaics field""" + thirdNaics: SalesforceStringFilter + + """Filter by the DandBCompany's thirdNaicsDesc field""" + thirdNaicsDesc: SalesforceStringFilter + + """Filter by the DandBCompany's fourthNaics field""" + fourthNaics: SalesforceStringFilter + + """Filter by the DandBCompany's fourthNaicsDesc field""" + fourthNaicsDesc: SalesforceStringFilter + + """Filter by the DandBCompany's fifthNaics field""" + fifthNaics: SalesforceStringFilter + + """Filter by the DandBCompany's fifthNaicsDesc field""" + fifthNaicsDesc: SalesforceStringFilter + + """Filter by the DandBCompany's sixthNaics field""" + sixthNaics: SalesforceStringFilter + + """Filter by the DandBCompany's sixthNaicsDesc field""" + sixthNaicsDesc: SalesforceStringFilter + + """Filter by the DandBCompany's ownOrRent field""" + ownOrRent: SalesforceStringFilter + + """Filter by the DandBCompany's employeesHere field""" + employeesHere: SalesforceFloatFilter + + """Filter by the DandBCompany's employeesHereReliability field""" + employeesHereReliability: SalesforceStringFilter + + """Filter by the DandBCompany's salesVolumeReliability field""" + salesVolumeReliability: SalesforceStringFilter + + """Filter by the DandBCompany's currencyCode field""" + currencyCode: SalesforceStringFilter + + """Filter by the DandBCompany's legalStatus field""" + legalStatus: SalesforceStringFilter + + """Filter by the DandBCompany's globalUltimateTotalEmployees field""" + globalUltimateTotalEmployees: SalesforceFloatFilter + + """Filter by the DandBCompany's employeesTotalReliability field""" + employeesTotalReliability: SalesforceStringFilter + + """Filter by the DandBCompany's minorityOwned field""" + minorityOwned: SalesforceStringFilter + + """Filter by the DandBCompany's womenOwned field""" + womenOwned: SalesforceStringFilter + + """Filter by the DandBCompany's smallBusiness field""" + smallBusiness: SalesforceStringFilter + + """Filter by the DandBCompany's marketingSegmentationCluster field""" + marketingSegmentationCluster: SalesforceStringFilter + + """Filter by the DandBCompany's importExportAgent field""" + importExportAgent: SalesforceStringFilter + + """Filter by the DandBCompany's subsidiary field""" + subsidiary: SalesforceStringFilter + + """Filter by the DandBCompany's tradeStyle2 field""" + tradeStyle2: SalesforceStringFilter + + """Filter by the DandBCompany's tradeStyle3 field""" + tradeStyle3: SalesforceStringFilter + + """Filter by the DandBCompany's tradeStyle4 field""" + tradeStyle4: SalesforceStringFilter + + """Filter by the DandBCompany's tradeStyle5 field""" + tradeStyle5: SalesforceStringFilter + + """Filter by the DandBCompany's nationalId field""" + nationalId: SalesforceStringFilter + + """Filter by the DandBCompany's nationalIdType field""" + nationalIdType: SalesforceStringFilter + + """Filter by the DandBCompany's usTaxId field""" + usTaxId: SalesforceStringFilter + + """Filter by the DandBCompany's geoCodeAccuracy field""" + geoCodeAccuracy: SalesforceStringFilter + + """Filter by the DandBCompany's familyMembers field""" + familyMembers: SalesforceIntFilter + + """Filter by the DandBCompany's marketingPreScreen field""" + marketingPreScreen: SalesforceStringFilter + + """Filter by the DandBCompany's globalUltimateDunsNumber field""" + globalUltimateDunsNumber: SalesforceStringFilter + + """Filter by the DandBCompany's globalUltimateBusinessName field""" + globalUltimateBusinessName: SalesforceStringFilter + + """Filter by the DandBCompany's parentOrHqDunsNumber field""" + parentOrHqDunsNumber: SalesforceStringFilter + + """Filter by the DandBCompany's parentOrHqBusinessName field""" + parentOrHqBusinessName: SalesforceStringFilter + + """Filter by the DandBCompany's domesticUltimateDunsNumber field""" + domesticUltimateDunsNumber: SalesforceStringFilter + + """Filter by the DandBCompany's domesticUltimateBusinessName field""" + domesticUltimateBusinessName: SalesforceStringFilter + + """Filter by the DandBCompany's locationStatus field""" + locationStatus: SalesforceStringFilter + + """Filter by the DandBCompany's companyCurrencyIsoCode field""" + companyCurrencyIsoCode: SalesforceStringFilter + + """Filter by the DandBCompany's fortuneRank field""" + fortuneRank: SalesforceIntFilter + + """Filter by the DandBCompany's includedInSnP500 field""" + includedInSnP500: SalesforceStringFilter + + """Filter by the DandBCompany's premisesMeasure field""" + premisesMeasure: SalesforceIntFilter + + """Filter by the DandBCompany's premisesMeasureReliability field""" + premisesMeasureReliability: SalesforceStringFilter + + """Filter by the DandBCompany's premisesMeasureUnit field""" + premisesMeasureUnit: SalesforceStringFilter + + """Filter by the DandBCompany's employeeQuantityGrowthRate field""" + employeeQuantityGrowthRate: SalesforceFloatFilter + + """Filter by the DandBCompany's salesTurnoverGrowthRate field""" + salesTurnoverGrowthRate: SalesforceFloatFilter + + """Filter by the DandBCompany's primarySic8 field""" + primarySic8: SalesforceStringFilter + + """Filter by the DandBCompany's primarySic8Desc field""" + primarySic8Desc: SalesforceStringFilter + + """Filter by the DandBCompany's secondSic8 field""" + secondSic8: SalesforceStringFilter + + """Filter by the DandBCompany's secondSic8Desc field""" + secondSic8Desc: SalesforceStringFilter + + """Filter by the DandBCompany's thirdSic8 field""" + thirdSic8: SalesforceStringFilter + + """Filter by the DandBCompany's thirdSic8Desc field""" + thirdSic8Desc: SalesforceStringFilter + + """Filter by the DandBCompany's fourthSic8 field""" + fourthSic8: SalesforceStringFilter + + """Filter by the DandBCompany's fourthSic8Desc field""" + fourthSic8Desc: SalesforceStringFilter + + """Filter by the DandBCompany's fifthSic8 field""" + fifthSic8: SalesforceStringFilter + + """Filter by the DandBCompany's fifthSic8Desc field""" + fifthSic8Desc: SalesforceStringFilter + + """Filter by the DandBCompany's sixthSic8 field""" + sixthSic8: SalesforceStringFilter + + """Filter by the DandBCompany's sixthSic8Desc field""" + sixthSic8Desc: SalesforceStringFilter + + """Filter by the DandBCompany's priorYearEmployees field""" + priorYearEmployees: SalesforceIntFilter + + """Filter by the DandBCompany's priorYearRevenue field""" + priorYearRevenue: SalesforceFloatFilter + + """Checks for any expressions in this list.""" + or: [SalesforceDandBCompanyConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceDandBCompanyConnectionFilter!] +} + +""" +A filter to be used against Account object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceAccountConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the Account's dandbCompany relation.""" + dandbCompany: SalesforceDandBCompanyConnectionFilter + + """Filter by the Account's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the Account's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the Account's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the Account's parent relation.""" + parent: SalesforceAccountConnectionFilter + + """Filter by the Account's masterRecord relation.""" + masterRecord: SalesforceAccountConnectionFilter + + """Filter by the Account's id field""" + id: SalesforceIdFilter + + """Filter by the Account's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the Account's masterRecordId field""" + masterRecordId: SalesforceIdFilter + + """Filter by the Account's name field""" + name: SalesforceStringFilter + + """Filter by the Account's type field""" + type: SalesforceStringFilter + + """Filter by the Account's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the Account's billingStreet field""" + billingStreet: SalesforceStringFilter + + """Filter by the Account's billingCity field""" + billingCity: SalesforceStringFilter + + """Filter by the Account's billingState field""" + billingState: SalesforceStringFilter + + """Filter by the Account's billingPostalCode field""" + billingPostalCode: SalesforceStringFilter + + """Filter by the Account's billingCountry field""" + billingCountry: SalesforceStringFilter + + """Filter by the Account's billingLatitude field""" + billingLatitude: SalesforceFloatFilter + + """Filter by the Account's billingLongitude field""" + billingLongitude: SalesforceFloatFilter + + """Filter by the Account's billingGeocodeAccuracy field""" + billingGeocodeAccuracy: SalesforceStringFilter + + """Filter by the Account's shippingStreet field""" + shippingStreet: SalesforceStringFilter + + """Filter by the Account's shippingCity field""" + shippingCity: SalesforceStringFilter + + """Filter by the Account's shippingState field""" + shippingState: SalesforceStringFilter + + """Filter by the Account's shippingPostalCode field""" + shippingPostalCode: SalesforceStringFilter + + """Filter by the Account's shippingCountry field""" + shippingCountry: SalesforceStringFilter + + """Filter by the Account's shippingLatitude field""" + shippingLatitude: SalesforceFloatFilter + + """Filter by the Account's shippingLongitude field""" + shippingLongitude: SalesforceFloatFilter + + """Filter by the Account's shippingGeocodeAccuracy field""" + shippingGeocodeAccuracy: SalesforceStringFilter + + """Filter by the Account's phone field""" + phone: SalesforceStringFilter + + """Filter by the Account's fax field""" + fax: SalesforceStringFilter + + """Filter by the Account's accountNumber field""" + accountNumber: SalesforceStringFilter + + """Filter by the Account's website field""" + website: SalesforceStringFilter + + """Filter by the Account's photoUrl field""" + photoUrl: SalesforceStringFilter + + """Filter by the Account's sic field""" + sic: SalesforceStringFilter + + """Filter by the Account's industry field""" + industry: SalesforceStringFilter + + """Filter by the Account's annualRevenue field""" + annualRevenue: SalesforceFloatFilter + + """Filter by the Account's numberOfEmployees field""" + numberOfEmployees: SalesforceIntFilter + + """Filter by the Account's ownership field""" + ownership: SalesforceStringFilter + + """Filter by the Account's tickerSymbol field""" + tickerSymbol: SalesforceStringFilter + + """Filter by the Account's rating field""" + rating: SalesforceStringFilter + + """Filter by the Account's site field""" + site: SalesforceStringFilter + + """Filter by the Account's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the Account's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the Account's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the Account's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the Account's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the Account's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the Account's lastActivityDate field""" + lastActivityDate: SalesforceDateFilter + + """Filter by the Account's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the Account's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the Account's jigsaw field""" + jigsaw: SalesforceStringFilter + + """Filter by the Account's jigsawCompanyId field""" + jigsawCompanyId: SalesforceStringFilter + + """Filter by the Account's cleanStatus field""" + cleanStatus: SalesforceStringFilter + + """Filter by the Account's accountSource field""" + accountSource: SalesforceStringFilter + + """Filter by the Account's dunsNumber field""" + dunsNumber: SalesforceStringFilter + + """Filter by the Account's tradestyle field""" + tradestyle: SalesforceStringFilter + + """Filter by the Account's naicsCode field""" + naicsCode: SalesforceStringFilter + + """Filter by the Account's naicsDesc field""" + naicsDesc: SalesforceStringFilter + + """Filter by the Account's yearStarted field""" + yearStarted: SalesforceStringFilter + + """Filter by the Account's sicDesc field""" + sicDesc: SalesforceStringFilter + + """Filter by the Account's dandbCompanyId field""" + dandbCompanyId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceAccountConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceAccountConnectionFilter!] +} + +""" +A filter to be used against UserRole object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserRoleConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the UserRole's portalAccountOwner relation.""" + portalAccountOwner: SalesforceUserConnectionFilter + + """Filter by the UserRole's portalAccount relation.""" + portalAccount: SalesforceAccountConnectionFilter + + """Filter by the UserRole's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the UserRole's forecastUser relation.""" + forecastUser: SalesforceUserConnectionFilter + + """Filter by the UserRole's parentRole relation.""" + parentRole: SalesforceUserRoleConnectionFilter + + """Filter by the UserRole's id field""" + id: SalesforceIdFilter + + """Filter by the UserRole's name field""" + name: SalesforceStringFilter + + """Filter by the UserRole's parentRoleId field""" + parentRoleId: SalesforceIdFilter + + """Filter by the UserRole's rollupDescription field""" + rollupDescription: SalesforceStringFilter + + """Filter by the UserRole's opportunityAccessForAccountOwner field""" + opportunityAccessForAccountOwner: SalesforceStringFilter + + """Filter by the UserRole's caseAccessForAccountOwner field""" + caseAccessForAccountOwner: SalesforceStringFilter + + """Filter by the UserRole's contactAccessForAccountOwner field""" + contactAccessForAccountOwner: SalesforceStringFilter + + """Filter by the UserRole's forecastUserId field""" + forecastUserId: SalesforceIdFilter + + """Filter by the UserRole's mayForecastManagerShare field""" + mayForecastManagerShare: SalesforceBooleanFilter + + """Filter by the UserRole's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the UserRole's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the UserRole's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the UserRole's developerName field""" + developerName: SalesforceStringFilter + + """Filter by the UserRole's portalAccountId field""" + portalAccountId: SalesforceIdFilter + + """Filter by the UserRole's portalType field""" + portalType: SalesforceStringFilter + + """Filter by the UserRole's portalAccountOwnerId field""" + portalAccountOwnerId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserRoleConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserRoleConnectionFilter!] +} + +""" +A filter to be used against float fields. All fields are combined with a logical `and`. +""" +input SalesforceFloatFilter { + """Not included in the specified list.""" + notIn: [Float!] + + """Included in the specified list.""" + in: [Float!] + + """Less than or equal to the specified value""" + lessThanOrEqualTo: Float + + """Less than the specified value""" + lessThan: Float + + """Greater than or equal to the specified value""" + greaterThanOrEqualTo: Float + + """Greater than the specified value""" + greaterThan: Float + + """Is null (if true is specified) or is not null (if false is specified).""" + isNull: Boolean + + """Not equal to the specified value.""" + notEqualTo: Float + + """Equal to the specified value.""" + equalTo: Float +} + +""" +A filter to be used against User object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceUserConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the User's callCenter relation.""" + callCenter: SalesforceCallCenterConnectionFilter + + """Filter by the User's account relation.""" + account: SalesforceAccountConnectionFilter + + """Filter by the User's contact relation.""" + contact: SalesforceContactConnectionFilter + + """Filter by the User's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the User's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the User's manager relation.""" + manager: SalesforceUserConnectionFilter + + """Filter by the User's profile relation.""" + profile: SalesforceProfileConnectionFilter + + """Filter by the User's userRole relation.""" + userRole: SalesforceUserRoleConnectionFilter + + """Filter by the User's id field""" + id: SalesforceIdFilter + + """Filter by the User's username field""" + username: SalesforceStringFilter + + """Filter by the User's lastName field""" + lastName: SalesforceStringFilter + + """Filter by the User's firstName field""" + firstName: SalesforceStringFilter + + """Filter by the User's name field""" + name: SalesforceStringFilter + + """Filter by the User's companyName field""" + companyName: SalesforceStringFilter + + """Filter by the User's division field""" + division: SalesforceStringFilter + + """Filter by the User's department field""" + department: SalesforceStringFilter + + """Filter by the User's title field""" + title: SalesforceStringFilter + + """Filter by the User's street field""" + street: SalesforceStringFilter + + """Filter by the User's city field""" + city: SalesforceStringFilter + + """Filter by the User's state field""" + state: SalesforceStringFilter + + """Filter by the User's postalCode field""" + postalCode: SalesforceStringFilter + + """Filter by the User's country field""" + country: SalesforceStringFilter + + """Filter by the User's latitude field""" + latitude: SalesforceFloatFilter + + """Filter by the User's longitude field""" + longitude: SalesforceFloatFilter + + """Filter by the User's geocodeAccuracy field""" + geocodeAccuracy: SalesforceStringFilter + + """Filter by the User's email field""" + email: SalesforceStringFilter + + """Filter by the User's emailPreferencesAutoBcc field""" + emailPreferencesAutoBcc: SalesforceBooleanFilter + + """Filter by the User's emailPreferencesAutoBccStayInTouch field""" + emailPreferencesAutoBccStayInTouch: SalesforceBooleanFilter + + """Filter by the User's emailPreferencesStayInTouchReminder field""" + emailPreferencesStayInTouchReminder: SalesforceBooleanFilter + + """Filter by the User's senderEmail field""" + senderEmail: SalesforceStringFilter + + """Filter by the User's senderName field""" + senderName: SalesforceStringFilter + + """Filter by the User's signature field""" + signature: SalesforceStringFilter + + """Filter by the User's stayInTouchSubject field""" + stayInTouchSubject: SalesforceStringFilter + + """Filter by the User's stayInTouchSignature field""" + stayInTouchSignature: SalesforceStringFilter + + """Filter by the User's stayInTouchNote field""" + stayInTouchNote: SalesforceStringFilter + + """Filter by the User's phone field""" + phone: SalesforceStringFilter + + """Filter by the User's fax field""" + fax: SalesforceStringFilter + + """Filter by the User's mobilePhone field""" + mobilePhone: SalesforceStringFilter + + """Filter by the User's alias field""" + alias: SalesforceStringFilter + + """Filter by the User's communityNickname field""" + communityNickname: SalesforceStringFilter + + """Filter by the User's badgeText field""" + badgeText: SalesforceStringFilter + + """Filter by the User's isActive field""" + isActive: SalesforceBooleanFilter + + """Filter by the User's timeZoneSidKey field""" + timeZoneSidKey: SalesforceStringFilter + + """Filter by the User's userRoleId field""" + userRoleId: SalesforceIdFilter + + """Filter by the User's localeSidKey field""" + localeSidKey: SalesforceStringFilter + + """Filter by the User's receivesInfoEmails field""" + receivesInfoEmails: SalesforceBooleanFilter + + """Filter by the User's receivesAdminInfoEmails field""" + receivesAdminInfoEmails: SalesforceBooleanFilter + + """Filter by the User's emailEncodingKey field""" + emailEncodingKey: SalesforceStringFilter + + """Filter by the User's profileId field""" + profileId: SalesforceIdFilter + + """Filter by the User's userType field""" + userType: SalesforceStringFilter + + """Filter by the User's languageLocaleKey field""" + languageLocaleKey: SalesforceStringFilter + + """Filter by the User's employeeNumber field""" + employeeNumber: SalesforceStringFilter + + """Filter by the User's delegatedApproverId field""" + delegatedApproverId: SalesforceIdFilter + + """Filter by the User's managerId field""" + managerId: SalesforceIdFilter + + """Filter by the User's lastLoginDate field""" + lastLoginDate: SalesforceDateTimeFilter + + """Filter by the User's lastPasswordChangeDate field""" + lastPasswordChangeDate: SalesforceDateTimeFilter + + """Filter by the User's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the User's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the User's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the User's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the User's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the User's offlineTrialExpirationDate field""" + offlineTrialExpirationDate: SalesforceDateTimeFilter + + """Filter by the User's offlinePdaTrialExpirationDate field""" + offlinePdaTrialExpirationDate: SalesforceDateTimeFilter + + """Filter by the User's userPermissionsMarketingUser field""" + userPermissionsMarketingUser: SalesforceBooleanFilter + + """Filter by the User's userPermissionsOfflineUser field""" + userPermissionsOfflineUser: SalesforceBooleanFilter + + """Filter by the User's userPermissionsCallCenterAutoLogin field""" + userPermissionsCallCenterAutoLogin: SalesforceBooleanFilter + + """Filter by the User's userPermissionsMobileUser field""" + userPermissionsMobileUser: SalesforceBooleanFilter + + """Filter by the User's userPermissionsSfContentUser field""" + userPermissionsSfContentUser: SalesforceBooleanFilter + + """Filter by the User's userPermissionsKnowledgeUser field""" + userPermissionsKnowledgeUser: SalesforceBooleanFilter + + """Filter by the User's userPermissionsInteractionUser field""" + userPermissionsInteractionUser: SalesforceBooleanFilter + + """Filter by the User's userPermissionsSupportUser field""" + userPermissionsSupportUser: SalesforceBooleanFilter + + """Filter by the User's userPermissionsJigsawProspectingUser field""" + userPermissionsJigsawProspectingUser: SalesforceBooleanFilter + + """Filter by the User's userPermissionsSiteforceContributorUser field""" + userPermissionsSiteforceContributorUser: SalesforceBooleanFilter + + """Filter by the User's userPermissionsSiteforcePublisherUser field""" + userPermissionsSiteforcePublisherUser: SalesforceBooleanFilter + + """Filter by the User's userPermissionsWorkDotComUserFeature field""" + userPermissionsWorkDotComUserFeature: SalesforceBooleanFilter + + """Filter by the User's forecastEnabled field""" + forecastEnabled: SalesforceBooleanFilter + + """Filter by the User's userPreferencesActivityRemindersPopup field""" + userPreferencesActivityRemindersPopup: SalesforceBooleanFilter + + """ + Filter by the User's userPreferencesEventRemindersCheckboxDefault field + """ + userPreferencesEventRemindersCheckboxDefault: SalesforceBooleanFilter + + """Filter by the User's userPreferencesTaskRemindersCheckboxDefault field""" + userPreferencesTaskRemindersCheckboxDefault: SalesforceBooleanFilter + + """Filter by the User's userPreferencesReminderSoundOff field""" + userPreferencesReminderSoundOff: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableAllFeedsEmail field""" + userPreferencesDisableAllFeedsEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableFollowersEmail field""" + userPreferencesDisableFollowersEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableProfilePostEmail field""" + userPreferencesDisableProfilePostEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableChangeCommentEmail field""" + userPreferencesDisableChangeCommentEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableLaterCommentEmail field""" + userPreferencesDisableLaterCommentEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisProfPostCommentEmail field""" + userPreferencesDisProfPostCommentEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesContentNoEmail field""" + userPreferencesContentNoEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesContentEmailAsAndWhen field""" + userPreferencesContentEmailAsAndWhen: SalesforceBooleanFilter + + """Filter by the User's userPreferencesApexPagesDeveloperMode field""" + userPreferencesApexPagesDeveloperMode: SalesforceBooleanFilter + + """Filter by the User's userPreferencesHideCsnGetChatterMobileTask field""" + userPreferencesHideCsnGetChatterMobileTask: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableMentionsPostEmail field""" + userPreferencesDisableMentionsPostEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisMentionsCommentEmail field""" + userPreferencesDisMentionsCommentEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesHideCsnDesktopTask field""" + userPreferencesHideCsnDesktopTask: SalesforceBooleanFilter + + """Filter by the User's userPreferencesHideChatterOnboardingSplash field""" + userPreferencesHideChatterOnboardingSplash: SalesforceBooleanFilter + + """ + Filter by the User's userPreferencesHideSecondChatterOnboardingSplash field + """ + userPreferencesHideSecondChatterOnboardingSplash: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisCommentAfterLikeEmail field""" + userPreferencesDisCommentAfterLikeEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableLikeEmail field""" + userPreferencesDisableLikeEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesSortFeedByComment field""" + userPreferencesSortFeedByComment: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableMessageEmail field""" + userPreferencesDisableMessageEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesJigsawListUser field""" + userPreferencesJigsawListUser: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableBookmarkEmail field""" + userPreferencesDisableBookmarkEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableSharePostEmail field""" + userPreferencesDisableSharePostEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesEnableAutoSubForFeeds field""" + userPreferencesEnableAutoSubForFeeds: SalesforceBooleanFilter + + """ + Filter by the User's userPreferencesDisableFileShareNotificationsForApi field + """ + userPreferencesDisableFileShareNotificationsForApi: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowTitleToExternalUsers field""" + userPreferencesShowTitleToExternalUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowManagerToExternalUsers field""" + userPreferencesShowManagerToExternalUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowEmailToExternalUsers field""" + userPreferencesShowEmailToExternalUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowWorkPhoneToExternalUsers field""" + userPreferencesShowWorkPhoneToExternalUsers: SalesforceBooleanFilter + + """ + Filter by the User's userPreferencesShowMobilePhoneToExternalUsers field + """ + userPreferencesShowMobilePhoneToExternalUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowFaxToExternalUsers field""" + userPreferencesShowFaxToExternalUsers: SalesforceBooleanFilter + + """ + Filter by the User's userPreferencesShowStreetAddressToExternalUsers field + """ + userPreferencesShowStreetAddressToExternalUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowCityToExternalUsers field""" + userPreferencesShowCityToExternalUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowStateToExternalUsers field""" + userPreferencesShowStateToExternalUsers: SalesforceBooleanFilter + + """ + Filter by the User's userPreferencesShowPostalCodeToExternalUsers field + """ + userPreferencesShowPostalCodeToExternalUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowCountryToExternalUsers field""" + userPreferencesShowCountryToExternalUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowProfilePicToGuestUsers field""" + userPreferencesShowProfilePicToGuestUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowTitleToGuestUsers field""" + userPreferencesShowTitleToGuestUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowCityToGuestUsers field""" + userPreferencesShowCityToGuestUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowStateToGuestUsers field""" + userPreferencesShowStateToGuestUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowPostalCodeToGuestUsers field""" + userPreferencesShowPostalCodeToGuestUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowCountryToGuestUsers field""" + userPreferencesShowCountryToGuestUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableFeedbackEmail field""" + userPreferencesDisableFeedbackEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableWorkEmail field""" + userPreferencesDisableWorkEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesHideS1BrowserUi field""" + userPreferencesHideS1BrowserUi: SalesforceBooleanFilter + + """Filter by the User's userPreferencesDisableEndorsementEmail field""" + userPreferencesDisableEndorsementEmail: SalesforceBooleanFilter + + """Filter by the User's userPreferencesPathAssistantCollapsed field""" + userPreferencesPathAssistantCollapsed: SalesforceBooleanFilter + + """Filter by the User's userPreferencesCacheDiagnostics field""" + userPreferencesCacheDiagnostics: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowEmailToGuestUsers field""" + userPreferencesShowEmailToGuestUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowManagerToGuestUsers field""" + userPreferencesShowManagerToGuestUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowWorkPhoneToGuestUsers field""" + userPreferencesShowWorkPhoneToGuestUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowMobilePhoneToGuestUsers field""" + userPreferencesShowMobilePhoneToGuestUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesShowFaxToGuestUsers field""" + userPreferencesShowFaxToGuestUsers: SalesforceBooleanFilter + + """ + Filter by the User's userPreferencesShowStreetAddressToGuestUsers field + """ + userPreferencesShowStreetAddressToGuestUsers: SalesforceBooleanFilter + + """Filter by the User's userPreferencesLightningExperiencePreferred field""" + userPreferencesLightningExperiencePreferred: SalesforceBooleanFilter + + """Filter by the User's userPreferencesPreviewLightning field""" + userPreferencesPreviewLightning: SalesforceBooleanFilter + + """ + Filter by the User's userPreferencesHideEndUserOnboardingAssistantModal field + """ + userPreferencesHideEndUserOnboardingAssistantModal: SalesforceBooleanFilter + + """Filter by the User's userPreferencesHideLightningMigrationModal field""" + userPreferencesHideLightningMigrationModal: SalesforceBooleanFilter + + """Filter by the User's userPreferencesHideSfxWelcomeMat field""" + userPreferencesHideSfxWelcomeMat: SalesforceBooleanFilter + + """Filter by the User's userPreferencesHideBiggerPhotoCallout field""" + userPreferencesHideBiggerPhotoCallout: SalesforceBooleanFilter + + """Filter by the User's userPreferencesGlobalNavBarWtShown field""" + userPreferencesGlobalNavBarWtShown: SalesforceBooleanFilter + + """Filter by the User's userPreferencesGlobalNavGridMenuWtShown field""" + userPreferencesGlobalNavGridMenuWtShown: SalesforceBooleanFilter + + """Filter by the User's userPreferencesCreateLexAppsWtShown field""" + userPreferencesCreateLexAppsWtShown: SalesforceBooleanFilter + + """Filter by the User's userPreferencesFavoritesWtShown field""" + userPreferencesFavoritesWtShown: SalesforceBooleanFilter + + """ + Filter by the User's userPreferencesRecordHomeSectionCollapseWtShown field + """ + userPreferencesRecordHomeSectionCollapseWtShown: SalesforceBooleanFilter + + """Filter by the User's userPreferencesRecordHomeReservedWtShown field""" + userPreferencesRecordHomeReservedWtShown: SalesforceBooleanFilter + + """Filter by the User's userPreferencesFavoritesShowTopFavorites field""" + userPreferencesFavoritesShowTopFavorites: SalesforceBooleanFilter + + """Filter by the User's userPreferencesExcludeMailAppAttachments field""" + userPreferencesExcludeMailAppAttachments: SalesforceBooleanFilter + + """Filter by the User's userPreferencesSuppressTaskSfxReminders field""" + userPreferencesSuppressTaskSfxReminders: SalesforceBooleanFilter + + """Filter by the User's userPreferencesSuppressEventSfxReminders field""" + userPreferencesSuppressEventSfxReminders: SalesforceBooleanFilter + + """Filter by the User's userPreferencesPreviewCustomTheme field""" + userPreferencesPreviewCustomTheme: SalesforceBooleanFilter + + """Filter by the User's userPreferencesHasCelebrationBadge field""" + userPreferencesHasCelebrationBadge: SalesforceBooleanFilter + + """Filter by the User's contactId field""" + contactId: SalesforceIdFilter + + """Filter by the User's accountId field""" + accountId: SalesforceIdFilter + + """Filter by the User's callCenterId field""" + callCenterId: SalesforceIdFilter + + """Filter by the User's extension field""" + extension: SalesforceStringFilter + + """Filter by the User's federationIdentifier field""" + federationIdentifier: SalesforceStringFilter + + """Filter by the User's aboutMe field""" + aboutMe: SalesforceStringFilter + + """Filter by the User's fullPhotoUrl field""" + fullPhotoUrl: SalesforceStringFilter + + """Filter by the User's smallPhotoUrl field""" + smallPhotoUrl: SalesforceStringFilter + + """Filter by the User's isExtIndicatorVisible field""" + isExtIndicatorVisible: SalesforceBooleanFilter + + """Filter by the User's outOfOfficeMessage field""" + outOfOfficeMessage: SalesforceStringFilter + + """Filter by the User's mediumPhotoUrl field""" + mediumPhotoUrl: SalesforceStringFilter + + """Filter by the User's digestFrequency field""" + digestFrequency: SalesforceStringFilter + + """Filter by the User's defaultGroupNotificationFrequency field""" + defaultGroupNotificationFrequency: SalesforceStringFilter + + """Filter by the User's jigsawImportLimitOverride field""" + jigsawImportLimitOverride: SalesforceIntFilter + + """Filter by the User's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the User's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the User's bannerPhotoUrl field""" + bannerPhotoUrl: SalesforceStringFilter + + """Filter by the User's smallBannerPhotoUrl field""" + smallBannerPhotoUrl: SalesforceStringFilter + + """Filter by the User's mediumBannerPhotoUrl field""" + mediumBannerPhotoUrl: SalesforceStringFilter + + """Filter by the User's isProfilePhotoActive field""" + isProfilePhotoActive: SalesforceBooleanFilter + + """Checks for any expressions in this list.""" + or: [SalesforceUserConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceUserConnectionFilter!] +} + +""" +A filter to be used against date fields. All fields are combined with a logical `and`. Accepts dates in UTC with format 06/22/1971. +""" +input SalesforceDateFilter { + """ + Not included in the specified list. Accepts dates in UTC with format 06/22/1971. + """ + notIn: [String!] + + """ + Included in the specified list. Accepts dates in UTC with format 06/22/1971. + """ + in: [String!] + + """ + Less than or equal to the specified value. Accepts dates in UTC with format 06/22/1971. + """ + lessThanOrEqualTo: String + + """ + Less than the specified value. Accepts dates in UTC with format 06/22/1971. + """ + lessThan: String + + """ + Greater than or equal to the specified value. Accepts dates in UTC with format 06/22/1971. + """ + greaterThanOrEqualTo: String + + """ + Greater than the specified value. Accepts dates in UTC with format 06/22/1971. + """ + greaterThan: String + + """Is null (if true is specified) or is not null (if false is specified).""" + isNull: Boolean + + """ + Not equal to the specified value. Accepts dates in UTC with format 06/22/1971. + """ + notEqualTo: String + + """ + Equal to the specified value. Accepts dates in UTC with format 06/22/1971. + """ + equalTo: String +} + +""" +A filter to be used against int fields. All fields are combined with a logical `and`. +""" +input SalesforceIntFilter { + """Not included in the specified list.""" + notIn: [Int!] + + """Included in the specified list.""" + in: [Int!] + + """Less than or equal to the specified value""" + lessThanOrEqualTo: Int + + """Less than the specified value""" + lessThan: Int + + """Greater than or equal to the specified value""" + greaterThanOrEqualTo: Int + + """Greater than the specified value""" + greaterThan: Int + + """Is null (if true is specified) or is not null (if false is specified).""" + isNull: Boolean + + """Not equal to the specified value.""" + notEqualTo: Int + + """Equal to the specified value.""" + equalTo: Int +} + +""" +A filter to be used against ContentDocument object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentDocumentConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentDocument's contentAsset relation.""" + contentAsset: SalesforceContentAssetConnectionFilter + + """Filter by the ContentDocument's parent relation.""" + parent: SalesforceContentWorkspaceConnectionFilter + + """Filter by the ContentDocument's latestPublishedVersion relation.""" + latestPublishedVersion: SalesforceContentVersionConnectionFilter + + """Filter by the ContentDocument's owner relation.""" + owner: SalesforceUserConnectionFilter + + """Filter by the ContentDocument's archivedBy relation.""" + archivedBy: SalesforceUserConnectionFilter + + """Filter by the ContentDocument's lastModifiedBy relation.""" + lastModifiedBy: SalesforceUserConnectionFilter + + """Filter by the ContentDocument's createdBy relation.""" + createdBy: SalesforceUserConnectionFilter + + """Filter by the ContentDocument's id field""" + id: SalesforceIdFilter + + """Filter by the ContentDocument's createdById field""" + createdById: SalesforceIdFilter + + """Filter by the ContentDocument's createdDate field""" + createdDate: SalesforceDateTimeFilter + + """Filter by the ContentDocument's lastModifiedById field""" + lastModifiedById: SalesforceIdFilter + + """Filter by the ContentDocument's lastModifiedDate field""" + lastModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContentDocument's isArchived field""" + isArchived: SalesforceBooleanFilter + + """Filter by the ContentDocument's archivedById field""" + archivedById: SalesforceIdFilter + + """Filter by the ContentDocument's archivedDate field""" + archivedDate: SalesforceDateFilter + + """Filter by the ContentDocument's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentDocument's ownerId field""" + ownerId: SalesforceIdFilter + + """Filter by the ContentDocument's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentDocument's title field""" + title: SalesforceStringFilter + + """Filter by the ContentDocument's publishStatus field""" + publishStatus: SalesforceStringFilter + + """Filter by the ContentDocument's latestPublishedVersionId field""" + latestPublishedVersionId: SalesforceIdFilter + + """Filter by the ContentDocument's parentId field""" + parentId: SalesforceIdFilter + + """Filter by the ContentDocument's lastViewedDate field""" + lastViewedDate: SalesforceDateTimeFilter + + """Filter by the ContentDocument's lastReferencedDate field""" + lastReferencedDate: SalesforceDateTimeFilter + + """Filter by the ContentDocument's description field""" + description: SalesforceStringFilter + + """Filter by the ContentDocument's contentSize field""" + contentSize: SalesforceIntFilter + + """Filter by the ContentDocument's fileType field""" + fileType: SalesforceStringFilter + + """Filter by the ContentDocument's fileExtension field""" + fileExtension: SalesforceStringFilter + + """Filter by the ContentDocument's sharingOption field""" + sharingOption: SalesforceStringFilter + + """Filter by the ContentDocument's sharingPrivacy field""" + sharingPrivacy: SalesforceStringFilter + + """Filter by the ContentDocument's contentModifiedDate field""" + contentModifiedDate: SalesforceDateTimeFilter + + """Filter by the ContentDocument's contentAssetId field""" + contentAssetId: SalesforceIdFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentDocumentConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentDocumentConnectionFilter!] +} + +""" +A filter to be used against Id fields. All fields are combined with a logical `and`. +""" +input SalesforceIdFilter { + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Less than or equal to the specified value""" + lessThanOrEqualTo: String + + """Less than the specified value""" + lessThan: String + + """Greater than or equal to the specified value""" + greaterThanOrEqualTo: String + + """Greater than the specified value""" + greaterThan: String + + """Is null (if true is specified) or is not null (if false is specified).""" + isNull: Boolean + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String +} + +""" +A filter to be used against boolean fields. All fields are combined with a logical `and`. +""" +input SalesforceBooleanFilter { + """Is null (if true is specified) or is not null (if false is specified).""" + isNull: Boolean + + """Not equal to the specified value.""" + notEqualTo: Boolean + + """Equal to the specified value.""" + equalTo: Boolean +} + +""" +A filter to be used against date time fields. All fields are combined with a logical `and`. Accepts dates in UTC with format `06/22/1971 14:55:28` +""" +input SalesforceDateTimeFilter { + """ + Not included in the specified list. Accepts dates in UTC with format `06/22/1971 14:55:28` + """ + notIn: [String!] + + """ + Included in the specified list. Accepts dates in UTC with format `06/22/1971 14:55:28` + """ + in: [String!] + + """ + Less than or equal to the specified value. Accepts dates in UTC with format `06/22/1971 14:55:28` + """ + lessThanOrEqualTo: String + + """ + Less than the specified value. Accepts dates in UTC with format `06/22/1971 14:55:28` + """ + lessThan: String + + """ + Greater than or equal to the specified value. Accepts dates in UTC with format `06/22/1971 14:55:28` + """ + greaterThanOrEqualTo: String + + """ + Greater than the specified value. Accepts dates in UTC with format `06/22/1971 14:55:28` + """ + greaterThan: String + + """Is null (if true is specified) or is not null (if false is specified).""" + isNull: Boolean + + """Not equal to the specified value.""" + notEqualTo: String + + """ + Equal to the specified value. Accepts dates in UTC with format `06/22/1971 14:55:28` + """ + equalTo: String +} + +""" +A filter to be used against string fields. All fields are combined with a logical `and`. +""" +input SalesforceStringFilter { + """Not included in the specified list.""" + notIn: [String!] + + """Included in the specified list.""" + in: [String!] + + """Less than or equal to the specified value""" + lessThanOrEqualTo: String + + """Less than the specified value""" + lessThan: String + + """Greater than or equal to the specified value""" + greaterThanOrEqualTo: String + + """Greater than the specified value""" + greaterThan: String + + """ + Matches the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + like: String + + """Is null (if true is specified) or is not null (if false is specified).""" + isNull: Boolean + + """Not equal to the specified value.""" + notEqualTo: String + + """Equal to the specified value.""" + equalTo: String +} + +""" +A filter to be used against ContentDocumentLink object types. All fields are combined with a logical ‘and.’ +""" +input SalesforceContentDocumentLinkConnectionFilter { + """Filter against custom fields.""" + customField: SalesforceCustomFieldFilter + + """Filter by the ContentDocumentLink's contentDocument relation.""" + contentDocument: SalesforceContentDocumentConnectionFilter + + """Filter by the ContentDocumentLink's id field""" + id: SalesforceIdFilter + + """Filter by the ContentDocumentLink's linkedEntityId field""" + linkedEntityId: SalesforceIdFilter + + """Filter by the ContentDocumentLink's contentDocumentId field""" + contentDocumentId: SalesforceIdFilter + + """Filter by the ContentDocumentLink's isDeleted field""" + isDeleted: SalesforceBooleanFilter + + """Filter by the ContentDocumentLink's systemModstamp field""" + systemModstamp: SalesforceDateTimeFilter + + """Filter by the ContentDocumentLink's shareType field""" + shareType: SalesforceStringFilter + + """Filter by the ContentDocumentLink's visibility field""" + visibility: SalesforceStringFilter + + """Checks for any expressions in this list.""" + or: [SalesforceContentDocumentLinkConnectionFilter!] + + """Checks for all expressions in this list.""" + and: [SalesforceContentDocumentLinkConnectionFilter!] +} + +"""Field that Content Document Links can be sorted by""" +enum SalesforceContentDocumentLinkSortByFieldEnum { + ID + LINKED_ENTITY_ID + CONTENT_DOCUMENT_ID + IS_DELETED + SYSTEM_MODSTAMP + SHARE_TYPE + VISIBILITY +} + +"""Order that items should be sorted""" +enum SalesforceSortOrderBy { + ASC + DESC +} + +"""Topic""" +type SalesforceTopic implements OneGraphNode { + """Topic ID""" + id: String! + + """Name""" + name: String! + + """Description""" + description: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Talking About""" + talkingAbout: Int! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce CustomBrand""" + customBrands( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomBrandConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomBrandSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomBrandSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CustomBrands to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomBrandsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce KnowledgeableUser""" + knowledgeableUsers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceKnowledgeableUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceKnowledgeableUserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceKnowledgeableUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of KnowledgeableUsers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceKnowledgeableUsersConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + + """Collection of Salesforce TopicFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicFeedsConnection + + """Collection of Salesforce TopicUserEvent""" + topicUserEvents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicUserEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicUserEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicUserEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicUserEvents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicUserEventsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceContentDocumentLinkLinkedEntityUnion = SalesforceUser | SalesforceTopic | SalesforceTask | SalesforceSolution | SalesforceSite | SalesforceReport | SalesforceProduct2 | SalesforceOutgoingEmail | SalesforceOrganization | SalesforceOrderItem | SalesforceOrder | SalesforceOpportunity | SalesforceListEmail | SalesforceLead | SalesforceEvent | SalesforceEmailTemplate | SalesforceEmailMessage | SalesforceDashboardComponent | SalesforceDashboard | SalesforceContract | SalesforceContentWorkspace | SalesforceContact | SalesforceCollaborationGroup | SalesforceCase | SalesforceCampaign | SalesforceAssetRelationship | SalesforceAsset | SalesforceAccount + +"""Content Document Link""" +type SalesforceContentDocumentLink implements OneGraphNode { + """ContentDocumentLink ID""" + id: String! + + """Linked Entity ID""" + linkedEntityId: String! + + """Linked Entity ID""" + linkedEntity: SalesforceContentDocumentLinkLinkedEntityUnion! + + """ContentDocument ID""" + contentDocumentId: String! + + """ContentDocument ID""" + contentDocument: SalesforceContentDocument! + + """Is Deleted""" + isDeleted: Boolean! + + """System Modstamp""" + systemModstamp: String! + + """Share Type""" + shareType: String + + """Visibility""" + visibility: String + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Content Document Links connection, for use in pagination.""" +type SalesforceContentDocumentLinksConnection { + """ + The count of all Content Document Link you could get from the connection. + """ + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Content Document Links""" + nodes: [SalesforceContentDocumentLink!]! + + """List of Content Document Link edges""" + edges: [SalesforceContentDocumentLinkEdge!]! +} + +"""Organization""" +type SalesforceOrganization implements OneGraphNode { + """Organization ID""" + id: String! + + """Name""" + name: String! + + """Division""" + division: String + + """Street""" + street: String + + """City""" + city: String + + """State/Province""" + state: String + + """Zip/Postal Code""" + postalCode: String + + """Country""" + country: String + + """Latitude""" + latitude: Float + + """Longitude""" + longitude: Float + + """Geocode Accuracy""" + geocodeAccuracy: String + + """Address""" + address: SalesforceAddress + + """Phone""" + phone: String + + """Fax""" + fax: String + + """Primary Contact""" + primaryContact: String + + """Locale""" + defaultLocaleSidKey: String! + + """Language""" + languageLocaleKey: String! + + """Info Emails""" + receivesInfoEmails: Boolean! + + """Info Emails Admin""" + receivesAdminInfoEmails: Boolean! + + """RequireOpportunityProducts""" + preferencesRequireOpportunityProducts: Boolean! + + """TransactionSecurityPolicy""" + preferencesTransactionSecurityPolicy: Boolean! + + """TerminateOldestSession""" + preferencesTerminateOldestSession: Boolean! + + """ConsentManagementEnabled""" + preferencesConsentManagementEnabled: Boolean! + + """IndividualAutoCreateEnabled""" + preferencesIndividualAutoCreateEnabled: Boolean! + + """LightningLoginEnabled""" + preferencesLightningLoginEnabled: Boolean! + + """OnlyLLPermUserAllowed""" + preferencesOnlyLlPermUserAllowed: Boolean! + + """Fiscal Year Starts In""" + fiscalYearStartMonth: Int + + """Fiscal Year Name by Start""" + usesStartDateAsFiscalYearName: Boolean! + + """Default Account Access""" + defaultAccountAccess: String + + """Default Contact Access""" + defaultContactAccess: String + + """Default Opportunity Access""" + defaultOpportunityAccess: String + + """Default Lead Access""" + defaultLeadAccess: String + + """Default Case Access""" + defaultCaseAccess: String + + """Default Calendar Access""" + defaultCalendarAccess: String + + """Default Price Book Access""" + defaultPricebookAccess: String + + """Default Campaign Access""" + defaultCampaignAccess: String + + """System Modstamp""" + systemModstamp: String! + + """Compliance BCC Email""" + complianceBccEmail: String + + """UI Skin""" + uiSkin: String + + """Signup Country""" + signupCountryIsoCode: String + + """Trial Expiration Date""" + trialExpirationDate: String + + """Knowledge Licenses""" + numKnowledgeService: Int + + """Edition""" + organizationType: String + + """Namespace Prefix""" + namespacePrefix: String + + """Instance Name""" + instanceName: String + + """Is Sandbox""" + isSandbox: Boolean! + + """Web to Cases Default Origin""" + webToCaseDefaultOrigin: String + + """Monthly Page Views Used""" + monthlyPageViewsUsed: Int + + """Monthly Page Views Allowed""" + monthlyPageViewsEntitlement: Int + + """Is Read Only""" + isReadOnly: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce CustomBrand""" + customBrands( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomBrandConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomBrandSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomBrandSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CustomBrands to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomBrandsConnection + + """Collection of Salesforce EmailTemplate""" + emailTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailTemplateSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailTemplates to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailTemplatesConnection + + """Collection of Salesforce Group""" + groups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceGroupConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceGroupSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceGroupSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Groups to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceGroupsConnection + + """Collection of Salesforce Report""" + reports( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceReportConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceReportSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceReportSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Reports to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceReportsConnection + + """Collection of Salesforce Stamp""" + stamps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStampConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceStampSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStampSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Stamps to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceStampsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceGroupOwnerUnion = SalesforceUser | SalesforceOrganization + +union SalesforceGroupRelatedUnion = SalesforceUserRole | SalesforceUser + +"""Group""" +type SalesforceGroup implements OneGraphNode { + """Group ID""" + id: String! + + """Name""" + name: String! + + """Developer Name""" + developerName: String + + """Related ID""" + relatedId: String + + """Related ID""" + related: SalesforceGroupRelatedUnion + + """Type""" + type: String! + + """Email""" + email: String + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceGroupOwnerUnion! + + """Send Email to Members""" + doesSendEmailToMembers: Boolean! + + """Include Bosses""" + doesIncludeBosses: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Collection of Salesforce AccountShare""" + accountShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountSharesConnection + + """Collection of Salesforce AssetShare""" + assetShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssetShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetSharesConnection + + """Collection of Salesforce CampaignShare""" + campaignShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignSharesConnection + + """Collection of Salesforce CaseShare""" + caseShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseSharesConnection + + """Collection of Salesforce ContactShare""" + contactShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContactShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactSharesConnection + + """Collection of Salesforce ContentWorkspaceMember""" + contentWorkspaceMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspaceMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentWorkspaceMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentWorkspaceMembersConnection + + """Collection of Salesforce FlowInterviewShare""" + flowInterviewShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowInterviewShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowInterviewShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowInterviewShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowInterviewShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowInterviewSharesConnection + + """Collection of Salesforce ForecastShare""" + forecastShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceForecastShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceForecastShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceForecastShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ForecastShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceForecastSharesConnection + + """Collection of Salesforce GroupMember""" + groupMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceGroupMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceGroupMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceGroupMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of GroupMembers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceGroupMembersConnection + + """Collection of Salesforce LeadShare""" + leadShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadSharesConnection + + """Collection of Salesforce ListEmailShare""" + listEmailShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListEmailShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceListEmailShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListEmailShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ListEmailShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceListEmailSharesConnection + + """Collection of Salesforce MacroShare""" + macroShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMacroShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceMacroShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMacroShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of MacroShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMacroSharesConnection + + """Collection of Salesforce OpportunityShare""" + opportunityShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OpportunityShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunitySharesConnection + + """Collection of Salesforce OrderShare""" + orderShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderSharesConnection + + """Collection of Salesforce OrgDeleteRequestShare""" + orgDeleteRequestShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrgDeleteRequestShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrgDeleteRequestShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrgDeleteRequestShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OrgDeleteRequestShares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOrgDeleteRequestSharesConnection + + """Collection of Salesforce QueueSobject""" + queueSobjects( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceQueueSobjectConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceQueueSobjectSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceQueueSobjectSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of QueueSobjects to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceQueueSobjectsConnection + + """Collection of Salesforce QuickTextShare""" + quickTextShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceQuickTextShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceQuickTextShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceQuickTextShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of QuickTextShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceQuickTextSharesConnection + + """Collection of Salesforce StreamingChannelShare""" + streamingChannelShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStreamingChannelShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceStreamingChannelShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStreamingChannelShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of StreamingChannelShares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceStreamingChannelSharesConnection + + """Collection of Salesforce TodayGoalShare""" + todayGoalShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTodayGoalShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTodayGoalShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTodayGoalShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TodayGoalShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTodayGoalSharesConnection + + """Collection of Salesforce User""" + delegatedUsers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Users to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUsersConnection + + """Collection of Salesforce UserAppMenuCustomizationShare""" + userAppMenuCustomizationShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserAppMenuCustomizationShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserAppMenuCustomizationShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserAppMenuCustomizationShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserAppMenuCustomizationShares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserAppMenuCustomizationSharesConnection + + """Collection of Salesforce UserProvisioningRequestShare""" + userProvisioningRequestShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningRequestShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningRequestShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningRequestShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningRequestShares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningRequestSharesConnection + + """Collection of Salesforce UserShare""" + userShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserSharesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +union SalesforceForecastShareUserOrGroupUnion = SalesforceUser | SalesforceGroup + +"""Forecast Share""" +type SalesforceForecastShare implements OneGraphNode { + """Forecast Share ID""" + id: String! + + """User Role ID""" + userRoleId: String! + + """User Role ID""" + userRole: SalesforceUserRole! + + """User/Group ID""" + userOrGroupId: String! + + """User/Group ID""" + userOrGroup: SalesforceForecastShareUserOrGroupUnion! + + """Forecast Access""" + accessLevel: String! + + """Submit Allowed""" + canSubmit: Boolean! + + """Row Cause""" + rowCause: String! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Salesforce Forecast Shares connection, for use in pagination.""" +type SalesforceForecastSharesConnection { + """The count of all Forecast Share you could get from the connection.""" + totalCount: Int! + + """Pagination Information""" + pageInfo: PageInfo! + + """List of Salesforce Forecast Shares""" + nodes: [SalesforceForecastShare!]! + + """List of Forecast Share edges""" + edges: [SalesforceForecastShareEdge!]! +} + +"""Role""" +type SalesforceUserRole implements OneGraphNode { + """Role ID""" + id: String! + + """Name""" + name: String! + + """Parent Role ID""" + parentRoleId: String + + """Parent Role ID""" + parentRole: SalesforceUserRole + + """Description""" + rollupDescription: String + + """Opportunity Access Level for Account Owner""" + opportunityAccessForAccountOwner: String! + + """Case Access Level for Account Owner""" + caseAccessForAccountOwner: String + + """Contact Access Level for Account Owner""" + contactAccessForAccountOwner: String + + """User ID""" + forecastUserId: String + + """User ID""" + forecastUser: SalesforceUser + + """May Forecast Manager Share""" + mayForecastManagerShare: Boolean! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Developer Name""" + developerName: String + + """Account ID""" + portalAccountId: String + + """Account ID""" + portalAccount: SalesforceAccount + + """Portal Type""" + portalType: String + + """User ID""" + portalAccountOwnerId: String + + """User ID""" + portalAccountOwner: SalesforceUser + + """Collection of Salesforce ForecastShare""" + forecastShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceForecastShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceForecastShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceForecastShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ForecastShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceForecastSharesConnection + + """Collection of Salesforce Group""" + groups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceGroupConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceGroupSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceGroupSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Groups to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceGroupsConnection + + """Collection of Salesforce User""" + users( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Users to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUsersConnection + + """Collection of Salesforce UserRole""" + userRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserRoles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserRolesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""User""" +type SalesforceUser implements OneGraphNode { + """Linked Github User""" + gitHubUser: GitHubUser + + """User ID""" + id: String! + + """Username""" + username: String! + + """Last Name""" + lastName: String! + + """First Name""" + firstName: String + + """Full Name""" + name: String! + + """Company Name""" + companyName: String + + """Division""" + division: String + + """Department""" + department: String + + """Title""" + title: String + + """Street""" + street: String + + """City""" + city: String + + """State/Province""" + state: String + + """Zip/Postal Code""" + postalCode: String + + """Country""" + country: String + + """Latitude""" + latitude: Float + + """Longitude""" + longitude: Float + + """Geocode Accuracy""" + geocodeAccuracy: String + + """Address""" + address: SalesforceAddress + + """Email""" + email: String! + + """AutoBcc""" + emailPreferencesAutoBcc: Boolean! + + """AutoBccStayInTouch""" + emailPreferencesAutoBccStayInTouch: Boolean! + + """StayInTouchReminder""" + emailPreferencesStayInTouchReminder: Boolean! + + """Email Sender Address""" + senderEmail: String + + """Email Sender Name""" + senderName: String + + """Email Signature""" + signature: String + + """Stay-in-Touch Email Subject""" + stayInTouchSubject: String + + """Stay-in-Touch Email Signature""" + stayInTouchSignature: String + + """Stay-in-Touch Email Note""" + stayInTouchNote: String + + """Phone""" + phone: String + + """Fax""" + fax: String + + """Cell""" + mobilePhone: String + + """Alias""" + alias: String! + + """Nickname""" + communityNickname: String! + + """User Photo badge text overlay""" + badgeText: String + + """Active""" + isActive: Boolean! + + """Time Zone""" + timeZoneSidKey: String! + + """Role ID""" + userRoleId: String + + """Role ID""" + userRole: SalesforceUserRole + + """Locale""" + localeSidKey: String! + + """Info Emails""" + receivesInfoEmails: Boolean! + + """Admin Info Emails""" + receivesAdminInfoEmails: Boolean! + + """Email Encoding""" + emailEncodingKey: String! + + """Profile ID""" + profileId: String! + + """Profile ID""" + profile: SalesforceProfile! + + """User Type""" + userType: String + + """Language""" + languageLocaleKey: String! + + """Employee Number""" + employeeNumber: String + + """Delegated Approver ID""" + delegatedApproverId: String + + """Delegated Approver ID""" + delegatedApprover: SalesforceUserDelegatedApproverUnion + + """Manager ID""" + managerId: String + + """Manager ID""" + manager: SalesforceUser + + """Last Login""" + lastLoginDate: String + + """Last Password Change or Reset""" + lastPasswordChangeDate: String + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Offline Edition Trial Expiration Date""" + offlineTrialExpirationDate: String + + """Sales Anywhere Trial Expiration Date""" + offlinePdaTrialExpirationDate: String + + """Marketing User""" + userPermissionsMarketingUser: Boolean! + + """Offline User""" + userPermissionsOfflineUser: Boolean! + + """Auto-login To Call Center""" + userPermissionsCallCenterAutoLogin: Boolean! + + """Apex Mobile User""" + userPermissionsMobileUser: Boolean! + + """Salesforce CRM Content User""" + userPermissionsSfContentUser: Boolean! + + """Knowledge User""" + userPermissionsKnowledgeUser: Boolean! + + """Flow User""" + userPermissionsInteractionUser: Boolean! + + """Service Cloud User""" + userPermissionsSupportUser: Boolean! + + """Data.com User""" + userPermissionsJigsawProspectingUser: Boolean! + + """Site.com Contributor User""" + userPermissionsSiteforceContributorUser: Boolean! + + """Site.com Publisher User""" + userPermissionsSiteforcePublisherUser: Boolean! + + """Work.com User""" + userPermissionsWorkDotComUserFeature: Boolean! + + """Allow Forecasting""" + forecastEnabled: Boolean! + + """ActivityRemindersPopup""" + userPreferencesActivityRemindersPopup: Boolean! + + """EventRemindersCheckboxDefault""" + userPreferencesEventRemindersCheckboxDefault: Boolean! + + """TaskRemindersCheckboxDefault""" + userPreferencesTaskRemindersCheckboxDefault: Boolean! + + """ReminderSoundOff""" + userPreferencesReminderSoundOff: Boolean! + + """DisableAllFeedsEmail""" + userPreferencesDisableAllFeedsEmail: Boolean! + + """DisableFollowersEmail""" + userPreferencesDisableFollowersEmail: Boolean! + + """DisableProfilePostEmail""" + userPreferencesDisableProfilePostEmail: Boolean! + + """DisableChangeCommentEmail""" + userPreferencesDisableChangeCommentEmail: Boolean! + + """DisableLaterCommentEmail""" + userPreferencesDisableLaterCommentEmail: Boolean! + + """DisProfPostCommentEmail""" + userPreferencesDisProfPostCommentEmail: Boolean! + + """ContentNoEmail""" + userPreferencesContentNoEmail: Boolean! + + """ContentEmailAsAndWhen""" + userPreferencesContentEmailAsAndWhen: Boolean! + + """ApexPagesDeveloperMode""" + userPreferencesApexPagesDeveloperMode: Boolean! + + """HideCSNGetChatterMobileTask""" + userPreferencesHideCsnGetChatterMobileTask: Boolean! + + """DisableMentionsPostEmail""" + userPreferencesDisableMentionsPostEmail: Boolean! + + """DisMentionsCommentEmail""" + userPreferencesDisMentionsCommentEmail: Boolean! + + """HideCSNDesktopTask""" + userPreferencesHideCsnDesktopTask: Boolean! + + """HideChatterOnboardingSplash""" + userPreferencesHideChatterOnboardingSplash: Boolean! + + """HideSecondChatterOnboardingSplash""" + userPreferencesHideSecondChatterOnboardingSplash: Boolean! + + """DisCommentAfterLikeEmail""" + userPreferencesDisCommentAfterLikeEmail: Boolean! + + """DisableLikeEmail""" + userPreferencesDisableLikeEmail: Boolean! + + """SortFeedByComment""" + userPreferencesSortFeedByComment: Boolean! + + """DisableMessageEmail""" + userPreferencesDisableMessageEmail: Boolean! + + """JigsawListUser""" + userPreferencesJigsawListUser: Boolean! + + """DisableBookmarkEmail""" + userPreferencesDisableBookmarkEmail: Boolean! + + """DisableSharePostEmail""" + userPreferencesDisableSharePostEmail: Boolean! + + """EnableAutoSubForFeeds""" + userPreferencesEnableAutoSubForFeeds: Boolean! + + """DisableFileShareNotificationsForApi""" + userPreferencesDisableFileShareNotificationsForApi: Boolean! + + """ShowTitleToExternalUsers""" + userPreferencesShowTitleToExternalUsers: Boolean! + + """ShowManagerToExternalUsers""" + userPreferencesShowManagerToExternalUsers: Boolean! + + """ShowEmailToExternalUsers""" + userPreferencesShowEmailToExternalUsers: Boolean! + + """ShowWorkPhoneToExternalUsers""" + userPreferencesShowWorkPhoneToExternalUsers: Boolean! + + """ShowMobilePhoneToExternalUsers""" + userPreferencesShowMobilePhoneToExternalUsers: Boolean! + + """ShowFaxToExternalUsers""" + userPreferencesShowFaxToExternalUsers: Boolean! + + """ShowStreetAddressToExternalUsers""" + userPreferencesShowStreetAddressToExternalUsers: Boolean! + + """ShowCityToExternalUsers""" + userPreferencesShowCityToExternalUsers: Boolean! + + """ShowStateToExternalUsers""" + userPreferencesShowStateToExternalUsers: Boolean! + + """ShowPostalCodeToExternalUsers""" + userPreferencesShowPostalCodeToExternalUsers: Boolean! + + """ShowCountryToExternalUsers""" + userPreferencesShowCountryToExternalUsers: Boolean! + + """ShowProfilePicToGuestUsers""" + userPreferencesShowProfilePicToGuestUsers: Boolean! + + """ShowTitleToGuestUsers""" + userPreferencesShowTitleToGuestUsers: Boolean! + + """ShowCityToGuestUsers""" + userPreferencesShowCityToGuestUsers: Boolean! + + """ShowStateToGuestUsers""" + userPreferencesShowStateToGuestUsers: Boolean! + + """ShowPostalCodeToGuestUsers""" + userPreferencesShowPostalCodeToGuestUsers: Boolean! + + """ShowCountryToGuestUsers""" + userPreferencesShowCountryToGuestUsers: Boolean! + + """DisableFeedbackEmail""" + userPreferencesDisableFeedbackEmail: Boolean! + + """DisableWorkEmail""" + userPreferencesDisableWorkEmail: Boolean! + + """HideS1BrowserUI""" + userPreferencesHideS1BrowserUi: Boolean! + + """DisableEndorsementEmail""" + userPreferencesDisableEndorsementEmail: Boolean! + + """PathAssistantCollapsed""" + userPreferencesPathAssistantCollapsed: Boolean! + + """CacheDiagnostics""" + userPreferencesCacheDiagnostics: Boolean! + + """ShowEmailToGuestUsers""" + userPreferencesShowEmailToGuestUsers: Boolean! + + """ShowManagerToGuestUsers""" + userPreferencesShowManagerToGuestUsers: Boolean! + + """ShowWorkPhoneToGuestUsers""" + userPreferencesShowWorkPhoneToGuestUsers: Boolean! + + """ShowMobilePhoneToGuestUsers""" + userPreferencesShowMobilePhoneToGuestUsers: Boolean! + + """ShowFaxToGuestUsers""" + userPreferencesShowFaxToGuestUsers: Boolean! + + """ShowStreetAddressToGuestUsers""" + userPreferencesShowStreetAddressToGuestUsers: Boolean! + + """LightningExperiencePreferred""" + userPreferencesLightningExperiencePreferred: Boolean! + + """PreviewLightning""" + userPreferencesPreviewLightning: Boolean! + + """HideEndUserOnboardingAssistantModal""" + userPreferencesHideEndUserOnboardingAssistantModal: Boolean! + + """HideLightningMigrationModal""" + userPreferencesHideLightningMigrationModal: Boolean! + + """HideSfxWelcomeMat""" + userPreferencesHideSfxWelcomeMat: Boolean! + + """HideBiggerPhotoCallout""" + userPreferencesHideBiggerPhotoCallout: Boolean! + + """GlobalNavBarWTShown""" + userPreferencesGlobalNavBarWtShown: Boolean! + + """GlobalNavGridMenuWTShown""" + userPreferencesGlobalNavGridMenuWtShown: Boolean! + + """CreateLEXAppsWTShown""" + userPreferencesCreateLexAppsWtShown: Boolean! + + """FavoritesWTShown""" + userPreferencesFavoritesWtShown: Boolean! + + """RecordHomeSectionCollapseWTShown""" + userPreferencesRecordHomeSectionCollapseWtShown: Boolean! + + """RecordHomeReservedWTShown""" + userPreferencesRecordHomeReservedWtShown: Boolean! + + """FavoritesShowTopFavorites""" + userPreferencesFavoritesShowTopFavorites: Boolean! + + """ExcludeMailAppAttachments""" + userPreferencesExcludeMailAppAttachments: Boolean! + + """SuppressTaskSFXReminders""" + userPreferencesSuppressTaskSfxReminders: Boolean! + + """SuppressEventSFXReminders""" + userPreferencesSuppressEventSfxReminders: Boolean! + + """PreviewCustomTheme""" + userPreferencesPreviewCustomTheme: Boolean! + + """HasCelebrationBadge""" + userPreferencesHasCelebrationBadge: Boolean! + + """Contact ID""" + contactId: String + + """Contact ID""" + contact: SalesforceContact + + """Account ID""" + accountId: String + + """Account ID""" + account: SalesforceAccount + + """Call Center ID""" + callCenterId: String + + """Call Center ID""" + callCenter: SalesforceCallCenter + + """Extension""" + extension: String + + """SAML Federation ID""" + federationIdentifier: String + + """About Me""" + aboutMe: String + + """Url for full-sized Photo""" + fullPhotoUrl: String + + """Photo""" + smallPhotoUrl: String + + """Show external indicator""" + isExtIndicatorVisible: Boolean! + + """Out of office message""" + outOfOfficeMessage: String + + """Url for medium profile photo""" + mediumPhotoUrl: String + + """Chatter Email Highlights Frequency""" + digestFrequency: String! + + """Default Notification Frequency when Joining Groups""" + defaultGroupNotificationFrequency: String! + + """Data.com Monthly Addition Limit""" + jigsawImportLimitOverride: Int + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Url for banner photo""" + bannerPhotoUrl: String + + """Url for IOS banner photo""" + smallBannerPhotoUrl: String + + """Url for Android banner photo""" + mediumBannerPhotoUrl: String + + """Has Profile Photo""" + isProfilePhotoActive: Boolean! + + """Collection of Salesforce AcceptedEventRelation""" + acceptedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAcceptedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAcceptedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAcceptedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of AcceptedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAcceptedEventRelationsConnection + + """Collection of Salesforce Account""" + accounts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Accounts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountsConnection + + """Collection of Salesforce AccountCleanInfo""" + accountCleanInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountCleanInfoSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountCleanInfos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountCleanInfosConnection + + """Collection of Salesforce AccountCleanInfo""" + accountCleanInfoReviewers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountCleanInfoSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountCleanInfos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountCleanInfosConnection + + """Collection of Salesforce AccountContactRole""" + accountContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountContactRoles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountContactRolesConnection + + """Collection of Salesforce AccountFeed""" + accountFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountFeedsConnection + + """Collection of Salesforce AccountHistory""" + accountHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountHistorysConnection + + """Collection of Salesforce AccountPartner""" + accountPartners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountPartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountPartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountPartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountPartners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountPartnersConnection + + """Collection of Salesforce AccountShare""" + accountShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountSharesConnection + + """Collection of Salesforce ActionLinkGroupTemplate""" + actionLinkGroupTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceActionLinkGroupTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceActionLinkGroupTemplateSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceActionLinkGroupTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ActionLinkGroupTemplates to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceActionLinkGroupTemplatesConnection + + """Collection of Salesforce ActionLinkTemplate""" + actionLinkTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceActionLinkTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceActionLinkTemplateSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceActionLinkTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ActionLinkTemplates to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceActionLinkTemplatesConnection + + """Collection of Salesforce AdditionalNumber""" + additionalNumbers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAdditionalNumberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAdditionalNumberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAdditionalNumberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AdditionalNumbers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAdditionalNumbersConnection + + """Collection of Salesforce Announcement""" + announcements( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAnnouncementConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAnnouncementSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAnnouncementSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Announcements to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAnnouncementsConnection + + """Collection of Salesforce ApexClass""" + apexClasses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexClassConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexClassSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexClassSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexClasses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexClasssConnection + + """Collection of Salesforce ApexComponent""" + apexComponents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexComponentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexComponentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexComponentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexComponents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexComponentsConnection + + """Collection of Salesforce ApexEmailNotification""" + apexEmailNotifications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexEmailNotificationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexEmailNotificationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexEmailNotificationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ApexEmailNotifications to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceApexEmailNotificationsConnection + + """Collection of Salesforce ApexLog""" + apexLogs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexLogConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexLogSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexLogSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexLogs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexLogsConnection + + """Collection of Salesforce ApexPage""" + apexPages( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexPageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexPageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexPageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexPages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexPagesConnection + + """Collection of Salesforce ApexTestQueueItem""" + apexTestQueueItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestQueueItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestQueueItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestQueueItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestQueueItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestQueueItemsConnection + + """Collection of Salesforce ApexTestResultLimits""" + apexTestResultLimitsPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestResultLimitsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestResultLimitsSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestResultLimitsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ApexTestResultLimits to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceApexTestResultLimitssConnection + + """Collection of Salesforce ApexTestRunResult""" + apexTestRunResults( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestRunResultConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestRunResultSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestRunResultSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestRunResults to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestRunResultsConnection + + """Collection of Salesforce ApexTestSuite""" + apexTestSuites( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTestSuiteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTestSuiteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTestSuiteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTestSuites to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTestSuitesConnection + + """Collection of Salesforce ApexTrigger""" + apexTriggers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceApexTriggerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceApexTriggerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceApexTriggerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ApexTriggers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceApexTriggersConnection + + """Collection of Salesforce AppMenuItem""" + appMenuItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAppMenuItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAppMenuItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAppMenuItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AppMenuItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAppMenuItemsConnection + + """Collection of Salesforce Asset""" + assets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Assets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetsConnection + + """Collection of Salesforce AssetFeed""" + assetFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssetFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetFeedsConnection + + """Collection of Salesforce AssetHistory""" + assetHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssetHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetHistorysConnection + + """Collection of Salesforce AssetRelationship""" + assetRelationships( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetRelationshipConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetRelationshipSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetRelationshipSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssetRelationships to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetRelationshipsConnection + + """Collection of Salesforce AssetRelationshipFeed""" + assetRelationshipFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetRelationshipFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetRelationshipFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetRelationshipFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of AssetRelationshipFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAssetRelationshipFeedsConnection + + """Collection of Salesforce AssetRelationshipHistory""" + assetRelationshipHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetRelationshipHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetRelationshipHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetRelationshipHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of AssetRelationshipHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAssetRelationshipHistorysConnection + + """Collection of Salesforce AssetShare""" + assetShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssetShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetSharesConnection + + """Collection of Salesforce AssignmentRule""" + assignmentRules( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssignmentRuleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssignmentRuleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssignmentRuleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AssignmentRules to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssignmentRulesConnection + + """Collection of Salesforce AsyncApexJob""" + asyncApexJobs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAsyncApexJobConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAsyncApexJobSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAsyncApexJobSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AsyncApexJobs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAsyncApexJobsConnection + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce AuraDefinition""" + auraDefinitions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuraDefinitionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuraDefinitionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuraDefinitionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuraDefinitions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuraDefinitionsConnection + + """Collection of Salesforce AuraDefinitionBundle""" + auraDefinitionBundles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuraDefinitionBundleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuraDefinitionBundleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuraDefinitionBundleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of AuraDefinitionBundles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAuraDefinitionBundlesConnection + + """Collection of Salesforce AuthConfig""" + authConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuthConfigSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuthConfigs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthConfigsConnection + + """Collection of Salesforce AuthConfigProviders""" + authConfigProvidersPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthConfigProvidersConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuthConfigProvidersSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthConfigProvidersSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuthConfigProviders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthConfigProviderssConnection + + """Collection of Salesforce AuthProvider""" + authProviders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthProviderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuthProviderSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthProviderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuthProviders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthProvidersConnection + + """Collection of Salesforce AuthSession""" + authSessions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAuthSessionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAuthSessionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAuthSessionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AuthSessions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAuthSessionsConnection + + """Collection of Salesforce BackgroundOperation""" + backgroundOperations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceBackgroundOperationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceBackgroundOperationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceBackgroundOperationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of BackgroundOperations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceBackgroundOperationsConnection + + """Collection of Salesforce BrandTemplate""" + brandTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceBrandTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceBrandTemplateSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceBrandTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of BrandTemplates to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceBrandTemplatesConnection + + """Collection of Salesforce BusinessHours""" + businessHoursPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceBusinessHoursConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceBusinessHoursSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceBusinessHoursSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of BusinessHours to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceBusinessHourssConnection + + """Collection of Salesforce BusinessProcess""" + businessProcesses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceBusinessProcessConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceBusinessProcessSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceBusinessProcessSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of BusinessProcesses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceBusinessProcesssConnection + + """Collection of Salesforce CallCenter""" + callCenters( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCallCenterConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCallCenterSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCallCenterSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CallCenters to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCallCentersConnection + + """Collection of Salesforce Campaign""" + campaigns( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Campaigns to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignsConnection + + """Collection of Salesforce CampaignFeed""" + campaignFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignFeedsConnection + + """Collection of Salesforce CampaignHistory""" + campaignHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignHistorysConnection + + """Collection of Salesforce CampaignMember""" + campaignMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignMembers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignMembersConnection + + """Collection of Salesforce CampaignMemberStatus""" + campaignMemberStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignMemberStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignMemberStatusSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignMemberStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CampaignMemberStatuses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCampaignMemberStatussConnection + + """Collection of Salesforce CampaignShare""" + campaignShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignSharesConnection + + """Collection of Salesforce Case""" + cases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Cases to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCasesConnection + + """Collection of Salesforce CaseComment""" + caseComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseCommentsConnection + + """Collection of Salesforce CaseContactRole""" + caseContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseContactRoles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseContactRolesConnection + + """Collection of Salesforce CaseFeed""" + caseFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseFeedsConnection + + """Collection of Salesforce CaseHistory""" + caseHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseHistorysConnection + + """Collection of Salesforce CaseShare""" + caseShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseSharesConnection + + """Collection of Salesforce CaseSolution""" + caseSolutions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseSolutionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseSolutionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseSolutionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseSolutions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseSolutionsConnection + + """Collection of Salesforce CaseStatus""" + caseStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseStatusSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseStatuses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseStatussConnection + + """Collection of Salesforce CaseTeamMember""" + caseTeamMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseTeamMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseTeamMembers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseTeamMembersConnection + + """Collection of Salesforce CaseTeamRole""" + caseTeamRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseTeamRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseTeamRoles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseTeamRolesConnection + + """Collection of Salesforce CaseTeamTemplate""" + caseTeamTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseTeamTemplateSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseTeamTemplates to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseTeamTemplatesConnection + + """Collection of Salesforce CaseTeamTemplateMember""" + caseTeamTemplateMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamTemplateMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseTeamTemplateMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamTemplateMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CaseTeamTemplateMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCaseTeamTemplateMembersConnection + + """Collection of Salesforce CaseTeamTemplateRecord""" + caseTeamTemplateRecords( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamTemplateRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseTeamTemplateRecordSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamTemplateRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CaseTeamTemplateRecords to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCaseTeamTemplateRecordsConnection + + """Collection of Salesforce CategoryData""" + categoryDatas( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCategoryDataConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCategoryDataSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCategoryDataSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CategoryDatas to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCategoryDatasConnection + + """Collection of Salesforce CategoryNode""" + categoryNodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCategoryNodeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCategoryNodeSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCategoryNodeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CategoryNodes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCategoryNodesConnection + + """Collection of Salesforce ChatterActivity""" + chatterActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceChatterActivityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceChatterActivitySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceChatterActivitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ChatterActivities to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceChatterActivitysConnection + + """Collection of Salesforce ChatterExtension""" + chatterExtensions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceChatterExtensionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceChatterExtensionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceChatterExtensionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ChatterExtensions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceChatterExtensionsConnection + + """Collection of Salesforce ChatterExtensionConfig""" + chatterExtensionConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceChatterExtensionConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceChatterExtensionConfigSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceChatterExtensionConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ChatterExtensionConfigs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceChatterExtensionConfigsConnection + + """Collection of Salesforce ClientBrowser""" + clientBrowsers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceClientBrowserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceClientBrowserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceClientBrowserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ClientBrowsers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceClientBrowsersConnection + + """Collection of Salesforce CollaborationGroup""" + collaborationGroups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CollaborationGroups to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCollaborationGroupsConnection + + """Collection of Salesforce CollaborationGroupFeed""" + collaborationGroupFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupFeedsConnection + + """Collection of Salesforce CollaborationGroupMember""" + collaborationGroupMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupMembersConnection + + """Collection of Salesforce CollaborationGroupMember""" + groupMemberships( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupMembersConnection + + """Collection of Salesforce CollaborationGroupMemberRequest""" + collaborationGroupMemberRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupMemberRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupMemberRequestSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupMemberRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupMemberRequests to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupMemberRequestsConnection + + """Collection of Salesforce CollaborationGroupMemberRequest""" + groupMembershipRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupMemberRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupMemberRequestSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupMemberRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupMemberRequests to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupMemberRequestsConnection + + """Collection of Salesforce CollaborationGroupRecord""" + collaborationGroupRecords( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupRecords to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupRecordsConnection + + """Collection of Salesforce CollaborationInvitation""" + collaborationInvitations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationInvitationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationInvitationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationInvitationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationInvitations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationInvitationsConnection + + """Collection of Salesforce Community""" + communities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCommunityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCommunitySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCommunitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Communities to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCommunitysConnection + + """Collection of Salesforce ConnectedApplication""" + connectedApplications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceConnectedApplicationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceConnectedApplicationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceConnectedApplicationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ConnectedApplications to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceConnectedApplicationsConnection + + """Collection of Salesforce Contact""" + contacts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contacts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactsConnection + + """Collection of Salesforce ContactCleanInfo""" + contactCleanInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactCleanInfoSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContactCleanInfos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactCleanInfosConnection + + """Collection of Salesforce ContactCleanInfo""" + contactCleanInfoReviewers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactCleanInfoSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContactCleanInfos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactCleanInfosConnection + + """Collection of Salesforce ContactFeed""" + contactFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContactFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactFeedsConnection + + """Collection of Salesforce ContactHistory""" + contactHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContactHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactHistorysConnection + + """Collection of Salesforce ContactShare""" + contactShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContactShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactSharesConnection + + """Collection of Salesforce ContentAsset""" + contentAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentAssets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentAssetsConnection + + """Collection of Salesforce ContentDistribution""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce ContentDistributionView""" + contentDistributionViews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionViewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionViewSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionViewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributionViews to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionViewsConnection + + """Collection of Salesforce ContentDocument""" + contentDocuments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentDocuments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentDocumentsConnection + + """Collection of Salesforce ContentDocumentFeed""" + contentDocumentFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentFeedsConnection + + """Collection of Salesforce ContentDocumentHistory""" + contentDocumentHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentHistorysConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentDocumentSubscription""" + contentDocumentSubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentSubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentSubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentSubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentSubscriptions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentSubscriptionsConnection + + """Collection of Salesforce ContentFolder""" + contentFolders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentFolderSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentFolders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentFoldersConnection + + """Collection of Salesforce ContentFolderItem""" + contentFolderItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentFolderItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentFolderItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentFolderItemsConnection + + """Collection of Salesforce ContentFolderMember""" + contentFolderMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentFolderMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentFolderMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentFolderMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentFolderMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentFolderMembersConnection + + """Collection of Salesforce ContentNotification""" + contentNotifications( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentNotificationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentNotificationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentNotificationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentNotifications to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentNotificationsConnection + + """Collection of Salesforce ContentTagSubscription""" + contentTagSubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentTagSubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentTagSubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentTagSubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentTagSubscriptions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentTagSubscriptionsConnection + + """Collection of Salesforce ContentUserSubscription""" + contentUserSubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentUserSubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentUserSubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentUserSubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentUserSubscriptions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentUserSubscriptionsConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce ContentVersionHistory""" + contentVersionHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentVersionHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentVersionHistorysConnection + + """Collection of Salesforce ContentVersionRating""" + contentVersionRatings( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionRatingConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionRatingSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionRatingSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentVersionRatings to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentVersionRatingsConnection + + """Collection of Salesforce ContentWorkspace""" + contentWorkspaces( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspaceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentWorkspaces to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentWorkspacesConnection + + """Collection of Salesforce ContentWorkspaceMember""" + contentWorkspaceMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspaceMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentWorkspaceMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentWorkspaceMembersConnection + + """Collection of Salesforce ContentWorkspacePermission""" + contentWorkspacePermissions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspacePermissionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspacePermissionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspacePermissionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentWorkspacePermissions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentWorkspacePermissionsConnection + + """Collection of Salesforce ContentWorkspaceSubscription""" + contentWorkspaceSubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentWorkspaceSubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentWorkspaceSubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentWorkspaceSubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentWorkspaceSubscriptions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentWorkspaceSubscriptionsConnection + + """Collection of Salesforce Contract""" + contracts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contracts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractsConnection + + """Collection of Salesforce Contract""" + contractsSigned( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contracts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractsConnection + + """Collection of Salesforce ContractContactRole""" + contractContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContractContactRoles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContractContactRolesConnection + + """Collection of Salesforce ContractFeed""" + contractFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContractFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractFeedsConnection + + """Collection of Salesforce ContractHistory""" + contractHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContractHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractHistorysConnection + + """Collection of Salesforce ContractStatus""" + contractStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractStatusSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContractStatuses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractStatussConnection + + """Collection of Salesforce CorsWhitelistEntry""" + corsWhitelistEntries( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCorsWhitelistEntryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCorsWhitelistEntrySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCorsWhitelistEntrySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CorsWhitelistEntries to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCorsWhitelistEntrysConnection + + """Collection of Salesforce CronTrigger""" + cronTriggers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCronTriggerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCronTriggerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCronTriggerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CronTriggers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCronTriggersConnection + + """Collection of Salesforce CspTrustedSite""" + cspTrustedSites( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCspTrustedSiteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCspTrustedSiteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCspTrustedSiteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CspTrustedSites to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCspTrustedSitesConnection + + """Collection of Salesforce CustomBrand""" + customBrands( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomBrandConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomBrandSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomBrandSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CustomBrands to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomBrandsConnection + + """Collection of Salesforce CustomBrandAsset""" + customBrandAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomBrandAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomBrandAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomBrandAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CustomBrandAssets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomBrandAssetsConnection + + """Collection of Salesforce CustomPermission""" + customPermissions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomPermissionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomPermissionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomPermissionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CustomPermissions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCustomPermissionsConnection + + """Collection of Salesforce CustomPermissionDependency""" + customPermissionDependencies( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCustomPermissionDependencyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCustomPermissionDependencySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCustomPermissionDependencySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CustomPermissionDependencies to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCustomPermissionDependencysConnection + + """Collection of Salesforce DandBCompany""" + dandBCompanies( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDandBCompanyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDandBCompanySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDandBCompanySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DandBCompanies to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDandBCompanysConnection + + """Collection of Salesforce Dashboard""" + dashboards( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDashboardSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Dashboards to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDashboardsConnection + + """Collection of Salesforce DashboardComponentFeed""" + dashboardComponentFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardComponentFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDashboardComponentFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardComponentFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DashboardComponentFeeds to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDashboardComponentFeedsConnection + + """Collection of Salesforce DashboardFeed""" + dashboardFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDashboardFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDashboardFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDashboardFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DashboardFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDashboardFeedsConnection + + """Collection of Salesforce DataAssessmentFieldMetric""" + dataAssessmentFieldMetrics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDataAssessmentFieldMetricConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDataAssessmentFieldMetricSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDataAssessmentFieldMetricSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DataAssessmentFieldMetrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDataAssessmentFieldMetricsConnection + + """Collection of Salesforce DataAssessmentMetric""" + dataAssessmentMetrics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDataAssessmentMetricConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDataAssessmentMetricSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDataAssessmentMetricSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DataAssessmentMetrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDataAssessmentMetricsConnection + + """Collection of Salesforce DataAssessmentValueMetric""" + dataAssessmentValueMetrics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDataAssessmentValueMetricConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDataAssessmentValueMetricSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDataAssessmentValueMetricSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DataAssessmentValueMetrics to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDataAssessmentValueMetricsConnection + + """Collection of Salesforce DatacloudOwnedEntity""" + datacloudOwnedEntities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDatacloudOwnedEntityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDatacloudOwnedEntitySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDatacloudOwnedEntitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DatacloudOwnedEntities to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDatacloudOwnedEntitysConnection + + """Collection of Salesforce DatacloudPurchaseUsage""" + datacloudPurchaseUsages( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDatacloudPurchaseUsageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDatacloudPurchaseUsageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDatacloudPurchaseUsageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DatacloudPurchaseUsages to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDatacloudPurchaseUsagesConnection + + """Collection of Salesforce DeclinedEventRelation""" + declinedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDeclinedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDeclinedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDeclinedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DeclinedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDeclinedEventRelationsConnection + + """Collection of Salesforce Document""" + documents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDocumentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDocumentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDocumentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Documents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDocumentsConnection + + """Collection of Salesforce DocumentAttachmentMap""" + documentAttachmentMaps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDocumentAttachmentMapConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDocumentAttachmentMapSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDocumentAttachmentMapSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DocumentAttachmentMaps to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDocumentAttachmentMapsConnection + + """Collection of Salesforce Domain""" + domains( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDomainConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDomainSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDomainSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Domains to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDomainsConnection + + """Collection of Salesforce DomainSite""" + domainSites( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDomainSiteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDomainSiteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDomainSiteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DomainSites to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDomainSitesConnection + + """Collection of Salesforce DuplicateRecordItem""" + duplicateRecordItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDuplicateRecordItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDuplicateRecordItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDuplicateRecordItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DuplicateRecordItems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDuplicateRecordItemsConnection + + """Collection of Salesforce DuplicateRecordSet""" + duplicateRecordSets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDuplicateRecordSetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDuplicateRecordSetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDuplicateRecordSetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DuplicateRecordSets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDuplicateRecordSetsConnection + + """Collection of Salesforce DuplicateRule""" + duplicateRules( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDuplicateRuleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDuplicateRuleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDuplicateRuleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of DuplicateRules to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceDuplicateRulesConnection + + """Collection of Salesforce EmailCapture""" + emailCaptures( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailCaptureConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailCaptureSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailCaptureSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailCaptures to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailCapturesConnection + + """Collection of Salesforce EmailDomainKey""" + emailDomainKeys( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailDomainKeyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailDomainKeySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailDomainKeySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailDomainKeys to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailDomainKeysConnection + + """Collection of Salesforce EmailMessage""" + emailMessages( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EmailMessageRelation""" + emailMessageRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of EmailMessageRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceEmailMessageRelationsConnection + + """Collection of Salesforce EmailServicesAddress""" + emailServicesAddresses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailServicesAddressConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailServicesAddressSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailServicesAddressSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of EmailServicesAddresses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceEmailServicesAddresssConnection + + """Collection of Salesforce EmailServicesFunction""" + emailServicesFunctions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailServicesFunctionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailServicesFunctionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailServicesFunctionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of EmailServicesFunctions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceEmailServicesFunctionsConnection + + """Collection of Salesforce EmailTemplate""" + emailTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailTemplateSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailTemplates to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailTemplatesConnection + + """Collection of Salesforce EntitySubscription""" + entitySubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce EventFeed""" + eventFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EventFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventFeedsConnection + + """Collection of Salesforce EventLogFile""" + eventLogFiles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventLogFileConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventLogFileSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventLogFileSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EventLogFiles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventLogFilesConnection + + """Collection of Salesforce EventRelation""" + eventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EventRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventRelationsConnection + + """Collection of Salesforce ExternalDataSource""" + externalDataSources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceExternalDataSourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceExternalDataSourceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceExternalDataSourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ExternalDataSources to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceExternalDataSourcesConnection + + """Collection of Salesforce ExternalDataUserAuth""" + externalDataUserAuths( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceExternalDataUserAuthConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceExternalDataUserAuthSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceExternalDataUserAuthSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ExternalDataUserAuths to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceExternalDataUserAuthsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FeedPollChoice""" + feedPollChoices( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollChoiceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollChoiceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollChoiceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollChoices to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollChoicesConnection + + """Collection of Salesforce FeedPollVote""" + feedPollVotes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedPollVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedPollVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedPollVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedPollVotes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedPollVotesConnection + + """Collection of Salesforce FeedRevision""" + feedRevisions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedRevisionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedRevisionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedRevisionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedRevisions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedRevisionsConnection + + """Collection of Salesforce FileSearchActivity""" + fileSearchActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFileSearchActivityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFileSearchActivitySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFileSearchActivitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of FileSearchActivities to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceFileSearchActivitysConnection + + """Collection of Salesforce FlowInterview""" + flowInterviews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowInterviewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowInterviewSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowInterviewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowInterviews to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowInterviewsConnection + + """Collection of Salesforce FlowInterviewShare""" + flowInterviewShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowInterviewShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowInterviewShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowInterviewShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowInterviewShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowInterviewSharesConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Folder""" + folders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFolderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFolderSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFolderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Folders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFoldersConnection + + """Collection of Salesforce ForecastShare""" + forecastShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceForecastShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceForecastShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceForecastShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ForecastShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceForecastSharesConnection + + """Collection of Salesforce GrantedByLicense""" + grantedByLicenses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceGrantedByLicenseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceGrantedByLicenseSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceGrantedByLicenseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of GrantedByLicenses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceGrantedByLicensesConnection + + """Collection of Salesforce Group""" + groups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceGroupConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceGroupSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceGroupSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Groups to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceGroupsConnection + + """Collection of Salesforce GroupMember""" + groupMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceGroupMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceGroupMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceGroupMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of GroupMembers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceGroupMembersConnection + + """Collection of Salesforce Holiday""" + holidays( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceHolidayConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceHolidaySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceHolidaySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Holidays to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceHolidaysConnection + + """Collection of Salesforce Idea""" + ideas( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdeaConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceIdeaSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdeaSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Ideas to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdeasConnection + + """Collection of Salesforce IdeaComment""" + ideaComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdeaCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceIdeaCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdeaCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of IdeaComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdeaCommentsConnection + + """Collection of Salesforce IdpEventLog""" + idpEventLogs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceIdpEventLogConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceIdpEventLogSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceIdpEventLogSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of IdpEventLogs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceIdpEventLogsConnection + + """Collection of Salesforce InstalledMobileApp""" + installedMobileApps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceInstalledMobileAppConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceInstalledMobileAppSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceInstalledMobileAppSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of InstalledMobileApps to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceInstalledMobileAppsConnection + + """Collection of Salesforce KnowledgeableUser""" + knowledgeableUsers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceKnowledgeableUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceKnowledgeableUserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceKnowledgeableUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of KnowledgeableUsers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceKnowledgeableUsersConnection + + """Collection of Salesforce Lead""" + leads( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Leads to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadsConnection + + """Collection of Salesforce LeadCleanInfo""" + leadCleanInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadCleanInfoSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadCleanInfos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadCleanInfosConnection + + """Collection of Salesforce LeadCleanInfo""" + leadCleanInfoReviewers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadCleanInfoSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadCleanInfos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadCleanInfosConnection + + """Collection of Salesforce LeadFeed""" + leadFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadFeedsConnection + + """Collection of Salesforce LeadHistory""" + leadHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadHistorysConnection + + """Collection of Salesforce LeadShare""" + leadShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadSharesConnection + + """Collection of Salesforce LeadStatus""" + leadStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadStatusSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadStatuses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadStatussConnection + + """Collection of Salesforce LightningComponentBundle""" + lightningComponentBundles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLightningComponentBundleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLightningComponentBundleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLightningComponentBundleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of LightningComponentBundles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceLightningComponentBundlesConnection + + """Collection of Salesforce LightningComponentResource""" + lightningComponentResources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLightningComponentResourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLightningComponentResourceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLightningComponentResourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of LightningComponentResources to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceLightningComponentResourcesConnection + + """Collection of Salesforce ListEmail""" + listEmails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListEmailConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceListEmailSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListEmailSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ListEmails to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceListEmailsConnection + + """Collection of Salesforce ListEmailRecipientSource""" + listEmailRecipientSources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListEmailRecipientSourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceListEmailRecipientSourceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListEmailRecipientSourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ListEmailRecipientSources to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceListEmailRecipientSourcesConnection + + """Collection of Salesforce ListEmailShare""" + listEmailShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListEmailShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceListEmailShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListEmailShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ListEmailShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceListEmailSharesConnection + + """Collection of Salesforce ListView""" + listViews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListViewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceListViewSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListViewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ListViews to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceListViewsConnection + + """Collection of Salesforce ListViewChart""" + listViewCharts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceListViewChartConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceListViewChartSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceListViewChartSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ListViewCharts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceListViewChartsConnection + + """Collection of Salesforce LoginGeo""" + loginGeos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLoginGeoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLoginGeoSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLoginGeoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LoginGeos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLoginGeosConnection + + """Collection of Salesforce LoginHistory""" + loginHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLoginHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLoginHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLoginHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LoginHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLoginHistorysConnection + + """Collection of Salesforce LoginIp""" + loginIps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLoginIpConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLoginIpSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLoginIpSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LoginIps to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLoginIpsConnection + + """Collection of Salesforce Macro""" + macros( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMacroConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceMacroSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMacroSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Macros to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMacrosConnection + + """Collection of Salesforce MacroHistory""" + macroHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMacroHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceMacroHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMacroHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of MacroHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMacroHistorysConnection + + """Collection of Salesforce MacroInstruction""" + macroInstructions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMacroInstructionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceMacroInstructionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMacroInstructionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of MacroInstructions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMacroInstructionsConnection + + """Collection of Salesforce MacroShare""" + macroShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMacroShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceMacroShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMacroShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of MacroShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMacroSharesConnection + + """Collection of Salesforce MailmergeTemplate""" + mailmergeTemplates( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMailmergeTemplateConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceMailmergeTemplateSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMailmergeTemplateSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of MailmergeTemplates to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMailmergeTemplatesConnection + + """Collection of Salesforce MatchingRule""" + matchingRules( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMatchingRuleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceMatchingRuleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMatchingRuleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of MatchingRules to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMatchingRulesConnection + + """Collection of Salesforce MatchingRuleItem""" + matchingRuleItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceMatchingRuleItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceMatchingRuleItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceMatchingRuleItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of MatchingRuleItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceMatchingRuleItemsConnection + + """Collection of Salesforce NamedCredential""" + namedCredentials( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNamedCredentialConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceNamedCredentialSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNamedCredentialSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of NamedCredentials to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNamedCredentialsConnection + + """Collection of Salesforce Note""" + notes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceNoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Notes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNotesConnection + + """Collection of Salesforce ObjectPermissions""" + objectPermissionsPlural( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceObjectPermissionsConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceObjectPermissionsSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceObjectPermissionsSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ObjectPermissions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceObjectPermissionssConnection + + """Collection of Salesforce Opportunity""" + opportunities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunitySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Opportunities to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunitysConnection + + """Collection of Salesforce OpportunityCompetitor""" + opportunityCompetitors( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityCompetitorConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityCompetitorSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityCompetitorSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityCompetitors to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityCompetitorsConnection + + """Collection of Salesforce OpportunityContactRole""" + opportunityContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityContactRoles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityContactRolesConnection + + """Collection of Salesforce OpportunityFeed""" + opportunityFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OpportunityFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunityFeedsConnection + + """Collection of Salesforce OpportunityFieldHistory""" + opportunityFieldHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityFieldHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityFieldHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityFieldHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityFieldHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityFieldHistorysConnection + + """Collection of Salesforce OpportunityHistory""" + opportunityHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityHistorysConnection + + """Collection of Salesforce OpportunityLineItem""" + opportunityLineItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityLineItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityLineItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityLineItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityLineItems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityLineItemsConnection + + """Collection of Salesforce OpportunityPartner""" + opportunityPartners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityPartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityPartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityPartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OpportunityPartners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunityPartnersConnection + + """Collection of Salesforce OpportunityShare""" + opportunityShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OpportunityShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunitySharesConnection + + """Collection of Salesforce OpportunityStage""" + opportunityStages( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityStageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityStageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityStageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OpportunityStages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunityStagesConnection + + """Collection of Salesforce Order""" + orders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Orders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrdersConnection + + """Collection of Salesforce OrderFeed""" + orderFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderFeedsConnection + + """Collection of Salesforce OrderHistory""" + orderHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderHistorysConnection + + """Collection of Salesforce OrderItem""" + orderItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemsConnection + + """Collection of Salesforce OrderItemFeed""" + orderItemFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderItemFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderItemFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemFeedsConnection + + """Collection of Salesforce OrderItemHistory""" + orderItemHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderItemHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderItemHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderItemHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderItemHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderItemHistorysConnection + + """Collection of Salesforce OrderShare""" + orderShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrderShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrderSharesConnection + + """Collection of Salesforce OrgDeleteRequest""" + orgDeleteRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrgDeleteRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrgDeleteRequestSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrgDeleteRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OrgDeleteRequests to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrgDeleteRequestsConnection + + """Collection of Salesforce OrgDeleteRequestShare""" + orgDeleteRequestShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrgDeleteRequestShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrgDeleteRequestShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrgDeleteRequestShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OrgDeleteRequestShares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOrgDeleteRequestSharesConnection + + """Collection of Salesforce OrgWideEmailAddress""" + orgWideEmailAddresses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrgWideEmailAddressConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrgWideEmailAddressSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrgWideEmailAddressSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OrgWideEmailAddresses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOrgWideEmailAddresssConnection + + """Collection of Salesforce Organization""" + organizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrganizationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrganizationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrganizationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Organizations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrganizationsConnection + + """Collection of Salesforce Partner""" + partners( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Partners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePartnersConnection + + """Collection of Salesforce PartnerRole""" + partnerRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePartnerRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePartnerRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePartnerRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of PartnerRoles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePartnerRolesConnection + + """Collection of Salesforce PermissionSet""" + permissionSets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePermissionSetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of PermissionSets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePermissionSetsConnection + + """Collection of Salesforce PermissionSetAssignment""" + permissionSetAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePermissionSetAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of PermissionSetAssignments to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePermissionSetAssignmentsConnection + + """Collection of Salesforce PermissionSetLicense""" + permissionSetLicenses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetLicenseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePermissionSetLicenseSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetLicenseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of PermissionSetLicenses to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePermissionSetLicensesConnection + + """Collection of Salesforce PermissionSetLicenseAssign""" + permissionSetLicenseAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetLicenseAssignConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePermissionSetLicenseAssignSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetLicenseAssignSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of PermissionSetLicenseAssigns to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePermissionSetLicenseAssignsConnection + + """Collection of Salesforce PermissionSetLicenseAssign""" + permissionSetLicenseAssigns( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePermissionSetLicenseAssignConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePermissionSetLicenseAssignSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePermissionSetLicenseAssignSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of PermissionSetLicenseAssigns to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePermissionSetLicenseAssignsConnection + + """Collection of Salesforce PlatformCachePartition""" + platformCachePartitions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePlatformCachePartitionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePlatformCachePartitionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePlatformCachePartitionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of PlatformCachePartitions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePlatformCachePartitionsConnection + + """Collection of Salesforce PlatformCachePartitionType""" + platformCachePartitionTypes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePlatformCachePartitionTypeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePlatformCachePartitionTypeSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePlatformCachePartitionTypeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of PlatformCachePartitionTypes to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforcePlatformCachePartitionTypesConnection + + """Collection of Salesforce Pricebook2""" + pricebook2s( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePricebook2ConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePricebook2SortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePricebook2SortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Pricebook2s to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePricebook2sConnection + + """Collection of Salesforce Pricebook2History""" + pricebook2Histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePricebook2HistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePricebook2HistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePricebook2HistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Pricebook2Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePricebook2HistorysConnection + + """Collection of Salesforce PricebookEntry""" + pricebookEntries( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePricebookEntryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePricebookEntrySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePricebookEntrySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of PricebookEntries to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePricebookEntrysConnection + + """Collection of Salesforce ProcessDefinition""" + processDefinitions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessDefinitionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessDefinitionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessDefinitionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessDefinitions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessDefinitionsConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce ProcessInstanceNode""" + processInstanceNodes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceNodeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceNodeSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceNodeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ProcessInstanceNodes to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceProcessInstanceNodesConnection + + """Collection of Salesforce ProcessInstanceStep""" + processInstanceSteps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceStepConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceStepSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceStepSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ProcessInstanceSteps to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceProcessInstanceStepsConnection + + """Collection of Salesforce ProcessInstanceWorkitem""" + processInstanceWorkitems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceWorkitemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceWorkitemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceWorkitemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ProcessInstanceWorkitems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceProcessInstanceWorkitemsConnection + + """Collection of Salesforce Product2""" + product2s( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProduct2ConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProduct2SortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProduct2SortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Product2s to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProduct2sConnection + + """Collection of Salesforce Product2Feed""" + product2Feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProduct2FeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProduct2FeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProduct2FeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Product2Feeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProduct2FeedsConnection + + """Collection of Salesforce Product2History""" + product2Histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProduct2HistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProduct2HistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProduct2HistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Product2Histories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProduct2HistorysConnection + + """Collection of Salesforce Profile""" + profiles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProfileConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProfileSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProfileSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Profiles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProfilesConnection + + """Collection of Salesforce PushTopic""" + pushTopics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePushTopicConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePushTopicSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePushTopicSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of PushTopics to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePushTopicsConnection + + """Collection of Salesforce QueueSobject""" + queueSobjects( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceQueueSobjectConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceQueueSobjectSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceQueueSobjectSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of QueueSobjects to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceQueueSobjectsConnection + + """Collection of Salesforce QuickText""" + quickTexts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceQuickTextConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceQuickTextSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceQuickTextSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of QuickTexts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceQuickTextsConnection + + """Collection of Salesforce QuickTextHistory""" + quickTextHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceQuickTextHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceQuickTextHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceQuickTextHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of QuickTextHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceQuickTextHistorysConnection + + """Collection of Salesforce QuickTextShare""" + quickTextShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceQuickTextShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceQuickTextShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceQuickTextShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of QuickTextShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceQuickTextSharesConnection + + """Collection of Salesforce RecordType""" + recordTypes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceRecordTypeConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceRecordTypeSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceRecordTypeSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of RecordTypes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceRecordTypesConnection + + """Collection of Salesforce Report""" + reports( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceReportConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceReportSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceReportSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Reports to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceReportsConnection + + """Collection of Salesforce ReportFeed""" + reportFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceReportFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceReportFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceReportFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ReportFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceReportFeedsConnection + + """Collection of Salesforce SamlSsoConfig""" + samlSsoConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSamlSsoConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSamlSsoConfigSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSamlSsoConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SamlSsoConfigs to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSamlSsoConfigsConnection + + """Collection of Salesforce Scontrol""" + scontrols( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceScontrolConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceScontrolSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceScontrolSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Scontrols to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceScontrolsConnection + + """Collection of Salesforce SearchActivity""" + searchActivities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSearchActivityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSearchActivitySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSearchActivitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SearchActivities to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSearchActivitysConnection + + """Collection of Salesforce SearchPromotionRule""" + searchPromotionRules( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSearchPromotionRuleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSearchPromotionRuleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSearchPromotionRuleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of SearchPromotionRules to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSearchPromotionRulesConnection + + """Collection of Salesforce SecureAgent""" + secureAgents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecureAgentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSecureAgentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecureAgentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SecureAgents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSecureAgentsConnection + + """Collection of Salesforce SecureAgentPlugin""" + secureAgentPlugins( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecureAgentPluginConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSecureAgentPluginSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecureAgentPluginSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SecureAgentPlugins to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSecureAgentPluginsConnection + + """Collection of Salesforce SecureAgentPluginProperty""" + secureAgentPluginProperties( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecureAgentPluginPropertyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSecureAgentPluginPropertySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecureAgentPluginPropertySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of SecureAgentPluginProperties to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSecureAgentPluginPropertysConnection + + """Collection of Salesforce SecureAgentsCluster""" + secureAgentsClusters( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecureAgentsClusterConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSecureAgentsClusterSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecureAgentsClusterSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of SecureAgentsClusters to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSecureAgentsClustersConnection + + """Collection of Salesforce SecurityCustomBaseline""" + securityCustomBaselines( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSecurityCustomBaselineConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSecurityCustomBaselineSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSecurityCustomBaselineSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of SecurityCustomBaselines to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSecurityCustomBaselinesConnection + + """Collection of Salesforce SessionPermSetActivation""" + sessionPermSetActivations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSessionPermSetActivationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSessionPermSetActivationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSessionPermSetActivationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of SessionPermSetActivations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceSessionPermSetActivationsConnection + + """Collection of Salesforce SetupAuditTrail""" + setupAuditTrails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSetupAuditTrailConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSetupAuditTrailSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSetupAuditTrailSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SetupAuditTrails to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSetupAuditTrailsConnection + + """Collection of Salesforce Site""" + userSites( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSiteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSiteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSiteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Sites to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSitesConnection + + """Collection of Salesforce Site""" + sites( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSiteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSiteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSiteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Sites to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSitesConnection + + """Collection of Salesforce SiteFeed""" + siteFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSiteFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSiteFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSiteFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SiteFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSiteFeedsConnection + + """Collection of Salesforce SiteHistory""" + siteHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSiteHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSiteHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSiteHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SiteHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSiteHistorysConnection + + """Collection of Salesforce Solution""" + solutions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSolutionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSolutionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSolutionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Solutions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSolutionsConnection + + """Collection of Salesforce SolutionFeed""" + solutionFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSolutionFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSolutionFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSolutionFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SolutionFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSolutionFeedsConnection + + """Collection of Salesforce SolutionHistory""" + solutionHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSolutionHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSolutionHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSolutionHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SolutionHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSolutionHistorysConnection + + """Collection of Salesforce SolutionStatus""" + solutionStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceSolutionStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceSolutionStatusSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceSolutionStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of SolutionStatuses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceSolutionStatussConnection + + """Collection of Salesforce Stamp""" + stamps( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStampConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceStampSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStampSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Stamps to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceStampsConnection + + """Collection of Salesforce StampAssignment""" + stampAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStampAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceStampAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStampAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of StampAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceStampAssignmentsConnection + + """Collection of Salesforce StaticResource""" + staticResources( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStaticResourceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceStaticResourceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStaticResourceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of StaticResources to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceStaticResourcesConnection + + """Collection of Salesforce StreamingChannel""" + streamingChannels( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStreamingChannelConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceStreamingChannelSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStreamingChannelSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of StreamingChannels to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceStreamingChannelsConnection + + """Collection of Salesforce StreamingChannelShare""" + streamingChannelShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceStreamingChannelShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceStreamingChannelShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceStreamingChannelShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of StreamingChannelShares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceStreamingChannelSharesConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TaskFeed""" + taskFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TaskFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTaskFeedsConnection + + """Collection of Salesforce TaskPriority""" + taskPriorities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskPriorityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskPrioritySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskPrioritySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TaskPriorities to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTaskPrioritysConnection + + """Collection of Salesforce TaskStatus""" + taskStatuses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskStatusConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskStatusSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskStatusSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TaskStatuses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTaskStatussConnection + + """Collection of Salesforce TenantUsageEntitlement""" + tenantUsageEntitlements( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTenantUsageEntitlementConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTenantUsageEntitlementSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTenantUsageEntitlementSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of TenantUsageEntitlements to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceTenantUsageEntitlementsConnection + + """Collection of Salesforce TestSuiteMembership""" + testSuiteMemberships( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTestSuiteMembershipConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTestSuiteMembershipSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTestSuiteMembershipSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of TestSuiteMemberships to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceTestSuiteMembershipsConnection + + """Collection of Salesforce TodayGoal""" + todayGoals( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTodayGoalConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTodayGoalSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTodayGoalSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TodayGoals to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTodayGoalsConnection + + """Collection of Salesforce TodayGoalShare""" + todayGoalShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTodayGoalShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTodayGoalShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTodayGoalShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TodayGoalShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTodayGoalSharesConnection + + """Collection of Salesforce Topic""" + topics( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Topics to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicsConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + + """Collection of Salesforce TopicFeed""" + topicFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicFeedsConnection + + """Collection of Salesforce TopicUserEvent""" + topicUserEvents( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicUserEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicUserEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicUserEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicUserEvents to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicUserEventsConnection + + """Collection of Salesforce TransactionSecurityPolicy""" + transactionSecurityPolicies( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTransactionSecurityPolicyConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTransactionSecurityPolicySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTransactionSecurityPolicySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of TransactionSecurityPolicies to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceTransactionSecurityPolicysConnection + + """Collection of Salesforce UndecidedEventRelation""" + undecidedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUndecidedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUndecidedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUndecidedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UndecidedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUndecidedEventRelationsConnection + + """Collection of Salesforce User""" + users( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Users to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUsersConnection + + """Collection of Salesforce User""" + delegatedUsers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Users to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUsersConnection + + """Collection of Salesforce User""" + managedUsers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Users to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUsersConnection + + """Collection of Salesforce UserAppInfo""" + userAppInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserAppInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserAppInfoSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserAppInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserAppInfos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserAppInfosConnection + + """Collection of Salesforce UserAppMenuCustomization""" + userAppMenuCustomizations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserAppMenuCustomizationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserAppMenuCustomizationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserAppMenuCustomizationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserAppMenuCustomizations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserAppMenuCustomizationsConnection + + """Collection of Salesforce UserAppMenuCustomizationShare""" + userAppMenuCustomizationShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserAppMenuCustomizationShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserAppMenuCustomizationShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserAppMenuCustomizationShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserAppMenuCustomizationShares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserAppMenuCustomizationSharesConnection + + """Collection of Salesforce UserFeed""" + userFeeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserFeedsConnection + + """Collection of Salesforce UserFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserFeedsConnection + + """Collection of Salesforce UserListView""" + userListViews( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserListViewConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserListViewSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserListViewSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserListViews to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserListViewsConnection + + """Collection of Salesforce UserListViewCriterion""" + userListViewCriterions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserListViewCriterionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserListViewCriterionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserListViewCriterionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserListViewCriterions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserListViewCriterionsConnection + + """Collection of Salesforce UserLogin""" + userLogins( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserLoginConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserLoginSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserLoginSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserLogins to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserLoginsConnection + + """Collection of Salesforce UserPackageLicense""" + userPackageLicenses( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserPackageLicenseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserPackageLicenseSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserPackageLicenseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserPackageLicenses to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserPackageLicensesConnection + + """Collection of Salesforce UserPreference""" + userPreferences( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserPreferenceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserPreferenceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserPreferenceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserPreferences to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserPreferencesConnection + + """Collection of Salesforce UserProvAccount""" + userProvAccounts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvAccountConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvAccountSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvAccountSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserProvAccounts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserProvAccountsConnection + + """Collection of Salesforce UserProvAccountStaging""" + userProvAccountStagings( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvAccountStagingConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvAccountStagingSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvAccountStagingSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvAccountStagings to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvAccountStagingsConnection + + """Collection of Salesforce UserProvMockTarget""" + userProvMockTargets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvMockTargetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvMockTargetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvMockTargetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserProvMockTargets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserProvMockTargetsConnection + + """Collection of Salesforce UserProvisioningConfig""" + userProvisioningConfigs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningConfigConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningConfigSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningConfigSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningConfigs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningConfigsConnection + + """Collection of Salesforce UserProvisioningLog""" + userProvisioningLogs( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningLogConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningLogSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningLogSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningLogs to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningLogsConnection + + """Collection of Salesforce UserProvisioningRequest""" + userProvisioningRequests( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningRequestConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningRequestSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningRequestSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningRequests to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningRequestsConnection + + """Collection of Salesforce UserProvisioningRequestShare""" + userProvisioningRequestShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserProvisioningRequestShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserProvisioningRequestShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserProvisioningRequestShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UserProvisioningRequestShares to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUserProvisioningRequestSharesConnection + + """Collection of Salesforce UserRole""" + userRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserRoles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserRolesConnection + + """Collection of Salesforce UserShare""" + userShares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserSharesConnection + + """Collection of Salesforce UserShare""" + shares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserSharesConnection + + """Collection of Salesforce VerificationHistory""" + verificationHistories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVerificationHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceVerificationHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVerificationHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of VerificationHistories to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceVerificationHistorysConnection + + """Collection of Salesforce Vote""" + votes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceVoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceVoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceVoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Votes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceVotesConnection + + """Collection of Salesforce WaveCompatibilityCheckItem""" + waveCompatibilityCheckItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceWaveCompatibilityCheckItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceWaveCompatibilityCheckItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceWaveCompatibilityCheckItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of WaveCompatibilityCheckItems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceWaveCompatibilityCheckItemsConnection + + """Collection of Salesforce WebLink""" + webLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceWebLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceWebLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceWebLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of WebLinks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceWebLinksConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Address for a salesforce object""" +type SalesforceAddress { + """ + Accuracy level of the geocode for the address. For example, this field is known as MailingGeocodeAccuracy on Contact. + """ + accuracy: String + + """ + The city detail for the address. For example, this field is known as MailingCity on Contact. + """ + city: String + + """ + The country detail for the address. For example, this field is known as MailingCountry on Contact. + """ + country: String + + """ + The ISO country code for the address. For example, this field is known as MailingCountryCode on Contact. CountryCode is always available on compound address fields, whether or not state and country picklists are enabled in your organization. + """ + countryCode: String + + """ + Used with Longitude to specify the precise geolocation of the address. For example, this field is known as MailingLatitude on Contact. + """ + latitude: Float + + """ + Used with Latitude to specify the precise geolocation of the address. For example, this field is known as MailingLongitude on Contact. + """ + longitude: Float + + """ + The postal code for the address. For example, this field is known as MailingPostalCode on Contact. + """ + postalCode: String + + """ + The state detail for the address. For example, this field is known as MailingState on Contact. + """ + state: String + + """ + The ISO state code for the address. For example, this field is known as MailingStateCode on Contact. StateCode is always available on compound address fields, whether or not state and country picklists are enabled in your organization. + """ + stateCode: String + + """ + The street detail for the address. For example, this field is known as MailingStreet on Contact. + """ + street: String +} + +"""Contact""" +type SalesforceContact implements OneGraphNode { + """Linked Stripe customer""" + stripeCustomer: StripeCustomer + + """Linked Intercom user""" + intercomUser: IntercomUser + + """Linked Zendesk user""" + zendeskUser: ZendeskUser + + """Contact ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Master Record ID""" + masterRecordId: String + + """Master Record ID""" + masterRecord: SalesforceContact + + """Account ID""" + accountId: String + + """Account ID""" + account: SalesforceAccount + + """Last Name""" + lastName: String! + + """First Name""" + firstName: String + + """Salutation""" + salutation: String + + """Full Name""" + name: String! + + """Other Street""" + otherStreet: String + + """Other City""" + otherCity: String + + """Other State/Province""" + otherState: String + + """Other Zip/Postal Code""" + otherPostalCode: String + + """Other Country""" + otherCountry: String + + """Other Latitude""" + otherLatitude: Float + + """Other Longitude""" + otherLongitude: Float + + """Other Geocode Accuracy""" + otherGeocodeAccuracy: String + + """Other Address""" + otherAddress: SalesforceAddress + + """Mailing Street""" + mailingStreet: String + + """Mailing City""" + mailingCity: String + + """Mailing State/Province""" + mailingState: String + + """Mailing Zip/Postal Code""" + mailingPostalCode: String + + """Mailing Country""" + mailingCountry: String + + """Mailing Latitude""" + mailingLatitude: Float + + """Mailing Longitude""" + mailingLongitude: Float + + """Mailing Geocode Accuracy""" + mailingGeocodeAccuracy: String + + """Mailing Address""" + mailingAddress: SalesforceAddress + + """Business Phone""" + phone: String + + """Business Fax""" + fax: String + + """Mobile Phone""" + mobilePhone: String + + """Home Phone""" + homePhone: String + + """Other Phone""" + otherPhone: String + + """Asst. Phone""" + assistantPhone: String + + """Reports To ID""" + reportsToId: String + + """Reports To ID""" + reportsTo: SalesforceContact + + """Email""" + email: String + + """Title""" + title: String + + """Department""" + department: String + + """Assistant's Name""" + assistantName: String + + """Lead Source""" + leadSource: String + + """Birthdate""" + birthdate: String + + """Contact Description""" + description: String + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Activity""" + lastActivityDate: String + + """Last Stay-in-Touch Request Date""" + lastCuRequestDate: String + + """Last Stay-in-Touch Save Date""" + lastCuUpdateDate: String + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Email Bounced Reason""" + emailBouncedReason: String + + """Email Bounced Date""" + emailBouncedDate: String + + """Is Email Bounced""" + isEmailBounced: Boolean! + + """Photo URL""" + photoUrl: String + + """Data.com Key""" + jigsaw: String + + """Jigsaw Contact ID""" + jigsawContactId: String + + """Clean Status""" + cleanStatus: String + + """Collection of Salesforce AcceptedEventRelation""" + acceptedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAcceptedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAcceptedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAcceptedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of AcceptedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAcceptedEventRelationsConnection + + """Collection of Salesforce AccountContactRole""" + accountContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountContactRoles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountContactRolesConnection + + """Collection of Salesforce Asset""" + assets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Assets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetsConnection + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce CampaignMember""" + campaignMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignMembers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignMembersConnection + + """Collection of Salesforce Case""" + cases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Cases to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCasesConnection + + """Collection of Salesforce CaseContactRole""" + caseContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseContactRoles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseContactRolesConnection + + """Collection of Salesforce CaseTeamMember""" + caseTeamMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseTeamMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseTeamMembers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseTeamMembersConnection + + """Collection of Salesforce CaseTeamTemplateMember""" + caseTeamTemplateMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamTemplateMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseTeamTemplateMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamTemplateMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CaseTeamTemplateMembers to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCaseTeamTemplateMembersConnection + + """Collection of Salesforce CollaborationGroupRecord""" + recordAssociatedGroups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupRecords to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupRecordsConnection + + """Collection of Salesforce Contact""" + contacts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contacts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactsConnection + + """Collection of Salesforce ContactCleanInfo""" + contactCleanInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactCleanInfoSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContactCleanInfos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactCleanInfosConnection + + """Collection of Salesforce ContactFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContactFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactFeedsConnection + + """Collection of Salesforce ContactHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContactHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactHistorysConnection + + """Collection of Salesforce ContactShare""" + shares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContactShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactSharesConnection + + """Collection of Salesforce ContentDistribution""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce Contract""" + contractsSigned( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contracts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractsConnection + + """Collection of Salesforce ContractContactRole""" + contractContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContractContactRoles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContractContactRolesConnection + + """Collection of Salesforce DeclinedEventRelation""" + declinedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDeclinedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDeclinedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDeclinedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DeclinedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDeclinedEventRelationsConnection + + """Collection of Salesforce DuplicateRecordItem""" + duplicateRecordItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDuplicateRecordItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDuplicateRecordItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDuplicateRecordItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DuplicateRecordItems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDuplicateRecordItemsConnection + + """Collection of Salesforce EmailMessageRelation""" + emailMessageRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of EmailMessageRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceEmailMessageRelationsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce EventRelation""" + eventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EventRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventRelationsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Lead""" + leads( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Leads to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadsConnection + + """Collection of Salesforce Note""" + notes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceNoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Notes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNotesConnection + + """Collection of Salesforce OpportunityContactRole""" + opportunityContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of OpportunityContactRoles to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceOpportunityContactRolesConnection + + """Collection of Salesforce Order""" + orders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Orders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrdersConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + + """Collection of Salesforce UndecidedEventRelation""" + undecidedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUndecidedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUndecidedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUndecidedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UndecidedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUndecidedEventRelationsConnection + + """Collection of Salesforce User""" + users( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Users to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUsersConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +type ZendeskUser { + """Linked Stripe customer""" + stripeCustomer: StripeCustomer + + """Linked Salesforce Lead""" + salesforceLead: SalesforceLead + + """Linked Salesforce Contact""" + salesforceContact: SalesforceContact + + """Linked Salesforce Account""" + salesforceAccount: SalesforceAccount + + """Linked Intercom user""" + intercomUser: IntercomUser + + """""" + id: String + + """""" + email: String + + """""" + name: String! + + """""" + createdAt: String + + """""" + locale: String + + """""" + localeId: Int + + """""" + organizationId: Int + + """""" + phone: String + + """""" + sharedPhoneNumber: Boolean + + """""" + role: String + + """""" + timeZone: String + + """""" + updatedAt: String + + """""" + url: String + + """""" + verified: Boolean + requestedTickets(sortOrder: ZendeskSearchSortOrder, sortBy: ZendeskTicketsSortBy, last: Int, first: Int, before: String, after: String): ZendeskTicketsConnection + ccdTickets(sortOrder: ZendeskSearchSortOrder, sortBy: ZendeskTicketsSortBy, last: Int, first: Int, before: String, after: String): ZendeskTicketsConnection + assignedTickets(sortOrder: ZendeskSearchSortOrder, sortBy: ZendeskTicketsSortBy, last: Int, first: Int, before: String, after: String): ZendeskTicketsConnection +} + +"""Lead""" +type SalesforceLead implements OneGraphNode { + """Linked Stripe customer""" + stripeCustomer: StripeCustomer + + """Linked Intercom user""" + intercomUser: IntercomUser + + """Linked Zendesk user""" + zendeskUser: ZendeskUser + + """Lead ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Master Record ID""" + masterRecordId: String + + """Master Record ID""" + masterRecord: SalesforceLead + + """Last Name""" + lastName: String! + + """First Name""" + firstName: String + + """Salutation""" + salutation: String + + """Full Name""" + name: String! + + """Title""" + title: String + + """Company""" + company: String! + + """Street""" + street: String + + """City""" + city: String + + """State/Province""" + state: String + + """Zip/Postal Code""" + postalCode: String + + """Country""" + country: String + + """Latitude""" + latitude: Float + + """Longitude""" + longitude: Float + + """Geocode Accuracy""" + geocodeAccuracy: String + + """Address""" + address: SalesforceAddress + + """Phone""" + phone: String + + """Mobile Phone""" + mobilePhone: String + + """Fax""" + fax: String + + """Email""" + email: String + + """Website""" + website: String + + """Photo URL""" + photoUrl: String + + """Description""" + description: String + + """Lead Source""" + leadSource: String + + """Status""" + status: String! + + """Industry""" + industry: String + + """Rating""" + rating: String + + """Annual Revenue""" + annualRevenue: Float + + """Employees""" + numberOfEmployees: Int + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceLeadOwnerUnion! + + """Converted""" + isConverted: Boolean! + + """Converted Date""" + convertedDate: String + + """Converted Account ID""" + convertedAccountId: String + + """Converted Account ID""" + convertedAccount: SalesforceAccount + + """Converted Contact ID""" + convertedContactId: String + + """Converted Contact ID""" + convertedContact: SalesforceContact + + """Converted Opportunity ID""" + convertedOpportunityId: String + + """Converted Opportunity ID""" + convertedOpportunity: SalesforceOpportunity + + """Unread By Owner""" + isUnreadByOwner: Boolean! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Activity""" + lastActivityDate: String + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Data.com Key""" + jigsaw: String + + """Jigsaw Contact ID""" + jigsawContactId: String + + """Clean Status""" + cleanStatus: String + + """Company D-U-N-S Number""" + companyDunsNumber: String + + """D&B Company ID""" + dandbCompanyId: String + + """D&B Company ID""" + dandbCompany: SalesforceDandBCompany + + """Email Bounced Reason""" + emailBouncedReason: String + + """Email Bounced Date""" + emailBouncedDate: String + + """Collection of Salesforce AcceptedEventRelation""" + acceptedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAcceptedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAcceptedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAcceptedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of AcceptedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceAcceptedEventRelationsConnection + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce CampaignMember""" + campaignMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCampaignMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCampaignMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCampaignMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CampaignMembers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCampaignMembersConnection + + """Collection of Salesforce CollaborationGroupRecord""" + recordAssociatedGroups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupRecords to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupRecordsConnection + + """Collection of Salesforce ContentDistribution""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce DeclinedEventRelation""" + declinedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDeclinedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDeclinedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDeclinedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DeclinedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDeclinedEventRelationsConnection + + """Collection of Salesforce DuplicateRecordItem""" + duplicateRecordItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDuplicateRecordItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDuplicateRecordItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDuplicateRecordItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DuplicateRecordItems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDuplicateRecordItemsConnection + + """Collection of Salesforce EmailMessageRelation""" + emailMessageRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of EmailMessageRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceEmailMessageRelationsConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce EventRelation""" + eventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EventRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventRelationsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce LeadCleanInfo""" + leadCleanInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadCleanInfoSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadCleanInfos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadCleanInfosConnection + + """Collection of Salesforce LeadFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadFeedsConnection + + """Collection of Salesforce LeadHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadHistorysConnection + + """Collection of Salesforce LeadShare""" + shares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of LeadShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadSharesConnection + + """Collection of Salesforce Note""" + notes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceNoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Notes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNotesConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + + """Collection of Salesforce UndecidedEventRelation""" + undecidedEventRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUndecidedEventRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUndecidedEventRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUndecidedEventRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of UndecidedEventRelations to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceUndecidedEventRelationsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Segment object""" +type IntercomSegment { + """value is segment'""" + type: String + + """The id representing the segment""" + id: String + + """The name of the segment""" + name: String + + """The time the segment was created""" + createdAt: Int + + """The time the segment was updated""" + updatedAt: Int + + """Type of the record: user or lead.""" + personType: String + + """ + The number of items in the user segment. It's returned when include_count=true is included in the request. + """ + count: Int +} + +"""Social profile object""" +type IntercomSocialProfile { + """Value is 'social_profile'""" + type: String + + """The name of the service (e.g., twitter, facebook)""" + name: String + + """User name or handle on the service""" + username: String + + """The user homepage on the service""" + url: String + + """Optional. User ID on the service""" + id: String +} + +"""User-defined company plan""" +type IntercomCompanyPlan { + """Will always be of type 'plan'""" + type: String + + """The plan ID""" + id: String + + """ + The name of the plan, note that this is the only field that can be set via the API. + """ + name: String +} + +"""What field to sort the results by""" +enum IntercomUsersSortByField { + CREATED_AT + UPDATED_AT + LAST_REQUEST_AT + SIGNED_UP_AT +} + +"""Order that items should be sorted""" +enum IntercomSortOrderBy { + ASC + DESC +} + +"""""" +type PageInfo { + """hasNextPage""" + hasNextPage: Boolean! + + """hasPreviousPage""" + hasPreviousPage: Boolean! + + """startCursor""" + startCursor: String + + """endCursor""" + endCursor: String +} + +"""An edge in a connection.""" +type IntercomUserEdge { + """The item at the end of the edge""" + node: IntercomUser! + + """A cursor for use in pagination.""" + cursor: String! +} + +"""Users on Intercom""" +type IntercomUsersConnection { + """Users""" + nodes: [IntercomUser!]! + + """A list of edges""" + edges: [IntercomUserEdge!]! + + """Total number of users.""" + totalCount: Int! + + """Page info""" + pageInfo: PageInfo! +} + +"""Tag object""" +type IntercomTag { + """value is 'tag'""" + type: String + + """The id of the tag""" + id: String + + """The name of the tag""" + name: String + + """Users with this tag.""" + users( + """Limit results to users that were created in that last number of days""" + createdDaysAgo: Int + + """What field to sort the results by. Defaults to CREATED_AT.""" + sortByField: IntercomUsersSortByField + + """Return the users in ascending or descending order. Defaults to DESC.""" + orderBy: IntercomSortOrderBy + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Number of user to fetch, maximum is 60""" + first: Int + ): IntercomUsersConnection +} + +"""Company object""" +type IntercomCompany { + """value is 'company'""" + type: String + + """The Intercom defined id representing the company""" + id: String + + """The time the company was added to Intercom""" + createdAt: Int + + """The time the company was created by you""" + remoteCreatedAt: Int + + """The last time the company was updated""" + updatedAt: Int + + """The time the company last recorded making a request""" + lastRequestAt: Int + + """The company id you have defined for the company""" + companyId: String + + """The name of the company""" + name: String + + """The custom attributes you have set on the company""" + customAttributes: JSON + + """A list of tags associated with the company""" + tags: [IntercomTag!] + + """How many sessions the company has recorded""" + sessionCount: Int + + """How much revenue the company generates for your business""" + monthlySpend: Float + + """The number of users in the company""" + userCount: Int + + """The name of the plan you have associated with the company.""" + plan: IntercomCompanyPlan + + """The number of employees in the company""" + size: Int + + """The URL for the company website""" + website: String + + """The industry that the company operates in""" + industry: String +} + +"""Location object""" +type IntercomLocation { + """Value is 'location_data'""" + type: String + + """Optional. A city name""" + cityName: String + + """Optional. A continent code""" + continentCode: String + + """Optional. An ISO 3166 country code""" + countryCode: String + + """Optional. The country name""" + countryName: String + + """Optional. The latitude""" + latitude: Float + + """Optional. The longitude""" + longitude: Float + + """Optional. A postal code""" + postalCode: String + + """Optional. A region name""" + regionName: String + + """Optional. An ISO 8601 timezone""" + timezone: String +} + +"""Avatar object""" +type IntercomAvatar { + """Value is 'avatar'""" + type: String + + """An avatar image URL. note: the image url needs to be https.""" + imageUrl: String +} + +"""A user on Intercom""" +type IntercomUser implements IntercomAuthor { + """Value is 'user' or 'contact'""" + type: String + + """ + The Intercom defined id representing the user + This value is read only + """ + id: String + + """ + The time (in seconds) the user was added to Intercom + This value is read only + """ + createdAt: Int + + """The time (in seconds) the user signed up""" + signedUpAt: Int + + """ + The last time the user was updated + This value is read only + """ + updatedAt: Int + + """ + The user id you have defined for the user. (Max limit of 255 UTF-8 characters, and should not have trailing or leading spaces) + """ + userId: String + + """ + The email you have defined for the user. (Max limit of 255 UTF-8 characters, and should not have trailing or leading spaces) + """ + email: String + + """The phone number of the user""" + phone: String + + """The custom attributes you have set on the user (case sensitive).""" + customAttributes: JSON + + """The time the user last recorded making a request""" + lastRequestAt: Int + + """ + How many sessions the user has recorded + This value is read only + """ + sessionCount: Int + + """An avatar object for the user.""" + avatar: IntercomAvatar + + """Whether the user is unsubscribed from emails""" + unsubscribedFromEmails: Boolean + + """ + A Location Object relating to the user + To update location data send in a value for last_seen_ip and the IP will be used to populate location data + """ + locationData: IntercomLocation + + """The URL of the page the user was last on""" + referrer: String + + """Identifies which site sent the traffic""" + utmSource: String + + """Identifies what type of link was used""" + utmMedium: String + + """Identifies a specific product promotion or strategic campaign""" + utmCampaign: String + + """Identifies search terms""" + utmTerm: String + + """Identifies what specifically was clicked to bring the user to the site""" + utmContent: String + + """ + Data about the last user agent the user was seen using + + To update this value use last\\_seen\\_user\\_agent + """ + userAgentData: String + + """ + An ip address (e.g. "1.2.3.4") representing the last ip address the user visited your application from. (Used for updating location_data) + """ + lastSeenIp: String + + """ + The pseudonym used if this user was previously a Lead (http://docs.intercom.io/Intercom-for-customer-communication/the-intercom-messenger) + """ + pseudonym: String + + """ + Whether or not this is a Lead. Always false + + This value is read only + """ + anonymous: Boolean + + """A list of companies for the user""" + companies: [IntercomCompany!] + + """ + A list of social profiles associated with the user + + This value is read only + """ + socialProfiles: [IntercomSocialProfile!] + + """A list of segments associated with the user""" + segments: [IntercomSegment!] + + """A list of tags associated with the user""" + tags: [IntercomTag!] + + """The full name of the user""" + name: String + + """The app id of the Intercom app that the user belongs to""" + appId: String + + """Linked Stripe customer""" + stripeCustomer: StripeCustomer + + """Linked Salesforce Lead""" + salesforceLead: SalesforceLead + + """Linked Salesforce Contact""" + salesforceContact: SalesforceContact + + """Linked Salesforce Account""" + salesforceAccount: SalesforceAccount + + """Linked Zendesk user""" + zendeskUser: ZendeskUser + + """Summary of events for this user""" + eventSummary: [IntercomEventSummary!] + + """List of events for this user.""" + events( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Number of events to fetch, defaults to 50""" + first: Int + ): IntercomEventssConnection + + """ + Conversations for this user. + + Conversation are how you can communicate with users in Intercom. + """ + conversations( + """ + When true, retrieves conversation messages in plain text. Defaults to false. + """ + displayAsPlaintext: Boolean + + """Defaults to false. When true, fetches just unread conversations.""" + unread: Boolean + + """What field to sort the results by. Defaults to UPDATED_AT.""" + sortByField: IntercomConversationSortByField + + """ + Return the conversations in ascending or descending order. Defaults to DESC. + """ + orderBy: IntercomSortOrderBy + ): IntercomConversationsConnection +} + +"""Account""" +type SalesforceAccount implements OneGraphNode { + """Linked Stripe customer""" + stripeCustomer: StripeCustomer + + """Linked Intercom user""" + intercomUser: IntercomUser + + """Linked Zendesk user""" + zendeskUser: ZendeskUser + + """Account ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Master Record ID""" + masterRecordId: String + + """Master Record ID""" + masterRecord: SalesforceAccount + + """Account Name""" + name: String! + + """Account Type""" + type: String + + """Parent Account ID""" + parentId: String + + """Parent Account ID""" + parent: SalesforceAccount + + """Billing Street""" + billingStreet: String + + """Billing City""" + billingCity: String + + """Billing State/Province""" + billingState: String + + """Billing Zip/Postal Code""" + billingPostalCode: String + + """Billing Country""" + billingCountry: String + + """Billing Latitude""" + billingLatitude: Float + + """Billing Longitude""" + billingLongitude: Float + + """Billing Geocode Accuracy""" + billingGeocodeAccuracy: String + + """Billing Address""" + billingAddress: SalesforceAddress + + """Shipping Street""" + shippingStreet: String + + """Shipping City""" + shippingCity: String + + """Shipping State/Province""" + shippingState: String + + """Shipping Zip/Postal Code""" + shippingPostalCode: String + + """Shipping Country""" + shippingCountry: String + + """Shipping Latitude""" + shippingLatitude: Float + + """Shipping Longitude""" + shippingLongitude: Float + + """Shipping Geocode Accuracy""" + shippingGeocodeAccuracy: String + + """Shipping Address""" + shippingAddress: SalesforceAddress + + """Account Phone""" + phone: String + + """Account Fax""" + fax: String + + """Account Number""" + accountNumber: String + + """Website""" + website: String + + """Photo URL""" + photoUrl: String + + """SIC Code""" + sic: String + + """Industry""" + industry: String + + """Annual Revenue""" + annualRevenue: Float + + """Employees""" + numberOfEmployees: Int + + """Ownership""" + ownership: String + + """Ticker Symbol""" + tickerSymbol: String + + """Account Description""" + description: String + + """Account Rating""" + rating: String + + """Account Site""" + site: String + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceUser! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Last Activity""" + lastActivityDate: String + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Data.com Key""" + jigsaw: String + + """Jigsaw Company ID""" + jigsawCompanyId: String + + """Clean Status""" + cleanStatus: String + + """Account Source""" + accountSource: String + + """D-U-N-S Number""" + dunsNumber: String + + """Tradestyle""" + tradestyle: String + + """NAICS Code""" + naicsCode: String + + """NAICS Description""" + naicsDesc: String + + """Year Started""" + yearStarted: String + + """SIC Description""" + sicDesc: String + + """D&B Company ID""" + dandbCompanyId: String + + """D&B Company ID""" + dandbCompany: SalesforceDandBCompany + + """Collection of Salesforce Account""" + childAccounts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Accounts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountsConnection + + """Collection of Salesforce AccountCleanInfo""" + accountCleanInfos( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountCleanInfoConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountCleanInfoSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountCleanInfoSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountCleanInfos to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountCleanInfosConnection + + """Collection of Salesforce AccountContactRole""" + accountContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountContactRoles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountContactRolesConnection + + """Collection of Salesforce AccountFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountFeedsConnection + + """Collection of Salesforce AccountHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountHistorysConnection + + """Collection of Salesforce AccountPartner""" + accountPartnersFrom( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountPartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountPartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountPartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountPartners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountPartnersConnection + + """Collection of Salesforce AccountPartner""" + accountPartnersTo( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountPartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountPartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountPartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountPartners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountPartnersConnection + + """Collection of Salesforce AccountShare""" + shares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAccountShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAccountShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAccountShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of AccountShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAccountSharesConnection + + """Collection of Salesforce Asset""" + assets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Assets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetsConnection + + """Collection of Salesforce Asset""" + providedAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Assets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetsConnection + + """Collection of Salesforce Asset""" + servicedAssets( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAssetConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAssetSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAssetSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Assets to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAssetsConnection + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce Case""" + cases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Cases to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCasesConnection + + """Collection of Salesforce CollaborationGroupRecord""" + recordAssociatedGroups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupRecords to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupRecordsConnection + + """Collection of Salesforce Contact""" + contacts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContactConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContactSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContactSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contacts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContactsConnection + + """Collection of Salesforce ContentDistribution""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce Contract""" + contracts( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContractConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContractSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContractSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Contracts to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContractsConnection + + """Collection of Salesforce DuplicateRecordItem""" + duplicateRecordItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceDuplicateRecordItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceDuplicateRecordItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceDuplicateRecordItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of DuplicateRecordItems to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceDuplicateRecordItemsConnection + + """Collection of Salesforce EmailMessage""" + emails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce Lead""" + leads( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceLeadConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceLeadSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceLeadSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Leads to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceLeadsConnection + + """Collection of Salesforce Note""" + notes( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceNoteConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceNoteSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceNoteSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Notes to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceNotesConnection + + """Collection of Salesforce Opportunity""" + opportunities( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunitySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunitySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Opportunities to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunitysConnection + + """Collection of Salesforce OpportunityPartner""" + opportunityPartnersTo( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOpportunityPartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOpportunityPartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOpportunityPartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of OpportunityPartners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOpportunityPartnersConnection + + """Collection of Salesforce Order""" + orders( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceOrderConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceOrderSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceOrderSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Orders to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceOrdersConnection + + """Collection of Salesforce Partner""" + partnersFrom( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Partners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePartnersConnection + + """Collection of Salesforce Partner""" + partnersTo( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforcePartnerConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforcePartnerSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforcePartnerSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Partners to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforcePartnersConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + + """Collection of Salesforce User""" + users( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Users to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUsersConnection + + """Collection of Salesforce UserRole""" + userRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceUserRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceUserRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceUserRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of UserRoles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceUserRolesConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""""" +type StripeCustomer { + """Linked Salesforce Account""" + salesforceAccount: SalesforceAccount + + """Linked Salesforce Contact""" + salesforceContact: SalesforceContact + + """Linked Salesforce Lead""" + salesforceLead: SalesforceLead + + """Linked Intercom user""" + intercomUser: IntercomUser + + """Linked Zendesk user""" + zendeskUser: ZendeskUser + + """The customer's payment sources, if any.""" + sources: StripeCustomerSources! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeCustomerObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + Current balance, if any, being stored on the customer. If negative, the customer has credit to apply to their next invoice. If positive, the customer has an amount owed that will be added to their next invoice. The balance does not refer to any unpaid invoices; it solely takes into account amounts that have yet to be successfully applied to any invoice. This balance is only taken into account as invoices are finalized. + """ + balance: Int + + """ + Describes the current discount active on the customer, if there is one. + """ + discount: StripeDiscount + + """The customer's preferred locales (languages), ordered by preference.""" + preferredLocales: [String!] + + """The customer's tax IDs.""" + taxIds: StripeCustomerTaxIds + + """ + Three-letter [ISO code for the currency](https://stripe.com/docs/currencies) the customer can be charged in for recurring billing purposes. + """ + currency: String + + """ + When the customer's latest invoice is billed by charging automatically, delinquent is true if the invoice's latest charge is failed. When the customer's latest invoice is billed by sending an invoice, delinquent is true if the invoice is not paid by its due date. + """ + delinquent: Boolean + + """The prefix for the customer used to generate unique invoice numbers.""" + invoicePrefix: String + + """Unique identifier for the object.""" + id: String! + + """The customer's email address.""" + email: String + + """ID of the default payment source for the customer.""" + defaultSource: StripeCustomerDefaultSourceUnion + + """The customer's full name or business name.""" + name: String + + """ + Describes the status of looking up the tax ID provided in `tax_info`. This field has been deprecated and will be removed in a future API version, for further information view the [migration guide](https://stripe.com/docs/billing/migration/taxes#moving-from-taxinfo-to-customer-tax-ids). + """ + taxInfoVerification: StripeTaxInfoVerification + + """The customer's address.""" + address: StripeAddress + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """The customer's phone number.""" + phone: String + + """ + Mailing and shipping address for the customer. Appears on invoices emailed to this customer. + """ + shipping: StripeShipping + + """ + The customer's tax information. Appears on invoices emailed to this customer. This field has been deprecated and will be removed in a future API version, for further information view the [migration guide](https://stripe.com/docs/billing/migration/taxes#moving-from-taxinfo-to-customer-tax-ids). + """ + taxInfo: StripeTaxInfo + + """ + Describes the customer's tax exemption status. One of `none`, `exempt`, or `reverse`. When set to `reverse`, invoice and receipt PDFs include the text **"Reverse charge"**. + """ + taxExempt: StripeCustomerTaxExemptEnum + + """""" + invoiceSettings: StripeInvoiceSettingCustomerSetting + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String + + """The customer's current subscriptions, if any.""" + subscriptions: StripeCustomerSubscriptions + accountBalance: Int @deprecated(reason: "Use `balance` field") + charges(after: String, before: String, first: Int): StripeChargesConnection + invoices(after: String, before: String, first: Int): StripeInvoicesConnection + paymentIntents(after: String, before: String, first: Int): StripePaymentIntentsConnection +} + +"""""" +type StripePaymentMethodDetailsCardPresentReceipt { + """EMV tag 9F26, cryptogram generated by the integrated circuit chip.""" + applicationCryptogram: String + + """Mnenomic of the Application Identifier.""" + applicationPreferredName: String + + """Identifier for this transaction.""" + authorizationCode: String + + """EMV tag 8A. A code returned by the card issuer.""" + authorizationResponseCode: String + + """How the cardholder verified ownership of the card.""" + cardholderVerificationMethod: String + + """ + EMV tag 84. Similar to the application identifier stored on the integrated circuit chip. + """ + dedicatedFileName: String + + """The outcome of a series of EMV functions performed by the card reader.""" + terminalVerificationResults: String + + """ + An indication of various EMV functions performed during the transaction. + """ + transactionStatusInformation: String +} + +"""""" +type StripePaymentMethodDetailsCardPresent { + """Four-digit number representing the card's expiration year.""" + expYear: Int + + """The last four digits of the card.""" + last4: String + + """ + How were card details read in this transaction. Can be contact_emv, contactless_emv, magnetic_stripe_fallback, magnetic_stripe_track2, or contactless_magstripe_mode + """ + readMethod: String + + """ + Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected. + """ + country: String + + """ + Card brand. Can be `amex`, `diners`, `discover`, `jcb`, `mastercard`, `unionpay`, `visa`, or `unknown`. + """ + brand: String + + """ + Uniquely identifies this particular card number. You can use this attribute to check whether two customers who've signed up with you are using the same card number, for example. + """ + fingerprint: String + + """Authorization response cryptogram.""" + emvAuthData: String + + """ + A collection of fields required to be displayed on receipts. Only required for EMV transactions. + """ + receipt: StripePaymentMethodDetailsCardPresentReceipt + + """Two-digit number representing the card's expiration month.""" + expMonth: Int + + """ + ID of a card PaymentMethod generated from the card_present PaymentMethod that may be attached to a Customer for future transactions. Only present if it was possible to generate a card PaymentMethod. + """ + generatedCard: String + + """Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.""" + funding: String +} + +"""""" +type StripePaymentMethodDetailsP24 { + """Unique reference for this Przelewy24 payment.""" + reference: String + + """ + Owner's verified full name. Values are verified or provided by Przelewy24 directly + (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + verifiedName: String +} + +"""""" +type StripePaymentMethodDetailsMultibanco { + """Entity number associated with this Multibanco payment.""" + entity: String + + """Reference number associated with this Multibanco payment.""" + reference: String +} + +enum StripePaymentMethodDetailsBancontactPreferredLanguageEnum { + de + en + fr + nl +} + +"""""" +type StripePaymentMethodDetailsBancontact { + """Bank code of bank associated with the bank account.""" + bankCode: String + + """Name of the bank associated with the bank account.""" + bankName: String + + """Bank Identifier Code of the bank associated with the bank account.""" + bic: String + + """Last four characters of the IBAN.""" + ibanLast4: String + + """ + Preferred language of the Bancontact authorization page that the customer is redirected to. + Can be one of `en`, `de`, `fr`, or `nl` + """ + preferredLanguage: StripePaymentMethodDetailsBancontactPreferredLanguageEnum + + """ + Owner's verified full name. Values are verified or provided by Bancontact directly + (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + verifiedName: String +} + +"""""" +type StripePaymentMethodDetailsCardChecks { + """ + If a address line1 was provided, results of the check, one of 'pass', 'failed', 'unavailable' or 'unchecked'. + """ + addressLine1Check: String + + """ + If a address postal code was provided, results of the check, one of 'pass', 'failed', 'unavailable' or 'unchecked'. + """ + addressPostalCodeCheck: String + + """ + If a CVC was provided, results of the check, one of 'pass', 'failed', 'unavailable' or 'unchecked'. + """ + cvcCheck: String +} + +"""""" +type StripePaymentMethodDetailsCardWalletVisaCheckout { + """ + Owner's verified billing address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + billingAddress: StripeAddress + + """ + Owner's verified email. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + email: String + + """ + Owner's verified full name. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + name: String + + """ + Owner's verified shipping address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + shippingAddress: StripeAddress +} + +enum StripePaymentMethodDetailsCardWalletTypeEnum { + amex_express_checkout + apple_pay + google_pay + masterpass + samsung_pay + visa_checkout +} + +"""""" +type StripePaymentMethodDetailsCardWalletMasterpass { + """ + Owner's verified billing address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + billingAddress: StripeAddress + + """ + Owner's verified email. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + email: String + + """ + Owner's verified full name. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + name: String + + """ + Owner's verified shipping address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + shippingAddress: StripeAddress +} + +"""""" +type StripePaymentMethodDetailsCardWallet { + """ + (For tokenized numbers only.) The last four digits of the device account number. + """ + dynamicLast4: String + + """""" + masterpass: StripePaymentMethodDetailsCardWalletMasterpass + + """ + The type of the card wallet, one of `amex_express_checkout`, `apple_pay`, `google_pay`, `masterpass`, `samsung_pay`, or `visa_checkout`. An additional hash is included on the Wallet subhash with a name matching this value. It contains additional information specific to the card wallet type. + """ + type: StripePaymentMethodDetailsCardWalletTypeEnum! + + """""" + visaCheckout: StripePaymentMethodDetailsCardWalletVisaCheckout +} + +"""""" +type StripeThreeDSecureDetails { + """ + Whether or not authentication was performed. 3D Secure will succeed without authentication when the card is not enrolled. + """ + authenticated: Boolean! + + """Whether or not 3D Secure succeeded.""" + succeeded: Boolean! + + """The version of 3D Secure that was used for this payment.""" + version: String! +} + +"""""" +type StripePaymentMethodDetailsCard { + """Four-digit number representing the card's expiration year.""" + expYear: Int + + """Populated if this transaction used 3D Secure authentication.""" + threeDSecure: StripeThreeDSecureDetails + + """The last four digits of the card.""" + last4: String + + """ + Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected. + """ + country: String + + """ + If this Card is part of a card wallet, this contains the details of the card wallet. + """ + wallet: StripePaymentMethodDetailsCardWallet + + """ + Card brand. Can be `amex`, `diners`, `discover`, `jcb`, `mastercard`, `unionpay`, `visa`, or `unknown`. + """ + brand: String + + """ + Check results by Card networks on Card address and CVC at time of payment. + """ + checks: StripePaymentMethodDetailsCardChecks + + """ + Uniquely identifies this particular card number. You can use this attribute to check whether two customers who've signed up with you are using the same card number, for example. + """ + fingerprint: String + + """Two-digit number representing the card's expiration month.""" + expMonth: Int + + """Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.""" + funding: String +} + +"""""" +type StripePaymentMethodDetailsAchCreditTransfer { + """Account number to transfer funds to.""" + accountNumber: String + + """Name of the bank associated with the routing number.""" + bankName: String + + """Routing transit number for the bank account to transfer funds to.""" + routingNumber: String + + """SWIFT code of the bank associated with the routing number.""" + swiftCode: String +} + +enum StripePaymentMethodDetailsAchDebitAccountHolderTypeEnum { + company + individual +} + +"""""" +type StripePaymentMethodDetailsAchDebit { + """ + Type of entity that holds the account. This can be either `individual` or `company`. + """ + accountHolderType: StripePaymentMethodDetailsAchDebitAccountHolderTypeEnum + + """Name of the bank associated with the bank account.""" + bankName: String + + """ + Two-letter ISO code representing the country the bank account is located in. + """ + country: String + + """ + Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same. + """ + fingerprint: String + + """Last four digits of the bank account number.""" + last4: String + + """Routing transit number of the bank account.""" + routingNumber: String +} + +"""""" +type StripePaymentMethodDetailsSofort { + """Bank code of bank associated with the bank account.""" + bankCode: String + + """Name of the bank associated with the bank account.""" + bankName: String + + """Bank Identifier Code of the bank associated with the bank account.""" + bic: String + + """ + Two-letter ISO code representing the country the bank account is located in. + """ + country: String + + """Last four characters of the IBAN.""" + ibanLast4: String + + """ + Owner's verified full name. Values are verified or provided by SOFORT directly + (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + verifiedName: String +} + +"""""" +type StripePaymentMethodDetailsSepaDebit { + """Bank code of bank associated with the bank account.""" + bankCode: String + + """Branch code of bank associated with the bank account.""" + branchCode: String + + """ + Two-letter ISO code representing the country the bank account is located in. + """ + country: String + + """ + Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same. + """ + fingerprint: String + + """Last four characters of the IBAN.""" + last4: String + + """ID of the mandate used to make this payment.""" + mandate: String +} + +"""""" +type StripePaymentMethodDetailsEps { + """ + Owner's verified full name. Values are verified or provided by EPS directly + (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + verifiedName: String +} + +"""""" +type StripePaymentMethodDetailsGiropay { + """Bank code of bank associated with the bank account.""" + bankCode: String + + """Name of the bank associated with the bank account.""" + bankName: String + + """Bank Identifier Code of the bank associated with the bank account.""" + bic: String + + """ + Owner's verified full name. Values are verified or provided by Giropay directly + (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + verifiedName: String +} + +enum StripePaymentMethodDetailsIdealBicEnum { + ABNANL2A + ASNBNL21 + BUNQNL2A + FVLBNL22 + HANDNL2A + INGBNL2A + KNABNL2H + MOYONL21 + RABONL2U + RBRBNL21 + SNSBNL2A + TRIONL2U +} + +enum StripePaymentMethodDetailsIdealBankEnum { + abn_amro + asn_bank + bunq + handelsbanken + ing + knab + moneyou + rabobank + regiobank + sns_bank + triodos_bank + van_lanschot +} + +"""""" +type StripePaymentMethodDetailsIdeal { + """ + The customer's bank. Can be one of `abn_amro`, `asn_bank`, `bunq`, `handelsbanken`, `ing`, `knab`, `moneyou`, `rabobank`, `regiobank`, `sns_bank`, `triodos_bank`, or `van_lanschot`. + """ + bank: StripePaymentMethodDetailsIdealBankEnum + + """The Bank Identifier Code of the customer's bank.""" + bic: StripePaymentMethodDetailsIdealBicEnum + + """Last four characters of the IBAN.""" + ibanLast4: String + + """ + Owner's verified full name. Values are verified or provided by iDEAL directly + (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + verifiedName: String +} + +"""""" +type StripePaymentMethodDetails { + """""" + ideal: StripePaymentMethodDetailsIdeal + + """""" + giropay: StripePaymentMethodDetailsGiropay + + """""" + eps: StripePaymentMethodDetailsEps + + """""" + sepaDebit: StripePaymentMethodDetailsSepaDebit + + """""" + sofort: StripePaymentMethodDetailsSofort + + """""" + achDebit: StripePaymentMethodDetailsAchDebit + + """""" + achCreditTransfer: StripePaymentMethodDetailsAchCreditTransfer + + """ + The type of transaction-specific details of the payment method used in the payment, one of `ach_credit_transfer`, `ach_debit`, `alipay`, `bancontact`, `card`, `card_present`, `eps`, `giropay`, `ideal`, `klarna`, `multibanco`, `p24`, `sepa_debit`, `sofort`, `stripe_account`, or `wechat`. + An additional hash is included on `payment_method_details` with a name matching this value. + It contains information specific to the payment method. + """ + type: String! + + """""" + card: StripePaymentMethodDetailsCard + + """""" + bancontact: StripePaymentMethodDetailsBancontact + + """""" + multibanco: StripePaymentMethodDetailsMultibanco + + """""" + p24: StripePaymentMethodDetailsP24 + + """""" + cardPresent: StripePaymentMethodDetailsCardPresent +} + +"""""" +type StripePaymentMethodCardGeneratedCard { + """The charge that created this object.""" + charge: String + + """ + Transaction-specific details of the payment method used in the payment. + """ + paymentMethodDetails: StripePaymentMethodDetails +} + +"""""" +type StripePaymentMethodCardChecks { + """ + If a address line1 was provided, results of the check, one of 'pass', 'failed', 'unavailable' or 'unchecked'. + """ + addressLine1Check: String + + """ + If a address postal code was provided, results of the check, one of 'pass', 'failed', 'unavailable' or 'unchecked'. + """ + addressPostalCodeCheck: String + + """ + If a CVC was provided, results of the check, one of 'pass', 'failed', 'unavailable' or 'unchecked'. + """ + cvcCheck: String +} + +"""""" +type StripeThreeDSecureUsage { + """Whether 3D Secure is supported on this card.""" + supported: Boolean! +} + +"""""" +type StripePaymentMethodCardWalletVisaCheckout { + """ + Owner's verified billing address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + billingAddress: StripeAddress + + """ + Owner's verified email. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + email: String + + """ + Owner's verified full name. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + name: String + + """ + Owner's verified shipping address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + shippingAddress: StripeAddress +} + +enum StripePaymentMethodCardWalletTypeEnum { + amex_express_checkout + apple_pay + google_pay + masterpass + samsung_pay + visa_checkout +} + +"""""" +type StripePaymentMethodCardWalletMasterpass { + """ + Owner's verified billing address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + billingAddress: StripeAddress + + """ + Owner's verified email. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + email: String + + """ + Owner's verified full name. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + name: String + + """ + Owner's verified shipping address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated. + """ + shippingAddress: StripeAddress +} + +"""""" +type StripePaymentMethodCardWallet { + """ + (For tokenized numbers only.) The last four digits of the device account number. + """ + dynamicLast4: String + + """""" + masterpass: StripePaymentMethodCardWalletMasterpass + + """ + The type of the card wallet, one of `amex_express_checkout`, `apple_pay`, `google_pay`, `masterpass`, `samsung_pay`, or `visa_checkout`. An additional hash is included on the Wallet subhash with a name matching this value. It contains additional information specific to the card wallet type. + """ + type: StripePaymentMethodCardWalletTypeEnum! + + """""" + visaCheckout: StripePaymentMethodCardWalletVisaCheckout +} + +"""""" +type StripePaymentMethodCard { + """Four-digit number representing the card's expiration year.""" + expYear: Int! + + """The last four digits of the card.""" + last4: String! + + """ + Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected. + """ + country: String + + """ + If this Card is part of a card wallet, this contains the details of the card wallet. + """ + wallet: StripePaymentMethodCardWallet + + """ + Card brand. Can be `amex`, `diners`, `discover`, `jcb`, `mastercard`, `unionpay`, `visa`, or `unknown`. + """ + brand: String! + + """ + Contains details on how this Card maybe be used for 3D Secure authentication. + """ + threeDSecureUsage: StripeThreeDSecureUsage + + """Checks on Card address and CVC if provided.""" + checks: StripePaymentMethodCardChecks + + """ + Uniquely identifies this particular card number. You can use this attribute to check whether two customers who've signed up with you are using the same card number, for example. + """ + fingerprint: String + + """Details of the original PaymentMethod that created this object.""" + generatedFrom: StripePaymentMethodCardGeneratedCard + + """Two-digit number representing the card's expiration month.""" + expMonth: Int! + + """Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.""" + funding: String! +} + +enum StripePaymentMethodTypeEnum { + card + card_present +} + +enum StripePaymentMethodObjectEnum { + payment_method +} + +"""""" +type StripePaymentMethod { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripePaymentMethodObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """Unique identifier for the object.""" + id: String! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + The type of the PaymentMethod. An additional hash is included on the PaymentMethod with a name matching this value. It contains additional information specific to the PaymentMethod type. + """ + type: StripePaymentMethodTypeEnum! + + """""" + card: StripePaymentMethodCard + + """ + The ID of the Customer to which this PaymentMethod is saved. This will not be set when the PaymentMethod has not been saved to a Customer. + """ + customer: StripeCustomer + + """""" + billingDetails: StripeBillingDetails! +} + +"""""" +type StripeInvoiceItemThresholdReason { + """The IDs of the line items that triggered the threshold invoice.""" + lineItemIds: [String!]! + + """The quantity threshold boundary that applied to the given line item.""" + usageGte: Int! +} + +"""""" +type StripeInvoiceThresholdReason { + """ + The total invoice amount threshold boundary if it triggered the threshold invoice. + """ + amountGte: Int + + """Indicates which line items triggered a threshold invoice.""" + itemReasons: [StripeInvoiceItemThresholdReason!]! +} + +enum StripeInvoiceObjectEnum { + invoice +} + +enum StripeInvoiceBillingReasonEnum { + automatic_pending_invoice_item_invoice + manual + subscription + subscription_create + subscription_cycle + subscription_threshold + subscription_update + upcoming +} + +"""""" +type StripeAddress { + """City/District/Suburb/Town/Village.""" + city: String + + """2-letter country code.""" + country: String + + """Address line 1 (Street address/PO Box/Company name).""" + line1: String + + """Address line 2 (Apartment/Suite/Unit/Building).""" + line2: String + + """ZIP or postal code.""" + postalCode: String + + """State/County/Province/Region.""" + state: String +} + +"""""" +type StripeShipping { + """""" + address: StripeAddress + + """ + The delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc. + """ + carrier: String + + """Recipient name.""" + name: String + + """Recipient phone (including extension).""" + phone: String + + """ + The tracking number for a physical product, obtained from the delivery service. If multiple tracking numbers were generated for this purchase, please separate them with commas. + """ + trackingNumber: String +} + +"""""" +type StripeInvoice { + """Total after discounts and taxes.""" + total: Int! + + """ + The customer's shipping information. Until the invoice is finalized, this field will equal `customer.shipping`. Once the invoice is finalized, this field will no longer be updated. + """ + customerShipping: StripeShipping + + """ + Indicates the reason why the invoice was created. `subscription_cycle` indicates an invoice created by a subscription advancing into a new period. `subscription_create` indicates an invoice created due to creating a subscription. `subscription_update` indicates an invoice created due to updating a subscription. `subscription` is set for all old invoices to indicate either a change to a subscription or a period advancement. `manual` is set for all invoices unrelated to a subscription (for example: created via the invoice editor). The `upcoming` value is reserved for simulated invoices per the upcoming invoice endpoint. `subscription_threshold` indicates an invoice created due to a billing threshold being reached. + """ + billingReason: StripeInvoiceBillingReasonEnum + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeInvoiceObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """""" + thresholdReason: StripeInvoiceThresholdReason + + """ + The date on which payment for this invoice is due. This value will be `null` for invoices where `collection_method=charge_automatically`. + """ + dueDate: Int + + """ + ID of the default payment method for the invoice. It must belong to the customer associated with the invoice. If not set, defaults to the subscription's default payment method, if any, or to the default payment method in the customer's invoice settings. + """ + defaultPaymentMethod: StripePaymentMethod + + """ + The PaymentIntent associated with this invoice. The PaymentIntent is generated when the invoice is finalized, and can then be used to pay the invoice. Note that voiding an invoice will cancel the PaymentIntent. + """ + paymentIntent: StripePaymentIntent + + """ + Only set for upcoming invoices that preview prorations. The time used to calculate prorations. + """ + subscriptionProrationDate: Int + + """ + Controls whether Stripe will perform [automatic collection](https://stripe.com/docs/billing/invoices/workflow/#auto_advance) of the invoice. When `false`, the invoice's state will not automatically advance without an explicit action. + """ + autoAdvance: Boolean + + """The amount remaining, in %s, that is due.""" + amountRemaining: Int! + + """""" + discount: StripeDiscount + + """ + This is the transaction number that appears on email receipts sent for this invoice. + """ + receiptNumber: String + + """ + The individual line items that make up the invoice. `lines` is sorted as follows: invoice items in reverse chronological order, followed by the subscription, if any. + """ + lines: StripeInvoiceLines! + + """ + Whether payment was successfully collected for this invoice. An invoice can be paid (most commonly) with a charge or with credit from the customer's account balance. + """ + paid: Boolean! + + """ + The customer's email. Until the invoice is finalized, this field will equal `customer.email`. Once the invoice is finalized, this field will no longer be updated. + """ + customerEmail: String + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ + The public name of the business associated with this invoice, most often the business creating the invoice. + """ + accountName: String + + """ + The URL for the hosted invoice page, which allows customers to view and pay an invoice. If the invoice has not been finalized yet, this will be null. + """ + hostedInvoiceUrl: String + + """The amount, in %s, that was paid.""" + amountPaid: Int! + + """""" + statusTransitions: StripeInvoicesStatusTransitions! + + """ + The time at which webhooks for this invoice were successfully delivered (if the invoice had no webhooks to deliver, this will match `created`). Invoice payment is delayed until webhooks are delivered, or until all webhook delivery attempts have been exhausted. + """ + webhooksDeliveredAt: Int + + """ + Start of the usage period during which invoice items were added to this invoice. + """ + periodStart: Int! + + """Unique identifier for the object.""" + id: String + + """Footer displayed on the invoice.""" + footer: String + + """ + The customer's tax IDs. Until the invoice is finalized, this field will contain the same tax IDs as `customer.tax_ids`. Once the invoice is finalized, this field will no longer be updated. + """ + customerTaxIds: [StripeInvoicesResourceInvoiceTaxId!] + + """ + ID of the default payment source for the invoice. It must belong to the customer associated with the invoice and be in a chargeable state. If not set, defaults to the subscription's default source, if any, or to the customer's default source. + """ + defaultSource: StripeInvoiceDefaultSourceUnion + + """ + The link to download the PDF for the invoice. If the invoice has not been finalized yet, this will be null. + """ + invoicePdf: String + + """ID of the latest charge generated for this invoice, if any.""" + charge: StripeCharge + + """ + Whether an attempt has been made to pay the invoice. An invoice is not attempted until 1 hour after the `invoice.created` webhook, for example, so you might not want to display that invoice as unpaid to your users. + """ + attempted: Boolean! + + """ + End of the usage period during which invoice items were added to this invoice. + """ + periodEnd: Int! + + """ + The customer's address. Until the invoice is finalized, this field will equal `customer.address`. Once the invoice is finalized, this field will no longer be updated. + """ + customerAddress: StripeAddress + + """ + Final amount due at this time for this invoice. If the invoice's total is smaller than the minimum charge amount, for example, or if there is account credit that can be applied to the invoice, the `amount_due` may be 0. If there is a positive `starting_balance` for the invoice (the customer owes money), the `amount_due` will also take that into account. The charge that gets generated for the invoice will be for the amount specified in `amount_due`. + """ + amountDue: Int! + + """ + The status of the invoice, one of `draft`, `open`, `paid`, `uncollectible`, or `void`. [Learn more](https://stripe.com/docs/billing/invoices/workflow#workflow-overview) + """ + status: StripeInvoiceStatusEnum + + """Custom fields displayed on the invoice.""" + customFields: [StripeInvoiceSettingCustomField!] + + """The subscription that this invoice was prepared for, if any.""" + subscription: StripeSubscription + + """ + Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay this invoice using the default source attached to the customer. When sending an invoice, Stripe will email this invoice to the customer with payment instructions. + """ + collectionMethod: StripeInvoiceCollectionMethodEnum + + """ + A unique, identifying string that appears on emails sent to the customer for this invoice. This starts with the customer's unique invoice_prefix if it is specified. + """ + number: String + + """ + Starting customer balance before the invoice is finalized. If the invoice has not been finalized yet, this will be the current customer balance. + """ + startingBalance: Int! + + """The tax rates applied to this invoice, if any.""" + defaultTaxRates: [StripeTaxRate!] + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String + + """ + The country of the business associated with this invoice, most often the business creating the invoice. + """ + accountCountry: String + + """ + The customer's phone number. Until the invoice is finalized, this field will equal `customer.phone`. Once the invoice is finalized, this field will no longer be updated. + """ + customerPhone: String + + """ + Ending customer balance after the invoice is finalized. Invoices are finalized approximately an hour after successful webhook delivery or when payment collection is attempted for the invoice. If the invoice has not been finalized yet, this will be null. + """ + endingBalance: Int + + """Total amount of all post-payment credit notes issued for this invoice.""" + postPaymentCreditNotesAmount: Int! + + """ + Extra information about an invoice for the customer's credit card statement. + """ + statementDescriptor: String + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + Total of all subscriptions, invoice items, and prorations on the invoice before any discount or tax is applied. + """ + subtotal: Int! + + """Total amount of all pre-payment credit notes issued for this invoice.""" + prePaymentCreditNotesAmount: Int! + + """ + The customer's name. Until the invoice is finalized, this field will equal `customer.name`. Once the invoice is finalized, this field will no longer be updated. + """ + customerName: String + + """ + Number of payment attempts made for this invoice, from the perspective of the payment retry schedule. Any payment attempt counts as the first attempt, and subsequently only automatic retries increment the attempt count. In other words, manual payment attempts after the first attempt do not affect the retry schedule. + """ + attemptCount: Int! + + """The aggregate amounts calculated per tax rate for all line items.""" + totalTaxAmounts: [StripeInvoiceTaxAmount!] + + """ + The amount of tax on this invoice. This is the sum of all the tax amounts on this invoice. + """ + tax: Int + + """ + The customer's tax exempt status. Until the invoice is finalized, this field will equal `customer.tax_exempt`. Once the invoice is finalized, this field will no longer be updated. + """ + customerTaxExempt: StripeInvoiceCustomerTaxExemptEnum + + """""" + customer: StripeInvoiceCustomerUnion! + + """ + The fee in %s that will be applied to the invoice and transferred to the application owner's Stripe account when the invoice is paid. + """ + applicationFeeAmount: Int + + """ + An arbitrary string attached to the object. Often useful for displaying to users. Referenced as 'memo' in the Dashboard. + """ + description: String + + """ + This percentage of the subtotal has been added to the total amount of the invoice, including invoice line items and discounts. This field is inherited from the subscription's `tax_percent` field, but can be changed before the invoice is paid. This field defaults to null. + """ + taxPercent: Float + + """ + The time at which payment will next be attempted. This value will be `null` for invoices where `collection_method=send_invoice`. + """ + nextPaymentAttempt: Int +} + +"""""" +type StripeTransferData { + """ + A positive integer representing how much to charge in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal) (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or [equivalent in charge currency](https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts). The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99). + """ + amount: Int + + """ + The account (if any) the payment will be attributed to for tax + reporting, and where funds from the payment will be transferred to upon + payment success. + """ + destination: StripeAccount! +} + +enum StripePaymentIntentPaymentMethodOptionsCardRequestThreeDSecureEnum { + any + automatic + challenge_only +} + +"""""" +type StripePaymentIntentPaymentMethodOptionsCard { + """ + We strongly recommend that you rely on our SCA Engine to automatically prompt your customers for authentication based on risk level and [other requirements](https://stripe.com/docs/strong-customer-authentication). However, if you wish to request 3D Secure based on logic from your own fraud engine, provide this option. Permitted values include: `automatic` or `any`. If not provided, defaults to `automatic`. Read our guide on [manually requesting 3D Secure](https://stripe.com/docs/payments/3d-secure#manual-three-ds) for more information on how this configuration interacts with Radar and our SCA Engine. + """ + requestThreeDSecure: StripePaymentIntentPaymentMethodOptionsCardRequestThreeDSecureEnum +} + +"""""" +type StripePaymentIntentPaymentMethodOptions { + """""" + card: StripePaymentIntentPaymentMethodOptionsCard +} + +enum StripePaymentIntentObjectEnum { + payment_intent +} + +"""""" +type StripePaymentIntent { + """ + The account (if any) for which the funds of the PaymentIntent are intended. See the PaymentIntents [use case for connected accounts](https://stripe.com/docs/payments/payment-intents/use-cases#connected-accounts) for details. + """ + onBehalfOf: StripeAccount + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripePaymentIntentObjectEnum! + + """ + Email address that the receipt for the resulting payment will be sent to. + """ + receiptEmail: String + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """Payment-method-specific configuration for this PaymentIntent.""" + paymentMethodOptions: StripePaymentIntentPaymentMethodOptions + + """ + A string that identifies the resulting payment as part of a group. See the PaymentIntents [use case for connected accounts](https://stripe.com/docs/payments/payment-intents/use-cases#connected-accounts) for details. + """ + transferGroup: String + + """ + The data with which to automatically create a Transfer when the payment is finalized. See the PaymentIntents [use case for connected accounts](https://stripe.com/docs/payments/payment-intents/use-cases#connected-accounts) for details. + """ + transferData: StripeTransferData + + """ID of the review associated with this PaymentIntent, if any.""" + review: StripeReview + + """ + Provides information about a card payment that customers see on their statements. Concatenated with the prefix (shortened descriptor) or statement descriptor that’s set on the account to form the complete statement descriptor. Maximum 22 characters for the concatenated descriptor. + """ + statementDescriptorSuffix: String + + """Amount that can be captured from this PaymentIntent.""" + amountCapturable: Int + + """ID of the invoice that created this PaymentIntent, if it exists.""" + invoice: StripeInvoice + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ID of the payment method used in this PaymentIntent.""" + paymentMethod: StripePaymentMethod + + """Unique identifier for the object.""" + id: String! + + """Charges that were created by this PaymentIntent, if any.""" + charges: StripePaymentIntentCharges + + """ + The list of payment method types (e.g. card) that this PaymentIntent is allowed to use. + """ + paymentMethodTypes: [String!]! + + """ + One of `automatic` (default) or `manual`. + + When the confirmation method is `automatic`, a PaymentIntent can be confirmed using a publishable key. After `next_action`s are handled, no additional confirmation is required to complete the payment. + + When the confirmation method is `manual`, all payment attempts must be made using a secret key. The PaymentIntent returns to the `requires_confirmation` state after handling `next_action`s, and requires your server to initiate each payment attempt with an explicit confirmation. + + Learn more about the different [confirmation flows](https://stripe.com/docs/payments/payment-intents/use-cases#one-time-payments). + """ + confirmationMethod: StripePaymentIntentConfirmationMethodEnum! + + """ID of the Connect application that created the PaymentIntent.""" + application: StripeApplication + + """ + Status of this PaymentIntent, one of `requires_payment_method`, `requires_confirmation`, `requires_action`, `processing`, `requires_capture`, `canceled`, or `succeeded`. Read more about each PaymentIntent [status](https://stripe.com/docs/payments/intents#intent-statuses). + """ + status: StripePaymentIntentStatusEnum! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. For more information, see the [documentation](https://stripe.com/docs/payments/payment-intents/creating-payment-intents#storing-information-in-metadata). + """ + metadata: String + + """ + One of `automatic` (default) or `manual`. + + When the capture method is `automatic`, Stripe automatically captures funds when the customer authorizes the payment. + + Change `capture_method` to manual if you wish to [separate authorization and capture](https://stripe.com/docs/payments/payment-intents/creating-payment-intents#separate-authorization-and-capture) for payment methods that support this. + """ + captureMethod: StripePaymentIntentCaptureMethodEnum! + + """ + Reason for cancellation of this PaymentIntent, either user-provided (`duplicate`, `fraudulent`, `requested_by_customer`, or `abandoned`) or generated by Stripe internally (`failed_invoice`, `void_invoice`, or `automatic`). + """ + cancellationReason: StripePaymentIntentCancellationReasonEnum + + """ + For non-card charges, you can use this value as the complete description that appears on your customers’ statements. Must contain at least one letter, maximum 22 characters. + """ + statementDescriptor: String + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """Amount intended to be collected by this PaymentIntent.""" + amount: Int! + + """Shipping information for this PaymentIntent.""" + shipping: StripeShipping + + """ + ID of the Customer this PaymentIntent belongs to, if one exists. + + If present, payment methods used with this PaymentIntent can only be attached to this Customer, and payment methods attached to other Customers cannot be used with this PaymentIntent. + """ + customer: StripePaymentIntentCustomerUnion + + """ + The client secret of this PaymentIntent. Used for client-side retrieval using a publishable key. + + The client secret can be used to complete a payment from your frontend. It should not be stored, logged, embedded in URLs, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret. + + Please refer to our [quickstart guide](https://stripe.com/docs/payments/payment-intents/web) to learn about how `client_secret` should be handled. + """ + clientSecret: String + + """Amount that was collected by this PaymentIntent.""" + amountReceived: Int + + """ + The amount of the application fee (if any) for the resulting payment. See the PaymentIntents [use case for connected accounts](https://stripe.com/docs/payments/payment-intents/use-cases#connected-accounts) for details. + """ + applicationFeeAmount: Int + + """ + The payment error encountered in the previous PaymentIntent confirmation. + """ + lastPaymentError: StripeApiErrors + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String + + """ + Indicates that you intend to make future payments with this PaymentIntent's payment method. + + If present, the payment method used with this PaymentIntent can be [attached](https://stripe.com/docs/api/payment_methods/attach) to a Customer, even after the transaction completes. + + Use `on_session` if you intend to only reuse the payment method when your customer is present in your checkout flow. Use `off_session` if your customer may or may not be in your checkout flow. See [Saving card details after a payment](https://stripe.com/docs/payments/cards/saving-cards-after-payment) to learn more. + + Stripe uses `setup_future_usage` to dynamically optimize your payment flow and comply with regional legislation and network rules. For example, if your customer is impacted by [SCA](https://stripe.com/docs/strong-customer-authentication), using `off_session` will ensure that they are authenticated while processing this PaymentIntent. You will then be able to collect [off-session payments](https://stripe.com/docs/payments/cards/charging-saved-cards#off-session-payments-with-saved-cards) for this customer. + """ + setupFutureUsage: String + + """ + Populated when `status` is `canceled`, this is the time at which the PaymentIntent was canceled. Measured in seconds since the Unix epoch. + """ + canceledAt: Int +} + +enum StripeReviewObjectEnum { + review +} + +enum StripeReviewClosedReasonEnum { + approved + disputed + refunded + refunded_as_fraud +} + +"""""" +type StripeReview { + """ + The reason the review was closed, or null if it has not yet been closed. One of `approved`, `refunded`, `refunded_as_fraud`, or `disputed`. + """ + closedReason: StripeReviewClosedReasonEnum + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeReviewObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """The PaymentIntent ID associated with this review, if one exists.""" + paymentIntent: StripePaymentIntent + + """The reason the review was opened. One of `rule` or `manual`.""" + openedReason: StripeReviewOpenedReasonEnum! + + """ + Information related to the location of the payment. Note that this information is an approximation and attempts to locate the nearest population center - it should not be used to determine a specific address. + """ + ipAddressLocation: StripeRadarReviewResourceLocation + + """Unique identifier for the object.""" + id: String! + + """The charge associated with this review.""" + charge: StripeCharge + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """The ZIP or postal code of the card used, if applicable.""" + billingZip: String + + """ + The reason the review is currently open or closed. One of `rule`, `manual`, `approved`, `refunded`, `refunded_as_fraud`, or `disputed`. + """ + reason: String! + + """ + Information related to the browsing session of the user who initiated the payment. + """ + session: StripeRadarReviewResourceSession + + """The IP address where the payment originated.""" + ipAddress: String + + """If `true`, the review needs action.""" + open: Boolean! +} + +"""""" +type StripeChargeTransferData { + """ + The amount transferred to the destination account, if specified. By default, the entire charge amount is transferred to the destination account. + """ + amount: Int + + """ + ID of an existing, connected Stripe account to transfer funds to if `transfer_data` was specified in the charge request. + """ + destination: StripeAccount! +} + +enum StripeChargeObjectEnum { + charge +} + +"""""" +type StripeCharge { + """ + The account (if any) the charge was made on behalf of without triggering an automatic transfer. See the [Connect documentation](https://stripe.com/docs/connect/charges-transfers) for details. + """ + onBehalfOf: StripeAccount + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeChargeObjectEnum! + + """ + This is the email address that the receipt for this charge was sent to. + """ + receiptEmail: String + + """ + ID of the balance transaction that describes the impact of this charge on your account balance (not including refunds or disputes). + """ + balanceTransaction: StripeBalanceTransaction + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ID of the PaymentIntent associated with this charge, if one exists.""" + paymentIntent: String + + """ + A string that identifies this transaction as part of a group. See the [Connect documentation](https://stripe.com/docs/connect/charges-transfers#grouping-transactions) for details. + """ + transferGroup: String + + """ + This is the transaction number that appears on email receipts sent for this charge. This attribute will be `null` until a receipt has been sent. + """ + receiptNumber: String + + """ + An optional dictionary including the account to automatically transfer to as part of a destination charge. [See the Connect documentation](https://stripe.com/docs/connect/destination-charges) for details. + """ + transferData: StripeChargeTransferData + + """ID of the review associated with this charge if one exists.""" + review: StripeReview + + """ + Provides information about the charge that customers see on their statements. Concatenated with the prefix (shortened descriptor) or statement descriptor that’s set on the account to form the complete statement descriptor. Maximum 22 characters for the concatenated descriptor. + """ + statementDescriptorSuffix: String + + """ + `true` if the charge succeeded, or was successfully authorized for later capture. + """ + paid: Boolean! + + """ID of the invoice this charge is for if one exists.""" + invoice: StripeInvoice + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ID of the payment method used in this charge.""" + paymentMethod: String + + """ + This is the URL to view the receipt for this charge. The receipt is kept up-to-date to the latest state of the charge, including any refunds. If the charge is for an Invoice, the receipt will be stylized as an Invoice receipt. + """ + receiptUrl: String! + + """ + Error code explaining reason for charge failure if available (see [the errors section](https://stripe.com/docs/api#errors) for a list of codes). + """ + failureCode: String + + """Unique identifier for the object.""" + id: String! + + """ + Message to user further explaining reason for charge failure if available. + """ + failureMessage: String + + """Details about the payment method at the time of the transaction.""" + paymentMethodDetails: StripePaymentMethodDetails + + """ + The application fee (if any) for the charge. [See the Connect documentation](https://stripe.com/docs/connect/direct-charges#collecting-fees) for details. + """ + applicationFee: StripeApplicationFee + + """ID of the Connect application that created the charge.""" + application: StripeApplication + + """ + The status of the payment is either `succeeded`, `pending`, or `failed`. + """ + status: String! + + """Details about the dispute if the charge has been disputed.""" + dispute: StripeDispute + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ + ID of the transfer to the `destination` account (only applicable if the charge was created using the `destination` parameter). + """ + transfer: StripeTransfer + + """ + If the charge was created without capturing, this Boolean represents whether it is still uncaptured or has since been captured. + """ + captured: Boolean! + + """ID of the order this charge is for if one exists.""" + order: StripeOrder + + """ + Whether the charge has been fully refunded. If the charge is only partially refunded, this attribute will still be false. + """ + refunded: Boolean! + + """ + For card charges, use `statement_descriptor_suffix` instead. Otherwise, you can use this value as the complete description of a charge on your customers’ statements. Must contain at least one letter, maximum 22 characters. + """ + statementDescriptor: String + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """ + A positive integer representing how much to charge in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal) (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or [equivalent in charge currency](https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts). The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99). + """ + amount: Int! + + """ + Amount in %s refunded (can be less than the amount attribute on the charge if a partial refund was issued). + """ + amountRefunded: Int! + + """Shipping information for the charge.""" + shipping: StripeShipping + + """ + The transfer ID which created this charge. Only present if the charge came from another Stripe account. [See the Connect documentation](https://stripe.com/docs/connect/destination-charges) for details. + """ + sourceTransfer: StripeTransfer + + """ID of the customer this charge is for if one exists.""" + customer: StripeChargeCustomerUnion + + """""" + billingDetails: StripeBillingDetails! + + """ + The amount of the application fee (if any) for the charge. [See the Connect documentation](https://stripe.com/docs/connect/direct-charges#collecting-fees) for details. + """ + applicationFeeAmount: Int + + """ + Details about whether the payment was accepted, and why. See [understanding declines](https://stripe.com/docs/declines) for details. + """ + outcome: StripeChargeOutcome + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String + refunds(after: String, before: String, first: Int): StripeRefundsConnection +} + +enum StripeTransferReversalsObjectEnum { + list +} + +"""""" +type StripeTransferReversals { + """""" + data: [StripeTransferReversal!]! + + """ + True if this list has another page of items after this one that can be fetched. + """ + hasMore: Boolean! + + """ + String representing the object's type. Objects of the same type share the same value. Always has the value `list`. + """ + object: StripeTransferReversalsObjectEnum! + + """The URL where this list can be accessed.""" + url: String! +} + +enum StripeTransferObjectEnum { + transfer +} + +"""""" +type StripeTransfer { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeTransferObjectEnum! + + """ + Balance transaction that describes the impact of this transfer on your account balance. + """ + balanceTransaction: StripeBalanceTransaction + + """Time that this record of the transfer was first created.""" + created: Int! + + """ + Whether the transfer has been fully reversed. If the transfer is only partially reversed, this attribute will still be false. + """ + reversed: Boolean! + + """ + A string that identifies this transaction as part of a group. See the [Connect documentation](https://stripe.com/docs/connect/charges-transfers#grouping-transactions) for details. + """ + transferGroup: String + + """ID of the Stripe account the transfer was sent to.""" + destination: StripeAccount + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """ + The source balance this transfer came from. One of `card` or `bank_account`. + """ + sourceType: String + + """Unique identifier for the object.""" + id: String! + + """A list of reversals that have been applied to the transfer.""" + reversals: StripeTransferReversals! + + """ + ID of the charge or payment that was used to fund the transfer. If null, the transfer was funded from the available balance. + """ + sourceTransaction: StripeCharge + + """ + A set of key-value pairs that you can attach to a transfer object. It can be useful for storing additional information about the transfer in a structured format. + """ + metadata: String! + + """ + If the destination is a Stripe account, this will be the ID of the payment that the destination account received for the transfer. + """ + destinationPayment: StripeCharge + + """ + Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode. + """ + livemode: Boolean! + + """Amount in %s to be transferred.""" + amount: Int! + + """ + Amount in %s reversed (can be less than the amount attribute on the transfer if a partial reversal was issued). + """ + amountReversed: Int! + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String +} + +enum StripeTransferReversalObjectEnum { + transfer_reversal +} + +"""""" +type StripeTransferReversal { + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeTransferReversalObjectEnum! + + """Balance transaction that describes the impact on your account balance.""" + balanceTransaction: StripeBalanceTransaction + + """Linked payment refund for the transfer reversal.""" + destinationPaymentRefund: StripeRefund + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ID of the refund responsible for the transfer reversal.""" + sourceRefund: StripeRefund + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """Unique identifier for the object.""" + id: String! + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """ID of the transfer that was reversed.""" + transfer: StripeTransfer! + + """Amount, in %s.""" + amount: Int! +} + +union StripeBalanceTransactionSourceUnion = StripeTransferReversal | StripeTransfer | StripeTopup | StripeTaxDeductedAtSource | StripeReserveTransaction | StripeRefund | StripePlatformTaxFee | StripePayout | StripeIssuingTransaction | StripeIssuingAuthorization | StripeFeeRefund | StripeDispute | StripeConnectCollectionTransfer | StripeCharge | StripeApplicationFee + +enum StripeBalanceTransactionObjectEnum { + balance_transaction +} + +"""""" +type StripeBalanceTransaction { + """ + The date the transaction's net funds will become available in the Stripe balance. + """ + availableOn: Int! + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeBalanceTransactionObjectEnum! + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """Unique identifier for the object.""" + id: String! + + """Net amount of the transaction, in %s.""" + net: Int! + + """ + If the transaction's net funds are available in the Stripe balance yet. Either `available` or `pending`. + """ + status: String! + + """""" + exchangeRate: Float + + """Fees (in %s) paid for this transaction.""" + fee: Int! + + """The Stripe object to which this transaction is related.""" + source: StripeBalanceTransactionSourceUnion + + """ + Transaction type: `adjustment`, `advance`, `advance_funding`, `application_fee`, `application_fee_refund`, `charge`, `connect_collection_transfer`, `issuing_authorization_hold`, `issuing_authorization_release`, `issuing_transaction`, `payment`, `payment_failure_refund`, `payment_refund`, `payout`, `payout_cancel`, `payout_failure`, `refund`, `refund_failure`, `reserve_transaction`, `reserved_funds`, `stripe_fee`, `stripe_fx_fee`, `tax_fee`, `topup`, `topup_reversal`, `transfer`, `transfer_cancel`, `transfer_failure`, or `transfer_refund`. [Learn more](https://stripe.com/docs/reports/balance-transaction-types) about balance transaction types and what they represent. + """ + type: StripeBalanceTransactionTypeEnum! + + """Gross amount of the transaction, in %s.""" + amount: Int! + + """Detailed breakdown of fees (in %s) paid for this transaction.""" + feeDetails: [StripeFee!]! + + """ + An arbitrary string attached to the object. Often useful for displaying to users. + """ + description: String +} + +enum StripeRefundObjectEnum { + refund +} + +"""""" +type StripeRefund { + """Linked Salesforce Case""" + salesforceCase: SalesforceCase + + """ + String representing the object's type. Objects of the same type share the same value. + """ + object: StripeRefundObjectEnum! + + """Balance transaction that describes the impact on your account balance.""" + balanceTransaction: StripeBalanceTransaction + + """ + Time at which the object was created. Measured in seconds since the Unix epoch. + """ + created: Int! + + """ + If the refund failed, the reason for refund failure if known. Possible values are `lost_or_stolen_card`, `expired_or_canceled_card`, or `unknown`. + """ + failureReason: String + + """ + This is the transaction number that appears on email receipts sent for this refund. + """ + receiptNumber: String + + """ + Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). + """ + currency: String! + + """Unique identifier for the object.""" + id: String! + + """ID of the charge that was refunded.""" + charge: StripeCharge + + """ + The transfer reversal that is associated with the refund. Only present if the charge came from another Stripe account. See the Connect documentation for details. + """ + sourceTransferReversal: StripeTransferReversal + + """ + Status of the refund. For credit card refunds, this can be `pending`, `succeeded`, or `failed`. For other types of refunds, it can be `pending`, `succeeded`, `failed`, or `canceled`. Refer to our [refunds](https://stripe.com/docs/refunds#failed-refunds) documentation for more details. + """ + status: String + + """ + If the accompanying transfer was reversed, the transfer reversal object. Only applicable if the charge was created using the destination parameter. + """ + transferReversal: StripeTransferReversal + + """ + Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + """ + metadata: String! + + """Amount, in %s.""" + amount: Int! + + """ + Reason for the refund. If set, possible values are `duplicate`, `fraudulent`, and `requested_by_customer`. + """ + reason: String + + """ + If the refund failed, this balance transaction describes the adjustment made on your account balance that reverses the initial balance transaction. + """ + failureBalanceTransaction: StripeBalanceTransaction + + """ + An arbitrary string attached to the object. Often useful for displaying to users. (Available on non-card refunds only) + """ + description: String +} + +"""Case""" +type SalesforceCase implements OneGraphNode { + """Linked Stripe refund""" + stripeRefund: StripeRefund + + """Linked Github Issue""" + gitHubIssue: GitHubIssue + + """Case ID""" + id: String! + + """Deleted""" + isDeleted: Boolean! + + """Case Number""" + caseNumber: String! + + """Contact ID""" + contactId: String + + """Contact ID""" + contact: SalesforceContact + + """Account ID""" + accountId: String + + """Account ID""" + account: SalesforceAccount + + """Asset ID""" + assetId: String + + """Asset ID""" + asset: SalesforceAsset + + """Parent Case ID""" + parentId: String + + """Parent Case ID""" + parent: SalesforceCase + + """Name""" + suppliedName: String + + """Email Address""" + suppliedEmail: String + + """Phone""" + suppliedPhone: String + + """Company""" + suppliedCompany: String + + """Case Type""" + type: String + + """Status""" + status: String + + """Case Reason""" + reason: String + + """Case Origin""" + origin: String + + """Subject""" + subject: String + + """Priority""" + priority: String + + """Description""" + description: String + + """Closed""" + isClosed: Boolean! + + """Closed Date""" + closedDate: String + + """Escalated""" + isEscalated: Boolean! + + """Owner ID""" + ownerId: String! + + """Owner ID""" + owner: SalesforceCaseOwnerUnion! + + """Created Date""" + createdDate: String! + + """Created By ID""" + createdById: String! + + """Created By ID""" + createdBy: SalesforceUser! + + """Last Modified Date""" + lastModifiedDate: String! + + """Last Modified By ID""" + lastModifiedById: String! + + """Last Modified By ID""" + lastModifiedBy: SalesforceUser! + + """System Modstamp""" + systemModstamp: String! + + """Contact Phone""" + contactPhone: String + + """Contact Mobile""" + contactMobile: String + + """Contact Email""" + contactEmail: String + + """Contact Fax""" + contactFax: String + + """Last Viewed Date""" + lastViewedDate: String + + """Last Referenced Date""" + lastReferencedDate: String + + """Collection of Salesforce Attachment""" + attachments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceAttachmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceAttachmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceAttachmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Attachments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceAttachmentsConnection + + """Collection of Salesforce Case""" + cases( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Cases to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCasesConnection + + """Collection of Salesforce CaseComment""" + caseComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseCommentsConnection + + """Collection of Salesforce CaseContactRole""" + caseContactRoles( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseContactRoleConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseContactRoleSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseContactRoleSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseContactRoles to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseContactRolesConnection + + """Collection of Salesforce CaseFeed""" + feeds( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseFeedConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseFeedSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseFeedSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseFeeds to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseFeedsConnection + + """Collection of Salesforce CaseHistory""" + histories( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseHistoryConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseHistorySortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseHistorySortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseHistories to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseHistorysConnection + + """Collection of Salesforce CaseShare""" + shares( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseShareConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseShareSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseShareSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseShares to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseSharesConnection + + """Collection of Salesforce CaseSolution""" + caseSolutions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseSolutionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseSolutionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseSolutionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseSolutions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseSolutionsConnection + + """Collection of Salesforce CaseTeamMember""" + teamMembers( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamMemberConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseTeamMemberSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamMemberSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of CaseTeamMembers to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceCaseTeamMembersConnection + + """Collection of Salesforce CaseTeamTemplateRecord""" + teamTemplateRecords( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCaseTeamTemplateRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCaseTeamTemplateRecordSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCaseTeamTemplateRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CaseTeamTemplateRecords to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCaseTeamTemplateRecordsConnection + + """Collection of Salesforce CollaborationGroupRecord""" + recordAssociatedGroups( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceCollaborationGroupRecordConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceCollaborationGroupRecordSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of CollaborationGroupRecords to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceCollaborationGroupRecordsConnection + + """Collection of Salesforce ContentDistribution""" + contentDistributions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDistributionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDistributionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDistributionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDistributions to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDistributionsConnection + + """Collection of Salesforce ContentDocumentLink""" + contentDocumentLinks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentDocumentLinkConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentDocumentLinkSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentDocumentLinkSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """ + Number of ContentDocumentLinks to fetch. Defaults to 10. Maximum is 60. + """ + first: Int + ): SalesforceContentDocumentLinksConnection + + """Collection of Salesforce ContentVersion""" + contentVersions( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceContentVersionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceContentVersionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceContentVersionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ContentVersions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceContentVersionsConnection + + """Collection of Salesforce EmailMessage""" + emailMessages( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EmailMessage""" + emails( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEmailMessageConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEmailMessageSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEmailMessageSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EmailMessages to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEmailMessagesConnection + + """Collection of Salesforce EntitySubscription""" + feedSubscriptionsForEntity( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEntitySubscriptionConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEntitySubscriptionSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEntitySubscriptionSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of EntitySubscriptions to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEntitySubscriptionsConnection + + """Collection of Salesforce Event""" + events( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceEventConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceEventSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceEventSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Events to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceEventsConnection + + """Collection of Salesforce FeedComment""" + feedComments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedCommentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedCommentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedCommentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedComments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedCommentsConnection + + """Collection of Salesforce FeedItem""" + feedItems( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFeedItemConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFeedItemSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFeedItemSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FeedItems to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFeedItemsConnection + + """Collection of Salesforce FlowRecordRelation""" + flowRecordRelations( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceFlowRecordRelationConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceFlowRecordRelationSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceFlowRecordRelationSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of FlowRecordRelations to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceFlowRecordRelationsConnection + + """Collection of Salesforce ProcessInstance""" + processInstances( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceProcessInstanceConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceProcessInstanceSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceProcessInstanceSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of ProcessInstances to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceProcessInstancesConnection + + """Collection of Salesforce Task""" + tasks( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTaskConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTaskSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTaskSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of Tasks to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTasksConnection + + """Collection of Salesforce TopicAssignment""" + topicAssignments( + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: SalesforceTopicAssignmentConnectionFilter + + """ + Custom field to sort the results by. Only provide one of `sortByField` or `sortByCustomField`. + """ + sortByCustomField: SalesforceTopicAssignmentSortByFieldEnum + + """Field to sort the results by. Defaults to Id.""" + sortByField: SalesforceTopicAssignmentSortByFieldEnum + + """ + Whether elements should be sorted in ascending or descending order. Default is ascending. + """ + orderBy: SalesforceSortOrderBy + + """Returns the elements in the list that come after the specified cursor""" + after: String + + """Number of TopicAssignments to fetch. Defaults to 10. Maximum is 60.""" + first: Int + ): SalesforceTopicAssignmentsConnection + customFields( + """ + List of custom fields to return. By default, returns all custom fields. + """ + fields: [String!] + ): JSON! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubIssueTimelineItemsItemType { + """Represents a comment on an Issue.""" + ISSUE_COMMENT + + """Represents a mention made by one issue or pull request to another.""" + CROSS_REFERENCED_EVENT + + """ + Represents a 'added_to_project' event on a given issue or pull request. + """ + ADDED_TO_PROJECT_EVENT + + """Represents an 'assigned' event on any assignable object.""" + ASSIGNED_EVENT + + """Represents a 'closed' event on any `Closable`.""" + CLOSED_EVENT + + """Represents a 'comment_deleted' event on a given issue or pull request.""" + COMMENT_DELETED_EVENT + + """Represents a 'connected' event on a given issue or pull request.""" + CONNECTED_EVENT + + """ + Represents a 'converted_note_to_issue' event on a given issue or pull request. + """ + CONVERTED_NOTE_TO_ISSUE_EVENT + + """Represents a 'demilestoned' event on a given issue or pull request.""" + DEMILESTONED_EVENT + + """Represents a 'disconnected' event on a given issue or pull request.""" + DISCONNECTED_EVENT + + """Represents a 'labeled' event on a given issue or pull request.""" + LABELED_EVENT + + """Represents a 'locked' event on a given issue or pull request.""" + LOCKED_EVENT + + """ + Represents a 'marked_as_duplicate' event on a given issue or pull request. + """ + MARKED_AS_DUPLICATE_EVENT + + """Represents a 'mentioned' event on a given issue or pull request.""" + MENTIONED_EVENT + + """Represents a 'milestoned' event on a given issue or pull request.""" + MILESTONED_EVENT + + """ + Represents a 'moved_columns_in_project' event on a given issue or pull request. + """ + MOVED_COLUMNS_IN_PROJECT_EVENT + + """Represents a 'pinned' event on a given issue or pull request.""" + PINNED_EVENT + + """Represents a 'referenced' event on a given `ReferencedSubject`.""" + REFERENCED_EVENT + + """ + Represents a 'removed_from_project' event on a given issue or pull request. + """ + REMOVED_FROM_PROJECT_EVENT + + """Represents a 'renamed' event on a given issue or pull request""" + RENAMED_TITLE_EVENT + + """Represents a 'reopened' event on any `Closable`.""" + REOPENED_EVENT + + """Represents a 'subscribed' event on a given `Subscribable`.""" + SUBSCRIBED_EVENT + + """Represents a 'transferred' event on a given issue or pull request.""" + TRANSFERRED_EVENT + + """Represents an 'unassigned' event on any assignable object.""" + UNASSIGNED_EVENT + + """Represents an 'unlabeled' event on a given issue or pull request.""" + UNLABELED_EVENT + + """Represents an 'unlocked' event on a given issue or pull request.""" + UNLOCKED_EVENT + + """Represents a 'user_blocked' event on a given user.""" + USER_BLOCKED_EVENT + + """ + Represents an 'unmarked_as_duplicate' event on a given issue or pull request. + """ + UNMARKED_AS_DUPLICATE_EVENT + + """Represents an 'unpinned' event on a given issue or pull request.""" + UNPINNED_EVENT + + """Represents an 'unsubscribed' event on a given `Subscribable`.""" + UNSUBSCRIBED_EVENT +} + +"""An edge in a connection.""" +type GitHubIssueTimelineItemsEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubIssueTimelineItems +} + +"""The connection type for IssueTimelineItems.""" +type GitHubIssueTimelineItemsConnection { + """A list of edges.""" + edges: [GitHubIssueTimelineItemsEdge] + + """ + Identifies the count of items after applying `before` and `after` filters. + """ + filteredCount: Int! + + """A list of nodes.""" + nodes: [GitHubIssueTimelineItems] + + """ + Identifies the count of items after applying `before`/`after` filters and `first`/`last`/`skip` slicing. + """ + pageCount: Int! + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! + + """Identifies the date and time when the timeline was last updated.""" + updatedAt: String! +} + +"""Represents a 'base_ref_force_pushed' event on a given pull request.""" +type GitHubBaseRefForcePushedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the after commit SHA for the 'base_ref_force_pushed' event.""" + afterCommit: GitHubCommit + + """ + Identifies the before commit SHA for the 'base_ref_force_pushed' event. + """ + beforeCommit: GitHubCommit + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """PullRequest referenced by event.""" + pullRequest: GitHubPullRequest! + + """ + Identifies the fully qualified ref name for the 'base_ref_force_pushed' event. + """ + ref: GitHubRef + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a commit comment thread part of a pull request.""" +type GitHubPullRequestCommitCommentThread implements OneGraphNode & GitHubRepositoryNode & GitHubNode { + """The comments that exist in this thread.""" + comments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCommitCommentConnection! + + """The commit the comments were made on.""" + commit: GitHubCommit! + + """""" + id: ID! + + """The file the comments were made on.""" + path: String + + """The position in the diff for the commit that the comment was made on.""" + position: Int + + """The pull request this commit comment thread belongs to""" + pullRequest: GitHubPullRequest! + + """The repository associated with this node.""" + repository: GitHubRepository! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubSecurityVulnerabilityOrderField { + """Order vulnerability by update time""" + UPDATED_AT +} + +"""Ordering options for security vulnerability connections""" +input GitHubSecurityVulnerabilityOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order security vulnerabilities by.""" + field: GitHubSecurityVulnerabilityOrderField! +} + +enum GitHubSecurityAdvisoryEcosystem { + """Ruby gems hosted at RubyGems.org""" + RUBYGEMS + + """JavaScript packages hosted at npmjs.com""" + NPM + + """Python packages hosted at PyPI.org""" + PIP + + """Java artifacts hosted at the Maven central repository""" + MAVEN + + """.NET packages hosted at the NuGet Gallery""" + NUGET + + """PHP packages hosted at packagist.org""" + COMPOSER +} + +"""An individual package""" +type GitHubSecurityAdvisoryPackage { + """The ecosystem the package belongs to, e.g. RUBYGEMS, NPM""" + ecosystem: GitHubSecurityAdvisoryEcosystem! + + """The package name""" + name: String! +} + +"""An individual package version""" +type GitHubSecurityAdvisoryPackageVersion { + """The package name or version""" + identifier: String! +} + +"""An individual vulnerability within an Advisory""" +type GitHubSecurityVulnerability { + """The Advisory associated with this Vulnerability""" + advisory: GitHubSecurityAdvisory! + + """The first version containing a fix for the vulnerability""" + firstPatchedVersion: GitHubSecurityAdvisoryPackageVersion + + """A description of the vulnerable package""" + package: GitHubSecurityAdvisoryPackage! + + """The severity of the vulnerability within this package""" + severity: GitHubSecurityAdvisorySeverity! + + """When the vulnerability was last updated""" + updatedAt: String! + + """ + A string that describes the vulnerable package versions. + This string follows a basic syntax with a few forms. + + `= 0.2.0` denotes a single vulnerable version. + + `<= 1.0.8` denotes a version range up to and including the specified version + + `< 0.1.11` denotes a version range up to, but excluding, the specified version + + `>= 4.3.0, < 4.3.5` denotes a version range with a known minimum and maximum version. + + `>= 0.0.1` denotes a version range with a known minimum, but no known maximum + + """ + vulnerableVersionRange: String! +} + +"""An edge in a connection.""" +type GitHubSecurityVulnerabilityEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubSecurityVulnerability +} + +"""The connection type for SecurityVulnerability.""" +type GitHubSecurityVulnerabilityConnection { + """A list of edges.""" + edges: [GitHubSecurityVulnerabilityEdge] + + """A list of nodes.""" + nodes: [GitHubSecurityVulnerability] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubSecurityAdvisorySeverity { + """Low.""" + LOW + + """Moderate.""" + MODERATE + + """High.""" + HIGH + + """Critical.""" + CRITICAL +} + +"""A GitHub Security Advisory Reference""" +type GitHubSecurityAdvisoryReference { + """A publicly accessible reference""" + url: String! +} + +"""A GitHub Security Advisory Identifier""" +type GitHubSecurityAdvisoryIdentifier { + """The identifier type, e.g. GHSA, CVE""" + type: String! + + """The identifier""" + value: String! +} + +"""A GitHub Security Advisory""" +type GitHubSecurityAdvisory implements OneGraphNode & GitHubNode { + """Identifies the primary key from the database.""" + databaseId: Int + + """This is a long plaintext description of the advisory""" + description: String! + + """The GitHub Security Advisory ID""" + ghsaId: String! + + """""" + id: ID! + + """A list of identifiers for this advisory""" + identifiers: [GitHubSecurityAdvisoryIdentifier!]! + + """The organization that originated the advisory""" + origin: String! + + """The permalink for the advisory""" + permalink: String + + """When the advisory was published""" + publishedAt: String! + + """A list of references for this advisory""" + references: [GitHubSecurityAdvisoryReference!]! + + """The severity of the advisory""" + severity: GitHubSecurityAdvisorySeverity! + + """A short plaintext summary of the advisory""" + summary: String! + + """When the advisory was last updated""" + updatedAt: String! + + """Vulnerabilities associated with this Advisory""" + vulnerabilities( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """A list of severities to filter vulnerabilities by.""" + severities: [GitHubSecurityAdvisorySeverity!] + + """A package name to filter vulnerabilities by.""" + package: String + + """An ecosystem to filter vulnerabilities by.""" + ecosystem: GitHubSecurityAdvisoryEcosystem + + """Ordering options for the returned topics.""" + orderBy: GitHubSecurityVulnerabilityOrder + ): GitHubSecurityVulnerabilityConnection! + + """When the advisory was withdrawn, if it has been withdrawn""" + withdrawnAt: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A alert for a repository with an affected vulnerability.""" +type GitHubRepositoryVulnerabilityAlert implements OneGraphNode & GitHubRepositoryNode & GitHubNode { + """The affected version""" + affectedRange: String! @deprecated(reason: "advisory specific fields are being removed from repositoryVulnerabilityAlert objects Use `securityVulnerability.vulnerableVersionRange` instead. Removal on 2019-10-01 UTC.") + + """When was the alert created?""" + createdAt: String! + + """The reason the alert was dismissed""" + dismissReason: String + + """When was the alert dimissed?""" + dismissedAt: String + + """The user who dismissed the alert""" + dismisser: GitHubUser + + """The external identifier for the vulnerability""" + externalIdentifier: String @deprecated(reason: "advisory specific fields are being removed from repositoryVulnerabilityAlert objects Use `securityAdvisory.identifiers` instead. Removal on 2019-10-01 UTC.") + + """The external reference for the vulnerability""" + externalReference: String! @deprecated(reason: "advisory specific fields are being removed from repositoryVulnerabilityAlert objects Use `securityAdvisory.references` instead. Removal on 2019-10-01 UTC.") + + """The fixed version""" + fixedIn: String @deprecated(reason: "advisory specific fields are being removed from repositoryVulnerabilityAlert objects Use `securityVulnerability.firstPatchedVersion` instead. Removal on 2019-10-01 UTC.") + + """""" + id: ID! + + """The affected package""" + packageName: String! @deprecated(reason: "advisory specific fields are being removed from repositoryVulnerabilityAlert objects Use `securityVulnerability.package` instead. Removal on 2019-10-01 UTC.") + + """The associated repository""" + repository: GitHubRepository! + + """The associated security advisory""" + securityAdvisory: GitHubSecurityAdvisory + + """The associated security vulnerablity""" + securityVulnerability: GitHubSecurityVulnerability + + """The vulnerable manifest filename""" + vulnerableManifestFilename: String! + + """The vulnerable manifest path""" + vulnerableManifestPath: String! + + """The vulnerable requirements""" + vulnerableRequirements: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a object that belongs to a repository.""" +interface GitHubRepositoryNode { + """The repository associated with this node.""" + repository: GitHubRepository! +} + +"""A thread of comments on a commit.""" +type GitHubCommitCommentThread implements OneGraphNode & GitHubRepositoryNode & GitHubNode { + """The comments that exist in this thread.""" + comments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCommitCommentConnection! + + """The commit the comments were made on.""" + commit: GitHubCommit + + """""" + id: ID! + + """The file the comments were made on.""" + path: String + + """The position in the diff for the commit that the comment was made on.""" + position: Int + + """The repository associated with this node.""" + repository: GitHubRepository! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'deployed' event on a given pull request.""" +type GitHubDeployedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The deployment associated with the 'deployed' event.""" + deployment: GitHubDeployment! + + """""" + id: ID! + + """PullRequest referenced by event.""" + pullRequest: GitHubPullRequest! + + """The ref associated with the 'deployed' event.""" + ref: GitHubRef + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubDeploymentStatusState { + """The deployment is pending.""" + PENDING + + """The deployment was successful.""" + SUCCESS + + """The deployment has failed.""" + FAILURE + + """The deployment is inactive.""" + INACTIVE + + """The deployment experienced an error.""" + ERROR + + """The deployment is queued""" + QUEUED + + """The deployment is in progress.""" + IN_PROGRESS +} + +"""An edge in a connection.""" +type GitHubDeploymentStatusEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubDeploymentStatus +} + +"""The connection type for DeploymentStatus.""" +type GitHubDeploymentStatusConnection { + """A list of edges.""" + edges: [GitHubDeploymentStatusEdge] + + """A list of nodes.""" + nodes: [GitHubDeploymentStatus] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubDeploymentState { + """The pending deployment was not updated after 30 minutes.""" + ABANDONED + + """The deployment is currently active.""" + ACTIVE + + """An inactive transient deployment.""" + DESTROYED + + """The deployment experienced an error.""" + ERROR + + """The deployment has failed.""" + FAILURE + + """The deployment is inactive.""" + INACTIVE + + """The deployment is pending.""" + PENDING + + """The deployment has queued""" + QUEUED + + """The deployment is in progress.""" + IN_PROGRESS +} + +"""Represents triggered deployment instance.""" +type GitHubDeployment implements OneGraphNode & GitHubNode { + """Identifies the commit sha of the deployment.""" + commit: GitHubCommit + + """ + Identifies the oid of the deployment commit, even if the commit has been deleted. + """ + commitOid: String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the actor who triggered the deployment.""" + creator: GitHubActor! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The deployment description.""" + description: String + + """The latest environment to which this deployment was made.""" + environment: String + + """""" + id: ID! + + """The latest environment to which this deployment was made.""" + latestEnvironment: String + + """The latest status of this deployment.""" + latestStatus: GitHubDeploymentStatus + + """The original environment to which this deployment was made.""" + originalEnvironment: String + + """Extra information that a deployment system might need.""" + payload: String + + """ + Identifies the Ref of the deployment, if the deployment was created by ref. + """ + ref: GitHubRef + + """Identifies the repository associated with the deployment.""" + repository: GitHubRepository! + + """The current state of the deployment.""" + state: GitHubDeploymentState + + """A list of statuses associated with the deployment.""" + statuses( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubDeploymentStatusConnection + + """The deployment task.""" + task: String + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Describes the status of a given deployment attempt.""" +type GitHubDeploymentStatus implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the actor who triggered the deployment.""" + creator: GitHubActor! + + """Identifies the deployment associated with status.""" + deployment: GitHubDeployment! + + """Identifies the description of the deployment.""" + description: String + + """Identifies the environment URL of the deployment.""" + environmentUrl: String + + """""" + id: ID! + + """Identifies the log URL of the deployment.""" + logUrl: String + + """Identifies the current state of the deployment.""" + state: GitHubDeploymentStatusState! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Represents a 'deployment_environment_changed' event on a given pull request. +""" +type GitHubDeploymentEnvironmentChangedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The deployment status that updated the deployment environment.""" + deploymentStatus: GitHubDeploymentStatus! + + """""" + id: ID! + + """PullRequest referenced by event.""" + pullRequest: GitHubPullRequest! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'head_ref_deleted' event on a given pull request.""" +type GitHubHeadRefDeletedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the Ref associated with the `head_ref_deleted` event.""" + headRef: GitHubRef + + """ + Identifies the name of the Ref associated with the `head_ref_deleted` event. + """ + headRefName: String! + + """""" + id: ID! + + """PullRequest referenced by event.""" + pullRequest: GitHubPullRequest! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'head_ref_force_pushed' event on a given pull request.""" +type GitHubHeadRefForcePushedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the after commit SHA for the 'head_ref_force_pushed' event.""" + afterCommit: GitHubCommit + + """ + Identifies the before commit SHA for the 'head_ref_force_pushed' event. + """ + beforeCommit: GitHubCommit + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """PullRequest referenced by event.""" + pullRequest: GitHubPullRequest! + + """ + Identifies the fully qualified ref name for the 'head_ref_force_pushed' event. + """ + ref: GitHubRef + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'head_ref_restored' event on a given pull request.""" +type GitHubHeadRefRestoredEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """PullRequest referenced by event.""" + pullRequest: GitHubPullRequest! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'merged' event on a given pull request.""" +type GitHubMergedEvent implements OneGraphNode & GitHubUniformResourceLocatable & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the commit associated with the `merge` event.""" + commit: GitHubCommit + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Identifies the Ref associated with the `merge` event.""" + mergeRef: GitHubRef + + """Identifies the name of the Ref associated with the `merge` event.""" + mergeRefName: String! + + """PullRequest referenced by event.""" + pullRequest: GitHubPullRequest! + + """The HTTP path for this merged event.""" + resourcePath: String! + + """The HTTP URL for this merged event.""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubDiffSide { + """The left side of the diff.""" + LEFT + + """The right side of the diff.""" + RIGHT +} + +"""A threaded list of comments for a given pull request.""" +type GitHubPullRequestReviewThread implements OneGraphNode & GitHubNode { + """A list of pull request comments associated with the thread.""" + comments( + """Skips the first _n_ elements in the list.""" + skip: Int + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubPullRequestReviewCommentConnection! + + """The side of the diff on which this thread was placed.""" + diffSide: GitHubDiffSide! + + """""" + id: ID! + + """Whether this thread has been resolved""" + isResolved: Boolean! + + """The line in the file to which this thread refers""" + line: Int + + """The original line in the file to which this thread refers.""" + originalLine: Int + + """ + The original start line in the file to which this thread refers (multi-line only). + """ + originalStartLine: Int + + """Identifies the pull request associated with this thread.""" + pullRequest: GitHubPullRequest! + + """Identifies the repository associated with this thread.""" + repository: GitHubRepository! + + """The user who resolved this thread""" + resolvedBy: GitHubUser + + """ + The side of the diff that the first line of the thread starts on (multi-line only) + """ + startDiffSide: GitHubDiffSide + + """ + The start line in the file to which this thread refers (multi-line only) + """ + startLine: Int + + """Whether or not the viewer can resolve this thread""" + viewerCanResolve: Boolean! + + """Whether or not the viewer can unresolve this thread""" + viewerCanUnresolve: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents an 'review_request_removed' event on a given pull request.""" +type GitHubReviewRequestRemovedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """PullRequest referenced by event.""" + pullRequest: GitHubPullRequest! + + """Identifies the reviewer whose review request was removed.""" + requestedReviewer: GitHubRequestedReviewer + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents an 'review_requested' event on a given pull request.""" +type GitHubReviewRequestedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """PullRequest referenced by event.""" + pullRequest: GitHubPullRequest! + + """Identifies the reviewer whose review was requested.""" + requestedReviewer: GitHubRequestedReviewer + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Represents a 'added_to_project' event on a given issue or pull request. +""" +type GitHubAddedToProjectEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents an 'assigned' event on any assignable object.""" +type GitHubAssignedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the assignable associated with the event.""" + assignable: GitHubAssignable! + + """Identifies the user or mannequin that was assigned.""" + assignee: GitHubAssignee + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Identifies the user who was assigned.""" + user: GitHubUser @deprecated(reason: "Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC.") + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""The object which triggered a `ClosedEvent`.""" +union GitHubCloser = GitHubPullRequest | GitHubCommit + +"""Represents a 'closed' event on any `Closable`.""" +type GitHubClosedEvent implements OneGraphNode & GitHubUniformResourceLocatable & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Object that was closed.""" + closable: GitHubClosable! + + """Object which triggered the creation of this event.""" + closer: GitHubCloser + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """The HTTP path for this closed event.""" + resourcePath: String! + + """The HTTP URL for this closed event.""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'comment_deleted' event on a given issue or pull request.""" +type GitHubCommentDeletedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'connected' event on a given issue or pull request.""" +type GitHubConnectedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Reference originated in a different repository.""" + isCrossRepository: Boolean! + + """Issue or pull request that made the reference.""" + source: GitHubReferencedSubject! + + """Issue or pull request which was connected.""" + subject: GitHubReferencedSubject! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Represents a 'converted_note_to_issue' event on a given issue or pull request. +""" +type GitHubConvertedNoteToIssueEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a mention made by one issue or pull request to another.""" +type GitHubCrossReferencedEvent implements OneGraphNode & GitHubUniformResourceLocatable & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Reference originated in a different repository.""" + isCrossRepository: Boolean! + + """Identifies when the reference was made.""" + referencedAt: String! + + """The HTTP path for this pull request.""" + resourcePath: String! + + """Issue or pull request that made the reference.""" + source: GitHubReferencedSubject! + + """Issue or pull request to which the reference was made.""" + target: GitHubReferencedSubject! + + """The HTTP URL for this pull request.""" + url: String! + + """Checks if the target will be closed when the source is merged.""" + willCloseTarget: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'demilestoned' event on a given issue or pull request.""" +type GitHubDemilestonedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """ + Identifies the milestone title associated with the 'demilestoned' event. + """ + milestoneTitle: String! + + """Object referenced by event.""" + subject: GitHubMilestoneItem! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'disconnected' event on a given issue or pull request.""" +type GitHubDisconnectedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Reference originated in a different repository.""" + isCrossRepository: Boolean! + + """Issue or pull request from which the issue was disconnected.""" + source: GitHubReferencedSubject! + + """Issue or pull request which was disconnected.""" + subject: GitHubReferencedSubject! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'labeled' event on a given issue or pull request.""" +type GitHubLabeledEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Identifies the label associated with the 'labeled' event.""" + label: GitHubLabel! + + """Identifies the `Labelable` associated with the event.""" + labelable: GitHubLabelable! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'locked' event on a given issue or pull request.""" +type GitHubLockedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Reason that the conversation was locked (optional).""" + lockReason: GitHubLockReason + + """Object that was locked.""" + lockable: GitHubLockable! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Represents a 'marked_as_duplicate' event on a given issue or pull request. +""" +type GitHubMarkedAsDuplicateEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'mentioned' event on a given issue or pull request.""" +type GitHubMentionedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Types that can be inside a Milestone.""" +union GitHubMilestoneItem = GitHubPullRequest | GitHubIssue + +"""Represents a 'milestoned' event on a given issue or pull request.""" +type GitHubMilestonedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Identifies the milestone title associated with the 'milestoned' event.""" + milestoneTitle: String! + + """Object referenced by event.""" + subject: GitHubMilestoneItem! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Represents a 'moved_columns_in_project' event on a given issue or pull request. +""" +type GitHubMovedColumnsInProjectEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'pinned' event on a given issue or pull request.""" +type GitHubPinnedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Identifies the issue associated with the event.""" + issue: GitHubIssue! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Any referencable object""" +union GitHubReferencedSubject = GitHubPullRequest | GitHubIssue + +"""Represents a 'referenced' event on a given `ReferencedSubject`.""" +type GitHubReferencedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the commit associated with the 'referenced' event.""" + commit: GitHubCommit + + """Identifies the repository associated with the 'referenced' event.""" + commitRepository: GitHubRepository! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Reference originated in a different repository.""" + isCrossRepository: Boolean! + + """ + Checks if the commit message itself references the subject. Can be false in the case of a commit comment reference. + """ + isDirectReference: Boolean! + + """Object referenced by event.""" + subject: GitHubReferencedSubject! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Represents a 'removed_from_project' event on a given issue or pull request. +""" +type GitHubRemovedFromProjectEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An object which has a renamable title""" +union GitHubRenamedTitleSubject = GitHubPullRequest | GitHubIssue + +"""Represents a 'renamed' event on a given issue or pull request""" +type GitHubRenamedTitleEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the current title of the issue or pull request.""" + currentTitle: String! + + """""" + id: ID! + + """Identifies the previous title of the issue or pull request.""" + previousTitle: String! + + """Subject that was renamed.""" + subject: GitHubRenamedTitleSubject! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'reopened' event on any `Closable`.""" +type GitHubReopenedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Object that was reopened.""" + closable: GitHubClosable! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'subscribed' event on a given `Subscribable`.""" +type GitHubSubscribedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Object referenced by event.""" + subscribable: GitHubSubscribable! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a 'transferred' event on a given issue or pull request.""" +type GitHubTransferredEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The repository this came from""" + fromRepository: GitHubRepository + + """""" + id: ID! + + """Identifies the issue associated with the event.""" + issue: GitHubIssue! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Types that can be assigned to issues.""" +union GitHubAssignee = GitHubUser | GitHubOrganization | GitHubMannequin | GitHubBot + +"""An object that can have users assigned to it.""" +interface GitHubAssignable { + """A list of Users assigned to this object.""" + assignees( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserConnection! +} + +"""Represents an 'unassigned' event on any assignable object.""" +type GitHubUnassignedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the assignable associated with the event.""" + assignable: GitHubAssignable! + + """Identifies the user or mannequin that was unassigned.""" + assignee: GitHubAssignee + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Identifies the subject (user) who was unassigned.""" + user: GitHubUser @deprecated(reason: "Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC.") + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Represents an 'unmarked_as_duplicate' event on a given issue or pull request. +""" +type GitHubUnmarkedAsDuplicateEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents an 'unpinned' event on a given issue or pull request.""" +type GitHubUnpinnedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Identifies the issue associated with the event.""" + issue: GitHubIssue! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An item in an issue timeline""" +union GitHubIssueTimelineItems = GitHubUserBlockedEvent | GitHubUnsubscribedEvent | GitHubUnpinnedEvent | GitHubUnmarkedAsDuplicateEvent | GitHubUnlockedEvent | GitHubUnlabeledEvent | GitHubUnassignedEvent | GitHubTransferredEvent | GitHubSubscribedEvent | GitHubReopenedEvent | GitHubRenamedTitleEvent | GitHubRemovedFromProjectEvent | GitHubReferencedEvent | GitHubPinnedEvent | GitHubMovedColumnsInProjectEvent | GitHubMilestonedEvent | GitHubMentionedEvent | GitHubMarkedAsDuplicateEvent | GitHubLockedEvent | GitHubLabeledEvent | GitHubIssueComment | GitHubDisconnectedEvent | GitHubDemilestonedEvent | GitHubCrossReferencedEvent | GitHubConvertedNoteToIssueEvent | GitHubConnectedEvent | GitHubCommentDeletedEvent | GitHubClosedEvent | GitHubAssignedEvent | GitHubAddedToProjectEvent + +"""An object that can have labels assigned to it.""" +interface GitHubLabelable { + """A list of labels associated with the object.""" + labels( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for labels returned from the connection.""" + orderBy: GitHubLabelOrder + ): GitHubLabelConnection +} + +"""Represents an 'unlabeled' event on a given issue or pull request.""" +type GitHubUnlabeledEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Identifies the label associated with the 'unlabeled' event.""" + label: GitHubLabel! + + """Identifies the `Labelable` associated with the event.""" + labelable: GitHubLabelable! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An item in an pull request timeline""" +union GitHubPullRequestTimelineItem = GitHubUserBlockedEvent | GitHubUnsubscribedEvent | GitHubUnlockedEvent | GitHubUnlabeledEvent | GitHubUnassignedEvent | GitHubSubscribedEvent | GitHubReviewRequestedEvent | GitHubReviewRequestRemovedEvent | GitHubReviewDismissedEvent | GitHubReopenedEvent | GitHubRenamedTitleEvent | GitHubReferencedEvent | GitHubPullRequestReviewThread | GitHubPullRequestReviewComment | GitHubPullRequestReview | GitHubMilestonedEvent | GitHubMergedEvent | GitHubLockedEvent | GitHubLabeledEvent | GitHubIssueComment | GitHubHeadRefRestoredEvent | GitHubHeadRefForcePushedEvent | GitHubHeadRefDeletedEvent | GitHubDeploymentEnvironmentChangedEvent | GitHubDeployedEvent | GitHubDemilestonedEvent | GitHubCrossReferencedEvent | GitHubCommitCommentThread | GitHubCommit | GitHubClosedEvent | GitHubBaseRefForcePushedEvent | GitHubAssignedEvent + +"""An object that can be locked.""" +interface GitHubLockable { + """Reason that the conversation was locked.""" + activeLockReason: GitHubLockReason + + """`true` if the object is locked""" + locked: Boolean! +} + +"""Represents an 'unlocked' event on a given issue or pull request.""" +type GitHubUnlockedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Object that was unlocked.""" + lockable: GitHubLockable! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An item in an issue timeline""" +union GitHubIssueTimelineItem = GitHubUserBlockedEvent | GitHubUnsubscribedEvent | GitHubUnlockedEvent | GitHubUnlabeledEvent | GitHubUnassignedEvent | GitHubTransferredEvent | GitHubSubscribedEvent | GitHubReopenedEvent | GitHubRenamedTitleEvent | GitHubReferencedEvent | GitHubMilestonedEvent | GitHubLockedEvent | GitHubLabeledEvent | GitHubIssueComment | GitHubDemilestonedEvent | GitHubCrossReferencedEvent | GitHubCommit | GitHubClosedEvent | GitHubAssignedEvent + +"""An edge in a connection.""" +type GitHubIssueTimelineItemEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubIssueTimelineItem +} + +"""The connection type for IssueTimelineItem.""" +type GitHubIssueTimelineConnection { + """A list of edges.""" + edges: [GitHubIssueTimelineItemEdge] + + """A list of nodes.""" + nodes: [GitHubIssueTimelineItem] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Represents a comment.""" +interface GitHubComment { + """The actor who authored the comment.""" + author: GitHubActor + + """Author's association with the subject of the comment.""" + authorAssociation: GitHubCommentAuthorAssociation! + + """The body as Markdown.""" + body: String! + + """The body rendered to HTML.""" + bodyHTML: String! + + """The body rendered to text.""" + bodyText: String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Check if this comment was created via an email reply.""" + createdViaEmail: Boolean! + + """The actor who edited the comment.""" + editor: GitHubActor + + """""" + id: ID! + + """ + Check if this comment was edited and includes an edit with the creation data + """ + includesCreatedEdit: Boolean! + + """The moment the editor made the last edit""" + lastEditedAt: String + + """Identifies when the comment was published at.""" + publishedAt: String + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """A list of edits to this content.""" + userContentEdits( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserContentEditConnection + + """Did the viewer author this comment.""" + viewerDidAuthor: Boolean! +} + +"""Entities that can be deleted.""" +interface GitHubDeletable { + """Check if the current viewer can delete this object.""" + viewerCanDelete: Boolean! +} + +"""Entities that can be minimized.""" +interface GitHubMinimizable { + """Returns whether or not a comment has been minimized.""" + isMinimized: Boolean! + + """Returns why the comment was minimized.""" + minimizedReason: String + + """Check if the current viewer can minimize this object.""" + viewerCanMinimize: Boolean! +} + +"""Types that can be pinned to a profile page.""" +union GitHubPinnableItem = GitHubRepository | GitHubGist + +"""A topic aggregates entities that are related to a subject.""" +type GitHubTopic implements OneGraphNode & GitHubStarrable & GitHubNode { + """""" + id: ID! + + """The topic's name.""" + name: String! + + """ + A list of related topics, including aliases of this topic, sorted with the most relevant + first. Returns up to 10 Topics. + + """ + relatedTopics( + """How many topics to return.""" + first: Int + ): [GitHubTopic!]! + + """A list of users who have starred this starrable.""" + stargazers( + """Order for connection""" + orderBy: GitHubStarOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubStargazerConnection! + + """ + Returns a boolean indicating whether the viewing user has starred this starrable. + """ + viewerHasStarred: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Things that can be starred.""" +interface GitHubStarrable { + """""" + id: ID! + + """A list of users who have starred this starrable.""" + stargazers( + """Order for connection""" + orderBy: GitHubStarOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubStargazerConnection! + + """ + Returns a boolean indicating whether the viewing user has starred this starrable. + """ + viewerHasStarred: Boolean! +} + +enum GitHubStarOrderField { + """Allows ordering a list of stars by when they were created.""" + STARRED_AT +} + +"""Ways in which star connections can be ordered.""" +input GitHubStarOrder { + """The direction in which to order nodes.""" + direction: GitHubOrderDirection! + + """The field in which to order nodes by.""" + field: GitHubStarOrderField! +} + +"""Represents a user that's starred a repository.""" +type GitHubStargazerEdge { + """A cursor for use in pagination.""" + cursor: String! + + """""" + node: GitHubUser! + + """Identifies when the item was starred.""" + starredAt: String! +} + +"""The connection type for User.""" +type GitHubStargazerConnection { + """A list of edges.""" + edges: [GitHubStargazerEdge] + + """A list of nodes.""" + nodes: [GitHubUser] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Represents an owner of a Repository.""" +interface GitHubRepositoryOwner { + """A URL pointing to the owner's public avatar.""" + avatarUrl( + """The size of the resulting square image.""" + size: Int + ): String! + + """""" + id: ID! + + """The username used to login.""" + login: String! + + """A list of repositories this user has pinned to their profile""" + pinnedRepositories( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + If non-null, filters repositories according to whether they have been locked + """ + isLocked: Boolean + + """ + Array of owner's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the organization or user being viewed owns. + """ + ownerAffiliations: [GitHubRepositoryAffiliation] + + """ + Array of viewer's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the current viewer owns. + """ + affiliations: [GitHubRepositoryAffiliation] + + """Ordering options for repositories returned from the connection""" + orderBy: GitHubRepositoryOrder + + """If non-null, filters repositories according to privacy""" + privacy: GitHubRepositoryPrivacy + ): GitHubRepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") + + """A list of repositories that the user owns.""" + repositories( + """ + If non-null, filters repositories according to whether they are forks of another repository + """ + isFork: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + If non-null, filters repositories according to whether they have been locked + """ + isLocked: Boolean + + """ + Array of owner's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the organization or user being viewed owns. + """ + ownerAffiliations: [GitHubRepositoryAffiliation] + + """ + Array of viewer's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the current viewer owns. + """ + affiliations: [GitHubRepositoryAffiliation] + + """Ordering options for repositories returned from the connection""" + orderBy: GitHubRepositoryOrder + + """If non-null, filters repositories according to privacy""" + privacy: GitHubRepositoryPrivacy + ): GitHubRepositoryConnection! + + """Find Repository.""" + repository( + """Name of Repository to find.""" + name: String! + ): GitHubRepository + + """The HTTP URL for the owner.""" + resourcePath: String! + + """The HTTP URL for the owner.""" + url: String! +} + +enum GitHubGistOrderField { + """Order gists by creation time""" + CREATED_AT + + """Order gists by update time""" + UPDATED_AT + + """Order gists by push time""" + PUSHED_AT +} + +"""Ordering options for gist connections""" +input GitHubGistOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order repositories by.""" + field: GitHubGistOrderField! +} + +"""An edge in a connection.""" +type GitHubGistEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubGist +} + +"""The connection type for Gist.""" +type GitHubGistConnection { + """A list of edges.""" + edges: [GitHubGistEdge] + + """A list of nodes.""" + nodes: [GitHubGist] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Represents a given language found in repositories.""" +type GitHubLanguage implements OneGraphNode & GitHubNode { + """The color defined for the current language.""" + color: String + + """""" + id: ID! + + """The name of the current language.""" + name: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A file in a gist.""" +type GitHubGistFile { + """ + The file name encoded to remove characters that are invalid in URL paths. + """ + encodedName: String + + """The gist file encoding.""" + encoding: String + + """The file extension from the file name.""" + extension: String + + """Indicates if this file is an image.""" + isImage: Boolean! + + """Whether the file's contents were truncated.""" + isTruncated: Boolean! + + """The programming language this file is written in.""" + language: GitHubLanguage + + """The gist file name.""" + name: String + + """The gist file size in bytes.""" + size: Int + + """UTF8 text data or null if the file is binary""" + text( + """Optionally truncate the returned file to this length.""" + truncate: Int + ): String +} + +"""An edge in a connection.""" +type GitHubGistCommentEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubGistComment +} + +"""The connection type for GistComment.""" +type GitHubGistCommentConnection { + """A list of edges.""" + edges: [GitHubGistCommentEdge] + + """A list of nodes.""" + nodes: [GitHubGistComment] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A Gist.""" +type GitHubGist implements OneGraphNode & GitHubUniformResourceLocatable & GitHubStarrable & GitHubNode { + """A list of comments associated with the gist""" + comments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubGistCommentConnection! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The gist description.""" + description: String + + """The files in this gist.""" + files( + """The oid of the files to return""" + oid: String + + """The maximum number of files to return.""" + limit: Int + ): [GitHubGistFile] + + """A list of forks associated with the gist""" + forks( + """Ordering options for gists returned from the connection""" + orderBy: GitHubGistOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubGistConnection! + + """""" + id: ID! + + """Identifies if the gist is a fork.""" + isFork: Boolean! + + """Whether the gist is public or not.""" + isPublic: Boolean! + + """The gist name.""" + name: String! + + """The gist owner.""" + owner: GitHubRepositoryOwner + + """Identifies when the gist was last pushed to.""" + pushedAt: String + + """The HTML path to this resource.""" + resourcePath: String! + + """A list of users who have starred this starrable.""" + stargazers( + """Order for connection""" + orderBy: GitHubStarOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubStargazerConnection! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this Gist.""" + url: String! + + """ + Returns a boolean indicating whether the viewing user has starred this starrable. + """ + viewerHasStarred: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a comment on an Gist.""" +type GitHubGistComment implements OneGraphNode & GitHubUpdatableComment & GitHubUpdatable & GitHubNode & GitHubMinimizable & GitHubDeletable & GitHubComment { + """The actor who authored the comment.""" + author: GitHubActor + + """Author's association with the gist.""" + authorAssociation: GitHubCommentAuthorAssociation! + + """Identifies the comment body.""" + body: String! + + """The body rendered to HTML.""" + bodyHTML: String! + + """The body rendered to text.""" + bodyText: String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Check if this comment was created via an email reply.""" + createdViaEmail: Boolean! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The actor who edited the comment.""" + editor: GitHubActor + + """The associated gist.""" + gist: GitHubGist! + + """""" + id: ID! + + """ + Check if this comment was edited and includes an edit with the creation data + """ + includesCreatedEdit: Boolean! + + """Returns whether or not a comment has been minimized.""" + isMinimized: Boolean! + + """The moment the editor made the last edit""" + lastEditedAt: String + + """Returns why the comment was minimized.""" + minimizedReason: String + + """Identifies when the comment was published at.""" + publishedAt: String + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """A list of edits to this content.""" + userContentEdits( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserContentEditConnection + + """Check if the current viewer can delete this object.""" + viewerCanDelete: Boolean! + + """Check if the current viewer can minimize this object.""" + viewerCanMinimize: Boolean! + + """Check if the current viewer can update this object.""" + viewerCanUpdate: Boolean! + + """Reasons why the current viewer can not update this comment.""" + viewerCannotUpdateReasons: [GitHubCommentCannotUpdateReason!]! + + """Did the viewer author this comment.""" + viewerDidAuthor: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Entities that can be updated.""" +interface GitHubUpdatable { + """Check if the current viewer can update this object.""" + viewerCanUpdate: Boolean! +} + +enum GitHubProjectState { + """The project is open.""" + OPEN + + """The project is closed.""" + CLOSED +} + +"""Represents an owner of a Project.""" +interface GitHubProjectOwner { + """""" + id: ID! + + """Find project by number.""" + project( + """The project number to find.""" + number: Int! + ): GitHubProject + + """A list of projects under the owner.""" + projects( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """A list of states to filter the projects by.""" + states: [GitHubProjectState!] + + """Query to search projects by, currently only searching by name.""" + search: String + + """Ordering options for projects returned from the connection""" + orderBy: GitHubProjectOrder + ): GitHubProjectConnection! + + """The HTTP path listing owners projects""" + projectsResourcePath: String! + + """The HTTP URL listing owners projects""" + projectsUrl: String! + + """Can the current viewer create new projects on this owner.""" + viewerCanCreateProjects: Boolean! +} + +enum GitHubProjectColumnPurpose { + """The column contains cards still to be worked on""" + TODO + + """The column contains cards which are currently being worked on""" + IN_PROGRESS + + """The column contains cards which are complete""" + DONE +} + +enum GitHubProjectCardArchivedState { + """A project card that is archived""" + ARCHIVED + + """A project card that is not archived""" + NOT_ARCHIVED +} + +enum GitHubProjectCardState { + """The card has content only.""" + CONTENT_ONLY + + """The card has a note only.""" + NOTE_ONLY + + """The card is redacted.""" + REDACTED +} + +"""Types that can be inside Project Cards.""" +union GitHubProjectCardItem = GitHubPullRequest | GitHubIssue + +"""A card in a project.""" +type GitHubProjectCard implements OneGraphNode & GitHubNode { + """ + The project column this card is associated under. A card may only belong to one + project column at a time. The column field will be null if the card is created + in a pending state and has yet to be associated with a column. Once cards are + associated with a column, they will not become pending in the future. + + """ + column: GitHubProjectColumn + + """The card content item""" + content: GitHubProjectCardItem + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The actor who created this card""" + creator: GitHubActor + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + + """Whether the card is archived""" + isArchived: Boolean! + + """The card note""" + note: String + + """The project that contains this card.""" + project: GitHubProject! + + """The HTTP path for this card""" + resourcePath: String! + + """The state of ProjectCard""" + state: GitHubProjectCardState + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this card""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubProjectCardEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubProjectCard +} + +"""The connection type for ProjectCard.""" +type GitHubProjectCardConnection { + """A list of edges.""" + edges: [GitHubProjectCardEdge] + + """A list of nodes.""" + nodes: [GitHubProjectCard] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A column inside a project.""" +type GitHubProjectColumn implements OneGraphNode & GitHubNode { + """List of cards in the column""" + cards( + """A list of archived states to filter the cards by""" + archivedStates: [GitHubProjectCardArchivedState] + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubProjectCardConnection! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + + """The project column's name.""" + name: String! + + """The project that contains this column.""" + project: GitHubProject! + + """The semantic purpose of the column""" + purpose: GitHubProjectColumnPurpose + + """The HTTP path for this project column""" + resourcePath: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this project column""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubProjectColumnEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubProjectColumn +} + +"""The connection type for ProjectColumn.""" +type GitHubProjectColumnConnection { + """A list of edges.""" + edges: [GitHubProjectColumnEdge] + + """A list of nodes.""" + nodes: [GitHubProjectColumn] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +Projects manage issues, pull requests and notes within a project owner. +""" +type GitHubProject implements OneGraphNode & GitHubUpdatable & GitHubNode & GitHubClosable { + """The project's description body.""" + body: String + + """The projects description body rendered to HTML.""" + bodyHTML: String! + + """ + `true` if the object is closed (definition of closed may depend on type) + """ + closed: Boolean! + + """Identifies the date and time when the object was closed.""" + closedAt: String + + """List of columns in the project""" + columns( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubProjectColumnConnection! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The actor who originally created the project.""" + creator: GitHubActor + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + + """The project's name.""" + name: String! + + """The project's number.""" + number: Int! + + """ + The project's owner. Currently limited to repositories, organizations, and users. + """ + owner: GitHubProjectOwner! + + """List of pending cards in this project""" + pendingCards( + """A list of archived states to filter the cards by""" + archivedStates: [GitHubProjectCardArchivedState] + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubProjectCardConnection! + + """The HTTP path for this project""" + resourcePath: String! + + """Whether the project is open or closed.""" + state: GitHubProjectState! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this project""" + url: String! + + """Check if the current viewer can update this object.""" + viewerCanUpdate: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An object that can be closed""" +interface GitHubClosable { + """ + `true` if the object is closed (definition of closed may depend on type) + """ + closed: Boolean! + + """Identifies the date and time when the object was closed.""" + closedAt: String +} + +enum GitHubMilestoneState { + """A milestone that is still open.""" + OPEN + + """A milestone that has been closed.""" + CLOSED +} + +"""Represents a Milestone object on a given repository.""" +type GitHubMilestone implements OneGraphNode & GitHubUniformResourceLocatable & GitHubNode & GitHubClosable { + """ + `true` if the object is closed (definition of closed may depend on type) + """ + closed: Boolean! + + """Identifies the date and time when the object was closed.""" + closedAt: String + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the actor who created the milestone.""" + creator: GitHubActor + + """Identifies the description of the milestone.""" + description: String + + """Identifies the due date of the milestone.""" + dueOn: String + + """""" + id: ID! + + """Just for debugging on review-lab""" + issuePrioritiesDebug: String! + + """A list of issues associated with the milestone.""" + issues( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filtering options for issues returned from the connection.""" + filterBy: GitHubIssueFilters + + """A list of states to filter the issues by.""" + states: [GitHubIssueState!] + + """A list of label names to filter the pull requests by.""" + labels: [String!] + + """Ordering options for issues returned from the connection.""" + orderBy: GitHubIssueOrder + ): GitHubIssueConnection! + + """Identifies the number of the milestone.""" + number: Int! + + """A list of pull requests associated with the milestone.""" + pullRequests( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for pull requests returned from the connection.""" + orderBy: GitHubIssueOrder + + """The base ref name to filter the pull requests by.""" + baseRefName: String + + """The head ref name to filter the pull requests by.""" + headRefName: String + + """A list of label names to filter the pull requests by.""" + labels: [String!] + + """A list of states to filter the pull requests by.""" + states: [GitHubPullRequestState!] + ): GitHubPullRequestConnection! + + """The repository associated with this milestone.""" + repository: GitHubRepository! + + """The HTTP path for this milestone""" + resourcePath: String! + + """Identifies the state of the milestone.""" + state: GitHubMilestoneState! + + """Identifies the title of the milestone.""" + title: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this milestone""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubLabelOrderField { + """Order labels by name """ + NAME + + """Order labels by creation time""" + CREATED_AT +} + +"""Ways in which lists of labels can be ordered upon return.""" +input GitHubLabelOrder { + """The direction in which to order labels by the specified field.""" + direction: GitHubOrderDirection! + + """The field in which to order labels by.""" + field: GitHubLabelOrderField! +} + +"""Ways in which to filter lists of issues.""" +input GitHubIssueFilters { + """List issues subscribed to by viewer.""" + viewerSubscribed: Boolean + + """List issues filtered by the list of states given.""" + states: [GitHubIssueState!] + + """List issues that have been updated at or after the given date.""" + since: String + + """ + List issues by given milestone argument. If an string representation of an integer is passed, it should refer to a milestone by its number field. Pass in `null` for issues with no milestone, and `*` for issues that are assigned to any milestone. + """ + milestone: String + + """List issues where the given name is mentioned in the issue.""" + mentioned: String + + """List issues where the list of label names exist on the issue.""" + labels: [String!] + + """List issues created by given name.""" + createdBy: String + + """ + List issues assigned to given name. Pass in `null` for issues with no assigned user, and `*` for issues assigned to any user. + """ + assignee: String +} + +enum GitHubIssueState { + """An issue that is still open""" + OPEN + + """An issue that has been closed""" + CLOSED +} + +"""An edge in a connection.""" +type GitHubIssueEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubIssue +} + +"""The connection type for Issue.""" +type GitHubIssueConnection { + """A list of edges.""" + edges: [GitHubIssueEdge] + + """A list of nodes.""" + nodes: [GitHubIssue] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A label for categorizing Issues or Milestones with a given Repository.""" +type GitHubLabel implements OneGraphNode & GitHubNode { + """Identifies the label color.""" + color: String! + + """Identifies the date and time when the label was created.""" + createdAt: String + + """A brief description of this label.""" + description: String + + """""" + id: ID! + + """Indicates whether or not this is a default label.""" + isDefault: Boolean! + + """A list of issues associated with this label.""" + issues( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filtering options for issues returned from the connection.""" + filterBy: GitHubIssueFilters + + """A list of states to filter the issues by.""" + states: [GitHubIssueState!] + + """A list of label names to filter the pull requests by.""" + labels: [String!] + + """Ordering options for issues returned from the connection.""" + orderBy: GitHubIssueOrder + ): GitHubIssueConnection! + + """Identifies the label name.""" + name: String! + + """A list of pull requests associated with this label.""" + pullRequests( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for pull requests returned from the connection.""" + orderBy: GitHubIssueOrder + + """The base ref name to filter the pull requests by.""" + baseRefName: String + + """The head ref name to filter the pull requests by.""" + headRefName: String + + """A list of label names to filter the pull requests by.""" + labels: [String!] + + """A list of states to filter the pull requests by.""" + states: [GitHubPullRequestState!] + ): GitHubPullRequestConnection! + + """The repository associated with this label.""" + repository: GitHubRepository! + + """The HTTP path for this label.""" + resourcePath: String! + + """Identifies the date and time when the label was last updated.""" + updatedAt: String + + """The HTTP URL for this label.""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubLabelEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubLabel +} + +"""The connection type for Label.""" +type GitHubLabelConnection { + """A list of edges.""" + edges: [GitHubLabelEdge] + + """A list of nodes.""" + nodes: [GitHubLabel] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A generic hovercard context with a message and icon""" +type GitHubGenericHovercardContext implements GitHubHovercardContext { + """A string describing this context""" + message: String! + + """An octicon to accompany this context""" + octicon: String! +} + +"""An organization teams hovercard context""" +type GitHubOrganizationTeamsHovercardContext implements GitHubHovercardContext { + """A string describing this context""" + message: String! + + """An octicon to accompany this context""" + octicon: String! + + """Teams in this organization the user is a member of that are relevant""" + relevantTeams( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubTeamConnection! + + """The path for the full team list for this user""" + teamsResourcePath: String! + + """The URL for the full team list for this user""" + teamsUrl: String! + + """The total number of teams the user is on in the organization""" + totalTeamCount: Int! +} + +"""An edge in a connection.""" +type GitHubOrganizationEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubOrganization +} + +"""The connection type for Organization.""" +type GitHubOrganizationConnection { + """A list of edges.""" + edges: [GitHubOrganizationEdge] + + """A list of nodes.""" + nodes: [GitHubOrganization] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An organization list hovercard context""" +type GitHubOrganizationsHovercardContext implements GitHubHovercardContext { + """A string describing this context""" + message: String! + + """An octicon to accompany this context""" + octicon: String! + + """Organizations this user is a member of that are relevant""" + relevantOrganizations( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """The total number of organizations this user is in""" + totalOrganizationCount: Int! +} + +enum GitHubPullRequestReviewDecision { + """Changes have been requested on the pull request.""" + CHANGES_REQUESTED + + """The pull request has received an approving review.""" + APPROVED + + """A review is required before the pull request can be merged.""" + REVIEW_REQUIRED +} + +""" +A hovercard context with a message describing the current code review state of the pull +request. + +""" +type GitHubReviewStatusHovercardContext implements GitHubHovercardContext { + """A string describing this context""" + message: String! + + """An octicon to accompany this context""" + octicon: String! + + """The current status of the pull request with respect to code review.""" + reviewDecision: GitHubPullRequestReviewDecision +} + +""" +A hovercard context with a message describing how the viewer is related. +""" +type GitHubViewerHovercardContext implements GitHubHovercardContext { + """A string describing this context""" + message: String! + + """An octicon to accompany this context""" + octicon: String! + + """Identifies the user who is related to this context.""" + viewer: GitHubUser! +} + +"""An individual line of a hovercard""" +interface GitHubHovercardContext { + """A string describing this context""" + message: String! + + """An octicon to accompany this context""" + octicon: String! +} + +"""Detail needed to display a hovercard for a user""" +type GitHubHovercard { + """Each of the contexts for this hovercard""" + contexts: [GitHubHovercardContext!]! +} + +"""An edge in a connection.""" +type GitHubIssueCommentEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubIssueComment +} + +"""The connection type for IssueComment.""" +type GitHubIssueCommentConnection { + """A list of edges.""" + edges: [GitHubIssueCommentEdge] + + """A list of nodes.""" + nodes: [GitHubIssueComment] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +An Issue is a place to discuss ideas, enhancements, tasks, and bugs for a project. +""" +type GitHubIssue implements OneGraphNode & GitHubUpdatableComment & GitHubUpdatable & GitHubUniformResourceLocatable & GitHubSubscribable & GitHubRepositoryNode & GitHubReactable & GitHubNode & GitHubLockable & GitHubLabelable & GitHubComment & GitHubClosable & GitHubAssignable { + """Reason that the conversation was locked.""" + activeLockReason: GitHubLockReason + + """A list of Users assigned to this object.""" + assignees( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserConnection! + + """The actor who authored the comment.""" + author: GitHubActor + + """Author's association with the subject of the comment.""" + authorAssociation: GitHubCommentAuthorAssociation! + + """Identifies the body of the issue.""" + body: String! + + """The body rendered to HTML.""" + bodyHTML: String! + + """Identifies the body of the issue rendered to text.""" + bodyText: String! + + """ + `true` if the object is closed (definition of closed may depend on type) + """ + closed: Boolean! + + """Identifies the date and time when the object was closed.""" + closedAt: String + + """A list of comments associated with the Issue.""" + comments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubIssueCommentConnection! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Check if this comment was created via an email reply.""" + createdViaEmail: Boolean! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The actor who edited the comment.""" + editor: GitHubActor + + """The hovercard information for this issue""" + hovercard( + """Whether or not to include notification contexts""" + includeNotificationContexts: Boolean + ): GitHubHovercard! + + """""" + id: ID! + + """ + Check if this comment was edited and includes an edit with the creation data + """ + includesCreatedEdit: Boolean! + + """A list of labels associated with the object.""" + labels( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for labels returned from the connection.""" + orderBy: GitHubLabelOrder + ): GitHubLabelConnection + + """The moment the editor made the last edit""" + lastEditedAt: String + + """`true` if the object is locked""" + locked: Boolean! + + """Identifies the milestone associated with the issue.""" + milestone: GitHubMilestone + + """Identifies the issue number.""" + number: Int! + + """A list of Users that are participating in the Issue conversation.""" + participants( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserConnection! + + """List of project cards associated with this issue.""" + projectCards( + """A list of archived states to filter the cards by""" + archivedStates: [GitHubProjectCardArchivedState] + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubProjectCardConnection! + + """Identifies when the comment was published at.""" + publishedAt: String + + """A list of reactions grouped by content left on the subject.""" + reactionGroups: [GitHubReactionGroup!] + + """A list of Reactions left on the Issue.""" + reactions( + """Allows specifying the order in which reactions are returned.""" + orderBy: GitHubReactionOrder + + """Allows filtering Reactions by emoji.""" + content: GitHubReactionContent + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReactionConnection! + + """The repository associated with this node.""" + repository: GitHubRepository! + + """The HTTP path for this issue""" + resourcePath: String! + + """Identifies the state of the issue.""" + state: GitHubIssueState! + + """A list of events, comments, commits, etc. associated with the issue.""" + timeline( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Allows filtering timeline events by a `since` timestamp.""" + since: String + ): GitHubIssueTimelineConnection! @deprecated(reason: "`timeline` will be removed Use Issue.timelineItems instead. Removal on 2019-10-01 UTC.") + + """A list of events, comments, commits, etc. associated with the issue.""" + timelineItems( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filter timeline items by type.""" + itemTypes: [GitHubIssueTimelineItemsItemType!] + + """Skips the first _n_ elements in the list.""" + skip: Int + + """Filter timeline items by a `since` timestamp.""" + since: String + ): GitHubIssueTimelineItemsConnection! + + """Identifies the issue title.""" + title: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this issue""" + url: String! + + """A list of edits to this content.""" + userContentEdits( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserContentEditConnection + + """Can user react to this subject""" + viewerCanReact: Boolean! + + """ + Check if the viewer is able to change their subscription status for the repository. + """ + viewerCanSubscribe: Boolean! + + """Check if the current viewer can update this object.""" + viewerCanUpdate: Boolean! + + """Reasons why the current viewer can not update this comment.""" + viewerCannotUpdateReasons: [GitHubCommentCannotUpdateReason!]! + + """Did the viewer author this comment.""" + viewerDidAuthor: Boolean! + + """ + Identifies if the viewer is watching, not watching, or ignoring the subscribable entity. + """ + viewerSubscription: GitHubSubscriptionState + + """Linked Salesforce Case""" + salesforceCase: SalesforceCase + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a comment on an Issue.""" +type GitHubIssueComment implements OneGraphNode & GitHubUpdatableComment & GitHubUpdatable & GitHubRepositoryNode & GitHubReactable & GitHubNode & GitHubMinimizable & GitHubDeletable & GitHubComment { + """The actor who authored the comment.""" + author: GitHubActor + + """Author's association with the subject of the comment.""" + authorAssociation: GitHubCommentAuthorAssociation! + + """The body as Markdown.""" + body: String! + + """The body rendered to HTML.""" + bodyHTML: String! + + """The body rendered to text.""" + bodyText: String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Check if this comment was created via an email reply.""" + createdViaEmail: Boolean! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The actor who edited the comment.""" + editor: GitHubActor + + """""" + id: ID! + + """ + Check if this comment was edited and includes an edit with the creation data + """ + includesCreatedEdit: Boolean! + + """Returns whether or not a comment has been minimized.""" + isMinimized: Boolean! + + """Identifies the issue associated with the comment.""" + issue: GitHubIssue! + + """The moment the editor made the last edit""" + lastEditedAt: String + + """Returns why the comment was minimized.""" + minimizedReason: String + + """Identifies when the comment was published at.""" + publishedAt: String + + """ + Returns the pull request associated with the comment, if this comment was made on a + pull request. + + """ + pullRequest: GitHubPullRequest + + """A list of reactions grouped by content left on the subject.""" + reactionGroups: [GitHubReactionGroup!] + + """A list of Reactions left on the Issue.""" + reactions( + """Allows specifying the order in which reactions are returned.""" + orderBy: GitHubReactionOrder + + """Allows filtering Reactions by emoji.""" + content: GitHubReactionContent + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReactionConnection! + + """The repository associated with this node.""" + repository: GitHubRepository! + + """The HTTP path for this issue comment""" + resourcePath: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this issue comment""" + url: String! + + """A list of edits to this content.""" + userContentEdits( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserContentEditConnection + + """Check if the current viewer can delete this object.""" + viewerCanDelete: Boolean! + + """Check if the current viewer can minimize this object.""" + viewerCanMinimize: Boolean! + + """Can user react to this subject""" + viewerCanReact: Boolean! + + """Check if the current viewer can update this object.""" + viewerCanUpdate: Boolean! + + """Reasons why the current viewer can not update this comment.""" + viewerCannotUpdateReasons: [GitHubCommentCannotUpdateReason!]! + + """Did the viewer author this comment.""" + viewerDidAuthor: Boolean! + + """Linked Salesforce CaseComment""" + salesforceCaseComment: SalesforceCaseComment + + """Linked Salesforce FeedComment""" + salesforceFeedComment: SalesforceFeedComment + + """Linked Salesforce FeedItem""" + salesforceFeedItem: SalesforceFeedItem + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Comments that can be updated.""" +interface GitHubUpdatableComment { + """Reasons why the current viewer can not update this comment.""" + viewerCannotUpdateReasons: [GitHubCommentCannotUpdateReason!]! +} + +enum GitHubCommentCannotUpdateReason { + """Unable to create comment because repository is archived.""" + ARCHIVED + + """ + You must be the author or have write access to this repository to update this comment. + """ + INSUFFICIENT_ACCESS + + """Unable to create comment because issue is locked.""" + LOCKED + + """You must be logged in to update this comment.""" + LOGIN_REQUIRED + + """Repository is under maintenance.""" + MAINTENANCE + + """At least one email address must be verified to update this comment.""" + VERIFIED_EMAIL_REQUIRED + + """You cannot update this comment""" + DENIED +} + +"""An edge in a connection.""" +type GitHubUserContentEditEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubUserContentEdit +} + +"""A list of edits to content.""" +type GitHubUserContentEditConnection { + """A list of edges.""" + edges: [GitHubUserContentEditEdge] + + """A list of nodes.""" + nodes: [GitHubUserContentEdit] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubReactionOrderField { + """Allows ordering a list of reactions by when they were created.""" + CREATED_AT +} + +"""Ways in which lists of reactions can be ordered upon return.""" +input GitHubReactionOrder { + """The direction in which to order reactions by the specified field.""" + direction: GitHubOrderDirection! + + """The field in which to order reactions by.""" + field: GitHubReactionOrderField! +} + +"""An emoji reaction to a particular piece of content.""" +type GitHubReaction implements OneGraphNode & GitHubNode { + """Identifies the emoji reaction.""" + content: GitHubReactionContent! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + + """The reactable piece of content""" + reactable: GitHubReactable! + + """Identifies the user who created this reaction.""" + user: GitHubUser + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubReactionEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubReaction +} + +"""A list of reactions that have been left on the subject.""" +type GitHubReactionConnection { + """A list of edges.""" + edges: [GitHubReactionEdge] + + """A list of nodes.""" + nodes: [GitHubReaction] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! + + """ + Whether or not the authenticated user has left a reaction on the subject. + """ + viewerHasReacted: Boolean! +} + +"""An edge in a connection.""" +type GitHubPullRequestReviewCommentEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubPullRequestReviewComment +} + +"""The connection type for PullRequestReviewComment.""" +type GitHubPullRequestReviewCommentConnection { + """A list of edges.""" + edges: [GitHubPullRequestReviewCommentEdge] + + """A list of nodes.""" + nodes: [GitHubPullRequestReviewComment] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A review object for a given pull request.""" +type GitHubPullRequestReview implements OneGraphNode & GitHubUpdatableComment & GitHubUpdatable & GitHubRepositoryNode & GitHubReactable & GitHubNode & GitHubDeletable & GitHubComment { + """The actor who authored the comment.""" + author: GitHubActor + + """Author's association with the subject of the comment.""" + authorAssociation: GitHubCommentAuthorAssociation! + + """Identifies the pull request review body.""" + body: String! + + """The body rendered to HTML.""" + bodyHTML: String! + + """The body of this review rendered as plain text.""" + bodyText: String! + + """A list of review comments for the current pull request review.""" + comments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubPullRequestReviewCommentConnection! + + """Identifies the commit associated with this pull request review.""" + commit: GitHubCommit + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Check if this comment was created via an email reply.""" + createdViaEmail: Boolean! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The actor who edited the comment.""" + editor: GitHubActor + + """""" + id: ID! + + """ + Check if this comment was edited and includes an edit with the creation data + """ + includesCreatedEdit: Boolean! + + """The moment the editor made the last edit""" + lastEditedAt: String + + """A list of teams that this review was made on behalf of.""" + onBehalfOf( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubTeamConnection! + + """Identifies when the comment was published at.""" + publishedAt: String + + """Identifies the pull request associated with this pull request review.""" + pullRequest: GitHubPullRequest! + + """A list of reactions grouped by content left on the subject.""" + reactionGroups: [GitHubReactionGroup!] + + """A list of Reactions left on the Issue.""" + reactions( + """Allows specifying the order in which reactions are returned.""" + orderBy: GitHubReactionOrder + + """Allows filtering Reactions by emoji.""" + content: GitHubReactionContent + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReactionConnection! + + """The repository associated with this node.""" + repository: GitHubRepository! + + """The HTTP path permalink for this PullRequestReview.""" + resourcePath: String! + + """Identifies the current state of the pull request review.""" + state: GitHubPullRequestReviewState! + + """Identifies when the Pull Request Review was submitted""" + submittedAt: String + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL permalink for this PullRequestReview.""" + url: String! + + """A list of edits to this content.""" + userContentEdits( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserContentEditConnection + + """Check if the current viewer can delete this object.""" + viewerCanDelete: Boolean! + + """Can user react to this subject""" + viewerCanReact: Boolean! + + """Check if the current viewer can update this object.""" + viewerCanUpdate: Boolean! + + """Reasons why the current viewer can not update this comment.""" + viewerCannotUpdateReasons: [GitHubCommentCannotUpdateReason!]! + + """Did the viewer author this comment.""" + viewerDidAuthor: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a Git commit part of a pull request.""" +type GitHubPullRequestCommit implements OneGraphNode & GitHubUniformResourceLocatable & GitHubNode { + """The Git commit object""" + commit: GitHubCommit! + + """""" + id: ID! + + """The pull request this commit belongs to""" + pullRequest: GitHubPullRequest! + + """The HTTP path for this pull request commit""" + resourcePath: String! + + """The HTTP URL for this pull request commit""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubPullRequestReviewState { + """A review that has not yet been submitted.""" + PENDING + + """An informational review.""" + COMMENTED + + """A review allowing the pull request to merge.""" + APPROVED + + """A review blocking the pull request from merging.""" + CHANGES_REQUESTED + + """A review that has been dismissed.""" + DISMISSED +} + +""" +Represents a 'review_dismissed' event on a given issue or pull request. +""" +type GitHubReviewDismissedEvent implements OneGraphNode & GitHubUniformResourceLocatable & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """ + Identifies the optional message associated with the 'review_dismissed' event. + """ + dismissalMessage: String + + """ + Identifies the optional message associated with the event, rendered to HTML. + """ + dismissalMessageHTML: String + + """""" + id: ID! + + """ + Identifies the previous state of the review with the 'review_dismissed' event. + """ + previousReviewState: GitHubPullRequestReviewState! + + """PullRequest referenced by event.""" + pullRequest: GitHubPullRequest! + + """Identifies the commit which caused the review to become stale.""" + pullRequestCommit: GitHubPullRequestCommit + + """The HTTP path for this review dismissed event.""" + resourcePath: String! + + """Identifies the review associated with the 'review_dismissed' event.""" + review: GitHubPullRequestReview + + """The HTTP URL for this review dismissed event.""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a type that can be retrieved by a URL.""" +interface GitHubUniformResourceLocatable { + """The HTML path to this resource.""" + resourcePath: String! + + """The URL to this resource.""" + url: String! +} + +"""A placeholder user for attribution of imported data on GitHub.""" +type GitHubMannequin implements OneGraphNode & GitHubUniformResourceLocatable & GitHubNode & GitHubActor { + """A URL pointing to the GitHub App's public avatar.""" + avatarUrl( + """The size of the resulting square image.""" + size: Int + ): String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The mannequin's email on the source instance.""" + email: String + + """""" + id: ID! + + """The username of the actor.""" + login: String! + + """The HTML path to this resource.""" + resourcePath: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The URL to this resource.""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Types that can be requested reviewers.""" +union GitHubRequestedReviewer = GitHubUser | GitHubTeam | GitHubMannequin + +"""Types that can be an actor.""" +union GitHubReviewDismissalAllowanceActor = GitHubUser | GitHubTeam + +enum GitHubSubscriptionState { + """The User is only notified when participating or @mentioned.""" + UNSUBSCRIBED + + """The User is notified of all conversations.""" + SUBSCRIBED + + """The User is never notified.""" + IGNORED +} + +enum GitHubTeamRepositoryOrderField { + """Order repositories by creation time""" + CREATED_AT + + """Order repositories by update time""" + UPDATED_AT + + """Order repositories by push time""" + PUSHED_AT + + """Order repositories by name""" + NAME + + """Order repositories by permission""" + PERMISSION + + """Order repositories by number of stargazers""" + STARGAZERS +} + +"""Ordering options for team repository connections""" +input GitHubTeamRepositoryOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order repositories by.""" + field: GitHubTeamRepositoryOrderField! +} + +enum GitHubRepositoryPermission { + """ + Can read, clone, and push to this repository. Can also manage issues, pull requests, and repository settings, including adding collaborators + """ + ADMIN + + """ + Can read, clone, and push to this repository. They can also manage issues, pull requests, and some repository settings + """ + MAINTAIN + + """ + Can read, clone, and push to this repository. Can also manage issues and pull requests + """ + WRITE + + """ + Can read and clone this repository. Can also manage issues and pull requests + """ + TRIAGE + + """ + Can read and clone this repository. Can also open and comment on issues and pull requests + """ + READ +} + +"""Represents a team repository.""" +type GitHubTeamRepositoryEdge { + """A cursor for use in pagination.""" + cursor: String! + + """""" + node: GitHubRepository! + + """The permission level the team has on the repository""" + permission: GitHubRepositoryPermission! +} + +"""The connection type for Repository.""" +type GitHubTeamRepositoryConnection { + """A list of edges.""" + edges: [GitHubTeamRepositoryEdge] + + """A list of nodes.""" + nodes: [GitHubRepository] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubTeamPrivacy { + """A secret team can only be seen by its members.""" + SECRET + + """ + A visible team can be seen and @mentioned by every member of the organization. + """ + VISIBLE +} + +enum GitHubTeamMemberOrderField { + """Order team members by login""" + LOGIN + + """Order team members by creation time""" + CREATED_AT +} + +"""Ordering options for team member connections""" +input GitHubTeamMemberOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order team members by.""" + field: GitHubTeamMemberOrderField! +} + +enum GitHubTeamMembershipType { + """Includes only immediate members of the team.""" + IMMEDIATE + + """Includes only child team members for the team.""" + CHILD_TEAM + + """Includes immediate and child team members for the team.""" + ALL +} + +enum GitHubTeamMemberRole { + """A team maintainer has permission to add and remove team members.""" + MAINTAINER + + """A team member has no administrative permissions on the team.""" + MEMBER +} + +"""Represents a user who is a member of a team.""" +type GitHubTeamMemberEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The HTTP path to the organization's member access page.""" + memberAccessResourcePath: String! + + """The HTTP URL to the organization's member access page.""" + memberAccessUrl: String! + + """""" + node: GitHubUser! + + """The role the member has on the team.""" + role: GitHubTeamMemberRole! +} + +"""The connection type for User.""" +type GitHubTeamMemberConnection { + """A list of edges.""" + edges: [GitHubTeamMemberEdge] + + """A list of nodes.""" + nodes: [GitHubUser] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubUserStatusOrderField { + """Order user statuses by when they were updated.""" + UPDATED_AT +} + +"""Ordering options for user status connections.""" +input GitHubUserStatusOrder { + """The ordering direction.""" + direction: GitHubOrderDirection! + + """The field to order user statuses by.""" + field: GitHubUserStatusOrderField! +} + +"""An edge in a connection.""" +type GitHubUserStatusEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubUserStatus +} + +"""The connection type for UserStatus.""" +type GitHubUserStatusConnection { + """A list of edges.""" + edges: [GitHubUserStatusEdge] + + """A list of nodes.""" + nodes: [GitHubUserStatus] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubOrganizationInvitationRole { + """The user is invited to be a direct member of the organization.""" + DIRECT_MEMBER + + """The user is invited to be an admin of the organization.""" + ADMIN + + """The user is invited to be a billing manager of the organization.""" + BILLING_MANAGER + + """The user's previous role will be reinstated.""" + REINSTATE +} + +enum GitHubOrganizationInvitationType { + """The invitation was to an existing user.""" + USER + + """The invitation was to an email address.""" + EMAIL +} + +"""An Invitation for a user to an organization.""" +type GitHubOrganizationInvitation implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The email address of the user invited to the organization.""" + email: String + + """""" + id: ID! + + """The type of invitation that was sent (e.g. email, user).""" + invitationType: GitHubOrganizationInvitationType! + + """The user who was invited to the organization.""" + invitee: GitHubUser + + """The user who created the invitation.""" + inviter: GitHubUser! + + """The organization the invite is for""" + organization: GitHubOrganization! + + """The user's pending role in the organization (e.g. member, owner).""" + role: GitHubOrganizationInvitationRole! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubOrganizationInvitationEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubOrganizationInvitation +} + +"""The connection type for OrganizationInvitation.""" +type GitHubOrganizationInvitationConnection { + """A list of edges.""" + edges: [GitHubOrganizationInvitationEdge] + + """A list of nodes.""" + nodes: [GitHubOrganizationInvitation] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubTeamDiscussionOrderField { + """Allows chronological ordering of team discussions.""" + CREATED_AT +} + +"""Ways in which team discussion connections can be ordered.""" +input GitHubTeamDiscussionOrder { + """The direction in which to order nodes.""" + direction: GitHubOrderDirection! + + """The field by which to order nodes.""" + field: GitHubTeamDiscussionOrderField! +} + +"""An edge in a connection.""" +type GitHubTeamDiscussionEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubTeamDiscussion +} + +"""The connection type for TeamDiscussion.""" +type GitHubTeamDiscussionConnection { + """A list of edges.""" + edges: [GitHubTeamDiscussionEdge] + + """A list of nodes.""" + nodes: [GitHubTeamDiscussion] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubTeamOrderField { + """Allows ordering a list of teams by name.""" + NAME +} + +"""Ways in which team connections can be ordered.""" +input GitHubTeamOrder { + """The direction in which to order nodes.""" + direction: GitHubOrderDirection! + + """The field in which to order nodes by.""" + field: GitHubTeamOrderField! +} + +"""An edge in a connection.""" +type GitHubTeamEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubTeam +} + +"""The connection type for Team.""" +type GitHubTeamConnection { + """A list of edges.""" + edges: [GitHubTeamEdge] + + """A list of nodes.""" + nodes: [GitHubTeam] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A team of users in an organization.""" +type GitHubTeam implements OneGraphNode & GitHubSubscribable & GitHubNode & GitHubMemberStatusable { + """A list of teams that are ancestors of this team.""" + ancestors( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubTeamConnection! + + """A URL pointing to the team's avatar.""" + avatarUrl( + """The size in pixels of the resulting square image.""" + size: Int + ): String + + """List of child teams belonging to this team""" + childTeams( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Whether to list immediate child teams or all descendant child teams.""" + immediateOnly: Boolean + + """User logins to filter by""" + userLogins: [String!] + + """Order for connection""" + orderBy: GitHubTeamOrder + ): GitHubTeamConnection! + + """The slug corresponding to the organization and team.""" + combinedSlug: String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """The description of the team.""" + description: String + + """Find a team discussion by its number.""" + discussion( + """The sequence number of the discussion to find.""" + number: Int! + ): GitHubTeamDiscussion + + """A list of team discussions.""" + discussions( + """Order for connection""" + orderBy: GitHubTeamDiscussionOrder + + """ + If provided, filters discussions according to whether or not they are pinned. + """ + isPinned: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubTeamDiscussionConnection! + + """The HTTP path for team discussions""" + discussionsResourcePath: String! + + """The HTTP URL for team discussions""" + discussionsUrl: String! + + """The HTTP path for editing this team""" + editTeamResourcePath: String! + + """The HTTP URL for editing this team""" + editTeamUrl: String! + + """""" + id: ID! + + """A list of pending invitations for users to this team""" + invitations( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationInvitationConnection + + """ + Get the status messages members of this entity have set that are either public or visible only to the organization. + """ + memberStatuses( + """Ordering options for user statuses returned from the connection.""" + orderBy: GitHubUserStatusOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserStatusConnection! + + """A list of users who are members of this team.""" + members( + """Order for the connection.""" + orderBy: GitHubTeamMemberOrder + + """Filter by team member role""" + role: GitHubTeamMemberRole + + """Filter by membership type""" + membership: GitHubTeamMembershipType + + """The search string to look for.""" + query: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubTeamMemberConnection! + + """The HTTP path for the team' members""" + membersResourcePath: String! + + """The HTTP URL for the team' members""" + membersUrl: String! + + """The name of the team.""" + name: String! + + """The HTTP path creating a new team""" + newTeamResourcePath: String! + + """The HTTP URL creating a new team""" + newTeamUrl: String! + + """The organization that owns this team.""" + organization: GitHubOrganization! + + """The parent team of the team.""" + parentTeam: GitHubTeam + + """The level of privacy the team has.""" + privacy: GitHubTeamPrivacy! + + """A list of repositories this team has access to.""" + repositories( + """Order for the connection.""" + orderBy: GitHubTeamRepositoryOrder + + """The search string to look for.""" + query: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubTeamRepositoryConnection! + + """The HTTP path for this team's repositories""" + repositoriesResourcePath: String! + + """The HTTP URL for this team's repositories""" + repositoriesUrl: String! + + """The HTTP path for this team""" + resourcePath: String! + + """The slug corresponding to the team.""" + slug: String! + + """The HTTP path for this team's teams""" + teamsResourcePath: String! + + """The HTTP URL for this team's teams""" + teamsUrl: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this team""" + url: String! + + """Team is adminable by the viewer.""" + viewerCanAdminister: Boolean! + + """ + Check if the viewer is able to change their subscription status for the repository. + """ + viewerCanSubscribe: Boolean! + + """ + Identifies if the viewer is watching, not watching, or ignoring the subscribable entity. + """ + viewerSubscription: GitHubSubscriptionState + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Types that can be an actor.""" +union GitHubPushAllowanceActor = GitHubUser | GitHubTeam | GitHubApp + +"""A team, user or app who has the ability to push to a protected branch.""" +type GitHubPushAllowance implements OneGraphNode & GitHubNode { + """The actor that can push.""" + actor: GitHubPushAllowanceActor + + """ + Identifies the branch protection rule associated with the allowed user or team. + """ + branchProtectionRule: GitHubBranchProtectionRule + + """""" + id: ID! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubPushAllowanceEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubPushAllowance +} + +"""The connection type for PushAllowance.""" +type GitHubPushAllowanceConnection { + """A list of edges.""" + edges: [GitHubPushAllowanceEdge] + + """A list of nodes.""" + nodes: [GitHubPushAllowance] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type GitHubRefEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubRef +} + +"""The connection type for Ref.""" +type GitHubRefConnection { + """A list of edges.""" + edges: [GitHubRefEdge] + + """A list of nodes.""" + nodes: [GitHubRef] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A conflict between two branch protection rules.""" +type GitHubBranchProtectionRuleConflict { + """Identifies the branch protection rule.""" + branchProtectionRule: GitHubBranchProtectionRule + + """Identifies the conflicting branch protection rule.""" + conflictingBranchProtectionRule: GitHubBranchProtectionRule + + """Identifies the branch ref that has conflicting rules""" + ref: GitHubRef +} + +"""An edge in a connection.""" +type GitHubBranchProtectionRuleConflictEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubBranchProtectionRuleConflict +} + +"""The connection type for BranchProtectionRuleConflict.""" +type GitHubBranchProtectionRuleConflictConnection { + """A list of edges.""" + edges: [GitHubBranchProtectionRuleConflictEdge] + + """A list of nodes.""" + nodes: [GitHubBranchProtectionRuleConflict] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A branch protection rule.""" +type GitHubBranchProtectionRule implements OneGraphNode & GitHubNode { + """ + A list of conflicts matching branches protection rule and other branch protection rules + """ + branchProtectionRuleConflicts( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubBranchProtectionRuleConflictConnection! + + """The actor who created this branch protection rule.""" + creator: GitHubActor + + """Identifies the primary key from the database.""" + databaseId: Int + + """ + Will new commits pushed to matching branches dismiss pull request review approvals. + """ + dismissesStaleReviews: Boolean! + + """""" + id: ID! + + """Can admins overwrite branch protection.""" + isAdminEnforced: Boolean! + + """Repository refs that are protected by this rule""" + matchingRefs( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filters refs with query on name""" + query: String + ): GitHubRefConnection! + + """Identifies the protection rule pattern.""" + pattern: String! + + """A list push allowances for this branch protection rule.""" + pushAllowances( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubPushAllowanceConnection! + + """The repository associated with this branch protection rule.""" + repository: GitHubRepository + + """Number of approving reviews required to update matching branches.""" + requiredApprovingReviewCount: Int + + """ + List of required status check contexts that must pass for commits to be accepted to matching branches. + """ + requiredStatusCheckContexts: [String] + + """Are approving reviews required to update matching branches.""" + requiresApprovingReviews: Boolean! + + """Are reviews from code owners required to update matching branches.""" + requiresCodeOwnerReviews: Boolean! + + """Are commits required to be signed.""" + requiresCommitSignatures: Boolean! + + """Are status checks required to update matching branches.""" + requiresStatusChecks: Boolean! + + """Are branches required to be up to date before merging.""" + requiresStrictStatusChecks: Boolean! + + """Is pushing to matching branches restricted.""" + restrictsPushes: Boolean! + + """Is dismissal of pull request reviews restricted.""" + restrictsReviewDismissals: Boolean! + + """A list review dismissal allowances for this branch protection rule.""" + reviewDismissalAllowances( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReviewDismissalAllowanceConnection! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubBranchProtectionRuleEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubBranchProtectionRule +} + +"""The connection type for BranchProtectionRule.""" +type GitHubBranchProtectionRuleConnection { + """A list of edges.""" + edges: [GitHubBranchProtectionRuleEdge] + + """A list of nodes.""" + nodes: [GitHubBranchProtectionRule] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""A repository contains the content for a project.""" +type GitHubRepository implements OneGraphNode & GitHubUniformResourceLocatable & GitHubSubscribable & GitHubStarrable & GitHubRepositoryInfo & GitHubRegistryPackageSearch & GitHubRegistryPackageOwner & GitHubProjectOwner & GitHubNode { + """A list of users that can be assigned to issues in this repository.""" + assignableUsers( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filters users with query on user name and login""" + query: String + ): GitHubUserConnection! + + """A list of branch protection rules for this repository.""" + branchProtectionRules( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubBranchProtectionRuleConnection! + + """Returns the code of conduct for this repository""" + codeOfConduct: GitHubCodeOfConduct + + """A list of collaborators associated with the repository.""" + collaborators( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filters users with query on user name and login""" + query: String + + """Collaborators affiliation level with a repository.""" + affiliation: GitHubCollaboratorAffiliation + ): GitHubRepositoryCollaboratorConnection + + """A list of commit comments associated with the repository.""" + commitComments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCommitCommentConnection! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The Ref associated with the repository's default branch.""" + defaultBranchRef: GitHubRef + + """ + Whether or not branches are automatically deleted when merged in this repository. + """ + deleteBranchOnMerge: Boolean! + + """A list of deploy keys that are on this repository.""" + deployKeys( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubDeployKeyConnection! + + """Deployments associated with the repository""" + deployments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for deployments returned from the connection.""" + orderBy: GitHubDeploymentOrder + + """Environments to list deployments for""" + environments: [String!] + ): GitHubDeploymentConnection! + + """The description of the repository.""" + description: String + + """The description of the repository rendered to HTML.""" + descriptionHTML: String! + + """The number of kilobytes this repository occupies on disk.""" + diskUsage: Int + + """ + Returns how many forks there are of this repository in the whole network. + """ + forkCount: Int! + + """A list of direct forked repositories.""" + forks( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + If non-null, filters repositories according to whether they have been locked + """ + isLocked: Boolean + + """ + Array of owner's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the organization or user being viewed owns. + """ + ownerAffiliations: [GitHubRepositoryAffiliation] + + """ + Array of viewer's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the current viewer owns. + """ + affiliations: [GitHubRepositoryAffiliation] + + """Ordering options for repositories returned from the connection""" + orderBy: GitHubRepositoryOrder + + """If non-null, filters repositories according to privacy""" + privacy: GitHubRepositoryPrivacy + ): GitHubRepositoryConnection! + + """The funding links for this repository""" + fundingLinks: [GitHubFundingLink!]! + + """Indicates if the repository has issues feature enabled.""" + hasIssuesEnabled: Boolean! + + """Indicates if the repository has the Projects feature enabled.""" + hasProjectsEnabled: Boolean! + + """Indicates if the repository has wiki feature enabled.""" + hasWikiEnabled: Boolean! + + """The repository's URL.""" + homepageUrl: String + + """""" + id: ID! + + """Indicates if the repository is unmaintained.""" + isArchived: Boolean! + + """Returns whether or not this repository disabled.""" + isDisabled: Boolean! + + """Identifies if the repository is a fork.""" + isFork: Boolean! + + """Indicates if the repository has been locked or not.""" + isLocked: Boolean! + + """Identifies if the repository is a mirror.""" + isMirror: Boolean! + + """Identifies if the repository is private.""" + isPrivate: Boolean! + + """ + Identifies if the repository is a template that can be used to generate new repositories. + """ + isTemplate: Boolean! + + """Returns a single issue from the current repository by number.""" + issue( + """The number for the issue to be returned.""" + number: Int! + ): GitHubIssue + + """ + Returns a single issue-like object from the current repository by number. + """ + issueOrPullRequest( + """The number for the issue to be returned.""" + number: Int! + ): GitHubIssueOrPullRequest + + """A list of issues that have been opened in the repository.""" + issues( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filtering options for issues returned from the connection.""" + filterBy: GitHubIssueFilters + + """A list of states to filter the issues by.""" + states: [GitHubIssueState!] + + """A list of label names to filter the pull requests by.""" + labels: [String!] + + """Ordering options for issues returned from the connection.""" + orderBy: GitHubIssueOrder + ): GitHubIssueConnection! + + """Returns a single label by name""" + label( + """Label name""" + name: String! + ): GitHubLabel + + """A list of labels associated with the repository.""" + labels( + """If provided, searches labels by name and description.""" + query: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for labels returned from the connection.""" + orderBy: GitHubLabelOrder + ): GitHubLabelConnection + + """ + A list containing a breakdown of the language composition of the repository. + """ + languages( + """Order for connection""" + orderBy: GitHubLanguageOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubLanguageConnection + + """The license associated with the repository""" + licenseInfo: GitHubLicense + + """The reason the repository has been locked.""" + lockReason: GitHubRepositoryLockReason + + """ + A list of Users that can be mentioned in the context of the repository. + """ + mentionableUsers( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filters users with query on user name and login""" + query: String + ): GitHubUserConnection! + + """Whether or not PRs are merged with a merge commit on this repository.""" + mergeCommitAllowed: Boolean! + + """Returns a single milestone from the current repository by number.""" + milestone( + """The number for the milestone to be returned.""" + number: Int! + ): GitHubMilestone + + """A list of milestones associated with the repository.""" + milestones( + """Ordering options for milestones.""" + orderBy: GitHubMilestoneOrder + + """Filter by the state of the milestones.""" + states: [GitHubMilestoneState!] + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubMilestoneConnection + + """The repository's original mirror URL.""" + mirrorUrl: String + + """The name of the repository.""" + name: String! + + """The repository's name with owner.""" + nameWithOwner: String! + + """A Git object in the repository""" + object( + """A Git revision expression suitable for rev-parse""" + expression: String + + """The Git object ID""" + oid: String + ): GitHubGitObject + + """The image used to represent this repository in Open Graph data.""" + openGraphImageUrl: String! + + """The User owner of the repository.""" + owner: GitHubRepositoryOwner! + + """The repository parent, if this is a fork.""" + parent: GitHubRepository + + """The primary language of the repository's code.""" + primaryLanguage: GitHubLanguage + + """Find project by number.""" + project( + """The project number to find.""" + number: Int! + ): GitHubProject + + """A list of projects under the owner.""" + projects( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """A list of states to filter the projects by.""" + states: [GitHubProjectState!] + + """Query to search projects by, currently only searching by name.""" + search: String + + """Ordering options for projects returned from the connection""" + orderBy: GitHubProjectOrder + ): GitHubProjectConnection! + + """The HTTP path listing the repository's projects""" + projectsResourcePath: String! + + """The HTTP URL listing the repository's projects""" + projectsUrl: String! + + """Returns a single pull request from the current repository by number.""" + pullRequest( + """The number for the pull request to be returned.""" + number: Int! + ): GitHubPullRequest + + """A list of pull requests that have been opened in the repository.""" + pullRequests( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for pull requests returned from the connection.""" + orderBy: GitHubIssueOrder + + """The base ref name to filter the pull requests by.""" + baseRefName: String + + """The head ref name to filter the pull requests by.""" + headRefName: String + + """A list of label names to filter the pull requests by.""" + labels: [String!] + + """A list of states to filter the pull requests by.""" + states: [GitHubPullRequestState!] + ): GitHubPullRequestConnection! + + """Identifies when the repository was last pushed to.""" + pushedAt: String + + """Whether or not rebase-merging is enabled on this repository.""" + rebaseMergeAllowed: Boolean! + + """Fetch a given ref from the repository""" + ref( + """ + The ref to retrieve. Fully qualified matches are checked in order (`refs/heads/master`) before falling back onto checks for short name matches (`master`). + """ + qualifiedName: String! + ): GitHubRef + + """Fetch a list of refs from the repository""" + refs( + """Ordering options for refs returned from the connection.""" + orderBy: GitHubRefOrder + + """DEPRECATED: use orderBy. The ordering direction.""" + direction: GitHubOrderDirection + + """A ref name prefix like `refs/heads/`, `refs/tags/`, etc.""" + refPrefix: String! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filters refs with query on name""" + query: String + ): GitHubRefConnection + + """A list of registry packages under the owner.""" + registryPackages( + """Filter registry package by whether it is publicly visible""" + publicOnly: Boolean + + """Filter registry package by type (string).""" + registryPackageType: String + + """Filter registry package by type.""" + packageType: GitHubRegistryPackageType + + """Find registry packages in a repository.""" + repositoryId: ID + + """Find registry packages by their names.""" + names: [String] + + """Find registry package by name.""" + name: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageOwner` object instead. Removal on 2020-04-01 UTC.") + + """A list of registry packages for a particular search query.""" + registryPackagesForQuery( + """Filter registry package by type.""" + packageType: GitHubRegistryPackageType + + """Find registry package by search query.""" + query: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageSearch` object instead. Removal on 2020-04-01 UTC.") + + """Lookup a single release given various criteria.""" + release( + """The name of the Tag the Release was created from""" + tagName: String! + ): GitHubRelease + + """List of releases which are dependent on this repository.""" + releases( + """Order for connection""" + orderBy: GitHubReleaseOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReleaseConnection! + + """A list of applied repository-topic associations for this repository.""" + repositoryTopics( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRepositoryTopicConnection! + + """The HTTP path for this repository""" + resourcePath: String! + + """ + A description of the repository, rendered to HTML without any links in it. + """ + shortDescriptionHTML( + """How many characters to return.""" + limit: Int + ): String! + + """Whether or not squash-merging is enabled on this repository.""" + squashMergeAllowed: Boolean! + + """The SSH URL to clone this repository""" + sshUrl: String! + + """A list of users who have starred this starrable.""" + stargazers( + """Order for connection""" + orderBy: GitHubStarOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubStargazerConnection! + + """ + Returns a list of all submodules in this repository parsed from the .gitmodules file as of the default branch's HEAD commit. + """ + submodules( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSubmoduleConnection! + + """Temporary authentication token for cloning this repository.""" + tempCloneToken: String + + """The repository from which this repository was generated, if any.""" + templateRepository: GitHubRepository + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this repository""" + url: String! + + """ + Whether this repository has a custom image to use with Open Graph as opposed to being represented by the owner's avatar. + """ + usesCustomOpenGraphImage: Boolean! + + """Indicates whether the viewer has admin permissions on this repository.""" + viewerCanAdminister: Boolean! + + """Can the current viewer create new projects on this owner.""" + viewerCanCreateProjects: Boolean! + + """ + Check if the viewer is able to change their subscription status for the repository. + """ + viewerCanSubscribe: Boolean! + + """Indicates whether the viewer can update the topics of this repository.""" + viewerCanUpdateTopics: Boolean! + + """ + Returns a boolean indicating whether the viewing user has starred this starrable. + """ + viewerHasStarred: Boolean! + + """ + The users permission level on the repository. Will return null if authenticated as an GitHub App. + """ + viewerPermission: GitHubRepositoryPermission + + """ + Identifies if the viewer is watching, not watching, or ignoring the subscribable entity. + """ + viewerSubscription: GitHubSubscriptionState + + """A list of vulnerability alerts that are on this repository.""" + vulnerabilityAlerts( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRepositoryVulnerabilityAlertConnection + + """A list of users watching the repository.""" + watchers( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserConnection! + + """ + Lists contributors to the specified repository and sorts them by the number of commits per contributor in descending order. This endpoint may return information that is a few hours old because the GitHub REST API v3 caches contributor data to improve performance. + + Note that GitHub identifies contributors by author email address. This field groups contribution counts by GitHub user, which includes all associated email addresses. To improve performance, only the first 500 author email addresses in the repository link to GitHub users. The rest will appear as anonymous contributors without associated GitHub user information. + """ + contributors_oneGraph( + """The pagination cursor used to control which results you want""" + after: String + includeAnonymousContributors: Boolean + ): GitHubRepositoryContributorConnection! @deprecated(reason: "*Temporary mutation until GitHub implemements their own `contributors` field for a repostiory.*") + + """Whether a the current user is a collaborator on this repository""" + viewerIsCollaborator_oneGraph: Boolean! @deprecated(reason: "*Temporary mutation until GitHub implemements their own `viewerIsCollaborator` field for a repository.*") + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +enum GitHubOrderDirection { + """Specifies an ascending order for a given `orderBy` argument.""" + ASC + + """Specifies a descending order for a given `orderBy` argument.""" + DESC +} + +enum GitHubIssueOrderField { + """Order issues by creation time""" + CREATED_AT + + """Order issues by update time""" + UPDATED_AT + + """Order issues by comment count""" + COMMENTS +} + +"""Ways in which lists of issues can be ordered upon return.""" +input GitHubIssueOrder { + """The direction in which to order issues by the specified field.""" + direction: GitHubOrderDirection! + + """The field in which to order issues by.""" + field: GitHubIssueOrderField! +} + +enum GitHubPullRequestState { + """A pull request that is still open.""" + OPEN + + """A pull request that has been closed without being merged.""" + CLOSED + + """A pull request that has been closed by being merged.""" + MERGED +} + +"""Represents a Git reference.""" +type GitHubRef implements OneGraphNode & GitHubNode { + """A list of pull requests with this ref as the head ref.""" + associatedPullRequests( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for pull requests returned from the connection.""" + orderBy: GitHubIssueOrder + + """The base ref name to filter the pull requests by.""" + baseRefName: String + + """The head ref name to filter the pull requests by.""" + headRefName: String + + """A list of label names to filter the pull requests by.""" + labels: [String!] + + """A list of states to filter the pull requests by.""" + states: [GitHubPullRequestState!] + ): GitHubPullRequestConnection! + + """""" + id: ID! + + """The ref name.""" + name: String! + + """The ref's prefix, such as `refs/heads/` or `refs/tags/`.""" + prefix: String! + + """The repository the ref belongs to.""" + repository: GitHubRepository! + + """The object the ref points to.""" + target: GitHubGitObject! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Information about pagination in a connection.""" +type GitHubPageInfo { + """When paginating forwards, the cursor to continue.""" + endCursor: String + + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: String +} + +"""Represents a user.""" +type GitHubUserEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubUser +} + +"""The connection type for User.""" +type GitHubUserConnection { + """A list of edges.""" + edges: [GitHubUserEdge] + + """A list of nodes.""" + nodes: [GitHubUser] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubLockReason { + """ + The issue or pull request was locked because the conversation was off-topic. + """ + OFF_TOPIC + + """ + The issue or pull request was locked because the conversation was too heated. + """ + TOO_HEATED + + """ + The issue or pull request was locked because the conversation was resolved. + """ + RESOLVED + + """ + The issue or pull request was locked because the conversation was spam. + """ + SPAM +} + +"""A repository pull request.""" +type GitHubPullRequest implements OneGraphNode & GitHubUpdatableComment & GitHubUpdatable & GitHubUniformResourceLocatable & GitHubSubscribable & GitHubRepositoryNode & GitHubReactable & GitHubNode & GitHubLockable & GitHubLabelable & GitHubComment & GitHubClosable & GitHubAssignable { + """Reason that the conversation was locked.""" + activeLockReason: GitHubLockReason + + """The number of additions in this pull request.""" + additions: Int! + + """A list of Users assigned to this object.""" + assignees( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserConnection! + + """The actor who authored the comment.""" + author: GitHubActor + + """Author's association with the subject of the comment.""" + authorAssociation: GitHubCommentAuthorAssociation! + + """Identifies the base Ref associated with the pull request.""" + baseRef: GitHubRef + + """ + Identifies the name of the base Ref associated with the pull request, even if the ref has been deleted. + """ + baseRefName: String! + + """ + Identifies the oid of the base ref associated with the pull request, even if the ref has been deleted. + """ + baseRefOid: String! + + """The repository associated with this pull request's base Ref.""" + baseRepository: GitHubRepository + + """The body as Markdown.""" + body: String! + + """The body rendered to HTML.""" + bodyHTML: String! + + """The body rendered to text.""" + bodyText: String! + + """The number of changed files in this pull request.""" + changedFiles: Int! + + """The HTTP path for the checks of this pull request.""" + checksResourcePath: String! + + """The HTTP URL for the checks of this pull request.""" + checksUrl: String! + + """`true` if the pull request is closed""" + closed: Boolean! + + """Identifies the date and time when the object was closed.""" + closedAt: String + + """A list of comments associated with the pull request.""" + comments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubIssueCommentConnection! + + """ + A list of commits present in this pull request's head branch not present in the base branch. + """ + commits( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubPullRequestCommitConnection! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Check if this comment was created via an email reply.""" + createdViaEmail: Boolean! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The number of deletions in this pull request.""" + deletions: Int! + + """The actor who edited this pull request's body.""" + editor: GitHubActor + + """Lists the files changed within this pull request.""" + files( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubPullRequestChangedFileConnection + + """Identifies the head Ref associated with the pull request.""" + headRef: GitHubRef + + """ + Identifies the name of the head Ref associated with the pull request, even if the ref has been deleted. + """ + headRefName: String! + + """ + Identifies the oid of the head ref associated with the pull request, even if the ref has been deleted. + """ + headRefOid: String! + + """The repository associated with this pull request's head Ref.""" + headRepository: GitHubRepository + + """ + The owner of the repository associated with this pull request's head Ref. + """ + headRepositoryOwner: GitHubRepositoryOwner + + """The hovercard information for this issue""" + hovercard( + """Whether or not to include notification contexts""" + includeNotificationContexts: Boolean + ): GitHubHovercard! + + """""" + id: ID! + + """ + Check if this comment was edited and includes an edit with the creation data + """ + includesCreatedEdit: Boolean! + + """The head and base repositories are different.""" + isCrossRepository: Boolean! + + """Identifies if the pull request is a draft.""" + isDraft: Boolean! + + """A list of labels associated with the object.""" + labels( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for labels returned from the connection.""" + orderBy: GitHubLabelOrder + ): GitHubLabelConnection + + """The moment the editor made the last edit""" + lastEditedAt: String + + """`true` if the pull request is locked""" + locked: Boolean! + + """Indicates whether maintainers can modify the pull request.""" + maintainerCanModify: Boolean! + + """The commit that was created when this pull request was merged.""" + mergeCommit: GitHubCommit + + """ + Whether or not the pull request can be merged based on the existence of merge conflicts. + """ + mergeable: GitHubMergeableState! + + """Whether or not the pull request was merged.""" + merged: Boolean! + + """The date and time that the pull request was merged.""" + mergedAt: String + + """The actor who merged the pull request.""" + mergedBy: GitHubActor + + """Identifies the milestone associated with the pull request.""" + milestone: GitHubMilestone + + """Identifies the pull request number.""" + number: Int! + + """ + A list of Users that are participating in the Pull Request conversation. + """ + participants( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserConnection! + + """The permalink to the pull request.""" + permalink: String! + + """ + The commit that GitHub automatically generated to test if this pull request could be merged. This field will not return a value if the pull request is merged, or if the test merge commit is still being generated. See the `mergeable` field for more details on the mergeability of the pull request. + """ + potentialMergeCommit: GitHubCommit + + """List of project cards associated with this pull request.""" + projectCards( + """A list of archived states to filter the cards by""" + archivedStates: [GitHubProjectCardArchivedState] + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubProjectCardConnection! + + """Identifies when the comment was published at.""" + publishedAt: String + + """A list of reactions grouped by content left on the subject.""" + reactionGroups: [GitHubReactionGroup!] + + """A list of Reactions left on the Issue.""" + reactions( + """Allows specifying the order in which reactions are returned.""" + orderBy: GitHubReactionOrder + + """Allows filtering Reactions by emoji.""" + content: GitHubReactionContent + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReactionConnection! + + """The repository associated with this node.""" + repository: GitHubRepository! + + """The HTTP path for this pull request.""" + resourcePath: String! + + """The HTTP path for reverting this pull request.""" + revertResourcePath: String! + + """The HTTP URL for reverting this pull request.""" + revertUrl: String! + + """The current status of this pull request with respect to code review.""" + reviewDecision: GitHubPullRequestReviewDecision + + """A list of review requests associated with the pull request.""" + reviewRequests( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReviewRequestConnection + + """The list of all review threads for this pull request.""" + reviewThreads( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubPullRequestReviewThreadConnection! + + """A list of reviews associated with the pull request.""" + reviews( + """Filter by author of the review.""" + author: String + + """A list of states to filter the reviews.""" + states: [GitHubPullRequestReviewState!] + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubPullRequestReviewConnection + + """Identifies the state of the pull request.""" + state: GitHubPullRequestState! + + """ + A list of reviewer suggestions based on commit history and past review comments. + """ + suggestedReviewers: [GitHubSuggestedReviewer]! + + """ + A list of events, comments, commits, etc. associated with the pull request. + """ + timeline( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Allows filtering timeline events by a `since` timestamp.""" + since: String + ): GitHubPullRequestTimelineConnection! @deprecated(reason: "`timeline` will be removed Use PullRequest.timelineItems instead. Removal on 2019-10-01 UTC.") + + """ + A list of events, comments, commits, etc. associated with the pull request. + """ + timelineItems( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filter timeline items by type.""" + itemTypes: [GitHubPullRequestTimelineItemsItemType!] + + """Skips the first _n_ elements in the list.""" + skip: Int + + """Filter timeline items by a `since` timestamp.""" + since: String + ): GitHubPullRequestTimelineItemsConnection! + + """Identifies the pull request title.""" + title: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this pull request.""" + url: String! + + """A list of edits to this content.""" + userContentEdits( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserContentEditConnection + + """Whether or not the viewer can apply suggestion.""" + viewerCanApplySuggestion: Boolean! + + """Can user react to this subject""" + viewerCanReact: Boolean! + + """ + Check if the viewer is able to change their subscription status for the repository. + """ + viewerCanSubscribe: Boolean! + + """Check if the current viewer can update this object.""" + viewerCanUpdate: Boolean! + + """Reasons why the current viewer can not update this comment.""" + viewerCannotUpdateReasons: [GitHubCommentCannotUpdateReason!]! + + """Did the viewer author this comment.""" + viewerDidAuthor: Boolean! + + """ + Identifies if the viewer is watching, not watching, or ignoring the subscribable entity. + """ + viewerSubscription: GitHubSubscriptionState + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubPullRequestEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubPullRequest +} + +"""The connection type for PullRequest.""" +type GitHubPullRequestConnection { + """A list of edges.""" + edges: [GitHubPullRequestEdge] + + """A list of nodes.""" + nodes: [GitHubPullRequest] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""Represents a Git commit.""" +type GitHubCommit implements OneGraphNode & GitHubUniformResourceLocatable & GitHubSubscribable & GitHubNode & GitHubGitObject { + """An abbreviated version of the Git object ID""" + abbreviatedOid: String! + + """The number of additions in this commit.""" + additions: Int! + + """The pull requests associated with a commit""" + associatedPullRequests( + """Ordering options for pull requests.""" + orderBy: GitHubPullRequestOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubPullRequestConnection + + """Authorship details of the commit.""" + author: GitHubGitActor + + """Check if the committer and the author match.""" + authoredByCommitter: Boolean! + + """The datetime when this commit was authored.""" + authoredDate: String! + + """Fetches `git blame` information.""" + blame( + """The file whose Git blame information you want.""" + path: String! + ): GitHubBlame! + + """The number of changed files in this commit.""" + changedFiles: Int! + + """Comments made on the commit.""" + comments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCommitCommentConnection! + + """The HTTP path for this Git object""" + commitResourcePath: String! + + """The HTTP URL for this Git object""" + commitUrl: String! + + """The datetime when this commit was committed.""" + committedDate: String! + + """Check if commited via GitHub web UI.""" + committedViaWeb: Boolean! + + """Committership details of the commit.""" + committer: GitHubGitActor + + """The number of deletions in this commit.""" + deletions: Int! + + """The deployments associated with a commit.""" + deployments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for deployments returned from the connection.""" + orderBy: GitHubDeploymentOrder + + """Environments to list deployments for""" + environments: [String!] + ): GitHubDeploymentConnection + + """ + The linear commit history starting from (and including) this commit, in the same order as `git log`. + """ + history( + """Allows specifying an ending time or date for fetching commits.""" + until: String + + """Allows specifying a beginning time or date for fetching commits.""" + since: String + + """ + If non-null, filters history to only show commits with matching authorship. + """ + author: GitHubCommitAuthor + + """ + If non-null, filters history to only show commits touching files under this path. + """ + path: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCommitHistoryConnection! + + """""" + id: ID! + + """The Git commit message""" + message: String! + + """The Git commit message body""" + messageBody: String! + + """The commit message body rendered to HTML.""" + messageBodyHTML: String! + + """The Git commit message headline""" + messageHeadline: String! + + """The commit message headline rendered to HTML.""" + messageHeadlineHTML: String! + + """The Git object ID""" + oid: String! + + """The organization this commit was made on behalf of.""" + onBehalfOf: GitHubOrganization + + """The parents of a commit.""" + parents( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCommitConnection! + + """The datetime when this commit was pushed.""" + pushedDate: String + + """The Repository this commit belongs to""" + repository: GitHubRepository! + + """The HTTP path for this commit""" + resourcePath: String! + + """Commit signing information, if present.""" + signature: GitHubGitSignature + + """Status information for this commit""" + status: GitHubStatus + + """Check and Status rollup information for this commit.""" + statusCheckRollup: GitHubStatusCheckRollup + + """ + Returns a list of all submodules in this repository as of this Commit parsed from the .gitmodules file. + """ + submodules( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSubmoduleConnection! + + """ + Returns a URL to download a tarball archive for a repository. + Note: For private repositories, these links are temporary and expire after five minutes. + """ + tarballUrl: String! + + """Commit's root Tree""" + tree: GitHubTree! + + """The HTTP path for the tree of this commit""" + treeResourcePath: String! + + """The HTTP URL for the tree of this commit""" + treeUrl: String! + + """The HTTP URL for this commit""" + url: String! + + """ + Check if the viewer is able to change their subscription status for the repository. + """ + viewerCanSubscribe: Boolean! + + """ + Identifies if the viewer is watching, not watching, or ignoring the subscribable entity. + """ + viewerSubscription: GitHubSubscriptionState + + """ + Returns a URL to download a zipball archive for a repository. + Note: For private repositories, these links are temporary and expire after five minutes. + """ + zipballUrl: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A review comment associated with a given repository pull request.""" +type GitHubPullRequestReviewComment implements OneGraphNode & GitHubUpdatableComment & GitHubUpdatable & GitHubRepositoryNode & GitHubReactable & GitHubNode & GitHubMinimizable & GitHubDeletable & GitHubComment { + """The actor who authored the comment.""" + author: GitHubActor + + """Author's association with the subject of the comment.""" + authorAssociation: GitHubCommentAuthorAssociation! + + """The comment body of this review comment.""" + body: String! + + """The body rendered to HTML.""" + bodyHTML: String! + + """The comment body of this review comment rendered as plain text.""" + bodyText: String! + + """Identifies the commit associated with the comment.""" + commit: GitHubCommit + + """Identifies when the comment was created.""" + createdAt: String! + + """Check if this comment was created via an email reply.""" + createdViaEmail: Boolean! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The diff hunk to which the comment applies.""" + diffHunk: String! + + """Identifies when the comment was created in a draft state.""" + draftedAt: String! + + """The actor who edited the comment.""" + editor: GitHubActor + + """""" + id: ID! + + """ + Check if this comment was edited and includes an edit with the creation data + """ + includesCreatedEdit: Boolean! + + """Returns whether or not a comment has been minimized.""" + isMinimized: Boolean! + + """The moment the editor made the last edit""" + lastEditedAt: String + + """Returns why the comment was minimized.""" + minimizedReason: String + + """Identifies the original commit associated with the comment.""" + originalCommit: GitHubCommit + + """The original line index in the diff to which the comment applies.""" + originalPosition: Int! + + """Identifies when the comment body is outdated""" + outdated: Boolean! + + """The path to which the comment applies.""" + path: String! + + """The line index in the diff to which the comment applies.""" + position: Int + + """Identifies when the comment was published at.""" + publishedAt: String + + """The pull request associated with this review comment.""" + pullRequest: GitHubPullRequest! + + """The pull request review associated with this review comment.""" + pullRequestReview: GitHubPullRequestReview + + """A list of reactions grouped by content left on the subject.""" + reactionGroups: [GitHubReactionGroup!] + + """A list of Reactions left on the Issue.""" + reactions( + """Allows specifying the order in which reactions are returned.""" + orderBy: GitHubReactionOrder + + """Allows filtering Reactions by emoji.""" + content: GitHubReactionContent + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReactionConnection! + + """The comment this is a reply to.""" + replyTo: GitHubPullRequestReviewComment + + """The repository associated with this node.""" + repository: GitHubRepository! + + """The HTTP path permalink for this review comment.""" + resourcePath: String! + + """Identifies the state of the comment.""" + state: GitHubPullRequestReviewCommentState! + + """Identifies when the comment was last updated.""" + updatedAt: String! + + """The HTTP URL permalink for this review comment.""" + url: String! + + """A list of edits to this content.""" + userContentEdits( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserContentEditConnection + + """Check if the current viewer can delete this object.""" + viewerCanDelete: Boolean! + + """Check if the current viewer can minimize this object.""" + viewerCanMinimize: Boolean! + + """Can user react to this subject""" + viewerCanReact: Boolean! + + """Check if the current viewer can update this object.""" + viewerCanUpdate: Boolean! + + """Reasons why the current viewer can not update this comment.""" + viewerCannotUpdateReasons: [GitHubCommentCannotUpdateReason!]! + + """Did the viewer author this comment.""" + viewerDidAuthor: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Represents a subject that can be reacted on.""" +interface GitHubReactable { + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + + """A list of reactions grouped by content left on the subject.""" + reactionGroups: [GitHubReactionGroup!] + + """A list of Reactions left on the Issue.""" + reactions( + """Allows specifying the order in which reactions are returned.""" + orderBy: GitHubReactionOrder + + """Allows filtering Reactions by emoji.""" + content: GitHubReactionContent + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReactionConnection! + + """Can user react to this subject""" + viewerCanReact: Boolean! +} + +enum GitHubReactionContent { + """Represents the `:+1:` emoji.""" + THUMBS_UP + + """Represents the `:-1:` emoji.""" + THUMBS_DOWN + + """Represents the `:laugh:` emoji.""" + LAUGH + + """Represents the `:hooray:` emoji.""" + HOORAY + + """Represents the `:confused:` emoji.""" + CONFUSED + + """Represents the `:heart:` emoji.""" + HEART + + """Represents the `:rocket:` emoji.""" + ROCKET + + """Represents the `:eyes:` emoji.""" + EYES +} + +"""A group of emoji reactions to a particular piece of content.""" +type GitHubReactionGroup { + """Identifies the emoji reaction.""" + content: GitHubReactionContent! + + """Identifies when the reaction was created.""" + createdAt: String + + """The subject that was reacted to.""" + subject: GitHubReactable! + + """ + Users who have reacted to the reaction subject with the emotion represented by this reaction group + """ + users( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReactingUserConnection! + + """ + Whether or not the authenticated user has left a reaction on the subject. + """ + viewerHasReacted: Boolean! +} + +"""A comment on a team discussion.""" +type GitHubTeamDiscussionComment implements OneGraphNode & GitHubUpdatableComment & GitHubUpdatable & GitHubUniformResourceLocatable & GitHubReactable & GitHubNode & GitHubDeletable & GitHubComment { + """The actor who authored the comment.""" + author: GitHubActor + + """Author's association with the comment's team.""" + authorAssociation: GitHubCommentAuthorAssociation! + + """The body as Markdown.""" + body: String! + + """The body rendered to HTML.""" + bodyHTML: String! + + """The body rendered to text.""" + bodyText: String! + + """The current version of the body content.""" + bodyVersion: String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Check if this comment was created via an email reply.""" + createdViaEmail: Boolean! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The discussion this comment is about.""" + discussion: GitHubTeamDiscussion! + + """The actor who edited the comment.""" + editor: GitHubActor + + """""" + id: ID! + + """ + Check if this comment was edited and includes an edit with the creation data + """ + includesCreatedEdit: Boolean! + + """The moment the editor made the last edit""" + lastEditedAt: String + + """Identifies the comment number.""" + number: Int! + + """Identifies when the comment was published at.""" + publishedAt: String + + """A list of reactions grouped by content left on the subject.""" + reactionGroups: [GitHubReactionGroup!] + + """A list of Reactions left on the Issue.""" + reactions( + """Allows specifying the order in which reactions are returned.""" + orderBy: GitHubReactionOrder + + """Allows filtering Reactions by emoji.""" + content: GitHubReactionContent + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReactionConnection! + + """The HTTP path for this comment""" + resourcePath: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this comment""" + url: String! + + """A list of edits to this content.""" + userContentEdits( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserContentEditConnection + + """Check if the current viewer can delete this object.""" + viewerCanDelete: Boolean! + + """Can user react to this subject""" + viewerCanReact: Boolean! + + """Check if the current viewer can update this object.""" + viewerCanUpdate: Boolean! + + """Reasons why the current viewer can not update this comment.""" + viewerCannotUpdateReasons: [GitHubCommentCannotUpdateReason!]! + + """Did the viewer author this comment.""" + viewerDidAuthor: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubTeamDiscussionCommentEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubTeamDiscussionComment +} + +"""The connection type for TeamDiscussionComment.""" +type GitHubTeamDiscussionCommentConnection { + """A list of edges.""" + edges: [GitHubTeamDiscussionCommentEdge] + + """A list of nodes.""" + nodes: [GitHubTeamDiscussionComment] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubCommentAuthorAssociation { + """Author is a member of the organization that owns the repository.""" + MEMBER + + """Author is the owner of the repository.""" + OWNER + + """Author has been invited to collaborate on the repository.""" + COLLABORATOR + + """Author has previously committed to the repository.""" + CONTRIBUTOR + + """Author has not previously committed to the repository.""" + FIRST_TIME_CONTRIBUTOR + + """Author has not previously committed to GitHub.""" + FIRST_TIMER + + """Author has no association with the repository.""" + NONE +} + +"""A team discussion.""" +type GitHubTeamDiscussion implements OneGraphNode & GitHubUpdatableComment & GitHubUpdatable & GitHubUniformResourceLocatable & GitHubSubscribable & GitHubReactable & GitHubNode & GitHubDeletable & GitHubComment { + """The actor who authored the comment.""" + author: GitHubActor + + """Author's association with the discussion's team.""" + authorAssociation: GitHubCommentAuthorAssociation! + + """The body as Markdown.""" + body: String! + + """The body rendered to HTML.""" + bodyHTML: String! + + """The body rendered to text.""" + bodyText: String! + + """Identifies the discussion body hash.""" + bodyVersion: String! + + """A list of comments on this discussion.""" + comments( + """ + When provided, filters the connection such that results begin with the comment with this number. + """ + fromComment: Int + + """Order for connection""" + orderBy: GitHubTeamDiscussionCommentOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubTeamDiscussionCommentConnection! + + """The HTTP path for discussion comments""" + commentsResourcePath: String! + + """The HTTP URL for discussion comments""" + commentsUrl: String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Check if this comment was created via an email reply.""" + createdViaEmail: Boolean! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The actor who edited the comment.""" + editor: GitHubActor + + """""" + id: ID! + + """ + Check if this comment was edited and includes an edit with the creation data + """ + includesCreatedEdit: Boolean! + + """Whether or not the discussion is pinned.""" + isPinned: Boolean! + + """ + Whether or not the discussion is only visible to team members and org admins. + """ + isPrivate: Boolean! + + """The moment the editor made the last edit""" + lastEditedAt: String + + """Identifies the discussion within its team.""" + number: Int! + + """Identifies when the comment was published at.""" + publishedAt: String + + """A list of reactions grouped by content left on the subject.""" + reactionGroups: [GitHubReactionGroup!] + + """A list of Reactions left on the Issue.""" + reactions( + """Allows specifying the order in which reactions are returned.""" + orderBy: GitHubReactionOrder + + """Allows filtering Reactions by emoji.""" + content: GitHubReactionContent + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReactionConnection! + + """The HTTP path for this discussion""" + resourcePath: String! + + """The team that defines the context of this discussion.""" + team: GitHubTeam! + + """The title of the discussion""" + title: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this discussion""" + url: String! + + """A list of edits to this content.""" + userContentEdits( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserContentEditConnection + + """Check if the current viewer can delete this object.""" + viewerCanDelete: Boolean! + + """Whether or not the current viewer can pin this discussion.""" + viewerCanPin: Boolean! + + """Can user react to this subject""" + viewerCanReact: Boolean! + + """ + Check if the viewer is able to change their subscription status for the repository. + """ + viewerCanSubscribe: Boolean! + + """Check if the current viewer can update this object.""" + viewerCanUpdate: Boolean! + + """Reasons why the current viewer can not update this comment.""" + viewerCannotUpdateReasons: [GitHubCommentCannotUpdateReason!]! + + """Did the viewer author this comment.""" + viewerDidAuthor: Boolean! + + """ + Identifies if the viewer is watching, not watching, or ignoring the subscribable entity. + """ + viewerSubscription: GitHubSubscriptionState + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Entities that can be subscribed to for web and email notifications.""" +interface GitHubSubscribable { + """""" + id: ID! + + """ + Check if the viewer is able to change their subscription status for the repository. + """ + viewerCanSubscribe: Boolean! + + """ + Identifies if the viewer is watching, not watching, or ignoring the subscribable entity. + """ + viewerSubscription: GitHubSubscriptionState +} + +"""Represents an 'unsubscribed' event on a given `Subscribable`.""" +type GitHubUnsubscribedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """Object referenced by event.""" + subscribable: GitHubSubscribable! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An item in a pull request timeline""" +union GitHubPullRequestTimelineItems = GitHubUserBlockedEvent | GitHubUnsubscribedEvent | GitHubUnpinnedEvent | GitHubUnmarkedAsDuplicateEvent | GitHubUnlockedEvent | GitHubUnlabeledEvent | GitHubUnassignedEvent | GitHubTransferredEvent | GitHubSubscribedEvent | GitHubReviewRequestedEvent | GitHubReviewRequestRemovedEvent | GitHubReviewDismissedEvent | GitHubReopenedEvent | GitHubRenamedTitleEvent | GitHubRemovedFromProjectEvent | GitHubReferencedEvent | GitHubReadyForReviewEvent | GitHubPullRequestRevisionMarker | GitHubPullRequestReviewThread | GitHubPullRequestReview | GitHubPullRequestCommitCommentThread | GitHubPullRequestCommit | GitHubPinnedEvent | GitHubMovedColumnsInProjectEvent | GitHubMilestonedEvent | GitHubMergedEvent | GitHubMentionedEvent | GitHubMarkedAsDuplicateEvent | GitHubLockedEvent | GitHubLabeledEvent | GitHubIssueComment | GitHubHeadRefRestoredEvent | GitHubHeadRefForcePushedEvent | GitHubHeadRefDeletedEvent | GitHubDisconnectedEvent | GitHubDeploymentEnvironmentChangedEvent | GitHubDeployedEvent | GitHubDemilestonedEvent | GitHubCrossReferencedEvent | GitHubConvertedNoteToIssueEvent | GitHubConnectedEvent | GitHubCommentDeletedEvent | GitHubClosedEvent | GitHubBaseRefForcePushedEvent | GitHubBaseRefChangedEvent | GitHubAssignedEvent | GitHubAddedToProjectEvent + +enum GitHubUserBlockDuration { + """The user was blocked for 1 day""" + ONE_DAY + + """The user was blocked for 3 days""" + THREE_DAYS + + """The user was blocked for 7 days""" + ONE_WEEK + + """The user was blocked for 30 days""" + ONE_MONTH + + """The user was blocked permanently""" + PERMANENT +} + +"""Represents a 'user_blocked' event on a given user.""" +type GitHubUserBlockedEvent implements OneGraphNode & GitHubNode { + """Identifies the actor who performed the event.""" + actor: GitHubActor + + """Number of days that the user was blocked for.""" + blockDuration: GitHubUserBlockDuration! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """""" + id: ID! + + """The user who was blocked.""" + subject: GitHubUser + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edit on user content""" +type GitHubUserContentEdit implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the date and time when the object was deleted.""" + deletedAt: String + + """The actor who deleted this content""" + deletedBy: GitHubActor + + """A summary of the changes for this edit""" + diff: String + + """When this content was edited""" + editedAt: String! + + """The actor who edited this content""" + editor: GitHubActor + + """""" + id: ID! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An object with an ID.""" +interface GitHubNode { + """ID of the object.""" + id: ID! +} + +"""Filter linked nodes by __typename.""" +input OneGraphLinkedNodesTypenameFilter { + """ + Checks for linked nodes where the __typename is in the list of the provided values. + """ + in: [String!] + + """ + Checks for linked nodes where the __typename is equal to the provided value. + """ + equalTo: String +} + +"""Services supported by OneGraph.""" +enum OneGraphServiceEnumArg { + BOX + DEV_TO + DRIBBBLE + DROPBOX + CONTENTFUL + EGGHEADIO + EVENTIL + FACEBOOK + GITHUB + GMAIL + GOOGLE + GOOGLE_ANALYTICS + GOOGLE_CALENDAR + GOOGLE_COMPUTE + GOOGLE_DOCS + GOOGLE_TRANSLATE + HUBSPOT + INTERCOM + MAILCHIMP + MEETUP + NETLIFY + PRODUCT_HUNT + QUICKBOOKS + SALESFORCE + SLACK + SPOTIFY + STRIPE + TRELLO + TWILIO + TWITTER + TWITCH_TV + YOUTUBE + ZEIT + ZENDESK + AIRTABLE + BREX + BUNDLEPHOBIA + CRUNCHBASE + CLEARBIT + CLOUDFLARE + FEDEX + GOOGLE_MAPS + IMMIGRATION_GRAPH + UPS + USPS + NPM + LOGDNA + MIXPANEL + ONEGRAPH +} + +"""Filter linked nodes by service.""" +input OneGraphLinkedNodesServiceFilter { + """ + Checks for linked nodes where the service is in the list of the provided values. + """ + in: [OneGraphServiceEnumArg!] + + """ + Checks for linked nodes where the service is equal to the provided value. + """ + equalTo: OneGraphServiceEnumArg +} + +input OneGraphLinkedNodesConnectionFilter { + """Filter connections by their GraphQL __typename""" + typename: OneGraphLinkedNodesTypenameFilter + + """Filter connections by service""" + service: OneGraphLinkedNodesServiceFilter +} + +"""The user's description of what they're currently doing.""" +type GitHubUserStatus implements OneGraphNode & GitHubNode { + """Identifies the date and time when the object was created.""" + createdAt: String! + + """An emoji summarizing the user's status.""" + emoji: String + + """The status emoji as HTML.""" + emojiHTML: String + + """If set, the status will not be shown after this date.""" + expiresAt: String + + """ID of the object.""" + id: ID! + + """ + Whether this status indicates the user is not fully available on GitHub. + """ + indicatesLimitedAvailability: Boolean! + + """A brief message describing what the user is doing.""" + message: String + + """ + The organization whose members can see this status. If null, this status is publicly visible. + """ + organization: GitHubOrganization + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The user who has this status.""" + user: GitHubUser! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An object with a globally unique id across all of OneGraph""" +interface OneGraphNode { + """The id of the object.""" + oneGraphId: ID! + + """List of OneGraphNodes that are linked from this node.""" + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! +} + +"""List of OneGraphNodes that are linked from this node.""" +type OneGraphLinkedNodesConnection { + """List of OneGraphNodes that are linked from this node.""" + nodes: [OneGraphNode!]! +} + +"""A special type of user which takes actions on behalf of GitHub Apps.""" +type GitHubBot implements OneGraphNode & GitHubUniformResourceLocatable & GitHubNode & GitHubActor { + """A URL pointing to the GitHub App's public avatar.""" + avatarUrl( + """The size of the resulting square image.""" + size: Int + ): String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """""" + id: ID! + + """The username of the actor.""" + login: String! + + """The HTTP path for this bot""" + resourcePath: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this bot""" + url: String! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Types that can initiate an audit log event.""" +union GitHubAuditEntryActor = GitHubUser | GitHubOrganization | GitHubBot + +"""Audit log entry for a team.remove_repository event.""" +type GitHubTeamRemoveRepositoryAuditEntry implements OneGraphNode & GitHubTeamAuditEntryData & GitHubRepositoryAuditEntryData & GitHubOrganizationAuditEntryData & GitHubNode & GitHubAuditEntry { + """The action name""" + action: String! + + """The user who initiated the action""" + actor: GitHubAuditEntryActor + + """The IP address of the actor""" + actorIp: String + + """A readable representation of the actor's location""" + actorLocation: GitHubActorLocation + + """The username of the user who initiated the action""" + actorLogin: String + + """The HTTP path for the actor.""" + actorResourcePath: String + + """The HTTP URL for the actor.""" + actorUrl: String + + """The time the action was initiated""" + createdAt: String! + + """""" + id: ID! + + """Whether the team was mapped to an LDAP Group.""" + isLdapMapped: Boolean + + """The corresponding operation type for the action""" + operationType: GitHubOperationType + + """The Organization associated with the Audit Entry.""" + organization: GitHubOrganization + + """The name of the Organization.""" + organizationName: String + + """The HTTP path for the organization""" + organizationResourcePath: String + + """The HTTP URL for the organization""" + organizationUrl: String + + """The repository associated with the action""" + repository: GitHubRepository + + """The name of the repository""" + repositoryName: String + + """The HTTP path for the repository""" + repositoryResourcePath: String + + """The HTTP URL for the repository""" + repositoryUrl: String + + """The team associated with the action""" + team: GitHubTeam + + """The name of the team""" + teamName: String + + """The HTTP path for this team""" + teamResourcePath: String + + """The HTTP URL for this team""" + teamUrl: String + + """The user affected by the action""" + user: GitHubUser + + """ + For actions involving two users, the actor is the initiator and the user is the affected user. + """ + userLogin: String + + """The HTTP path for the user.""" + userResourcePath: String + + """The HTTP URL for the user.""" + userUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An audit entry in an organization audit log.""" +union GitHubOrganizationAuditEntry = GitHubTeamRemoveRepositoryAuditEntry | GitHubTeamRemoveMemberAuditEntry | GitHubTeamChangeParentTeamAuditEntry | GitHubTeamAddRepositoryAuditEntry | GitHubTeamAddMemberAuditEntry | GitHubRepositoryVisibilityChangeEnableAuditEntry | GitHubRepositoryVisibilityChangeDisableAuditEntry | GitHubRepoRemoveTopicAuditEntry | GitHubRepoRemoveMemberAuditEntry | GitHubRepoDestroyAuditEntry | GitHubRepoCreateAuditEntry | GitHubRepoConfigUnlockAnonymousGitAccessAuditEntry | GitHubRepoConfigLockAnonymousGitAccessAuditEntry | GitHubRepoConfigEnableSockpuppetDisallowedAuditEntry | GitHubRepoConfigEnableContributorsOnlyAuditEntry | GitHubRepoConfigEnableCollaboratorsOnlyAuditEntry | GitHubRepoConfigEnableAnonymousGitAccessAuditEntry | GitHubRepoConfigDisableSockpuppetDisallowedAuditEntry | GitHubRepoConfigDisableContributorsOnlyAuditEntry | GitHubRepoConfigDisableCollaboratorsOnlyAuditEntry | GitHubRepoConfigDisableAnonymousGitAccessAuditEntry | GitHubRepoChangeMergeSettingAuditEntry | GitHubRepoArchivedAuditEntry | GitHubRepoAddTopicAuditEntry | GitHubRepoAddMemberAuditEntry | GitHubRepoAccessAuditEntry | GitHubPrivateRepositoryForkingEnableAuditEntry | GitHubPrivateRepositoryForkingDisableAuditEntry | GitHubOrgUpdateMemberRepositoryInvitationPermissionAuditEntry | GitHubOrgUpdateMemberRepositoryCreationPermissionAuditEntry | GitHubOrgUpdateMemberAuditEntry | GitHubOrgUpdateDefaultRepositoryPermissionAuditEntry | GitHubOrgUnblockUserAuditEntry | GitHubOrgRestoreMemberAuditEntry | GitHubOrgRemoveOutsideCollaboratorAuditEntry | GitHubOrgRemoveMemberAuditEntry | GitHubOrgRemoveBillingManagerAuditEntry | GitHubOrgOauthAppAccessRequestedAuditEntry | GitHubOrgOauthAppAccessDeniedAuditEntry | GitHubOrgOauthAppAccessApprovedAuditEntry | GitHubOrgInviteToBusinessAuditEntry | GitHubOrgInviteMemberAuditEntry | GitHubOrgEnableTwoFactorRequirementAuditEntry | GitHubOrgEnableSamlAuditEntry | GitHubOrgEnableOauthAppRestrictionsAuditEntry | GitHubOrgDisableTwoFactorRequirementAuditEntry | GitHubOrgDisableSamlAuditEntry | GitHubOrgDisableOauthAppRestrictionsAuditEntry | GitHubOrgCreateAuditEntry | GitHubOrgConfigEnableCollaboratorsOnlyAuditEntry | GitHubOrgConfigDisableCollaboratorsOnlyAuditEntry | GitHubOrgBlockUserAuditEntry | GitHubOrgAddMemberAuditEntry | GitHubOrgAddBillingManagerAuditEntry | GitHubOauthApplicationCreateAuditEntry | GitHubMembersCanDeleteReposEnableAuditEntry | GitHubMembersCanDeleteReposDisableAuditEntry | GitHubMembersCanDeleteReposClearAuditEntry + +"""An edge in a connection.""" +type GitHubOrganizationAuditEntryEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubOrganizationAuditEntry +} + +"""The connection type for OrganizationAuditEntry.""" +type GitHubOrganizationAuditEntryConnection { + """A list of edges.""" + edges: [GitHubOrganizationAuditEntryEdge] + + """A list of nodes.""" + nodes: [GitHubOrganizationAuditEntry] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +""" +An account on GitHub, with one or more owners, that has repositories, members and teams. +""" +type GitHubOrganization implements OneGraphNode & GitHubUniformResourceLocatable & GitHubSponsorable & GitHubRepositoryOwner & GitHubRegistryPackageSearch & GitHubRegistryPackageOwner & GitHubProjectOwner & GitHubProfileOwner & GitHubNode & GitHubMemberStatusable & GitHubActor { + """ + Determine if this repository owner has any items that can be pinned to their profile. + """ + anyPinnableItems( + """Filter to only a particular kind of pinnable item.""" + type: GitHubPinnableItemType + ): Boolean! + + """Audit log entries of the organization""" + auditLog( + """Ordering options for the returned audit log entries.""" + orderBy: GitHubAuditLogOrder + + """The query string to filter audit entries""" + query: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationAuditEntryConnection! + + """A URL pointing to the organization's public avatar.""" + avatarUrl( + """The size of the resulting square image.""" + size: Int + ): String! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The organization's public profile description.""" + description: String + + """The organization's public profile description rendered to HTML.""" + descriptionHTML: String + + """The organization's public email.""" + email: String + + """""" + id: ID! + + """Whether the organization has verified its profile email and website.""" + isVerified: Boolean! + + """ + Showcases a selection of repositories and gists that the profile owner has either curated or that have been selected automatically based on popularity. + """ + itemShowcase: GitHubProfileItemShowcase! + + """The organization's public profile location.""" + location: String + + """The organization's login name.""" + login: String! + + """ + Get the status messages members of this entity have set that are either public or visible only to the organization. + """ + memberStatuses( + """Ordering options for user statuses returned from the connection.""" + orderBy: GitHubUserStatusOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserStatusConnection! + + """A list of users who are members of this organization.""" + membersWithRole( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationMemberConnection! + + """The organization's public profile name.""" + name: String + + """The HTTP path creating a new team""" + newTeamResourcePath: String! + + """The HTTP URL creating a new team""" + newTeamUrl: String! + + """The billing email for the organization.""" + organizationBillingEmail: String + + """A list of users who have been invited to join this organization.""" + pendingMembers( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserConnection! + + """ + A list of repositories and gists this profile owner can pin to their profile. + """ + pinnableItems( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filter the types of pinnable items that are returned.""" + types: [GitHubPinnableItemType!] + ): GitHubPinnableItemConnection! + + """ + A list of repositories and gists this profile owner has pinned to their profile + """ + pinnedItems( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filter the types of pinned items that are returned.""" + types: [GitHubPinnableItemType!] + ): GitHubPinnableItemConnection! + + """ + Returns how many more items this profile owner can pin to their profile. + """ + pinnedItemsRemaining: Int! + + """A list of repositories this user has pinned to their profile""" + pinnedRepositories( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + If non-null, filters repositories according to whether they have been locked + """ + isLocked: Boolean + + """ + Array of owner's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the organization or user being viewed owns. + """ + ownerAffiliations: [GitHubRepositoryAffiliation] + + """ + Array of viewer's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the current viewer owns. + """ + affiliations: [GitHubRepositoryAffiliation] + + """Ordering options for repositories returned from the connection""" + orderBy: GitHubRepositoryOrder + + """If non-null, filters repositories according to privacy""" + privacy: GitHubRepositoryPrivacy + ): GitHubRepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") + + """Find project by number.""" + project( + """The project number to find.""" + number: Int! + ): GitHubProject + + """A list of projects under the owner.""" + projects( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """A list of states to filter the projects by.""" + states: [GitHubProjectState!] + + """Query to search projects by, currently only searching by name.""" + search: String + + """Ordering options for projects returned from the connection""" + orderBy: GitHubProjectOrder + ): GitHubProjectConnection! + + """The HTTP path listing organization's projects""" + projectsResourcePath: String! + + """The HTTP URL listing organization's projects""" + projectsUrl: String! + + """A list of registry packages under the owner.""" + registryPackages( + """Filter registry package by whether it is publicly visible""" + publicOnly: Boolean + + """Filter registry package by type (string).""" + registryPackageType: String + + """Filter registry package by type.""" + packageType: GitHubRegistryPackageType + + """Find registry packages in a repository.""" + repositoryId: ID + + """Find registry packages by their names.""" + names: [String] + + """Find registry package by name.""" + name: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageOwner` object instead. Removal on 2020-04-01 UTC.") + + """A list of registry packages for a particular search query.""" + registryPackagesForQuery( + """Filter registry package by type.""" + packageType: GitHubRegistryPackageType + + """Find registry package by search query.""" + query: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageSearch` object instead. Removal on 2020-04-01 UTC.") + + """A list of repositories that the user owns.""" + repositories( + """ + If non-null, filters repositories according to whether they are forks of another repository + """ + isFork: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + If non-null, filters repositories according to whether they have been locked + """ + isLocked: Boolean + + """ + Array of owner's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the organization or user being viewed owns. + """ + ownerAffiliations: [GitHubRepositoryAffiliation] + + """ + Array of viewer's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the current viewer owns. + """ + affiliations: [GitHubRepositoryAffiliation] + + """Ordering options for repositories returned from the connection""" + orderBy: GitHubRepositoryOrder + + """If non-null, filters repositories according to privacy""" + privacy: GitHubRepositoryPrivacy + ): GitHubRepositoryConnection! + + """Find Repository.""" + repository( + """Name of Repository to find.""" + name: String! + ): GitHubRepository + + """ + When true the organization requires all members, billing managers, and outside collaborators to enable two-factor authentication. + """ + requiresTwoFactorAuthentication: Boolean + + """The HTTP path for this organization.""" + resourcePath: String! + + """The Organization's SAML identity providers""" + samlIdentityProvider: GitHubOrganizationIdentityProvider + + """The GitHub Sponsors listing for this user.""" + sponsorsListing: GitHubSponsorsListing + + """This object's sponsorships as the maintainer.""" + sponsorshipsAsMaintainer( + """ + Ordering options for sponsorships returned from this connection. If left blank, the sponsorships will be ordered based on relevancy to the viewer. + """ + orderBy: GitHubSponsorshipOrder + + """Whether or not to include private sponsorships in the result set""" + includePrivate: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSponsorshipConnection! + + """This object's sponsorships as the sponsor.""" + sponsorshipsAsSponsor( + """ + Ordering options for sponsorships returned from this connection. If left blank, the sponsorships will be ordered based on relevancy to the viewer. + """ + orderBy: GitHubSponsorshipOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSponsorshipConnection! + + """Find an organization's team by its slug.""" + team( + """The name or slug of the team to find.""" + slug: String! + ): GitHubTeam + + """A list of teams in this organization.""" + teams( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """If true, restrict to only root teams""" + rootTeamsOnly: Boolean + + """ + If true, filters teams that are mapped to an LDAP Group (Enterprise only) + """ + ldapMapped: Boolean + + """Ordering options for teams returned from the connection""" + orderBy: GitHubTeamOrder + + """User logins to filter by""" + userLogins: [String!] + + """If non-null, filters teams with query on team name and team slug""" + query: String + + """ + If non-null, filters teams according to whether the viewer is an admin or member on team + """ + role: GitHubTeamRole + + """If non-null, filters teams according to privacy""" + privacy: GitHubTeamPrivacy + ): GitHubTeamConnection! + + """The HTTP path listing organization's teams""" + teamsResourcePath: String! + + """The HTTP URL listing organization's teams""" + teamsUrl: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this organization.""" + url: String! + + """Organization is adminable by the viewer.""" + viewerCanAdminister: Boolean! + + """Can the viewer pin repositories and gists to the profile?""" + viewerCanChangePinnedItems: Boolean! + + """Can the current viewer create new projects on this owner.""" + viewerCanCreateProjects: Boolean! + + """Viewer can create repositories on this organization""" + viewerCanCreateRepositories: Boolean! + + """Viewer can create teams on this organization.""" + viewerCanCreateTeams: Boolean! + + """Viewer is an active member of this organization.""" + viewerIsAMember: Boolean! + + """The organization's public profile URL.""" + websiteUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +""" +Represents an object which can take actions on GitHub. Typically a User or Bot. +""" +interface GitHubActor { + """A URL pointing to the actor's public avatar.""" + avatarUrl( + """The size of the resulting square image.""" + size: Int + ): String! + + """The username of the actor.""" + login: String! + + """The HTTP path for this actor.""" + resourcePath: String! + + """The HTTP URL for this actor.""" + url: String! +} + +"""Represents a comment on a given Commit.""" +type GitHubCommitComment implements OneGraphNode & GitHubUpdatableComment & GitHubUpdatable & GitHubRepositoryNode & GitHubReactable & GitHubNode & GitHubMinimizable & GitHubDeletable & GitHubComment { + """The actor who authored the comment.""" + author: GitHubActor + + """Author's association with the subject of the comment.""" + authorAssociation: GitHubCommentAuthorAssociation! + + """Identifies the comment body.""" + body: String! + + """The body rendered to HTML.""" + bodyHTML: String! + + """The body rendered to text.""" + bodyText: String! + + """ + Identifies the commit associated with the comment, if the commit exists. + """ + commit: GitHubCommit + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Check if this comment was created via an email reply.""" + createdViaEmail: Boolean! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The actor who edited the comment.""" + editor: GitHubActor + + """""" + id: ID! + + """ + Check if this comment was edited and includes an edit with the creation data + """ + includesCreatedEdit: Boolean! + + """Returns whether or not a comment has been minimized.""" + isMinimized: Boolean! + + """The moment the editor made the last edit""" + lastEditedAt: String + + """Returns why the comment was minimized.""" + minimizedReason: String + + """Identifies the file path associated with the comment.""" + path: String + + """Identifies the line position associated with the comment.""" + position: Int + + """Identifies when the comment was published at.""" + publishedAt: String + + """A list of reactions grouped by content left on the subject.""" + reactionGroups: [GitHubReactionGroup!] + + """A list of Reactions left on the Issue.""" + reactions( + """Allows specifying the order in which reactions are returned.""" + orderBy: GitHubReactionOrder + + """Allows filtering Reactions by emoji.""" + content: GitHubReactionContent + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubReactionConnection! + + """The repository associated with this node.""" + repository: GitHubRepository! + + """The HTTP path permalink for this commit comment.""" + resourcePath: String! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL permalink for this commit comment.""" + url: String! + + """A list of edits to this content.""" + userContentEdits( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubUserContentEditConnection + + """Check if the current viewer can delete this object.""" + viewerCanDelete: Boolean! + + """Check if the current viewer can minimize this object.""" + viewerCanMinimize: Boolean! + + """Can user react to this subject""" + viewerCanReact: Boolean! + + """Check if the current viewer can update this object.""" + viewerCanUpdate: Boolean! + + """Reasons why the current viewer can not update this comment.""" + viewerCannotUpdateReasons: [GitHubCommentCannotUpdateReason!]! + + """Did the viewer author this comment.""" + viewerDidAuthor: Boolean! + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""An edge in a connection.""" +type GitHubCommitCommentEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitHubCommitComment +} + +"""The connection type for CommitComment.""" +type GitHubCommitCommentConnection { + """A list of edges.""" + edges: [GitHubCommitCommentEdge] + + """A list of nodes.""" + nodes: [GitHubCommitComment] + + """Information to aid in pagination.""" + pageInfo: GitHubPageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +enum GitHubPinnableItemType { + """A repository.""" + REPOSITORY + + """A gist.""" + GIST + + """An issue.""" + ISSUE + + """A project.""" + PROJECT + + """A pull request.""" + PULL_REQUEST + + """A user.""" + USER + + """An organization.""" + ORGANIZATION + + """A team.""" + TEAM +} + +""" +A user is an individual's account on GitHub that owns repositories and can make new content. +""" +type GitHubUser implements OneGraphNode & GitHubUniformResourceLocatable & GitHubSponsorable & GitHubRepositoryOwner & GitHubRegistryPackageSearch & GitHubRegistryPackageOwner & GitHubProjectOwner & GitHubProfileOwner & GitHubNode & GitHubActor { + """ + Determine if this repository owner has any items that can be pinned to their profile. + """ + anyPinnableItems( + """Filter to only a particular kind of pinnable item.""" + type: GitHubPinnableItemType + ): Boolean! + + """A URL pointing to the user's public avatar.""" + avatarUrl( + """The size of the resulting square image.""" + size: Int + ): String! + + """The user's public profile bio.""" + bio: String + + """The user's public profile bio as HTML.""" + bioHTML: String! + + """A list of commit comments made by this user.""" + commitComments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubCommitCommentConnection! + + """The user's public profile company.""" + company: String + + """The user's public profile company as HTML.""" + companyHTML: String! + + """ + The collection of contributions this user has made to different repositories. + """ + contributionsCollection( + """ + Only contributions made before and up to and including this time will be counted. If omitted, defaults to the current time. + """ + to: String + + """ + Only contributions made at this time or later will be counted. If omitted, defaults to a year ago. + """ + from: String + + """The ID of the organization used to filter contributions.""" + organizationID: ID + ): GitHubContributionsCollection! + + """Identifies the date and time when the object was created.""" + createdAt: String! + + """Identifies the primary key from the database.""" + databaseId: Int + + """The user's publicly visible profile email.""" + email: String! + + """A list of users the given user is followed by.""" + followers( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubFollowerConnection! + + """A list of users the given user is following.""" + following( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubFollowingConnection! + + """Find gist by repo name.""" + gist( + """The gist name to find.""" + name: String! + ): GitHubGist + + """A list of gist comments made by this user.""" + gistComments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubGistCommentConnection! + + """A list of the Gists the user has created.""" + gists( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for gists returned from the connection""" + orderBy: GitHubGistOrder + + """Filters Gists according to privacy.""" + privacy: GitHubGistPrivacy + ): GitHubGistConnection! + + """The hovercard information for this user in a given context""" + hovercard( + """The ID of the subject to get the hovercard in the context of""" + primarySubjectId: ID + ): GitHubHovercard! + + """""" + id: ID! + + """ + Whether or not this user is a participant in the GitHub Security Bug Bounty. + """ + isBountyHunter: Boolean! + + """ + Whether or not this user is a participant in the GitHub Campus Experts Program. + """ + isCampusExpert: Boolean! + + """Whether or not this user is a GitHub Developer Program member.""" + isDeveloperProgramMember: Boolean! + + """Whether or not this user is a GitHub employee.""" + isEmployee: Boolean! + + """Whether or not the user has marked themselves as for hire.""" + isHireable: Boolean! + + """Whether or not this user is a site administrator.""" + isSiteAdmin: Boolean! + + """Whether or not this user is the viewing user.""" + isViewer: Boolean! + + """A list of issue comments made by this user.""" + issueComments( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubIssueCommentConnection! + + """A list of issues associated with this user.""" + issues( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filtering options for issues returned from the connection.""" + filterBy: GitHubIssueFilters + + """A list of states to filter the issues by.""" + states: [GitHubIssueState!] + + """A list of label names to filter the pull requests by.""" + labels: [String!] + + """Ordering options for issues returned from the connection.""" + orderBy: GitHubIssueOrder + ): GitHubIssueConnection! + + """ + Showcases a selection of repositories and gists that the profile owner has either curated or that have been selected automatically based on popularity. + """ + itemShowcase: GitHubProfileItemShowcase! + + """The user's public profile location.""" + location: String + + """The username used to login.""" + login: String! + + """The user's public profile name.""" + name: String + + """Find an organization by its login that the user belongs to.""" + organization( + """The login of the organization to find.""" + login: String! + ): GitHubOrganization + + """A list of organizations the user belongs to.""" + organizations( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubOrganizationConnection! + + """ + A list of repositories and gists this profile owner can pin to their profile. + """ + pinnableItems( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filter the types of pinnable items that are returned.""" + types: [GitHubPinnableItemType!] + ): GitHubPinnableItemConnection! + + """ + A list of repositories and gists this profile owner has pinned to their profile + """ + pinnedItems( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Filter the types of pinned items that are returned.""" + types: [GitHubPinnableItemType!] + ): GitHubPinnableItemConnection! + + """ + Returns how many more items this profile owner can pin to their profile. + """ + pinnedItemsRemaining: Int! + + """A list of repositories this user has pinned to their profile""" + pinnedRepositories( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + If non-null, filters repositories according to whether they have been locked + """ + isLocked: Boolean + + """ + Array of owner's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the organization or user being viewed owns. + """ + ownerAffiliations: [GitHubRepositoryAffiliation] + + """ + Array of viewer's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the current viewer owns. + """ + affiliations: [GitHubRepositoryAffiliation] + + """Ordering options for repositories returned from the connection""" + orderBy: GitHubRepositoryOrder + + """If non-null, filters repositories according to privacy""" + privacy: GitHubRepositoryPrivacy + ): GitHubRepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") + + """Find project by number.""" + project( + """The project number to find.""" + number: Int! + ): GitHubProject + + """A list of projects under the owner.""" + projects( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """A list of states to filter the projects by.""" + states: [GitHubProjectState!] + + """Query to search projects by, currently only searching by name.""" + search: String + + """Ordering options for projects returned from the connection""" + orderBy: GitHubProjectOrder + ): GitHubProjectConnection! + + """The HTTP path listing user's projects""" + projectsResourcePath: String! + + """The HTTP URL listing user's projects""" + projectsUrl: String! + + """A list of public keys associated with this user.""" + publicKeys( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubPublicKeyConnection! + + """A list of pull requests associated with this user.""" + pullRequests( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """Ordering options for pull requests returned from the connection.""" + orderBy: GitHubIssueOrder + + """The base ref name to filter the pull requests by.""" + baseRefName: String + + """The head ref name to filter the pull requests by.""" + headRefName: String + + """A list of label names to filter the pull requests by.""" + labels: [String!] + + """A list of states to filter the pull requests by.""" + states: [GitHubPullRequestState!] + ): GitHubPullRequestConnection! + + """A list of registry packages under the owner.""" + registryPackages( + """Filter registry package by whether it is publicly visible""" + publicOnly: Boolean + + """Filter registry package by type (string).""" + registryPackageType: String + + """Filter registry package by type.""" + packageType: GitHubRegistryPackageType + + """Find registry packages in a repository.""" + repositoryId: ID + + """Find registry packages by their names.""" + names: [String] + + """Find registry package by name.""" + name: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageOwner` object instead. Removal on 2020-04-01 UTC.") + + """A list of registry packages for a particular search query.""" + registryPackagesForQuery( + """Filter registry package by type.""" + packageType: GitHubRegistryPackageType + + """Find registry package by search query.""" + query: String + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRegistryPackageConnection! @deprecated(reason: "Renaming GitHub Packages fields and objects. Use the `PackageSearch` object instead. Removal on 2020-04-01 UTC.") + + """A list of repositories that the user owns.""" + repositories( + """ + If non-null, filters repositories according to whether they are forks of another repository + """ + isFork: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + If non-null, filters repositories according to whether they have been locked + """ + isLocked: Boolean + + """ + Array of owner's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the organization or user being viewed owns. + """ + ownerAffiliations: [GitHubRepositoryAffiliation] + + """ + Array of viewer's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the current viewer owns. + """ + affiliations: [GitHubRepositoryAffiliation] + + """Ordering options for repositories returned from the connection""" + orderBy: GitHubRepositoryOrder + + """If non-null, filters repositories according to privacy""" + privacy: GitHubRepositoryPrivacy + ): GitHubRepositoryConnection! + + """A list of repositories that the user recently contributed to.""" + repositoriesContributedTo( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + If non-null, include only the specified types of contributions. The GitHub.com UI uses [COMMIT, ISSUE, PULL_REQUEST, REPOSITORY] + """ + contributionTypes: [GitHubRepositoryContributionType] + + """If true, include user repositories""" + includeUserRepositories: Boolean + + """ + If non-null, filters repositories according to whether they have been locked + """ + isLocked: Boolean + + """Ordering options for repositories returned from the connection""" + orderBy: GitHubRepositoryOrder + + """If non-null, filters repositories according to privacy""" + privacy: GitHubRepositoryPrivacy + ): GitHubRepositoryConnection! + + """Find Repository.""" + repository( + """Name of Repository to find.""" + name: String! + ): GitHubRepository + + """The HTTP path for this user""" + resourcePath: String! + + """Replies this user has saved""" + savedReplies( + """The field to order saved replies by.""" + orderBy: GitHubSavedReplyOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSavedReplyConnection + + """The GitHub Sponsors listing for this user.""" + sponsorsListing: GitHubSponsorsListing + + """This object's sponsorships as the maintainer.""" + sponsorshipsAsMaintainer( + """ + Ordering options for sponsorships returned from this connection. If left blank, the sponsorships will be ordered based on relevancy to the viewer. + """ + orderBy: GitHubSponsorshipOrder + + """Whether or not to include private sponsorships in the result set""" + includePrivate: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSponsorshipConnection! + + """This object's sponsorships as the sponsor.""" + sponsorshipsAsSponsor( + """ + Ordering options for sponsorships returned from this connection. If left blank, the sponsorships will be ordered based on relevancy to the viewer. + """ + orderBy: GitHubSponsorshipOrder + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubSponsorshipConnection! + + """Repositories the user has starred.""" + starredRepositories( + """Order for connection""" + orderBy: GitHubStarOrder + + """ + Filters starred repositories to only return repositories owned by the viewer. + """ + ownedByViewer: Boolean + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubStarredRepositoryConnection! + + """The user's description of what they're currently doing.""" + status: GitHubUserStatus + + """ + Repositories the user has contributed to, ordered by contribution rank, plus repositories the user has created + + """ + topRepositories( + """How far back in time to fetch contributed repositories""" + since: String + + """Ordering options for repositories returned from the connection""" + orderBy: GitHubRepositoryOrder! + + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + ): GitHubRepositoryConnection! + + """Identifies the date and time when the object was last updated.""" + updatedAt: String! + + """The HTTP URL for this user""" + url: String! + + """Can the viewer pin repositories and gists to the profile?""" + viewerCanChangePinnedItems: Boolean! + + """Can the current viewer create new projects on this owner.""" + viewerCanCreateProjects: Boolean! + + """Whether or not the viewer is able to follow the user.""" + viewerCanFollow: Boolean! + + """Whether or not this user is followed by the viewer.""" + viewerIsFollowing: Boolean! + + """A list of repositories the given user is watching.""" + watching( + """Returns the last _n_ elements from the list.""" + last: Int + + """Returns the first _n_ elements from the list.""" + first: Int + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + If non-null, filters repositories according to whether they have been locked + """ + isLocked: Boolean + + """ + Array of owner's affiliation options for repositories returned from the connection. For example, OWNER will include only repositories that the organization or user being viewed owns. + """ + ownerAffiliations: [GitHubRepositoryAffiliation] + + """ + Affiliation options for repositories returned from the connection. If none specified, the results will include repositories for which the current viewer is an owner or collaborator, or member. + """ + affiliations: [GitHubRepositoryAffiliation] + + """Ordering options for repositories returned from the connection""" + orderBy: GitHubRepositoryOrder + + """If non-null, filters repositories according to privacy""" + privacy: GitHubRepositoryPrivacy + ): GitHubRepositoryConnection! + + """A URL pointing to the user's public website/blog.""" + websiteUrl: String + eventilUser: EventilUser + + """ + If this GitHubUser is the currently logged in viewer, this field will contain a list of emails belonging to this GitHub user. + + See the [email address endpoint documentation](https://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user) for more details. + """ + emailsIfIsViewer_oneGraph( + """ + Only include the GitHub has considers to be the primary email for this user + """ + onlyPrimary: Boolean + + """Only include emails that GitHub has verified belong to this user""" + onlyVerified: Boolean + ): [GitHubUserEmail_oneGraph!] @deprecated(reason: "*Temporary field until GitHub implemements their own `emailsIfIsViewer` field for a user.*") + + """Linked Salesforce User""" + salesforceUser: SalesforceUser + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""A Google user""" +type GoogleUser { + """The Google user's ID""" + sub: String! + + """The Google user's full name""" + name: String + + """The Google user's given name""" + givenName: String + + """The Google user's family name""" + familyName: String + + """A link to the Google's """ + profile: String + + """The Google user's ID""" + picture: String + + """The user's gender""" + gender: String + + """The user's email""" + email: String + + """The user's email""" + emailVerified: Boolean + + """The user's locale""" + locale: String +} + +enum SpotifyContextType { + ALBUM + ARTIST + PLAYLIST +} + +type SpotifyContext { + """External URLs for this context.""" + externalUrls: SpotifyExternalUrl + + """A link to the Web API endpoint providing full details of the track.""" + href: String + + """The object type, e.g. “artist”, “playlist”, “album”.""" + type: SpotifyContextType + + """ + The [Spotify URI](/documentation/web-api/#spotify-uris-and-ids) for the context. + """ + uri: String +} + +enum SpotifyPlayerRepeatState { + OFF + TRACK + CONTEXT +} + +type SpotifyDevice { + """The device ID. This may be `null`.""" + id: String + + """If this device is the currently active device.""" + isActive: Boolean + + """If this device is currently in a private session.""" + isPrivateSession: Boolean + + """ + Whether controlling this device is restricted. At present if this is “true” then no Web API commands will be accepted by this device. + """ + isRestricted: Boolean + + """The name of the device.""" + name: String + + """Device type, such as “computer”, “smartphone” or “speaker”.""" + type: String + + """The current volume in percent. This may be null.""" + volumePercent: Int +} + +type SpotifyPlayer { + """The device that is currently active""" + device: SpotifyDevice + + """off, track, context""" + repeatState: SpotifyPlayerRepeatState + + """If shuffle is on or off""" + shuffleState: Boolean + + """ + A Context Object. Can be `null` (e.g. If private session is enabled this will be `null`). + """ + context: SpotifyContext + + """Unix Millisecond Timestamp when data was fetched""" + timestamp: Int + + """ + Progress into the currently playing track. Can be `null` (e.g. If private session is enabled this will be `null`). + """ + progressMs: Int + + """If something is currently playing.""" + isPlaying: Boolean + + """ + The currently playing track. Can be `null` (e.g. If private session is enabled this will be `null`). + """ + item: SpotifyTrack + + """ + The object type of the currently playing item. Can be one of track, episode, ad or unknown. + """ + currentlyPlayingType: String +} + +type SpotifyTrackRestriction { + """The reason why the track is not available.""" + reason: String +} + +type SpotifyExternalId { + """International Standard Recording Code""" + isrc: String + + """International Article Number""" + ean: String + + """Universal Product Code""" + upc: String +} + +enum SpotifyAlbumCopyrightsType { + C + P +} + +type SpotifyCopyright { + """The copyright text for this album.""" + text: String + + """ + The type of copyright: C = the copyright, P = the sound recording (performance) copyright. + """ + type: SpotifyAlbumCopyrightsType +} + +enum SpotifyAlbumType { + ALBUM + SINGLE + COMPILATION +} + +type SpotifyAlbum { + """The type of the album: `album`, `single`, or `compilation`.""" + albumType: SpotifyAlbumType + + """ + The artists of the album. Each artist object includes a link in `href` to more detailed information about the artist. + """ + artists: [SpotifyArtist!] + + """ + The markets in which the album is available: [ISO 3166-1 alpha-2 country codes](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Note that an album is considered available in a market when at least 1 of its tracks is available in that market. + """ + availableMarkets: [String!] + + """The copyright statements of the album.""" + copyrights: [SpotifyCopyright!] + + """Known external IDs for the album.""" + externalIds: SpotifyExternalId + + """Known external URLs for this album.""" + externalUrls: SpotifyExternalUrl + + """ + A list of the genres used to classify the album. For example: “Prog Rock” , “Post-Grunge”. (If not yet classified, the array is empty.) + """ + genres: [String!] + + """A link to the Web API endpoint providing full details of the album.""" + href: String + + """The Spotify ID for the album.""" + id: String + + """The cover art for the album in various sizes, widest first.""" + images: [SpotifyImage!] + + """The label for the album.""" + label: String + + """ + The name of the album. In case of an album takedown, the value may be an empty string. + """ + name: String + + """ + The popularity of the album. The value will be between 0 and 100, with 100 being the most popular. The popularity is calculated from the popularity of the album’s individual tracks. + """ + popularity: Int + + """ + The date the album was first released, for example “1981-12-15”. Depending on the precision, it might be shown as “1981” or “1981-12”. + """ + releaseDate: String + + """ + The precision with which release\\_date value is known: “year” , “month” , or “day”. + """ + releaseDatePrecision: String + + """The object type: “album”""" + type: String + + """The Spotify URI for the album.""" + uri: String + tracks: [SpotifyTrack!] +} + +type SpotifyArtist { + """Known external URLs for this artist.""" + externalUrls: SpotifyExternalUrl + + """Information about the followers of the artist.""" + followers: SpotifyFollowers + + """ + A list of the genres the artist is associated with. For example: `"Prog Rock"` , `"Post-Grunge"`. (If not yet classified, the array is empty.) + """ + genres: [String!] + + """A link to the Web API endpoint providing full details of the artist.""" + href: String + + """ + The [Spotify ID](/documentation/web-api/#spotify-uris-and-ids) for the artist. + """ + id: String + + """Images of the artist in various sizes, widest first.""" + images: [SpotifyImage!] + + """The name of the artist.""" + name: String + + """ + The popularity of the artist. The value will be between 0 and 100, with 100 being the most popular. The artist’s popularity is calculated from the popularity of all the artist’s tracks. + """ + popularity: Int + + """The object type: `"artist"`""" + type: String + + """ + The [Spotify URI](/documentation/web-api/#spotify-uris-and-ids) for the artist. + """ + uri: String + albums: [SpotifyAlbum!] +} + +type SpotifySimplifiedArtist { + """Known external URLs for this artist.""" + externalUrls: SpotifyExternalUrl + + """A link to the Web API endpoint providing full details of the artist.""" + href: String + + """The Spotify ID for the artist.""" + id: String + + """The name of the artist.""" + name: String + + """The object type: 'artist'""" + type: String + + """The Spotify URI for the artist.""" + uri: String +} + +type SpotifySimplifiedAlbum { + """ + The field is present when getting an artist’s albums. Possible values are “album”, “single”, “compilation”, “appears\\_on”. Compare to album\\_type this field represents relationship between the artist and the album. + """ + albumGroup: String + + """The type of the album: one of “album”, “single”, or “compilation”.""" + albumType: String + + """ + The artists of the album. Each artist object includes a link in `href` to more detailed information about the artist. + """ + artists: [SpotifySimplifiedArtist!] + + """ + The markets in which the album is available: [ISO 3166-1 alpha-2 country codes](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Note that an album is considered available in a market when at least 1 of its tracks is available in that market. + """ + availableMarkets: [String!] + + """Known external URLs for this album.""" + externalUrls: SpotifyExternalUrl + + """A link to the Web API endpoint providing full details of the album.""" + href: String + + """ + The [Spotify ID](/documentation/web-api/#spotify-uris-and-ids) for the album. + """ + id: String + + """The cover art for the album in various sizes, widest first.""" + images: [SpotifyImage!] + + """ + The name of the album. In case of an album takedown, the value may be an empty string. + """ + name: String + + """The object type: “album”""" + type: String + + """ + The [Spotify URI](/documentation/web-api/#spotify-uris-and-ids) for the album. + """ + uri: String +} + +type SpotifyTrack { + """ + The album on which the track appears. The album object includes a link in `href` to full information about the album. + """ + album: SpotifySimplifiedAlbum + + """ + The artists who performed the track. Each artist object includes a link in `href` to more detailed information about the artist. + """ + artists: [SpotifyArtist!] + + """ + A list of the countries in which the track can be played, identified by their [ISO 3166-1 alpha-2](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code. + """ + availableMarkets: [String!] + + """ + The disc number (usually `1` unless the album consists of more than one disc). + """ + discNumber: Int + + """The track length in milliseconds.""" + durationMs: Int + + """ + Whether or not the track has explicit lyrics ( `true` = yes it does; `false` = no it does not OR unknown). + """ + explicit: Boolean + + """Known external IDs for the track.""" + externalIds: SpotifyExternalId + + """Known external URLs for this track.""" + externalUrls: SpotifyExternalUrl + + """A link to the Web API endpoint providing full details of the track.""" + href: String + + """ + The [Spotify ID](/documentation/web-api/#spotify-uris-and-ids) for the track. + """ + id: String + + """ + Part of the response when [Track Relinking](/documentation/general/guides/track-relinking-guide/) is applied. If `true` , the track is playable in the given market. Otherwise `false`. + """ + isPlayable: Boolean + + """ + Part of the response when [Track Relinking](/documentation/general/guides/track-relinking-guide/) is applied, and the requested track has been replaced with different track. The track in the `linked_from` object contains information about the originally requested track. + """ + linkedFrom: SpotifyTrack + + """The name of the track.""" + name: String + + """ + The popularity of the track. The value will be between 0 and 100, with 100 being the most popular. + The popularity of a track is a value between 0 and 100, with 100 being the most popular. The popularity is calculated by algorithm and is based, in the most part, on the total number of plays the track has had and how recent those plays are. + Generally speaking, songs that are being played a lot now will have a higher popularity than songs that were played a lot in the past. Duplicate tracks (e.g. the same track from a single and an album) are rated independently. Artist and album popularity is derived mathematically from track popularity. Note that the popularity value may lag actual popularity by a few days: the value is not updated in real time. + """ + popularity: Int + + """A link to a 30 second preview (MP3 format) of the track. Can be `null`""" + previewUrl: String + + """ + Part of the response when [Track Relinking](/documentation/general/guides/track-relinking-guide/) is applied, the original track is not available in the given market, and Spotify did not have any tracks to relink it with. The track response will still contain metadata for the original track, and a restrictions object containing the reason why the track is not available: `"restrictions" : {"reason" : "market"}` + """ + restrictions: [SpotifyTrackRestriction!] + + """ + The number of the track. If an album has several discs, the track number is the number on the specified disc. + """ + trackNumber: Int + + """The object type: “track”.""" + type: String + + """ + The [Spotify URI](/documentation/web-api/#spotify-uris-and-ids) for the track. + """ + uri: String +} + +type SpotifyPublicUser { + """The name displayed on the user’s profile. `null` if not available.""" + displayName: String + + """Known public external URLs for this user.""" + externalUrls: SpotifyExternalUrl + + """Information about the followers of this user.""" + followers: SpotifyFollowers + + """A link to the Web API endpoint for this user.""" + href: String + + """ + The [Spotify user ID](/documentation/web-api/#spotify-uris-and-ids) for this user. + """ + id: String + + """The user’s profile image.""" + images: [SpotifyImage!] + + """The object type: “user”""" + type: String + + """ + The [Spotify URI](/documentation/web-api/#spotify-uris-and-ids) for this user. + """ + uri: String +} + +type SpotifyPlaylist { + """`true` if the owner allows other users to modify the playlist.""" + collaborative: Boolean + + """Known external URLs for this playlist.""" + externalUrls: SpotifyExternalUrl + + """A link to the Web API endpoint providing full details of the playlist.""" + href: String + + """ + The [Spotify ID](/documentation/web-api/#spotify-uris-and-ids) for the playlist. + """ + id: String + + """ + Images for the playlist. The array may be empty or contain up to three images. The images are returned by size in descending order. See [Working with Playlists](/documentation/general/guides/working-with-playlists/). _Note: If returned, the source URL for the image (`url`) is temporary and will expire in less than a day._ + """ + images: [SpotifyImage!] + + """The name of the playlist.""" + name: String + + """The user who owns the playlist""" + owner: SpotifyPublicUser + + """ + The playlist’s public/private status: `true` the playlist is public, `false` the playlist is private, `null` the playlist status is not relevant. For more about public/private status, see [Working with Playlists](/documentation/general/guides/working-with-playlists/) + """ + public: Boolean + + """ + The version identifier for the current playlist. Can be supplied in other requests to target a specific playlist version + """ + snapshotId: String + + """The object type: “playlist”""" + type: String + + """ + The [Spotify URI](/documentation/web-api/#spotify-uris-and-ids) for the playlist. + """ + uri: String + tracks: [SpotifyTrack!] +} + +type SpotifyImage { + """The image height in pixels. If unknown: `null` or not returned.""" + height: Int + + """The source URL of the image.""" + url: String + + """The image width in pixels. If unknown: `null` or not returned.""" + width: Int +} + +type SpotifyFollowers { + """ + A link to the Web API endpoint providing full details of the followers; `null` if not available. + """ + href: String + + """The total number of followers.""" + total: Int +} + +type SpotifyExternalUrl { + """The Spotify URL for the object.""" + spotify: String +} + +type SpotifyCurrentUserProfile { + """ + The user’s date-of-birth. _This field is only available when the current user has granted access to the [user-read-birthdate](/documentation/general/guides/authorization-guide/#list-of-scopes) scope._ + """ + birthdate: String + + """ + The country of the user, as set in the user’s account profile. An [ISO 3166-1 alpha-2 country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). _This field is only available when the current user has granted access to the [user-read-private](/documentation/general/guides/authorization-guide/#list-of-scopes) scope._ + """ + country: String + + """The name displayed on the user’s profile. `null` if not available.""" + displayName: String + + """ + The user’s email address, as entered by the user when creating their account. _**Important!** This email address is unverified; there is no proof that it actually belongs to the user._ _This field is only available when the current user has granted access to the [user-read-email](/documentation/general/guides/authorization-guide/#list-of-scopes) scope._ + """ + email: String + + """Known external URLs for this user.""" + externalUrls: SpotifyExternalUrl + + """Information about the followers of the user.""" + followers: SpotifyFollowers + + """A link to the Web API endpoint for this user.""" + href: String + + """ + The [Spotify user ID](/documentation/web-api/#spotify-uris-and-ids) for the user. + """ + id: String + + """The user’s profile image.""" + images: [SpotifyImage!] + + """ + The user’s Spotify subscription level: “premium”, “free”, etc. (The subscription level “open” can be considered the same as “free”.) _This field is only available when the current user has granted access to the [user-read-private](/documentation/general/guides/authorization-guide/#list-of-scopes) scope._ + """ + product: String + + """The object type: “user”""" + type: String + + """ + The [Spotify URI](/documentation/web-api/#spotify-uris-and-ids) for the user. + """ + uri: String + playlists(limit: Int): [SpotifyPlaylist!] + player( + """ + [Get information about the user’s current playback state, including track, track progress, and active device.](https://developer.spotify.com/documentation/web-api/reference/player/get-information-about-the-users-current-playback/)\n + """ + market: String + ): SpotifyPlayer +} + +"""A Slack user""" +type SlackUser { + """The Slack user's ID""" + id: String! + + """The Slack user's chosen display name""" + displayName: String + + """The Slack user's email""" + email: String +} + +"""A OneGraph me TwitchTv user""" +type TwitchTvUser { + """The TwitchTv user's ID""" + id: String! + + """The TwitchTv user's bio""" + bio: String + + """The TwitchTv user's display name""" + displayName: String + + """The TwitchTv user's email""" + email: String + + """Whether TwitchTv has verified this user's email""" + emailVerified: Boolean + + """The logo or avatar for this TwitchTv user""" + logo: String + + """The TwitchTv user's name""" + name: String + + """Whether this user has partnered with Twitch""" + partnered: Boolean + + """Whether this user has connected Twitter to their TwitchTv account""" + twitterConnected: Boolean + + """The type of this TwitchTv user""" + type: String +} + +"""List of Trello organizations, with metadata field for pagination""" +type TrelloOrganizationsConnection { + """List of Trello organizations""" + nodes: [TrelloOrganization!]! + + """Total number of Trello organizations""" + totalCount: Int! +} + +"""""" +type TrelloEnterpriseUserTypes { + """""" + all: Int + + """""" + member: Int + + """""" + collaborator: Int + + """""" + saml: Int + + """""" + none: Int +} + +"""""" +type TrelloEnterprisePrefsSignup { + """""" + message: String + + """""" + confirmation: String + + """""" + banner: String + + """""" + bannerHtml: String + + """""" + confirmationHtml: String + + """""" + messageHtml: String +} + +"""""" +type TrelloEnterprisePrefs { + """""" + ssoOnly: Boolean + + """""" + signup: TrelloEnterprisePrefsSignup + + """""" + mandatoryTranferDate: String + + """""" + maxMembers: Int +} + +"""""" +type TrelloEnterprise { + """The id of the enterprise.""" + id: String + + """Short-form name of the enterprise. Example: test_enterprise.""" + name: String + + """ + Long-form name of the enterprise used when displaying the full name of the enterprise. Example: Trello's Enterprise + """ + displayName: String + + """ + JSON Object containing information about the preferences set within the enterprise. Example: + + { + "ssoOnly": false, + "signup": { + "message": "😁 Howdy, friends.", + "confirmation": "We're confirming that you are a 💫.", + "banner": "Banner Text!", + "bannerHtml": "<p>Banner Text!</p>\n", + "confirmationHtml": "<p>We're confirming that you are a 💫.</p>\n", + "messageHtml": "<p>😁 Howdy, friends.</p>\n" + }, + "mandatoryTransferDate": null, + "maxMembers": null + } + """ + prefs: TrelloEnterprisePrefs + + """Determines whether SSO successfully activated.""" + ssoActivationFailed: Boolean + + """Array of Member ids that are admins of the enterprise.""" + idAdmins: [String!] + + """Array of Member ids that belong to the enterprise.""" + idMembers: [String!] + + """Array of Organization ids that belong to the enterprise.""" + idOrganizations: [String!] + + """ + Object containing keys for every member type (all, member, collaborator, saml, none) and values representing the count of each type of member. + + For example: + + { + "all": 6, + "member": 5, + "collaborator": 0, + "saml": 0, + "none": 1 + } + """ + userTypes: TrelloEnterpriseUserTypes + members: [TrelloMember!] + admins: [TrelloMember!] +} + +"""""" +type TrelloEnterpriseMembership { + """""" + enterprise: TrelloEnterprise + + """""" + displayName: String + + """""" + userType: String +} + +""" +List of Trello enterpriseMemberships, with metadata field for pagination +""" +type TrelloEnterpriseMembershipsConnection { + """List of Trello enterpriseMemberships""" + nodes: [TrelloEnterpriseMembership!]! + + """Total number of Trello enterpriseMemberships""" + totalCount: Int! +} + +"""List of Trello cards, with metadata field for pagination""" +type TrelloCardsConnection { + """List of Trello cards""" + nodes: [TrelloCard!]! + + """Total number of Trello cards""" + totalCount: Int! +} + +"""""" +type TrelloEmojiSkinVariation { + """""" + unified: String + + """""" + native: String + + """""" + sheetX: Int + + """""" + sheetY: Int +} + +"""""" +type TrelloEmojiSkinVariations { + """Light Skin Tone""" + light: TrelloEmojiSkinVariation + + """Medium-Light Skin Tone""" + mediumLight: TrelloEmojiSkinVariation + + """Medium Skin Tone""" + medium: TrelloEmojiSkinVariation + + """Medium-Dark Skin Tone""" + mediumDark: TrelloEmojiSkinVariation + + """Dark Skin Tone""" + dark: TrelloEmojiSkinVariation +} + +"""Available emojis.""" +type TrelloEmoji { + """""" + unified: String + + """""" + name: String + + """""" + native: String + + """""" + shortName: String + + """""" + shortNames: [String!] + + """""" + text: String + + """""" + texts: [String!] + + """""" + category: String + + """""" + sheetX: Int + + """""" + sheetY: Int + + """""" + skinVariations: TrelloEmojiSkinVariations + + """""" + tts: String + + """""" + keywords: [String!] +} + +"""""" +type TrelloReaction { + """""" + id: String + + """""" + member: TrelloMember + + """""" + idMember: String + + """""" + idModel: String + + """""" + idEmoji: String + + """""" + emoji: TrelloEmoji +} + +"""List of Trello reactions, with metadata field for pagination""" +type TrelloReactionsConnection { + """List of Trello reactions""" + nodes: [TrelloReaction!]! + + """Total number of Trello reactions""" + totalCount: Int! +} + +"""Previous data about the action""" +type TrelloActionDataOld { + """Previous name.""" + name: String + + """Previous position.""" + pos: Int + + """Previous closed state.""" + closed: Boolean + + """Previous list id.""" + idList: String + + """Previous description.""" + desc: String +} + +"""Relevant information regarding the action""" +type TrelloActionData { + """The Trello list attached to the action.""" + list: TrelloList + + """The source Trello list for the action.""" + listBefore: TrelloList + + """The destincation Trello list for the action.""" + listAfter: TrelloList + + """The Trello board attached to the action.""" + board: TrelloBoard + + """The Trello card attached to the action.""" + card: TrelloCard + + """The Trello organization attached to the action.""" + organization: TrelloOrganization + + """Text for a comment""" + text: String + + """Fields that changed""" + old: TrelloActionDataOld +} + +"""Filters for boards query.""" +enum TrelloBoardFilterEnumArg { + """Returns all boards that have been closed.""" + CLOSED + + """Returns all boards that have visibility set to Private.""" + MEMBERS + + """Returns all boards that are open.""" + OPEN + + """Returns all boards that have visibility set to Team.""" + ORGANIZATION + + """Returns all boards that have visibility set to Public.""" + PUBLIC + + """Returns all boards that have been starred.""" + STARRED +} + +"""List of Trello boards, with metadata field for pagination""" +type TrelloBoardsConnection { + """List of Trello boards""" + nodes: [TrelloBoard!]! + + """Total number of Trello boards""" + totalCount: Int! +} + +"""""" +type TrelloOrganizationPrefsBoardVisibility { + """""" + private: String + + """""" + org: String + + """""" + public: String +} + +"""""" +type TrelloOrganizationPrefs { + """""" + permissionLevel: String + + """""" + externalMembersDisabled: Boolean + + """""" + associatedDomain: String + + """""" + googleAppsVersion: Int + + """""" + boardVisibilityRestrict: TrelloOrganizationPrefsBoardVisibility +} + +"""""" +type TrelloOrganization { + """The id of the organization""" + id: String + + """""" + billableMemberCount: Int + + """The description for the team""" + desc: String + + """ + If there are custom emoji in the desc this will contain information about them. + """ + descData: JSON + + """The name for the team. For example: Trello Inc""" + displayName: String + + """An array of board ids that are in the team""" + idBoards: [String!] + + """""" + invited: Boolean + + """""" + logoHash: String + + """""" + memberships: [TrelloMembership!] + + """The programmatic name for the team. For example: trelloinc""" + name: String + + """""" + powerUps: [Int!] + + """The preferences (settings) for the team""" + prefs: TrelloOrganizationPrefs + + """""" + premiumFeatures: [String!] + + """""" + products: [Int!] + + """The URL to the team page on Trello""" + url: String + + """""" + website: String + actions: TrelloActionsConnection + boards( + """ + Filter boards. Add multiple filters to include boards that pass any of the fitlers + """ + filters: [TrelloBoardFilterEnumArg!] + ): TrelloBoardsConnection + members: [TrelloMember!] +} + +"""""" +type TrelloChecklistCheckItem { + """""" + state: String + + """""" + checklist: TrelloChecklist + + """""" + idChecklist: String + + """""" + id: String + + """""" + name: String + + """""" + pos: Int +} + +"""Cards can have zero or more checklists on them.""" +type TrelloChecklist { + """The id of the checklist""" + id: String + + """The board the checklist is on""" + board: TrelloBoard + + """The id of the board the checklist is on""" + idBoard: String + + """The card the checklist is on""" + card: TrelloCard + + """The id of the card the checklist is on""" + idCard: String + + """The name of the checklist""" + name: String + + """ + The position of the checklist on the card (relative to any other checklists on the card) + """ + pos: Int + + """""" + checkItems: [TrelloChecklistCheckItem!] +} + +"""Scaled images for a sticker.""" +type TrelloImageScaled { + """""" + width: Int + + """""" + height: Int + + """""" + url: String + + """""" + scaled: Boolean + + """""" + id: String +} + +"""Sticker on a card.""" +type TrelloSticker { + """""" + id: String + + """""" + top: Float + + """""" + left: Float + + """""" + zIndex: Int + + """""" + rotate: Int + + """""" + image: String + + """""" + imageUrl: String + + """""" + imageScaled: [TrelloImageScaled!] +} + +"""List of Trello stickers, with metadata field for pagination""" +type TrelloStickersConnection { + """List of Trello stickers""" + nodes: [TrelloSticker!]! + + """Total number of Trello stickers""" + totalCount: Int! +} + +"""List of Trello members, with metadata field for pagination""" +type TrelloMembersConnection { + """List of Trello members""" + nodes: [TrelloMember!]! + + """Total number of Trello members""" + totalCount: Int! +} + +type TrelloCardAttachmentPreview { + """""" + bytes: Int + + """""" + url: String + + """""" + height: Int + + """""" + width: Int + + """""" + id: String + + """""" + scaled: Boolean +} + +"""Attachment on a card""" +type TrelloCardAttachment { + """""" + id: String + + """""" + bytes: Int + + """""" + date: String + + """""" + edgeColor: String + + """""" + idMember: String + + """""" + isUpload: Boolean + + """""" + mimeType: String + + """""" + name: String + + """""" + previews: [TrelloCardAttachmentPreview!] + + """""" + url: String + + """""" + pos: Int +} + +"""""" +type TrelloCheckItemState { + """""" + idCheckItem: String + + """""" + state: String +} + +""" +Pieces of information about the card that are displayed on the front of the card. +""" +type TrelloCardBadges { + """""" + votes: Int + + """""" + viewingMemberVoted: Boolean + + """""" + subscribed: Boolean + + """""" + fogbugz: String + + """""" + checkItems: Int + + """""" + checkItemsChecked: Int + + """""" + comments: Int + + """""" + attachments: Int + + """""" + description: Boolean + + """""" + dueComplete: Boolean +} + +"""Lists in Trello contain cards. A card belongs to exactly one list.""" +type TrelloCard { + """The id of the card""" + id: String + + """ + Pieces of information about the card that are displayed on the front of the card. + + "badges": { + "votes": 0, + "viewingMemberVoted": false, + "subscribed": true, + "fogbugz": "", + "checkItems": 0, + "checkItemsChecked": 0, + "comments": 1, + "attachments": 2, + "description": true, + "due": null, + "dueComplete": false + } + """ + badges: TrelloCardBadges + + """""" + checkItemStates: [TrelloCheckItemState!] + + """ + Whether the card is closed (archived). Note: Archived lists and boards do not cascade archives to cards. A card can have closed: false but be on an archived board. + """ + closed: Boolean + + """ + The datetime of the last activity on the card. + + Note: There are activities that update dateLastActivity that do not create a corresponding action. For instance, updating the name field of a checklist item on a card does not create an action but does update the card and board's dateLastActivity value. + """ + dateLastActivity: String + + """The description for the card. Up to 16384 chars.""" + desc: String + + """ + If the description has custom emoji, this field will provide the data necessary to display them. + + "descData": { + "emoji": { + "morty": "https://trello-emoji.s3.amazonaws.com/556c8537a1928ba745504dd8/f40ea4f5ecea8443875c27986760d8b3/tumblr_nszc7944yh1uccyhso1_1280.png" + } + } + """ + descData: JSON + + """The due date on the card, if one exists""" + due: String + + """Whether the due date has been marked complete""" + dueComplete: Boolean + + """The id of the attachment selected as the cover image, if one exists""" + idAttachmentCover: String + + """Board the card is on.""" + board: TrelloBoard + + """The id of the board the card is on""" + idBoard: String + + """An array of checklist ids that are on this card""" + idChecklists: [String!] + + """An array of label ids that are on this card""" + idLabels: [String!] + + """List the card is on.""" + list: TrelloList + + """The id of the list the card is in""" + idList: String + + """An array of member ids that are on this card""" + idMembers: [String!] + + """An array of member ids who have voted on this card""" + idMembersVoted: [String!] + + """ + Numeric id for the card on this board. Only unique to the board, and subject to change as the card moves + """ + idShort: Int + + """Array of label objects on this card""" + labels: [String!] + + """ + Whether the card cover image was selected automatically by Trello, or manually by the user + """ + manualCoverAttachment: Boolean + + """Name of the card""" + name: String + + """Position of the card in the list""" + pos: Float + + """The 8 character shortened id for the card""" + shortLink: String + + """URL to the card without the name slug""" + shortUrl: String + + """Whether this member is subscribed to the card""" + subscribed: Boolean + + """Full URL to the card, with the name slug""" + url: String + + """Attachments on a card""" + attachments: [TrelloCardAttachment!] + + """Members that voted on the card""" + membersVoted: TrelloMembersConnection + + """Stickers on the card""" + stickers: TrelloStickersConnection + actions: TrelloActionsConnection + checklists: [TrelloChecklist!] + members: [TrelloMember!] +} + +""" +Actions are generated whenever an action occurs in Trello. For instance, when a user deletes a card, a deleteCard action is generated and includes information about the deleted card, the list the card was in, the board the card was on, the user that deleted the card, and the idObject of the action. +""" +type TrelloAction { + """The id of the action""" + id: String + + """The list this action affected.""" + list: TrelloList + + """The board this action affected.""" + board: TrelloBoard + + """The card this action affected.""" + card: TrelloCard + + """The organization this action affected.""" + organization: TrelloOrganization + + """Relevant information regarding the action""" + data: TrelloActionData + + """The member this action affected.""" + member: TrelloMember + + """When the action occured""" + date: String + + """The id of the member who caused the action""" + idMemberCreator: String + + """The type of the action.""" + type: String + + """The member who caused the action""" + memberCreator: TrelloMember + reactions: TrelloReactionsConnection +} + +"""List of Trello actions, with metadata field for pagination""" +type TrelloActionsConnection { + """List of Trello actions""" + nodes: [TrelloAction!]! + + """Total number of Trello actions""" + totalCount: Int! +} + +"""List of Trello lists, with metadata field for pagination""" +type TrelloListsConnection { + """List of Trello lists""" + nodes: [TrelloList!]! + + """Total number of Trello lists""" + totalCount: Int! +} + +"""Membership for a board.""" +type TrelloMembership { + """""" + id: String + + """""" + member: TrelloMember + + """""" + idMember: String + + """""" + memberType: String + + """""" + unconfirmed: Boolean + + """""" + deactivated: Boolean + + """""" + orgMemberType: String +} + +"""List of Trello memberships, with metadata field for pagination""" +type TrelloMembershipsConnection { + """List of Trello memberships""" + nodes: [TrelloMembership!]! + + """Total number of Trello memberships""" + totalCount: Int! +} + +"""""" +type TrelloCustomFieldsOptionValue { + """""" + text: String +} + +""" +Used for Custom Fields of the `list` type. The objects contain data about the options available for the dropdown. +""" +type TrelloCustomFieldsOption { + """""" + id: String + + """""" + customField: TrelloCustomFields + + """""" + idCustomField: String + + """""" + value: TrelloCustomFieldsOptionValue + + """""" + color: String + + """""" + pos: Int +} + +"""An object that contains this custom fields display properties.""" +type TrelloCustomFieldsDisplay { + """""" + cardFront: Boolean +} + +""" +Custom Fields are extra bits of structured data attached to cards when our users need a bit more than what Trello provides. + +To use them users need to enable the Custom Fields Power-Up. +""" +type TrelloCustomFields { + """The id of the Custom Field definition.""" + id: String + + """The board that the Custom Field is defined on.""" + board: TrelloBoard + + """ + The id of the model that the Custom Field is defined on. This should always be an id of a board. + """ + idModel: String + + """ + The type of model that the Custom Field is being defined for. This should always be `board`. + """ + modelType: String + + """ + A hash created from the fields of a Custom Field used to manage Custom Fields and values between boards. For more on its use, check out the [Grouping Custom Fields Across Boards](https://developers.trello.com/v1.0/docs/getting-started-custom-fields#section-grouping-custom-fields-across-boards) section of the Custom Fields guide. + """ + fieldGroup: String + + """ + The name of the Custom Field. This is displayed to the user in the Trello clients. + """ + name: String + + """ + The position of the Custom Field. This will be used to determine the order that Custom Fields should be listed when being shown to the user. + """ + pos: Int + + """An object that contains this custom fields display properties.""" + display: TrelloCustomFieldsDisplay + + """ + An array of objects used for Custom Fields of the list type. The objects contain data about the options available for the dropdown. + """ + options: [TrelloCustomFieldsOption!] + + """""" + type: String +} + +"""List of Trello customFields, with metadata field for pagination""" +type TrelloCustomFieldsConnection { + """List of Trello customFields""" + nodes: [TrelloCustomFields!]! + + """Total number of Trello customFields""" + totalCount: Int! +} + +"""Filter for boards plugins.""" +enum TrelloPluginFilterEnumArg { + ENABLED + AVAILABLE +} + +"""Public listinf of a power-up for a board.""" +type TrelloPluginListing { + """""" + name: String + + """""" + locale: String + + """""" + description: String + + """""" + overview: String +} + +"""Icon for a power-up for a board.""" +type TrelloPluginIcon { + """""" + url: String +} + +"""Power-up for a board.""" +type TrelloPlugin { + """""" + id: String + + """""" + idOrganizationOwner: String + + """""" + author: String + + """""" + capabilities: [String!] + + """""" + categories: [String!] + + """""" + iframeConnectorUrl: String + + """""" + name: String + + """""" + privacyUrl: String + + """""" + public: Boolean + + """""" + supportEmail: String + + """""" + url: String + + """""" + tags: [String!] + + """""" + icon: TrelloPluginIcon + + """""" + listing: TrelloPluginListing +} + +"""List of Trello plugins, with metadata field for pagination""" +type TrelloPluginsConnection { + """List of Trello plugins""" + nodes: [TrelloPlugin!]! + + """Total number of Trello plugins""" + totalCount: Int! +} + +""" +Labels are defined per board, and can be applied to the cards on that board. +""" +type TrelloLabel { + """The id of the label""" + id: String + + """The id of the board the label is on""" + board: TrelloBoard + + """The id of the board the label is on""" + idBoard: String + + """The optional name of the label (0 - 16384 chars)""" + name: String + + """ + The color of the label. One of: + + yellow, purple, blue, red, green, orange, black, sky, pink, lime, null + + (null means no color, and the label will not show on the front of cards) + """ + color: String +} + +"""List of Trello labels, with metadata field for pagination""" +type TrelloLabelsConnection { + """List of Trello labels""" + nodes: [TrelloLabel!]! + + """Total number of Trello labels""" + totalCount: Int! +} + +"""Names for the labels .""" +type TrelloBoardLabelNames { + """""" + black: String + + """""" + blue: String + + """""" + green: String + + """""" + lime: String + + """""" + orange: String + + """""" + pink: String + + """""" + purple: String + + """""" + red: String + + """""" + sky: String + + """""" + yellow: String +} + +"""Preferences for a board.""" +type TrelloBoardPreferences { + """""" + background: String + + """""" + backgroundBottomColor: String + + """""" + backgroundBrightness: String + + """""" + backgroundColor: String + + """""" + backgroundImage: String + + """""" + backgroundImageScaled: String + + """""" + backgroundTile: Boolean + + """""" + backgroundTopColor: String + + """""" + calendarFeedEnabled: Boolean + + """""" + canBeOrg: Boolean + + """""" + canBePrivate: Boolean + + """""" + canBePublic: Boolean + + """""" + canInvite: Boolean + + """""" + cardAging: String + + """""" + cardCovers: Boolean + + """""" + comments: String + + """""" + invitations: String + + """""" + permissionLevel: String + + """""" + selfJoin: Boolean + + """""" + voting: String +} + +"""A Trello board.""" +type TrelloBoard { + """The id of the board""" + id: String + + """The name of the board""" + name: String + + """ + The description of the board. + Deprecated + """ + desc: String + + """ + If the description includes custom emoji, this will contain the data necessary to display them. + """ + descData: String + + """Boolean whether the board has been closed or not.""" + closed: Boolean + + """Mongoid of the organization to which the board belongs.""" + idOrganization: String + + """Boolean whether the board has been pinned or not.""" + pinned: Boolean + + """Persistent URL for the board.""" + url: String + + """URL for the board using only its shortMongoid""" + shortUrl: String + + """Short for "preferences", these are the settings for the board""" + prefs: TrelloBoardPreferences + + """ + Object containing color keys and the label names given for one label of each color on the board. To get a full list of labels on the board see /boards/{id}/labels/. + """ + labelNames: TrelloBoardLabelNames + + """Whether the board has been starred by the current request's user.""" + starred: Boolean + + """Labels for a board""" + labels( + """Number of labels to fetch. Defaults to 50.""" + limit: Int + ): TrelloLabelsConnection + + """Power-ups for a board""" + plugins( + """Get either enabled or available power-ups. Defaults to enabled.""" + filter: TrelloPluginFilterEnumArg + ): TrelloPluginsConnection + + """ + Custom Fields are extra bits of structured data attached to cards when our users need a bit more than what Trello provides. + """ + customFields: TrelloCustomFieldsConnection + + """Membership the member has to the board""" + memberships: TrelloMembershipsConnection + lists: TrelloListsConnection + actions: TrelloActionsConnection + cards: TrelloCardsConnection + checklists: [TrelloChecklist!] + members: [TrelloMember!] +} + +"""List for a board.""" +type TrelloList { + """The id of the list""" + id: String + + """The name of the list""" + name: String + + """Whether the list is closed (archived)""" + closed: Boolean + + """Board the list is on""" + board: TrelloBoard + + """The id of the board the list is on""" + idBoard: String + + """The position of the list on the board""" + pos: Float + + """Whether the member is subscribed to this list""" + subscribed: Boolean + actions: TrelloActionsConnection + cards: TrelloCardsConnection +} + +"""""" +type TrelloNotificationData { + """The Trello list attached to the notification.""" + list: TrelloList + + """The Trello board attached to the notification.""" + board: TrelloBoard + + """The Trello card attached to the notification.""" + card: TrelloCard + + """Member type if this notification was about a member""" + memberType: String + + """Member if this notification was about a member""" + member: TrelloMember + + """""" + idMember: String + + """Organization if this notification was about a organization""" + organization: TrelloOrganization +} + +"""""" +type TrelloNotification { + """The id of the notification""" + id: String + + """Relevant data regarding the notification""" + data: TrelloNotificationData + + """The datetime the notification was triggered""" + date: String + + """The id of the member who triggered the notification""" + memberCreator: TrelloMember + + """The id of the member who triggered the notification""" + idMemberCreator: String + + """The type of the notification""" + type: String + + """Whether the notification hasn't been read yet""" + unread: Boolean + + """The Trello list attached to the notification.""" + list: TrelloList + + """The Trello board attached to the notification.""" + board: TrelloBoard + + """The Trello card attached to the notification.""" + card: TrelloCard + + """Member if this notification was about a member""" + member: TrelloMember + + """Organization if this notification was about an organization""" + organization: TrelloOrganization +} + +"""List of Trello notifications, with metadata field for pagination""" +type TrelloNotificationsConnection { + """List of Trello notifications""" + nodes: [TrelloNotification!]! + + """Total number of Trello notifications""" + totalCount: Int! +} + +scalar JSON + +"""A Trello user.""" +type TrelloMember { + """The id of the member""" + id: String + + """ + Member profile images are hosted at: https://trello-avatars.s3.amazonaws.com/{avatarHash}/{size}.png + + size can be 30, 50, or 170 + """ + avatarHash: String + + """ + The URL of the current avatar being used, regardless of whether it is a gravatar or uploaded avatar. + """ + avatarUrl: String + + """The source of the user's avatar - either via "upload" or "gravatar".""" + avatarSource: String + + """ + Optional bio for the member + + + """ + bio: String + + """ + If the bio includes custom emoji, this object will contain the information necessary to display them. + """ + bioData: JSON + + """Whether the member has confirmed their email address after signing up""" + confirmed: Boolean + + """The primary email address for the member. You can only read your own.""" + email: String + + """The full display name for the member""" + fullName: String + + """ + Same as avatarHash above; member profile images are hosted at: https://trello-avatars.s3.amazonaws.com/{gravatarHash}/{size}.png + + size can be 30, 50, or 170 + string. + """ + gravatarHash: String + + """An array of board ids this member is on""" + idBoards: [String!] + + """An array of organization ids this member is in""" + idOrganizations: [String!] + + """An array of enterprise ids this member is an admin of""" + idEnterprisesAdmin: [String!] + + """""" + idPremOrgsAdmin: [String!] + + """The member's initials, used for display when there isn't an avatar set""" + initials: String + + """ + The types of logins a user + One of: "password", "saml" + """ + loginTypes: [String!] + + """ + One of: "normal", "ghost" + + A ghost is an individual who has been invited to join but has not yet created a Trello account. + """ + memberType: String + + """""" + oneTimeMessagesDismissed: [String!] + + """""" + premiumFeatures: [String!] + + """ + 10 - member has Trello Gold as a result of being in a Business Class team + 37 - member has monthly Trello Gold + 38 - member has annual Trello Gold + """ + products: [Int!] + + """ + Same as avatarHash - member profile images are hosted at: https://trello-avatars.s3.amazonaws.com/{uploadedAvatarHash}/{size}.png + + size can be 30, 50, or 170 + """ + uploadedAvatarHash: String + + """The URL of the uploaded avatar if one has been uploaded.""" + uploadedAvatarUrl: String + + """The URL to the member's profile page""" + url: String + + """The username for the member. What is shown in @mentions for example""" + username: String + notifications: TrelloNotificationsConnection + enterpriseMemberships: TrelloEnterpriseMembershipsConnection + organizations: TrelloOrganizationsConnection + actions: TrelloActionsConnection + boards( + """ + Filter boards. Add multiple filters to include boards that pass any of the fitlers + """ + filters: [TrelloBoardFilterEnumArg!] + ): TrelloBoardsConnection + cards: TrelloCardsConnection +} + +"""A OneGraph me Zeit user""" +type ZeitUser { + """The Zeit user's ID""" + id: String! + + """The Zeit user's email""" + email: String! + + """The Zeit user's name""" + name: String! + + """The Zeit user's username""" + username: String! + + """""" + billingChecked: Boolean! + + """""" + avatar: String +} + +"""Photos for a Salesforce user""" +type SalesforceOAuthUserPhotos { + picture: String + thumbnail: String +} + +"""Address for a Salesforce user""" +type SalesforceOAuthUserAddress { + country: String +} + +"""A OneGraph me Salesforce user""" +type SalesforceOAuthUser { + sub: String! + active: Boolean + address: SalesforceOAuthUserAddress + email: String + email_verified: Boolean + family_name: String + given_name: String + is_app_installed: Boolean + language: String + locale: String + name: String + nickname: String + organization_id: String + photos: SalesforceOAuthUserPhotos + picture: String + preferred_username: String + profile: String + updatedAt: String + user_id: String + user_type: String + utcOffset: Int + zoneinfo: String +} + +"""A OneGraph me Contentful user""" +type ContentfulUser { + """The Contentful user's ID""" + id: String! + + """The Contentful user's firstName""" + firstName: String + + """The Contentful user's lastName""" + lastName: String + + """The Contentful user's avatarUrl""" + avatarUrl: String + + """The Contentful user's email""" + email: String + + """The Contentful user's activated""" + activated: Boolean + + """The Contentful user's signInCount""" + signInCount: Int + + """The Contentful user's confirmed""" + confirmed: Boolean + + """Whether the user has enabled two-factor auth""" + twoFactorAuthEnabled: Boolean + + """The Contentful user's passwordSet""" + passwordSet: Boolean + + """The Contentful user's ssoLoginOnly""" + ssoLoginOnly: Boolean + + """The Contentful user's logAnalyticsFeature""" + logAnalyticsFeature: Boolean + + """The Contentful user's mfaEligible""" + mfaEligible: Boolean + + """The Contentful user's mfaEnabled""" + mfaEnabled: Boolean +} + +"""Enterprise object in Box""" +type BoxEnterprise { + """""" + type: String + + """Unqiue string identifying this enterprise.""" + id: String + + """Name of this enterprise""" + name: String +} + +"""User object in Box""" +type BoxUser { + """""" + type: String + + """Unqiue string identifying this user.""" + id: String + + """Name of this user""" + name: String + + """The email address this user uses to login.""" + login: String + + """The time this user was created.""" + createdAt: String + + """The time this user was last modified.""" + modifiedAt: String + + """The language of this user. (ISO 639-1 Language Code)""" + language: String + + """The timezone of this user. (tz Database timezones)""" + timezone: String + + """The user’s total available space amount in bytes.""" + spaceAmount: Int + + """The amount of space in use by the user.""" + spaceUsed: Int + + """The maximum individual file size in bytes this user can have.""" + maxUploadSize: Int + + """ + Can be active, inactive, cannot_delete_edit, or cannot_delete_edit_upload. + """ + status: String + + """The user’s job title.""" + jobTitle: String + + """The user’s phone number.""" + phone: String + + """The user’s address.""" + address: String + + """URL of this user’s avatar image.""" + avatarUrl: String + + """This user’s enterprise role. Can be admin, coadmin, or user.""" + role: String + + """Whether this user can see other enterprise users in her contact list.""" + canSeeManagedUsers: Boolean + + """Whether or not this user can use Box Sync.""" + isSyncEnabled: Boolean + + """ + Whether this user is allowed to collaborate with users outside her enterprise. + """ + isExternalCollabRestricted: Boolean + + """Whether to exempt this user from Enterprise device limits.""" + isExemptFromDeviceLimits: Boolean + + """Whether or not this user must use two-factor authentication.""" + isExemptFromLoginVerification: Boolean + + """undefined""" + enterprise: BoxEnterprise + + """Tags for all files and folders owned by this user.""" + myTags: [String!] + + """ + The root (protocol, subdomain, domain) of any links that need to be generated for this user + """ + hostname: String +} + +"""A OneGraph me Eggheadio user""" +type EggheadioUser { + """The Eggheadio user's ID""" + id: Int! + + """The Eggheadio user's full name""" + fullName: String + + """The Eggheadio user's email""" + email: String + + """The Eggheadio user's avatarUrl""" + avatarUrl: String + + """The Eggheadio user's lessonsCompleted""" + lessonsCompleted: Int + + """The Eggheadio user's seriesCompleted""" + seriesCompleted: Int + + """The Eggheadio user's isUnverifiedEmail""" + isUnverifiedEmail: Boolean + + """The Eggheadio user's optedOut""" + optedOut: Boolean + + """The Eggheadio user's isPro""" + isPro: Boolean! + + """The Eggheadio user's isInstructor""" + isInstructor: Boolean! + + """The Eggheadio user's isCancelled""" + isCancelled: Boolean + + """The Eggheadio user's isCommunityMember""" + isCommunityMember: Boolean + + """The Eggheadio user's lastLessonCompletedAt""" + lastLessonCompletedAt: String +} + +""" +Representations for a person's name to assist with internationalization. +""" +type DropboxUserName { + """Also known as a first name.""" + givenName: String + + """Also known as a last name or family name.""" + surname: String + + """ + Locale-dependent name. In the US, a person's familiar name is their given_name, but elsewhere, it could be any combination of a person's given_name and surname. + """ + familiarName: String + + """ + A name that can be used directly to represent the name of a user's Dropbox account. + """ + displayName: String + + """ + An abbreviated form of the person's name. Their initials in most locales. + """ + abbreviatedName: String +} + +"""A user's account information""" +type DropboxAccount { + """The user's unique Dropbox ID.""" + accountId: String + + """Details of a user's name.""" + name: DropboxUserName + + """ + The user's e-mail address. Do not rely on this without checking the email_verified field. Even then, it's possible that the user has since lost access to their e-mail. + """ + email: String + + """Whether the user has verified their e-mail address.""" + emailVerified: Boolean + + """Whether the user has been disabled.""" + disabled: Boolean + + """ + Whether this user is a teammate of the current user. If this account is the current user's account, then this will be true. + """ + isTeammate: Boolean + + """ + URL for the photo representing the user, if one is set. This field is optional. + """ + profilePhotoUrl: String + + """ + The user's unique team member id. This field will only be present if the user is part of a team and is_teammate is true. This field is optional. + """ + teamMemberId: String +} + +type DribbbleTeam { + """The team's unique Dribbble ID.""" + id: Int + + """The team's Dribbble name""" + name: String + + """""" + login: String + + """The public link for this team""" + htmlUrl: String + + """""" + avatarUrl: String + + """""" + bio: String + + """""" + list: DribbbleLink + + """""" + type: String + + """""" + createdAt: String + + """""" + updatedAt: String +} + +type DribbbleLink { + """The user's web link.""" + web: String + + """The user's twitter link.""" + twitter: String +} + +type DribbbleUser { + """The user's unique Dribbble ID.""" + id: Int + + """""" + name: String + + """""" + login: String + + """""" + htmlUrl: String + + """""" + avatarUrl: String + + """""" + bio: String + + """""" + location: String + + """""" + links: DribbbleLink + + """""" + canUploadShot: Boolean + + """""" + pro: Boolean + + """""" + followersCount: Int + + """""" + createdAt: String + + """""" + type: String + + """""" + teams: [DribbbleTeam!] +} + +type DevToWebhook { + """""" + typeOf: String + + """""" + id: Int + + """ + The name of the requester, eg. "DEV" + """ + source: String! + + """The URL where the webhook will be delivered. Must be a `https` url.""" + targetUrl: String + + """ + An array of events identifiers, e.g. `"article_created"`, `"article_updated"` + """ + events: [String] + + """""" + createdAt: String + + """The user who created this webhook""" + user: DevToArticleUser +} + +enum DevToArticlePublishStatusEnum { + PUBLISHED + UNPUBLISHED + ALL +} + +"""An edge in a connection.""" +type DevToMeArticlesEdge { + """The item at the end of the edge""" + node: DevToMeArticle! +} + +type DevToArticleFlareTag { + """""" + name: String + + """Background color (hexadecimal)""" + bgColorHex: String + + """Text color (hexadecimal)""" + textColorHex: String +} + +type DevToArticleOrganization { + """""" + name: String + + """""" + username: String + + """""" + slug: String + + """Profile image (640x640)""" + profileImage: String + + """Profile image (90x90)""" + profileImage90: String +} + +type DevToArticleUser { + """""" + name: String + + """""" + username: String + + """""" + twitterUsername: String + + """""" + githubUsername: String + + """""" + websiteUrl: String + + """Profile image (640x640)""" + profileImage: String + + """Profile image (90x90)""" + profileImage90: String +} + +"""Articles created by the currently authenticated user""" +type DevToMeArticle { + """""" + typeOf: String + + """""" + id: Int + + """""" + title: String + + """""" + description: String + + """""" + coverImage: String + + """""" + published: Boolean + + """""" + publishedAt: String + + """""" + tagList: [String] + + """""" + slug: String + + """""" + path: String + + """""" + url: String + + """""" + canonicalUrl: String + + """""" + commentsCount: Int + + """""" + positiveReactionsCount: Int + + """""" + pageViewsCount: Int + + """Crossposting or published date time""" + publishedTimestamp: String + + """""" + user: DevToArticleUser + + """""" + organization: DevToArticleOrganization + + """""" + flareTag: DevToArticleFlareTag + + """The body content as the original markdown""" + bodyMarkdown: String + + """The body content as the rendered html""" + bodyHtml: String + + """Keywords this article has been tagged with""" + tags: [String!] +} + +"""MeArticles on DevTo""" +type DevToMeArticlessConnection { + """MeArticles""" + nodes: [DevToMeArticle!]! + + """A list of edges""" + edges: [DevToMeArticlesEdge!]! +} + +type devTo { + """ + A placeholder field to tell whether a user is currently logged into DEV (either by api-key or OAuth2 client) until DEV has an endpoint dedicated to user information + """ + isLoggedIn: Boolean! + + """ + This endpoint allows the client to retrieve a list of published articles on + behalf of an authenticated user. + + "Articles" are all the posts that users create on DEV that typically show up in + the feed. They can be a blog post, a discussion question, a help thread etc. but + is referred to as article within the code. + + Published articles will be in reverse chronological publication order. + + It will return published articles with pagination. By default a page will + contain `30` articles. + """ + articles(publishStatus: DevToArticlePublishStatusEnum): DevToMeArticlessConnection + + """ + Retrieve a list of webhooks they have previously registered. + + "Webhooks" are used to register HTTP endpoints that will be called once a relevant event is triggered inside the web application, events like article_created, article_updated. + + It will return all webhooks, without pagination. + """ + webhooks: [DevToWebhook!] +} + +"""Information about a service.""" +type OneGraphServiceMetadata { + service: OneGraphServiceEnum! + friendlyServiceName: String! + isLoggedIn: Boolean! + foreignUserId: String + + """ + Bearer token that can be used to query the underlying API directly. This field will always be null unless the OneGraph App has enabled sharing tokens for its custom OAuth client. + """ + bearerToken: String +} + +"""Information about OneGraph services""" +type OneGraphServicesMetadata { + loggedInServices: [OneGraphServiceMetadata!]! + box: OneGraphServiceMetadata! + devTo: OneGraphServiceMetadata! + dribbble: OneGraphServiceMetadata! + dropbox: OneGraphServiceMetadata! + contentful: OneGraphServiceMetadata! + eggheadio: OneGraphServiceMetadata! + eventil: OneGraphServiceMetadata! + facebookBusiness: OneGraphServiceMetadata! + gitHub: OneGraphServiceMetadata! + gmail: OneGraphServiceMetadata! + google: OneGraphServiceMetadata! + googleAnalytics: OneGraphServiceMetadata! + googleCalendar: OneGraphServiceMetadata! + googleCompute: OneGraphServiceMetadata! + googleDocs: OneGraphServiceMetadata! + googleTranslate: OneGraphServiceMetadata! + hubspot: OneGraphServiceMetadata! + intercom: OneGraphServiceMetadata! + mailchimp: OneGraphServiceMetadata! + meetup: OneGraphServiceMetadata! + netlify: OneGraphServiceMetadata! + productHunt: OneGraphServiceMetadata! + quickbooks: OneGraphServiceMetadata! + salesforce: OneGraphServiceMetadata! + slack: OneGraphServiceMetadata! + spotify: OneGraphServiceMetadata! + stripe: OneGraphServiceMetadata! + trello: OneGraphServiceMetadata! + twilio: OneGraphServiceMetadata! + twitter: OneGraphServiceMetadata! + twitchTv: OneGraphServiceMetadata! + youTube: OneGraphServiceMetadata! + zeit: OneGraphServiceMetadata! + zendesk: OneGraphServiceMetadata! + airtable: OneGraphServiceMetadata! + brex: OneGraphServiceMetadata! + bundlephobia: OneGraphServiceMetadata! + crunchbase: OneGraphServiceMetadata! + clearbit: OneGraphServiceMetadata! + cloudflare: OneGraphServiceMetadata! + fedex: OneGraphServiceMetadata! + googleMaps: OneGraphServiceMetadata! + immigrationGraph: OneGraphServiceMetadata! + ups: OneGraphServiceMetadata! + usps: OneGraphServiceMetadata! + npm: OneGraphServiceMetadata! + logdna: OneGraphServiceMetadata! + mixpanel: OneGraphServiceMetadata! + onegraph: OneGraphServiceMetadata! + facebook: OneGraphServiceMetadata! @deprecated(reason: "Use facebookBusiness.") +} + +"""Custom data for a OneGraph user auth.""" +type OneGraphUserAuthCustomDataForOneGraph { + """AppId that the tokens applies to.""" + appId: String +} + +"""Service-specific data for a user auth.""" +union OneGraphUserAuthCustomData = OneGraphUserAuthCustomDataForOneGraph + +"""Services supported by OneGraph.""" +enum OneGraphServiceEnum { + BOX + DEV_TO + DRIBBBLE + DROPBOX + CONTENTFUL + EGGHEADIO + EVENTIL + FACEBOOK + GITHUB + GMAIL + GOOGLE + GOOGLE_ANALYTICS + GOOGLE_CALENDAR + GOOGLE_COMPUTE + GOOGLE_DOCS + GOOGLE_TRANSLATE + HUBSPOT + INTERCOM + MAILCHIMP + MEETUP + NETLIFY + PRODUCT_HUNT + QUICKBOOKS + SALESFORCE + SLACK + SPOTIFY + STRIPE + TRELLO + TWILIO + TWITTER + TWITCH_TV + YOUTUBE + ZEIT + ZENDESK + AIRTABLE + BREX + BUNDLEPHOBIA + CRUNCHBASE + CLEARBIT + CLOUDFLARE + FEDEX + GOOGLE_MAPS + IMMIGRATION_GRAPH + UPS + USPS + NPM + LOGDNA + MIXPANEL + ONEGRAPH +} + +"""A user auth associated with an access token""" +type OneGraphUserAuth { + """Service that the auth belongs to.""" + service: OneGraphServiceEnum! + + """Unique id for the logged-in entity on the service.""" + foreignUserId: String! + + """Scopes granted for the service.""" + scopes: [String!] + + """Service-specific data for the user auth""" + customData: OneGraphUserAuthCustomData +} + +"""A OneGraph Access Token""" +type OneGraphAccessToken { + """Bearer token""" + token: String! + + """ + Time that the the token expires, measured in seconds since the Unix epoch + """ + expireDate: Int! + + """Token name, if it is a personal access token""" + name: String + + """AppId that the token belongs to""" + appId: String! + + """User auths for the access token""" + userAuths: [OneGraphUserAuth!]! +} + +"""The settings for a OneGraph User""" +type OneGraphUserSettings { + """The tours completed by this OneGraph user""" + completedTours: [String!]! +} + +"""A OneGraph User""" +type OneGraphUser { + """The id of the OneGraph User""" + id: String! + + """Whether this OneGraph user has confirmed their account""" + confirmed: Boolean! + + """The primary email of the currently logged-in OneGraph user""" + email: String! + + """The full name of the currently logged-in OneGraph user""" + fullName: String! + + """ + The date at which this user agreed to the OneGraph terms of service at https://www.onegraph.com/terms-and-conditions + """ + agreedToTosAt: Int + + """The settings of the currently logged-in OneGraph user""" + settings: OneGraphUserSettings! + + """User hash for securely identifying a user with Intercom""" + intercomUserHash: String! + + """Personal access tokens""" + personalTokens: [OneGraphAccessToken!] + + """ + The gitHub databaseId if this OneGraph User has associated their account with a GitHub account + """ + gitHubUserId: String +} + +"""Currently authed Stripe account""" +type StripeAccount { + """""" + object: String! + + """""" + payoutsEnabled: Boolean! + + """""" + country: String! + + """""" + timezone: String + + """""" + businessLogo: String + + """""" + businessName: String + + """""" + supportPhone: String + + """""" + supportEmail: String + + """""" + id: String! + + """""" + email: String + + """""" + displayName: String + + """""" + defaultCurrency: String! + + """""" + detailsSubmitted: Boolean! + + """""" + statementDescriptor: String + + """""" + type: String! + + """""" + chargesEnabled: Boolean! + + """""" + businessUrl: String +} + +"""Currently authed user""" +type Viewer { + stripe: StripeAccount + + """Currently logged in oneUser""" + oneGraph: OneGraphUser + + """Metadata and logged-in state for all OneGraph services""" + serviceMetadata: OneGraphServicesMetadata! + devTo: devTo @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + dribbble: DribbbleUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + dropbox: DropboxAccount @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + eggheadio: EggheadioUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + box: BoxUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + contentful: ContentfulUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + salesforce: SalesforceOAuthUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + zeit: ZeitUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + trello: TrelloMember @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + twitchTv: TwitchTvUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + slack: SlackUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + spotify: SpotifyCurrentUserProfile @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + google: GoogleUser + googleCalendar: GoogleUser + googleCompute: GoogleUser + googleDocs: GoogleUser + googleTranslate: GoogleUser + github: GitHubUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + gmail: GoogleUser + eventil: OneGraphMeEventilUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + hubspot: HubspotOAuthUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + intercom: IntercomAdmin + netlify: NetlifyUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + twilio: TwilioUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + zendesk: ZendeskUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + twitter: TwitterUser @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + youTube: GoogleUser +} + +type Query { + me( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): Viewer! + + """The root for Airtable queries""" + airtable( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): AirtableQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Box queries""" + box( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): BoxQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Bundlephobia queries""" + bundlephobia( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): BundlephobiaQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Clearbit queries""" + clearbit( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): Clearbit! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Cloudflare queries""" + cloudflare( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): CloudflareQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Contentful queries""" + contentful( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): ContentfulQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Dev.to queries""" + devTo( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): DevToQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Dribbble queries""" + dribbble( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): DribbbleQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Dropbox queries""" + dropbox( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): DropboxQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Egghead.io queries""" + eggheadio( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): EggheadioQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Facebook queries""" + facebookBusiness( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): FacebookBusinessQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Fedex queries""" + fedex( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): FedexQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Google queries""" + google( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): GoogleServices! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Hubspot queries""" + hubspot( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): HubspotQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Intercom queries""" + intercom( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): IntercomQuery! + + """The root for LogDNA queries""" + logdna( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): LogdnaQuery! + + """The root for Mailchimp queries""" + mailchimp( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): MailchimpQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Meetup queries""" + meetup( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): MeetupQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Mixpanel queries""" + mixpanel( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): MixpanelQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Netlify queries""" + netlify( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): NetlifyQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Npm queries""" + npm( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): NpmQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Salesforce queries""" + salesforce( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): SalesforceQuery! + + """The root for Slack queries""" + slack( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): Slack! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Spotify queries""" + spotify( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): SpotifyQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Stripe queries""" + stripe( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): StripeQuery! + + """The root for Trello queries""" + trello( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): TrelloQuery! + + """The root for Twilio queries""" + twilio( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): TwilioQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Twitch queries""" + twitchTv( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): TwitchTvQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Twitter queries""" + twitter( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): Twitter! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for UPS queries""" + ups( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): UpsQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for USPS queries""" + usps( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): USPSQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for YouTube queries""" + youTube( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): YouTubeQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Zeit queries""" + zeit( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): ZeitQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + + """The root for Zendesk queries""" + zendesk( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): ZendeskQuery! + quickbooks( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): QuickbooksQuery + immigrationGraph( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): ImmigrationGraphQuery + crunchbase( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): CrunchbaseQuery + brex( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): BrexRootQueryType + gitHub( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): GitHubQuery + productHunt( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): ProductHuntQuery + eventil( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): EventilQuery + oneGraph: OneGraphServiceQuery! + + """Fetches an object given its globally unique `oneGraphId`.""" + oneGraphNode( + """The globally unique `oneGraphId`.""" + oneGraphId: ID! + ): OneGraphNode + rss: RssQuery! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + youTubeVideo(id: String!): YoutubeVideo @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + youTubeSearch( + cursor: String + pageToken: String + maxResults: Int! + order: String + + """ + The q parameter specifies the query term to search for. + Your request can also use the Boolean NOT (-) and OR (|) operators to exclude videos or to find videos that are associated with one of several search terms. For example, to search for videos matching either "boating" or "sailing", set the q parameter value to boating|sailing. Similarly, to search for videos matching either "boating" or "sailing" but not "fishing", set the q parameter value to boating|sailing -fishing + """ + q: String! + ): YoutubeVideoSearchResult @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") + descuri(url: String!): Descuri + emailNode( + """Email address used to look up nodes.""" + email: String! + + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): OneGraphEmailNode! @deprecated(reason: "Beta: this field is still in beta while we work out the kinks.") +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/russian-literals.graphql b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/russian-literals.graphql new file mode 100644 index 00000000000..f038167a258 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/russian-literals.graphql @@ -0,0 +1,5 @@ +query { + field(parameter: "привет") { + subField + } +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/russian_utf8_escape_characters.json b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/russian_utf8_escape_characters.json new file mode 100644 index 00000000000..b1fec5bd451 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/russian_utf8_escape_characters.json @@ -0,0 +1,4 @@ +{ + "query": "query {\n field(parameter: \"\u043F\u0440\u0438\u0432\u0435\u0442\") {\n subField\n }\n}\n", + "variables": null +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/schema-kitchen-sink.graphql b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/schema-kitchen-sink.graphql new file mode 100644 index 00000000000..a129a586b1c --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__resources__/schema-kitchen-sink.graphql @@ -0,0 +1,133 @@ +# Copyright (c) 2015-present, Facebook, Inc. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +schema { + query: QueryType + mutation: MutationType +} + +""" +This is a description +of the `Foo` type. +""" +type Foo implements Bar & Baz { + one: Type + """ + This is a description of the `two` field. + """ + two( + """ + This is a description of the `argument` argument. + """ + argument: InputType! + ): Type + three(argument: InputType, other: String): Int + four(argument: String = "string"): String + five(argument: [String] = ["string", "string"]): String + six(argument: InputType = {key: "value"}): Type + seven(argument: Int = null): Type +} + +type AnnotatedObject @onObject(arg: "value") { + annotatedField(arg: Type = "default" @onArg): Type @onField +} + +type UndefinedType + +extend type Foo { + seven(argument: [String]): Type +} + +extend type Foo @onType + +interface Bar { + one: Type + four(argument: String = "string"): String +} + +interface AnnotatedInterface @onInterface { + annotatedField(arg: Type @onArg): Type @onField +} + +interface UndefinedInterface + +extend interface Bar { + two(argument: InputType!): Type +} + +extend interface Bar @onInterface + +union Feed = Story | Article | Advert + +union AnnotatedUnion @onUnion = A | B + +union AnnotatedUnionTwo @onUnion = | A | B + +union UndefinedUnion + +extend union Feed = Photo | Video + +extend union Feed @onUnion + +scalar CustomScalar + +scalar AnnotatedScalar @onScalar + +extend scalar CustomScalar @onScalar + +enum Site { + DESKTOP + MOBILE +} + +enum AnnotatedEnum @onEnum { + ANNOTATED_VALUE @onEnumValue + OTHER_VALUE +} + +enum UndefinedEnum + +extend enum Site { + VR +} + +extend enum Site @onEnum + +input InputType { + key: String! + answer: Int = 42 +} + +input AnnotatedInput @onInputObject { + annotatedField: Type @onField +} + +input UndefinedInput + +extend input InputType { + other: Float = 1.23e4 +} + +extend input InputType @onInputObject + +directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT + +directive @skip2(if: Boolean!) repeatable on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT + +directive @include(if: Boolean!) + on FIELD + | FRAGMENT_SPREAD + | INLINE_FRAGMENT + +directive @include2(if: Boolean!) on + | FIELD + | FRAGMENT_SPREAD + | INLINE_FRAGMENT + +extend schema @onSchema + +extend schema @onSchema { + subscription: SubscriptionType +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap new file mode 100644 index 00000000000..b5f44efa5a0 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap @@ -0,0 +1,83 @@ +[ + { + "DocumentId": { + "IsEmpty": false, + "Value": "foo" + }, + "DocumentHash": null, + "Document": { + "Kind": "Document", + "Location": { + "Start": 0, + "End": 35, + "Line": 1, + "Column": 1 + }, + "Definitions": [ + { + "Kind": "OperationDefinition", + "Location": { + "Start": 0, + "End": 35, + "Line": 1, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 13, + "End": 22, + "Line": 1, + "Column": 14 + }, + "Value": "OnEvent" + }, + "Description": null, + "Operation": "Subscription", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 21, + "End": 35, + "Line": 1, + "Column": 22 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 23, + "End": 35, + "Line": 1, + "Column": 24 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 23, + "End": 35, + "Line": 1, + "Column": 24 + }, + "Value": "fooChanged" + }, + "Directives": [] + } + ] + } + } + ], + "Count": 6, + "FieldsCount": 1 + }, + "OperationName": "OnEvent", + "ErrorHandlingMode": null, + "Variables": null, + "Extensions": null + } +] diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Id_As_Name.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Id_As_Name.snap new file mode 100644 index 00000000000..9684cfedb90 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Id_As_Name.snap @@ -0,0 +1,1700 @@ +{ + "Kind": "Document", + "Location": { + "Start": 0, + "End": 1173, + "Line": 1, + "Column": 1 + }, + "Definitions": [ + { + "Kind": "OperationDefinition", + "Location": { + "Start": 192, + "End": 611, + "Line": 7, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 198, + "End": 208, + "Line": 7, + "Column": 7 + }, + "Value": "queryName" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 172, + "End": 197, + "Line": 6, + "Column": 1 + }, + "Value": "Query description", + "Block": false + }, + "Operation": "Query", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 208, + "End": 264, + "Line": 7, + "Column": 17 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 227, + "End": 232, + "Line": 7, + "Column": 36 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 228, + "End": 232, + "Line": 7, + "Column": 37 + }, + "Value": "foo" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 208, + "End": 228, + "Line": 7, + "Column": 17 + }, + "Value": "$foo description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Value": "ComplexType" + } + }, + "DefaultValue": null, + "Directives": [] + }, + { + "Kind": "VariableDefinition", + "Location": { + "Start": 246, + "End": 287, + "Line": 7, + "Column": 55 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 266, + "End": 272, + "Line": 7, + "Column": 75 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 267, + "End": 272, + "Line": 7, + "Column": 76 + }, + "Value": "site" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 246, + "End": 267, + "Line": 7, + "Column": 55 + }, + "Value": "$site description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Value": "Site" + } + }, + "DefaultValue": { + "Kind": "EnumValue", + "Location": { + "Start": 280, + "End": 287, + "Line": 7, + "Column": 89 + }, + "Value": "MOBILE" + }, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 288, + "End": 611, + "Line": 7, + "Column": 97 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 292, + "End": 305, + "Line": 8, + "Column": 3 + }, + "Value": "whoever123is" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 311, + "End": 326, + "Line": 8, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 311, + "End": 314, + "Line": 8, + "Column": 22 + }, + "Value": "id" + }, + "Value": { + "Kind": "ListValue", + "Location": { + "Start": 315, + "End": 326, + "Line": 8, + "Column": 26 + }, + "Items": [ + { + "Kind": "IntValue", + "Location": { + "Start": 316, + "End": 324, + "Line": 8, + "Column": 27 + }, + "Value": "123" + }, + { + "Kind": "IntValue", + "Location": { + "Start": 321, + "End": 325, + "Line": 8, + "Column": 32 + }, + "Value": "456" + } + ] + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 327, + "End": 588, + "Line": 8, + "Column": 38 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 342, + "End": 520, + "Line": 10, + "Column": 5 + }, + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Value": "User" + } + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 354, + "End": 362, + "Line": 10, + "Column": 17 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 355, + "End": 362, + "Line": 10, + "Column": 18 + }, + "Value": "defer" + }, + "Arguments": [] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 361, + "End": 520, + "Line": 10, + "Column": 24 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 376, + "End": 512, + "Line": 11, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 399, + "End": 405, + "Line": 13, + "Column": 9 + }, + "Value": "alias" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 413, + "End": 428, + "Line": 13, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 413, + "End": 419, + "Line": 13, + "Column": 23 + }, + "Value": "first" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 419, + "End": 428, + "Line": 13, + "Column": 29 + }, + "Value": "10" + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 423, + "End": 435, + "Line": 13, + "Column": 33 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 423, + "End": 429, + "Line": 13, + "Column": 33 + }, + "Value": "after" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 429, + "End": 435, + "Line": 13, + "Column": 39 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 430, + "End": 435, + "Line": 13, + "Column": 40 + }, + "Value": "foo" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 455, + "End": 506, + "Line": 13, + "Column": 65 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "FragmentSpread", + "Location": { + "Start": 481, + "End": 498, + "Line": 15, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 484, + "End": 498, + "Line": 15, + "Column": 14 + }, + "Value": "frag" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 399, + "End": 506, + "Line": 13, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 406, + "End": 413, + "Line": 13, + "Column": 16 + }, + "Value": "field1" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 436, + "End": 456, + "Line": 13, + "Column": 46 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 437, + "End": 445, + "Line": 13, + "Column": 47 + }, + "Value": "include" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 445, + "End": 454, + "Line": 13, + "Column": 55 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 445, + "End": 448, + "Line": 13, + "Column": 55 + }, + "Value": "if" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 449, + "End": 454, + "Line": 13, + "Column": 59 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 450, + "End": 454, + "Line": 13, + "Column": 60 + }, + "Value": "foo" + } + } + } + ] + } + ] + } + ] + }, + "Location": { + "Start": 369, + "End": 512, + "Line": 11, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 369, + "End": 377, + "Line": 11, + "Column": 7 + }, + "Value": "field2" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 517, + "End": 565, + "Line": 19, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 521, + "End": 542, + "Line": 19, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 522, + "End": 527, + "Line": 19, + "Column": 10 + }, + "Value": "skip" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 527, + "End": 540, + "Line": 19, + "Column": 15 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 527, + "End": 534, + "Line": 19, + "Column": 15 + }, + "Value": "unless" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 535, + "End": 540, + "Line": 19, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 536, + "End": 540, + "Line": 19, + "Column": 24 + }, + "Value": "foo" + } + } + } + ] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 541, + "End": 565, + "Line": 19, + "Column": 29 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 562, + "End": 586, + "Line": 22, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 566, + "End": 586, + "Line": 22, + "Column": 9 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + } + ] + }, + "Location": { + "Start": 292, + "End": 588, + "Line": 8, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 306, + "End": 311, + "Line": 8, + "Column": 17 + }, + "Value": "node" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 613, + "End": 721, + "Line": 29, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 622, + "End": 633, + "Line": 29, + "Column": 10 + }, + "Value": "likeStory" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 590, + "End": 621, + "Line": 28, + "Column": 1 + }, + "Value": "Mutation description", + "Block": false + }, + "Operation": "Mutation", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 632, + "End": 721, + "Line": 29, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 641, + "End": 652, + "Line": 30, + "Column": 8 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 641, + "End": 647, + "Line": 30, + "Column": 8 + }, + "Value": "story" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 648, + "End": 652, + "Line": 30, + "Column": 15 + }, + "Value": "123" + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 660, + "End": 694, + "Line": 30, + "Column": 27 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 672, + "End": 692, + "Line": 31, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 666, + "End": 692, + "Line": 31, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 666, + "End": 673, + "Line": 31, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 636, + "End": 694, + "Line": 30, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 636, + "End": 641, + "Line": 30, + "Column": 3 + }, + "Value": "like" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 653, + "End": 661, + "Line": 30, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 654, + "End": 661, + "Line": 30, + "Column": 21 + }, + "Value": "defer" + }, + "Arguments": [] + } + ] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 723, + "End": 977, + "Line": 38, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 736, + "End": 758, + "Line": 38, + "Column": 14 + }, + "Value": "StoryLikeSubscription" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 696, + "End": 735, + "Line": 37, + "Column": 1 + }, + "Value": "Subscription description", + "Block": false + }, + "Operation": "Subscription", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 758, + "End": 811, + "Line": 38, + "Column": 36 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 779, + "End": 786, + "Line": 38, + "Column": 57 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 780, + "End": 786, + "Line": 38, + "Column": 58 + }, + "Value": "input" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 758, + "End": 780, + "Line": 38, + "Column": 36 + }, + "Value": "$input description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Value": "StoryLikeSubscribeInput" + } + }, + "DefaultValue": null, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 812, + "End": 977, + "Line": 38, + "Column": 90 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 835, + "End": 849, + "Line": 39, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 835, + "End": 841, + "Line": 39, + "Column": 22 + }, + "Value": "input" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 842, + "End": 849, + "Line": 39, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 843, + "End": 849, + "Line": 39, + "Column": 30 + }, + "Value": "input" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 850, + "End": 954, + "Line": 39, + "Column": 37 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 862, + "End": 952, + "Line": 40, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 877, + "End": 919, + "Line": 41, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Value": "count" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 870, + "End": 919, + "Line": 41, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 870, + "End": 878, + "Line": 41, + "Column": 7 + }, + "Value": "likers" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 920, + "End": 948, + "Line": 44, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Value": "text" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 907, + "End": 948, + "Line": 44, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 907, + "End": 921, + "Line": 44, + "Column": 7 + }, + "Value": "likeSentence" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 856, + "End": 952, + "Line": 40, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 856, + "End": 863, + "Line": 40, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 816, + "End": 954, + "Line": 39, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 816, + "End": 835, + "Line": 39, + "Column": 3 + }, + "Value": "storyLikeSubscribe" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "FragmentDefinition", + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 956, + "End": 987, + "Line": 51, + "Column": 1 + }, + "Value": "Fragment description", + "Block": false + }, + "VariableDefinitions": [], + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Value": "Friend" + } + }, + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1003, + "End": 1107, + "Line": 52, + "Column": 25 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1011, + "End": 1027, + "Line": 53, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1011, + "End": 1016, + "Line": 53, + "Column": 7 + }, + "Value": "size" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1017, + "End": 1027, + "Line": 53, + "Column": 13 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1018, + "End": 1027, + "Line": 53, + "Column": 14 + }, + "Value": "size" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1024, + "End": 1036, + "Line": 53, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1024, + "End": 1028, + "Line": 53, + "Column": 20 + }, + "Value": "bar" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1029, + "End": 1036, + "Line": 53, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1030, + "End": 1036, + "Line": 53, + "Column": 26 + }, + "Value": "b" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1033, + "End": 1102, + "Line": 53, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1033, + "End": 1037, + "Line": 53, + "Column": 29 + }, + "Value": "obj" + }, + "Value": { + "Kind": "ObjectValue", + "Location": { + "Start": 1038, + "End": 1102, + "Line": 53, + "Column": 34 + }, + "Fields": [ + { + "Kind": "ObjectField", + "Location": { + "Start": 1039, + "End": 1058, + "Line": 53, + "Column": 35 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1039, + "End": 1043, + "Line": 53, + "Column": 35 + }, + "Value": "key" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1044, + "End": 1058, + "Line": 53, + "Column": 40 + }, + "Value": "value", + "Block": false + } + }, + { + "Kind": "ObjectField", + "Location": { + "Start": 1053, + "End": 1101, + "Line": 53, + "Column": 49 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1053, + "End": 1059, + "Line": 53, + "Column": 49 + }, + "Value": "block" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1060, + "End": 1101, + "Line": 53, + "Column": 56 + }, + "Value": " block string uses \"\"\"", + "Block": true + } + } + ] + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1007, + "End": 1104, + "Line": 53, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1007, + "End": 1011, + "Line": 53, + "Column": 3 + }, + "Value": "foo" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 979, + "End": 1107, + "Line": 52, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 988, + "End": 995, + "Line": 52, + "Column": 10 + }, + "Value": "frag" + }, + "Directives": [] + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Name": null, + "Description": null, + "Operation": "Query", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1118, + "End": 1138, + "Line": 61, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1118, + "End": 1125, + "Line": 61, + "Column": 11 + }, + "Value": "truthy" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1126, + "End": 1138, + "Line": 61, + "Column": 19 + }, + "Value": true + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1132, + "End": 1154, + "Line": 61, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1132, + "End": 1139, + "Line": 61, + "Column": 25 + }, + "Value": "falsey" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1140, + "End": 1154, + "Line": 61, + "Column": 33 + }, + "Value": false + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1147, + "End": 1161, + "Line": 61, + "Column": 40 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1147, + "End": 1155, + "Line": 61, + "Column": 40 + }, + "Value": "nullish" + }, + "Value": { + "Kind": "NullValue", + "Location": { + "Start": 1156, + "End": 1161, + "Line": 61, + "Column": 49 + }, + "Value": null + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1110, + "End": 1170, + "Line": 61, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1110, + "End": 1118, + "Line": 61, + "Column": 3 + }, + "Value": "unnamed" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Value": "query" + }, + "Directives": [] + } + ] + } + } + ], + "Count": 162, + "FieldsCount": 20 +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_AllProps_No_Cache.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_AllProps_No_Cache.snap new file mode 100644 index 00000000000..f82a438a62b --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_AllProps_No_Cache.snap @@ -0,0 +1,1721 @@ +Variables: +--------------- +{ + "RootElement": { + "ValueKind": "Object" + } +} +--------------- + +Extensions: +--------------- +{ + "RootElement": { + "ValueKind": "Object" + } +} +--------------- + +Query: +--------------- +{ + "Kind": "Document", + "Location": { + "Start": 0, + "End": 1173, + "Line": 1, + "Column": 1 + }, + "Definitions": [ + { + "Kind": "OperationDefinition", + "Location": { + "Start": 192, + "End": 611, + "Line": 7, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 198, + "End": 208, + "Line": 7, + "Column": 7 + }, + "Value": "queryName" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 172, + "End": 197, + "Line": 6, + "Column": 1 + }, + "Value": "Query description", + "Block": false + }, + "Operation": "Query", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 208, + "End": 264, + "Line": 7, + "Column": 17 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 227, + "End": 232, + "Line": 7, + "Column": 36 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 228, + "End": 232, + "Line": 7, + "Column": 37 + }, + "Value": "foo" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 208, + "End": 228, + "Line": 7, + "Column": 17 + }, + "Value": "$foo description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Value": "ComplexType" + } + }, + "DefaultValue": null, + "Directives": [] + }, + { + "Kind": "VariableDefinition", + "Location": { + "Start": 246, + "End": 287, + "Line": 7, + "Column": 55 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 266, + "End": 272, + "Line": 7, + "Column": 75 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 267, + "End": 272, + "Line": 7, + "Column": 76 + }, + "Value": "site" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 246, + "End": 267, + "Line": 7, + "Column": 55 + }, + "Value": "$site description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Value": "Site" + } + }, + "DefaultValue": { + "Kind": "EnumValue", + "Location": { + "Start": 280, + "End": 287, + "Line": 7, + "Column": 89 + }, + "Value": "MOBILE" + }, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 288, + "End": 611, + "Line": 7, + "Column": 97 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 292, + "End": 305, + "Line": 8, + "Column": 3 + }, + "Value": "whoever123is" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 311, + "End": 326, + "Line": 8, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 311, + "End": 314, + "Line": 8, + "Column": 22 + }, + "Value": "id" + }, + "Value": { + "Kind": "ListValue", + "Location": { + "Start": 315, + "End": 326, + "Line": 8, + "Column": 26 + }, + "Items": [ + { + "Kind": "IntValue", + "Location": { + "Start": 316, + "End": 324, + "Line": 8, + "Column": 27 + }, + "Value": "123" + }, + { + "Kind": "IntValue", + "Location": { + "Start": 321, + "End": 325, + "Line": 8, + "Column": 32 + }, + "Value": "456" + } + ] + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 327, + "End": 588, + "Line": 8, + "Column": 38 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 342, + "End": 520, + "Line": 10, + "Column": 5 + }, + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Value": "User" + } + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 354, + "End": 362, + "Line": 10, + "Column": 17 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 355, + "End": 362, + "Line": 10, + "Column": 18 + }, + "Value": "defer" + }, + "Arguments": [] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 361, + "End": 520, + "Line": 10, + "Column": 24 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 376, + "End": 512, + "Line": 11, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 399, + "End": 405, + "Line": 13, + "Column": 9 + }, + "Value": "alias" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 413, + "End": 428, + "Line": 13, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 413, + "End": 419, + "Line": 13, + "Column": 23 + }, + "Value": "first" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 419, + "End": 428, + "Line": 13, + "Column": 29 + }, + "Value": "10" + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 423, + "End": 435, + "Line": 13, + "Column": 33 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 423, + "End": 429, + "Line": 13, + "Column": 33 + }, + "Value": "after" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 429, + "End": 435, + "Line": 13, + "Column": 39 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 430, + "End": 435, + "Line": 13, + "Column": 40 + }, + "Value": "foo" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 455, + "End": 506, + "Line": 13, + "Column": 65 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "FragmentSpread", + "Location": { + "Start": 481, + "End": 498, + "Line": 15, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 484, + "End": 498, + "Line": 15, + "Column": 14 + }, + "Value": "frag" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 399, + "End": 506, + "Line": 13, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 406, + "End": 413, + "Line": 13, + "Column": 16 + }, + "Value": "field1" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 436, + "End": 456, + "Line": 13, + "Column": 46 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 437, + "End": 445, + "Line": 13, + "Column": 47 + }, + "Value": "include" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 445, + "End": 454, + "Line": 13, + "Column": 55 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 445, + "End": 448, + "Line": 13, + "Column": 55 + }, + "Value": "if" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 449, + "End": 454, + "Line": 13, + "Column": 59 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 450, + "End": 454, + "Line": 13, + "Column": 60 + }, + "Value": "foo" + } + } + } + ] + } + ] + } + ] + }, + "Location": { + "Start": 369, + "End": 512, + "Line": 11, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 369, + "End": 377, + "Line": 11, + "Column": 7 + }, + "Value": "field2" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 517, + "End": 565, + "Line": 19, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 521, + "End": 542, + "Line": 19, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 522, + "End": 527, + "Line": 19, + "Column": 10 + }, + "Value": "skip" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 527, + "End": 540, + "Line": 19, + "Column": 15 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 527, + "End": 534, + "Line": 19, + "Column": 15 + }, + "Value": "unless" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 535, + "End": 540, + "Line": 19, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 536, + "End": 540, + "Line": 19, + "Column": 24 + }, + "Value": "foo" + } + } + } + ] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 541, + "End": 565, + "Line": 19, + "Column": 29 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 562, + "End": 586, + "Line": 22, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 566, + "End": 586, + "Line": 22, + "Column": 9 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + } + ] + }, + "Location": { + "Start": 292, + "End": 588, + "Line": 8, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 306, + "End": 311, + "Line": 8, + "Column": 17 + }, + "Value": "node" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 613, + "End": 721, + "Line": 29, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 622, + "End": 633, + "Line": 29, + "Column": 10 + }, + "Value": "likeStory" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 590, + "End": 621, + "Line": 28, + "Column": 1 + }, + "Value": "Mutation description", + "Block": false + }, + "Operation": "Mutation", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 632, + "End": 721, + "Line": 29, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 641, + "End": 652, + "Line": 30, + "Column": 8 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 641, + "End": 647, + "Line": 30, + "Column": 8 + }, + "Value": "story" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 648, + "End": 652, + "Line": 30, + "Column": 15 + }, + "Value": "123" + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 660, + "End": 694, + "Line": 30, + "Column": 27 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 672, + "End": 692, + "Line": 31, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 666, + "End": 692, + "Line": 31, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 666, + "End": 673, + "Line": 31, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 636, + "End": 694, + "Line": 30, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 636, + "End": 641, + "Line": 30, + "Column": 3 + }, + "Value": "like" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 653, + "End": 661, + "Line": 30, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 654, + "End": 661, + "Line": 30, + "Column": 21 + }, + "Value": "defer" + }, + "Arguments": [] + } + ] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 723, + "End": 977, + "Line": 38, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 736, + "End": 758, + "Line": 38, + "Column": 14 + }, + "Value": "StoryLikeSubscription" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 696, + "End": 735, + "Line": 37, + "Column": 1 + }, + "Value": "Subscription description", + "Block": false + }, + "Operation": "Subscription", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 758, + "End": 811, + "Line": 38, + "Column": 36 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 779, + "End": 786, + "Line": 38, + "Column": 57 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 780, + "End": 786, + "Line": 38, + "Column": 58 + }, + "Value": "input" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 758, + "End": 780, + "Line": 38, + "Column": 36 + }, + "Value": "$input description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Value": "StoryLikeSubscribeInput" + } + }, + "DefaultValue": null, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 812, + "End": 977, + "Line": 38, + "Column": 90 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 835, + "End": 849, + "Line": 39, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 835, + "End": 841, + "Line": 39, + "Column": 22 + }, + "Value": "input" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 842, + "End": 849, + "Line": 39, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 843, + "End": 849, + "Line": 39, + "Column": 30 + }, + "Value": "input" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 850, + "End": 954, + "Line": 39, + "Column": 37 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 862, + "End": 952, + "Line": 40, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 877, + "End": 919, + "Line": 41, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Value": "count" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 870, + "End": 919, + "Line": 41, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 870, + "End": 878, + "Line": 41, + "Column": 7 + }, + "Value": "likers" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 920, + "End": 948, + "Line": 44, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Value": "text" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 907, + "End": 948, + "Line": 44, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 907, + "End": 921, + "Line": 44, + "Column": 7 + }, + "Value": "likeSentence" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 856, + "End": 952, + "Line": 40, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 856, + "End": 863, + "Line": 40, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 816, + "End": 954, + "Line": 39, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 816, + "End": 835, + "Line": 39, + "Column": 3 + }, + "Value": "storyLikeSubscribe" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "FragmentDefinition", + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 956, + "End": 987, + "Line": 51, + "Column": 1 + }, + "Value": "Fragment description", + "Block": false + }, + "VariableDefinitions": [], + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Value": "Friend" + } + }, + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1003, + "End": 1107, + "Line": 52, + "Column": 25 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1011, + "End": 1027, + "Line": 53, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1011, + "End": 1016, + "Line": 53, + "Column": 7 + }, + "Value": "size" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1017, + "End": 1027, + "Line": 53, + "Column": 13 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1018, + "End": 1027, + "Line": 53, + "Column": 14 + }, + "Value": "size" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1024, + "End": 1036, + "Line": 53, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1024, + "End": 1028, + "Line": 53, + "Column": 20 + }, + "Value": "bar" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1029, + "End": 1036, + "Line": 53, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1030, + "End": 1036, + "Line": 53, + "Column": 26 + }, + "Value": "b" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1033, + "End": 1102, + "Line": 53, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1033, + "End": 1037, + "Line": 53, + "Column": 29 + }, + "Value": "obj" + }, + "Value": { + "Kind": "ObjectValue", + "Location": { + "Start": 1038, + "End": 1102, + "Line": 53, + "Column": 34 + }, + "Fields": [ + { + "Kind": "ObjectField", + "Location": { + "Start": 1039, + "End": 1058, + "Line": 53, + "Column": 35 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1039, + "End": 1043, + "Line": 53, + "Column": 35 + }, + "Value": "key" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1044, + "End": 1058, + "Line": 53, + "Column": 40 + }, + "Value": "value", + "Block": false + } + }, + { + "Kind": "ObjectField", + "Location": { + "Start": 1053, + "End": 1101, + "Line": 53, + "Column": 49 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1053, + "End": 1059, + "Line": 53, + "Column": 49 + }, + "Value": "block" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1060, + "End": 1101, + "Line": 53, + "Column": 56 + }, + "Value": " block string uses \"\"\"", + "Block": true + } + } + ] + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1007, + "End": 1104, + "Line": 53, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1007, + "End": 1011, + "Line": 53, + "Column": 3 + }, + "Value": "foo" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 979, + "End": 1107, + "Line": 52, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 988, + "End": 995, + "Line": 52, + "Column": 10 + }, + "Value": "frag" + }, + "Directives": [] + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Name": null, + "Description": null, + "Operation": "Query", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1118, + "End": 1138, + "Line": 61, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1118, + "End": 1125, + "Line": 61, + "Column": 11 + }, + "Value": "truthy" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1126, + "End": 1138, + "Line": 61, + "Column": 19 + }, + "Value": true + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1132, + "End": 1154, + "Line": 61, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1132, + "End": 1139, + "Line": 61, + "Column": 25 + }, + "Value": "falsey" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1140, + "End": 1154, + "Line": 61, + "Column": 33 + }, + "Value": false + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1147, + "End": 1161, + "Line": 61, + "Column": 40 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1147, + "End": 1155, + "Line": 61, + "Column": 40 + }, + "Value": "nullish" + }, + "Value": { + "Kind": "NullValue", + "Location": { + "Start": 1156, + "End": 1161, + "Line": 61, + "Column": 49 + }, + "Value": null + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1110, + "End": 1170, + "Line": 61, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1110, + "End": 1118, + "Line": 61, + "Column": 3 + }, + "Value": "unnamed" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Value": "query" + }, + "Directives": [] + } + ] + } + } + ], + "Count": 162, + "FieldsCount": 20 +} +--------------- diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_No_Cache.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_No_Cache.snap new file mode 100644 index 00000000000..9684cfedb90 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_No_Cache.snap @@ -0,0 +1,1700 @@ +{ + "Kind": "Document", + "Location": { + "Start": 0, + "End": 1173, + "Line": 1, + "Column": 1 + }, + "Definitions": [ + { + "Kind": "OperationDefinition", + "Location": { + "Start": 192, + "End": 611, + "Line": 7, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 198, + "End": 208, + "Line": 7, + "Column": 7 + }, + "Value": "queryName" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 172, + "End": 197, + "Line": 6, + "Column": 1 + }, + "Value": "Query description", + "Block": false + }, + "Operation": "Query", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 208, + "End": 264, + "Line": 7, + "Column": 17 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 227, + "End": 232, + "Line": 7, + "Column": 36 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 228, + "End": 232, + "Line": 7, + "Column": 37 + }, + "Value": "foo" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 208, + "End": 228, + "Line": 7, + "Column": 17 + }, + "Value": "$foo description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Value": "ComplexType" + } + }, + "DefaultValue": null, + "Directives": [] + }, + { + "Kind": "VariableDefinition", + "Location": { + "Start": 246, + "End": 287, + "Line": 7, + "Column": 55 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 266, + "End": 272, + "Line": 7, + "Column": 75 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 267, + "End": 272, + "Line": 7, + "Column": 76 + }, + "Value": "site" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 246, + "End": 267, + "Line": 7, + "Column": 55 + }, + "Value": "$site description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Value": "Site" + } + }, + "DefaultValue": { + "Kind": "EnumValue", + "Location": { + "Start": 280, + "End": 287, + "Line": 7, + "Column": 89 + }, + "Value": "MOBILE" + }, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 288, + "End": 611, + "Line": 7, + "Column": 97 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 292, + "End": 305, + "Line": 8, + "Column": 3 + }, + "Value": "whoever123is" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 311, + "End": 326, + "Line": 8, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 311, + "End": 314, + "Line": 8, + "Column": 22 + }, + "Value": "id" + }, + "Value": { + "Kind": "ListValue", + "Location": { + "Start": 315, + "End": 326, + "Line": 8, + "Column": 26 + }, + "Items": [ + { + "Kind": "IntValue", + "Location": { + "Start": 316, + "End": 324, + "Line": 8, + "Column": 27 + }, + "Value": "123" + }, + { + "Kind": "IntValue", + "Location": { + "Start": 321, + "End": 325, + "Line": 8, + "Column": 32 + }, + "Value": "456" + } + ] + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 327, + "End": 588, + "Line": 8, + "Column": 38 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 342, + "End": 520, + "Line": 10, + "Column": 5 + }, + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Value": "User" + } + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 354, + "End": 362, + "Line": 10, + "Column": 17 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 355, + "End": 362, + "Line": 10, + "Column": 18 + }, + "Value": "defer" + }, + "Arguments": [] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 361, + "End": 520, + "Line": 10, + "Column": 24 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 376, + "End": 512, + "Line": 11, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 399, + "End": 405, + "Line": 13, + "Column": 9 + }, + "Value": "alias" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 413, + "End": 428, + "Line": 13, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 413, + "End": 419, + "Line": 13, + "Column": 23 + }, + "Value": "first" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 419, + "End": 428, + "Line": 13, + "Column": 29 + }, + "Value": "10" + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 423, + "End": 435, + "Line": 13, + "Column": 33 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 423, + "End": 429, + "Line": 13, + "Column": 33 + }, + "Value": "after" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 429, + "End": 435, + "Line": 13, + "Column": 39 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 430, + "End": 435, + "Line": 13, + "Column": 40 + }, + "Value": "foo" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 455, + "End": 506, + "Line": 13, + "Column": 65 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "FragmentSpread", + "Location": { + "Start": 481, + "End": 498, + "Line": 15, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 484, + "End": 498, + "Line": 15, + "Column": 14 + }, + "Value": "frag" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 399, + "End": 506, + "Line": 13, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 406, + "End": 413, + "Line": 13, + "Column": 16 + }, + "Value": "field1" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 436, + "End": 456, + "Line": 13, + "Column": 46 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 437, + "End": 445, + "Line": 13, + "Column": 47 + }, + "Value": "include" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 445, + "End": 454, + "Line": 13, + "Column": 55 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 445, + "End": 448, + "Line": 13, + "Column": 55 + }, + "Value": "if" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 449, + "End": 454, + "Line": 13, + "Column": 59 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 450, + "End": 454, + "Line": 13, + "Column": 60 + }, + "Value": "foo" + } + } + } + ] + } + ] + } + ] + }, + "Location": { + "Start": 369, + "End": 512, + "Line": 11, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 369, + "End": 377, + "Line": 11, + "Column": 7 + }, + "Value": "field2" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 517, + "End": 565, + "Line": 19, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 521, + "End": 542, + "Line": 19, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 522, + "End": 527, + "Line": 19, + "Column": 10 + }, + "Value": "skip" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 527, + "End": 540, + "Line": 19, + "Column": 15 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 527, + "End": 534, + "Line": 19, + "Column": 15 + }, + "Value": "unless" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 535, + "End": 540, + "Line": 19, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 536, + "End": 540, + "Line": 19, + "Column": 24 + }, + "Value": "foo" + } + } + } + ] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 541, + "End": 565, + "Line": 19, + "Column": 29 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 562, + "End": 586, + "Line": 22, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 566, + "End": 586, + "Line": 22, + "Column": 9 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + } + ] + }, + "Location": { + "Start": 292, + "End": 588, + "Line": 8, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 306, + "End": 311, + "Line": 8, + "Column": 17 + }, + "Value": "node" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 613, + "End": 721, + "Line": 29, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 622, + "End": 633, + "Line": 29, + "Column": 10 + }, + "Value": "likeStory" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 590, + "End": 621, + "Line": 28, + "Column": 1 + }, + "Value": "Mutation description", + "Block": false + }, + "Operation": "Mutation", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 632, + "End": 721, + "Line": 29, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 641, + "End": 652, + "Line": 30, + "Column": 8 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 641, + "End": 647, + "Line": 30, + "Column": 8 + }, + "Value": "story" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 648, + "End": 652, + "Line": 30, + "Column": 15 + }, + "Value": "123" + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 660, + "End": 694, + "Line": 30, + "Column": 27 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 672, + "End": 692, + "Line": 31, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 666, + "End": 692, + "Line": 31, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 666, + "End": 673, + "Line": 31, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 636, + "End": 694, + "Line": 30, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 636, + "End": 641, + "Line": 30, + "Column": 3 + }, + "Value": "like" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 653, + "End": 661, + "Line": 30, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 654, + "End": 661, + "Line": 30, + "Column": 21 + }, + "Value": "defer" + }, + "Arguments": [] + } + ] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 723, + "End": 977, + "Line": 38, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 736, + "End": 758, + "Line": 38, + "Column": 14 + }, + "Value": "StoryLikeSubscription" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 696, + "End": 735, + "Line": 37, + "Column": 1 + }, + "Value": "Subscription description", + "Block": false + }, + "Operation": "Subscription", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 758, + "End": 811, + "Line": 38, + "Column": 36 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 779, + "End": 786, + "Line": 38, + "Column": 57 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 780, + "End": 786, + "Line": 38, + "Column": 58 + }, + "Value": "input" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 758, + "End": 780, + "Line": 38, + "Column": 36 + }, + "Value": "$input description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Value": "StoryLikeSubscribeInput" + } + }, + "DefaultValue": null, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 812, + "End": 977, + "Line": 38, + "Column": 90 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 835, + "End": 849, + "Line": 39, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 835, + "End": 841, + "Line": 39, + "Column": 22 + }, + "Value": "input" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 842, + "End": 849, + "Line": 39, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 843, + "End": 849, + "Line": 39, + "Column": 30 + }, + "Value": "input" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 850, + "End": 954, + "Line": 39, + "Column": 37 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 862, + "End": 952, + "Line": 40, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 877, + "End": 919, + "Line": 41, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Value": "count" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 870, + "End": 919, + "Line": 41, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 870, + "End": 878, + "Line": 41, + "Column": 7 + }, + "Value": "likers" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 920, + "End": 948, + "Line": 44, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Value": "text" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 907, + "End": 948, + "Line": 44, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 907, + "End": 921, + "Line": 44, + "Column": 7 + }, + "Value": "likeSentence" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 856, + "End": 952, + "Line": 40, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 856, + "End": 863, + "Line": 40, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 816, + "End": 954, + "Line": 39, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 816, + "End": 835, + "Line": 39, + "Column": 3 + }, + "Value": "storyLikeSubscribe" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "FragmentDefinition", + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 956, + "End": 987, + "Line": 51, + "Column": 1 + }, + "Value": "Fragment description", + "Block": false + }, + "VariableDefinitions": [], + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Value": "Friend" + } + }, + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1003, + "End": 1107, + "Line": 52, + "Column": 25 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1011, + "End": 1027, + "Line": 53, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1011, + "End": 1016, + "Line": 53, + "Column": 7 + }, + "Value": "size" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1017, + "End": 1027, + "Line": 53, + "Column": 13 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1018, + "End": 1027, + "Line": 53, + "Column": 14 + }, + "Value": "size" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1024, + "End": 1036, + "Line": 53, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1024, + "End": 1028, + "Line": 53, + "Column": 20 + }, + "Value": "bar" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1029, + "End": 1036, + "Line": 53, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1030, + "End": 1036, + "Line": 53, + "Column": 26 + }, + "Value": "b" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1033, + "End": 1102, + "Line": 53, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1033, + "End": 1037, + "Line": 53, + "Column": 29 + }, + "Value": "obj" + }, + "Value": { + "Kind": "ObjectValue", + "Location": { + "Start": 1038, + "End": 1102, + "Line": 53, + "Column": 34 + }, + "Fields": [ + { + "Kind": "ObjectField", + "Location": { + "Start": 1039, + "End": 1058, + "Line": 53, + "Column": 35 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1039, + "End": 1043, + "Line": 53, + "Column": 35 + }, + "Value": "key" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1044, + "End": 1058, + "Line": 53, + "Column": 40 + }, + "Value": "value", + "Block": false + } + }, + { + "Kind": "ObjectField", + "Location": { + "Start": 1053, + "End": 1101, + "Line": 53, + "Column": 49 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1053, + "End": 1059, + "Line": 53, + "Column": 49 + }, + "Value": "block" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1060, + "End": 1101, + "Line": 53, + "Column": 56 + }, + "Value": " block string uses \"\"\"", + "Block": true + } + } + ] + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1007, + "End": 1104, + "Line": 53, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1007, + "End": 1011, + "Line": 53, + "Column": 3 + }, + "Value": "foo" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 979, + "End": 1107, + "Line": 52, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 988, + "End": 995, + "Line": 52, + "Column": 10 + }, + "Value": "frag" + }, + "Directives": [] + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Name": null, + "Description": null, + "Operation": "Query", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1118, + "End": 1138, + "Line": 61, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1118, + "End": 1125, + "Line": 61, + "Column": 11 + }, + "Value": "truthy" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1126, + "End": 1138, + "Line": 61, + "Column": 19 + }, + "Value": true + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1132, + "End": 1154, + "Line": 61, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1132, + "End": 1139, + "Line": 61, + "Column": 25 + }, + "Value": "falsey" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1140, + "End": 1154, + "Line": 61, + "Column": 33 + }, + "Value": false + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1147, + "End": 1161, + "Line": 61, + "Column": 40 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1147, + "End": 1155, + "Line": 61, + "Column": 40 + }, + "Value": "nullish" + }, + "Value": { + "Kind": "NullValue", + "Location": { + "Start": 1156, + "End": 1161, + "Line": 61, + "Column": 49 + }, + "Value": null + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1110, + "End": 1170, + "Line": 61, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1110, + "End": 1118, + "Line": 61, + "Column": 3 + }, + "Value": "unnamed" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Value": "query" + }, + "Directives": [] + } + ] + } + } + ], + "Count": 162, + "FieldsCount": 20 +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Cache.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Cache.snap new file mode 100644 index 00000000000..9684cfedb90 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Cache.snap @@ -0,0 +1,1700 @@ +{ + "Kind": "Document", + "Location": { + "Start": 0, + "End": 1173, + "Line": 1, + "Column": 1 + }, + "Definitions": [ + { + "Kind": "OperationDefinition", + "Location": { + "Start": 192, + "End": 611, + "Line": 7, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 198, + "End": 208, + "Line": 7, + "Column": 7 + }, + "Value": "queryName" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 172, + "End": 197, + "Line": 6, + "Column": 1 + }, + "Value": "Query description", + "Block": false + }, + "Operation": "Query", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 208, + "End": 264, + "Line": 7, + "Column": 17 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 227, + "End": 232, + "Line": 7, + "Column": 36 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 228, + "End": 232, + "Line": 7, + "Column": 37 + }, + "Value": "foo" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 208, + "End": 228, + "Line": 7, + "Column": 17 + }, + "Value": "$foo description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Value": "ComplexType" + } + }, + "DefaultValue": null, + "Directives": [] + }, + { + "Kind": "VariableDefinition", + "Location": { + "Start": 246, + "End": 287, + "Line": 7, + "Column": 55 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 266, + "End": 272, + "Line": 7, + "Column": 75 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 267, + "End": 272, + "Line": 7, + "Column": 76 + }, + "Value": "site" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 246, + "End": 267, + "Line": 7, + "Column": 55 + }, + "Value": "$site description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Value": "Site" + } + }, + "DefaultValue": { + "Kind": "EnumValue", + "Location": { + "Start": 280, + "End": 287, + "Line": 7, + "Column": 89 + }, + "Value": "MOBILE" + }, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 288, + "End": 611, + "Line": 7, + "Column": 97 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 292, + "End": 305, + "Line": 8, + "Column": 3 + }, + "Value": "whoever123is" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 311, + "End": 326, + "Line": 8, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 311, + "End": 314, + "Line": 8, + "Column": 22 + }, + "Value": "id" + }, + "Value": { + "Kind": "ListValue", + "Location": { + "Start": 315, + "End": 326, + "Line": 8, + "Column": 26 + }, + "Items": [ + { + "Kind": "IntValue", + "Location": { + "Start": 316, + "End": 324, + "Line": 8, + "Column": 27 + }, + "Value": "123" + }, + { + "Kind": "IntValue", + "Location": { + "Start": 321, + "End": 325, + "Line": 8, + "Column": 32 + }, + "Value": "456" + } + ] + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 327, + "End": 588, + "Line": 8, + "Column": 38 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 342, + "End": 520, + "Line": 10, + "Column": 5 + }, + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Value": "User" + } + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 354, + "End": 362, + "Line": 10, + "Column": 17 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 355, + "End": 362, + "Line": 10, + "Column": 18 + }, + "Value": "defer" + }, + "Arguments": [] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 361, + "End": 520, + "Line": 10, + "Column": 24 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 376, + "End": 512, + "Line": 11, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 399, + "End": 405, + "Line": 13, + "Column": 9 + }, + "Value": "alias" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 413, + "End": 428, + "Line": 13, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 413, + "End": 419, + "Line": 13, + "Column": 23 + }, + "Value": "first" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 419, + "End": 428, + "Line": 13, + "Column": 29 + }, + "Value": "10" + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 423, + "End": 435, + "Line": 13, + "Column": 33 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 423, + "End": 429, + "Line": 13, + "Column": 33 + }, + "Value": "after" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 429, + "End": 435, + "Line": 13, + "Column": 39 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 430, + "End": 435, + "Line": 13, + "Column": 40 + }, + "Value": "foo" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 455, + "End": 506, + "Line": 13, + "Column": 65 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "FragmentSpread", + "Location": { + "Start": 481, + "End": 498, + "Line": 15, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 484, + "End": 498, + "Line": 15, + "Column": 14 + }, + "Value": "frag" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 399, + "End": 506, + "Line": 13, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 406, + "End": 413, + "Line": 13, + "Column": 16 + }, + "Value": "field1" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 436, + "End": 456, + "Line": 13, + "Column": 46 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 437, + "End": 445, + "Line": 13, + "Column": 47 + }, + "Value": "include" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 445, + "End": 454, + "Line": 13, + "Column": 55 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 445, + "End": 448, + "Line": 13, + "Column": 55 + }, + "Value": "if" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 449, + "End": 454, + "Line": 13, + "Column": 59 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 450, + "End": 454, + "Line": 13, + "Column": 60 + }, + "Value": "foo" + } + } + } + ] + } + ] + } + ] + }, + "Location": { + "Start": 369, + "End": 512, + "Line": 11, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 369, + "End": 377, + "Line": 11, + "Column": 7 + }, + "Value": "field2" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 517, + "End": 565, + "Line": 19, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 521, + "End": 542, + "Line": 19, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 522, + "End": 527, + "Line": 19, + "Column": 10 + }, + "Value": "skip" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 527, + "End": 540, + "Line": 19, + "Column": 15 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 527, + "End": 534, + "Line": 19, + "Column": 15 + }, + "Value": "unless" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 535, + "End": 540, + "Line": 19, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 536, + "End": 540, + "Line": 19, + "Column": 24 + }, + "Value": "foo" + } + } + } + ] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 541, + "End": 565, + "Line": 19, + "Column": 29 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 562, + "End": 586, + "Line": 22, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 566, + "End": 586, + "Line": 22, + "Column": 9 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + } + ] + }, + "Location": { + "Start": 292, + "End": 588, + "Line": 8, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 306, + "End": 311, + "Line": 8, + "Column": 17 + }, + "Value": "node" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 613, + "End": 721, + "Line": 29, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 622, + "End": 633, + "Line": 29, + "Column": 10 + }, + "Value": "likeStory" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 590, + "End": 621, + "Line": 28, + "Column": 1 + }, + "Value": "Mutation description", + "Block": false + }, + "Operation": "Mutation", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 632, + "End": 721, + "Line": 29, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 641, + "End": 652, + "Line": 30, + "Column": 8 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 641, + "End": 647, + "Line": 30, + "Column": 8 + }, + "Value": "story" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 648, + "End": 652, + "Line": 30, + "Column": 15 + }, + "Value": "123" + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 660, + "End": 694, + "Line": 30, + "Column": 27 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 672, + "End": 692, + "Line": 31, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 666, + "End": 692, + "Line": 31, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 666, + "End": 673, + "Line": 31, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 636, + "End": 694, + "Line": 30, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 636, + "End": 641, + "Line": 30, + "Column": 3 + }, + "Value": "like" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 653, + "End": 661, + "Line": 30, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 654, + "End": 661, + "Line": 30, + "Column": 21 + }, + "Value": "defer" + }, + "Arguments": [] + } + ] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 723, + "End": 977, + "Line": 38, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 736, + "End": 758, + "Line": 38, + "Column": 14 + }, + "Value": "StoryLikeSubscription" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 696, + "End": 735, + "Line": 37, + "Column": 1 + }, + "Value": "Subscription description", + "Block": false + }, + "Operation": "Subscription", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 758, + "End": 811, + "Line": 38, + "Column": 36 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 779, + "End": 786, + "Line": 38, + "Column": 57 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 780, + "End": 786, + "Line": 38, + "Column": 58 + }, + "Value": "input" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 758, + "End": 780, + "Line": 38, + "Column": 36 + }, + "Value": "$input description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Value": "StoryLikeSubscribeInput" + } + }, + "DefaultValue": null, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 812, + "End": 977, + "Line": 38, + "Column": 90 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 835, + "End": 849, + "Line": 39, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 835, + "End": 841, + "Line": 39, + "Column": 22 + }, + "Value": "input" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 842, + "End": 849, + "Line": 39, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 843, + "End": 849, + "Line": 39, + "Column": 30 + }, + "Value": "input" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 850, + "End": 954, + "Line": 39, + "Column": 37 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 862, + "End": 952, + "Line": 40, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 877, + "End": 919, + "Line": 41, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Value": "count" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 870, + "End": 919, + "Line": 41, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 870, + "End": 878, + "Line": 41, + "Column": 7 + }, + "Value": "likers" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 920, + "End": 948, + "Line": 44, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Value": "text" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 907, + "End": 948, + "Line": 44, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 907, + "End": 921, + "Line": 44, + "Column": 7 + }, + "Value": "likeSentence" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 856, + "End": 952, + "Line": 40, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 856, + "End": 863, + "Line": 40, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 816, + "End": 954, + "Line": 39, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 816, + "End": 835, + "Line": 39, + "Column": 3 + }, + "Value": "storyLikeSubscribe" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "FragmentDefinition", + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 956, + "End": 987, + "Line": 51, + "Column": 1 + }, + "Value": "Fragment description", + "Block": false + }, + "VariableDefinitions": [], + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Value": "Friend" + } + }, + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1003, + "End": 1107, + "Line": 52, + "Column": 25 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1011, + "End": 1027, + "Line": 53, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1011, + "End": 1016, + "Line": 53, + "Column": 7 + }, + "Value": "size" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1017, + "End": 1027, + "Line": 53, + "Column": 13 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1018, + "End": 1027, + "Line": 53, + "Column": 14 + }, + "Value": "size" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1024, + "End": 1036, + "Line": 53, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1024, + "End": 1028, + "Line": 53, + "Column": 20 + }, + "Value": "bar" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1029, + "End": 1036, + "Line": 53, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1030, + "End": 1036, + "Line": 53, + "Column": 26 + }, + "Value": "b" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1033, + "End": 1102, + "Line": 53, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1033, + "End": 1037, + "Line": 53, + "Column": 29 + }, + "Value": "obj" + }, + "Value": { + "Kind": "ObjectValue", + "Location": { + "Start": 1038, + "End": 1102, + "Line": 53, + "Column": 34 + }, + "Fields": [ + { + "Kind": "ObjectField", + "Location": { + "Start": 1039, + "End": 1058, + "Line": 53, + "Column": 35 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1039, + "End": 1043, + "Line": 53, + "Column": 35 + }, + "Value": "key" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1044, + "End": 1058, + "Line": 53, + "Column": 40 + }, + "Value": "value", + "Block": false + } + }, + { + "Kind": "ObjectField", + "Location": { + "Start": 1053, + "End": 1101, + "Line": 53, + "Column": 49 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1053, + "End": 1059, + "Line": 53, + "Column": 49 + }, + "Value": "block" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1060, + "End": 1101, + "Line": 53, + "Column": 56 + }, + "Value": " block string uses \"\"\"", + "Block": true + } + } + ] + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1007, + "End": 1104, + "Line": 53, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1007, + "End": 1011, + "Line": 53, + "Column": 3 + }, + "Value": "foo" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 979, + "End": 1107, + "Line": 52, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 988, + "End": 995, + "Line": 52, + "Column": 10 + }, + "Value": "frag" + }, + "Directives": [] + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Name": null, + "Description": null, + "Operation": "Query", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1118, + "End": 1138, + "Line": 61, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1118, + "End": 1125, + "Line": 61, + "Column": 11 + }, + "Value": "truthy" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1126, + "End": 1138, + "Line": 61, + "Column": 19 + }, + "Value": true + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1132, + "End": 1154, + "Line": 61, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1132, + "End": 1139, + "Line": 61, + "Column": 25 + }, + "Value": "falsey" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1140, + "End": 1154, + "Line": 61, + "Column": 33 + }, + "Value": false + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1147, + "End": 1161, + "Line": 61, + "Column": 40 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1147, + "End": 1155, + "Line": 61, + "Column": 40 + }, + "Value": "nullish" + }, + "Value": { + "Kind": "NullValue", + "Location": { + "Start": 1156, + "End": 1161, + "Line": 61, + "Column": 49 + }, + "Value": null + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1110, + "End": 1170, + "Line": 61, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1110, + "End": 1118, + "Line": 61, + "Column": 3 + }, + "Value": "unnamed" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Value": "query" + }, + "Directives": [] + } + ] + } + } + ], + "Count": 162, + "FieldsCount": 20 +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Russian_Characters.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Russian_Characters.snap new file mode 100644 index 00000000000..f05709c3446 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Russian_Characters.snap @@ -0,0 +1,125 @@ +{ + "Kind": "Document", + "Location": { + "Start": 0, + "End": 64, + "Line": 1, + "Column": 1 + }, + "Definitions": [ + { + "Kind": "OperationDefinition", + "Location": { + "Start": 0, + "End": 64, + "Line": 1, + "Column": 1 + }, + "Name": null, + "Description": null, + "Operation": "Query", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 6, + "End": 64, + "Line": 1, + "Column": 7 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 16, + "End": 42, + "Line": 2, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 16, + "End": 26, + "Line": 2, + "Column": 9 + }, + "Value": "parameter" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 27, + "End": 42, + "Line": 2, + "Column": 20 + }, + "Value": "привет", + "Block": false + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 43, + "End": 63, + "Line": 2, + "Column": 36 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 49, + "End": 61, + "Line": 3, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 49, + "End": 61, + "Line": 3, + "Column": 5 + }, + "Value": "subField" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 10, + "End": 63, + "Line": 2, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 10, + "End": 16, + "Line": 2, + "Column": 3 + }, + "Value": "field" + }, + "Directives": [] + } + ] + } + } + ], + "Count": 11, + "FieldsCount": 2 +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Russian_Escaped_Characters.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Russian_Escaped_Characters.snap new file mode 100644 index 00000000000..f05709c3446 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_With_Russian_Escaped_Characters.snap @@ -0,0 +1,125 @@ +{ + "Kind": "Document", + "Location": { + "Start": 0, + "End": 64, + "Line": 1, + "Column": 1 + }, + "Definitions": [ + { + "Kind": "OperationDefinition", + "Location": { + "Start": 0, + "End": 64, + "Line": 1, + "Column": 1 + }, + "Name": null, + "Description": null, + "Operation": "Query", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 6, + "End": 64, + "Line": 1, + "Column": 7 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 16, + "End": 42, + "Line": 2, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 16, + "End": 26, + "Line": 2, + "Column": 9 + }, + "Value": "parameter" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 27, + "End": 42, + "Line": 2, + "Column": 20 + }, + "Value": "привет", + "Block": false + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 43, + "End": 63, + "Line": 2, + "Column": 36 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 49, + "End": 61, + "Line": 3, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 49, + "End": 61, + "Line": 3, + "Column": 5 + }, + "Value": "subField" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 10, + "End": 63, + "Line": 2, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 10, + "End": 16, + "Line": 2, + "Column": 3 + }, + "Value": "field" + }, + "Directives": [] + } + ] + } + } + ], + "Count": 11, + "FieldsCount": 2 +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Skip_Custom_Property.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Skip_Custom_Property.snap new file mode 100644 index 00000000000..9684cfedb90 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Skip_Custom_Property.snap @@ -0,0 +1,1700 @@ +{ + "Kind": "Document", + "Location": { + "Start": 0, + "End": 1173, + "Line": 1, + "Column": 1 + }, + "Definitions": [ + { + "Kind": "OperationDefinition", + "Location": { + "Start": 192, + "End": 611, + "Line": 7, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 198, + "End": 208, + "Line": 7, + "Column": 7 + }, + "Value": "queryName" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 172, + "End": 197, + "Line": 6, + "Column": 1 + }, + "Value": "Query description", + "Block": false + }, + "Operation": "Query", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 208, + "End": 264, + "Line": 7, + "Column": 17 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 227, + "End": 232, + "Line": 7, + "Column": 36 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 228, + "End": 232, + "Line": 7, + "Column": 37 + }, + "Value": "foo" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 208, + "End": 228, + "Line": 7, + "Column": 17 + }, + "Value": "$foo description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Value": "ComplexType" + } + }, + "DefaultValue": null, + "Directives": [] + }, + { + "Kind": "VariableDefinition", + "Location": { + "Start": 246, + "End": 287, + "Line": 7, + "Column": 55 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 266, + "End": 272, + "Line": 7, + "Column": 75 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 267, + "End": 272, + "Line": 7, + "Column": 76 + }, + "Value": "site" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 246, + "End": 267, + "Line": 7, + "Column": 55 + }, + "Value": "$site description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Value": "Site" + } + }, + "DefaultValue": { + "Kind": "EnumValue", + "Location": { + "Start": 280, + "End": 287, + "Line": 7, + "Column": 89 + }, + "Value": "MOBILE" + }, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 288, + "End": 611, + "Line": 7, + "Column": 97 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 292, + "End": 305, + "Line": 8, + "Column": 3 + }, + "Value": "whoever123is" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 311, + "End": 326, + "Line": 8, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 311, + "End": 314, + "Line": 8, + "Column": 22 + }, + "Value": "id" + }, + "Value": { + "Kind": "ListValue", + "Location": { + "Start": 315, + "End": 326, + "Line": 8, + "Column": 26 + }, + "Items": [ + { + "Kind": "IntValue", + "Location": { + "Start": 316, + "End": 324, + "Line": 8, + "Column": 27 + }, + "Value": "123" + }, + { + "Kind": "IntValue", + "Location": { + "Start": 321, + "End": 325, + "Line": 8, + "Column": 32 + }, + "Value": "456" + } + ] + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 327, + "End": 588, + "Line": 8, + "Column": 38 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 342, + "End": 520, + "Line": 10, + "Column": 5 + }, + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Value": "User" + } + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 354, + "End": 362, + "Line": 10, + "Column": 17 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 355, + "End": 362, + "Line": 10, + "Column": 18 + }, + "Value": "defer" + }, + "Arguments": [] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 361, + "End": 520, + "Line": 10, + "Column": 24 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 376, + "End": 512, + "Line": 11, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 399, + "End": 405, + "Line": 13, + "Column": 9 + }, + "Value": "alias" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 413, + "End": 428, + "Line": 13, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 413, + "End": 419, + "Line": 13, + "Column": 23 + }, + "Value": "first" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 419, + "End": 428, + "Line": 13, + "Column": 29 + }, + "Value": "10" + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 423, + "End": 435, + "Line": 13, + "Column": 33 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 423, + "End": 429, + "Line": 13, + "Column": 33 + }, + "Value": "after" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 429, + "End": 435, + "Line": 13, + "Column": 39 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 430, + "End": 435, + "Line": 13, + "Column": 40 + }, + "Value": "foo" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 455, + "End": 506, + "Line": 13, + "Column": 65 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "FragmentSpread", + "Location": { + "Start": 481, + "End": 498, + "Line": 15, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 484, + "End": 498, + "Line": 15, + "Column": 14 + }, + "Value": "frag" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 399, + "End": 506, + "Line": 13, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 406, + "End": 413, + "Line": 13, + "Column": 16 + }, + "Value": "field1" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 436, + "End": 456, + "Line": 13, + "Column": 46 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 437, + "End": 445, + "Line": 13, + "Column": 47 + }, + "Value": "include" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 445, + "End": 454, + "Line": 13, + "Column": 55 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 445, + "End": 448, + "Line": 13, + "Column": 55 + }, + "Value": "if" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 449, + "End": 454, + "Line": 13, + "Column": 59 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 450, + "End": 454, + "Line": 13, + "Column": 60 + }, + "Value": "foo" + } + } + } + ] + } + ] + } + ] + }, + "Location": { + "Start": 369, + "End": 512, + "Line": 11, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 369, + "End": 377, + "Line": 11, + "Column": 7 + }, + "Value": "field2" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 517, + "End": 565, + "Line": 19, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 521, + "End": 542, + "Line": 19, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 522, + "End": 527, + "Line": 19, + "Column": 10 + }, + "Value": "skip" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 527, + "End": 540, + "Line": 19, + "Column": 15 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 527, + "End": 534, + "Line": 19, + "Column": 15 + }, + "Value": "unless" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 535, + "End": 540, + "Line": 19, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 536, + "End": 540, + "Line": 19, + "Column": 24 + }, + "Value": "foo" + } + } + } + ] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 541, + "End": 565, + "Line": 19, + "Column": 29 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 562, + "End": 586, + "Line": 22, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 566, + "End": 586, + "Line": 22, + "Column": 9 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + } + ] + }, + "Location": { + "Start": 292, + "End": 588, + "Line": 8, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 306, + "End": 311, + "Line": 8, + "Column": 17 + }, + "Value": "node" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 613, + "End": 721, + "Line": 29, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 622, + "End": 633, + "Line": 29, + "Column": 10 + }, + "Value": "likeStory" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 590, + "End": 621, + "Line": 28, + "Column": 1 + }, + "Value": "Mutation description", + "Block": false + }, + "Operation": "Mutation", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 632, + "End": 721, + "Line": 29, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 641, + "End": 652, + "Line": 30, + "Column": 8 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 641, + "End": 647, + "Line": 30, + "Column": 8 + }, + "Value": "story" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 648, + "End": 652, + "Line": 30, + "Column": 15 + }, + "Value": "123" + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 660, + "End": 694, + "Line": 30, + "Column": 27 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 672, + "End": 692, + "Line": 31, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 666, + "End": 692, + "Line": 31, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 666, + "End": 673, + "Line": 31, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 636, + "End": 694, + "Line": 30, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 636, + "End": 641, + "Line": 30, + "Column": 3 + }, + "Value": "like" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 653, + "End": 661, + "Line": 30, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 654, + "End": 661, + "Line": 30, + "Column": 21 + }, + "Value": "defer" + }, + "Arguments": [] + } + ] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 723, + "End": 977, + "Line": 38, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 736, + "End": 758, + "Line": 38, + "Column": 14 + }, + "Value": "StoryLikeSubscription" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 696, + "End": 735, + "Line": 37, + "Column": 1 + }, + "Value": "Subscription description", + "Block": false + }, + "Operation": "Subscription", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 758, + "End": 811, + "Line": 38, + "Column": 36 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 779, + "End": 786, + "Line": 38, + "Column": 57 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 780, + "End": 786, + "Line": 38, + "Column": 58 + }, + "Value": "input" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 758, + "End": 780, + "Line": 38, + "Column": 36 + }, + "Value": "$input description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Value": "StoryLikeSubscribeInput" + } + }, + "DefaultValue": null, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 812, + "End": 977, + "Line": 38, + "Column": 90 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 835, + "End": 849, + "Line": 39, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 835, + "End": 841, + "Line": 39, + "Column": 22 + }, + "Value": "input" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 842, + "End": 849, + "Line": 39, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 843, + "End": 849, + "Line": 39, + "Column": 30 + }, + "Value": "input" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 850, + "End": 954, + "Line": 39, + "Column": 37 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 862, + "End": 952, + "Line": 40, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 877, + "End": 919, + "Line": 41, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Value": "count" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 870, + "End": 919, + "Line": 41, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 870, + "End": 878, + "Line": 41, + "Column": 7 + }, + "Value": "likers" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 920, + "End": 948, + "Line": 44, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Value": "text" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 907, + "End": 948, + "Line": 44, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 907, + "End": 921, + "Line": 44, + "Column": 7 + }, + "Value": "likeSentence" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 856, + "End": 952, + "Line": 40, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 856, + "End": 863, + "Line": 40, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 816, + "End": 954, + "Line": 39, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 816, + "End": 835, + "Line": 39, + "Column": 3 + }, + "Value": "storyLikeSubscribe" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "FragmentDefinition", + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 956, + "End": 987, + "Line": 51, + "Column": 1 + }, + "Value": "Fragment description", + "Block": false + }, + "VariableDefinitions": [], + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Value": "Friend" + } + }, + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1003, + "End": 1107, + "Line": 52, + "Column": 25 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1011, + "End": 1027, + "Line": 53, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1011, + "End": 1016, + "Line": 53, + "Column": 7 + }, + "Value": "size" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1017, + "End": 1027, + "Line": 53, + "Column": 13 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1018, + "End": 1027, + "Line": 53, + "Column": 14 + }, + "Value": "size" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1024, + "End": 1036, + "Line": 53, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1024, + "End": 1028, + "Line": 53, + "Column": 20 + }, + "Value": "bar" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1029, + "End": 1036, + "Line": 53, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1030, + "End": 1036, + "Line": 53, + "Column": 26 + }, + "Value": "b" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1033, + "End": 1102, + "Line": 53, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1033, + "End": 1037, + "Line": 53, + "Column": 29 + }, + "Value": "obj" + }, + "Value": { + "Kind": "ObjectValue", + "Location": { + "Start": 1038, + "End": 1102, + "Line": 53, + "Column": 34 + }, + "Fields": [ + { + "Kind": "ObjectField", + "Location": { + "Start": 1039, + "End": 1058, + "Line": 53, + "Column": 35 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1039, + "End": 1043, + "Line": 53, + "Column": 35 + }, + "Value": "key" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1044, + "End": 1058, + "Line": 53, + "Column": 40 + }, + "Value": "value", + "Block": false + } + }, + { + "Kind": "ObjectField", + "Location": { + "Start": 1053, + "End": 1101, + "Line": 53, + "Column": 49 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1053, + "End": 1059, + "Line": 53, + "Column": 49 + }, + "Value": "block" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1060, + "End": 1101, + "Line": 53, + "Column": 56 + }, + "Value": " block string uses \"\"\"", + "Block": true + } + } + ] + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1007, + "End": 1104, + "Line": 53, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1007, + "End": 1011, + "Line": 53, + "Column": 3 + }, + "Value": "foo" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 979, + "End": 1107, + "Line": 52, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 988, + "End": 995, + "Line": 52, + "Column": 10 + }, + "Value": "frag" + }, + "Directives": [] + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Name": null, + "Description": null, + "Operation": "Query", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1118, + "End": 1138, + "Line": 61, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1118, + "End": 1125, + "Line": 61, + "Column": 11 + }, + "Value": "truthy" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1126, + "End": 1138, + "Line": 61, + "Column": 19 + }, + "Value": true + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1132, + "End": 1154, + "Line": 61, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1132, + "End": 1139, + "Line": 61, + "Column": 25 + }, + "Value": "falsey" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1140, + "End": 1154, + "Line": 61, + "Column": 33 + }, + "Value": false + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1147, + "End": 1161, + "Line": 61, + "Column": 40 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1147, + "End": 1155, + "Line": 61, + "Column": 40 + }, + "Value": "nullish" + }, + "Value": { + "Kind": "NullValue", + "Location": { + "Start": 1156, + "End": 1161, + "Line": 61, + "Column": 49 + }, + "Value": null + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1110, + "End": 1170, + "Line": 61, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1110, + "End": 1118, + "Line": 61, + "Column": 3 + }, + "Value": "unnamed" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Value": "query" + }, + "Directives": [] + } + ] + } + } + ], + "Count": 162, + "FieldsCount": 20 +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Utf8GraphQLRequestParser_Parse.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Utf8GraphQLRequestParser_Parse.snap new file mode 100644 index 00000000000..9684cfedb90 --- /dev/null +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Utf8GraphQLRequestParser_Parse.snap @@ -0,0 +1,1700 @@ +{ + "Kind": "Document", + "Location": { + "Start": 0, + "End": 1173, + "Line": 1, + "Column": 1 + }, + "Definitions": [ + { + "Kind": "OperationDefinition", + "Location": { + "Start": 192, + "End": 611, + "Line": 7, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 198, + "End": 208, + "Line": 7, + "Column": 7 + }, + "Value": "queryName" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 172, + "End": 197, + "Line": 6, + "Column": 1 + }, + "Value": "Query description", + "Block": false + }, + "Operation": "Query", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 208, + "End": 264, + "Line": 7, + "Column": 17 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 227, + "End": 232, + "Line": 7, + "Column": 36 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 228, + "End": 232, + "Line": 7, + "Column": 37 + }, + "Value": "foo" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 208, + "End": 228, + "Line": 7, + "Column": 17 + }, + "Value": "$foo description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 233, + "End": 264, + "Line": 7, + "Column": 42 + }, + "Value": "ComplexType" + } + }, + "DefaultValue": null, + "Directives": [] + }, + { + "Kind": "VariableDefinition", + "Location": { + "Start": 246, + "End": 287, + "Line": 7, + "Column": 55 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 266, + "End": 272, + "Line": 7, + "Column": 75 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 267, + "End": 272, + "Line": 7, + "Column": 76 + }, + "Value": "site" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 246, + "End": 267, + "Line": 7, + "Column": 55 + }, + "Value": "$site description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 273, + "End": 279, + "Line": 7, + "Column": 82 + }, + "Value": "Site" + } + }, + "DefaultValue": { + "Kind": "EnumValue", + "Location": { + "Start": 280, + "End": 287, + "Line": 7, + "Column": 89 + }, + "Value": "MOBILE" + }, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 288, + "End": 611, + "Line": 7, + "Column": 97 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 292, + "End": 305, + "Line": 8, + "Column": 3 + }, + "Value": "whoever123is" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 311, + "End": 326, + "Line": 8, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 311, + "End": 314, + "Line": 8, + "Column": 22 + }, + "Value": "id" + }, + "Value": { + "Kind": "ListValue", + "Location": { + "Start": 315, + "End": 326, + "Line": 8, + "Column": 26 + }, + "Items": [ + { + "Kind": "IntValue", + "Location": { + "Start": 316, + "End": 324, + "Line": 8, + "Column": 27 + }, + "Value": "123" + }, + { + "Kind": "IntValue", + "Location": { + "Start": 321, + "End": 325, + "Line": 8, + "Column": 32 + }, + "Value": "456" + } + ] + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 327, + "End": 588, + "Line": 8, + "Column": 38 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 333, + "End": 345, + "Line": 9, + "Column": 5 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 342, + "End": 520, + "Line": 10, + "Column": 5 + }, + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 349, + "End": 355, + "Line": 10, + "Column": 12 + }, + "Value": "User" + } + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 354, + "End": 362, + "Line": 10, + "Column": 17 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 355, + "End": 362, + "Line": 10, + "Column": 18 + }, + "Value": "defer" + }, + "Arguments": [] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 361, + "End": 520, + "Line": 10, + "Column": 24 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 376, + "End": 512, + "Line": 11, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 386, + "End": 404, + "Line": 12, + "Column": 9 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": { + "Kind": "Name", + "Location": { + "Start": 399, + "End": 405, + "Line": 13, + "Column": 9 + }, + "Value": "alias" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 413, + "End": 428, + "Line": 13, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 413, + "End": 419, + "Line": 13, + "Column": 23 + }, + "Value": "first" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 419, + "End": 428, + "Line": 13, + "Column": 29 + }, + "Value": "10" + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 423, + "End": 435, + "Line": 13, + "Column": 33 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 423, + "End": 429, + "Line": 13, + "Column": 33 + }, + "Value": "after" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 429, + "End": 435, + "Line": 13, + "Column": 39 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 430, + "End": 435, + "Line": 13, + "Column": 40 + }, + "Value": "foo" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 455, + "End": 506, + "Line": 13, + "Column": 65 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 467, + "End": 484, + "Line": 14, + "Column": 11 + }, + "Value": "id" + }, + "Directives": [] + }, + { + "Kind": "FragmentSpread", + "Location": { + "Start": 481, + "End": 498, + "Line": 15, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 484, + "End": 498, + "Line": 15, + "Column": 14 + }, + "Value": "frag" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 399, + "End": 506, + "Line": 13, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 406, + "End": 413, + "Line": 13, + "Column": 16 + }, + "Value": "field1" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 436, + "End": 456, + "Line": 13, + "Column": 46 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 437, + "End": 445, + "Line": 13, + "Column": 47 + }, + "Value": "include" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 445, + "End": 454, + "Line": 13, + "Column": 55 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 445, + "End": 448, + "Line": 13, + "Column": 55 + }, + "Value": "if" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 449, + "End": 454, + "Line": 13, + "Column": 59 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 450, + "End": 454, + "Line": 13, + "Column": 60 + }, + "Value": "foo" + } + } + } + ] + } + ] + } + ] + }, + "Location": { + "Start": 369, + "End": 512, + "Line": 11, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 369, + "End": 377, + "Line": 11, + "Column": 7 + }, + "Value": "field2" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 517, + "End": 565, + "Line": 19, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 521, + "End": 542, + "Line": 19, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 522, + "End": 527, + "Line": 19, + "Column": 10 + }, + "Value": "skip" + }, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 527, + "End": 540, + "Line": 19, + "Column": 15 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 527, + "End": 534, + "Line": 19, + "Column": 15 + }, + "Value": "unless" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 535, + "End": 540, + "Line": 19, + "Column": 23 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 536, + "End": 540, + "Line": 19, + "Column": 24 + }, + "Value": "foo" + } + } + } + ] + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 541, + "End": 565, + "Line": 19, + "Column": 29 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 549, + "End": 557, + "Line": 20, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "InlineFragment", + "Location": { + "Start": 562, + "End": 586, + "Line": 22, + "Column": 5 + }, + "TypeCondition": null, + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 566, + "End": 586, + "Line": 22, + "Column": 9 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 574, + "End": 582, + "Line": 23, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + } + } + ] + }, + "Location": { + "Start": 292, + "End": 588, + "Line": 8, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 306, + "End": 311, + "Line": 8, + "Column": 17 + }, + "Value": "node" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 613, + "End": 721, + "Line": 29, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 622, + "End": 633, + "Line": 29, + "Column": 10 + }, + "Value": "likeStory" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 590, + "End": 621, + "Line": 28, + "Column": 1 + }, + "Value": "Mutation description", + "Block": false + }, + "Operation": "Mutation", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 632, + "End": 721, + "Line": 29, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 641, + "End": 652, + "Line": 30, + "Column": 8 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 641, + "End": 647, + "Line": 30, + "Column": 8 + }, + "Value": "story" + }, + "Value": { + "Kind": "IntValue", + "Location": { + "Start": 648, + "End": 652, + "Line": 30, + "Column": 15 + }, + "Value": "123" + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 660, + "End": 694, + "Line": 30, + "Column": 27 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 672, + "End": 692, + "Line": 31, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 680, + "End": 688, + "Line": 32, + "Column": 7 + }, + "Value": "id" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 666, + "End": 692, + "Line": 31, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 666, + "End": 673, + "Line": 31, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 636, + "End": 694, + "Line": 30, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 636, + "End": 641, + "Line": 30, + "Column": 3 + }, + "Value": "like" + }, + "Directives": [ + { + "Kind": "Directive", + "Location": { + "Start": 653, + "End": 661, + "Line": 30, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 654, + "End": 661, + "Line": 30, + "Column": 21 + }, + "Value": "defer" + }, + "Arguments": [] + } + ] + } + ] + } + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 723, + "End": 977, + "Line": 38, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 736, + "End": 758, + "Line": 38, + "Column": 14 + }, + "Value": "StoryLikeSubscription" + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 696, + "End": 735, + "Line": 37, + "Column": 1 + }, + "Value": "Subscription description", + "Block": false + }, + "Operation": "Subscription", + "VariableDefinitions": [ + { + "Kind": "VariableDefinition", + "Location": { + "Start": 758, + "End": 811, + "Line": 38, + "Column": 36 + }, + "Variable": { + "Kind": "Variable", + "Location": { + "Start": 779, + "End": 786, + "Line": 38, + "Column": 57 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 780, + "End": 786, + "Line": 38, + "Column": 58 + }, + "Value": "input" + } + }, + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 758, + "End": 780, + "Line": 38, + "Column": 36 + }, + "Value": "$input description", + "Block": false + }, + "Type": { + "Kind": "NamedType", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 787, + "End": 811, + "Line": 38, + "Column": 65 + }, + "Value": "StoryLikeSubscribeInput" + } + }, + "DefaultValue": null, + "Directives": [] + } + ], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 812, + "End": 977, + "Line": 38, + "Column": 90 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 835, + "End": 849, + "Line": 39, + "Column": 22 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 835, + "End": 841, + "Line": 39, + "Column": 22 + }, + "Value": "input" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 842, + "End": 849, + "Line": 39, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 843, + "End": 849, + "Line": 39, + "Column": 30 + }, + "Value": "input" + } + } + } + ], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 850, + "End": 954, + "Line": 39, + "Column": 37 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 862, + "End": 952, + "Line": 40, + "Column": 11 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 877, + "End": 919, + "Line": 41, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 887, + "End": 900, + "Line": 42, + "Column": 9 + }, + "Value": "count" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 870, + "End": 919, + "Line": 41, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 870, + "End": 878, + "Line": 41, + "Column": 7 + }, + "Value": "likers" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 920, + "End": 948, + "Line": 44, + "Column": 20 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 930, + "End": 942, + "Line": 45, + "Column": 9 + }, + "Value": "text" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 907, + "End": 948, + "Line": 44, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 907, + "End": 921, + "Line": 44, + "Column": 7 + }, + "Value": "likeSentence" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 856, + "End": 952, + "Line": 40, + "Column": 5 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 856, + "End": 863, + "Line": 40, + "Column": 5 + }, + "Value": "story" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 816, + "End": 954, + "Line": 39, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 816, + "End": 835, + "Line": 39, + "Column": 3 + }, + "Value": "storyLikeSubscribe" + }, + "Directives": [] + } + ] + } + }, + { + "Kind": "FragmentDefinition", + "Description": { + "Kind": "StringValue", + "Location": { + "Start": 956, + "End": 987, + "Line": 51, + "Column": 1 + }, + "Value": "Fragment description", + "Block": false + }, + "VariableDefinitions": [], + "TypeCondition": { + "Kind": "NamedType", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 996, + "End": 1004, + "Line": 52, + "Column": 18 + }, + "Value": "Friend" + } + }, + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1003, + "End": 1107, + "Line": 52, + "Column": 25 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1011, + "End": 1027, + "Line": 53, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1011, + "End": 1016, + "Line": 53, + "Column": 7 + }, + "Value": "size" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1017, + "End": 1027, + "Line": 53, + "Column": 13 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1018, + "End": 1027, + "Line": 53, + "Column": 14 + }, + "Value": "size" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1024, + "End": 1036, + "Line": 53, + "Column": 20 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1024, + "End": 1028, + "Line": 53, + "Column": 20 + }, + "Value": "bar" + }, + "Value": { + "Kind": "Variable", + "Location": { + "Start": 1029, + "End": 1036, + "Line": 53, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1030, + "End": 1036, + "Line": 53, + "Column": 26 + }, + "Value": "b" + } + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1033, + "End": 1102, + "Line": 53, + "Column": 29 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1033, + "End": 1037, + "Line": 53, + "Column": 29 + }, + "Value": "obj" + }, + "Value": { + "Kind": "ObjectValue", + "Location": { + "Start": 1038, + "End": 1102, + "Line": 53, + "Column": 34 + }, + "Fields": [ + { + "Kind": "ObjectField", + "Location": { + "Start": 1039, + "End": 1058, + "Line": 53, + "Column": 35 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1039, + "End": 1043, + "Line": 53, + "Column": 35 + }, + "Value": "key" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1044, + "End": 1058, + "Line": 53, + "Column": 40 + }, + "Value": "value", + "Block": false + } + }, + { + "Kind": "ObjectField", + "Location": { + "Start": 1053, + "End": 1101, + "Line": 53, + "Column": 49 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1053, + "End": 1059, + "Line": 53, + "Column": 49 + }, + "Value": "block" + }, + "Value": { + "Kind": "StringValue", + "Location": { + "Start": 1060, + "End": 1101, + "Line": 53, + "Column": 56 + }, + "Value": " block string uses \"\"\"", + "Block": true + } + } + ] + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1007, + "End": 1104, + "Line": 53, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1007, + "End": 1011, + "Line": 53, + "Column": 3 + }, + "Value": "foo" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 979, + "End": 1107, + "Line": 52, + "Column": 1 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 988, + "End": 995, + "Line": 52, + "Column": 10 + }, + "Value": "frag" + }, + "Directives": [] + }, + { + "Kind": "OperationDefinition", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Name": null, + "Description": null, + "Operation": "Query", + "VariableDefinitions": [], + "Directives": [], + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 1106, + "End": 1173, + "Line": 60, + "Column": 1 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [ + { + "Kind": "Argument", + "Location": { + "Start": 1118, + "End": 1138, + "Line": 61, + "Column": 11 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1118, + "End": 1125, + "Line": 61, + "Column": 11 + }, + "Value": "truthy" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1126, + "End": 1138, + "Line": 61, + "Column": 19 + }, + "Value": true + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1132, + "End": 1154, + "Line": 61, + "Column": 25 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1132, + "End": 1139, + "Line": 61, + "Column": 25 + }, + "Value": "falsey" + }, + "Value": { + "Kind": "BooleanValue", + "Location": { + "Start": 1140, + "End": 1154, + "Line": 61, + "Column": 33 + }, + "Value": false + } + }, + { + "Kind": "Argument", + "Location": { + "Start": 1147, + "End": 1161, + "Line": 61, + "Column": 40 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1147, + "End": 1155, + "Line": 61, + "Column": 40 + }, + "Value": "nullish" + }, + "Value": { + "Kind": "NullValue", + "Location": { + "Start": 1156, + "End": 1161, + "Line": 61, + "Column": 49 + }, + "Value": null + } + } + ], + "SelectionSet": null, + "Location": { + "Start": 1110, + "End": 1170, + "Line": 61, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1110, + "End": 1118, + "Line": 61, + "Column": 3 + }, + "Value": "unnamed" + }, + "Directives": [] + }, + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "SelectionSet": null, + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 1165, + "End": 1172, + "Line": 62, + "Column": 3 + }, + "Value": "query" + }, + "Directives": [] + } + ] + } + } + ], + "Count": 162, + "FieldsCount": 20 +} From 6fb0c9d23c66a8927bb4adbfc98965a3c5aad1ca Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 23 Dec 2025 15:20:51 +0100 Subject: [PATCH 055/144] feat: Enhance GraphQL request handling with improved error reporting and validation - Added `InvalidGraphQLRequestException` to handle invalid GraphQL request structures. - Introduced new resource strings for better error messages related to request validation. - Updated `Utf8GraphQLRequestParser` to throw `InvalidGraphQLRequestException` for various invalid input scenarios. - Enhanced `OperationDocumentId` with a `HasValue` property to check for non-empty values. - Improved unit tests to cover new validation cases and ensure proper error handling. - Refactored `WritePersistedOperationMiddleware` to utilize `JsonElement` for accessing extension properties. --- .../HttpMultipartMiddleware.cs | 8 +- .../HttpPostMiddlewareBase.cs | 4 +- .../Parsers/DefaultHttpRequestParser.cs | 44 +- .../Subscriptions/OperationSession.cs | 2 +- .../ApolloSubscriptionProtocolHandler.cs | 3 +- .../Execution/OperationRequestBuilder.cs | 95 ++++- ...ExecutionAbstractionsResources.Designer.cs | 6 + .../ExecutionAbstractionsResources.resx | 3 + .../InvalidGraphQLRequestException.cs | 39 ++ .../src/Language.Web/OperationDocumentId.cs | 5 + .../Properties/LangWebResources.Designer.cs | 66 +++ .../Properties/LangWebResources.resx | 33 ++ .../Language/src/Language.Web/ThrowHelper.cs | 57 +++ .../Language.Web/Utf8GraphQLRequestParser.cs | 280 +++++++------ .../Utf8GraphQLRequestParserTests.cs | 388 ++++++++++++++---- ...serTests.Parse_Apollo_Client_v4_Query.snap | 1 + .../WritePersistedOperationMiddleware.cs | 14 +- 17 files changed, 811 insertions(+), 237 deletions(-) create mode 100644 src/HotChocolate/Language/src/Language.Web/InvalidGraphQLRequestException.cs create mode 100644 src/HotChocolate/Language/src/Language.Web/ThrowHelper.cs diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs index a2f1df11c1a..ebe114da4ad 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using System.Text.Json.Nodes; using System.Text.Json.Serialization; using HotChocolate.AspNetCore.Instrumentation; using HotChocolate.AspNetCore.Parsers; @@ -173,17 +174,20 @@ private static void InsertFilesIntoRequest( GraphQLRequest request, IDictionary<string, IFile> fileMap) { - if (request.Variables is not [Dictionary<string, object?> mutableVariables]) + if (request.Variables is null + || request.Variables.RootElement.ValueKind is not JsonValueKind.Object) { throw new InvalidOperationException( HttpMultipartMiddleware_InsertFilesIntoRequest_VariablesImmutable); } + var mutableVariables = JsonNode.Parse(request.Variables.RootElement.GetRawText())!; + foreach (var (objectPath, file) in fileMap) { var path = VariablePath.Parse(objectPath); - if (!mutableVariables.TryGetValue(path.Key.Value, out var value)) + if (!mutableVariables.AsObject().TryGetPropertyValue(path.Key.Value, out var value)) { throw ThrowHelper.HttpMultipartMiddleware_VariableNotFound(objectPath); } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs index da3e85f30e3..0942bba30a4 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs @@ -100,7 +100,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses // GraphQL error result. statusCode = HttpStatusCode.BadRequest; var errors = session.Handle(ex.Errors); - result = OperationResult.FromError([..errors]); + result = OperationResult.FromError([.. errors]); session.DiagnosticEvents.ParserErrors(context, errors); goto HANDLE_RESULT; } @@ -190,7 +190,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses { // This allows extensions to throw GraphQL exceptions in the GraphQL interceptor. statusCode = null; // we let the serializer determine the status code. - result = OperationResult.FromError([..ex.Errors]); + result = OperationResult.FromError([.. ex.Errors]); foreach (var error in ex.Errors) { diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/DefaultHttpRequestParser.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/DefaultHttpRequestParser.cs index 9576c41c2ae..e173f879925 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/DefaultHttpRequestParser.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/DefaultHttpRequestParser.cs @@ -2,6 +2,7 @@ using System.Buffers; using System.Text; +using System.Text.Json; using HotChocolate.AspNetCore.Utilities; using HotChocolate.Buffers; using HotChocolate.Language; @@ -102,7 +103,7 @@ public GraphQLRequest ParseRequestFromParams(IQueryCollection parameters) string? queryId = parameters[QueryIdKey]; string? operationName = parameters[OperationNameKey]; string? onError = parameters[OnErrorKey]; - IReadOnlyDictionary<string, object?>? extensions = null; + JsonDocument? extensions = null; // if we have no query or query id, we cannot execute anything. if (string.IsNullOrWhiteSpace(query) && string.IsNullOrWhiteSpace(queryId)) @@ -112,7 +113,7 @@ public GraphQLRequest ParseRequestFromParams(IQueryCollection parameters) // query extensions. if ((string?)parameters[ExtensionsKey] is { Length: > 0 } se) { - extensions = ParseJsonObject(se); + extensions = JsonDocument.Parse(se); } // we will use the request parser utils to extract the hash from the extensions. @@ -145,16 +146,16 @@ public GraphQLRequest ParseRequestFromParams(IQueryCollection parameters) document = result.Document; } - IReadOnlyList<IReadOnlyDictionary<string, object?>>? variableSet = null; + JsonDocument? variableSet = null; if ((string?)parameters[VariablesKey] is { Length: > 0 } sv) { - variableSet = ParseVariables(sv); + variableSet = JsonDocument.Parse(sv); } if (extensions is null && (string?)parameters[ExtensionsKey] is { Length: > 0 } se) { - extensions = ParseJsonObject(se); + extensions = JsonDocument.Parse(se); } ErrorHandlingMode? errorHandlingMode = null; @@ -192,17 +193,17 @@ public GraphQLRequest ParsePersistedOperationRequestFromParams( try { - IReadOnlyList<IReadOnlyDictionary<string, object?>>? variableSet = null; + JsonDocument? variableSet = null; if ((string?)parameters[VariablesKey] is { Length: > 0 } sv) { - variableSet = ParseVariables(sv); + variableSet = JsonDocument.Parse(sv); } - IReadOnlyDictionary<string, object?>? extensions = null; + JsonDocument? extensions = null; if (extensions is null && (string?)parameters[ExtensionsKey] is { Length: > 0 } se) { - extensions = ParseJsonObject(se); + extensions = JsonDocument.Parse(se); } string? onError = parameters[OnErrorKey]; @@ -276,17 +277,28 @@ public GraphQLRequest ParsePersistedOperationRequestFromParams( return null; } - public IReadOnlyList<GraphQLRequest> ParseRequest( - string sourceText) + public IReadOnlyList<GraphQLRequest> ParseRequest(string sourceText) { + byte[]? rented = null; + var maxLength = s_utf8.GetMaxByteCount(sourceText.Length); + var span = maxLength < 256 ? stackalloc byte[256] : rented = ArrayPool<byte>.Shared.Rent(maxLength); + try { - return Parse(sourceText, _parserOptions, _documentCache, _documentHashProvider); + s_utf8.GetBytes(sourceText, span); + return Parse(span, _parserOptions, _documentCache, _documentHashProvider); } catch (OperationIdFormatException) { throw ErrorHelper.InvalidOperationIdFormat(); } + finally + { + if (rented is not null) + { + ArrayPool<byte>.Shared.Return(rented); + } + } } private async ValueTask<IReadOnlyList<GraphQLRequest>> ReadAsync( @@ -349,13 +361,19 @@ private GraphQLRequest ParsePersistedOperationRequest( string documentId, string? operationName) { + if (!OperationDocumentId.TryParse(documentId, out var parsedDocumentId)) + { + throw new InvalidGraphQLRequestException( + "The GraphQL document ID contains invalid characters."); + } + var requestParser = new Utf8GraphQLRequestParser( request, _parserOptions, _documentCache, _documentHashProvider); - return requestParser.ParsePersistedOperation(documentId, operationName); + return requestParser.ParsePersistedOperation(parsedDocumentId, operationName); } private static void EnsureValidDocumentId(string documentId) diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs index 68959a8cdae..bde78b79c52 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs @@ -152,7 +152,7 @@ private static OperationRequestBuilder CreateRequestBuilder(GraphQLRequest reque if (request.Variables is not null) { - requestBuilder.SetVariableValuesSet(request.Variables); + requestBuilder.SetVariableValues(request.Variables); } if (request.Extensions is not null) diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs index 0bc372971bf..dc5850b5c90 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs @@ -1,5 +1,6 @@ using System.Buffers; using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; using System.Text.Json; using HotChocolate.AspNetCore.Formatters; using HotChocolate.Buffers; @@ -348,7 +349,7 @@ private static bool TryParseSubscribeMessage( } var id = idProp.GetString()!; - var request = Parse(payloadProp.GetRawText()); + var request = Parse(JsonMarshal.GetRawUtf8Value(payloadProp)); if (request.Count == 0) { diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs index 40324f67237..83fece5b7d8 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs @@ -1,15 +1,29 @@ using System.Diagnostics.CodeAnalysis; using System.Text.Json; +using System.Text.Json.Serialization.Metadata; using HotChocolate.Features; using HotChocolate.Language; +using static HotChocolate.ExecutionAbstractionsResources; namespace HotChocolate.Execution; /// <summary> /// Represents a builder for creating GraphQL operation requests. /// </summary> +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public sealed class OperationRequestBuilder : IFeatureProvider { + #if !NET9_0_OR_GREATER + private static readonly JsonSerializerOptions s_serializerOptions = + new(JsonSerializerDefaults.Web) + { + TypeInfoResolver = new DefaultJsonTypeInfoResolver() + }; + #endif + private IOperationDocument? _document; private OperationDocumentId? _documentId; private OperationDocumentHash? _documentHash; @@ -175,7 +189,7 @@ public OperationRequestBuilder SetVariableValues( if (variableValues.RootElement.ValueKind is not (JsonValueKind.Object or JsonValueKind.Array)) { throw new ArgumentException( - "The JSON document must be either null or an array of variable sets.", + OperationRequestBuilder_SetVariableValues_JSONDocumentMustBeObjectOrArray, nameof(variableValues)); } @@ -184,6 +198,69 @@ public OperationRequestBuilder SetVariableValues( return this; } + /// <summary> + /// Sets the variable values for the GraphQL request. + /// The dictionary will be serialized to JSON internally. + /// </summary> + /// <param name="variableValues"> + /// The variable values for the GraphQL request as a dictionary. + /// </param> + /// <returns> + /// Returns this instance of <see cref="OperationRequestBuilder" /> for configuration chaining. + /// </returns> + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] + public OperationRequestBuilder SetVariableValues( + IReadOnlyDictionary<string, object?>? variableValues) + { + _variableValues?.Dispose(); + _variableValues = null; + + if (variableValues is null) + { + return this; + } + +#if NET9_0_OR_GREATER + _variableValues = JsonSerializer.SerializeToDocument(variableValues, JsonSerializerOptions.Web); +#else + _variableValues = JsonSerializer.SerializeToDocument(variableValues, s_serializerOptions); +#endif + return this; + } + + /// <summary> + /// Sets the variable values for the GraphQL request as a batch operation. + /// Each dictionary in the list represents a set of variables for a separate operation execution. + /// The list will be serialized to JSON internally. + /// </summary> + /// <param name="variableValueSets"> + /// The list of variable value sets for batch GraphQL request execution. + /// </param> + /// <returns> + /// Returns this instance of <see cref="OperationRequestBuilder" /> for configuration chaining. + /// </returns> + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] + public OperationRequestBuilder SetVariableValues( + IReadOnlyList<IReadOnlyDictionary<string, object?>>? variableValueSets) + { + _variableValues?.Dispose(); + _variableValues = null; + + if (variableValueSets is null) + { + return this; + } + +#if NET9_0_OR_GREATER + _variableValues = JsonSerializer.SerializeToDocument(variableValueSets, JsonSerializerOptions.Web); +#else + _variableValues = JsonSerializer.SerializeToDocument(variableValueSets, s_serializerOptions); +#endif + return this; + } + /// <summary> /// Sets the GraphQL request extension data. /// </summary> @@ -194,9 +271,9 @@ public OperationRequestBuilder SetVariableValues( /// Returns this instance of <see cref="OperationRequestBuilder" /> for configuration chaining. /// </returns> public OperationRequestBuilder SetExtensions( - IReadOnlyDictionary<string, object?>? extensions) + JsonDocument? extensions) { - _readOnlyExtensions = extensions; + _extensions = extensions; return this; } @@ -209,9 +286,10 @@ public OperationRequestBuilder SetExtensions( /// <returns> /// Returns this instance of <see cref="OperationRequestBuilder" /> for configuration chaining. /// </returns> - public OperationRequestBuilder SetGlobalState(IReadOnlyDictionary<string, object?>? contextData) + public OperationRequestBuilder SetGlobalState( + IReadOnlyDictionary<string, object?>? contextData) { - _readOnlyContextData = _contextData; + _readOnlyContextData = contextData; _contextData = null; return this; } @@ -375,9 +453,8 @@ public OperationRequestBuilder Reset() _documentHash = null; _operationName = null; _errorHandlingMode = null; - _readOnlyVariableValues = null; _variableValues = null; - _readOnlyExtensions = null; + _extensions = null; _contextData = null; _readOnlyContextData = null; _services = null; @@ -479,7 +556,7 @@ OperationRequest operation _documentHash = operation.DocumentHash, _operationName = operation.OperationName, _errorHandlingMode = operation.ErrorHandlingMode, - _variableValues = operation.VariableValues, + _variableValues = operation.VariableValues, _readOnlyContextData = operation.ContextData, _extensions = operation.Extensions, _services = operation.Services, @@ -506,7 +583,7 @@ public static OperationRequestBuilder From(GraphQLRequest request) .SetDocumentHash(request.DocumentHash) .SetOperationName(request.OperationName) .SetErrorHandlingMode(request.ErrorHandlingMode) - .SetVariableValuesSet(request.Variables) + .SetVariableValues(request.Variables) .SetExtensions(request.Extensions); if (request.Document is not null) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.Designer.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.Designer.cs index a71c66948f0..0e07f1e56e5 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.Designer.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.Designer.cs @@ -122,5 +122,11 @@ internal static string VariableBatchRequest_Variables_Must_Be_Array { return ResourceManager.GetString("VariableBatchRequest_Variables_Must_Be_Array", resourceCulture); } } + + internal static string OperationRequestBuilder_SetVariableValues_JSONDocumentMustBeObjectOrArray { + get { + return ResourceManager.GetString("OperationRequestBuilder_SetVariableValues_JSONDocumentMustBeObjectOrArray", resourceCulture); + } + } } } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.resx b/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.resx index ad1835cdf0e..4c01770af1d 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.resx +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Properties/ExecutionAbstractionsResources.resx @@ -57,4 +57,7 @@ <data name="VariableBatchRequest_Variables_Must_Be_Array" xml:space="preserve"> <value>VariableValues must be a JSON array or objects.</value> </data> + <data name="OperationRequestBuilder_SetVariableValues_JSONDocumentMustBeObjectOrArray" xml:space="preserve"> + <value>The JSON document must be either null or an array of variable sets.</value> + </data> </root> diff --git a/src/HotChocolate/Language/src/Language.Web/InvalidGraphQLRequestException.cs b/src/HotChocolate/Language/src/Language.Web/InvalidGraphQLRequestException.cs new file mode 100644 index 00000000000..ce40cfc4778 --- /dev/null +++ b/src/HotChocolate/Language/src/Language.Web/InvalidGraphQLRequestException.cs @@ -0,0 +1,39 @@ +namespace HotChocolate.Language; + +/// <summary> +/// An exception that is thrown when a GraphQL request has an invalid structure or format. +/// </summary> +public class InvalidGraphQLRequestException : Exception +{ + /// <summary> + /// Initializes a new instance of <see cref="InvalidGraphQLRequestException"/>. + /// </summary> + public InvalidGraphQLRequestException() + { + } + + /// <summary> + /// Initializes a new instance of <see cref="InvalidGraphQLRequestException"/>. + /// </summary> + /// <param name="message"> + /// The error message that explains the reason for the exception. + /// </param> + public InvalidGraphQLRequestException(string message) + : base(message) + { + } + + /// <summary> + /// Initializes a new instance of <see cref="InvalidGraphQLRequestException"/>. + /// </summary> + /// <param name="message"> + /// The error message that explains the reason for the exception. + /// </param> + /// <param name="innerException"> + /// The exception that is the cause of the current exception. + /// </param> + public InvalidGraphQLRequestException(string message, Exception innerException) + : base(message, innerException) + { + } +} diff --git a/src/HotChocolate/Language/src/Language.Web/OperationDocumentId.cs b/src/HotChocolate/Language/src/Language.Web/OperationDocumentId.cs index c3ba36d65fa..70fdc97dd6b 100644 --- a/src/HotChocolate/Language/src/Language.Web/OperationDocumentId.cs +++ b/src/HotChocolate/Language/src/Language.Web/OperationDocumentId.cs @@ -35,6 +35,11 @@ private OperationDocumentId(string value, bool skipValidation) /// </summary> public bool IsEmpty => string.IsNullOrEmpty(Value); + /// <summary> + /// Gets a value indicating whether the GraphQL operation document id has a non-empty value. + /// </summary> + public bool HasValue => !string.IsNullOrEmpty(Value); + /// <summary> /// Gets the GraphQL operation document id. /// </summary> diff --git a/src/HotChocolate/Language/src/Language.Web/Properties/LangWebResources.Designer.cs b/src/HotChocolate/Language/src/Language.Web/Properties/LangWebResources.Designer.cs index 6127b219794..42e5de20c66 100644 --- a/src/HotChocolate/Language/src/Language.Web/Properties/LangWebResources.Designer.cs +++ b/src/HotChocolate/Language/src/Language.Web/Properties/LangWebResources.Designer.cs @@ -62,5 +62,71 @@ internal static string ParseMany_InvalidOpenToken { return ResourceManager.GetString("ParseMany_InvalidOpenToken", resourceCulture); } } + + internal static string ThrowHelper_InvalidVariablesValue { + get { + return ResourceManager.GetString("ThrowHelper_InvalidVariablesValue", resourceCulture); + } + } + + internal static string ThrowHelper_InvalidExtensionsValue { + get { + return ResourceManager.GetString("ThrowHelper_InvalidExtensionsValue", resourceCulture); + } + } + + internal static string ThrowHelper_UnknownRequestProperty { + get { + return ResourceManager.GetString("ThrowHelper_UnknownRequestProperty", resourceCulture); + } + } + + internal static string ThrowHelper_InvalidQueryValue { + get { + return ResourceManager.GetString("ThrowHelper_InvalidQueryValue", resourceCulture); + } + } + + internal static string ThrowHelper_InvalidDocumentIdValue { + get { + return ResourceManager.GetString("ThrowHelper_InvalidDocumentIdValue", resourceCulture); + } + } + + internal static string ThrowHelper_InvalidOperationNameValue { + get { + return ResourceManager.GetString("ThrowHelper_InvalidOperationNameValue", resourceCulture); + } + } + + internal static string ThrowHelper_InvalidOnErrorValue { + get { + return ResourceManager.GetString("ThrowHelper_InvalidOnErrorValue", resourceCulture); + } + } + + internal static string Utf8GraphQLRequestParser_Parse_EmptyJSONDocument { + get { + return ResourceManager.GetString("Utf8GraphQLRequestParser_Parse_EmptyJSONDocument", resourceCulture); + } + } + + internal static string Utf8GraphQLRequestParser_Parse_InvalidJSONDocument_ { + get { + return ResourceManager.GetString("Utf8GraphQLRequestParser_Parse_InvalidJSONDocument_", resourceCulture); + } + } + + internal static string Utf8GraphQLRequestParser_Parse_InvalidRequestStructure { + get { + return ResourceManager.GetString("Utf8GraphQLRequestParser_Parse_InvalidRequestStructure", resourceCulture); + } + } + + internal static string ThrowHelper_InvalidOperationTypeStructure { + get { + return ResourceManager.GetString("ThrowHelper_InvalidOperationTypeStructure", resourceCulture); + } + } } } diff --git a/src/HotChocolate/Language/src/Language.Web/Properties/LangWebResources.resx b/src/HotChocolate/Language/src/Language.Web/Properties/LangWebResources.resx index 4c0e45f6728..f989044553e 100644 --- a/src/HotChocolate/Language/src/Language.Web/Properties/LangWebResources.resx +++ b/src/HotChocolate/Language/src/Language.Web/Properties/LangWebResources.resx @@ -27,4 +27,37 @@ <data name="ParseMany_InvalidOpenToken" xml:space="preserve"> <value>Expected a {0} token but found `{1}`.</value> </data> + <data name="ThrowHelper_InvalidVariablesValue" xml:space="preserve"> + <value>Invalid 'variables' value. Expected object, array, or null, but got {0}.</value> + </data> + <data name="ThrowHelper_InvalidExtensionsValue" xml:space="preserve"> + <value>Invalid 'extensions' value. Expected object or null, but got {0}.</value> + </data> + <data name="ThrowHelper_UnknownRequestProperty" xml:space="preserve"> + <value>Unknown property '{0}' in GraphQL request.</value> + </data> + <data name="ThrowHelper_InvalidQueryValue" xml:space="preserve"> + <value>Invalid 'query' value. Expected string or null, but got {0}.</value> + </data> + <data name="ThrowHelper_InvalidDocumentIdValue" xml:space="preserve"> + <value>Invalid 'id' or 'documentId' value. Expected string or null, but got {0}.</value> + </data> + <data name="ThrowHelper_InvalidOperationNameValue" xml:space="preserve"> + <value>Invalid 'operationName' value. Expected string or null, but got {0}.</value> + </data> + <data name="ThrowHelper_InvalidOnErrorValue" xml:space="preserve"> + <value>Invalid 'onError' value. Expected string or null, but got {0}.</value> + </data> + <data name="Utf8GraphQLRequestParser_Parse_EmptyJSONDocument" xml:space="preserve"> + <value>Empty JSON document.</value> + </data> + <data name="Utf8GraphQLRequestParser_Parse_InvalidJSONDocument_" xml:space="preserve"> + <value>Invalid JSON document.</value> + </data> + <data name="Utf8GraphQLRequestParser_Parse_InvalidRequestStructure" xml:space="preserve"> + <value>Invalid request structure. Expected object or array.</value> + </data> + <data name="ThrowHelper_InvalidOperationTypeStructure" xml:space="preserve"> + <value>Invalid 'operationType' value. Expected string or null, but got {0}.</value> + </data> </root> diff --git a/src/HotChocolate/Language/src/Language.Web/ThrowHelper.cs b/src/HotChocolate/Language/src/Language.Web/ThrowHelper.cs new file mode 100644 index 00000000000..c7ecde76130 --- /dev/null +++ b/src/HotChocolate/Language/src/Language.Web/ThrowHelper.cs @@ -0,0 +1,57 @@ +using System.Globalization; +using System.Text; +using System.Text.Json; +using static HotChocolate.Language.Properties.LangWebResources; + +namespace HotChocolate.Language; + +internal static class ThrowHelper +{ + public static InvalidGraphQLRequestException InvalidQueryValue(JsonTokenType tokenType) + => new(string.Format( + CultureInfo.InvariantCulture, + ThrowHelper_InvalidQueryValue, + tokenType)); + + public static InvalidGraphQLRequestException InvalidDocumentIdValue(JsonTokenType tokenType) + => new(string.Format( + CultureInfo.InvariantCulture, + ThrowHelper_InvalidDocumentIdValue, + tokenType)); + + public static InvalidGraphQLRequestException InvalidOperationNameValue(JsonTokenType tokenType) + => new(string.Format( + CultureInfo.InvariantCulture, + ThrowHelper_InvalidOperationNameValue, + tokenType)); + + public static InvalidGraphQLRequestException InvalidOnErrorValue(JsonTokenType tokenType) + => new(string.Format( + CultureInfo.InvariantCulture, + ThrowHelper_InvalidOnErrorValue, + tokenType)); + + public static InvalidGraphQLRequestException InvalidVariablesValue(JsonTokenType tokenType) + => new(string.Format( + CultureInfo.InvariantCulture, + ThrowHelper_InvalidVariablesValue, + tokenType)); + + public static InvalidGraphQLRequestException InvalidExtensionsValue(JsonTokenType tokenType) + => new(string.Format( + CultureInfo.InvariantCulture, + ThrowHelper_InvalidExtensionsValue, + tokenType)); + + public static InvalidGraphQLRequestException UnknownRequestProperty(ReadOnlySpan<byte> propertyName) + => new(string.Format( + CultureInfo.InvariantCulture, + ThrowHelper_UnknownRequestProperty, + Encoding.UTF8.GetString(propertyName))); + + public static InvalidGraphQLRequestException InvalidOperationTypeValue(JsonTokenType tokenType) + => new(string.Format( + CultureInfo.InvariantCulture, + ThrowHelper_InvalidOperationTypeStructure, + tokenType)); +} diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs index 9dab2edbc9c..6090216a9e7 100644 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs +++ b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs @@ -1,5 +1,6 @@ using System.Buffers; using System.Text.Json; +using static HotChocolate.Language.Properties.LangWebResources; namespace HotChocolate.Language; @@ -41,19 +42,53 @@ public readonly IReadOnlyList<GraphQLRequest> Parse() if (!reader.Read()) { - throw new ArgumentException("Empty JSON document.", nameof(_requestData)); + throw new InvalidGraphQLRequestException( + Utf8GraphQLRequestParser_Parse_EmptyJSONDocument); } return reader.TokenType switch { - JsonTokenType.StartObject => [ParseRequest(ref reader)], + JsonTokenType.StartObject => [ParseRequest(ref reader, OperationDocumentId.Empty)], JsonTokenType.StartArray => ParseBatchRequest(ref reader), - _ => throw new InvalidOperationException("Invalid request structure. Expected object or array.") + _ => throw new InvalidGraphQLRequestException(Utf8GraphQLRequestParser_Parse_InvalidRequestStructure) }; } catch (JsonException ex) { - throw new ArgumentException("Invalid JSON document.", nameof(_requestData), ex); + throw new InvalidGraphQLRequestException( + Utf8GraphQLRequestParser_Parse_InvalidJSONDocument_, + ex); + } + } + + public readonly GraphQLRequest ParsePersistedOperation(OperationDocumentId operationId, string? operationName) + { + try + { + var reader = new Utf8JsonReader(_requestData, s_jsonOptions); + + if (!reader.Read()) + { + throw new InvalidGraphQLRequestException( + Utf8GraphQLRequestParser_Parse_EmptyJSONDocument); + } + + var request = ParseRequest(ref reader, operationId); + + return new GraphQLRequest( + request.Document, + operationId, + request.DocumentHash, + operationName, + request.ErrorHandlingMode, + request.Variables, + request.Extensions); + } + catch (JsonException ex) + { + throw new InvalidGraphQLRequestException( + Utf8GraphQLRequestParser_Parse_InvalidJSONDocument_, + ex); } } @@ -78,7 +113,7 @@ private readonly GraphQLRequest[] ParseBatchRequest(ref Utf8JsonReader reader) rentedArray = newArray; } - rentedArray[count++] = ParseRequest(ref reader); + rentedArray[count++] = ParseRequest(ref reader, OperationDocumentId.Empty); } } @@ -97,26 +132,23 @@ private readonly GraphQLRequest[] ParseBatchRequest(ref Utf8JsonReader reader) } } - private readonly GraphQLRequest ParseRequest(ref Utf8JsonReader reader) + private readonly GraphQLRequest ParseRequest(ref Utf8JsonReader reader, OperationDocumentId documentId = default) { DocumentNode? document = null; - OperationDocumentId? documentId = null; - OperationDocumentHash? documentHash = null; + OperationDocumentHash documentHash = default; string? operationName = null; ErrorHandlingMode? errorHandlingMode = null; JsonDocument? variables = null; JsonDocument? extensions = null; - var documentBody = default(ReadOnlySpan<byte>); - var documentSequence = default(ReadOnlySequence<byte>); - var containsDocument = false; + ReadOnlySpan<byte> documentBody = default; var isDocumentEscaped = false; - var hasDocumentSequence = false; while (reader.Read() && reader.TokenType != JsonTokenType.EndObject) { - if (reader.TokenType != JsonTokenType.PropertyName) + if (reader.TokenType is not JsonTokenType.PropertyName) { - continue; + throw new InvalidGraphQLRequestException( + $"Unexpected token type {reader.TokenType}. Expected PropertyName."); } if (reader.ValueTextEquals("query"u8)) @@ -124,29 +156,16 @@ private readonly GraphQLRequest ParseRequest(ref Utf8JsonReader reader) reader.Read(); if (reader.TokenType == JsonTokenType.String) { - // Optimized path: check if we need unescaping or sequence handling - if (reader.ValueIsEscaped || reader.HasValueSequence) - { - // Rare case: needs unescaping or sequence consolidation - containsDocument = true; - isDocumentEscaped = reader.ValueIsEscaped; - hasDocumentSequence = reader.HasValueSequence; - - if (reader.HasValueSequence) - { - documentSequence = reader.ValueSequence; - } - else - { - documentBody = reader.ValueSpan; - } - } - else if (reader.ValueSpan.Length > 0) - { - // Fast path: no escaping needed, use ValueSpan directly - containsDocument = true; - documentBody = reader.ValueSpan; - } + isDocumentEscaped = reader.ValueIsEscaped; + documentBody = reader.ValueSpan; + } + else if (reader.TokenType == JsonTokenType.Null) + { + // Null is acceptable, just skip it + } + else + { + throw ThrowHelper.InvalidQueryValue(reader.TokenType); } } else if (reader.ValueTextEquals("id"u8) || reader.ValueTextEquals("documentId"u8)) @@ -160,6 +179,14 @@ private readonly GraphQLRequest ParseRequest(ref Utf8JsonReader reader) documentId = new OperationDocumentId(id); } } + else if (reader.TokenType == JsonTokenType.Null) + { + // Null is acceptable, just skip it + } + else + { + throw ThrowHelper.InvalidDocumentIdValue(reader.TokenType); + } } else if (reader.ValueTextEquals("operationName"u8)) { @@ -172,6 +199,14 @@ private readonly GraphQLRequest ParseRequest(ref Utf8JsonReader reader) operationName = name; } } + else if (reader.TokenType == JsonTokenType.Null) + { + // Null is acceptable, just skip it + } + else + { + throw ThrowHelper.InvalidOperationNameValue(reader.TokenType); + } } else if (reader.ValueTextEquals("onError"u8)) { @@ -187,21 +222,29 @@ private readonly GraphQLRequest ParseRequest(ref Utf8JsonReader reader) _ => null }; } + else if (reader.TokenType == JsonTokenType.Null) + { + // Null is acceptable, just skip it + } + else + { + throw ThrowHelper.InvalidOnErrorValue(reader.TokenType); + } } else if (reader.ValueTextEquals("variables"u8)) { reader.Read(); - if (reader.TokenType == JsonTokenType.StartObject) + if (reader.TokenType is JsonTokenType.StartObject or JsonTokenType.StartArray) { variables = JsonDocument.ParseValue(ref reader); } else if (reader.TokenType == JsonTokenType.Null) { - variables = null; + // Null is acceptable, just skip it } else { - reader.Skip(); + throw ThrowHelper.InvalidVariablesValue(reader.TokenType); } } else if (reader.ValueTextEquals("extensions"u8)) @@ -213,23 +256,38 @@ private readonly GraphQLRequest ParseRequest(ref Utf8JsonReader reader) } else if (reader.TokenType == JsonTokenType.Null) { - extensions = null; + // Null is acceptable, just skip it } else { - reader.Skip(); + throw ThrowHelper.InvalidExtensionsValue(reader.TokenType); } } - else + else if (reader.ValueTextEquals("operationType"u8)) { reader.Read(); - reader.Skip(); + if (reader.TokenType == JsonTokenType.String) + { + // A String is acceptable, just skip it + } + else if (reader.TokenType == JsonTokenType.Null) + { + // Null is acceptable, just skip it + } + else + { + throw ThrowHelper.InvalidOperationTypeValue(reader.TokenType); + } + } + else + { + throw ThrowHelper.UnknownRequestProperty(reader.ValueSpan); } } // Handle persisted queries via extensions - if (!containsDocument - && documentId is null + if (documentBody.IsEmpty + && documentId.IsEmpty && _useCache && extensions is not null && TryExtractHash(extensions, out var hash)) @@ -239,29 +297,26 @@ private readonly GraphQLRequest ParseRequest(ref Utf8JsonReader reader) } // Parse the GraphQL document if provided - if (containsDocument) + if (!documentBody.IsEmpty) { ParseDocument( documentBody, - documentSequence, isDocumentEscaped, - hasDocumentSequence, - documentId, ref document, ref documentHash, ref documentId); } // Validation - if (document is null && documentId is null) + if (document is null && documentId.IsEmpty) { - throw new InvalidOperationException("Request must contain either a query or a document id."); + throw new InvalidGraphQLRequestException("Request must contain either a query or a document id."); } return new GraphQLRequest( document, - documentId, - documentHash, + documentId.IsEmpty ? null : documentId, + documentHash.IsEmpty ? null : documentHash, operationName, errorHandlingMode, variables, @@ -270,93 +325,42 @@ private readonly GraphQLRequest ParseRequest(ref Utf8JsonReader reader) private readonly void ParseDocument( ReadOnlySpan<byte> documentBody, - ReadOnlySequence<byte> documentSequence, bool isEscaped, - bool hasSequence, - OperationDocumentId? requestDocumentId, ref DocumentNode? document, - ref OperationDocumentHash? documentHash, - ref OperationDocumentId? documentId) + ref OperationDocumentHash documentHash, + ref OperationDocumentId documentId) { - ReadOnlySpan<byte> queryBytes; byte[]? rentedBuffer = null; try { - // Handle the 4 possible scenarios - if (!isEscaped && !hasSequence) - { - // Scenario 1: No escapes, no sequence (COMMON - ~99%) - // Zero allocations - use documentBody directly - queryBytes = documentBody; - } - else if (isEscaped && !hasSequence) - { - // Scenario 2: Has escapes, no sequence (RARE) - // Allocate buffer and unescape - var maxLength = documentBody.Length; - rentedBuffer = s_bytePool.Rent(maxLength); - var unescapedSpan = rentedBuffer.AsSpan(); - Utf8Helper.Unescape(documentBody, ref unescapedSpan, isBlockString: false); - queryBytes = unescapedSpan; - } - else if (!isEscaped && hasSequence) - { - // Scenario 3: No escapes, has sequence (VERY RARE) - // Copy sequence to contiguous buffer - var totalLength = (int)documentSequence.Length; - rentedBuffer = s_bytePool.Rent(totalLength); - documentSequence.CopyTo(rentedBuffer); - queryBytes = rentedBuffer.AsSpan(0, totalLength); - } - else // isEscaped && hasSequence + if (isEscaped) { - // Scenario 4: Has escapes AND sequence (ULTRA RARE) - // Copy sequence first, then unescape - var totalLength = (int)documentSequence.Length; - var tempBuffer = s_bytePool.Rent(totalLength); - try - { - documentSequence.CopyTo(tempBuffer); - var escapedSpan = tempBuffer.AsSpan(0, totalLength); - - rentedBuffer = s_bytePool.Rent(totalLength); - var unescapedSpan = rentedBuffer.AsSpan(); - Utf8Helper.Unescape(escapedSpan, ref unescapedSpan, isBlockString: false); - queryBytes = unescapedSpan; - } - finally - { - s_bytePool.Return(tempBuffer); - } + var requiredBufferLength = documentBody.Length; + rentedBuffer = s_bytePool.Rent(requiredBufferLength); + Span<byte> unescapedDocumentBody = rentedBuffer; + Utf8Helper.Unescape(documentBody, ref unescapedDocumentBody, isBlockString: false); + documentBody = unescapedDocumentBody; } - // Now use queryBytes for parsing and caching (same as before) + // Now use the document bytes for parsing and caching if (_useCache) { - if (requestDocumentId.HasValue - && _cache!.TryGetDocument(requestDocumentId.Value.Value, out var cachedDocument)) + if (documentId.HasValue && _cache!.TryGetDocument(documentId.Value, out var cachedDocument)) { document = cachedDocument.Body; documentHash = cachedDocument.Hash; } - else + else if (documentBody.Length > 0) { - var hash = _hashProvider!.ComputeHash(queryBytes); + var hash = _hashProvider!.ComputeHash(documentBody); documentHash = hash; - if (_cache!.TryGetDocument(hash.Value, out cachedDocument)) - { - document = cachedDocument.Body; - } - else - { - document = queryBytes.Length == 0 - ? null - : Utf8GraphQLParser.Parse(queryBytes, _options); - } + document = _cache!.TryGetDocument(hash.Value, out cachedDocument) + ? cachedDocument.Body + : Utf8GraphQLParser.Parse(documentBody, _options); - if (!requestDocumentId.HasValue) + if (documentId.IsEmpty) { documentId = new OperationDocumentId(hash.Value); } @@ -364,7 +368,7 @@ private readonly void ParseDocument( } else { - document = Utf8GraphQLParser.Parse(queryBytes, _options); + document = Utf8GraphQLParser.Parse(documentBody, _options); } } finally @@ -376,12 +380,36 @@ private readonly void ParseDocument( } } - private readonly bool TryExtractHash(JsonDocument extensions, out string hash) + private readonly bool TryExtractHash(JsonDocument? extensions, out string hash) + => TryExtractHashInternal(extensions, _hashProvider, out hash); + + public static bool TryExtractHash( + JsonDocument? extensions, + IDocumentHashProvider documentHashProvider, + out string hash) + { +#if NET8_0_OR_GREATER + ArgumentNullException.ThrowIfNull(documentHashProvider); +#else + if (documentHashProvider is null) + { + throw new ArgumentNullException(nameof(documentHashProvider)); + } +#endif + + return TryExtractHashInternal(extensions, documentHashProvider, out hash); + } + + private static bool TryExtractHashInternal( + JsonDocument? extensions, + IDocumentHashProvider? documentHashProvider, + out string hash) { - if (extensions.RootElement.TryGetProperty(PersistedQuery, out var persistedQuery) + if (extensions is not null + && extensions.RootElement.TryGetProperty(PersistedQuery, out var persistedQuery) && persistedQuery.ValueKind == JsonValueKind.Object - && _hashProvider is not null - && persistedQuery.TryGetProperty(_hashProvider.Name, out var hashElement) + && documentHashProvider is not null + && persistedQuery.TryGetProperty(documentHashProvider.Name, out var hashElement) && hashElement.ValueKind == JsonValueKind.String) { hash = hashElement.GetString()!; diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs b/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs index 3dafa594de3..097242d0d35 100644 --- a/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs +++ b/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs @@ -22,16 +22,12 @@ public void Utf8GraphQLRequestParser_Parse() var batch = Utf8GraphQLRequestParser.Parse(source); // assert - Assert.Collection( - batch, - r => - { - Assert.Null(r.OperationName); - Assert.Null(r.DocumentId); - Assert.Null(r.Variables); - Assert.Null(r.Extensions); - r.Document.MatchSnapshot(); - }); + var r = Assert.Single(batch); + Assert.Null(r.OperationName); + Assert.Null(r.DocumentId); + Assert.Null(r.Variables); + Assert.Null(r.Extensions); + r.Document.MatchSnapshot(); } [Fact] @@ -51,15 +47,12 @@ public void Parse_Kitchen_Sink_Query_No_Cache() var batch = requestParser.Parse(); // assert - Assert.Collection(batch, - r => - { - Assert.Null(r.OperationName); - Assert.Null(r.DocumentId); - Assert.Null(r.Variables); - Assert.Null(r.Extensions); - r.Document.MatchSnapshot(); - }); + var request = Assert.Single(batch); + Assert.Null(request.OperationName); + Assert.Null(request.DocumentId); + Assert.Null(request.Variables); + Assert.Null(request.Extensions); + request.Document.MatchSnapshot(); } [Fact] @@ -106,16 +99,13 @@ public void Parse_Kitchen_Sink_Query_With_Russian_Escaped_Characters() var batch = requestParser.Parse(); // assert - Assert.Collection(batch, - r => - { - Assert.Null(r.OperationName); - Assert.Null(r.DocumentId); - Assert.Null(r.Variables); - Assert.Null(r.Extensions); + var request = Assert.Single(batch); + Assert.Null(request.OperationName); + Assert.Null(request.DocumentId); + Assert.Null(request.Variables); + Assert.Null(request.Extensions); - r.Document.MatchSnapshot(); - }); + request.Document.MatchSnapshot(); } [Fact] @@ -173,7 +163,7 @@ public void Parse_Kitchen_Sink_Query_With_Cache() } [Fact] - public void Parse_Skip_Custom_Property() + public void Parse_Unknown_Property_Throws() { // arrange var request = new CustomGraphQLRequestDto( @@ -181,38 +171,12 @@ public void Parse_Skip_Custom_Property() query: FileResource.Open("kitchen-sink.graphql").NormalizeLineBreaks()); var source = Encoding.UTF8.GetBytes( - JsonConvert.SerializeObject(request - ).NormalizeLineBreaks()); - - var buffer = Encoding.UTF8.GetBytes(request.Query); - var expectedHash = Convert.ToBase64String( - SHA1.Create().ComputeHash(buffer)) - .Replace("/", "_") - .Replace("+", "-") - .TrimEnd('='); - - var cache = new DocumentCache(); - - var requestParser = new Utf8GraphQLRequestParser( - source, - new ParserOptions(), - cache, - new Sha1DocumentHashProvider()); - - // act - var result = requestParser.Parse(); - - // assert - Assert.Collection(result, - r => - { - Assert.Null(r.OperationName); - Assert.Null(r.Variables); - Assert.Null(r.Extensions); + JsonConvert.SerializeObject(request).NormalizeLineBreaks()); - Assert.Equal(expectedHash, r.DocumentId?.Value); - r.Document.MatchSnapshot(); - }); + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("CustomProperty", exception.Message); } [Fact] @@ -421,8 +385,7 @@ public void Parse_Socket_Message() }).NormalizeLineBreaks()); // act - var message = - Utf8GraphQLSocketMessageParser.ParseMessage(source); + var message = Utf8GraphQLSocketMessageParser.ParseMessage(source); // assert Assert.Equal("foo", message.Type); @@ -496,17 +459,14 @@ public void Parse_Apollo_AQP_SignatureQuery_Variables_Without_Values() var batch = requestParser.Parse(); // assert - Assert.Collection(batch, - r => - { - Assert.Null(r.OperationName); - Assert.Equal("hashOfQuery", r.DocumentId?.Value); - Assert.NotNull(r.Variables); - Assert.Empty(r.Variables.RootElement.EnumerateObject()); - Assert.True(r.Extensions!.RootElement.TryGetProperty("persistedQuery", out _)); - Assert.Null(r.Document); - Assert.Equal("hashOfQuery", r.DocumentHash?.Value); - }); + var r = Assert.Single(batch); + Assert.Null(r.OperationName); + Assert.Equal("hashOfQuery", r.DocumentId?.Value); + Assert.NotNull(r.Variables); + Assert.Empty(r.Variables.RootElement.EnumerateObject()); + Assert.True(r.Extensions!.RootElement.TryGetProperty("persistedQuery", out _)); + Assert.Null(r.Document); + Assert.Equal("hashOfQuery", r.DocumentHash?.Value); } [Fact] @@ -550,7 +510,7 @@ public void Parse_Apollo_AQP_FullRequest_And_Verify_Hash() public void Parse_Invalid_Query() { // assert - Assert.Throws<InvalidOperationException>( + Assert.Throws<InvalidGraphQLRequestException>( () => { // arrange @@ -597,7 +557,7 @@ public void Parse_Empty_OperationName() public void Parse_Empty_Json() { // assert - Assert.Throws<InvalidOperationException>( + Assert.Throws<InvalidGraphQLRequestException>( () => { // arrange @@ -619,7 +579,7 @@ public void Parse_Empty_Json() public void Parse_Empty_String() { // assert - Assert.Throws<ArgumentException>( + Assert.Throws<InvalidGraphQLRequestException>( () => { // arrange @@ -640,7 +600,7 @@ public void Parse_Empty_String() public void Parse_Space_String() { // assert - Assert.Throws<ArgumentException>( + Assert.Throws<InvalidGraphQLRequestException>( () => { // arrange @@ -977,6 +937,280 @@ public void Parse_Socket_Message_Empty_Payload_Object() Assert.False(message.Payload.IsEmpty); } + [Fact] + public void Parse_Query_Invalid_Type_Number_Throws() + { + // arrange + var source = "{\"query\": 123}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("query", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_Query_Invalid_Type_Object_Throws() + { + // arrange + var source = "{\"query\": {}}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("query", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_Query_Invalid_Type_Array_Throws() + { + // arrange + var source = "{\"query\": []}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("query", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_Query_Invalid_Type_Boolean_Throws() + { + // arrange + var source = "{\"query\": true}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("query", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_DocumentId_Invalid_Type_Number_Throws() + { + // arrange + var source = "{\"id\": 456, \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("id", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_DocumentId_Invalid_Type_Object_Throws() + { + // arrange + var source = "{\"documentId\": {}, \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("documentId", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_OperationName_Invalid_Type_Number_Throws() + { + // arrange + var source = "{\"operationName\": 789, \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("operationName", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_OperationName_Invalid_Type_Array_Throws() + { + // arrange + var source = "{\"operationName\": [\"test\"], \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("operationName", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_OnError_Invalid_Type_Number_Throws() + { + // arrange + var source = "{\"onError\": 123, \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("onError", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_OnError_Invalid_Type_Object_Throws() + { + // arrange + var source = "{\"onError\": {\"mode\": \"HALT\"}, \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("onError", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_Variables_Invalid_Type_String_Throws() + { + // arrange + var source = "{\"variables\": \"invalid\", \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("variables", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_Variables_Invalid_Type_Number_Throws() + { + // arrange + var source = "{\"variables\": 123, \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("variables", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_Variables_Array_Accepted() + { + // arrange + var source = "{\"variables\": [1, 2, 3], \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act + var result = Utf8GraphQLRequestParser.Parse(source); + + // assert + var request = Assert.Single(result); + Assert.NotNull(request.Variables); + } + + [Fact] + public void Parse_Extensions_Invalid_Type_String_Throws() + { + // arrange + var source = "{\"extensions\": \"invalid\", \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("extensions", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_Extensions_Invalid_Type_Array_Throws() + { + // arrange + var source = "{\"extensions\": [], \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("extensions", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_Extensions_Invalid_Type_Number_Throws() + { + // arrange + var source = "{\"extensions\": 456, \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("extensions", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void Parse_Invalid_Request_Structure_Number_Throws() + { + // arrange + var source = "123"u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("Invalid request structure", exception.Message); + } + + [Fact] + public void Parse_Invalid_Request_Structure_String_Throws() + { + // arrange + var source = "\"test\""u8.ToArray(); + + // act & assert + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("Invalid request structure", exception.Message); + } + + [Fact] + public void Parse_Query_Null_Accepted() + { + // arrange + var source = "{\"query\": null, \"id\": \"abc\"}"u8.ToArray(); + + // act + var result = Utf8GraphQLRequestParser.Parse(source); + + // assert + var request = Assert.Single(result); + Assert.Null(request.Document); + Assert.Equal("abc", request.DocumentId?.Value); + } + + [Fact] + public void Parse_Variables_Null_Accepted() + { + // arrange + var source = "{\"variables\": null, \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act + var result = Utf8GraphQLRequestParser.Parse(source); + + // assert + var request = Assert.Single(result); + Assert.Null(request.Variables); + } + + [Fact] + public void Parse_Extensions_Null_Accepted() + { + // arrange + var source = "{\"extensions\": null, \"query\": \"{ __typename }\"}"u8.ToArray(); + + // act + var result = Utf8GraphQLRequestParser.Parse(source); + + // assert + var request = Assert.Single(result); + Assert.Null(request.Extensions); + } + + [Fact] + public void Parse_Multiple_Invalid_Properties_Throws_On_First() + { + // arrange + var source = "{\"query\": 123, \"variables\": \"invalid\", \"extensions\": []}"u8.ToArray(); + + // act & assert + // Should throw on the first invalid property encountered (query) + var exception = Assert.Throws<InvalidGraphQLRequestException>( + () => Utf8GraphQLRequestParser.Parse(source)); + Assert.Contains("query", exception.Message, StringComparison.OrdinalIgnoreCase); + } + private class GraphQLRequestDto( string query, string? id = null, diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap index b5f44efa5a0..deb99e9c26c 100644 --- a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap @@ -2,6 +2,7 @@ { "DocumentId": { "IsEmpty": false, + "HasValue": true, "Value": "foo" }, "DocumentHash": null, diff --git a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs index 43abffb803a..b86712eeab8 100644 --- a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs +++ b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using System.Text.Json; using HotChocolate.Language; using HotChocolate.PersistedOperations; using Microsoft.Extensions.DependencyInjection; @@ -43,8 +44,8 @@ public async ValueTask InvokeAsync(RequestContext context) && context.Result is OperationResult result && context.Request.Document is { } document && context.Request.Extensions is not null - && context.Request.Extensions.TryGetValue(PersistedQuery, out var s) - && s is IReadOnlyDictionary<string, object> settings) + && context.Request.Extensions.RootElement.TryGetProperty(PersistedQuery, out var settings) + && settings.ValueKind is JsonValueKind.Object) { var extensions = result.Extensions; @@ -84,15 +85,16 @@ public async ValueTask InvokeAsync(RequestContext context) } private static bool DoHashesMatch( - IReadOnlyDictionary<string, object> settings, + JsonElement settings, OperationDocumentId expectedHash, string hashName, [NotNullWhen(true)] out string? userHash) { - if (settings.TryGetValue(hashName, out var value) && value is string hash) + if (settings.TryGetProperty(hashName, out var hash) + && hash.ValueKind is JsonValueKind.String) { - userHash = hash; - return hash.Equals(expectedHash.Value, StringComparison.Ordinal); + userHash = hash.GetString()!; + return userHash.Equals(expectedHash.Value, StringComparison.Ordinal); } userHash = null; From f3f01908200dd45d4a3cdaa395ed88758baf430c Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 23 Dec 2025 16:31:15 +0100 Subject: [PATCH 056/144] feat: Refactor GraphQL request handling to use JsonDocumentOwner for improved memory management --- .../Handlers/CallToolHandler.cs | 23 ++--- .../Execution/IOperationRequest.cs | 4 +- .../Execution/OperationRequest.cs | 25 ++--- .../Execution/OperationRequestBuilder.cs | 69 +++++++++++--- .../Execution/VariableBatchRequest.cs | 13 +-- .../Types/Execution/Pipeline/PipelineTools.cs | 15 ++- .../Processing/VariableCoercionHelper.cs | 7 +- .../Core/src/Types/Types/InputParser.cs | 95 +++++++++---------- .../Core/src/Types/Utilities/StringSetPool.cs | 84 ++++++++++++++++ .../WritePersistedOperationMiddleware.cs | 2 +- .../Utilities.Buffers/JsonDocumentOwner.cs | 36 +++++-- 11 files changed, 256 insertions(+), 117 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Utilities/StringSetPool.cs diff --git a/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs b/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs index 2b61924e662..d630476c68b 100644 --- a/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs +++ b/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs @@ -1,10 +1,8 @@ using System.Security.Claims; using System.Text; -using System.Text.Json; using System.Text.Json.Nodes; using HotChocolate.Buffers; using HotChocolate.Execution; -using HotChocolate.Language; using HotChocolate.Transport.Formatters; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; @@ -39,25 +37,16 @@ public static async ValueTask<CallToolResult> HandleAsync( } var requestExecutor = services.GetRequiredService<IRequestExecutor>(); - var arguments = context.Params?.Arguments ?? Enumerable.Empty<KeyValuePair<string, JsonElement>>(); - - Dictionary<string, object?> variableValues = []; - using var buffer = new PooledArrayWriter(); - var jsonValueParser = new JsonValueParser(buffer: buffer); + var rootServiceProvider = services.GetRequiredService<IRootServiceProviderAccessor>().ServiceProvider; + var httpContext = rootServiceProvider.GetRequiredService<IHttpContextAccessor>().HttpContext!; + var requestBuilder = CreateRequestBuilder(httpContext); - foreach (var (name, value) in arguments) + if (context.Params?.Arguments is { Count: > 0 } arguments) { - variableValues.Add(name, jsonValueParser.Parse(value)); + requestBuilder.SetVariableValues(arguments); } - var rootServiceProvider = services.GetRequiredService<IRootServiceProviderAccessor>().ServiceProvider; - var httpContext = rootServiceProvider.GetRequiredService<IHttpContextAccessor>().HttpContext!; - var requestBuilder = CreateRequestBuilder(httpContext); - var request = - requestBuilder - .SetDocument(tool.DocumentNode) - .SetVariableValues(variableValues) - .Build(); + var request = requestBuilder.SetDocument(tool.DocumentNode).Build(); var result = await requestExecutor.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); var operationResult = result.ExpectOperationResult(); diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationRequest.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationRequest.cs index fca65ff5b69..2a69d941103 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationRequest.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IOperationRequest.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using HotChocolate.Buffers; using HotChocolate.Language; namespace HotChocolate.Execution; @@ -37,7 +37,7 @@ public interface IOperationRequest : IExecutionRequest /// <summary> /// Gets the GraphQL request extension data. /// </summary> - JsonDocument? Extensions { get; } + JsonDocumentOwner? Extensions { get; } /// <summary> /// GraphQL request flags allow limiting the GraphQL executor capabilities. diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs index 637147fdfb2..5ac2b50e833 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Buffers; using HotChocolate.Features; using HotChocolate.Language; using static HotChocolate.ExecutionAbstractionsResources; @@ -55,8 +56,8 @@ public OperationRequest( OperationDocumentHash? documentHash, string? operationName, ErrorHandlingMode? errorHandlingMode, - JsonDocument? variableValues, - JsonDocument? extensions, + JsonDocumentOwner? variableValues, + JsonDocumentOwner? extensions, IReadOnlyDictionary<string, object?>? contextData, IFeatureCollection? features, IServiceProvider? services, @@ -67,12 +68,12 @@ public OperationRequest( throw new ArgumentException(OperationRequest_DocumentOrIdMustBeSet, nameof(document)); } - if (variableValues is not null && variableValues.RootElement.ValueKind is not JsonValueKind.Object) + if (variableValues is not null && variableValues.Document.RootElement.ValueKind is not JsonValueKind.Object) { throw new ArgumentException(OperationRequest_Variables_Must_Be_Object, nameof(variableValues)); } - if (extensions is not null && extensions.RootElement.ValueKind is not JsonValueKind.Object) + if (extensions is not null && extensions.Document.RootElement.ValueKind is not JsonValueKind.Object) { throw new ArgumentException(OperationRequest_Extensions_Must_Be_Object, nameof(extensions)); } @@ -119,12 +120,12 @@ public OperationRequest( /// <summary> /// Gets the variable values for the GraphQL request. /// </summary> - public JsonDocument? VariableValues { get; } + public JsonDocumentOwner? VariableValues { get; } /// <summary> /// Gets the GraphQL request extension data. /// </summary> - public JsonDocument? Extensions { get; } + public JsonDocumentOwner? Extensions { get; } /// <summary> /// Gets the initial request state. @@ -277,7 +278,7 @@ public OperationRequest WithVariableValues(JsonDocument? variableValues) DocumentHash, OperationName, ErrorHandlingMode, - variableValues, + variableValues is null ? null : new JsonDocumentOwner(variableValues), Extensions, ContextData, Features, @@ -301,7 +302,7 @@ public OperationRequest WithExtensions(JsonDocument? extensions) OperationName, ErrorHandlingMode, VariableValues, - extensions, + extensions is null ? null : new JsonDocumentOwner(extensions), ContextData, Features, Services, @@ -461,8 +462,8 @@ public static OperationRequest FromId( documentHash, operationName, errorHandlingMode, - variableValues, - extensions, + variableValues is null ? null : new(variableValues), + extensions is null ? null : new(extensions), contextData, features, services, @@ -584,8 +585,8 @@ public static OperationRequest FromSourceText( documentHash, operationName, errorHandlingMode, - variableValues, - extensions, + variableValues is null ? null : new(variableValues), + extensions is null ? null : new(extensions), contextData, features, services, diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs index 83fece5b7d8..57f6507f478 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs @@ -1,6 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Text.Json; -using System.Text.Json.Serialization.Metadata; +using HotChocolate.Buffers; using HotChocolate.Features; using HotChocolate.Language; using static HotChocolate.ExecutionAbstractionsResources; @@ -16,20 +16,20 @@ namespace HotChocolate.Execution; #endif public sealed class OperationRequestBuilder : IFeatureProvider { - #if !NET9_0_OR_GREATER +#if !NET9_0_OR_GREATER private static readonly JsonSerializerOptions s_serializerOptions = new(JsonSerializerDefaults.Web) { TypeInfoResolver = new DefaultJsonTypeInfoResolver() }; - #endif +#endif private IOperationDocument? _document; private OperationDocumentId? _documentId; private OperationDocumentHash? _documentHash; private string? _operationName; - private JsonDocument? _variableValues; - private JsonDocument? _extensions; + private JsonDocumentOwner? _variableValues; + private JsonDocumentOwner? _extensions; private ErrorHandlingMode? _errorHandlingMode; private Dictionary<string, object?>? _contextData; private IReadOnlyDictionary<string, object?>? _readOnlyContextData; @@ -194,10 +194,47 @@ public OperationRequestBuilder SetVariableValues( } _variableValues?.Dispose(); - _variableValues = variableValues; + _variableValues = new JsonDocumentOwner(variableValues); return this; } + public OperationRequestBuilder SetVariableValues( + IEnumerable<KeyValuePair<string, JsonElement>>? variableValues) + { + _variableValues?.Dispose(); + _variableValues = null; + + if (variableValues is null) + { + return this; + } + + var buffer = new PooledArrayWriter(); + + try + { + using (var jsonWriter = new Utf8JsonWriter(buffer)) + { + jsonWriter.WriteStartObject(); + foreach (var (name, value) in variableValues) + { + jsonWriter.WritePropertyName(name); + value.WriteTo(jsonWriter); + } + jsonWriter.WriteEndObject(); + } + + var document = JsonDocument.Parse(buffer.WrittenMemory); + _variableValues = new JsonDocumentOwner(document, buffer); + return this; + } + catch + { + buffer.Dispose(); + throw; + } + } + /// <summary> /// Sets the variable values for the GraphQL request. /// The dictionary will be serialized to JSON internally. @@ -222,9 +259,9 @@ public OperationRequestBuilder SetVariableValues( } #if NET9_0_OR_GREATER - _variableValues = JsonSerializer.SerializeToDocument(variableValues, JsonSerializerOptions.Web); + _variableValues = new(JsonSerializer.SerializeToDocument(variableValues, JsonSerializerOptions.Web)); #else - _variableValues = JsonSerializer.SerializeToDocument(variableValues, s_serializerOptions); + _variableValues = new(JsonSerializer.SerializeToDocument(variableValues, s_serializerOptions)); #endif return this; } @@ -254,9 +291,9 @@ public OperationRequestBuilder SetVariableValues( } #if NET9_0_OR_GREATER - _variableValues = JsonSerializer.SerializeToDocument(variableValueSets, JsonSerializerOptions.Web); + _variableValues = new(JsonSerializer.SerializeToDocument(variableValueSets, JsonSerializerOptions.Web)); #else - _variableValues = JsonSerializer.SerializeToDocument(variableValueSets, s_serializerOptions); + _variableValues = new(JsonSerializer.SerializeToDocument(variableValueSets, s_serializerOptions)); #endif return this; } @@ -273,7 +310,15 @@ public OperationRequestBuilder SetVariableValues( public OperationRequestBuilder SetExtensions( JsonDocument? extensions) { - _extensions = extensions; + _variableValues?.Dispose(); + _variableValues = null; + + if (extensions is null) + { + return this; + } + + _extensions = new(extensions); return this; } @@ -480,7 +525,7 @@ public IOperationRequest Build() features = FeatureCollection.Empty; } - if (_variableValues?.RootElement.ValueKind is JsonValueKind.Array) + if (_variableValues?.Document.RootElement.ValueKind is JsonValueKind.Array) { request = new VariableBatchRequest( document: _document, diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs index 4558abd2a2d..85354194be0 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Buffers; using HotChocolate.Features; using HotChocolate.Language; using static HotChocolate.ExecutionAbstractionsResources; @@ -55,8 +56,8 @@ public VariableBatchRequest( OperationDocumentHash? documentHash, string? operationName, ErrorHandlingMode? errorHandlingMode, - JsonDocument? variableValues, - JsonDocument? extensions, + JsonDocumentOwner variableValues, + JsonDocumentOwner? extensions, IReadOnlyDictionary<string, object?>? contextData, IFeatureCollection? features, IServiceProvider? services, @@ -67,12 +68,12 @@ public VariableBatchRequest( throw new InvalidOperationException(OperationRequest_DocumentOrIdMustBeSet); } - if (variableValues is not null && variableValues.RootElement.ValueKind is not JsonValueKind.Array) + if (variableValues.Document.RootElement.ValueKind is not JsonValueKind.Array) { throw new ArgumentException(VariableBatchRequest_Variables_Must_Be_Array, nameof(variableValues)); } - if (extensions is not null && extensions.RootElement.ValueKind is not JsonValueKind.Object) + if (extensions is not null && extensions.Document.RootElement.ValueKind is not JsonValueKind.Object) { throw new ArgumentException(OperationRequest_Extensions_Must_Be_Object, nameof(extensions)); } @@ -119,12 +120,12 @@ public VariableBatchRequest( /// <summary> /// Gets a list of variable values for the GraphQL request. /// </summary> - public JsonDocument? VariableValues { get; } + public JsonDocumentOwner VariableValues { get; } /// <summary> /// Gets the GraphQL request extension data. /// </summary> - public JsonDocument? Extensions { get; } + public JsonDocumentOwner? Extensions { get; } /// <summary> /// Gets the initial request state. diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs index bfc7360fc7f..b3a3f172bcb 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs @@ -8,7 +8,6 @@ namespace HotChocolate.Execution.Pipeline; internal static class PipelineTools { - private static readonly Dictionary<string, object?> s_empty = []; private static readonly ImmutableArray<IVariableValueCollection> s_noVariables = [VariableValueCollection.Empty]; public static string CreateOperationId(string documentId, string? operationName) @@ -59,7 +58,7 @@ public static void CoerceVariables( coercionHelper.CoerceVariableValues( context.Schema, variableDefinitions, - operationRequest.VariableValues ?? s_empty, + operationRequest.VariableValues?.Document.RootElement ?? default, coercedValues); context.VariableValues = [new VariableValueCollection(coercedValues)]; @@ -72,21 +71,21 @@ public static void CoerceVariables( using (diagnosticEvents.CoerceVariables(context)) { var schema = context.Schema; - var variableSetCount = variableBatchRequest.VariableValues?.Count ?? 0; - var variableSetInput = variableBatchRequest.VariableValues!; - var variableSet = new IVariableValueCollection[variableSetCount]; + var variableValueSets = variableBatchRequest.VariableValues.Document.RootElement; + var variableSet = new IVariableValueCollection[variableValueSets.GetArrayLength()]; + var i = 0; - for (var i = 0; i < variableSetCount; i++) + foreach (var variableValues in variableValueSets.EnumerateArray()) { var coercedValues = new Dictionary<string, Processing.VariableValue>(); coercionHelper.CoerceVariableValues( schema, variableDefinitions, - variableSetInput[i], + variableValues, coercedValues); - variableSet[i] = new VariableValueCollection(coercedValues); + variableSet[i++] = new VariableValueCollection(coercedValues); } context.VariableValues = ImmutableCollectionsMarshal.AsImmutableArray(variableSet); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs index eb5878cf05e..e4def35daa0 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs @@ -28,18 +28,21 @@ public void CoerceVariableValues( ArgumentNullException.ThrowIfNull(variableDefinitions); ArgumentNullException.ThrowIfNull(coercedValues); - if (variableValues.ValueKind is JsonValueKind.Object) + if (variableValues.ValueKind is not (JsonValueKind.Object or JsonValueKind.Null or JsonValueKind.Undefined)) { throw new ArgumentException("variables must be a JSON Object", nameof(variableValues)); } + var hasVariables = variableValues.ValueKind is JsonValueKind.Object; + for (var i = 0; i < variableDefinitions.Count; i++) { var variableDefinition = variableDefinitions[i]; var variableName = variableDefinition.Variable.Name.Value; var variableType = AssertInputType(schema, variableDefinition); + JsonElement propertyValue = default; - var hasValue = variableValues.TryGetProperty(variableName, out var propertyValue); + var hasValue = hasVariables && variableValues.TryGetProperty(variableName, out propertyValue); if (!hasValue && variableDefinition.DefaultValue is { Kind: not SyntaxKind.NullValue } defaultValue) { diff --git a/src/HotChocolate/Core/src/Types/Types/InputParser.cs b/src/HotChocolate/Core/src/Types/Types/InputParser.cs index 9a8f634d48a..c03559acdcf 100644 --- a/src/HotChocolate/Core/src/Types/Types/InputParser.cs +++ b/src/HotChocolate/Core/src/Types/Types/InputParser.cs @@ -498,86 +498,85 @@ private object DeserializeObject(JsonElement inputValue, InputObjectType type, P throw OneOfMoreThanOneFieldSet(type, path); } + var processedFields = StringSetPool.Shared.Rent(); + List<string>? invalidFieldNames = null; var fieldValues = new object?[type.Fields.Count]; var consumed = 0; - foreach (var property in inputValue.EnumerateObject()) + try { - if (type.Fields.TryGetField(property.Name, out var field)) + foreach (var property in inputValue.EnumerateObject()) { - var fieldPath = path.Append(field.Name); - - if (property.Value.ValueKind is JsonValueKind.Null) + if (type.Fields.TryGetField(property.Name, out var field)) { - if (field.Type.Kind is TypeKind.NonNull) + var fieldPath = path.Append(field.Name); + if (processedFields.Add(property.Name)) { - throw NonNullInputViolation(type, fieldPath, field); + if (property.Value.ValueKind is JsonValueKind.Null) + { + if (field.Type.Kind is TypeKind.NonNull) + { + throw NonNullInputViolation(type, fieldPath, field); + } + + if (oneOf) + { + throw OneOfFieldIsNull(type, fieldPath, field); + } + } + + var value = Deserialize(property.Value, field.Type, fieldPath, field); + value = FormatAndConvertValue(field, path, null, value, field.IsOptional, true); + + fieldValues[field.Index] = value; + consumed++; } + } + else if (!_ignoreAdditionalInputFields) + { + invalidFieldNames ??= []; + invalidFieldNames.Add(property.Name); + } + } - if (oneOf) + if (processedFields.Count < fieldValues.Length) + { + for (var i = 0; i < fieldValues.Length; i++) + { + var field = type.Fields[i]; + if (processedFields.Add(field.Name)) { - throw OneOfFieldIsNull(type, fieldPath, field); + var fieldPath = path.Append(field.Name); + fieldValues[i] = CreateDefaultValue(field, fieldPath, 0); } } - - var value = Deserialize(property.Value, field.Type, fieldPath, field); - value = FormatAndConvertValue(field, path, null, value, field.IsOptional, true); - - fieldValues[field.Index] = value; - consumed++; } } - - for (var i = 0; i < type.Fields.Count; i++) + finally { - var field = type.Fields[i]; - - if (map.TryGetValue(field.Name, out var fieldValue)) - { - - } - else - { - var fieldPath = path.Append(field.Name); - fieldValues[i] = CreateDefaultValue(field, fieldPath, 0); - } + StringSetPool.Shared.Return(processedFields); } - if (!_ignoreAdditionalInputFields && consumed < map.Count) + if (invalidFieldNames?.Count > 0) { - var invalidFieldNames = new List<string>(); - - foreach (var key in map.Keys) - { - if (!type.Fields.ContainsField(key)) - { - invalidFieldNames.Add(key); - } - } - throw InvalidInputFieldNames(type, invalidFieldNames, path); } return type.CreateInstance(fieldValues); } - throw ParseInputObject_InvalidValueKind(type, resultValue.GetType(), path); + throw ParseInputObject_InvalidValueKind(type, path); } - private object? DeserializeLeaf( - object resultValue, + private static object? DeserializeLeaf( + JsonElement inputValue, ILeafType type, Path path, InputField? field) { - if (resultValue is IValueNode node) - { - return ParseLeaf(node, type, path, field); - } - try { - return type.Deserialize(resultValue); + return type.CoerceInputValue(inputValue); } catch (LeafCoercionException ex) { diff --git a/src/HotChocolate/Core/src/Types/Utilities/StringSetPool.cs b/src/HotChocolate/Core/src/Types/Utilities/StringSetPool.cs new file mode 100644 index 00000000000..b02b08168d2 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Utilities/StringSetPool.cs @@ -0,0 +1,84 @@ +namespace HotChocolate.Utilities; + +internal sealed class StringSetPool(int size = 64) +{ + private readonly Bucket _bucket = new(size); + + public HashSet<string> Rent() + => _bucket.Rent() ?? []; + + public void Return(HashSet<string> set) + { + if (set is null) + { + return; + } + + set.Clear(); + _bucket.Return(set); + } + + public static StringSetPool Shared { get; } = new StringSetPool(); + + private sealed class Bucket + { + private readonly HashSet<string>?[] _sets; + private SpinLock _lock; + private int _index; + + internal Bucket(int size) + { + _sets = new HashSet<string>[size]; + _lock = new SpinLock(false); + _index = 0; + } + + internal HashSet<string>? Rent() + { + HashSet<string>? set = null; + var lockTaken = false; + + try + { + _lock.Enter(ref lockTaken); + + if (_index < _sets.Length) + { + set = _sets[_index]; + _sets[_index++] = null; + } + } + finally + { + if (lockTaken) + { + _lock.Exit(false); + } + } + + return set; + } + + internal void Return(HashSet<string> set) + { + var lockTaken = false; + + try + { + _lock.Enter(ref lockTaken); + + if (_index > 0) + { + _sets[--_index] = set; + } + } + finally + { + if (lockTaken) + { + _lock.Exit(false); + } + } + } + } +} diff --git a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs index b86712eeab8..64f16bdd68d 100644 --- a/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs +++ b/src/HotChocolate/PersistedOperations/src/PersistedOperations.Pipeline/Execution/Pipeline/WritePersistedOperationMiddleware.cs @@ -44,7 +44,7 @@ public async ValueTask InvokeAsync(RequestContext context) && context.Result is OperationResult result && context.Request.Document is { } document && context.Request.Extensions is not null - && context.Request.Extensions.RootElement.TryGetProperty(PersistedQuery, out var settings) + && context.Request.Extensions.Document.RootElement.TryGetProperty(PersistedQuery, out var settings) && settings.ValueKind is JsonValueKind.Object) { var extensions = result.Extensions; diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonDocumentOwner.cs b/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonDocumentOwner.cs index 3091af2c3a9..2eb4f44d968 100644 --- a/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonDocumentOwner.cs +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonDocumentOwner.cs @@ -1,4 +1,3 @@ -using System.Buffers; using System.Text.Json; namespace HotChocolate.Buffers; @@ -9,7 +8,7 @@ namespace HotChocolate.Buffers; /// </summary> public sealed class JsonDocumentOwner : IDisposable { - private readonly IMemoryOwner<byte> _memory; + private readonly IDisposable? _memoryOwner; private bool _disposed; /// <summary> @@ -18,28 +17,47 @@ public sealed class JsonDocumentOwner : IDisposable /// <param name="document"> /// The <see cref="JsonDocument"/> to own. /// </param> - /// <param name="memory"> + public JsonDocumentOwner(JsonDocument document) + { +#if NET8_0_OR_GREATER + ArgumentNullException.ThrowIfNull(document); +#else + if (document is null) + { + throw new ArgumentNullException(nameof(document)); + } +#endif + + Document = document; + } + /// <summary> + /// Initializes a new instance of <see cref="JsonDocumentOwner"/>. + /// </summary> + /// <param name="document"> + /// The <see cref="JsonDocument"/> to own. + /// </param> + /// <param name="memoryOwner"> /// The memory that was used to create the <paramref name="document"/>. /// </param> - public JsonDocumentOwner(JsonDocument document, IMemoryOwner<byte> memory) + public JsonDocumentOwner(JsonDocument document, IDisposable memoryOwner) { #if NET8_0_OR_GREATER ArgumentNullException.ThrowIfNull(document); - ArgumentNullException.ThrowIfNull(memory); + ArgumentNullException.ThrowIfNull(memoryOwner); #else if (document is null) { throw new ArgumentNullException(nameof(document)); } - if (memory is null) + if (memoryOwner is null) { - throw new ArgumentNullException(nameof(memory)); + throw new ArgumentNullException(nameof(memoryOwner)); } #endif Document = document; - _memory = memory; + _memoryOwner = memoryOwner; } /// <summary> @@ -55,7 +73,7 @@ public void Dispose() if (!_disposed) { Document.Dispose(); - _memory.Dispose(); + _memoryOwner?.Dispose(); _disposed = true; } From b00ed4e304494f85e11ef7427da0be8be9530ded Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Mon, 5 Jan 2026 13:21:16 +0100 Subject: [PATCH 057/144] wip --- .../HttpMultipartMiddleware.cs | 2 +- .../Execution/OperationRequestBuilder.cs | 3 + .../src/Types.Scalars.Upload/UploadType.cs | 78 +++----- .../Pipeline/OperationResolverMiddleware.cs | 3 +- .../Types/Execution/Pipeline/PipelineTools.cs | 6 +- .../Processing/OperationCompiler.Features.cs | 17 ++ .../Execution/Processing/OperationCompiler.cs | 19 +- .../Processing/VariableCoercionHelper.cs | 26 ++- .../Types/Properties/Resources.Designer.cs | 6 + .../Core/src/Types/Properties/Resources.resx | 3 + .../Composite/Types/FieldSelectionMapType.cs | 3 +- .../Composite/Types/FieldSelectionSetType.cs | 3 +- .../src/Types/Types/Contracts/ILeafType.cs | 6 +- .../Core/src/Types/Types/EnumType.cs | 16 +- .../Core/src/Types/Types/InputParser.cs | 66 +++++-- .../Serialization/DefaultNodeIdSerializer.cs | 2 +- .../Core/src/Types/Types/Scalars/AnyType.cs | 7 +- .../src/Types/Types/Scalars/BooleanType.cs | 3 +- .../src/Types/Types/Scalars/ByteArrayType.cs | 3 +- .../src/Types/Types/Scalars/DateTimeType.cs | 3 +- .../Core/src/Types/Types/Scalars/DateType.cs | 3 +- .../src/Types/Types/Scalars/FloatTypeBase.cs | 5 +- .../Core/src/Types/Types/Scalars/IdType.cs | 3 +- .../Types/Types/Scalars/IntegerTypeBase.cs | 5 +- .../Core/src/Types/Types/Scalars/JsonType.cs | 3 +- .../Types/Types/Scalars/LocalDateTimeType.cs | 3 +- .../src/Types/Types/Scalars/LocalDateType.cs | 3 +- .../src/Types/Types/Scalars/LocalTimeType.cs | 3 +- .../src/Types/Types/Scalars/ScalarType.cs | 5 +- .../src/Types/Types/Scalars/StringType.cs | 3 +- .../src/Types/Types/Scalars/TimeSpanType.cs | 3 +- .../Core/src/Types/Types/Scalars/UrlType.cs | 3 +- .../Core/src/Types/Types/Scalars/UuidType.cs | 3 +- .../src/Primitives/Types/FileValueNode.cs | 168 ------------------ .../src/Primitives/Types/IFileLookup.cs | 26 +++ 35 files changed, 230 insertions(+), 284 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.Features.cs delete mode 100644 src/HotChocolate/Primitives/src/Primitives/Types/FileValueNode.cs create mode 100644 src/HotChocolate/Primitives/src/Primitives/Types/IFileLookup.cs diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs index ebe114da4ad..6451f698f26 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs @@ -135,7 +135,7 @@ private static HttpMultipartRequest ParseMultipartRequest(IFormCollection form) throw ThrowHelper.HttpMultipartMiddleware_MapNotSpecified(); } - // Validate file mappings and bring them in an easy to use format + // Validate file mappings and bring them in an easy-to-use format var pathToFileMap = MapFilesToObjectPaths(map, form.Files); return new HttpMultipartRequest(operations, pathToFileMap); diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs index 57f6507f478..d3463865d69 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs @@ -1,5 +1,8 @@ using System.Diagnostics.CodeAnalysis; using System.Text.Json; +#if !NET9_0_OR_GREATER +using System.Text.Json.Serialization.Metadata; +#endif using HotChocolate.Buffers; using HotChocolate.Features; using HotChocolate.Language; diff --git a/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs b/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs index 069495feaef..aed49dca7ca 100644 --- a/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs @@ -1,4 +1,7 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types.Properties; using Microsoft.Extensions.DependencyInjection; @@ -7,74 +10,45 @@ namespace HotChocolate.Types; /// <summary> /// The GraphQL Upload scalar. /// </summary> -public class UploadType : ScalarType<IFile, FileValueNode> +public sealed class UploadType : ScalarType<IFile, StringValueNode> { - /// <summary> - /// Initializes a new instance of the <see cref="UploadType"/> class. - /// </summary> - public UploadType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, bind) - { - Description = description; - } - /// <summary> /// Initializes a new instance of the <see cref="UploadType"/> class. /// </summary> [ActivatorUtilitiesConstructor] - public UploadType() - : this( - "Upload", - UploadResources.UploadType_Description, - BindingBehavior.Implicit) + public UploadType() : base("Upload", BindingBehavior.Implicit) { + Description = UploadResources.UploadType_Description; } - public override IValueNode ParseResult(object? resultValue) + public override object CoerceInputLiteral(StringValueNode valueLiteral) + => throw new NotSupportedException(); + + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (resultValue is null) + if (inputValue.ValueKind is not JsonValueKind.String) { - return NullValueNode.Default; + throw new LeafCoercionException("A file reference must be a string.", this); } - if (resultValue is IFile file) + var fileLookup = context.Features.Get<IFileLookup>(); + var fileName = inputValue.GetString()!; + + if (fileLookup is null || !fileLookup.TryGetFile(fileName, out var file)) { - return new FileValueNode(file); + throw new LeafCoercionException( + string.Format( + "The specified file `{0}` could not be found.", + fileName), + this); } - throw base.CreateParseValueError(resultValue); - } - - protected override IFile ParseLiteral(FileValueNode valueSyntax) => - valueSyntax.Value; - - protected override FileValueNode ParseValue(IFile runtimeValue) => - new(runtimeValue); - - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) - { - throw new GraphQLException( - UploadResources.UploadType_TrySerialize_NotSupported); + return file; } - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is IFile file) - { - runtimeValue = file; - return true; - } + public override void CoerceOutputValue(IFile runtimeValue, ResultElement resultValue) + => throw new NotSupportedException(); - runtimeValue = null; - return false; - } + public override IValueNode ValueToLiteral(IFile runtimeValue) + => throw new NotSupportedException(); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs index d67c0373e4d..60daa13f90c 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationResolverMiddleware.cs @@ -43,7 +43,8 @@ public async ValueTask InvokeAsync(RequestContext context) operationId ?? Guid.NewGuid().ToString("N"), documentInfo.Hash.Value, context.Request.OperationName, - documentInfo.Document); + documentInfo.Document, + context); context.SetOperation(operation); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs index b3a3f172bcb..0adab55da78 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/PipelineTools.cs @@ -59,7 +59,8 @@ public static void CoerceVariables( context.Schema, variableDefinitions, operationRequest.VariableValues?.Document.RootElement ?? default, - coercedValues); + coercedValues, + context); context.VariableValues = [new VariableValueCollection(coercedValues)]; return; @@ -83,7 +84,8 @@ public static void CoerceVariables( schema, variableDefinitions, variableValues, - coercedValues); + coercedValues, + context); variableSet[i++] = new VariableValueCollection(coercedValues); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.Features.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.Features.cs new file mode 100644 index 00000000000..3439bc32113 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.Features.cs @@ -0,0 +1,17 @@ +using HotChocolate.Features; + +namespace HotChocolate.Execution.Processing; + +public sealed partial class OperationCompiler +{ + private sealed class EmptyFeatureProvider : IFeatureProvider + { + private EmptyFeatureProvider() + { + } + + public IFeatureCollection Features => FeatureCollection.Empty; + + public static EmptyFeatureProvider Instance { get; } = new(); + } +} diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index b9d6de55af4..7459f8d6abe 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -1,6 +1,7 @@ using System.Buffers; using System.Collections.Immutable; using System.Runtime.InteropServices; +using HotChocolate.Features; using HotChocolate.Fusion.Rewriters; using HotChocolate.Language; using HotChocolate.Language.Visitors; @@ -37,14 +38,16 @@ internal OperationCompiler( public static Operation Compile( string id, DocumentNode document, - Schema schema) + Schema schema, + IFeatureProvider? context = null) => Compile(id, id, null, document, schema); public static Operation Compile( string id, string? operationName, DocumentNode document, - Schema schema) + Schema schema, + IFeatureProvider? context = null) => Compile(id, id, operationName, document, schema); public static Operation Compile( @@ -52,20 +55,22 @@ public static Operation Compile( string hash, string? operationName, DocumentNode document, - Schema schema) + Schema schema, + IFeatureProvider? context = null) => new OperationCompiler( schema, new InputParser(), new DefaultObjectPool<OrderedDictionary<string, List<FieldSelectionNode>>>( new DefaultPooledObjectPolicy<OrderedDictionary<string, List<FieldSelectionNode>>>()), new OperationCompilerOptimizers()) - .Compile(id, hash, operationName, document); + .Compile(id, hash, operationName, document, context ?? EmptyFeatureProvider.Instance); public Operation Compile( string id, string hash, string? operationName, - DocumentNode document) + DocumentNode document, + IFeatureProvider context) { ArgumentException.ThrowIfNullOrWhiteSpace(id); ArgumentNullException.ThrowIfNull(document); @@ -121,10 +126,10 @@ public Operation Compile( if (_optimizers.OperationOptimizers.Length > 0) { - var context = new OperationOptimizerContext(operation); + var optimizerContext = new OperationOptimizerContext(operation); foreach (var optimizer in _optimizers.OperationOptimizers) { - optimizer.OptimizeOperation(context); + optimizer.OptimizeOperation(optimizerContext); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs index e4def35daa0..fed8b3b1905 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs @@ -1,6 +1,8 @@ using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Types; +using static HotChocolate.Properties.Resources; namespace HotChocolate.Execution.Processing; @@ -22,7 +24,8 @@ public void CoerceVariableValues( ISchemaDefinition schema, IReadOnlyList<VariableDefinitionNode> variableDefinitions, JsonElement variableValues, - Dictionary<string, VariableValue> coercedValues) + Dictionary<string, VariableValue> coercedValues, + IFeatureProvider context) { ArgumentNullException.ThrowIfNull(schema); ArgumentNullException.ThrowIfNull(variableDefinitions); @@ -30,7 +33,9 @@ public void CoerceVariableValues( if (variableValues.ValueKind is not (JsonValueKind.Object or JsonValueKind.Null or JsonValueKind.Undefined)) { - throw new ArgumentException("variables must be a JSON Object", nameof(variableValues)); + throw new ArgumentException( + VariableCoercionHelper_CoerceVariableValues_VariablesMustBeObject, + nameof(variableValues)); } var hasVariables = variableValues.ValueKind is JsonValueKind.Object; @@ -74,7 +79,12 @@ public void CoerceVariableValues( } else { - coercedValues[variableName] = CoerceVariableValue(variableDefinition, variableType, propertyValue); + coercedValues[variableName] = + CoerceVariableValue( + variableDefinition, + variableType, + propertyValue, + context); } } } @@ -82,17 +92,21 @@ public void CoerceVariableValues( private VariableValue CoerceVariableValue( VariableDefinitionNode variableDefinition, IInputType variableType, - JsonElement inputValue) + JsonElement inputValue, + IFeatureProvider context) { var root = Path.Root.Append(variableDefinition.Variable.Name.Value); try { + var runtimeValue = _inputParser.ParseInputValue(inputValue, variableType, context, path: root); + var valueLiteral = _inputFormatter.FormatValue(inputValue, variableType, root); + return new VariableValue( variableDefinition.Variable.Name.Value, variableType, - _inputParser.ParseInputValue(inputValue, variableType, root), - _inputFormatter.FormatValue(inputValue, variableType, root)); + runtimeValue, + valueLiteral); } catch (GraphQLException) { diff --git a/src/HotChocolate/Core/src/Types/Properties/Resources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/Resources.Designer.cs index 89f003a93dd..636d633fe94 100644 --- a/src/HotChocolate/Core/src/Types/Properties/Resources.Designer.cs +++ b/src/HotChocolate/Core/src/Types/Properties/Resources.Designer.cs @@ -416,5 +416,11 @@ internal static string SelectionSetOptimizerContext_AddSelection_ResponseNameNot return ResourceManager.GetString("SelectionSetOptimizerContext_AddSelection_ResponseNameNotTheSame", resourceCulture); } } + + internal static string VariableCoercionHelper_CoerceVariableValues_VariablesMustBeObject { + get { + return ResourceManager.GetString("VariableCoercionHelper_CoerceVariableValues_VariablesMustBeObject", resourceCulture); + } + } } } diff --git a/src/HotChocolate/Core/src/Types/Properties/Resources.resx b/src/HotChocolate/Core/src/Types/Properties/Resources.resx index 047fa3518de..dae9ee12b18 100644 --- a/src/HotChocolate/Core/src/Types/Properties/Resources.resx +++ b/src/HotChocolate/Core/src/Types/Properties/Resources.resx @@ -303,4 +303,7 @@ <data name="SelectionSetOptimizerContext_AddSelection_ResponseNameNotTheSame" xml:space="preserve"> <value>The provided response name must be the same as on the selection.</value> </data> + <data name="VariableCoercionHelper_CoerceVariableValues_VariablesMustBeObject" xml:space="preserve"> + <value>variables must be a JSON Object</value> + </data> </root> diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs index 5eb2b3d0694..4e4792c0901 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Fusion.Language; using HotChocolate.Language; using HotChocolate.Text.Json; @@ -51,7 +52,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.String) { diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs index bd4b00fa7f3..5c39d60b845 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Text.Json; using static HotChocolate.Utilities.ThrowHelper; @@ -50,7 +51,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.String) { diff --git a/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs b/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs index 861c7114c22..b5e5dc7b962 100644 --- a/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Text.Json; @@ -72,13 +73,16 @@ public interface ILeafType : IInputTypeDefinition, IOutputTypeDefinition /// <param name="inputValue"> /// The deserialized JSON input value to coerce. /// </param> + /// <param name="context"> + /// Provides access to the coercion context. + /// </param> /// <returns> /// Returns the runtime value representation. /// </returns> /// <exception cref="LeafCoercionException"> /// Unable to coerce the given <paramref name="inputValue"/> into a runtime value. /// </exception> - object CoerceInputValue(JsonElement inputValue); + object CoerceInputValue(JsonElement inputValue, IFeatureProvider context); /// <summary> /// Coerces a runtime value into an external output representation diff --git a/src/HotChocolate/Core/src/Types/Types/EnumType.cs b/src/HotChocolate/Core/src/Types/Types/EnumType.cs index 262e3bf7cca..82d88f3e877 100644 --- a/src/HotChocolate/Core/src/Types/Types/EnumType.cs +++ b/src/HotChocolate/Core/src/Types/Types/EnumType.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Text.Json; using HotChocolate.Types.Descriptors.Configurations; @@ -67,7 +68,18 @@ public bool TryGetValue(string name, [NotNullWhen(true)] out EnumValue? value) return Values.TryGetValue(name, out value); } - /// <inheritdoc /> + /// <summary> + /// Tries to get the runtime value of an enum value by its name. + /// </summary> + /// <param name="name"> + /// The name of the enum value to retrieve. + /// </param> + /// <param name="runtimeValue"> + /// When this method returns, contains the runtime value if found; otherwise, <c>null</c>. + /// </param> + /// <returns> + /// <c>true</c> if the enum value was found; otherwise, <c>false</c>. + /// </returns> public bool TryGetRuntimeValue(string name, [NotNullWhen(true)] out object? runtimeValue) { ArgumentException.ThrowIfNullOrEmpty(name); @@ -121,7 +133,7 @@ public object CoerceInputLiteral(IValueNode valueLiteral) } /// <inheritdoc /> - public object CoerceInputValue(JsonElement inputValue) + public object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.String && Values.TryGetValue(inputValue.GetString()!, out var enumValue)) diff --git a/src/HotChocolate/Core/src/Types/Types/InputParser.cs b/src/HotChocolate/Core/src/Types/Types/InputParser.cs index c03559acdcf..d069aa1050d 100644 --- a/src/HotChocolate/Core/src/Types/Types/InputParser.cs +++ b/src/HotChocolate/Core/src/Types/Types/InputParser.cs @@ -1,6 +1,7 @@ using System.Buffers; using System.Collections; using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Utilities; using static HotChocolate.Utilities.ThrowHelper; @@ -30,7 +31,10 @@ public InputParser(ITypeConverter converter, InputParserOptions options) _ignoreAdditionalInputFields = options.IgnoreAdditionalInputFields; } - public object? ParseLiteral(IValueNode value, IInputValueInfo field, Type? targetType = null) + public object? ParseLiteral( + IValueNode value, + IInputValueInfo field, + Type? targetType = null) { ArgumentNullException.ThrowIfNull(value); ArgumentNullException.ThrowIfNull(field); @@ -286,7 +290,7 @@ private object ParseObject( throw ParseInputObject_InvalidSyntaxKind(type, resultValue.Kind, path); } - private static object? ParseLeaf( + private static object ParseLeaf( IValueNode resultValue, ILeafType type, Path path, @@ -417,14 +421,20 @@ private object ParseDirective( return type.CreateInstance(fieldValues); } - public object? ParseInputValue(JsonElement inputValue, IType type, Path? path = null) + public object? ParseInputValue(JsonElement inputValue, IType type, IFeatureProvider context, Path? path = null) { ArgumentNullException.ThrowIfNull(type); + ArgumentNullException.ThrowIfNull(context); - return Deserialize(inputValue, type, path ?? s_root, null); + return Deserialize(inputValue, type, path ?? s_root, null, context); } - private object? Deserialize(JsonElement inputValue, IType type, Path path, InputField? field) + private object? Deserialize( + JsonElement inputValue, + IType type, + Path path, + InputField? field, + IFeatureProvider context) { if (inputValue.ValueKind == JsonValueKind.Null) { @@ -444,21 +454,26 @@ private object ParseDirective( switch (type.Kind) { case TypeKind.List: - return DeserializeList(inputValue, (ListType)type, path, field); + return DeserializeList(inputValue, (ListType)type, path, field, context); case TypeKind.InputObject: - return DeserializeObject(inputValue, (InputObjectType)type, path); + return DeserializeObject(inputValue, (InputObjectType)type, path, context); case TypeKind.Enum: case TypeKind.Scalar: - return DeserializeLeaf(inputValue, (ILeafType)type, path, field); + return DeserializeLeaf(inputValue, (ILeafType)type, path, field, context); default: throw new NotSupportedException(); } } - private object DeserializeList(JsonElement inputValue, ListType type, Path path, InputField? field) + private object DeserializeList( + JsonElement inputValue, + ListType type, + Path path, + InputField? field, + IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.Array) { @@ -468,7 +483,7 @@ private object DeserializeList(JsonElement inputValue, ListType type, Path path, foreach (var element in inputValue.EnumerateArray()) { var newPath = path.Append(i++); - list.Add(Deserialize(element, type.ElementType, newPath, field)); + list.Add(Deserialize(element, type.ElementType, newPath, field, context)); } return list; @@ -477,7 +492,7 @@ private object DeserializeList(JsonElement inputValue, ListType type, Path path, throw ParseList_InvalidValueKind(type, path); } - private object DeserializeObject(JsonElement inputValue, InputObjectType type, Path path) + private object DeserializeObject(JsonElement inputValue, InputObjectType type, Path path, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.Object) { @@ -501,7 +516,6 @@ private object DeserializeObject(JsonElement inputValue, InputObjectType type, P var processedFields = StringSetPool.Shared.Rent(); List<string>? invalidFieldNames = null; var fieldValues = new object?[type.Fields.Count]; - var consumed = 0; try { @@ -525,11 +539,10 @@ private object DeserializeObject(JsonElement inputValue, InputObjectType type, P } } - var value = Deserialize(property.Value, field.Type, fieldPath, field); + var value = Deserialize(property.Value, field.Type, fieldPath, field, context); value = FormatAndConvertValue(field, path, null, value, field.IsOptional, true); fieldValues[field.Index] = value; - consumed++; } } else if (!_ignoreAdditionalInputFields) @@ -568,15 +581,16 @@ private object DeserializeObject(JsonElement inputValue, InputObjectType type, P throw ParseInputObject_InvalidValueKind(type, path); } - private static object? DeserializeLeaf( + private static object DeserializeLeaf( JsonElement inputValue, ILeafType type, Path path, - InputField? field) + InputField? field, + IFeatureProvider context) { try { - return type.CoerceInputValue(inputValue); + return type.CoerceInputValue(inputValue, context); } catch (LeafCoercionException ex) { @@ -618,7 +632,14 @@ private object DeserializeObject(JsonElement inputValue, InputObjectType type, P : value; } - return ParseAndFormatAndConvertLiteral(field.DefaultValue, path, stack, false, field, field.IsOptional, false); + return ParseAndFormatAndConvertLiteral( + field.DefaultValue, + path, + stack, + false, + field, + field.IsOptional, + false); } private object? CreateDefaultValue(DirectiveArgument field, Path path, int stack) @@ -644,7 +665,14 @@ private object DeserializeObject(JsonElement inputValue, InputObjectType type, P : value; } - return ParseAndFormatAndConvertLiteral(field.DefaultValue, path, stack, false, field, field.IsOptional, false); + return ParseAndFormatAndConvertLiteral( + field.DefaultValue, + path, + stack, + false, + field, + field.IsOptional, + false); } private object? ParseAndFormatAndConvertLiteral( diff --git a/src/HotChocolate/Core/src/Types/Types/Relay/Serialization/DefaultNodeIdSerializer.cs b/src/HotChocolate/Core/src/Types/Types/Relay/Serialization/DefaultNodeIdSerializer.cs index 1fdcbbea1de..9b707d6fb38 100644 --- a/src/HotChocolate/Core/src/Types/Types/Relay/Serialization/DefaultNodeIdSerializer.cs +++ b/src/HotChocolate/Core/src/Types/Types/Relay/Serialization/DefaultNodeIdSerializer.cs @@ -352,7 +352,7 @@ private NodeId ParseBase64(string formattedId, Func<string, Type?> getType) var firstPaddingIndex = span.IndexOf((byte)'='); var nonPaddedLength = firstPaddingIndex == -1 ? span.Length : firstPaddingIndex; var actualPadding = firstPaddingIndex == -1 ? 0 : span.Length - firstPaddingIndex; - var expectedPadding = (4 - nonPaddedLength % 4) % 4; + var expectedPadding = (4 - (nonPaddedLength % 4)) % 4; if (actualPadding != expectedPadding) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs index bcaac0a44bc..d57858920bd 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs @@ -1,6 +1,7 @@ using System.Globalization; using System.Runtime.InteropServices; using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Text.Json; using static HotChocolate.Utilities.ThrowHelper; @@ -90,7 +91,7 @@ public override object CoerceInputLiteral(IValueNode literal) } } - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { switch (inputValue.ValueKind) { @@ -127,7 +128,7 @@ public override object CoerceInputValue(JsonElement inputValue) var list = new List<object?>(); foreach (var item in inputValue.EnumerateArray()) { - list.Add(CoerceInputValue(item)); + list.Add(CoerceInputValue(item, context)); } return list; @@ -135,7 +136,7 @@ public override object CoerceInputValue(JsonElement inputValue) var obj = new Dictionary<string, object?>(); foreach (var property in inputValue.EnumerateObject()) { - obj[property.Name] = CoerceInputValue(property.Value); + obj[property.Name] = CoerceInputValue(property.Value, context); } return obj; diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs index 9209ab429d5..279ef7325a2 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; @@ -45,7 +46,7 @@ public override object CoerceInputLiteral(BooleanValueNode valueLiteral) => valueLiteral.Value; /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { switch (inputValue.ValueKind) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs index 66cca51174b..f8e31145c4e 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs @@ -3,6 +3,7 @@ using System.Runtime.InteropServices; using System.Text.Json; using HotChocolate.Buffers; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Text.Json; using static HotChocolate.Utilities.ThrowHelper; @@ -58,7 +59,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } } - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind == JsonValueKind.String) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs index 4ddbac55dc9..1fce011aa9a 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs @@ -1,6 +1,7 @@ using System.Globalization; using System.Text.Json; using System.Text.RegularExpressions; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; @@ -83,7 +84,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, out var value)) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs index 01b649a58f5..72c9b34ae6e 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs @@ -1,6 +1,7 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; @@ -58,7 +59,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, out var value)) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs index 01c50b9c642..cc7405e94ea 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using static HotChocolate.Utilities.ThrowHelper; @@ -106,7 +107,7 @@ public sealed override object CoerceInputLiteral(IValueNode valueSyntax) protected abstract TRuntimeType OnCoerceInputLiteral(IFloatValueLiteral valueSyntax); /// <inheritdoc /> - public sealed override object CoerceInputValue(JsonElement inputValue) + public sealed override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.Number) { @@ -133,7 +134,7 @@ public sealed override object CoerceInputValue(JsonElement inputValue) protected abstract TRuntimeType OnCoerceInputValue(JsonElement inputValue); /// <summary> - /// Creates the exception to throw when <see cref="CoerceInputValue(JsonElement)"/> + /// Creates the exception to throw when <see cref="CoerceInputValue(JsonElement, IFeatureProvider)"/> /// encounters an incompatible input value. /// </summary> /// <param name="inputValue"> diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs index 8b9adbd9ca8..e87af981056 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs @@ -1,6 +1,7 @@ using System.Runtime.InteropServices; using System.Text; using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; @@ -81,7 +82,7 @@ public override object CoerceInputLiteral(IValueNode literal) /// Accepts JSON strings and integer numbers. Floating-point numbers /// (containing '.', 'e', or 'E') are rejected. /// </remarks> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.String) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs index f47520fcbf7..ea1677aedb6 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using static HotChocolate.Utilities.ThrowHelper; @@ -96,7 +97,7 @@ public sealed override object CoerceInputLiteral(IValueNode valueLiteral) protected abstract TRuntimeType OnCoerceInputLiteral(IntValueNode valueLiteral); /// <inheritdoc /> - public sealed override object CoerceInputValue(JsonElement inputValue) + public sealed override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.Number) { @@ -123,7 +124,7 @@ public sealed override object CoerceInputValue(JsonElement inputValue) protected abstract TRuntimeType OnCoerceInputValue(JsonElement inputValue); /// <summary> - /// Creates the exception to throw when <see cref="CoerceInputValue(JsonElement)"/> + /// Creates the exception to throw when <see cref="CoerceInputValue(JsonElement, IFeatureProvider)"/> /// encounters an incompatible input value. /// </summary> /// <param name="inputValue"> diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs index 3de06abd016..fbd473424f6 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs @@ -1,6 +1,7 @@ using System.Runtime.InteropServices; using System.Text.Json; using HotChocolate.Buffers; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Language.Visitors; using HotChocolate.Text.Json; @@ -63,7 +64,7 @@ public override object CoerceInputLiteral(IValueNode valueLiteral) => JsonFormatter.Format(valueLiteral); /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) => inputValue.Clone(); /// <inheritdoc /> diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs index 1834ca0b045..1340a7f94f3 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs @@ -1,5 +1,6 @@ using System.Globalization; using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; @@ -51,7 +52,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, out var value)) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs index 8254833f142..606a370304d 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs @@ -1,5 +1,6 @@ using System.Globalization; using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; @@ -74,7 +75,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, out var value)) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs index 40f68d85c88..c2d54eab1b1 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs @@ -1,5 +1,6 @@ using System.Globalization; using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; @@ -66,7 +67,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, out var value)) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs index 01d06623556..b92c692f6af 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; @@ -112,7 +113,7 @@ public bool IsAssignableFrom(ITypeDefinition type) /// </returns> public bool Equals(IType? other) => ReferenceEquals(other, this); - /// <inheritdoc /> + /// <inheritdoc cref="IScalarTypeDefinition.IsValueCompatible" /> public virtual bool IsValueCompatible(IValueNode valueLiteral) { ArgumentNullException.ThrowIfNull(valueLiteral); @@ -206,7 +207,7 @@ public virtual bool IsInstanceOfType(object runtimeValue) public abstract object CoerceInputLiteral(IValueNode valueLiteral); /// <inheritdoc /> - public abstract object CoerceInputValue(JsonElement inputValue); + public abstract object CoerceInputValue(JsonElement inputValue, IFeatureProvider context); /// <inheritdoc /> public abstract void CoerceOutputValue(object runtimeValue, ResultElement resultValue); diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs index 87b19c79e13..f972e55cfce 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; @@ -44,7 +45,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) => valueLiteral.Value; /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.String) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs index 4059bee94d2..bbf0001ded3 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs @@ -1,5 +1,6 @@ using System.Text.Json; using System.Xml; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; @@ -59,7 +60,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, Format, out var value)) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs index 3d641939a22..57bb252702b 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Text.Json; using static HotChocolate.Utilities.ThrowHelper; @@ -48,7 +49,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.String && TryParseUri(inputValue.GetString()!, out var value)) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs index c158d3e1b81..8aed956a2c3 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Text; using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; @@ -113,7 +114,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.String) { diff --git a/src/HotChocolate/Primitives/src/Primitives/Types/FileValueNode.cs b/src/HotChocolate/Primitives/src/Primitives/Types/FileValueNode.cs deleted file mode 100644 index 843d6da42a3..00000000000 --- a/src/HotChocolate/Primitives/src/Primitives/Types/FileValueNode.cs +++ /dev/null @@ -1,168 +0,0 @@ -using HotChocolate.Language; -using HotChocolate.Language.Utilities; - -namespace HotChocolate.Types; - -/// <summary> -/// This file literal is used in order to allow for -/// an optimized path through the execution engine. -/// </summary> -public class FileValueNode - : IValueNode<IFile> - , IValueNode<string> - , IEquatable<FileValueNode> -{ - /// <summary> - /// Creates a new instance of <see cref="FileValueNode" /> - /// </summary> - /// <param name="file"> - /// The file. - /// </param> - public FileValueNode(IFile file) - { - Value = file ?? throw new ArgumentNullException(nameof(file)); - } - - /// <inheritdoc /> - public SyntaxKind Kind => SyntaxKind.StringValue; - - /// <inheritdoc /> - public Location? Location => null; - - /// <inheritdoc /> - public IFile Value { get; } - - /// <inheritdoc /> - object IValueNode.Value => Value; - - string IValueNode<string>.Value => Value.Name; - - /// <summary> - /// Determines whether the specified <see cref="FileValueNode"/> - /// is equal to the current <see cref="FileValueNode"/>. - /// </summary> - /// <param name="other"> - /// The <see cref="FileValueNode"/> to compare with the current - /// <see cref="FileValueNode"/>. - /// </param> - /// <returns> - /// <c>true</c> if the specified <see cref="FileValueNode"/> is equal - /// to the current <see cref="FileValueNode"/>; - /// otherwise, <c>false</c>. - /// </returns> - public bool Equals(FileValueNode? other) - { - if (ReferenceEquals(null, other)) - { - return false; - } - - if (ReferenceEquals(this, other) - || ReferenceEquals(Value, other.Value)) - { - return true; - } - - return false; - } - - /// <summary> - /// Determines whether the specified <see cref="IValueNode"/> is equal - /// to the current <see cref="FileValueNode"/>. - /// </summary> - /// <param name="other"> - /// The <see cref="IValueNode"/> to compare with the current - /// <see cref="FileValueNode"/>. - /// </param> - /// <returns> - /// <c>true</c> if the specified <see cref="IValueNode"/> is equal - /// to the current <see cref="FileValueNode"/>; - /// otherwise, <c>false</c>. - /// </returns> - public bool Equals(IValueNode? other) - { - if (ReferenceEquals(null, other)) - { - return false; - } - - if (ReferenceEquals(this, other)) - { - return true; - } - - if (other is FileValueNode file) - { - return Equals(file); - } - - return false; - } - - /// <summary> - /// Determines whether the specified <see cref="object"/> is equal to - /// the current <see cref="FileValueNode"/>. - /// </summary> - /// <param name="obj"> - /// The <see cref="object"/> to compare with the current - /// <see cref="FileValueNode"/>. - /// </param> - /// <returns> - /// <c>true</c> if the specified <see cref="object"/> is equal to the - /// current <see cref="FileValueNode"/>; otherwise, <c>false</c>. - /// </returns> - public override bool Equals(object? obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(obj, this)) - { - return true; - } - - return Equals(obj as FileValueNode); - } - - public IEnumerable<ISyntaxNode> GetNodes() => []; - - /// <summary> - /// Serves as a hash function for a <see cref="FileValueNode"/> - /// object. - /// </summary> - /// <returns> - /// A hash code for this instance that is suitable for use in - /// hashing algorithms and data structures such as a hash table. - /// </returns> - public override int GetHashCode() - { - unchecked - { - return (Kind.GetHashCode() * 397) - ^ (Value.GetHashCode() * 97); - } - } - - /// <summary> - /// Returns the GraphQL syntax representation of this <see cref="ISyntaxNode"/>. - /// </summary> - /// <returns> - /// Returns the GraphQL syntax representation of this <see cref="ISyntaxNode"/>. - /// </returns> - public override string ToString() => ToString(true); - - /// <summary> - /// Returns the GraphQL syntax representation of this <see cref="ISyntaxNode"/>. - /// </summary> - /// <param name="indented"> - /// A value that indicates whether the GraphQL output should be formatted, - /// which includes indenting nested GraphQL tokens, adding - /// new lines, and adding white space between property names and values. - /// </param> - /// <returns> - /// Returns the GraphQL syntax representation of this <see cref="ISyntaxNode"/>. - /// </returns> - public string ToString(bool indented) => SyntaxPrinter.Print(this, indented); -} diff --git a/src/HotChocolate/Primitives/src/Primitives/Types/IFileLookup.cs b/src/HotChocolate/Primitives/src/Primitives/Types/IFileLookup.cs new file mode 100644 index 00000000000..5c89bf5eed8 --- /dev/null +++ b/src/HotChocolate/Primitives/src/Primitives/Types/IFileLookup.cs @@ -0,0 +1,26 @@ +using System.Diagnostics.CodeAnalysis; + +namespace HotChocolate.Types; + +/// <summary> +/// Provides a lookup mechanism for uploaded files in a GraphQL multipart request. +/// This interface is used to retrieve files that were uploaded using the +/// GraphQL multipart request specification. +/// </summary> +public interface IFileLookup +{ + /// <summary> + /// Attempts to retrieve an uploaded file by its multipart request map key. + /// </summary> + /// <param name="name"> + /// The map key of the file from the multipart request. + /// </param> + /// <param name="file"> + /// When this method returns <c>true</c>, contains the uploaded file; + /// otherwise, <c>null</c>. + /// </param> + /// <returns> + /// <c>true</c> if the file was found; otherwise, <c>false</c>. + /// </returns> + bool TryGetFile(string name, [NotNullWhen(true)] out IFile? file); +} From 7b99906b6f071a72061a42ed1c63b7d4b3529b64 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 6 Jan 2026 09:20:34 +0100 Subject: [PATCH 058/144] wip --- .../AspNetCore.Pipeline/ExecutorSession.cs | 21 +- .../EndpointRouteBuilderExtensions.cs | 4 + .../src/AspNetCore.Pipeline/FileMapTrie.cs | 46 +++ .../AspNetCore.Pipeline/FileMapTrieNode.cs | 83 +++++ .../src/AspNetCore.Pipeline/FormFileLookup.cs | 40 +++ .../AspNetCore.Pipeline/HttpGetMiddleware.cs | 7 + .../HttpMultipartMiddleware.cs | 293 +++++++++++------- .../AspNetCore.Pipeline/HttpPostMiddleware.cs | 7 + .../HttpPostMiddlewareBase.cs | 32 +- .../AspNetCore.Pipeline/MiddlewareFactory.cs | 7 + .../Parsers/DefaultHttpRequestParser.cs | 179 +++++------ .../Parsers/HttpMultipartRequest.cs | 10 +- .../Parsers/IHttpRequestParser.cs | 9 +- .../Parsers/IVariablePathSegment.cs | 2 + .../Parsers/IndexPathSegment.cs | 2 + .../Parsers/KeyPathSegment.cs | 2 + .../Parsers/VariablePath.cs | 17 +- .../PersistedOperationMiddleware.cs | 7 + .../AspNetCorePipelineResources.Designer.cs | 6 - .../AspNetCorePipelineResources.resx | 3 - .../Subscriptions/OperationManager.cs | 7 + .../Subscriptions/OperationSession.cs | 7 + .../ApolloSubscriptionProtocolHandler.cs | 2 +- .../GraphQLOverWebSocketProtocolHandler.cs | 2 +- .../Utilities/MiddlewareHelper.cs | 19 +- .../Utilities/ThrowHelper.cs | 7 - .../DefaultHttpRequestParserTests.cs | 5 +- .../src/Language.Web/GraphQLRequest.cs | 46 ++- .../Language.Web/Polyfills/IsExternalInit.cs | 3 + .../Language.Web/Utf8GraphQLRequestParser.cs | 57 +++- .../Utf8GraphQLSocketMessageParser.cs | 2 +- .../Utf8GraphQLRequestParserTests.cs | 10 +- 32 files changed, 670 insertions(+), 274 deletions(-) create mode 100644 src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FileMapTrie.cs create mode 100644 src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FileMapTrieNode.cs create mode 100644 src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FormFileLookup.cs create mode 100644 src/HotChocolate/Language/src/Language.Web/Polyfills/IsExternalInit.cs diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/ExecutorSession.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/ExecutorSession.cs index 47298358679..82ac4b037df 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/ExecutorSession.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/ExecutorSession.cs @@ -1,3 +1,6 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using System.Net; using HotChocolate.AspNetCore.Formatters; using HotChocolate.AspNetCore.Instrumentation; @@ -75,6 +78,10 @@ public ValueTask OnCreateAsync( CancellationToken cancellationToken) => _requestInterceptor.OnCreateAsync(context, requestExecutor, requestBuilder, cancellationToken); +#if !NET9_0_OR_GREATER + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public async Task<IExecutionResult> ExecuteSingleAsync( HttpContext context, GraphQLRequest request, @@ -90,6 +97,10 @@ public async Task<IExecutionResult> ExecuteSingleAsync( return await _executor.ExecuteAsync(requestBuilder.Build(), context.RequestAborted); } +#if !NET9_0_OR_GREATER + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public async Task<IResponseStream> ExecuteOperationBatchAsync( HttpContext context, GraphQLRequest request, @@ -116,16 +127,20 @@ public async Task<IResponseStream> ExecuteOperationBatchAsync( cancellationToken: context.RequestAborted); } +#if !NET9_0_OR_GREATER + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public async Task<IResponseStream> ExecuteBatchAsync( HttpContext context, - IReadOnlyList<GraphQLRequest> requests, + GraphQLRequest[] requests, RequestFlags flags) { _diagnosticEvents.StartBatchRequest(context, requests); - var requestBatch = new IOperationRequest[requests.Count]; + var requestBatch = new IOperationRequest[requests.Length]; - for (var i = 0; i < requests.Count; i++) + for (var i = 0; i < requests.Length; i++) { var requestBuilder = OperationRequestBuilder.From(requests[i]); requestBuilder.SetFlags(flags); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Extensions/EndpointRouteBuilderExtensions.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Extensions/EndpointRouteBuilderExtensions.cs index 0172b7feec4..5a8421e3198 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Extensions/EndpointRouteBuilderExtensions.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Extensions/EndpointRouteBuilderExtensions.cs @@ -17,6 +17,10 @@ namespace Microsoft.AspNetCore.Builder; /// <summary> /// Provides GraphQL extensions to the <see cref="IEndpointConventionBuilder"/>. /// </summary> +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public static class EndpointRouteBuilderExtensions { private const string GraphQLHttpPath = "/graphql"; diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FileMapTrie.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FileMapTrie.cs new file mode 100644 index 00000000000..976e40928c3 --- /dev/null +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FileMapTrie.cs @@ -0,0 +1,46 @@ +using HotChocolate.AspNetCore.Parsers; +using ThrowHelper = HotChocolate.AspNetCore.Utilities.ThrowHelper; + +namespace HotChocolate.AspNetCore; + +/// <summary> +/// A trie structure for mapping JSON paths to file keys. +/// </summary> +internal sealed class FileMapTrie +{ + private readonly FileMapTrieNode _root = new(); + + public FileMapTrieNode Root => _root; + + public void AddPath(VariablePath path, string fileKey) + { + var current = _root; + + foreach (var segment in path) + { + current = current.GetOrAddNode(segment.ToString()); + } + + current.SetFileKey(fileKey); + } + + public static FileMapTrie Parse(IDictionary<string, string[]> fileMap) + { + var trie = new FileMapTrie(); + + foreach (var (fileKey, variablePaths) in fileMap) + { + if (variablePaths is null || variablePaths.Length < 1) + { + throw ThrowHelper.HttpMultipartMiddleware_NoObjectPath(fileKey); + } + + foreach (var variablePath in variablePaths) + { + trie.AddPath(VariablePath.Parse(variablePath), fileKey); + } + } + + return trie; + } +} diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FileMapTrieNode.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FileMapTrieNode.cs new file mode 100644 index 00000000000..044c53f0725 --- /dev/null +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FileMapTrieNode.cs @@ -0,0 +1,83 @@ +using System.Diagnostics.CodeAnalysis; + +namespace HotChocolate.AspNetCore; + +internal sealed class FileMapTrieNode +{ + private List<Entry>? _nodes; + + public string? FileKey { get; private set; } + + public FileMapTrieNode GetOrAddNode(string key) + { + if (TryGetNode(key, out var node)) + { + return node; + } + + var entry = new Entry(key); + _nodes ??= []; + _nodes.Add(entry); + return entry.Node; + } + + public bool TryGetNode(string key, [NotNullWhen(true)] out FileMapTrieNode? node) + { + ArgumentException.ThrowIfNullOrEmpty(key); + + if (_nodes is null) + { + node = null; + return false; + } + + if (_nodes.Count == 1) + { + var current = _nodes[0]; + + if (string.Equals(current.Key, key, StringComparison.Ordinal)) + { + node = current.Node; + return true; + } + + node = null; + return false; + } + + foreach (var current in _nodes) + { + if (string.Equals(current.Key, key, StringComparison.Ordinal)) + { + node = current.Node; + return true; + } + } + + node = null; + return false; + } + + public void SetFileKey(string fileKey) + { + ArgumentException.ThrowIfNullOrEmpty(fileKey); + + if (_nodes is not null) + { + throw new InvalidOperationException("A filename can only be set on a leaf node."); + } + + if (!string.IsNullOrEmpty(FileKey)) + { + throw new InvalidOperationException("A filename can only be set once."); + } + + FileKey = fileKey; + } + + private readonly struct Entry(string key) + { + public readonly string Key = key; + public readonly FileMapTrieNode Node = new(); + } +} diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FormFileLookup.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FormFileLookup.cs new file mode 100644 index 00000000000..2d6cb78abe6 --- /dev/null +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/FormFileLookup.cs @@ -0,0 +1,40 @@ +using System.Diagnostics.CodeAnalysis; +using HotChocolate.AspNetCore.Parsers; +using Microsoft.AspNetCore.Http; +using ThrowHelper = HotChocolate.AspNetCore.Utilities.ThrowHelper; + +namespace HotChocolate.AspNetCore; + +internal sealed class FormFileLookup : IFileLookup +{ + private readonly Dictionary<string, IFile> _fileMap; + + private FormFileLookup(Dictionary<string, IFile> fileMap) + { + _fileMap = fileMap; + } + + public bool TryGetFile(string name, [NotNullWhen(true)] out IFile? file) + => _fileMap.TryGetValue(name, out file); + + public static FormFileLookup Create( + IDictionary<string, string[]> map, + IFormFileCollection files) + { + var fileMap = new Dictionary<string, IFile>(); + + foreach (var fileKey in map.Keys) + { + var file = string.IsNullOrEmpty(fileKey) ? null : files.GetFile(fileKey); + + if (file is null) + { + throw ThrowHelper.HttpMultipartMiddleware_FileMissing(fileKey); + } + + fileMap.TryAdd(fileKey, new UploadedFile(file)); + } + + return new FormFileLookup(fileMap); + } +} diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpGetMiddleware.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpGetMiddleware.cs index 50a783a004c..fa6c83785f9 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpGetMiddleware.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpGetMiddleware.cs @@ -1,3 +1,6 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using System.Net; using Microsoft.AspNetCore.Http; using HotChocolate.AspNetCore.Instrumentation; @@ -7,6 +10,10 @@ namespace HotChocolate.AspNetCore; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public sealed class HttpGetMiddleware : MiddlewareBase { public HttpGetMiddleware( diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs index 6451f698f26..10fd4b64ea7 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpMultipartMiddleware.cs @@ -1,25 +1,44 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif +using System.Runtime.InteropServices; +using System.Text.Encodings.Web; using System.Text.Json; -using System.Text.Json.Nodes; using System.Text.Json.Serialization; using HotChocolate.AspNetCore.Instrumentation; using HotChocolate.AspNetCore.Parsers; using HotChocolate.AspNetCore.Utilities; +using HotChocolate.Buffers; using HotChocolate.Language; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.Options; using static System.Net.HttpStatusCode; using static HotChocolate.AspNetCore.Utilities.ErrorHelper; -using static HotChocolate.AspNetCore.Properties.AspNetCorePipelineResources; using HttpRequestDelegate = Microsoft.AspNetCore.Http.RequestDelegate; using ThrowHelper = HotChocolate.AspNetCore.Utilities.ThrowHelper; namespace HotChocolate.AspNetCore; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public sealed class HttpMultipartMiddleware : HttpPostMiddlewareBase { private const string Operations = "operations"; private const string Map = "map"; + private static readonly JsonReaderOptions s_variablesReaderOptions = + new() + { + CommentHandling = JsonCommentHandling.Skip + }; + private static readonly JsonWriterOptions s_variableWriterOptions = + new() + { + Indented = false, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; private readonly FormOptions _formOptions; private readonly OperationResult _multipartRequestError = MultiPartRequestPreflightRequired(); @@ -62,7 +81,7 @@ public override async Task InvokeAsync(HttpContext context) } } - protected override async ValueTask<IReadOnlyList<GraphQLRequest>> ParseRequestsFromBodyAsync( + protected override async ValueTask<GraphQLRequest[]> ParseRequestsFromBodyAsync( HttpContext context, ExecutorSession session) { @@ -83,9 +102,54 @@ protected override async ValueTask<IReadOnlyList<GraphQLRequest>> ParseRequestsF var multipartRequest = ParseMultipartRequest(form); var requests = session.RequestParser.ParseRequest(multipartRequest.Operations); - foreach (var graphQLRequest in requests) + for (var i = 0; i < requests.Length; i++) { - InsertFilesIntoRequest(graphQLRequest, multipartRequest.FileMap); + var current = requests[i]; + + context.Response.RegisterForDispose(current); + + if (!multipartRequest.FileMap.Root.TryGetNode(i.ToString(), out var operationRoot)) + { + continue; + } + + if (current.Variables is null) + { + // the request is invalid as we have files for this request but no variables. + throw new InvalidOperationException(); + } + + var json = JsonMarshal.GetRawUtf8Value(current.Variables.RootElement); + var expectedBufferSize = json.Length + (json.Length / 5); + var bufferWriter = new PooledArrayWriter(expectedBufferSize); + var variablesReader = new Utf8JsonReader(json, s_variablesReaderOptions); + await using var variablesWriter = new Utf8JsonWriter(bufferWriter, s_variableWriterOptions); + + try + { + RewriteVariables(ref variablesReader, variablesWriter, operationRoot); + await variablesWriter.FlushAsync(); + + current = current with + { + Variables = JsonDocument.Parse(bufferWriter.Memory), + VariablesMemoryOwner = bufferWriter + }; + context.Response.RegisterForDispose(current); + + requests[i] = current; + } + catch + { + bufferWriter.Dispose(); + + foreach (var request in requests) + { + request.Dispose(); + } + + throw; + } } return requests; @@ -136,125 +200,146 @@ private static HttpMultipartRequest ParseMultipartRequest(IFormCollection form) } // Validate file mappings and bring them in an easy-to-use format - var pathToFileMap = MapFilesToObjectPaths(map, form.Files); + var files = FormFileLookup.Create(map, form.Files); + var fileMap = FileMapTrie.Parse(map); - return new HttpMultipartRequest(operations, pathToFileMap); + return new HttpMultipartRequest(operations, files, fileMap); } - private static Dictionary<string, IFile> MapFilesToObjectPaths( - IDictionary<string, string[]> map, - IFormFileCollection files) - { - var pathToFileMap = new Dictionary<string, IFile>(); - - foreach (var (filename, objectPaths) in map) - { - if (objectPaths is null || objectPaths.Length < 1) - { - throw ThrowHelper.HttpMultipartMiddleware_NoObjectPath(filename); - } - - var file = filename.Length > 0 ? files.GetFile(filename) : null; - - if (file is null) - { - throw ThrowHelper.HttpMultipartMiddleware_FileMissing(filename); - } - - foreach (var objectPath in objectPaths) - { - pathToFileMap.Add(objectPath, new UploadedFile(file)); - } - } - - return pathToFileMap; - } + private void RewriteVariables( + ref Utf8JsonReader originalVariables, + Utf8JsonWriter variables, + FileMapTrieNode fileMapRoot) + => RewriteJsonValue(ref originalVariables, variables, fileMapRoot); - private static void InsertFilesIntoRequest( - GraphQLRequest request, - IDictionary<string, IFile> fileMap) + private static void RewriteJsonValue( + ref Utf8JsonReader reader, + Utf8JsonWriter writer, + FileMapTrieNode currentNode) { - if (request.Variables is null - || request.Variables.RootElement.ValueKind is not JsonValueKind.Object) - { - throw new InvalidOperationException( - HttpMultipartMiddleware_InsertFilesIntoRequest_VariablesImmutable); - } - - var mutableVariables = JsonNode.Parse(request.Variables.RootElement.GetRawText())!; - - foreach (var (objectPath, file) in fileMap) + switch (reader.TokenType) { - var path = VariablePath.Parse(objectPath); - - if (!mutableVariables.AsObject().TryGetPropertyValue(path.Key.Value, out var value)) - { - throw ThrowHelper.HttpMultipartMiddleware_VariableNotFound(objectPath); - } - - if (path.Key.Next is null) - { - mutableVariables[path.Key.Value] = new FileValueNode(file); - continue; - } + case JsonTokenType.StartObject: + writer.WriteStartObject(); + while (reader.Read() && reader.TokenType is not JsonTokenType.EndObject) + { + // Read property name, we allocate here the string as we have a string as key in our trie. + var propertyName = reader.GetString()!; + writer.WritePropertyName(propertyName); + + // Try to navigate to the child node in the trie + var hasChildNode = currentNode.TryGetNode(propertyName, out var childNode); + + // Read the property value + reader.Read(); + + // If this is a null, and we have a file key, replace it + if (reader.TokenType is JsonTokenType.Null + && hasChildNode + && childNode!.FileKey is not null) + { + writer.WriteStringValue(childNode.FileKey); + } + else if (hasChildNode) + { + // Recurse with the child node + RewriteJsonValue(ref reader, writer, childNode!); + } + else + { + // No mapping for this path, copy value as-is + CopyCurrentValue(ref reader, writer); + } + } + writer.WriteEndObject(); + break; - if (value is null) - { - throw ThrowHelper.HttpMultipartMiddleware_VariableStructureInvalid(); - } + case JsonTokenType.StartArray: + writer.WriteStartArray(); + var index = 0; + while (reader.Read() && reader.TokenType is not JsonTokenType.EndArray) + { + // Try to navigate to the child node by array index + var indexKey = index.ToString(); + var hasChildNode = currentNode.TryGetNode(indexKey, out var childNode); + + // If this is a null, and we have a file key, replace it + if (reader.TokenType is JsonTokenType.Null + && hasChildNode + && childNode!.FileKey is not null) + { + writer.WriteStringValue(childNode.FileKey); + } + else if (hasChildNode) + { + // Recurse with the child node + RewriteJsonValue(ref reader, writer, childNode!); + } + else + { + // No mapping for this path, copy value as-is + CopyCurrentValue(ref reader, writer); + } + + index++; + } + writer.WriteEndArray(); + break; - mutableVariables[path.Key.Value] = RewriteVariable( - objectPath, - path.Key.Next, - value, - new FileValueNode(file)); + default: + // For all other token types (strings, numbers, booleans, null), copy as-is + CopyCurrentValue(ref reader, writer); + break; } } - private static IValueNode RewriteVariable( - string objectPath, - IVariablePathSegment segment, - object value, - FileValueNode file) + private static void CopyCurrentValue(ref Utf8JsonReader reader, Utf8JsonWriter writer) { - if (segment is KeyPathSegment key && value is ObjectValueNode ov) + switch (reader.TokenType) { - var pos = -1; + case JsonTokenType.StartObject: + writer.WriteStartObject(); + while (reader.Read() && reader.TokenType != JsonTokenType.EndObject) + { + if (reader.TokenType == JsonTokenType.PropertyName) + { + writer.WritePropertyName(reader.GetString()!); + reader.Read(); + CopyCurrentValue(ref reader, writer); + } + } + writer.WriteEndObject(); + break; - for (var i = 0; i < ov.Fields.Count; i++) - { - if (ov.Fields[i].Name.Value.Equals(key.Value, StringComparison.Ordinal)) + case JsonTokenType.StartArray: + writer.WriteStartArray(); + while (reader.Read() && reader.TokenType != JsonTokenType.EndArray) { - pos = i; - break; + CopyCurrentValue(ref reader, writer); } - } + writer.WriteEndArray(); + break; - if (pos == -1) - { - throw ThrowHelper.HttpMultipartMiddleware_VariableNotFound(objectPath); - } + case JsonTokenType.String: + writer.WriteStringValue(reader.ValueSpan); + break; - var fields = ov.Fields.ToArray(); - var field = fields[pos]; - fields[pos] = field.WithValue( - key.Next is not null - ? RewriteVariable(objectPath, key.Next, field.Value, file) - : file); - return ov.WithFields(fields); - } + case JsonTokenType.Number: + writer.WriteRawValue(reader.ValueSpan); + break; - if (segment is IndexPathSegment index && value is ListValueNode lv) - { - var items = lv.Items.ToArray(); - var item = items[index.Value]; - items[index.Value] = index.Next is not null - ? RewriteVariable(objectPath, index.Next, item, file) - : file; - return lv.WithItems(items); - } + case JsonTokenType.True: + writer.WriteBooleanValue(true); + break; - throw ThrowHelper.HttpMultipartMiddleware_VariableNotFound(objectPath); + case JsonTokenType.False: + writer.WriteBooleanValue(false); + break; + + case JsonTokenType.Null: + writer.WriteNullValue(); + break; + } } } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddleware.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddleware.cs index 75aeb867b4c..c7aefeb00f9 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddleware.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddleware.cs @@ -1,6 +1,13 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using HttpRequestDelegate = Microsoft.AspNetCore.Http.RequestDelegate; namespace HotChocolate.AspNetCore; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public sealed class HttpPostMiddleware(HttpRequestDelegate next, HttpRequestExecutorProxy executor) : HttpPostMiddlewareBase(next, executor); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs index 0942bba30a4..f343278d2d9 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/HttpPostMiddlewareBase.cs @@ -11,6 +11,10 @@ namespace HotChocolate.AspNetCore; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public abstract class HttpPostMiddlewareBase : MiddlewareBase { private const string BatchOperations = "batchOperations"; @@ -61,7 +65,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses acceptMediaTypes = HeaderUtilities.GraphQLResponseContentTypes; statusCode = HttpStatusCode.BadRequest; - var errors = headerResult.ErrorResult.Errors!; + var errors = headerResult.ErrorResult.Errors; result = headerResult.ErrorResult; session.DiagnosticEvents.HttpRequestError(context, errors[0]); goto HANDLE_RESULT; @@ -85,7 +89,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses } // next we parse the GraphQL request. - IReadOnlyList<GraphQLRequest> requests; + GraphQLRequest[] requests; using (session.DiagnosticEvents.ParseHttpRequest(context)) { @@ -117,10 +121,10 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses // after successfully parsing the request we now will attempt to execute the request. try { - switch (requests.Count) + switch (requests.Length) { // if the HTTP request body contains no GraphQL request structure the - // whole request is invalid and we will create a GraphQL error response. + // whole request is invalid, and we will create a GraphQL error response. case 0: { statusCode = HttpStatusCode.BadRequest; @@ -130,7 +134,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses break; } - // if the HTTP request body contains a single GraphQL request and we do have + // if the HTTP request body contains a single GraphQL request, and we do have // the batch operations query parameter specified we need to execute an // operation batch. // @@ -233,7 +237,7 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses // we must dispose the diagnostic scope first. formatScope?.Dispose(); - // query results use pooled memory an need to be disposed after we have + // query results use pooled memory and need to be disposed after we have // used them. if (result is not null) { @@ -242,10 +246,22 @@ protected async Task HandleRequestAsync(HttpContext context, ExecutorSession ses } } - protected virtual async ValueTask<IReadOnlyList<GraphQLRequest>> ParseRequestsFromBodyAsync( + protected virtual async ValueTask<GraphQLRequest[]> ParseRequestsFromBodyAsync( HttpContext context, ExecutorSession session) - => await session.RequestParser.ParseRequestAsync(context.Request.Body, context.RequestAborted); + { + var requests = + await session.RequestParser.ParseRequestAsync( + context.Request.BodyReader, + context.RequestAborted); + + foreach (var request in requests) + { + context.Response.RegisterForDispose(request); + } + + return requests; + } private static bool TryParseOperations( string operationNameString, diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/MiddlewareFactory.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/MiddlewareFactory.cs index b188fe36cb1..32d91c69db9 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/MiddlewareFactory.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/MiddlewareFactory.cs @@ -1,3 +1,6 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.Options; @@ -5,6 +8,10 @@ namespace HotChocolate.AspNetCore; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal static class MiddlewareFactory { internal static Func<RequestDelegate, RequestDelegate> CreateCancellationMiddleware() diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/DefaultHttpRequestParser.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/DefaultHttpRequestParser.cs index e173f879925..76cf382aff4 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/DefaultHttpRequestParser.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/DefaultHttpRequestParser.cs @@ -1,10 +1,10 @@ // ReSharper disable RedundantSuppressNullableWarningExpression using System.Buffers; +using System.IO.Pipelines; using System.Text; using System.Text.Json; using HotChocolate.AspNetCore.Utilities; -using HotChocolate.Buffers; using HotChocolate.Language; using Microsoft.AspNetCore.Http; using static HotChocolate.AspNetCore.Utilities.ThrowHelper; @@ -44,43 +44,107 @@ public DefaultHttpRequestParser( _parserOptions = parserOptions; } - public ValueTask<IReadOnlyList<GraphQLRequest>> ParseRequestAsync( - Stream requestBody, + public async ValueTask<GraphQLRequest[]> ParseRequestAsync( + PipeReader requestBody, CancellationToken cancellationToken) - => ReadAsync(requestBody, cancellationToken); + { + try + { + ReadResult result; + + do + { + result = await requestBody.ReadAsync(cancellationToken); + + if (result.Buffer.Length > _maxRequestSize) + { + requestBody.AdvanceTo(result.Buffer.End); + throw new GraphQLRequestException("Request size exceeds maximum allowed size."); + } + + // We tell the pipe that we've examined everything but consumed nothing yet. + requestBody.AdvanceTo(result.Buffer.Start, result.Buffer.End); + } + while (result is { IsCompleted: false, IsCanceled: false }); + + if (result.IsCanceled) + { + throw new OperationCanceledException(); + } + + var requestParser = new Utf8GraphQLRequestParser( + _parserOptions, + _documentCache, + _documentHashProvider); + + var requests = requestParser.Parse(result.Buffer); + + // Mark all data as consumed + requestBody.AdvanceTo(result.Buffer.End); + + return requests; + } + catch (GraphQLRequestException) + { + throw; + } + catch (SyntaxException ex) + { + throw DefaultHttpRequestParser_SyntaxError(ex); + } + catch (Exception ex) + { + throw DefaultHttpRequestParser_UnexpectedError(ex); + } + } public async ValueTask<GraphQLRequest> ParsePersistedOperationRequestAsync( string documentId, string? operationName, - Stream requestBody, + PipeReader requestBody, CancellationToken cancellationToken) { - EnsureValidDocumentId(documentId); + if (!OperationDocumentId.TryParse(documentId, out var parsedDocumentId)) + { + throw new InvalidGraphQLRequestException( + "The GraphQL document ID contains invalid characters."); + } try { - const int chunkSize = 256; - using var writer = new PooledArrayWriter(); - var read = 0; + ReadResult result; do { - var memory = writer.GetMemory(chunkSize); - read = await requestBody.ReadAsync(memory, cancellationToken).ConfigureAwait(false); - writer.Advance(read); + result = await requestBody.ReadAsync(cancellationToken); - if (_maxRequestSize < writer.Length) + if (result.Buffer.Length > _maxRequestSize) { - throw DefaultHttpRequestParser_MaxRequestSizeExceeded(); + requestBody.AdvanceTo(result.Buffer.End); + throw new GraphQLRequestException("Request size exceeds maximum allowed size."); } - } while (read == chunkSize); - if (writer.Length == 0) + // We tell the pipe that we've examined everything but consumed nothing yet. + requestBody.AdvanceTo(result.Buffer.Start, result.Buffer.End); + } + while (result is { IsCompleted: false, IsCanceled: false }); + + if (result.IsCanceled) { - throw DefaultHttpRequestParser_RequestIsEmpty(); + throw new OperationCanceledException(); } - return ParsePersistedOperationRequest(writer.WrittenSpan, documentId, operationName); + var requestParser = new Utf8GraphQLRequestParser( + _parserOptions, + _documentCache, + _documentHashProvider); + + var request = requestParser.ParsePersistedOperation(parsedDocumentId, operationName, result.Buffer); + + // Mark all data as consumed + requestBody.AdvanceTo(result.Buffer.End); + + return request; } catch (GraphQLRequestException) { @@ -257,7 +321,7 @@ public GraphQLRequest ParsePersistedOperationRequestFromParams( return (documentHash, document); } - private ErrorHandlingMode? ParseErrorHandlingMode(string onError) + private static ErrorHandlingMode? ParseErrorHandlingMode(string onError) { if (onError.Equals("PROPAGATE", StringComparison.OrdinalIgnoreCase)) { @@ -277,7 +341,7 @@ public GraphQLRequest ParsePersistedOperationRequestFromParams( return null; } - public IReadOnlyList<GraphQLRequest> ParseRequest(string sourceText) + public GraphQLRequest[] ParseRequest(string sourceText) { byte[]? rented = null; var maxLength = s_utf8.GetMaxByteCount(sourceText.Length); @@ -301,81 +365,6 @@ public IReadOnlyList<GraphQLRequest> ParseRequest(string sourceText) } } - private async ValueTask<IReadOnlyList<GraphQLRequest>> ReadAsync( - Stream stream, - CancellationToken cancellationToken) - { - try - { - const int chunkSize = 256; - using var writer = new PooledArrayWriter(); - int read; - - do - { - var memory = writer.GetMemory(chunkSize); - read = await stream.ReadAsync(memory, cancellationToken).ConfigureAwait(false); - writer.Advance(read); - - if (_maxRequestSize < writer.Length) - { - throw DefaultHttpRequestParser_MaxRequestSizeExceeded(); - } - } while (read == chunkSize); - - if (writer.Length == 0) - { - throw DefaultHttpRequestParser_RequestIsEmpty(); - } - - return ParseRequest(writer.WrittenSpan); - } - catch (GraphQLRequestException) - { - throw; - } - catch (SyntaxException ex) - { - throw DefaultHttpRequestParser_SyntaxError(ex); - } - catch (Exception ex) - { - throw DefaultHttpRequestParser_UnexpectedError(ex); - } - } - - private IReadOnlyList<GraphQLRequest> ParseRequest( - ReadOnlySpan<byte> request) - { - var requestParser = new Utf8GraphQLRequestParser( - request, - _parserOptions, - _documentCache, - _documentHashProvider); - - return requestParser.Parse(); - } - - private GraphQLRequest ParsePersistedOperationRequest( - ReadOnlySpan<byte> request, - string documentId, - string? operationName) - { - if (!OperationDocumentId.TryParse(documentId, out var parsedDocumentId)) - { - throw new InvalidGraphQLRequestException( - "The GraphQL document ID contains invalid characters."); - } - - var requestParser = new Utf8GraphQLRequestParser( - request, - _parserOptions, - _documentCache, - _documentHashProvider); - - return requestParser.ParsePersistedOperation(parsedDocumentId, operationName); - } - private static void EnsureValidDocumentId(string documentId) { if (!OperationDocumentId.IsValidId(documentId)) diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/HttpMultipartRequest.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/HttpMultipartRequest.cs index 414797d254f..5a474b8cacb 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/HttpMultipartRequest.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/HttpMultipartRequest.cs @@ -1,8 +1,6 @@ namespace HotChocolate.AspNetCore.Parsers; -internal sealed class HttpMultipartRequest(string operations, IDictionary<string, IFile> fileMap) -{ - public string Operations { get; set; } = operations; - - public IDictionary<string, IFile> FileMap { get; set; } = fileMap; -} +internal sealed record HttpMultipartRequest( + string Operations, + IFileLookup Files, + FileMapTrie FileMap); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IHttpRequestParser.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IHttpRequestParser.cs index d38549a4315..835c0cd72aa 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IHttpRequestParser.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IHttpRequestParser.cs @@ -1,3 +1,4 @@ +using System.IO.Pipelines; using HotChocolate.Language; using Microsoft.AspNetCore.Http; @@ -20,8 +21,8 @@ public interface IHttpRequestParser /// <returns> /// Returns the parsed GraphQL request. /// </returns> - ValueTask<IReadOnlyList<GraphQLRequest>> ParseRequestAsync( - Stream requestBody, + ValueTask<GraphQLRequest[]> ParseRequestAsync( + PipeReader requestBody, CancellationToken cancellationToken); /// <summary> @@ -45,7 +46,7 @@ ValueTask<IReadOnlyList<GraphQLRequest>> ParseRequestAsync( ValueTask<GraphQLRequest> ParsePersistedOperationRequestAsync( string documentId, string? operationName, - Stream requestBody, + PipeReader requestBody, CancellationToken cancellationToken); /// <summary> @@ -57,7 +58,7 @@ ValueTask<GraphQLRequest> ParsePersistedOperationRequestAsync( /// <returns> /// Returns the parsed GraphQL request. /// </returns> - IReadOnlyList<GraphQLRequest> ParseRequest(string sourceText); + GraphQLRequest[] ParseRequest(string sourceText); /// <summary> /// Parses a GraphQL HTTP GET request from the HTTP query parameters. diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IVariablePathSegment.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IVariablePathSegment.cs index 7b69952d517..2848213934c 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IVariablePathSegment.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IVariablePathSegment.cs @@ -3,4 +3,6 @@ namespace HotChocolate.AspNetCore.Parsers; internal interface IVariablePathSegment { IVariablePathSegment? Next { get; } + + string ToString(); } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IndexPathSegment.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IndexPathSegment.cs index 9c7f75d1c89..47cda7e7bdd 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IndexPathSegment.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/IndexPathSegment.cs @@ -11,4 +11,6 @@ public IndexPathSegment(int value, IVariablePathSegment? next) public int Value { get; } public IVariablePathSegment? Next { get; } + + public override string ToString() => Value.ToString(); } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/KeyPathSegment.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/KeyPathSegment.cs index d1acc50e606..5f90b99635a 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/KeyPathSegment.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/KeyPathSegment.cs @@ -11,4 +11,6 @@ public KeyPathSegment(string value, IVariablePathSegment? next) public string Value { get; } public IVariablePathSegment? Next { get; } + + public override string ToString() => Value; } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/VariablePath.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/VariablePath.cs index 3e340f883cb..ae68fe29141 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/VariablePath.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Parsers/VariablePath.cs @@ -1,9 +1,10 @@ +using System.Collections; using HotChocolate.AspNetCore.Utilities; using static HotChocolate.AspNetCore.Properties.AspNetCorePipelineResources; namespace HotChocolate.AspNetCore.Parsers; -internal sealed class VariablePath(KeyPathSegment key) +internal sealed class VariablePath(KeyPathSegment key) : IEnumerable<IVariablePathSegment> { public KeyPathSegment Key { get; } = key; @@ -45,4 +46,18 @@ public static VariablePath Parse(string s) throw new InvalidOperationException(VariablePath_Parse_FirstSegmentMustBeKey); } + + public IEnumerator<IVariablePathSegment> GetEnumerator() + { + IVariablePathSegment? current = Key; + + while (current is not null) + { + yield return current; + + current = current.Next; + } + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/PersistedOperationMiddleware.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/PersistedOperationMiddleware.cs index 239de43502d..7aeffa3d624 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/PersistedOperationMiddleware.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/PersistedOperationMiddleware.cs @@ -1,3 +1,6 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using System.Net; using HotChocolate.AspNetCore.Utilities; using Microsoft.AspNetCore.Builder; @@ -6,6 +9,10 @@ namespace HotChocolate.AspNetCore; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal static class PersistedOperationMiddleware { internal static void MapPersistedOperationMiddleware( diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Properties/AspNetCorePipelineResources.Designer.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Properties/AspNetCorePipelineResources.Designer.cs index 0cc7e5e7751..8f6f4fe62af 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Properties/AspNetCorePipelineResources.Designer.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Properties/AspNetCorePipelineResources.Designer.cs @@ -111,12 +111,6 @@ internal static string ThrowHelper_HttpMultipartMiddleware_FileMissing { } } - internal static string ThrowHelper_HttpMultipartMiddleware_VariableNotFound { - get { - return ResourceManager.GetString("ThrowHelper_HttpMultipartMiddleware_VariableNotFound", resourceCulture); - } - } - internal static string ThrowHelper_HttpMultipartMiddleware_VariableStructureInvalid { get { return ResourceManager.GetString("ThrowHelper_HttpMultipartMiddleware_VariableStructureInvalid", resourceCulture); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Properties/AspNetCorePipelineResources.resx b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Properties/AspNetCorePipelineResources.resx index 50718993e9c..9b19ef39c57 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Properties/AspNetCorePipelineResources.resx +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Properties/AspNetCorePipelineResources.resx @@ -51,9 +51,6 @@ <data name="ThrowHelper_HttpMultipartMiddleware_FileMissing" xml:space="preserve"> <value>File of key '{0}' is missing.</value> </data> - <data name="ThrowHelper_HttpMultipartMiddleware_VariableNotFound" xml:space="preserve"> - <value>The variable path '{0}' is invalid.</value> - </data> <data name="ThrowHelper_HttpMultipartMiddleware_VariableStructureInvalid" xml:space="preserve"> <value>The variable structure is invalid.</value> </data> diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationManager.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationManager.cs index 3d42829e22d..cf2d330b63d 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationManager.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationManager.cs @@ -1,4 +1,7 @@ using System.Collections; +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using HotChocolate.Language; namespace HotChocolate.AspNetCore.Subscriptions; @@ -8,6 +11,10 @@ namespace HotChocolate.AspNetCore.Subscriptions; /// The operation manager ensures that operation are correctly tracked and cleaned up after they /// have been completed. /// </summary> +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public sealed class OperationManager : IOperationManager { private readonly ReaderWriterLockSlim _lock = new(); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs index bde78b79c52..222e2a2fed8 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs @@ -1,8 +1,15 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using HotChocolate.Language; using HotChocolate.Utilities; namespace HotChocolate.AspNetCore.Subscriptions; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class OperationSession : IOperationSession { private readonly CancellationTokenSource _cts = new(); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs index dc5850b5c90..0b507642457 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs @@ -351,7 +351,7 @@ private static bool TryParseSubscribeMessage( var id = idProp.GetString()!; var request = Parse(JsonMarshal.GetRawUtf8Value(payloadProp)); - if (request.Count == 0) + if (request.Length == 0) { message = null; return false; diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs index 7d6b537ccf6..daee7f50eaf 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs @@ -324,7 +324,7 @@ private static bool TryParseSubscribeMessage( var requestData = JsonMarshal.GetRawUtf8Value(payloadProp); var request = Parse(requestData); - if (request.Count == 0) + if (request.Length == 0) { message = null; return false; diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs index 6d432782c7a..5ea619836e2 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/MiddlewareHelper.cs @@ -55,9 +55,9 @@ public static ParseRequestResult ParseRequestFromParams( { try { - return new ParseRequestResult( - executorSession.RequestParser.ParseRequestFromParams( - context.Request.Query)); + var request = executorSession.RequestParser.ParseRequestFromParams(context.Request.Query); + context.Response.RegisterForDispose(request); + return new ParseRequestResult(request); } catch (GraphQLRequestException ex) { @@ -87,11 +87,13 @@ public static ParseRequestResult ParseVariablesAndExtensionsFromParams( { try { - return new ParseRequestResult( + var request = executorSession.RequestParser.ParsePersistedOperationRequestFromParams( operationId, operationName, - context.Request.Query)); + context.Request.Query); + context.Response.RegisterForDispose(request); + return new ParseRequestResult(request); } catch (GraphQLRequestException ex) { @@ -126,8 +128,9 @@ public static async Task<ParseRequestResult> ParseSingleRequestFromBodyAsync( await executorSession.RequestParser.ParsePersistedOperationRequestAsync( operationId, operationName, - context.Request.Body, + context.Request.BodyReader, context.RequestAborted); + context.Response.RegisterForDispose(request); } catch (GraphQLRequestException ex) { @@ -191,6 +194,10 @@ public static RequestFlags DetermineHttpGetRequestFlags( return requestFlags; } +#if !NET9_0_OR_GREATER + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public static async Task<ExecuteRequestResult> ExecuteRequestAsync( GraphQLRequest request, RequestFlags flags, diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/ThrowHelper.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/ThrowHelper.cs index 8e12a5a1183..8ef78aad8eb 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/ThrowHelper.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Utilities/ThrowHelper.cs @@ -80,13 +80,6 @@ public static GraphQLException HttpMultipartMiddleware_FileMissing(string filena .SetCode(ErrorCodes.Server.MultiPartFileMissing) .Build()); - public static GraphQLException HttpMultipartMiddleware_VariableNotFound(string path) => - new GraphQLRequestException( - ErrorBuilder.New() - .SetMessage(ThrowHelper_HttpMultipartMiddleware_VariableNotFound, path) - .SetCode(ErrorCodes.Server.MultiPartVariableNotFound) - .Build()); - public static GraphQLException HttpMultipartMiddleware_VariableStructureInvalid() => new GraphQLRequestException( ErrorBuilder.New() diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Serialization/DefaultHttpRequestParserTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Serialization/DefaultHttpRequestParserTests.cs index 484eb4aafaa..5210a72855e 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Serialization/DefaultHttpRequestParserTests.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Serialization/DefaultHttpRequestParserTests.cs @@ -1,4 +1,5 @@ using System.Collections; +using System.IO.Pipelines; using System.Text; using HotChocolate.AspNetCore.Parsers; using HotChocolate.Execution.Caching; @@ -29,7 +30,7 @@ public async Task ParseRequestAsync_Valid_QueryId() new Sha256DocumentHashProvider(), 256, ParserOptions.Default); - var request = await parser.ParseRequestAsync(stream, CancellationToken.None); + var request = await parser.ParseRequestAsync(PipeReader.Create(stream), CancellationToken.None); // assert Assert.Collection( @@ -59,7 +60,7 @@ async Task Parse() 256, ParserOptions.Default); - await parser.ParseRequestAsync(stream, CancellationToken.None); + await parser.ParseRequestAsync(PipeReader.Create(stream), CancellationToken.None); } // assert diff --git a/src/HotChocolate/Language/src/Language.Web/GraphQLRequest.cs b/src/HotChocolate/Language/src/Language.Web/GraphQLRequest.cs index 83482fed59e..bd3a9d7c36e 100644 --- a/src/HotChocolate/Language/src/Language.Web/GraphQLRequest.cs +++ b/src/HotChocolate/Language/src/Language.Web/GraphQLRequest.cs @@ -5,8 +5,10 @@ namespace HotChocolate.Language; /// <summary> /// Represents the parsed GraphQL request JSON object. /// </summary> -public sealed class GraphQLRequest +public sealed record GraphQLRequest : IDisposable { + private bool _disposed; + /// <summary> /// Initializes a new instance of <see cref="GraphQLRequest"/>. /// </summary> @@ -62,37 +64,65 @@ public GraphQLRequest( /// Gets the GraphQL operation document id which references /// an operation document in a persisted operation document store. /// </summary> - public OperationDocumentId? DocumentId { get; } + public OperationDocumentId? DocumentId { get; init; } /// <summary> /// Gets the hash of the GraphQL operation document. /// </summary> - public OperationDocumentHash? DocumentHash { get; } + public OperationDocumentHash? DocumentHash { get; init; } /// <summary> /// Gets the GraphQL operation document that contains the operation definitions. /// </summary> - public DocumentNode? Document { get; } + public DocumentNode? Document { get; init; } /// <summary> /// Gets the name of an operation in the operation document that shall be executed. /// If this property is <c>null</c> the document only contains a single operation. /// </summary> - public string? OperationName { get; } + public string? OperationName { get; init; } /// <summary> /// Get the requested error handling mode. /// </summary> - public ErrorHandlingMode? ErrorHandlingMode { get; } + public ErrorHandlingMode? ErrorHandlingMode { get; init; } /// <summary> /// Gets a list of variables for the operation. /// For a standard GraphQL request this list will contain a single variable set or be <c>null</c>. /// </summary> - public JsonDocument? Variables { get; } + public JsonDocument? Variables { get; init; } /// <summary> /// Gets the GraphQL request extensions map. /// </summary> - public JsonDocument? Extensions { get; } + public JsonDocument? Extensions { get; init; } + + /// <summary> + /// Gets the memory owner for the variables JSON document buffer. + /// This will be disposed when the request is disposed. + /// </summary> + public IDisposable? VariablesMemoryOwner { get; init; } + + /// <summary> + /// Gets the memory owner for the extensions JSON document buffer. + /// This will be disposed when the request is disposed. + /// </summary> + public IDisposable? ExtensionsMemoryOwner { get; init; } + + /// <summary> + /// Disposes the request and releases all associated resources including + /// the variables and extensions JSON documents and their memory owners. + /// </summary> + public void Dispose() + { + if (!_disposed) + { + Variables?.Dispose(); + Extensions?.Dispose(); + VariablesMemoryOwner?.Dispose(); + ExtensionsMemoryOwner?.Dispose(); + _disposed = true; + } + } } diff --git a/src/HotChocolate/Language/src/Language.Web/Polyfills/IsExternalInit.cs b/src/HotChocolate/Language/src/Language.Web/Polyfills/IsExternalInit.cs new file mode 100644 index 00000000000..64bc7c1c32f --- /dev/null +++ b/src/HotChocolate/Language/src/Language.Web/Polyfills/IsExternalInit.cs @@ -0,0 +1,3 @@ +namespace System.Runtime.CompilerServices; + +internal static class IsExternalInit; diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs index 6090216a9e7..80895c63927 100644 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs +++ b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs @@ -4,7 +4,7 @@ namespace HotChocolate.Language; -public ref partial struct Utf8GraphQLRequestParser +public ref struct Utf8GraphQLRequestParser { private const string PersistedQuery = "persistedQuery"; private static readonly JsonReaderOptions s_jsonOptions = new() @@ -15,31 +15,38 @@ public ref partial struct Utf8GraphQLRequestParser private static readonly ArrayPool<GraphQLRequest> s_requestPool = ArrayPool<GraphQLRequest>.Shared; private static readonly ArrayPool<byte> s_bytePool = ArrayPool<byte>.Shared; - private readonly ReadOnlySpan<byte> _requestData; private readonly IDocumentHashProvider? _hashProvider; private readonly IDocumentCache? _cache; private readonly bool _useCache; private readonly ParserOptions _options; public Utf8GraphQLRequestParser( - ReadOnlySpan<byte> requestData, ParserOptions? options = null, IDocumentCache? cache = null, IDocumentHashProvider? hashProvider = null) { - _requestData = requestData; _options = options ?? ParserOptions.Default; _cache = cache; _hashProvider = hashProvider; _useCache = cache is not null; } - public readonly IReadOnlyList<GraphQLRequest> Parse() + public readonly GraphQLRequest[] Parse(ReadOnlySpan<byte> requestData) + { + var reader = new Utf8JsonReader(requestData, s_jsonOptions); + return Parse(ref reader); + } + + public readonly GraphQLRequest[] Parse(ReadOnlySequence<byte> requestData) + { + var reader = new Utf8JsonReader(requestData, s_jsonOptions); + return Parse(ref reader); + } + + private readonly GraphQLRequest[] Parse(ref Utf8JsonReader reader) { try { - var reader = new Utf8JsonReader(_requestData, s_jsonOptions); - if (!reader.Read()) { throw new InvalidGraphQLRequestException( @@ -61,12 +68,31 @@ public readonly IReadOnlyList<GraphQLRequest> Parse() } } - public readonly GraphQLRequest ParsePersistedOperation(OperationDocumentId operationId, string? operationName) + public readonly GraphQLRequest ParsePersistedOperation( + OperationDocumentId operationId, + string? operationName, + ReadOnlySpan<byte> requestData) + { + var reader = new Utf8JsonReader(requestData, s_jsonOptions); + return ParsePersistedOperation(operationId, operationName, ref reader); + } + + public readonly GraphQLRequest ParsePersistedOperation( + OperationDocumentId operationId, + string? operationName, + ReadOnlySequence<byte> requestData) + { + var reader = new Utf8JsonReader(requestData, s_jsonOptions); + return ParsePersistedOperation(operationId, operationName, ref reader); + } + + private readonly GraphQLRequest ParsePersistedOperation( + OperationDocumentId operationId, + string? operationName, + ref Utf8JsonReader reader) { try { - var reader = new Utf8JsonReader(_requestData, s_jsonOptions); - if (!reader.Read()) { throw new InvalidGraphQLRequestException( @@ -420,10 +446,17 @@ private static bool TryExtractHashInternal( return false; } - public static IReadOnlyList<GraphQLRequest> Parse( + public static GraphQLRequest[] Parse( ReadOnlySpan<byte> requestData, ParserOptions? options = null, IDocumentCache? cache = null, IDocumentHashProvider? hashProvider = null) - => new Utf8GraphQLRequestParser(requestData, options, cache, hashProvider).Parse(); + => new Utf8GraphQLRequestParser(options, cache, hashProvider).Parse(requestData); + + public static GraphQLRequest[] Parse( + ReadOnlySequence<byte> requestData, + ParserOptions? options = null, + IDocumentCache? cache = null, + IDocumentHashProvider? hashProvider = null) + => new Utf8GraphQLRequestParser(options, cache, hashProvider).Parse(requestData); } diff --git a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLSocketMessageParser.cs b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLSocketMessageParser.cs index 9efdd722d95..f2f05069e31 100644 --- a/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLSocketMessageParser.cs +++ b/src/HotChocolate/Language/src/Language.Web/Utf8GraphQLSocketMessageParser.cs @@ -2,7 +2,7 @@ namespace HotChocolate.Language; -public ref partial struct Utf8GraphQLSocketMessageParser +public ref struct Utf8GraphQLSocketMessageParser { private static readonly JsonReaderOptions s_jsonOptions = new() { diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs b/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs index 097242d0d35..5a115ba3a9f 100644 --- a/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs +++ b/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs @@ -42,9 +42,8 @@ public void Parse_Kitchen_Sink_Query_No_Cache() // act var parserOptions = new ParserOptions(); - var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions); - var batch = requestParser.Parse(); + var requestParser = new Utf8GraphQLRequestParser(parserOptions); + var batch = requestParser.Parse(source); // assert var request = Assert.Single(batch); @@ -67,9 +66,8 @@ public void Parse_Kitchen_Sink_Query_With_Russian_Characters() // act var parserOptions = new ParserOptions(); - var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions); - var batch = requestParser.Parse(); + var requestParser = new Utf8GraphQLRequestParser(parserOptions); + var batch = requestParser.Parse(source); // assert Assert.Collection(batch, From e928b7c32925b8fe025401e4cbe412bf11c24f20 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 6 Jan 2026 14:32:12 +0100 Subject: [PATCH 059/144] feat: Introduce IntToStructBaseType for integer-based NodaTime scalars - Added IntToStructBaseType to handle serialization for NodaTime scalars with int result values and struct runtime values. - Updated IsoDayOfWeekType to utilize IntToStructBaseType for better type coercion. - Refactored LocalDateTimeType, LocalDateType, LocalTimeType, OffsetDateTimeType, OffsetDateType, OffsetTimeType, OffsetType, and PeriodType to remove direct string serialization and leverage new base classes. - Introduced StringToClassBaseType and StringToStructBaseType for string-based NodaTime scalars, enhancing serialization and deserialization processes. - Updated ZonedDateTimeType to utilize StringToStructBaseType for improved handling of string representations. - Enhanced NodaTimeResources with new error messages for serialization failures. --- .../Subscriptions/OperationSession.cs | 4 +- .../Subscriptions/WebSocketSession.cs | 7 + .../WebSocketSubscriptionMiddleware.cs | 7 + .../BaseTypes/IntToStructBaseType.cs | 153 ----------- .../BaseTypes/StringToClassBaseType.cs | 134 --------- .../src/Types.NodaTime/DateTimeZoneType.cs | 24 +- .../Core/src/Types.NodaTime/DurationType.cs | 17 +- .../HotChocolate.Types.NodaTime.csproj | 4 + .../Core/src/Types.NodaTime/InstantType.cs | 17 +- .../src/Types.NodaTime/IntToStructBaseType.cs | 119 ++++++++ .../src/Types.NodaTime/IsoDayOfWeekType.cs | 25 +- .../src/Types.NodaTime/LocalDateTimeType.cs | 17 +- .../Core/src/Types.NodaTime/LocalDateType.cs | 17 +- .../Core/src/Types.NodaTime/LocalTimeType.cs | 17 +- .../src/Types.NodaTime/OffsetDateTimeType.cs | 17 +- .../Core/src/Types.NodaTime/OffsetDateType.cs | 17 +- .../Core/src/Types.NodaTime/OffsetTimeType.cs | 17 +- .../Core/src/Types.NodaTime/OffsetType.cs | 17 +- .../Core/src/Types.NodaTime/PeriodType.cs | 16 +- .../Properties/NodaTimeResources.Designer.cs | 256 ++++-------------- .../Properties/NodaTimeResources.resx | 9 + .../Types.NodaTime/StringToClassBaseType.cs | 119 ++++++++ .../{BaseTypes => }/StringToStructBaseType.cs | 109 ++++---- .../src/Types.NodaTime/ZonedDateTimeType.cs | 17 +- 24 files changed, 500 insertions(+), 656 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/IntToStructBaseType.cs delete mode 100644 src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToClassBaseType.cs create mode 100644 src/HotChocolate/Core/src/Types.NodaTime/IntToStructBaseType.cs create mode 100644 src/HotChocolate/Core/src/Types.NodaTime/StringToClassBaseType.cs rename src/HotChocolate/Core/src/Types.NodaTime/{BaseTypes => }/StringToStructBaseType.cs (56%) diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs index 222e2a2fed8..d55e4655d6d 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/OperationSession.cs @@ -97,7 +97,7 @@ await _session.Protocol.SendErrorMessageAsync( } catch (OperationCanceledException) when (ct.IsCancellationRequested) { - // the operation was cancelled so we do nothings + // the operation was canceled so we do nothing } catch (Exception ex) { @@ -125,6 +125,8 @@ await _session.Protocol.SendErrorMessageAsync( // signal that the subscription is completed. Complete(); + + request.Dispose(); } } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/WebSocketSession.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/WebSocketSession.cs index 3adfdbf778c..af8af0d698c 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/WebSocketSession.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/WebSocketSession.cs @@ -1,4 +1,7 @@ using System.Buffers; +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using HotChocolate.AspNetCore.Subscriptions.Protocols; using HotChocolate.Transport.Sockets; using Microsoft.AspNetCore.Http; @@ -7,6 +10,10 @@ namespace HotChocolate.AspNetCore.Subscriptions; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class WebSocketSession : ISocketSession { private static readonly GraphQLSocketOptions s_defaultOptions = new(); diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/WebSocketSubscriptionMiddleware.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/WebSocketSubscriptionMiddleware.cs index 7d4cfe100bd..91378946401 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/WebSocketSubscriptionMiddleware.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/WebSocketSubscriptionMiddleware.cs @@ -1,9 +1,16 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using HotChocolate.AspNetCore.Subscriptions; using Microsoft.AspNetCore.Http; using HttpRequestDelegate = Microsoft.AspNetCore.Http.RequestDelegate; namespace HotChocolate.AspNetCore; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public sealed class WebSocketSubscriptionMiddleware : MiddlewareBase { public WebSocketSubscriptionMiddleware( diff --git a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/IntToStructBaseType.cs b/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/IntToStructBaseType.cs deleted file mode 100644 index 6f09d37f8c6..00000000000 --- a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/IntToStructBaseType.cs +++ /dev/null @@ -1,153 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using HotChocolate.Language; -using static HotChocolate.Types.NodaTime.Properties.NodaTimeResources; - -namespace HotChocolate.Types.NodaTime; - -/// <summary> -/// This base class provides serialization functionality for noda time scalars -/// that have a <see cref="int"/> result value and a struct runtime value. -/// </summary> -/// <typeparam name="TRuntimeType"> -/// The runtime type. -/// </typeparam> -public abstract class IntToStructBaseType<TRuntimeType> - : ScalarType<TRuntimeType, IntValueNode> - where TRuntimeType : struct -{ - /// <summary> - /// Initializes a new instance of <see cref="IntToStructBaseType{TRuntimeType}"/>. - /// </summary> - /// <param name="name"> - /// The name of the scalar. - /// </param> - protected IntToStructBaseType(string name) - : base(name, BindingBehavior.Implicit) - { - } - - /// <inheritdoc /> - protected override TRuntimeType ParseLiteral(IntValueNode literal) - { - if (TryDeserialize(literal.ToInt32(), out var value)) - { - return value.Value; - } - - throw new LeafCoercionException( - string.Format(IntToStructBaseType_ParseLiteral_UnableToDeserializeInt, Name), - this); - } - - /// <inheritdoc /> - protected override IntValueNode ParseValue(TRuntimeType value) - { - if (TryCoerceOutputValue(value, out var val)) - { - return new IntValueNode(val.Value); - } - - throw new LeafCoercionException( - string.Format(IntToStructBaseType_ParseLiteral_UnableToDeserializeInt, Name), - this); - } - - /// <inheritdoc /> - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is int s) - { - return new IntValueNode(s); - } - - if (resultValue is TRuntimeType v) - { - return ParseValue(v); - } - - throw new LeafCoercionException( - string.Format(IntToStructBaseType_ParseLiteral_UnableToDeserializeInt, Name), - this); - } - - /// <inheritdoc /> - public override bool TryCoerceOutputValue( - object? runtimeValue, - out object? resultValue) - { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is TRuntimeType dt && TryCoerceOutputValue(dt, out var val)) - { - resultValue = val.Value; - return true; - } - - resultValue = null; - return false; - } - - /// <summary> - /// Tries to serialize the .net runtime representation to the - /// serialized result representation. - /// </summary> - /// <param name="runtimeValue"> - /// The .net runtime representation. - /// </param> - /// <param name="resultValue"> - /// The serialized result value. - /// </param> - /// <returns> - /// Returns the serialized result value. - /// </returns> - protected abstract bool TryCoerceOutputValue( - TRuntimeType runtimeValue, - [NotNullWhen(true)] out int? resultValue); - - /// <inheritdoc /> - public override bool TryDeserialize( - object? resultValue, - out object? runtimeValue) - { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is int i && TryDeserialize(i, out var val)) - { - runtimeValue = val; - return true; - } - - runtimeValue = null; - return false; - } - - /// <summary> - /// Tries to deserializes the value from the output format to the .net - /// runtime representation. - /// </summary> - /// <param name="resultValue"> - /// The serialized result value. - /// </param> - /// <param name="runtimeValue"> - /// The .net runtime representation. - /// </param> - /// <returns> - /// <c>true</c> if the serialized value was correctly deserialized; otherwise, <c>false</c>. - /// </returns> - protected abstract bool TryDeserialize( - int resultValue, - [NotNullWhen(true)] out TRuntimeType? runtimeValue); -} diff --git a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToClassBaseType.cs b/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToClassBaseType.cs deleted file mode 100644 index 8dfeac1194c..00000000000 --- a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToClassBaseType.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using HotChocolate.Language; -using static HotChocolate.Types.NodaTime.Properties.NodaTimeResources; - -namespace HotChocolate.Types.NodaTime; - -/// <summary> -/// This base class provides serialization functionality for noda time scalars -/// that have a <see cref="string"/> result value and a class runtime value. -/// </summary> -/// <typeparam name="TRuntimeType"> -/// The runtime type. -/// </typeparam> -public abstract class StringToClassBaseType<TRuntimeType> - : ScalarType<TRuntimeType, StringValueNode> - where TRuntimeType : class -{ - /// <summary> - /// Initializes a new instance of <see cref="StringToClassBaseType{TRuntimeType}"/>. - /// </summary> - /// <param name="name"> - /// The name of the scalar. - /// </param> - protected StringToClassBaseType(string name) - : base(name, BindingBehavior.Implicit) - { - } - - /// <inheritdoc /> - protected override TRuntimeType ParseLiteral(StringValueNode literal) - { - if (TryDeserialize(literal.Value, out var value)) - { - return value; - } - - throw new LeafCoercionException( - string.Format(StringToClassBaseType_ParseLiteral_UnableToDeserializeString, Name), - this); - } - - /// <inheritdoc /> - protected override StringValueNode ParseValue(TRuntimeType value) => - new(CoerceOutputValue(value)); - - /// <inheritdoc /> - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is string s) - { - return new StringValueNode(s); - } - - if (resultValue is TRuntimeType v) - { - return ParseValue(v); - } - - throw new LeafCoercionException( - string.Format(StringToClassBaseType_ParseLiteral_UnableToDeserializeString, Name), - this); - } - - /// <inheritdoc /> - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) - { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is TRuntimeType dt) - { - resultValue = CoerceOutputValue(dt); - return true; - } - - resultValue = null; - return false; - } - - /// <summary> - /// Serializes the .net runtime representation to the serialized result representation. - /// </summary> - /// <param name="runtimeValue"> - /// The .net value representation. - /// </param> - /// <returns> - /// Returns the serialized result value. - /// </returns> - protected abstract string CoerceOutputValue(TRuntimeType runtimeValue); - - /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is string s && TryDeserialize(s, out var val)) - { - runtimeValue = val; - return true; - } - - runtimeValue = null; - return false; - } - - /// <summary> - /// Tries to deserializes the value from the output format to the .net - /// runtime representation. - /// </summary> - /// <param name="resultValue"> - /// The serialized result value. - /// </param> - /// <param name="runtimeValue"> - /// The .net runtime representation. - /// </param> - /// <returns> - /// <c>true</c> if the serialized value was correctly deserialized; otherwise, <c>false</c>. - /// </returns> - protected abstract bool TryDeserialize( - string resultValue, - [NotNullWhen(true)] out TRuntimeType? runtimeValue); -} diff --git a/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs b/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs index 3e621af3e6f..677f2303b4b 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs @@ -18,27 +18,23 @@ public class DateTimeZoneType : StringToClassBaseType<DateTimeZone> public DateTimeZoneType() : base("DateTimeZone") { Description = NodaTimeResources.DateTimeZoneType_Description; - SerializationType = ScalarSerializationType.String; } /// <inheritdoc /> - protected override string CoerceOutputValue(DateTimeZone runtimeValue) - => runtimeValue.Id; - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out DateTimeZone? runtimeValue) { - var result = DateTimeZoneProviders.Tzdb.GetZoneOrNull(resultValue); - - if (result == null) - { - runtimeValue = null; - return false; - } + runtimeValue = DateTimeZoneProviders.Tzdb.GetZoneOrNull(resultValue); + return runtimeValue is not null; + } - runtimeValue = result; + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + DateTimeZone runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = runtimeValue.Id; return true; } } diff --git a/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs b/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs index 4e6e31af7d9..8ce8dc9826f 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs @@ -30,7 +30,6 @@ public DurationType(params IPattern<Duration>[] allowedPatterns) : base("Duratio allowedPatterns, NodaTimeResources.DurationType_Description, NodaTimeResources.DurationType_Description_Extended); - SerializationType = ScalarSerializationType.String; } /// <summary> @@ -42,16 +41,20 @@ public DurationType() : this(DurationPattern.Roundtrip) } /// <inheritdoc /> - protected override string CoerceOutputValue(Duration runtimeValue) - => _serializationPattern - .Format(runtimeValue); - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out Duration? runtimeValue) => _allowedPatterns.TryParse(resultValue, out runtimeValue); + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + Duration runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = _serializationPattern.Format(runtimeValue); + return true; + } + protected override Dictionary<IPattern<Duration>, string> PatternMap => new() { { DurationPattern.Roundtrip, "-D:hh:mm:ss.sssssssss" }, diff --git a/src/HotChocolate/Core/src/Types.NodaTime/HotChocolate.Types.NodaTime.csproj b/src/HotChocolate/Core/src/Types.NodaTime/HotChocolate.Types.NodaTime.csproj index 3851560c875..9088f6cb7b0 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/HotChocolate.Types.NodaTime.csproj +++ b/src/HotChocolate/Core/src/Types.NodaTime/HotChocolate.Types.NodaTime.csproj @@ -38,4 +38,8 @@ </Compile> </ItemGroup> + <ItemGroup> + <Folder Include="BaseTypes\" /> + </ItemGroup> + </Project> diff --git a/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs b/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs index eefe7634e91..e5fd99c644d 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs @@ -30,7 +30,6 @@ public InstantType(params IPattern<Instant>[] allowedPatterns) : base("Instant") allowedPatterns, NodaTimeResources.InstantType_Description, NodaTimeResources.InstantType_Description_Extended); - SerializationType = ScalarSerializationType.String; } /// <summary> @@ -42,16 +41,20 @@ public InstantType() : this(InstantPattern.ExtendedIso) } /// <inheritdoc /> - protected override string CoerceOutputValue(Instant runtimeValue) - => _serializationPattern - .Format(runtimeValue); - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out Instant? runtimeValue) => _allowedPatterns.TryParse(resultValue, out runtimeValue); + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + Instant runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = _serializationPattern.Format(runtimeValue); + return true; + } + protected override Dictionary<IPattern<Instant>, string> PatternMap => new() { { InstantPattern.General, "YYYY-MM-DDThh:mm:ss±hh:mm" }, diff --git a/src/HotChocolate/Core/src/Types.NodaTime/IntToStructBaseType.cs b/src/HotChocolate/Core/src/Types.NodaTime/IntToStructBaseType.cs new file mode 100644 index 00000000000..ede286f2ded --- /dev/null +++ b/src/HotChocolate/Core/src/Types.NodaTime/IntToStructBaseType.cs @@ -0,0 +1,119 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using HotChocolate.Features; +using HotChocolate.Language; +using HotChocolate.Text.Json; +using static HotChocolate.Types.NodaTime.Properties.NodaTimeResources; + +namespace HotChocolate.Types.NodaTime; + +/// <summary> +/// This base class provides serialization functionality for noda time scalars +/// that have a <see cref="int"/> result value and a struct runtime value. +/// </summary> +/// <typeparam name="TRuntimeType"> +/// The runtime type. +/// </typeparam> +public abstract class IntToStructBaseType<TRuntimeType> + : ScalarType<TRuntimeType, IntValueNode> + where TRuntimeType : struct +{ + /// <summary> + /// Initializes a new instance of <see cref="IntToStructBaseType{TRuntimeType}"/>. + /// </summary> + /// <param name="name"> + /// The name of the scalar. + /// </param> + protected IntToStructBaseType(string name) + : base(name, BindingBehavior.Implicit) + { + } + + /// <inheritdoc /> + public override object CoerceInputLiteral(IntValueNode valueLiteral) + { + if (TryCoerceRuntimeValue(valueLiteral.ToInt32(), out var runtimeValue)) + { + return runtimeValue; + } + + throw new LeafCoercionException( + string.Format(IntToStructBaseType_ParseLiteral_UnableToDeserializeInt, Name), + this); + } + + /// <inheritdoc /> + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + { + if (inputValue.ValueKind is not JsonValueKind.Number + && TryCoerceRuntimeValue(inputValue.GetInt32(), out var runtimeValue)) + { + return runtimeValue; + } + + throw new LeafCoercionException( + string.Format(IntToStructBaseType_ParseLiteral_UnableToDeserializeInt, Name), + this); + } + + /// <inheritdoc /> + public override void CoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue) + { + if (TryCoerceOutputValue(runtimeValue, out var value)) + { + resultValue.SetNumberValue(value.Value); + return; + } + + throw new LeafCoercionException( + string.Format(IntToStructBaseType_ParseLiteral_UnableToCoerceOutputValue, Name), + this); + } + + /// <inheritdoc /> + public override IValueNode ValueToLiteral(TRuntimeType runtimeValue) + { + if (TryCoerceOutputValue(runtimeValue, out var value)) + { + return new IntValueNode(value.Value); + } + + throw new LeafCoercionException( + string.Format(IntToStructBaseType_ParseLiteral_UnableToCoerceOutputValue, Name), + this); + } + + /// <summary> + /// Attempts to coerce an integer input value to the runtime type. + /// </summary> + /// <param name="resultValue"> + /// The integer value to coerce. + /// </param> + /// <param name="runtimeValue"> + /// When this method returns, contains the coerced runtime value if the conversion succeeded, + /// or the default value if the conversion failed. + /// </param> + /// <returns> + /// <c>true</c> if the coercion was successful; otherwise, <c>false</c>. + /// </returns> + protected abstract bool TryCoerceRuntimeValue( + int resultValue, + [NotNullWhen(true)] out TRuntimeType? runtimeValue); + + /// <summary> + /// Attempts to coerce a runtime value to an integer output value. + /// </summary> + /// <param name="runtimeValue"> + /// The runtime value to coerce. + /// </param> + /// <param name="resultValue"> + /// When this method returns, contains the coerced integer value if the conversion succeeded, + /// or null if the conversion failed. + /// </param> + /// <returns> + /// <c>true</c> if the coercion was successful; otherwise, <c>false</c>. + /// </returns> + protected abstract bool TryCoerceOutputValue( + TRuntimeType runtimeValue, + [NotNullWhen(true)] out int? resultValue); +} diff --git a/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs b/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs index fab77c48e20..391f30416b8 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs @@ -17,36 +17,35 @@ public class IsoDayOfWeekType : IntToStructBaseType<IsoDayOfWeek> public IsoDayOfWeekType() : base("IsoDayOfWeek") { Description = NodaTimeResources.IsoDayOfWeekType_Description; - SerializationType = ScalarSerializationType.Int; } /// <inheritdoc /> - protected override bool TryCoerceOutputValue( - IsoDayOfWeek runtimeValue, - [NotNullWhen(true)] out int? resultValue) + protected override bool TryCoerceRuntimeValue( + int resultValue, + [NotNullWhen(true)] out IsoDayOfWeek? runtimeValue) { - if (runtimeValue == IsoDayOfWeek.None) + if (resultValue is < 1 or > 7) { - resultValue = null; + runtimeValue = null; return false; } - resultValue = (int)runtimeValue; + runtimeValue = (IsoDayOfWeek)resultValue; return true; } /// <inheritdoc /> - protected override bool TryDeserialize( - int resultValue, - [NotNullWhen(true)] out IsoDayOfWeek? runtimeValue) + protected override bool TryCoerceOutputValue( + IsoDayOfWeek runtimeValue, + [NotNullWhen(true)] out int? resultValue) { - if (resultValue < 1 || resultValue > 7) + if (runtimeValue == IsoDayOfWeek.None) { - runtimeValue = null; + resultValue = null; return false; } - runtimeValue = (IsoDayOfWeek)resultValue; + resultValue = (int)runtimeValue; return true; } } diff --git a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs index 263b6b6c843..8fd1b923e11 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs @@ -30,7 +30,6 @@ public LocalDateTimeType(params IPattern<LocalDateTime>[] allowedPatterns) : bas _allowedPatterns, NodaTimeResources.LocalDateTimeType_Description, NodaTimeResources.LocalDateTimeType_Description_Extended); - SerializationType = ScalarSerializationType.String; } /// <summary> @@ -42,16 +41,20 @@ public LocalDateTimeType() : this(LocalDateTimePattern.ExtendedIso) } /// <inheritdoc /> - protected override string CoerceOutputValue(LocalDateTime runtimeValue) - => _serializationPattern - .Format(runtimeValue); - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out LocalDateTime? runtimeValue) => _allowedPatterns.TryParse(resultValue, out runtimeValue); + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + LocalDateTime runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = _serializationPattern.Format(runtimeValue); + return true; + } + protected override Dictionary<IPattern<LocalDateTime>, string> PatternMap => new() { { LocalDateTimePattern.GeneralIso, "YYYY-MM-DDThh:mm:ss" }, diff --git a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs index 264776a39d9..70d38651c4a 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs @@ -31,7 +31,6 @@ public LocalDateType(params IPattern<LocalDate>[] allowedPatterns) : base("Local allowedPatterns, NodaTimeResources.LocalDateType_Description, NodaTimeResources.LocalDateType_Description_Extended); - SerializationType = ScalarSerializationType.String; } /// <summary> @@ -43,16 +42,20 @@ public LocalDateType() : this(LocalDatePattern.Iso) } /// <inheritdoc /> - protected override string CoerceOutputValue(LocalDate runtimeValue) - => _serializationPattern - .Format(runtimeValue); - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out LocalDate? runtimeValue) => _allowedPatterns.TryParse(resultValue, out runtimeValue); + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + LocalDate runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = _serializationPattern.Format(runtimeValue); + return true; + } + protected override Dictionary<IPattern<LocalDate>, string> PatternMap => new() { { LocalDatePattern.Iso, "YYYY-MM-DD" }, diff --git a/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs index f64c4bf2849..47e082dfd7e 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs @@ -31,7 +31,6 @@ public LocalTimeType(params IPattern<LocalTime>[] allowedPatterns) : base("Local allowedPatterns, NodaTimeResources.LocalTimeType_Description, NodaTimeResources.LocalTimeType_Description_Extended); - SerializationType = ScalarSerializationType.String; } /// <summary> @@ -43,16 +42,20 @@ public LocalTimeType() : this(LocalTimePattern.ExtendedIso) } /// <inheritdoc /> - protected override string CoerceOutputValue(LocalTime runtimeValue) - => _serializationPattern - .Format(runtimeValue); - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out LocalTime? runtimeValue) => _allowedPatterns.TryParse(resultValue, out runtimeValue); + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + LocalTime runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = _serializationPattern.Format(runtimeValue); + return true; + } + protected override Dictionary<IPattern<LocalTime>, string> PatternMap => new() { { LocalTimePattern.ExtendedIso, "hh:mm:ss.sssssssss" }, diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs index 371c1705810..8d5bc9277be 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs @@ -31,7 +31,6 @@ public OffsetDateTimeType(params IPattern<OffsetDateTime>[] allowedPatterns) allowedPatterns, NodaTimeResources.OffsetDateTimeType_Description, NodaTimeResources.OffsetDateTimeType_Description_Extended); - SerializationType = ScalarSerializationType.String; } /// <summary> @@ -46,16 +45,20 @@ public OffsetDateTimeType() : this(OffsetDateTimePattern.ExtendedIso) } /// <inheritdoc /> - protected override string CoerceOutputValue(OffsetDateTime runtimeValue) - => _serializationPattern - .Format(runtimeValue); - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out OffsetDateTime? runtimeValue) => _allowedPatterns.TryParse(resultValue, out runtimeValue); + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + OffsetDateTime runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = _serializationPattern.Format(runtimeValue); + return true; + } + protected override Dictionary<IPattern<OffsetDateTime>, string> PatternMap => new() { { OffsetDateTimePattern.GeneralIso, "YYYY-MM-DDThh:mm:ss±hh:mm" }, diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs index d12fc4aa279..a00830484f3 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs @@ -32,7 +32,6 @@ public OffsetDateType(params IPattern<OffsetDate>[] allowedPatterns) : base("Off allowedPatterns, NodaTimeResources.OffsetDateType_Description, NodaTimeResources.OffsetDateType_Description_Extended); - SerializationType = ScalarSerializationType.String; } /// <summary> @@ -44,16 +43,20 @@ public OffsetDateType() : this(OffsetDatePattern.GeneralIso) } /// <inheritdoc /> - protected override string CoerceOutputValue(OffsetDate runtimeValue) - => _serializationPattern - .Format(runtimeValue); - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out OffsetDate? runtimeValue) => _allowedPatterns.TryParse(resultValue, out runtimeValue); + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + OffsetDate runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = _serializationPattern.Format(runtimeValue); + return true; + } + protected override Dictionary<IPattern<OffsetDate>, string> PatternMap => new() { { OffsetDatePattern.GeneralIso, "YYYY-MM-DD±hh:mm" }, diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs index 48ae0b99ef5..6d69c18ea02 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs @@ -31,7 +31,6 @@ public OffsetTimeType(params IPattern<OffsetTime>[] allowedPatterns) : base("Off allowedPatterns, NodaTimeResources.OffsetTimeType_Description, NodaTimeResources.OffsetTimeType_Description_Extended); - SerializationType = ScalarSerializationType.String; } /// <summary> @@ -43,16 +42,20 @@ public OffsetTimeType() : this(OffsetTimePattern.GeneralIso) } /// <inheritdoc /> - protected override string CoerceOutputValue(OffsetTime runtimeValue) - => _serializationPattern - .Format(runtimeValue); - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out OffsetTime? runtimeValue) => _allowedPatterns.TryParse(resultValue, out runtimeValue); + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + OffsetTime runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = _serializationPattern.Format(runtimeValue); + return true; + } + protected override Dictionary<IPattern<OffsetTime>, string> PatternMap => new() { { OffsetTimePattern.GeneralIso, "hh:mm:ss±hh:mm" }, diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs index 2974bcd6c2b..47a6e496279 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs @@ -32,7 +32,6 @@ public OffsetType(params IPattern<Offset>[] allowedPatterns) : base("Offset") allowedPatterns, NodaTimeResources.OffsetType_Description, NodaTimeResources.OffsetType_Description_Extended); - SerializationType = ScalarSerializationType.String; } /// <summary> @@ -44,16 +43,20 @@ public OffsetType() : this(OffsetPattern.GeneralInvariantWithZ) } /// <inheritdoc /> - protected override string CoerceOutputValue(Offset runtimeValue) - => _serializationPattern - .Format(runtimeValue); - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out Offset? runtimeValue) => _allowedPatterns.TryParse(resultValue, out runtimeValue); + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + Offset runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = _serializationPattern.Format(runtimeValue); + return true; + } + protected override Dictionary<IPattern<Offset>, string> PatternMap => new() { { OffsetPattern.GeneralInvariant, "±hh:mm:ss" }, diff --git a/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs b/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs index 5364fb9f291..037c9960b35 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs @@ -27,7 +27,6 @@ public PeriodType(params IPattern<Period>[] allowedPatterns) : base("Period") _allowedPatterns = allowedPatterns; _serializationPattern = allowedPatterns[0]; Description = NodaTimeResources.PeriodType_Description; - SerializationType = ScalarSerializationType.String; } /// <summary> @@ -39,12 +38,17 @@ public PeriodType() : this(PeriodPattern.Roundtrip) } /// <inheritdoc /> - protected override string CoerceOutputValue(Period runtimeValue) - => _serializationPattern.Format(runtimeValue); - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out Period? runtimeValue) => _allowedPatterns.TryParse(resultValue, out runtimeValue); + + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + Period runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = _serializationPattern.Format(runtimeValue); + return true; + } } diff --git a/src/HotChocolate/Core/src/Types.NodaTime/Properties/NodaTimeResources.Designer.cs b/src/HotChocolate/Core/src/Types.NodaTime/Properties/NodaTimeResources.Designer.cs index ee19faee741..480c8a19b39 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/Properties/NodaTimeResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/Properties/NodaTimeResources.Designer.cs @@ -11,46 +11,32 @@ namespace HotChocolate.Types.NodaTime.Properties { using System; - /// <summary> - /// A strongly-typed resource class, for looking up localized strings, etc. - /// </summary> - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class NodaTimeResources { - private static global::System.Resources.ResourceManager resourceMan; + private static System.Resources.ResourceManager resourceMan; - private static global::System.Globalization.CultureInfo resourceCulture; + private static System.Globalization.CultureInfo resourceCulture; - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal NodaTimeResources() { } - /// <summary> - /// Returns the cached ResourceManager instance used by this class. - /// </summary> - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager { get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HotChocolate.Types.NodaTime.Properties.NodaTimeResources", typeof(NodaTimeResources).Assembly); + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("HotChocolate.Types.NodaTime.Properties.NodaTimeResources", typeof(NodaTimeResources).Assembly); resourceMan = temp; } return resourceMan; } } - /// <summary> - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// </summary> - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -59,318 +45,184 @@ internal NodaTimeResources() { } } - /// <summary> - /// Looks up a localized string similar to Represents a time zone - a mapping between UTC and local time. - ///A time zone maps UTC instants to local times - or, equivalently, to the offset from UTC at any particular instant. - /// - ///Example: `Europe/Zurich`. - /// </summary> + internal static string IntToStructBaseType_ParseLiteral_UnableToDeserializeInt { + get { + return ResourceManager.GetString("IntToStructBaseType_ParseLiteral_UnableToDeserializeInt", resourceCulture); + } + } + + internal static string IntToStructBaseType_ParseLiteral_UnableToCoerceOutputValue { + get { + return ResourceManager.GetString("IntToStructBaseType_ParseLiteral_UnableToCoerceOutputValue", resourceCulture); + } + } + + internal static string StringToClassBaseType_ParseLiteral_UnableToDeserializeString { + get { + return ResourceManager.GetString("StringToClassBaseType_ParseLiteral_UnableToDeserializeString", resourceCulture); + } + } + + internal static string StringToClassBaseType_ParseLiteral_UnableToCoerceOutputValue { + get { + return ResourceManager.GetString("StringToClassBaseType_ParseLiteral_UnableToCoerceOutputValue", resourceCulture); + } + } + + internal static string StringToStructBaseType_ParseLiteral_UnableToDeserializeString { + get { + return ResourceManager.GetString("StringToStructBaseType_ParseLiteral_UnableToDeserializeString", resourceCulture); + } + } + + internal static string StringToStructBaseType_ParseLiteral_UnableToCoerceOutputValue { + get { + return ResourceManager.GetString("StringToStructBaseType_ParseLiteral_UnableToCoerceOutputValue", resourceCulture); + } + } + internal static string DateTimeZoneType_Description { get { return ResourceManager.GetString("DateTimeZoneType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to Represents a fixed (and calendar-independent) length of time.. - /// </summary> internal static string DurationType_Description { get { return ResourceManager.GetString("DurationType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to Represents a fixed (and calendar-independent) length of time. - /// - ///Allowed patterns: - ///{0} - /// - ///Examples: - ///{1}. - /// </summary> internal static string DurationType_Description_Extended { get { return ResourceManager.GetString("DurationType_Description_Extended", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to Represents an instant on the global timeline, with nanosecond resolution.. - /// </summary> internal static string InstantType_Description { get { return ResourceManager.GetString("InstantType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to Represents an instant on the global timeline, with nanosecond resolution. - /// - ///Allowed patterns: - ///{0} - /// - ///Examples: - ///{1}. - /// </summary> internal static string InstantType_Description_Extended { get { return ResourceManager.GetString("InstantType_Description_Extended", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to Unable to deserialize integer to {0}. - /// </summary> - internal static string IntToStructBaseType_ParseLiteral_UnableToDeserializeInt { - get { - return ResourceManager.GetString("IntToStructBaseType_ParseLiteral_UnableToDeserializeInt", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to Equates the days of the week with their numerical value according to ISO-8601. - /// Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5, Saturday = 6, Sunday = 7.. - /// </summary> internal static string IsoDayOfWeekType_Description { get { return ResourceManager.GetString("IsoDayOfWeekType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to A date and time in a particular calendar system.. - /// </summary> internal static string LocalDateTimeType_Description { get { return ResourceManager.GetString("LocalDateTimeType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to A date and time in a particular calendar system. - /// - ///Allowed patterns: - ///{0} - /// - ///Examples: - ///{1}. - /// </summary> internal static string LocalDateTimeType_Description_Extended { get { return ResourceManager.GetString("LocalDateTimeType_Description_Extended", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to LocalDate represents a date within the calendar, with no reference to a particular time zone or time of day.. - /// </summary> internal static string LocalDateType_Description { get { return ResourceManager.GetString("LocalDateType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to LocalDate represents a date within the calendar, with no reference to a particular time zone or time of day. - /// - ///Allowed patterns: - ///{0} - /// - ///Examples: - ///{1}. - /// </summary> internal static string LocalDateType_Description_Extended { get { return ResourceManager.GetString("LocalDateType_Description_Extended", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to LocalTime represents a time of day, with no reference to a particular calendar, time zone, or date.. - /// </summary> internal static string LocalTimeType_Description { get { return ResourceManager.GetString("LocalTimeType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to LocalTime represents a time of day, with no reference to a particular calendar, time zone, or date. - /// - ///Allowed patterns: - ///{0} - /// - ///Examples: - ///{1}. - /// </summary> internal static string LocalTimeType_Description_Extended { get { return ResourceManager.GetString("LocalTimeType_Description_Extended", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The provided patterns are empty. You must provide at least one pattern for type {0}.. - /// </summary> - internal static string NodaTime_NoPatternProvided { - get { - return ResourceManager.GetString("NodaTime_NoPatternProvided", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to A local date and time in a particular calendar system, combined with an offset from UTC.. - /// </summary> internal static string OffsetDateTimeType_Description { get { return ResourceManager.GetString("OffsetDateTimeType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to A local date and time in a particular calendar system, combined with an offset from UTC. - /// - ///Allowed patterns: - ///{0} - /// - ///Examples: - ///{1}. - /// </summary> internal static string OffsetDateTimeType_Description_Extended { get { return ResourceManager.GetString("OffsetDateTimeType_Description_Extended", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to A combination of a LocalDate and an Offset, to represent a date at a specific offset from UTC but without any time-of-day information.. - /// </summary> internal static string OffsetDateType_Description { get { return ResourceManager.GetString("OffsetDateType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to A combination of a LocalDate and an Offset, to represent a date at a specific offset from UTC but without any time-of-day information. - /// - ///Allowed patterns: - ///{0} - /// - ///Examples: - ///{1}. - /// </summary> internal static string OffsetDateType_Description_Extended { get { return ResourceManager.GetString("OffsetDateType_Description_Extended", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to A combination of a LocalTime and an Offset, to represent a time-of-day at a specific offset from UTC but without any date information.. - /// </summary> internal static string OffsetTimeType_Description { get { return ResourceManager.GetString("OffsetTimeType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to A combination of a LocalTime and an Offset, to represent a time-of-day at a specific offset from UTC but without any date information. - /// - ///Allowed patterns: - ///{0} - /// - ///Examples: - ///{1}. - /// </summary> internal static string OffsetTimeType_Description_Extended { get { return ResourceManager.GetString("OffsetTimeType_Description_Extended", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to An offset from UTC in seconds. - /// A positive value means that the local time is ahead of UTC (e.g. for Europe); a negative value means that the local time is behind UTC (e.g. for America).. - /// </summary> internal static string OffsetType_Description { get { return ResourceManager.GetString("OffsetType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to An offset from UTC in seconds. - /// A positive value means that the local time is ahead of UTC (e.g. for Europe); a negative value means that the local time is behind UTC (e.g. for America). - /// - ///Allowed patterns: - ///{0} - /// - ///Examples: - ///{1}. - /// </summary> internal static string OffsetType_Description_Extended { get { return ResourceManager.GetString("OffsetType_Description_Extended", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to Represents a period of time expressed in human chronological terms: hours, days, weeks, months and so on. - /// - ///Pattern: `PnYnMnDTnHnMnS` - ///Example: `P3Y6M4DT12H30M5S`. - /// </summary> internal static string PeriodType_Description { get { return ResourceManager.GetString("PeriodType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to Unable to deserialize string to {0}. - /// </summary> - internal static string StringToClassBaseType_ParseLiteral_UnableToDeserializeString { - get { - return ResourceManager.GetString("StringToClassBaseType_ParseLiteral_UnableToDeserializeString", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to Unable to deserialize string to {0}. - /// </summary> - internal static string StringToStructBaseType_ParseLiteral_UnableToDeserializeString { - get { - return ResourceManager.GetString("StringToStructBaseType_ParseLiteral_UnableToDeserializeString", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to A LocalDateTime in a specific time zone and with a particular offset to distinguish between otherwise-ambiguous instants. - ///A ZonedDateTime is global, in that it maps to a single Instant.. - /// </summary> internal static string ZonedDateTimeType_Description { get { return ResourceManager.GetString("ZonedDateTimeType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to A LocalDateTime in a specific time zone and with a particular offset to distinguish between otherwise-ambiguous instants. - ///A ZonedDateTime is global, in that it maps to a single Instant. - /// - ///Allowed patterns: - ///{0} - /// - ///Examples: - ///{1}. - /// </summary> internal static string ZonedDateTimeType_Description_Extended { get { return ResourceManager.GetString("ZonedDateTimeType_Description_Extended", resourceCulture); } } + + internal static string NodaTime_NoPatternProvided { + get { + return ResourceManager.GetString("NodaTime_NoPatternProvided", resourceCulture); + } + } } } diff --git a/src/HotChocolate/Core/src/Types.NodaTime/Properties/NodaTimeResources.resx b/src/HotChocolate/Core/src/Types.NodaTime/Properties/NodaTimeResources.resx index a197bf71bfb..278994b2d93 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/Properties/NodaTimeResources.resx +++ b/src/HotChocolate/Core/src/Types.NodaTime/Properties/NodaTimeResources.resx @@ -21,12 +21,21 @@ <data name="IntToStructBaseType_ParseLiteral_UnableToDeserializeInt" xml:space="preserve"> <value>Unable to deserialize integer to {0}</value> </data> + <data name="IntToStructBaseType_ParseLiteral_UnableToCoerceOutputValue" xml:space="preserve"> + <value>Unable to serialize {0} to integer</value> + </data> <data name="StringToClassBaseType_ParseLiteral_UnableToDeserializeString" xml:space="preserve"> <value>Unable to deserialize string to {0}</value> </data> + <data name="StringToClassBaseType_ParseLiteral_UnableToCoerceOutputValue" xml:space="preserve"> + <value>Unable to serialize {0} to string</value> + </data> <data name="StringToStructBaseType_ParseLiteral_UnableToDeserializeString" xml:space="preserve"> <value>Unable to deserialize string to {0}</value> </data> + <data name="StringToStructBaseType_ParseLiteral_UnableToCoerceOutputValue" xml:space="preserve"> + <value>Unable to serialize {0} to string</value> + </data> <data name="DateTimeZoneType_Description" xml:space="preserve"> <value>Represents a time zone - a mapping between UTC and local time. A time zone maps UTC instants to local times - or, equivalently, to the offset from UTC at any particular instant. diff --git a/src/HotChocolate/Core/src/Types.NodaTime/StringToClassBaseType.cs b/src/HotChocolate/Core/src/Types.NodaTime/StringToClassBaseType.cs new file mode 100644 index 00000000000..764eebf3690 --- /dev/null +++ b/src/HotChocolate/Core/src/Types.NodaTime/StringToClassBaseType.cs @@ -0,0 +1,119 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using HotChocolate.Features; +using HotChocolate.Language; +using HotChocolate.Text.Json; +using static HotChocolate.Types.NodaTime.Properties.NodaTimeResources; + +namespace HotChocolate.Types.NodaTime; + +/// <summary> +/// This base class provides serialization functionality for noda time scalars +/// that have a <see cref="string"/> result value and a class runtime value. +/// </summary> +/// <typeparam name="TRuntimeType"> +/// The runtime type. +/// </typeparam> +public abstract class StringToClassBaseType<TRuntimeType> + : ScalarType<TRuntimeType, StringValueNode> + where TRuntimeType : class +{ + /// <summary> + /// Initializes a new instance of <see cref="StringToClassBaseType{TRuntimeType}"/>. + /// </summary> + /// <param name="name"> + /// The name of the scalar. + /// </param> + protected StringToClassBaseType(string name) + : base(name, BindingBehavior.Implicit) + { + } + + /// <inheritdoc /> + public override object CoerceInputLiteral(StringValueNode valueLiteral) + { + if (TryCoerceRuntimeValue(valueLiteral.Value, out var runtimeValue)) + { + return runtimeValue; + } + + throw new LeafCoercionException( + string.Format(StringToClassBaseType_ParseLiteral_UnableToDeserializeString, Name), + this); + } + + /// <inheritdoc /> + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + { + if (inputValue.ValueKind is JsonValueKind.String + && TryCoerceRuntimeValue(inputValue.GetString()!, out var runtimeValue)) + { + return runtimeValue; + } + + throw new LeafCoercionException( + string.Format(StringToClassBaseType_ParseLiteral_UnableToDeserializeString, Name), + this); + } + + /// <inheritdoc /> + public override void CoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue) + { + if (TryCoerceOutputValue(runtimeValue, out var value)) + { + resultValue.SetStringValue(value); + return; + } + + throw new LeafCoercionException( + string.Format(StringToClassBaseType_ParseLiteral_UnableToCoerceOutputValue, Name), + this); + } + + /// <inheritdoc /> + public override IValueNode ValueToLiteral(TRuntimeType runtimeValue) + { + if (TryCoerceOutputValue(runtimeValue, out var value)) + { + return new StringValueNode(value); + } + + throw new LeafCoercionException( + string.Format(StringToClassBaseType_ParseLiteral_UnableToCoerceOutputValue, Name), + this); + } + + /// <summary> + /// Attempts to coerce a string input value to the runtime type. + /// </summary> + /// <param name="resultValue"> + /// The string value to coerce. + /// </param> + /// <param name="runtimeValue"> + /// When this method returns, contains the coerced runtime value if the conversion succeeded, + /// or null if the conversion failed. + /// </param> + /// <returns> + /// <c>true</c> if the coercion was successful; otherwise, <c>false</c>. + /// </returns> + protected abstract bool TryCoerceRuntimeValue( + string resultValue, + [NotNullWhen(true)] out TRuntimeType? runtimeValue); + + /// <summary> + /// Attempts to coerce a runtime value to a string output value. + /// </summary> + /// <param name="runtimeValue"> + /// The runtime value to coerce. + /// </param> + /// <param name="resultValue"> + /// When this method returns, contains the coerced string value if the conversion succeeded, + /// or null if the conversion failed. + /// </param> + /// <returns> + /// <c>true</c> if the coercion was successful; otherwise, <c>false</c>. + /// </returns> + protected abstract bool TryCoerceOutputValue( + TRuntimeType runtimeValue, + [NotNullWhen(true)] out string? resultValue); +} diff --git a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToStructBaseType.cs b/src/HotChocolate/Core/src/Types.NodaTime/StringToStructBaseType.cs similarity index 56% rename from src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToStructBaseType.cs rename to src/HotChocolate/Core/src/Types.NodaTime/StringToStructBaseType.cs index 565bccc72c5..4ed3d295e68 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToStructBaseType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/StringToStructBaseType.cs @@ -1,5 +1,8 @@ using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime.Text; using static HotChocolate.Types.NodaTime.Properties.NodaTimeResources; @@ -28,11 +31,11 @@ protected StringToStructBaseType(string name) } /// <inheritdoc /> - protected override TRuntimeType ParseLiteral(StringValueNode literal) + public override object CoerceInputLiteral(StringValueNode valueLiteral) { - if (TryDeserialize(literal.Value, out var value)) + if (TryCoerceRuntimeValue(valueLiteral.Value, out var runtimeValue)) { - return value.Value; + return runtimeValue.Value; } throw new LeafCoercionException( @@ -41,27 +44,12 @@ protected override TRuntimeType ParseLiteral(StringValueNode literal) } /// <inheritdoc /> - protected override StringValueNode ParseValue(TRuntimeType value) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - return new(CoerceOutputValue(value)); - } - - /// <inheritdoc /> - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is string s) - { - return new StringValueNode(s); - } - - if (resultValue is TRuntimeType v) + if (inputValue.ValueKind is JsonValueKind.String + && TryCoerceRuntimeValue(inputValue.GetString()!, out var runtimeValue)) { - return ParseValue(v); + return runtimeValue.Value; } throw new LeafCoercionException( @@ -70,71 +58,66 @@ public override IValueNode ParseResult(object? resultValue) } /// <inheritdoc /> - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + public override void CoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue) { - if (runtimeValue is null) + if (TryCoerceOutputValue(runtimeValue, out var value)) { - resultValue = null; - return true; + resultValue.SetStringValue(value); + return; } - if (runtimeValue is TRuntimeType dt) - { - resultValue = CoerceOutputValue(dt); - return true; - } - - resultValue = null; - return false; + throw new LeafCoercionException( + string.Format(StringToStructBaseType_ParseLiteral_UnableToCoerceOutputValue, Name), + this); } - /// <summary> - /// Serializes the .net runtime representation to the serialized result representation. - /// </summary> - /// <param name="runtimeValue"> - /// The .net value representation. - /// </param> - /// <returns> - /// Returns the serialized result value. - /// </returns> - protected abstract string CoerceOutputValue(TRuntimeType runtimeValue); - /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + public override IValueNode ValueToLiteral(TRuntimeType runtimeValue) { - if (resultValue is null) + if (TryCoerceOutputValue(runtimeValue, out var value)) { - runtimeValue = null; - return true; + return new StringValueNode(value); } - if (resultValue is string s && TryDeserialize(s, out var val)) - { - runtimeValue = val; - return true; - } - - runtimeValue = null; - return false; + throw new LeafCoercionException( + string.Format(StringToStructBaseType_ParseLiteral_UnableToCoerceOutputValue, Name), + this); } /// <summary> - /// Tries to deserializes the value from the output format to the .net - /// runtime representation. + /// Attempts to coerce a string input value to the runtime type. /// </summary> /// <param name="resultValue"> - /// The serialized result value. + /// The string value to coerce. /// </param> /// <param name="runtimeValue"> - /// The .net runtime representation. + /// When this method returns, contains the coerced runtime value if the conversion succeeded, + /// or the default value if the conversion failed. /// </param> /// <returns> - /// <c>true</c> if the serialized value was correctly deserialized; otherwise, <c>false</c>. + /// <c>true</c> if the coercion was successful; otherwise, <c>false</c>. /// </returns> - protected abstract bool TryDeserialize( + protected abstract bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out TRuntimeType? runtimeValue); + /// <summary> + /// Attempts to coerce a runtime value to a string output value. + /// </summary> + /// <param name="runtimeValue"> + /// The runtime value to coerce. + /// </param> + /// <param name="resultValue"> + /// When this method returns, contains the coerced string value if the conversion succeeded, + /// or null if the conversion failed. + /// </param> + /// <returns> + /// <c>true</c> if the coercion was successful; otherwise, <c>false</c>. + /// </returns> + protected abstract bool TryCoerceOutputValue( + TRuntimeType runtimeValue, + [NotNullWhen(true)] out string? resultValue); + protected string CreateDescription( IPattern<TRuntimeType>[] allowedPatterns, string description, diff --git a/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs index 17e27b31935..553ce94d7f6 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs @@ -37,7 +37,6 @@ public ZonedDateTimeType(params IPattern<ZonedDateTime>[] allowedPatterns) allowedPatterns, NodaTimeResources.ZonedDateTimeType_Description, NodaTimeResources.ZonedDateTimeType_Description_Extended); - SerializationType = ScalarSerializationType.String; } /// <summary> @@ -49,16 +48,20 @@ public ZonedDateTimeType() : this(s_default) } /// <inheritdoc /> - protected override string CoerceOutputValue(ZonedDateTime runtimeValue) - => _serializationPattern - .Format(runtimeValue); - - /// <inheritdoc /> - protected override bool TryDeserialize( + protected override bool TryCoerceRuntimeValue( string resultValue, [NotNullWhen(true)] out ZonedDateTime? runtimeValue) => _allowedPatterns.TryParse(resultValue, out runtimeValue); + /// <inheritdoc /> + protected override bool TryCoerceOutputValue( + ZonedDateTime runtimeValue, + [NotNullWhen(true)] out string? resultValue) + { + resultValue = _serializationPattern.Format(runtimeValue); + return true; + } + protected override Dictionary<IPattern<ZonedDateTime>, string> PatternMap => new() { { ZonedDateTimePattern.GeneralFormatOnlyIso, "YYYY-MM-DDThh:mm:ss z (±hh:mm)" }, From 11cf079bd1fd9d5259e8b97ec7e805dad103cbfc Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 6 Jan 2026 14:57:28 +0100 Subject: [PATCH 060/144] feat: Refactor scalar types to improve input/output coercion and error handling --- .../FederationTypeInterceptor.cs | 2 +- .../ApolloFederation/Types/FieldSetType.cs | 88 +++---------- .../src/ApolloFederation/Types/PolicyType.cs | 26 +++- .../src/ApolloFederation/Types/ScopeType.cs | 26 +++- .../src/ApolloFederation/Types/_AnyType.cs | 123 ++++++++---------- 5 files changed, 110 insertions(+), 155 deletions(-) diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/FederationTypeInterceptor.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/FederationTypeInterceptor.cs index 8700fd01215..5f5d8605068 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/FederationTypeInterceptor.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/FederationTypeInterceptor.cs @@ -159,7 +159,7 @@ public override void OnAfterCompleteName( } } - var hasRuntimeType = (IHasRuntimeType)configuration; + var hasRuntimeType = (IRuntimeTypeProvider)configuration; var type = hasRuntimeType.RuntimeType; if (type != typeof(object) diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs index babcb23d4e3..6fb6461e966 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs @@ -1,6 +1,9 @@ +using System.Text.Json; using HotChocolate.ApolloFederation.Properties; +using HotChocolate.Features; using HotChocolate.Language; -using static HotChocolate.ApolloFederation.ThrowHelper; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.ApolloFederation.Types; @@ -39,96 +42,41 @@ public FieldSetType(string name, BindingBehavior bind = BindingBehavior.Explicit Description = FederationResources.FieldsetType_Description; } - /// <inheritdoc /> - protected override SelectionSetNode ParseLiteral(StringValueNode valueSyntax) + public override object CoerceInputLiteral(StringValueNode valueLiteral) { try { - return ParseSelectionSet(valueSyntax.Value); + return ParseSelectionSet(valueLiteral.Value); } catch (SyntaxException) { - throw FieldSet_InvalidFormat(this); + throw ThrowHelper.FieldSet_InvalidFormat(this); } } - /// <inheritdoc /> - protected override StringValueNode ParseValue(SelectionSetNode runtimeValue) - => new(SerializeSelectionSet(runtimeValue)); - - /// <inheritdoc /> - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is string s) - { - return new StringValueNode(s); - } - - if (resultValue is SelectionSetNode selectionSet) - { - return new StringValueNode(SerializeSelectionSet(selectionSet)); - } - - throw Scalar_CannotParseValue(this, resultValue.GetType()); - } - - /// <inheritdoc /> - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) - { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is SelectionSetNode selectionSet) - { - resultValue = SerializeSelectionSet(selectionSet); - return true; - } - - resultValue = null; - return false; - } - - /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is SelectionSetNode selectionSet) - { - runtimeValue = selectionSet; - return true; - } - - if (resultValue is string serializedSelectionSet) + if (inputValue.ValueKind is JsonValueKind.String) { try { - runtimeValue = ParseSelectionSet(serializedSelectionSet); - return true; + return ParseSelectionSet(inputValue.GetString()!); } catch (SyntaxException) { - runtimeValue = null; - return false; + throw ThrowHelper.FieldSet_InvalidFormat(this); } } - runtimeValue = null; - return false; + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } + public override void CoerceOutputValue(SelectionSetNode runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(SerializeSelectionSet(runtimeValue)); + + public override IValueNode ValueToLiteral(SelectionSetNode runtimeValue) + => new StringValueNode(SerializeSelectionSet(runtimeValue)); + internal static SelectionSetNode ParseSelectionSet(string s) => Utf8GraphQLParser.Syntax.ParseSelectionSet($"{{{s}}}"); diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs index bc3c331a409..38ca93c27ee 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs @@ -1,5 +1,9 @@ +using System.Text.Json; using HotChocolate.ApolloFederation.Properties; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.ApolloFederation.Types; @@ -30,12 +34,22 @@ public PolicyType(string name, BindingBehavior bind = BindingBehavior.Explicit) Description = FederationResources.PolicyType_Description; } - protected override Policy ParseLiteral(StringValueNode valueSyntax) - => new(valueSyntax.Value); + public override object CoerceInputLiteral(StringValueNode valueLiteral) + => new Policy(valueLiteral.Value); - public override IValueNode ParseResult(object? resultValue) - => CoerceInputValue(resultValue); + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + { + if (inputValue.ValueKind is JsonValueKind.String) + { + return new Policy(inputValue.GetString()!); + } + + throw Scalar_Cannot_CoerceInputValue(this, inputValue); + } + + public override void CoerceOutputValue(Policy runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue.Value); - protected override StringValueNode ParseValue(Policy runtimeValue) - => new(runtimeValue.Value); + public override IValueNode ValueToLiteral(Policy runtimeValue) + => new StringValueNode(runtimeValue.Value); } diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs index fd89000a6bc..b134c8626b7 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs @@ -1,5 +1,9 @@ +using System.Text.Json; using HotChocolate.ApolloFederation.Properties; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.ApolloFederation.Types; @@ -30,12 +34,22 @@ public ScopeType(string name, BindingBehavior bind = BindingBehavior.Explicit) Description = FederationResources.ScopeType_Description; } - protected override Scope ParseLiteral(StringValueNode valueSyntax) - => new(valueSyntax.Value); + public override object CoerceInputLiteral(StringValueNode valueLiteral) + => new Scope(valueLiteral.Value); - public override IValueNode ParseResult(object? resultValue) - => CoerceInputValue(resultValue); + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + { + if (inputValue.ValueKind is JsonValueKind.String) + { + return new Scope(inputValue.GetString()!); + } + + throw Scalar_Cannot_CoerceInputValue(this, inputValue); + } + + public override void CoerceOutputValue(Scope runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue.Value); - protected override StringValueNode ParseValue(Scope runtimeValue) - => new(runtimeValue.Value); + public override IValueNode ValueToLiteral(Scope runtimeValue) + => new StringValueNode(runtimeValue.Value); } diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs index 0c64385f22f..53480f64510 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs @@ -1,8 +1,12 @@ +using System.Text.Json; using HotChocolate.ApolloFederation.Properties; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Utilities; using static HotChocolate.ApolloFederation.FederationTypeNames; using static HotChocolate.ApolloFederation.ThrowHelper; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.ApolloFederation.Types; @@ -38,90 +42,65 @@ public _AnyType(string name, BindingBehavior bind = BindingBehavior.Explicit) Description = FederationResources.Any_Description; } - /// <inheritdoc /> - protected override bool IsInstanceOfType(ObjectValueNode valueSyntax) - { - return valueSyntax.Fields.Any(field => field.Name.Value == TypeNameField); - } - - /// <inheritdoc /> - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is Representation representation) - { - return ParseValue(representation); - } - - throw Scalar_CannotParseValue(this, resultValue.GetType()); - } - - /// <inheritdoc /> - protected override Representation ParseLiteral(ObjectValueNode valueSyntax) + /// <summary> + /// Parses a GraphQL object literal into a <see cref="Representation"/>. + /// The object must contain a <c>__typename</c> field with a string value. + /// </summary> + /// <param name="valueLiteral">The GraphQL object value node to parse.</param> + /// <returns>A <see cref="Representation"/> containing the typename and object data.</returns> + /// <exception cref="GraphQLException">Thrown when the object is missing the <c>__typename</c> field.</exception> + public override object CoerceInputLiteral(ObjectValueNode valueLiteral) { - if (valueSyntax.Fields.FirstOrDefault( - field => field.Name.Value.EqualsOrdinal("__typename")) is { Value: StringValueNode s }) + if (valueLiteral.Fields.FirstOrDefault( + field => field.Name.Value.EqualsOrdinal(TypeNameField)) is { Value: StringValueNode s }) { - return new Representation(s.Value, valueSyntax); + return new Representation(s.Value, valueLiteral); } throw Any_InvalidFormat(this); } - /// <inheritdoc /> - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + /// <summary> + /// Parses a JSON object into a <see cref="Representation"/>. + /// The object must contain a <c>__typename</c> field with a string value. + /// </summary> + /// <param name="inputValue">The JSON element to parse.</param> + /// <param name="context">The feature provider context.</param> + /// <returns>A <see cref="Representation"/> containing the typename and object data.</returns> + /// <exception cref="GraphQLException"> + /// Thrown when the input is not an object or is missing the <c>__typename</c> field. + /// </exception> + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is Representation) + if (inputValue.ValueKind is JsonValueKind.Object + && inputValue.TryGetProperty(TypeNameField, out var typeNameElement) + && typeNameElement.ValueKind is JsonValueKind.String) { - resultValue = CoerceInputValue(runtimeValue); - return true; + var typeName = typeNameElement.GetString()!; + var parser = new JsonValueParser(); + var objectNode = (ObjectValueNode)parser.Parse(inputValue); + return new Representation(typeName, objectNode); } - resultValue = null; - return false; - } - - /// <inheritdoc /> - protected override ObjectValueNode ParseValue(Representation runtimeValue) - { - return new ObjectValueNode(runtimeValue.Data.Fields); + throw Any_InvalidFormat(this); } - /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is ObjectValueNode ovn) - { - var typeField = ovn.Fields.SingleOrDefault( - field => field.Name.Value.EqualsOrdinal(TypeNameField)); - - if (typeField?.Value is StringValueNode svn) - { - runtimeValue = new Representation(svn.Value, ovn); - return true; - } - - runtimeValue = null; - return false; - } + /// <summary> + /// This operation is not supported. The _Any scalar is an input-only type used for + /// receiving entity representations from federated services. + /// </summary> + /// <param name="runtimeValue">The runtime value (not used).</param> + /// <param name="resultValue">The result element (not used).</param> + /// <exception cref="NotSupportedException">Always thrown as output coercion is not supported.</exception> + public override void CoerceOutputValue(Representation runtimeValue, ResultElement resultValue) + => throw new NotSupportedException( + "The _Any scalar is an input-only type and does not support output coercion."); - runtimeValue = null; - return false; - } + /// <summary> + /// Converts a <see cref="Representation"/> back to a GraphQL object value node. + /// </summary> + /// <param name="runtimeValue">The representation to convert.</param> + /// <returns>An <see cref="ObjectValueNode"/> containing the representation data.</returns> + public override IValueNode ValueToLiteral(Representation runtimeValue) + => new ObjectValueNode(runtimeValue.Data.Fields); } From da6b9d38965b0c7f903edf81b05578eeb7b0c4ce Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 6 Jan 2026 14:57:36 +0100 Subject: [PATCH 061/144] feat: Replace IHasRuntimeType with IRuntimeTypeProvider in filter and sorting interfaces --- src/HotChocolate/Data/src/Data/Filters/Fields/IAndField.cs | 2 +- src/HotChocolate/Data/src/Data/Filters/Fields/IOrField.cs | 2 +- .../Data/src/Data/Filters/FilterInputTypeDescriptor.cs | 2 +- .../Data/src/Data/Filters/IFilterInputTypeDescriptor.cs | 2 +- src/HotChocolate/Data/src/Data/Sorting/Fields/ISortField.cs | 2 +- .../Data/src/Data/Sorting/ISortInputTypeDescriptor.cs | 2 +- .../Data/src/Data/Sorting/SortInputTypeDescriptor.cs | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/HotChocolate/Data/src/Data/Filters/Fields/IAndField.cs b/src/HotChocolate/Data/src/Data/Filters/Fields/IAndField.cs index f088b60c5a2..e0a62522f96 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Fields/IAndField.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Fields/IAndField.cs @@ -4,7 +4,7 @@ namespace HotChocolate.Data.Filters; public interface IAndField : IInputValueDefinition - , IHasRuntimeType + , IRuntimeTypeProvider { IFilterInputType DeclaringType { get; } } diff --git a/src/HotChocolate/Data/src/Data/Filters/Fields/IOrField.cs b/src/HotChocolate/Data/src/Data/Filters/Fields/IOrField.cs index ae97638ba4b..f50f4713b4b 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Fields/IOrField.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Fields/IOrField.cs @@ -4,7 +4,7 @@ namespace HotChocolate.Data.Filters; public interface IOrField : IInputValueDefinition - , IHasRuntimeType + , IRuntimeTypeProvider { IFilterInputType DeclaringType { get; } } diff --git a/src/HotChocolate/Data/src/Data/Filters/FilterInputTypeDescriptor.cs b/src/HotChocolate/Data/src/Data/Filters/FilterInputTypeDescriptor.cs index 05768c311c3..5e1ba897088 100644 --- a/src/HotChocolate/Data/src/Data/Filters/FilterInputTypeDescriptor.cs +++ b/src/HotChocolate/Data/src/Data/Filters/FilterInputTypeDescriptor.cs @@ -59,7 +59,7 @@ protected FilterInputTypeDescriptor( protected BindableList<FilterOperationFieldDescriptor> Operations { get; } = []; - Type IHasRuntimeType.RuntimeType => Configuration.RuntimeType; + Type IRuntimeTypeProvider.RuntimeType => Configuration.RuntimeType; protected override void OnCreateConfiguration(FilterInputTypeConfiguration configuration) { diff --git a/src/HotChocolate/Data/src/Data/Filters/IFilterInputTypeDescriptor.cs b/src/HotChocolate/Data/src/Data/Filters/IFilterInputTypeDescriptor.cs index 0ef51d3b5f5..e91e512c24e 100644 --- a/src/HotChocolate/Data/src/Data/Filters/IFilterInputTypeDescriptor.cs +++ b/src/HotChocolate/Data/src/Data/Filters/IFilterInputTypeDescriptor.cs @@ -9,7 +9,7 @@ namespace HotChocolate.Data.Filters; public interface IFilterInputTypeDescriptor : IDescriptor<FilterInputTypeConfiguration> , IFluent - , IHasRuntimeType + , IRuntimeTypeProvider { /// <summary> /// Defines the name of the <see cref="FilterInputType{T}"/>. diff --git a/src/HotChocolate/Data/src/Data/Sorting/Fields/ISortField.cs b/src/HotChocolate/Data/src/Data/Sorting/Fields/ISortField.cs index 10e61fa7662..4ebf32cd701 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Fields/ISortField.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Fields/ISortField.cs @@ -6,7 +6,7 @@ namespace HotChocolate.Data.Sorting; public interface ISortField : IInputValueDefinition - , IHasRuntimeType + , IRuntimeTypeProvider { /// <summary> /// The type which declares this field. diff --git a/src/HotChocolate/Data/src/Data/Sorting/ISortInputTypeDescriptor.cs b/src/HotChocolate/Data/src/Data/Sorting/ISortInputTypeDescriptor.cs index bbdfae426ec..2c827db60fc 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/ISortInputTypeDescriptor.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/ISortInputTypeDescriptor.cs @@ -8,7 +8,7 @@ namespace HotChocolate.Data.Sorting; /// </summary> public interface ISortInputTypeDescriptor : IDescriptor<SortInputTypeConfiguration> - , IHasRuntimeType + , IRuntimeTypeProvider , IFluent { /// <summary> diff --git a/src/HotChocolate/Data/src/Data/Sorting/SortInputTypeDescriptor.cs b/src/HotChocolate/Data/src/Data/Sorting/SortInputTypeDescriptor.cs index 67d72aab859..6437ce013ae 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/SortInputTypeDescriptor.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/SortInputTypeDescriptor.cs @@ -56,7 +56,7 @@ protected SortInputTypeDescriptor( protected BindableList<SortFieldDescriptor> Fields { get; } = []; - Type IHasRuntimeType.RuntimeType => Configuration.RuntimeType; + Type IRuntimeTypeProvider.RuntimeType => Configuration.RuntimeType; protected override void OnCreateConfiguration( SortInputTypeConfiguration configuration) From a6b2098452d5076e8b698f4c3b59bcfcf50d509d Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 6 Jan 2026 15:07:17 +0100 Subject: [PATCH 062/144] feat: Update ActivityEnricher to use JsonDocument for request extensions and variables --- .../src/Diagnostics/ActivityEnricher.cs | 60 ++++--------------- 1 file changed, 12 insertions(+), 48 deletions(-) diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs index 3db175520fb..495add03c8e 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs @@ -255,14 +255,14 @@ protected virtual void EnrichBatchVariables( protected virtual void EnrichRequestExtensions( HttpContext context, GraphQLRequest request, - IReadOnlyDictionary<string, object?> extensions, + JsonDocument extensions, Activity activity) { try { activity.SetTag( "graphql.http.request.extensions", - JsonSerializer.Serialize(extensions)); + extensions.RootElement.ToString()); } catch { @@ -273,7 +273,7 @@ protected virtual void EnrichRequestExtensions( protected virtual void EnrichBatchExtensions( HttpContext context, GraphQLRequest request, - IReadOnlyDictionary<string, object?> extensions, + JsonDocument extensions, int index, Activity activity) { @@ -281,7 +281,7 @@ protected virtual void EnrichBatchExtensions( { activity.SetTag( $"graphql.http.request[{index}].extensions", - JsonSerializer.Serialize(extensions)); + extensions.RootElement.ToString()); } catch { @@ -346,11 +346,10 @@ public virtual void EnrichExecuteRequest(RequestContext context, Activity activi if (context.Result is OperationResult result) { - var errorCount = result.Errors?.Count ?? 0; + var errorCount = result.Errors.Count; activity.SetTag("graphql.errors.count", errorCount); } } - protected virtual string? CreateOperationDisplayName(RequestContext context, Operation? operation) { if (operation is null) @@ -621,57 +620,22 @@ protected virtual void EnrichError(IError error, Activity activity) activity.AddEvent(new ActivityEvent(AttributeExceptionEventName, default, tags)); } - private static ISyntaxNode CreateVariablesNode( - IReadOnlyList<IReadOnlyDictionary<string, object?>>? variableSet) + private static ISyntaxNode CreateVariablesNode(JsonDocument? variables) { - if (variableSet is null or { Count: 0 }) + if (variables is null) { return NullValueNode.Default; } - if (variableSet.Count == 1) - { - var variables = variableSet[0]; - var variablesCount = variables.Count; - var fields = new ObjectFieldNode[variablesCount]; - var index = 0; - - foreach (var (name, value) in variables) - { - // since we are in the HTTP context here we know that it will always be an IValueNode. - var valueNode = value is null ? NullValueNode.Default : (IValueNode)value; - fields[index++] = new ObjectFieldNode(name, valueNode); - } - - return new ObjectValueNode(fields); - } + var root = variables.RootElement; - if (variableSet.Count > 0) + if (root.ValueKind is not (JsonValueKind.Object or JsonValueKind.Array)) { - var variableSetCount = variableSet.Count; - var items = new IValueNode[variableSetCount]; - - for (var i = 0; i < variableSetCount; i++) - { - var variables = variableSet[i]; - var variablesCount = variables.Count; - var fields = new ObjectFieldNode[variablesCount]; - var index = 0; - - foreach (var (name, value) in variables) - { - // since we are in the HTTP context here we know that it will always be an IValueNode. - var valueNode = value is null ? NullValueNode.Default : (IValueNode)value; - fields[index++] = new ObjectFieldNode(name, valueNode); - } - - items[i] = new ObjectValueNode(fields); - } - - return new ListValueNode(items); + throw new InvalidOperationException(); } - throw new InvalidOperationException(); + var parser = new JsonValueParser(); + return parser.Parse(root); } } From 5016bdb834eaa752ab2670b1eed159fd4e6ec410 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 6 Jan 2026 22:25:14 +0100 Subject: [PATCH 063/144] refactor: Rename parameter 'literal' to 'valueLiteral' in IsValueCompatible methods across multiple scalar types --- .../Handlers/CallToolHandler.cs | 13 +- .../ApolloFederation.Tests/_AnyTypeTests.cs | 57 +--- .../Types/IScalarTypeDefinition.cs | 4 +- .../Core/src/Types.Scalars/HslaType.cs | 8 +- .../Core/src/Types.Scalars/LongitudeType.cs | 4 +- .../Core/src/Types.Scalars/RegexType.cs | 12 + .../Core/src/Types/Types/Scalars/AnyType.cs | 4 +- .../Core/src/Types/Types/Scalars/IdType.cs | 4 +- .../src/Types/Types/Scalars/ScalarType~2.cs | 261 ++++++++++++------ .../ScalarExecutionErrorTests.cs | 8 +- .../Configuration/SchemaTypeDiscoveryTests.cs | 2 +- .../Types/Scalars/ScalarBindingTests.cs | 4 +- .../Validation.Tests/Types/InvalidScalar.cs | 2 +- .../FusionScalarTypeDefinition.cs | 6 +- .../InaccessibleTests.cs | 4 +- .../MongoDb/src/Types/BsonType.cs | 6 +- .../MutableScalarTypeDefinition.cs | 4 +- .../src/Types/GeoJsonCoordinatesType.cs | 4 +- .../Spatial/src/Types/GeoJsonPositionType.cs | 4 +- .../Spatial/src/Types/GeometryType.cs | 4 +- 20 files changed, 246 insertions(+), 169 deletions(-) diff --git a/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs b/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs index d630476c68b..122d15311d5 100644 --- a/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs +++ b/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Handlers/CallToolHandler.cs @@ -1,3 +1,6 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using System.Security.Claims; using System.Text; using System.Text.Json.Nodes; @@ -14,6 +17,10 @@ namespace HotChocolate.Adapters.Mcp.Handlers; internal static class CallToolHandler { +#if !NET9_0_OR_GREATER + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public static async ValueTask<CallToolResult> HandleAsync( RequestContext<CallToolRequestParams> context, CancellationToken cancellationToken) @@ -63,10 +70,14 @@ public static async ValueTask<CallToolResult> HandleAsync( // serialized JSON can be returned in a TextContent block.) Content = [new TextContentBlock { Text = jsonOperationResult }], StructuredContent = JsonNode.Parse(jsonOperationResult), - IsError = operationResult.Errors?.Any() + IsError = !operationResult.Errors.IsEmpty }; } +#if !NET9_0_OR_GREATER + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif private static OperationRequestBuilder CreateRequestBuilder(HttpContext httpContext) { var requestBuilder = new OperationRequestBuilder(); diff --git a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs index f2722ea7256..7b20c9de258 100644 --- a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs +++ b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs @@ -18,7 +18,7 @@ public void Ensure_Type_Name_Is_Correct() } [Fact] - public void Deserialize() + public void CoerceInputLiteral() { // arrange var type = new AnyType(); @@ -29,7 +29,7 @@ public void Deserialize() ); // act - var representationObject = type.Deserialize(serialized); + var representationObject = type.CoerceInputLiteral(serialized); // assert var representation = Assert.IsType<Representation>(representationObject); @@ -70,64 +70,19 @@ public void Deserialize() } [Fact] - public void Deserialize_Invalid_Format() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new AnyType(); var serialized = new ObjectValueNode(); // act - void Action() => type.Deserialize(serialized); + void Action() => type.CoerceInputLiteral(serialized); // assert Assert.Throws<LeafCoercionException>(Action); } - [Fact] - public void TryDeserialize() - { - // arrange - var type = new AnyType(); - var serialized = new ObjectValueNode( - new ObjectFieldNode(AnyType.TypeNameField, "test"), - new ObjectFieldNode("foo", "bar")); - - // act - var success = type.TryDeserialize(serialized, out var representation); - - // assert - Assert.True(success); - Assert.IsType<Representation>(representation); - } - - [Fact] - public void TryDeserialize_Null() - { - // arrange - var type = new AnyType(); - - // act - var success = type.TryDeserialize(null, out var representation); - - // assert - Assert.True(success); - Assert.Null(representation); - } - - [Fact] - public void TryDeserialize_Invalid_Type() - { - // arrange - var type = new AnyType(); - const int serialized = 1; - - // act - var success = type.TryDeserialize(serialized, out var representation); - - // assert - Assert.False(success); - Assert.Null(representation); - } [Fact] public void Serialize() @@ -144,10 +99,12 @@ public void Serialize() "bar" ) ); + var representation = new Representation("test", objectValueNode); + // act - var serialized = (ISyntaxNode)type.Serialize(representation)!; + var serialized = type.CoerceOutputValue(representation)!; // assert Assert.Equal( diff --git a/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs b/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs index 7b69a7c29dc..157995f4b62 100644 --- a/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs +++ b/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs @@ -29,9 +29,9 @@ public interface IScalarTypeDefinition /// <summary> /// Checks if the value is an instance of this type. /// </summary> - /// <param name="value">The value to check.</param> + /// <param name="valueLiteral">The value to check.</param> /// <returns> /// <c>true</c> if the value is an instance of this type; otherwise, <c>false</c>. /// </returns> - bool IsValueCompatible(IValueNode value); + bool IsValueCompatible(IValueNode valueLiteral); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs b/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs index ae1c9dbdbdc..bb2486ad3b1 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs @@ -43,13 +43,9 @@ public HslaType() /// <inheritdoc /> protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - return ThrowHelper.HslaType_ParseLiteral_IsInvalid(this); - } + => ThrowHelper.HslaType_ParseLiteral_IsInvalid(this); /// <inheritdoc /> protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - return ThrowHelper.HslaType_ParseValue_IsInvalid(this); - } + => ThrowHelper.HslaType_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs b/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs index f327853435b..0f44a6d3adc 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs @@ -35,8 +35,8 @@ public LongitudeType() } /// <inheritdoc /> - protected override bool IsInstanceOfType(double runtimeValue) => - Longitude.IsValid(runtimeValue); + public override bool IsInstanceOfType(object runtimeValue) + => runtimeValue is double d && Longitude.IsValid(d); /// <inheritdoc /> public override IValueNode ParseResult(object? resultValue) diff --git a/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs b/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs index c353f80e68f..56c7c48ff58 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using System.Text.RegularExpressions; using HotChocolate.Language; @@ -54,6 +55,17 @@ protected override bool IsInstanceOfType(string runtimeValue) protected override bool IsInstanceOfType(StringValueNode valueSyntax) => _validationRegex.IsMatch(valueSyntax.Value); + public override bool IsValueCompatible(IValueNode valueLiteral) + { + return base.IsValueCompatible(valueLiteral); + } + + + public override bool IsValueCompatible(JsonElement inputValue) + { + return base.IsValueCompatible(inputValue); + } + /// <inheritdoc /> public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs index d57858920bd..51e81291427 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs @@ -34,9 +34,9 @@ public AnyType() : this(ScalarNames.Any) public override ScalarSerializationType SerializationType => ScalarSerializationType.Any; - public override bool IsValueCompatible(IValueNode literal) + public override bool IsValueCompatible(IValueNode valueLiteral) { - switch (literal) + switch (valueLiteral) { case StringValueNode: case IntValueNode: diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs index e87af981056..a5d5790bb55 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs @@ -54,8 +54,8 @@ public override ScalarSerializationType SerializationType => ScalarSerializationType.String | ScalarSerializationType.Int; /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode literal) - => literal is StringValueNode or IntValueNode; + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is StringValueNode or IntValueNode; /// <inheritdoc /> public override bool IsValueCompatible(JsonElement inputValue) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs index 07dc0a966c7..f2e79a7ac6b 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs @@ -1,5 +1,7 @@ using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -16,10 +18,13 @@ namespace HotChocolate.Types; /// The GraphQL literal (AST value node) type that this scalar accepts. /// </typeparam> public abstract class ScalarType<TRuntimeType, TLiteral> - : ScalarType<TRuntimeType> + : ScalarType where TRuntimeType : notnull where TLiteral : IValueNode { + // ReSharper disable once StaticMemberInGenericType + private static readonly ScalarSerializationType s_serializationType = DetermineSerializationType(); + /// <inheritdoc /> protected ScalarType(string name, BindingBehavior bind = BindingBehavior.Explicit) : base(name, bind) @@ -27,126 +32,222 @@ protected ScalarType(string name, BindingBehavior bind = BindingBehavior.Explici } /// <inheritdoc /> - public override ScalarSerializationType SerializationType - { - get - { - if (typeof(TLiteral) == typeof(StringValueNode)) - { - return ScalarSerializationType.String; - } - - if (typeof(TLiteral) == typeof(IntValueNode)) - { - return ScalarSerializationType.Int; - } - - if (typeof(TLiteral) == typeof(FloatValueNode)) - { - return ScalarSerializationType.Float; - } - - if (typeof(TLiteral) == typeof(BooleanValueNode)) - { - return ScalarSerializationType.Boolean; - } - - if (typeof(TLiteral) == typeof(ObjectValueNode)) - { - return ScalarSerializationType.Object; - } - - if (typeof(TLiteral) == typeof(ListValueNode)) - { - return ScalarSerializationType.List; - } - - throw new NotSupportedException(); - } - } + public sealed override Type RuntimeType => typeof(TRuntimeType); /// <inheritdoc /> - public sealed override bool IsValueCompatible(IValueNode valueSyntax) - => valueSyntax is TLiteral; + public sealed override ScalarSerializationType SerializationType => s_serializationType; /// <inheritdoc /> - public override bool IsValueCompatible(JsonElement inputValue) + public sealed override object CoerceInputLiteral(IValueNode valueLiteral) { - if (SerializationType == ScalarSerializationType.String - && inputValue.ValueKind == JsonValueKind.String) + if (valueLiteral is TLiteral literal) { - return true; + return OnCoerceInputLiteral(literal); } - if (SerializationType == ScalarSerializationType.Int - && inputValue.ValueKind == JsonValueKind.Number) - { - return true; - } + throw CreateCoerceInputLiteralError(valueLiteral); + } - if (SerializationType == ScalarSerializationType.Float - && inputValue.ValueKind == JsonValueKind.Number) - { - return true; - } + /// <summary> + /// Coerces a GraphQL literal into a runtime value. + /// </summary> + /// <param name="valueLiteral"> + /// The GraphQL literal to coerce. + /// </param> + /// <returns> + /// Returns the runtime value representation of type <typeparamref name="TRuntimeType"/>. + /// </returns> + /// <exception cref="LeafCoercionException"> + /// Unable to coerce the given <paramref name="valueLiteral"/> into a runtime value. + /// </exception> + protected abstract TRuntimeType OnCoerceInputLiteral(TLiteral valueLiteral); - if (SerializationType == ScalarSerializationType.Boolean - && (inputValue.ValueKind == JsonValueKind.True - || inputValue.ValueKind == JsonValueKind.False)) + /// <inheritdoc /> + public sealed override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + { + switch (s_serializationType) { - return true; + case ScalarSerializationType.String + when inputValue.ValueKind is not JsonValueKind.String: + case ScalarSerializationType.Int + when inputValue.ValueKind is not JsonValueKind.Number: + case ScalarSerializationType.Float + when inputValue.ValueKind is not JsonValueKind.Number: + case ScalarSerializationType.Boolean + when inputValue.ValueKind is not (JsonValueKind.True or JsonValueKind.False): + case ScalarSerializationType.Object + when inputValue.ValueKind is not JsonValueKind.Object: + case ScalarSerializationType.List + when inputValue.ValueKind is not JsonValueKind.Array: + throw CreateCoerceInputValueError(inputValue); + + default: + return OnCoerceInputValue(inputValue, context); } + } - if (SerializationType == ScalarSerializationType.Object - && inputValue.ValueKind == JsonValueKind.Object) - { - return true; - } + /// <summary> + /// Coerces a JSON input value into a runtime value. + /// </summary> + /// <param name="inputValue"> + /// The JSON element to coerce. + /// </param> + /// <param name="context"> + /// The feature provider context for accessing additional services. + /// </param> + /// <returns> + /// Returns the runtime value representation of type <typeparamref name="TRuntimeType"/>. + /// </returns> + /// <exception cref="LeafCoercionException"> + /// Unable to coerce the given <paramref name="inputValue"/> into a runtime value. + /// </exception> + /// <remarks> + /// This method is called after the JSON value kind has been validated to match the expected + /// serialization type. The implementation should parse the JSON value and convert it to the + /// runtime type. + /// </remarks> + protected abstract TRuntimeType OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context); - if (SerializationType == ScalarSerializationType.List - && inputValue.ValueKind == JsonValueKind.Array) + /// <inheritdoc /> + public sealed override void CoerceOutputValue(object runtimeValue, ResultElement resultValue) + { + if (runtimeValue is TRuntimeType castedRuntimeValue) { - return true; + OnCoerceOutputValue(castedRuntimeValue, resultValue); + return; } - return false; + throw CreateCoerceOutputValueError(runtimeValue); } + /// <summary> + /// Coerces a runtime value into a result value for serialization. + /// </summary> + /// <param name="runtimeValue"> + /// The runtime value to serialize. + /// </param> + /// <param name="resultValue"> + /// The result element to write the serialized value to. + /// </param> + /// <exception cref="LeafCoercionException"> + /// Unable to coerce the given <paramref name="runtimeValue"/> into a result value. + /// </exception> + /// <remarks> + /// This method is responsible for writing the runtime value to the result element using + /// appropriate methods like <c>SetStringValue</c>, <c>SetNumberValue</c>, etc. + /// </remarks> + protected abstract void OnCoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue); + /// <inheritdoc /> - public sealed override object CoerceInputLiteral(IValueNode valueLiteral) + public sealed override IValueNode ValueToLiteral(object runtimeValue) { - if (valueLiteral is TLiteral literal) + if (runtimeValue is TRuntimeType literal) { - return CoerceInputLiteral(literal); + return OnValueToLiteral(literal); } - throw CreateCoerceInputLiteralError(valueLiteral); + throw CreateValueToLiteralError(runtimeValue); } /// <summary> - /// Coerces a GraphQL literal into a runtime value. + /// Converts a runtime value into a GraphQL literal (AST value node). /// </summary> - /// <param name="valueLiteral"> - /// The GraphQL literal to coerce. + /// <param name="runtimeValue"> + /// The runtime value to convert. /// </param> /// <returns> - /// Returns the runtime value representation. + /// Returns the GraphQL literal representation of type <typeparamref name="TLiteral"/>. /// </returns> /// <exception cref="LeafCoercionException"> - /// Unable to coerce the given <paramref name="valueLiteral"/> into a runtime value. + /// Unable to convert the given <paramref name="runtimeValue"/> into a literal. /// </exception> - public abstract object CoerceInputLiteral(TLiteral valueLiteral); + /// <remarks> + /// This method is typically used for query rewriting and value serialization scenarios + /// where a runtime value needs to be represented as a GraphQL AST node. + /// </remarks> + protected abstract TLiteral OnValueToLiteral(TRuntimeType runtimeValue); /// <summary> /// Creates the exception to throw when <see cref="CoerceInputLiteral(IValueNode)"/> /// encounters an incompatible <see cref="IValueNode"/>. /// </summary> - /// <param name="valueSyntax"> + /// <param name="valueLiteral"> /// The value syntax that could not be coerced. /// </param> /// <returns> /// Returns the exception to throw. /// </returns> - protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => Scalar_Cannot_CoerceInputLiteral(this, valueSyntax); + protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueLiteral) + => Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); + + /// <summary> + /// Creates the exception to throw when <see cref="CoerceInputValue(JsonElement, IFeatureProvider)"/> + /// encounters an incompatible <see cref="JsonElement"/>. + /// </summary> + /// <param name="inputValue"> + /// The JSON value that could not be coerced. + /// </param> + /// <returns> + /// Returns the exception to throw. + /// </returns> + protected virtual LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => Scalar_Cannot_CoerceInputValue(this, inputValue); + + /// <summary> + /// Creates the exception to throw when <see cref="CoerceOutputValue(object, ResultElement)"/> + /// encounters an incompatible runtime value. + /// </summary> + /// <param name="runtimeValue"> + /// The runtime value that could not be coerced. + /// </param> + /// <returns> + /// Returns the exception to throw. + /// </returns> + protected virtual LeafCoercionException CreateCoerceOutputValueError(object runtimeValue) + => Scalar_Cannot_CoerceOutputValue(this, runtimeValue); + + /// <summary> + /// Creates the exception to throw when <see cref="ValueToLiteral(object)"/> + /// encounters an incompatible runtime value. + /// </summary> + /// <param name="runtimeValue"> + /// The runtime value that could not be converted to a literal. + /// </param> + /// <returns> + /// Returns the exception to throw. + /// </returns> + protected virtual LeafCoercionException CreateValueToLiteralError(object runtimeValue) + => Scalar_Cannot_ConvertValueToLiteral(this, runtimeValue); + + private static ScalarSerializationType DetermineSerializationType() + { + if (typeof(TLiteral) == typeof(StringValueNode)) + { + return ScalarSerializationType.String; + } + else if (typeof(TLiteral) == typeof(IntValueNode)) + { + return ScalarSerializationType.Int; + } + else if (typeof(TLiteral) == typeof(FloatValueNode)) + { + return ScalarSerializationType.Float; + } + else if (typeof(TLiteral) == typeof(BooleanValueNode)) + { + return ScalarSerializationType.Boolean; + } + else if (typeof(TLiteral) == typeof(ObjectValueNode)) + { + return ScalarSerializationType.Object; + } + else if (typeof(TLiteral) == typeof(ListValueNode)) + { + return ScalarSerializationType.List; + } + else + { + throw new InvalidOperationException("Invalid literal type."); + } + } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs b/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs index fb62dc2c5b1..54d1e9fc54b 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs @@ -123,16 +123,16 @@ public FooType() : base("Foo") public override Type RuntimeType => typeof(string); - public override bool IsValueCompatible(IValueNode literal) + public override bool IsValueCompatible(IValueNode valueLiteral) { - ArgumentNullException.ThrowIfNull(literal); + ArgumentNullException.ThrowIfNull(valueLiteral); - if (literal is NullValueNode) + if (valueLiteral is NullValueNode) { return true; } - return literal is StringValueNode { Value: "a" }; + return valueLiteral is StringValueNode { Value: "a" }; } public override bool IsInstanceOfType(object? value) diff --git a/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs b/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs index 0d6e49ab8f3..bad4f249ffd 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs @@ -185,7 +185,7 @@ public ByteArrayType() : base("ByteArray", BindingBehavior.Implicit) public override Type RuntimeType => typeof(byte[]); - public override bool IsValueCompatible(IValueNode literal) + public override bool IsValueCompatible(IValueNode valueLiteral) { throw new NotSupportedException(); } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs index 91f754185bd..add6eac364a 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs @@ -57,7 +57,7 @@ public ImplicitBindingScalar() { } - public override bool IsValueCompatible(IValueNode literal) + public override bool IsValueCompatible(IValueNode valueLiteral) { throw new NotImplementedException(); } @@ -85,7 +85,7 @@ public ExplicitBindingScalar() { } - public override bool IsValueCompatible(IValueNode literal) + public override bool IsValueCompatible(IValueNode valueLiteral) { throw new NotImplementedException(); } diff --git a/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs b/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs index 36fac03e9f4..649b4ec7346 100644 --- a/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs +++ b/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs @@ -10,7 +10,7 @@ public InvalidScalar() { } - public override bool IsValueCompatible(IValueNode literal) + public override bool IsValueCompatible(IValueNode valueLiteral) { return false; } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs index 976f30f7a49..9849d88ddd1 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs @@ -162,16 +162,16 @@ public bool IsAssignableFrom(ITypeDefinition type) } /// <inheritdoc /> - public bool IsValueCompatible(IValueNode value) + public bool IsValueCompatible(IValueNode valueLiteral) { - ArgumentNullException.ThrowIfNull(value); + ArgumentNullException.ThrowIfNull(valueLiteral); if (ValueKind == ScalarValueKind.Any) { return true; } - return value.Kind switch + return valueLiteral.Kind switch { SyntaxKind.NullValue => true, SyntaxKind.EnumValue => false, diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs index 9afea311c87..b51a30817ea 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs @@ -1015,8 +1015,8 @@ public InternalScalarType() : base("InternalScalar") public override Type RuntimeType => typeof(string); - public override bool IsValueCompatible(IValueNode valueSyntax) - => valueSyntax is StringValueNode; + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is StringValueNode; public override object? CoerceInputLiteral(IValueNode valueSyntax) => valueSyntax is StringValueNode s ? s.Value : null; diff --git a/src/HotChocolate/MongoDb/src/Types/BsonType.cs b/src/HotChocolate/MongoDb/src/Types/BsonType.cs index c3a75b2b74a..271a8a5a1c9 100644 --- a/src/HotChocolate/MongoDb/src/Types/BsonType.cs +++ b/src/HotChocolate/MongoDb/src/Types/BsonType.cs @@ -44,11 +44,11 @@ public BsonType() public override Type RuntimeType => typeof(BsonValue); /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode valueSyntax) + public override bool IsValueCompatible(IValueNode valueLiteral) { - ArgumentNullException.ThrowIfNull(valueSyntax); + ArgumentNullException.ThrowIfNull(valueLiteral); - switch (valueSyntax) + switch (valueLiteral) { case StringValueNode: case IntValueNode: diff --git a/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs b/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs index 48f5bbb7e67..5721d6def43 100644 --- a/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs +++ b/src/HotChocolate/Mutable/src/Types.Mutable/MutableScalarTypeDefinition.cs @@ -118,9 +118,9 @@ public Uri? SpecifiedBy public string? Pattern { get; set; } /// <inheritdoc /> - public bool IsValueCompatible(IValueNode value) + public bool IsValueCompatible(IValueNode valueLiteral) { - ArgumentNullException.ThrowIfNull(value); + ArgumentNullException.ThrowIfNull(valueLiteral); return true; } diff --git a/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs b/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs index 905efa19c61..0ea1256d672 100644 --- a/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs +++ b/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs @@ -16,8 +16,8 @@ public GeoJsonCoordinatesType() : base(WellKnownTypeNames.CoordinatesTypeName) Description = Resources.GeoJsonCoordinatesScalar_Description; } - public override bool IsValueCompatible(IValueNode valueSyntax) - => GeoJsonCoordinatesSerializer.Default.IsInstanceOfType(this, valueSyntax); + public override bool IsValueCompatible(IValueNode valueLiteral) + => GeoJsonCoordinatesSerializer.Default.IsInstanceOfType(this, valueLiteral); public override object? CoerceInputLiteral(IValueNode valueSyntax) => GeoJsonCoordinatesSerializer.Default.ParseLiteral(this, valueSyntax); diff --git a/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs b/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs index 70ac6c1234f..11a60c7d415 100644 --- a/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs +++ b/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs @@ -21,8 +21,8 @@ public GeoJsonPositionType() : base(PositionTypeName) Description = Resources.GeoJsonPositionScalar_Description; } - public override bool IsValueCompatible(IValueNode valueSyntax) - => GeoJsonPositionSerializer.Default.IsInstanceOfType(this, valueSyntax); + public override bool IsValueCompatible(IValueNode valueLiteral) + => GeoJsonPositionSerializer.Default.IsInstanceOfType(this, valueLiteral); public override object? CoerceInputLiteral(IValueNode valueSyntax) => GeoJsonPositionSerializer.Default.ParseLiteral(this, valueSyntax); diff --git a/src/HotChocolate/Spatial/src/Types/GeometryType.cs b/src/HotChocolate/Spatial/src/Types/GeometryType.cs index cd8b2872b1c..8868ce34041 100644 --- a/src/HotChocolate/Spatial/src/Types/GeometryType.cs +++ b/src/HotChocolate/Spatial/src/Types/GeometryType.cs @@ -29,8 +29,8 @@ public GeometryType() : base(GeometryTypeName) public override object? CoerceOutputValue(object? runtimeValue) => GeoJsonGeometrySerializer.Default.Serialize(this, runtimeValue); - public override bool IsValueCompatible(IValueNode valueSyntax) - => GeoJsonGeometrySerializer.Default.IsInstanceOfType(this, valueSyntax); + public override bool IsValueCompatible(IValueNode valueLiteral) + => GeoJsonGeometrySerializer.Default.IsInstanceOfType(this, valueLiteral); public override bool IsInstanceOfType(object? runtimeValue) => GeoJsonGeometrySerializer.Default.IsInstanceOfType(this, runtimeValue); From 00126185ad4b1bbd000329629d4447c385de4a51 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 6 Jan 2026 22:25:23 +0100 Subject: [PATCH 064/144] Refactor scalar types to improve coercion methods and exception handling - Updated coercion methods in various scalar types (e.g., EmailAddressType, RegexType, BooleanType) to use protected overrides for better encapsulation and clarity. - Simplified error handling by consolidating exception creation into a single method per type. - Removed redundant code and improved readability across multiple scalar types. - Updated resource strings for clarity and consistency in error messages related to regex parsing. - Enhanced input value coercion logic in scalar types to ensure proper type handling and error reporting. --- .../src/Types.NodaTime/IntToStructBaseType.cs | 15 ++-- .../Types.NodaTime/StringToClassBaseType.cs | 11 ++- .../Types.NodaTime/StringToStructBaseType.cs | 11 ++- .../src/Types.Scalars.Upload/UploadType.cs | 47 ++++++++--- .../src/Types.Scalars/EmailAddressType.cs | 7 +- .../Core/src/Types.Scalars/RegexType.cs | 80 +++++++++---------- .../Types.Scalars/ScalarResources.Designer.cs | 15 +--- .../src/Types.Scalars/ScalarResources.resx | 7 +- .../Core/src/Types.Scalars/ThrowHelper.cs | 19 +---- .../Composite/Types/FieldSelectionMapType.cs | 25 +++--- .../Composite/Types/FieldSelectionSetType.cs | 25 +++--- .../src/Types/Types/Scalars/BooleanType.cs | 23 ++---- .../src/Types/Types/Scalars/ByteArrayType.cs | 40 ++++------ .../Core/src/Types/Types/Scalars/ByteType.cs | 4 +- .../src/Types/Types/Scalars/DateTimeType.cs | 8 +- .../Core/src/Types/Types/Scalars/DateType.cs | 8 +- .../src/Types/Types/Scalars/DecimalType.cs | 4 +- .../Core/src/Types/Types/Scalars/FloatType.cs | 4 +- .../Core/src/Types/Types/Scalars/IdType.cs | 4 +- .../Core/src/Types/Types/Scalars/IntType.cs | 4 +- .../Core/src/Types/Types/Scalars/JsonType.cs | 8 +- .../Types/Types/Scalars/LocalDateTimeType.cs | 8 +- .../src/Types/Types/Scalars/LocalDateType.cs | 8 +- .../src/Types/Types/Scalars/LocalTimeType.cs | 8 +- .../Core/src/Types/Types/Scalars/LongType.cs | 4 +- .../src/Types/Types/Scalars/ScalarType~1.cs | 12 +-- .../Core/src/Types/Types/Scalars/ShortType.cs | 4 +- .../src/Types/Types/Scalars/StringType.cs | 17 ++-- .../src/Types/Types/Scalars/TimeSpanType.cs | 8 +- .../Core/src/Types/Types/Scalars/UrlType.cs | 11 ++- .../Core/src/Types/Types/Scalars/UuidType.cs | 21 +++-- .../Core/src/Types/Utilities/StringSetPool.cs | 10 +-- 32 files changed, 210 insertions(+), 270 deletions(-) diff --git a/src/HotChocolate/Core/src/Types.NodaTime/IntToStructBaseType.cs b/src/HotChocolate/Core/src/Types.NodaTime/IntToStructBaseType.cs index ede286f2ded..78ea604e022 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/IntToStructBaseType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/IntToStructBaseType.cs @@ -30,11 +30,11 @@ protected IntToStructBaseType(string name) } /// <inheritdoc /> - public override object CoerceInputLiteral(IntValueNode valueLiteral) + protected override TRuntimeType OnCoerceInputLiteral(IntValueNode valueLiteral) { if (TryCoerceRuntimeValue(valueLiteral.ToInt32(), out var runtimeValue)) { - return runtimeValue; + return runtimeValue.Value; } throw new LeafCoercionException( @@ -43,12 +43,11 @@ public override object CoerceInputLiteral(IntValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override TRuntimeType OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (inputValue.ValueKind is not JsonValueKind.Number - && TryCoerceRuntimeValue(inputValue.GetInt32(), out var runtimeValue)) + if (TryCoerceRuntimeValue(inputValue.GetInt32(), out var runtimeValue)) { - return runtimeValue; + return runtimeValue.Value; } throw new LeafCoercionException( @@ -57,7 +56,7 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider } /// <inheritdoc /> - public override void CoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue) { if (TryCoerceOutputValue(runtimeValue, out var value)) { @@ -71,7 +70,7 @@ public override void CoerceOutputValue(TRuntimeType runtimeValue, ResultElement } /// <inheritdoc /> - public override IValueNode ValueToLiteral(TRuntimeType runtimeValue) + protected override IntValueNode OnValueToLiteral(TRuntimeType runtimeValue) { if (TryCoerceOutputValue(runtimeValue, out var value)) { diff --git a/src/HotChocolate/Core/src/Types.NodaTime/StringToClassBaseType.cs b/src/HotChocolate/Core/src/Types.NodaTime/StringToClassBaseType.cs index 764eebf3690..e36b69f236d 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/StringToClassBaseType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/StringToClassBaseType.cs @@ -30,7 +30,7 @@ protected StringToClassBaseType(string name) } /// <inheritdoc /> - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override TRuntimeType OnCoerceInputLiteral(StringValueNode valueLiteral) { if (TryCoerceRuntimeValue(valueLiteral.Value, out var runtimeValue)) { @@ -43,10 +43,9 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override TRuntimeType OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (inputValue.ValueKind is JsonValueKind.String - && TryCoerceRuntimeValue(inputValue.GetString()!, out var runtimeValue)) + if (TryCoerceRuntimeValue(inputValue.GetString()!, out var runtimeValue)) { return runtimeValue; } @@ -57,7 +56,7 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider } /// <inheritdoc /> - public override void CoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue) { if (TryCoerceOutputValue(runtimeValue, out var value)) { @@ -71,7 +70,7 @@ public override void CoerceOutputValue(TRuntimeType runtimeValue, ResultElement } /// <inheritdoc /> - public override IValueNode ValueToLiteral(TRuntimeType runtimeValue) + protected override StringValueNode OnValueToLiteral(TRuntimeType runtimeValue) { if (TryCoerceOutputValue(runtimeValue, out var value)) { diff --git a/src/HotChocolate/Core/src/Types.NodaTime/StringToStructBaseType.cs b/src/HotChocolate/Core/src/Types.NodaTime/StringToStructBaseType.cs index 4ed3d295e68..916c7ed23df 100644 --- a/src/HotChocolate/Core/src/Types.NodaTime/StringToStructBaseType.cs +++ b/src/HotChocolate/Core/src/Types.NodaTime/StringToStructBaseType.cs @@ -31,7 +31,7 @@ protected StringToStructBaseType(string name) } /// <inheritdoc /> - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override TRuntimeType OnCoerceInputLiteral(StringValueNode valueLiteral) { if (TryCoerceRuntimeValue(valueLiteral.Value, out var runtimeValue)) { @@ -44,10 +44,9 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override TRuntimeType OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (inputValue.ValueKind is JsonValueKind.String - && TryCoerceRuntimeValue(inputValue.GetString()!, out var runtimeValue)) + if (TryCoerceRuntimeValue(inputValue.GetString()!, out var runtimeValue)) { return runtimeValue.Value; } @@ -58,7 +57,7 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider } /// <inheritdoc /> - public override void CoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue) { if (TryCoerceOutputValue(runtimeValue, out var value)) { @@ -72,7 +71,7 @@ public override void CoerceOutputValue(TRuntimeType runtimeValue, ResultElement } /// <inheritdoc /> - public override IValueNode ValueToLiteral(TRuntimeType runtimeValue) + protected override StringValueNode OnValueToLiteral(TRuntimeType runtimeValue) { if (TryCoerceOutputValue(runtimeValue, out var value)) { diff --git a/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs b/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs index aed49dca7ca..58d6bcf5696 100644 --- a/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars.Upload/UploadType.cs @@ -21,16 +21,33 @@ public UploadType() : base("Upload", BindingBehavior.Implicit) Description = UploadResources.UploadType_Description; } - public override object CoerceInputLiteral(StringValueNode valueLiteral) + /// <summary> + /// This operation is not supported. Upload scalars cannot be used in GraphQL literals. + /// </summary> + /// <param name="valueLiteral">The GraphQL literal (not used).</param> + /// <returns>Never returns; always throws.</returns> + /// <exception cref="NotSupportedException">Always thrown as literal input is not supported.</exception> + protected override IFile OnCoerceInputLiteral(StringValueNode valueLiteral) => throw new NotSupportedException(); - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + /// <summary> + /// Coerces a JSON string value containing a file reference into an <see cref="IFile"/> instance. + /// The file reference is looked up using the <see cref="IFileLookup"/> service from the context. + /// </summary> + /// <param name="inputValue"> + /// The JSON element containing the file reference as a string. + /// </param> + /// <param name="context"> + /// The feature provider context containing the <see cref="IFileLookup"/> service. + /// </param> + /// <returns> + /// An <see cref="IFile"/> instance representing the uploaded file. + /// </returns> + /// <exception cref="LeafCoercionException"> + /// Thrown when the file reference cannot be found in the file lookup service. + /// </exception> + protected override IFile OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (inputValue.ValueKind is not JsonValueKind.String) - { - throw new LeafCoercionException("A file reference must be a string.", this); - } - var fileLookup = context.Features.Get<IFileLookup>(); var fileName = inputValue.GetString()!; @@ -46,9 +63,21 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider return file; } - public override void CoerceOutputValue(IFile runtimeValue, ResultElement resultValue) + /// <summary> + /// This operation is not supported. Upload scalars are input-only and cannot be used in output. + /// </summary> + /// <param name="runtimeValue">The runtime value (not used).</param> + /// <param name="resultValue">The result element (not used).</param> + /// <exception cref="NotSupportedException">Always thrown as output coercion is not supported.</exception> + protected override void OnCoerceOutputValue(IFile runtimeValue, ResultElement resultValue) => throw new NotSupportedException(); - public override IValueNode ValueToLiteral(IFile runtimeValue) + /// <summary> + /// This operation is not supported. Upload scalars cannot be converted to GraphQL literals. + /// </summary> + /// <param name="runtimeValue">The runtime value (not used).</param> + /// <returns>Never returns; always throws.</returns> + /// <exception cref="NotSupportedException">Always thrown as value to literal conversion is not supported.</exception> + protected override StringValueNode OnValueToLiteral(IFile runtimeValue) => throw new NotSupportedException(); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs b/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs index 6af11a10714..46249f98792 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs @@ -44,11 +44,6 @@ public EmailAddressType() ScalarResources.EmailAddressType_Description) { } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) + protected override LeafCoercionException FormatException() => ThrowHelper.EmailAddressType_ParseLiteral_IsInvalid(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - => ThrowHelper.EmailAddressType_ParseValue_IsInvalid(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs b/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs index 56c7c48ff58..d18723e639b 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs @@ -1,6 +1,8 @@ using System.Text.Json; using System.Text.RegularExpressions; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; @@ -8,7 +10,7 @@ namespace HotChocolate.Types; /// The Regular Expression scalar type represents textual data, represented as UTF‐8 character /// sequences following a pattern defined as a <see cref="Regex"/> /// </summary> -public class RegexType : StringType +public class RegexType : ScalarType<string, StringValueNode> { protected internal const int DefaultRegexTimeoutInMs = 200; @@ -42,75 +44,65 @@ public RegexType( Regex regex, string? description = null, BindingBehavior bind = BindingBehavior.Explicit) - : base(name, description, bind) + : base(name, bind) { _validationRegex = regex; + Description = description; } /// <inheritdoc /> - protected override bool IsInstanceOfType(string runtimeValue) - => _validationRegex.IsMatch(runtimeValue); - - /// <inheritdoc /> - protected override bool IsInstanceOfType(StringValueNode valueSyntax) - => _validationRegex.IsMatch(valueSyntax.Value); + public override bool IsInstanceOfType(object runtimeValue) + => runtimeValue is string s && _validationRegex.IsMatch(s); public override bool IsValueCompatible(IValueNode valueLiteral) - { - return base.IsValueCompatible(valueLiteral); - } - + => valueLiteral is StringValueNode stringLiteral && _validationRegex.IsMatch(stringLiteral.Value); public override bool IsValueCompatible(JsonElement inputValue) - { - return base.IsValueCompatible(inputValue); - } + => inputValue.ValueKind is JsonValueKind.String && _validationRegex.IsMatch(inputValue.GetString()!); - /// <inheritdoc /> - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + protected override string OnCoerceInputLiteral(StringValueNode valueLiteral) { - if (runtimeValue is null) + if (_validationRegex.IsMatch(valueLiteral.Value)) { - resultValue = null; - return true; + return valueLiteral.Value; } - if (runtimeValue is string s - && _validationRegex.IsMatch(s)) + throw FormatException(); + } + + protected override string OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) + { + var runtimeValue = inputValue.GetString()!; + + if (_validationRegex.IsMatch(runtimeValue)) { - resultValue = s; - return true; + return runtimeValue; } - resultValue = null; - return false; + throw FormatException(); } - /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + protected override void OnCoerceOutputValue(string runtimeValue, ResultElement resultValue) { - if (resultValue is null) + if (_validationRegex.IsMatch(runtimeValue)) { - runtimeValue = null; - return true; + resultValue.SetStringValue(runtimeValue); + return; } - if (resultValue is string s - && _validationRegex.IsMatch(s)) + throw FormatException(); + } + + protected override StringValueNode OnValueToLiteral(string runtimeValue) + { + if (_validationRegex.IsMatch(runtimeValue)) { - runtimeValue = s; - return true; + return new StringValueNode(runtimeValue); } - runtimeValue = null; - return false; + throw FormatException(); } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.RegexType_ParseLiteral_IsInvalid(this, Name); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - => ThrowHelper.RegexType_ParseValue_IsInvalid(this, Name); + protected virtual LeafCoercionException FormatException() + => ThrowHelper.RegexType_InvalidFormat(this, Name); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs index 1cd5f593a4a..f3f13f5b91c 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs @@ -654,20 +654,11 @@ internal static string PostalCodeType_IsInvalid_ParseValue { } /// <summary> - /// Looks up a localized string similar to {0}Type cannot parse the provided literal. The provided value does not match the regular expression pattern.. + /// Looks up a localized string similar to {0}Type cannot parse the provided value. The value does not match the required regular expression pattern. /// </summary> - internal static string RegexType_IsInvalid_ParseLiteral { + internal static string RegexType_InvalidFormat { get { - return ResourceManager.GetString("RegexType_IsInvalid_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to {0}Type cannot parse the provided value. The provided value does not match the regular expression pattern.. - /// </summary> - internal static string RegexType_IsInvalid_ParseValue { - get { - return ResourceManager.GetString("RegexType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("RegexType_InvalidFormat", resourceCulture); } } diff --git a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx index bd0b174b66b..900d642fa81 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx +++ b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx @@ -315,11 +315,8 @@ <data name="PostalCodeType_IsInvalid_ParseValue" xml:space="preserve"> <value>PostalCodeType cannot parse the provided value. The provided value is an invalid postal code.</value> </data> - <data name="RegexType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>{0}Type cannot parse the provided literal. The provided value does not match the regular expression pattern.</value> - </data> - <data name="RegexType_IsInvalid_ParseValue" xml:space="preserve"> - <value>{0}Type cannot parse the provided value. The provided value does not match the regular expression pattern.</value> + <data name="RegexType_InvalidFormat" xml:space="preserve"> + <value>{0}Type cannot parse the provided value. The value does not match the required regular expression pattern.</value> </data> <data name="RgbType_Description" xml:space="preserve"> <value>The Rgb scalar type represents a valid CSS RGB color as defined in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb()_and_rgba().</value> diff --git a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs index 95c19763292..36811e029e4 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs @@ -495,7 +495,7 @@ public static LeafCoercionException PostalCodeType_ParseValue_IsInvalid(IType ty type); } - public static LeafCoercionException RegexType_ParseValue_IsInvalid( + public static LeafCoercionException RegexType_InvalidFormat( IType type, string name) { @@ -503,22 +503,7 @@ public static LeafCoercionException RegexType_ParseValue_IsInvalid( ErrorBuilder.New() .SetMessage( string.Format( - ScalarResources.RegexType_IsInvalid_ParseValue, - name)) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .Build(), - type); - } - - public static LeafCoercionException RegexType_ParseLiteral_IsInvalid( - IType type, - string name) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage( - string.Format( - ScalarResources.RegexType_IsInvalid_ParseLiteral, + ScalarResources.RegexType_InvalidFormat, name)) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .Build(), diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs index 4e4792c0901..7f04d4dbe82 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs @@ -36,7 +36,7 @@ public FieldSelectionMapType(string name, BindingBehavior bind = BindingBehavior } /// <inheritdoc /> - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override IValueSelectionNode OnCoerceInputLiteral(StringValueNode valueLiteral) { try { @@ -52,29 +52,24 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override IValueSelectionNode OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (inputValue.ValueKind is JsonValueKind.String) + try { - try - { - return ParseValueSelection(inputValue.GetString()!); - } - catch (SyntaxException) - { - // Fall through to throw error - } + return ParseValueSelection(inputValue.GetString()!); + } + catch (SyntaxException) + { + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - - throw Scalar_Cannot_CoerceInputValue(this, inputValue); } /// <inheritdoc /> - public override void CoerceOutputValue(IValueSelectionNode runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(IValueSelectionNode runtimeValue, ResultElement resultValue) => resultValue.SetStringValue(FormatValueSelection(runtimeValue)); /// <inheritdoc /> - public override IValueNode ValueToLiteral(IValueSelectionNode runtimeValue) + protected override StringValueNode OnValueToLiteral(IValueSelectionNode runtimeValue) => new StringValueNode(FormatValueSelection(runtimeValue)); /// <summary> diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs index 5c39d60b845..2f3a680ef6c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs @@ -35,7 +35,7 @@ public FieldSelectionSetType(string name, BindingBehavior bind = BindingBehavior } /// <inheritdoc /> - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override SelectionSetNode OnCoerceInputLiteral(StringValueNode valueLiteral) { try { @@ -51,29 +51,24 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override SelectionSetNode OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (inputValue.ValueKind is JsonValueKind.String) + try { - try - { - return ParseSelectionSet(inputValue.GetString()!); - } - catch (SyntaxException) - { - // Fall through to throw error - } + return ParseSelectionSet(inputValue.GetString()!); + } + catch (SyntaxException) + { + throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - - throw Scalar_Cannot_CoerceInputValue(this, inputValue); } /// <inheritdoc /> - public override void CoerceOutputValue(SelectionSetNode runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(SelectionSetNode runtimeValue, ResultElement resultValue) => resultValue.SetStringValue(SerializeSelectionSet(runtimeValue)); /// <inheritdoc /> - public override IValueNode ValueToLiteral(SelectionSetNode runtimeValue) + protected override StringValueNode OnValueToLiteral(SelectionSetNode runtimeValue) => new StringValueNode(SerializeSelectionSet(runtimeValue)); /// <summary> diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs index 279ef7325a2..a0dfd0e964c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/BooleanType.cs @@ -3,7 +3,6 @@ using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; -using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -42,30 +41,18 @@ public BooleanType() } /// <inheritdoc /> - public override object CoerceInputLiteral(BooleanValueNode valueLiteral) + protected override bool OnCoerceInputLiteral(BooleanValueNode valueLiteral) => valueLiteral.Value; /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) - { - switch (inputValue.ValueKind) - { - case JsonValueKind.True: - return true; - - case JsonValueKind.False: - return false; - - default: - throw Scalar_Cannot_CoerceInputValue(this, inputValue); - } - } + protected override bool OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => inputValue.ValueKind is JsonValueKind.True; /// <inheritdoc /> - public override void CoerceOutputValue(bool runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(bool runtimeValue, ResultElement resultValue) => resultValue.SetBooleanValue(runtimeValue); /// <inheritdoc /> - public override IValueNode ValueToLiteral(bool runtimeValue) + protected override BooleanValueNode OnValueToLiteral(bool runtimeValue) => runtimeValue ? BooleanValueNode.True : BooleanValueNode.False; } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs index f8e31145c4e..e8c2e252fa2 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs @@ -6,7 +6,6 @@ using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Text.Json; -using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -38,7 +37,7 @@ public ByteArrayType() { } - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override byte[] OnCoerceInputLiteral(StringValueNode valueLiteral) { byte[]? rented = null; var valueSpan = valueLiteral.AsSpan(); @@ -59,33 +58,28 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } } - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override byte[] OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (inputValue.ValueKind == JsonValueKind.String) - { - byte[]? rented = null; - var valueSpan = JsonMarshal.GetRawUtf8Value(inputValue); - var length = Base64.GetMaxDecodedFromUtf8Length(valueSpan.Length); - var buffer = length <= 256 ? stackalloc byte[length] : rented = ArrayPool<byte>.Shared.Rent(length); + byte[]? rented = null; + var valueSpan = JsonMarshal.GetRawUtf8Value(inputValue); + var length = Base64.GetMaxDecodedFromUtf8Length(valueSpan.Length); + var buffer = length <= 256 ? stackalloc byte[length] : rented = ArrayPool<byte>.Shared.Rent(length); - try - { - Base64.DecodeFromUtf8(valueSpan, buffer, out _, out var bytesWritten); - return buffer[..bytesWritten].ToArray(); - } - finally + try + { + Base64.DecodeFromUtf8(valueSpan, buffer, out _, out var bytesWritten); + return buffer[..bytesWritten].ToArray(); + } + finally + { + if (rented is not null) { - if (rented is not null) - { - ArrayPool<byte>.Shared.Return(rented); - } + ArrayPool<byte>.Shared.Return(rented); } } - - throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - public override void CoerceOutputValue(byte[] runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(byte[] runtimeValue, ResultElement resultValue) { byte[]? rented = null; var length = Base64.GetMaxEncodedToUtf8Length(runtimeValue.Length); @@ -109,7 +103,7 @@ public override void CoerceOutputValue(byte[] runtimeValue, ResultElement result } } - public override IValueNode ValueToLiteral(byte[] runtimeValue) + protected override StringValueNode OnValueToLiteral(byte[] runtimeValue) { byte[]? rented = null; var length = Base64.GetMaxEncodedToUtf8Length(runtimeValue.Length); diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs index 9f357a0e60f..3945896eb0f 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteType.cs @@ -53,9 +53,9 @@ protected override byte OnCoerceInputLiteral(IntValueNode valueLiteral) protected override byte OnCoerceInputValue(JsonElement inputValue) => inputValue.GetByte(); - public override void CoerceOutputValue(byte runtimeValue, ResultElement resultValue) + public override void OnCoerceOutputValue(byte runtimeValue, ResultElement resultValue) => resultValue.SetNumberValue(runtimeValue); - public override IValueNode ValueToLiteral(byte runtimeValue) + public override IValueNode OnValueToLiteral(byte runtimeValue) => new IntValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs index 1fce011aa9a..610b65cd732 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs @@ -74,7 +74,7 @@ public DateTimeType() { } - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override DateTimeOffset OnCoerceInputLiteral(StringValueNode valueLiteral) { if (TryParseStringValue(valueLiteral.Value, out var value)) { @@ -84,7 +84,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override DateTimeOffset OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, out var value)) { @@ -94,7 +94,7 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - public override void CoerceOutputValue(DateTimeOffset runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(DateTimeOffset runtimeValue, ResultElement resultValue) { if (runtimeValue.Offset == TimeSpan.Zero) { @@ -106,7 +106,7 @@ public override void CoerceOutputValue(DateTimeOffset runtimeValue, ResultElemen } } - public override IValueNode ValueToLiteral(DateTimeOffset runtimeValue) + protected override StringValueNode OnValueToLiteral(DateTimeOffset runtimeValue) { if (runtimeValue.Offset == TimeSpan.Zero) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs index 72c9b34ae6e..6e36ac252bd 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs @@ -49,7 +49,7 @@ public DateType() : this(ScalarNames.Date, TypeResources.DateType_Description) { } - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override DateOnly OnCoerceInputLiteral(StringValueNode valueLiteral) { if (TryParseStringValue(valueLiteral.Value, out var value)) { @@ -59,7 +59,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) throw Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); } - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override DateOnly OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, out var value)) { @@ -69,13 +69,13 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - public override void CoerceOutputValue(DateOnly runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(DateOnly runtimeValue, ResultElement resultValue) { var serialized = runtimeValue.ToString(DateFormat, CultureInfo.InvariantCulture); resultValue.SetStringValue(serialized); } - public override IValueNode ValueToLiteral(DateOnly runtimeValue) + protected override StringValueNode OnValueToLiteral(DateOnly runtimeValue) { var serialized = runtimeValue.ToString(DateFormat, CultureInfo.InvariantCulture); return new StringValueNode(serialized); diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs index f8b7d46324b..cc50e03cd72 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs @@ -57,10 +57,10 @@ protected override decimal OnCoerceInputValue(JsonElement inputValue) => inputValue.GetDecimal(); /// <inheritdoc /> - public override void CoerceOutputValue(decimal runtimeValue, ResultElement resultValue) + public override void OnCoerceOutputValue(decimal runtimeValue, ResultElement resultValue) => resultValue.SetNumberValue(runtimeValue); /// <inheritdoc /> - public override IValueNode ValueToLiteral(decimal runtimeValue) + public override IValueNode OnValueToLiteral(decimal runtimeValue) => new FloatValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs index c9494adda8a..102dd71875b 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs @@ -60,10 +60,10 @@ protected override double OnCoerceInputValue(JsonElement inputValue) => inputValue.GetDouble(); /// <inheritdoc /> - public override void CoerceOutputValue(double runtimeValue, ResultElement resultValue) + public override void OnCoerceOutputValue(double runtimeValue, ResultElement resultValue) => resultValue.SetNumberValue(runtimeValue); /// <inheritdoc /> - public override IValueNode ValueToLiteral(double runtimeValue) + public override IValueNode OnValueToLiteral(double runtimeValue) => new FloatValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs index a5d5790bb55..39c44e16a07 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IdType.cs @@ -104,10 +104,10 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider } /// <inheritdoc /> - public override void CoerceOutputValue(string runtimeValue, ResultElement resultValue) + public override void OnCoerceOutputValue(string runtimeValue, ResultElement resultValue) => resultValue.SetStringValue(runtimeValue); /// <inheritdoc /> - public override IValueNode ValueToLiteral(string runtimeValue) + public override IValueNode OnValueToLiteral(string runtimeValue) => new StringValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IntType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IntType.cs index e31e149c820..de484ec2cc2 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IntType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IntType.cs @@ -60,10 +60,10 @@ protected override int OnCoerceInputValue(JsonElement inputValue) => inputValue.GetInt32(); /// <inheritdoc /> - public override void CoerceOutputValue(int runtimeValue, ResultElement resultValue) + public override void OnCoerceOutputValue(int runtimeValue, ResultElement resultValue) => resultValue.SetNumberValue(runtimeValue); /// <inheritdoc /> - public override IValueNode ValueToLiteral(int runtimeValue) + public override IValueNode OnValueToLiteral(int runtimeValue) => new IntValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs index fbd473424f6..353e5f95829 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs @@ -68,7 +68,7 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider => inputValue.Clone(); /// <inheritdoc /> - public override void CoerceOutputValue(JsonElement runtimeValue, ResultElement resultValue) + public override void OnCoerceOutputValue(JsonElement runtimeValue, ResultElement resultValue) { switch (runtimeValue.ValueKind) { @@ -102,7 +102,7 @@ public override void CoerceOutputValue(JsonElement runtimeValue, ResultElement r foreach (var element in resultValue.EnumerateArray()) { enumerator.MoveNext(); - CoerceOutputValue(enumerator.Current, element); + OnCoerceOutputValue(enumerator.Current, element); } break; } @@ -121,7 +121,7 @@ public override void CoerceOutputValue(JsonElement runtimeValue, ResultElement r foreach (var property in resultValue.EnumerateObject()) { enumerator.MoveNext(); - CoerceOutputValue(enumerator.Current.Value, property.Value); + OnCoerceOutputValue(enumerator.Current.Value, property.Value); } break; } @@ -132,7 +132,7 @@ public override void CoerceOutputValue(JsonElement runtimeValue, ResultElement r } /// <inheritdoc /> - public override IValueNode ValueToLiteral(JsonElement runtimeValue) + public override IValueNode OnValueToLiteral(JsonElement runtimeValue) => JsonParser.Parse(runtimeValue); private static class JsonParser diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs index 1340a7f94f3..77a9a6e102b 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs @@ -41,7 +41,7 @@ public LocalDateTimeType() } /// <inheritdoc /> - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override DateTime OnCoerceInputLiteral(StringValueNode valueLiteral) { if (TryParseStringValue(valueLiteral.Value, out var value)) { @@ -52,7 +52,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override DateTime OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, out var value)) { @@ -63,11 +63,11 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider } /// <inheritdoc /> - public override void CoerceOutputValue(DateTime runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(DateTime runtimeValue, ResultElement resultValue) => resultValue.SetStringValue(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); /// <inheritdoc /> - public override IValueNode ValueToLiteral(DateTime runtimeValue) + protected override StringValueNode OnValueToLiteral(DateTime runtimeValue) => new StringValueNode(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); private static bool TryParseStringValue(string serialized, out DateTime value) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs index 606a370304d..18eccccfdc2 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs @@ -64,7 +64,7 @@ public LocalDateType() } /// <inheritdoc /> - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override DateOnly OnCoerceInputLiteral(StringValueNode valueLiteral) { if (TryParseStringValue(valueLiteral.Value, out var value)) { @@ -75,7 +75,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override DateOnly OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, out var value)) { @@ -86,11 +86,11 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider } /// <inheritdoc /> - public override void CoerceOutputValue(DateOnly runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(DateOnly runtimeValue, ResultElement resultValue) => resultValue.SetStringValue(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); /// <inheritdoc /> - public override IValueNode ValueToLiteral(DateOnly runtimeValue) + protected override StringValueNode OnValueToLiteral(DateOnly runtimeValue) => new StringValueNode(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); private bool TryParseStringValue(string serialized, out DateOnly value) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs index c2d54eab1b1..87b092ad3eb 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs @@ -56,7 +56,7 @@ public LocalTimeType() } /// <inheritdoc /> - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override TimeOnly OnCoerceInputLiteral(StringValueNode valueLiteral) { if (TryParseStringValue(valueLiteral.Value, out var value)) { @@ -67,7 +67,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override TimeOnly OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, out var value)) { @@ -78,11 +78,11 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider } /// <inheritdoc /> - public override void CoerceOutputValue(TimeOnly runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(TimeOnly runtimeValue, ResultElement resultValue) => resultValue.SetStringValue(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); /// <inheritdoc /> - public override IValueNode ValueToLiteral(TimeOnly runtimeValue) + protected override StringValueNode OnValueToLiteral(TimeOnly runtimeValue) => new StringValueNode(runtimeValue.ToString(LocalFormat, CultureInfo.InvariantCulture)); private bool TryParseStringValue(string serialized, out TimeOnly value) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LongType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LongType.cs index 265f4f44be7..0725498de98 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/LongType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LongType.cs @@ -57,10 +57,10 @@ protected override long OnCoerceInputValue(JsonElement inputValue) => inputValue.GetInt64(); /// <inheritdoc /> - public override void CoerceOutputValue(long runtimeValue, ResultElement resultValue) + public override void OnCoerceOutputValue(long runtimeValue, ResultElement resultValue) => resultValue.SetNumberValue(runtimeValue); /// <inheritdoc /> - public override IValueNode ValueToLiteral(long runtimeValue) + public override IValueNode OnValueToLiteral(long runtimeValue) => new IntValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs index d47796017ee..4dfae5bd691 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs @@ -23,16 +23,12 @@ protected ScalarType(string name, BindingBehavior bind = BindingBehavior.Explici /// <inheritdoc /> public sealed override Type RuntimeType => typeof(TRuntimeType); - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => RuntimeType.IsInstanceOfType(runtimeValue); - /// <inheritdoc /> public override void CoerceOutputValue(object runtimeValue, ResultElement resultValue) { if (runtimeValue is TRuntimeType t) { - CoerceOutputValue(t, resultValue); + OnCoerceOutputValue(t, resultValue); return; } @@ -52,14 +48,14 @@ public override void CoerceOutputValue(object runtimeValue, ResultElement result /// <exception cref="LeafCoercionException"> /// Unable to coerce the given <paramref name="runtimeValue"/> into an output value. /// </exception> - public abstract void CoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue); + public abstract void OnCoerceOutputValue(TRuntimeType runtimeValue, ResultElement resultValue); /// <inheritdoc /> public override IValueNode ValueToLiteral(object runtimeValue) { if (runtimeValue is TRuntimeType runtimeType) { - return ValueToLiteral(runtimeType); + return OnValueToLiteral(runtimeType); } throw Scalar_Cannot_ConvertValueToLiteral(this, runtimeValue); @@ -78,5 +74,5 @@ public override IValueNode ValueToLiteral(object runtimeValue) /// <exception cref="LeafCoercionException"> /// Unable to convert the given <paramref name="runtimeValue"/> into a literal. /// </exception> - public abstract IValueNode ValueToLiteral(TRuntimeType runtimeValue); + public abstract IValueNode OnValueToLiteral(TRuntimeType runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ShortType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ShortType.cs index 0d8e9be591c..82b64491247 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ShortType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ShortType.cs @@ -55,10 +55,10 @@ protected override short OnCoerceInputValue(JsonElement inputValue) => inputValue.GetInt16(); /// <inheritdoc /> - public override void CoerceOutputValue(short runtimeValue, ResultElement resultValue) + public override void OnCoerceOutputValue(short runtimeValue, ResultElement resultValue) => resultValue.SetNumberValue(runtimeValue); /// <inheritdoc /> - public override IValueNode ValueToLiteral(short runtimeValue) + public override IValueNode OnValueToLiteral(short runtimeValue) => new IntValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs index f972e55cfce..e0154b593a3 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs @@ -41,25 +41,18 @@ public StringType() } /// <inheritdoc /> - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override string OnCoerceInputLiteral(StringValueNode valueLiteral) => valueLiteral.Value; /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) - { - if (inputValue.ValueKind is JsonValueKind.String) - { - return inputValue.GetString()!; - } - - throw Scalar_Cannot_CoerceInputValue(this, inputValue); - } + protected override string OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => inputValue.GetString()!; /// <inheritdoc /> - public override void CoerceOutputValue(string runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(string runtimeValue, ResultElement resultValue) => resultValue.SetStringValue(runtimeValue); /// <inheritdoc /> - public override IValueNode ValueToLiteral(string runtimeValue) + protected override StringValueNode OnValueToLiteral(string runtimeValue) => new StringValueNode(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs index bbf0001ded3..d011dcf9ffb 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs @@ -49,7 +49,7 @@ public TimeSpanType() } /// <inheritdoc /> - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override TimeSpan OnCoerceInputLiteral(StringValueNode valueLiteral) { if (TryParseStringValue(valueLiteral.Value, Format, out var value)) { @@ -60,7 +60,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override TimeSpan OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (TryParseStringValue(inputValue.GetString()!, Format, out var value)) { @@ -71,7 +71,7 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider } /// <inheritdoc /> - public override void CoerceOutputValue(TimeSpan runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(TimeSpan runtimeValue, ResultElement resultValue) { var serialized = Format == TimeSpanFormat.Iso8601 ? XmlConvert.ToString(runtimeValue) @@ -80,7 +80,7 @@ public override void CoerceOutputValue(TimeSpan runtimeValue, ResultElement resu } /// <inheritdoc /> - public override IValueNode ValueToLiteral(TimeSpan runtimeValue) + protected override StringValueNode OnValueToLiteral(TimeSpan runtimeValue) { return Format == TimeSpanFormat.Iso8601 ? new StringValueNode(XmlConvert.ToString(runtimeValue)) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs index 57bb252702b..333ada30360 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs @@ -38,7 +38,7 @@ public UrlType() } /// <inheritdoc /> - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override Uri OnCoerceInputLiteral(StringValueNode valueLiteral) { if (TryParseUri(valueLiteral.Value, out var value)) { @@ -49,10 +49,9 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override Uri OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (inputValue.ValueKind is JsonValueKind.String - && TryParseUri(inputValue.GetString()!, out var value)) + if (TryParseUri(inputValue.GetString()!, out var value)) { return value; } @@ -61,7 +60,7 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider } /// <inheritdoc /> - public override void CoerceOutputValue(Uri runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(Uri runtimeValue, ResultElement resultValue) { var serialized = runtimeValue.IsAbsoluteUri ? runtimeValue.AbsoluteUri @@ -70,7 +69,7 @@ public override void CoerceOutputValue(Uri runtimeValue, ResultElement resultVal } /// <inheritdoc /> - public override IValueNode ValueToLiteral(Uri runtimeValue) + protected override StringValueNode OnValueToLiteral(Uri runtimeValue) { var value = runtimeValue.IsAbsoluteUri ? runtimeValue.AbsoluteUri diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs index 8aed956a2c3..346ddac3c7d 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs @@ -103,7 +103,7 @@ public UuidType() : this('\0') } /// <inheritdoc /> - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override Guid OnCoerceInputLiteral(StringValueNode valueLiteral) { if (TryParseGuid(valueLiteral.Value, valueLiteral.AsSpan(), out var value)) { @@ -114,28 +114,25 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } /// <inheritdoc /> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override Guid OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (inputValue.ValueKind is JsonValueKind.String) - { - var stringValue = inputValue.GetString()!; - var bytes = Encoding.UTF8.GetBytes(stringValue); + var stringValue = inputValue.GetString()!; + var bytes = Encoding.UTF8.GetBytes(stringValue); - if (TryParseGuid(stringValue, bytes, out var value)) - { - return value; - } + if (TryParseGuid(stringValue, bytes, out var value)) + { + return value; } throw Scalar_Cannot_CoerceInputValue(this, inputValue); } /// <inheritdoc /> - public override void CoerceOutputValue(Guid runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(Guid runtimeValue, ResultElement resultValue) => resultValue.SetStringValue(runtimeValue.ToString(_format)); /// <inheritdoc /> - public override IValueNode ValueToLiteral(Guid runtimeValue) + protected override StringValueNode OnValueToLiteral(Guid runtimeValue) => new StringValueNode(runtimeValue.ToString(_format)); private bool TryParseGuid(string stringValue, ReadOnlySpan<byte> bytes, out Guid value) diff --git a/src/HotChocolate/Core/src/Types/Utilities/StringSetPool.cs b/src/HotChocolate/Core/src/Types/Utilities/StringSetPool.cs index b02b08168d2..71120573782 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/StringSetPool.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/StringSetPool.cs @@ -1,3 +1,5 @@ +using System.Diagnostics; + namespace HotChocolate.Utilities; internal sealed class StringSetPool(int size = 64) @@ -9,16 +11,12 @@ public HashSet<string> Rent() public void Return(HashSet<string> set) { - if (set is null) - { - return; - } - + Debug.Assert(set != null); set.Clear(); _bucket.Return(set); } - public static StringSetPool Shared { get; } = new StringSetPool(); + public static StringSetPool Shared { get; } = new(); private sealed class Bucket { From 9e99dfdf061ac72d99aac988b732359af9fe6de7 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 6 Jan 2026 23:49:21 +0100 Subject: [PATCH 065/144] fixed --- .../src/Types.Scalars/EmailAddressType.cs | 2 +- .../Core/src/Types.Scalars/HexColorType.cs | 13 +- .../Core/src/Types.Scalars/HslType.cs | 13 +- .../Core/src/Types.Scalars/HslaType.cs | 9 +- .../Core/src/Types.Scalars/IPv4Type.cs | 13 +- .../Core/src/Types.Scalars/IPv6Type.cs | 9 +- .../Core/src/Types.Scalars/IsbnType.cs | 13 +- .../Core/src/Types.Scalars/LatitudeType.cs | 69 ++--- .../src/Types.Scalars/LocalCurrencyType.cs | 60 ++--- .../Core/src/Types.Scalars/LongitudeType.cs | 68 ++--- .../Core/src/Types.Scalars/MacAddressType.cs | 13 +- .../src/Types.Scalars/NegativeFloatType.cs | 31 +-- .../Core/src/Types.Scalars/NegativeIntType.cs | 32 +-- .../src/Types.Scalars/NonEmptyStringType.cs | 53 +--- .../src/Types.Scalars/NonNegativeFloatType.cs | 31 +-- .../src/Types.Scalars/NonNegativeIntType.cs | 31 +-- .../src/Types.Scalars/NonPositiveFloatType.cs | 31 +-- .../src/Types.Scalars/NonPositiveIntType.cs | 31 +-- .../Core/src/Types.Scalars/PhoneNumberType.cs | 13 +- .../Core/src/Types.Scalars/PortType.cs | 31 +-- .../Core/src/Types.Scalars/PositiveIntType.cs | 25 +- .../Core/src/Types.Scalars/RgbType.cs | 13 +- .../Core/src/Types.Scalars/RgbaType.cs | 13 +- .../Types.Scalars/ScalarResources.Designer.cs | 241 ++++-------------- .../src/Types.Scalars/ScalarResources.resx | 75 ++---- .../Core/src/Types.Scalars/SignedByteType.cs | 12 +- .../Core/src/Types.Scalars/ThrowHelper.cs | 225 +++------------- .../Core/src/Types.Scalars/UnsignedIntType.cs | 12 +- .../src/Types.Scalars/UnsignedLongType.cs | 12 +- .../src/Types.Scalars/UnsignedShortType.cs | 12 +- .../Core/src/Types.Scalars/UtcOffsetType.cs | 65 ++--- 31 files changed, 308 insertions(+), 963 deletions(-) diff --git a/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs b/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs index 46249f98792..759e23b571a 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs @@ -45,5 +45,5 @@ public EmailAddressType() { } protected override LeafCoercionException FormatException() - => ThrowHelper.EmailAddressType_ParseLiteral_IsInvalid(this); + => ThrowHelper.EmailAddressType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs b/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs index 2ba59e5a306..b766a1618b6 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs @@ -41,15 +41,6 @@ public HexColorType() { } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - return ThrowHelper.HexColorType_ParseLiteral_IsInvalid(this); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - return ThrowHelper.HexColorType_ParseValue_IsInvalid(this); - } + protected override LeafCoercionException FormatException() + => ThrowHelper.HexColorType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/HslType.cs b/src/HotChocolate/Core/src/Types.Scalars/HslType.cs index 61f000cde83..d5630a05041 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/HslType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/HslType.cs @@ -41,15 +41,6 @@ public HslType() { } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - return ThrowHelper.HslType_ParseLiteral_IsInvalid(this); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - return ThrowHelper.HslType_ParseValue_IsInvalid(this); - } + protected override LeafCoercionException FormatException() + => ThrowHelper.HslType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs b/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs index bb2486ad3b1..81032ea17e0 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs @@ -41,11 +41,6 @@ public HslaType() { } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.HslaType_ParseLiteral_IsInvalid(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - => ThrowHelper.HslaType_ParseValue_IsInvalid(this); + protected override LeafCoercionException FormatException() + => ThrowHelper.HslaType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs b/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs index 207f56d2f57..2394c948a3e 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs @@ -43,15 +43,6 @@ public IPv4Type() { } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - return ThrowHelper.IPv4Type_ParseLiteral_IsInvalid(this); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - return ThrowHelper.IPv4Type_ParseValue_IsInvalid(this); - } + protected override LeafCoercionException FormatException() + => ThrowHelper.IPv4Type_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs b/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs index d5ad1972d48..b707368804c 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs @@ -62,11 +62,6 @@ public IPv6Type() { } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.IPv6Type_ParseLiteral_IsInvalid(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - => ThrowHelper.IPv6Type_ParseValue_IsInvalid(this); + protected override LeafCoercionException FormatException() + => ThrowHelper.IPv6Type_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs b/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs index 2e68950fb04..ad639948e34 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs @@ -46,15 +46,6 @@ public IsbnType() { } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - return ThrowHelper.IsbnType_ParseLiteral_IsInvalid(this); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - return ThrowHelper.IsbnType_ParseValue_IsInvalid(this); - } + protected override LeafCoercionException FormatException() + => ThrowHelper.IsbnType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/LatitudeType.cs b/src/HotChocolate/Core/src/Types.Scalars/LatitudeType.cs index 0f3d989ee1b..b39be587da4 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/LatitudeType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/LatitudeType.cs @@ -1,6 +1,9 @@ using System.Diagnostics.CodeAnalysis; +using System.Text.Json; using System.Text.RegularExpressions; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using static System.Math; namespace HotChocolate.Types; @@ -35,80 +38,48 @@ public LatitudeType() } /// <inheritdoc /> - protected override bool IsInstanceOfType(double runtimeValue) => - Latitude.IsValid(runtimeValue); - - /// <inheritdoc /> - public override IValueNode ParseResult(object? resultValue) + protected override double OnCoerceInputLiteral(StringValueNode valueLiteral) { - return resultValue switch - { - null => NullValueNode.Default, - - string s when Latitude.TryDeserialize(s, out var runtimeValue) => - CoerceInputValue(runtimeValue), - - int i => ParseValue(i), - - double d => ParseValue(d), - - _ => throw ThrowHelper.LatitudeType_ParseValue_IsInvalid(this) - }; - } - - /// <inheritdoc /> - protected override double ParseLiteral(StringValueNode valueSyntax) - { - if (Latitude.TryDeserialize(valueSyntax.Value, out var runtimeValue)) + if (Latitude.TryDeserialize(valueLiteral.Value, out var runtimeValue)) { return runtimeValue.Value; } - throw ThrowHelper.LatitudeType_ParseLiteral_IsInvalid(this); + throw ThrowHelper.LatitudeType_InvalidFormat(this); } /// <inheritdoc /> - protected override StringValueNode ParseValue(double runtimeValue) + protected override double OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (Latitude.TrySerialize(runtimeValue, out var s)) + if (Latitude.TryDeserialize(inputValue.GetString()!, out var runtimeValue)) { - return new StringValueNode(s); + return runtimeValue.Value; } - throw ThrowHelper.LatitudeType_ParseLiteral_IsInvalid(this); + throw ThrowHelper.LatitudeType_InvalidFormat(this); } /// <inheritdoc /> - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + protected override void OnCoerceOutputValue(double runtimeValue, ResultElement resultValue) { - switch (runtimeValue) + if (Latitude.TrySerialize(runtimeValue, out var serialized)) { - case double d when Latitude.TrySerialize(d, out var serializedDouble): - resultValue = serializedDouble; - return true; - - case int i when Latitude.TrySerialize(i, out var serializedInt): - resultValue = serializedInt; - return true; - - default: - resultValue = null; - return false; + resultValue.SetStringValue(serialized); + return; } + + throw ThrowHelper.LatitudeType_InvalidFormat(this); } /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + protected override StringValueNode OnValueToLiteral(double runtimeValue) { - if (resultValue is string s - && Latitude.TryDeserialize(s, out var value)) + if (Latitude.TrySerialize(runtimeValue, out var serialized)) { - runtimeValue = value; - return true; + return new StringValueNode(serialized); } - runtimeValue = null; - return false; + throw ThrowHelper.LatitudeType_InvalidFormat(this); } private static class Latitude diff --git a/src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs b/src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs index 1d18658a3e1..20704dda861 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs @@ -1,6 +1,9 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; @@ -39,68 +42,37 @@ public LocalCurrencyType() } /// <inheritdoc /> - public override IValueNode ParseResult(object? resultValue) + protected override decimal OnCoerceInputLiteral(StringValueNode valueLiteral) { - return resultValue switch + if (TryDeserializeFromString(valueLiteral.Value, out var value)) { - null => NullValueNode.Default, - string s => new StringValueNode(s), - decimal d => ParseValue(d), - _ => throw ThrowHelper.LocalCurrencyType_ParseValue_IsInvalid(this) - }; + return value.Value; + } + + throw ThrowHelper.LocalCurrencyType_InvalidFormat(this); } /// <inheritdoc /> - protected override decimal ParseLiteral(StringValueNode valueSyntax) + protected override decimal OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (TryDeserializeFromString(valueSyntax.Value, out var value)) + if (TryDeserializeFromString(inputValue.GetString(), out var value)) { return value.Value; } - throw ThrowHelper.LocalCurrencyType_ParseLiteral_IsInvalid(this); - } - - protected override StringValueNode ParseValue(decimal runtimeValue) - { - return new(Serialize(runtimeValue)); + throw ThrowHelper.LocalCurrencyType_InvalidFormat(this); } /// <inheritdoc /> - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + protected override void OnCoerceOutputValue(decimal runtimeValue, ResultElement resultValue) { - switch (runtimeValue) - { - case null: - resultValue = null; - return true; - case decimal d: - resultValue = Serialize(d); - return true; - default: - resultValue = null; - return false; - } + resultValue.SetStringValue(Serialize(runtimeValue)); } /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + protected override StringValueNode OnValueToLiteral(decimal runtimeValue) { - switch (resultValue) - { - case null: - runtimeValue = null; - return true; - case string s when TryDeserializeFromString(s, out var d): - runtimeValue = d; - return true; - case decimal d: - runtimeValue = d; - return true; - default: - runtimeValue = null; - return false; - } + return new StringValueNode(Serialize(runtimeValue)); } private string Serialize(IFormattable value) diff --git a/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs b/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs index 0f44a6d3adc..4300d313143 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/LongitudeType.cs @@ -1,6 +1,9 @@ using System.Diagnostics.CodeAnalysis; +using System.Text.Json; using System.Text.RegularExpressions; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using static System.Math; namespace HotChocolate.Types; @@ -35,79 +38,48 @@ public LongitudeType() } /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => runtimeValue is double d && Longitude.IsValid(d); - - /// <inheritdoc /> - public override IValueNode ParseResult(object? resultValue) + protected override double OnCoerceInputLiteral(StringValueNode valueLiteral) { - return resultValue switch - { - null => NullValueNode.Default, - - string s when Longitude.TryDeserialize(s, out var runtimeValue) => - CoerceInputValue(runtimeValue), - - int i => ParseValue(i), - - double d => ParseValue(d), - - _ => throw ThrowHelper.LongitudeType_ParseValue_IsInvalid(this) - }; - } - - /// <inheritdoc /> - protected override double ParseLiteral(StringValueNode valueSyntax) - { - if (Longitude.TryDeserialize(valueSyntax.Value, out var runtimeValue)) + if (Longitude.TryDeserialize(valueLiteral.Value, out var runtimeValue)) { return runtimeValue.Value; } - throw ThrowHelper.LongitudeType_ParseLiteral_IsInvalid(this); + throw ThrowHelper.LongitudeType_InvalidFormat(this); } /// <inheritdoc /> - protected override StringValueNode ParseValue(double runtimeValue) + protected override double OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (Longitude.TrySerialize(runtimeValue, out var s)) + if (Longitude.TryDeserialize(inputValue.GetString()!, out var runtimeValue)) { - return new StringValueNode(s); + return runtimeValue.Value; } - throw ThrowHelper.LongitudeType_ParseValue_IsInvalid(this); + throw ThrowHelper.LongitudeType_InvalidFormat(this); } /// <inheritdoc /> - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + protected override void OnCoerceOutputValue(double runtimeValue, ResultElement resultValue) { - switch (runtimeValue) + if (Longitude.TrySerialize(runtimeValue, out var serialized)) { - case double d when Longitude.TrySerialize(d, out var serializedDouble): - resultValue = serializedDouble; - return true; - - case int i when Longitude.TrySerialize(i, out var serializedInt): - resultValue = serializedInt; - return true; - - default: - resultValue = null; - return false; + resultValue.SetStringValue(serialized); + return; } + + throw ThrowHelper.LongitudeType_InvalidFormat(this); } /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) + protected override StringValueNode OnValueToLiteral(double runtimeValue) { - if (resultValue is string s && Longitude.TryDeserialize(s, out var value)) + if (Longitude.TrySerialize(runtimeValue, out var serialized)) { - runtimeValue = value; - return true; + return new StringValueNode(serialized); } - runtimeValue = null; - return false; + throw ThrowHelper.LongitudeType_InvalidFormat(this); } private static class Longitude diff --git a/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs b/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs index d1e6244cbc6..0c576067e6a 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs @@ -57,15 +57,6 @@ public MacAddressType() { } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - return ThrowHelper.MacAddressType_ParseLiteral_IsInvalid(this); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - return ThrowHelper.MacAddressType_ParseValue_IsInvalid(this); - } + protected override LeafCoercionException FormatException() + => ThrowHelper.MacAddressType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs index b332708bd80..1f04c42c985 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; namespace HotChocolate.Types; @@ -30,32 +31,22 @@ public NegativeFloatType() } /// <inheritdoc /> - protected override bool IsInstanceOfType(double runtimeValue) - { - return runtimeValue < MaxValue; - } + public override bool IsInstanceOfType(object runtimeValue) + => runtimeValue is double d && d < MaxValue; /// <inheritdoc /> - protected override bool IsInstanceOfType(IFloatValueLiteral valueSyntax) - { - return valueSyntax.ToDouble() < MaxValue; - } + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is IFloatValueLiteral floatValueLiteral && floatValueLiteral.ToDouble() < MaxValue; /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.NegativeFloatType_ParseLiteral_IsNotNegative(this); - } + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetDouble() < MaxValue; /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(object runtimeValue) - { - throw ThrowHelper.NegativeFloatType_ParseValue_IsNotNegative(this); - } + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) + => ThrowHelper.NegativeFloatType_ParseLiteral_IsNotNegative(this); /// <inheritdoc /> - protected override LeafCoercionException CreateParseResultError(object runtimeValue) - { - throw ThrowHelper.NegativeFloatType_ParseValue_IsNotNegative(this); - } + protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => ThrowHelper.NegativeFloatType_ParseValue_IsNotNegative(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs index 467e8125b87..b46e299397d 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; namespace HotChocolate.Types; @@ -17,7 +18,6 @@ public NegativeIntType( BindingBehavior bind = BindingBehavior.Explicit) : base(name, description, int.MinValue, -1, bind) { - Description = description; } /// <summary> @@ -32,32 +32,22 @@ public NegativeIntType() } /// <inheritdoc /> - protected override bool IsInstanceOfType(int runtimeValue) - { - return runtimeValue <= MaxValue; - } + public override bool IsInstanceOfType(object runtimeValue) + => runtimeValue is int i && i <= MaxValue; /// <inheritdoc /> - protected override bool IsInstanceOfType(IntValueNode valueSyntax) - { - return valueSyntax.ToInt32() <= MaxValue; - } + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is IntValueNode intValueNode && intValueNode.ToInt32() <= MaxValue; /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.NegativeIntType_ParseLiteral_IsNotNegative(this); - } + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetInt32() <= MaxValue; /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - throw ThrowHelper.NegativeIntType_ParseValue_IsNotNegative(this); - } + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) + => ThrowHelper.NegativeIntType_ParseLiteral_IsNotNegative(this); /// <inheritdoc /> - protected override LeafCoercionException CreateParseResultError(object runtimeValue) - { - throw ThrowHelper.NegativeIntType_ParseValue_IsNotNegative(this); - } + protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => ThrowHelper.NegativeIntType_ParseValue_IsNotNegative(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs index 41e480e22f1..e10d1bfe811 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs @@ -1,9 +1,10 @@ +using System.Text.Json; using HotChocolate.Language; namespace HotChocolate.Types; /// <summary> -/// The NonEmptyString scalar type represents non empty textual data, represented as +/// The NonEmptyString scalar type represents non-empty textual data, represented as /// UTF‐8 character sequences with at least one character /// </summary> public class NonEmptyStringType : StringType @@ -31,54 +32,22 @@ public NonEmptyStringType() } /// <inheritdoc /> - protected override bool IsInstanceOfType(string runtimeValue) - { - return runtimeValue != string.Empty; - } + public override bool IsInstanceOfType(object runtimeValue) + => runtimeValue is string s && s != string.Empty; /// <inheritdoc /> - protected override bool IsInstanceOfType(StringValueNode valueSyntax) - { - return valueSyntax.Value != string.Empty; - } + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is StringValueNode stringValueNode && stringValueNode.Value != string.Empty; /// <inheritdoc /> - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) - { - if (runtimeValue is string s && s == string.Empty) - { - resultValue = null; - return false; - } - - return base.TrySerialize(runtimeValue, out resultValue); - } - - /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - if (!base.TryDeserialize(resultValue, out runtimeValue)) - { - return false; - } - - if (runtimeValue is string s && s == string.Empty) - { - return false; - } - - return true; - } + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.String && inputValue.GetString() != string.Empty; /// <inheritdoc /> protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.NonEmptyStringType_ParseLiteral_IsEmpty(this); - } + => ThrowHelper.NonEmptyStringType_ParseLiteral_IsEmpty(this); /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - throw ThrowHelper.NonEmptyStringType_ParseValue_IsEmpty(this); - } + protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => ThrowHelper.NonEmptyStringType_ParseValue_IsEmpty(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs index 40740950da4..e4fe7b99c09 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; namespace HotChocolate.Types; @@ -31,32 +32,22 @@ public NonNegativeFloatType() } /// <inheritdoc /> - protected override bool IsInstanceOfType(double runtimeValue) - { - return runtimeValue >= MinValue; - } + public override bool IsInstanceOfType(object runtimeValue) + => runtimeValue is double d && d >= MinValue; /// <inheritdoc /> - protected override bool IsInstanceOfType(IFloatValueLiteral valueSyntax) - { - return valueSyntax.ToDouble() >= MinValue; - } + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is IFloatValueLiteral floatValueLiteral && floatValueLiteral.ToDouble() >= MinValue; /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.NonNegativeFloatType_ParseLiteral_IsNotNonNegative(this); - } + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetDouble() >= MinValue; /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(object runtimeValue) - { - throw ThrowHelper.NonNegativeFloatType_ParseValue_IsNotNonNegative(this); - } + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) + => ThrowHelper.NonNegativeFloatType_ParseLiteral_IsNotNonNegative(this); /// <inheritdoc /> - protected override LeafCoercionException CreateParseResultError(object runtimeValue) - { - throw ThrowHelper.NonNegativeFloatType_ParseValue_IsNotNonNegative(this); - } + protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => ThrowHelper.NonNegativeFloatType_ParseValue_IsNotNonNegative(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs index ce4e47421b2..f8d0c733c55 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; namespace HotChocolate.Types; @@ -31,32 +32,22 @@ public NonNegativeIntType() } /// <inheritdoc /> - protected override bool IsInstanceOfType(int runtimeValue) - { - return runtimeValue >= MinValue; - } + public override bool IsInstanceOfType(object runtimeValue) + => runtimeValue is int i && i >= MinValue; /// <inheritdoc /> - protected override bool IsInstanceOfType(IntValueNode valueSyntax) - { - return valueSyntax.ToInt32() >= MinValue; - } + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is IntValueNode intValueNode && intValueNode.ToInt32() >= MinValue; /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.NonNegativeIntType_ParseLiteral_IsNotNonNegative(this); - } + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetInt32() >= MinValue; /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - throw ThrowHelper.NonNegativeIntType_ParseValue_IsNotNonNegative(this); - } + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) + => ThrowHelper.NonNegativeIntType_ParseLiteral_IsNotNonNegative(this); /// <inheritdoc /> - protected override LeafCoercionException CreateParseResultError(object runtimeValue) - { - throw ThrowHelper.NonNegativeIntType_ParseValue_IsNotNonNegative(this); - } + protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => ThrowHelper.NonNegativeIntType_ParseValue_IsNotNonNegative(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs index f33237fd9d4..aa5a082b3e2 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; namespace HotChocolate.Types; @@ -31,32 +32,22 @@ public NonPositiveFloatType() } /// <inheritdoc /> - protected override bool IsInstanceOfType(double runtimeValue) - { - return runtimeValue <= MaxValue; - } + public override bool IsInstanceOfType(object runtimeValue) + => runtimeValue is double d && d <= MaxValue; /// <inheritdoc /> - protected override bool IsInstanceOfType(IFloatValueLiteral valueSyntax) - { - return valueSyntax.ToDouble() <= MaxValue; - } + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is IFloatValueLiteral floatValueLiteral && floatValueLiteral.ToDouble() <= MaxValue; /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.NonPositiveFloatType_ParseLiteral_IsNotNonPositive(this); - } + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetDouble() <= MaxValue; /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(object runtimeValue) - { - throw ThrowHelper.NonPositiveFloatType_ParseValue_IsNotNonPositive(this); - } + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) + => ThrowHelper.NonPositiveFloatType_ParseLiteral_IsNotNonPositive(this); /// <inheritdoc /> - protected override LeafCoercionException CreateParseResultError(object runtimeValue) - { - throw ThrowHelper.NonPositiveFloatType_ParseValue_IsNotNonPositive(this); - } + protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => ThrowHelper.NonPositiveFloatType_ParseValue_IsNotNonPositive(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs index 19077bd6ac9..9841378a163 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; namespace HotChocolate.Types; @@ -31,32 +32,22 @@ public NonPositiveIntType() } /// <inheritdoc /> - protected override bool IsInstanceOfType(int runtimeValue) - { - return runtimeValue <= MaxValue; - } + public override bool IsInstanceOfType(object runtimeValue) + => runtimeValue is int i && i <= MaxValue; /// <inheritdoc /> - protected override bool IsInstanceOfType(IntValueNode valueSyntax) - { - return valueSyntax.ToInt32() <= MaxValue; - } + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is IntValueNode intValueNode && intValueNode.ToInt32() <= MaxValue; /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.NonPositiveIntType_ParseLiteral_IsNotNonPositive(this); - } + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetInt32() <= MaxValue; /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - throw ThrowHelper.NonPositiveIntType_ParseValue_IsNotNonPositive(this); - } + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) + => ThrowHelper.NonPositiveIntType_ParseLiteral_IsNotNonPositive(this); /// <inheritdoc /> - protected override LeafCoercionException CreateParseResultError(object runtimeValue) - { - throw ThrowHelper.NonPositiveIntType_ParseValue_IsNotNonPositive(this); - } + protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => ThrowHelper.NonPositiveIntType_ParseValue_IsNotNonPositive(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs b/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs index 62cd8163647..caccbbe2fcd 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs @@ -43,15 +43,6 @@ public PhoneNumberType() { } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - return ThrowHelper.PhoneNumber_ParseLiteral_IsInvalid(this); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - return ThrowHelper.PhoneNumber_ParseValue_IsInvalid(this); - } + protected override LeafCoercionException FormatException() + => ThrowHelper.PhoneNumberType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/PortType.cs b/src/HotChocolate/Core/src/Types.Scalars/PortType.cs index bc00e0de99e..7a173bfaeed 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/PortType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/PortType.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; namespace HotChocolate.Types; @@ -34,32 +35,22 @@ public PortType() } /// <inheritdoc /> - protected override bool IsInstanceOfType(int runtimeValue) - { - return runtimeValue >= MinValue && runtimeValue <= MaxValue; - } + public override bool IsInstanceOfType(object runtimeValue) + => runtimeValue is int i && i >= MinValue && i <= MaxValue; /// <inheritdoc /> - protected override bool IsInstanceOfType(IntValueNode valueSyntax) - { - return valueSyntax.ToInt32() >= MinValue && valueSyntax.ToInt32() <= MaxValue; - } + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is IntValueNode intValueNode && intValueNode.ToInt32() >= MinValue && intValueNode.ToInt32() <= MaxValue; /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.PortType_ParseLiteral_OutOfRange(this); - } + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetInt32() >= MinValue && inputValue.GetInt32() <= MaxValue; /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - throw ThrowHelper.PortType_ParseValue_OutOfRange(this); - } + protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) + => ThrowHelper.PortType_ParseLiteral_OutOfRange(this); /// <inheritdoc /> - protected override LeafCoercionException CreateParseResultError(object runtimeValue) - { - throw ThrowHelper.PortType_ParseValue_OutOfRange(this); - } + protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => ThrowHelper.PortType_ParseValue_OutOfRange(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs index bd07e6ddc0e..1a0258bca27 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; namespace HotChocolate.Types; @@ -31,20 +32,22 @@ public PositiveIntType() } /// <inheritdoc /> - protected override bool IsInstanceOfType(IntValueNode valueSyntax) - { - return IsInstanceOfType(base.ParseLiteral(valueSyntax)); - } + public override bool IsInstanceOfType(object runtimeValue) + => runtimeValue is int i && i >= MinValue; + + /// <inheritdoc /> + public override bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is IntValueNode intValueNode && intValueNode.ToInt32() >= MinValue; + + /// <inheritdoc /> + public override bool IsValueCompatible(JsonElement inputValue) + => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetInt32() >= MinValue; /// <inheritdoc /> protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.PositiveIntType_ParseLiteral_ZeroOrLess(this); - } + => ThrowHelper.PositiveIntType_ParseLiteral_ZeroOrLess(this); /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - throw ThrowHelper.PositiveIntType_ParseValue_ZeroOrLess(this); - } + protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) + => ThrowHelper.PositiveIntType_ParseValue_ZeroOrLess(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs b/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs index ff1cc9f42f8..00229e82330 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs @@ -43,15 +43,6 @@ public RgbType() { } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - return ThrowHelper.RgbType_ParseLiteral_IsInvalid(this); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - return ThrowHelper.RgbType_ParseValue_IsInvalid(this); - } + protected override LeafCoercionException FormatException() + => ThrowHelper.RgbType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs b/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs index e6b41cc85f7..633b99531cb 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs @@ -41,15 +41,6 @@ public RgbaType() { } - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - return ThrowHelper.RgbaType_ParseLiteral_IsInvalid(this); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - return ThrowHelper.RgbaType_ParseValue_IsInvalid(this); - } + protected override LeafCoercionException FormatException() + => ThrowHelper.RgbaType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs index f3f13f5b91c..40ceb5a304b 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs @@ -69,20 +69,11 @@ internal static string EmailAddressType_Description { } /// <summary> - /// Looks up a localized string similar to EmailAddressType cannot parse the provided literal. The provided value does not meet the RFC 5322 specification.. + /// Looks up a localized string similar to EmailAddressType cannot parse the provided value. The provided value does not meet the RFC 5322 specification. /// </summary> - internal static string EmailAddressType_IsInvalid_ParseLiteral { + internal static string EmailAddressType_InvalidFormat { get { - return ResourceManager.GetString("EmailAddressType_IsInvalid_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to EmailAddressType cannot parse the provided value. The provided value does not meet the RFC 5322 specification.. - /// </summary> - internal static string EmailAddressType_IsInvalid_ParseValue { - get { - return ResourceManager.GetString("EmailAddressType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("EmailAddressType_InvalidFormat", resourceCulture); } } @@ -96,74 +87,47 @@ internal static string HexColorType_Description { } /// <summary> - /// Looks up a localized string similar to HexColorType cannot parse the provided literal. The provided value is not a valid HEX color code.. + /// Looks up a localized string similar to HexColorType cannot parse the provided value. The provided value is not a valid HEX color code. /// </summary> - internal static string HexColorType_IsInvalid_ParseLiteral { + internal static string HexColorType_InvalidFormat { get { - return ResourceManager.GetString("HexColorType_IsInvalid_ParseLiteral", resourceCulture); + return ResourceManager.GetString("HexColorType_InvalidFormat", resourceCulture); } } /// <summary> - /// Looks up a localized string similar to HexColorType cannot parse the provided value. The provided value is not a valid HEX color code.. - /// </summary> - internal static string HexColorType_IsInvalid_ParseValue { - get { - return ResourceManager.GetString("HexColorType_IsInvalid_ParseValue", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to The Hsla scalar type represents a CSS HSLA color as defined in https://www.w3.org/TR/css-color-3/#hsla-color.. + /// Looks up a localized string similar to The Hsla scalar type represents a CSS HSLA color as defined in https://www.w3.org/TR/css-color-3/#hsla-color. /// </summary> internal static string HslaType_Description { get { return ResourceManager.GetString("HslaType_Description", resourceCulture); } } - - /// <summary> - /// Looks up a localized string similar to HslaType cannot parse the provided literal. The provided value is not a valid CSS HSLA color code.. - /// </summary> - internal static string HslaType_IsInvalid_ParseLiteral { - get { - return ResourceManager.GetString("HslaType_IsInvalid_ParseLiteral", resourceCulture); - } - } - + /// <summary> - /// Looks up a localized string similar to HslaType cannot parse the provided value. The provided value is not a valid CSS HSLA color code.. + /// Looks up a localized string similar to HslaType cannot parse the provided value. The provided value is not a valid CSS HSLA color code. /// </summary> - internal static string HslaType_IsInvalid_ParseValue { + internal static string HslaType_InvalidFormat { get { - return ResourceManager.GetString("HslaType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("HslaType_InvalidFormat", resourceCulture); } } - + /// <summary> - /// Looks up a localized string similar to The Hsl scalar type represents a valid CSS HSL color defined in https://www.w3.org/TR/css-color-3/#hsl-color.. + /// Looks up a localized string similar to The Hsl scalar type represents a valid CSS HSL color defined in https://www.w3.org/TR/css-color-3/#hsl-color. /// </summary> internal static string HslType_Description { get { return ResourceManager.GetString("HslType_Description", resourceCulture); } } - - /// <summary> - /// Looks up a localized string similar to HslType cannot parse the provided literal. The provided value is not a valid CSS HSL color code.. - /// </summary> - internal static string HslType_IsInvalid_ParseLiteral { - get { - return ResourceManager.GetString("HslType_IsInvalid_ParseLiteral", resourceCulture); - } - } - + /// <summary> - /// Looks up a localized string similar to HslType cannot parse the provided value. The provided value is not a valid CSS HSL color code.. + /// Looks up a localized string similar to HslType cannot parse the provided value. The provided value is not a valid CSS HSL color code. /// </summary> - internal static string HslType_IsInvalid_ParseValue { + internal static string HslType_InvalidFormat { get { - return ResourceManager.GetString("HslType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("HslType_InvalidFormat", resourceCulture); } } @@ -177,20 +141,11 @@ internal static string IPv4Type_Description { } /// <summary> - /// Looks up a localized string similar to IPv4Type cannot parse the provided literal. The provided value is not a valid IPv4 address.. + /// Looks up a localized string similar to IPv4Type cannot parse the provided value. The provided value is not a valid IPv4 address. /// </summary> - internal static string IPv4Type_IsInvalid_ParseLiteral { + internal static string IPv4Type_InvalidFormat { get { - return ResourceManager.GetString("IPv4Type_IsInvalid_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to IPv4Type cannot parse the provided value. The provided value is not a valid IPv4 address.. - /// </summary> - internal static string IPv4Type_IsInvalid_ParseValue { - get { - return ResourceManager.GetString("IPv4Type_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("IPv4Type_InvalidFormat", resourceCulture); } } @@ -204,20 +159,11 @@ internal static string IPv6Type_Description { } /// <summary> - /// Looks up a localized string similar to IPv6Type cannot parse the provided literal. The provided value is not a valid IPv6 address.. + /// Looks up a localized string similar to IPv6Type cannot parse the provided value. The provided value is not a valid IPv6 address. /// </summary> - internal static string IPv6Type_IsInvalid_ParseLiteral { + internal static string IPv6Type_InvalidFormat { get { - return ResourceManager.GetString("IPv6Type_IsInvalid_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to IPv6Type cannot parse the provided value. The provided value is not a valid IPv6 address.. - /// </summary> - internal static string IPv6Type_IsInvalid_ParseValue { - get { - return ResourceManager.GetString("IPv6Type_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("IPv6Type_InvalidFormat", resourceCulture); } } @@ -231,20 +177,11 @@ internal static string IsbnType_Description { } /// <summary> - /// Looks up a localized string similar to IsbnType cannot parse the provided literal. The provided value is not a valid ISBN number.. - /// </summary> - internal static string IsbnType_IsInvalid_ParseLiteral { - get { - return ResourceManager.GetString("IsbnType_IsInvalid_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to IsbnType cannot parse the provided value. The provided value is not a valid ISBN number.. + /// Looks up a localized string similar to IsbnType cannot parse the provided value. The provided value is not a valid ISBN number. /// </summary> - internal static string IsbnType_IsInvalid_ParseValue { + internal static string IsbnType_InvalidFormat { get { - return ResourceManager.GetString("IsbnType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("IsbnType_InvalidFormat", resourceCulture); } } @@ -258,20 +195,11 @@ internal static string LatitudeType_Description { } /// <summary> - /// Looks up a localized string similar to LatitudeType cannot parse the provided literal. The provided value was not a valid decimal degrees latitude number.. - /// </summary> - internal static string LatitudeType_IsInvalid_ParseLiteral { - get { - return ResourceManager.GetString("LatitudeType_IsInvalid_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to LatitudeType cannot parse the provided value. The provided value was not a valid decimal degrees latitude number.. + /// Looks up a localized string similar to LatitudeType cannot parse the provided value. The provided value was not a valid decimal degrees latitude number. /// </summary> - internal static string LatitudeType_IsInvalid_ParseValue { + internal static string LatitudeType_InvalidFormat { get { - return ResourceManager.GetString("LatitudeType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("LatitudeType_InvalidFormat", resourceCulture); } } @@ -285,20 +213,11 @@ internal static string LocalCurrencyType_Description { } /// <summary> - /// Looks up a localized string similar to LocalCurrencyType cannot parse the provided literal. The provided value is not a valid local currency.. + /// Looks up a localized string similar to LocalCurrencyType cannot parse the provided value. The provided value is not a valid local currency. /// </summary> - internal static string LocalCurrencyType_IsInvalid_ParseLiteral { + internal static string LocalCurrencyType_InvalidFormat { get { - return ResourceManager.GetString("LocalCurrencyType_IsInvalid_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to LocalCurrencyType cannot parse the provided value. The provided value is not a valid local currency.. - /// </summary> - internal static string LocalCurrencyType_IsInvalid_ParseValue { - get { - return ResourceManager.GetString("LocalCurrencyType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("LocalCurrencyType_InvalidFormat", resourceCulture); } } @@ -312,20 +231,11 @@ internal static string LongitudeType_Description { } /// <summary> - /// Looks up a localized string similar to LongitudeType cannot parse the provided literal. The provided value is not a valid longitude number.. + /// Looks up a localized string similar to LongitudeType cannot parse the provided value. The provided value is not a valid longitude number. /// </summary> - internal static string LongitudeType_IsInvalid_ParseLiteral { + internal static string LongitudeType_InvalidFormat { get { - return ResourceManager.GetString("LongitudeType_IsInvalid_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to LongitudeType cannot parse the provided value. The provided value is not a valid longitude number.. - /// </summary> - internal static string LongitudeType_IsInvalid_ParseValue { - get { - return ResourceManager.GetString("LongitudeType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("LongitudeType_InvalidFormat", resourceCulture); } } @@ -339,20 +249,11 @@ internal static string MacAddressType_Description { } /// <summary> - /// Looks up a localized string similar to MacAddressType cannot parse the provided literal. The provided value is not a valid MAC address.. - /// </summary> - internal static string MacAddressType_IsInvalid_ParseLiteral { - get { - return ResourceManager.GetString("MacAddressType_IsInvalid_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to MacAddressType cannot parse the provided value. The provided value is not a valid MAC address.. + /// Looks up a localized string similar to MacAddressType cannot parse the provided value. The provided value is not a valid MAC address. /// </summary> - internal static string MacAddressType_IsInvalid_ParseValue { + internal static string MacAddressType_InvalidFormat { get { - return ResourceManager.GetString("MacAddressType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("MacAddressType_InvalidFormat", resourceCulture); } } @@ -555,20 +456,11 @@ internal static string PhoneNumberType_Description { } /// <summary> - /// Looks up a localized string similar to PhoneNumberType cannot parse the provided literal. The provided value does not meet the standard E.164 format.. - /// </summary> - internal static string PhoneNumberType_IsInvalid_ParseLiteral { - get { - return ResourceManager.GetString("PhoneNumberType_IsInvalid_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to PhoneNumberType cannot parse the provided value. The provided value does not meet the standard E.164 format.. + /// Looks up a localized string similar to PhoneNumberType cannot parse the provided value. The provided value does not meet the standard E.164 format. /// </summary> - internal static string PhoneNumberType_IsInvalid_ParseValue { + internal static string PhoneNumberType_InvalidFormat { get { - return ResourceManager.GetString("PhoneNumberType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("PhoneNumberType_InvalidFormat", resourceCulture); } } @@ -672,47 +564,29 @@ internal static string RgbaType_Description { } /// <summary> - /// Looks up a localized string similar to RgbaType cannot parse the provided literal. The provided value is not a valid CSS RGBA color.. + /// Looks up a localized string similar to RgbaType cannot parse the provided value. The provided value is not a valid CSS RGBA color. /// </summary> - internal static string RgbaType_IsInvalid_ParseLiteral { + internal static string RgbaType_InvalidFormat { get { - return ResourceManager.GetString("RgbaType_IsInvalid_ParseLiteral", resourceCulture); + return ResourceManager.GetString("RgbaType_InvalidFormat", resourceCulture); } } - - /// <summary> - /// Looks up a localized string similar to RgbaType cannot parse the provided value. The provided value is not a valid CSS RGBA color.. - /// </summary> - internal static string RgbaType_IsInvalid_ParseValue { - get { - return ResourceManager.GetString("RgbaType_IsInvalid_ParseValue", resourceCulture); - } - } - + /// <summary> - /// Looks up a localized string similar to The Rgb scalar type represents a valid CSS RGB color as defined in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb()_and_rgba().. + /// Looks up a localized string similar to The Rgb scalar type represents a valid CSS RGB color as defined in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb()_and_rgba(). /// </summary> internal static string RgbType_Description { get { return ResourceManager.GetString("RgbType_Description", resourceCulture); } } - - /// <summary> - /// Looks up a localized string similar to RgbType cannot parse the provided literal. The provided value is not a valid CSS RGB color.. - /// </summary> - internal static string RgbType_IsInvalid_ParseLiteral { - get { - return ResourceManager.GetString("RgbType_IsInvalid_ParseLiteral", resourceCulture); - } - } - + /// <summary> - /// Looks up a localized string similar to RgbType cannot parse the provided value. The provided value is not a valid CSS RGB color.. + /// Looks up a localized string similar to RgbType cannot parse the provided value. The provided value is not a valid CSS RGB color. /// </summary> - internal static string RgbType_IsInvalid_ParseValue { + internal static string RgbType_InvalidFormat { get { - return ResourceManager.GetString("RgbType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("RgbType_InvalidFormat", resourceCulture); } } @@ -834,20 +708,11 @@ internal static string UtcOffsetType_Description { } /// <summary> - /// Looks up a localized string similar to UtcOffsetType cannot parse the provided literal. The provided value is not a valid UTC offset.. - /// </summary> - internal static string UtcOffsetType_IsInvalid_ParseLiteral { - get { - return ResourceManager.GetString("UtcOffsetType_IsInvalid_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to UtcOffsetType cannot parse the provided value. The provided value is not a valid UTC offset.. + /// Looks up a localized string similar to UtcOffsetType cannot parse the provided value. The provided value is not a valid UTC offset. /// </summary> - internal static string UtcOffsetType_IsInvalid_ParseValue { + internal static string UtcOffsetType_InvalidFormat { get { - return ResourceManager.GetString("UtcOffsetType_IsInvalid_ParseValue", resourceCulture); + return ResourceManager.GetString("UtcOffsetType_InvalidFormat", resourceCulture); } } } diff --git a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx index 900d642fa81..dfaf7f3cd2a 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx +++ b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx @@ -120,100 +120,67 @@ <data name="EmailAddressType_Description" xml:space="preserve"> <value>The EmailAddress scalar type constitutes a valid email address, represented as a UTF-8 character sequence. The scalar follows the specification defined by the HTML Spec https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address.</value> </data> - <data name="EmailAddressType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>EmailAddressType cannot parse the provided literal. The provided value does not meet the RFC 5322 specification.</value> - </data> - <data name="EmailAddressType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="EmailAddressType_InvalidFormat" xml:space="preserve"> <value>EmailAddressType cannot parse the provided value. The provided value does not meet the RFC 5322 specification.</value> </data> <data name="HexColorType_Description" xml:space="preserve"> <value>The HexColor scalar type represents a valid HexColor color code.</value> </data> - <data name="HexColorType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>HexColorType cannot parse the provided literal. The provided value is not a valid HEX color code.</value> - </data> - <data name="HexColorType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="HexColorType_InvalidFormat" xml:space="preserve"> <value>HexColorType cannot parse the provided value. The provided value is not a valid HEX color code.</value> </data> <data name="HslType_Description" xml:space="preserve"> <value>The Hsl scalar type represents a valid CSS HSL color defined in https://www.w3.org/TR/css-color-3/#hsl-color.</value> </data> - <data name="HslType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>HslType cannot parse the provided literal. The provided value is not a valid CSS HSL color code.</value> - </data> - <data name="HslType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="HslType_InvalidFormat" xml:space="preserve"> <value>HslType cannot parse the provided value. The provided value is not a valid CSS HSL color code.</value> </data> <data name="HslaType_Description" xml:space="preserve"> <value>The Hsla scalar type represents a CSS HSLA color as defined in https://www.w3.org/TR/css-color-3/#hsla-color.</value> </data> - <data name="HslaType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>HslaType cannot parse the provided literal. The provided value is not a valid CSS HSLA color code.</value> - </data> - <data name="HslaType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="HslaType_InvalidFormat" xml:space="preserve"> <value>HslaType cannot parse the provided value. The provided value is not a valid CSS HSLA color code.</value> </data> <data name="MacAddressType_Description" xml:space="preserve"> <value>The `MacAddress` scalar type represents an IEEE 802 48-bit or 64-bit Mac address, represented as UTF-8 character sequences. The scalar follows the specifications defined in RFC7042 and RFC7043 respectively.</value> </data> - <data name="MacAddressType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>MacAddressType cannot parse the provided literal. The provided value is not a valid MAC address.</value> - </data> - <data name="MacAddressType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="MacAddressType_InvalidFormat" xml:space="preserve"> <value>MacAddressType cannot parse the provided value. The provided value is not a valid MAC address.</value> </data> <data name="IPv4Type_Description" xml:space="preserve"> <value>The IPv4 scalar type represents a valid IPv4 address as defined in RFC791</value> </data> - <data name="IPv4Type_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>IPv4Type cannot parse the provided literal. The provided value is not a valid IPv4 address.</value> - </data> - <data name="IPv4Type_IsInvalid_ParseValue" xml:space="preserve"> + <data name="IPv4Type_InvalidFormat" xml:space="preserve"> <value>IPv4Type cannot parse the provided value. The provided value is not a valid IPv4 address.</value> </data> <data name="IPv6Type_Description" xml:space="preserve"> <value>The IPv6 scalar type represents a valid IPv6 address as defined in RFC8064</value> </data> - <data name="IPv6Type_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>IPv6Type cannot parse the provided literal. The provided value is not a valid IPv6 address.</value> - </data> - <data name="IPv6Type_IsInvalid_ParseValue" xml:space="preserve"> + <data name="IPv6Type_InvalidFormat" xml:space="preserve"> <value>IPv6Type cannot parse the provided value. The provided value is not a valid IPv6 address.</value> </data> <data name="IsbnType_Description" xml:space="preserve"> <value>The ISBN scalar type is an ISBN-10 or ISBN-13 number: https://en.wikipedia.org/wiki/International_Standard_Book_Number.</value> </data> - <data name="IsbnType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>IsbnType cannot parse the provided literal. The provided value is not a valid ISBN number.</value> - </data> - <data name="IsbnType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="IsbnType_InvalidFormat" xml:space="preserve"> <value>IsbnType cannot parse the provided value. The provided value is not a valid ISBN number.</value> </data> <data name="LatitudeType_Description" xml:space="preserve"> <value>The Latitude scalar type represents represents a valid decimal degrees latitude number.</value> </data> - <data name="LatitudeType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>LatitudeType cannot parse the provided literal. The provided value was not a valid decimal degrees latitude number.</value> - </data> - <data name="LatitudeType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="LatitudeType_InvalidFormat" xml:space="preserve"> <value>LatitudeType cannot parse the provided value. The provided value was not a valid decimal degrees latitude number.</value> </data> <data name="LocalCurrencyType_Description" xml:space="preserve"> <value>The LocalCurrency scalar type is a currency string.</value> </data> - <data name="LocalCurrencyType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>LocalCurrencyType cannot parse the provided literal. The provided value is not a valid local currency.</value> - </data> - <data name="LocalCurrencyType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="LocalCurrencyType_InvalidFormat" xml:space="preserve"> <value>LocalCurrencyType cannot parse the provided value. The provided value is not a valid local currency.</value> </data> <data name="LongitudeType_Description" xml:space="preserve"> <value>The Longitude scalar type is a valid decimal degrees longitude number.</value> </data> - <data name="LongitudeType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>LongitudeType cannot parse the provided literal. The provided value is not a valid longitude number.</value> - </data> - <data name="LongitudeType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="LongitudeType_InvalidFormat" xml:space="preserve"> <value>LongitudeType cannot parse the provided value. The provided value is not a valid longitude number.</value> </data> <data name="NegativeFloatType_Description" xml:space="preserve"> @@ -282,10 +249,7 @@ <data name="PhoneNumberType_Description" xml:space="preserve"> <value>The PhoneNumber scalar type represents a value that conforms to the standard E.164 format.</value> </data> - <data name="PhoneNumberType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>PhoneNumberType cannot parse the provided literal. The provided value does not meet the standard E.164 format.</value> - </data> - <data name="PhoneNumberType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="PhoneNumberType_InvalidFormat" xml:space="preserve"> <value>PhoneNumberType cannot parse the provided value. The provided value does not meet the standard E.164 format.</value> </data> <data name="PortType_Description" xml:space="preserve"> @@ -321,19 +285,13 @@ <data name="RgbType_Description" xml:space="preserve"> <value>The Rgb scalar type represents a valid CSS RGB color as defined in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb()_and_rgba().</value> </data> - <data name="RgbType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>RgbType cannot parse the provided literal. The provided value is not a valid CSS RGB color.</value> - </data> - <data name="RgbType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="RgbType_InvalidFormat" xml:space="preserve"> <value>RgbType cannot parse the provided value. The provided value is not a valid CSS RGB color.</value> </data> <data name="RgbaType_Description" xml:space="preserve"> <value>The Rgba scalar type represents a valid CSS RGBA color as defined in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb()_and_rgba().</value> </data> - <data name="RgbaType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>RgbaType cannot parse the provided literal. The provided value is not a valid CSS RGBA color.</value> - </data> - <data name="RgbaType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="RgbaType_InvalidFormat" xml:space="preserve"> <value>RgbaType cannot parse the provided value. The provided value is not a valid CSS RGBA color.</value> </data> <data name="UnsignedIntType_Description" xml:space="preserve"> @@ -357,10 +315,7 @@ <data name="UtcOffsetType_Description" xml:space="preserve"> <value>The UtcOffset scalar type represents a value of format ±hh:mm.</value> </data> - <data name="UtcOffsetType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>UtcOffsetType cannot parse the provided literal. The provided value is not a valid UTC offset.</value> - </data> - <data name="UtcOffsetType_IsInvalid_ParseValue" xml:space="preserve"> + <data name="UtcOffsetType_InvalidFormat" xml:space="preserve"> <value>UtcOffsetType cannot parse the provided value. The provided value is not a valid UTC offset.</value> </data> <data name="SignedByteType_Description" xml:space="preserve"> diff --git a/src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs b/src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs index a645ef8968c..9c16fbddb3f 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs @@ -57,19 +57,13 @@ protected override IntValueNode ParseValue(sbyte runtimeValue) /// <inheritdoc /> protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.UnsignedIntType_ParseLiteral_IsNotUnsigned(this); - } + => ThrowHelper.SignedByteType_ParseLiteral_IsNotSigned(this); /// <inheritdoc /> protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - throw ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); - } + => ThrowHelper.SignedByteType_ParseValue_IsNotSigned(this); /// <inheritdoc /> protected override LeafCoercionException CreateParseResultError(object runtimeValue) - { - throw ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); - } + => ThrowHelper.SignedByteType_ParseValue_IsNotSigned(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs index 36811e029e4..0c3bf239902 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs @@ -2,242 +2,121 @@ namespace HotChocolate.Types; internal static class ThrowHelper { - public static LeafCoercionException EmailAddressType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException EmailAddressType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.EmailAddressType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.EmailAddressType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.EmailAddress) .Build(), type); } - public static LeafCoercionException EmailAddressType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException HexColorType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.EmailAddressType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.EmailAddress) - .Build(), - type); - } - - public static LeafCoercionException HexColorType_ParseValue_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.HexColorType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.HexColor) - .Build(), - type); - } - - public static LeafCoercionException HexColorType_ParseLiteral_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.HexColorType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.HexColorType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.HexColor) .Build(), type); } - public static LeafCoercionException HslType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException HslType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.HslType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.Hsl) - .Build(), - type); - } - - public static LeafCoercionException HslType_ParseLiteral_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.HslType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.HslType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.Hsl) .Build(), type); } - public static LeafCoercionException HslaType_ParseValue_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.HslaType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.Hsla) - .Build(), - type); - } - - public static LeafCoercionException HslaType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException HslaType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.HslaType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.HslaType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.Hsla) .Build(), type); } - public static LeafCoercionException IPv4Type_ParseValue_IsInvalid(IType type) + public static LeafCoercionException IPv4Type_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.IPv4Type_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.IPv4) - .Build(), - type); - } - - public static LeafCoercionException IPv4Type_ParseLiteral_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.IPv4Type_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.IPv4Type_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.IPv4) .Build(), type); } - public static LeafCoercionException IPv6Type_ParseValue_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.IPv6Type_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.IPv6) - .Build(), - type); - } - - public static LeafCoercionException IPv6Type_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException IPv6Type_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.IPv6Type_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.IPv6Type_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.IPv6) .Build(), type); } - public static LeafCoercionException IsbnType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException IsbnType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.IsbnType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.Isbn) - .Build(), - type); - } - - public static LeafCoercionException IsbnType_ParseLiteral_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.IsbnType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.IsbnType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.Isbn) .Build(), type); } - public static LeafCoercionException LatitudeType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException LatitudeType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.LatitudeType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.Latitude) - .Build(), - type); - } - - public static LeafCoercionException LatitudeType_ParseLiteral_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.LatitudeType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.LatitudeType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.Latitude) .Build(), type); } - public static LeafCoercionException LocalCurrencyType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException LocalCurrencyType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.LocalCurrencyType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.LocalCurrency) - .Build(), - type); - } - - public static LeafCoercionException LocalCurrencyType_ParseLiteral_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.LocalCurrencyType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.LocalCurrencyType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.LocalCurrency) .Build(), type); } - public static LeafCoercionException LongitudeType_ParseValue_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.LongitudeType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.Longitude) - .Build(), - type); - } - - public static LeafCoercionException LongitudeType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException LongitudeType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.LongitudeType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.LongitudeType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.Longitude) .Build(), type); } - public static LeafCoercionException MacAddressType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException MacAddressType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.MacAddressType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.MacAddress) - .Build(), - type); - } - - public static LeafCoercionException MacAddressType_ParseLiteral_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.MacAddressType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.MacAddressType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.MacAddress) .Build(), @@ -407,28 +286,17 @@ public static LeafCoercionException NonNegativeFloatType_ParseValue_IsNotNonNega type); } - public static LeafCoercionException PhoneNumber_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException PhoneNumberType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.PhoneNumberType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.PhoneNumberType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.PhoneNumber) .Build(), type); } - public static LeafCoercionException PhoneNumber_ParseValue_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.PhoneNumberType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.PhoneNumber) - .Build(), - type); - } - public static LeafCoercionException PortType_ParseLiteral_OutOfRange(IType type) { return new LeafCoercionException( @@ -510,44 +378,22 @@ public static LeafCoercionException RegexType_InvalidFormat( type); } - public static LeafCoercionException RgbType_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException RgbType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.RgbType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.RgbType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.Rgb) .Build(), type); } - public static LeafCoercionException RgbType_ParseValue_IsInvalid(IType type) + public static LeafCoercionException RgbaType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.RgbType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.Rgb) - .Build(), - type); - } - - public static LeafCoercionException RgbaType_ParseValue_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.RgbaType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.Rgba) - .Build(), - type); - } - - public static LeafCoercionException RgbaType_ParseLiteral_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.RgbaType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.RgbaType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.Rgba) .Build(), @@ -642,22 +488,11 @@ public static LeafCoercionException UnsignedLongType_ParseLiteral_IsNotUnsigned( type); } - public static LeafCoercionException UtcOffset_ParseValue_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.UtcOffsetType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.UtcOffset) - .Build(), - type); - } - - public static LeafCoercionException UtcOffset_ParseLiteral_IsInvalid(IType type) + public static LeafCoercionException UtcOffsetType_InvalidFormat(IType type) { return new LeafCoercionException( ErrorBuilder.New() - .SetMessage(ScalarResources.UtcOffsetType_IsInvalid_ParseLiteral) + .SetMessage(ScalarResources.UtcOffsetType_InvalidFormat) .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) .SetExtension("actualType", WellKnownScalarTypes.UtcOffset) .Build(), diff --git a/src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs index 2eb81910492..9fe2dc83ace 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs @@ -57,19 +57,13 @@ protected override IntValueNode ParseValue(uint runtimeValue) /// <inheritdoc /> protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.UnsignedIntType_ParseLiteral_IsNotUnsigned(this); - } + => ThrowHelper.UnsignedIntType_ParseLiteral_IsNotUnsigned(this); /// <inheritdoc /> protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - throw ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); - } + => ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); /// <inheritdoc /> protected override LeafCoercionException CreateParseResultError(object runtimeValue) - { - throw ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); - } + => ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs b/src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs index 113e4b67204..23a2ba74c1b 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs @@ -57,19 +57,13 @@ protected override IntValueNode ParseValue(ulong runtimeValue) /// <inheritdoc /> protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.UnsignedLongType_ParseLiteral_IsNotUnsigned(this); - } + => ThrowHelper.UnsignedLongType_ParseLiteral_IsNotUnsigned(this); /// <inheritdoc /> protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - throw ThrowHelper.UnsignedLongType_ParseValue_IsNotUnsigned(this); - } + => ThrowHelper.UnsignedLongType_ParseValue_IsNotUnsigned(this); /// <inheritdoc /> protected override LeafCoercionException CreateParseResultError(object runtimeValue) - { - throw ThrowHelper.UnsignedLongType_ParseValue_IsNotUnsigned(this); - } + => ThrowHelper.UnsignedLongType_ParseValue_IsNotUnsigned(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs b/src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs index 9018f5f99d6..e622d155624 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs @@ -57,19 +57,13 @@ protected override IntValueNode ParseValue(ushort runtimeValue) /// <inheritdoc /> protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - throw ThrowHelper.UnsignedShortType_ParseLiteral_IsNotUnsigned(this); - } + => ThrowHelper.UnsignedShortType_ParseLiteral_IsNotUnsigned(this); /// <inheritdoc /> protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - throw ThrowHelper.UnsignedShortType_ParseValue_IsNotUnsigned(this); - } + => ThrowHelper.UnsignedShortType_ParseValue_IsNotUnsigned(this); /// <inheritdoc /> protected override LeafCoercionException CreateParseResultError(object runtimeValue) - { - throw ThrowHelper.UnsignedShortType_ParseValue_IsNotUnsigned(this); - } + => ThrowHelper.UnsignedShortType_ParseValue_IsNotUnsigned(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs b/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs index 4805b280fe1..e7a7c0120ec 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs @@ -1,5 +1,8 @@ using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; @@ -32,78 +35,48 @@ public UtcOffsetType() } /// <inheritdoc /> - public override IValueNode ParseResult(object? resultValue) + protected override TimeSpan OnCoerceInputLiteral(StringValueNode valueLiteral) { - return resultValue switch + if (OffsetLookup.TryDeserialize(valueLiteral.Value, out var parsed)) { - null => NullValueNode.Default, - - string s when OffsetLookup.TryDeserialize(s, out var timeSpan) => - ParseValue(timeSpan), - - TimeSpan ts => ParseValue(ts), + return parsed; + } - _ => throw ThrowHelper.UtcOffset_ParseValue_IsInvalid(this) - }; + throw ThrowHelper.UtcOffsetType_InvalidFormat(this); } /// <inheritdoc /> - protected override TimeSpan ParseLiteral(StringValueNode valueSyntax) + protected override TimeSpan OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (OffsetLookup.TryDeserialize(valueSyntax.Value, out var parsed)) + if (OffsetLookup.TryDeserialize(inputValue.GetString(), out var parsed)) { return parsed; } - throw ThrowHelper.UtcOffset_ParseLiteral_IsInvalid(this); + throw ThrowHelper.UtcOffsetType_InvalidFormat(this); } /// <inheritdoc /> - protected override StringValueNode ParseValue(TimeSpan runtimeValue) + protected override void OnCoerceOutputValue(TimeSpan runtimeValue, ResultElement resultValue) { if (OffsetLookup.TrySerialize(runtimeValue, out var serialized)) { - return new StringValueNode(serialized); + resultValue.SetStringValue(serialized); + return; } - throw ThrowHelper.UtcOffset_ParseValue_IsInvalid(this); + throw ThrowHelper.UtcOffsetType_InvalidFormat(this); } /// <inheritdoc /> - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) + protected override StringValueNode OnValueToLiteral(TimeSpan runtimeValue) { - switch (runtimeValue) + if (OffsetLookup.TrySerialize(runtimeValue, out var serialized)) { - case null: - resultValue = null; - return true; - case TimeSpan timeSpan when OffsetLookup.TrySerialize(timeSpan, out var s): - resultValue = s; - return true; - default: - resultValue = null; - return false; + return new StringValueNode(serialized); } - } - /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - switch (resultValue) - { - case null: - runtimeValue = null; - return true; - case string s when OffsetLookup.TryDeserialize(s, out var timeSpan): - runtimeValue = timeSpan; - return true; - case TimeSpan timeSpan when OffsetLookup.TrySerialize(timeSpan, out _): - runtimeValue = timeSpan; - return true; - default: - runtimeValue = null; - return false; - } + throw ThrowHelper.UtcOffsetType_InvalidFormat(this); } private static class OffsetLookup From ff871c5bb30015e5f1f73dc204706b76e39bc558 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Wed, 7 Jan 2026 10:38:37 +0100 Subject: [PATCH 066/144] Refactor scalar types and remove deprecated ones - Removed UnsignedLongType and UnsignedShortType classes. - Introduced SignedByteType, UnsignedIntType, and UnsignedLongType classes. - Updated UtcOffsetType to handle null values safely. - Simplified the implementation of coercion methods in scalar types. - Removed deprecated scalar types: NegativeFloat, NonNegativeFloat, NegativeInt, NonPositiveInt, NonEmptyString, NonNegativeInt. - Added new error handling for scalar format validation. - Updated resource files to include descriptions for new scalar types. - Enhanced documentation for migration from version 15 to 16. --- .../src/Types.Scalars/EmailAddressType.cs | 2 +- .../Core/src/Types.Scalars/HexColorType.cs | 2 +- .../Core/src/Types.Scalars/HslType.cs | 4 +- .../Core/src/Types.Scalars/HslaType.cs | 4 +- .../Core/src/Types.Scalars/IPv4Type.cs | 2 +- .../Core/src/Types.Scalars/IPv6Type.cs | 2 +- .../Core/src/Types.Scalars/IsbnType.cs | 2 +- .../src/Types.Scalars/LocalCurrencyType.cs | 97 ---- .../Core/src/Types.Scalars/MacAddressType.cs | 2 +- .../src/Types.Scalars/NegativeFloatType.cs | 52 --- .../Core/src/Types.Scalars/NegativeIntType.cs | 53 --- .../src/Types.Scalars/NonEmptyStringType.cs | 53 --- .../src/Types.Scalars/NonNegativeFloatType.cs | 53 --- .../src/Types.Scalars/NonNegativeIntType.cs | 53 --- .../src/Types.Scalars/NonPositiveFloatType.cs | 53 --- .../src/Types.Scalars/NonPositiveIntType.cs | 53 --- .../Core/src/Types.Scalars/PhoneNumberType.cs | 4 +- .../Core/src/Types.Scalars/PortType.cs | 56 --- .../Core/src/Types.Scalars/PositiveIntType.cs | 53 --- .../Core/src/Types.Scalars/PostalCodeType.cs | 291 ------------ .../Core/src/Types.Scalars/RgbType.cs | 6 +- .../Core/src/Types.Scalars/RgbaType.cs | 4 +- .../Types.Scalars/ScalarResources.Designer.cs | 419 +++--------------- .../src/Types.Scalars/ScalarResources.resx | 39 -- .../Core/src/Types.Scalars/SignedByteType.cs | 69 --- .../Core/src/Types.Scalars/ThrowHelper.cs | 266 ----------- .../Core/src/Types.Scalars/UnsignedIntType.cs | 69 --- .../src/Types.Scalars/UnsignedLongType.cs | 69 --- .../src/Types.Scalars/UnsignedShortType.cs | 69 --- .../Core/src/Types.Scalars/UtcOffsetType.cs | 14 +- .../src/Types.Scalars/WellKnownScalarTypes.cs | 11 - .../Properties/TypeResources.Designer.cs | 36 ++ .../src/Types/Properties/TypeResources.resx | 18 + .../src/Types/Types/Contracts/ILeafType.cs | 14 - .../Core/src/Types/Types/EnumType.cs | 4 - .../src/Types/Types/Scalars/DecimalType.cs | 4 +- .../Core/src/Types/Types/Scalars/FloatType.cs | 4 +- .../src/Types/Types/Scalars/FloatTypeBase.cs | 114 +++-- .../Types/Types/Scalars/IntegerTypeBase.cs | 99 +++-- .../Types/Scalars}/RegexType.cs | 54 +-- .../src/Types/Types/Scalars/ScalarNames.cs | 4 + .../src/Types/Types/Scalars/ScalarType.cs | 4 - .../src/Types/Types/Scalars/ScalarType~1.cs | 30 +- .../src/Types/Types/Scalars/SignedByteType.cs | 52 +++ .../Types/Types/Scalars/UnsignedIntType.cs | 52 +++ .../Types/Types/Scalars/UnsignedLongType.cs | 52 +++ .../Types/Types/Scalars/UnsignedShortType.cs | 52 +++ .../Core/src/Types/Utilities/ThrowHelper.cs | 29 ++ .../v16/migrating/migrate-from-15-to-16.md | 15 + 49 files changed, 585 insertions(+), 1978 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/PortType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/PostalCodeType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs delete mode 100644 src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs rename src/HotChocolate/Core/src/{Types.Scalars => Types/Types/Scalars}/RegexType.cs (61%) create mode 100644 src/HotChocolate/Core/src/Types/Types/Scalars/SignedByteType.cs create mode 100644 src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedIntType.cs create mode 100644 src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedLongType.cs create mode 100644 src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedShortType.cs diff --git a/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs b/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs index 759e23b571a..abb156eae93 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/EmailAddressType.cs @@ -44,6 +44,6 @@ public EmailAddressType() ScalarResources.EmailAddressType_Description) { } - protected override LeafCoercionException FormatException() + protected override LeafCoercionException FormatException(string runtimeValue) => ThrowHelper.EmailAddressType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs b/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs index b766a1618b6..4664a860c10 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/HexColorType.cs @@ -41,6 +41,6 @@ public HexColorType() { } - protected override LeafCoercionException FormatException() + protected override LeafCoercionException FormatException(string runtimeValue) => ThrowHelper.HexColorType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/HslType.cs b/src/HotChocolate/Core/src/Types.Scalars/HslType.cs index d5630a05041..30caf589006 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/HslType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/HslType.cs @@ -10,7 +10,7 @@ namespace HotChocolate.Types; public partial class HslType : RegexType { private const string ValidationPattern = - "^(?:hsla?)\\((?:[0-9]+%?(?:deg|rad|grad|turn)?(?:,|\\s)+){2,3}[\\s\\/]*[0-9\\.]+%?\\)"; + "^hsl\\((?:[0-9]+%?(?:deg|rad|grad|turn)?(?:,|\\s)+){2}[0-9]+%?\\)"; [GeneratedRegex(ValidationPattern, RegexOptions.IgnoreCase, DefaultRegexTimeoutInMs)] private static partial Regex CreateRegex(); @@ -41,6 +41,6 @@ public HslType() { } - protected override LeafCoercionException FormatException() + protected override LeafCoercionException FormatException(string runtimeValue) => ThrowHelper.HslType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs b/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs index 81032ea17e0..f905c14c62b 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/HslaType.cs @@ -10,7 +10,7 @@ namespace HotChocolate.Types; public partial class HslaType : RegexType { private const string ValidationPattern = - "^(?:hsla?)\\((?:[0-9]+%?(?:deg|rad|grad|turn)?(?:,|\\s)+){2,3}[\\s\\/]*[0-9\\.]+%?\\)"; + "^(?:hsla?)\\((?:[0-9]+%?(?:deg|rad|grad|turn)?(?:,|\\s)+){2}[0-9]+%?\\s*[,\\/]\\s*[0-9\\.]+%?\\)"; [GeneratedRegex(ValidationPattern, RegexOptions.IgnoreCase, DefaultRegexTimeoutInMs)] private static partial Regex CreateRegex(); @@ -41,6 +41,6 @@ public HslaType() { } - protected override LeafCoercionException FormatException() + protected override LeafCoercionException FormatException(string runtimeValue) => ThrowHelper.HslaType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs b/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs index 2394c948a3e..c63b5d53454 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/IPv4Type.cs @@ -43,6 +43,6 @@ public IPv4Type() { } - protected override LeafCoercionException FormatException() + protected override LeafCoercionException FormatException(string runtimeValue) => ThrowHelper.IPv4Type_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs b/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs index b707368804c..34631d343d2 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/IPv6Type.cs @@ -62,6 +62,6 @@ public IPv6Type() { } - protected override LeafCoercionException FormatException() + protected override LeafCoercionException FormatException(string runtimeValue) => ThrowHelper.IPv6Type_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs b/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs index ad639948e34..bcb53e42100 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/IsbnType.cs @@ -46,6 +46,6 @@ public IsbnType() { } - protected override LeafCoercionException FormatException() + protected override LeafCoercionException FormatException(string runtimeValue) => ThrowHelper.IsbnType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs b/src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs deleted file mode 100644 index 20704dda861..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/LocalCurrencyType.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Text.Json; -using HotChocolate.Features; -using HotChocolate.Language; -using HotChocolate.Text.Json; - -namespace HotChocolate.Types; - -/// <summary> -/// The `LocalCurrency` scalar type is a currency string. -/// </summary> -public class LocalCurrencyType : ScalarType<decimal, StringValueNode> -{ - private readonly CultureInfo _cultureInfo; - - /// <summary> - /// Initializes a new instance of the <see cref="LocalCurrencyType"/> class. - /// </summary> - public LocalCurrencyType( - string name, - string culture = "en-US", - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base( - name, - bind) - { - _cultureInfo = CultureInfo.CreateSpecificCulture(culture); - Description = description; - } - - /// <summary> - /// Initializes a new instance of the <see cref="LocalCurrencyType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public LocalCurrencyType() - : this( - WellKnownScalarTypes.LocalCurrency, - description: ScalarResources.LocalCurrencyType_Description) - { - } - - /// <inheritdoc /> - protected override decimal OnCoerceInputLiteral(StringValueNode valueLiteral) - { - if (TryDeserializeFromString(valueLiteral.Value, out var value)) - { - return value.Value; - } - - throw ThrowHelper.LocalCurrencyType_InvalidFormat(this); - } - - /// <inheritdoc /> - protected override decimal OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) - { - if (TryDeserializeFromString(inputValue.GetString(), out var value)) - { - return value.Value; - } - - throw ThrowHelper.LocalCurrencyType_InvalidFormat(this); - } - - /// <inheritdoc /> - protected override void OnCoerceOutputValue(decimal runtimeValue, ResultElement resultValue) - { - resultValue.SetStringValue(Serialize(runtimeValue)); - } - - /// <inheritdoc /> - protected override StringValueNode OnValueToLiteral(decimal runtimeValue) - { - return new StringValueNode(Serialize(runtimeValue)); - } - - private string Serialize(IFormattable value) - { - return value.ToString("c", _cultureInfo); - } - - private bool TryDeserializeFromString( - string? serialized, - [NotNullWhen(true)] out decimal? value) - { - if (serialized is not null - && decimal.TryParse(serialized, NumberStyles.Currency, _cultureInfo, out var d)) - { - value = d; - return true; - } - - value = null; - return false; - } -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs b/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs index 0c576067e6a..db17df9f2df 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/MacAddressType.cs @@ -57,6 +57,6 @@ public MacAddressType() { } - protected override LeafCoercionException FormatException() + protected override LeafCoercionException FormatException(string runtimeValue) => ThrowHelper.MacAddressType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs deleted file mode 100644 index 1f04c42c985..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/NegativeFloatType.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Text.Json; -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The NegativeFloatType scalar represents a double‐precision fractional value less than 0. -/// </summary> -public class NegativeFloatType : FloatType -{ - /// <summary> - /// Initializes a new instance of <see cref="NegativeFloatType"/> - /// </summary> - public NegativeFloatType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, description, double.MinValue, 0, bind) - { - } - - /// <summary> - /// Initializes a new instance of <see cref="NegativeFloatType"/> - /// </summary> - [ActivatorUtilitiesConstructor] - public NegativeFloatType() - : this( - WellKnownScalarTypes.NegativeFloat, - ScalarResources.NegativeFloatType_Description) - { - } - - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => runtimeValue is double d && d < MaxValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral is IFloatValueLiteral floatValueLiteral && floatValueLiteral.ToDouble() < MaxValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(JsonElement inputValue) - => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetDouble() < MaxValue; - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.NegativeFloatType_ParseLiteral_IsNotNegative(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => ThrowHelper.NegativeFloatType_ParseValue_IsNotNegative(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs deleted file mode 100644 index b46e299397d..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/NegativeIntType.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Text.Json; -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The NegativeIntType scalar type represents a signed 32-bit numeric non-fractional with a -/// maximum of -1. -/// </summary> -public class NegativeIntType : IntType -{ - /// <summary> - /// Initializes a new instance of the <see cref="NegativeIntType"/> class. - /// </summary> - public NegativeIntType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, description, int.MinValue, -1, bind) - { - } - - /// <summary> - /// Initializes a new instance of the <see cref="NegativeIntType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public NegativeIntType() - : this( - WellKnownScalarTypes.NegativeInt, - ScalarResources.NegativeIntType_Description) - { - } - - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => runtimeValue is int i && i <= MaxValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral is IntValueNode intValueNode && intValueNode.ToInt32() <= MaxValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(JsonElement inputValue) - => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetInt32() <= MaxValue; - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.NegativeIntType_ParseLiteral_IsNotNegative(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => ThrowHelper.NegativeIntType_ParseValue_IsNotNegative(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs deleted file mode 100644 index e10d1bfe811..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/NonEmptyStringType.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Text.Json; -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The NonEmptyString scalar type represents non-empty textual data, represented as -/// UTF‐8 character sequences with at least one character -/// </summary> -public class NonEmptyStringType : StringType -{ - /// <summary> - /// Initializes a new instance of the <see cref="NonEmptyStringType"/> class. - /// </summary> - public NonEmptyStringType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, description, bind) - { - } - - /// <summary> - /// Initializes a new instance of the <see cref="NonEmptyStringType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public NonEmptyStringType() - : this( - WellKnownScalarTypes.NonEmptyString, - ScalarResources.NonEmptyStringType_Description) - { - } - - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => runtimeValue is string s && s != string.Empty; - - /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral is StringValueNode stringValueNode && stringValueNode.Value != string.Empty; - - /// <inheritdoc /> - public override bool IsValueCompatible(JsonElement inputValue) - => inputValue.ValueKind is JsonValueKind.String && inputValue.GetString() != string.Empty; - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.NonEmptyStringType_ParseLiteral_IsEmpty(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => ThrowHelper.NonEmptyStringType_ParseValue_IsEmpty(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs deleted file mode 100644 index e4fe7b99c09..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeFloatType.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Text.Json; -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The NonNegativeFloatType scalar represents a double‐precision fractional value greater than -/// or equal to 0. -/// </summary> -public class NonNegativeFloatType : FloatType -{ - /// <summary> - /// Initializes a new instance of <see cref="NonNegativeFloatType"/> - /// </summary> - public NonNegativeFloatType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, description, 0, double.MaxValue, bind) - { - } - - /// <summary> - /// Initializes a new instance of <see cref="NonNegativeFloatType"/> - /// </summary> - [ActivatorUtilitiesConstructor] - public NonNegativeFloatType() - : this( - WellKnownScalarTypes.NonNegativeFloat, - ScalarResources.NonNegativeFloatType_Description) - { - } - - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => runtimeValue is double d && d >= MinValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral is IFloatValueLiteral floatValueLiteral && floatValueLiteral.ToDouble() >= MinValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(JsonElement inputValue) - => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetDouble() >= MinValue; - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.NonNegativeFloatType_ParseLiteral_IsNotNonNegative(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => ThrowHelper.NonNegativeFloatType_ParseValue_IsNotNonNegative(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs deleted file mode 100644 index f8d0c733c55..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/NonNegativeIntType.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Text.Json; -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The NonNegativeIntType scalar type represents a unsigned 32-bit numeric non-fractional value -/// greater than or equal to 0. -/// </summary> -public class NonNegativeIntType : IntType -{ - /// <summary> - /// Initializes a new instance of the <see cref="NonNegativeIntType"/> class. - /// </summary> - public NonNegativeIntType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, description, 0, int.MaxValue, bind) - { - } - - /// <summary> - /// Initializes a new instance of the <see cref="NonNegativeIntType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public NonNegativeIntType() - : this( - WellKnownScalarTypes.NonNegativeInt, - ScalarResources.NonNegativeIntType_Description) - { - } - - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => runtimeValue is int i && i >= MinValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral is IntValueNode intValueNode && intValueNode.ToInt32() >= MinValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(JsonElement inputValue) - => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetInt32() >= MinValue; - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.NonNegativeIntType_ParseLiteral_IsNotNonNegative(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => ThrowHelper.NonNegativeIntType_ParseValue_IsNotNonNegative(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs deleted file mode 100644 index aa5a082b3e2..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveFloatType.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Text.Json; -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The NonPositiveFloat scalar type represents a double‐precision fractional value less than or -/// equal to 0. -/// </summary> -public class NonPositiveFloatType : FloatType -{ - /// <summary> - /// Initializes a new instance of <see cref="NonPositiveFloatType"/> - /// </summary> - public NonPositiveFloatType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, description, double.MinValue, 0, bind) - { - } - - /// <summary> - /// Initializes a new instance of <see cref="NonPositiveFloatType"/> - /// </summary> - [ActivatorUtilitiesConstructor] - public NonPositiveFloatType() - : this( - WellKnownScalarTypes.NonPositiveFloat, - ScalarResources.NonPositiveFloatType_Description) - { - } - - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => runtimeValue is double d && d <= MaxValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral is IFloatValueLiteral floatValueLiteral && floatValueLiteral.ToDouble() <= MaxValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(JsonElement inputValue) - => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetDouble() <= MaxValue; - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.NonPositiveFloatType_ParseLiteral_IsNotNonPositive(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => ThrowHelper.NonPositiveFloatType_ParseValue_IsNotNonPositive(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs deleted file mode 100644 index 9841378a163..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/NonPositiveIntType.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Text.Json; -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The NonPositiveIntType scalar type represents a signed 32-bit numeric non-fractional value -/// less than or equal to 0. -/// </summary> -public class NonPositiveIntType : IntType -{ - /// <summary> - /// Initializes a new instance of <see cref="NonPositiveIntType"/> - /// </summary> - public NonPositiveIntType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, description, int.MinValue, 0, bind) - { - } - - /// <summary> - /// Initializes a new instance of <see cref="NonPositiveIntType"/> - /// </summary> - [ActivatorUtilitiesConstructor] - public NonPositiveIntType() - : this( - WellKnownScalarTypes.NonPositiveInt, - ScalarResources.NonPositiveIntType_Description) - { - } - - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => runtimeValue is int i && i <= MaxValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral is IntValueNode intValueNode && intValueNode.ToInt32() <= MaxValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(JsonElement inputValue) - => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetInt32() <= MaxValue; - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.NonPositiveIntType_ParseLiteral_IsNotNonPositive(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => ThrowHelper.NonPositiveIntType_ParseValue_IsNotNonPositive(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs b/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs index caccbbe2fcd..46be63fb646 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/PhoneNumberType.cs @@ -4,7 +4,7 @@ namespace HotChocolate.Types; /// <summary> -/// The `PhoneNumber` scalar type scalar type represents a value that conforms to the standard +/// The `PhoneNumber` scalar type represents a value that conforms to the standard /// E.164 format. <a href="https://en.wikipedia.org/wiki/E.164">See More</a>. /// </summary> public partial class PhoneNumberType : RegexType @@ -43,6 +43,6 @@ public PhoneNumberType() { } - protected override LeafCoercionException FormatException() + protected override LeafCoercionException FormatException(string runtimeValue) => ThrowHelper.PhoneNumberType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/PortType.cs b/src/HotChocolate/Core/src/Types.Scalars/PortType.cs deleted file mode 100644 index 7a173bfaeed..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/PortType.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Text.Json; -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The `Port` scalar type represents a field whose value is a valid TCP port within the -/// range of 0 to 65535 as defined here: -/// <a href="https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_ports"> -/// TCP ports -/// </a> -/// </summary> -public class PortType : IntType -{ - /// <summary> - /// Initializes a new instance of the <see cref="PortType"/> class. - /// </summary> - public PortType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, description, 0, 65535, bind) - { - } - - /// <summary> - /// Initializes a new instance of the <see cref="PortType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public PortType() - : this( - WellKnownScalarTypes.Port, - ScalarResources.PortType_Description) - { - } - - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => runtimeValue is int i && i >= MinValue && i <= MaxValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral is IntValueNode intValueNode && intValueNode.ToInt32() >= MinValue && intValueNode.ToInt32() <= MaxValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(JsonElement inputValue) - => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetInt32() >= MinValue && inputValue.GetInt32() <= MaxValue; - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.PortType_ParseLiteral_OutOfRange(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => ThrowHelper.PortType_ParseValue_OutOfRange(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs deleted file mode 100644 index 1a0258bca27..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/PositiveIntType.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Text.Json; -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The PositiveInt scalar type represents a signed 32‐bit numeric non‐fractional -/// value of at least the value 1. -/// </summary> -public class PositiveIntType : IntType -{ - /// <summary> - /// Initializes a new instance of the <see cref="PositiveIntType"/> class. - /// </summary> - public PositiveIntType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, description, min: 1, bind: bind) - { - } - - /// <summary> - /// Initializes a new instance of the <see cref="PositiveIntType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public PositiveIntType() - : this( - WellKnownScalarTypes.PositiveInt, - ScalarResources.PositiveIntType_Description) - { - } - - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => runtimeValue is int i && i >= MinValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral is IntValueNode intValueNode && intValueNode.ToInt32() >= MinValue; - - /// <inheritdoc /> - public override bool IsValueCompatible(JsonElement inputValue) - => inputValue.ValueKind is JsonValueKind.Number && inputValue.GetInt32() >= MinValue; - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.PositiveIntType_ParseLiteral_ZeroOrLess(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => ThrowHelper.PositiveIntType_ParseValue_ZeroOrLess(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/PostalCodeType.cs b/src/HotChocolate/Core/src/Types.Scalars/PostalCodeType.cs deleted file mode 100644 index a7d6a1e600e..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/PostalCodeType.cs +++ /dev/null @@ -1,291 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using System.Text.RegularExpressions; -using HotChocolate.Language; -using static HotChocolate.Types.RegexType; - -namespace HotChocolate.Types; - -/// <summary> -/// The PostalCode scalar type represents a valid postal code. -/// </summary> -#if DISABLED_DUE_TO_COMPILER_ISSUE -public partial class PostalCodeType : StringType -#else -public class PostalCodeType : StringType -#endif -{ - /// <summary> - /// Different validation patterns for postal codes. - /// </summary> - private static readonly Regex[] s_validationPatterns = - [ - CreateRegexUs(), - CreateRegexUk(), - CreateRegexDe(), - CreateRegexCa(), - CreateRegexFr(), - CreateRegexIt(), - CreateRegexAu(), - CreateRegexNl(), - CreateRegexEs(), - CreateRegexDk(), - CreateRegexSe(), - CreateRegexBe(), - CreateRegexIn(), - CreateRegexAt(), - CreateRegexPt(), - CreateRegexCh(), - CreateRegexLu() - ]; - -#if DISABLED_DUE_TO_COMPILER_ISSUE - [GeneratedRegex(PostalCodePatterns.US, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexUs(); - - [GeneratedRegex(PostalCodePatterns.UK, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexUk(); - - [GeneratedRegex(PostalCodePatterns.DE, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexDe(); - - [GeneratedRegex(PostalCodePatterns.CA, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexCa(); - - [GeneratedRegex(PostalCodePatterns.FR, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexFr(); - - [GeneratedRegex(PostalCodePatterns.IT, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexIt(); - - [GeneratedRegex(PostalCodePatterns.AU, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexAu(); - - [GeneratedRegex(PostalCodePatterns.NL, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexNl(); - - [GeneratedRegex(PostalCodePatterns.ES, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexEs(); - - [GeneratedRegex(PostalCodePatterns.DK, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexDk(); - - [GeneratedRegex(PostalCodePatterns.SE, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexSe(); - - [GeneratedRegex(PostalCodePatterns.BE, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexBe(); - - [GeneratedRegex(PostalCodePatterns.IN, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexIn(); - - [GeneratedRegex(PostalCodePatterns.AT, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexAt(); - - [GeneratedRegex(PostalCodePatterns.PT, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexPt(); - - [GeneratedRegex(PostalCodePatterns.CH, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexCh(); - - [GeneratedRegex(PostalCodePatterns.LU, RegexOptions.None, DefaultRegexTimeoutInMs)] - private static partial Regex CreateRegexLu(); -#else - private static Regex CreateRegexUs() - => CreateRegex(PostalCodePatterns.US); - - private static Regex CreateRegexUk() - => CreateRegex(PostalCodePatterns.UK); - - private static Regex CreateRegexDe() - => CreateRegex(PostalCodePatterns.DE); - - private static Regex CreateRegexCa() - => CreateRegex(PostalCodePatterns.CA); - - private static Regex CreateRegexFr() - => CreateRegex(PostalCodePatterns.FR); - - private static Regex CreateRegexIt() - => CreateRegex(PostalCodePatterns.IT); - - private static Regex CreateRegexAu() - => CreateRegex(PostalCodePatterns.AU); - - private static Regex CreateRegexNl() - => CreateRegex(PostalCodePatterns.NL); - - private static Regex CreateRegexEs() - => CreateRegex(PostalCodePatterns.ES); - - private static Regex CreateRegexDk() - => CreateRegex(PostalCodePatterns.DK); - - private static Regex CreateRegexSe() - => CreateRegex(PostalCodePatterns.SE); - - private static Regex CreateRegexBe() - => CreateRegex(PostalCodePatterns.BE); - - private static Regex CreateRegexIn() - => CreateRegex(PostalCodePatterns.IN); - - private static Regex CreateRegexAt() - => CreateRegex(PostalCodePatterns.AT); - - private static Regex CreateRegexPt() - => CreateRegex(PostalCodePatterns.PT); - - private static Regex CreateRegexCh() - => CreateRegex(PostalCodePatterns.CH); - - private static Regex CreateRegexLu() - => CreateRegex(PostalCodePatterns.LU); - - private static Regex CreateRegex(string pattern) - => new Regex( - pattern, - RegexOptions.Compiled, - TimeSpan.FromMilliseconds(DefaultRegexTimeoutInMs)); -#endif - - /// <summary> - /// Initializes a new instance of the <see cref="PostalCodeType"/> class. - /// </summary> - public PostalCodeType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, description, bind) - { - } - - /// <summary> - /// Initializes a new instance of the <see cref="PostalCodeType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public PostalCodeType() - : this( - WellKnownScalarTypes.PostalCode, - ScalarResources.PostalCodeType_Description) - { - } - - /// <inheritdoc /> - protected override bool IsInstanceOfType(string runtimeValue) - { - return ValidatePostCode(runtimeValue); - } - - /// <inheritdoc /> - protected override bool IsInstanceOfType(StringValueNode valueSyntax) - { - return ValidatePostCode(valueSyntax.Value); - } - - /// <inheritdoc /> - public override bool TryCoerceOutputValue(object? runtimeValue, out object? resultValue) - { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is string s - && ValidatePostCode(s)) - { - resultValue = s; - return true; - } - - resultValue = null; - return false; - } - - /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is string s - && ValidatePostCode(s)) - { - runtimeValue = s; - return true; - } - - runtimeValue = null; - return false; - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - { - return ThrowHelper.PostalCodeType_ParseLiteral_IsInvalid(this); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - { - return ThrowHelper.PostalCodeType_ParseValue_IsInvalid(this); - } - - private static bool ValidatePostCode(string postCode) - { - for (var i = 0; i < s_validationPatterns.Length; i++) - { - if (s_validationPatterns[i].IsMatch(postCode)) - { - return true; - } - } - - return false; - } - - [SuppressMessage("ReSharper", "InconsistentNaming")] - private static class PostalCodePatterns - { - public const string US = - "(^[0-9]{5}([-]?[0-9]{4})?$)"; - public const string UK = - "(^(GIR|[A-Z][0-9][A-Z0-9]??|[A-Z]{2}[0-9][A-Z0-9]??)[ ]??([0-9][A-Z]{2})$)"; - public const string DE = - "(\\b((?:0[1-46-9][0-9]{3})|(?:[1-357-9][0-9]{4})|(?:[4][0-24-9]" - + "[0-9]{3})|(?:[6][013-9][0-9]{3}))\\b)"; - public const string CA = - "(^([ABCEGHJKLMNPRSTVXY][0-9][ABCEGHJKLMNPRSTVWXYZ]) {0,1}" - + "([0-9][ABCEGHJKLMNPRSTVWXYZ][0-9])$)"; - public const string FR = - "(^([Ff]-)?((2[ABab])|[0-9]{2})[0-9]{3}$)"; - public const string IT = - "(^([VIvi]-)?[0-9]{5}$)"; - public const string AU = - "(^(0[289][0-9]{2})|([1345689][0-9]{3})|(2[0-8][0-9]{2})|(290[0-9])|" - + "(291[0-4])|(7[0-4][0-9]{2})|(7[8-9][0-9]{2})$)"; - public const string NL = - "(^[1-9][0-9]{3}\\s?([a-zA-Z]{2})?$)"; - public const string ES = - "(^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$)"; - public const string DK = - "(^([Dd][Kk]( |-))?[1-9]{1}[0-9]{3}$)"; - public const string SE = - "(^(s-|S-){0,1}[0-9]{3}\\s?[0-9]{2}$)"; - public const string BE = - "(^[1-9]{1}[0-9]{3}$)"; - public const string IN = - "(^[0-9]{6}$)"; - public const string AT = - "(^[0-9]{4}$)"; - public const string PT = - "(^[0-9]{4}([\\-][0-9]{3})?$)"; - public const string CH = - "(^[0-9]{4}$)"; - public const string LU = - "(^[0-9]{4}$)"; - } -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs b/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs index 00229e82330..c1df491ef5b 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/RgbType.cs @@ -12,7 +12,7 @@ namespace HotChocolate.Types; public partial class RgbType : RegexType { private const string ValidationPattern = - "((?:rgba?)\\((?:[0-9]+%?(?:,|\\s)+){2,3}[\\s\\/]*[0-9\\.]+%?\\))"; + "(rgb\\((?:[0-9]+%?(?:,|\\s)+){2}[0-9]+%?\\))"; [GeneratedRegex(ValidationPattern, RegexOptions.IgnoreCase, DefaultRegexTimeoutInMs)] private static partial Regex CreateRegex(); @@ -33,7 +33,7 @@ public RgbType( } /// <summary> - /// Initializes a new instance of the <see cref="IPv6Type"/> class. + /// Initializes a new instance of the <see cref="RgbType"/> class. /// </summary> [ActivatorUtilitiesConstructor] public RgbType() @@ -43,6 +43,6 @@ public RgbType() { } - protected override LeafCoercionException FormatException() + protected override LeafCoercionException FormatException(string runtimeValue) => ThrowHelper.RgbType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs b/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs index 633b99531cb..cfe0d9adfa6 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/RgbaType.cs @@ -10,7 +10,7 @@ namespace HotChocolate.Types; public partial class RgbaType : RegexType { private const string ValidationPattern = - "((?:rgba?)\\((?:[0-9]+%?(?:,|\\s)+){2,3}[\\s\\/]*[0-9\\.]+%?\\))"; + "(rgba?\\((?:[0-9]+%?(?:,|\\s)+){2}[0-9]+%?\\s*[,\\/]\\s*[0-9\\.]+%?\\))"; [GeneratedRegex(ValidationPattern, RegexOptions.IgnoreCase, DefaultRegexTimeoutInMs)] private static partial Regex CreateRegex(); @@ -41,6 +41,6 @@ public RgbaType() { } - protected override LeafCoercionException FormatException() + protected override LeafCoercionException FormatException(string runtimeValue) => ThrowHelper.RgbaType_InvalidFormat(this); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs index 40ceb5a304b..af32d672920 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs @@ -11,46 +11,32 @@ namespace HotChocolate.Types { using System; - /// <summary> - /// A strongly-typed resource class, for looking up localized strings, etc. - /// </summary> - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class ScalarResources { - private static global::System.Resources.ResourceManager resourceMan; + private static System.Resources.ResourceManager resourceMan; - private static global::System.Globalization.CultureInfo resourceCulture; + private static System.Globalization.CultureInfo resourceCulture; - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ScalarResources() { } - /// <summary> - /// Returns the cached ResourceManager instance used by this class. - /// </summary> - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager { get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HotChocolate.Types.ScalarResources", typeof(ScalarResources).Assembly); + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("HotChocolate.Types.ScalarResources", typeof(ScalarResources).Assembly); resourceMan = temp; } return resourceMan; } } - /// <summary> - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// </summary> - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -59,657 +45,360 @@ internal ScalarResources() { } } - /// <summary> - /// Looks up a localized string similar to The EmailAddress scalar type constitutes a valid email address, represented as a UTF-8 character sequence. The scalar follows the specification defined by the HTML Spec https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address.. - /// </summary> internal static string EmailAddressType_Description { get { return ResourceManager.GetString("EmailAddressType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to EmailAddressType cannot parse the provided value. The provided value does not meet the RFC 5322 specification. - /// </summary> internal static string EmailAddressType_InvalidFormat { get { return ResourceManager.GetString("EmailAddressType_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The HexColor scalar type represents a valid HexColor color code.. - /// </summary> internal static string HexColorType_Description { get { return ResourceManager.GetString("HexColorType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to HexColorType cannot parse the provided value. The provided value is not a valid HEX color code. - /// </summary> internal static string HexColorType_InvalidFormat { get { return ResourceManager.GetString("HexColorType_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The Hsla scalar type represents a CSS HSLA color as defined in https://www.w3.org/TR/css-color-3/#hsla-color. - /// </summary> + internal static string HslType_Description { + get { + return ResourceManager.GetString("HslType_Description", resourceCulture); + } + } + + internal static string HslType_InvalidFormat { + get { + return ResourceManager.GetString("HslType_InvalidFormat", resourceCulture); + } + } + internal static string HslaType_Description { get { return ResourceManager.GetString("HslaType_Description", resourceCulture); } } - - /// <summary> - /// Looks up a localized string similar to HslaType cannot parse the provided value. The provided value is not a valid CSS HSLA color code. - /// </summary> + internal static string HslaType_InvalidFormat { get { return ResourceManager.GetString("HslaType_InvalidFormat", resourceCulture); } } - - /// <summary> - /// Looks up a localized string similar to The Hsl scalar type represents a valid CSS HSL color defined in https://www.w3.org/TR/css-color-3/#hsl-color. - /// </summary> - internal static string HslType_Description { + + internal static string MacAddressType_Description { get { - return ResourceManager.GetString("HslType_Description", resourceCulture); + return ResourceManager.GetString("MacAddressType_Description", resourceCulture); } } - - /// <summary> - /// Looks up a localized string similar to HslType cannot parse the provided value. The provided value is not a valid CSS HSL color code. - /// </summary> - internal static string HslType_InvalidFormat { + + internal static string MacAddressType_InvalidFormat { get { - return ResourceManager.GetString("HslType_InvalidFormat", resourceCulture); + return ResourceManager.GetString("MacAddressType_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The IPv4 scalar type represents a valid IPv4 address as defined in RFC791. - /// </summary> internal static string IPv4Type_Description { get { return ResourceManager.GetString("IPv4Type_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to IPv4Type cannot parse the provided value. The provided value is not a valid IPv4 address. - /// </summary> internal static string IPv4Type_InvalidFormat { get { return ResourceManager.GetString("IPv4Type_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The IPv6 scalar type represents a valid IPv6 address as defined in RFC8064. - /// </summary> internal static string IPv6Type_Description { get { return ResourceManager.GetString("IPv6Type_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to IPv6Type cannot parse the provided value. The provided value is not a valid IPv6 address. - /// </summary> internal static string IPv6Type_InvalidFormat { get { return ResourceManager.GetString("IPv6Type_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The ISBN scalar type is an ISBN-10 or ISBN-13 number: https://en.wikipedia.org/wiki/International_Standard_Book_Number.. - /// </summary> internal static string IsbnType_Description { get { return ResourceManager.GetString("IsbnType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to IsbnType cannot parse the provided value. The provided value is not a valid ISBN number. - /// </summary> internal static string IsbnType_InvalidFormat { get { return ResourceManager.GetString("IsbnType_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The Latitude scalar type represents represents a valid decimal degrees latitude number.. - /// </summary> internal static string LatitudeType_Description { get { return ResourceManager.GetString("LatitudeType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to LatitudeType cannot parse the provided value. The provided value was not a valid decimal degrees latitude number. - /// </summary> internal static string LatitudeType_InvalidFormat { get { return ResourceManager.GetString("LatitudeType_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The LocalCurrency scalar type is a currency string.. - /// </summary> internal static string LocalCurrencyType_Description { get { return ResourceManager.GetString("LocalCurrencyType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to LocalCurrencyType cannot parse the provided value. The provided value is not a valid local currency. - /// </summary> internal static string LocalCurrencyType_InvalidFormat { get { return ResourceManager.GetString("LocalCurrencyType_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The Longitude scalar type is a valid decimal degrees longitude number.. - /// </summary> internal static string LongitudeType_Description { get { return ResourceManager.GetString("LongitudeType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to LongitudeType cannot parse the provided value. The provided value is not a valid longitude number. - /// </summary> internal static string LongitudeType_InvalidFormat { get { return ResourceManager.GetString("LongitudeType_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The `MacAddress` scalar type represents an IEEE 802 48-bit or 64-bit Mac address, represented as UTF-8 character sequences. The scalar follows the specifications defined in RFC7042 and RFC7043 respectively.. - /// </summary> - internal static string MacAddressType_Description { - get { - return ResourceManager.GetString("MacAddressType_Description", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to MacAddressType cannot parse the provided value. The provided value is not a valid MAC address. - /// </summary> - internal static string MacAddressType_InvalidFormat { - get { - return ResourceManager.GetString("MacAddressType_InvalidFormat", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to The NegativeFloat scalar type represents a double‐precision fractional value less than 0.. - /// </summary> internal static string NegativeFloatType_Description { get { return ResourceManager.GetString("NegativeFloatType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NegativeFloatType cannot parse the provided literal. The provided value was not negative.. - /// </summary> internal static string NegativeFloatType_IsNotNegative_ParseLiteral { get { return ResourceManager.GetString("NegativeFloatType_IsNotNegative_ParseLiteral", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NegativeFloatType cannot parse the provided value. The provided value was not negative.. - /// </summary> internal static string NegativeFloatType_IsNotNegative_ParseValue { get { return ResourceManager.GetString("NegativeFloatType_IsNotNegative_ParseValue", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The NegativeInt scalar type represents a signed 32-bit numeric non-fractional with a maximum of -1.. - /// </summary> internal static string NegativeIntType_Description { get { return ResourceManager.GetString("NegativeIntType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NegativeIntType cannot parse the provided literal. The provided value was not negative.. - /// </summary> internal static string NegativeIntType_IsNotNegative_ParseLiteral { get { return ResourceManager.GetString("NegativeIntType_IsNotNegative_ParseLiteral", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NegativeIntType cannot parse the provided value. The provided value was not negative.. - /// </summary> internal static string NegativeIntType_IsNotNegative_ParseValue { get { return ResourceManager.GetString("NegativeIntType_IsNotNegative_ParseValue", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The NonEmptyString scalar type represents non empty textual data, represented as UTF‐8 character sequences with at least one character. - /// </summary> internal static string NonEmptyStringType_Description { get { return ResourceManager.GetString("NonEmptyStringType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NonEmptyStringType cannot parse the provided literal. The provided string was empty.. - /// </summary> internal static string NonEmptyStringType_IsEmpty_ParseLiteral { get { return ResourceManager.GetString("NonEmptyStringType_IsEmpty_ParseLiteral", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NonEmptyStringType cannot parse the provided value. The provided string was empty.. - /// </summary> internal static string NonEmptyStringType_IsEmpty_ParseValue { get { return ResourceManager.GetString("NonEmptyStringType_IsEmpty_ParseValue", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The NonNegativeFloat scalar type represents a double‐precision fractional value greater than or equal to 0.. - /// </summary> - internal static string NonNegativeFloatType_Description { - get { - return ResourceManager.GetString("NonNegativeFloatType_Description", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to NonNegativeFloatType cannot parse the provided literal. The provided value was not greater than or equal to 0.. - /// </summary> - internal static string NonNegativeFloatType_IsNotNonNegative_ParseLiteral { - get { - return ResourceManager.GetString("NonNegativeFloatType_IsNotNonNegative_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to NonNegativeFloatType cannot parse the provided value. The provided value was not greater than or equal to 0.. - /// </summary> - internal static string NonNegativeFloatType_IsNotNonNegative_ParseValue { - get { - return ResourceManager.GetString("NonNegativeFloatType_IsNotNonNegative_ParseValue", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to The NonNegativeInt scalar type represents a unsigned 32-bit numeric non-fractional value equal to or greater than 0.. - /// </summary> internal static string NonNegativeIntType_Description { get { return ResourceManager.GetString("NonNegativeIntType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NonNegativeIntType cannot parse the provided literal. The provided value was not greater than or equal to 0.. - /// </summary> internal static string NonNegativeIntType_IsNotNonNegative_ParseLiteral { get { return ResourceManager.GetString("NonNegativeIntType_IsNotNonNegative_ParseLiteral", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NonNegativeIntType cannot parse the provided value. The provided value was not greater than or equal to 0.. - /// </summary> internal static string NonNegativeIntType_IsNotNonNegative_ParseValue { get { return ResourceManager.GetString("NonNegativeIntType_IsNotNonNegative_ParseValue", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The NonPositiveFloat scalar type represents a double‐precision fractional value less than or equal to 0.. - /// </summary> internal static string NonPositiveFloatType_Description { get { return ResourceManager.GetString("NonPositiveFloatType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NonPositiveFloatType cannot parse the provided literal. The provided value was not less than or equal to 0.. - /// </summary> internal static string NonPositiveFloatType_IsNotNonPositive_ParseLiteral { get { return ResourceManager.GetString("NonPositiveFloatType_IsNotNonPositive_ParseLiteral", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NonPositiveFloatType cannot parse the provided value. The provided value was not less than or equal to 0.. - /// </summary> internal static string NonPositiveFloatType_IsNotNonPositive_ParseValue { get { return ResourceManager.GetString("NonPositiveFloatType_IsNotNonPositive_ParseValue", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The NonPositiveInt scalar type represents a signed 32-bit numeric non-fractional value less than or equal to 0.. - /// </summary> internal static string NonPositiveIntType_Description { get { return ResourceManager.GetString("NonPositiveIntType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NonPositiveIntType cannot parse the provided literal. The provided value was not less than or equal to 0.. - /// </summary> internal static string NonPositiveIntType_IsNotNonPositive_ParseLiteral { get { return ResourceManager.GetString("NonPositiveIntType_IsNotNonPositive_ParseLiteral", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to NonPositiveIntType cannot parse the provided value. The provided value was not less than or equal to 0.. - /// </summary> internal static string NonPositiveIntType_IsNotNonPositive_ParseValue { get { return ResourceManager.GetString("NonPositiveIntType_IsNotNonPositive_ParseValue", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The PhoneNumber scalar type represents a value that conforms to the standard E.164 format.. - /// </summary> + internal static string NonNegativeFloatType_Description { + get { + return ResourceManager.GetString("NonNegativeFloatType_Description", resourceCulture); + } + } + + internal static string NonNegativeFloatType_IsNotNonNegative_ParseLiteral { + get { + return ResourceManager.GetString("NonNegativeFloatType_IsNotNonNegative_ParseLiteral", resourceCulture); + } + } + + internal static string NonNegativeFloatType_IsNotNonNegative_ParseValue { + get { + return ResourceManager.GetString("NonNegativeFloatType_IsNotNonNegative_ParseValue", resourceCulture); + } + } + internal static string PhoneNumberType_Description { get { return ResourceManager.GetString("PhoneNumberType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to PhoneNumberType cannot parse the provided value. The provided value does not meet the standard E.164 format. - /// </summary> internal static string PhoneNumberType_InvalidFormat { get { return ResourceManager.GetString("PhoneNumberType_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The Port scalar type represents a field whose value is a valid TCP port within the range of 0 to 65535: https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_ports.. - /// </summary> internal static string PortType_Description { get { return ResourceManager.GetString("PortType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to Port cannot parse the provided literal. The provided value was not within the valid range.. - /// </summary> internal static string PortType_OutOfRange_ParseLiteral { get { return ResourceManager.GetString("PortType_OutOfRange_ParseLiteral", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to Port cannot parse the provided value. The provided value was not within the valid range.. - /// </summary> internal static string PortType_OutOfRange_ParseValue { get { return ResourceManager.GetString("PortType_OutOfRange_ParseValue", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The PositiveInt scalar type represents a signed 32-bit numeric non-fractional value of at least the value 1.. - /// </summary> internal static string PositiveIntType_Description { get { return ResourceManager.GetString("PositiveIntType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to PositiveIntType cannot parse the provided literal. The provided value is 0 or less.. - /// </summary> internal static string PositiveIntType_ZeroOrLess_ParseLiteral { get { return ResourceManager.GetString("PositiveIntType_ZeroOrLess_ParseLiteral", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to PositiveIntType cannot parse the provided value. The provided value is 0 or less.. - /// </summary> internal static string PositiveIntType_ZeroOrLess_ParseValue { get { return ResourceManager.GetString("PositiveIntType_ZeroOrLess_ParseValue", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The PostalCode scalar type represents a valid postal code.. - /// </summary> internal static string PostalCodeType_Description { get { return ResourceManager.GetString("PostalCodeType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to PostalCodeType cannot parse the provided literal. The provided value is an invalid postal code.. - /// </summary> internal static string PostalCodeType_IsInvalid_ParseLiteral { get { return ResourceManager.GetString("PostalCodeType_IsInvalid_ParseLiteral", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to PostalCodeType cannot parse the provided value. The provided value is an invalid postal code.. - /// </summary> internal static string PostalCodeType_IsInvalid_ParseValue { get { return ResourceManager.GetString("PostalCodeType_IsInvalid_ParseValue", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to {0}Type cannot parse the provided value. The value does not match the required regular expression pattern. - /// </summary> - internal static string RegexType_InvalidFormat { - get { - return ResourceManager.GetString("RegexType_InvalidFormat", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to The Rgba scalar type represents a valid CSS RGBA color as defined in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb()_and_rgba().. - /// </summary> - internal static string RgbaType_Description { - get { - return ResourceManager.GetString("RgbaType_Description", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to RgbaType cannot parse the provided value. The provided value is not a valid CSS RGBA color. - /// </summary> - internal static string RgbaType_InvalidFormat { - get { - return ResourceManager.GetString("RgbaType_InvalidFormat", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to The Rgb scalar type represents a valid CSS RGB color as defined in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb()_and_rgba(). - /// </summary> internal static string RgbType_Description { get { return ResourceManager.GetString("RgbType_Description", resourceCulture); } } - - /// <summary> - /// Looks up a localized string similar to RgbType cannot parse the provided value. The provided value is not a valid CSS RGB color. - /// </summary> + internal static string RgbType_InvalidFormat { get { return ResourceManager.GetString("RgbType_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The SignedByte scalar type represents a numeric non-fractional value greater than or equal to -127.. - /// </summary> - internal static string SignedByteType_Description { - get { - return ResourceManager.GetString("SignedByteType_Description", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to SignedByteType cannot parse the provided literal. The provided value is not greater than or equal to -127.. - /// </summary> - internal static string SignedByteType_IsNotSigned_ParseLiteral { - get { - return ResourceManager.GetString("SignedByteType_IsNotSigned_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to SignedByteType cannot parse the provided value. The provided value is not greater than or equal to -127.. - /// </summary> - internal static string SignedByteType_IsNotSigned_ParseValue { - get { - return ResourceManager.GetString("SignedByteType_IsNotSigned_ParseValue", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to The UnsignedInt scalar type represents a unsigned 32-bit numeric non-fractional value greater than or equal to 0.. - /// </summary> - internal static string UnsignedIntType_Description { - get { - return ResourceManager.GetString("UnsignedIntType_Description", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to UnsignedIntType cannot parse the provided literal. The provided value is not greater than or equal to 0.. - /// </summary> - internal static string UnsignedIntType_IsNotUnsigned_ParseLiteral { - get { - return ResourceManager.GetString("UnsignedIntType_IsNotUnsigned_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to UnsignedIntType cannot parse the provided value. The provided value is not greater than or equal to 0.. - /// </summary> - internal static string UnsignedIntType_IsNotUnsigned_ParseValue { - get { - return ResourceManager.GetString("UnsignedIntType_IsNotUnsigned_ParseValue", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to The UnsignedLong scalar type represents a unsigned 64-bit numeric non-fractional value greater than or equal to 0.. - /// </summary> - internal static string UnsignedLongType_Description { - get { - return ResourceManager.GetString("UnsignedLongType_Description", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to UnsignedLong cannot parse the provided literal. The provided value is not greater than or equal to 0.. - /// </summary> - internal static string UnsignedLongType_IsNotUnsigned_ParseLiteral { - get { - return ResourceManager.GetString("UnsignedLongType_IsNotUnsigned_ParseLiteral", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to UnsignedLong cannot parse the provided value. The provided value is not greater than or equal to 0.. - /// </summary> - internal static string UnsignedLongType_IsNotUnsigned_ParseValue { - get { - return ResourceManager.GetString("UnsignedLongType_IsNotUnsigned_ParseValue", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to The UnsignedShort scalar type represents a unsigned 16-bit numeric non-fractional value greater than or equal to 0.. - /// </summary> - internal static string UnsignedShortType_Description { - get { - return ResourceManager.GetString("UnsignedShortType_Description", resourceCulture); - } - } - - /// <summary> - /// Looks up a localized string similar to UnsignedShortType cannot parse the provided literal. The provided value is not greater than or equal to 0.. - /// </summary> - internal static string UnsignedShortType_IsNotUnsigned_ParseLiteral { + internal static string RgbaType_Description { get { - return ResourceManager.GetString("UnsignedShortType_IsNotUnsigned_ParseLiteral", resourceCulture); + return ResourceManager.GetString("RgbaType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to UnsignedShortType cannot parse the provided value. The provided value is not greater than or equal to 0.. - /// </summary> - internal static string UnsignedShortType_IsNotUnsigned_ParseValue { + internal static string RgbaType_InvalidFormat { get { - return ResourceManager.GetString("UnsignedShortType_IsNotUnsigned_ParseValue", resourceCulture); + return ResourceManager.GetString("RgbaType_InvalidFormat", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to The UtcOffset scalar type represents a value of format ±hh:mm.. - /// </summary> internal static string UtcOffsetType_Description { get { return ResourceManager.GetString("UtcOffsetType_Description", resourceCulture); } } - /// <summary> - /// Looks up a localized string similar to UtcOffsetType cannot parse the provided value. The provided value is not a valid UTC offset. - /// </summary> internal static string UtcOffsetType_InvalidFormat { get { return ResourceManager.GetString("UtcOffsetType_InvalidFormat", resourceCulture); diff --git a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx index dfaf7f3cd2a..2aeaf02fb5f 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx +++ b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx @@ -279,9 +279,6 @@ <data name="PostalCodeType_IsInvalid_ParseValue" xml:space="preserve"> <value>PostalCodeType cannot parse the provided value. The provided value is an invalid postal code.</value> </data> - <data name="RegexType_InvalidFormat" xml:space="preserve"> - <value>{0}Type cannot parse the provided value. The value does not match the required regular expression pattern.</value> - </data> <data name="RgbType_Description" xml:space="preserve"> <value>The Rgb scalar type represents a valid CSS RGB color as defined in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb()_and_rgba().</value> </data> @@ -294,46 +291,10 @@ <data name="RgbaType_InvalidFormat" xml:space="preserve"> <value>RgbaType cannot parse the provided value. The provided value is not a valid CSS RGBA color.</value> </data> - <data name="UnsignedIntType_Description" xml:space="preserve"> - <value>The UnsignedInt scalar type represents a unsigned 32-bit numeric non-fractional value greater than or equal to 0.</value> - </data> - <data name="UnsignedIntType_IsNotUnsigned_ParseLiteral" xml:space="preserve"> - <value>UnsignedIntType cannot parse the provided literal. The provided value is not greater than or equal to 0.</value> - </data> - <data name="UnsignedIntType_IsNotUnsigned_ParseValue" xml:space="preserve"> - <value>UnsignedIntType cannot parse the provided value. The provided value is not greater than or equal to 0.</value> - </data> - <data name="UnsignedLongType_Description" xml:space="preserve"> - <value>The UnsignedLong scalar type represents a unsigned 64-bit numeric non-fractional value greater than or equal to 0.</value> - </data> - <data name="UnsignedLongType_IsNotUnsigned_ParseLiteral" xml:space="preserve"> - <value>UnsignedLong cannot parse the provided literal. The provided value is not greater than or equal to 0.</value> - </data> - <data name="UnsignedLongType_IsNotUnsigned_ParseValue" xml:space="preserve"> - <value>UnsignedLong cannot parse the provided value. The provided value is not greater than or equal to 0.</value> - </data> <data name="UtcOffsetType_Description" xml:space="preserve"> <value>The UtcOffset scalar type represents a value of format ±hh:mm.</value> </data> <data name="UtcOffsetType_InvalidFormat" xml:space="preserve"> <value>UtcOffsetType cannot parse the provided value. The provided value is not a valid UTC offset.</value> </data> - <data name="SignedByteType_Description" xml:space="preserve"> - <value>The SignedByte scalar type represents a numeric non-fractional value greater than or equal to -127.</value> - </data> - <data name="SignedByteType_IsNotSigned_ParseLiteral" xml:space="preserve"> - <value>SignedByteType cannot parse the provided literal. The provided value is not greater than or equal to -127.</value> - </data> - <data name="SignedByteType_IsNotSigned_ParseValue" xml:space="preserve"> - <value>SignedByteType cannot parse the provided value. The provided value is not greater than or equal to -127.</value> - </data> - <data name="UnsignedShortType_Description" xml:space="preserve"> - <value>The UnsignedShort scalar type represents a unsigned 16-bit numeric non-fractional value greater than or equal to 0.</value> - </data> - <data name="UnsignedShortType_IsNotUnsigned_ParseLiteral" xml:space="preserve"> - <value>UnsignedShortType cannot parse the provided literal. The provided value is not greater than or equal to 0.</value> - </data> - <data name="UnsignedShortType_IsNotUnsigned_ParseValue" xml:space="preserve"> - <value>UnsignedShortType cannot parse the provided value. The provided value is not greater than or equal to 0.</value> - </data> </root> diff --git a/src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs b/src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs deleted file mode 100644 index 9c16fbddb3f..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/SignedByteType.cs +++ /dev/null @@ -1,69 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The SignedByte scalar type represents a signed numeric non‐fractional -/// value greater than or equal to -127 and smaller than or equal to 128. -/// </summary> -public class SignedByteType : IntegerTypeBase<sbyte> -{ - /// <summary> - /// Initializes a new instance of the <see cref="SignedByteType"/> class. - /// </summary> - public SignedByteType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Implicit) - : base(name, sbyte.MinValue, sbyte.MaxValue, bind) - { - Description = description; - } - - /// <summary> - /// Initializes a new instance of the <see cref="SignedByteType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public SignedByteType() - : this( - WellKnownScalarTypes.SignedByte, - ScalarResources.SignedByteType_Description) - { - } - - /// <inheritdoc /> - protected override bool IsInstanceOfType(sbyte runtimeValue) - { - return runtimeValue >= MinValue; - } - - /// <inheritdoc /> - protected override bool IsInstanceOfType(IntValueNode valueSyntax) - { - return valueSyntax.ToSByte() >= MinValue; - } - - /// <inheritdoc /> - protected override sbyte ParseLiteral(IntValueNode valueSyntax) - { - return valueSyntax.ToSByte(); - } - - /// <inheritdoc /> - protected override IntValueNode ParseValue(sbyte runtimeValue) - { - return new(runtimeValue); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.SignedByteType_ParseLiteral_IsNotSigned(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - => ThrowHelper.SignedByteType_ParseValue_IsNotSigned(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseResultError(object runtimeValue) - => ThrowHelper.SignedByteType_ParseValue_IsNotSigned(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs index 0c3bf239902..e61d4bb252f 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs @@ -123,169 +123,6 @@ public static LeafCoercionException MacAddressType_InvalidFormat(IType type) type); } - public static LeafCoercionException NegativeFloatType_ParseLiteral_IsNotNegative( - IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NegativeFloatType_IsNotNegative_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.NegativeFloat) - .Build(), - type); - } - - public static LeafCoercionException NegativeFloatType_ParseValue_IsNotNegative(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NegativeFloatType_IsNotNegative_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.NegativeFloat) - .Build(), - type); - } - - public static LeafCoercionException NegativeIntType_ParseLiteral_IsNotNegative(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NegativeIntType_IsNotNegative_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.NegativeInt) - .Build(), - type); - } - - public static LeafCoercionException NegativeIntType_ParseValue_IsNotNegative(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NegativeIntType_IsNotNegative_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.NegativeInt) - .Build(), - type); - } - - public static LeafCoercionException NonEmptyStringType_ParseLiteral_IsEmpty(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NonEmptyStringType_IsEmpty_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.NonEmptyString) - .Build(), - type); - } - - public static LeafCoercionException NonEmptyStringType_ParseValue_IsEmpty(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NonEmptyStringType_IsEmpty_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.NonEmptyString) - .Build(), - type); - } - - public static LeafCoercionException NonNegativeIntType_ParseLiteral_IsNotNonNegative( - IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NonNegativeIntType_IsNotNonNegative_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.NonNegativeInt) - .Build(), - type); - } - - public static LeafCoercionException NonNegativeIntType_ParseValue_IsNotNonNegative( - IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NonNegativeIntType_IsNotNonNegative_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.NonNegativeInt) - .Build(), - type); - } - - public static LeafCoercionException NonPositiveIntType_ParseLiteral_IsNotNonPositive( - IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NonPositiveIntType_IsNotNonPositive_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.NonPositiveInt) - .Build(), - type); - } - - public static LeafCoercionException NonPositiveFloatType_ParseLiteral_IsNotNonPositive( - IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NonPositiveFloatType_IsNotNonPositive_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.NonPositiveFloat) - .Build(), - type); - } - - public static LeafCoercionException NonPositiveFloatType_ParseValue_IsNotNonPositive( - IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NonPositiveFloatType_IsNotNonPositive_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.NonPositiveFloat) - .Build(), - type); - } - - public static LeafCoercionException NonPositiveIntType_ParseValue_IsNotNonPositive( - IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NonPositiveIntType_IsNotNonPositive_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.NonPositiveInt) - .Build(), - type); - } - - public static LeafCoercionException NonNegativeFloatType_ParseLiteral_IsNotNonNegative( - IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NonNegativeFloatType_IsNotNonNegative_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.NonNegativeFloat) - .Build(), - type); - } - - public static LeafCoercionException NonNegativeFloatType_ParseValue_IsNotNonNegative( - IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.NonNegativeFloatType_IsNotNonNegative_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.NonNegativeFloat) - .Build(), - type); - } - public static LeafCoercionException PhoneNumberType_InvalidFormat(IType type) { return new LeafCoercionException( @@ -363,21 +200,6 @@ public static LeafCoercionException PostalCodeType_ParseValue_IsInvalid(IType ty type); } - public static LeafCoercionException RegexType_InvalidFormat( - IType type, - string name) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage( - string.Format( - ScalarResources.RegexType_InvalidFormat, - name)) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .Build(), - type); - } - public static LeafCoercionException RgbType_InvalidFormat(IType type) { return new LeafCoercionException( @@ -400,94 +222,6 @@ public static LeafCoercionException RgbaType_InvalidFormat(IType type) type); } - public static LeafCoercionException UnsignedShortType_ParseValue_IsNotUnsigned(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.UnsignedShortType_IsNotUnsigned_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.UnsignedShort) - .Build(), - type); - } - - public static LeafCoercionException UnsignedShortType_ParseLiteral_IsNotUnsigned(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.UnsignedShortType_IsNotUnsigned_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.UnsignedShort) - .Build(), - type); - } - - public static LeafCoercionException SignedByteType_ParseValue_IsNotSigned(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.SignedByteType_IsNotSigned_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.SignedByte) - .Build(), - type); - } - - public static LeafCoercionException SignedByteType_ParseLiteral_IsNotSigned(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.SignedByteType_IsNotSigned_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.SignedByte) - .Build(), - type); - } - - public static LeafCoercionException UnsignedIntType_ParseValue_IsNotUnsigned(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.UnsignedIntType_IsNotUnsigned_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.UnsignedInt) - .Build(), - type); - } - - public static LeafCoercionException UnsignedIntType_ParseLiteral_IsNotUnsigned(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.UnsignedIntType_IsNotUnsigned_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.UnsignedInt) - .Build(), - type); - } - - public static LeafCoercionException UnsignedLongType_ParseValue_IsNotUnsigned(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.UnsignedLongType_IsNotUnsigned_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.UnsignedLong) - .Build(), - type); - } - - public static LeafCoercionException UnsignedLongType_ParseLiteral_IsNotUnsigned(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.UnsignedLongType_IsNotUnsigned_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.UnsignedLong) - .Build(), - type); - } - public static LeafCoercionException UtcOffsetType_InvalidFormat(IType type) { return new LeafCoercionException( diff --git a/src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs b/src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs deleted file mode 100644 index 9fe2dc83ace..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/UnsignedIntType.cs +++ /dev/null @@ -1,69 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The UnsignedInt scalar type represents a unsigned 32‐bit numeric non‐fractional -/// value greater than or equal to 0. -/// </summary> -public class UnsignedIntType : IntegerTypeBase<uint> -{ - /// <summary> - /// Initializes a new instance of the <see cref="UnsignedIntType"/> class. - /// </summary> - public UnsignedIntType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Implicit) - : base(name, uint.MinValue, uint.MaxValue, bind) - { - Description = description; - } - - /// <summary> - /// Initializes a new instance of the <see cref="UnsignedIntType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public UnsignedIntType() - : this( - WellKnownScalarTypes.UnsignedInt, - ScalarResources.UnsignedIntType_Description) - { - } - - /// <inheritdoc /> - protected override bool IsInstanceOfType(uint runtimeValue) - { - return runtimeValue >= MinValue; - } - - /// <inheritdoc /> - protected override bool IsInstanceOfType(IntValueNode valueSyntax) - { - return valueSyntax.ToUInt32() >= MinValue; - } - - /// <inheritdoc /> - protected override uint ParseLiteral(IntValueNode valueSyntax) - { - return valueSyntax.ToUInt32(); - } - - /// <inheritdoc /> - protected override IntValueNode ParseValue(uint runtimeValue) - { - return new(runtimeValue); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.UnsignedIntType_ParseLiteral_IsNotUnsigned(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - => ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseResultError(object runtimeValue) - => ThrowHelper.UnsignedIntType_ParseValue_IsNotUnsigned(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs b/src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs deleted file mode 100644 index 23a2ba74c1b..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/UnsignedLongType.cs +++ /dev/null @@ -1,69 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The `UnsignedLong` scalar type represents a signed 64‐bit numeric non‐fractional -/// value greater than or equal to 0. -/// </summary> -public class UnsignedLongType : IntegerTypeBase<ulong> -{ - /// <summary> - /// Initializes a new instance of the <see cref="UnsignedLongType"/> class. - /// </summary> - public UnsignedLongType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Implicit) - : base(name, ulong.MinValue, ulong.MaxValue, bind) - { - Description = description; - } - - /// <summary> - /// Initializes a new instance of the <see cref="UnsignedLongType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public UnsignedLongType() - : this( - WellKnownScalarTypes.UnsignedLong, - ScalarResources.UnsignedLongType_Description) - { - } - - /// <inheritdoc /> - protected override bool IsInstanceOfType(ulong runtimeValue) - { - return runtimeValue >= MinValue; - } - - /// <inheritdoc /> - protected override bool IsInstanceOfType(IntValueNode valueSyntax) - { - return valueSyntax.ToUInt64() >= MinValue; - } - - /// <inheritdoc /> - protected override ulong ParseLiteral(IntValueNode valueSyntax) - { - return valueSyntax.ToUInt64(); - } - - /// <inheritdoc /> - protected override IntValueNode ParseValue(ulong runtimeValue) - { - return new(runtimeValue); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.UnsignedLongType_ParseLiteral_IsNotUnsigned(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - => ThrowHelper.UnsignedLongType_ParseValue_IsNotUnsigned(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseResultError(object runtimeValue) - => ThrowHelper.UnsignedLongType_ParseValue_IsNotUnsigned(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs b/src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs deleted file mode 100644 index e622d155624..00000000000 --- a/src/HotChocolate/Core/src/Types.Scalars/UnsignedShortType.cs +++ /dev/null @@ -1,69 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -/// <summary> -/// The UnsignedShortType scalar type represents a unsigned numeric non‐fractional -/// value greater than or equal to 0 and smaller or equal to 65535. -/// </summary> -public class UnsignedShortType : IntegerTypeBase<ushort> -{ - /// <summary> - /// Initializes a new instance of the <see cref="UnsignedShortType"/> class. - /// </summary> - public UnsignedShortType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Implicit) - : base(name, ushort.MinValue, ushort.MaxValue, bind) - { - Description = description; - } - - /// <summary> - /// Initializes a new instance of the <see cref="UnsignedShortType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public UnsignedShortType() - : this( - WellKnownScalarTypes.UnsignedShort, - ScalarResources.UnsignedShortType_Description) - { - } - - /// <inheritdoc /> - protected override bool IsInstanceOfType(ushort runtimeValue) - { - return runtimeValue >= MinValue; - } - - /// <inheritdoc /> - protected override bool IsInstanceOfType(IntValueNode valueSyntax) - { - return valueSyntax.ToUInt16() >= MinValue; - } - - /// <inheritdoc /> - protected override ushort ParseLiteral(IntValueNode valueSyntax) - { - return valueSyntax.ToUInt16(); - } - - /// <inheritdoc /> - protected override IntValueNode ParseValue(ushort runtimeValue) - { - return new(runtimeValue); - } - - /// <inheritdoc /> - protected override LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueSyntax) - => ThrowHelper.UnsignedShortType_ParseLiteral_IsNotUnsigned(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseValueError(object runtimeValue) - => ThrowHelper.UnsignedShortType_ParseValue_IsNotUnsigned(this); - - /// <inheritdoc /> - protected override LeafCoercionException CreateParseResultError(object runtimeValue) - => ThrowHelper.UnsignedShortType_ParseValue_IsNotUnsigned(this); -} diff --git a/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs b/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs index e7a7c0120ec..7d3852062ec 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/UtcOffsetType.cs @@ -48,7 +48,7 @@ protected override TimeSpan OnCoerceInputLiteral(StringValueNode valueLiteral) /// <inheritdoc /> protected override TimeSpan OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (OffsetLookup.TryDeserialize(inputValue.GetString(), out var parsed)) + if (OffsetLookup.TryDeserialize(inputValue.GetString()!, out var parsed)) { return parsed; } @@ -140,15 +140,9 @@ static OffsetLookup() public static bool TrySerialize( TimeSpan value, [NotNullWhen(true)] out string? result) - { - return s_timeSpanToOffset.TryGetValue(value, out result); - } + => s_timeSpanToOffset.TryGetValue(value, out result); - public static bool TryDeserialize( - string value, - [NotNullWhen(true)] out TimeSpan result) - { - return s_offsetToTimeSpan.TryGetValue(value, out result); - } + public static bool TryDeserialize( string value, out TimeSpan result) + => s_offsetToTimeSpan.TryGetValue(value, out result); } } diff --git a/src/HotChocolate/Core/src/Types.Scalars/WellKnownScalarTypes.cs b/src/HotChocolate/Core/src/Types.Scalars/WellKnownScalarTypes.cs index 1f9fdbecfc6..9dc6e38c81d 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/WellKnownScalarTypes.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/WellKnownScalarTypes.cs @@ -13,22 +13,11 @@ internal static class WellKnownScalarTypes public const string LocalCurrency = nameof(LocalCurrency); public const string Longitude = nameof(Longitude); public const string MacAddress = nameof(MacAddress); - public const string NegativeFloat = nameof(NegativeFloat); - public const string NegativeInt = nameof(NegativeInt); - public const string NonEmptyString = nameof(NonEmptyString); - public const string NonNegativeInt = nameof(NonNegativeInt); - public const string NonPositiveFloat = nameof(NonPositiveFloat); - public const string NonPositiveInt = nameof(NonPositiveInt); - public const string NonNegativeFloat = nameof(NonNegativeFloat); public const string PhoneNumber = nameof(PhoneNumber); public const string Port = nameof(Port); public const string PositiveInt = nameof(PositiveInt); public const string PostalCode = nameof(PostalCode); public const string Rgb = nameof(Rgb); public const string Rgba = nameof(Rgba); - public const string SignedByte = nameof(SignedByte); - public const string UnsignedShort = nameof(UnsignedShort); - public const string UnsignedInt = nameof(UnsignedInt); - public const string UnsignedLong = nameof(UnsignedLong); public const string UtcOffset = nameof(UtcOffset); } diff --git a/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs index 903fb96fe36..fcd45be667d 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types/Properties/TypeResources.Designer.cs @@ -1994,5 +1994,41 @@ internal static string ThrowHelper_InvalidTypeConversion { return ResourceManager.GetString("ThrowHelper_InvalidTypeConversion", resourceCulture); } } + + internal static string Scalar_FormatIsInvalid { + get { + return ResourceManager.GetString("Scalar_FormatIsInvalid", resourceCulture); + } + } + + internal static string SignedByteType_Description { + get { + return ResourceManager.GetString("SignedByteType_Description", resourceCulture); + } + } + + internal static string UnsignedShortType_Description { + get { + return ResourceManager.GetString("UnsignedShortType_Description", resourceCulture); + } + } + + internal static string UnsignedIntType_Description { + get { + return ResourceManager.GetString("UnsignedIntType_Description", resourceCulture); + } + } + + internal static string UnsignedLongType_Description { + get { + return ResourceManager.GetString("UnsignedLongType_Description", resourceCulture); + } + } + + internal static string RegexType_InvalidFormat { + get { + return ResourceManager.GetString("RegexType_InvalidFormat", resourceCulture); + } + } } } diff --git a/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx b/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx index dd32ddaace4..8397af62d30 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx +++ b/src/HotChocolate/Core/src/Types/Properties/TypeResources.resx @@ -999,4 +999,22 @@ Type: `{0}`</value> <data name="ThrowHelper_InvalidTypeConversion" xml:space="preserve"> <value>The value provided for `{0}` is not in a valid format.</value> </data> + <data name="Scalar_FormatIsInvalid" xml:space="preserve"> + <value>The runtime value `{0}` of the scalar `{1}` has an invalid format.</value> + </data> + <data name="SignedByteType_Description" xml:space="preserve"> + <value>The SignedByte scalar type represents a numeric non-fractional value greater than or equal to -127.</value> + </data> + <data name="UnsignedShortType_Description" xml:space="preserve"> + <value>The UnsignedShort scalar type represents a unsigned 16-bit numeric non-fractional value greater than or equal to 0.</value> + </data> + <data name="UnsignedIntType_Description" xml:space="preserve"> + <value>The UnsignedInt scalar type represents a unsigned 32-bit numeric non-fractional value greater than or equal to 0.</value> + </data> + <data name="UnsignedLongType_Description" xml:space="preserve"> + <value>The UnsignedLong scalar type represents a unsigned 64-bit numeric non-fractional value greater than or equal to 0.</value> + </data> + <data name="RegexType_InvalidFormat" xml:space="preserve"> + <value>{0}Type cannot parse the provided value. The value does not match the required regular expression pattern.</value> + </data> </root> diff --git a/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs b/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs index b5e5dc7b962..f5265db04b8 100644 --- a/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Contracts/ILeafType.cs @@ -36,20 +36,6 @@ public interface ILeafType : IInputTypeDefinition, IOutputTypeDefinition /// </returns> bool IsValueCompatible(JsonElement inputValue); - /// <summary> - /// Determines if the given <paramref name="runtimeValue"/> is an instance of this type. - /// </summary> - /// <param name="runtimeValue"> - /// The runtime value to validate. Must not be <c>null</c>. - /// </param> - /// <returns> - /// <c>true</c> if the given <paramref name="runtimeValue"/> is an instance of this type. - /// </returns> - /// <exception cref="ArgumentNullException"> - /// <paramref name="runtimeValue"/> is <c>null</c>. - /// </exception> - bool IsInstanceOfType(object runtimeValue); - /// <summary> /// Coerces a GraphQL literal (AST value node) into a runtime value. /// </summary> diff --git a/src/HotChocolate/Core/src/Types/Types/EnumType.cs b/src/HotChocolate/Core/src/Types/Types/EnumType.cs index 82d88f3e877..6091953ba79 100644 --- a/src/HotChocolate/Core/src/Types/Types/EnumType.cs +++ b/src/HotChocolate/Core/src/Types/Types/EnumType.cs @@ -116,10 +116,6 @@ public bool IsValueCompatible(JsonElement inputValue) return false; } - /// <inheritdoc /> - public bool IsInstanceOfType(object? runtimeValue) - => RuntimeType.IsInstanceOfType(runtimeValue); - /// <inheritdoc /> public object CoerceInputLiteral(IValueNode valueLiteral) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs index cc50e03cd72..da630c6b5af 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DecimalType.cs @@ -49,8 +49,8 @@ public DecimalType() } /// <inheritdoc /> - protected override decimal OnCoerceInputLiteral(IFloatValueLiteral valueSyntax) - => valueSyntax.ToDecimal(); + protected override decimal OnCoerceInputLiteral(IFloatValueLiteral valueLiteral) + => valueLiteral.ToDecimal(); /// <inheritdoc /> protected override decimal OnCoerceInputValue(JsonElement inputValue) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs index 102dd71875b..55e954455bd 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatType.cs @@ -52,8 +52,8 @@ public FloatType() } /// <inheritdoc /> - protected override double OnCoerceInputLiteral(IFloatValueLiteral valueSyntax) - => valueSyntax.ToDouble(); + protected override double OnCoerceInputLiteral(IFloatValueLiteral valueLiteral) + => valueLiteral.ToDouble(); /// <inheritdoc /> protected override double OnCoerceInputValue(JsonElement inputValue) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs index cc7405e94ea..91bc2d7bb12 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs @@ -2,6 +2,7 @@ using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Properties; +using HotChocolate.Text.Json; using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -64,59 +65,47 @@ public override bool IsValueCompatible(JsonElement inputValue) => inputValue.ValueKind is JsonValueKind.Number; /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) + public sealed override object CoerceInputLiteral(IValueNode valueLiteral) { - if (runtimeValue is TRuntimeType value) + if (valueLiteral is FloatValueNode floatLiteral) { - return value.CompareTo(MinValue) != -1 - && value.CompareTo(MaxValue) != 1; - } - - return false; - } - - /// <inheritdoc /> - public sealed override object CoerceInputLiteral(IValueNode valueSyntax) - { - if (valueSyntax is FloatValueNode floatLiteral && IsInstanceOfType(floatLiteral)) - { - return OnCoerceInputLiteral(floatLiteral); + var runtimeValue = OnCoerceInputLiteral(floatLiteral); + AssertFormat(runtimeValue); + return runtimeValue; } // Input coercion rules specify that float values can be coerced // from IntValueNode and FloatValueNode: // http://facebook.github.io/graphql/June2018/#sec-Float - - if (valueSyntax is IntValueNode intLiteral && IsInstanceOfType(intLiteral)) + if (valueLiteral is IntValueNode intLiteral) { - return OnCoerceInputLiteral(intLiteral); + var runtimeValue = OnCoerceInputLiteral(intLiteral); + AssertFormat(runtimeValue); + return runtimeValue; } - throw CreateCoerceInputLiteralError(valueSyntax); + throw CreateCoerceInputLiteralError(valueLiteral); } /// <summary> /// Coerces a float or int literal into the runtime value. /// </summary> - /// <param name="valueSyntax"> + /// <param name="valueLiteral"> /// The float or int literal to coerce. /// </param> /// <returns> /// Returns the runtime value representation. /// </returns> - protected abstract TRuntimeType OnCoerceInputLiteral(IFloatValueLiteral valueSyntax); + protected abstract TRuntimeType OnCoerceInputLiteral(IFloatValueLiteral valueLiteral); /// <inheritdoc /> public sealed override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.Number) { - var value = OnCoerceInputValue(inputValue); - if (value.CompareTo(MinValue) != -1 - && value.CompareTo(MaxValue) != 1) - { - return value; - } + var runtimeValue = OnCoerceInputValue(inputValue); + AssertFormat(runtimeValue); + return runtimeValue; } throw CreateCoerceInputValueError(inputValue); @@ -133,12 +122,50 @@ public sealed override object CoerceInputValue(JsonElement inputValue, IFeatureP /// </returns> protected abstract TRuntimeType OnCoerceInputValue(JsonElement inputValue); + /// <inheritdoc /> + public override void CoerceOutputValue(object runtimeValue, ResultElement resultValue) + { + if (runtimeValue is TRuntimeType castedRuntimeValue) + { + AssertFormat(castedRuntimeValue); + OnCoerceOutputValue(castedRuntimeValue, resultValue); + return; + } + + throw Scalar_Cannot_CoerceOutputValue(this, runtimeValue); + } + + /// <inheritdoc /> + public override IValueNode ValueToLiteral(object runtimeValue) + { + if (runtimeValue is TRuntimeType castedRuntimeValue) + { + AssertFormat(castedRuntimeValue); + return OnValueToLiteral(castedRuntimeValue); + } + + throw CreateValueToLiteralError(runtimeValue); + } + + /// <summary> + /// Creates the exception to throw when <see cref="CoerceInputLiteral(IValueNode)"/> + /// encounters an incompatible <see cref="IValueNode"/>. + /// </summary> + /// <param name="valueLiteral"> + /// The value syntax that could not be coerced. + /// </param> + /// <returns> + /// Returns the exception to throw. + /// </returns> + protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueLiteral) + => Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); + /// <summary> /// Creates the exception to throw when <see cref="CoerceInputValue(JsonElement, IFeatureProvider)"/> - /// encounters an incompatible input value. + /// encounters an incompatible <see cref="JsonElement"/>. /// </summary> /// <param name="inputValue"> - /// The input value that could not be coerced. + /// The JSON value that could not be coerced. /// </param> /// <returns> /// Returns the exception to throw. @@ -147,15 +174,32 @@ protected virtual LeafCoercionException CreateCoerceInputValueError(JsonElement => Scalar_Cannot_CoerceInputValue(this, inputValue); /// <summary> - /// Creates the exception to throw when <see cref="CoerceInputLiteral(IValueNode)"/> - /// encounters an incompatible <see cref="IValueNode"/>. + /// Creates the exception to throw when a runtime value is outside + /// the allowed min/max range. /// </summary> - /// <param name="literal"> - /// The value syntax that could not be coerced. + /// <param name="runtimeValue"> + /// The runtime value that is out of range. /// </param> /// <returns> /// Returns the exception to throw. /// </returns> - protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode literal) - => Scalar_Cannot_CoerceInputLiteral(this, literal); + protected virtual LeafCoercionException FormatError(TRuntimeType runtimeValue) + => Scalar_FormatIsInvalid(this, runtimeValue); + + /// <summary> + /// Validates that the runtime value is within the allowed min/max range. + /// </summary> + /// <param name="runtimeValue"> + /// The runtime value to validate. + /// </param> + /// <exception cref="LeafCoercionException"> + /// Thrown when the value is less than <see cref="MinValue"/> or greater than <see cref="MaxValue"/>. + /// </exception> + private void AssertFormat(TRuntimeType runtimeValue) + { + if (runtimeValue.CompareTo(MinValue) == -1 || runtimeValue.CompareTo(MaxValue) == 1) + { + throw FormatError(runtimeValue); + } + } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs index ea1677aedb6..81720427019 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs @@ -1,6 +1,7 @@ using System.Text.Json; using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -62,24 +63,14 @@ public override bool IsValueCompatible(IValueNode valueLiteral) public override bool IsValueCompatible(JsonElement inputValue) => inputValue.ValueKind is JsonValueKind.Number; - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - { - if (runtimeValue is TRuntimeType value) - { - return value.CompareTo(MinValue) != -1 - && value.CompareTo(MaxValue) != 1; - } - - return false; - } - /// <inheritdoc /> public sealed override object CoerceInputLiteral(IValueNode valueLiteral) { - if (valueLiteral is IntValueNode intLiteral && IsInstanceOfType(intLiteral)) + if (valueLiteral is IntValueNode intLiteral) { - return OnCoerceInputLiteral(intLiteral); + var runtimeValue = OnCoerceInputLiteral(intLiteral); + AssertFormat(runtimeValue); + return runtimeValue; } throw CreateCoerceInputLiteralError(valueLiteral); @@ -101,12 +92,9 @@ public sealed override object CoerceInputValue(JsonElement inputValue, IFeatureP { if (inputValue.ValueKind is JsonValueKind.Number) { - var value = OnCoerceInputValue(inputValue); - if (value.CompareTo(MinValue) != -1 - && value.CompareTo(MaxValue) != 1) - { - return value; - } + var runtimeValue = OnCoerceInputValue(inputValue); + AssertFormat(runtimeValue); + return runtimeValue; } throw CreateCoerceInputValueError(inputValue); @@ -123,12 +111,50 @@ public sealed override object CoerceInputValue(JsonElement inputValue, IFeatureP /// </returns> protected abstract TRuntimeType OnCoerceInputValue(JsonElement inputValue); + /// <inheritdoc /> + public override void CoerceOutputValue(object runtimeValue, ResultElement resultValue) + { + if (runtimeValue is TRuntimeType castedRuntimeValue) + { + AssertFormat(castedRuntimeValue); + OnCoerceOutputValue(castedRuntimeValue, resultValue); + return; + } + + throw Scalar_Cannot_CoerceOutputValue(this, runtimeValue); + } + + /// <inheritdoc /> + public override IValueNode ValueToLiteral(object runtimeValue) + { + if (runtimeValue is TRuntimeType castedRuntimeValue) + { + AssertFormat(castedRuntimeValue); + return OnValueToLiteral(castedRuntimeValue); + } + + throw CreateValueToLiteralError(runtimeValue); + } + + /// <summary> + /// Creates the exception to throw when <see cref="CoerceInputLiteral(IValueNode)"/> + /// encounters an incompatible <see cref="IValueNode"/>. + /// </summary> + /// <param name="valueLiteral"> + /// The value syntax that could not be coerced. + /// </param> + /// <returns> + /// Returns the exception to throw. + /// </returns> + protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueLiteral) + => Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); + /// <summary> /// Creates the exception to throw when <see cref="CoerceInputValue(JsonElement, IFeatureProvider)"/> - /// encounters an incompatible input value. + /// encounters an incompatible <see cref="JsonElement"/>. /// </summary> /// <param name="inputValue"> - /// The input value that could not be coerced. + /// The JSON value that could not be coerced. /// </param> /// <returns> /// Returns the exception to throw. @@ -137,15 +163,32 @@ protected virtual LeafCoercionException CreateCoerceInputValueError(JsonElement => Scalar_Cannot_CoerceInputValue(this, inputValue); /// <summary> - /// Creates the exception to throw when <see cref="CoerceInputLiteral(IValueNode)"/> - /// encounters an incompatible <see cref="IValueNode"/>. + /// Creates the exception to throw when a runtime value is outside + /// the allowed min/max range. /// </summary> - /// <param name="literal"> - /// The value syntax that could not be coerced. + /// <param name="runtimeValue"> + /// The runtime value that is out of range. /// </param> /// <returns> /// Returns the exception to throw. /// </returns> - protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode literal) - => Scalar_Cannot_CoerceInputLiteral(this, literal); + protected virtual LeafCoercionException FormatError(TRuntimeType runtimeValue) + => Scalar_FormatIsInvalid(this, runtimeValue); + + /// <summary> + /// Validates that the runtime value is within the allowed min/max range. + /// </summary> + /// <param name="runtimeValue"> + /// The runtime value to validate. + /// </param> + /// <exception cref="LeafCoercionException"> + /// Thrown when the value is less than <see cref="MinValue"/> or greater than <see cref="MaxValue"/>. + /// </exception> + private void AssertFormat(TRuntimeType runtimeValue) + { + if (runtimeValue.CompareTo(MinValue) == -1 || runtimeValue.CompareTo(MaxValue) == 1) + { + throw FormatError(runtimeValue); + } + } } diff --git a/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/RegexType.cs similarity index 61% rename from src/HotChocolate/Core/src/Types.Scalars/RegexType.cs rename to src/HotChocolate/Core/src/Types/Types/Scalars/RegexType.cs index d18723e639b..da0c99db1db 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/RegexType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/RegexType.cs @@ -3,6 +3,7 @@ using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Text.Json; +using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -50,59 +51,40 @@ public RegexType( Description = description; } - /// <inheritdoc /> - public override bool IsInstanceOfType(object runtimeValue) - => runtimeValue is string s && _validationRegex.IsMatch(s); - - public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral is StringValueNode stringLiteral && _validationRegex.IsMatch(stringLiteral.Value); - - public override bool IsValueCompatible(JsonElement inputValue) - => inputValue.ValueKind is JsonValueKind.String && _validationRegex.IsMatch(inputValue.GetString()!); - protected override string OnCoerceInputLiteral(StringValueNode valueLiteral) { - if (_validationRegex.IsMatch(valueLiteral.Value)) - { - return valueLiteral.Value; - } - - throw FormatException(); + var runtimeValue = valueLiteral.Value; + AssertFormat(runtimeValue); + return runtimeValue; } protected override string OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { var runtimeValue = inputValue.GetString()!; - - if (_validationRegex.IsMatch(runtimeValue)) - { - return runtimeValue; - } - - throw FormatException(); + AssertFormat(runtimeValue); + return runtimeValue; } protected override void OnCoerceOutputValue(string runtimeValue, ResultElement resultValue) { - if (_validationRegex.IsMatch(runtimeValue)) - { - resultValue.SetStringValue(runtimeValue); - return; - } - - throw FormatException(); + AssertFormat(runtimeValue); + resultValue.SetStringValue(runtimeValue); } protected override StringValueNode OnValueToLiteral(string runtimeValue) { - if (_validationRegex.IsMatch(runtimeValue)) + AssertFormat(runtimeValue); + return new StringValueNode(runtimeValue); + } + + private void AssertFormat(string runtimeValue) + { + if (!_validationRegex.IsMatch(runtimeValue)) { - return new StringValueNode(runtimeValue); + throw FormatException(runtimeValue); } - - throw FormatException(); } - protected virtual LeafCoercionException FormatException() - => ThrowHelper.RegexType_InvalidFormat(this, Name); + protected virtual LeafCoercionException FormatException(string runtimeValue) + => RegexType_InvalidFormat(this, Name); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarNames.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarNames.cs index fa11417702c..9355353e64a 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarNames.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarNames.cs @@ -22,4 +22,8 @@ public static class ScalarNames public const string LocalDate = nameof(LocalDate); public const string LocalDateTime = nameof(LocalDateTime); public const string LocalTime = nameof(LocalTime); + public const string SignedByte = nameof(SignedByte); + public const string UnsignedShort = nameof(UnsignedShort); + public const string UnsignedInt = nameof(UnsignedInt); + public const string UnsignedLong = nameof(UnsignedLong); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs index b92c692f6af..3b51999512c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs @@ -199,10 +199,6 @@ public virtual bool IsValueCompatible(JsonElement inputValue) return false; } - /// <inheritdoc /> - public virtual bool IsInstanceOfType(object runtimeValue) - => RuntimeType.IsInstanceOfType(runtimeValue); - /// <inheritdoc /> public abstract object CoerceInputLiteral(IValueNode valueLiteral); diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs index 4dfae5bd691..1f724747c79 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~1.cs @@ -32,7 +32,7 @@ public override void CoerceOutputValue(object runtimeValue, ResultElement result return; } - throw Scalar_Cannot_CoerceOutputValue(this, runtimeValue); + throw CreateCoerceOutputValueError(runtimeValue); } /// <summary> @@ -58,7 +58,7 @@ public override IValueNode ValueToLiteral(object runtimeValue) return OnValueToLiteral(runtimeType); } - throw Scalar_Cannot_ConvertValueToLiteral(this, runtimeValue); + throw CreateValueToLiteralError(runtimeValue); } /// <summary> @@ -75,4 +75,30 @@ public override IValueNode ValueToLiteral(object runtimeValue) /// Unable to convert the given <paramref name="runtimeValue"/> into a literal. /// </exception> public abstract IValueNode OnValueToLiteral(TRuntimeType runtimeValue); + + /// <summary> + /// Creates the exception to throw when <see cref="CoerceOutputValue(object, ResultElement)"/> + /// encounters an incompatible runtime value. + /// </summary> + /// <param name="runtimeValue"> + /// The runtime value that could not be coerced. + /// </param> + /// <returns> + /// Returns the exception to throw. + /// </returns> + protected virtual LeafCoercionException CreateCoerceOutputValueError(object runtimeValue) + => Scalar_Cannot_CoerceOutputValue(this, runtimeValue); + + /// <summary> + /// Creates the exception to throw when <see cref="ValueToLiteral(object)"/> + /// encounters an incompatible runtime value. + /// </summary> + /// <param name="runtimeValue"> + /// The runtime value that could not be converted to a literal. + /// </param> + /// <returns> + /// Returns the exception to throw. + /// </returns> + protected virtual LeafCoercionException CreateValueToLiteralError(object runtimeValue) + => Scalar_Cannot_ConvertValueToLiteral(this, runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/SignedByteType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/SignedByteType.cs new file mode 100644 index 00000000000..b0da63b5da4 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/SignedByteType.cs @@ -0,0 +1,52 @@ +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Properties; +using HotChocolate.Text.Json; + +namespace HotChocolate.Types; + +/// <summary> +/// The SignedByte scalar type represents a signed numeric non‐fractional +/// value greater than or equal to -127 and smaller than or equal to 128. +/// </summary> +public class SignedByteType : IntegerTypeBase<sbyte> +{ + /// <summary> + /// Initializes a new instance of the <see cref="SignedByteType"/> class. + /// </summary> + public SignedByteType( + string name, + string? description = null, + BindingBehavior bind = BindingBehavior.Implicit) + : base(name, sbyte.MinValue, sbyte.MaxValue, bind) + { + Description = description; + } + + /// <summary> + /// Initializes a new instance of the <see cref="SignedByteType"/> class. + /// </summary> + [ActivatorUtilitiesConstructor] + public SignedByteType() + : this( + ScalarNames.SignedByte, + TypeResources.SignedByteType_Description) + { + } + + /// <inheritdoc /> + protected override sbyte OnCoerceInputLiteral(IntValueNode valueLiteral) + => valueLiteral.ToSByte(); + + /// <inheritdoc /> + protected override sbyte OnCoerceInputValue(JsonElement inputValue) + => inputValue.GetSByte(); + + /// <inheritdoc /> + public override void OnCoerceOutputValue(sbyte runtimeValue, ResultElement resultValue) + => resultValue.SetNumberValue(runtimeValue); + + /// <inheritdoc /> + public override IValueNode OnValueToLiteral(sbyte runtimeValue) + => new IntValueNode(runtimeValue); +} diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedIntType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedIntType.cs new file mode 100644 index 00000000000..d21b3de0874 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedIntType.cs @@ -0,0 +1,52 @@ +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Properties; +using HotChocolate.Text.Json; + +namespace HotChocolate.Types; + +/// <summary> +/// The UnsignedInt scalar type represents an unsigned 32‐bit numeric non‐fractional +/// value greater than or equal to 0. +/// </summary> +public class UnsignedIntType : IntegerTypeBase<uint> +{ + /// <summary> + /// Initializes a new instance of the <see cref="UnsignedIntType"/> class. + /// </summary> + public UnsignedIntType( + string name, + string? description = null, + BindingBehavior bind = BindingBehavior.Implicit) + : base(name, uint.MinValue, uint.MaxValue, bind) + { + Description = description; + } + + /// <summary> + /// Initializes a new instance of the <see cref="UnsignedIntType"/> class. + /// </summary> + [ActivatorUtilitiesConstructor] + public UnsignedIntType() + : this( + ScalarNames.UnsignedInt, + TypeResources.UnsignedIntType_Description) + { + } + + /// <inheritdoc /> + protected override uint OnCoerceInputLiteral(IntValueNode valueLiteral) + => valueLiteral.ToUInt32(); + + /// <inheritdoc /> + protected override uint OnCoerceInputValue(JsonElement inputValue) + => inputValue.GetUInt32(); + + /// <inheritdoc /> + public override void OnCoerceOutputValue(uint runtimeValue, ResultElement resultValue) + => resultValue.SetNumberValue(runtimeValue); + + /// <inheritdoc /> + public override IValueNode OnValueToLiteral(uint runtimeValue) + => new IntValueNode(runtimeValue); +} diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedLongType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedLongType.cs new file mode 100644 index 00000000000..ca042f01554 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedLongType.cs @@ -0,0 +1,52 @@ +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Properties; +using HotChocolate.Text.Json; + +namespace HotChocolate.Types; + +/// <summary> +/// The `UnsignedLong` scalar type represents a signed 64‐bit numeric non‐fractional +/// value greater than or equal to 0. +/// </summary> +public class UnsignedLongType : IntegerTypeBase<ulong> +{ + /// <summary> + /// Initializes a new instance of the <see cref="UnsignedLongType"/> class. + /// </summary> + public UnsignedLongType( + string name, + string? description = null, + BindingBehavior bind = BindingBehavior.Implicit) + : base(name, ulong.MinValue, ulong.MaxValue, bind) + { + Description = description; + } + + /// <summary> + /// Initializes a new instance of the <see cref="UnsignedLongType"/> class. + /// </summary> + [ActivatorUtilitiesConstructor] + public UnsignedLongType() + : this( + ScalarNames.UnsignedLong, + TypeResources.UnsignedLongType_Description) + { + } + + /// <inheritdoc /> + protected override ulong OnCoerceInputLiteral(IntValueNode valueLiteral) + => valueLiteral.ToUInt64(); + + /// <inheritdoc /> + protected override ulong OnCoerceInputValue(JsonElement inputValue) + => inputValue.GetUInt64(); + + /// <inheritdoc /> + public override void OnCoerceOutputValue(ulong runtimeValue, ResultElement resultValue) + => resultValue.SetNumberValue(runtimeValue); + + /// <inheritdoc /> + public override IValueNode OnValueToLiteral(ulong runtimeValue) + => new IntValueNode(runtimeValue); +} diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedShortType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedShortType.cs new file mode 100644 index 00000000000..88528b534c0 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UnsignedShortType.cs @@ -0,0 +1,52 @@ +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Properties; +using HotChocolate.Text.Json; + +namespace HotChocolate.Types; + +/// <summary> +/// The UnsignedShortType scalar type represents an unsigned numeric non‐fractional +/// value greater than or equal to 0 and smaller or equal to 65535. +/// </summary> +public class UnsignedShortType : IntegerTypeBase<ushort> +{ + /// <summary> + /// Initializes a new instance of the <see cref="UnsignedShortType"/> class. + /// </summary> + public UnsignedShortType( + string name, + string? description = null, + BindingBehavior bind = BindingBehavior.Implicit) + : base(name, ushort.MinValue, ushort.MaxValue, bind) + { + Description = description; + } + + /// <summary> + /// Initializes a new instance of the <see cref="UnsignedShortType"/> class. + /// </summary> + [ActivatorUtilitiesConstructor] + public UnsignedShortType() + : this( + ScalarNames.UnsignedShort, + TypeResources.UnsignedShortType_Description) + { + } + + /// <inheritdoc /> + protected override ushort OnCoerceInputLiteral(IntValueNode valueLiteral) + => valueLiteral.ToUInt16(); + + /// <inheritdoc /> + protected override ushort OnCoerceInputValue(JsonElement inputValue) + => inputValue.GetUInt16(); + + /// <inheritdoc /> + public override void OnCoerceOutputValue(ushort runtimeValue, ResultElement resultValue) + => resultValue.SetNumberValue(runtimeValue); + + /// <inheritdoc /> + public override IValueNode OnValueToLiteral(ushort runtimeValue) + => new IntValueNode(runtimeValue); +} diff --git a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs index 4d0304e9d3e..e0e7dedca0e 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs @@ -626,6 +626,20 @@ public static LeafCoercionException Scalar_Cannot_CoerceInputValue( scalarType); } + public static LeafCoercionException Scalar_FormatIsInvalid( + ITypeDefinition scalarType, + object runtimeValue) + { + return new LeafCoercionException( + ErrorBuilder.New() + .SetMessage( + TypeResources.Scalar_FormatIsInvalid, + runtimeValue, + scalarType.Name) + .Build(), + scalarType); + } + public static LeafCoercionException Scalar_Cannot_ConvertValueToLiteral( ITypeDefinition scalarType, object runtimeValue) @@ -653,4 +667,19 @@ public static LeafCoercionException Scalar_Cannot_CoerceOutputValue( .Build(), scalarType); } + + public static LeafCoercionException RegexType_InvalidFormat( + IType type, + string name) + { + return new LeafCoercionException( + ErrorBuilder.New() + .SetMessage( + string.Format( + TypeResources.RegexType_InvalidFormat, + name)) + .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) + .Build(), + type); + } } diff --git a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md index ef350da0e9d..9a5f9696d2c 100644 --- a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md +++ b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md @@ -284,6 +284,21 @@ With Hot Chocolate 16 we introduced a lot more abstractions, meaning we pulled o So, if you were referencing HotChocolate.Execution or HotChocolate.Fetching directly make sure to remove references to these libraries and replace them with HotChocolate.Types. +## Simpler Scalar Type + +TODO + +## Removed Scalars + +TODO + +NegativeFloat +NonNegativeFloat +NegativeInt +NonPositiveInt +NonEmptyString +NonNegativeInt + # Deprecations Things that will continue to function this release, but we encourage you to move away from. From 062b87ecdcadd1e3a01e125b34506952f348adc6 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Wed, 7 Jan 2026 12:48:04 +0100 Subject: [PATCH 067/144] Refactor scalar types to use new coercion methods - Updated `FieldSetType`, `PolicyType`, `ScopeType`, and `_AnyType` to use protected coercion methods for input literals, input values, output values, and value literals. - Changed `WebSocketExtensions` to return `JsonDocument` instead of `IReadOnlyDictionary<string, object?>?` for server messages. - Modified `IExecutionRequest` to implement `IDisposable` for proper resource management. - Implemented `Dispose` methods in `OperationRequest`, `OperationRequestBatch`, and `VariableBatchRequest` to handle resource cleanup. - Updated error messages in `Resources.resx` for clarity. - Refactored `VariableCoercionHelper` to accept `JsonElement` for variable values and improved error handling. - Added `ValueJsonFormatter` to format GraphQL value nodes as JSON. - Updated `BsonType` and `ObjectIdType` to use new coercion methods and improved serialization logic. - Added migration notes for `OperationRequestBuilder` in the documentation. --- .../Extensions/ServiceCollectionExtensions.cs | 7 + .../Execution/DynamicEndpointMiddleware.cs | 66 ++-- .../ApolloFederation/Types/FieldSetType.cs | 10 +- .../src/ApolloFederation/Types/PolicyType.cs | 21 +- .../src/ApolloFederation/Types/ScopeType.cs | 21 +- .../src/ApolloFederation/Types/_AnyType.cs | 11 +- .../WebSocketExtensions.cs | 6 +- .../Execution/IExecutionRequest.cs | 2 +- .../Execution/OperationRequest.cs | 13 + .../Execution/OperationRequestBatch.cs | 15 + .../Execution/VariableBatchRequest.cs | 13 + .../Core/src/Types/Properties/Resources.resx | 2 +- .../OperationVariableCoercionMiddleware.cs | 1 - .../Execution/VariableCoercionHelper.cs | 45 ++- .../HotChocolate.Language.Web.csproj | 1 + .../src/Language.Web/JsonValueParser.cs | 11 + .../src/Language.Web/ValueJsonFormatter.cs | 97 +++++ .../Utf8GraphQLRequestParserTests.cs | 51 +-- .../MongoDb/src/Types/BsonType.cs | 373 ++++++++---------- .../MongoDb/src/Types/ObjectIdType.cs | 24 +- .../v16/migrating/migrate-from-15-to-16.md | 4 + 21 files changed, 460 insertions(+), 334 deletions(-) create mode 100644 src/HotChocolate/Language/src/Language.Web/ValueJsonFormatter.cs diff --git a/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/ServiceCollectionExtensions.cs b/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/ServiceCollectionExtensions.cs index 45736a7bf6b..ef97baec7f6 100644 --- a/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/ServiceCollectionExtensions.cs +++ b/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/ServiceCollectionExtensions.cs @@ -1,4 +1,7 @@ using System.Collections.Concurrent; +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using HotChocolate.Adapters.Mcp.Diagnostics; using HotChocolate.Adapters.Mcp.Handlers; using HotChocolate.Adapters.Mcp.Proxies; @@ -12,6 +15,10 @@ namespace HotChocolate.Adapters.Mcp.Extensions; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal static class ServiceCollectionExtensions { public static void AddMcpServices(this IServiceCollection services, string schemaName) diff --git a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs index 226e8265a9d..46d0eca7420 100644 --- a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs +++ b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs @@ -1,4 +1,6 @@ using System.Diagnostics.CodeAnalysis; +using System.IO.Pipelines; +using System.Text.Json; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; @@ -45,7 +47,7 @@ await Results.Problem( var session = await proxy.GetOrCreateSessionAsync(context.RequestAborted); using var variableBuffer = new PooledArrayWriter(); - var variables = await BuildVariablesAsync( + using var variables = await BuildVariablesAsync( endpointDescriptor, context, variableBuffer, @@ -79,7 +81,7 @@ await Results.Problem( if (operationResult.ContextData.ContainsKey(ExecutionContextData.ValidationErrors) || operationResult is { IsDataSet: false }) { - var firstErrorMessage = operationResult.Errors?.FirstOrDefault()?.Message; + var firstErrorMessage = operationResult.Errors.FirstOrDefault()?.Message; if (!string.IsNullOrEmpty(firstErrorMessage)) { @@ -97,7 +99,7 @@ await Results.Problem( // If execution started, and we produced GraphQL errors, // we return HTTP 500 or 401/403 for authorization errors. - if (operationResult.Errors is not null) + if (!operationResult.Errors.IsEmpty) { var result = GetResultFromErrors(operationResult.Errors); @@ -121,52 +123,70 @@ await Results.Problem( } } - private static async Task<IReadOnlyDictionary<string, object?>> BuildVariablesAsync( + private static async Task<JsonDocument> BuildVariablesAsync( OpenApiEndpointDescriptor endpointDescriptor, HttpContext httpContext, PooledArrayWriter variableBuffer, CancellationToken cancellationToken) { - var variables = new Dictionary<string, object?>(); + var variables = new Dictionary<string, IValueNode?>(); if (endpointDescriptor.VariableFilledThroughBody is { } bodyVariable) { - const int chunkSize = 256; - using var writer = new PooledArrayWriter(); - var body = httpContext.Request.Body; - int read; + var body = httpContext.Request.BodyReader; + ReadResult result; do { - var memory = writer.GetMemory(chunkSize); - read = await body.ReadAsync(memory, cancellationToken).ConfigureAwait(false); - writer.Advance(read); + result = await body.ReadAsync(cancellationToken); + body.AdvanceTo(result.Buffer.Start, result.Buffer.End); + } while (result is { IsCompleted: false, IsCanceled: false }); - // if (_maxRequestSize < writer.Length) - // { - // throw DefaultHttpRequestParser_MaxRequestSizeExceeded(); - // } - } while (read == chunkSize); + if (result.IsCanceled) + { + throw new OperationCanceledException(); + } - if (read == 0) + if (result.Buffer.Length == 0) { throw new BadRequestException("Expected to have a body"); } var jsonValueParser = new JsonValueParser(buffer: variableBuffer); - - var bodyValue = jsonValueParser.Parse(writer.WrittenSpan); - + var bodyValue = jsonValueParser.Parse(result.Buffer); variables[bodyVariable] = bodyValue; + body.AdvanceTo(result.Buffer.End); } InsertParametersIntoVariables(variables, endpointDescriptor, httpContext); - return variables; + var start = variableBuffer.Length; + await using var writer = new Utf8JsonWriter(variableBuffer, new JsonWriterOptions { Indented = false }); + + writer.WriteStartObject(); + + foreach (var (key, value) in variables) + { + writer.WritePropertyName(key); + + if (value is null) + { + writer.WriteNullValue(); + } + else + { + ValueJsonFormatter.Format(writer, value); + } + } + + writer.WriteEndObject(); + await writer.FlushAsync(cancellationToken); + + return JsonDocument.Parse(variableBuffer.WrittenMemory[start..]); } private static void InsertParametersIntoVariables( - Dictionary<string, object?> variables, + Dictionary<string, IValueNode?> variables, OpenApiEndpointDescriptor endpointDescriptor, HttpContext httpContext) { diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs index 6fb6461e966..5a07d48b635 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/FieldSetType.cs @@ -42,7 +42,7 @@ public FieldSetType(string name, BindingBehavior bind = BindingBehavior.Explicit Description = FederationResources.FieldsetType_Description; } - public override object CoerceInputLiteral(StringValueNode valueLiteral) + protected override SelectionSetNode OnCoerceInputLiteral(StringValueNode valueLiteral) { try { @@ -54,7 +54,7 @@ public override object CoerceInputLiteral(StringValueNode valueLiteral) } } - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override SelectionSetNode OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.String) { @@ -71,11 +71,11 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider throw Scalar_Cannot_CoerceInputValue(this, inputValue); } - public override void CoerceOutputValue(SelectionSetNode runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(SelectionSetNode runtimeValue, ResultElement resultValue) => resultValue.SetStringValue(SerializeSelectionSet(runtimeValue)); - public override IValueNode ValueToLiteral(SelectionSetNode runtimeValue) - => new StringValueNode(SerializeSelectionSet(runtimeValue)); + protected override StringValueNode OnValueToLiteral(SelectionSetNode runtimeValue) + => new(SerializeSelectionSet(runtimeValue)); internal static SelectionSetNode ParseSelectionSet(string s) => Utf8GraphQLParser.Syntax.ParseSelectionSet($"{{{s}}}"); diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs index 38ca93c27ee..bbafccd6aed 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/PolicyType.cs @@ -34,22 +34,15 @@ public PolicyType(string name, BindingBehavior bind = BindingBehavior.Explicit) Description = FederationResources.PolicyType_Description; } - public override object CoerceInputLiteral(StringValueNode valueLiteral) - => new Policy(valueLiteral.Value); + protected override Policy OnCoerceInputLiteral(StringValueNode valueLiteral) + => new(valueLiteral.Value); - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) - { - if (inputValue.ValueKind is JsonValueKind.String) - { - return new Policy(inputValue.GetString()!); - } - - throw Scalar_Cannot_CoerceInputValue(this, inputValue); - } + protected override Policy OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => new(inputValue.GetString()!); - public override void CoerceOutputValue(Policy runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(Policy runtimeValue, ResultElement resultValue) => resultValue.SetStringValue(runtimeValue.Value); - public override IValueNode ValueToLiteral(Policy runtimeValue) - => new StringValueNode(runtimeValue.Value); + protected override StringValueNode OnValueToLiteral(Policy runtimeValue) + => new(runtimeValue.Value); } diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs index b134c8626b7..267235266a0 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/ScopeType.cs @@ -34,22 +34,15 @@ public ScopeType(string name, BindingBehavior bind = BindingBehavior.Explicit) Description = FederationResources.ScopeType_Description; } - public override object CoerceInputLiteral(StringValueNode valueLiteral) - => new Scope(valueLiteral.Value); + protected override Scope OnCoerceInputLiteral(StringValueNode valueLiteral) + => new(valueLiteral.Value); - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) - { - if (inputValue.ValueKind is JsonValueKind.String) - { - return new Scope(inputValue.GetString()!); - } - - throw Scalar_Cannot_CoerceInputValue(this, inputValue); - } + protected override Scope OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => new Scope(inputValue.GetString()!); - public override void CoerceOutputValue(Scope runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(Scope runtimeValue, ResultElement resultValue) => resultValue.SetStringValue(runtimeValue.Value); - public override IValueNode ValueToLiteral(Scope runtimeValue) - => new StringValueNode(runtimeValue.Value); + protected override StringValueNode OnValueToLiteral(Scope runtimeValue) + => new(runtimeValue.Value); } diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs index 53480f64510..ae5c513c93f 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Types/_AnyType.cs @@ -6,7 +6,6 @@ using HotChocolate.Utilities; using static HotChocolate.ApolloFederation.FederationTypeNames; using static HotChocolate.ApolloFederation.ThrowHelper; -using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.ApolloFederation.Types; @@ -49,7 +48,7 @@ public _AnyType(string name, BindingBehavior bind = BindingBehavior.Explicit) /// <param name="valueLiteral">The GraphQL object value node to parse.</param> /// <returns>A <see cref="Representation"/> containing the typename and object data.</returns> /// <exception cref="GraphQLException">Thrown when the object is missing the <c>__typename</c> field.</exception> - public override object CoerceInputLiteral(ObjectValueNode valueLiteral) + protected override Representation OnCoerceInputLiteral(ObjectValueNode valueLiteral) { if (valueLiteral.Fields.FirstOrDefault( field => field.Name.Value.EqualsOrdinal(TypeNameField)) is { Value: StringValueNode s }) @@ -70,7 +69,7 @@ public override object CoerceInputLiteral(ObjectValueNode valueLiteral) /// <exception cref="GraphQLException"> /// Thrown when the input is not an object or is missing the <c>__typename</c> field. /// </exception> - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + protected override Representation OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { if (inputValue.ValueKind is JsonValueKind.Object && inputValue.TryGetProperty(TypeNameField, out var typeNameElement) @@ -92,7 +91,7 @@ public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider /// <param name="runtimeValue">The runtime value (not used).</param> /// <param name="resultValue">The result element (not used).</param> /// <exception cref="NotSupportedException">Always thrown as output coercion is not supported.</exception> - public override void CoerceOutputValue(Representation runtimeValue, ResultElement resultValue) + protected override void OnCoerceOutputValue(Representation runtimeValue, ResultElement resultValue) => throw new NotSupportedException( "The _Any scalar is an input-only type and does not support output coercion."); @@ -101,6 +100,6 @@ public override void CoerceOutputValue(Representation runtimeValue, ResultElemen /// </summary> /// <param name="runtimeValue">The representation to convert.</param> /// <returns>An <see cref="ObjectValueNode"/> containing the representation data.</returns> - public override IValueNode ValueToLiteral(Representation runtimeValue) - => new ObjectValueNode(runtimeValue.Data.Fields); + protected override ObjectValueNode OnValueToLiteral(Representation runtimeValue) + => new(runtimeValue.Data.Fields); } diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/GraphQLOverWebSocket/WebSocketExtensions.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/GraphQLOverWebSocket/WebSocketExtensions.cs index 45ee3a829fa..a9e505a22e2 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/GraphQLOverWebSocket/WebSocketExtensions.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/GraphQLOverWebSocket/WebSocketExtensions.cs @@ -1,11 +1,11 @@ using System.Net.WebSockets; using System.Text; +using System.Text.Json; using HotChocolate.AspNetCore.Formatters; using HotChocolate.AspNetCore.Subscriptions.Protocols; using HotChocolate.AspNetCore.Subscriptions.Protocols.GraphQLOverWebSocket; using HotChocolate.Buffers; using HotChocolate.Transport.Sockets; -using static HotChocolate.Language.Utf8GraphQLRequestParser; namespace HotChocolate.AspNetCore.Tests.Utilities.Subscriptions.GraphQLOverWebSocket; @@ -121,7 +121,7 @@ private static async Task SendMessageAsync( CancellationToken cancellationToken) => await webSocket.SendAsync(message, WebSocketMessageType.Text, true, cancellationToken); - public static async Task<IReadOnlyDictionary<string, object?>?> ReceiveServerMessageAsync( + public static async Task<JsonDocument?> ReceiveServerMessageAsync( this WebSocket webSocket, CancellationToken cancellationToken) { @@ -142,6 +142,6 @@ private static async Task SendMessageAsync( return null; } - return (IReadOnlyDictionary<string, object?>?)ParseJson(stream.ToArray()); + return JsonDocument.Parse(stream.ToArray()); } } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IExecutionRequest.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IExecutionRequest.cs index 5809fcec02b..f8ad3cb2226 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IExecutionRequest.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IExecutionRequest.cs @@ -5,7 +5,7 @@ namespace HotChocolate.Execution; /// <summary> /// Represents a request to execute a GraphQL operation. /// </summary> -public interface IExecutionRequest : IFeatureProvider +public interface IExecutionRequest : IFeatureProvider, IDisposable { /// <summary> /// Gets the initial request state. diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs index 5ac2b50e833..65f552bd314 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequest.cs @@ -11,6 +11,8 @@ namespace HotChocolate.Execution; /// </summary> public sealed class OperationRequest : IOperationRequest { + private bool _disposed; + /// <summary> /// Initializes a new instance of the <see cref="OperationRequest" /> class. /// </summary> @@ -147,6 +149,17 @@ public OperationRequest( /// </summary> public RequestFlags Flags { get; } + /// <inheritdoc /> + public void Dispose() + { + if (!_disposed) + { + VariableValues?.Dispose(); + Extensions?.Dispose(); + _disposed = true; + } + } + /// <summary> /// Creates a new request with the specified document. /// </summary> diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBatch.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBatch.cs index 5c24109eab1..fc9208c68e6 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBatch.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBatch.cs @@ -24,6 +24,8 @@ public sealed class OperationRequestBatch( IServiceProvider? services = null) : IExecutionRequest { + private bool _disposed; + /// <summary> /// The requests within this batch. /// </summary> @@ -43,4 +45,17 @@ public sealed class OperationRequestBatch( /// Gets the services that shall be used while executing the GraphQL request. /// </summary> public IServiceProvider? Services { get; } = services; + + /// <inheritdoc /> + public void Dispose() + { + if (!_disposed) + { + foreach (var request in Requests) + { + request.Dispose(); + } + _disposed = true; + } + } } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs index 85354194be0..2dc18021785 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs @@ -11,6 +11,8 @@ namespace HotChocolate.Execution; /// </summary> public sealed class VariableBatchRequest : IOperationRequest { + private bool _disposed; + /// <summary> /// Initializes a new instance of the <see cref="VariableBatchRequest" /> class. /// </summary> @@ -147,6 +149,17 @@ public VariableBatchRequest( /// </summary> public RequestFlags Flags { get; } + /// <inheritdoc /> + public void Dispose() + { + if (!_disposed) + { + VariableValues.Dispose(); + Extensions?.Dispose(); + _disposed = true; + } + } + /// <summary> /// Creates a new request with the specified services. /// </summary> diff --git a/src/HotChocolate/Core/src/Types/Properties/Resources.resx b/src/HotChocolate/Core/src/Types/Properties/Resources.resx index dae9ee12b18..e9496bbab4d 100644 --- a/src/HotChocolate/Core/src/Types/Properties/Resources.resx +++ b/src/HotChocolate/Core/src/Types/Properties/Resources.resx @@ -304,6 +304,6 @@ <value>The provided response name must be the same as on the selection.</value> </data> <data name="VariableCoercionHelper_CoerceVariableValues_VariablesMustBeObject" xml:space="preserve"> - <value>variables must be a JSON Object</value> + <value>Variable values must be a JSON Object.</value> </data> </root> diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs index 53397ab4db8..8101bc9d113 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs @@ -9,7 +9,6 @@ namespace HotChocolate.Fusion.Execution.Pipeline; internal sealed class OperationVariableCoercionMiddleware { - private static readonly Dictionary<string, object?> s_empty = []; private static readonly ImmutableArray<IVariableValueCollection> s_noVariables = [VariableValueCollection.Empty]; private readonly ICoreExecutionDiagnosticEvents _diagnosticEvents; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs index b4affd6b64f..7655a6aa77c 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs @@ -1,5 +1,6 @@ using System.Buffers; using System.Diagnostics.CodeAnalysis; +using System.Text.Json; using HotChocolate.Execution; using HotChocolate.Fusion.Types; using HotChocolate.Language; @@ -12,14 +13,21 @@ internal static class VariableCoercionHelper public static bool TryCoerceVariableValues( ISchemaDefinition schema, IReadOnlyList<VariableDefinitionNode> variableDefinitions, - IReadOnlyDictionary<string, object?> variableValues, + JsonElement variableValues, [NotNullWhen(true)] out Dictionary<string, VariableValue>? coercedVariableValues, [NotNullWhen(false)] out IError? error) { ArgumentNullException.ThrowIfNull(schema); ArgumentNullException.ThrowIfNull(variableDefinitions); - ArgumentNullException.ThrowIfNull(variableValues); + if (variableValues.ValueKind is not (JsonValueKind.Object or JsonValueKind.Null or JsonValueKind.Undefined)) + { + throw new ArgumentException( + "Variable values must be a JSON Object.", + nameof(variableValues)); + } + + var hasVariables = variableValues.ValueKind is JsonValueKind.Object; coercedVariableValues = []; error = null; @@ -28,16 +36,17 @@ public static bool TryCoerceVariableValues( var variableDefinition = variableDefinitions[i]; var variableName = variableDefinition.Variable.Name.Value; var variableType = AssertInputType(schema, variableDefinition); + JsonElement propertyValue = default; - var hasValue = variableValues.TryGetValue(variableName, out var value); + var hasValue = hasVariables && variableValues.TryGetProperty(variableName, out propertyValue); - if (!hasValue && variableDefinition.DefaultValue is { } defaultValue) + if (!hasValue && variableDefinition.DefaultValue is { Kind: not SyntaxKind.NullValue } defaultValue) { - value = defaultValue.Kind is SyntaxKind.NullValue ? null : defaultValue; - hasValue = true; + coercedVariableValues[variableName] = new VariableValue(variableName, variableType, defaultValue); + continue; } - if (!hasValue || value is null || value is NullValueNode) + if (!hasValue) { if (variableType.IsNonNullType()) { @@ -52,14 +61,17 @@ public static bool TryCoerceVariableValues( } coercedVariableValues[variableName] = - new VariableValue(variableName, variableType, NullValueNode.Default); + new VariableValue( + variableName, + variableType, + NullValueNode.Default); } - else if (value is IValueNode valueLiteral) + else { if (TryCoerceVariableValue( variableDefinition, variableType, - valueLiteral, + propertyValue, out var variableValue, out error)) { @@ -71,11 +83,6 @@ public static bool TryCoerceVariableValues( return false; } } - else - { - throw new NotSupportedException( - $"The variable value of type {value.GetType().Name} is not supported."); - } } return true; @@ -84,15 +91,17 @@ public static bool TryCoerceVariableValues( private static bool TryCoerceVariableValue( VariableDefinitionNode variableDefinition, IInputType variableType, - IValueNode value, + JsonElement value, [NotNullWhen(true)] out VariableValue? variableValue, [NotNullWhen(false)] out IError? error) { var root = Path.Root.Append(variableDefinition.Variable.Name.Value); + var parser = new JsonValueParser(); + var valueLiteral = parser.Parse(value); if (!ValidateValue( variableType, - value, + valueLiteral, root, 0, out error)) @@ -104,7 +113,7 @@ private static bool TryCoerceVariableValue( variableValue = new VariableValue( variableDefinition.Variable.Name.Value, variableType, - value); + valueLiteral); return true; } diff --git a/src/HotChocolate/Language/src/Language.Web/HotChocolate.Language.Web.csproj b/src/HotChocolate/Language/src/Language.Web/HotChocolate.Language.Web.csproj index d553010d15d..e3caac2970f 100644 --- a/src/HotChocolate/Language/src/Language.Web/HotChocolate.Language.Web.csproj +++ b/src/HotChocolate/Language/src/Language.Web/HotChocolate.Language.Web.csproj @@ -22,6 +22,7 @@ <ItemGroup> <ProjectReference Include="..\Language.Utf8\HotChocolate.Language.Utf8.csproj" /> + <ProjectReference Include="..\Language.Visitors\HotChocolate.Language.Visitors.csproj" /> </ItemGroup> <ItemGroup> diff --git a/src/HotChocolate/Language/src/Language.Web/JsonValueParser.cs b/src/HotChocolate/Language/src/Language.Web/JsonValueParser.cs index 1f2ce6f4661..623162871e8 100644 --- a/src/HotChocolate/Language/src/Language.Web/JsonValueParser.cs +++ b/src/HotChocolate/Language/src/Language.Web/JsonValueParser.cs @@ -183,6 +183,17 @@ public IValueNode Parse(ReadOnlySpan<byte> json) return Parse(ref reader); } + /// <summary> + /// Parses a JSON span as a GraphQL value node. + /// </summary> + /// <param name="json">The JSON span to parse.</param> + /// <returns>The parsed GraphQL value node.</returns> + public IValueNode Parse(ReadOnlySequence<byte> json) + { + var reader = new Utf8JsonReader(json, isFinalBlock: true, state: default); + return Parse(ref reader); + } + /// <summary> /// Parses a JSON reader as a GraphQL value node. /// </summary> diff --git a/src/HotChocolate/Language/src/Language.Web/ValueJsonFormatter.cs b/src/HotChocolate/Language/src/Language.Web/ValueJsonFormatter.cs new file mode 100644 index 00000000000..281632ab9c7 --- /dev/null +++ b/src/HotChocolate/Language/src/Language.Web/ValueJsonFormatter.cs @@ -0,0 +1,97 @@ +using System.Text.Json; +using HotChocolate.Language.Visitors; + +namespace HotChocolate.Language; + +public static class ValueJsonFormatter +{ + private static readonly JsonFormatterVisitor s_visitor = new(); + + public static void Format(Utf8JsonWriter writer, IValueNode node) + => s_visitor.Visit(node, new JsonFormatterContext(writer)); + + private sealed class JsonFormatterVisitor : SyntaxWalker<JsonFormatterContext> + { + protected override ISyntaxVisitorAction Enter( + ObjectValueNode node, + JsonFormatterContext context) + { + context.Writer.WriteStartObject(); + return base.Enter(node, context); + } + + protected override ISyntaxVisitorAction Leave( + ObjectValueNode node, + JsonFormatterContext context) + { + context.Writer.WriteEndObject(); + return base.Enter(node, context); + } + + protected override ISyntaxVisitorAction Enter( + ListValueNode node, + JsonFormatterContext context) + { + context.Writer.WriteStartArray(); + return base.Enter(node, context); + } + + protected override ISyntaxVisitorAction Leave( + ListValueNode node, + JsonFormatterContext context) + { + context.Writer.WriteEndArray(); + return base.Enter(node, context); + } + + protected override ISyntaxVisitorAction Enter( + ObjectFieldNode node, + JsonFormatterContext context) + { + context.Writer.WritePropertyName(node.Name.Value); + return base.Enter(node, context); + } + + protected override ISyntaxVisitorAction Enter( + IValueNode node, + JsonFormatterContext context) + { + switch (node) + { + case EnumValueNode value: + context.Writer.WriteStringValue(value.Value); + break; + + case FloatValueNode value: + context.Writer.WriteRawValue(value.AsSpan(), true); + break; + + case IntValueNode value: + context.Writer.WriteRawValue(value.AsSpan(), true); + break; + + case BooleanValueNode value: + context.Writer.WriteBooleanValue(value.Value); + break; + + case StringValueNode value: + context.Writer.WriteStringValue(value.Value); + break; + + case NullValueNode: + context.Writer.WriteNullValue(); + break; + + default: + throw new ArgumentOutOfRangeException(nameof(node)); + } + + return base.Enter(node, context); + } + } + + private sealed class JsonFormatterContext(Utf8JsonWriter writer) + { + public Utf8JsonWriter Writer { get; } = writer; + } +} diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs b/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs index 5a115ba3a9f..e3c4c44134d 100644 --- a/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs +++ b/src/HotChocolate/Language/test/Language.Web.Tests/Utf8GraphQLRequestParserTests.cs @@ -92,9 +92,8 @@ public void Parse_Kitchen_Sink_Query_With_Russian_Escaped_Characters() // act var parserOptions = new ParserOptions(); - var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions); - var batch = requestParser.Parse(); + var requestParser = new Utf8GraphQLRequestParser(parserOptions); + var batch = requestParser.Parse(source); // assert var request = Assert.Single(batch); @@ -126,12 +125,11 @@ public void Parse_Kitchen_Sink_Query_With_Cache() var cache = new DocumentCache(); var requestParser = new Utf8GraphQLRequestParser( - source, new ParserOptions(), cache, new Sha1DocumentHashProvider()); - var first = requestParser.Parse(); + var first = requestParser.Parse(source); cache.TryAddDocument( first[0].DocumentId?.Value!, @@ -139,12 +137,11 @@ public void Parse_Kitchen_Sink_Query_With_Cache() // act requestParser = new Utf8GraphQLRequestParser( - source, new ParserOptions(), cache, new Sha1DocumentHashProvider()); - var second = requestParser.Parse(); + var second = requestParser.Parse(source); // assert Assert.Equal(first[0].Document, second[0].Document); @@ -199,13 +196,12 @@ public void Parse_Id_As_Name() var cache = new DocumentCache(); var requestParser = new Utf8GraphQLRequestParser( - source, new ParserOptions(), cache, new Sha1DocumentHashProvider()); // act - var result = requestParser.Parse(); + var result = requestParser.Parse(source); // assert Assert.Collection(result, @@ -241,10 +237,10 @@ public void Parse_OnError(string? onError, ErrorHandlingMode? expectedErrorHandl JsonConvert.SerializeObject(request ).NormalizeLineBreaks()); - var requestParser = new Utf8GraphQLRequestParser(source); + var requestParser = new Utf8GraphQLRequestParser(); // act - var result = requestParser.Parse(); + var result = requestParser.Parse(source); // assert Assert.Collection(result, @@ -322,9 +318,8 @@ public void Parse_Kitchen_Sink_Query_AllProps_No_Cache() // act var parserOptions = new ParserOptions(); - var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions); - var batch = requestParser.Parse(); + var requestParser = new Utf8GraphQLRequestParser(parserOptions); + var batch = requestParser.Parse(source); // assert var snapshot = new Snapshot(); @@ -422,11 +417,10 @@ public void Parse_Apollo_AQP_SignatureQuery() // act var parserOptions = new ParserOptions(); var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions, new DocumentCache(), new Sha256DocumentHashProvider()); - var batch = requestParser.Parse(); + var batch = requestParser.Parse(source); // assert var request = Assert.Single(batch); @@ -450,11 +444,10 @@ public void Parse_Apollo_AQP_SignatureQuery_Variables_Without_Values() // act var parserOptions = new ParserOptions(); var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions, new DocumentCache(), new Sha256DocumentHashProvider()); - var batch = requestParser.Parse(); + var batch = requestParser.Parse(source); // assert var r = Assert.Single(batch); @@ -478,11 +471,10 @@ public void Parse_Apollo_AQP_FullRequest_And_Verify_Hash() // act var parserOptions = new ParserOptions(); var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions, new DocumentCache(), new Sha256DocumentHashProvider(HashFormat.Hex)); - var batch = requestParser.Parse(); + var batch = requestParser.Parse(source); // assert Assert.Collection(batch, @@ -515,13 +507,12 @@ public void Parse_Invalid_Query() var source = Encoding.UTF8.GetBytes("{\"query\":\"\"}".NormalizeLineBreaks()); var parserOptions = new ParserOptions(); var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions, new DocumentCache(), new Sha256DocumentHashProvider()); // act - requestParser.Parse(); + requestParser.Parse(source); }); } @@ -538,13 +529,12 @@ public void Parse_Empty_OperationName() """.NormalizeLineBreaks()); var parserOptions = new ParserOptions(); var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions, new DocumentCache(), new Sha256DocumentHashProvider()); // act - var batch = requestParser.Parse(); + var batch = requestParser.Parse(source); // assert var request = Assert.Single(batch); @@ -563,13 +553,12 @@ public void Parse_Empty_Json() .NormalizeLineBreaks()); var parserOptions = new ParserOptions(); var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions, new DocumentCache(), new Sha256DocumentHashProvider()); // act - requestParser.Parse(); + requestParser.Parse(source); }); } @@ -584,13 +573,12 @@ public void Parse_Empty_String() var source = Encoding.UTF8.GetBytes(string.Empty); var parserOptions = new ParserOptions(); var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions, new DocumentCache(), new Sha256DocumentHashProvider()); // act - requestParser.Parse(); + requestParser.Parse(source); }); } @@ -605,13 +593,12 @@ public void Parse_Space_String() var source = " "u8.ToArray(); var parserOptions = new ParserOptions(); var requestParser = new Utf8GraphQLRequestParser( - source, parserOptions, new DocumentCache(), new Sha256DocumentHashProvider()); // act - requestParser.Parse(); + requestParser.Parse(source); }); } @@ -664,7 +651,7 @@ public void Parse_Batch_Multiple_Requests() var batch = Utf8GraphQLRequestParser.Parse(source); // assert - Assert.Equal(3, batch.Count); + Assert.Equal(3, batch.Length); Assert.Equal("A", batch[0].OperationName); Assert.Equal("B", batch[1].OperationName); Assert.Equal("C", batch[2].OperationName); @@ -686,7 +673,7 @@ public void Parse_Batch_Large_Requires_Array_Expansion() var batch = Utf8GraphQLRequestParser.Parse(source); // assert - Assert.Equal(20, batch.Count); + Assert.Equal(20, batch.Length); for (var i = 0; i < 20; i++) { Assert.Equal($"Op{i}", batch[i].OperationName); diff --git a/src/HotChocolate/MongoDb/src/Types/BsonType.cs b/src/HotChocolate/MongoDb/src/Types/BsonType.cs index 271a8a5a1c9..009ef249fad 100644 --- a/src/HotChocolate/MongoDb/src/Types/BsonType.cs +++ b/src/HotChocolate/MongoDb/src/Types/BsonType.cs @@ -1,6 +1,9 @@ using System.Collections; using System.Globalization; +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types.MongoDb.Resources; using HotChocolate.Utilities; using Microsoft.Extensions.DependencyInjection; @@ -44,29 +47,12 @@ public BsonType() public override Type RuntimeType => typeof(BsonValue); /// <inheritdoc /> - public override bool IsValueCompatible(IValueNode valueLiteral) - { - ArgumentNullException.ThrowIfNull(valueLiteral); - - switch (valueLiteral) - { - case StringValueNode: - case IntValueNode: - case FloatValueNode: - case BooleanValueNode: - case ListValueNode: - case ObjectValueNode: - case NullValueNode: - return true; - - default: - return false; - } - } + public override ScalarSerializationType SerializationType => ScalarSerializationType.Any; - private BsonValue ParseLiteralToBson(IValueNode literal) + /// <inheritdoc /> + public override object CoerceInputLiteral(IValueNode valueLiteral) { - switch (literal) + switch (valueLiteral) { case StringValueNode svn: return new BsonString(svn.Value); @@ -92,7 +78,7 @@ when double.TryParse(fvn.Value, var values = new BsonValue[lvn.Items.Count]; for (var i = 0; i < lvn.Items.Count; i++) { - values[i] = ParseLiteralToBson(lvn.Items[i]); + values[i] = (BsonValue)CoerceInputLiteral(lvn.Items[i]); } return new BsonArray(values); @@ -101,7 +87,7 @@ when double.TryParse(fvn.Value, BsonDocument document = []; foreach (var field in ovn.Fields) { - document.Add(field.Name.Value, ParseLiteralToBson(field.Value)); + document.Add(field.Name.Value, (BsonValue)CoerceInputLiteral(field.Value)); } return document; @@ -110,18 +96,169 @@ when double.TryParse(fvn.Value, return BsonNull.Value; default: - throw ThrowHelper.Bson_CouldNotParseLiteral(this, literal); + throw ThrowHelper.Bson_CouldNotParseLiteral(this, valueLiteral); } } - /// <inheritdoc /> - public override object? CoerceInputLiteral(IValueNode valueSyntax) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - return ParseLiteralToBson(valueSyntax); + switch (inputValue.ValueKind) + { + case JsonValueKind.String: + return new BsonString(inputValue.GetString()!); + + case JsonValueKind.Number: + if (inputValue.TryGetInt64(out var longValue)) + { + return new BsonInt64(longValue); + } + if (inputValue.TryGetDouble(out var doubleValue)) + { + return new BsonDouble(doubleValue); + } + return new BsonDecimal128(inputValue.GetDecimal()); + + case JsonValueKind.True: + return BsonBoolean.True; + + case JsonValueKind.False: + return BsonBoolean.False; + + case JsonValueKind.Array: + var arrayLength = inputValue.GetArrayLength(); + var values = new BsonValue[arrayLength]; + var index = 0; + foreach (var element in inputValue.EnumerateArray()) + { + values[index++] = (BsonValue)CoerceInputValue(element, context); + } + return new BsonArray(values); + + case JsonValueKind.Object: + var document = new BsonDocument(); + foreach (var property in inputValue.EnumerateObject()) + { + document.Add(property.Name, (BsonValue)CoerceInputValue(property.Value, context)); + } + return document; + + case JsonValueKind.Null: + case JsonValueKind.Undefined: + return BsonNull.Value; + + default: + throw ThrowHelper.Bson_CouldNotParseValue(this, inputValue); + } } - /// <inheritdoc /> - public override IValueNode CoerceInputValue(object? runtimeValue) + public override void CoerceOutputValue(object? runtimeValue, ResultElement resultValue) + { + if (runtimeValue is null or BsonNull) + { + resultValue.SetNullValue(); + return; + } + + switch (runtimeValue) + { + case BsonString s: + resultValue.SetStringValue(s.Value); + break; + + case BsonInt32 i: + resultValue.SetNumberValue(i.Value); + break; + + case BsonInt64 l: + resultValue.SetNumberValue(l.Value); + break; + + case BsonDouble d: + resultValue.SetNumberValue(d.Value); + break; + + case BsonDecimal128 dec: + // The range of Decimal128 is different. Therefore, we have to serialize + // it as a string, or else information loss could occur + // see https://jira.mongodb.org/browse/CSHARP-2210 + resultValue.SetStringValue(dec.Value.ToString()); + break; + + case BsonBoolean b: + resultValue.SetBooleanValue(b.Value); + break; + + case BsonObjectId objectId: + resultValue.SetStringValue(objectId.Value.ToString()); + break; + + case BsonDateTime dateTime: + var parsedDateTime = dateTime.ToNullableUniversalTime(); + if (Converter.TryConvert(parsedDateTime, out string? formattedDateTime)) + { + resultValue.SetStringValue(formattedDateTime); + } + else + { + throw ThrowHelper.Bson_CouldNotParseValue(this, runtimeValue); + } + break; + + case BsonTimestamp timeStamp: + resultValue.SetNumberValue(timeStamp.Value); + break; + + case BsonBinaryData bd: + resultValue.SetStringValue(Convert.ToBase64String(bd.Bytes)); + break; + + case BsonArray arr: + resultValue.SetArrayValue(arr.Count); + using (var enumerator = arr.GetEnumerator()) + { + foreach (var element in resultValue.EnumerateArray()) + { + enumerator.MoveNext(); + CoerceOutputValue(enumerator.Current, element); + } + } + break; + + case BsonDocument doc: + resultValue.SetObjectValue(doc.ElementCount); + using (var enumerator = doc.GetEnumerator()) + { + foreach (var property in resultValue.EnumerateObject()) + { + enumerator.MoveNext(); + property.Value.SetPropertyName(enumerator.Current.Name); + CoerceOutputValue(enumerator.Current.Value, property.Value); + } + } + break; + + case BsonValue a: + var dotNetValue = BsonTypeMapper.MapToDotNetValue(a); + var type = dotNetValue.GetType(); + + if (type.IsValueType + && Converter.TryConvert(type, typeof(string), dotNetValue, out var c, out _) + && c is string casted) + { + resultValue.SetStringValue(casted); + } + else + { + throw ThrowHelper.Bson_CouldNotParseValue(this, runtimeValue); + } + break; + + default: + throw ThrowHelper.Bson_CouldNotParseValue(this, runtimeValue); + } + } + + public override IValueNode ValueToLiteral(object? runtimeValue) { if (runtimeValue is null) { @@ -175,7 +312,7 @@ public override IValueNode CoerceInputValue(object? runtimeValue) List<ObjectFieldNode> fields = []; foreach (var field in doc) { - fields.Add(new ObjectFieldNode(field.Name, CoerceInputValue(field.Value))); + fields.Add(new ObjectFieldNode(field.Name, ValueToLiteral(field.Value))); } return new ObjectValueNode(fields); @@ -186,7 +323,7 @@ public override IValueNode CoerceInputValue(object? runtimeValue) List<IValueNode> valueList = []; foreach (var element in arr) { - valueList.Add(CoerceInputValue(element)); + valueList.Add(ValueToLiteral(element)); } return new ListValueNode(valueList); @@ -204,178 +341,4 @@ public override IValueNode CoerceInputValue(object? runtimeValue) throw ThrowHelper.Bson_CouldNotParseValue(this, runtimeValue); } - - /// <inheritdoc /> - public override IValueNode ParseResult(object? resultValue) => - CoerceInputValue(resultValue); - - public override bool TrySerialize(object? runtimeValue, out object? resultValue) - { - resultValue = null; - if (runtimeValue is null or BsonNull) - { - return true; - } - - switch (runtimeValue) - { - case BsonArray arr: - var res = new object?[arr.Count]; - for (var i = 0; i < arr.Count; i++) - { - if (!TrySerialize(arr[i], out var s)) - { - return false; - } - - res[i] = s; - } - - resultValue = res; - return true; - - case BsonDocument doc: - Dictionary<string, object?> docRes = []; - foreach (var element in doc) - { - if (!TrySerialize(element.Value, out var s)) - { - return false; - } - - docRes[element.Name] = s; - } - - resultValue = docRes; - return true; - - case BsonDateTime dateTime: - var parsedDateTime = dateTime.ToNullableUniversalTime(); - if (Converter.TryConvert(parsedDateTime, out string? formattedDateTime)) - { - resultValue = formattedDateTime; - return true; - } - - return false; - - case BsonTimestamp timeStamp: - resultValue = timeStamp.Value; - return true; - - case BsonObjectId objectId: - resultValue = objectId.Value.ToString(); - return true; - - case BsonString s: - resultValue = s.Value; - return true; - - case BsonInt32 i: - resultValue = i.Value; - return true; - - case BsonInt64 l: - resultValue = l.Value; - return true; - - case BsonDouble f: - resultValue = f.Value; - return true; - - case BsonBinaryData bd: - resultValue = Convert.ToBase64String(bd.Bytes); - return true; - - // The range of Decimal128 is different. Therefor we have to serialize - // it as a string, or else information loss could occur - // see https://jira.mongodb.org/browse/CSHARP-2210 - case BsonDecimal128 d: - resultValue = d.Value.ToString(); - return true; - - case BsonBoolean b: - resultValue = b.Value; - return true; - - case BsonValue a: - var dotNetValue = BsonTypeMapper.MapToDotNetValue(a); - - var type = dotNetValue.GetType(); - - if (type.IsValueType - && Converter.TryConvert(type, typeof(string), dotNetValue, out var c, out _) - && c is string casted) - { - resultValue = casted; - return true; - } - - resultValue = null; - return false; - - case IValueNode literal: - resultValue = CoerceInputLiteral(literal); - return true; - - default: - resultValue = null; - return false; - } - } - - /// <inheritdoc /> - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - object? elementValue; - runtimeValue = null; - switch (resultValue) - { - case IDictionary<string, object> dictionary: - { - var result = new BsonDocument(); - foreach (var element in dictionary) - { - if (TryDeserialize(element.Value, out elementValue)) - { - result[element.Key] = (BsonValue?)elementValue; - } - else - { - return false; - } - } - - runtimeValue = result; - return true; - } - - case IList list: - { - var result = new BsonValue?[list.Count]; - for (var i = 0; i < list.Count; i++) - { - if (TryDeserialize(list[i], out elementValue)) - { - result[i] = (BsonValue?)elementValue; - } - else - { - return false; - } - } - - runtimeValue = new BsonArray(result); - return true; - } - - case IValueNode literal: - runtimeValue = CoerceInputLiteral(literal); - return true; - - default: - runtimeValue = BsonTypeMapper.MapToBsonValue(resultValue); - return true; - } - } } diff --git a/src/HotChocolate/MongoDb/src/Types/ObjectIdType.cs b/src/HotChocolate/MongoDb/src/Types/ObjectIdType.cs index a7140839529..e438b917ad5 100644 --- a/src/HotChocolate/MongoDb/src/Types/ObjectIdType.cs +++ b/src/HotChocolate/MongoDb/src/Types/ObjectIdType.cs @@ -1,4 +1,7 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types.MongoDb.Resources; using MongoDB.Bson; @@ -8,8 +11,7 @@ namespace HotChocolate.Types.MongoDb; /// The ObjectId scalar type represents a 12 byte ObjectId, represented as UTF-8 character /// sequences. /// </summary> -public class ObjectIdType - : ScalarType<ObjectId, StringValueNode> +public class ObjectIdType : ScalarType<ObjectId, StringValueNode> { /// <summary> /// Initializes a new instance of the <see cref="ObjectIdType"/> class. @@ -35,15 +37,15 @@ public ObjectIdType( Description = description; } - /// <inheritdoc /> - protected override ObjectId ParseLiteral(StringValueNode valueSyntax) => - new(valueSyntax.Value); + protected override ObjectId OnCoerceInputLiteral(StringValueNode valueLiteral) + => new(valueLiteral.Value); - /// <inheritdoc /> - protected override StringValueNode ParseValue(ObjectId runtimeValue) => - new(runtimeValue.ToString()); + protected override ObjectId OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => new(inputValue.GetString()!); - /// <inheritdoc /> - public override IValueNode ParseResult(object? resultValue) => - CoerceInputValue(resultValue); + protected override void OnCoerceOutputValue(ObjectId runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue.ToString()); + + protected override StringValueNode OnValueToLiteral(ObjectId runtimeValue) + => new(runtimeValue.ToString()); } diff --git a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md index 9a5f9696d2c..d00d59a4e9a 100644 --- a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md +++ b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md @@ -299,6 +299,10 @@ NonPositiveInt NonEmptyString NonNegativeInt +## OperationRequestBuilder + +TODO + # Deprecations Things that will continue to function this release, but we encourage you to move away from. From 63ccfb267b6097cfaf51aa95c81821416bc094a3 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Wed, 7 Jan 2026 14:28:36 +0100 Subject: [PATCH 068/144] refactor: Add conditional compilation for .NET 9.0 or greater in RequestExecutorBuilderExtensions --- .../Extensions/RequestExecutorBuilderExtensions.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/HotChocolate/Adapters/src/Adapters.Mcp/Extensions/RequestExecutorBuilderExtensions.cs b/src/HotChocolate/Adapters/src/Adapters.Mcp/Extensions/RequestExecutorBuilderExtensions.cs index 1d3023cabc9..86dffd4349c 100644 --- a/src/HotChocolate/Adapters/src/Adapters.Mcp/Extensions/RequestExecutorBuilderExtensions.cs +++ b/src/HotChocolate/Adapters/src/Adapters.Mcp/Extensions/RequestExecutorBuilderExtensions.cs @@ -1,3 +1,6 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using HotChocolate.Adapters.Mcp.Directives; using HotChocolate.Adapters.Mcp.Storage; using HotChocolate.Execution.Configuration; @@ -6,6 +9,10 @@ namespace HotChocolate.Adapters.Mcp.Extensions; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public static class RequestExecutorBuilderExtensions { public static IRequestExecutorBuilder AddMcp( From 98e3e965ca16802ffaf1dac450d606ae0bd29de0 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Wed, 7 Jan 2026 14:49:43 +0100 Subject: [PATCH 069/144] refactor: Improve exception handling and code structure in Fusion execution types --- .../FusionGatewayBuilderExtensions.cs | 7 ++++ .../FusionEnumTypeDefinition.cs | 2 +- .../Fusion.Execution.Types/FusionEnumValue.cs | 2 +- .../FusionInputFieldDefinition.cs | 2 +- .../FusionInputObjectTypeDefinition.cs | 2 +- .../FusionInterfaceTypeDefinition.cs | 2 +- .../FusionObjectTypeDefinition.cs | 2 +- .../FusionOutputFieldDefinition.cs | 2 +- .../FusionScalarTypeDefinition.cs | 2 +- .../FusionUnionTypeDefinition.cs | 2 +- .../src/Fusion.Execution.Types/ThrowHelper.cs | 14 ++----- .../Execution/Clients/FileVariableRewriter.cs | 37 ------------------- .../Clients/SourceSchemaHttpClient.cs | 27 +------------- .../JsonOperationPlanFormatter.cs | 2 +- .../OperationVariableCoercionMiddleware.cs | 16 ++++---- .../Execution/VariableCoercionHelper.cs | 6 +++ .../InaccessibleTests.cs | 34 ++++++++--------- 17 files changed, 53 insertions(+), 108 deletions(-) delete mode 100644 src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Clients/FileVariableRewriter.cs diff --git a/src/HotChocolate/Adapters/src/Fusion.Adapters.Mcp/Extensions/FusionGatewayBuilderExtensions.cs b/src/HotChocolate/Adapters/src/Fusion.Adapters.Mcp/Extensions/FusionGatewayBuilderExtensions.cs index cd392bb62d0..062ed29edb0 100644 --- a/src/HotChocolate/Adapters/src/Fusion.Adapters.Mcp/Extensions/FusionGatewayBuilderExtensions.cs +++ b/src/HotChocolate/Adapters/src/Fusion.Adapters.Mcp/Extensions/FusionGatewayBuilderExtensions.cs @@ -1,3 +1,6 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using HotChocolate.Adapters.Mcp.Storage; using HotChocolate.Fusion.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -5,6 +8,10 @@ namespace HotChocolate.Adapters.Mcp.Extensions; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public static class FusionGatewayBuilderExtensions { public static IFusionGatewayBuilder AddMcp( diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumTypeDefinition.cs index d2c570102f4..d81d513dbe4 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumTypeDefinition.cs @@ -112,7 +112,7 @@ internal void Complete(CompositeEnumTypeCompletionContext context) if (context.Directives is null || context.Features is null) { - InvalidCompletionContext(); + throw InvalidCompletionContext(); } Directives = context.Directives; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumValue.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumValue.cs index b598a1983b1..857acd56703 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumValue.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionEnumValue.cs @@ -130,7 +130,7 @@ internal void Complete(CompositeEnumValueCompletionContext context) if (context.DeclaringType is null || context.Directives is null || context.Features is null) { - ThrowHelper.InvalidCompletionContext(); + throw ThrowHelper.InvalidCompletionContext(); } DeclaringType = context.DeclaringType; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputFieldDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputFieldDefinition.cs index 9cc93e02c52..0fde0f3528b 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputFieldDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputFieldDefinition.cs @@ -134,7 +134,7 @@ internal void Complete(CompositeInputFieldCompletionContext context) || context.Type is null || context.Features is null) { - ThrowHelper.InvalidCompletionContext(); + throw ThrowHelper.InvalidCompletionContext(); } DeclaringMember = context.DeclaringMember; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputObjectTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputObjectTypeDefinition.cs index 17bf4a8d55f..fe662f41f31 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputObjectTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInputObjectTypeDefinition.cs @@ -116,7 +116,7 @@ internal void Complete(CompositeInputObjectTypeCompletionContext context) if (context.Directives is null || context.Features is null) { - InvalidCompletionContext(); + throw InvalidCompletionContext(); } Directives = context.Directives; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInterfaceTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInterfaceTypeDefinition.cs index fa5f6365e70..889f57577e9 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInterfaceTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionInterfaceTypeDefinition.cs @@ -34,7 +34,7 @@ internal void Complete(CompositeInterfaceTypeCompletionContext context) if (context.Directives is null || context.Interfaces is null || context.Sources is null || context.Features is null) { - ThrowHelper.InvalidCompletionContext(); + throw ThrowHelper.InvalidCompletionContext(); } Directives = context.Directives; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionObjectTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionObjectTypeDefinition.cs index c9c66c9a151..94c588e3839 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionObjectTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionObjectTypeDefinition.cs @@ -36,7 +36,7 @@ internal void Complete(CompositeObjectTypeCompletionContext context) || context.Sources is null || context.Features is null) { - ThrowHelper.InvalidCompletionContext(); + throw ThrowHelper.InvalidCompletionContext(); } Directives = context.Directives; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionOutputFieldDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionOutputFieldDefinition.cs index 0bbff168f09..839499d156a 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionOutputFieldDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionOutputFieldDefinition.cs @@ -187,7 +187,7 @@ internal void Complete(CompositeOutputFieldCompletionContext context) || context.DeclaringType is null || context.Features is null) { - InvalidCompletionContext(); + throw InvalidCompletionContext(); } Directives = context.Directives; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs index 9849d88ddd1..2ecb60abaa1 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionScalarTypeDefinition.cs @@ -120,7 +120,7 @@ internal void Complete(CompositeScalarTypeCompletionContext context) if (context.Directives is null) { - ThrowHelper.InvalidCompletionContext(); + throw ThrowHelper.InvalidCompletionContext(); } Directives = context.Directives; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionUnionTypeDefinition.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionUnionTypeDefinition.cs index 22a917c6772..660252aca80 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionUnionTypeDefinition.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/FusionUnionTypeDefinition.cs @@ -137,7 +137,7 @@ internal void Complete(CompositeUnionTypeCompletionContext context) if (context.Directives is null || context.Types is null || context.Sources is null || context.Features is null) { - InvalidCompletionContext(); + throw InvalidCompletionContext(); } Directives = context.Directives; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/ThrowHelper.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/ThrowHelper.cs index 89f1f87fc64..7df9b4462f2 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/ThrowHelper.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution.Types/ThrowHelper.cs @@ -13,16 +13,10 @@ public static void EnsureNotSealed(bool completed) } } - [DoesNotReturn] - public static void TypeSystemMemberSealed() - { - throw new NotSupportedException( + public static NotSupportedException TypeSystemMemberSealed() + => new NotSupportedException( "The type system member is sealed and cannot be modified."); - } - [DoesNotReturn] - public static void InvalidCompletionContext() - { - throw new InvalidOperationException("The context has an invalid state."); - } + public static InvalidOperationException InvalidCompletionContext() + => new("The context has an invalid state."); } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Clients/FileVariableRewriter.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Clients/FileVariableRewriter.cs deleted file mode 100644 index 6ffce498617..00000000000 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Clients/FileVariableRewriter.cs +++ /dev/null @@ -1,37 +0,0 @@ -using HotChocolate.Language; -using HotChocolate.Language.Visitors; -using HotChocolate.Transport.Http; -using HotChocolate.Types; - -namespace HotChocolate.Fusion.Execution.Clients; - -/// <summary> -/// Rewrites <see cref="FileValueNode"/> variable values to <see cref="FileReferenceNode"/>. -/// </summary> -internal sealed class FileVariableRewriter : SyntaxRewriter<FileVariableRewriter> -{ - private static readonly FileVariableRewriter s_instance = new(); - - public static IValueNode Rewrite(IValueNode node) - { - if (s_instance.Rewrite(node, s_instance) is IValueNode rewritten) - { - return rewritten; - } - - return NullValueNode.Default; - } - - protected override IValueNode? RewriteCustomValue(IValueNode node, FileVariableRewriter context) - { - if (node is FileValueNode fileValueNode) - { - return new FileReferenceNode( - fileValueNode.Value.OpenReadStream, - fileValueNode.Value.Name, - fileValueNode.Value.ContentType); - } - - return node; - } -} diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Clients/SourceSchemaHttpClient.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Clients/SourceSchemaHttpClient.cs index 6042e3ef92d..317b8150625 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Clients/SourceSchemaHttpClient.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Clients/SourceSchemaHttpClient.cs @@ -80,10 +80,7 @@ private GraphQLHttpRequest CreateHttpRequest( case 1: var variableValues = originalRequest.Variables[0].Values; - return new GraphQLHttpRequest(CreateSingleRequest( - operationSourceText, - variableValues, - originalRequest.RequiresFileUpload)) + return new GraphQLHttpRequest(CreateSingleRequest(operationSourceText, variableValues)) { Uri = _configuration.BaseAddress, Accept = defaultAccept, @@ -101,14 +98,8 @@ private GraphQLHttpRequest CreateHttpRequest( private static OperationRequest CreateSingleRequest( string operationSourceText, - ObjectValueNode? variables = null, - bool requiresFileUpload = false) + ObjectValueNode? variables = null) { - if (requiresFileUpload && variables is not null) - { - variables = RewriteFileReferencesInVariables(variables); - } - return new OperationRequest( operationSourceText, id: null, @@ -151,20 +142,6 @@ public ValueTask DisposeAsync() return ValueTask.CompletedTask; } - private static ObjectValueNode RewriteFileReferencesInVariables(ObjectValueNode variables) - { - var newFields = new ObjectFieldNode[variables.Fields.Count]; - - for (var i = 0; i < variables.Fields.Count; i++) - { - var field = variables.Fields[i]; - var newValue = FileVariableRewriter.Rewrite(field.Value); - newFields[i] = new ObjectFieldNode(field.Name.Value, newValue); - } - - return new ObjectValueNode(newFields); - } - private sealed class Response( OperationType operation, GraphQLHttpRequest request, diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Serialization/JsonOperationPlanFormatter.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Serialization/JsonOperationPlanFormatter.cs index 02e025722ac..8e97fb28163 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Serialization/JsonOperationPlanFormatter.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Serialization/JsonOperationPlanFormatter.cs @@ -341,7 +341,7 @@ private static void WriteObjectValueNode(Utf8JsonWriter jsonWriter, ObjectValueN foreach (var field in node.Fields) { - if (field.Value is FileValueNode or FileReferenceNode) + if (field.Value is FileReferenceNode) { continue; } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs index 8101bc9d113..ce81dcf1492 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Pipeline/OperationVariableCoercionMiddleware.cs @@ -61,7 +61,7 @@ private static bool TryCoerceVariables( if (VariableCoercionHelper.TryCoerceVariableValues( context.Schema, variableDefinitions, - operationRequest.VariableValues ?? s_empty, + operationRequest.VariableValues?.Document.RootElement ?? default, out var coercedValues, out var error)) { @@ -78,20 +78,20 @@ private static bool TryCoerceVariables( { using (diagnosticEvents.CoerceVariables(context)) { - var variableSetCount = variableBatchRequest.VariableValues?.Count ?? 0; - var variableSetInput = variableBatchRequest.VariableValues!; - var variableSet = new IVariableValueCollection[variableSetCount]; + var variableValuesSetInput = variableBatchRequest.VariableValues.Document.RootElement; + var variableValuesSet = new IVariableValueCollection[variableValuesSetInput.GetArrayLength()]; + var i = 0; - for (var i = 0; i < variableSetCount; i++) + foreach (var variableValuesInput in variableValuesSetInput.EnumerateArray()) { if (VariableCoercionHelper.TryCoerceVariableValues( context.Schema, variableDefinitions, - variableSetInput[i], + variableValuesInput, out var coercedValues, out var error)) { - variableSet[i] = new VariableValueCollection(coercedValues); + variableValuesSet[i++] = new VariableValueCollection(coercedValues); } else { @@ -100,7 +100,7 @@ private static bool TryCoerceVariables( } } - context.VariableValues = ImmutableCollectionsMarshal.AsImmutableArray(variableSet); + context.VariableValues = ImmutableCollectionsMarshal.AsImmutableArray(variableValuesSet); return true; } } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs index 7655a6aa77c..6260f0d7b1f 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/VariableCoercionHelper.cs @@ -8,6 +8,12 @@ namespace HotChocolate.Fusion.Execution; +// TODO : File Upload Rewrite +// return new FileReferenceNode( +// fileValueNode.Value.OpenReadStream, +// fileValueNode.Value.Name, +// fileValueNode.Value.ContentType); + internal static class VariableCoercionHelper { public static bool TryCoerceVariableValues( diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs index b51a30817ea..35aadaedad9 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs @@ -1,4 +1,7 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Transport; using HotChocolate.Transport.Http; using HotChocolate.Types; @@ -1013,31 +1016,26 @@ public InternalScalarType() : base("InternalScalar") { } - public override Type RuntimeType => typeof(string); + public override Type RuntimeType + => typeof(string); + + public override ScalarSerializationType SerializationType + => ScalarSerializationType.String; public override bool IsValueCompatible(IValueNode valueLiteral) => valueLiteral is StringValueNode; - public override object? CoerceInputLiteral(IValueNode valueSyntax) - => valueSyntax is StringValueNode s ? s.Value : null; - - public override IValueNode CoerceInputValue(object? runtimeValue) - => new StringValueNode(runtimeValue?.ToString() ?? ""); + public override object CoerceInputLiteral(IValueNode valueSyntax) + => ((StringValueNode)valueSyntax).Value; - public override IValueNode ParseResult(object? resultValue) - => CoerceInputValue(resultValue); + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => inputValue.GetString()!; - public override bool TrySerialize(object? runtimeValue, out object? resultValue) - { - resultValue = runtimeValue?.ToString(); - return true; - } + public override void CoerceOutputValue(object runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue.ToString()); - public override bool TryDeserialize(object? resultValue, out object? runtimeValue) - { - runtimeValue = resultValue?.ToString(); - return true; - } + public override IValueNode ValueToLiteral(object runtimeValue) + => new StringValueNode((string)runtimeValue); } public class Query From b9f3cec3472586633bca2c57c2f06704793a400e Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Wed, 7 Jan 2026 21:42:42 +0100 Subject: [PATCH 070/144] refactor: Enhance GraphQL handling with new ResultElement formatter and improved test utilities --- .../CookieCrumbleHotChocolate.cs | 1 + .../Extensions/CommonTestExtensions.cs | 27 +++ .../ResultElementSnapshotValueFormatter.cs | 12 ++ .../Formatters/SnapshotValueFormatters.cs | 3 + .../test/Adapters.Mcp.Tests/TestSchema.cs | 17 +- .../test/Adapters.OpenApi.Tests/TestSchema.cs | 17 +- .../FieldSetTypeTests.cs | 132 +++++------- .../ApolloFederation.Tests/_AnyTypeTests.cs | 192 +++++++----------- .../FieldSetTypeTests.CoerceOutputValue.snap | 1 + .../Apollo/SubscriptionTestBase.cs | 14 +- .../Apollo/WebSocketExtensions.cs | 6 +- .../SubscriptionTestBase.cs | 13 +- .../src/Types/Text/Json/ResultDocument.cs | 4 +- .../Execution/OperationRequestBuilderTests.cs | 5 +- 14 files changed, 218 insertions(+), 226 deletions(-) create mode 100644 src/CookieCrumble/src/CookieCrumble.HotChocolate/Formatters/ResultElementSnapshotValueFormatter.cs create mode 100644 src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/__snapshots__/FieldSetTypeTests.CoerceOutputValue.snap diff --git a/src/CookieCrumble/src/CookieCrumble.HotChocolate/CookieCrumbleHotChocolate.cs b/src/CookieCrumble/src/CookieCrumble.HotChocolate/CookieCrumbleHotChocolate.cs index c9f68404a86..52e451af939 100644 --- a/src/CookieCrumble/src/CookieCrumble.HotChocolate/CookieCrumbleHotChocolate.cs +++ b/src/CookieCrumble/src/CookieCrumble.HotChocolate/CookieCrumbleHotChocolate.cs @@ -13,5 +13,6 @@ protected override IEnumerable<ISnapshotValueFormatter> CreateFormatters() yield return SnapshotValueFormatters.OperationResult; yield return SnapshotValueFormatters.Schema; yield return SnapshotValueFormatters.SchemaError; + yield return SnapshotValueFormatters.ResultElement; } } diff --git a/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/CommonTestExtensions.cs b/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/CommonTestExtensions.cs index 26fb999cda1..113bb540bcd 100644 --- a/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/CommonTestExtensions.cs +++ b/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/CommonTestExtensions.cs @@ -1,5 +1,8 @@ +using HotChocolate; using HotChocolate.Execution; using HotChocolate.Execution.Configuration; +using HotChocolate.Execution.Processing; +using HotChocolate.Language; using Microsoft.Extensions.DependencyInjection; namespace CookieCrumble.HotChocolate; @@ -24,4 +27,28 @@ public static ValueTask<IRequestExecutor> CreateExceptionExecutor( .GetRequiredService<IRequestExecutorProvider>() .GetExecutorAsync(); } + + public static Operation CreateOperation() + { + var schema = + SchemaBuilder.New() + .AddDocumentFromString( + """ + type Query { + first: String + } + """) + .Use(_ => _) + .Create(); + + return OperationCompiler.Compile( + "abc", + Utf8GraphQLParser.Parse( + """ + { + first + } + """), + schema); + } } diff --git a/src/CookieCrumble/src/CookieCrumble.HotChocolate/Formatters/ResultElementSnapshotValueFormatter.cs b/src/CookieCrumble/src/CookieCrumble.HotChocolate/Formatters/ResultElementSnapshotValueFormatter.cs new file mode 100644 index 00000000000..12b7bca0c30 --- /dev/null +++ b/src/CookieCrumble/src/CookieCrumble.HotChocolate/Formatters/ResultElementSnapshotValueFormatter.cs @@ -0,0 +1,12 @@ +using System.Buffers; +using CookieCrumble.Formatters; +using HotChocolate.Text.Json; + +namespace CookieCrumble.HotChocolate.Formatters; + +internal sealed class ResultElementSnapshotValueFormatter + : SnapshotValueFormatter<ResultElement> +{ + protected override void Format(IBufferWriter<byte> snapshot, ResultElement element) + => element.WriteTo(snapshot, indented: true); +} diff --git a/src/CookieCrumble/src/CookieCrumble.HotChocolate/Formatters/SnapshotValueFormatters.cs b/src/CookieCrumble/src/CookieCrumble.HotChocolate/Formatters/SnapshotValueFormatters.cs index 2e859b1bca8..0cd81b5afb5 100644 --- a/src/CookieCrumble/src/CookieCrumble.HotChocolate/Formatters/SnapshotValueFormatters.cs +++ b/src/CookieCrumble/src/CookieCrumble.HotChocolate/Formatters/SnapshotValueFormatters.cs @@ -24,4 +24,7 @@ public static class SnapshotValueFormatters public static ISnapshotValueFormatter SchemaError { get; } = new SchemaErrorSnapshotValueFormatter(); + + public static ISnapshotValueFormatter ResultElement { get; } = + new ResultElementSnapshotValueFormatter(); } diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/TestSchema.cs b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/TestSchema.cs index 00b3dea4d60..b3374801dae 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/TestSchema.cs +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/TestSchema.cs @@ -5,7 +5,9 @@ using System.Text.Json; using HotChocolate.Adapters.Mcp.Directives; using HotChocolate.Authorization; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types; namespace HotChocolate.Adapters.Mcp; @@ -425,14 +427,17 @@ public sealed record Dog(string Name, bool IsBarking) : IPet; private sealed class UnknownType() : ScalarType<string, StringValueNode>("Unknown") { - public override IValueNode ParseResult(object? resultValue) - => throw new NotImplementedException(); + protected override string OnCoerceInputLiteral(StringValueNode valueLiteral) + => valueLiteral.Value; - protected override string ParseLiteral(StringValueNode valueSyntax) - => valueSyntax.Value; + protected override string OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => inputValue.GetString()!; - protected override StringValueNode ParseValue(string runtimeValue) - => throw new NotImplementedException(); + protected override void OnCoerceOutputValue(string runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue); + + protected override StringValueNode OnValueToLiteral(string runtimeValue) + => new StringValueNode(runtimeValue); } public sealed class ExplicitOpenWorld diff --git a/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/TestSchema.cs b/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/TestSchema.cs index 352663e749d..3700648ec71 100644 --- a/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/TestSchema.cs +++ b/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/TestSchema.cs @@ -1,7 +1,9 @@ using System.Text.Json; using HotChocolate.Authorization; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Resolvers; +using HotChocolate.Text.Json; using HotChocolate.Types; using HotChocolate.Types.Relay; @@ -237,13 +239,16 @@ public sealed record Dog(string Name, bool IsBarking) : IPet; private sealed class UnknownType() : ScalarType<string, StringValueNode>("Unknown") { - public override IValueNode ParseResult(object? resultValue) - => throw new NotImplementedException(); + protected override string OnCoerceInputLiteral(StringValueNode valueLiteral) + => valueLiteral.Value; - protected override string ParseLiteral(StringValueNode valueSyntax) - => valueSyntax.Value; + protected override string OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => inputValue.GetString()!; - protected override StringValueNode ParseValue(string runtimeValue) - => throw new NotImplementedException(); + protected override void OnCoerceOutputValue(string runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue); + + protected override StringValueNode OnValueToLiteral(string runtimeValue) + => new StringValueNode(runtimeValue); } } diff --git a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/FieldSetTypeTests.cs b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/FieldSetTypeTests.cs index 400e959b62f..8535fd78f0a 100644 --- a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/FieldSetTypeTests.cs +++ b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/FieldSetTypeTests.cs @@ -1,5 +1,7 @@ +using System.Text.Json; using HotChocolate.ApolloFederation.Types; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types; using static HotChocolate.ApolloFederation.FederationTypeNames; using static HotChocolate.Language.Utf8GraphQLParser; @@ -20,94 +22,70 @@ public void Ensure_Type_Name_Is_Correct() } [Fact] - public void Deserialize() + public void CoerceInputLiteral() { // arrange var type = new FieldSetType(); - const string serialized = "a b c d e(d: $b)"; + const string selection = "a b c d e(d: $b)"; + var serialized = new StringValueNode(selection); // act - var selectionSet = type.Deserialize(serialized); + var selectionSetObject = type.CoerceInputLiteral(serialized); // assert - Assert.IsType<SelectionSetNode>(selectionSet); + var selectionSet = Assert.IsType<SelectionSetNode>(selectionSetObject); + Assert.Equal(5, selectionSet.Selections.Count); } [Fact] - public void Deserialize_Invalid_Format() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new FieldSetType(); - const string serialized = "1"; + var serialized = new StringValueNode("1"); // act - void Action() => type.Deserialize(serialized); + void Action() => type.CoerceInputLiteral(serialized); // assert Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void TryDeserialize() + public void CoerceInputValue() { // arrange var type = new FieldSetType(); - const string serialized = "a b c d e(d: $b)"; - - // act - var success = type.TryDeserialize(serialized, out var selectionSet); - // assert - Assert.True(success); - Assert.IsType<SelectionSetNode>(selectionSet); - } - - [Fact] - public void TryDeserialize_Null() - { - // arrange - var type = new FieldSetType(); + var inputValue = JsonDocument.Parse( + """ + "a b c d e(d: $b)" + """); // act - var success = type.TryDeserialize(null, out var selectionSet); + var selectionSetObject = type.CoerceInputValue(inputValue.RootElement, null!); // assert - Assert.True(success); - Assert.Null(selectionSet); + var selectionSet = Assert.IsType<SelectionSetNode>(selectionSetObject); + Assert.Equal(5, selectionSet.Selections.Count); } [Fact] - public void TryDeserialize_Invalid_Syntax() + public void CoerceInputValue_Invalid_Format() { // arrange var type = new FieldSetType(); - const string serialized = "1"; + var inputValue = JsonDocument.Parse("1").RootElement; // act - var success = type.TryDeserialize(serialized, out var selectionSet); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.False(success); - Assert.Null(selectionSet); - } - - [Fact] - public void TryDeserialize_Invalid_Type() - { - // arrange - var type = new FieldSetType(); - const int serialized = 1; - - // act - var success = type.TryDeserialize(serialized, out var selectionSet); - - // assert - Assert.False(success); - Assert.Null(selectionSet); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Serialize() + public void CoerceOutputValue() { // arrange var type = new FieldSetType(); @@ -115,27 +93,33 @@ public void Serialize() var selectionSet = Syntax.ParseSelectionSet(Braces(selection)); // act - var serialized = type.Serialize(selectionSet); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(selectionSet, resultValue); // assert - Assert.Equal(selection, serialized); + resultValue.MatchSnapshot(); } [Fact] - public void Serialize_Invalid_Format() + public void CoerceOutputValue_Invalid_Format() { // arrange var type = new FieldSetType(); // act - void Action() => type.Serialize(1); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(1, resultValue); // assert Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void TrySerialize() + public void ValueToLiteral() { // arrange var type = new FieldSetType(); @@ -143,69 +127,55 @@ public void TrySerialize() var selectionSet = Syntax.ParseSelectionSet(Braces(selection)); // act - var success = type.TryCoerceOutputValue(selectionSet, out var serialized); + var valueSyntax = type.ValueToLiteral(selectionSet); // assert - Assert.True(success); - Assert.Equal(selection, serialized); + Assert.Equal( + selection, + Assert.IsType<StringValueNode>(valueSyntax).Value); } [Fact] - public void TrySerialize_Invalid_Format() + public void ValueToLiteral_Invalid_Format() { // arrange var type = new FieldSetType(); // act - var success = type.TryCoerceOutputValue(1, out var serialized); + Action action = () => type.ValueToLiteral(1); // assert - Assert.False(success); - Assert.Null(serialized); + Assert.Throws<LeafCoercionException>(action); } - private static string Braces(string s) => $"{{ {s} }}"; - [Fact] - public void ParseValue() + public void ParseLiteral() { // arrange var type = new FieldSetType(); const string selection = "a b c d e(d: $b)"; - var selectionSet = Syntax.ParseSelectionSet(Braces(selection)); + var stringValueNode = new StringValueNode(selection); // act - var valueSyntax = type.ParseValue(selectionSet); + var valueSyntax = type.CoerceInputLiteral(stringValueNode); // assert - Assert.Equal( - selection, - Assert.IsType<StringValueNode>(valueSyntax).Value); + var parsedSelectionSet = Assert.IsType<SelectionSetNode>(valueSyntax); + Assert.Equal(5, parsedSelectionSet.Selections.Count); } [Fact] - public void ParseValue_Null() + public void ParseLiteral_InvalidValue() { // arrange var type = new FieldSetType(); // act - var valueSyntax = type.ParseValue(null); - - // assert - Assert.IsType<NullValueNode>(valueSyntax); - } - - [Fact] - public void ParseValue_InvalidValue() - { - // arrange - var type = new FieldSetType(); - - // act - void Action() => type.CoerceInputValue(1); + void Action() => type.CoerceInputLiteral(new StringValueNode("1")); // assert Assert.Throws<LeafCoercionException>(Action); } + + private static string Braces(string s) => $"{{ {s} }}"; } diff --git a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs index 7b20c9de258..0fce966b47c 100644 --- a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs +++ b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs @@ -1,4 +1,6 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types; using AnyType = HotChocolate.ApolloFederation.Types._AnyType; @@ -25,8 +27,7 @@ public void CoerceInputLiteral() var serialized = new ObjectValueNode( new ObjectFieldNode(AnyType.TypeNameField, "test"), new ObjectFieldNode("faa", "foo"), - new ObjectFieldNode("foo", "bar") - ); + new ObjectFieldNode("foo", "bar")); // act var representationObject = type.CoerceInputLiteral(serialized); @@ -83,51 +84,78 @@ public void CoerceInputLiteral_Invalid_Format() Assert.Throws<LeafCoercionException>(Action); } - [Fact] - public void Serialize() + public void CoerceInputValue() { // arrange var type = new AnyType(); - var objectValueNode = new ObjectValueNode( - new ObjectFieldNode( - AnyType.TypeNameField, - "test" - ), - new ObjectFieldNode( - "foo", - "bar" - ) - ); - - var representation = new Representation("test", objectValueNode); + var inputValue = JsonDocument.Parse( + """ + { + "__typename": "test", + "faa": "foo", + "foo": "bar" + } + """); // act - var serialized = type.CoerceOutputValue(representation)!; + var representationObject = type.CoerceInputValue(inputValue.RootElement, null!); // assert - Assert.Equal( - objectValueNode, - serialized, - SyntaxComparer.BySyntax); + var representation = Assert.IsType<Representation>(representationObject); + + Assert.Equal("test", representation.TypeName); + Assert.Collection(representation.Data.Fields, + node => + { + Assert.Equal( + AnyType.TypeNameField, + node.Name.Value); + + Assert.Equal( + "test", + node.Value.Value); + }, + node => + { + Assert.Equal( + "faa", + node.Name.Value); + + Assert.Equal( + "foo", + node.Value.Value); + }, + node => + { + Assert.Equal( + "foo", + node.Name.Value); + + Assert.Equal( + "bar", + node.Value.Value); + } + ); } [Fact] - public void Serialize_Invalid_Format() + public void CoerceInputValue_Invalid_Format() { // arrange var type = new AnyType(); + var inputValue = JsonDocument.Parse("1").RootElement; // act - void Action() => type.Serialize(1); + void Action() => type.CoerceInputValue(inputValue, null!); // assert Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void TrySerialize() + public void CoerceOutputValue() { // arrange var type = new AnyType(); @@ -141,49 +169,37 @@ public void TrySerialize() "bar" ) ); - var representation = new Representation("test", objectValueNode); - - // act - var success = type.TryCoerceOutputValue(representation, out var serialized); - // assert - Assert.True(success); - Assert.Equal( - objectValueNode, - (ISyntaxNode)serialized!, - SyntaxComparer.BySyntax); - } - - [Fact] - public void TrySerialize_Invalid_Type() - { - // arrange - var type = new AnyType(); + var representation = new Representation("test", objectValueNode); // act - var success = type.TryCoerceOutputValue(1, out var serialized); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(representation, resultValue); // assert - Assert.False(success); - Assert.Null(serialized); + resultValue.MatchSnapshot(); } [Fact] - public void TrySerialize_Invalid_Null() + public void CoerceOutputValue_Invalid_Format() { // arrange var type = new AnyType(); // act - var success = type.TryCoerceOutputValue(null, out var serialized); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(1, resultValue); // assert - Assert.True(success); - Assert.Null(serialized); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue() + public void ValueToLiteral() { // arrange var type = new AnyType(); @@ -200,7 +216,7 @@ public void ParseValue() var representation = new Representation("test", objectValueNode); // act - var valueSyntax = type.ParseValue(representation); + var valueSyntax = type.ValueToLiteral(representation); // assert Assert.Equal( @@ -210,7 +226,7 @@ public void ParseValue() } [Fact] - public void ParseLiteral() + public void ValueToLiteral_Invalid_Format() { // arrange var type = new AnyType(); @@ -226,29 +242,14 @@ public void ParseLiteral() ); // act - var valueSyntax = type.CoerceInputLiteral(objectValueNode); - - // assert - var parsedRepresentation = Assert.IsType<Representation>(valueSyntax); - Assert.Equal("test", parsedRepresentation.TypeName); - Assert.Equal(objectValueNode, parsedRepresentation.Data); - } - - [Fact] - public void ParseLiteral_InvalidValue() - { - // arrange - var type = new AnyType(); - - // act - void Action() => type.CoerceInputLiteral(new ObjectValueNode()); + Action action = () => type.ValueToLiteral(1); // assert - Assert.Throws<LeafCoercionException>(Action); + Assert.Throws<LeafCoercionException>(action); } [Fact] - public void ParseResult() + public void ParseLiteral() { // arrange var type = new AnyType(); @@ -262,65 +263,24 @@ public void ParseResult() "bar" ) ); - var representation = new Representation("test", objectValueNode); - - // act - var parsedResult = type.ParseResult(representation); - - // assert - Assert.Equal( - objectValueNode, - Assert.IsType<ObjectValueNode>(parsedResult), - SyntaxComparer.BySyntax); - } - - [Fact] - public void ParseResult_Null() - { - // arrange - var type = new AnyType(); - - // act - var parsedResult = type.ParseResult(null); - - // assert - Assert.Equal(NullValueNode.Default, parsedResult); - } - - [Fact] - public void ParseResult_InvalidValue() - { - // arrange - var type = new AnyType(); - - // act - void Action() => type.ParseResult(new ObjectValueNode()); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - - [Fact] - public void ParseValue_Null() - { - // arrange - var type = new AnyType(); // act - var valueSyntax = type.ParseValue(null); + var valueSyntax = type.CoerceInputLiteral(objectValueNode); // assert - Assert.IsType<NullValueNode>(valueSyntax); + var parsedRepresentation = Assert.IsType<Representation>(valueSyntax); + Assert.Equal("test", parsedRepresentation.TypeName); + Assert.Equal(objectValueNode, parsedRepresentation.Data); } [Fact] - public void ParseValue_InvalidValue() + public void ParseLiteral_InvalidValue() { // arrange var type = new AnyType(); // act - void Action() => type.CoerceInputValue(1); + void Action() => type.CoerceInputLiteral(new ObjectValueNode()); // assert Assert.Throws<LeafCoercionException>(Action); diff --git a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/__snapshots__/FieldSetTypeTests.CoerceOutputValue.snap b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/__snapshots__/FieldSetTypeTests.CoerceOutputValue.snap new file mode 100644 index 00000000000..21774ac350a --- /dev/null +++ b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/__snapshots__/FieldSetTypeTests.CoerceOutputValue.snap @@ -0,0 +1 @@ +"a b c d e(d: $b)" diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/Apollo/SubscriptionTestBase.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/Apollo/SubscriptionTestBase.cs index ce3d4d47716..9b63ed51451 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/Apollo/SubscriptionTestBase.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/Apollo/SubscriptionTestBase.cs @@ -1,5 +1,6 @@ using System.Diagnostics; using System.Net.WebSockets; +using System.Text.Json; using HotChocolate.AspNetCore.Subscriptions.Protocols.Apollo; using Microsoft.AspNetCore.TestHost; @@ -14,13 +15,13 @@ public SubscriptionTestBase(TestServerFactory serverFactory) protected Uri SubscriptionUri { get; } = new("ws://localhost:5000/graphql"); - protected Task<IReadOnlyDictionary<string, object?>?> WaitForMessage( + protected Task<JsonDocument?> WaitForMessage( WebSocket webSocket, string type, CancellationToken cancellationToken) => WaitForMessage(webSocket, type, TimeSpan.FromMilliseconds(500), cancellationToken); - protected async Task<IReadOnlyDictionary<string, object?>?> WaitForMessage( + protected async Task<JsonDocument?> WaitForMessage( WebSocket webSocket, string type, TimeSpan timeout, @@ -38,16 +39,17 @@ public SubscriptionTestBase(TestServerFactory serverFactory) await Task.Delay(50, combinedCts.Token); var message = await webSocket.ReceiveServerMessageAsync(combinedCts.Token); + var messageType = message?.RootElement.GetProperty(MessageProperties.Type).GetString(); - if (message != null && type.Equals(message[MessageProperties.Type])) + if (type.Equals(messageType)) { return message; } - if (message?[MessageProperties.Type]?.Equals("ka") is false) + if (!"ka".Equals(messageType)) { throw new InvalidOperationException( - $"Unexpected message type: {message[MessageProperties.Type]}"); + $"Unexpected message type: {messageType}"); } } } @@ -97,7 +99,7 @@ protected async Task<WebSocket> ConnectToServerAsync( await webSocket.SendConnectionInitializeAsync(cancellationToken); var message = await webSocket.ReceiveServerMessageAsync(cancellationToken); Assert.NotNull(message); - Assert.Equal("connection_ack", message[MessageProperties.Type]); + Assert.Equal("connection_ack", message.RootElement.GetProperty(MessageProperties.Type).GetString()); return webSocket; } diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/Apollo/WebSocketExtensions.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/Apollo/WebSocketExtensions.cs index e84229a0c69..98bba52e873 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/Apollo/WebSocketExtensions.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/Apollo/WebSocketExtensions.cs @@ -1,5 +1,6 @@ using System.Net.WebSockets; using System.Text; +using System.Text.Json; using HotChocolate.AspNetCore.Formatters; using HotChocolate.AspNetCore.Subscriptions.Protocols; using HotChocolate.AspNetCore.Subscriptions.Protocols.Apollo; @@ -9,7 +10,6 @@ using HotChocolate.Transport.Sockets; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; -using static HotChocolate.Language.Utf8GraphQLRequestParser; namespace HotChocolate.AspNetCore.Tests.Utilities.Subscriptions.Apollo; @@ -151,7 +151,7 @@ private static Stream CreateMessageStream(this OperationMessage message, bool la return new MemoryStream(Encoding.UTF8.GetBytes(json)); } - public static async Task<IReadOnlyDictionary<string, object?>?> ReceiveServerMessageAsync( + public static async Task<JsonDocument?> ReceiveServerMessageAsync( this WebSocket webSocket, CancellationToken cancellationToken) { @@ -183,7 +183,7 @@ private static Stream CreateMessageStream(this OperationMessage message, bool la return null; } - return (IReadOnlyDictionary<string, object?>?)ParseJson(stream.ToArray())!; + return JsonDocument.Parse(stream.ToArray()); } private sealed class HelperOperationMessage(string type, string id, object payload) diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/GraphQLOverWebSocket/SubscriptionTestBase.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/GraphQLOverWebSocket/SubscriptionTestBase.cs index 458c4227460..36febd5e6be 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/GraphQLOverWebSocket/SubscriptionTestBase.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests.Utilities/Subscriptions/GraphQLOverWebSocket/SubscriptionTestBase.cs @@ -1,5 +1,6 @@ using System.Diagnostics; using System.Net.WebSockets; +using System.Text.Json; using HotChocolate.Transport.Sockets; using Microsoft.AspNetCore.TestHost; @@ -10,13 +11,13 @@ public class SubscriptionTestBase(TestServerFactory serverFactory) { protected Uri SubscriptionUri { get; } = new("ws://localhost:5000/graphql"); - protected Task<IReadOnlyDictionary<string, object?>?> WaitForMessage( + protected Task<JsonDocument?> WaitForMessage( WebSocket webSocket, string type, CancellationToken cancellationToken) => WaitForMessage(webSocket, type, TimeSpan.FromSeconds(1), cancellationToken); - protected async Task<IReadOnlyDictionary<string, object?>?> WaitForMessage( + protected async Task<JsonDocument?> WaitForMessage( WebSocket webSocket, string type, TimeSpan timeout, @@ -37,12 +38,14 @@ public class SubscriptionTestBase(TestServerFactory serverFactory) continue; } - if (type.Equals(message["type"])) + var messageType = message.RootElement.GetProperty("type").GetString()!; + + if (type.Equals(messageType)) { return message; } - throw new InvalidOperationException($"Unexpected message type: {message["type"]}"); + throw new InvalidOperationException($"Unexpected message type: {messageType}"); } } catch (OperationCanceledException) @@ -91,7 +94,7 @@ protected async Task<WebSocket> ConnectToServerAsync( await webSocket.SendConnectionInitAsync(cancellationToken); var message = await webSocket.ReceiveServerMessageAsync(cancellationToken); Assert.NotNull(message); - Assert.Equal("connection_ack", message["type"]); + Assert.Equal("connection_ack", message.RootElement.GetProperty("type").GetString()); return webSocket; } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index f1312d8c414..ba11bf77427 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -25,8 +25,10 @@ public sealed partial class ResultDocument : IDisposable #endif private bool _disposed; - internal ResultDocument(Operation operation, ulong includeFlags) + public ResultDocument(Operation operation, ulong includeFlags) { + ArgumentNullException.ThrowIfNull(operation); + _metaDb = MetaDb.CreateForEstimatedRows(Cursor.RowsPerChunk); _operation = operation; _includeFlags = includeFlags; diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs index b950c315671..f409a297c4f 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; using Microsoft.Extensions.DependencyInjection; @@ -91,7 +92,7 @@ public void BuildRequest_QueryAndResetVariables_RequestIsCreated() OperationRequestBuilder.New() .SetDocument("{ foo }") .SetVariableValues(new Dictionary<string, object?> { ["one"] = "bar" }) - .SetVariableValues(null) + .SetVariableValues(default(JsonDocument)) .Build(); // assert @@ -330,7 +331,7 @@ public void BuildRequest_SetErrorHandlingMode_VariableBatchRequest() OperationRequestBuilder.New() .SetDocument("{ foo }") .SetErrorHandlingMode(ErrorHandlingMode.Halt) - .SetVariableValuesSet([new Dictionary<string, object?> { ["one"] = "foo" }]) + .SetVariableValues([new Dictionary<string, object?> { ["one"] = "foo" }]) .Build(); // assert From b2a597b303d1fe120e37a6ac6c5ca3539648463d Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 8 Jan 2026 09:28:21 +0100 Subject: [PATCH 071/144] Add tests for UnsignedLongType and UnsignedShortType; refactor UrlTypeTests and UuidTypeTests - Implemented comprehensive unit tests for UnsignedLongType and UnsignedShortType, covering input coercion, output coercion, and literal parsing. - Refactored UrlTypeTests to enhance clarity and coverage, including tests for URL coercion and validation. - Updated UuidTypeTests to improve structure and ensure thorough testing of UUID coercion and compatibility checks. - Removed obsolete UploadTypeTests to streamline the test suite. --- .../Apollo/WebSocketProtocolTests.cs | 17 +- .../WebSocketProtocolTests.cs | 19 +- .../src/Types/Types/Scalars/StringType.cs | 1 - .../Execution/OperationRequestBuilderTests.cs | 5 +- .../ScalarExecutionErrorTests.cs | 124 ++---- .../NegativeFloatTypeTests.cs | 214 ---------- .../NegativeIntTypeTests.cs | 205 ---------- .../NonEmptyStringTypeTests.cs | 190 --------- .../NonNegativeFloatTypeTests.cs | 221 ---------- .../SignedByteTypeTests.cs | 220 ---------- .../UnsignedIntTypeTests.cs | 220 ---------- .../UnsignedLongTypeTests.cs | 217 ---------- .../UnsignedShortTypeTests.cs | 220 ---------- .../Configuration/SchemaTypeDiscoveryTests.cs | 29 +- .../Configuration/TypeDiscovererTests.cs | 8 +- .../Types/Composite/SerializeAsTests.cs | 57 ++- .../test/Types.Tests/Types/EnumTypeTests.cs | 2 +- .../Types.Tests/Types/InputParserTests.cs | 111 ++++-- .../Types.Tests/Types/Scalars/AnyTypeTests.cs | 147 ++----- .../Types/Scalars/BooleanTypeTests.cs | 199 +++++++-- .../Types/Scalars/ByteArrayTypeTests.cs | 208 +++++----- .../Types/Scalars/ByteTypeTests.cs | 188 ++++++--- .../Types/Scalars/DateTimeTypeTests.cs | 290 +++++--------- .../Types/Scalars/DateTypeTests.cs | 318 +++++---------- .../Types/Scalars/DecimalTypeTests.cs | 229 +++++++---- .../Types/Scalars/FloatTypeTests.cs | 222 ++++------- .../Types.Tests/Types/Scalars/IdTypeTests.cs | 185 +++++---- .../Types.Tests/Types/Scalars/IntTypeTests.cs | 182 ++++----- .../Types/Scalars/LocalDateTimeTypeTests.cs | 284 ++++--------- .../Types/Scalars/LocalDateTypeTests.cs | 377 ++++-------------- .../Types/Scalars/LocalTimeTypeTests.cs | 344 ++++------------ .../Types/Scalars/LongTypeTests.cs | 182 ++++----- .../Types/Scalars/ScalarBindingTests.cs | 23 +- .../Types/Scalars/ShortTypeTests.cs | 182 ++++----- .../Types/Scalars/SignedByteTypeTests.cs | 245 ++++++++++++ .../Types/Scalars/StringTypeTests.cs | 120 +++--- .../Types/Scalars/TimeSpanTypeTests.cs | 279 +++++++++---- .../Types/Scalars/UnsignedIntTypeTests.cs | 245 ++++++++++++ .../Types/Scalars/UnsignedLongTypeTests.cs | 245 ++++++++++++ .../Types/Scalars/UnsignedShortTypeTests.cs | 245 ++++++++++++ .../Types/Scalars/UploadTypeTests.cs | 26 -- .../Types.Tests/Types/Scalars/UrlTypeTests.cs | 258 +++++++++--- .../Types/Scalars/UuidTypeTests.cs | 331 ++++++++------- 43 files changed, 3181 insertions(+), 4453 deletions(-) delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/NegativeFloatTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/NegativeIntTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/NonEmptyStringTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/NonNegativeFloatTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/SignedByteTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedIntTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedLongTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedShortTypeTests.cs create mode 100644 src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs create mode 100644 src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs create mode 100644 src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs create mode 100644 src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UploadTypeTests.cs diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/Apollo/WebSocketProtocolTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/Apollo/WebSocketProtocolTests.cs index 611791e013e..cdc8893a3d6 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/Apollo/WebSocketProtocolTests.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/Apollo/WebSocketProtocolTests.cs @@ -32,7 +32,7 @@ public Task Send_Connect_AcceptAndKeepAlive() // assert var message = await webSocket.ReceiveServerMessageAsync(ct); Assert.NotNull(message); - Assert.Equal("connection_ack", message["type"]); + Assert.Equal("connection_ack", message.RootElement.GetProperty("type").GetString()); }); [Fact] @@ -101,7 +101,7 @@ public Task Send_Connect_With_Auth_Accept() // assert var message = await webSocket.ReceiveServerMessageAsync(ct); Assert.NotNull(message); - Assert.Equal("connection_ack", message[MessageProperties.Type]); + Assert.Equal("connection_ack", message.RootElement.GetProperty(MessageProperties.Type).GetString()); }); [Fact] @@ -144,7 +144,7 @@ public Task Send_Connect_AcceptAndKeepAlive_Explicit_Route() // assert var message = await webSocket.ReceiveServerMessageAsync(ct); Assert.NotNull(message); - Assert.Equal("connection_ack", message["type"]); + Assert.Equal("connection_ack", message.RootElement.GetProperty("type").GetString()); }); [Fact] @@ -164,7 +164,7 @@ public Task Send_Connect_AcceptAndKeepAlive_Explicit_Route_Explicit_Path() // assert var message = await webSocket.ReceiveServerMessageAsync(ct); Assert.NotNull(message); - Assert.Equal("connection_ack", message["type"]); + Assert.Equal("connection_ack", message.RootElement.GetProperty("type").GetString()); }); [Fact] @@ -592,11 +592,10 @@ await testServer.SendPostRequestAsync( var message = await WaitForMessage(webSocket, "data", ct); Assert.NotNull(message); - var messagePayload = (Dictionary<string, object?>?)message["payload"]; - var messageData = (Dictionary<string, object?>?)messagePayload?["data"]; - var messageOnReview = (Dictionary<string, object?>?)messageData?["onReview"]; - Assert.NotNull(messageOnReview); - Assert.DoesNotContain("commentary", messageOnReview); + var messagePayload = message.RootElement.GetProperty("payload"); + var messageData = messagePayload.GetProperty("data"); + var messageOnReview = messageData.GetProperty("onReview"); + Assert.False(messageOnReview.TryGetProperty("commentary", out _)); }); private class AuthInterceptor : DefaultSocketSessionInterceptor diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/GraphQLOverWebSocket/WebSocketProtocolTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/GraphQLOverWebSocket/WebSocketProtocolTests.cs index 2fed7f816df..1081dbd3f05 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/GraphQLOverWebSocket/WebSocketProtocolTests.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/Subscriptions/GraphQLOverWebSocket/WebSocketProtocolTests.cs @@ -37,7 +37,7 @@ public Task Send_Connect_Accept() // assert var message = await webSocket.ReceiveServerMessageAsync(ct); Assert.NotNull(message); - Assert.Equal(Messages.ConnectionAccept, message[MessageProperties.Type]); + Assert.Equal(Messages.ConnectionAccept, message.RootElement.GetProperty(MessageProperties.Type).GetString()); }); [Fact] @@ -93,7 +93,7 @@ public Task Send_Connect_Accept_Ping() TimeSpan.FromSeconds(5), ct); Assert.NotNull(message); - Assert.Equal(Messages.Ping, message[MessageProperties.Type]); + Assert.Equal(Messages.Ping, message.RootElement.GetProperty(MessageProperties.Type).GetString()); }); [Fact] @@ -145,7 +145,7 @@ public Task Send_Connect_With_Auth_Accept() // assert var message = await webSocket.ReceiveServerMessageAsync(ct); Assert.NotNull(message); - Assert.Equal(Messages.ConnectionAccept, message[MessageProperties.Type]); + Assert.Equal(Messages.ConnectionAccept, message.RootElement.GetProperty(MessageProperties.Type).GetString()); }); [Fact] @@ -189,7 +189,7 @@ public Task Send_Connect_Accept_Explicit_Route() // assert var message = await webSocket.ReceiveServerMessageAsync(ct); Assert.NotNull(message); - Assert.Equal("connection_ack", message["type"]); + Assert.Equal("connection_ack", message.RootElement.GetProperty("type").GetString()); }); [Fact] @@ -210,7 +210,7 @@ public Task Send_Connect_Accept_Explicit_Route_Explicit_Path() // assert var message = await webSocket.ReceiveServerMessageAsync(ct); Assert.NotNull(message); - Assert.Equal("connection_ack", message["type"]); + Assert.Equal("connection_ack", message.RootElement.GetProperty("type").GetString()); }); [Fact] @@ -953,11 +953,10 @@ await testServer.SendPostRequestAsync( // assert var message = await WaitForMessage(webSocket, Messages.Next, ct); Assert.NotNull(message); - var messagePayload = (Dictionary<string, object?>?)message["payload"]; - var messageData = (Dictionary<string, object?>?)messagePayload?["data"]; - var messageOnReview = (Dictionary<string, object?>?)messageData?["onReview"]; - Assert.NotNull(messageOnReview); - Assert.DoesNotContain("commentary", messageOnReview); + var messagePayload = message.RootElement.GetProperty("payload"); + var messageData = messagePayload.GetProperty("data"); + var messageOnReview = messageData.GetProperty("onReview"); + Assert.False(messageOnReview.TryGetProperty("commentary", out _)); }); private class AuthInterceptor : DefaultSocketSessionInterceptor diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs index e0154b593a3..861777121cf 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/StringType.cs @@ -3,7 +3,6 @@ using HotChocolate.Language; using HotChocolate.Properties; using HotChocolate.Text.Json; -using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs index 3fe81c22274..26a27afe183 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Language; using Microsoft.Extensions.DependencyInjection; @@ -121,7 +122,7 @@ public void BuildRequest_QueryAndSetNewVariableSetJson_RequestIsCreated() foo } """) - .SetVariableValuesSetJson( + .SetVariableValues( """ [ { @@ -148,7 +149,7 @@ public void BuildRequest_QueryAndResetVariables_RequestIsCreated() OperationRequestBuilder.New() .SetDocument("{ foo }") .SetVariableValues(new Dictionary<string, object?> { ["one"] = "bar" }) - .SetVariableValues(null) + .SetVariableValues(default(JsonDocument)) .Build(); // assert diff --git a/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs b/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs index 54d1e9fc54b..1af774f40ab 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs @@ -1,4 +1,7 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types; namespace HotChocolate.Execution; @@ -123,37 +126,10 @@ public FooType() : base("Foo") public override Type RuntimeType => typeof(string); - public override bool IsValueCompatible(IValueNode valueLiteral) - { - ArgumentNullException.ThrowIfNull(valueLiteral); - - if (valueLiteral is NullValueNode) - { - return true; - } - - return valueLiteral is StringValueNode { Value: "a" }; - } - - public override bool IsInstanceOfType(object? value) - { - if (value is null) - { - return true; - } + public override ScalarSerializationType SerializationType => ScalarSerializationType.String; - return value is "a"; - } - - public override object? CoerceInputLiteral(IValueNode literal) + public override object CoerceInputLiteral(IValueNode literal) { - ArgumentNullException.ThrowIfNull(literal); - - if (literal is NullValueNode) - { - return null; - } - if (literal is StringValueNode { Value: "a" }) { return "a"; @@ -162,62 +138,38 @@ public override bool IsInstanceOfType(object? value) throw new LeafCoercionException("StringValue is not a.", this); } - public override IValueNode CoerceInputValue(object? value) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (value is null) + if (inputValue.ValueKind is JsonValueKind.String) { - return NullValueNode.Default; + var value = inputValue.GetString()!; + if (value is "a") + { + return value; + } } - if (value is "a") - { - return new StringValueNode("a"); - } - - throw new LeafCoercionException("String is not a.", this); + throw new LeafCoercionException("StringValue is not a.", this); } - public override IValueNode ParseResult(object? resultValue) - => CoerceInputValue(resultValue); - - public override bool TrySerialize( - object? runtimeValue, - out object? resultValue) + public override void CoerceOutputValue(object runtimeValue, ResultElement resultValue) { - if (runtimeValue is null) + if (runtimeValue is string s && s is "a") { - resultValue = null; - return true; + resultValue.SetStringValue(s); } - if (runtimeValue is "a") - { - resultValue = new StringValueNode("a"); - return true; - } - - resultValue = null; - return false; + throw new LeafCoercionException("StringValue is not a.", this); } - public override bool TryDeserialize( - object? resultValue, - out object? runtimeValue) + public override IValueNode ValueToLiteral(object runtimeValue) { - if (resultValue is null) + if (runtimeValue is string s && s is "a") { - runtimeValue = null; - return true; + return new StringValueNode(s); } - if (resultValue is "a") - { - runtimeValue = "a"; - return true; - } - - runtimeValue = null; - return false; + throw new LeafCoercionException("StringValue is not a.", this); } } } @@ -228,39 +180,31 @@ public NameType() : base("Name", bind: BindingBehavior.Implicit) { } - protected override bool IsInstanceOfType(StringValueNode valueSyntax) + protected override string OnCoerceInputLiteral(StringValueNode valueLiteral) { - if (string.IsNullOrWhiteSpace(valueSyntax.Value)) + if (string.IsNullOrWhiteSpace(valueLiteral.Value)) { - return false; + throw new LeafCoercionException("Not a valid name.", this); } - return base.IsInstanceOfType(valueSyntax); + return valueLiteral.Value; } - protected override string ParseLiteral(StringValueNode valueSyntax) + protected override string OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) { - if (string.IsNullOrWhiteSpace(valueSyntax.Value)) + var s = inputValue.GetString(); + + if (string.IsNullOrWhiteSpace(s)) { throw new LeafCoercionException("Not a valid name.", this); } - return valueSyntax.Value; + return s; } - protected override StringValueNode ParseValue(string runtimeValue) - => new(runtimeValue); - - public override IValueNode ParseResult(object? resultValue) - => CoerceInputValue(resultValue); + protected override void OnCoerceOutputValue(string runtimeValue, ResultElement resultValue) + => resultValue.SetStringValue(runtimeValue); - public override object? CoerceOutputValue(object? runtimeValue) - { - if (runtimeValue is not string s || string.IsNullOrWhiteSpace(s)) - { - throw new LeafCoercionException("Name cannot serialize the given value.", this); - } - - return base.Serialize(runtimeValue); - } + protected override StringValueNode OnValueToLiteral(string runtimeValue) + => new(runtimeValue); } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/NegativeFloatTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/NegativeFloatTypeTests.cs deleted file mode 100644 index 61209c12e0a..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/NegativeFloatTypeTests.cs +++ /dev/null @@ -1,214 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class NegativeFloatTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<NegativeFloatType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(FloatValueNode), -1.0d, true)] - [InlineData(typeof(FloatValueNode), 0d, false)] - [InlineData(typeof(FloatValueNode), 0.00000001d, false)] - [InlineData(typeof(FloatValueNode), -0.0000001d, true)] - [InlineData(typeof(FloatValueNode), double.MinValue, true)] - [InlineData(typeof(IntValueNode), -1, true)] - [InlineData(typeof(IntValueNode), int.MinValue, true)] - [InlineData(typeof(IntValueNode), 0, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<NegativeFloatType>(valueNode, expected); - } - - [Theory] - [InlineData(1d, false)] - [InlineData(-1d, true)] - [InlineData(0.00000001d, false)] - [InlineData(-0.0000001d, true)] - [InlineData(double.MinValue, true)] - [InlineData(0, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("foo", false)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<NegativeFloatType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), -12, -12d)] - [InlineData(typeof(FloatValueNode), -12.0, -12.0)] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<NegativeFloatType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(IntValueNode), 0)] - [InlineData(typeof(IntValueNode), 1)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<NegativeFloatType>(valueNode); - } - - [Theory] - [InlineData(typeof(FloatValueNode), -1d)] - [InlineData(typeof(FloatValueNode), -0.0000001d)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<NegativeFloatType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(0)] - [InlineData(1)] - [InlineData(true)] - [InlineData("")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<NegativeFloatType>(value); - } - - [Theory] - [InlineData(-1d, -1d)] - [InlineData(double.MinValue, double.MinValue)] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<NegativeFloatType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MaxValue)] - [InlineData(1)] - [InlineData(0)] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<NegativeFloatType>(value); - } - - [Theory] - [InlineData(-1d, -1d)] - [InlineData(double.MinValue, double.MinValue)] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<NegativeFloatType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MaxValue)] - [InlineData(1)] - [InlineData(0)] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<NegativeFloatType>(value); - } - - [Theory] - [InlineData(typeof(FloatValueNode), -1d)] - [InlineData(typeof(FloatValueNode), -0.0000001d)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<NegativeFloatType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(0)] - [InlineData(1)] - [InlineData(true)] - [InlineData("")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<NegativeFloatType>(value); - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/NegativeIntTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/NegativeIntTypeTests.cs deleted file mode 100644 index 6786b060b61..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/NegativeIntTypeTests.cs +++ /dev/null @@ -1,205 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class NegativeIntTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<NegativeIntType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), -1, true)] - [InlineData(typeof(IntValueNode), int.MinValue, true)] - [InlineData(typeof(IntValueNode), 0, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<NegativeIntType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(-1, true)] - [InlineData(int.MinValue, true)] - [InlineData(0, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData(null, true)] - [InlineData("foo", false)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<NegativeIntType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), -12, -12)] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<NegativeIntType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(IntValueNode), 0)] - [InlineData(typeof(IntValueNode), 1)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<NegativeIntType>(valueNode); - } - - [Theory] - [InlineData(typeof(IntValueNode), -12)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<NegativeIntType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(0)] - [InlineData(1)] - [InlineData(true)] - [InlineData("")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<NegativeIntType>(value); - } - - [Theory] - [InlineData(-1, -1)] - [InlineData(int.MinValue, int.MinValue)] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<NegativeIntType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MaxValue)] - [InlineData(1)] - [InlineData(0)] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<NegativeIntType>(value); - } - - [Theory] - [InlineData(-1, -1)] - [InlineData(int.MinValue, int.MinValue)] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<NegativeIntType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MaxValue)] - [InlineData(1)] - [InlineData(0)] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<NegativeIntType>(value); - } - - [Theory] - [InlineData(typeof(IntValueNode), -12)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<NegativeIntType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(0)] - [InlineData(1)] - [InlineData(true)] - [InlineData("")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<NegativeIntType>(value); - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/NonEmptyStringTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/NonEmptyStringTypeTests.cs deleted file mode 100644 index 6d32f565b5b..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/NonEmptyStringTypeTests.cs +++ /dev/null @@ -1,190 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class NonEmptyStringTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<NonEmptyStringType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<NonEmptyStringType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData(null, true)] - [InlineData("foo", true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<NonEmptyStringType>(value, expected); - } - - [Theory] - [InlineData(typeof(StringValueNode), "foo", "foo")] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<NonEmptyStringType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(IntValueNode), 1)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<NonEmptyStringType>(valueNode); - } - - [Theory] - [InlineData(typeof(StringValueNode), "foo")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<NonEmptyStringType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<NonEmptyStringType>(value); - } - - [Theory] - [InlineData("foo", "foo")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<NonEmptyStringType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<NonEmptyStringType>(value); - } - - [Theory] - [InlineData("foo", "foo")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<NonEmptyStringType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<NonEmptyStringType>(value); - } - - [Theory] - [InlineData(typeof(StringValueNode), "foo")] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<NonEmptyStringType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<NonEmptyStringType>(value); - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/NonNegativeFloatTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/NonNegativeFloatTypeTests.cs deleted file mode 100644 index 4d0d14d28c4..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/NonNegativeFloatTypeTests.cs +++ /dev/null @@ -1,221 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class NonNegativeFloatTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<NonNegativeFloatType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, true)] - [InlineData(typeof(FloatValueNode), 0d, true)] - [InlineData(typeof(FloatValueNode), double.MinValue, false)] - [InlineData(typeof(FloatValueNode), double.MaxValue, true)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(IntValueNode), int.MinValue, false)] - [InlineData(typeof(IntValueNode), -1, false)] - [InlineData(typeof(IntValueNode), 0, true)] - [InlineData(typeof(IntValueNode), 1, true)] - [InlineData(typeof(IntValueNode), int.MaxValue, true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<NonNegativeFloatType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, true)] - [InlineData(double.MinValue, false)] - [InlineData(double.MaxValue, true)] - [InlineData(true, false)] - [InlineData("foo", false)] - [InlineData(int.MinValue, false)] - [InlineData(int.MaxValue, false)] - [InlineData(-1, false)] - [InlineData(1, false)] - [InlineData(0, false)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<NonNegativeFloatType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0, 0d)] - [InlineData(typeof(IntValueNode), 1, 1d)] - [InlineData(typeof(FloatValueNode), double.MaxValue, double.MaxValue)] - [InlineData(typeof(FloatValueNode), 1d, 1d)] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<NonNegativeFloatType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), -1d)] - [InlineData(typeof(FloatValueNode), double.MinValue)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - [InlineData(typeof(IntValueNode), int.MinValue)] - [InlineData(typeof(IntValueNode), -1)] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<NonNegativeFloatType>(valueNode); - } - - [Theory] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(FloatValueNode), double.MaxValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<NonNegativeFloatType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(-1d)] - [InlineData(double.MinValue)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - [InlineData(0)] - public void ParseValue_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<NonNegativeFloatType>(value); - } - - [Theory] - [InlineData(1d, 1d)] - [InlineData(double.MaxValue, double.MaxValue)] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<NonNegativeFloatType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(-1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(double.MinValue)] - [InlineData(-1)] - [InlineData(0)] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<PositiveIntType>(value); - } - - [Theory] - [InlineData(1d, 1d)] - [InlineData(double.MaxValue, double.MaxValue)] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<NonNegativeFloatType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(-1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(double.MinValue)] - [InlineData(-1)] - [InlineData(0)] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<NonNegativeFloatType>(value); - } - - [Theory] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(FloatValueNode), double.MaxValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<NonNegativeFloatType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(-1d)] - [InlineData(double.MinValue)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<NonNegativeFloatType>(value); - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/SignedByteTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/SignedByteTypeTests.cs deleted file mode 100644 index c700a0ee4bf..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/SignedByteTypeTests.cs +++ /dev/null @@ -1,220 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class SignedByteTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<IntType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(IntValueNode), 0, true)] - [InlineData(typeof(IntValueNode), 1, true)] - [InlineData(typeof(IntValueNode), sbyte.MaxValue, true)] - [InlineData(typeof(IntValueNode), sbyte.MinValue, true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<SignedByteType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(true, false)] - [InlineData("foo", false)] - [InlineData(int.MinValue, false)] - [InlineData(-1, false)] - [InlineData(0, false)] - [InlineData(null, true)] - [InlineData((sbyte)1, true)] - [InlineData(sbyte.MaxValue, true)] - [InlineData(sbyte.MinValue, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<SignedByteType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0, (sbyte)0)] - [InlineData(typeof(IntValueNode), 1, (sbyte)1)] - [InlineData(typeof(IntValueNode), sbyte.MaxValue, sbyte.MaxValue)] - [InlineData(typeof(IntValueNode), sbyte.MinValue, sbyte.MinValue)] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<SignedByteType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<SignedByteType>(valueNode); - } - - [Theory] - [InlineData(typeof(IntValueNode), (sbyte)1)] - [InlineData(typeof(IntValueNode), sbyte.MaxValue)] - [InlineData(typeof(IntValueNode), sbyte.MinValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<SignedByteType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<SignedByteType>(value); - } - - [Theory] - [InlineData(0, (sbyte)0)] - [InlineData(1, (sbyte)1)] - [InlineData(sbyte.MaxValue, sbyte.MaxValue)] - [InlineData(sbyte.MinValue, sbyte.MinValue)] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<SignedByteType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(int.MaxValue)] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<SignedByteType>(value); - } - - [Theory] - [InlineData((sbyte)0, (sbyte)0)] - [InlineData((sbyte)1, (sbyte)1)] - [InlineData(sbyte.MaxValue, sbyte.MaxValue)] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<SignedByteType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<SignedByteType>(value); - } - - [Theory] - [InlineData(typeof(IntValueNode), (sbyte)1)] - [InlineData(typeof(IntValueNode), sbyte.MaxValue)] - [InlineData(typeof(IntValueNode), sbyte.MinValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<SignedByteType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<SignedByteType>(value); - } - - [Fact] - public async Task SignedByteType_Should_BeBoundImplicitly_When_Registered() - { - // arrange - // act - // assert - await ExpectScalarTypeToBoundImplicityWhenRegistered<SignedByteType, DefaultSignedByte>(); - } - - public class DefaultSignedByte - { - public sbyte Byte { get; } - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedIntTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedIntTypeTests.cs deleted file mode 100644 index 1e705bf29c0..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedIntTypeTests.cs +++ /dev/null @@ -1,220 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class UnsignedIntTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<UnsignedIntType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(IntValueNode), 0, true)] - [InlineData(typeof(IntValueNode), 1, true)] - [InlineData(typeof(IntValueNode), uint.MaxValue, true)] - [InlineData(typeof(IntValueNode), uint.MinValue, true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<UnsignedIntType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(true, false)] - [InlineData("foo", false)] - [InlineData(int.MinValue, false)] - [InlineData(-1, false)] - [InlineData(0, false)] - [InlineData(null, true)] - [InlineData((uint)1, true)] - [InlineData(uint.MaxValue, true)] - [InlineData(uint.MinValue, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<UnsignedIntType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0, (uint)0)] - [InlineData(typeof(IntValueNode), 1, (uint)1)] - [InlineData(typeof(IntValueNode), uint.MaxValue, uint.MaxValue)] - [InlineData(typeof(IntValueNode), uint.MinValue, uint.MinValue)] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<UnsignedIntType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<UnsignedIntType>(valueNode); - } - - [Theory] - [InlineData(typeof(IntValueNode), (uint)1)] - [InlineData(typeof(IntValueNode), uint.MaxValue)] - [InlineData(typeof(IntValueNode), uint.MinValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<UnsignedIntType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<UnsignedIntType>(value); - } - - [Theory] - [InlineData(0, (uint)0)] - [InlineData(1, (uint)1)] - [InlineData(uint.MaxValue, uint.MaxValue)] - [InlineData(uint.MinValue, uint.MinValue)] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<UnsignedIntType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<UnsignedIntType>(value); - } - - [Theory] - [InlineData((uint)0, (uint)0)] - [InlineData((uint)1, (uint)1)] - [InlineData(uint.MaxValue, uint.MaxValue)] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<UnsignedIntType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<UnsignedIntType>(value); - } - - [Theory] - [InlineData(typeof(IntValueNode), (uint)1)] - [InlineData(typeof(IntValueNode), uint.MaxValue)] - [InlineData(typeof(IntValueNode), uint.MinValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<UnsignedIntType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<UnsignedIntType>(value); - } - - [Fact] - public async Task UnsignedIntType_Should_BeBoundImplicitly_When_Registered() - { - // arrange - // act - // assert - await ExpectScalarTypeToBoundImplicityWhenRegistered<UnsignedIntType, DefaultUnsignedInt>(); - } - - public class DefaultUnsignedInt - { - public uint Int { get; } - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedLongTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedLongTypeTests.cs deleted file mode 100644 index d4e3685bebc..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedLongTypeTests.cs +++ /dev/null @@ -1,217 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class UnsignedLongTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<UnsignedLongType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(IntValueNode), 1UL, true)] - [InlineData(typeof(IntValueNode), ulong.MinValue, true)] - [InlineData(typeof(IntValueNode), ulong.MaxValue, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<UnsignedLongType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(true, false)] - [InlineData("foo", false)] - [InlineData(int.MinValue, false)] - [InlineData(-1, false)] - [InlineData(0, false)] - [InlineData(null, true)] - [InlineData((ulong)1, true)] - [InlineData(ulong.MinValue, true)] - [InlineData(ulong.MaxValue, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<UnsignedLongType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0, (ulong)0)] - [InlineData(typeof(IntValueNode), 1, (ulong)1)] - [InlineData(typeof(IntValueNode), ulong.MaxValue, ulong.MaxValue)] - [InlineData(typeof(IntValueNode), ulong.MinValue, ulong.MinValue)] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<UnsignedLongType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<UnsignedLongType>(valueNode); - } - - [Theory] - [InlineData(typeof(IntValueNode), (ulong)1)] - [InlineData(typeof(IntValueNode), ulong.MaxValue)] - [InlineData(typeof(IntValueNode), ulong.MinValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<UnsignedLongType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<UnsignedIntType>(value); - } - - [Theory] - [InlineData(1UL, 1UL)] - [InlineData(ulong.MaxValue, ulong.MaxValue)] - [InlineData(ulong.MinValue, ulong.MinValue)] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<UnsignedLongType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<UnsignedLongType>(value); - } - - [Theory] - [InlineData((ulong)0, (ulong)0)] - [InlineData((ulong)1, (ulong)1)] - [InlineData(ulong.MaxValue, ulong.MaxValue)] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<UnsignedLongType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<UnsignedLongType>(value); - } - - [Theory] - [InlineData(typeof(IntValueNode), (ulong)1)] - [InlineData(typeof(IntValueNode), ulong.MaxValue)] - [InlineData(typeof(IntValueNode), ulong.MinValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<UnsignedLongType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<UnsignedLongType>(value); - } - - [Fact] - public async Task UnsignedLongType_Should_BeBoundImplicitly_When_Registered() - { - // arrange - // act - // assert - await ExpectScalarTypeToBoundImplicityWhenRegistered<UnsignedLongType, DefaultUnsignedLongType>(); - } - - public class DefaultUnsignedLongType - { - public ulong Long { get; } - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedShortTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedShortTypeTests.cs deleted file mode 100644 index f28ee8d5003..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/UnsignedShortTypeTests.cs +++ /dev/null @@ -1,220 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class UnsignedShortTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<UnsignedShortType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(IntValueNode), 0, true)] - [InlineData(typeof(IntValueNode), 1, true)] - [InlineData(typeof(IntValueNode), ushort.MaxValue, true)] - [InlineData(typeof(IntValueNode), ushort.MinValue, true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<UnsignedShortType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(true, false)] - [InlineData("foo", false)] - [InlineData(int.MinValue, false)] - [InlineData(-1, false)] - [InlineData(0, false)] - [InlineData(null, true)] - [InlineData((ushort)1, true)] - [InlineData(ushort.MaxValue, true)] - [InlineData(ushort.MinValue, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<UnsignedShortType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0, (ushort)0)] - [InlineData(typeof(IntValueNode), 1, (ushort)1)] - [InlineData(typeof(IntValueNode), ushort.MaxValue, ushort.MaxValue)] - [InlineData(typeof(IntValueNode), ushort.MinValue, ushort.MinValue)] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<UnsignedShortType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<UnsignedShortType>(valueNode); - } - - [Theory] - [InlineData(typeof(IntValueNode), (ushort)1)] - [InlineData(typeof(IntValueNode), ushort.MaxValue)] - [InlineData(typeof(IntValueNode), ushort.MinValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<UnsignedShortType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<UnsignedShortType>(value); - } - - [Theory] - [InlineData(0, (ushort)0)] - [InlineData(1, (ushort)1)] - [InlineData(ushort.MaxValue, ushort.MaxValue)] - [InlineData(ushort.MinValue, ushort.MinValue)] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<UnsignedShortType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<UnsignedShortType>(value); - } - - [Theory] - [InlineData((ushort)0, (ushort)0)] - [InlineData((ushort)1, (ushort)1)] - [InlineData(ushort.MaxValue, ushort.MaxValue)] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<UnsignedShortType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<UnsignedShortType>(value); - } - - [Theory] - [InlineData(typeof(IntValueNode), (ushort)1)] - [InlineData(typeof(IntValueNode), ushort.MaxValue)] - [InlineData(typeof(IntValueNode), ushort.MinValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<UnsignedShortType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<UnsignedShortType>(value); - } - - [Fact] - public async Task UnsignedShortType_Should_BeBoundImplicitly_When_Registered() - { - // arrange - // act - // assert - await ExpectScalarTypeToBoundImplicityWhenRegistered<UnsignedShortType, DefaultUnsignedShort>(); - } - - public class DefaultUnsignedShort - { - public ushort Short { get; } - } -} diff --git a/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs b/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs index bad4f249ffd..629ea307136 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Configuration/SchemaTypeDiscoveryTests.cs @@ -1,4 +1,7 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types; namespace HotChocolate.Configuration; @@ -185,42 +188,24 @@ public ByteArrayType() : base("ByteArray", BindingBehavior.Implicit) public override Type RuntimeType => typeof(byte[]); - public override bool IsValueCompatible(IValueNode valueLiteral) - { - throw new NotSupportedException(); - } + public override ScalarSerializationType SerializationType => ScalarSerializationType.String; public override object CoerceInputLiteral(IValueNode literal) { throw new NotSupportedException(); } - public override IValueNode CoerceInputValue(object? value) - { - throw new NotSupportedException(); - } - - public override IValueNode ParseResult(object? resultValue) - { - throw new NotSupportedException(); - } - - public override object CoerceOutputValue(object? runtimeValue) - { - throw new NotSupportedException(); - } - - public override object Deserialize(object? resultValue) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { throw new NotSupportedException(); } - public override bool TryDeserialize(object? resultValue, out object runtimeValue) + public override void CoerceOutputValue(object runtimeValue, ResultElement resultValue) { throw new NotSupportedException(); } - public override bool TrySerialize(object? runtimeValue, out object resultValue) + public override IValueNode ValueToLiteral(object runtimeValue) { throw new NotSupportedException(); } diff --git a/src/HotChocolate/Core/test/Types.Tests/Configuration/TypeDiscovererTests.cs b/src/HotChocolate/Core/test/Types.Tests/Configuration/TypeDiscovererTests.cs index bec00b581ac..989582eac74 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Configuration/TypeDiscovererTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Configuration/TypeDiscovererTests.cs @@ -41,7 +41,7 @@ public void Register_SchemaType_ClrTypeExists_NoSystemTypes() .Select(t => new { type = t.Type.GetType().GetTypeName(), - runtimeType = t.Type is IHasRuntimeType hr + runtimeType = t.Type is IRuntimeTypeProvider hr ? hr.RuntimeType.GetTypeName() : null, references = t.References.Select(r => r.ToString()).ToList() @@ -84,7 +84,7 @@ public void Register_SchemaType_ClrTypeExists() .Select(t => new { type = t.Type.GetType().GetTypeName(), - runtimeType = t.Type is IHasRuntimeType hr + runtimeType = t.Type is IRuntimeTypeProvider hr ? hr.RuntimeType.GetTypeName() : null, references = t.References.Select(r => r.ToString()).ToList() @@ -128,7 +128,7 @@ public void Register_ClrType_InferSchemaTypes() .Select(t => new { type = t.Type.GetType().GetTypeName(), - runtimeType = t.Type is IHasRuntimeType hr + runtimeType = t.Type is IRuntimeTypeProvider hr ? hr.RuntimeType.GetTypeName() : null, references = t.References.ConvertAll(r => r.ToString()) @@ -173,7 +173,7 @@ public void Upgrade_Type_From_GenericType() .Select(t => new { type = t.Type.GetType().GetTypeName(), - runtimeType = t.Type is IHasRuntimeType hr + runtimeType = t.Type is IRuntimeTypeProvider hr ? hr.RuntimeType.GetTypeName() : null, references = t.References.Select(r => r.ToString()).ToList() diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Composite/SerializeAsTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Composite/SerializeAsTests.cs index 11e529d9075..bef3b898f8b 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Composite/SerializeAsTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Composite/SerializeAsTests.cs @@ -1,4 +1,8 @@ +using System.Text.Json; using HotChocolate.Execution; +using HotChocolate.Features; +using HotChocolate.Language; +using HotChocolate.Text.Json; using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Types.Composite; @@ -42,28 +46,69 @@ public class Query public string GetBaz() => "foo"; } - public class CustomString1 : StringType + public class CustomString1 : ScalarType<string> { public CustomString1() : base("Custom1") { - SerializationType = ScalarSerializationType.String; } + + public override ScalarSerializationType SerializationType => ScalarSerializationType.String; + + public override object CoerceInputLiteral(IValueNode valueLiteral) + => throw new NotImplementedException(); + + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => throw new NotImplementedException(); + + public override void OnCoerceOutputValue(string runtimeValue, ResultElement resultValue) + => throw new NotImplementedException(); + + public override IValueNode OnValueToLiteral(string runtimeValue) + => throw new NotImplementedException(); } - public class CustomString2 : StringType + public class CustomString2 : ScalarType { public CustomString2() : base("Custom2") { - SerializationType = ScalarSerializationType.Any; } + + public override Type RuntimeType => typeof(object); + + public override ScalarSerializationType SerializationType => ScalarSerializationType.Any; + + public override object CoerceInputLiteral(IValueNode valueLiteral) + => throw new NotImplementedException(); + + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => throw new NotImplementedException(); + + public override void CoerceOutputValue(object runtimeValue, ResultElement resultValue) + => throw new NotImplementedException(); + + public override IValueNode ValueToLiteral(object runtimeValue) + => throw new NotImplementedException(); } - public class CustomString3 : StringType + public class CustomString3 : ScalarType<string> { public CustomString3() : base("Custom3") { - SerializationType = ScalarSerializationType.String; Pattern = "\\b\\d{3}\\b"; } + + public override ScalarSerializationType SerializationType => ScalarSerializationType.String; + + public override object CoerceInputLiteral(IValueNode valueLiteral) + => throw new NotImplementedException(); + + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => throw new NotImplementedException(); + + public override void OnCoerceOutputValue(string runtimeValue, ResultElement resultValue) + => throw new NotImplementedException(); + + public override IValueNode OnValueToLiteral(string runtimeValue) + => throw new NotImplementedException(); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs index f4d420adc70..a4e39658df1 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs @@ -668,7 +668,7 @@ public void EnumName_Set_Value_Comparer() // assert var type = schema.Types.GetType<EnumType>("Foo"); - Assert.True(type.IsInstanceOfType("ANYTHING WILL DO")); + Assert.True(type.IsValueCompatible(new EnumValueNode("ANYTHING_WILL_DO"))); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs index 5f751e15561..c59121917a5 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/InputParserTests.cs @@ -1,8 +1,11 @@ +using System.Text.Json; using HotChocolate.Execution; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Tests; using HotChocolate.Utilities; using Microsoft.Extensions.DependencyInjection; +using Moq; namespace HotChocolate.Types; @@ -19,15 +22,20 @@ public void Deserialize_InputObject_AllIsSet() var type = schema.Types.GetType<InputObjectType>("TestInput"); - var fieldData = new Dictionary<string, object?> - { - { "field1", "abc" }, - { "field2", 123 } - }; + var fieldData = JsonDocument.Parse( + """ + { + "field1": "abc", + "field2": 123 + } + """); + + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act var parser = new InputParser(new DefaultTypeConverter()); - var runtimeValue = parser.ParseInputValue(fieldData, type, Path.Root); + var runtimeValue = parser.ParseInputValue(fieldData.RootElement, type, context.Object, Path.Root); // assert Assert.IsType<TestInput>(runtimeValue).MatchSnapshot(); @@ -67,15 +75,20 @@ public void Deserialize_InputObject_AllIsSet_ConstructorInit() var type = schema.Types.GetType<InputObjectType>("Test2Input"); - var fieldData = new Dictionary<string, object?> - { - { "field1", "abc" }, - { "field2", 123 } - }; + var fieldData = JsonDocument.Parse( + """ + { + "field1": "abc", + "field2": 123 + } + """); + + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act var parser = new InputParser(new DefaultTypeConverter()); - var runtimeValue = parser.ParseInputValue(fieldData, type, Path.Root); + var runtimeValue = parser.ParseInputValue(fieldData.RootElement, type, context.Object, Path.Root); // assert Assert.IsType<Test2Input>(runtimeValue).MatchSnapshot(); @@ -115,14 +128,19 @@ public void Deserialize_InputObject_AllIsSet_MissingRequired() var type = schema.Types.GetType<InputObjectType>("Test2Input"); - var fieldData = new Dictionary<string, object?> - { - { "field2", 123 } - }; + var fieldData = JsonDocument.Parse( + """ + { + "field2": 123 + } + """); + + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act var parser = new InputParser(new DefaultTypeConverter()); - void Action() => parser.ParseInputValue(fieldData, type, Path.Root); + void Action() => parser.ParseInputValue(fieldData.RootElement, type, context.Object, Path.Root); // assert Assert.Throws<LeafCoercionException>(Action).MatchSnapshot(); @@ -161,17 +179,26 @@ public void Deserialize_InputObject_AllIsSet_OneInvalidField() var type = schema.Types.GetType<InputObjectType>("TestInput"); - var fieldData = new Dictionary<string, object?> - { - { "field2", 123 }, - { "field3", 123 } - }; + var fieldData = JsonDocument.Parse( + """ + { + "field2": 123, + "field3": 123 + } + """); + + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act var parser = new InputParser(new DefaultTypeConverter()); void Action() - => parser.ParseInputValue(fieldData, type, Path.Root.Append("root")); + => parser.ParseInputValue( + fieldData.RootElement, + type, + context: context.Object, + Path.Root.Append("root")); // assert Assert.Throws<LeafCoercionException>(Action).MatchSnapshot(); @@ -213,18 +240,27 @@ public void Deserialize_InputObject_AllIsSet_TwoInvalidFields() var type = schema.Types.GetType<InputObjectType>("TestInput"); - var fieldData = new Dictionary<string, object?> - { - { "field2", 123 }, - { "field3", 123 }, - { "field4", 123 } - }; + var fieldData = JsonDocument.Parse( + """ + { + "field2": 123, + "field3": 123, + "field4": 123 + } + """); + + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act var parser = new InputParser(new DefaultTypeConverter()); void Action() - => parser.ParseInputValue(fieldData, type, Path.Root.Append("root")); + => parser.ParseInputValue( + fieldData.RootElement, + type, + context: context.Object, + path: Path.Root.Append("root")); // assert Assert.Throws<LeafCoercionException>(Action).MatchSnapshot(); @@ -480,14 +516,19 @@ public void Force_NonNull_Struct_To_Be_Optional() var type = schema.Types.GetType<InputObjectType>("Test4Input"); - var fieldData = new Dictionary<string, object?> - { - { "field1", "abc" } - }; + var fieldData = JsonDocument.Parse( + """ + { + "field1": "abc" + } + """); + + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act var parser = new InputParser(new DefaultTypeConverter()); - var runtimeValue = parser.ParseInputValue(fieldData, type, Path.Root); + var runtimeValue = parser.ParseInputValue(fieldData.RootElement, type, context.Object, Path.Root); // assert Assert.IsType<Test4Input>(runtimeValue).MatchSnapshot(); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs index ba9c3daee30..d9ab78bb804 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs @@ -760,7 +760,7 @@ public async Task Input_Value_Null_As_Variable() } [Fact] - public void IsInstanceOfType_EnumValue_False() + public void IsValueCompatible_EnumValue_False() { // arrange var schema = SchemaBuilder.New() @@ -783,7 +783,7 @@ public void IsInstanceOfType_EnumValue_False() } [Fact] - public void IsInstanceOfType_ObjectValue_True() + public void IsValueCompatible_ObjectValue_True() { // arrange var schema = SchemaBuilder.New() @@ -806,7 +806,7 @@ public void IsInstanceOfType_ObjectValue_True() } [Fact] - public void IsInstanceOfType_ListValue_False() + public void IsValueCompatible_ListValue_True() { // arrange var schema = SchemaBuilder.New() @@ -829,7 +829,7 @@ public void IsInstanceOfType_ListValue_False() } [Fact] - public void IsInstanceOfType_StringValue_False() + public void IsValueCompatible_StringValue_True() { // arrange var schema = SchemaBuilder.New() @@ -852,7 +852,7 @@ public void IsInstanceOfType_StringValue_False() } [Fact] - public void IsInstanceOfType_IntValue_False() + public void IsValueCompatible_IntValue_True() { // arrange var schema = SchemaBuilder.New() @@ -875,7 +875,7 @@ public void IsInstanceOfType_IntValue_False() } [Fact] - public void IsInstanceOfType_FloatValue_False() + public void IsValueCompatible_FloatValue_True() { // arrange var schema = SchemaBuilder.New() @@ -898,7 +898,7 @@ public void IsInstanceOfType_FloatValue_False() } [Fact] - public void IsInstanceOfType_BooleanValue_False() + public void IsValueCompatible_BooleanValue_True() { // arrange var schema = SchemaBuilder.New() @@ -921,7 +921,7 @@ public void IsInstanceOfType_BooleanValue_False() } [Fact] - public void IsInstanceOfType_NullValue_True() + public void IsValueCompatible_NullValue_True() { // arrange var schema = SchemaBuilder.New() @@ -944,7 +944,7 @@ public void IsInstanceOfType_NullValue_True() } [Fact] - public void IsInstanceOfType_Null_ArgumentNullException() + public void IsValueCompatible_Null_ArgumentNullException() { // arrange var schema = SchemaBuilder.New() @@ -975,7 +975,7 @@ public void IsInstanceOfType_Null_ArgumentNullException() [InlineData(true, typeof(BooleanValueNode))] [InlineData(false, typeof(BooleanValueNode))] [Theory] - public void ParseValue_ScalarValues(object value, Type expectedType) + public void ValueToLiteral_ScalarValues(object value, Type expectedType) { // arrange var schema = SchemaBuilder.New() @@ -991,14 +991,14 @@ public void ParseValue_ScalarValues(object value, Type expectedType) var type = schema.Types.GetType<AnyType>("Any"); // act - var literal = type.CoerceInputValue(value); + var literal = type.ValueToLiteral(value); // assert Assert.IsType(expectedType, literal); } [Fact] - public void ParseValue_Decimal() + public void ValueToLiteral_Decimal() { // arrange var schema = SchemaBuilder.New() @@ -1014,14 +1014,14 @@ public void ParseValue_Decimal() var type = schema.Types.GetType<AnyType>("Any"); // act - var literal = type.CoerceInputValue((decimal)1); + var literal = type.ValueToLiteral((decimal)1); // assert Assert.IsType<FloatValueNode>(literal); } [Fact] - public void ParseValue_List_Of_Object() + public void ValueToLiteral_List_Of_Object() { // arrange var schema = SchemaBuilder.New() @@ -1037,14 +1037,14 @@ public void ParseValue_List_Of_Object() var type = schema.Types.GetType<AnyType>("Any"); // act - var literal = type.CoerceInputValue(new List<object>()); + var literal = type.ValueToLiteral(new List<object>()); // assert Assert.IsType<ListValueNode>(literal); } [Fact] - public void ParseValue_List_Of_String() + public void ValueToLiteral_List_Of_String() { // arrange var schema = SchemaBuilder.New() @@ -1060,14 +1060,14 @@ public void ParseValue_List_Of_String() var type = schema.Types.GetType<AnyType>("Any"); // act - var literal = type.CoerceInputValue(new List<string>()); + var literal = type.ValueToLiteral(new List<string>()); // assert Assert.IsType<ListValueNode>(literal); } [Fact] - public void ParseValue_List_Of_Foo() + public void ValueToLiteral_List_Of_Foo() { // arrange var schema = SchemaBuilder.New() @@ -1087,14 +1087,14 @@ public void ParseValue_List_Of_Foo() foo.Bar2 = bar; // act - var literal = type.CoerceInputValue(new List<Foo> { foo, foo }); + var literal = type.ValueToLiteral(new List<Foo> { foo, foo }); // assert Assert.IsType<ListValueNode>(literal); } [Fact] - public void ParseValue_List_Of_FooCyclic() + public void ValueToLiteral_List_Of_FooCyclic() { // arrange var schema = SchemaBuilder.New() @@ -1114,7 +1114,7 @@ public void ParseValue_List_Of_FooCyclic() barCyclic.FooCyclic = fooCyclic; // act - void Act() => type.CoerceInputValue(new List<FooCyclic> { fooCyclic, fooCyclic }); + void Act() => type.ValueToLiteral(new List<FooCyclic> { fooCyclic, fooCyclic }); // assert Assert.Equal( @@ -1123,7 +1123,7 @@ public void ParseValue_List_Of_FooCyclic() } [Fact] - public void ParseValue_List_Of_FooRecord() + public void ValueToLiteral_List_Of_FooRecord() { // arrange var schema = SchemaBuilder.New() @@ -1139,14 +1139,14 @@ public void ParseValue_List_Of_FooRecord() var type = schema.Types.GetType<AnyType>("Any"); // act - var literal = type.CoerceInputValue(new List<FooRecord> { new(), new() }); + var literal = type.ValueToLiteral(new List<FooRecord> { new(), new() }); // assert Assert.IsType<ListValueNode>(literal); } [Fact] - public void ParseValue_Foo() + public void ValueToLiteral_Foo() { // arrange var schema = SchemaBuilder.New() @@ -1162,14 +1162,14 @@ public void ParseValue_Foo() var type = schema.Types.GetType<AnyType>("Any"); // act - var literal = type.CoerceInputValue(new Foo()); + var literal = type.ValueToLiteral(new Foo()); // assert Assert.IsType<ObjectValueNode>(literal); } [Fact] - public void ParseValue_FooCyclic() + public void ValueToLiteral_FooCyclic() { // arrange var schema = SchemaBuilder.New() @@ -1189,7 +1189,7 @@ public void ParseValue_FooCyclic() barCyclic.FooCyclic = fooCyclic; // act - void Act() => type.CoerceInputValue(fooCyclic); + void Act() => type.ValueToLiteral(fooCyclic); // assert Assert.Equal( @@ -1198,7 +1198,7 @@ public void ParseValue_FooCyclic() } [Fact] - public void ParseValue_Dictionary() + public void ValueToLiteral_Dictionary() { // arrange var schema = SchemaBuilder.New() @@ -1214,7 +1214,7 @@ public void ParseValue_Dictionary() var type = schema.Types.GetType<AnyType>("Any"); // act - var literal = type.CoerceInputValue( + var literal = type.ValueToLiteral( new Dictionary<string, object>()); // assert @@ -1222,7 +1222,7 @@ public void ParseValue_Dictionary() } [Fact] - public void Deserialize_ValueNode() + public void CoerceInputLiteral_StringValueNode() { // arrange var schema = SchemaBuilder.New() @@ -1238,97 +1238,12 @@ public void Deserialize_ValueNode() var type = schema.Types.GetType<AnyType>("Any"); // act - var value = type.Deserialize(new StringValueNode("Foo")); + var value = type.CoerceInputLiteral(new StringValueNode("Foo")); // assert Assert.Equal("Foo", value); } - [Fact] - public void Deserialize_Dictionary() - { - // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var type = schema.Types.GetType<AnyType>("Any"); - - var toDeserialize = new Dictionary<string, object> - { - { "Foo", new StringValueNode("Bar") } - }; - - // act - var value = type.Deserialize(toDeserialize); - - // assert - Assert.Equal("Bar", Assert.IsType<Dictionary<string, object>>(value)["Foo"]); - } - - [Fact] - public void Deserialize_NestedDictionary() - { - // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var type = schema.Types.GetType<AnyType>("Any"); - - var toDeserialize = new Dictionary<string, object> - { - { "Foo", new Dictionary<string, object> { { "Bar", new StringValueNode("Baz") } } } - }; - - // act - var value = type.Deserialize(toDeserialize); - - // assert - var innerDictionary = Assert.IsType<Dictionary<string, object>>(value)["Foo"]; - Assert.Equal("Baz", Assert.IsType<Dictionary<string, object>>(innerDictionary)["Bar"]); - } - - [Fact] - public void Deserialize_List() - { - // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var type = schema.Types.GetType<AnyType>("Any"); - var toDeserialize = - new List<object> { new StringValueNode("Foo"), new StringValueNode("Bar") }; - - // act - var value = type.Deserialize(toDeserialize); - - // assert - Assert.Collection( - Assert.IsType<object[]>(value)!, - x => Assert.Equal("Foo", x), - x => Assert.Equal("Bar", x)); - } - [Fact] public async Task Dictionary_Is_Handled_As_Object() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs index 028e0daf509..c66c6514ae2 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs @@ -1,134 +1,245 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class BooleanTypeTests { [Fact] - public void ParseLiteral() + public void Ensure_Type_Name_Is_Correct() { // arrange + // act + var type = new BooleanType(); + + // assert + Assert.Equal("Boolean", type.Name); + } + + [Fact] + public void CoerceInputLiteral() + { + // arrange + var type = new BooleanType(); var literal = new BooleanValueNode(null, true); // act - var booleanType = new BooleanType(); - var result = booleanType.CoerceInputLiteral(literal); + var result = type.CoerceInputLiteral(literal); // assert Assert.IsType<bool>(result); - Assert.True((bool)result); + Assert.True((bool)result!); } [Fact] - public void IsInstanceOfType() + public void CoerceInputLiteral_Null() { // arrange - var boolLiteral = new BooleanValueNode(null, true); - var stringLiteral = new StringValueNode(null, "12345", false); - var nullLiteral = NullValueNode.Default; + var type = new BooleanType(); + var literal = NullValueNode.Default; // act - var booleanType = new BooleanType(); - var isIntLiteralInstanceOf = booleanType.IsValueCompatible(boolLiteral); - var isStringLiteralInstanceOf = booleanType.IsValueCompatible(stringLiteral); - var isNullLiteralInstanceOf = booleanType.IsValueCompatible(nullLiteral); + var result = type.CoerceInputLiteral(literal); // assert - Assert.True(isIntLiteralInstanceOf); - Assert.False(isStringLiteralInstanceOf); - Assert.True(isNullLiteralInstanceOf); + Assert.Null(result); } [Fact] - public void EnsureBooleanTypeKindIsCorret() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new BooleanType(); + var literal = new StringValueNode("foo"); // act - var kind = type.Kind; + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.Equal(TypeKind.Scalar, kind); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Serialize_Null_Null() + public void CoerceInputValue() { // arrange - var booleanType = new BooleanType(); + var type = new BooleanType(); + var inputValue = JsonDocument.Parse("true").RootElement; // act - var result = booleanType.Serialize(null); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Null(result); + Assert.Equal(true, runtimeValue); } [Fact] - public void Serialize_True_True() + public void CoerceInputValue_Invalid_Format() { // arrange - var booleanType = new BooleanType(); + var type = new BooleanType(); + var inputValue = JsonDocument.Parse("\"foo\"").RootElement; // act - var result = booleanType.Serialize(true); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.IsType<bool>(result); - Assert.True((bool)result); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Serialize_String_Exception() + public void CoerceOutputValue() { // arrange - var booleanType = new BooleanType(); + var type = new BooleanType(); + const bool runtimeValue = true; // act - Action a = () => booleanType.Serialize("foo"); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); // assert - Assert.Throws<LeafCoercionException>(a); + resultValue.MatchSnapshot(); } [Fact] - public void Deserialize_Null_Null() + public void CoerceOutputValue_Invalid_Format() { // arrange - var booleanType = new BooleanType(); + var type = new BooleanType(); // act - var result = booleanType.Serialize(null); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); // assert - Assert.Null(result); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_True_True() + public void ValueToLiteral() { // arrange - var booleanType = new BooleanType(); + var type = new BooleanType(); + const bool runtimeValue = true; // act - var result = booleanType.Serialize(true); + var literal = type.ValueToLiteral(runtimeValue); // assert - Assert.IsType<bool>(result); - Assert.True((bool)result); + Assert.True(Assert.IsType<BooleanValueNode>(literal).Value); + } + + [Fact] + public void ValueToLiteral_Null() + { + // arrange + var type = new BooleanType(); + + // act + var literal = type.ValueToLiteral(null!); + + // assert + Assert.IsType<NullValueNode>(literal); + } + + [Fact] + public void ValueToLiteral_Invalid_Format() + { + // arrange + var type = new BooleanType(); + + // act + void Action() => type.ValueToLiteral("foo"); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void IsValueCompatible_BooleanLiteral_True() + { + // arrange + var type = new BooleanType(); + var literal = new BooleanValueNode(null, true); + + // act + var result = type.IsValueCompatible(literal); + + // assert + Assert.True(result); + } + + [Fact] + public void IsValueCompatible_StringLiteral_False() + { + // arrange + var type = new BooleanType(); + var literal = new StringValueNode(null, "12345", false); + + // act + var result = type.IsValueCompatible(literal); + + // assert + Assert.False(result); + } + + [Fact] + public void IsValueCompatible_NullLiteral_True() + { + // arrange + var type = new BooleanType(); + var literal = NullValueNode.Default; + + // act + var result = type.IsValueCompatible(literal); + + // assert + Assert.True(result); } [Fact] - public void Deserialize_String_Exception() + public void Ensure_TypeKind_Is_Scalar() { // arrange - var booleanType = new BooleanType(); + var type = new BooleanType(); + + // act + var kind = type.Kind; + + // assert + Assert.Equal(TypeKind.Scalar, kind); + } + + [Fact] + public void ParseLiteral() + { + // arrange + var type = new BooleanType(); + var literal = new BooleanValueNode(null, true); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.True(Assert.IsType<bool>(runtimeValue)); + } + + [Fact] + public void ParseLiteral_InvalidValue() + { + // arrange + var type = new BooleanType(); // act - Action a = () => booleanType.Serialize("foo"); + void Action() => type.CoerceInputLiteral(new StringValueNode("abc")); // assert - Assert.Throws<LeafCoercionException>(a); + Assert.Throws<LeafCoercionException>(Action); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs index 0bee56f9823..ac63430e2fe 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs @@ -1,290 +1,266 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class ByteArrayTypeTests { [Fact] - public void IsInstanceOfType_StringLiteral() + public void Ensure_Type_Name_Is_Correct() { // arrange - var byteArrayType = new ByteArrayType(); - var byteArray = "value"u8.ToArray(); - // act - var isOfType = byteArrayType.IsInstanceOfType(byteArray); + var type = new ByteArrayType(); // assert - Assert.True(isOfType); + Assert.Equal("ByteArray", type.Name); } [Fact] - public void IsInstanceOfType_NullLiteral() + public void IsValueCompatible_StringLiteral_True() { // arrange - var byteArrayType = new ByteArrayType(); - var literal = new NullValueNode(null); + var type = new ByteArrayType(); + var literal = new StringValueNode("abc"); // act - var isOfType = byteArrayType.IsValueCompatible(literal); + var isOfType = type.IsValueCompatible(literal); // assert Assert.True(isOfType); } [Fact] - public void IsInstanceOfType_IntLiteral() + public void IsValueCompatible_NullLiteral_True() { // arrange - var byteArrayType = new ByteArrayType(); - - var literal = new IntValueNode(123); + var type = new ByteArrayType(); + var literal = NullValueNode.Default; // act - var isOfType = byteArrayType.IsValueCompatible(literal); + var isOfType = type.IsValueCompatible(literal); // assert - Assert.False(isOfType); + Assert.True(isOfType); } [Fact] - public void IsInstanceOfType_Null() + public void IsValueCompatible_IntLiteral_False() { // arrange - var byteArrayType = new ByteArrayType(); - var guid = Guid.NewGuid(); + var type = new ByteArrayType(); + var literal = new IntValueNode(123); // act - Action action = () => byteArrayType.IsValueCompatible(null!); + var isOfType = type.IsValueCompatible(literal); // assert - Assert.Throws<ArgumentNullException>(action); + Assert.False(isOfType); } [Fact] - public void Serialize_Base64() + public void IsValueCompatible_Null_Throws() { // arrange - var byteArrayType = new ByteArrayType(); - - var value = "value"u8.ToArray(); + var type = new ByteArrayType(); // act - var serializedValue = byteArrayType.Serialize(value); + void Action() => type.IsValueCompatible(null!); // assert - Assert.Equal( - Convert.ToBase64String(value), - Assert.IsType<string>(serializedValue)); + Assert.Throws<ArgumentNullException>(Action); } [Fact] - public void Serialize_Null() + public void CoerceInputLiteral() { // arrange - var byteArrayType = new ByteArrayType(); + var type = new ByteArrayType(); + var expected = "value"u8.ToArray(); + var literal = new StringValueNode(Convert.ToBase64String(expected)); // act - var serializedValue = byteArrayType.Serialize(null); + var actual = (byte[]?)type.CoerceInputLiteral(literal); // assert - Assert.Null(serializedValue); + Assert.Equal(expected, actual); } [Fact] - public void Serialize_Int() + public void CoerceInputLiteral_Null() { // arrange - var byteArrayType = new ByteArrayType(); - const int value = 123; + var type = new ByteArrayType(); + var literal = NullValueNode.Default; // act - Action action = () => byteArrayType.Serialize(value); + var value = type.CoerceInputLiteral(literal); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Null(value); } [Fact] - public void Deserialize_Null() + public void CoerceInputLiteral_Invalid_Format() { // arrange - var byteArrayType = new ByteArrayType(); + var type = new ByteArrayType(); + var literal = new IntValueNode(123); // act - var success = byteArrayType.TryDeserialize(null, out var o); + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.True(success); - Assert.Null(o); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_String() + public void CoerceInputLiteral_Null_Throws() { // arrange - var byteArrayType = new ByteArrayType(); - var bytes = "value"u8.ToArray(); + var type = new ByteArrayType(); // act - var success = byteArrayType.TryDeserialize( - Convert.ToBase64String(bytes), out var o); + void Action() => type.CoerceInputLiteral(null!); // assert - Assert.True(success); - Assert.Equal(bytes, o); + Assert.Throws<ArgumentNullException>(Action); } [Fact] - public void Deserialize_Bytes() + public void CoerceInputValue() { // arrange - var byteArrayType = new ByteArrayType(); + var type = new ByteArrayType(); var bytes = "value"u8.ToArray(); + var inputValue = JsonDocument.Parse($"\"{Convert.ToBase64String(bytes)}\"").RootElement; // act - var success = byteArrayType.TryDeserialize( - bytes, out var o); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.True(success); - Assert.Equal(bytes, o); + Assert.Equal(bytes, runtimeValue); } [Fact] - public void Deserialize_Guid() + public void CoerceInputValue_Invalid_Format() { // arrange - var byteArrayType = new ByteArrayType(); - var bytes = "value"u8.ToArray(); + var type = new ByteArrayType(); + var inputValue = JsonDocument.Parse("123").RootElement; // act - var success = byteArrayType.TryDeserialize(bytes, out var o); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.True(success); - Assert.Equal(bytes, o); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_Int() + public void CoerceOutputValue() { // arrange - var byteArrayType = new ByteArrayType(); - const int value = 123; + var type = new ByteArrayType(); + var value = "value"u8.ToArray(); // act - var success = byteArrayType.TryDeserialize(value, out _); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(value, resultValue); // assert - Assert.False(success); + resultValue.MatchSnapshot(); } [Fact] - public void ParseLiteral_StringValueNode() + public void CoerceOutputValue_Invalid_Format() { // arrange - var byteArrayType = new ByteArrayType(); - var expected = "value"u8.ToArray(); - var literal = new StringValueNode(Convert.ToBase64String(expected)); + var type = new ByteArrayType(); // act - var actual = (byte[]?)byteArrayType - .CoerceInputLiteral(literal); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(123, resultValue); // assert - Assert.Equal(expected, actual); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_IntValueNode() + public void ValueToLiteral() { // arrange - var byteArrayType = new ByteArrayType(); - var literal = new IntValueNode(123); + var type = new ByteArrayType(); + var expected = "value"u8.ToArray(); + var expectedLiteralValue = Convert.ToBase64String(expected); // act - Action action = () => byteArrayType.CoerceInputLiteral(literal); + var stringLiteral = (StringValueNode)type.ValueToLiteral(expected); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Equal(expectedLiteralValue, stringLiteral.Value); } [Fact] - public void ParseLiteral_NullValueNode() + public void ValueToLiteral_Null() { // arrange - var byteArrayType = new ByteArrayType(); - var literal = NullValueNode.Default; + var type = new ByteArrayType(); // act - var value = byteArrayType.CoerceInputLiteral(literal); + var literal = type.ValueToLiteral(null!); // assert - Assert.Null(value); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseLiteral_Null() + public void ValueToLiteral_Invalid_Format() { // arrange - var byteArrayType = new ByteArrayType(); + var type = new ByteArrayType(); // act - Action action = () => byteArrayType.CoerceInputLiteral(null!); + void Action() => type.ValueToLiteral(123); // assert - Assert.Throws<ArgumentNullException>(action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Guid() + public void ParseLiteral() { // arrange - var byteArrayType = new ByteArrayType(); + var type = new ByteArrayType(); var expected = "value"u8.ToArray(); - var expectedLiteralValue = Convert.ToBase64String(expected); - - // act - var stringLiteral = - (StringValueNode)byteArrayType.ParseValue(expected); - - // assert - Assert.Equal(expectedLiteralValue, stringLiteral.Value); - } - - [Fact] - public void ParseValue_Null() - { - // arrange - var byteArrayType = new ByteArrayType(); - Guid? guid = null; + var literal = new StringValueNode(Convert.ToBase64String(expected)); // act - var stringLiteral = - byteArrayType.CoerceInputValue(guid); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.True(stringLiteral is NullValueNode); - Assert.Null(((NullValueNode)stringLiteral).Value); + Assert.Equal(expected, Assert.IsType<byte[]>(runtimeValue)); } [Fact] - public void ParseValue_Int() + public void ParseLiteral_InvalidValue() { // arrange - var byteArrayType = new ByteArrayType(); - const int value = 123; + var type = new ByteArrayType(); // act - Action action = () => byteArrayType.CoerceInputValue(value); + void Action() => type.CoerceInputLiteral(new IntValueNode(123)); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void EnsureDateTypeKindIsCorret() + public void Ensure_TypeKind_Is_Scalar() { // arrange var type = new ByteArrayType(); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs index 0001db5df67..4053e03a3cc 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs @@ -1,11 +1,24 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class ByteTypeTests { [Fact] - public void IsInstanceOfType_FloatLiteral_True() + public void Ensure_Type_Name_Is_Correct() + { + // arrange + // act + var type = new ByteType(); + + // assert + Assert.Equal("Byte", type.Name); + } + + [Fact] + public void IsValueCompatible_IntLiteral_True() { // arrange var type = new ByteType(); @@ -19,7 +32,7 @@ public void IsInstanceOfType_FloatLiteral_True() } [Fact] - public void IsInstanceOfType_NullLiteral_True() + public void IsValueCompatible_NullLiteral_True() { // arrange var type = new ByteType(); @@ -32,7 +45,7 @@ public void IsInstanceOfType_NullLiteral_True() } [Fact] - public void IsInstanceOfType_StringLiteral_False() + public void IsValueCompatible_FloatLiteral_False() { // arrange var type = new ByteType(); @@ -45,223 +58,276 @@ public void IsInstanceOfType_StringLiteral_False() } [Fact] - public void IsInstanceOfType_Null_Throws() + public void IsValueCompatible_Null_Throws() { // arrange var type = new ByteType(); // act + void Action() => type.IsValueCompatible(null!); + // assert - Assert.Throws<ArgumentNullException>( - () => type.IsValueCompatible(null!)); + Assert.Throws<ArgumentNullException>(Action); } [Fact] - public void Serialize_Type() + public void CoerceInputLiteral() { // arrange var type = new ByteType(); - const byte value = 123; + var literal = new IntValueNode(1); // act - var serializedValue = type.Serialize(value); + var value = type.CoerceInputLiteral(literal); // assert - Assert.IsType<byte>(serializedValue); - Assert.Equal(value, serializedValue); + Assert.IsType<byte>(value); + Assert.Equal(literal.ToByte(), value); } [Fact] - public void Serialize_Null() + public void CoerceInputLiteral_Null() { // arrange var type = new ByteType(); // act - var serializedValue = type.Serialize(null); + var output = type.CoerceInputLiteral(NullValueNode.Default); // assert - Assert.Null(serializedValue); + Assert.Null(output); } [Fact] - public void Serialize_Wrong_Type_Throws() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new ByteType(); - const string input = "abc"; + var input = new StringValueNode("abc"); // act + void Action() => type.CoerceInputLiteral(input); + // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(input)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Serialize_MaxValue_Violation() + public void CoerceInputLiteral_Null_Throws() { // arrange - var type = new ByteType(0, 100); - const byte value = 200; + var type = new ByteType(); // act + void Action() => type.CoerceInputLiteral(null!); + // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(value)); + Assert.Throws<ArgumentNullException>(Action); } [Fact] - public void ParseLiteral_IntLiteral() + public void CoerceInputValue() { // arrange var type = new ByteType(); - var literal = new IntValueNode(1); + var inputValue = JsonDocument.Parse("123").RootElement; // act - var value = type.CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.IsType<byte>(value); - Assert.Equal(literal.ToByte(), value); + Assert.Equal((byte)123, runtimeValue); } [Fact] - public void ParseLiteral_NullValueNode() + public void CoerceInputValue_Invalid_Format() { // arrange var type = new ByteType(); + var inputValue = JsonDocument.Parse("\"foo\"").RootElement; // act - var output = type.CoerceInputLiteral(NullValueNode.Default); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.Null(output); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_Wrong_ValueNode_Throws() + public void CoerceOutputValue() { // arrange var type = new ByteType(); - var input = new StringValueNode("abc"); + const byte runtimeValue = 123; // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputLiteral(input)); + resultValue.MatchSnapshot(); } [Fact] - public void ParseLiteral_Null_Throws() + public void CoerceOutputValue_Invalid_Format() { // arrange var type = new ByteType(); // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); + // assert - Assert.Throws<ArgumentNullException>( - () => type.CoerceInputLiteral(null!)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_MaxValue() + public void CoerceOutputValue_MaxValue_Violation() + { + // arrange + var type = new ByteType(0, 100); + const byte value = 200; + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(value, resultValue); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void ValueToLiteral() + { + // arrange + var type = new ByteType(); + const byte runtimeValue = 123; + + // act + var literal = type.ValueToLiteral(runtimeValue); + + // assert + Assert.Equal(123, Assert.IsType<IntValueNode>(literal).ToByte()); + } + + [Fact] + public void ValueToLiteral_MaxValue() { // arrange var type = new ByteType(1, 100); const byte input = 100; // act - var literal = (IntValueNode)type.ParseValue(input); + var literal = (IntValueNode)type.ValueToLiteral(input); // assert Assert.Equal(100, literal.ToByte()); } [Fact] - public void ParseValue_MaxValue_Violation() + public void ValueToLiteral_MaxValue_Violation() { // arrange var type = new ByteType(1, 100); const byte input = 101; // act - Action action = () => type.ParseValue(input); + void Action() => type.ValueToLiteral(input); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_MinValue() + public void ValueToLiteral_MinValue() { // arrange var type = new ByteType(1, 100); const byte input = 1; // act - var literal = (IntValueNode)type.ParseValue(input); + var literal = (IntValueNode)type.ValueToLiteral(input); // assert Assert.Equal(1, literal.ToByte()); } [Fact] - public void ParseValue_MinValue_Violation() + public void ValueToLiteral_MinValue_Violation() { // arrange var type = new ByteType(1, 100); const byte input = 0; // act - Action action = () => type.ParseValue(input); + void Action() => type.ValueToLiteral(input); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Wrong_Value_Throws() + public void ValueToLiteral_Null() { // arrange var type = new ByteType(); - const string value = "123"; // act + var literal = type.ValueToLiteral(null!); + + // assert + Assert.IsType<NullValueNode>(literal); + } + + [Fact] + public void ValueToLiteral_Invalid_Format() + { + // arrange + var type = new ByteType(); + + // act + void Action() => type.ValueToLiteral("foo"); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputValue(value)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Null() + public void ParseLiteral() { // arrange var type = new ByteType(); - object input = null!; + var literal = new IntValueNode(123); // act - object output = type.CoerceInputValue(input); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.IsType<NullValueNode>(output); + Assert.Equal((byte)123, Assert.IsType<byte>(runtimeValue)); } [Fact] - public void ParseValue_Nullable() + public void ParseLiteral_InvalidValue() { // arrange var type = new ByteType(); - byte? input = 123; // act - var output = (IntValueNode)type.CoerceInputValue(input); + void Action() => type.CoerceInputLiteral(new FloatValueNode(1.5)); // assert - Assert.Equal(123, output.ToDouble()); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Ensure_TypeKind_is_Scalar() + public void Ensure_TypeKind_Is_Scalar() { // arrange var type = new ByteType(); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs index b27f4da5255..b6f7739bf8e 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs @@ -1,6 +1,9 @@ using System.Globalization; +using System.Text.Json; using HotChocolate.Execution; using HotChocolate.Language; +using HotChocolate.Tests; +using HotChocolate.Text.Json; using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Types; @@ -8,84 +11,28 @@ namespace HotChocolate.Types; public class DateTimeTypeTests { [Fact] - public void Serialize_Utc_DateTimeOffset() + public void Ensure_Type_Name_Is_Correct() { // arrange - var dateTimeType = new DateTimeType(); - DateTimeOffset dateTime = new DateTime( - 2018, - 6, - 11, - 8, - 46, - 14, - DateTimeKind.Utc); - - const string expectedValue = "2018-06-11T08:46:14.000Z"; - - // act - var serializedValue = (string?)dateTimeType.Serialize(dateTime); - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - public void Serialize_DateTimeOffset() - { - // arrange - var dateTimeType = new DateTimeType(); - var dateTime = new DateTimeOffset( - new DateTime(2018, 6, 11, 8, 46, 14), - new TimeSpan(4, 0, 0)); - const string expectedValue = "2018-06-11T08:46:14.000+04:00"; - - // act - var serializedValue = (string?)dateTimeType.Serialize(dateTime); - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - public void Serialize_Null() - { - // arrange - var dateTimeType = new DateTimeType(); - // act - var serializedValue = dateTimeType.Serialize(null); - - // assert - Assert.Null(serializedValue); - } - - [Fact] - public void Serialize_String_Exception() - { - // arrange - var dateTimeType = new DateTimeType(); - - // act - Action a = () => dateTimeType.Serialize("foo"); + var type = new DateTimeType(); // assert - Assert.Throws<LeafCoercionException>(a); + Assert.Equal("DateTime", type.Name); } [Fact] - public void ParseLiteral_StringValueNode() + public void CoerceInputLiteral() { // arrange - var dateTimeType = new DateTimeType(); - var literal = new StringValueNode( - "2018-06-29T08:46:14+04:00"); + var type = new DateTimeType(); + var literal = new StringValueNode("2018-06-29T08:46:14+04:00"); var expectedDateTime = new DateTimeOffset( new DateTime(2018, 6, 29, 8, 46, 14), new TimeSpan(4, 0, 0)); // act - var dateTime = (DateTimeOffset)dateTimeType.CoerceInputLiteral(literal)!; + var dateTime = (DateTimeOffset)type.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedDateTime, dateTime); @@ -93,14 +40,14 @@ public void ParseLiteral_StringValueNode() [Theory] [MemberData(nameof(ValidDateTimeScalarStrings))] - public void ParseLiteral_StringValueNode_Valid(string dateTime, DateTimeOffset result) + public void CoerceInputLiteral_Valid(string dateTime, DateTimeOffset result) { // arrange - var dateTimeType = new DateTimeType(); + var type = new DateTimeType(); var literal = new StringValueNode(dateTime); // act - var dateTimeOffset = (DateTimeOffset?)dateTimeType.CoerceInputLiteral(literal); + var dateTimeOffset = (DateTimeOffset?)type.CoerceInputLiteral(literal); // assert Assert.Equal(result, dateTimeOffset); @@ -108,280 +55,252 @@ public void ParseLiteral_StringValueNode_Valid(string dateTime, DateTimeOffset r [Theory] [MemberData(nameof(InvalidDateTimeScalarStrings))] - public void ParseLiteral_StringValueNode_Invalid(string dateTime) + public void CoerceInputLiteral_Invalid(string dateTime) { // arrange - var dateTimeType = new DateTimeType(); + var type = new DateTimeType(); var literal = new StringValueNode(dateTime); // act - void Act() - { - dateTimeType.CoerceInputLiteral(literal); - } + void Action() => type.CoerceInputLiteral(literal); // assert Assert.Equal( "DateTime cannot parse the given literal of type `StringValueNode`.", - Assert.Throws<LeafCoercionException>(Act).Message); + Assert.Throws<LeafCoercionException>(Action).Message); } + [Theory] [InlineData("en-US")] [InlineData("en-AU")] [InlineData("en-GB")] [InlineData("de-CH")] [InlineData("de-de")] - [Theory] - public void ParseLiteral_StringValueNode_DifferentCulture(string cultureName) + public void CoerceInputLiteral_DifferentCulture(string cultureName) { // arrange Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(cultureName); - var dateTimeType = new DateTimeType(); - var literal = new StringValueNode( - "2018-06-29T08:46:14+04:00"); + var type = new DateTimeType(); + var literal = new StringValueNode("2018-06-29T08:46:14+04:00"); var expectedDateTime = new DateTimeOffset( new DateTime(2018, 6, 29, 8, 46, 14), new TimeSpan(4, 0, 0)); // act - var dateTime = (DateTimeOffset)dateTimeType.CoerceInputLiteral(literal)!; + var dateTime = (DateTimeOffset)type.CoerceInputLiteral(literal)!; // assert Assert.Equal(expectedDateTime, dateTime); } [Fact] - public void Deserialize_IsoString_DateTimeOffset() + public void CoerceInputLiteral_Null() { // arrange - var dateTimeType = new DateTimeType(); - var dateTime = new DateTimeOffset( - new DateTime(2018, 6, 11, 8, 46, 14), - new TimeSpan(4, 0, 0)); + var type = new DateTimeType(); + var literal = NullValueNode.Default; // act - var deserializedValue = (DateTimeOffset)dateTimeType.Deserialize("2018-06-11T08:46:14+04:00")!; + var value = type.CoerceInputLiteral(literal); // assert - Assert.Equal(dateTime, deserializedValue); + Assert.Null(value); } [Fact] - public void Deserialize_ZuluString_DateTimeOffset() + public void CoerceInputValue_IsoString() { // arrange - var dateTimeType = new DateTimeType(); - var dateTime = new DateTimeOffset( + var type = new DateTimeType(); + var inputValue = JsonDocument.Parse("\"2018-06-11T08:46:14+04:00\"").RootElement; + var expectedDateTime = new DateTimeOffset( new DateTime(2018, 6, 11, 8, 46, 14), - new TimeSpan(0, 0, 0)); + new TimeSpan(4, 0, 0)); // act - var deserializedValue = (DateTimeOffset)dateTimeType.Deserialize("2018-06-11T08:46:14.000Z")!; + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Equal(dateTime, deserializedValue); + Assert.Equal(expectedDateTime, runtimeValue); } [Fact] - public void Deserialize_IsoString_DateTime() + public void CoerceInputValue_ZuluString() { // arrange - var dateTimeType = new DateTimeType(); - var dateTime = new DateTime( - 2018, - 6, - 11, - 8, - 46, - 14, - DateTimeKind.Unspecified); + var type = new DateTimeType(); + var inputValue = JsonDocument.Parse("\"2018-06-11T08:46:14.000Z\"").RootElement; + var expectedDateTime = new DateTimeOffset( + new DateTime(2018, 6, 11, 8, 46, 14), + TimeSpan.Zero); // act - var deserializedValue = ((DateTimeOffset)dateTimeType.Deserialize("2018-06-11T08:46:14+04:00")!).DateTime; + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Equal(dateTime, deserializedValue); - Assert.Equal(DateTimeKind.Unspecified, deserializedValue.Kind); + Assert.Equal(expectedDateTime, runtimeValue); } [Fact] - public void Deserialize_ZuluString_DateTime() + public void CoerceInputValue_Invalid_Format() { // arrange - var dateTimeType = new DateTimeType(); - DateTimeOffset dateTime = new DateTime( - 2018, - 6, - 11, - 8, - 46, - 14, - DateTimeKind.Utc); + var type = new DateTimeType(); + var inputValue = JsonDocument.Parse("\"abc\"").RootElement; // act - var deserializedValue = (DateTimeOffset)dateTimeType.Deserialize("2018-06-11T08:46:14.000Z")!; + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.Equal(dateTime, deserializedValue.UtcDateTime); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_InvalidString_To_DateTimeOffset() + public void CoerceOutputValue_Utc_DateTimeOffset() { // arrange var type = new DateTimeType(); + DateTimeOffset dateTime = new DateTime( + 2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); // act - var success = type.TryDeserialize("abc", out _); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(dateTime, resultValue); // assert - Assert.False(success); + resultValue.MatchSnapshot(); } [Fact] - public void Deserialize_DateTimeOffset_To_DateTimeOffset() + public void CoerceOutputValue_DateTimeOffset() { // arrange var type = new DateTimeType(); - var time = new DateTimeOffset( - new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc)); + var dateTime = new DateTimeOffset( + new DateTime(2018, 6, 11, 8, 46, 14), + new TimeSpan(4, 0, 0)); // act - var success = type.TryDeserialize(time, out var deserialized); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(dateTime, resultValue); // assert - Assert.True(success); - Assert.Equal(time, deserialized); + resultValue.MatchSnapshot(); } [Fact] - public void Deserialize_DateTime_To_DateTimeOffset() + public void CoerceOutputValue_Invalid_Format() { // arrange var type = new DateTimeType(); - var time = new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); // act - var success = type.TryDeserialize(time, out var deserialized); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); // assert - Assert.True(success); - Assert.Equal(time, - Assert.IsType<DateTimeOffset>(deserialized).UtcDateTime); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_NullableDateTime_To_DateTimeOffset() + public void ValueToLiteral_DateTimeOffset() { // arrange var type = new DateTimeType(); - DateTime? time = - new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); + var dateTime = new DateTimeOffset( + new DateTime(2018, 6, 11, 8, 46, 14), + new TimeSpan(4, 0, 0)); + const string expectedLiteralValue = "2018-06-11T08:46:14.000+04:00"; // act - var success = type.TryDeserialize(time, out var deserialized); + var stringLiteral = (StringValueNode)type.ValueToLiteral(dateTime); // assert - Assert.True(success); - Assert.Equal(time, - Assert.IsType<DateTimeOffset>(deserialized).UtcDateTime); + Assert.Equal(expectedLiteralValue, stringLiteral.Value); } [Fact] - public void Deserialize_NullableDateTime_To_DateTimeOffset_2() + public void ValueToLiteral_Utc_DateTimeOffset() { // arrange var type = new DateTimeType(); - DateTime? time = null; + DateTimeOffset dateTime = + new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); + const string expectedLiteralValue = "2018-06-11T08:46:14.000Z"; // act - var success = type.TryDeserialize(time, out var deserialized); + var stringLiteral = (StringValueNode)type.ValueToLiteral(dateTime); // assert - Assert.True(success); - Assert.Null(deserialized); + Assert.Equal(expectedLiteralValue, stringLiteral.Value); } [Fact] - public void Deserialize_Null_To_Null() + public void ValueToLiteral_Null() { // arrange var type = new DateTimeType(); // act - var success = type.TryDeserialize(null, out var deserialized); + var literal = type.ValueToLiteral(null!); // assert - Assert.True(success); - Assert.Null(deserialized); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseLiteral_NullValueNode() + public void ValueToLiteral_Invalid_Format() { // arrange - var dateTimeType = new DateTimeType(); - var literal = NullValueNode.Default; + var type = new DateTimeType(); // act - var value = dateTimeType.CoerceInputLiteral(literal); + void Action() => type.ValueToLiteral("foo"); // assert - Assert.Null(value); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_DateTimeOffset() + public void ParseLiteral() { // arrange - var dateTimeType = new DateTimeType(); - var dateTime = new DateTimeOffset( - new DateTime(2018, 6, 11, 8, 46, 14), + var type = new DateTimeType(); + var literal = new StringValueNode("2018-06-29T08:46:14+04:00"); + var expectedDateTime = new DateTimeOffset( + new DateTime(2018, 6, 29, 8, 46, 14), new TimeSpan(4, 0, 0)); - const string expectedLiteralValue = "2018-06-11T08:46:14.000+04:00"; - - // act - var stringLiteral = - (StringValueNode)dateTimeType.ParseValue(dateTime); - - // assert - Assert.Equal(expectedLiteralValue, stringLiteral.Value); - } - - [Fact] - public void ParseValue_Utc_DateTimeOffset() - { - // arrange - var dateTimeType = new DateTimeType(); - DateTimeOffset dateTime = - new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); - const string expectedLiteralValue = "2018-06-11T08:46:14.000Z"; // act - var stringLiteral = - (StringValueNode)dateTimeType.ParseValue(dateTime); + var dateTime = type.CoerceInputLiteral(literal); // assert - Assert.Equal(expectedLiteralValue, stringLiteral.Value); + Assert.Equal(expectedDateTime, Assert.IsType<DateTimeOffset>(dateTime)); } [Fact] - public void ParseValue_Null() + public void ParseLiteral_InvalidValue() { // arrange - var dateTimeType = new DateTimeType(); + var type = new DateTimeType(); // act - var literal = dateTimeType.CoerceInputValue(null); + void Action() => type.CoerceInputLiteral(new IntValueNode(123)); // assert - Assert.IsType<NullValueNode>(literal); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void EnsureDateTimeTypeKindIsCorrect() + public void Ensure_TypeKind_Is_Scalar() { // arrange var type = new DateTimeType(); @@ -416,8 +335,9 @@ public void DateTime_Relaxed_Format_Check() const string s = "2011-08-30"; // act - var dateTimeType = new DateTimeType(disableFormatCheck: true); - var result = dateTimeType.Deserialize(s); + var type = new DateTimeType(disableFormatCheck: true); + var inputValue = JsonDocument.Parse($"\"{s}\"").RootElement; + var result = type.CoerceInputValue(inputValue, null!); // assert Assert.IsType<DateTimeOffset>(result); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs index b90f9b198f6..6579acea83b 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs @@ -1,7 +1,9 @@ using System.Globalization; +using System.Text.Json; using HotChocolate.Execution; using HotChocolate.Language; using HotChocolate.Tests; +using HotChocolate.Text.Json; using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Types; @@ -9,386 +11,265 @@ namespace HotChocolate.Types; public class DateTypeTests { [Fact] - public void Serialize_DateOnly() + public void Ensure_Type_Name_Is_Correct() { // arrange - var dateType = new DateType(); - var dateOnly = new DateOnly(2018, 6, 11); - const string expectedValue = "2018-06-11"; - // act - var serializedValue = (string?)dateType.Serialize(dateOnly); + var type = new DateType(); // assert - Assert.Equal(expectedValue, serializedValue); + Assert.Equal("Date", type.Name); } [Fact] - public void Serialize_DateTime() + public void CoerceInputLiteral() { // arrange - var dateType = new DateType(); - var dateTime = new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); - const string expectedValue = "2018-06-11"; + var type = new DateType(); + var literal = new StringValueNode("2018-06-29"); + var expectedDate = new DateOnly(2018, 6, 29); // act - var serializedValue = (string?)dateType.Serialize(dateTime); + var date = (DateOnly)type.CoerceInputLiteral(literal)!; // assert - Assert.Equal(expectedValue, serializedValue); + Assert.Equal(expectedDate, date); } - [Fact] - public void Serialize_DateTimeOffset() + [Theory] + [InlineData("en-US")] + [InlineData("en-AU")] + [InlineData("en-GB")] + [InlineData("de-CH")] + [InlineData("de-de")] + public void CoerceInputLiteral_DifferentCulture(string cultureName) { // arrange - var dateType = new DateType(); - var dateTime = new DateTimeOffset( - new DateTime(2018, 6, 11, 2, 46, 14), - new TimeSpan(4, 0, 0)); - const string expectedValue = "2018-06-10"; + Thread.CurrentThread.CurrentCulture = + CultureInfo.GetCultureInfo(cultureName); + + var type = new DateType(); + var literal = new StringValueNode("2018-06-29"); + var expectedDate = new DateOnly(2018, 6, 29); // act - var serializedValue = (string?)dateType.Serialize(dateTime); + var date = (DateOnly)type.CoerceInputLiteral(literal)!; // assert - Assert.Equal(expectedValue, serializedValue); + Assert.Equal(expectedDate, date); } [Fact] - public void Serialize_Null() + public void CoerceInputLiteral_Null() { // arrange - var dateType = new DateType(); + var type = new DateType(); + var literal = NullValueNode.Default; // act - var serializedValue = dateType.Serialize(null); + var value = type.CoerceInputLiteral(literal); // assert - Assert.Null(serializedValue); + Assert.Null(value); } [Fact] - public void Serialize_String_Exception() + public void CoerceInputLiteral_Invalid_Format() { // arrange - var dateType = new DateType(); + var type = new DateType(); + var literal = new StringValueNode("foo"); // act - void Action() => dateType.Serialize("foo"); + void Action() => type.CoerceInputLiteral(literal); // assert Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_IsoString_DateOnly() + public void CoerceInputValue() { // arrange - var dateType = new DateType(); - var date = new DateOnly(2018, 6, 11); + var type = new DateType(); + var inputValue = JsonDocument.Parse("\"2018-06-11\"").RootElement; + var expectedDate = new DateOnly(2018, 6, 11); // act - var result = (DateOnly)dateType.Deserialize("2018-06-11")!; + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Equal(date, result); + Assert.Equal(expectedDate, runtimeValue); } [Fact] - public void Deserialize_InvalidFormat_To_DateOnly() + public void CoerceInputValue_Invalid_Format() { // arrange var type = new DateType(); + var inputValue = JsonDocument.Parse("\"2018/06/11\"").RootElement; // act - var success = type.TryDeserialize("2018/06/11", out _); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.False(success); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_InvalidString_To_DateOnly() + public void CoerceInputValue_Invalid_String() { // arrange var type = new DateType(); + var inputValue = JsonDocument.Parse("\"abc\"").RootElement; // act - var success = type.TryDeserialize("abc", out _); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.False(success); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_DateOnly_To_DateOnly() + public void CoerceOutputValue_DateOnly() { // arrange var type = new DateType(); - var date = new DateOnly(2018, 6, 11); + var dateOnly = new DateOnly(2018, 6, 11); // act - var success = type.TryDeserialize(date, out var deserialized); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(dateOnly, resultValue); // assert - Assert.True(success); - Assert.Equal(date, deserialized); + resultValue.MatchSnapshot(); } [Fact] - public void Deserialize_DateTime_To_DateOnly() + public void CoerceOutputValue_DateTime() { // arrange var type = new DateType(); - var date = new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); + var dateTime = new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); // act - var success = type.TryDeserialize(date, out var deserialized); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(dateTime, resultValue); // assert - Assert.True(success); - Assert.Equal(DateOnly.FromDateTime(date), - Assert.IsType<DateOnly>(deserialized)); + resultValue.MatchSnapshot(); } [Fact] - public void Deserialize_DateTimeOffset_To_DateOnly() + public void CoerceOutputValue_DateTimeOffset() { // arrange var type = new DateType(); - var date = new DateTimeOffset( + var dateTime = new DateTimeOffset( new DateTime(2018, 6, 11, 2, 46, 14), new TimeSpan(4, 0, 0)); // act - var success = type.TryDeserialize(date, out var deserialized); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(dateTime, resultValue); // assert - Assert.True(success); - Assert.Equal(DateOnly.FromDateTime(date.UtcDateTime), - Assert.IsType<DateOnly>(deserialized)); + resultValue.MatchSnapshot(); } [Fact] - public void Deserialize_NullableDateOnly_To_DateOnly() + public void CoerceOutputValue_Invalid_Format() { // arrange var type = new DateType(); - DateOnly? date = new DateOnly(2018, 6, 11); // act - var success = type.TryDeserialize(date, out var deserialized); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); // assert - Assert.True(success); - Assert.Equal(date, Assert.IsType<DateOnly>(deserialized)); - } - - [Fact] - public void Deserialize_NullableDateOnly_To_DateOnly_2() - { - // arrange - var type = new DateType(); - DateOnly? date = null; - - // act - var success = type.TryDeserialize(date, out var deserialized); - - // assert - Assert.True(success); - Assert.Null(deserialized); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_Null_To_Null() + public void ValueToLiteral() { // arrange var type = new DateType(); - - // act - var success = type.TryDeserialize(null, out var deserialized); - - // assert - Assert.True(success); - Assert.Null(deserialized); - } - - [Fact] - public void ParseLiteral_StringValueNode() - { - // arrange - var dateType = new DateType(); - var literal = new StringValueNode("2018-06-29"); - var expectedDateTime = new DateOnly(2018, 6, 29); - - // act - var dateTime = (DateOnly)dateType.CoerceInputLiteral(literal)!; - - // assert - Assert.Equal(expectedDateTime, dateTime); - } - - [InlineData("en-US")] - [InlineData("en-AU")] - [InlineData("en-GB")] - [InlineData("de-CH")] - [InlineData("de-de")] - [Theory] - public void ParseLiteral_StringValueNode_DifferentCulture( - string cultureName) - { - // arrange - Thread.CurrentThread.CurrentCulture = - CultureInfo.GetCultureInfo(cultureName); - - var dateType = new DateType(); - var literal = new StringValueNode("2018-06-29"); - var expectedDateTime = new DateOnly(2018, 6, 29); - - // act - var dateTime = (DateOnly)dateType.CoerceInputLiteral(literal)!; - - // assert - Assert.Equal(expectedDateTime, dateTime); - } - - [Fact] - public void ParseLiteral_NullValueNode() - { - // arrange - var dateType = new DateType(); - var literal = NullValueNode.Default; - - // act - var value = dateType.CoerceInputLiteral(literal); - - // assert - Assert.Null(value); - } - - [Fact] - public void ParseValue_DateOnly() - { - // arrange - var dateType = new DateType(); var dateOnly = new DateOnly(2018, 6, 11); const string expectedLiteralValue = "2018-06-11"; // act - var stringLiteral = - (StringValueNode)dateType.ParseValue(dateOnly); + var stringLiteral = (StringValueNode)type.ValueToLiteral(dateOnly); // assert Assert.Equal(expectedLiteralValue, stringLiteral.Value); } [Fact] - public void ParseValue_Null() - { - // arrange - var dateType = new DateType(); - - // act - var literal = dateType.CoerceInputValue(null); - - // assert - Assert.Equal(NullValueNode.Default, literal); - } - - [Fact] - public void ParseResult_DateOnly() - { - // arrange - var dateType = new DateType(); - var resultValue = new DateOnly(2023, 6, 19); - const string expectedLiteralValue = "2023-06-19"; - - // act - var literal = dateType.ParseResult(resultValue); - - // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); - } - - [Fact] - public void ParseResult_DateTime() + public void ValueToLiteral_Null() { // arrange - var dateType = new DateType(); - var resultValue = new DateTime(2023, 6, 19, 11, 24, 0, DateTimeKind.Utc); - const string expectedLiteralValue = "2023-06-19"; - - // act - var literal = dateType.ParseResult(resultValue); - - // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); - } - - [Fact] - public void ParseResult_DateTimeOffset() - { - // arrange - var dateType = new DateType(); - var resultValue = new DateTimeOffset(2023, 6, 19, 11, 24, 0, new TimeSpan(6, 0, 0)); - const string expectedLiteralValue = "2023-06-19"; + var type = new DateType(); // act - var literal = dateType.ParseResult(resultValue); + var literal = type.ValueToLiteral(null!); // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseResult_String() + public void ValueToLiteral_Invalid_Format() { // arrange - var dateType = new DateType(); - const string resultValue = "2023-06-19"; - const string expectedLiteralValue = "2023-06-19"; + var type = new DateType(); // act - var literal = dateType.ParseResult(resultValue); + void Action() => type.ValueToLiteral(123); // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseResult_Null() + public void ParseLiteral() { // arrange - var dateType = new DateType(); + var type = new DateType(); + var literal = new StringValueNode("2018-06-29"); + var expectedDate = new DateOnly(2018, 6, 29); // act - var literal = dateType.ParseResult(null); + var date = type.CoerceInputLiteral(literal); // assert - Assert.Equal(NullValueNode.Default, literal); + Assert.Equal(expectedDate, Assert.IsType<DateOnly>(date)); } [Fact] - public void ParseResult_SerializationException() + public void ParseLiteral_InvalidValue() { // arrange - var dateType = new DateType(); - const int resultValue = 1; + var type = new DateType(); // act - var exception = Record.Exception(() => dateType.ParseResult(resultValue)); + void Action() => type.CoerceInputLiteral(new IntValueNode(123)); // assert - Assert.IsType<LeafCoercionException>(exception); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void EnsureDateTypeKindIsCorrect() + public void Ensure_TypeKind_Is_Scalar() { // arrange var type = new DateType(); @@ -481,8 +362,9 @@ public void DateType_Relaxed_Format_Check() const string s = "2011-08-30T08:46:14.116"; // act - var dateType = new DateType(disableFormatCheck: true); - var result = dateType.Deserialize(s); + var type = new DateType(disableFormatCheck: true); + var inputValue = JsonDocument.Parse($"\"{s}\"").RootElement; + var result = type.CoerceInputValue(inputValue, null!); // assert Assert.IsType<DateOnly>(result); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs index dc848e743e1..1e168c3126b 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs @@ -1,12 +1,25 @@ +using System.Text.Json; using HotChocolate.Buffers; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class DecimalTypeTests { [Fact] - public void IsInstanceOfType_FloatLiteral_True() + public void Ensure_Type_Name_Is_Correct() + { + // arrange + // act + var type = new DecimalType(); + + // assert + Assert.Equal("Decimal", type.Name); + } + + [Fact] + public void IsValueCompatible_FloatLiteral_True() { // arrange var type = new DecimalType(); @@ -19,7 +32,7 @@ public void IsInstanceOfType_FloatLiteral_True() } [Fact] - public void IsInstanceOfType_NullLiteral_True() + public void IsValueCompatible_NullLiteral_True() { // arrange var type = new DecimalType(); @@ -32,7 +45,7 @@ public void IsInstanceOfType_NullLiteral_True() } [Fact] - public void IsInstanceOfType_IntLiteral_True() + public void IsValueCompatible_IntLiteral_True() { // arrange var type = new DecimalType(); @@ -45,7 +58,7 @@ public void IsInstanceOfType_IntLiteral_True() } [Fact] - public void IsInstanceOfType_StringLiteral_False() + public void IsValueCompatible_StringLiteral_False() { // arrange var type = new DecimalType(); @@ -58,249 +71,305 @@ public void IsInstanceOfType_StringLiteral_False() } [Fact] - public void IsInstanceOfType_Null_Throws() + public void IsValueCompatible_Null_Throws() { // arrange var type = new DecimalType(); // act + void Action() => type.IsValueCompatible(null!); + // assert - Assert.Throws<ArgumentNullException>( - () => type.IsValueCompatible(null!)); + Assert.Throws<ArgumentNullException>(Action); } [Fact] - public void Serialize_Type() + public void CoerceInputLiteral() { // arrange var type = new DecimalType(); - const decimal value = 123.456M; + var literal = CreateFixedPointLiteral(); // act - var serializedValue = type.Serialize(value); + var value = type.CoerceInputLiteral(literal); // assert - Assert.IsType<decimal>(serializedValue); - Assert.Equal(value, serializedValue); + Assert.IsType<decimal>(value); + Assert.Equal(literal.ToDecimal(), value); } [Fact] - public void Serialize_Null() + public void CoerceInputLiteral_Exponential() { // arrange var type = new DecimalType(); + var literal = CreateExponentialLiteral(); // act - var serializedValue = type.Serialize(null); + var value = type.CoerceInputLiteral(literal); // assert - Assert.Null(serializedValue); + Assert.IsType<decimal>(value); + Assert.Equal(literal.ToDecimal(), value); } [Fact] - public void Serialize_Wrong_Type_Throws() + public void CoerceInputLiteral_IntLiteral() { // arrange var type = new DecimalType(); - const string input = "abc"; + var literal = new IntValueNode(123); // act + var value = type.CoerceInputLiteral(literal); + // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(input)); + Assert.IsType<decimal>(value); + Assert.Equal(literal.ToDecimal(), value); } [Fact] - public void Serialize_MaxValue_Violation() + public void CoerceInputLiteral_Null() { // arrange - var type = new DecimalType(0, 100); - const decimal value = 123.456M; + var type = new DecimalType(); // act + var output = type.CoerceInputLiteral(NullValueNode.Default); + // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(value)); + Assert.Null(output); } [Fact] - public void ParseLiteral_FixedPointLiteral() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new DecimalType(); - var literal = CreateFixedPointLiteral(); + var literal = new StringValueNode("abc"); // act - var value = type.CoerceInputLiteral(literal); + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.IsType<decimal>(value); - Assert.Equal(literal.ToDecimal(), value); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_ExponentialLiteral() + public void CoerceInputLiteral_Null_Throws() { // arrange var type = new DecimalType(); - var literal = CreateExponentialLiteral(); // act - var value = type.CoerceInputLiteral(literal); + void Action() => type.CoerceInputLiteral(null!); // assert - Assert.IsType<decimal>(value); - Assert.Equal(literal.ToDecimal(), value); + Assert.Throws<ArgumentNullException>(Action); } [Fact] - public void ParseLiteral_IntLiteral() + public void CoerceInputValue() { // arrange var type = new DecimalType(); - var literal = new IntValueNode(123); + var inputValue = JsonDocument.Parse("123.456").RootElement; // act - var value = type.CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.IsType<decimal>(value); - Assert.Equal(literal.ToDecimal(), value); + Assert.Equal(123.456m, runtimeValue); } [Fact] - public void ParseLiteral_NullValueNode() + public void CoerceInputValue_Invalid_Format() { // arrange var type = new DecimalType(); + var inputValue = JsonDocument.Parse("\"abc\"").RootElement; // act - var output = type.CoerceInputLiteral(NullValueNode.Default); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.Null(output); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_Wrong_ValueNode_Throws() + public void CoerceOutputValue() { // arrange var type = new DecimalType(); - var input = new StringValueNode("abc"); + const decimal runtimeValue = 123.456M; + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); + + // assert + resultValue.MatchSnapshot(); + } + + [Fact] + public void CoerceOutputValue_Invalid_Format() + { + // arrange + var type = new DecimalType(); + const string runtimeValue = "abc"; + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(runtimeValue, resultValue); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceOutputValue_MaxValue_Violation() + { + // arrange + var type = new DecimalType(0, 100); + const decimal runtimeValue = 123.456M; // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(runtimeValue, resultValue); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputLiteral(input)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_Null_Throws() + public void ValueToLiteral() { // arrange var type = new DecimalType(); + const decimal runtimeValue = 123.456M; // act + var literal = type.ValueToLiteral(runtimeValue); + // assert - Assert.Throws<ArgumentNullException>( - () => type.CoerceInputLiteral(null!)); + var floatLiteral = Assert.IsType<FloatValueNode>(literal); + Assert.Equal(runtimeValue, floatLiteral.ToDecimal()); } [Fact] - public void ParseValue_MaxValue() + public void ValueToLiteral_MaxValue() { // arrange var type = new DecimalType(1, 100); const decimal input = 100M; // act - var literal = (FloatValueNode)type.ParseValue(input); + var literal = type.ValueToLiteral(input); // assert - Assert.Equal(100M, literal.ToDecimal()); + Assert.Equal(100M, Assert.IsType<FloatValueNode>(literal).ToDecimal()); } [Fact] - public void ParseValue_MaxValue_Violation() + public void ValueToLiteral_MaxValue_Violation() { // arrange var type = new DecimalType(1, 100); const decimal input = 101M; // act - Action action = () => type.ParseValue(input); + void Action() => type.ValueToLiteral(input); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_MinValue() + public void ValueToLiteral_MinValue() { // arrange var type = new DecimalType(1, 100); const decimal input = 1M; // act - var literal = (FloatValueNode)type.ParseValue(input); + var literal = type.ValueToLiteral(input); // assert - Assert.Equal(1M, literal.ToDecimal()); + Assert.Equal(1M, Assert.IsType<FloatValueNode>(literal).ToDecimal()); } [Fact] - public void ParseValue_MinValue_Violation() + public void ValueToLiteral_MinValue_Violation() { // arrange var type = new DecimalType(1, 100); const decimal input = 0M; // act - Action action = () => type.ParseValue(input); + void Action() => type.ValueToLiteral(input); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Wrong_Value_Throws() + public void ValueToLiteral_Null() + { + // arrange + var type = new DecimalType(); + + // act + var literal = type.ValueToLiteral(null!); + + // assert + Assert.IsType<NullValueNode>(literal); + } + + [Fact] + public void ValueToLiteral_Invalid_Format() { // arrange var type = new DecimalType(); const string value = "123"; // act + void Action() => type.ValueToLiteral(value); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputValue(value)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Null() + public void ParseLiteral() { // arrange var type = new DecimalType(); - object input = null!; + var literal = CreateFixedPointLiteral(); // act - object output = type.CoerceInputValue(input); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.IsType<NullValueNode>(output); + Assert.Equal(literal.ToDecimal(), Assert.IsType<decimal>(runtimeValue)); } [Fact] - public void ParseValue_Nullable() + public void ParseLiteral_InvalidValue() { // arrange var type = new DecimalType(); - decimal? input = 123M; // act - var output = (FloatValueNode)type.CoerceInputValue(input); + void Action() => type.CoerceInputLiteral(new StringValueNode("abc")); // assert - Assert.Equal(123M, output.ToDecimal()); + Assert.Throws<LeafCoercionException>(Action); } [Fact] @@ -317,7 +386,7 @@ public void Ensure_TypeKind_is_Scalar() } [Fact] - public void ParseValue_HandlesMoreThan6Digits() + public void ValueToLiteral_HandlesMoreThan6Digits() { // arrange var type = new DecimalType(); @@ -325,7 +394,7 @@ public void ParseValue_HandlesMoreThan6Digits() const string output = "1234567.1234567"; // act - var result = type.ParseValue(input); + var result = type.ValueToLiteral(input); // assert Assert.True(result is FloatValueNode); @@ -334,7 +403,7 @@ public void ParseValue_HandlesMoreThan6Digits() } [Fact] - public void ParseValue_FormatsToDefaultSignificantDigits() + public void ValueToLiteral_FormatsToDefaultSignificantDigits() { // arrange var type = new DecimalType(); @@ -342,7 +411,7 @@ public void ParseValue_FormatsToDefaultSignificantDigits() const string output = "1234567.891123456789"; // act - var result = type.ParseValue(input); + var result = type.ValueToLiteral(input); // assert Assert.True(result is FloatValueNode); @@ -351,7 +420,7 @@ public void ParseValue_FormatsToDefaultSignificantDigits() } [Fact] - public void ParseValue_Handle12Digits() + public void ValueToLiteral_Handle12Digits() { // arrange var type = new DecimalType(); @@ -359,7 +428,7 @@ public void ParseValue_Handle12Digits() const string output = "1234567.890123456789"; // act - var result = type.ParseValue(input); + var result = type.ValueToLiteral(input); // assert Assert.True(result is FloatValueNode); @@ -368,7 +437,7 @@ public void ParseValue_Handle12Digits() } [Fact] - public void ParseValue_FormatsToSpecifiedNumberOfDecimalDigitsLong() + public void ValueToLiteral_FormatsToSpecifiedNumberOfDecimalDigitsLong() { // arrange var type = new DecimalType(); @@ -376,7 +445,7 @@ public void ParseValue_FormatsToSpecifiedNumberOfDecimalDigitsLong() const string output = "1234567.890123456789"; // act - var result = type.ParseValue(input); + var result = type.ValueToLiteral(input); // assert Assert.True(result is FloatValueNode); diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs index 0365fcbf2b3..8f207bee2c8 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs @@ -1,319 +1,233 @@ +using System.Text.Json; using HotChocolate.Buffers; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class FloatTypeTests { [Fact] - public void IsInstanceOfType_FloatLiteral_True() + public void Ensure_Type_Name_Is_Correct() { // arrange - var type = new FloatType(); - // act - var result = type.IsValueCompatible(CreateExponentialLiteral()); - - // assert - Assert.True(result); - } - - [Fact] - public void IsInstanceOfType_NullLiteral_True() - { - // arrange var type = new FloatType(); - // act - var result = type.IsValueCompatible(NullValueNode.Default); - // assert - Assert.True(result); + Assert.Equal("Float", type.Name); } [Fact] - public void IsInstanceOfType_IntLiteral_True() + public void CoerceInputLiteral() { // arrange var type = new FloatType(); + var literal = new FloatValueNode(42.5); // act - var result = type.IsValueCompatible(new IntValueNode(123)); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.True(result); + Assert.Equal(42.5, runtimeValue); } [Fact] - public void IsInstanceOfType_StringLiteral_False() + public void CoerceInputLiteral_FixedPoint() { // arrange var type = new FloatType(); + var literal = CreateFixedPointLiteral(); // act - var result = type.IsValueCompatible(new StringValueNode("123")); - - // assert - Assert.False(result); - } - - [Fact] - public void IsInstanceOfType_Null_Throws() - { - // arrange - var type = new FloatType(); + var runtimeValue = type.CoerceInputLiteral(literal); - // act // assert - Assert.Throws<ArgumentNullException>( - () => type.IsValueCompatible(null!)); + Assert.Equal(literal.ToDouble(), runtimeValue); } [Fact] - public void Serialize_Type() + public void CoerceInputLiteral_Exponential() { // arrange var type = new FloatType(); - const double value = 123.456; + var literal = CreateExponentialLiteral(); // act - var serializedValue = type.Serialize(value); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.IsType<double>(serializedValue); - Assert.Equal(value, serializedValue); + Assert.Equal(literal.ToDouble(), runtimeValue); } [Fact] - public void Serialize_Null() + public void CoerceInputLiteral_IntLiteral() { // arrange var type = new FloatType(); + var literal = new IntValueNode(42); // act - var serializedValue = type.Serialize(null); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Null(serializedValue); + Assert.Equal(42.0, runtimeValue); } [Fact] - public void Serialize_Wrong_Type_Throws() + public void CoerceInputLiteral_Null() { // arrange var type = new FloatType(); - const string input = "abc"; + var literal = NullValueNode.Default; // act - // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(input)); - } + var runtimeValue = type.CoerceInputLiteral(literal); - [Fact] - public void Serialize_MaxValue_Violation() - { - // arrange - var type = new FloatType(0, 100); - const double value = 123.456; - - // act // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(value)); + Assert.Null(runtimeValue); } [Fact] - public void ParseLiteral_FixedPointLiteral() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new FloatType(); - var literal = CreateFixedPointLiteral(); + var literal = new StringValueNode("foo"); // act - var value = type.CoerceInputLiteral(literal); + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.IsType<double>(value); - Assert.Equal(literal.ToDouble(), value); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_ExponentialLiteral() + public void CoerceInputValue() { // arrange var type = new FloatType(); - var literal = CreateExponentialLiteral(); + var inputValue = JsonDocument.Parse("42.5").RootElement; // act - var value = type.CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.IsType<double>(value); - Assert.Equal(literal.ToDouble(), value); + Assert.Equal(42.5, runtimeValue); } [Fact] - public void ParseLiteral_IntLiteral() + public void CoerceInputValue_Invalid_Format() { // arrange var type = new FloatType(); - var literal = new IntValueNode(123); + var inputValue = JsonDocument.Parse("\"foo\"").RootElement; // act - var value = type.CoerceInputLiteral(literal); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.IsType<double>(value); - Assert.Equal(literal.ToDouble(), value); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_NullValueNode() + public void CoerceOutputValue() { // arrange var type = new FloatType(); + const double runtimeValue = 42.5; // act - var output = type.CoerceInputLiteral(NullValueNode.Default); - - // assert - Assert.Null(output); - } + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); - [Fact] - public void ParseLiteral_Wrong_ValueNode_Throws() - { - // arrange - var type = new FloatType(); - var input = new StringValueNode("abc"); - - // act // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputLiteral(input)); + resultValue.MatchSnapshot(); } [Fact] - public void ParseLiteral_Null_Throws() + public void CoerceOutputValue_Invalid_Format() { // arrange var type = new FloatType(); // act - // assert - Assert.Throws<ArgumentNullException>( - () => type.CoerceInputLiteral(null!)); - } - - [Fact] - public void ParseValue_MaxValue() - { - // arrange - var type = new FloatType(1, 100); - const double input = 100; - - // act - var literal = (FloatValueNode)type.ParseValue(input); - - // assert - Assert.Equal(100, literal.ToDouble()); - } - - [Fact] - public void ParseValue_MaxValue_Violation() - { - // arrange - var type = new FloatType(1, 100); - const double input = 101; - - // act - Action action = () => type.ParseValue(input); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_MinValue() + public void ValueToLiteral() { // arrange - var type = new FloatType(1, 100); - const double input = 1; - - // act - var literal = (FloatValueNode)type.ParseValue(input); - - // assert - Assert.Equal(1, literal.ToDouble()); - } - - [Fact] - public void ParseValue_MinValue_Violation() - { - // arrange - var type = new FloatType(1, 100); - const double input = 0; + var type = new FloatType(); + const double runtimeValue = 42.5; // act - Action action = () => type.ParseValue(input); + var literal = type.ValueToLiteral(runtimeValue); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Equal(42.5, Assert.IsType<FloatValueNode>(literal).ToDouble()); } [Fact] - public void ParseValue_Wrong_Value_Throws() + public void ValueToLiteral_Null() { // arrange var type = new FloatType(); - const string value = "123"; // act + var literal = type.ValueToLiteral(null!); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputValue(value)); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseValue_Null() + public void ValueToLiteral_Invalid_Format() { // arrange var type = new FloatType(); - object input = null!; // act - object output = type.CoerceInputValue(input); + void Action() => type.ValueToLiteral("foo"); // assert - Assert.IsType<NullValueNode>(output); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Nullable() + public void ParseLiteral() { // arrange var type = new FloatType(); - double? input = 123; + var literal = new FloatValueNode(42.5); // act - var output = (FloatValueNode)type.CoerceInputValue(input); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Equal(123, output.ToDouble()); + Assert.Equal(42.5, Assert.IsType<double>(runtimeValue)); } [Fact] - public void Ensure_TypeKind_is_Scalar() + public void ParseLiteral_InvalidValue() { // arrange var type = new FloatType(); // act - var kind = type.Kind; + void Action() => type.CoerceInputLiteral(new StringValueNode("abc")); // assert - Assert.Equal(TypeKind.Scalar, kind); + Assert.Throws<LeafCoercionException>(Action); } private FloatValueNode CreateExponentialLiteral() => diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs index b413c61e6a3..0791dcf8199 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs @@ -1,11 +1,13 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class IdTypeTests { [Fact] - public void Create_With_Default_Name() + public void Ensure_Type_Name_Is_Correct() { // arrange // act @@ -39,7 +41,7 @@ public void Create_With_Name_And_Description() } [Fact] - public void EnsureStringTypeKindIsCorret() + public void Ensure_TypeKind_Is_Scalar() { // arrange var type = new IdType(); @@ -52,7 +54,7 @@ public void EnsureStringTypeKindIsCorret() } [Fact] - public void IsInstanceOfType_StringValueNode() + public void IsValueCompatible_StringValueNode_True() { // arrange var type = new IdType(); @@ -66,7 +68,7 @@ public void IsInstanceOfType_StringValueNode() } [Fact] - public void IsInstanceOfType_IntValueNode() + public void IsValueCompatible_IntValueNode_True() { // arrange var type = new IdType(); @@ -80,7 +82,7 @@ public void IsInstanceOfType_IntValueNode() } [Fact] - public void IsInstanceOfType_NullValueNode() + public void IsValueCompatible_NullValueNode_True() { // arrange var type = new IdType(); @@ -94,7 +96,7 @@ public void IsInstanceOfType_NullValueNode() } [Fact] - public void IsInstanceOfType_Wrong_ValueNode() + public void IsValueCompatible_FloatValueNode_False() { // arrange var type = new IdType(); @@ -108,231 +110,252 @@ public void IsInstanceOfType_Wrong_ValueNode() } [Fact] - public void IsInstanceOfType_Null_Throws() + public void IsValueCompatible_Null_Throws() { // arrange var type = new IdType(); // act + void Action() => type.IsValueCompatible(null!); + // assert - Assert.Throws<ArgumentNullException>( - () => type.IsValueCompatible(null!)); + Assert.Throws<ArgumentNullException>(Action); } [Fact] - public void Serialize_String() + public void CoerceInputLiteral_StringValueNode() { // arrange var type = new IdType(); - const string input = "123456"; + var input = new StringValueNode("123456"); // act - var serializedValue = type.Serialize(input); + var output = type.CoerceInputLiteral(input); // assert - Assert.IsType<string>(serializedValue); - Assert.Equal("123456", serializedValue); + Assert.IsType<string>(output); + Assert.Equal("123456", output); } [Fact] - public void Serialize_Null() + public void CoerceInputLiteral_IntValueNode() { // arrange var type = new IdType(); + var input = new IntValueNode(123456); // act - var serializedValue = type.Serialize(null); + var output = type.CoerceInputLiteral(input); // assert - Assert.Null(serializedValue); + Assert.IsType<string>(output); + Assert.Equal("123456", output); } [Fact] - public void Deserialize_String() + public void CoerceInputLiteral_NullValueNode() { // arrange var type = new IdType(); - const string serialized = "123456"; + var input = NullValueNode.Default; // act - var success = type.TryDeserialize(serialized, out var value); + var output = type.CoerceInputLiteral(input); // assert - Assert.True(success); - Assert.Equal("123456", Assert.IsType<string>(value)); + Assert.Null(output); } [Fact] - public void Deserialize_Int() + public void CoerceInputLiteral_Invalid_Format() { // arrange - var type = SchemaBuilder.New() - .AddQueryType(c => c - .Name("QueryRoot") - .Field("abc") - .Type<IdType>() - .Resolve("abc")) - .Create() - .Types - .GetType<IdType>("ID"); - const int serialized = 123456; + var type = new IdType(); + var input = new FloatValueNode(123456.0); // act - var success = type.TryDeserialize(serialized, out var value); + void Action() => type.CoerceInputLiteral(input); // assert - Assert.True(success); - Assert.Equal("123456", Assert.IsType<string>(value)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_Null() + public void CoerceInputLiteral_Null_Throws() { // arrange var type = new IdType(); - object serialized = null!; // act - type.TryDeserialize(serialized, out var value); + void Action() => type.CoerceInputLiteral(null!); // assert - Assert.Null(value); + Assert.Throws<ArgumentNullException>(Action); } [Fact] - public void Deserialize_Float() + public void CoerceInputValue_String() { // arrange var type = new IdType(); - const float serialized = 1.1f; + var inputValue = JsonDocument.Parse("\"123456\"").RootElement; // act - var success = type.TryDeserialize(serialized, out _); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.False(success); + Assert.Equal("123456", runtimeValue); } [Fact] - public void Serialize_Wrong_Type_Throws() + public void CoerceInputValue_Int() + { + // arrange + var type = SchemaBuilder.New() + .AddQueryType(c => c + .Name("QueryRoot") + .Field("abc") + .Type<IdType>() + .Resolve("abc")) + .Create() + .Types + .GetType<IdType>("ID"); + var inputValue = JsonDocument.Parse("123456").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal("123456", runtimeValue); + } + + [Fact] + public void CoerceInputValue_Null() { // arrange var type = new IdType(); - object input = Guid.NewGuid(); + var inputValue = JsonDocument.Parse("null").RootElement; // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(input)); + Assert.Null(runtimeValue); } [Fact] - public void ParseLiteral_StringValueNode() + public void CoerceInputValue_Invalid_Format() { // arrange var type = new IdType(); - var input = new StringValueNode("123456"); + var inputValue = JsonDocument.Parse("1.1").RootElement; // act - var output = type.CoerceInputLiteral(input); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.IsType<string>(output); - Assert.Equal("123456", output); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_IntValueNode() + public void CoerceOutputValue() { // arrange var type = new IdType(); - var input = new IntValueNode(123456); + const string runtimeValue = "123456"; // act - var output = type.CoerceInputLiteral(input); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); // assert - Assert.IsType<string>(output); - Assert.Equal("123456", output); + resultValue.MatchSnapshot(); } [Fact] - public void ParseLiteral_NullValueNode() + public void CoerceOutputValue_Invalid_Format() { // arrange var type = new IdType(); - var input = NullValueNode.Default; + var input = Guid.NewGuid(); // act - var output = type.CoerceInputLiteral(input); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(input, resultValue); // assert - Assert.Null(output); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_Wrong_ValueNode_Throws() + public void ValueToLiteral() { // arrange var type = new IdType(); - var input = new FloatValueNode(123456.0); + const string runtimeValue = "hello"; // act + var literal = type.ValueToLiteral(runtimeValue); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputLiteral(input)); + Assert.Equal("hello", Assert.IsType<StringValueNode>(literal).Value); } [Fact] - public void ParseLiteral_Null_Throws() + public void ValueToLiteral_Null() { // arrange var type = new IdType(); // act + var literal = type.ValueToLiteral(null!); + // assert - Assert.Throws<ArgumentNullException>(() => - type.CoerceInputLiteral(null!)); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseValue_Wrong_Value_Throws() + public void ValueToLiteral_Invalid_Format() { // arrange var type = new IdType(); - object input = 123.456; + const double input = 123.456; // act + void Action() => type.ValueToLiteral(input); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputValue(input)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Null() + public void ParseLiteral() { // arrange var type = new IdType(); - object input = null!; + var literal = new StringValueNode("123456"); // act - object output = type.CoerceInputValue(input); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.IsType<NullValueNode>(output); + Assert.Equal("123456", Assert.IsType<string>(runtimeValue)); } [Fact] - public void ParseValue_String() + public void ParseLiteral_InvalidValue() { // arrange var type = new IdType(); - object input = "hello"; // act - object output = type.CoerceInputValue(input); + void Action() => type.CoerceInputLiteral(new FloatValueNode(123.456)); // assert - Assert.IsType<StringValueNode>(output); + Assert.Throws<LeafCoercionException>(Action); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs index e86440dba97..948cd808b07 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs @@ -1,275 +1,245 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class IntTypeTests { [Fact] - public void IsInstanceOfType_FloatLiteral_True() + public void Ensure_Type_Name_Is_Correct() { // arrange - var type = new IntType(); - var literal = new IntValueNode(1); - // act - var result = type.IsValueCompatible(literal); - - // assert - Assert.True(result); - } - - [Fact] - public void IsInstanceOfType_NullLiteral_True() - { - // arrange var type = new IntType(); - // act - var result = type.IsValueCompatible(NullValueNode.Default); - // assert - Assert.True(result); + Assert.Equal("Int", type.Name); } [Fact] - public void IsInstanceOfType_StringLiteral_False() + public void CoerceInputLiteral() { // arrange var type = new IntType(); + var literal = new IntValueNode(42); // act - var result = type.IsValueCompatible(new FloatValueNode(1M)); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.False(result); + Assert.Equal(42, runtimeValue); } [Fact] - public void IsInstanceOfType_Null_Throws() + public void CoerceInputLiteral_MaxValue() { // arrange var type = new IntType(); + var literal = new IntValueNode(int.MaxValue); // act + var runtimeValue = type.CoerceInputLiteral(literal); + // assert - Assert.Throws<ArgumentNullException>( - () => type.IsValueCompatible(null!)); + Assert.Equal(int.MaxValue, runtimeValue); } [Fact] - public void Serialize_Type() + public void CoerceInputLiteral_MinValue() { // arrange var type = new IntType(); - const int value = 123; + var literal = new IntValueNode(int.MinValue); // act - var serializedValue = type.Serialize(value); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.IsType<int>(serializedValue); - Assert.Equal(value, serializedValue); + Assert.Equal(int.MinValue, runtimeValue); } [Fact] - public void Serialize_Null() + public void CoerceInputLiteral_Null() { // arrange var type = new IntType(); + var literal = NullValueNode.Default; // act - var serializedValue = type.Serialize(null); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Null(serializedValue); + Assert.Null(runtimeValue); } [Fact] - public void Serialize_Wrong_Type_Throws() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new IntType(); - const string input = "abc"; + var literal = new StringValueNode("foo"); // act - // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(input)); - } - - [Fact] - public void Serialize_MaxValue_Violation() - { - // arrange - var type = new IntType(0, 100); - const int value = 200; + void Action() => type.CoerceInputLiteral(literal); - // act // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(value)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_IntLiteral() + public void CoerceInputValue() { // arrange var type = new IntType(); - var literal = new IntValueNode(1); + var inputValue = JsonDocument.Parse("42").RootElement; // act - var value = type.CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.IsType<int>(value); - Assert.Equal(literal.ToInt32(), value); + Assert.Equal(42, runtimeValue); } [Fact] - public void ParseLiteral_NullValueNode() + public void CoerceInputValue_MaxValue() { // arrange var type = new IntType(); + var inputValue = JsonDocument.Parse($"{int.MaxValue}").RootElement; // act - var output = type.CoerceInputLiteral(NullValueNode.Default); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Null(output); + Assert.Equal(int.MaxValue, runtimeValue); } [Fact] - public void ParseLiteral_Wrong_ValueNode_Throws() + public void CoerceInputValue_MinValue() { // arrange var type = new IntType(); - var input = new StringValueNode("abc"); + var inputValue = JsonDocument.Parse($"{int.MinValue}").RootElement; // act - // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputLiteral(input)); - } - - [Fact] - public void ParseLiteral_Null_Throws() - { - // arrange - var type = new IntType(); + var runtimeValue = type.CoerceInputValue(inputValue, null!); - // act // assert - Assert.Throws<ArgumentNullException>( - () => type.CoerceInputLiteral(null!)); + Assert.Equal(int.MinValue, runtimeValue); } [Fact] - public void ParseValue_MaxValue() + public void CoerceInputValue_Invalid_Format() { // arrange - var type = new IntType(1, 100); - const int input = 100; + var type = new IntType(); + var inputValue = JsonDocument.Parse("\"foo\"").RootElement; // act - var literal = (IntValueNode)type.ParseValue(input); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.Equal(100, literal.ToByte()); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_MaxValue_Violation() + public void CoerceOutputValue() { // arrange - var type = new IntType(1, 100); - const int input = 101; + var type = new IntType(); + const int runtimeValue = 42; // act - Action action = () => type.ParseValue(input); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); // assert - Assert.Throws<LeafCoercionException>(action); + resultValue.MatchSnapshot(); } [Fact] - public void ParseValue_MinValue() + public void CoerceOutputValue_Invalid_Format() { // arrange - var type = new IntType(1, 100); - const int input = 1; + var type = new IntType(); // act - var literal = (IntValueNode)type.ParseValue(input); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); // assert - Assert.Equal(1, literal.ToByte()); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_MinValue_Violation() + public void ValueToLiteral() { // arrange - var type = new IntType(1, 100); - const int input = 0; + var type = new IntType(); + const int runtimeValue = 42; // act - Action action = () => type.ParseValue(input); + var literal = type.ValueToLiteral(runtimeValue); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Equal(42, Assert.IsType<IntValueNode>(literal).ToInt32()); } [Fact] - public void ParseValue_Wrong_Value_Throws() + public void ValueToLiteral_Null() { // arrange var type = new IntType(); - const string value = "123"; // act + var literal = type.ValueToLiteral(null!); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputValue(value)); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseValue_Null() + public void ValueToLiteral_Invalid_Format() { // arrange var type = new IntType(); - object input = null!; // act - object output = type.CoerceInputValue(input); + void Action() => type.ValueToLiteral("foo"); // assert - Assert.IsType<NullValueNode>(output); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Nullable() + public void ParseLiteral() { // arrange var type = new IntType(); - int? input = 123; + var literal = new IntValueNode(42); // act - var output = (IntValueNode)type.CoerceInputValue(input); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Equal(123, output.ToDouble()); + Assert.Equal(42, Assert.IsType<int>(runtimeValue)); } [Fact] - public void Ensure_TypeKind_is_Scalar() + public void ParseLiteral_InvalidValue() { // arrange var type = new IntType(); // act - var kind = type.Kind; + void Action() => type.CoerceInputLiteral(new FloatValueNode(1.5)); // assert - Assert.Equal(TypeKind.Scalar, kind); + Assert.Throws<LeafCoercionException>(Action); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs index 31a9b50917e..6bd7ecd17a5 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs @@ -1,7 +1,9 @@ using System.Globalization; +using System.Text.Json; using HotChocolate.Execution; using HotChocolate.Language; using HotChocolate.Tests; +using HotChocolate.Text.Json; using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Types; @@ -9,347 +11,211 @@ namespace HotChocolate.Types; public class LocalDateTimeTypeTests { [Fact] - public void Serialize_DateTime() + public void Ensure_Type_Name_Is_Correct() { // arrange - var localDateTimeType = new LocalDateTimeType(); - var dateTime = new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); - const string expectedValue = "2018-06-11T08:46:14"; - // act - var serializedValue = (string?)localDateTimeType.Serialize(dateTime); - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - public void Serialize_DateTimeOffset() - { - // arrange - var localDateTimeType = new LocalDateTimeType(); - var dateTime = new DateTimeOffset( - new DateTime(2018, 6, 11, 2, 46, 14), - new TimeSpan(4, 0, 0)); - const string expectedValue = "2018-06-11T02:46:14"; - - // act - var serializedValue = (string?)localDateTimeType.Serialize(dateTime); - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - public void Serialize_Null() - { - // arrange - var localDateTimeType = new LocalDateTimeType(); - - // act - var serializedValue = localDateTimeType.Serialize(null); + var type = new LocalDateTimeType(); // assert - Assert.Null(serializedValue); + Assert.Equal("LocalDateTime", type.Name); } [Fact] - public void Serialize_String_Exception() + public void CoerceInputLiteral() { // arrange - var localDateTimeType = new LocalDateTimeType(); + var type = new LocalDateTimeType(); + var literal = new StringValueNode("2018-06-29T08:46:14"); + var expectedDateTime = new DateTime(2018, 6, 29, 8, 46, 14); // act - void Action() => localDateTimeType.Serialize("foo"); + var dateTime = type.CoerceInputLiteral(literal); // assert - Assert.Throws<LeafCoercionException>(Action); + Assert.Equal(expectedDateTime, dateTime); } - [Fact] - public void Deserialize_IsoString_DateTime() + [InlineData("en-US")] + [InlineData("en-AU")] + [InlineData("en-GB")] + [InlineData("de-CH")] + [InlineData("de-de")] + [Theory] + public void CoerceInputLiteral_DifferentCulture(string cultureName) { // arrange - var localDateTimeType = new LocalDateTimeType(); - var dateTime = new DateTime(2018, 6, 11, 8, 46, 14); - - // act - var result = (DateTime)localDateTimeType.Deserialize("2018-06-11T08:46:14")!; - - // assert - Assert.Equal(dateTime, result); - } + Thread.CurrentThread.CurrentCulture = + CultureInfo.GetCultureInfo(cultureName); - [Fact] - public void Deserialize_InvalidFormat_To_DateTime() - { - // arrange var type = new LocalDateTimeType(); + var literal = new StringValueNode("2018-06-29T08:46:14"); + var expectedDateTime = new DateTime(2018, 6, 29, 8, 46, 14); // act - var success = type.TryDeserialize("2018/06/11T08:46:14 pm", out _); + var dateTime = (DateTime)type.CoerceInputLiteral(literal); // assert - Assert.False(success); + Assert.Equal(expectedDateTime, dateTime); } [Fact] - public void Deserialize_InvalidString_To_DateTime() + public void CoerceInputLiteral_Null() { // arrange var type = new LocalDateTimeType(); + var literal = NullValueNode.Default; // act - var success = type.TryDeserialize("abc", out _); + var value = type.CoerceInputLiteral(literal); // assert - Assert.False(success); + Assert.Null(value); } [Fact] - public void Deserialize_DateTime_To_DateTime() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new LocalDateTimeType(); - var dateTime = new DateTime(2018, 6, 11, 8, 46, 14); + var literal = new StringValueNode("abc"); // act - var success = type.TryDeserialize(dateTime, out var deserialized); + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.True(success); - Assert.Equal(dateTime, deserialized); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_DateTimeOffset_To_DateTime() + public void CoerceInputValue() { // arrange var type = new LocalDateTimeType(); - var dateTime = new DateTimeOffset( - new DateTime(2018, 6, 11, 2, 46, 14), - new TimeSpan(4, 0, 0)); + var inputValue = JsonDocument.Parse("\"2018-06-11T08:46:14\"").RootElement; + var expectedDateTime = new DateTime(2018, 6, 11, 8, 46, 14); // act - var success = type.TryDeserialize(dateTime, out var deserialized); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.True(success); - Assert.Equal(dateTime.DateTime, Assert.IsType<DateTime>(deserialized)); + Assert.Equal(expectedDateTime, runtimeValue); } [Fact] - public void Deserialize_NullableDateTime_To_DateTime() + public void CoerceInputValue_Invalid_Format() { // arrange var type = new LocalDateTimeType(); - DateTime? dateTime = new DateTime(2018, 6, 11, 8, 46, 14); + var inputValue = JsonDocument.Parse("\"abc\"").RootElement; // act - var success = type.TryDeserialize(dateTime, out var deserialized); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.True(success); - Assert.Equal(dateTime, Assert.IsType<DateTime>(deserialized)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_NullableDateTime_To_DateTime_2() + public void CoerceOutputValue() { // arrange var type = new LocalDateTimeType(); - DateTime? dateTime = null; + var dateTime = new DateTime(2018, 6, 11, 8, 46, 14); // act - var success = type.TryDeserialize(dateTime, out var deserialized); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(dateTime, resultValue); // assert - Assert.True(success); - Assert.Null(deserialized); + resultValue.MatchSnapshot(); } [Fact] - public void Deserialize_Null_To_Null() + public void CoerceOutputValue_Invalid_Format() { // arrange var type = new LocalDateTimeType(); // act - var success = type.TryDeserialize(null, out var deserialized); - - // assert - Assert.True(success); - Assert.Null(deserialized); - } - - [Fact] - public void ParseLiteral_StringValueNode() - { - // arrange - var localDateTimeType = new LocalDateTimeType(); - var literal = new StringValueNode("2018-06-29T08:46:14"); - var expectedDateTime = new DateTime(2018, 6, 29, 8, 46, 14); - - // act - var dateTime = (DateTime)localDateTimeType.CoerceInputLiteral(literal)!; + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(123, resultValue); // assert - Assert.Equal(expectedDateTime, dateTime); - } - - [InlineData("en-US")] - [InlineData("en-AU")] - [InlineData("en-GB")] - [InlineData("de-CH")] - [InlineData("de-de")] - [Theory] - public void ParseLiteral_StringValueNode_DifferentCulture( - string cultureName) - { - // arrange - Thread.CurrentThread.CurrentCulture = - CultureInfo.GetCultureInfo(cultureName); - - var localDateTimeType = new LocalDateTimeType(); - var literal = new StringValueNode("2018-06-29T08:46:14"); - var expectedDateTime = new DateTime(2018, 6, 29, 8, 46, 14); - - // act - var dateTime = (DateTime)localDateTimeType.CoerceInputLiteral(literal)!; - - // assert - Assert.Equal(expectedDateTime, dateTime); - } - - [Fact] - public void ParseLiteral_NullValueNode() - { - // arrange - var localDateTimeType = new LocalDateTimeType(); - var literal = NullValueNode.Default; - - // act - var value = localDateTimeType.CoerceInputLiteral(literal); - - // assert - Assert.Null(value); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_DateTime() + public void ValueToLiteral() { // arrange - var localDateTimeType = new LocalDateTimeType(); + var type = new LocalDateTimeType(); var dateTime = new DateTime(2018, 6, 11, 8, 46, 14); const string expectedLiteralValue = "2018-06-11T08:46:14"; // act - var stringLiteral = - (StringValueNode)localDateTimeType.ParseValue(dateTime); + var stringLiteral = type.ValueToLiteral(dateTime); // assert - Assert.Equal(expectedLiteralValue, stringLiteral.Value); + Assert.Equal(expectedLiteralValue, Assert.IsType<StringValueNode>(stringLiteral).Value); } [Fact] - public void ParseValue_Null() + public void ValueToLiteral_Null() { // arrange - var localDateTimeType = new LocalDateTimeType(); - - // act - var literal = localDateTimeType.CoerceInputValue(null); - - // assert - Assert.Equal(NullValueNode.Default, literal); - } - - [Fact] - public void ParseResult_DateTime() - { - // arrange - var localDateTimeType = new LocalDateTimeType(); - var resultValue = new DateTime(2023, 6, 19, 11, 24, 0, DateTimeKind.Utc); - const string expectedLiteralValue = "2023-06-19T11:24:00"; - - // act - var literal = localDateTimeType.ParseResult(resultValue); - - // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); - } - - [Fact] - public void ParseResult_DateTimeOffset() - { - // arrange - var localDateTimeType = new LocalDateTimeType(); - var resultValue = new DateTimeOffset(2023, 6, 19, 11, 24, 0, new TimeSpan(6, 0, 0)); - const string expectedLiteralValue = "2023-06-19T11:24:00"; - - // act - var literal = localDateTimeType.ParseResult(resultValue); - - // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); - } - - [Fact] - public void ParseResult_String() - { - // arrange - var localDateTimeType = new LocalDateTimeType(); - const string resultValue = "2023-06-19T11:24:00"; - const string expectedLiteralValue = "2023-06-19T11:24:00"; + var type = new LocalDateTimeType(); // act - var literal = localDateTimeType.ParseResult(resultValue); + var literal = type.ValueToLiteral(null!); // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseResult_Null() + public void ValueToLiteral_Invalid_Format() { // arrange - var localDateTimeType = new LocalDateTimeType(); + var type = new LocalDateTimeType(); // act - var literal = localDateTimeType.ParseResult(null); + void Action() => type.ValueToLiteral("foo"); // assert - Assert.Equal(NullValueNode.Default, literal); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseResult_SerializationException() + public void ParseLiteral() { // arrange - var localDateTimeType = new LocalDateTimeType(); - const int resultValue = 1; + var type = new LocalDateTimeType(); + var literal = new StringValueNode("2018-06-29T08:46:14"); + var expectedDateTime = new DateTime(2018, 6, 29, 8, 46, 14); // act - var exception = Record.Exception(() => localDateTimeType.ParseResult(resultValue)); + var dateTime = type.CoerceInputLiteral(literal); // assert - Assert.IsType<LeafCoercionException>(exception); + Assert.Equal(expectedDateTime, Assert.IsType<DateTime>(dateTime)); } [Fact] - public void EnsureLocalDateTimeTypeKindIsCorrect() + public void ParseLiteral_InvalidValue() { // arrange var type = new LocalDateTimeType(); // act - var kind = type.Kind; + void Action() => type.CoerceInputLiteral(new IntValueNode(123)); // assert - Assert.Equal(TypeKind.Scalar, kind); + Assert.Throws<LeafCoercionException>(Action); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs index 016f60655d4..22aa6079864 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs @@ -1,7 +1,9 @@ using System.Globalization; +using System.Text.Json; using HotChocolate.Execution; using HotChocolate.Language; using HotChocolate.Tests; +using HotChocolate.Text.Json; using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Types; @@ -9,221 +11,26 @@ namespace HotChocolate.Types; public class LocalDateTypeTests { [Fact] - public void Serialize_DateOnly() + public void Ensure_Type_Name_Is_Correct() { // arrange - var localDateType = new LocalDateType(); - var dateOnly = new DateOnly(2018, 6, 11); - const string expectedValue = "2018-06-11"; - - // act - var serializedValue = (string?)localDateType.Serialize(dateOnly); - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - public void Serialize_DateTime() - { - // arrange - var localDateType = new LocalDateType(); - var dateTime = new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); - const string expectedValue = "2018-06-11"; - - // act - var serializedValue = (string?)localDateType.Serialize(dateTime); - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - public void Serialize_DateTimeOffset() - { - // arrange - var localDateType = new LocalDateType(); - var dateTime = new DateTimeOffset( - new DateTime(2018, 6, 11, 2, 46, 14), - new TimeSpan(4, 0, 0)); - const string expectedValue = "2018-06-11"; - // act - var serializedValue = (string?)localDateType.Serialize(dateTime); - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - public void Serialize_Null() - { - // arrange - var localDateType = new LocalDateType(); - - // act - var serializedValue = localDateType.Serialize(null); - - // assert - Assert.Null(serializedValue); - } - - [Fact] - public void Serialize_String_Exception() - { - // arrange - var localDateType = new LocalDateType(); - - // act - void Action() => localDateType.Serialize("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - - [Fact] - public void Deserialize_IsoString_DateOnly() - { - // arrange - var localDateType = new LocalDateType(); - var date = new DateOnly(2018, 6, 11); - - // act - var result = (DateOnly)localDateType.Deserialize("2018-06-11")!; - - // assert - Assert.Equal(date, result); - } - - [Fact] - public void Deserialize_InvalidFormat_To_DateOnly() - { - // arrange - var type = new LocalDateType(); - - // act - var success = type.TryDeserialize("2018/06/11", out _); - - // assert - Assert.False(success); - } - - [Fact] - public void Deserialize_InvalidString_To_DateOnly() - { - // arrange - var type = new LocalDateType(); - - // act - var success = type.TryDeserialize("abc", out _); - - // assert - Assert.False(success); - } - - [Fact] - public void Deserialize_DateOnly_To_DateOnly() - { - // arrange var type = new LocalDateType(); - var date = new DateOnly(2018, 6, 11); - - // act - var success = type.TryDeserialize(date, out var deserialized); // assert - Assert.True(success); - Assert.Equal(date, deserialized); + Assert.Equal("LocalDate", type.Name); } [Fact] - public void Deserialize_DateTime_To_DateOnly() + public void CoerceInputLiteral() { // arrange var type = new LocalDateType(); - var date = new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); - - // act - var success = type.TryDeserialize(date, out var deserialized); - - // assert - Assert.True(success); - Assert.Equal(DateOnly.FromDateTime(date), - Assert.IsType<DateOnly>(deserialized)); - } - - [Fact] - public void Deserialize_DateTimeOffset_To_DateOnly() - { - // arrange - var type = new LocalDateType(); - var date = new DateTimeOffset( - new DateTime(2018, 6, 11, 2, 46, 14), - new TimeSpan(4, 0, 0)); - - // act - var success = type.TryDeserialize(date, out var deserialized); - - // assert - Assert.True(success); - Assert.Equal(DateOnly.FromDateTime(date.DateTime), - Assert.IsType<DateOnly>(deserialized)); - } - - [Fact] - public void Deserialize_NullableDateOnly_To_DateOnly() - { - // arrange - var type = new LocalDateType(); - DateOnly? date = new DateOnly(2018, 6, 11); - - // act - var success = type.TryDeserialize(date, out var deserialized); - - // assert - Assert.True(success); - Assert.Equal(date, Assert.IsType<DateOnly>(deserialized)); - } - - [Fact] - public void Deserialize_NullableDateOnly_To_DateOnly_2() - { - // arrange - var type = new LocalDateType(); - DateOnly? date = null; - - // act - var success = type.TryDeserialize(date, out var deserialized); - - // assert - Assert.True(success); - Assert.Null(deserialized); - } - - [Fact] - public void Deserialize_Null_To_Null() - { - // arrange - var type = new LocalDateType(); - - // act - var success = type.TryDeserialize(null, out var deserialized); - - // assert - Assert.True(success); - Assert.Null(deserialized); - } - - [Fact] - public void ParseLiteral_StringValueNode() - { - // arrange - var localDateType = new LocalDateType(); var literal = new StringValueNode("2018-06-29"); var expectedDateOnly = new DateOnly(2018, 6, 29); // act - var dateOnly = (DateOnly)localDateType.CoerceInputLiteral(literal)!; + var dateOnly = type.CoerceInputLiteral(literal); // assert Assert.Equal(expectedDateOnly, dateOnly); @@ -231,37 +38,17 @@ public void ParseLiteral_StringValueNode() [Theory] [MemberData(nameof(ValidLocalDateScalarStrings))] - public void ParseLiteral_StringValueNode_Valid(string dateTime, DateOnly result) + public void CoerceInputLiteral_Valid_Formats(string dateTime, DateOnly result) { // arrange - var localDateType = new LocalDateType(); - var literal = new StringValueNode(dateTime); - - // act - var dateTimeOffset = (DateOnly?)localDateType.CoerceInputLiteral(literal); - - // assert - Assert.Equal(result, dateTimeOffset); - } - - [Theory] - [MemberData(nameof(InvalidLocalDateScalarStrings))] - public void ParseLiteral_StringValueNode_Invalid(string dateTime) - { - // arrange - var localDateType = new LocalDateType(); + var type = new LocalDateType(); var literal = new StringValueNode(dateTime); // act - void Act() - { - localDateType.CoerceInputLiteral(literal); - } + var dateOnly = (DateOnly?)type.CoerceInputLiteral(literal); // assert - Assert.Equal( - "LocalDate cannot parse the given literal of type `StringValueNode`.", - Assert.Throws<LeafCoercionException>(Act).Message); + Assert.Equal(result, dateOnly); } [InlineData("en-US")] @@ -270,169 +57,183 @@ void Act() [InlineData("de-CH")] [InlineData("de-de")] [Theory] - public void ParseLiteral_StringValueNode_DifferentCulture( - string cultureName) + public void CoerceInputLiteral_DifferentCulture(string cultureName) { // arrange Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(cultureName); - var localDateType = new LocalDateType(); + var type = new LocalDateType(); var literal = new StringValueNode("2018-06-29"); var expectedDateOnly = new DateOnly(2018, 6, 29); // act - var dateOnly = (DateOnly)localDateType.CoerceInputLiteral(literal)!; + var dateOnly = (DateOnly)type.CoerceInputLiteral(literal); // assert Assert.Equal(expectedDateOnly, dateOnly); } [Fact] - public void ParseLiteral_NullValueNode() + public void CoerceInputLiteral_Null() { // arrange - var localDateType = new LocalDateType(); + var type = new LocalDateType(); var literal = NullValueNode.Default; // act - var value = localDateType.CoerceInputLiteral(literal); + var value = type.CoerceInputLiteral(literal); // assert Assert.Null(value); } + [Theory] + [MemberData(nameof(InvalidLocalDateScalarStrings))] + public void CoerceInputLiteral_Invalid_Format(string dateTime) + { + // arrange + var type = new LocalDateType(); + var literal = new StringValueNode(dateTime); + + // act + void Action() => type.CoerceInputLiteral(literal); + + // assert + Assert.Equal( + "LocalDate cannot parse the given literal of type `StringValueNode`.", + Assert.Throws<LeafCoercionException>(Action).Message); + } + [Fact] - public void ParseValue_DateOnly() + public void CoerceInputValue() { // arrange - var localDateType = new LocalDateType(); - var dateOnly = new DateOnly(2018, 6, 11); - const string expectedLiteralValue = "2018-06-11"; + var type = new LocalDateType(); + var inputValue = JsonDocument.Parse("\"2018-06-11\"").RootElement; + var expectedDate = new DateOnly(2018, 6, 11); // act - var stringLiteral = - (StringValueNode)localDateType.ParseValue(dateOnly); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Equal(expectedLiteralValue, stringLiteral.Value); + Assert.Equal(expectedDate, runtimeValue); } [Fact] - public void ParseValue_Null() + public void CoerceInputValue_Invalid_Format() { // arrange - var localDateType = new LocalDateType(); + var type = new LocalDateType(); + var inputValue = JsonDocument.Parse("\"abc\"").RootElement; // act - var literal = localDateType.CoerceInputValue(null); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.Equal(NullValueNode.Default, literal); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseResult_DateOnly() + public void CoerceOutputValue() { // arrange - var localDateType = new LocalDateType(); - var resultValue = new DateOnly(2023, 6, 19); - const string expectedLiteralValue = "2023-06-19"; + var type = new LocalDateType(); + var dateOnly = new DateOnly(2018, 6, 11); // act - var literal = localDateType.ParseResult(resultValue); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(dateOnly, resultValue); // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); + resultValue.MatchSnapshot(); } [Fact] - public void ParseResult_DateTime() + public void CoerceOutputValue_Invalid_Format() { // arrange - var localDateType = new LocalDateType(); - var resultValue = new DateTime(2023, 6, 19, 11, 24, 0, DateTimeKind.Utc); - const string expectedLiteralValue = "2023-06-19"; + var type = new LocalDateType(); // act - var literal = localDateType.ParseResult(resultValue); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(123, resultValue); // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseResult_DateTimeOffset() + public void ValueToLiteral() { // arrange - var localDateType = new LocalDateType(); - var resultValue = new DateTimeOffset(2023, 6, 19, 11, 24, 0, new TimeSpan(6, 0, 0)); - const string expectedLiteralValue = "2023-06-19"; + var type = new LocalDateType(); + var dateOnly = new DateOnly(2018, 6, 11); + const string expectedLiteralValue = "2018-06-11"; // act - var literal = localDateType.ParseResult(resultValue); + var stringLiteral = type.ValueToLiteral(dateOnly); // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); + Assert.Equal(expectedLiteralValue, Assert.IsType<StringValueNode>(stringLiteral).Value); } [Fact] - public void ParseResult_String() + public void ValueToLiteral_Null() { // arrange - var localDateType = new LocalDateType(); - const string resultValue = "2023-06-19"; - const string expectedLiteralValue = "2023-06-19"; + var type = new LocalDateType(); // act - var literal = localDateType.ParseResult(resultValue); + var literal = type.ValueToLiteral(null!); // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseResult_Null() + public void ValueToLiteral_Invalid_Format() { // arrange - var localDateType = new LocalDateType(); + var type = new LocalDateType(); // act - var literal = localDateType.ParseResult(null); + void Action() => type.ValueToLiteral("foo"); // assert - Assert.Equal(NullValueNode.Default, literal); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseResult_SerializationException() + public void ParseLiteral() { // arrange - var localDateType = new LocalDateType(); - const int resultValue = 1; + var type = new LocalDateType(); + var literal = new StringValueNode("2018-06-29"); + var expectedDateOnly = new DateOnly(2018, 6, 29); // act - var exception = Record.Exception(() => localDateType.ParseResult(resultValue)); + var dateOnly = type.CoerceInputLiteral(literal); // assert - Assert.IsType<LeafCoercionException>(exception); + Assert.Equal(expectedDateOnly, Assert.IsType<DateOnly>(dateOnly)); } [Fact] - public void EnsureLocalDateTypeKindIsCorrect() + public void ParseLiteral_InvalidValue() { // arrange var type = new LocalDateType(); // act - var kind = type.Kind; + void Action() => type.CoerceInputLiteral(new IntValueNode(123)); // assert - Assert.Equal(TypeKind.Scalar, kind); + Assert.Throws<LeafCoercionException>(Action); } [Fact] @@ -507,20 +308,6 @@ public async Task DateOnly_As_ReturnValue() .MatchSnapshotAsync(); } - [Fact] - public void LocalDate_Relaxed_Format_Check() - { - // arrange - const string s = "2011-08-30T08:46:14.116"; - - // act - var localDateType = new LocalDateType(disableFormatCheck: true); - var result = localDateType.Deserialize(s); - - // assert - Assert.IsType<DateOnly>(result); - } - public class Query { [GraphQLType(typeof(LocalDateType))] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs index 24b56053724..1a1ba66ed9a 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs @@ -1,7 +1,9 @@ using System.Globalization; +using System.Text.Json; using HotChocolate.Execution; using HotChocolate.Language; using HotChocolate.Tests; +using HotChocolate.Text.Json; using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Types; @@ -9,395 +11,211 @@ namespace HotChocolate.Types; public class LocalTimeTypeTests { [Fact] - public void Serialize_TimeOnly() + public void Ensure_Type_Name_Is_Correct() { // arrange - var localTimeType = new LocalTimeType(); - var timeOnly = new TimeOnly(8, 46, 14); - const string expectedValue = "08:46:14"; - - // act - var serializedValue = (string?)localTimeType.Serialize(timeOnly); - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - public void Serialize_DateTime() - { - // arrange - var localTimeType = new LocalTimeType(); - var dateTime = new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); - const string expectedValue = "08:46:14"; - - // act - var serializedValue = (string?)localTimeType.Serialize(dateTime); - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - public void Serialize_DateTimeOffset() - { - // arrange - var localTimeType = new LocalTimeType(); - var dateTime = new DateTimeOffset( - new DateTime(2018, 6, 11, 2, 46, 14), - new TimeSpan(4, 0, 0)); - const string expectedValue = "02:46:14"; - - // act - var serializedValue = (string?)localTimeType.Serialize(dateTime); - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - public void Serialize_Null() - { - // arrange - var localTimeType = new LocalTimeType(); - // act - var serializedValue = localTimeType.Serialize(null); + var type = new LocalTimeType(); // assert - Assert.Null(serializedValue); + Assert.Equal("LocalTime", type.Name); } [Fact] - public void Serialize_String_Exception() + public void CoerceInputLiteral() { // arrange - var localTimeType = new LocalTimeType(); + var type = new LocalTimeType(); + var literal = new StringValueNode("08:46:14"); + var expectedTimeOnly = new TimeOnly(8, 46, 14); // act - void Action() => localTimeType.Serialize("foo"); + var timeOnly = type.CoerceInputLiteral(literal); // assert - Assert.Throws<LeafCoercionException>(Action); + Assert.Equal(expectedTimeOnly, timeOnly); } - [Fact] - public void Deserialize_IsoString_TimeOnly() + [InlineData("en-US")] + [InlineData("en-AU")] + [InlineData("en-GB")] + [InlineData("de-CH")] + [InlineData("de-de")] + [Theory] + public void CoerceInputLiteral_DifferentCulture(string cultureName) { // arrange - var localTimeType = new LocalTimeType(); - var time = new TimeOnly(8, 46, 14); - - // act - var result = (TimeOnly)localTimeType.Deserialize("08:46:14")!; - - // assert - Assert.Equal(time, result); - } + Thread.CurrentThread.CurrentCulture = + CultureInfo.GetCultureInfo(cultureName); - [Fact] - public void Deserialize_InvalidFormat_To_TimeOnly() - { - // arrange var type = new LocalTimeType(); + var literal = new StringValueNode("08:46:14"); + var expectedTimeOnly = new TimeOnly(8, 46, 14); // act - var success = type.TryDeserialize("08:46:14 pm", out _); + var timeOnly = (TimeOnly)type.CoerceInputLiteral(literal); // assert - Assert.False(success); + Assert.Equal(expectedTimeOnly, timeOnly); } [Fact] - public void Deserialize_InvalidString_To_TimeOnly() + public void CoerceInputLiteral_Null() { // arrange var type = new LocalTimeType(); + var literal = NullValueNode.Default; // act - var success = type.TryDeserialize("abc", out _); + var value = type.CoerceInputLiteral(literal); // assert - Assert.False(success); + Assert.Null(value); } [Fact] - public void Deserialize_TimeOnly_To_TimeOnly() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new LocalTimeType(); - var time = new TimeOnly(8, 46, 14); + var literal = new StringValueNode("abc"); // act - var success = type.TryDeserialize(time, out var deserialized); + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.True(success); - Assert.Equal(time, deserialized); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_DateTime_To_TimeOnly() + public void CoerceInputValue() { // arrange var type = new LocalTimeType(); - var date = new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); + var inputValue = JsonDocument.Parse("\"08:46:14\"").RootElement; + var expectedTime = new TimeOnly(8, 46, 14); // act - var success = type.TryDeserialize(date, out var deserialized); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.True(success); - Assert.Equal(TimeOnly.FromDateTime(date), - Assert.IsType<TimeOnly>(deserialized)); + Assert.Equal(expectedTime, runtimeValue); } [Fact] - public void Deserialize_DateTimeOffset_To_TimeOnly() + public void CoerceInputValue_Invalid_Format() { // arrange var type = new LocalTimeType(); - var date = new DateTimeOffset( - new DateTime(2018, 6, 11, 2, 46, 14), - new TimeSpan(4, 0, 0)); + var inputValue = JsonDocument.Parse("\"abc\"").RootElement; // act - var success = type.TryDeserialize(date, out var deserialized); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.True(success); - Assert.Equal(TimeOnly.FromDateTime(date.DateTime), - Assert.IsType<TimeOnly>(deserialized)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_NullableTimeOnly_To_TimeOnly() + public void CoerceOutputValue() { // arrange var type = new LocalTimeType(); - TimeOnly? time = new TimeOnly(8, 46, 14); + var timeOnly = new TimeOnly(8, 46, 14); // act - var success = type.TryDeserialize(time, out var deserialized); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(timeOnly, resultValue); // assert - Assert.True(success); - Assert.Equal(time, Assert.IsType<TimeOnly>(deserialized)); + resultValue.MatchSnapshot(); } [Fact] - public void Deserialize_NullableTimeOnly_To_TimeOnly_2() + public void CoerceOutputValue_Invalid_Format() { // arrange var type = new LocalTimeType(); - TimeOnly? time = null; // act - var success = type.TryDeserialize(time, out var deserialized); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(123, resultValue); // assert - Assert.True(success); - Assert.Null(deserialized); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_Null_To_Null() + public void ValueToLiteral() { // arrange var type = new LocalTimeType(); - - // act - var success = type.TryDeserialize(null, out var deserialized); - - // assert - Assert.True(success); - Assert.Null(deserialized); - } - - [Fact] - public void ParseLiteral_StringValueNode() - { - // arrange - var localTimeType = new LocalTimeType(); - var literal = new StringValueNode("08:46:14"); - var expectedTimeOnly = new TimeOnly(8, 46, 14); - - // act - var timeOnly = (TimeOnly)localTimeType.CoerceInputLiteral(literal)!; - - // assert - Assert.Equal(expectedTimeOnly, timeOnly); - } - - [InlineData("en-US")] - [InlineData("en-AU")] - [InlineData("en-GB")] - [InlineData("de-CH")] - [InlineData("de-de")] - [Theory] - public void ParseLiteral_StringValueNode_DifferentCulture( - string cultureName) - { - // arrange - Thread.CurrentThread.CurrentCulture = - CultureInfo.GetCultureInfo(cultureName); - - var localTimeType = new LocalTimeType(); - var literal = new StringValueNode("08:46:14"); - var expectedTimeOnly = new TimeOnly(8, 46, 14); - - // act - var timeOnly = (TimeOnly)localTimeType.CoerceInputLiteral(literal)!; - - // assert - Assert.Equal(expectedTimeOnly, timeOnly); - } - - [Fact] - public void ParseLiteral_NullValueNode() - { - // arrange - var localTimeType = new LocalTimeType(); - var literal = NullValueNode.Default; - - // act - var value = localTimeType.CoerceInputLiteral(literal); - - // assert - Assert.Null(value); - } - - [Fact] - public void ParseValue_TimeOnly() - { - // arrange - var localTimeType = new LocalTimeType(); var timeOnly = new TimeOnly(8, 46, 14); const string expectedLiteralValue = "08:46:14"; // act - var stringLiteral = - (StringValueNode)localTimeType.ParseValue(timeOnly); + var stringLiteral = type.ValueToLiteral(timeOnly); // assert - Assert.Equal(expectedLiteralValue, stringLiteral.Value); + Assert.Equal(expectedLiteralValue, Assert.IsType<StringValueNode>(stringLiteral).Value); } [Fact] - public void ParseValue_Null() + public void ValueToLiteral_Null() { // arrange - var localTimeType = new LocalTimeType(); - - // act - var literal = localTimeType.CoerceInputValue(null); - - // assert - Assert.Equal(NullValueNode.Default, literal); - } - - [Fact] - public void ParseResult_TimeOnly() - { - // arrange - var localTimeType = new LocalTimeType(); - var resultValue = new TimeOnly(8, 46, 14); - const string expectedLiteralValue = "08:46:14"; - - // act - var literal = localTimeType.ParseResult(resultValue); - - // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); - } - - [Fact] - public void ParseResult_DateTime() - { - // arrange - var localTimeType = new LocalTimeType(); - var resultValue = new DateTime(2023, 6, 19, 11, 24, 0, DateTimeKind.Utc); - const string expectedLiteralValue = "11:24:00"; - - // act - var literal = localTimeType.ParseResult(resultValue); - - // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); - } - - [Fact] - public void ParseResult_DateTimeOffset() - { - // arrange - var localTimeType = new LocalTimeType(); - var resultValue = new DateTimeOffset(2023, 6, 19, 11, 24, 0, new TimeSpan(6, 0, 0)); - const string expectedLiteralValue = "11:24:00"; - - // act - var literal = localTimeType.ParseResult(resultValue); - - // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); - } - - [Fact] - public void ParseResult_String() - { - // arrange - var localTimeType = new LocalTimeType(); - const string resultValue = "11:24:00"; - const string expectedLiteralValue = "11:24:00"; + var type = new LocalTimeType(); // act - var literal = localTimeType.ParseResult(resultValue); + var literal = type.ValueToLiteral(null!); // assert - Assert.Equal(typeof(StringValueNode), literal.GetType()); - Assert.Equal(expectedLiteralValue, literal.Value); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseResult_Null() + public void ValueToLiteral_Invalid_Format() { // arrange - var localTimeType = new LocalTimeType(); + var type = new LocalTimeType(); // act - var literal = localTimeType.ParseResult(null); + void Action() => type.ValueToLiteral("foo"); // assert - Assert.Equal(NullValueNode.Default, literal); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseResult_SerializationException() + public void ParseLiteral() { // arrange - var localTimeType = new LocalTimeType(); - const int resultValue = 1; + var type = new LocalTimeType(); + var literal = new StringValueNode("08:46:14"); + var expectedTimeOnly = new TimeOnly(8, 46, 14); // act - var exception = Record.Exception(() => localTimeType.ParseResult(resultValue)); + var timeOnly = type.CoerceInputLiteral(literal); // assert - Assert.IsType<LeafCoercionException>(exception); + Assert.Equal(expectedTimeOnly, Assert.IsType<TimeOnly>(timeOnly)); } [Fact] - public void EnsureLocalTimeTypeKindIsCorrect() + public void ParseLiteral_InvalidValue() { // arrange var type = new LocalTimeType(); // act - var kind = type.Kind; + void Action() => type.CoerceInputLiteral(new IntValueNode(123)); // assert - Assert.Equal(TypeKind.Scalar, kind); + Assert.Throws<LeafCoercionException>(Action); } [Fact] @@ -472,20 +290,6 @@ public async Task TimeOnly_As_ReturnValue() .MatchSnapshotAsync(); } - [Fact] - public void LocalTime_Relaxed_Format_Check() - { - // arrange - const string s = "8:46 am"; - - // act - var localTimeType = new LocalTimeType(disableFormatCheck: true); - var result = localTimeType.Deserialize(s); - - // assert - Assert.IsType<TimeOnly>(result); - } - public class Query { [GraphQLType(typeof(LocalTimeType))] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs index 38f4e5e6d8c..85ddf294332 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs @@ -1,275 +1,245 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class LongTypeTests { [Fact] - public void IsInstanceOfType_FloatLiteral_True() + public void Ensure_Type_Name_Is_Correct() { // arrange - var type = new LongType(); - var literal = new IntValueNode(1); - // act - var result = type.IsValueCompatible(literal); - - // assert - Assert.True(result); - } - - [Fact] - public void IsInstanceOfType_NullLiteral_True() - { - // arrange var type = new LongType(); - // act - var result = type.IsValueCompatible(NullValueNode.Default); - // assert - Assert.True(result); + Assert.Equal("Long", type.Name); } [Fact] - public void IsInstanceOfType_StringLiteral_False() + public void CoerceInputLiteral() { // arrange var type = new LongType(); + var literal = new IntValueNode(42L); // act - var result = type.IsValueCompatible(new FloatValueNode(1M)); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.False(result); + Assert.Equal(42L, runtimeValue); } [Fact] - public void IsInstanceOfType_Null_Throws() + public void CoerceInputLiteral_MaxValue() { // arrange var type = new LongType(); + var literal = new IntValueNode(long.MaxValue); // act + var runtimeValue = type.CoerceInputLiteral(literal); + // assert - Assert.Throws<ArgumentNullException>( - () => type.IsValueCompatible(null!)); + Assert.Equal(long.MaxValue, runtimeValue); } [Fact] - public void Serialize_Type() + public void CoerceInputLiteral_MinValue() { // arrange var type = new LongType(); - const long value = 123; + var literal = new IntValueNode(long.MinValue); // act - var serializedValue = type.Serialize(value); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.IsType<long>(serializedValue); - Assert.Equal(value, serializedValue); + Assert.Equal(long.MinValue, runtimeValue); } [Fact] - public void Serialize_Null() + public void CoerceInputLiteral_Null() { // arrange var type = new LongType(); + var literal = NullValueNode.Default; // act - var serializedValue = type.Serialize(null); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Null(serializedValue); + Assert.Null(runtimeValue); } [Fact] - public void Serialize_Wrong_Type_Throws() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new LongType(); - const string input = "abc"; + var literal = new StringValueNode("foo"); // act - // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(input)); - } - - [Fact] - public void Serialize_MaxValue_Violation() - { - // arrange - var type = new LongType(0, 100); - const long value = 200; + void Action() => type.CoerceInputLiteral(literal); - // act // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(value)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_IntLiteral() + public void CoerceInputValue() { // arrange var type = new LongType(); - var literal = new IntValueNode(1); + var inputValue = JsonDocument.Parse("42").RootElement; // act - var value = type.CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.IsType<long>(value); - Assert.Equal(literal.ToInt64(), value); + Assert.Equal(42L, runtimeValue); } [Fact] - public void ParseLiteral_NullValueNode() + public void CoerceInputValue_MaxValue() { // arrange var type = new LongType(); + var inputValue = JsonDocument.Parse($"{long.MaxValue}").RootElement; // act - var output = type.CoerceInputLiteral(NullValueNode.Default); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Null(output); + Assert.Equal(long.MaxValue, runtimeValue); } [Fact] - public void ParseLiteral_Wrong_ValueNode_Throws() + public void CoerceInputValue_MinValue() { // arrange var type = new LongType(); - var input = new StringValueNode("abc"); + var inputValue = JsonDocument.Parse($"{long.MinValue}").RootElement; // act - // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputLiteral(input)); - } - - [Fact] - public void ParseLiteral_Null_Throws() - { - // arrange - var type = new LongType(); + var runtimeValue = type.CoerceInputValue(inputValue, null!); - // act // assert - Assert.Throws<ArgumentNullException>( - () => type.CoerceInputLiteral(null!)); + Assert.Equal(long.MinValue, runtimeValue); } [Fact] - public void ParseValue_MaxValue() + public void CoerceInputValue_Invalid_Format() { // arrange - var type = new LongType(1, 100); - const long input = 100; + var type = new LongType(); + var inputValue = JsonDocument.Parse("\"foo\"").RootElement; // act - var literal = (IntValueNode)type.ParseValue(input); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.Equal(100, literal.ToByte()); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_MaxValue_Violation() + public void CoerceOutputValue() { // arrange - var type = new LongType(1, 100); - const long input = 101; + var type = new LongType(); + const long runtimeValue = 42; // act - Action action = () => type.ParseValue(input); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); // assert - Assert.Throws<LeafCoercionException>(action); + resultValue.MatchSnapshot(); } [Fact] - public void ParseValue_MinValue() + public void CoerceOutputValue_Invalid_Format() { // arrange - var type = new LongType(1, 100); - const long input = 1; + var type = new LongType(); // act - var literal = (IntValueNode)type.ParseValue(input); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); // assert - Assert.Equal(1, literal.ToByte()); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_MinValue_Violation() + public void ValueToLiteral() { // arrange - var type = new LongType(1, 100); - const long input = 0; + var type = new LongType(); + const long runtimeValue = 42; // act - Action action = () => type.ParseValue(input); + var literal = type.ValueToLiteral(runtimeValue); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Equal(42L, Assert.IsType<IntValueNode>(literal).ToInt64()); } [Fact] - public void ParseValue_Wrong_Value_Throws() + public void ValueToLiteral_Null() { // arrange var type = new LongType(); - const string value = "123"; // act + var literal = type.ValueToLiteral(null!); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputValue(value)); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseValue_Null() + public void ValueToLiteral_Invalid_Format() { // arrange var type = new LongType(); - object input = null!; // act - object output = type.CoerceInputValue(input); + void Action() => type.ValueToLiteral("foo"); // assert - Assert.IsType<NullValueNode>(output); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Nullable() + public void ParseLiteral() { // arrange var type = new LongType(); - long? input = 123; + var literal = new IntValueNode(42L); // act - var output = (IntValueNode)type.CoerceInputValue(input); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Equal(123, output.ToDouble()); + Assert.Equal(42L, Assert.IsType<long>(runtimeValue)); } [Fact] - public void Ensure_TypeKind_is_Scalar() + public void ParseLiteral_InvalidValue() { // arrange var type = new LongType(); // act - var kind = type.Kind; + void Action() => type.CoerceInputLiteral(new FloatValueNode(1.5)); // assert - Assert.Equal(TypeKind.Scalar, kind); + Assert.Throws<LeafCoercionException>(Action); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs index add6eac364a..8ffcbb62bc2 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ScalarBindingTests.cs @@ -1,4 +1,7 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; @@ -57,22 +60,24 @@ public ImplicitBindingScalar() { } - public override bool IsValueCompatible(IValueNode valueLiteral) + public override ScalarSerializationType SerializationType => ScalarSerializationType.Int; + + public override object CoerceInputLiteral(IValueNode valueSyntax) { throw new NotImplementedException(); } - public override object? CoerceInputLiteral(IValueNode valueSyntax) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { throw new NotImplementedException(); } - public override IValueNode CoerceInputValue(object? value) + public override void OnCoerceOutputValue(int runtimeValue, ResultElement resultValue) { throw new NotImplementedException(); } - public override IValueNode ParseResult(object? resultValue) + public override IValueNode OnValueToLiteral(int runtimeValue) { throw new NotImplementedException(); } @@ -85,22 +90,24 @@ public ExplicitBindingScalar() { } - public override bool IsValueCompatible(IValueNode valueLiteral) + public override ScalarSerializationType SerializationType => ScalarSerializationType.Int; + + public override object CoerceInputLiteral(IValueNode valueSyntax) { throw new NotImplementedException(); } - public override object? CoerceInputLiteral(IValueNode valueSyntax) + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) { throw new NotImplementedException(); } - public override IValueNode CoerceInputValue(object? value) + public override void OnCoerceOutputValue(int runtimeValue, ResultElement resultValue) { throw new NotImplementedException(); } - public override IValueNode ParseResult(object? resultValue) + public override IValueNode OnValueToLiteral(int runtimeValue) { throw new NotImplementedException(); } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs index 65636dc8dc1..5638088b197 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs @@ -1,275 +1,245 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class ShortTypeTests { [Fact] - public void IsInstanceOfType_FloatLiteral_True() + public void Ensure_Type_Name_Is_Correct() { // arrange - var type = new ShortType(); - var literal = new IntValueNode(1); - // act - var result = type.IsValueCompatible(literal); - - // assert - Assert.True(result); - } - - [Fact] - public void IsInstanceOfType_NullLiteral_True() - { - // arrange var type = new ShortType(); - // act - var result = type.IsValueCompatible(NullValueNode.Default); - // assert - Assert.True(result); + Assert.Equal("Short", type.Name); } [Fact] - public void IsInstanceOfType_StringLiteral_False() + public void CoerceInputLiteral() { // arrange var type = new ShortType(); + var literal = new IntValueNode(42); // act - var result = type.IsValueCompatible(new FloatValueNode(1M)); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.False(result); + Assert.Equal((short)42, runtimeValue); } [Fact] - public void IsInstanceOfType_Null_Throws() + public void CoerceInputLiteral_MaxValue() { // arrange var type = new ShortType(); + var literal = new IntValueNode(short.MaxValue); // act + var runtimeValue = type.CoerceInputLiteral(literal); + // assert - Assert.Throws<ArgumentNullException>( - () => type.IsValueCompatible(null!)); + Assert.Equal(short.MaxValue, runtimeValue); } [Fact] - public void Serialize_Type() + public void CoerceInputLiteral_MinValue() { // arrange var type = new ShortType(); - const short value = 123; + var literal = new IntValueNode(short.MinValue); // act - var serializedValue = type.Serialize(value); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.IsType<short>(serializedValue); - Assert.Equal(value, serializedValue); + Assert.Equal(short.MinValue, runtimeValue); } [Fact] - public void Serialize_Null() + public void CoerceInputLiteral_Null() { // arrange var type = new ShortType(); + var literal = NullValueNode.Default; // act - var serializedValue = type.Serialize(null); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Null(serializedValue); + Assert.Null(runtimeValue); } [Fact] - public void Serialize_Wrong_Type_Throws() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new ShortType(); - const string input = "abc"; + var literal = new StringValueNode("foo"); // act - // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(input)); - } - - [Fact] - public void Serialize_MaxValue_Violation() - { - // arrange - var type = new ShortType(0, 100); - const short value = 200; + void Action() => type.CoerceInputLiteral(literal); - // act // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(value)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_IntLiteral() + public void CoerceInputValue() { // arrange var type = new ShortType(); - var literal = new IntValueNode(1); + var inputValue = JsonDocument.Parse("42").RootElement; // act - var value = type.CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.IsType<short>(value); - Assert.Equal(literal.ToInt16(), value); + Assert.Equal((short)42, runtimeValue); } [Fact] - public void ParseLiteral_NullValueNode() + public void CoerceInputValue_MaxValue() { // arrange var type = new ShortType(); + var inputValue = JsonDocument.Parse($"{short.MaxValue}").RootElement; // act - var output = type.CoerceInputLiteral(NullValueNode.Default); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Null(output); + Assert.Equal(short.MaxValue, runtimeValue); } [Fact] - public void ParseLiteral_Wrong_ValueNode_Throws() + public void CoerceInputValue_MinValue() { // arrange var type = new ShortType(); - var input = new StringValueNode("abc"); + var inputValue = JsonDocument.Parse($"{short.MinValue}").RootElement; // act - // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputLiteral(input)); - } - - [Fact] - public void ParseLiteral_Null_Throws() - { - // arrange - var type = new ShortType(); + var runtimeValue = type.CoerceInputValue(inputValue, null!); - // act // assert - Assert.Throws<ArgumentNullException>( - () => type.CoerceInputLiteral(null!)); + Assert.Equal(short.MinValue, runtimeValue); } [Fact] - public void ParseValue_MaxValue() + public void CoerceInputValue_Invalid_Format() { // arrange - var type = new ShortType(1, 100); - const short input = 100; + var type = new ShortType(); + var inputValue = JsonDocument.Parse("\"foo\"").RootElement; // act - var literal = (IntValueNode)type.ParseValue(input); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.Equal(100, literal.ToByte()); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_MaxValue_Violation() + public void CoerceOutputValue() { // arrange - var type = new ShortType(1, 100); - const short input = 101; + var type = new ShortType(); + const short runtimeValue = 42; // act - Action action = () => type.ParseValue(input); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); // assert - Assert.Throws<LeafCoercionException>(action); + resultValue.MatchSnapshot(); } [Fact] - public void ParseValue_MinValue() + public void CoerceOutputValue_Invalid_Format() { // arrange - var type = new ShortType(1, 100); - const short input = 1; + var type = new ShortType(); // act - var literal = (IntValueNode)type.ParseValue(input); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); // assert - Assert.Equal(1, literal.ToByte()); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_MinValue_Violation() + public void ValueToLiteral() { // arrange - var type = new ShortType(1, 100); - const short input = 0; + var type = new ShortType(); + const short runtimeValue = 42; // act - Action action = () => type.ParseValue(input); + var literal = type.ValueToLiteral(runtimeValue); // assert - Assert.Throws<LeafCoercionException>(action); + Assert.Equal(42, Assert.IsType<IntValueNode>(literal).ToInt32()); } [Fact] - public void ParseValue_Wrong_Value_Throws() + public void ValueToLiteral_Null() { // arrange var type = new ShortType(); - const string value = "123"; // act + var literal = type.ValueToLiteral(null!); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputValue(value)); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseValue_Null() + public void ValueToLiteral_Invalid_Format() { // arrange var type = new ShortType(); - object input = null!; // act - object output = type.CoerceInputValue(input); + void Action() => type.ValueToLiteral("foo"); // assert - Assert.IsType<NullValueNode>(output); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Nullable() + public void ParseLiteral() { // arrange var type = new ShortType(); - short? input = 123; + var literal = new IntValueNode(42); // act - var output = (IntValueNode)type.CoerceInputValue(input); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Equal(123, output.ToDouble()); + Assert.Equal((short)42, Assert.IsType<short>(runtimeValue)); } [Fact] - public void Ensure_TypeKind_is_Scalar() + public void ParseLiteral_InvalidValue() { // arrange var type = new ShortType(); // act - var kind = type.Kind; + void Action() => type.CoerceInputLiteral(new FloatValueNode(1.5)); // assert - Assert.Equal(TypeKind.Scalar, kind); + Assert.Throws<LeafCoercionException>(Action); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs new file mode 100644 index 00000000000..7cb16640f10 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs @@ -0,0 +1,245 @@ +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; + +namespace HotChocolate.Types; + +public class SignedByteTypeTests +{ + [Fact] + public void Ensure_Type_Name_Is_Correct() + { + // arrange + // act + var type = new SignedByteType(); + + // assert + Assert.Equal("SignedByte", type.Name); + } + + [Fact] + public void CoerceInputLiteral() + { + // arrange + var type = new SignedByteType(); + var literal = new IntValueNode(42); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal((sbyte)42, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_MaxValue() + { + // arrange + var type = new SignedByteType(); + var literal = new IntValueNode(sbyte.MaxValue); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(sbyte.MaxValue, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_MinValue() + { + // arrange + var type = new SignedByteType(); + var literal = new IntValueNode(sbyte.MinValue); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(sbyte.MinValue, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_Null() + { + // arrange + var type = new SignedByteType(); + var literal = NullValueNode.Default; + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Null(runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_Invalid_Format() + { + // arrange + var type = new SignedByteType(); + var literal = new StringValueNode("foo"); + + // act + void Action() => type.CoerceInputLiteral(literal); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceInputValue() + { + // arrange + var type = new SignedByteType(); + var inputValue = JsonDocument.Parse("42").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal((sbyte)42, runtimeValue); + } + + [Fact] + public void CoerceInputValue_MaxValue() + { + // arrange + var type = new SignedByteType(); + var inputValue = JsonDocument.Parse($"{sbyte.MaxValue}").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal(sbyte.MaxValue, runtimeValue); + } + + [Fact] + public void CoerceInputValue_MinValue() + { + // arrange + var type = new SignedByteType(); + var inputValue = JsonDocument.Parse($"{sbyte.MinValue}").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal(sbyte.MinValue, runtimeValue); + } + + [Fact] + public void CoerceInputValue_Invalid_Format() + { + // arrange + var type = new SignedByteType(); + var inputValue = JsonDocument.Parse("\"foo\"").RootElement; + + // act + void Action() => type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceOutputValue() + { + // arrange + var type = new SignedByteType(); + const sbyte runtimeValue = 42; + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); + + // assert + resultValue.MatchSnapshot(); + } + + [Fact] + public void CoerceOutputValue_Invalid_Format() + { + // arrange + var type = new SignedByteType(); + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void ValueToLiteral() + { + // arrange + var type = new SignedByteType(); + const sbyte runtimeValue = 42; + + // act + var literal = type.ValueToLiteral(runtimeValue); + + // assert + Assert.Equal(42, Assert.IsType<IntValueNode>(literal).ToInt32()); + } + + [Fact] + public void ValueToLiteral_Null() + { + // arrange + var type = new SignedByteType(); + + // act + var literal = type.ValueToLiteral(null!); + + // assert + Assert.IsType<NullValueNode>(literal); + } + + [Fact] + public void ValueToLiteral_Invalid_Format() + { + // arrange + var type = new SignedByteType(); + + // act + void Action() => type.ValueToLiteral("foo"); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void ParseLiteral() + { + // arrange + var type = new SignedByteType(); + var literal = new IntValueNode(42); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal((sbyte)42, Assert.IsType<sbyte>(runtimeValue)); + } + + [Fact] + public void ParseLiteral_InvalidValue() + { + // arrange + var type = new SignedByteType(); + + // act + void Action() => type.CoerceInputLiteral(new FloatValueNode(1.5)); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } +} diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs index 4ac26187369..e230117a488 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs @@ -1,193 +1,189 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class StringTypeTests { [Fact] - public void EnsureStringTypeKindIsCorret() + public void Ensure_Type_Name_Is_Correct() { // arrange - var type = new StringType(); - // act - var kind = type.Kind; + var type = new StringType(); // assert - Assert.Equal(TypeKind.Scalar, kind); + Assert.Equal("String", type.Name); } [Fact] - public void IsInstanceOfType_ValueNode() + public void CoerceInputLiteral() { // arrange var type = new StringType(); - var input = new StringValueNode("123456"); + var literal = new StringValueNode("hello world"); // act - var result = type.IsValueCompatible(input); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.True(result); + Assert.Equal("hello world", runtimeValue); } [Fact] - public void IsInstanceOfType_NullValueNode() + public void CoerceInputLiteral_Null() { // arrange var type = new StringType(); - var input = NullValueNode.Default; + var literal = NullValueNode.Default; // act - var result = type.IsValueCompatible(input); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.True(result); + Assert.Null(runtimeValue); } [Fact] - public void IsInstanceOfType_Wrong_ValueNode() + public void CoerceInputLiteral_Invalid_Format() { // arrange var type = new StringType(); - var input = new IntValueNode(123456); + var literal = new IntValueNode(123); // act - var result = type.IsValueCompatible(input); + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.False(result); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void IsInstanceOfType_Null_Throws() + public void CoerceInputValue() { // arrange var type = new StringType(); + var inputValue = JsonDocument.Parse("\"hello world\"").RootElement; // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + // assert - Assert.Throws<ArgumentNullException>(() => type.IsValueCompatible(null!)); + Assert.Equal("hello world", runtimeValue); } [Fact] - public void Serialize_Type() + public void CoerceInputValue_Invalid_Format() { // arrange var type = new StringType(); - const string input = "123456"; + var inputValue = JsonDocument.Parse("123").RootElement; // act - var serializedValue = type.Serialize(input); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.IsType<string>(serializedValue); - Assert.Equal("123456", serializedValue); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Serialize_Null() + public void CoerceOutputValue() { // arrange var type = new StringType(); + const string runtimeValue = "hello world"; // act - var serializedValue = type.Serialize(null); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); // assert - Assert.Null(serializedValue); + resultValue.MatchSnapshot(); } [Fact] - public void Serialize_Wrong_Type_Throws() + public void CoerceOutputValue_Invalid_Format() { // arrange var type = new StringType(); - object input = 123456; // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(123, resultValue); + // assert - Assert.Throws<LeafCoercionException>( - () => type.Serialize(input)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_ValueNode() + public void ValueToLiteral() { // arrange var type = new StringType(); - var input = new StringValueNode("123456"); + const string runtimeValue = "hello world"; // act - var output = type.CoerceInputLiteral(input); + var literal = type.ValueToLiteral(runtimeValue); // assert - Assert.IsType<string>(output); - Assert.Equal("123456", output); + Assert.Equal("hello world", Assert.IsType<StringValueNode>(literal).Value); } [Fact] - public void ParseLiteral_NullValueNode() + public void ValueToLiteral_Null() { // arrange var type = new StringType(); - var input = NullValueNode.Default; // act - var output = type.CoerceInputLiteral(input); + var literal = type.ValueToLiteral(null!); // assert - Assert.Null(output); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void ParseLiteral_Wrong_ValueNode_Throws() + public void ValueToLiteral_Invalid_Format() { // arrange var type = new StringType(); - var input = new IntValueNode(123456); // act - // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputLiteral(input)); - } + void Action() => type.ValueToLiteral(123); - [Fact] - public void ParseLiteral_Null_Throws() - { - // arrange - var type = new StringType(); - - // act // assert - Assert.Throws<ArgumentNullException>(() => type.CoerceInputLiteral(null!)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Wrong_Value_Throws() + public void ParseLiteral() { // arrange var type = new StringType(); - object input = 123456; + var literal = new StringValueNode("hello world"); // act + var runtimeValue = type.CoerceInputLiteral(literal); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputValue(input)); + Assert.Equal("hello world", Assert.IsType<string>(runtimeValue)); } [Fact] - public void ParseValue_Null() + public void ParseLiteral_InvalidValue() { // arrange var type = new StringType(); - object input = null!; // act - object output = type.CoerceInputValue(input); + void Action() => type.CoerceInputLiteral(new IntValueNode(123)); // assert - Assert.IsType<NullValueNode>(output); + Assert.Throws<LeafCoercionException>(Action); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs index 81327aa50e7..456faae9ca8 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs @@ -1,5 +1,7 @@ -using HotChocolate.Language; +using System.Text.Json; using HotChocolate.Execution; +using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types.Descriptors; using System.Reflection; @@ -7,247 +9,350 @@ namespace HotChocolate.Types; public class TimeSpanTypeTests { + [Fact] + public void Ensure_Type_Name_Is_Correct() + { + // arrange + // act + var type = new TimeSpanType(); + + // assert + Assert.Equal("TimeSpan", type.Name); + } + + [Fact] + public void CoerceInputLiteral() + { + // arrange + var type = new TimeSpanType(); + var literal = new StringValueNode("PT5M"); + var expectedTimeSpan = TimeSpan.FromMinutes(5); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(expectedTimeSpan, runtimeValue); + } + [Theory] [InlineData(TimeSpanFormat.Iso8601, "PT5M")] [InlineData(TimeSpanFormat.DotNet, "00:05:00")] - public void Serialize_TimeSpan(TimeSpanFormat format, string expectedValue) + public void CoerceInputLiteral_WithFormat(TimeSpanFormat format, string literalValue) { // arrange - var timeSpanType = new TimeSpanType(format); - var timeSpan = TimeSpan.FromMinutes(5); + var type = new TimeSpanType(format); + var literal = new StringValueNode(literalValue); + var expectedTimeSpan = TimeSpan.FromMinutes(5); // act - var serializedValue = (string?)timeSpanType.Serialize(timeSpan); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Equal(expectedValue, serializedValue); + Assert.Equal(expectedTimeSpan, runtimeValue); } [Theory] [InlineData(TimeSpanFormat.Iso8601, "P10675199DT2H48M5.4775807S")] [InlineData(TimeSpanFormat.DotNet, "10675199.02:48:05.4775807")] - public void Serialize_TimeSpan_Max(TimeSpanFormat format, string expectedValue) + public void CoerceInputLiteral_MaxValue(TimeSpanFormat format, string literalValue) { // arrange - var timeSpanType = new TimeSpanType(format); - var timeSpan = TimeSpan.MaxValue; + var type = new TimeSpanType(format); + var literal = new StringValueNode(literalValue); // act - var serializedValue = (string?)timeSpanType.Serialize(timeSpan); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Equal(expectedValue, serializedValue); + Assert.Equal(TimeSpan.MaxValue, runtimeValue); } [Theory] [InlineData(TimeSpanFormat.Iso8601, "-P10675199DT2H48M5.4775808S")] [InlineData(TimeSpanFormat.DotNet, "-10675199.02:48:05.4775808")] - public void Serialize_TimeSpan_Min(TimeSpanFormat format, string expectedValue) + public void CoerceInputLiteral_MinValue(TimeSpanFormat format, string literalValue) + { + // arrange + var type = new TimeSpanType(format); + var literal = new StringValueNode(literalValue); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(TimeSpan.MinValue, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_Weeks() + { + // arrange + var type = new TimeSpanType(); + var literal = new StringValueNode("P2M2W5D"); + var expectedTimeSpan = TimeSpan.FromDays(79); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(expectedTimeSpan, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_Null() { // arrange - var timeSpanType = new TimeSpanType(format); - var timeSpan = TimeSpan.MinValue; + var type = new TimeSpanType(); + var literal = NullValueNode.Default; // act - var serializedValue = (string?)timeSpanType.Serialize(timeSpan); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Equal(expectedValue, serializedValue); + Assert.Null(runtimeValue); } [Fact] - public void Serialize_TimeSpan_DefaultFormat() + public void CoerceInputLiteral_Invalid_Format() { // arrange - var timeSpanType = new TimeSpanType(); - var timeSpan = TimeSpan.FromMinutes(5); - const string expectedValue = "PT5M"; + var type = new TimeSpanType(); + var literal = new StringValueNode("bad"); // act - var serializedValue = (string?)timeSpanType.Serialize(timeSpan); + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.Equal(expectedValue, serializedValue); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Serialize_Null() + public void CoerceInputLiteral_CannotEndWithDigits() { // arrange - var timeSpanType = new TimeSpanType(); + var type = new TimeSpanType(); + var literal = new StringValueNode("PT5"); // act - var serializedValue = timeSpanType.Serialize(null); + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.Null(serializedValue); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Serialize_String_Exception() + public void CoerceInputValue() { // arrange - var timeSpanType = new TimeSpanType(); + var type = new TimeSpanType(); + var inputValue = JsonDocument.Parse("\"PT5M\"").RootElement; + var expectedTimeSpan = TimeSpan.FromMinutes(5); // act - Action a = () => timeSpanType.Serialize("bad"); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Throws<LeafCoercionException>(a); + Assert.Equal(expectedTimeSpan, runtimeValue); } [Theory] [InlineData(TimeSpanFormat.Iso8601, "PT5M")] [InlineData(TimeSpanFormat.DotNet, "00:05:00")] - public void ParseLiteral_StringValueNode(TimeSpanFormat format, string literalValue) + public void CoerceInputValue_WithFormat(TimeSpanFormat format, string value) { // arrange - var timeSpanType = new TimeSpanType(format); - var literal = new StringValueNode(literalValue); + var type = new TimeSpanType(format); + var inputValue = JsonDocument.Parse($"\"{value}\"").RootElement; var expectedTimeSpan = TimeSpan.FromMinutes(5); // act - var timeSpan = (TimeSpan?)timeSpanType - .CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Equal(expectedTimeSpan, timeSpan); + Assert.Equal(expectedTimeSpan, runtimeValue); + } + + [Fact] + public void CoerceInputValue_Invalid_Format() + { + // arrange + var type = new TimeSpanType(); + var inputValue = JsonDocument.Parse("\"bad\"").RootElement; + + // act + void Action() => type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceOutputValue() + { + // arrange + var type = new TimeSpanType(); + var runtimeValue = TimeSpan.FromMinutes(5); + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); + + // assert + resultValue.MatchSnapshot(); } [Theory] - [InlineData(TimeSpanFormat.Iso8601, "PT5M")] - [InlineData(TimeSpanFormat.DotNet, "00:05:00")] - public void Deserialize_TimeSpan(TimeSpanFormat format, string actualValue) + [InlineData(TimeSpanFormat.Iso8601)] + [InlineData(TimeSpanFormat.DotNet)] + public void CoerceOutputValue_WithFormat(TimeSpanFormat format) { // arrange - var timeSpanType = new TimeSpanType(format); - var timeSpan = TimeSpan.FromMinutes(5); + var type = new TimeSpanType(format); + var runtimeValue = TimeSpan.FromMinutes(5); // act - var deserializedValue = (TimeSpan?)timeSpanType - .Deserialize(actualValue); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); // assert - Assert.Equal(timeSpan, deserializedValue); + resultValue.MatchSnapshot(postFix: format.ToString()); } [Fact] - public void Deserialize_TimeSpan_Weeks() + public void CoerceOutputValue_Invalid_Format() { // arrange - var timeSpanType = new TimeSpanType(); - var timeSpan = TimeSpan.FromDays(79); + var type = new TimeSpanType(); // act - var deserializedValue = (TimeSpan?)timeSpanType - .Deserialize("P2M2W5D"); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("bad", resultValue); // assert - Assert.Equal(timeSpan, deserializedValue); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_TimeSpan_CannotEndWithDigits() + public void ValueToLiteral() + { + // arrange + var type = new TimeSpanType(); + var runtimeValue = TimeSpan.FromMinutes(5); + + // act + var literal = type.ValueToLiteral(runtimeValue); + + // assert + Assert.Equal("PT5M", Assert.IsType<StringValueNode>(literal).Value); + } + + [Theory] + [InlineData(TimeSpanFormat.Iso8601, "PT5M")] + [InlineData(TimeSpanFormat.DotNet, "00:05:00")] + public void ValueToLiteral_WithFormat(TimeSpanFormat format, string expectedValue) { // arrange - var timeSpanType = new TimeSpanType(); + var type = new TimeSpanType(format); + var runtimeValue = TimeSpan.FromMinutes(5); // act - var success = timeSpanType - .TryDeserialize("PT5", out _); + var literal = type.ValueToLiteral(runtimeValue); // assert - Assert.False(success); + Assert.Equal(expectedValue, Assert.IsType<StringValueNode>(literal).Value); } [Theory] [InlineData(TimeSpanFormat.Iso8601, "P10675199DT2H48M5.4775807S")] [InlineData(TimeSpanFormat.DotNet, "10675199.02:48:05.4775807")] - public void Deserialize_TimeSpan_Max(TimeSpanFormat format, string actualValue) + public void ValueToLiteral_MaxValue(TimeSpanFormat format, string expectedValue) { // arrange - var timeSpanType = new TimeSpanType(format); - var timeSpan = TimeSpan.MaxValue; + var type = new TimeSpanType(format); + var runtimeValue = TimeSpan.MaxValue; // act - var deserializedValue = (TimeSpan?)timeSpanType - .Deserialize(actualValue); + var literal = type.ValueToLiteral(runtimeValue); // assert - Assert.Equal(timeSpan, deserializedValue); + Assert.Equal(expectedValue, Assert.IsType<StringValueNode>(literal).Value); } [Theory] [InlineData(TimeSpanFormat.Iso8601, "-P10675199DT2H48M5.4775808S")] [InlineData(TimeSpanFormat.DotNet, "-10675199.02:48:05.4775808")] - public void Deserialize_TimeSpan_Min(TimeSpanFormat format, string actualValue) + public void ValueToLiteral_MinValue(TimeSpanFormat format, string expectedValue) { // arrange - var timeSpanType = new TimeSpanType(format); - var timeSpan = TimeSpan.MinValue; + var type = new TimeSpanType(format); + var runtimeValue = TimeSpan.MinValue; // act - var deserializedValue = (TimeSpan?)timeSpanType - .Deserialize(actualValue); + var literal = type.ValueToLiteral(runtimeValue); // assert - Assert.Equal(timeSpan, deserializedValue); + Assert.Equal(expectedValue, Assert.IsType<StringValueNode>(literal).Value); } [Fact] - public void Deserialize_InvalidString() + public void ValueToLiteral_Null() { // arrange - var timeSpanType = new TimeSpanType(); + var type = new TimeSpanType(); // act - var success = timeSpanType - .TryDeserialize("bad", out _); + var literal = type.ValueToLiteral(null!); // assert - Assert.False(success); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void Deserialize_Null_To_Null() + public void ValueToLiteral_Invalid_Format() { // arrange - var timeSpanType = new TimeSpanType(); + var type = new TimeSpanType(); // act - var success = timeSpanType - .TryDeserialize(null, out var deserialized); + void Action() => type.ValueToLiteral("foo"); // assert - Assert.True(success); - Assert.Null(deserialized); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_NullValueNode() + public void ParseLiteral() { // arrange - var timeSpanType = new TimeSpanType(); - var literal = NullValueNode.Default; + var type = new TimeSpanType(); + var literal = new StringValueNode("PT5M"); + var expectedTimeSpan = TimeSpan.FromMinutes(5); // act - var value = timeSpanType.CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Null(value); + Assert.Equal(expectedTimeSpan, Assert.IsType<TimeSpan>(runtimeValue)); } [Fact] - public void ParseValue_Null() + public void ParseLiteral_InvalidValue() { // arrange - var timeSpanType = new TimeSpanType(); + var type = new TimeSpanType(); // act - var literal = timeSpanType.CoerceInputValue(null); + void Action() => type.CoerceInputLiteral(new IntValueNode(123)); // assert - Assert.IsType<NullValueNode>(literal); + Assert.Throws<LeafCoercionException>(Action); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs new file mode 100644 index 00000000000..5da8f8b5344 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs @@ -0,0 +1,245 @@ +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; + +namespace HotChocolate.Types; + +public class UnsignedIntTypeTests +{ + [Fact] + public void Ensure_Type_Name_Is_Correct() + { + // arrange + // act + var type = new UnsignedIntType(); + + // assert + Assert.Equal("UnsignedInt", type.Name); + } + + [Fact] + public void CoerceInputLiteral() + { + // arrange + var type = new UnsignedIntType(); + var literal = new IntValueNode(42); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal((uint)42, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_MaxValue() + { + // arrange + var type = new UnsignedIntType(); + var literal = new IntValueNode(uint.MaxValue); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(uint.MaxValue, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_MinValue() + { + // arrange + var type = new UnsignedIntType(); + var literal = new IntValueNode(uint.MinValue); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(uint.MinValue, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_Null() + { + // arrange + var type = new UnsignedIntType(); + var literal = NullValueNode.Default; + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Null(runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_Invalid_Format() + { + // arrange + var type = new UnsignedIntType(); + var literal = new StringValueNode("foo"); + + // act + void Action() => type.CoerceInputLiteral(literal); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceInputValue() + { + // arrange + var type = new UnsignedIntType(); + var inputValue = JsonDocument.Parse("42").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal((uint)42, runtimeValue); + } + + [Fact] + public void CoerceInputValue_MaxValue() + { + // arrange + var type = new UnsignedIntType(); + var inputValue = JsonDocument.Parse($"{uint.MaxValue}").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal(uint.MaxValue, runtimeValue); + } + + [Fact] + public void CoerceInputValue_MinValue() + { + // arrange + var type = new UnsignedIntType(); + var inputValue = JsonDocument.Parse($"{uint.MinValue}").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal(uint.MinValue, runtimeValue); + } + + [Fact] + public void CoerceInputValue_Invalid_Format() + { + // arrange + var type = new UnsignedIntType(); + var inputValue = JsonDocument.Parse("\"foo\"").RootElement; + + // act + void Action() => type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceOutputValue() + { + // arrange + var type = new UnsignedIntType(); + const uint runtimeValue = 42; + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); + + // assert + resultValue.MatchSnapshot(); + } + + [Fact] + public void CoerceOutputValue_Invalid_Format() + { + // arrange + var type = new UnsignedIntType(); + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void ValueToLiteral() + { + // arrange + var type = new UnsignedIntType(); + const uint runtimeValue = 42; + + // act + var literal = type.ValueToLiteral(runtimeValue); + + // assert + Assert.Equal(42, Assert.IsType<IntValueNode>(literal).ToInt32()); + } + + [Fact] + public void ValueToLiteral_Null() + { + // arrange + var type = new UnsignedIntType(); + + // act + var literal = type.ValueToLiteral(null!); + + // assert + Assert.IsType<NullValueNode>(literal); + } + + [Fact] + public void ValueToLiteral_Invalid_Format() + { + // arrange + var type = new UnsignedIntType(); + + // act + void Action() => type.ValueToLiteral("foo"); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void ParseLiteral() + { + // arrange + var type = new UnsignedIntType(); + var literal = new IntValueNode(42); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal((uint)42, Assert.IsType<uint>(runtimeValue)); + } + + [Fact] + public void ParseLiteral_InvalidValue() + { + // arrange + var type = new UnsignedIntType(); + + // act + void Action() => type.CoerceInputLiteral(new FloatValueNode(1.5)); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } +} diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs new file mode 100644 index 00000000000..9da391ef96e --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs @@ -0,0 +1,245 @@ +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; + +namespace HotChocolate.Types; + +public class UnsignedLongTypeTests +{ + [Fact] + public void Ensure_Type_Name_Is_Correct() + { + // arrange + // act + var type = new UnsignedLongType(); + + // assert + Assert.Equal("UnsignedLong", type.Name); + } + + [Fact] + public void CoerceInputLiteral() + { + // arrange + var type = new UnsignedLongType(); + var literal = new IntValueNode(42UL); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal((ulong)42, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_MaxValue() + { + // arrange + var type = new UnsignedLongType(); + var literal = new IntValueNode(ulong.MaxValue); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(ulong.MaxValue, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_MinValue() + { + // arrange + var type = new UnsignedLongType(); + var literal = new IntValueNode(ulong.MinValue); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(ulong.MinValue, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_Null() + { + // arrange + var type = new UnsignedLongType(); + var literal = NullValueNode.Default; + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Null(runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_Invalid_Format() + { + // arrange + var type = new UnsignedLongType(); + var literal = new StringValueNode("foo"); + + // act + void Action() => type.CoerceInputLiteral(literal); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceInputValue() + { + // arrange + var type = new UnsignedLongType(); + var inputValue = JsonDocument.Parse("42").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal((ulong)42, runtimeValue); + } + + [Fact] + public void CoerceInputValue_MaxValue() + { + // arrange + var type = new UnsignedLongType(); + var inputValue = JsonDocument.Parse($"{ulong.MaxValue}").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal(ulong.MaxValue, runtimeValue); + } + + [Fact] + public void CoerceInputValue_MinValue() + { + // arrange + var type = new UnsignedLongType(); + var inputValue = JsonDocument.Parse($"{ulong.MinValue}").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal(ulong.MinValue, runtimeValue); + } + + [Fact] + public void CoerceInputValue_Invalid_Format() + { + // arrange + var type = new UnsignedLongType(); + var inputValue = JsonDocument.Parse("\"foo\"").RootElement; + + // act + void Action() => type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceOutputValue() + { + // arrange + var type = new UnsignedLongType(); + const ulong runtimeValue = 42; + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); + + // assert + resultValue.MatchSnapshot(); + } + + [Fact] + public void CoerceOutputValue_Invalid_Format() + { + // arrange + var type = new UnsignedLongType(); + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void ValueToLiteral() + { + // arrange + var type = new UnsignedLongType(); + const ulong runtimeValue = 42; + + // act + var literal = type.ValueToLiteral(runtimeValue); + + // assert + Assert.Equal(42UL, Assert.IsType<IntValueNode>(literal).ToUInt64()); + } + + [Fact] + public void ValueToLiteral_Null() + { + // arrange + var type = new UnsignedLongType(); + + // act + var literal = type.ValueToLiteral(null!); + + // assert + Assert.IsType<NullValueNode>(literal); + } + + [Fact] + public void ValueToLiteral_Invalid_Format() + { + // arrange + var type = new UnsignedLongType(); + + // act + void Action() => type.ValueToLiteral("foo"); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void ParseLiteral() + { + // arrange + var type = new UnsignedLongType(); + var literal = new IntValueNode(42UL); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal((ulong)42, Assert.IsType<ulong>(runtimeValue)); + } + + [Fact] + public void ParseLiteral_InvalidValue() + { + // arrange + var type = new UnsignedLongType(); + + // act + void Action() => type.CoerceInputLiteral(new FloatValueNode(1.5)); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } +} diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs new file mode 100644 index 00000000000..0128fa4d725 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs @@ -0,0 +1,245 @@ +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; + +namespace HotChocolate.Types; + +public class UnsignedShortTypeTests +{ + [Fact] + public void Ensure_Type_Name_Is_Correct() + { + // arrange + // act + var type = new UnsignedShortType(); + + // assert + Assert.Equal("UnsignedShort", type.Name); + } + + [Fact] + public void CoerceInputLiteral() + { + // arrange + var type = new UnsignedShortType(); + var literal = new IntValueNode(42); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal((ushort)42, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_MaxValue() + { + // arrange + var type = new UnsignedShortType(); + var literal = new IntValueNode(ushort.MaxValue); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(ushort.MaxValue, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_MinValue() + { + // arrange + var type = new UnsignedShortType(); + var literal = new IntValueNode(ushort.MinValue); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(ushort.MinValue, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_Null() + { + // arrange + var type = new UnsignedShortType(); + var literal = NullValueNode.Default; + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Null(runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_Invalid_Format() + { + // arrange + var type = new UnsignedShortType(); + var literal = new StringValueNode("foo"); + + // act + void Action() => type.CoerceInputLiteral(literal); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceInputValue() + { + // arrange + var type = new UnsignedShortType(); + var inputValue = JsonDocument.Parse("42").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal((ushort)42, runtimeValue); + } + + [Fact] + public void CoerceInputValue_MaxValue() + { + // arrange + var type = new UnsignedShortType(); + var inputValue = JsonDocument.Parse($"{ushort.MaxValue}").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal(ushort.MaxValue, runtimeValue); + } + + [Fact] + public void CoerceInputValue_MinValue() + { + // arrange + var type = new UnsignedShortType(); + var inputValue = JsonDocument.Parse($"{ushort.MinValue}").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Equal(ushort.MinValue, runtimeValue); + } + + [Fact] + public void CoerceInputValue_Invalid_Format() + { + // arrange + var type = new UnsignedShortType(); + var inputValue = JsonDocument.Parse("\"foo\"").RootElement; + + // act + void Action() => type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceOutputValue() + { + // arrange + var type = new UnsignedShortType(); + const ushort runtimeValue = 42; + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); + + // assert + resultValue.MatchSnapshot(); + } + + [Fact] + public void CoerceOutputValue_Invalid_Format() + { + // arrange + var type = new UnsignedShortType(); + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue("foo", resultValue); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void ValueToLiteral() + { + // arrange + var type = new UnsignedShortType(); + const ushort runtimeValue = 42; + + // act + var literal = type.ValueToLiteral(runtimeValue); + + // assert + Assert.Equal(42, Assert.IsType<IntValueNode>(literal).ToInt32()); + } + + [Fact] + public void ValueToLiteral_Null() + { + // arrange + var type = new UnsignedShortType(); + + // act + var literal = type.ValueToLiteral(null!); + + // assert + Assert.IsType<NullValueNode>(literal); + } + + [Fact] + public void ValueToLiteral_Invalid_Format() + { + // arrange + var type = new UnsignedShortType(); + + // act + void Action() => type.ValueToLiteral("foo"); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void ParseLiteral() + { + // arrange + var type = new UnsignedShortType(); + var literal = new IntValueNode(42); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal((ushort)42, Assert.IsType<ushort>(runtimeValue)); + } + + [Fact] + public void ParseLiteral_InvalidValue() + { + // arrange + var type = new UnsignedShortType(); + + // act + void Action() => type.CoerceInputLiteral(new FloatValueNode(1.5)); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } +} diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UploadTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UploadTypeTests.cs deleted file mode 100644 index 4b7496e803a..00000000000 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UploadTypeTests.cs +++ /dev/null @@ -1,26 +0,0 @@ -using HotChocolate.Language; -using Moq; - -namespace HotChocolate.Types; - -public class UploadTypeTests -{ - [Fact] - public void FileValueNode_Format() - { - // arrange - var file = new Mock<IFile>(); - file.Setup(t => t.Name).Returns("abc.json"); - - var objectValue = new ObjectValueNode( - new ObjectFieldNode( - "abc", - new FileValueNode(file.Object))); - - // act & assert - objectValue.MatchInlineSnapshot( - """ - { abc: "abc.json" } - """); - } -} diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs index 5774f5b2961..858f0d36eb8 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs @@ -1,9 +1,22 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class UrlTypeTests { + [Fact] + public void Ensure_Type_Name_Is_Correct() + { + // arrange + // act + var type = new UrlType(); + + // assert + Assert.Equal("URL", type.Name); + } + [Fact] public void EnsureUrlTypeKindIsCorrect() { @@ -16,200 +29,321 @@ public void EnsureUrlTypeKindIsCorrect() } [Fact] - public void ParseLiteral_StringValueNode() + public void CoerceInputLiteral() { // arrange - var urlType = new UrlType(); + var type = new UrlType(); var expected = new Uri("http://domain.test/url"); var literal = new StringValueNode(expected.AbsoluteUri); // act - var actual = (Uri?)urlType.CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Equal(expected, actual); + Assert.Equal(expected, runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_RelativeUrl() + { + // arrange + var type = new UrlType(); + var expected = new Uri("/relative/path", UriKind.Relative); + var literal = new StringValueNode(expected.ToString()); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // Assert + Assert.Equal(expected, runtimeValue); } [Fact] - public void ParseLiteral_NullValueNode() + public void CoerceInputLiteral_Null() { // arrange - var urlType = new UrlType(); + var type = new UrlType(); var literal = NullValueNode.Default; // act - var value = urlType.CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Null(runtimeValue); + } + + [Fact] + public void CoerceInputLiteral_Invalid_Format() + { + // arrange + var type = new UrlType(); + var literal = new StringValueNode("$*^domain.test"); + + // act + void Action() => type.CoerceInputLiteral(literal); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceInputValue() + { + // arrange + var type = new UrlType(); + var expected = new Uri("http://domain.test/url"); + var inputValue = JsonDocument.Parse($"\"{expected.AbsoluteUri}\"").RootElement; + + // act + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Null(value); + Assert.Equal(expected, runtimeValue); } [Fact] - public void ParseLiteral_RelativeUrl() + public void CoerceInputValue_RelativeUrl() { // arrange - var urlType = new UrlType(); + var type = new UrlType(); var expected = new Uri("/relative/path", UriKind.Relative); - var literal = new StringValueNode($"{expected}"); + var inputValue = JsonDocument.Parse($"\"{expected}\"").RootElement; // act - var actual = (Uri?)urlType.CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // Assert - Assert.Equal(expected, actual); + Assert.Equal(expected, runtimeValue); + } + + [Fact] + public void CoerceInputValue_Invalid_Format() + { + // arrange + var type = new UrlType(); + var inputValue = JsonDocument.Parse("\"$*^domain.test\"").RootElement; + + // act + void Action() => type.CoerceInputValue(inputValue, null!); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void CoerceOutputValue() + { + // arrange + var type = new UrlType(); + var uri = new Uri("http://domain.test/url"); + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(uri, resultValue); + + // assert + resultValue.MatchSnapshot(); + } + + [Fact] + public void CoerceOutputValue_RelativeUrl() + { + // arrange + var type = new UrlType(); + var uri = new Uri("/relative/path", UriKind.Relative); + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(uri, resultValue); + + // assert + resultValue.MatchSnapshot(); } [Fact] - public void ParseLiteral_Invalid_Url_Throws() + public void CoerceOutputValue_Invalid_Format() { // arrange var type = new UrlType(); - var input = new StringValueNode("$*^domain.test"); + const int value = 123; // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(value, resultValue); + // assert - Assert.Throws<LeafCoercionException>( - () => type.CoerceInputLiteral(input)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Url() + public void ValueToLiteral() { // arrange - var urlType = new UrlType(); + var type = new UrlType(); var uri = new Uri("http://domain.test/url"); var expectedLiteralValue = uri.AbsoluteUri; // act - var stringLiteral = - (StringValueNode)urlType.ParseValue(uri); + var literal = type.ValueToLiteral(uri); // assert - Assert.Equal(expectedLiteralValue, stringLiteral.Value); + Assert.Equal(expectedLiteralValue, Assert.IsType<StringValueNode>(literal).Value); } [Fact] - public void ParseValue_Encoded() + public void ValueToLiteral_Encoded() { // arrange - var urlType = new UrlType(); + var type = new UrlType(); var uri = new Uri("http://domain.test/ä+😄?q=a/α"); var expectedLiteralValue = uri.AbsoluteUri; // act - var stringLiteral = - (StringValueNode)urlType.ParseValue(uri); + var literal = type.ValueToLiteral(uri); // assert - Assert.Equal(expectedLiteralValue, stringLiteral.Value); + Assert.Equal(expectedLiteralValue, Assert.IsType<StringValueNode>(literal).Value); } [Fact] - public void Serialize_Null() + public void ValueToLiteral_RelativeUrl() { // arrange - var dateType = new UrlType(); + var type = new UrlType(); + var uri = new Uri("/relative/path", UriKind.Relative); // act - var serializedValue = dateType.Serialize(null); + var literal = type.ValueToLiteral(uri); // assert - Assert.Null(serializedValue); + Assert.Equal(uri.ToString(), Assert.IsType<StringValueNode>(literal).Value); } [Fact] - public void Serialize_Url() + public void ValueToLiteral_Null() { // arrange - var urlType = new UrlType(); - var uri = new Uri("http://domain.test/url"); + var type = new UrlType(); // act - var serializedValue = urlType.Serialize(uri); + var literal = type.ValueToLiteral(null!); // assert - Assert.Equal(uri.AbsoluteUri, Assert.IsType<string>(serializedValue)); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void Serialize_RelativeUrl() + public void ValueToLiteral_Invalid_Format() { // arrange - var urlType = new UrlType(); - var uri = new Uri("/relative/path", UriKind.Relative); + var type = new UrlType(); + const int value = 123; + + // act + void Action() => type.ValueToLiteral(value); + + // assert + Assert.Throws<LeafCoercionException>(Action); + } + + [Fact] + public void ParseLiteral() + { + // arrange + var type = new UrlType(); + var expected = new Uri("http://domain.test/url"); + var literal = new StringValueNode(expected.AbsoluteUri); + + // act + var runtimeValue = type.CoerceInputLiteral(literal); + + // assert + Assert.Equal(expected, Assert.IsType<Uri>(runtimeValue)); + } + + [Fact] + public void ParseLiteral_InvalidValue() + { + // arrange + var type = new UrlType(); // act - var serializedValue = urlType.Serialize(uri); + void Action() => type.CoerceInputLiteral(new IntValueNode(123)); // assert - Assert.Equal(uri.ToString(), Assert.IsType<string>(serializedValue)); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void IsInstanceOfType_GivenUriAsStringValueNode_ReturnsTrue() + public void IsValueCompatible_Uri_ReturnsTrue() { // Arrange - var urlType = new UrlType(); + var type = new UrlType(); var uri = new Uri("http://domain.test/url"); // Act - var isUrlType = urlType.IsValueCompatible(new StringValueNode(uri.AbsoluteUri)); + var isCompatible = type.IsValueCompatible(new StringValueNode(uri.AbsoluteUri)); // Assert - Assert.True(isUrlType); + Assert.True(isCompatible); } [Fact] - public void IsInstanceOfType_GivenNullValueNode_ReturnsTrue() + public void IsValueCompatible_NullValueNode_ReturnsTrue() { // arrange - var urlType = new UrlType(); + var type = new UrlType(); // act - var isUrlType = urlType.IsValueCompatible(new NullValueNode(null)); + var isCompatible = type.IsValueCompatible(new NullValueNode(null)); // assert - Assert.True(isUrlType); + Assert.True(isCompatible); } [Fact] - public void IsInstanceOfType_GivenInvalidUriAsStringLiteral_False() + public void IsValueCompatible_InvalidUri_ReturnsFalse() { // arrange - var urlType = new UrlType(); + var type = new UrlType(); // act - var isUrlType = urlType.IsValueCompatible( - new StringValueNode("$*^domain.test")); + var isCompatible = type.IsValueCompatible(new StringValueNode("$*^domain.test")); // assert - Assert.False(isUrlType); + Assert.False(isCompatible); } [Fact] - public void IsInstanceOfType_GivenNull_ThrowsArgumentException() + public void IsValueCompatible_Null_ThrowsArgumentException() { // arrange - var urlType = new UrlType(); + var type = new UrlType(); // act - Action action = () => urlType.IsValueCompatible(null!); + void Action() => type.IsValueCompatible(null!); // assert - Assert.Throws<ArgumentNullException>(action); + Assert.Throws<ArgumentNullException>(Action); } [Fact] - public void IsInstanceOfType_GivenNonUrlValueNode_ReturnsFalse() + public void IsValueCompatible_IntValueNode_ReturnsFalse() { // arrange - var urlType = new UrlType(); + var type = new UrlType(); var intValue = new IntValueNode(1); // act - var isUrlType = urlType.IsValueCompatible(intValue); + var isCompatible = type.IsValueCompatible(intValue); // assert - Assert.False(isUrlType); + Assert.False(isCompatible); } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs index 79dc5140c63..61d7a69a9cb 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs @@ -1,363 +1,345 @@ +using System.Text.Json; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types; public class UuidTypeTests { [Fact] - public void IsInstanceOfType_StringLiteral() + public void Ensure_Type_Name_Is_Correct() { // arrange - var uuidType = new UuidType(); - var guid = Guid.NewGuid(); - // act - var isOfType = uuidType.IsInstanceOfType(guid); + var type = new UuidType(); // assert - Assert.True(isOfType); + Assert.Equal("UUID", type.Name); } [Fact] - public void IsInstanceOfType_NullLiteral() + public void IsValueCompatible_StringLiteral() { // arrange - var uuidType = new UuidType(); - var literal = new NullValueNode(null); + var type = new UuidType(); + var guid = Guid.NewGuid(); + var literal = new StringValueNode(guid.ToString("D")); // act - var isOfType = uuidType.IsValueCompatible(literal); + var isCompatible = type.IsValueCompatible(literal); // assert - Assert.True(isOfType); + Assert.True(isCompatible); } [Fact] - public void IsInstanceOfType_IntLiteral() + public void IsValueCompatible_NullLiteral() { // arrange - var uuidType = new UuidType(); - var literal = new IntValueNode(123); + var type = new UuidType(); + var literal = new NullValueNode(null); // act - var isOfType = uuidType.IsValueCompatible(literal); + var isCompatible = type.IsValueCompatible(literal); // assert - Assert.False(isOfType); + Assert.True(isCompatible); } [Fact] - public void IsInstanceOfType_Null() + public void IsValueCompatible_IntLiteral() { // arrange - var uuidType = new UuidType(); + var type = new UuidType(); + var literal = new IntValueNode(123); // act - void Action() => uuidType.IsValueCompatible(null!); + var isCompatible = type.IsValueCompatible(literal); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.False(isCompatible); } [Fact] - public void Serialize_Guid() + public void IsValueCompatible_Null() { // arrange - var uuidType = new UuidType(); - var guid = Guid.NewGuid(); + var type = new UuidType(); // act - var serializedValue = uuidType.Serialize(guid); + void Action() => type.IsValueCompatible(null!); // assert - Assert.Equal(guid.ToString("D"), Assert.IsType<string>(serializedValue)); + Assert.Throws<ArgumentNullException>(Action); } [Fact] - public void Serialize_Null() + public void CoerceInputLiteral() { // arrange - var uuidType = new UuidType(); + var type = new UuidType(); + var expected = Guid.NewGuid(); + var literal = new StringValueNode(expected.ToString("D")); // act - var serializedValue = uuidType.Serialize(null); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Null(serializedValue); + Assert.Equal(expected, runtimeValue); } [Fact] - public void Serialize_Int() + public void CoerceInputLiteral_MultipleFormats() { // arrange - var uuidType = new UuidType(); - const int value = 123; + var type = new UuidType(); + var expected = Guid.NewGuid(); + var literalN = new StringValueNode(expected.ToString("N")); + var literalP = new StringValueNode(expected.ToString("P")); // act - void Action() => uuidType.Serialize(value); + var runtimeValueN = (Guid)type.CoerceInputLiteral(literalN)!; + var runtimeValueP = (Guid)type.CoerceInputLiteral(literalP)!; // assert - Assert.Throws<LeafCoercionException>(Action); + Assert.Equal(expected, runtimeValueN); + Assert.Equal(expected, runtimeValueP); } [Fact] - public void Deserialize_Null() + public void CoerceInputLiteral_EnforceFormat() { // arrange - var uuidType = new UuidType(); + var type = new UuidType(defaultFormat: 'P', enforceFormat: true); + var expected = Guid.NewGuid(); + var literal = new StringValueNode(expected.ToString("N")); // act - var success = uuidType.TryDeserialize(null, out var o); + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.True(success); - Assert.Null(o); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_String() + public void CoerceInputLiteral_Null() { // arrange - var uuidType = new UuidType(); - var guid = Guid.NewGuid(); + var type = new UuidType(); + var literal = NullValueNode.Default; // act - var success = uuidType.TryDeserialize(guid.ToString("N"), out var o); + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.True(success); - Assert.Equal(guid, o); + Assert.Null(runtimeValue); } [Fact] - public void Deserialize_Guid() + public void CoerceInputLiteral_Invalid_Format() { // arrange - var uuidType = new UuidType(); - var guid = Guid.NewGuid(); + var type = new UuidType(); + var literal = new IntValueNode(123); // act - var success = uuidType.TryDeserialize(guid, out var o); + void Action() => type.CoerceInputLiteral(literal); // assert - Assert.True(success); - Assert.Equal(guid, o); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void Deserialize_Int() + public void CoerceInputLiteral_Invalid_Null() { // arrange - var uuidType = new UuidType(); - const int value = 123; + var type = new UuidType(); // act - var success = uuidType.TryDeserialize(value, out _); + void Action() => type.CoerceInputLiteral(null!); // assert - Assert.False(success); + Assert.Throws<ArgumentNullException>(Action); } [Fact] - public void ParseLiteral_StringValueNode() + public void CoerceInputValue() { // arrange - var uuidType = new UuidType(); - var expected = Guid.NewGuid(); - var literalA = new StringValueNode(expected.ToString("N")); - var literalB = new StringValueNode(expected.ToString("P")); + var type = new UuidType(); + var guid = Guid.NewGuid(); + var inputValue = JsonDocument.Parse($"\"{guid:D}\"").RootElement; // act - var runtimeValueA = (Guid)uuidType.CoerceInputLiteral(literalA)!; - var runtimeValueB = (Guid)uuidType.CoerceInputLiteral(literalB)!; + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Equal(expected, runtimeValueA); - Assert.Equal(expected, runtimeValueB); + Assert.Equal(guid, runtimeValue); } - [Fact] - public void ParseLiteral_StringValueNode_Enforce_Format() + [Theory] + [InlineData('N')] + [InlineData('D')] + [InlineData('B')] + [InlineData('P')] + public void CoerceInputValue_WithFormat(char format) { // arrange - var uuidType = new UuidType(defaultFormat: 'P', enforceFormat: true); - var expected = Guid.NewGuid(); - var literal = new StringValueNode(expected.ToString("N")); + var type = new UuidType(defaultFormat: format); + var guid = Guid.Empty; + var inputValue = JsonDocument.Parse($"\"{guid.ToString(format.ToString())}\"").RootElement; // act - void Action() => uuidType.CoerceInputLiteral(literal); + var runtimeValue = type.CoerceInputValue(inputValue, null!); // assert - Assert.Throws<LeafCoercionException>(Action); + Assert.Equal(guid, runtimeValue); } [Fact] - public void ParseLiteral_IntValueNode() + public void CoerceInputValue_Invalid_Format() { // arrange - var uuidType = new UuidType(); - var literal = new IntValueNode(123); + var type = new UuidType(); + var inputValue = JsonDocument.Parse("\"invalid\"").RootElement; // act - void Action() => uuidType.CoerceInputLiteral(literal); + void Action() => type.CoerceInputValue(inputValue, null!); // assert Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseLiteral_NullValueNode() + public void CoerceOutputValue() { // arrange - var uuidType = new UuidType(); - var literal = NullValueNode.Default; + var type = new UuidType(); + var guid = Guid.NewGuid(); // act - var value = uuidType.CoerceInputLiteral(literal); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(guid, resultValue); // assert - Assert.Null(value); + resultValue.MatchSnapshot(); } [Fact] - public void ParseLiteral_Null() + public void CoerceOutputValue_Invalid_Format() { // arrange - var uuidType = new UuidType(); + var type = new UuidType(); + const int value = 123; // act - void Action() => uuidType.CoerceInputLiteral(null!); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + void Action() => type.CoerceOutputValue(value, resultValue); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] - public void ParseValue_Guid() + public void ValueToLiteral() { // arrange - var uuidType = new UuidType(); - var expected = Guid.NewGuid(); - var expectedLiteralValue = expected.ToString("D"); + var type = new UuidType(); + var guid = Guid.NewGuid(); + var expectedLiteralValue = guid.ToString("D"); // act - var stringLiteral = (StringValueNode)uuidType.ParseValue(expected); + var literal = type.ValueToLiteral(guid); // assert - Assert.Equal(expectedLiteralValue, stringLiteral.Value); + Assert.Equal(expectedLiteralValue, Assert.IsType<StringValueNode>(literal).Value); } - [Fact] - public void ParseValue_Null() + [Theory] + [InlineData('N')] + [InlineData('D')] + [InlineData('B')] + [InlineData('P')] + public void ValueToLiteral_WithFormat(char format) { // arrange - var uuidType = new UuidType(); - Guid? guid = null; + var type = new UuidType(defaultFormat: format); + var guid = Guid.Empty; // act - var stringLiteral = uuidType.CoerceInputValue(guid); + var literal = type.ValueToLiteral(guid); // assert - Assert.True(stringLiteral is NullValueNode); - Assert.Null(((NullValueNode)stringLiteral).Value); + Assert.Equal(guid.ToString(format.ToString()), Assert.IsType<StringValueNode>(literal).Value); } [Fact] - public void ParseValue_Int() + public void ValueToLiteral_Null() { // arrange - var uuidType = new UuidType(); - const int value = 123; + var type = new UuidType(); // act - void Action() => uuidType.CoerceInputValue(value); + var literal = type.ValueToLiteral(null!); // assert - Assert.Throws<LeafCoercionException>(Action); + Assert.IsType<NullValueNode>(literal); } [Fact] - public void EnsureDateTypeKindIsCorrect() + public void ValueToLiteral_Invalid_Format() { // arrange var type = new UuidType(); - - // assert - Assert.Equal(TypeKind.Scalar, type.Kind); - } - - [InlineData('N')] - [InlineData('D')] - [InlineData('B')] - [InlineData('P')] - [Theory] - public void Serialize_With_Format(char format) - { - // arrange - var uuidType = new UuidType(defaultFormat: format); - var guid = Guid.Empty; + const int value = 123; // act - var s = (string)uuidType.Serialize(guid)!; + void Action() => type.ValueToLiteral(value); // assert - Assert.Equal(guid.ToString(format.ToString()), s); + Assert.Throws<LeafCoercionException>(Action); } - [InlineData('N')] - [InlineData('D')] - [InlineData('B')] - [InlineData('P')] - [Theory] - public void Deserialize_With_Format(char format) + [Fact] + public void ParseLiteral() { // arrange - var uuidType = new UuidType(defaultFormat: format); - var guid = Guid.Empty; - var serialized = guid.ToString(format.ToString()); + var type = new UuidType(); + var expected = Guid.NewGuid(); + var literal = new StringValueNode(expected.ToString("D")); // act - var deserialized = (Guid)uuidType.Deserialize(serialized)!; + var runtimeValue = type.CoerceInputLiteral(literal); // assert - Assert.Equal(guid, deserialized); + Assert.Equal(expected, Assert.IsType<Guid>(runtimeValue)); } - [InlineData('N')] - [InlineData('D')] - [InlineData('B')] - [InlineData('P')] - [Theory] - public void ParseValue_With_Format(char format) + [Fact] + public void ParseLiteral_InvalidValue() { // arrange - var uuidType = new UuidType(defaultFormat: format); - var guid = Guid.Empty; + var type = new UuidType(); // act - var s = (StringValueNode)uuidType.ParseValue(guid); + void Action() => type.CoerceInputLiteral(new IntValueNode(123)); // assert - Assert.Equal(guid.ToString(format.ToString()), s.Value); + Assert.Throws<LeafCoercionException>(Action); } - [InlineData('N')] - [InlineData('D')] - [InlineData('B')] - [InlineData('P')] - [Theory] - public void ParseLiteral_With_Format(char format) + [Fact] + public void EnsureUuidTypeKindIsCorrect() { // arrange - var uuidType = new UuidType(defaultFormat: format); - var guid = Guid.Empty; - var literal = new StringValueNode(guid.ToString(format.ToString())); - - // act - var deserialized = (Guid)uuidType.CoerceInputLiteral(literal)!; + var type = new UuidType(); // assert - Assert.Equal(guid, deserialized); + Assert.Equal(TypeKind.Scalar, type.Kind); } [Fact] @@ -374,14 +356,14 @@ public void Specify_Invalid_Format() [InlineData(false)] [InlineData(true)] [Theory] - public void Parse_Guid_String_With_Appended_String(bool enforceFormat) + public void CoerceInputLiteral_Guid_String_With_Appended_String(bool enforceFormat) { // arrange var input = new StringValueNode("fbdef721-93c5-4267-8f92-ca27b60aa51f-foobar"); - var uuidType = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); + var type = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); // act - void Fail() => uuidType.CoerceInputLiteral(input); + void Fail() => type.CoerceInputLiteral(input); // assert Assert.Throws<LeafCoercionException>(Fail); @@ -390,14 +372,14 @@ public void Parse_Guid_String_With_Appended_String(bool enforceFormat) [InlineData(false)] [InlineData(true)] [Theory] - public void Parse_Guid_Valid_Input(bool enforceFormat) + public void CoerceInputLiteral_Guid_Valid_Input(bool enforceFormat) { // arrange var input = new StringValueNode("fbdef721-93c5-4267-8f92-ca27b60aa51f"); - var uuidType = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); + var type = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); // act - var guid = (Guid)uuidType.CoerceInputLiteral(input)!; + var guid = (Guid)type.CoerceInputLiteral(input)!; // assert Assert.Equal(input.Value, guid.ToString("D")); @@ -406,14 +388,14 @@ public void Parse_Guid_Valid_Input(bool enforceFormat) [InlineData(false)] [InlineData(true)] [Theory] - public void Deserialize_Guid_String_With_Appended_String(bool enforceFormat) + public void CoerceInputValue_Guid_String_With_Appended_String(bool enforceFormat) { // arrange - const string input = "fbdef721-93c5-4267-8f92-ca27b60aa51f-foobar"; - var uuidType = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); + var inputValue = JsonDocument.Parse("\"fbdef721-93c5-4267-8f92-ca27b60aa51f-foobar\"").RootElement; + var type = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); // act - void Fail() => uuidType.Deserialize(input); + void Fail() => type.CoerceInputValue(inputValue, null!); // assert Assert.Throws<LeafCoercionException>(Fail); @@ -422,14 +404,15 @@ public void Deserialize_Guid_String_With_Appended_String(bool enforceFormat) [InlineData(false)] [InlineData(true)] [Theory] - public void Deserialize_Guid_Valid_Format(bool enforceFormat) + public void CoerceInputValue_Guid_Valid_Format(bool enforceFormat) { // arrange const string input = "fbdef721-93c5-4267-8f92-ca27b60aa51f"; - var uuidType = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); + var inputValue = JsonDocument.Parse($"\"{input}\"").RootElement; + var type = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); // act - var guid = (Guid)uuidType.Deserialize(input)!; + var guid = (Guid)type.CoerceInputValue(inputValue, null!)!; // assert Assert.Equal(input, guid.ToString("D")); @@ -438,14 +421,14 @@ public void Deserialize_Guid_Valid_Format(bool enforceFormat) [InlineData(false)] [InlineData(true)] [Theory] - public void IsInstanceOf_Guid_String_With_Appended_String(bool enforceFormat) + public void IsValueCompatible_Guid_String_With_Appended_String(bool enforceFormat) { // arrange var input = new StringValueNode("fbdef721-93c5-4267-8f92-ca27b60aa51f-foobar"); - var uuidType = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); + var type = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); // act - var result = uuidType.IsValueCompatible(input); + var result = type.IsValueCompatible(input); // assert Assert.False(result); @@ -454,14 +437,14 @@ public void IsInstanceOf_Guid_String_With_Appended_String(bool enforceFormat) [InlineData(false)] [InlineData(true)] [Theory] - public void IsInstanceOf_Guid_Valid_Format(bool enforceFormat) + public void IsValueCompatible_Guid_Valid_Format(bool enforceFormat) { // arrange var input = new StringValueNode("fbdef721-93c5-4267-8f92-ca27b60aa51f"); - var uuidType = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); + var type = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); // act - var result = uuidType.IsValueCompatible(input); + var result = type.IsValueCompatible(input); // assert Assert.True(result); From f4c4e79a6e752c3618f25f27c44269a9afbd179d Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 8 Jan 2026 10:23:38 +0100 Subject: [PATCH 072/144] Refactor RgbaType and UtcOffsetType tests to use new coercion methods; update ScalarTypeTestBase for consistency in input/output handling; enhance BsonType tests for value coercion; adjust IntegrationTests for OperationRequestBuilder usage; address obsolete warnings in FusionRunCommand. --- .../Execution/OperationRequestBuilder.cs | 36 +- .../Processing/VariableCoercionHelper.cs | 2 +- .../Processing/VariableCoercionHelperTests.cs | 613 +++++++----------- .../Product.cs | 21 +- .../EmailAddressTypeTests.cs | 114 +--- .../Types.Scalars.Tests/HexColorTypeTests.cs | 148 ++--- .../test/Types.Scalars.Tests/HslTypeTests.cs | 154 +---- .../test/Types.Scalars.Tests/HslaTypeTests.cs | 141 ++-- .../test/Types.Scalars.Tests/IPv4TypeTests.cs | 195 ++---- .../test/Types.Scalars.Tests/IPv6TypeTests.cs | 377 ++--------- .../test/Types.Scalars.Tests/IsbnTypeTests.cs | 243 ++----- .../Types.Scalars.Tests/LatitudeTypeTests.cs | 182 +++--- .../LocalCurrencyTypeTests.cs | 388 ----------- .../Types.Scalars.Tests/LongitudeTypeTests.cs | 184 +++--- .../MacAddressTypeTests.cs | 163 ++--- .../NonNegativeIntTypeTests.cs | 212 ------ .../NonPositiveFloatTypeTests.cs | 214 ------ .../NonPositiveIntTypeTests.cs | 206 ------ .../PhoneNumberTypeTests.cs | 117 +--- .../test/Types.Scalars.Tests/PortTypeTests.cs | 248 ------- .../PositiveIntTypeTests.cs | 212 ------ .../PostalCodeTypeTests.cs | 425 ------------ .../Types.Scalars.Tests/RegexTypeTests.cs | 88 +-- .../test/Types.Scalars.Tests/RgbTypeTests.cs | 159 +---- .../test/Types.Scalars.Tests/RgbaTypeTests.cs | 170 ++--- .../Types.Scalars.Tests/ScalarTypeTestBase.cs | 92 +-- .../Types.Scalars.Tests/UtcOffsetTypeTests.cs | 205 +----- .../Validation.Tests/Types/InvalidScalar.cs | 29 +- .../test/Types.MongoDb/BsonTypeTests.cs | 72 +- .../IntegrationTests.cs | 13 +- .../Commands/Fusion/FusionRunCommand.cs | 3 + 31 files changed, 1040 insertions(+), 4386 deletions(-) delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/LocalCurrencyTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/NonNegativeIntTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/NonPositiveFloatTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/NonPositiveIntTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/PortTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/PositiveIntTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/PostalCodeTypeTests.cs diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs index d3463865d69..545b334f960 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs @@ -250,8 +250,7 @@ public OperationRequestBuilder SetVariableValues( /// </returns> [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] - public OperationRequestBuilder SetVariableValues( - IReadOnlyDictionary<string, object?>? variableValues) + public OperationRequestBuilder SetVariableValues(IReadOnlyDictionary<string, object?>? variableValues) { _variableValues?.Dispose(); _variableValues = null; @@ -313,8 +312,8 @@ public OperationRequestBuilder SetVariableValues( public OperationRequestBuilder SetExtensions( JsonDocument? extensions) { - _variableValues?.Dispose(); - _variableValues = null; + _extensions?.Dispose(); + _extensions = null; if (extensions is null) { @@ -325,6 +324,35 @@ public OperationRequestBuilder SetExtensions( return this; } + /// <summary> + /// Sets the GraphQL request extension data. + /// </summary> + /// <param name="extensions"> + /// The GraphQL request extension data. + /// </param> + /// <returns> + /// Returns this instance of <see cref="OperationRequestBuilder" /> for configuration chaining. + /// </returns> + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] + public OperationRequestBuilder SetExtensions(IReadOnlyDictionary<string, object?>? extensions) + { + _extensions?.Dispose(); + _extensions = null; + + if (extensions is null) + { + return this; + } + +#if NET9_0_OR_GREATER + _extensions = new(JsonSerializer.SerializeToDocument(extensions, JsonSerializerOptions.Web)); +#else + _extensions = new(JsonSerializer.SerializeToDocument(extensions, s_serializerOptions)); +#endif + return this; + } + /// <summary> /// Sets the initial global request state. /// </summary> diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs index fed8b3b1905..7e815ae3c39 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs @@ -100,7 +100,7 @@ private VariableValue CoerceVariableValue( try { var runtimeValue = _inputParser.ParseInputValue(inputValue, variableType, context, path: root); - var valueLiteral = _inputFormatter.FormatValue(inputValue, variableType, root); + var valueLiteral = _inputFormatter.FormatValue(runtimeValue, variableType, root); return new VariableValue( variableDefinition.Variable.Name.Value, diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs index 6855ed838e7..ed8a9f78566 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs @@ -1,9 +1,12 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.StarWars; using HotChocolate.StarWars.Models; using HotChocolate.StarWars.Types; using HotChocolate.Types; using HotChocolate.Utilities; +using Moq; namespace HotChocolate.Execution.Processing; @@ -23,14 +26,13 @@ public void VariableCoercionHelper_Schema_Is_Null() Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?>(); var coercedValues = new Dictionary<string, VariableValue>(); - + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act void Action() => helper.CoerceVariableValues( - null!, variableDefinitions, variableValues, coercedValues); + null!, variableDefinitions, default, coercedValues, featureProvider.Object); // assert Assert.Throws<ArgumentNullException>(Action); @@ -41,41 +43,13 @@ public void VariableCoercionHelper_VariableDefinitions_Is_Null() { // arrange var schema = SchemaBuilder.New().AddStarWarsTypes().Create(); - var variableValues = new Dictionary<string, object?>(); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act void Action() - => helper.CoerceVariableValues(schema, null!, variableValues, coercedValues); - - // assert - Assert.Throws<ArgumentNullException>(Action); - } - - [Fact] - public void VariableCoercionHelper_VariableValues_Is_Null() - { - // arrange - var schema = SchemaBuilder.New().AddStarWarsTypes().Create(); - - var variableDefinitions = new List<VariableDefinitionNode> - { - new VariableDefinitionNode( - null, - new VariableNode("abc"), - description: null, - new NamedTypeNode("String"), - new StringValueNode("def"), - Array.Empty<DirectiveNode>()) - }; - - var coercedValues = new Dictionary<string, VariableValue>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); - - // act - void Action() => helper.CoerceVariableValues( - schema, variableDefinitions, null!, coercedValues); + => helper.CoerceVariableValues(schema, null!, default, coercedValues, featureProvider.Object); // assert Assert.Throws<ArgumentNullException>(Action); @@ -98,13 +72,12 @@ public void VariableCoercionHelper_CoercedValues_Is_Null() Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?>(); - + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act void Action() => helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, null!); + schema, variableDefinitions, default, null!, featureProvider.Object); // assert Assert.Throws<ArgumentNullException>(Action); @@ -127,13 +100,13 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Value_Is_Not_Prov Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?>(); var coercedValues = new Dictionary<string, VariableValue>(); - + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act - helper.CoerceVariableValues(schema, variableDefinitions, variableValues, coercedValues); + helper.CoerceVariableValues( + schema, variableDefinitions, default, coercedValues, featureProvider.Object); // assert Assert.Collection(coercedValues, @@ -163,13 +136,13 @@ public void Coerce_Nullable_String_Variable_Where_Value_Is_Not_Provided() Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?>(); var coercedValues = new Dictionary<string, VariableValue>(); - + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act - helper.CoerceVariableValues(schema, variableDefinitions, variableValues, coercedValues); + helper.CoerceVariableValues( + schema, variableDefinitions, default, coercedValues, featureProvider.Object); // assert Assert.Empty(coercedValues); @@ -192,17 +165,14 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Value_Is_Provided Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { - {"abc", new StringValueNode("xyz")} - }; - + var variableValues = JsonDocument.Parse("""{"abc": "xyz"}"""); var coercedValues = new Dictionary<string, VariableValue>(); - + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act - helper.CoerceVariableValues(schema, variableDefinitions, variableValues, coercedValues); + helper.CoerceVariableValues( + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert Assert.Collection(coercedValues, @@ -232,17 +202,14 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Plain_Value_Is_Pr Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { - {"abc", "xyz"} - }; - + var variableValues = JsonDocument.Parse("""{"abc": "xyz"}"""); var coercedValues = new Dictionary<string, VariableValue>(); - + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act - helper.CoerceVariableValues(schema, variableDefinitions, variableValues, coercedValues); + helper.CoerceVariableValues( + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert Assert.Collection(coercedValues, @@ -251,7 +218,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Plain_Value_Is_Pr Assert.Equal("abc", t.Key); Assert.Equal("String", Assert.IsType<StringType>(t.Value.Type).Name); Assert.Equal("xyz", t.Value.RuntimeValue); - t.Value.ValueLiteral.ToString().MatchSnapshot(); + t.Value.ValueLiteral.MatchInlineSnapshot("\"xyz\""); }); } @@ -272,55 +239,14 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Null_Is_Provided( Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { - {"abc", NullValueNode.Default} - }; - + var variableValues = JsonDocument.Parse("""{"abc": null}"""); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act - helper.CoerceVariableValues(schema, variableDefinitions, variableValues, coercedValues); - - // assert - Assert.Collection(coercedValues, - t => - { - Assert.Equal("abc", t.Key); - Assert.Equal("String", Assert.IsType<StringType>(t.Value.Type).Name); - Assert.Null(t.Value.RuntimeValue); - Assert.IsType<NullValueNode>(t.Value.ValueLiteral); - }); - } - - [Fact] - public void Coerce_Nullable_String_Variable_With_Default_Where_Plain_Null_Is_Provided() - { - // arrange - var schema = SchemaBuilder.New().AddStarWarsTypes().Create(); - - var variableDefinitions = new List<VariableDefinitionNode> - { - new VariableDefinitionNode( - null, - new VariableNode("abc"), - description: null, - new NamedTypeNode("String"), - new StringValueNode("def"), - Array.Empty<DirectiveNode>()) - }; - - var variableValues = new Dictionary<string, object?> - { - {"abc", null} - }; - - var coercedValues = new Dictionary<string, VariableValue>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); - - // act - helper.CoerceVariableValues(schema, variableDefinitions, variableValues, coercedValues); + helper.CoerceVariableValues( + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert Assert.Collection(coercedValues, @@ -334,7 +260,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Plain_Null_Is_Pro } [Fact] - public void Coerce_Nullable_ReviewInput_Variable_With_Object_Literal() + public void Coerce_Nullable_ReviewInput_Variable_With_Object() { // arrange var schema = SchemaBuilder.New().AddStarWarsTypes().Create(); @@ -350,16 +276,14 @@ public void Coerce_Nullable_ReviewInput_Variable_With_Object_Literal() Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { - {"abc", new ObjectValueNode(new ObjectFieldNode("stars", 5))} - }; - + var variableValues = JsonDocument.Parse("""{"abc": {"stars": 5}}"""); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act - helper.CoerceVariableValues(schema, variableDefinitions, variableValues, coercedValues); + helper.CoerceVariableValues( + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert Assert.Collection(coercedValues, @@ -372,84 +296,6 @@ public void Coerce_Nullable_ReviewInput_Variable_With_Object_Literal() }); } - [Fact] - public void Coerce_Nullable_ReviewInput_Variable_With_Dictionary() - { - // arrange - var schema = SchemaBuilder.New().AddStarWarsTypes().Create(); - - var variableDefinitions = new List<VariableDefinitionNode> - { - new VariableDefinitionNode( - null, - new VariableNode("abc"), - description: null, - new NamedTypeNode("ReviewInput"), - new StringValueNode("def"), - Array.Empty<DirectiveNode>()) - }; - - var variableValues = new Dictionary<string, object?> - { - {"abc", new Dictionary<string, object> { {"stars", 5} }} - }; - - var coercedValues = new Dictionary<string, VariableValue>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); - - // act - helper.CoerceVariableValues(schema, variableDefinitions, variableValues, coercedValues); - - // assert - Assert.Collection(coercedValues, - t => - { - Assert.Equal("abc", t.Key); - Assert.Equal("ReviewInput", Assert.IsType<ReviewInputType>(t.Value.Type).Name); - Assert.Equal(5, Assert.IsType<Review>(t.Value.RuntimeValue).Stars); - t.Value.ValueLiteral.ToString().MatchSnapshot(); - }); - } - - [Fact] - public void Coerce_Nullable_ReviewInput_Variable_With_Review_Object() - { - // arrange - var schema = SchemaBuilder.New().AddStarWarsTypes().Create(); - - var variableDefinitions = new List<VariableDefinitionNode> - { - new VariableDefinitionNode( - null, - new VariableNode("abc"), - description: null, - new NamedTypeNode("ReviewInput"), - new StringValueNode("def"), - Array.Empty<DirectiveNode>()) - }; - - var variableValues = new Dictionary<string, object?> - { - { "abc", new Review(stars: 5) } - }; - - var coercedValues = new Dictionary<string, VariableValue>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); - - // act - helper.CoerceVariableValues(schema, variableDefinitions, variableValues, coercedValues); - - // assert - Assert.Collection(coercedValues, - t => - { - Assert.Equal("abc", t.Key); - Assert.Equal("ReviewInput", Assert.IsType<ReviewInputType>(t.Value.Type).Name); - Assert.Equal(5, Assert.IsType<Review>(t.Value.RuntimeValue).Stars); - t.Value.ValueLiteral.ToString().MatchSnapshot(); - }); - } - [Fact] public void Error_When_Value_Is_Null_On_Non_Null_Variable() { @@ -467,53 +313,31 @@ public void Error_When_Value_Is_Null_On_Non_Null_Variable() Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { - {"abc", NullValueNode.Default} - }; - - var coercedValues = new Dictionary<string, VariableValue>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); - - // act - void Action() => helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); - - // assert - Assert.Throws<GraphQLException>(Action).Errors.MatchSnapshot(); - } - - [Fact] - public void Error_When_PlainValue_Is_Null_On_Non_Null_Variable() - { - // arrange - var schema = SchemaBuilder.New().AddStarWarsTypes().Create(); - - var variableDefinitions = new List<VariableDefinitionNode> - { - new VariableDefinitionNode( - null, - new VariableNode("abc"), - description: null, - new NonNullTypeNode(new NamedTypeNode("String")), - new StringValueNode("def"), - Array.Empty<DirectiveNode>()) - }; - - var variableValues = new Dictionary<string, object?> - { - {"abc", null} - }; - + var variableValues = JsonDocument.Parse("""{"abc": null}"""); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act void Action() => helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert - Assert.Throws<GraphQLException>(Action).Errors.MatchSnapshot(); + Assert.Throws<LeafCoercionException>(Action) + .Errors.Select(t => t.WithException(null)) + .ToList() + .MatchInlineSnapshot( + """ + [ + { + "Message": "Cannot accept null for non-nullable input.", + "Code": null, + "Path": null, + "Locations": null, + "Extensions": null + } + ] + """); } [Fact] @@ -533,55 +357,33 @@ public void Error_When_Value_Type_Does_Not_Match_Variable_Type() Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { - {"abc", new IntValueNode(1)} - }; - + var variableValues = JsonDocument.Parse("""{"abc": 1}"""); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act void Action() => helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert Assert.Throws<LeafCoercionException>(Action) .Errors.Select(t => t.WithException(null)) .ToList() - .MatchSnapshot(); - } - - [Fact] - public void Error_When_PlainValue_Type_Does_Not_Match_Variable_Type() - { - // arrange - var schema = SchemaBuilder.New().AddStarWarsTypes().Create(); - - var variableDefinitions = new List<VariableDefinitionNode> - { - new(null, - new VariableNode("abc"), - description: null, - new NamedTypeNode("String"), - new StringValueNode("def"), - Array.Empty<DirectiveNode>()) - }; - - var variableValues = new Dictionary<string, object?> - { - { "abc", 1 } - }; - - var coercedValues = new Dictionary<string, VariableValue>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); - - // act - void Action() => helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); - - // assert - Assert.Throws<LeafCoercionException>(Action).Errors.MatchSnapshot(); + .MatchInlineSnapshot( + """ + [ + { + "Message": "The value `1` is not compatible with the type `String`.", + "Code": null, + "Path": null, + "Locations": null, + "Extensions": { + "variable": "abc" + } + } + ] + """); } [Fact] @@ -600,20 +402,28 @@ public void Variable_Type_Is_Not_An_Input_Type() Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { - { "abc", 1 } - }; - + var variableValues = JsonDocument.Parse("""{"abc": 1}"""); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act void Action() => helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert - Assert.Throws<GraphQLException>(Action).Errors.MatchSnapshot(); + Assert.Throws<GraphQLException>(Action).Errors.MatchInlineSnapshot( + """ + [ + { + "Message": "Variable `abc` has an invalid type `Human`.", + "Code": null, + "Path": null, + "Locations": null, + "Extensions": null + } + ] + """); } [Fact] @@ -632,23 +442,35 @@ public void Error_When_Input_Field_Has_Different_Properties_Than_Defined() Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { - { "abc", new ObjectValueNode(new ObjectFieldNode("abc", "def")) } - }; - + var variableValues = JsonDocument.Parse("""{"abc": {"abc": "def"}}"""); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act void Action() => helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert Assert.Throws<LeafCoercionException>(Action) .Errors.Select(t => t.WithException(null)) .ToList() - .MatchSnapshot(); + .MatchInlineSnapshot( + """ + [ + { + "Message": "`stars` is a required field of `ReviewInput`.", + "Code": null, + "Path": null, + "Locations": null, + "Extensions": { + "field": "stars", + "type": "ReviewInput", + "variable": "abc" + } + } + ] + """); } [Fact] @@ -683,34 +505,38 @@ enum TestEnum { Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { + var variableValues = JsonDocument.Parse( + """ { - "abc", - new ListValueNode( - new ObjectValueNode( - new ObjectFieldNode("enum", "Foo")), - new ObjectValueNode( - new ObjectFieldNode("enum", "Bar"))) + "abc": [ + { "enum": "Foo" }, + { "enum": "Bar" } + ] } - }; + """); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert - Assert.Collection(coercedValues, - t => - { - Assert.Equal("abc", t.Key); - Assert.Equal( - "[ { enum: Foo }, { enum: Bar } ]", - t.Value.ValueLiteral.ToString()); - }); + var entry = Assert.Single(coercedValues); + Assert.Equal("abc", entry.Key); + entry.Value.ValueLiteral.MatchInlineSnapshot( + """ + [ + { + enum: Foo + }, + { + enum: Bar + } + ] + """); } [Fact] @@ -745,34 +571,38 @@ enum TestEnum { Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { + var variableValues = JsonDocument.Parse( + """ { - "abc", - new ListValueNode( - new ObjectValueNode( - new ObjectFieldNode("enum", "Foo")), - new ObjectValueNode( - new ObjectFieldNode("enum", "Bar"))) + "abc": [ + { "enum": "Foo" }, + { "enum": "Bar" } + ] } - }; + """); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert - Assert.Collection(coercedValues, - t => - { - Assert.Equal("abc", t.Key); - Assert.Equal( - "[ { enum: Foo }, { enum: Bar } ]", - t.Value.ValueLiteral.ToString()); - }); + var entry = Assert.Single(coercedValues); + Assert.Equal("abc", entry.Key); + entry.Value.ValueLiteral.MatchInlineSnapshot( + """ + [ + { + enum: Foo + }, + { + enum: Bar + } + ] + """); } [Fact] @@ -808,30 +638,31 @@ enum TestEnum { Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { + var variableValues = JsonDocument.Parse( + """ { - "abc", - new ObjectValueNode( - new ObjectFieldNode("enum", "Foo"), - new ObjectFieldNode("enum2", "Bar")) + "abc": { "enum": "Foo", "enum2": "Bar" } } - }; + """); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert - Assert.Collection(coercedValues, - t => + var entry = Assert.Single(coercedValues); + Assert.Equal("abc", entry.Key); + entry.Value.ValueLiteral.MatchInlineSnapshot( + """ { - Assert.Equal("abc", t.Key); - Assert.Equal("{ enum: Foo, enum2: Bar }", t.Value.ValueLiteral.ToString()); - }); + enum: Foo, + enum2: Bar + } + """); } [Fact] @@ -867,30 +698,31 @@ enum TestEnum { Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?> - { + var variableValues = JsonDocument.Parse( + """ { - "abc", - new ObjectValueNode( - new ObjectFieldNode("enum", "Foo"), - new ObjectFieldNode("enum2", "Bar")) + "abc": { "enum": "Foo", "enum2": "Bar" } } - }; + """); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert - Assert.Collection(coercedValues, - t => + var entry = Assert.Single(coercedValues); + Assert.Equal("abc", entry.Key); + entry.Value.ValueLiteral.MatchInlineSnapshot( + """ { - Assert.Equal("abc", t.Key); - Assert.Equal("{ enum: Foo, enum2: Bar }", t.Value.ValueLiteral.ToString()); - }); + enum: Foo, + enum2: Bar + } + """); } [Fact] @@ -926,39 +758,31 @@ enum TestEnum { Array.Empty<DirectiveNode>()) }; - var expectToBeUnchanged = new ObjectFieldNode("value_a", "Foo"); - var expectToBeRewritten = new ObjectFieldNode("value_b", "Bar"); - - var variableValues = new Dictionary<string, object?> - { + var variableValues = JsonDocument.Parse( + """ { - "abc", - new ObjectValueNode( - expectToBeUnchanged, - expectToBeRewritten) + "abc": { "value_a": "Foo", "value_b": "Bar" } } - }; + """); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); + schema, variableDefinitions, variableValues.RootElement, coercedValues, featureProvider.Object); // assert - Assert.Collection(coercedValues, - t => + var entry = Assert.Single(coercedValues); + Assert.Equal("abc", entry.Key); + entry.Value.ValueLiteral.MatchInlineSnapshot( + """ { - Assert.Equal("abc", t.Key); - Assert.Equal( - @"{ value_a: ""Foo"", value_b: Bar }", - t.Value.ValueLiteral.ToString()); - - var obj = Assert.IsType<ObjectValueNode>(t.Value.ValueLiteral); - Assert.Same(expectToBeUnchanged, obj.Fields[0]); - Assert.NotSame(expectToBeRewritten, obj.Fields[1]); - }); + value_a: "Foo", + value_b: Bar + } + """); } [Fact] @@ -994,37 +818,47 @@ enum TestEnum { Array.Empty<DirectiveNode>()) }; - var expectToBeUnchanged = new ObjectValueNode(new ObjectFieldNode("value_a", "Foo")); - var expectToBeRewritten = new ObjectValueNode(new ObjectFieldNode("value_b", "Bar")); - - var variableValues = new Dictionary<string, object?> - { + var variableValues = JsonDocument.Parse( + """ { - "abc", - new ListValueNode(expectToBeUnchanged, expectToBeRewritten) + "abc": [ + { + "value_a": "Foo" + }, + { + "value_b": "Bar" + } + ] } - }; + """); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); + var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act helper.CoerceVariableValues( - schema, variableDefinitions, variableValues, coercedValues); + schema, + variableDefinitions, + variableValues.RootElement, + coercedValues, + featureProvider.Object); // assert - Assert.Collection(coercedValues, - t => - { - Assert.Equal("abc", t.Key); - Assert.Equal( - @"[ { value_a: ""Foo"" }, { value_b: Bar } ]", - t.Value.ValueLiteral.ToString()); - - var list = Assert.IsType<ListValueNode>(t.Value.ValueLiteral); - Assert.Same(expectToBeUnchanged, list.Items[0]); - Assert.NotSame(expectToBeRewritten, list.Items[1]); - }); + var entry = Assert.Single(coercedValues); + Assert.Equal("abc", entry.Key); + entry.Value.ValueLiteral.MatchInlineSnapshot( + """ + [ + { + value_a: "Foo" + }, + { + value_b: Bar + } + ] + """); } [Fact] @@ -1043,13 +877,18 @@ public void Variable_Is_Nullable_And_Not_Set() Array.Empty<DirectiveNode>()) }; - var variableValues = new Dictionary<string, object?>(); var coercedValues = new Dictionary<string, VariableValue>(); + var featureProvider = new Mock<IFeatureProvider>(); var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); // act - helper.CoerceVariableValues(schema, variableDefinitions, variableValues, coercedValues); + helper.CoerceVariableValues( + schema, + variableDefinitions, + default, + coercedValues, + featureProvider.Object); // assert Assert.Empty(coercedValues); diff --git a/src/HotChocolate/Core/test/Types.Analyzers.Integration.Tests/Product.cs b/src/HotChocolate/Core/test/Types.Analyzers.Integration.Tests/Product.cs index 4c5035a1b7b..c430c5fb3b0 100644 --- a/src/HotChocolate/Core/test/Types.Analyzers.Integration.Tests/Product.cs +++ b/src/HotChocolate/Core/test/Types.Analyzers.Integration.Tests/Product.cs @@ -1,5 +1,8 @@ using System.Reflection; +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types.Descriptors; namespace HotChocolate.Types; @@ -87,13 +90,16 @@ public VersionType() : base("Version", BindingBehavior.Explicit) { } - public override IValueNode ParseResult(object? resultValue) + protected override long OnCoerceInputLiteral(StringValueNode valueLiteral) => throw new NotImplementedException(); - protected override long ParseLiteral(StringValueNode valueSyntax) + protected override long OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) => throw new NotImplementedException(); - protected override StringValueNode ParseValue(long runtimeValue) + protected override void OnCoerceOutputValue(long runtimeValue, ResultElement resultValue) + => throw new NotImplementedException(); + + protected override StringValueNode OnValueToLiteral(long runtimeValue) => throw new NotImplementedException(); } @@ -103,13 +109,16 @@ public Version2Type() : base("Version2", BindingBehavior.Explicit) { } - public override IValueNode ParseResult(object? resultValue) + protected override long OnCoerceInputLiteral(StringValueNode valueLiteral) + => throw new NotImplementedException(); + + protected override long OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) => throw new NotImplementedException(); - protected override long ParseLiteral(StringValueNode valueSyntax) + protected override void OnCoerceOutputValue(long runtimeValue, ResultElement resultValue) => throw new NotImplementedException(); - protected override StringValueNode ParseValue(long runtimeValue) + protected override StringValueNode OnValueToLiteral(long runtimeValue) => throw new NotImplementedException(); } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/EmailAddressTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/EmailAddressTypeTests.cs index 2727ae3b937..884cfc067eb 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/EmailAddressTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/EmailAddressTypeTests.cs @@ -21,11 +21,11 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(IntValueNode), 1, false)] [InlineData(typeof(BooleanValueNode), true, false)] [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "K@chillicream.com", false)] // K = Kelvin Sign (U+212A) + [InlineData(typeof(StringValueNode), "K@chillicream.com", false)] // K = Kelvin Sign (U+212A) [InlineData(typeof(StringValueNode), "test@chillicream.com", true)] [InlineData(typeof(StringValueNode), "CapitalizeTest@chillicream.com", true)] [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -38,31 +38,13 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<EmailAddressType>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("K@chillicream.com", false)] // K = Kelvin Sign (U+212A) - [InlineData("test@chillicream.com", true)] - [InlineData("CapitalizeTest@chillicream.com", true)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<EmailAddressType>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "test@chillicream.com", "test@chillicream.com")] [InlineData(typeof(StringValueNode), "CapitalizeTest@chillicream.com", "CapitalizeTest@chillicream.com")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -84,8 +66,8 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "invalid.email.com")] [InlineData(typeof(StringValueNode), "email@-example.com")] [InlineData(typeof(StringValueNode), "email@example..com")] - [InlineData(typeof(StringValueNode), "K@chillicream.com")] // K = Kelvin Sign (U+212A) - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + [InlineData(typeof(StringValueNode), "K@chillicream.com")] // K = Kelvin Sign (U+212A) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -96,111 +78,72 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("test@chillicream.com", "test@chillicream.com")] - [InlineData("CapitalizeTest@chillicream.com", "CapitalizeTest@chillicream.com")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"test@chillicream.com\"", "test@chillicream.com")] + [InlineData("\"CapitalizeTest@chillicream.com\"", "CapitalizeTest@chillicream.com")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<EmailAddressType>(resultValue, runtimeValue); + ExpectCoerceInputValueToMatch<EmailAddressType>(jsonValue, runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("invalid.email.com")] - [InlineData("email@-example.com")] - [InlineData("email@example..com")] - [InlineData("K@chillicream.com")] // K = Kelvin Sign (U+212A) - public void Deserialize_GivenValue_ThrowSerializationException(object value) + [InlineData("1.0")] + [InlineData("1")] + [InlineData("true")] + [InlineData("\"invalid.email.com\"")] + [InlineData("\"email@-example.com\"")] + [InlineData("\"email@example..com\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectDeserializeToThrowSerializationException<EmailAddressType>(value); + ExpectCoerceInputValueToThrowSerializationException<EmailAddressType>(jsonValue); } [Theory] - [InlineData("test@chillicream.com", "test@chillicream.com")] - [InlineData("CapitalizeTest@chillicream.com", "CapitalizeTest@chillicream.com")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) + [InlineData("test@chillicream.com")] + [InlineData("CapitalizeTest@chillicream.com")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectSerializeToMatch<EmailAddressType>(runtimeValue, resultValue); + ExpectCoerceOutputValueToMatch<EmailAddressType>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] [InlineData("invalid.email.com")] [InlineData("email@-example.com")] [InlineData("email@example..com")] - [InlineData("K@chillicream.com")] // K = Kelvin Sign (U+212A) - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<EmailAddressType>(value); - } - - [Theory] - [InlineData(typeof(StringValueNode), "test@chillicream.com")] - [InlineData(typeof(StringValueNode), "CapitalizeTest@chillicream.com")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<EmailAddressType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("invalid.email.com")] - [InlineData("email@-example.com")] - [InlineData("email@example..com")] - [InlineData("")] - [InlineData("K@chillicream.com")] // K = Kelvin Sign (U+212A) - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<EmailAddressType>(value); + ExpectCoerceOutputValueToThrowSerializationException<EmailAddressType>(value); } [Theory] [InlineData(typeof(StringValueNode), "test@chillicream.com")] [InlineData(typeof(StringValueNode), "CapitalizeTest@chillicream.com")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<EmailAddressType>(value, type); + ExpectValueToLiteralToMatchType<EmailAddressType>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] @@ -208,12 +151,11 @@ public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("email@-example.com")] [InlineData("email@example..com")] [InlineData("")] - [InlineData("K@chillicream.com")] // K = Kelvin Sign (U+212A) - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<EmailAddressType>(value); + ExpectValueToLiteralToThrowSerializationException<EmailAddressType>(value); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/HexColorTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/HexColorTypeTests.cs index 23dab70327c..4297b26a978 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/HexColorTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/HexColorTypeTests.cs @@ -29,7 +29,7 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "#0099CC", true)] [InlineData(typeof(StringValueNode), "#FFA500", true)] [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -42,28 +42,6 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<HexColorType>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData(null, true)] - [InlineData("#000", true)] - [InlineData("#FFFFFF", true)] - [InlineData("#A52A2A", true)] - [InlineData("#800080", true)] - [InlineData("#09C", true)] - [InlineData("#0099CC", true)] - [InlineData("#FFA500", true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<HexColorType>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "#000", "#000")] [InlineData(typeof(StringValueNode), "#FFFFFF", "#FFFFFF")] @@ -74,7 +52,7 @@ public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expec [InlineData(typeof(StringValueNode), "#FFA500", "#FFA500")] [InlineData(typeof(StringValueNode), "#CcC", "#CcC")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -99,7 +77,7 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "#009CC")] [InlineData(typeof(StringValueNode), "#80 00 80")] [InlineData(typeof(StringValueNode), "#0000")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -110,119 +88,73 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("#000", "#000")] - [InlineData("#FFFFFF", "#FFFFFF")] - [InlineData("#A52A2A", "#A52A2A")] - [InlineData("#800080", "#800080")] - [InlineData("#09C", "#09C")] - [InlineData("#0099CC", "#0099CC")] - [InlineData("#FFA500", "#FFA500")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"#000\"", "#000")] + [InlineData("\"#FFFFFF\"", "#FFFFFF")] + [InlineData("\"#A52A2A\"", "#A52A2A")] + [InlineData("\"#800080\"", "#800080")] + [InlineData("\"#09C\"", "#09C")] + [InlineData("\"#0099CC\"", "#0099CC")] + [InlineData("\"#FFA500\"", "#FFA500")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<HexColorType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("090")] - [InlineData("email@-example.com")] - [InlineData("FFFFFF")] - [InlineData("FF A5 00")] - [InlineData("#009CC")] - [InlineData("80 00 80")] - [InlineData("0000")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<HexColorType>(value); - } - - [Theory] - [InlineData("#000", "#000")] - [InlineData("#FFFFFF", "#FFFFFF")] - [InlineData("#A52A2A", "#A52A2A")] - [InlineData("#800080", "#800080")] - [InlineData("#09C", "#09C")] - [InlineData("#0099CC", "#0099CC")] - [InlineData("#FFA500", "#FFA500")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<HexColorType>(runtimeValue, resultValue); + ExpectCoerceInputValueToMatch<HexColorType>(jsonValue, runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("090")] - [InlineData("email@-example.com")] - [InlineData("FFFFFF")] - [InlineData("FF A5 00")] - [InlineData("#009CC")] - [InlineData("80 00 80")] - [InlineData("0000")] - public void Serialize_GivenObject_ThrowSerializationException(object value) + [InlineData("1.0")] + [InlineData("1")] + [InlineData("true")] + [InlineData("\"090\"")] + [InlineData("\"FFFFFF\"")] + [InlineData("\"FF A5 00\"")] + [InlineData("\"#009CC\"")] + [InlineData("\"80 00 80\"")] + [InlineData("\"0000\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectSerializeToThrowSerializationException<HexColorType>(value); + ExpectCoerceInputValueToThrowSerializationException<HexColorType>(jsonValue); } [Theory] - [InlineData(typeof(StringValueNode), "#000")] - [InlineData(typeof(StringValueNode), "#FFFFFF")] - [InlineData(typeof(StringValueNode), "#A52A2A")] - [InlineData(typeof(StringValueNode), "#800080")] - [InlineData(typeof(StringValueNode), "#09C")] - [InlineData(typeof(StringValueNode), "#0099CC")] - [InlineData(typeof(StringValueNode), "#FFA500")] - [InlineData(typeof(StringValueNode), "#CcC")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) + [InlineData("#000")] + [InlineData("#FFFFFF")] + [InlineData("#A52A2A")] + [InlineData("#800080")] + [InlineData("#09C")] + [InlineData("#0099CC")] + [InlineData("#FFA500")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectParseValueToMatchType<HexColorType>(value, type); + ExpectCoerceOutputValueToMatch<HexColorType>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] [InlineData("090")] - [InlineData("email@-example.com")] [InlineData("FFFFFF")] [InlineData("FF A5 00")] [InlineData("#009CC")] [InlineData("80 00 80")] [InlineData("0000")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<HexColorType>(value); + ExpectCoerceOutputValueToThrowSerializationException<HexColorType>(value); } [Theory] @@ -235,31 +167,29 @@ public void ParseValue_GivenObject_ThrowSerializationException(object value) [InlineData(typeof(StringValueNode), "#FFA500")] [InlineData(typeof(StringValueNode), "#CcC")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<HexColorType>(value, type); + ExpectValueToLiteralToMatchType<HexColorType>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] [InlineData("090")] - [InlineData("email@-example.com")] [InlineData("FFFFFF")] [InlineData("FF A5 00")] [InlineData("#009CC")] [InlineData("80 00 80")] [InlineData("0000")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<HexColorType>(value); + ExpectValueToLiteralToThrowSerializationException<HexColorType>(value); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs index ea664d4fd14..16fd900bf4d 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs @@ -32,7 +32,7 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / 15%)", true)] [InlineData(typeof(StringValueNode), "hsl(270, 100%, 50%)", true)] [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -45,31 +45,6 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<HslType>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("hsl(٢٧٠,٦٠%,٧٠%)", false)] - [InlineData("hsl(270,60%,70%)", true)] - [InlineData("hsl(270, 60%, 70%)", true)] - [InlineData("hsl(270 60% 70%)", true)] - [InlineData("hsl(270deg, 60%, 70%)", true)] - [InlineData("hsl(270, 60%, 50%, .15)", true)] - [InlineData("hsl(270, 60%, 50%, 15%)", true)] - [InlineData("hsl(270 60% 50% / .15)", true)] - [InlineData("hsl(270 60% 50% / 15%)", true)] - [InlineData("hsl(270, 100%, 50%)", true)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<HslType>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "hsl(270,60%,70%)", "hsl(270,60%,70%)")] [InlineData(typeof(StringValueNode), "hsl(270, 60%, 70%)", "hsl(270, 60%, 70%)")] @@ -81,7 +56,7 @@ public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expec [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / 15%)", "hsl(270 60% 50% / 15%)")] [InlineData(typeof(StringValueNode), "hsl(270, 100%, 50%)", "hsl(270, 100%, 50%)")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -106,7 +81,7 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "hsl(270, FF, 50)")] [InlineData(typeof(StringValueNode), "hsl(270%, A0, 5F)")] [InlineData(typeof(StringValueNode), "hsl(٢٧٠, ٦٠%, ٧٠%)")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -117,106 +92,52 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("hsl(270,60%,70%)", "hsl(270,60%,70%)")] - [InlineData("hsl(270, 60%, 70%)", "hsl(270, 60%, 70%)")] - [InlineData("hsl(270 60% 70%)", "hsl(270 60% 70%)")] - [InlineData("hsl(270deg, 60%, 70%)", "hsl(270deg, 60%, 70%)")] - [InlineData("hsl(270, 60%, 50%, .15)", "hsl(270, 60%, 50%, .15)")] - [InlineData("hsl(270, 60%, 50%, 15%)", "hsl(270, 60%, 50%, 15%)")] - [InlineData("hsl(270 60% 50% / .15)", "hsl(270 60% 50% / .15)")] - [InlineData("hsl(270 60% 50% / 15%)", "hsl(270 60% 50% / 15%)")] - [InlineData("hsl(270, 100%, 50%)", "hsl(270, 100%, 50%)")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"hsl(270,60%,70%)\"", "hsl(270,60%,70%)")] + [InlineData("\"hsl(270, 60%, 70%)\"", "hsl(270, 60%, 70%)")] + [InlineData("\"hsl(270 60% 70%)\"", "hsl(270 60% 70%)")] + [InlineData("\"hsl(270deg, 60%, 70%)\"", "hsl(270deg, 60%, 70%)")] + [InlineData("\"hsl(270, 100%, 50%)\"", "hsl(270, 100%, 50%)")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<HslType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("hsl(090)")] - [InlineData("hsl(#FFFFFF)")] - [InlineData("hsl(FF, A5, 00)")] - [InlineData("hsl(270, FF, 50)")] - [InlineData("hsl(270%, A0, 5F)")] - [InlineData("hsl(٢٧٠, ٦٠%, ٧٠%)")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<HslType>(value); + ExpectCoerceInputValueToMatch<HslType>(jsonValue, runtimeValue); } [Theory] - [InlineData("hsl(270,60%,70%)", "hsl(270,60%,70%)")] - [InlineData("hsl(270, 60%, 70%)", "hsl(270, 60%, 70%)")] - [InlineData("hsl(270 60% 70%)", "hsl(270 60% 70%)")] - [InlineData("hsl(270deg, 60%, 70%)", "hsl(270deg, 60%, 70%)")] - [InlineData("hsl(270, 60%, 50%, .15)", "hsl(270, 60%, 50%, .15)")] - [InlineData("hsl(270, 60%, 50%, 15%)", "hsl(270, 60%, 50%, 15%)")] - [InlineData("hsl(270 60% 50% / .15)", "hsl(270 60% 50% / .15)")] - [InlineData("hsl(270 60% 50% / 15%)", "hsl(270 60% 50% / 15%)")] - [InlineData("hsl(270, 100%, 50%)", "hsl(270, 100%, 50%)")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) + [InlineData("1.0")] + [InlineData("1")] + [InlineData("true")] + [InlineData("\"hsl(090)\"")] + [InlineData("\"hsl(#FFFFFF)\"")] + [InlineData("\"hsl(FF, A5, 00)\"")] + [InlineData("\"hsl(270, FF, 50)\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectSerializeToMatch<HslType>(runtimeValue, resultValue); + ExpectCoerceInputValueToThrowSerializationException<HslType>(jsonValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("hsl(090)")] - [InlineData("hsl(#FFFFFF)")] - [InlineData("hsl(FF, A5, 00)")] - [InlineData("hsl(270, FF, 50)")] - [InlineData("hsl(270%, A0, 5F)")] - [InlineData("hsl(٢٧٠, ٦٠%, ٧٠%)")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<HslType>(value); - } - - [Theory] - [InlineData(typeof(StringValueNode), "hsl(270,60%,70%)")] - [InlineData(typeof(StringValueNode), "hsl(270, 60%, 70%)")] - [InlineData(typeof(StringValueNode), "hsl(270 60% 70%)")] - [InlineData(typeof(StringValueNode), "hsl(270deg, 60%, 70%)")] - [InlineData(typeof(StringValueNode), "hsl(270, 60%, 50%, .15)")] - [InlineData(typeof(StringValueNode), "hsl(270, 60%, 50%, 15%)")] - [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / .15)")] - [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / 15%)")] - [InlineData(typeof(StringValueNode), "hsl(270, 100%, 50%)")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) + [InlineData("hsl(270,60%,70%)")] + [InlineData("hsl(270, 60%, 70%)")] + [InlineData("hsl(270 60% 70%)")] + [InlineData("hsl(270deg, 60%, 70%)")] + [InlineData("hsl(270, 100%, 50%)")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectParseValueToMatchType<HslType>(value, type); + ExpectCoerceOutputValueToMatch<HslType>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] @@ -224,14 +145,12 @@ public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("hsl(#FFFFFF)")] [InlineData("hsl(FF, A5, 00)")] [InlineData("hsl(270, FF, 50)")] - [InlineData("hsl(270%, A0, 5F)")] - [InlineData("hsl(٢٧٠, ٦٠%, ٧٠%)")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<HslType>(value); + ExpectCoerceOutputValueToThrowSerializationException<HslType>(value); } [Theory] @@ -239,22 +158,17 @@ public void ParseValue_GivenObject_ThrowSerializationException(object value) [InlineData(typeof(StringValueNode), "hsl(270, 60%, 70%)")] [InlineData(typeof(StringValueNode), "hsl(270 60% 70%)")] [InlineData(typeof(StringValueNode), "hsl(270deg, 60%, 70%)")] - [InlineData(typeof(StringValueNode), "hsl(270, 60%, 50%, .15)")] - [InlineData(typeof(StringValueNode), "hsl(270, 60%, 50%, 15%)")] - [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / .15)")] - [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / 15%)")] [InlineData(typeof(StringValueNode), "hsl(270, 100%, 50%)")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<HslType>(value, type); + ExpectValueToLiteralToMatchType<HslType>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] @@ -262,13 +176,11 @@ public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("hsl(#FFFFFF)")] [InlineData("hsl(FF, A5, 00)")] [InlineData("hsl(270, FF, 50)")] - [InlineData("hsl(270%, A0, 5F)")] - [InlineData("hsl(٢٧٠, ٦٠%, ٧٠%)")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<HslType>(value); + ExpectValueToLiteralToThrowSerializationException<HslType>(value); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/HslaTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/HslaTypeTests.cs index 1c1ca5a5012..d3c7c9df90b 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/HslaTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/HslaTypeTests.cs @@ -29,7 +29,7 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / .05)", true)] [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / 5%)", true)] [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -42,28 +42,6 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<HslaType>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData(null, true)] - [InlineData("hsla(٢٤٠, ١٠٠%, ٥٠%, .٠٥)", false)] - [InlineData("hsla(240, 100%, 50%, .05)", true)] - [InlineData("hsla(240, 100%, 50%, .4)", true)] - [InlineData("hsla(240, 100%, 50%, .7)", true)] - [InlineData("hsla(240, 100%, 50%, 1)", true)] - [InlineData("hsla(240 100% 50% / .05)", true)] - [InlineData("hsla(240 100% 50% / 5%)", true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<HslaType>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "hsla(240, 100%, 50%, .05)", @@ -80,7 +58,7 @@ public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expec "hsla(240 100% 50% / .05)")] [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / 5%)", "hsla(240 100% 50% / 5%)")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -106,7 +84,7 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "hsla(270%, A0, 5F, 1.0)")] [InlineData(typeof(StringValueNode), "hsla(240, 75, .3, 25%)")] [InlineData(typeof(StringValueNode), "hsla(٢٤٠, ١٠٠%, ٥٠%, .٠٥)")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -117,99 +95,57 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("hsla(240, 100%, 50%, .05)", "hsla(240, 100%, 50%, .05)")] - [InlineData("hsla(240, 100%, 50%, .4)", "hsla(240, 100%, 50%, .4)")] - [InlineData("hsla(240, 100%, 50%, .7)", "hsla(240, 100%, 50%, .7)")] - [InlineData("hsla(240, 100%, 50%, 1)", "hsla(240, 100%, 50%, 1)")] - [InlineData("hsla(240 100% 50% / .05)", "hsla(240 100% 50% / .05)")] - [InlineData("hsla(240 100% 50% / 5%)", "hsla(240 100% 50% / 5%)")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"hsla(240, 100%, 50%, .05)\"", "hsla(240, 100%, 50%, .05)")] + [InlineData("\"hsla(240, 100%, 50%, .4)\"", "hsla(240, 100%, 50%, .4)")] + [InlineData("\"hsla(240, 100%, 50%, .7)\"", "hsla(240, 100%, 50%, .7)")] + [InlineData("\"hsla(240, 100%, 50%, 1)\"", "hsla(240, 100%, 50%, 1)")] + [InlineData("\"hsla(240 100% 50% / .05)\"", "hsla(240 100% 50% / .05)")] + [InlineData("\"hsla(240 100% 50% / 5%)\"", "hsla(240 100% 50% / 5%)")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<HslaType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("hsla(090)")] - [InlineData("hsla(#FFFFFF)")] - [InlineData("hsla(FF, A5, 00, .2)")] - [InlineData("hsla(240, FF, 50, 0.2)")] - [InlineData("hsla(270%, A0, 5F, 1.0)")] - [InlineData("hsla(240, 75, .3, 25%)")] - [InlineData("hsla(٢٤٠, ١٠٠%, ٥٠%, .٠٥)")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<HslaType>(value); + ExpectCoerceInputValueToMatch<HslaType>(jsonValue, runtimeValue); } [Theory] - [InlineData("hsla(240, 100%, 50%, .05)", "hsla(240, 100%, 50%, .05)")] - [InlineData("hsla(240, 100%, 50%, .4)", "hsla(240, 100%, 50%, .4)")] - [InlineData("hsla(240, 100%, 50%, .7)", "hsla(240, 100%, 50%, .7)")] - [InlineData("hsla(240, 100%, 50%, 1)", "hsla(240, 100%, 50%, 1)")] - [InlineData("hsla(240 100% 50% / .05)", "hsla(240 100% 50% / .05)")] - [InlineData("hsla(240 100% 50% / 5%)", "hsla(240 100% 50% / 5%)")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) + [InlineData("1.0")] + [InlineData("1")] + [InlineData("true")] + [InlineData("\"hsla(090)\"")] + [InlineData("\"hsla(#FFFFFF)\"")] + [InlineData("\"hsla(FF, A5, 00, .2)\"")] + [InlineData("\"hsla(240, FF, 50, 0.2)\"")] + [InlineData("\"hsla(270%, A0, 5F, 1.0)\"")] + [InlineData("\"hsla(240, 75, .3, 25%)\"")] + [InlineData("\"hsla(٢٤٠, ١٠٠%, ٥٠%, .٠٥)\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectSerializeToMatch<HslaType>(runtimeValue, resultValue); + ExpectCoerceInputValueToThrowSerializationException<HslaType>(jsonValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("hsla(090)")] - [InlineData("hsla(#FFFFFF)")] - [InlineData("hsla(FF, A5, 00, .2)")] - [InlineData("hsla(240, FF, 50, 0.2)")] - [InlineData("hsla(270%, A0, 5F, 1.0)")] - [InlineData("hsla(240, 75, .3, 25%)")] - [InlineData("hsla(٢٤٠, ١٠٠%, ٥٠%, .٠٥)")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<HslaType>(value); - } - - [Theory] - [InlineData(typeof(StringValueNode), "hsla(240, 100%, 50%, .05)")] - [InlineData(typeof(StringValueNode), "hsla(240, 100%, 50%, .4)")] - [InlineData(typeof(StringValueNode), "hsla(240, 100%, 50%, .7)")] - [InlineData(typeof(StringValueNode), "hsla(240, 100%, 50%, 1)")] - [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / .05)")] - [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / 5%)")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) + [InlineData("hsla(240, 100%, 50%, .05)")] + [InlineData("hsla(240, 100%, 50%, .4)")] + [InlineData("hsla(240, 100%, 50%, .7)")] + [InlineData("hsla(240, 100%, 50%, 1)")] + [InlineData("hsla(240 100% 50% / .05)")] + [InlineData("hsla(240 100% 50% / 5%)")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectParseValueToMatchType<HslaType>(value, type); + ExpectCoerceOutputValueToMatch<HslaType>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] @@ -220,12 +156,12 @@ public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("hsla(270%, A0, 5F, 1.0)")] [InlineData("hsla(240, 75, .3, 25%)")] [InlineData("hsla(٢٤٠, ١٠٠%, ٥٠%, .٠٥)")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<HslaType>(value); + ExpectCoerceOutputValueToThrowSerializationException<HslaType>(value); } [Theory] @@ -236,16 +172,15 @@ public void ParseValue_GivenObject_ThrowSerializationException(object value) [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / .05)")] [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / 5%)")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<HslaType>(value, type); + ExpectValueToLiteralToMatchType<HslaType>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] @@ -256,11 +191,11 @@ public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("hsla(270%, A0, 5F, 1.0)")] [InlineData("hsla(240, 75, .3, 25%)")] [InlineData("hsla(٢٤٠, ١٠٠%, ٥٠%, .٠٥)")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<HslaType>(value); + ExpectValueToLiteralToThrowSerializationException<HslaType>(value); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv4TypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv4TypeTests.cs index 890a5f06823..201c82e6c9e 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv4TypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv4TypeTests.cs @@ -44,7 +44,7 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "0.0.0.3/2", true)] [InlineData(typeof(StringValueNode), "0.0.0.127/7", true)] [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -57,43 +57,6 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<IPv4Type>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("1", false)] - [InlineData("1.2", false)] - [InlineData("1.2.3", false)] - [InlineData("1.2.3.4", true)] - [InlineData("255.255.255.255", true)] - [InlineData("255.256.256.256", false)] - [InlineData("300.256.256.256", false)] - [InlineData("255.300.256.256", false)] - [InlineData("255.256.300.256", false)] - [InlineData("255.256.256.300", false)] - [InlineData("127.0.0.1", true)] - [InlineData("192.168.0.1", true)] - [InlineData("000.000.000.000", true)] - [InlineData("00.00.00.00", true)] - [InlineData("0.0.0.0/32", true)] - [InlineData("000.000.000.000/32", true)] - [InlineData("255.255.255.255/0", true)] - [InlineData("255.255.255.255/33", false)] - [InlineData("127.0.0.1/0", true)] - [InlineData("192.168.2.1/0", true)] - [InlineData("0.0.0.3/2", true)] - [InlineData("0.0.0.127/7", true)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<IPv4Type>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "1.2.3.4", "1.2.3.4")] [InlineData(typeof(StringValueNode), "255.255.255.255", "255.255.255.255")] @@ -109,7 +72,7 @@ public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expec [InlineData(typeof(StringValueNode), "0.0.0.3/2", "0.0.0.3/2")] [InlineData(typeof(StringValueNode), "0.0.0.127/7", "0.0.0.127/7")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -136,7 +99,7 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "255.256.300.256")] [InlineData(typeof(StringValueNode), "255.256.256.300")] [InlineData(typeof(StringValueNode), "255.255.255.255/33")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -147,124 +110,73 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("1.2.3.4", "1.2.3.4")] - [InlineData("255.255.255.255", "255.255.255.255")] - [InlineData("127.0.0.1", "127.0.0.1")] - [InlineData("192.168.0.1", "192.168.0.1")] - [InlineData("000.000.000.000", "000.000.000.000")] - [InlineData("00.00.00.00", "00.00.00.00")] - [InlineData("0.0.0.0/32", "0.0.0.0/32")] - [InlineData("000.000.000.000/32", "000.000.000.000/32")] - [InlineData("255.255.255.255/0", "255.255.255.255/0")] - [InlineData("127.0.0.1/0", "127.0.0.1/0")] - [InlineData("192.168.2.1/0", "192.168.2.1/0")] - [InlineData("0.0.0.3/2", "0.0.0.3/2")] - [InlineData("0.0.0.127/7", "0.0.0.127/7")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"1.2.3.4\"", "1.2.3.4")] + [InlineData("\"255.255.255.255\"", "255.255.255.255")] + [InlineData("\"127.0.0.1\"", "127.0.0.1")] + [InlineData("\"192.168.0.1\"", "192.168.0.1")] + [InlineData("\"000.000.000.000\"", "000.000.000.000")] + [InlineData("\"00.00.00.00\"", "00.00.00.00")] + [InlineData("\"0.0.0.0/32\"", "0.0.0.0/32")] + [InlineData("\"000.000.000.000/32\"", "000.000.000.000/32")] + [InlineData("\"255.255.255.255/0\"", "255.255.255.255/0")] + [InlineData("\"127.0.0.1/0\"", "127.0.0.1/0")] + [InlineData("\"192.168.2.1/0\"", "192.168.2.1/0")] + [InlineData("\"0.0.0.3/2\"", "0.0.0.3/2")] + [InlineData("\"0.0.0.127/7\"", "0.0.0.127/7")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<IPv4Type>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] - [InlineData("1")] - [InlineData("1.2")] - [InlineData("1.2.3")] - [InlineData("300.256.256.256")] - [InlineData("255.300.256.256")] - [InlineData("255.256.300.256")] - [InlineData("255.256.256.300")] - [InlineData("255.255.255.255/33")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<IPv4Type>(value); - } - - [Theory] - [InlineData("1.2.3.4", "1.2.3.4")] - [InlineData("255.255.255.255", "255.255.255.255")] - [InlineData("127.0.0.1", "127.0.0.1")] - [InlineData("192.168.0.1", "192.168.0.1")] - [InlineData("000.000.000.000", "000.000.000.000")] - [InlineData("00.00.00.00", "00.00.00.00")] - [InlineData("0.0.0.0/32", "0.0.0.0/32")] - [InlineData("000.000.000.000/32", "000.000.000.000/32")] - [InlineData("255.255.255.255/0", "255.255.255.255/0")] - [InlineData("127.0.0.1/0", "127.0.0.1/0")] - [InlineData("192.168.2.1/0", "192.168.2.1/0")] - [InlineData("0.0.0.3/2", "0.0.0.3/2")] - [InlineData("0.0.0.127/7", "0.0.0.127/7")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<IPv4Type>(runtimeValue, resultValue); + ExpectCoerceInputValueToMatch<IPv4Type>(jsonValue, runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] + [InlineData("1.0")] [InlineData("1")] - [InlineData("1.2")] - [InlineData("1.2.3")] - [InlineData("300.256.256.256")] - [InlineData("255.300.256.256")] - [InlineData("255.256.300.256")] - [InlineData("255.256.256.300")] - [InlineData("255.255.255.255/33")] - public void Serialize_GivenObject_ThrowSerializationException(object value) + [InlineData("12345")] + [InlineData("\"\"")] + [InlineData("\"1\"")] + [InlineData("\"1.2\"")] + [InlineData("\"1.2.3\"")] + [InlineData("\"300.256.256.256\"")] + [InlineData("\"255.300.256.256\"")] + [InlineData("\"255.256.300.256\"")] + [InlineData("\"255.256.256.300\"")] + [InlineData("\"255.255.255.255/33\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectSerializeToThrowSerializationException<IPv4Type>(value); + ExpectCoerceInputValueToThrowSerializationException<IPv4Type>(jsonValue); } [Theory] - [InlineData(typeof(StringValueNode), "1.2.3.4")] - [InlineData(typeof(StringValueNode), "255.255.255.255")] - [InlineData(typeof(StringValueNode), "127.0.0.1")] - [InlineData(typeof(StringValueNode), "192.168.0.1")] - [InlineData(typeof(StringValueNode), "000.000.000.000")] - [InlineData(typeof(StringValueNode), "00.00.00.00")] - [InlineData(typeof(StringValueNode), "0.0.0.0/32")] - [InlineData(typeof(StringValueNode), "000.000.000.000/32")] - [InlineData(typeof(StringValueNode), "255.255.255.255/0")] - [InlineData(typeof(StringValueNode), "127.0.0.1/0")] - [InlineData(typeof(StringValueNode), "192.168.2.1/0")] - [InlineData(typeof(StringValueNode), "0.0.0.3/2")] - [InlineData(typeof(StringValueNode), "0.0.0.127/7")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) + [InlineData("1.2.3.4")] + [InlineData("255.255.255.255")] + [InlineData("127.0.0.1")] + [InlineData("192.168.0.1")] + [InlineData("000.000.000.000")] + [InlineData("00.00.00.00")] + [InlineData("0.0.0.0/32")] + [InlineData("000.000.000.000/32")] + [InlineData("255.255.255.255/0")] + [InlineData("127.0.0.1/0")] + [InlineData("192.168.2.1/0")] + [InlineData("0.0.0.3/2")] + [InlineData("0.0.0.127/7")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectParseValueToMatchType<IPv4Type>(value, type); + ExpectCoerceOutputValueToMatch<IPv4Type>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] @@ -277,12 +189,12 @@ public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("255.256.300.256")] [InlineData("255.256.256.300")] [InlineData("255.255.255.255/33")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<IPv4Type>(value); + ExpectCoerceOutputValueToThrowSerializationException<IPv4Type>(value); } [Theory] @@ -300,16 +212,15 @@ public void ParseValue_GivenObject_ThrowSerializationException(object value) [InlineData(typeof(StringValueNode), "0.0.0.3/2")] [InlineData(typeof(StringValueNode), "0.0.0.127/7")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<IPv4Type>(value, type); + ExpectValueToLiteralToMatchType<IPv4Type>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] @@ -322,11 +233,11 @@ public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("255.256.300.256")] [InlineData("255.256.256.300")] [InlineData("255.255.255.255/33")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<IPv4Type>(value); + ExpectValueToLiteralToThrowSerializationException<IPv4Type>(value); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv6TypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv6TypeTests.cs index fdcefc497b6..7f991f6d88c 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv6TypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv6TypeTests.cs @@ -72,7 +72,7 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "6:5:4:3:2:1::", true)] [InlineData(typeof(StringValueNode), "7:6:5:4:3:2:1::", true)] [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -85,71 +85,6 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<IPv6Type>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("1", false)] - [InlineData("1.2", false)] - [InlineData("1.2.3", false)] - [InlineData("2001:db8::7/32", true)] - [InlineData("a:b:c:d:e::1.2.3.4/13", true)] - [InlineData("a:b:c:d:e::1.2.3.4/64", true)] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/0", true)] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/32", true)] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/128", true)] - [InlineData("1080:0:0:0:8:800:200C:417A/27", true)] - [InlineData("2001:db8::7", true)] - [InlineData("a:b:c:d:e::1.2.3.4", true)] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", true)] - [InlineData("1080:0:0:0:8:800:200C:417A", true)] - [InlineData("::1:2:3:4:5:6:7", true)] - [InlineData("::1:2:3:4:5:6", true)] - [InlineData("1::1:2:3:4:5:6", true)] - [InlineData("::1:2:3:4:5", true)] - [InlineData("1::1:2:3:4:5", true)] - [InlineData("2:1::1:2:3:4:5", true)] - [InlineData("::1:2:3:4", true)] - [InlineData("1::1:2:3:4", true)] - [InlineData("2:1::1:2:3:4", true)] - [InlineData("3:2:1::1:2:3:4", true)] - [InlineData("::1:2:3", true)] - [InlineData("1::1:2:3", true)] - [InlineData("2:1::1:2:3", true)] - [InlineData("2:1::", true)] - [InlineData("3:2:1::1:2:3", true)] - [InlineData("4:3:2:1::1:2:3", true)] - [InlineData("::1:2", true)] - [InlineData("1::1:2", true)] - [InlineData("2:1::1:2", true)] - [InlineData("3:2:1::1:2", true)] - [InlineData("4:3:2:1::1:2", true)] - [InlineData("5:4:3:2:1::1:2", true)] - [InlineData("::1", true)] - [InlineData("1::1", true)] - [InlineData("2:1::1", true)] - [InlineData("3:2:1::1", true)] - [InlineData("4:3:2:1::1", true)] - [InlineData("5:4:3:2:1::1", true)] - [InlineData("6:5:4:3:2:1::1", true)] - [InlineData("::", true)] - [InlineData("1::", true)] - [InlineData("3:2:1::", true)] - [InlineData("4:3:2:1::", true)] - [InlineData("5:4:3:2:1::", true)] - [InlineData("6:5:4:3:2:1::", true)] - [InlineData("7:6:5:4:3:2:1::", true)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<IPv6Type>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "2001:db8::7/32", "2001:db8::7/32")] [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.4/13", "a:b:c:d:e::1.2.3.4/13")] @@ -211,7 +146,7 @@ public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expec [InlineData(typeof(StringValueNode), "6:5:4:3:2:1::", "6:5:4:3:2:1::")] [InlineData(typeof(StringValueNode), "7:6:5:4:3:2:1::", "7:6:5:4:3:2:1::")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -242,7 +177,7 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.22:100")] [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3..4/13")] [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210FEDC:BA98:7654:3210")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -253,241 +188,71 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("2001:db8::7/32", "2001:db8::7/32")] - [InlineData("a:b:c:d:e::1.2.3.4/13", "a:b:c:d:e::1.2.3.4/13")] - [InlineData("a:b:c:d:e::1.2.3.4/64", "a:b:c:d:e::1.2.3.4/64")] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/0", + [InlineData("\"2001:db8::7/32\"", "2001:db8::7/32")] + [InlineData("\"a:b:c:d:e::1.2.3.4/13\"", "a:b:c:d:e::1.2.3.4/13")] + [InlineData("\"a:b:c:d:e::1.2.3.4/64\"", "a:b:c:d:e::1.2.3.4/64")] + [InlineData("\"FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/0\"", "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/0")] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/32", + [InlineData("\"FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/32\"", "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/32")] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/128", + [InlineData("\"FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/128\"", "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/128")] - [InlineData("1080:0:0:0:8:800:200C:417A/27", "1080:0:0:0:8:800:200C:417A/27")] - [InlineData("2001:db8::7", "2001:db8::7")] - [InlineData("a:b:c:d:e::1.2.3.4", "a:b:c:d:e::1.2.3.4")] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", - "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210")] - [InlineData("1080:0:0:0:8:800:200C:417A", "1080:0:0:0:8:800:200C:417A")] - [InlineData("::1:2:3:4:5:6:7", "::1:2:3:4:5:6:7")] - [InlineData("::1:2:3:4:5:6", "::1:2:3:4:5:6")] - [InlineData("1::1:2:3:4:5:6", "1::1:2:3:4:5:6")] - [InlineData("::1:2:3:4:5", "::1:2:3:4:5")] - [InlineData("1::1:2:3:4:5", "1::1:2:3:4:5")] - [InlineData("2:1::1:2:3:4:5", "2:1::1:2:3:4:5")] - [InlineData("::1:2:3:4", "::1:2:3:4")] - [InlineData("1::1:2:3:4", "1::1:2:3:4")] - [InlineData("2:1::1:2:3:4", "2:1::1:2:3:4")] - [InlineData("3:2:1::1:2:3:4", "3:2:1::1:2:3:4")] - [InlineData("::1:2:3", "::1:2:3")] - [InlineData("1::1:2:3", "1::1:2:3")] - [InlineData("2:1::1:2:3", "2:1::1:2:3")] - [InlineData("2:1::", "2:1::")] - [InlineData("3:2:1::1:2:3", "3:2:1::1:2:3")] - [InlineData("4:3:2:1::1:2:3", "4:3:2:1::1:2:3")] - [InlineData("::1:2", "::1:2")] - [InlineData("1::1:2", "1::1:2")] - [InlineData("2:1::1:2", "2:1::1:2")] - [InlineData("3:2:1::1:2", "3:2:1::1:2")] - [InlineData("4:3:2:1::1:2", "4:3:2:1::1:2")] - [InlineData("5:4:3:2:1::1:2", "5:4:3:2:1::1:2")] - [InlineData("::1", "::1")] - [InlineData("1::1", "1::1")] - [InlineData("2:1::1", "2:1::1")] - [InlineData("3:2:1::1", "3:2:1::1")] - [InlineData("4:3:2:1::1", "4:3:2:1::1")] - [InlineData("5:4:3:2:1::1", "5:4:3:2:1::1")] - [InlineData("6:5:4:3:2:1::1", "6:5:4:3:2:1::1")] - [InlineData("::", "::")] - [InlineData("1::", "1::")] - [InlineData("3:2:1::", "3:2:1::")] - [InlineData("4:3:2:1::", "4:3:2:1::")] - [InlineData("5:4:3:2:1::", "5:4:3:2:1::")] - [InlineData("6:5:4:3:2:1::", "6:5:4:3:2:1::")] - [InlineData("7:6:5:4:3:2:1::", "7:6:5:4:3:2:1::")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"1080:0:0:0:8:800:200C:417A/27\"", "1080:0:0:0:8:800:200C:417A/27")] + [InlineData("\"2001:db8::7\"", "2001:db8::7")] + [InlineData("\"a:b:c:d:e::1.2.3.4\"", "a:b:c:d:e::1.2.3.4")] + [InlineData("\"::1\"", "::1")] + [InlineData("\"::\"", "::")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<IPv6Type>(resultValue, runtimeValue); + ExpectCoerceInputValueToMatch<IPv6Type>(jsonValue, runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] + [InlineData("1.0")] [InlineData("1")] - [InlineData("1.2")] - [InlineData("1.2.3")] - [InlineData("19.117.63.126")] - [InlineData("300.256.256.256")] - [InlineData("255.300.256.256")] - [InlineData("255.256.300.256")] - [InlineData("255.256.256.300")] - [InlineData("255.255.255.255/33")] - [InlineData("a:b:c:d:e::1.2.3.22:100")] - [InlineData("a:b:c:d:e::1.2.3..4/13")] - [InlineData("FEDC:BA98:7654:3210FEDC:BA98:7654:3210")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<IPv6Type>(value); - } - - [Theory] - [InlineData("2001:db8::7/32", "2001:db8::7/32")] - [InlineData("a:b:c:d:e::1.2.3.4/13", "a:b:c:d:e::1.2.3.4/13")] - [InlineData("a:b:c:d:e::1.2.3.4/64", "a:b:c:d:e::1.2.3.4/64")] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/0", - "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/0")] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/32", - "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/32")] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/128", - "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/128")] - [InlineData("1080:0:0:0:8:800:200C:417A/27", "1080:0:0:0:8:800:200C:417A/27")] - [InlineData("2001:db8::7", "2001:db8::7")] - [InlineData("a:b:c:d:e::1.2.3.4", "a:b:c:d:e::1.2.3.4")] - [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", - "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210")] - [InlineData("1080:0:0:0:8:800:200C:417A", "1080:0:0:0:8:800:200C:417A")] - [InlineData("::1:2:3:4:5:6:7", "::1:2:3:4:5:6:7")] - [InlineData("::1:2:3:4:5:6", "::1:2:3:4:5:6")] - [InlineData("1::1:2:3:4:5:6", "1::1:2:3:4:5:6")] - [InlineData("::1:2:3:4:5", "::1:2:3:4:5")] - [InlineData("1::1:2:3:4:5", "1::1:2:3:4:5")] - [InlineData("2:1::1:2:3:4:5", "2:1::1:2:3:4:5")] - [InlineData("::1:2:3:4", "::1:2:3:4")] - [InlineData("1::1:2:3:4", "1::1:2:3:4")] - [InlineData("2:1::1:2:3:4", "2:1::1:2:3:4")] - [InlineData("3:2:1::1:2:3:4", "3:2:1::1:2:3:4")] - [InlineData("::1:2:3", "::1:2:3")] - [InlineData("1::1:2:3", "1::1:2:3")] - [InlineData("2:1::1:2:3", "2:1::1:2:3")] - [InlineData("2:1::", "2:1::")] - [InlineData("3:2:1::1:2:3", "3:2:1::1:2:3")] - [InlineData("4:3:2:1::1:2:3", "4:3:2:1::1:2:3")] - [InlineData("::1:2", "::1:2")] - [InlineData("1::1:2", "1::1:2")] - [InlineData("2:1::1:2", "2:1::1:2")] - [InlineData("3:2:1::1:2", "3:2:1::1:2")] - [InlineData("4:3:2:1::1:2", "4:3:2:1::1:2")] - [InlineData("5:4:3:2:1::1:2", "5:4:3:2:1::1:2")] - [InlineData("::1", "::1")] - [InlineData("1::1", "1::1")] - [InlineData("2:1::1", "2:1::1")] - [InlineData("3:2:1::1", "3:2:1::1")] - [InlineData("4:3:2:1::1", "4:3:2:1::1")] - [InlineData("5:4:3:2:1::1", "5:4:3:2:1::1")] - [InlineData("6:5:4:3:2:1::1", "6:5:4:3:2:1::1")] - [InlineData("::", "::")] - [InlineData("1::", "1::")] - [InlineData("3:2:1::", "3:2:1::")] - [InlineData("4:3:2:1::", "4:3:2:1::")] - [InlineData("5:4:3:2:1::", "5:4:3:2:1::")] - [InlineData("6:5:4:3:2:1::", "6:5:4:3:2:1::")] - [InlineData("7:6:5:4:3:2:1::", "7:6:5:4:3:2:1::")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) + [InlineData("12345")] + [InlineData("\"\"")] + [InlineData("\"1\"")] + [InlineData("\"1.2\"")] + [InlineData("\"1.2.3\"")] + [InlineData("\"19.117.63.126\"")] + [InlineData("\"300.256.256.256\"")] + [InlineData("\"a:b:c:d:e::1.2.3.22:100\"")] + [InlineData("\"a:b:c:d:e::1.2.3..4/13\"")] + [InlineData("\"FEDC:BA98:7654:3210FEDC:BA98:7654:3210\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectSerializeToMatch<IPv6Type>(runtimeValue, resultValue); + ExpectCoerceInputValueToThrowSerializationException<IPv6Type>(jsonValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] - [InlineData("1")] - [InlineData("1.2")] - [InlineData("1.2.3")] - [InlineData("19.117.63.126")] - [InlineData("300.256.256.256")] - [InlineData("255.300.256.256")] - [InlineData("255.256.300.256")] - [InlineData("255.256.256.300")] - [InlineData("255.255.255.255/33")] - [InlineData("a:b:c:d:e::1.2.3.22:100")] - [InlineData("a:b:c:d:e::1.2.3..4/13")] - [InlineData("FEDC:BA98:7654:3210FEDC:BA98:7654:3210")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<IPv6Type>(value); - } - - [Theory] - [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.4/13")] - [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.4/64")] - [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/0")] - [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/32")] - [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/128")] - [InlineData(typeof(StringValueNode), "1080:0:0:0:8:800:200C:417A/27")] - [InlineData(typeof(StringValueNode), "2001:db8::7")] - [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.4")] - [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210")] - [InlineData(typeof(StringValueNode), "1080:0:0:0:8:800:200C:417A")] - [InlineData(typeof(StringValueNode), "::1:2:3:4:5:6:7")] - [InlineData(typeof(StringValueNode), "::1:2:3:4:5:6")] - [InlineData(typeof(StringValueNode), "1::1:2:3:4:5:6")] - [InlineData(typeof(StringValueNode), "::1:2:3:4:5")] - [InlineData(typeof(StringValueNode), "1::1:2:3:4:5")] - [InlineData(typeof(StringValueNode), "2:1::1:2:3:4:5")] - [InlineData(typeof(StringValueNode), "::1:2:3:4")] - [InlineData(typeof(StringValueNode), "1::1:2:3:4")] - [InlineData(typeof(StringValueNode), "2:1::1:2:3:4")] - [InlineData(typeof(StringValueNode), "3:2:1::1:2:3:4")] - [InlineData(typeof(StringValueNode), "::1:2:3")] - [InlineData(typeof(StringValueNode), "1::1:2:3")] - [InlineData(typeof(StringValueNode), "2:1::1:2:3")] - [InlineData(typeof(StringValueNode), "2:1::")] - [InlineData(typeof(StringValueNode), "3:2:1::1:2:3")] - [InlineData(typeof(StringValueNode), "4:3:2:1::1:2:3")] - [InlineData(typeof(StringValueNode), "::1:2")] - [InlineData(typeof(StringValueNode), "1::1:2")] - [InlineData(typeof(StringValueNode), "2:1::1:2")] - [InlineData(typeof(StringValueNode), "3:2:1::1:2")] - [InlineData(typeof(StringValueNode), "4:3:2:1::1:2")] - [InlineData(typeof(StringValueNode), "5:4:3:2:1::1:2")] - [InlineData(typeof(StringValueNode), "::1")] - [InlineData(typeof(StringValueNode), "1::1")] - [InlineData(typeof(StringValueNode), "2:1::1")] - [InlineData(typeof(StringValueNode), "3:2:1::1")] - [InlineData(typeof(StringValueNode), "4:3:2:1::1")] - [InlineData(typeof(StringValueNode), "5:4:3:2:1::1")] - [InlineData(typeof(StringValueNode), "6:5:4:3:2:1::1")] - [InlineData(typeof(StringValueNode), "::")] - [InlineData(typeof(StringValueNode), "1::")] - [InlineData(typeof(StringValueNode), "3:2:1::")] - [InlineData(typeof(StringValueNode), "4:3:2:1::")] - [InlineData(typeof(StringValueNode), "5:4:3:2:1::")] - [InlineData(typeof(StringValueNode), "6:5:4:3:2:1::")] - [InlineData(typeof(StringValueNode), "7:6:5:4:3:2:1::")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) + [InlineData("2001:db8::7/32")] + [InlineData("a:b:c:d:e::1.2.3.4/13")] + [InlineData("a:b:c:d:e::1.2.3.4/64")] + [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/0")] + [InlineData("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/32")] + [InlineData("1080:0:0:0:8:800:200C:417A/27")] + [InlineData("2001:db8::7")] + [InlineData("a:b:c:d:e::1.2.3.4")] + [InlineData("::1")] + [InlineData("::")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectParseValueToMatchType<IPv6Type>(value, type); + ExpectCoerceOutputValueToMatch<IPv6Type>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] @@ -497,19 +262,15 @@ public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("1.2.3")] [InlineData("19.117.63.126")] [InlineData("300.256.256.256")] - [InlineData("255.300.256.256")] - [InlineData("255.256.300.256")] - [InlineData("255.256.256.300")] - [InlineData("255.255.255.255/33")] [InlineData("a:b:c:d:e::1.2.3.22:100")] [InlineData("a:b:c:d:e::1.2.3..4/13")] [InlineData("FEDC:BA98:7654:3210FEDC:BA98:7654:3210")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<IPv6Type>(value); + ExpectCoerceOutputValueToThrowSerializationException<IPv6Type>(value); } [Theory] @@ -517,59 +278,21 @@ public void ParseValue_GivenObject_ThrowSerializationException(object value) [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.4/64")] [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/0")] [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/32")] - [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/128")] [InlineData(typeof(StringValueNode), "1080:0:0:0:8:800:200C:417A/27")] [InlineData(typeof(StringValueNode), "2001:db8::7")] [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.4")] - [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210")] - [InlineData(typeof(StringValueNode), "1080:0:0:0:8:800:200C:417A")] - [InlineData(typeof(StringValueNode), "::1:2:3:4:5:6:7")] - [InlineData(typeof(StringValueNode), "::1:2:3:4:5:6")] - [InlineData(typeof(StringValueNode), "1::1:2:3:4:5:6")] - [InlineData(typeof(StringValueNode), "::1:2:3:4:5")] - [InlineData(typeof(StringValueNode), "1::1:2:3:4:5")] - [InlineData(typeof(StringValueNode), "2:1::1:2:3:4:5")] - [InlineData(typeof(StringValueNode), "::1:2:3:4")] - [InlineData(typeof(StringValueNode), "1::1:2:3:4")] - [InlineData(typeof(StringValueNode), "2:1::1:2:3:4")] - [InlineData(typeof(StringValueNode), "3:2:1::1:2:3:4")] - [InlineData(typeof(StringValueNode), "::1:2:3")] - [InlineData(typeof(StringValueNode), "1::1:2:3")] - [InlineData(typeof(StringValueNode), "2:1::1:2:3")] - [InlineData(typeof(StringValueNode), "2:1::")] - [InlineData(typeof(StringValueNode), "3:2:1::1:2:3")] - [InlineData(typeof(StringValueNode), "4:3:2:1::1:2:3")] - [InlineData(typeof(StringValueNode), "::1:2")] - [InlineData(typeof(StringValueNode), "1::1:2")] - [InlineData(typeof(StringValueNode), "2:1::1:2")] - [InlineData(typeof(StringValueNode), "3:2:1::1:2")] - [InlineData(typeof(StringValueNode), "4:3:2:1::1:2")] - [InlineData(typeof(StringValueNode), "5:4:3:2:1::1:2")] [InlineData(typeof(StringValueNode), "::1")] - [InlineData(typeof(StringValueNode), "1::1")] - [InlineData(typeof(StringValueNode), "2:1::1")] - [InlineData(typeof(StringValueNode), "3:2:1::1")] - [InlineData(typeof(StringValueNode), "4:3:2:1::1")] - [InlineData(typeof(StringValueNode), "5:4:3:2:1::1")] - [InlineData(typeof(StringValueNode), "6:5:4:3:2:1::1")] [InlineData(typeof(StringValueNode), "::")] - [InlineData(typeof(StringValueNode), "1::")] - [InlineData(typeof(StringValueNode), "3:2:1::")] - [InlineData(typeof(StringValueNode), "4:3:2:1::")] - [InlineData(typeof(StringValueNode), "5:4:3:2:1::")] - [InlineData(typeof(StringValueNode), "6:5:4:3:2:1::")] - [InlineData(typeof(StringValueNode), "7:6:5:4:3:2:1::")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<IPv6Type>(value, type); + ExpectValueToLiteralToMatchType<IPv6Type>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] @@ -579,18 +302,14 @@ public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("1.2.3")] [InlineData("19.117.63.126")] [InlineData("300.256.256.256")] - [InlineData("255.300.256.256")] - [InlineData("255.256.300.256")] - [InlineData("255.256.256.300")] - [InlineData("255.255.255.255/33")] [InlineData("a:b:c:d:e::1.2.3.22:100")] [InlineData("a:b:c:d:e::1.2.3..4/13")] [InlineData("FEDC:BA98:7654:3210FEDC:BA98:7654:3210")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<IPv6Type>(value); + ExpectValueToLiteralToThrowSerializationException<IPv6Type>(value); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/IsbnTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/IsbnTypeTests.cs index 7d4dd302c49..8d46d78b12d 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/IsbnTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/IsbnTypeTests.cs @@ -47,7 +47,7 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "978-0615-856-73-5", true)] [InlineData(typeof(StringValueNode), "9780765335999", true)] [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -60,46 +60,6 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<IsbnType>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("978 787 7878", false)] - [InlineData("978-0615-856", false)] - [InlineData("978-0615856735", false)] - [InlineData("ISBN 978 787 78 78788", false)] - [InlineData("ISBN 97907653359990", false)] - [InlineData("ISBN-13: 978-0615856735", false)] - [InlineData("ISBN: 978-0615-856", false)] - [InlineData("ISBN 978-0-596-52068-7", true)] - [InlineData("ISBN-13: 978-0-596-52068-7", true)] - [InlineData("978 0 596 52068 7", true)] - [InlineData("9780596520687", true)] - [InlineData("ISBN-10 0-596-52068-9", true)] - [InlineData("0-596-52068-9", true)] - [InlineData("ISBN: 9780615856", true)] - [InlineData("1577677171", true)] - [InlineData("978 787 78 78", true)] - [InlineData("9790765335", true)] - [InlineData("979076533X", true)] - [InlineData("9780615856", true)] - [InlineData("ISBN 978-0615-856-73-5", true)] - [InlineData("ISBN-13: 978-0615-856-73-5", true)] - [InlineData("ISBN-13: 9780765335999", true)] - [InlineData("ISBN: 9780615856735", true)] - [InlineData("978-0615-856-73-5", true)] - [InlineData("9780765335999", true)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<IsbnType>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "ISBN 978-0-596-52068-7", "ISBN 978-0-596-52068-7")] [InlineData(typeof(StringValueNode), "ISBN-13: 978-0-596-52068-7", "ISBN-13: 978-0-596-52068-7")] @@ -120,7 +80,7 @@ public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expec [InlineData(typeof(StringValueNode), "978-0615-856-73-5", "978-0615-856-73-5")] [InlineData(typeof(StringValueNode), "9780765335999", "9780765335999")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -154,7 +114,7 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "ISBN: X9780615856735")] [InlineData(typeof(StringValueNode), "ISBN-13: 978-0615-56-73-5")] [InlineData(typeof(StringValueNode), "ISBN-13: 9780X765335999")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -165,152 +125,90 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("ISBN 978-0-596-52068-7", "ISBN 978-0-596-52068-7")] - [InlineData("ISBN-13: 978-0-596-52068-7", "ISBN-13: 978-0-596-52068-7")] - [InlineData("978 0 596 52068 7", "978 0 596 52068 7")] - [InlineData("9780596520687", "9780596520687")] - [InlineData("ISBN-10 0-596-52068-9", "ISBN-10 0-596-52068-9")] - [InlineData("0-596-52068-9", "0-596-52068-9")] - [InlineData("ISBN: 9780615856", "ISBN: 9780615856")] - [InlineData("1577677171", "1577677171")] - [InlineData("978 787 78 78", "978 787 78 78")] - [InlineData("9790765335", "9790765335")] - [InlineData("979076533X", "979076533X")] - [InlineData("9780615856", "9780615856")] - [InlineData("ISBN 978-0615-856-73-5", "ISBN 978-0615-856-73-5")] - [InlineData("ISBN-13: 978-0615-856-73-5", "ISBN-13: 978-0615-856-73-5")] - [InlineData("ISBN-13: 9780765335999", "ISBN-13: 9780765335999")] - [InlineData("ISBN: 9780615856735", "ISBN: 9780615856735")] - [InlineData("978-0615-856-73-5", "978-0615-856-73-5")] - [InlineData("9780765335999", "9780765335999")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"ISBN 978-0-596-52068-7\"", "ISBN 978-0-596-52068-7")] + [InlineData("\"ISBN-13: 978-0-596-52068-7\"", "ISBN-13: 978-0-596-52068-7")] + [InlineData("\"978 0 596 52068 7\"", "978 0 596 52068 7")] + [InlineData("\"9780596520687\"", "9780596520687")] + [InlineData("\"ISBN-10 0-596-52068-9\"", "ISBN-10 0-596-52068-9")] + [InlineData("\"0-596-52068-9\"", "0-596-52068-9")] + [InlineData("\"ISBN: 9780615856\"", "ISBN: 9780615856")] + [InlineData("\"1577677171\"", "1577677171")] + [InlineData("\"978 787 78 78\"", "978 787 78 78")] + [InlineData("\"9790765335\"", "9790765335")] + [InlineData("\"979076533X\"", "979076533X")] + [InlineData("\"9780615856\"", "9780615856")] + [InlineData("\"ISBN 978-0615-856-73-5\"", "ISBN 978-0615-856-73-5")] + [InlineData("\"ISBN-13: 978-0615-856-73-5\"", "ISBN-13: 978-0615-856-73-5")] + [InlineData("\"ISBN-13: 9780765335999\"", "ISBN-13: 9780765335999")] + [InlineData("\"ISBN: 9780615856735\"", "ISBN: 9780615856735")] + [InlineData("\"978-0615-856-73-5\"", "978-0615-856-73-5")] + [InlineData("\"9780765335999\"", "9780765335999")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<IsbnType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] - [InlineData("1")] - [InlineData("0-200-xxxxx-x")] - [InlineData("1-714-2x4x3-x")] - [InlineData("0-6480000-x-x")] - [InlineData("0-9999999-x-x")] - [InlineData("1-7320000-x-x")] - [InlineData("1-915999-xx-x")] - [InlineData("1-86719-xxx-x")] - [InlineData("ISBN 1-7320000-x-8")] - [InlineData("ISBN1-915999-87-x")] - [InlineData("ISBN:131-86719-xxx-x")] - [InlineData("ISBN 9718-0615-856-73-5")] - [InlineData("ISBN: X9780615856735")] - [InlineData("ISBN-13: 978-0615-56-73-5")] - [InlineData("ISBN-13: 9780X765335999")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<IsbnType>(value); - } - - [Theory] - [InlineData("ISBN 978-0-596-52068-7", "ISBN 978-0-596-52068-7")] - [InlineData("ISBN-13: 978-0-596-52068-7", "ISBN-13: 978-0-596-52068-7")] - [InlineData("978 0 596 52068 7", "978 0 596 52068 7")] - [InlineData("9780596520687", "9780596520687")] - [InlineData("ISBN-10 0-596-52068-9", "ISBN-10 0-596-52068-9")] - [InlineData("0-596-52068-9", "0-596-52068-9")] - [InlineData("ISBN: 9780615856", "ISBN: 9780615856")] - [InlineData("1577677171", "1577677171")] - [InlineData("978 787 78 78", "978 787 78 78")] - [InlineData("9790765335", "9790765335")] - [InlineData("979076533X", "979076533X")] - [InlineData("9780615856", "9780615856")] - [InlineData("ISBN 978-0615-856-73-5", "ISBN 978-0615-856-73-5")] - [InlineData("ISBN-13: 978-0615-856-73-5", "ISBN-13: 978-0615-856-73-5")] - [InlineData("ISBN-13: 9780765335999", "ISBN-13: 9780765335999")] - [InlineData("ISBN: 9780615856735", "ISBN: 9780615856735")] - [InlineData("978-0615-856-73-5", "978-0615-856-73-5")] - [InlineData("9780765335999", "9780765335999")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<IsbnType>(runtimeValue, resultValue); + ExpectCoerceInputValueToMatch<IsbnType>(jsonValue, runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] + [InlineData("1.0")] [InlineData("1")] - [InlineData("0-200-xxxxx-x")] - [InlineData("1-714-2x4x3-x")] - [InlineData("0-6480000-x-x")] - [InlineData("0-9999999-x-x")] - [InlineData("1-7320000-x-x")] - [InlineData("1-915999-xx-x")] - [InlineData("1-86719-xxx-x")] - [InlineData("ISBN 1-7320000-x-8")] - [InlineData("ISBN1-915999-87-x")] - [InlineData("ISBN:131-86719-xxx-x")] - [InlineData("ISBN 9718-0615-856-73-5")] - [InlineData("ISBN: X9780615856735")] - [InlineData("ISBN-13: 978-0615-56-73-5")] - [InlineData("ISBN-13: 9780X765335999")] - public void Serialize_GivenObject_ThrowSerializationException(object value) + [InlineData("12345")] + [InlineData("\"\"")] + [InlineData("\"1\"")] + [InlineData("\"0-200-xxxxx-x\"")] + [InlineData("\"1-714-2x4x3-x\"")] + [InlineData("\"0-6480000-x-x\"")] + [InlineData("\"0-9999999-x-x\"")] + [InlineData("\"1-7320000-x-x\"")] + [InlineData("\"1-915999-xx-x\"")] + [InlineData("\"1-86719-xxx-x\"")] + [InlineData("\"ISBN 1-7320000-x-8\"")] + [InlineData("\"ISBN1-915999-87-x\"")] + [InlineData("\"ISBN:131-86719-xxx-x\"")] + [InlineData("\"ISBN 9718-0615-856-73-5\"")] + [InlineData("\"ISBN: X9780615856735\"")] + [InlineData("\"ISBN-13: 978-0615-56-73-5\"")] + [InlineData("\"ISBN-13: 9780X765335999\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectSerializeToThrowSerializationException<IsbnType>(value); + ExpectCoerceInputValueToThrowSerializationException<IsbnType>(jsonValue); } [Theory] - [InlineData(typeof(StringValueNode), "ISBN-13: 978-0-596-52068-7")] - [InlineData(typeof(StringValueNode), "978 0 596 52068 7")] - [InlineData(typeof(StringValueNode), "9780596520687")] - [InlineData(typeof(StringValueNode), "ISBN-10 0-596-52068-9")] - [InlineData(typeof(StringValueNode), "0-596-52068-9")] - [InlineData(typeof(StringValueNode), "ISBN: 9780615856")] - [InlineData(typeof(StringValueNode), "1577677171")] - [InlineData(typeof(StringValueNode), "978 787 78 78")] - [InlineData(typeof(StringValueNode), "9790765335")] - [InlineData(typeof(StringValueNode), "979076533X")] - [InlineData(typeof(StringValueNode), "9780615856")] - [InlineData(typeof(StringValueNode), "ISBN 978-0615-856-73-5")] - [InlineData(typeof(StringValueNode), "ISBN-13: 978-0615-856-73-5")] - [InlineData(typeof(StringValueNode), "ISBN-13: 9780765335999")] - [InlineData(typeof(StringValueNode), "ISBN: 9780615856735")] - [InlineData(typeof(StringValueNode), "978-0615-856-73-5")] - [InlineData(typeof(StringValueNode), "9780765335999")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) + [InlineData("ISBN 978-0-596-52068-7")] + [InlineData("ISBN-13: 978-0-596-52068-7")] + [InlineData("978 0 596 52068 7")] + [InlineData("9780596520687")] + [InlineData("ISBN-10 0-596-52068-9")] + [InlineData("0-596-52068-9")] + [InlineData("ISBN: 9780615856")] + [InlineData("1577677171")] + [InlineData("978 787 78 78")] + [InlineData("9790765335")] + [InlineData("979076533X")] + [InlineData("9780615856")] + [InlineData("ISBN 978-0615-856-73-5")] + [InlineData("ISBN-13: 978-0615-856-73-5")] + [InlineData("ISBN-13: 9780765335999")] + [InlineData("ISBN: 9780615856735")] + [InlineData("978-0615-856-73-5")] + [InlineData("9780765335999")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectParseValueToMatchType<IsbnType>(value, type); + ExpectCoerceOutputValueToMatch<IsbnType>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] @@ -330,12 +228,12 @@ public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("ISBN: X9780615856735")] [InlineData("ISBN-13: 978-0615-56-73-5")] [InlineData("ISBN-13: 9780X765335999")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<IsbnType>(value); + ExpectCoerceOutputValueToThrowSerializationException<IsbnType>(value); } [Theory] @@ -357,16 +255,15 @@ public void ParseValue_GivenObject_ThrowSerializationException(object value) [InlineData(typeof(StringValueNode), "978-0615-856-73-5")] [InlineData(typeof(StringValueNode), "9780765335999")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<IsbnType>(value, type); + ExpectValueToLiteralToMatchType<IsbnType>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] @@ -386,11 +283,11 @@ public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("ISBN: X9780615856735")] [InlineData("ISBN-13: 978-0615-56-73-5")] [InlineData("ISBN-13: 9780X765335999")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<IsbnType>(value); + ExpectValueToLiteralToThrowSerializationException<IsbnType>(value); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs index 1d1de21f986..25339c269ed 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs @@ -1,7 +1,11 @@ +using System.Text.Json; using CookieCrumble.Xunit.Attributes; using HotChocolate.Execution; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using Microsoft.Extensions.DependencyInjection; +using Moq; namespace HotChocolate.Types; @@ -44,140 +48,98 @@ protected void Latitude_ExpectIsStringInstanceToMatch() } [Fact] - protected void Latitude_ExpectIsDoubleInstanceToMatch() - { - // arrange - var scalar = CreateType<LatitudeType>(); - const double valueSyntax = 89d; - - // act - var result = scalar.IsInstanceOfType(valueSyntax); - - // assert - Assert.True(result); - } - - [Fact] - protected void Latitude_ExpectIsDoubleInstanceToFail_LessThanMin() - { - // arrange - var scalar = CreateType<LatitudeType>(); - const double valueSyntax = -91d; - - // act - var result = scalar.IsInstanceOfType(valueSyntax); - - // assert - Assert.False(result); - } - - [Fact] - protected void Latitude_ExpectIsDoubleInstanceToFail_GreaterThanMax() - { - // arrange - var scalar = CreateType<LatitudeType>(); - const double valueSyntax = 91d; - - // act - var result = scalar.IsInstanceOfType(valueSyntax); - - // assert - Assert.False(result); - } - - [Fact] - protected void Latitude_ExpectParseResultToMatchNull() + protected void Latitude_ExpectValueToLiteralToMatchNull() { // arrange ScalarType scalar = new LatitudeType(); object valueSyntax = null!; // act - var result = scalar.ParseResult(valueSyntax); + var result = scalar.ValueToLiteral(valueSyntax); // assert Assert.Equal(typeof(NullValueNode), result.GetType()); } [Fact] - protected void Latitude_ExpectParseResultToThrowOnInvalidString() + protected void Latitude_ExpectValueToLiteralToThrowOnInvalidString() { // arrange ScalarType scalar = new LatitudeType(); const string valueSyntax = "92° 0' 0.000\" S"; // act - var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); + var result = Record.Exception(() => scalar.ValueToLiteral(valueSyntax)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Latitude_ExpectParseResultToMatchInt() + protected void Latitude_ExpectValueToLiteralToMatchInt() { // arrange ScalarType scalar = new LatitudeType(); const int valueSyntax = 89; // act - var result = scalar.ParseResult(valueSyntax); + var result = scalar.ValueToLiteral(valueSyntax); // assert Assert.Equal(typeof(StringValueNode), result.GetType()); } [Fact] - protected void Latitude_ExpectParseResultToThrowOnInvalidInt() + protected void Latitude_ExpectValueToLiteralToThrowOnInvalidInt() { // arrange ScalarType scalar = new LatitudeType(); const int valueSyntax = 92; // act - var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); + var result = Record.Exception(() => scalar.ValueToLiteral(valueSyntax)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Latitude_ExpectParseResultToMatchDouble() + protected void Latitude_ExpectValueToLiteralToMatchDouble() { // arrange ScalarType scalar = new LatitudeType(); const double valueSyntax = 89d; // act - var result = scalar.ParseResult(valueSyntax); + var result = scalar.ValueToLiteral(valueSyntax); // assert Assert.Equal(typeof(StringValueNode), result.GetType()); } [Fact] - protected void Latitude_ExpectParseResultToThrowOnInvalidDouble() + protected void Latitude_ExpectValueToLiteralToThrowOnInvalidDouble() { // arrange ScalarType scalar = new LatitudeType(); const double valueSyntax = 92d; // act - var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); + var result = Record.Exception(() => scalar.ValueToLiteral(valueSyntax)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Latitude_ExpectParseResultToThrowOnInvalidType() + protected void Latitude_ExpectValueToLiteralToThrowOnInvalidType() { // arrange ScalarType scalar = new LatitudeType(); const char valueSyntax = 'c'; // act - var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); + var result = Record.Exception(() => scalar.ValueToLiteral(valueSyntax)); // assert Assert.IsType<LeafCoercionException>(result); @@ -246,14 +208,14 @@ public void Latitude_ParseLiteral_NullValueNode() } [Fact] - protected void Latitude_ExpectParseValueToMatchType() + protected void Latitude_ExpectValueToLiteralToMatchType() { // arrange var scalar = CreateType<LatitudeType>(); const double valueSyntax = 74.3; // act - var result = scalar.CoerceInputValue(valueSyntax); + var result = scalar.ValueToLiteral(valueSyntax); // assert Assert.Equal(typeof(StringValueNode), result.GetType()); @@ -276,174 +238,196 @@ protected void Latitude_ExpectParseValueToMatchType() [InlineData(-23.3220703, "23° 19' 19.45308\" S")] [InlineData(66.00610639, "66° 0' 21.983004\" N")] [InlineData(76.82079028, "76° 49' 14.845008\" N")] - protected void Latitude_ExpectParseValueToMatch(double runtime, string literal) + protected void Latitude_ExpectValueToLiteralToMatch(double runtime, string literal) { // arrange var scalar = CreateType<LatitudeType>(); StringValueNode expected = new(literal); // act - var result = scalar.CoerceInputValue(runtime); + var result = scalar.ValueToLiteral(runtime); // assert Assert.Equal(expected, result, SyntaxComparer.BySyntax); } [Fact] - protected void Latitude_ExpectParseValueToThrowSerializationException_GreaterThanMax() + protected void Latitude_ExpectValueToLiteralToThrowSerializationException_GreaterThanMax() { // arrange var scalar = CreateType<LatitudeType>(); const double runtimeValue = 91d; // act - var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); + var result = Record.Exception(() => scalar.ValueToLiteral(runtimeValue)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Latitude_ExpectParseValueToThrowSerializationException_LessThanMin() + protected void Latitude_ExpectValueToLiteralToThrowSerializationException_LessThanMin() { // arrange var scalar = CreateType<LatitudeType>(); const double runtimeValue = -91d; // act - var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); + var result = Record.Exception(() => scalar.ValueToLiteral(runtimeValue)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Latitude_ExpectDeserializeStringToMatch() + protected void Latitude_ExpectCoerceInputValueToMatch() { // arrange ScalarType scalar = new LatitudeType(); const double expectedValue = -89d; + var inputValue = JsonDocument.Parse("\"89° 0' 0.000\\\" S\"").RootElement; + + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act - var success = scalar.TryDeserialize("89° 0' 0.000\" S", - out var deserialized); + var result = scalar.CoerceInputValue(inputValue, context.Object); // assert - Assert.True(success); - Assert.Equal(expectedValue, deserialized); + Assert.Equal(expectedValue, result); } [Fact] - protected void Latitude_ExpectDeserializeStringToThrowSerializationException_LessThanMin() + protected void Latitude_ExpectCoerceInputValueToThrowSerializationException_LessThanMin() { // arrange ScalarType scalar = new LatitudeType(); - const string valueSyntax = "91° 0' 0.000\" S"; + var inputValue = JsonDocument.Parse("\"91° 0' 0.000\\\" S\"").RootElement; - // act + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); - var result = Record.Exception(() => scalar.Deserialize(valueSyntax)); + // act + var result = Record.Exception(() => scalar.CoerceInputValue(inputValue, context.Object)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void - Latitude_ExpectDeserializeStringToThrowSerializationException_GreaterThanMax() + protected void Latitude_ExpectCoerceInputValueToThrowSerializationException_GreaterThanMax() { // arrange ScalarType scalar = new LatitudeType(); - const string? valueSyntax = "92° 0' 0.000\" N"; + var inputValue = JsonDocument.Parse("\"92° 0' 0.000\\\" N\"").RootElement; + + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act - var result = Record.Exception(() => scalar.Deserialize(valueSyntax)); + var result = Record.Exception(() => scalar.CoerceInputValue(inputValue, context.Object)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - public void Latitude_ExpectSerializeInt() + public void Latitude_ExpectCoerceOutputValueInt() { // arrange ScalarType scalar = new LatitudeType(); - const int valueSyntax = 89; + const int runtimeValue = 89; // act - var success = scalar.TrySerialize(valueSyntax, out var s); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + scalar.CoerceOutputValue(runtimeValue, resultElement); // assert - Assert.True(success); - Assert.IsType<string>(s); + resultElement.MatchSnapshot(); } [Fact] - protected void Latitude_ExpectSerializeIntToThrowSerializationException_LessThanMin() + protected void Latitude_ExpectCoerceOutputValueIntToThrowSerializationException_LessThanMin() { // arrange ScalarType scalar = new LatitudeType(); - const int valueSyntax = -91; + const int runtimeValue = -91; // act - var result = Record.Exception(() => scalar.Serialize(valueSyntax)); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + var result = Record.Exception(() => scalar.CoerceOutputValue(runtimeValue, resultElement)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Latitude_ExpectSerializeIntToThrowSerializationException_GreaterThanMax() + protected void Latitude_ExpectCoerceOutputValueIntToThrowSerializationException_GreaterThanMax() { // arrange ScalarType scalar = new LatitudeType(); - const int valueSyntax = 91; + const int runtimeValue = 91; // act - var result = Record.Exception(() => scalar.Serialize(valueSyntax)); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + var result = Record.Exception(() => scalar.CoerceOutputValue(runtimeValue, resultElement)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - public void Latitude_ExpectSerializeDouble() + public void Latitude_ExpectCoerceOutputValueDouble() { // arrange ScalarType scalar = new LatitudeType(); - const double valueSyntax = 89d; + const double runtimeValue = 89d; // act - var success = scalar.TrySerialize(valueSyntax, out var d); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + scalar.CoerceOutputValue(runtimeValue, resultElement); // assert - Assert.True(success); - Assert.IsType<string>(d); + resultElement.MatchSnapshot(); } [Fact] - protected void Latitude_ExpectSerializeDoubleToThrowSerializationException_LessThanMin() + protected void Latitude_ExpectCoerceOutputValueDoubleToThrowSerializationException_LessThanMin() { // arrange ScalarType scalar = new LatitudeType(); - const double valueSyntax = -91d; + const double runtimeValue = -91d; // act - var result = Record.Exception(() => scalar.Serialize(valueSyntax)); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + var result = Record.Exception(() => scalar.CoerceOutputValue(runtimeValue, resultElement)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Latitude_ExpectSerializeDoubleToThrowSerializationException_GreaterThanMax() + protected void Latitude_ExpectCoerceOutputValueDoubleToThrowSerializationException_GreaterThanMax() { // arrange ScalarType scalar = new LatitudeType(); - const double valueSyntax = 91d; + const double runtimeValue = 91d; // act - var result = Record.Exception(() => scalar.Serialize(valueSyntax)); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + var result = Record.Exception(() => scalar.CoerceOutputValue(runtimeValue, resultElement)); // assert Assert.IsType<LeafCoercionException>(result); diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/LocalCurrencyTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/LocalCurrencyTypeTests.cs deleted file mode 100644 index cc174cb8406..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/LocalCurrencyTypeTests.cs +++ /dev/null @@ -1,388 +0,0 @@ -using HotChocolate.Execution; -using HotChocolate.Language; -using Microsoft.Extensions.DependencyInjection; - -namespace HotChocolate.Types; - -public class LocalCurrencyTypeTests : ScalarTypeTestBase -{ - [Fact] - protected void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<LocalCurrencyType>(); - - // act - - // assert - schema.ToString().MatchSnapshot(); - } - - [Fact] - public void LocalCurrency_EnsureLocalCurrencyTypeKindIsCorrect() - { - // arrange - var type = new LocalCurrencyType("Germany", "de-DE"); - - // act - var kind = type.Kind; - - // assert - Assert.Equal(TypeKind.Scalar, kind); - } - - [Fact] - public void LocalCurrency_EnsureLocalCurrencyTypeKindIsCorrect1() - { - // arrange - var type = new LocalCurrencyType(); - - // act - var kind = type.Kind; - - // assert - Assert.Equal(TypeKind.Scalar, kind); - } - - [Fact] - protected void LocalCurrency_ExpectIsStringValueToMatch() - { - // arrange - var scalar = CreateType<LocalCurrencyType>(); - var valueSyntax = new StringValueNode("$10.99"); - - // act - var result = scalar.IsValueCompatible(valueSyntax); - - // assert - Assert.True(result); - } - - [Fact] - protected void LocalCurrency_ParseResult_Null() - { - // arrange - var scalar = CreateType<LocalCurrencyType>(); - - // act - var result = scalar.ParseResult(null); - - // assert - Assert.Equal(NullValueNode.Default, result); - } - - [Fact] - protected void LocalCurrency_ExpectIsStringValueToMatchEuro() - { - // arrange - ScalarType scalar = new LocalCurrencyType("Germany", "de-De"); - var valueSyntax = new StringValueNode("10,99 €"); - - // act - var result = scalar.IsValueCompatible(valueSyntax); - - // assert - Assert.True(result); - } - - [Fact] - protected void LocalCurrency_ExpectIsStringValueToNotMatchEuro() - { - // arrange - ScalarType scalar = new LocalCurrencyType("Germany", "de-De"); - var valueSyntax = new StringValueNode("$10.99"); - - // act - var result = Record.Exception(() => scalar.CoerceInputLiteral(valueSyntax)); - - // assert - Assert.IsType<LeafCoercionException>(result); - } - - [Fact] - protected void LocalCurrency_ExpectParseLiteralToMatch() - { - // arrange - var scalar = CreateType<LocalCurrencyType>(); - var valueSyntax = new StringValueNode("$24.99"); - const decimal expectedResult = 24.99m; - - // act - object result = (decimal)scalar.CoerceInputLiteral(valueSyntax)!; - - // assert - Assert.Equal(expectedResult, result); - } - - [Fact] - protected void LocalCurrency_ExpectParseLiteralToMatchEuro() - { - // arrange - ScalarType scalar = new LocalCurrencyType("Germany", "de-DE"); - var valueSyntax = new StringValueNode("24,99 €"); - const decimal expectedResult = 24.99m; - - // act - object result = (decimal)scalar.CoerceInputLiteral(valueSyntax)!; - - // assert - Assert.Equal(expectedResult, result); - } - - [InlineData("US", "en-US")] - [InlineData("Australia", "en-AU")] - [InlineData("UK", "en-GB")] - [InlineData("Switzerland", "de-CH")] - [Theory] - public void LocalCurrency_ParseLiteralStringValueDifferentCulture(string name, string cultureName) - { - // arrange - ScalarType scalar = new LocalCurrencyType(name, cultureName); - var valueSyntax = new StringValueNode("9.99"); - const decimal expectedDecimal = 9.99m; - - // act - var result = (decimal)scalar.CoerceInputLiteral(valueSyntax)!; - - // assert - Assert.Equal(expectedDecimal, result); - } - - [Fact] - protected void LocalCurrency_ExpectParseLiteralToThrowSerializationException() - { - // arrange - var scalar = CreateType<LocalCurrencyType>(); - var valueSyntax = new StringValueNode("foo"); - - // act - var result = Record.Exception(() => scalar.CoerceInputLiteral(valueSyntax)); - - // assert - Assert.IsType<LeafCoercionException>(result); - } - - [Fact] - protected void LocalCurrency_ExpectParseValueToMatchDecimal() - { - // arrange - var scalar = CreateType<LocalCurrencyType>(); - const decimal valueSyntax = 24.95m; - - // act - var result = scalar.CoerceInputValue(valueSyntax); - - // assert - Assert.Equal(typeof(StringValueNode), result.GetType()); - } - - [Fact] - protected void LocalCurrency_ExpectParseValueToThrowSerializationException() - { - // arrange - var scalar = CreateType<LocalCurrencyType>(); - var runtimeValue = new StringValueNode("foo"); - - // act - var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); - - // assert - Assert.IsType<LeafCoercionException>(result); - } - - [Fact] - protected void LocalCurrency_ExpectSerializeDecimalToMatch() - { - // arrange - ScalarType scalar = new LocalCurrencyType(); - const decimal runtimeValue = 9.99m; - const string expectedValue = "$9.99"; - - // act - var serializedValue = (string)scalar.Serialize(runtimeValue)!; - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - protected void LocalCurrency_ExpectDeserializeNullToMatch() - { - // arrange - ScalarType scalar = new LocalCurrencyType(); - - // act - var success = scalar.TryDeserialize(null, out var deserialized); - - // assert - Assert.True(success); - Assert.Null(deserialized); - } - - [Fact] - public void LocalCurrency_ExpectDeserializeNullableDecimalToDecimal() - { - // arrange - ScalarType scalar = new LocalCurrencyType(); - decimal? runtimeValue = null; - - // act - var success = scalar.TryDeserialize(runtimeValue, out var deserialized); - - // assert - Assert.True(success); - Assert.Null(deserialized); - } - - [Fact] - protected void LocalCurrency_ExpectDeserializeStringToMatch() - { - // arrange - var scalar = CreateType<LocalCurrencyType>(); - const decimal runtimeValue = 7.99m; - - // act - var deserializedValue = (decimal)scalar.Deserialize("$7.99")!; - - // assert - Assert.Equal(runtimeValue, deserializedValue); - } - - [Fact] - protected void LocalCurrency_ExpectDeserializeDecimalToMatch() - { - // arrange - var scalar = CreateType<LocalCurrencyType>(); - object resultValue = 0.99m; - - // act - var result = scalar.Deserialize(resultValue); - - // assert - Assert.Equal(resultValue, result); - } - - [Fact] - public void LocalCurrency_ExpectDeserializeInvalidStringToDecimal() - { - // arrange - ScalarType scalar = new LocalCurrencyType(); - - // act - var success = scalar.TryDeserialize("abc", out var _); - - // assert - Assert.False(success); - } - - [Fact] - public void LocalCurrency_ExpectDeserializeNullToNull() - { - // arrange - ScalarType scalar = new LocalCurrencyType(); - - // act - var success = scalar.TryDeserialize(null, out var deserialized); - - // assert - Assert.True(success); - Assert.Null(deserialized); - } - - [Fact] - protected void LocalCurrency_ExpectSerializeToThrowSerializationException() - { - // arrange - var scalar = CreateType<LocalCurrencyType>(); - - // act - var result = Record.Exception(() => scalar.Serialize("foo")); - - // assert - Assert.IsType<LeafCoercionException>(result); - } - - [Fact] - protected void LocalCurrency_ExpectDeserializeToThrowSerializationException() - { - // arrange - var scalar = CreateType<LocalCurrencyType>(); - object runtimeValue = new IntValueNode(1); - - // act - var result = Record.Exception(() => scalar.Deserialize(runtimeValue)); - - // assert - Assert.IsType<LeafCoercionException>(result); - } - - [Fact] - protected void LocalCurrency_ExpectParseResultToMatchNull() - { - // arrange - ScalarType scalar = new LocalCurrencyType(); - - // act - var result = scalar.ParseResult(null); - - // assert - Assert.Equal(typeof(NullValueNode), result.GetType()); - } - - [Fact] - protected void LocalCurrency_ExpectParseResultToMatchStringValue() - { - // arrange - ScalarType scalar = new LocalCurrencyType(); - const string valueSyntax = "$9.99"; - - // act - var result = scalar.ParseResult(valueSyntax); - - // assert - Assert.Equal(typeof(StringValueNode), result.GetType()); - } - - [Fact] - protected void LocalCurrency_ExpectParseResultToThrowSerializationException() - { - // arrange - ScalarType scalar = new LocalCurrencyType(); - IValueNode runtimeValue = new IntValueNode(1); - - // act - var result = Record.Exception(() => scalar.ParseResult(runtimeValue)); - - // assert - Assert.IsType<LeafCoercionException>(result); - } - - [Fact] - public async Task Integration_DefaultLocalCurrency() - { - // arrange - var executor = await new ServiceCollection() - .AddGraphQL() - .AddQueryType<DefaultLocalCurrencyType>() - .BuildRequestExecutorAsync(); - - // act - var res = await executor.ExecuteAsync("{ test }"); - - // assert - res.ToJson().MatchSnapshot(); - } - - public class DefaultLocalCurrency - { - public decimal Test => 0; - } - - public class DefaultLocalCurrencyType : ObjectType<DefaultLocalCurrency> - { - protected override void Configure(IObjectTypeDescriptor<DefaultLocalCurrency> descriptor) - { - descriptor.Field(x => x.Test).Type<LocalCurrencyType>(); - } - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs index 4300c408a34..abbbb14d856 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs @@ -1,7 +1,11 @@ +using System.Text.Json; using CookieCrumble.Xunit.Attributes; using HotChocolate.Execution; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using Microsoft.Extensions.DependencyInjection; +using Moq; using static HotChocolate.Language.SyntaxComparer; namespace HotChocolate.Types; @@ -45,140 +49,98 @@ protected void Longitude_ExpectIsStringInstanceToMatch() } [Fact] - protected void Longitude_ExpectIsDoubleInstanceToMatch() - { - // arrange - var scalar = CreateType<LongitudeType>(); - const double valueSyntax = -179d; - - // act - var result = scalar.IsInstanceOfType(valueSyntax); - - // assert - Assert.True(result); - } - - [Fact] - protected void Longitude_ExpectIsDoubleInstanceToFail_LessThanMin() - { - // arrange - var scalar = CreateType<LongitudeType>(); - const double valueSyntax = -181d; - - // act - var result = scalar.IsInstanceOfType(valueSyntax); - - // assert - Assert.False(result); - } - - [Fact] - protected void Longitude_ExpectIsDoubleInstanceToFail_GreaterThanMax() - { - // arrange - var scalar = CreateType<LongitudeType>(); - const double valueSyntax = 181d; - - // act - var result = scalar.IsInstanceOfType(valueSyntax); - - // assert - Assert.False(result); - } - - [Fact] - protected void Longitude_ExpectParseResultToMatchNull() + protected void Longitude_ExpectValueToLiteralToMatchNull() { // arrange ScalarType scalar = new LongitudeType(); object valueSyntax = null!; // act - var result = scalar.ParseResult(valueSyntax); + var result = scalar.ValueToLiteral(valueSyntax); // assert Assert.Equal(typeof(NullValueNode), result.GetType()); } [Fact] - protected void Longitude_ExpectParseResultToThrowOnInvalidString() + protected void Longitude_ExpectValueToLiteralToThrowOnInvalidString() { // arrange ScalarType scalar = new LongitudeType(); const string valueSyntax = "-181° 0' 0.000\" W"; // act - var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); + var result = Record.Exception(() => scalar.ValueToLiteral(valueSyntax)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Longitude_ExpectParseResultToMatchInt() + protected void Longitude_ExpectValueToLiteralToMatchInt() { // arrange ScalarType scalar = new LongitudeType(); const int valueSyntax = 179; // act - var result = scalar.ParseResult(valueSyntax); + var result = scalar.ValueToLiteral(valueSyntax); // assert Assert.Equal(typeof(StringValueNode), result.GetType()); } [Fact] - protected void Longitude_ExpectParseResultToThrowOnInvalidInt() + protected void Longitude_ExpectValueToLiteralToThrowOnInvalidInt() { // arrange ScalarType scalar = new LongitudeType(); const int valueSyntax = 181; // act - var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); + var result = Record.Exception(() => scalar.ValueToLiteral(valueSyntax)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Longitude_ExpectParseResultToMatchDouble() + protected void Longitude_ExpectValueToLiteralToMatchDouble() { // arrange ScalarType scalar = new LongitudeType(); const double valueSyntax = 179d; // act - var result = scalar.ParseResult(valueSyntax); + var result = scalar.ValueToLiteral(valueSyntax); // assert Assert.Equal(typeof(StringValueNode), result.GetType()); } [Fact] - protected void Longitude_ExpectParseResultToThrowOnInvalidDouble() + protected void Longitude_ExpectValueToLiteralToThrowOnInvalidDouble() { // arrange ScalarType scalar = new LongitudeType(); const double valueSyntax = -182d; // act - var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); + var result = Record.Exception(() => scalar.ValueToLiteral(valueSyntax)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Longitude_ExpectParseResultToThrowOnInvalidType() + protected void Longitude_ExpectValueToLiteralToThrowOnInvalidType() { // arrange ScalarType scalar = new LongitudeType(); const char valueSyntax = 'c'; // act - var result = Record.Exception(() => scalar.ParseResult(valueSyntax)); + var result = Record.Exception(() => scalar.ValueToLiteral(valueSyntax)); // assert Assert.IsType<LeafCoercionException>(result); @@ -240,21 +202,21 @@ public void Longitude_ParseLiteral_NullValueNode() var literal = NullValueNode.Default; // act - var value = scalar.CoerceInputLiteral(literal)!; + var value = scalar.CoerceInputLiteral(literal); // assert Assert.Null(value); } [Fact] - protected void Longitude_ExpectParseValueToMatchType() + protected void Longitude_ExpectValueToLiteralToMatchType() { // arrange var scalar = CreateType<LongitudeType>(); const double valueSyntax = 74.3d; // act - var result = scalar.CoerceInputValue(valueSyntax); + var result = scalar.ValueToLiteral(valueSyntax); // assert Assert.Equal(typeof(StringValueNode), result.GetType()); @@ -280,174 +242,196 @@ protected void Longitude_ExpectParseValueToMatchType() [InlineData(-79.0000275, "79° 0' 0.099\" W")] [InlineData(-148.56920111, "148° 34' 9.123996\" W")] [InlineData(-44.73392194, "44° 44' 2.118984\" W")] - protected void Longitude_ExpectParseValueToMatch(double runtime, string literal) + protected void Longitude_ExpectValueToLiteralToMatch(double runtime, string literal) { // arrange var scalar = CreateType<LongitudeType>(); StringValueNode expected = new(literal); // act - ISyntaxNode result = scalar.CoerceInputValue(runtime); + ISyntaxNode result = scalar.ValueToLiteral(runtime); // assert Assert.Equal(expected, result, BySyntax); } [Fact] - protected void Longitude_ExpectParseValueToThrowSerializationException_GreaterThanMax() + protected void Longitude_ExpectValueToLiteralToThrowSerializationException_GreaterThanMax() { // arrange var scalar = CreateType<LongitudeType>(); const double runtimeValue = 181d; // act - var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); + var result = Record.Exception(() => scalar.ValueToLiteral(runtimeValue)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Longitude_ExpectParseValueToThrowSerializationException_LessThanMin() + protected void Longitude_ExpectValueToLiteralToThrowSerializationException_LessThanMin() { // arrange var scalar = CreateType<LongitudeType>(); const double runtimeValue = -181d; // act - var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); + var result = Record.Exception(() => scalar.ValueToLiteral(runtimeValue)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Longitude_ExpectDeserializeStringToMatch() + protected void Longitude_ExpectCoerceInputValueToMatch() { // arrange ScalarType scalar = new LongitudeType(); const double expectedValue = -179d; + var inputValue = JsonDocument.Parse("\"179° 0' 0.000\\\" W\"").RootElement; + + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act - var success = scalar.TryDeserialize("179° 0' 0.000\" W", - out var deserialized); + var result = scalar.CoerceInputValue(inputValue, context.Object); // assert - Assert.True(success); - Assert.Equal(expectedValue, deserialized); + Assert.Equal(expectedValue, result); } [Fact] - protected void Longitude_ExpectDeserializeStringToThrowSerializationException_LessThanMin() + protected void Longitude_ExpectCoerceInputValueToThrowSerializationException_LessThanMin() { // arrange ScalarType scalar = new LongitudeType(); - const string valueSyntax = "-181° 0' 0.000\" W"; + var inputValue = JsonDocument.Parse("\"-181° 0' 0.000\\\" W\"").RootElement; - // act + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); - var result = Record.Exception(() => scalar.Deserialize(valueSyntax)); + // act + var result = Record.Exception(() => scalar.CoerceInputValue(inputValue, context.Object)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void - Longitude_ExpectDeserializeStringToThrowSerializationException_GreaterThanMax() + protected void Longitude_ExpectCoerceInputValueToThrowSerializationException_GreaterThanMax() { // arrange ScalarType scalar = new LongitudeType(); - const string? valueSyntax = "182° 0' 0.000\" E"; + var inputValue = JsonDocument.Parse("\"182° 0' 0.000\\\" E\"").RootElement; + + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act - var result = Record.Exception(() => scalar.Deserialize(valueSyntax)); + var result = Record.Exception(() => scalar.CoerceInputValue(inputValue, context.Object)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - public void Longitude_ExpectSerializeInt() + public void Longitude_ExpectCoerceOutputValueInt() { // arrange ScalarType scalar = new LongitudeType(); - const int valueSyntax = 179; + const int runtimeValue = 179; // act - var success = scalar.TrySerialize(valueSyntax, out var s); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + scalar.CoerceOutputValue(runtimeValue, resultElement); // assert - Assert.True(success); - Assert.IsType<string>(s); + resultElement.MatchSnapshot(); } [Fact] - protected void Longitude_ExpectSerializeIntToThrowSerializationException_LessThanMin() + protected void Longitude_ExpectCoerceOutputValueIntToThrowSerializationException_LessThanMin() { // arrange ScalarType scalar = new LongitudeType(); - const int valueSyntax = -181; + const int runtimeValue = -181; // act - var result = Record.Exception(() => scalar.Serialize(valueSyntax)); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + var result = Record.Exception(() => scalar.CoerceOutputValue(runtimeValue, resultElement)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Longitude_ExpectSerializeIntToThrowSerializationException_GreaterThanMax() + protected void Longitude_ExpectCoerceOutputValueIntToThrowSerializationException_GreaterThanMax() { // arrange ScalarType scalar = new LongitudeType(); - const int valueSyntax = 181; + const int runtimeValue = 181; // act - var result = Record.Exception(() => scalar.Serialize(valueSyntax)); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + var result = Record.Exception(() => scalar.CoerceOutputValue(runtimeValue, resultElement)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - public void Longitude_ExpectSerializeDouble() + public void Longitude_ExpectCoerceOutputValueDouble() { // arrange ScalarType scalar = new LongitudeType(); - const double valueSyntax = 179d; + const double runtimeValue = 179d; // act - var success = scalar.TrySerialize(valueSyntax, out var d); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + scalar.CoerceOutputValue(runtimeValue, resultElement); // assert - Assert.True(success); - Assert.IsType<string>(d); + resultElement.MatchSnapshot(); } [Fact] - protected void Longitude_ExpectSerializeDoubleToThrowSerializationException_LessThanMin() + protected void Longitude_ExpectCoerceOutputValueDoubleToThrowSerializationException_LessThanMin() { // arrange ScalarType scalar = new LongitudeType(); - const double valueSyntax = -181d; + const double runtimeValue = -181d; // act - var result = Record.Exception(() => scalar.Serialize(valueSyntax)); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + var result = Record.Exception(() => scalar.CoerceOutputValue(runtimeValue, resultElement)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void Longitude_ExpectSerializeDoubleToThrowSerializationException_GreaterThanMax() + protected void Longitude_ExpectCoerceOutputValueDoubleToThrowSerializationException_GreaterThanMax() { // arrange ScalarType scalar = new LongitudeType(); - const double valueSyntax = 181d; + const double runtimeValue = 181d; // act - var result = Record.Exception(() => scalar.Serialize(valueSyntax)); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + var result = Record.Exception(() => scalar.CoerceOutputValue(runtimeValue, resultElement)); // assert Assert.IsType<LeafCoercionException>(result); diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/MacAddressTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/MacAddressTypeTests.cs index e81d4865d91..cb7867ff600 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/MacAddressTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/MacAddressTypeTests.cs @@ -41,7 +41,7 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "fa:7e:9e:ff:fe:9f:13:78", true)] [InlineData(typeof(StringValueNode), "fa7e.9eff.fe9f.1378", true)] [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -54,40 +54,6 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<MacAddressType>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("f", false)] - [InlineData("ff", false)] - [InlineData("ff:ff:ff", false)] - [InlineData("ff:ff:ff:ff:ff", false)] - [InlineData("ff:ff:ff:ff:ff:ff", true)] - [InlineData("ff-ff-ff-ff-ff-ff", true)] - [InlineData("ff:ff:ff:ff:ff:ff:", false)] - [InlineData("gf:ff:ff:ff:ff:ff", false)] - [InlineData("fff:ff:ff:ff:ff:ff", false)] - [InlineData("11:11:11:11:11:11", true)] - [InlineData("00:00:00:00:00:00", true)] - [InlineData("a0:93:db:60:3b:72", true)] - [InlineData("9d:f7:56:d1:73:a4", true)] - [InlineData("9d-f7-56-d1-73-a4", true)] - [InlineData("fa:7e:9e:9f:13:78", true)] - [InlineData("fa-7e-9e-9f-13-78", true)] - [InlineData("fa-7e-9e-ff-fe-9f-13-78", true)] - [InlineData("fa:7e:9e:ff:fe:9f:13:78", true)] - [InlineData("fa7e.9eff.fe9f.1378", true)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<MacAddressType>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "fa-7e-9e-9f-13-78", "fa-7e-9e-9f-13-78")] [InlineData(typeof(StringValueNode), "fa:7e:9e:9f:13:78", "fa:7e:9e:9f:13:78")] @@ -98,7 +64,7 @@ public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expec [InlineData(typeof(StringValueNode), "fa:7e:9e:ff:fe:9f:13:78", "fa:7e:9e:ff:fe:9f:13:78")] [InlineData(typeof(StringValueNode), "fa7e.9eff.fe9f.1378", "fa7e.9eff.fe9f.1378")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -123,7 +89,7 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "ff:ff:ff:ff:ff")] [InlineData(typeof(StringValueNode), "ff:ff:ff:ff:ff:ff:")] [InlineData(typeof(StringValueNode), "gf:ff:ff:ff:ff:ff")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -134,105 +100,61 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("fa-7e-9e-9f-13-78", "fa-7e-9e-9f-13-78")] - [InlineData("fa:7e:9e:9f:13:78", "fa:7e:9e:9f:13:78")] - [InlineData("9d-f7-56-d1-73-a4", "9d-f7-56-d1-73-a4")] - [InlineData("00:00:00:00:00:00", "00:00:00:00:00:00")] - [InlineData("ff-ff-ff-ff-ff-ff", "ff-ff-ff-ff-ff-ff")] - [InlineData("fa-7e-9e-ff-fe-9f-13-78", "fa-7e-9e-ff-fe-9f-13-78")] - [InlineData("fa:7e:9e:ff:fe:9f:13:78", "fa:7e:9e:ff:fe:9f:13:78")] - [InlineData("fa7e.9eff.fe9f.1378", "fa7e.9eff.fe9f.1378")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"fa-7e-9e-9f-13-78\"", "fa-7e-9e-9f-13-78")] + [InlineData("\"fa:7e:9e:9f:13:78\"", "fa:7e:9e:9f:13:78")] + [InlineData("\"9d-f7-56-d1-73-a4\"", "9d-f7-56-d1-73-a4")] + [InlineData("\"00:00:00:00:00:00\"", "00:00:00:00:00:00")] + [InlineData("\"ff-ff-ff-ff-ff-ff\"", "ff-ff-ff-ff-ff-ff")] + [InlineData("\"fa-7e-9e-ff-fe-9f-13-78\"", "fa-7e-9e-ff-fe-9f-13-78")] + [InlineData("\"fa:7e:9e:ff:fe:9f:13:78\"", "fa:7e:9e:ff:fe:9f:13:78")] + [InlineData("\"fa7e.9eff.fe9f.1378\"", "fa7e.9eff.fe9f.1378")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<MacAddressType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] - [InlineData("f")] - [InlineData("ff")] - [InlineData("ff:ff:ff")] - [InlineData("ff:ff:ff:ff:ff")] - [InlineData("ff:ff:ff:ff:ff:ff:")] - [InlineData("gf:ff:ff:ff:ff:ff")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<EmailAddressType>(value); - } - - [Theory] - [InlineData("fa-7e-9e-9f-13-78", "fa-7e-9e-9f-13-78")] - [InlineData("fa:7e:9e:9f:13:78", "fa:7e:9e:9f:13:78")] - [InlineData("9d-f7-56-d1-73-a4", "9d-f7-56-d1-73-a4")] - [InlineData("00:00:00:00:00:00", "00:00:00:00:00:00")] - [InlineData("ff-ff-ff-ff-ff-ff", "ff-ff-ff-ff-ff-ff")] - [InlineData("fa-7e-9e-ff-fe-9f-13-78", "fa-7e-9e-ff-fe-9f-13-78")] - [InlineData("fa:7e:9e:ff:fe:9f:13:78", "fa:7e:9e:ff:fe:9f:13:78")] - [InlineData("fa7e.9eff.fe9f.1378", "fa7e.9eff.fe9f.1378")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<MacAddressType>(runtimeValue, resultValue); + ExpectCoerceInputValueToMatch<MacAddressType>(jsonValue, runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] - [InlineData("f")] - [InlineData("ff")] - [InlineData("ff:ff:ff")] - [InlineData("ff:ff:ff:ff:ff")] - [InlineData("ff:ff:ff:ff:ff:ff:")] - [InlineData("gf:ff:ff:ff:ff:ff")] - public void Serialize_GivenObject_ThrowSerializationException(object value) + [InlineData("1.0")] + [InlineData("1")] + [InlineData("12345")] + [InlineData("\"\"")] + [InlineData("\"f\"")] + [InlineData("\"ff\"")] + [InlineData("\"ff:ff:ff\"")] + [InlineData("\"ff:ff:ff:ff:ff\"")] + [InlineData("\"ff:ff:ff:ff:ff:ff:\"")] + [InlineData("\"gf:ff:ff:ff:ff:ff\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectSerializeToThrowSerializationException<MacAddressType>(value); + ExpectCoerceInputValueToThrowSerializationException<MacAddressType>(jsonValue); } [Theory] - [InlineData(typeof(StringValueNode), "fa-7e-9e-9f-13-78")] - [InlineData(typeof(StringValueNode), "fa:7e:9e:9f:13:78")] - [InlineData(typeof(StringValueNode), "9d-f7-56-d1-73-a4")] - [InlineData(typeof(StringValueNode), "00:00:00:00:00:00")] - [InlineData(typeof(StringValueNode), "ff-ff-ff-ff-ff-ff")] - [InlineData(typeof(StringValueNode), "fa-7e-9e-ff-fe-9f-13-78")] - [InlineData(typeof(StringValueNode), "fa:7e:9e:ff:fe:9f:13:78")] - [InlineData(typeof(StringValueNode), "fa7e.9eff.fe9f.1378")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) + [InlineData("fa-7e-9e-9f-13-78")] + [InlineData("fa:7e:9e:9f:13:78")] + [InlineData("9d-f7-56-d1-73-a4")] + [InlineData("00:00:00:00:00:00")] + [InlineData("ff-ff-ff-ff-ff-ff")] + [InlineData("fa-7e-9e-ff-fe-9f-13-78")] + [InlineData("fa:7e:9e:ff:fe:9f:13:78")] + [InlineData("fa7e.9eff.fe9f.1378")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectParseValueToMatchType<MacAddressType>(value, type); + ExpectCoerceOutputValueToMatch<MacAddressType>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] @@ -243,12 +165,12 @@ public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("ff:ff:ff:ff:ff")] [InlineData("ff:ff:ff:ff:ff:ff:")] [InlineData("gf:ff:ff:ff:ff:ff")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<MacAddressType>(value); + ExpectCoerceOutputValueToThrowSerializationException<MacAddressType>(value); } [Theory] @@ -261,16 +183,15 @@ public void ParseValue_GivenObject_ThrowSerializationException(object value) [InlineData(typeof(StringValueNode), "fa:7e:9e:ff:fe:9f:13:78")] [InlineData(typeof(StringValueNode), "fa7e.9eff.fe9f.1378")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<MacAddressType>(value, type); + ExpectValueToLiteralToMatchType<MacAddressType>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] @@ -281,11 +202,11 @@ public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("ff:ff:ff:ff:ff")] [InlineData("ff:ff:ff:ff:ff:ff:")] [InlineData("gf:ff:ff:ff:ff:ff")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<MacAddressType>(value); + ExpectValueToLiteralToThrowSerializationException<MacAddressType>(value); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/NonNegativeIntTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/NonNegativeIntTypeTests.cs deleted file mode 100644 index 968d6a51ab5..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/NonNegativeIntTypeTests.cs +++ /dev/null @@ -1,212 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class NonNegativeIntTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<NonNegativeIntType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(IntValueNode), int.MinValue, false)] - [InlineData(typeof(IntValueNode), -1, false)] - [InlineData(typeof(IntValueNode), 0, true)] - [InlineData(typeof(IntValueNode), 1, true)] - [InlineData(typeof(IntValueNode), int.MaxValue, true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<NonNegativeIntType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(true, false)] - [InlineData("foo", false)] - [InlineData(int.MinValue, false)] - [InlineData(-1, false)] - [InlineData(0, true)] - [InlineData(null, true)] - [InlineData(1, true)] - [InlineData(int.MaxValue, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<NonNegativeIntType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0, 0)] - [InlineData(typeof(IntValueNode), 1, 1)] - [InlineData(typeof(IntValueNode), int.MaxValue, int.MaxValue)] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<NonNegativeIntType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - [InlineData(typeof(IntValueNode), int.MinValue)] - [InlineData(typeof(IntValueNode), -1)] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<NonNegativeIntType>(valueNode); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0)] - [InlineData(typeof(IntValueNode), 1)] - [InlineData(typeof(IntValueNode), int.MaxValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<NonNegativeIntType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - public void ParseLiteral_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<NonNegativeIntType>(value); - } - - [Theory] - [InlineData(0, 0)] - [InlineData(1, 1)] - [InlineData(int.MaxValue, int.MaxValue)] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<NonNegativeIntType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<NonNegativeIntType>(value); - } - - [Theory] - [InlineData(0, 0)] - [InlineData(1, 1)] - [InlineData(int.MaxValue, int.MaxValue)] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<NonNegativeIntType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<NonNegativeIntType>(value); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0)] - [InlineData(typeof(IntValueNode), 1)] - [InlineData(typeof(IntValueNode), int.MaxValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<NonNegativeIntType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<NonNegativeIntType>(value); - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/NonPositiveFloatTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/NonPositiveFloatTypeTests.cs deleted file mode 100644 index 7a161bc0885..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/NonPositiveFloatTypeTests.cs +++ /dev/null @@ -1,214 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class NonPositiveFloatTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<NonPositiveFloatType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(FloatValueNode), -1.0d, true)] - [InlineData(typeof(FloatValueNode), 0d, true)] - [InlineData(typeof(FloatValueNode), 0.00000001d, false)] - [InlineData(typeof(FloatValueNode), -0.0000001d, true)] - [InlineData(typeof(FloatValueNode), double.MinValue, true)] - [InlineData(typeof(IntValueNode), -1, true)] - [InlineData(typeof(IntValueNode), int.MinValue, true)] - [InlineData(typeof(IntValueNode), 0, true)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<NonPositiveFloatType>(valueNode, expected); - } - - [Theory] - [InlineData(1d, false)] - [InlineData(-1d, true)] - [InlineData(0.00000001d, false)] - [InlineData(-0.0000001d, true)] - [InlineData(double.MinValue, true)] - [InlineData(0d, true)] - [InlineData(0, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("foo", false)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<NonPositiveFloatType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0, 0d)] - [InlineData(typeof(IntValueNode), -12, -12d)] - [InlineData(typeof(FloatValueNode), -12.0, -12.0)] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<NonPositiveFloatType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(IntValueNode), 1)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<NonPositiveFloatType>(valueNode); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("")] - public void ParseLiteral_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<NonPositiveFloatType>(value); - } - - [Theory] - [InlineData(typeof(FloatValueNode), 0d)] - [InlineData(typeof(FloatValueNode), -12d)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<NonPositiveFloatType>(value, type); - } - - [Theory] - [InlineData(-1d, -1d)] - [InlineData(double.MinValue, double.MinValue)] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<NonPositiveFloatType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1)] - [InlineData(1d)] - [InlineData(int.MaxValue)] - [InlineData(double.MaxValue)] - [InlineData(true)] - [InlineData("foo")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<NonPositiveFloatType>(value); - } - - [Theory] - [InlineData(0d, 0d)] - [InlineData(-1d, -1d)] - [InlineData(double.MinValue, double.MinValue)] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<NonPositiveFloatType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MaxValue)] - [InlineData(double.MaxValue)] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<NonPositiveFloatType>(value); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<NonPositiveFloatType>(value); - } - - [Theory] - [InlineData(typeof(FloatValueNode), 0d)] - [InlineData(typeof(FloatValueNode), -12d)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<NonPositiveFloatType>(value, type); - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/NonPositiveIntTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/NonPositiveIntTypeTests.cs deleted file mode 100644 index 7a443161260..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/NonPositiveIntTypeTests.cs +++ /dev/null @@ -1,206 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class NonPositiveIntTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<NonPositiveIntType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), -1, true)] - [InlineData(typeof(IntValueNode), int.MinValue, true)] - [InlineData(typeof(IntValueNode), int.MaxValue, false)] - [InlineData(typeof(IntValueNode), 0, true)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<NonPositiveIntType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(-1, true)] - [InlineData(int.MinValue, true)] - [InlineData(int.MaxValue, false)] - [InlineData(0, true)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData(null, true)] - [InlineData("foo", false)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<NonPositiveIntType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0, 0)] - [InlineData(typeof(IntValueNode), -1, -1)] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<NonPositiveIntType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(IntValueNode), 1)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<NonPositiveIntType>(valueNode); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0)] - [InlineData(typeof(IntValueNode), -1)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<NonPositiveIntType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("")] - public void ParseLiteral_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<NonPositiveIntType>(value); - } - - [Theory] - [InlineData(0, 0)] - [InlineData(int.MinValue, int.MinValue)] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<NonPositiveIntType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1)] - [InlineData(int.MaxValue)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<NegativeIntType>(value); - } - - [Theory] - [InlineData(0, 0)] - [InlineData(-1, -1)] - [InlineData(int.MinValue, int.MinValue)] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<NonPositiveIntType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1)] - [InlineData(int.MaxValue)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<NonPositiveIntType>(value); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0)] - [InlineData(typeof(IntValueNode), -1)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<NonPositiveIntType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<NonPositiveIntType>(value); - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/PhoneNumberTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/PhoneNumberTypeTests.cs index 68c4a0a05c1..05b0a6190bd 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/PhoneNumberTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/PhoneNumberTypeTests.cs @@ -28,7 +28,7 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "+1789555123435", true)] [InlineData(typeof(StringValueNode), "+178955512343598", true)] [InlineData(typeof(StringValueNode), "+765436789012345678901234", false)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -41,28 +41,6 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<PhoneNumberType>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData(null, true)] - [InlineData("+1٧٨٩٥٥٥١٢٣٤", false)] - [InlineData("+16873271234", true)] - [InlineData("+765436789012", true)] - [InlineData("+7654367890123", true)] - [InlineData("+76543678901234", true)] - [InlineData("+765436789012345", true)] - [InlineData("+765436789012345678901234", false)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<PhoneNumberType>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "+16873271234", "+16873271234")] [InlineData(typeof(StringValueNode), @@ -72,7 +50,7 @@ public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expec "+178955512343598", "+178955512343598")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -96,7 +74,7 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "(123)-456-7890")] [InlineData(typeof(StringValueNode), "123-456-7890")] [InlineData(typeof(StringValueNode), "+1٧٨٩٥٥٥١٢٣٤")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -107,84 +85,46 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("+16873271234", "+16873271234")] - [InlineData("+76543678901234", "+76543678901234")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"+16873271234\"", "+16873271234")] + [InlineData("\"+76543678901234\"", "+76543678901234")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<PhoneNumberType>(resultValue, runtimeValue); + ExpectCoerceInputValueToMatch<PhoneNumberType>(jsonValue, runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("+765436789012345678901234")] - [InlineData("765436789012345678901234")] - [InlineData("(123)-456-7890")] - [InlineData("123-456-7890")] - [InlineData("+1٧٨٩٥٥٥١٢٣٤")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) + [InlineData("1.0")] + [InlineData("1")] + [InlineData("true")] + [InlineData("\"+765436789012345678901234\"")] + [InlineData("\"765436789012345678901234\"")] + [InlineData("\"(123)-456-7890\"")] + [InlineData("\"123-456-7890\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectDeserializeToThrowSerializationException<PhoneNumberType>(value); + ExpectCoerceInputValueToThrowSerializationException<PhoneNumberType>(jsonValue); } [Theory] - [InlineData("+16873271234", "+16873271234")] - [InlineData("+76543678901234", "+76543678901234")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<PhoneNumberType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("+765436789012345678901234")] - [InlineData("765436789012345678901234")] - [InlineData("(123)-456-7890")] - [InlineData("123-456-7890")] - [InlineData("+1٧٨٩٥٥٥١٢٣٤")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<PhoneNumberType>(value); - } - - [Theory] - [InlineData(typeof(StringValueNode), "+16873271234")] - [InlineData(typeof(StringValueNode), "+76543678901234")] - [InlineData(typeof(StringValueNode), "+178955512343598")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) + [InlineData("+16873271234")] + [InlineData("+76543678901234")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectParseValueToMatchType<PhoneNumberType>(value, type); + ExpectCoerceOutputValueToMatch<PhoneNumberType>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] @@ -192,13 +132,12 @@ public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("765436789012345678901234")] [InlineData("(123)-456-7890")] [InlineData("123-456-7890")] - [InlineData("+1٧٨٩٥٥٥١٢٣٤")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<PhoneNumberType>(value); + ExpectCoerceOutputValueToThrowSerializationException<PhoneNumberType>(value); } [Theory] @@ -206,16 +145,15 @@ public void ParseValue_GivenObject_ThrowSerializationException(object value) [InlineData(typeof(StringValueNode), "+76543678901234")] [InlineData(typeof(StringValueNode), "+178955512343598")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<PhoneNumberType>(value, type); + ExpectValueToLiteralToMatchType<PhoneNumberType>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] @@ -223,12 +161,11 @@ public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("765436789012345678901234")] [InlineData("(123)-456-7890")] [InlineData("123-456-7890")] - [InlineData("+1٧٨٩٥٥٥١٢٣٤")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<PhoneNumberType>(value); + ExpectValueToLiteralToThrowSerializationException<PhoneNumberType>(value); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/PortTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/PortTypeTests.cs deleted file mode 100644 index 3dae4dcbe4e..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/PortTypeTests.cs +++ /dev/null @@ -1,248 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class PortTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<PortType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(IntValueNode), -1, false)] - [InlineData(typeof(IntValueNode), -65536, false)] - [InlineData(typeof(IntValueNode), 0, true)] - [InlineData(typeof(IntValueNode), 1337, true)] - [InlineData(typeof(IntValueNode), 3000, true)] - [InlineData(typeof(IntValueNode), 4000, true)] - [InlineData(typeof(IntValueNode), 5000, true)] - [InlineData(typeof(IntValueNode), 8080, true)] - [InlineData(typeof(IntValueNode), 65535, true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<PortType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("foo", false)] - [InlineData(-1, false)] - [InlineData(-65536, false)] - [InlineData(0, true)] - [InlineData(1337, true)] - [InlineData(3000, true)] - [InlineData(4000, true)] - [InlineData(5000, true)] - [InlineData(8080, true)] - [InlineData(65535, true)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<PortType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0, 0)] - [InlineData(typeof(IntValueNode), 1337, 1337)] - [InlineData(typeof(IntValueNode), 3000, 3000)] - [InlineData(typeof(IntValueNode), 4000, 4000)] - [InlineData(typeof(IntValueNode), 5000, 5000)] - [InlineData(typeof(IntValueNode), 8080, 8080)] - [InlineData(typeof(IntValueNode), 65535, 65535)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object value, - object expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<PortType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - [InlineData(typeof(IntValueNode), int.MinValue)] - [InlineData(typeof(IntValueNode), int.MaxValue)] - [InlineData(typeof(IntValueNode), -1)] - [InlineData(typeof(IntValueNode), 65536)] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<PortType>(valueNode); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0)] - [InlineData(typeof(IntValueNode), 1337)] - [InlineData(typeof(IntValueNode), 3000)] - [InlineData(typeof(IntValueNode), 4000)] - [InlineData(typeof(IntValueNode), 5000)] - [InlineData(typeof(IntValueNode), 8080)] - [InlineData(typeof(IntValueNode), 65535)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<PortType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(int.MaxValue)] - [InlineData(-1)] - [InlineData(65536)] - public void ParseLiteral_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<PortType>(value); - } - - [Theory] - [InlineData(0, 0)] - [InlineData(1337, 1337)] - [InlineData(3000, 3000)] - [InlineData(4000, 4000)] - [InlineData(5000, 5000)] - [InlineData(8080, 8080)] - [InlineData(65535, 65535)] - public void Deserialize_GivenValue_MatchExpected( - object resultValue, - object runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<PortType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(int.MaxValue)] - [InlineData(-1)] - [InlineData(65536)] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<PortType>(value); - } - - [Theory] - [InlineData(0, 0)] - [InlineData(1337, 1337)] - [InlineData(3000, 3000)] - [InlineData(4000, 4000)] - [InlineData(5000, 5000)] - [InlineData(8080, 8080)] - [InlineData(65535, 65535)] - public void Serialize_GivenObject_MatchExpectedType( - object runtimeValue, - object resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<PortType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(int.MaxValue)] - [InlineData(-1)] - [InlineData(65536)] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<PortType>(value); - } - - [Theory] - [InlineData(typeof(IntValueNode), 0)] - [InlineData(typeof(IntValueNode), 1337)] - [InlineData(typeof(IntValueNode), 3000)] - [InlineData(typeof(IntValueNode), 4000)] - [InlineData(typeof(IntValueNode), 5000)] - [InlineData(typeof(IntValueNode), 8080)] - [InlineData(typeof(IntValueNode), 65535)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<PortType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(int.MaxValue)] - [InlineData(-1)] - [InlineData(65536)] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<PortType>(value); - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/PositiveIntTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/PositiveIntTypeTests.cs deleted file mode 100644 index 597ff8b826b..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/PositiveIntTypeTests.cs +++ /dev/null @@ -1,212 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class PositiveIntTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<PositiveIntType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "foo", false)] - [InlineData(typeof(IntValueNode), int.MinValue, false)] - [InlineData(typeof(IntValueNode), -1, false)] - [InlineData(typeof(IntValueNode), 0, false)] - [InlineData(typeof(IntValueNode), 1, true)] - [InlineData(typeof(IntValueNode), int.MaxValue, true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<PositiveIntType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(true, false)] - [InlineData("foo", false)] - [InlineData(int.MinValue, false)] - [InlineData(-1, false)] - [InlineData(0, false)] - [InlineData(null, true)] - [InlineData(1, true)] - [InlineData(int.MaxValue, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<PositiveIntType>(value, expected); - } - - [Theory] - [InlineData(typeof(IntValueNode), 1, 1)] - [InlineData(typeof(IntValueNode), int.MaxValue, int.MaxValue)] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<PositiveIntType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - [InlineData(typeof(IntValueNode), int.MinValue)] - [InlineData(typeof(IntValueNode), -1)] - [InlineData(typeof(IntValueNode), 0)] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<PositiveIntType>(valueNode); - } - - [Theory] - [InlineData(typeof(IntValueNode), 1)] - [InlineData(typeof(IntValueNode), int.MaxValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<PositiveIntType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - [InlineData(0)] - public void ParseValue_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<PositiveIntType>(value); - } - - [Theory] - [InlineData(1, 1)] - [InlineData(int.MaxValue, int.MaxValue)] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<PositiveIntType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - [InlineData(0)] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<PositiveIntType>(value); - } - - [Theory] - [InlineData(1, 1)] - [InlineData(int.MaxValue, int.MaxValue)] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<PositiveIntType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - [InlineData(0)] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<PositiveIntType>(value); - } - - [Theory] - [InlineData(typeof(IntValueNode), 1)] - [InlineData(typeof(IntValueNode), int.MaxValue)] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<PositiveIntType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(true)] - [InlineData("foo")] - [InlineData(int.MinValue)] - [InlineData(-1)] - [InlineData(0)] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<PositiveIntType>(value); - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/PostalCodeTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/PostalCodeTypeTests.cs deleted file mode 100644 index 23819090edb..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/PostalCodeTypeTests.cs +++ /dev/null @@ -1,425 +0,0 @@ -using HotChocolate.Language; - -namespace HotChocolate.Types; - -public class PostalCodeTypeTests : ScalarTypeTestBase -{ - [Fact] - public void Schema_WithScalar_IsMatch() - { - // arrange - var schema = BuildSchema<PostalCodeType>(); - - // act - // assert - schema.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "MK9 3HS", false)] // K = Kelvin Sign (U+212A) - [InlineData(typeof(StringValueNode), "K1A 0B1", false)] // K = Kelvin Sign (U+212A) - [InlineData(typeof(StringValueNode), "F-2|000", false)] - [InlineData(typeof(StringValueNode), "MK٩ ٣HS", false)] - [InlineData(typeof(StringValueNode), "٢٠٠٠١-١٢٣٤", false)] - [InlineData(typeof(StringValueNode), "٨٠٠١", false)] - [InlineData(typeof(StringValueNode), "44256", true)] - [InlineData(typeof(StringValueNode), "97909", true)] - [InlineData(typeof(StringValueNode), "64200", true)] - [InlineData(typeof(StringValueNode), "18000", true)] - [InlineData(typeof(StringValueNode), "98020", true)] - [InlineData(typeof(StringValueNode), "09070", true)] - [InlineData(typeof(StringValueNode), "1000 AP", true)] - [InlineData(typeof(StringValueNode), "48383", true)] - [InlineData(typeof(StringValueNode), "52070", true)] - [InlineData(typeof(StringValueNode), "2605", true)] - [InlineData(typeof(StringValueNode), "6771", true)] - [InlineData(typeof(StringValueNode), "114 55", true)] - [InlineData(typeof(StringValueNode), "1060", true)] - [InlineData(typeof(StringValueNode), "6560", true)] - [InlineData(typeof(StringValueNode), "4881", true)] - [InlineData(typeof(StringValueNode), "9485", true)] - [InlineData(typeof(StringValueNode), "EC1A 1BB", true)] - [InlineData(typeof(StringValueNode), "M1 1AE", true)] - [InlineData(typeof(StringValueNode), "B2V 0A0", true)] - [InlineData(typeof(StringValueNode), "V9E 9Z9", true)] - [InlineData(typeof(StringValueNode), "3500", true)] - [InlineData(typeof(StringValueNode), "0872", true)] - [InlineData(typeof(StringValueNode), "110091", true)] - [InlineData(typeof(StringValueNode), "4099", true)] - [InlineData(typeof(StringValueNode), "1001", true)] - [InlineData(typeof(StringValueNode), "7004", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<PostalCodeType>(valueNode, expected); - } - - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("MK9 3HS", false)] // K = Kelvin Sign (U+212A) - [InlineData("K1A 0B1", false)] // K = Kelvin Sign (U+212A) - [InlineData("F-2|000", false)] - [InlineData("MK٩ ٣HS", false)] - [InlineData("٢٠٠٠١-١٢٣٤", false)] - [InlineData("٨٠٠١", false)] - [InlineData("44256", true)] - [InlineData("97909", true)] - [InlineData("64200", true)] - [InlineData("18000", true)] - [InlineData("98020", true)] - [InlineData("09070", true)] - [InlineData("1000 AP", true)] - [InlineData("48383", true)] - [InlineData("52070", true)] - [InlineData("2605", true)] - [InlineData("6771", true)] - [InlineData("114 55", true)] - [InlineData("1060", true)] - [InlineData("6560", true)] - [InlineData("4881", true)] - [InlineData("9485", true)] - [InlineData("EC1A 1BB", true)] - [InlineData("M1 1AE", true)] - [InlineData("B2V 0A0", true)] - [InlineData("V9E 9Z9", true)] - [InlineData("3500", true)] - [InlineData("0872", true)] - [InlineData("110091", true)] - [InlineData("4099", true)] - [InlineData("1001", true)] - [InlineData("7004", true)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<PostalCodeType>(value, expected); - } - - [Theory] - [InlineData(typeof(StringValueNode), "44256", "44256")] - [InlineData(typeof(StringValueNode), "97909", "97909")] - [InlineData(typeof(StringValueNode), "64200", "64200")] - [InlineData(typeof(StringValueNode), "18000", "18000")] - [InlineData(typeof(StringValueNode), "98020", "98020")] - [InlineData(typeof(StringValueNode), "09070", "09070")] - [InlineData(typeof(StringValueNode), "1000 AP", "1000 AP")] - [InlineData(typeof(StringValueNode), "48383", "48383")] - [InlineData(typeof(StringValueNode), "52070", "52070")] - [InlineData(typeof(StringValueNode), "2605", "2605")] - [InlineData(typeof(StringValueNode), "6771", "6771")] - [InlineData(typeof(StringValueNode), "114 55", "114 55")] - [InlineData(typeof(StringValueNode), "1060", "1060")] - [InlineData(typeof(StringValueNode), "6560", "6560")] - [InlineData(typeof(StringValueNode), "4881", "4881")] - [InlineData(typeof(StringValueNode), "9485", "9485")] - [InlineData(typeof(StringValueNode), "EC1A 1BB", "EC1A 1BB")] - [InlineData(typeof(StringValueNode), "M1 1AE", "M1 1AE")] - [InlineData(typeof(StringValueNode), "B2V 0A0", "B2V 0A0")] - [InlineData(typeof(StringValueNode), "V9E 9Z9", "V9E 9Z9")] - [InlineData(typeof(StringValueNode), "3500", "3500")] - [InlineData(typeof(StringValueNode), "0872", "0872")] - [InlineData(typeof(StringValueNode), "110091", "110091")] - [InlineData(typeof(StringValueNode), "4099", "4099")] - [InlineData(typeof(StringValueNode), "1001", "1001")] - [InlineData(typeof(StringValueNode), "7004", "7004")] - [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToMatch<PostalCodeType>(valueNode, expected); - } - - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo)] - [InlineData(typeof(FloatValueNode), 1d)] - [InlineData(typeof(IntValueNode), 1)] - [InlineData(typeof(IntValueNode), 12345)] - [InlineData(typeof(BooleanValueNode), true)] - [InlineData(typeof(StringValueNode), "")] - [InlineData(typeof(StringValueNode), "XYZ")] - [InlineData(typeof(StringValueNode), "XYZ ZZ")] - [InlineData(typeof(StringValueNode), "XYZ 12")] - [InlineData(typeof(StringValueNode), "XYZ 123")] - [InlineData(typeof(StringValueNode), "MK9 3HS")] // K = Kelvin Sign (U+212A) - [InlineData(typeof(StringValueNode), "K1A 0B1")] // K = Kelvin Sign (U+212A) - [InlineData(typeof(StringValueNode), "F-2|000")] - [InlineData(typeof(StringValueNode), "MK٩ ٣HS")] - [InlineData(typeof(StringValueNode), "٢٠٠٠١-١٢٣٤")] - [InlineData(typeof(StringValueNode), "٨٠٠١")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectParseLiteralToThrowSerializationException<PostalCodeType>(valueNode); - } - - [Theory] - [InlineData("44256", "44256")] - [InlineData("97909", "97909")] - [InlineData("64200", "64200")] - [InlineData("18000", "18000")] - [InlineData("98020", "98020")] - [InlineData("09070", "09070")] - [InlineData("1000 AP", "1000 AP")] - [InlineData("48383", "48383")] - [InlineData("52070", "52070")] - [InlineData("2605", "2605")] - [InlineData("6771", "6771")] - [InlineData("114 55", "114 55")] - [InlineData("1060", "1060")] - [InlineData("6560", "6560")] - [InlineData("4881", "4881")] - [InlineData("9485", "9485")] - [InlineData("EC1A 1BB", "EC1A 1BB")] - [InlineData("M1 1AE", "M1 1AE")] - [InlineData("B2V 0A0", "B2V 0A0")] - [InlineData("V9E 9Z9", "V9E 9Z9")] - [InlineData("3500", "3500")] - [InlineData("0872", "0872")] - [InlineData("110091", "110091")] - [InlineData("4099", "4099")] - [InlineData("1001", "1001")] - [InlineData("7004", "7004")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, - object? runtimeValue) - { - // arrange - // act - // assert - ExpectDeserializeToMatch<PostalCodeType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("")] - [InlineData("XYZ")] - [InlineData("XYZ ZZ")] - [InlineData("XYZ 12")] - [InlineData("XYZ 123")] - [InlineData("MK9 3HS")] // K = Kelvin Sign (U+212A) - [InlineData("K1A 0B1")] // K = Kelvin Sign (U+212A) - [InlineData("F-2|000")] - [InlineData("MK٩ ٣HS")] - [InlineData("٢٠٠٠١-١٢٣٤")] - [InlineData("٨٠٠١")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<PostalCodeType>(value); - } - - [Theory] - [InlineData("44256", "44256")] - [InlineData("97909", "97909")] - [InlineData("64200", "64200")] - [InlineData("18000", "18000")] - [InlineData("98020", "98020")] - [InlineData("09070", "09070")] - [InlineData("1000 AP", "1000 AP")] - [InlineData("48383", "48383")] - [InlineData("52070", "52070")] - [InlineData("2605", "2605")] - [InlineData("6771", "6771")] - [InlineData("114 55", "114 55")] - [InlineData("1060", "1060")] - [InlineData("6560", "6560")] - [InlineData("4881", "4881")] - [InlineData("9485", "9485")] - [InlineData("EC1A 1BB", "EC1A 1BB")] - [InlineData("M1 1AE", "M1 1AE")] - [InlineData("B2V 0A0", "B2V 0A0")] - [InlineData("V9E 9Z9", "V9E 9Z9")] - [InlineData("3500", "3500")] - [InlineData("0872", "0872")] - [InlineData("110091", "110091")] - [InlineData("4099", "4099")] - [InlineData("1001", "1001")] - [InlineData("7004", "7004")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<PostalCodeType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("XYZ")] - [InlineData("XYZ ZZ")] - [InlineData("XYZ 12")] - [InlineData("XYZ 123")] - [InlineData("MK9 3HS")] // K = Kelvin Sign (U+212A) - [InlineData("K1A 0B1")] // K = Kelvin Sign (U+212A) - [InlineData("F-2|000")] - [InlineData("MK٩ ٣HS")] - [InlineData("٢٠٠٠١-١٢٣٤")] - [InlineData("٨٠٠١")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<PostalCodeType>(value); - } - - [Theory] - [InlineData(typeof(StringValueNode), "44256")] - [InlineData(typeof(StringValueNode), "97909")] - [InlineData(typeof(StringValueNode), "64200")] - [InlineData(typeof(StringValueNode), "18000")] - [InlineData(typeof(StringValueNode), "98020")] - [InlineData(typeof(StringValueNode), "09070")] - [InlineData(typeof(StringValueNode), "1000 AP")] - [InlineData(typeof(StringValueNode), "48383")] - [InlineData(typeof(StringValueNode), "52070")] - [InlineData(typeof(StringValueNode), "2605")] - [InlineData(typeof(StringValueNode), "6771")] - [InlineData(typeof(StringValueNode), "114 55")] - [InlineData(typeof(StringValueNode), "1060")] - [InlineData(typeof(StringValueNode), "6560")] - [InlineData(typeof(StringValueNode), "4881")] - [InlineData(typeof(StringValueNode), "9485")] - [InlineData(typeof(StringValueNode), "EC1A 1BB")] - [InlineData(typeof(StringValueNode), "M1 1AE")] - [InlineData(typeof(StringValueNode), "B2V 0A0")] - [InlineData(typeof(StringValueNode), "V9E 9Z9")] - [InlineData(typeof(StringValueNode), "3500")] - [InlineData(typeof(StringValueNode), "0872")] - [InlineData(typeof(StringValueNode), "110091")] - [InlineData(typeof(StringValueNode), "4099")] - [InlineData(typeof(StringValueNode), "1001")] - [InlineData(typeof(StringValueNode), "7004")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseValueToMatchType<PostalCodeType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("XYZ")] - [InlineData("XYZ ZZ")] - [InlineData("XYZ 12")] - [InlineData("XYZ 123")] - [InlineData("MK9 3HS")] // K = Kelvin Sign (U+212A) - [InlineData("K1A 0B1")] // K = Kelvin Sign (U+212A) - [InlineData("F-2|000")] - [InlineData("MK٩ ٣HS")] - [InlineData("٢٠٠٠١-١٢٣٤")] - [InlineData("٨٠٠١")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseValueToThrowSerializationException<PostalCodeType>(value); - } - - [Theory] - [InlineData(typeof(StringValueNode), "44256")] - [InlineData(typeof(StringValueNode), "97909")] - [InlineData(typeof(StringValueNode), "64200")] - [InlineData(typeof(StringValueNode), "18000")] - [InlineData(typeof(StringValueNode), "98020")] - [InlineData(typeof(StringValueNode), "09070")] - [InlineData(typeof(StringValueNode), "1000 AP")] - [InlineData(typeof(StringValueNode), "48383")] - [InlineData(typeof(StringValueNode), "52070")] - [InlineData(typeof(StringValueNode), "2605")] - [InlineData(typeof(StringValueNode), "6771")] - [InlineData(typeof(StringValueNode), "114 55")] - [InlineData(typeof(StringValueNode), "1060")] - [InlineData(typeof(StringValueNode), "6560")] - [InlineData(typeof(StringValueNode), "4881")] - [InlineData(typeof(StringValueNode), "9485")] - [InlineData(typeof(StringValueNode), "EC1A 1BB")] - [InlineData(typeof(StringValueNode), "M1 1AE")] - [InlineData(typeof(StringValueNode), "B2V 0A0")] - [InlineData(typeof(StringValueNode), "V9E 9Z9")] - [InlineData(typeof(StringValueNode), "3500")] - [InlineData(typeof(StringValueNode), "0872")] - [InlineData(typeof(StringValueNode), "110091")] - [InlineData(typeof(StringValueNode), "4099")] - [InlineData(typeof(StringValueNode), "1001")] - [InlineData(typeof(StringValueNode), "7004")] - [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) - { - // arrange - // act - // assert - ExpectParseResultToMatchType<PostalCodeType>(value, type); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("XYZ")] - [InlineData("XYZ ZZ")] - [InlineData("XYZ 12")] - [InlineData("XYZ 123")] - [InlineData("MK9 3HS")] // K = Kelvin Sign (U+212A) - [InlineData("K1A 0B1")] // K = Kelvin Sign (U+212A) - [InlineData("F-2|000")] - [InlineData("MK٩ ٣HS")] - [InlineData("٢٠٠٠١-١٢٣٤")] - [InlineData("٨٠٠١")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectParseResultToThrowSerializationException<PostalCodeType>(value); - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/RegexTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/RegexTypeTests.cs index 51eb3194b46..88ce95f806a 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/RegexTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/RegexTypeTests.cs @@ -19,7 +19,7 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(BooleanValueNode), true, false)] [InlineData(typeof(NullValueNode), null, true)] [InlineData(typeof(StringValueNode), "+178955512343598", true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -32,22 +32,10 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<StubType>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(null, true)] - [InlineData("+765436789012345678901234", false)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<StubType>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "+16873271234", "+16873271234")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -67,7 +55,7 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(BooleanValueNode), true)] [InlineData(typeof(StringValueNode), "")] [InlineData(typeof(StringValueNode), "123-456-7890")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -78,107 +66,75 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("+16873271234", "+16873271234")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"+16873271234\"", "+16873271234")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<StubType>(resultValue, runtimeValue); + ExpectCoerceInputValueToMatch<StubType>(jsonValue, runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("123-456-7890")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) + [InlineData("1.0")] + [InlineData("1")] + [InlineData("true")] + [InlineData("\"123-456-7890\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectDeserializeToThrowSerializationException<StubType>(value); + ExpectCoerceInputValueToThrowSerializationException<StubType>(jsonValue); } [Theory] - [InlineData("+16873271234", "+16873271234")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<StubType>(runtimeValue, resultValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(true)] - [InlineData("123-456-7890")] - public void Serialize_GivenObject_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectSerializeToThrowSerializationException<StubType>(value); - } - - [Theory] - [InlineData(typeof(StringValueNode), "+16873271234")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) + [InlineData("+16873271234")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectParseValueToMatchType<StubType>(value, type); + ExpectCoerceOutputValueToMatch<StubType>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] [InlineData("123-456-7890")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<StubType>(value); + ExpectCoerceOutputValueToThrowSerializationException<StubType>(value); } [Theory] [InlineData(typeof(StringValueNode), "+16873271234")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<StubType>(value, type); + ExpectValueToLiteralToMatchType<StubType>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(true)] [InlineData("123-456-7890")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<StubType>(value); + ExpectValueToLiteralToThrowSerializationException<StubType>(value); } public class StubType : RegexType diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs index 4e6abf3ac6f..1c85719dfa9 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs @@ -34,7 +34,7 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 1)", true)] [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 100%)", true)] [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -47,33 +47,6 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<RgbType>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("rgb(٢٥٥,٠,٠)", false)] - [InlineData("rgb(255,0,0)", true)] - [InlineData("rgb(100%, 0%, 0%)", true)] - [InlineData("rgb(300,0,0)", true)] - [InlineData("rgb(110%, 0%, 0%)", true)] - [InlineData("rgb(100%,0%,60%)", true)] - [InlineData("rgb(100%, 0%, 60%)", true)] - [InlineData("rgb(255 0 153)", true)] - [InlineData("rgb(255, 0, 153, 1)", true)] - [InlineData("rgb(255, 0, 153, 100%)", true)] - [InlineData("rgb(255 0 153 / 1)", true)] - [InlineData("rgb(255 0 153 / 100%)", true)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<RgbType>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "rgb(255,0,0)", "rgb(255,0,0)")] [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)", "rgb(100%, 0%, 0%)")] @@ -87,7 +60,7 @@ public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expec [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 1)", "rgb(255 0 153 / 1)")] [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 100%)", "rgb(255 0 153 / 100%)")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -110,7 +83,7 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "rgb(255, 0, 153.6, 1)")] [InlineData(typeof(StringValueNode), "rgb(1e2, .5e1, .5e0, +.25e2%)")] [InlineData(typeof(StringValueNode), "rgb(٢٥٥,٠,٠)")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -121,162 +94,92 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("rgb(255,0,0)", "rgb(255,0,0)")] - [InlineData("rgb(100%, 0%, 0%)", "rgb(100%, 0%, 0%)")] - [InlineData("rgb(300,0,0)", "rgb(300,0,0)")] - [InlineData("rgb(110%, 0%, 0%)", "rgb(110%, 0%, 0%)")] - [InlineData("rgb(100%,0%,60%)", "rgb(100%,0%,60%)")] - [InlineData("rgb(100%, 0%, 60%)", "rgb(100%, 0%, 60%)")] - [InlineData("rgb(255 0 153)", "rgb(255 0 153)")] - [InlineData("rgb(255, 0, 153, 1)", "rgb(255, 0, 153, 1)")] - [InlineData("rgb(255, 0, 153, 100%)", "rgb(255, 0, 153, 100%)")] - [InlineData("rgb(255 0 153 / 1)", "rgb(255 0 153 / 1)")] - [InlineData("rgb(255 0 153 / 100%)", "rgb(255 0 153 / 100%)")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"rgb(255,0,0)\"", "rgb(255,0,0)")] + [InlineData("\"rgb(100%, 0%, 0%)\"", "rgb(100%, 0%, 0%)")] + [InlineData("\"rgb(300,0,0)\"", "rgb(300,0,0)")] + [InlineData("\"rgb(255 0 153)\"", "rgb(255 0 153)")] + [InlineData("\"rgb(255, 0, 153, 1)\"", "rgb(255, 0, 153, 1)")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<RgbType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] - [InlineData("1")] - [InlineData("rgb(255, 0, 153.6, 1)")] - [InlineData("rgb(1e2, .5e1, .5e0, +.25e2%)")] - [InlineData("rgb(٢٥٥,٠,٠)")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<RgbType>(value); - } - - [Theory] - [InlineData("rgb(255,0,0)", "rgb(255,0,0)")] - [InlineData("rgb(100%, 0%, 0%)", "rgb(100%, 0%, 0%)")] - [InlineData("rgb(300,0,0)", "rgb(300,0,0)")] - [InlineData("rgb(110%, 0%, 0%)", "rgb(110%, 0%, 0%)")] - [InlineData("rgb(100%,0%,60%)", "rgb(100%,0%,60%)")] - [InlineData("rgb(100%, 0%, 60%)", "rgb(100%, 0%, 60%)")] - [InlineData("rgb(255 0 153)", "rgb(255 0 153)")] - [InlineData("rgb(255, 0, 153, 1)", "rgb(255, 0, 153, 1)")] - [InlineData("rgb(255, 0, 153, 100%)", "rgb(255, 0, 153, 100%)")] - [InlineData("rgb(255 0 153 / 1)", "rgb(255 0 153 / 1)")] - [InlineData("rgb(255 0 153 / 100%)", "rgb(255 0 153 / 100%)")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<RgbType>(runtimeValue, resultValue); + ExpectCoerceInputValueToMatch<RgbType>(jsonValue, runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] + [InlineData("1.0")] [InlineData("1")] - [InlineData("rgb(255, 0, 153.6, 1)")] - [InlineData("rgb(1e2, .5e1, .5e0, +.25e2%)")] - [InlineData("rgb(٢٥٥,٠,٠)")] - public void Serialize_GivenObject_ThrowSerializationException(object value) + [InlineData("12345")] + [InlineData("\"\"")] + [InlineData("\"1\"")] + [InlineData("\"rgb(255, 0, 153.6, 1)\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectSerializeToThrowSerializationException<RgbType>(value); + ExpectCoerceInputValueToThrowSerializationException<RgbType>(jsonValue); } [Theory] - [InlineData(typeof(StringValueNode), "rgb(255,0,0)")] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)")] - [InlineData(typeof(StringValueNode), "rgb(300,0,0)")] - [InlineData(typeof(StringValueNode), "rgb(110%, 0%, 0%)")] - [InlineData(typeof(StringValueNode), "rgb(100%,0%,60%)")] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 60%)")] - [InlineData(typeof(StringValueNode), "rgb(255 0 153)")] - [InlineData(typeof(StringValueNode), "rgb(255, 0, 153, 1)")] - [InlineData(typeof(StringValueNode), "rgb(255, 0, 153, 100%)")] - [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 1)")] - [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 100%)")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) + [InlineData("rgb(255,0,0)")] + [InlineData("rgb(100%, 0%, 0%)")] + [InlineData("rgb(300,0,0)")] + [InlineData("rgb(255 0 153)")] + [InlineData("rgb(255, 0, 153, 1)")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectParseValueToMatchType<RgbType>(value, type); + ExpectCoerceOutputValueToMatch<RgbType>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] [InlineData("")] [InlineData("1")] [InlineData("rgb(255, 0, 153.6, 1)")] - [InlineData("rgb(1e2, .5e1, .5e0, +.25e2%)")] - [InlineData("rgb(٢٥٥,٠,٠)")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<RgbType>(value); + ExpectCoerceOutputValueToThrowSerializationException<RgbType>(value); } [Theory] [InlineData(typeof(StringValueNode), "rgb(255,0,0)")] [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)")] [InlineData(typeof(StringValueNode), "rgb(300,0,0)")] - [InlineData(typeof(StringValueNode), "rgb(110%, 0%, 0%)")] - [InlineData(typeof(StringValueNode), "rgb(100%,0%,60%)")] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 60%)")] [InlineData(typeof(StringValueNode), "rgb(255 0 153)")] [InlineData(typeof(StringValueNode), "rgb(255, 0, 153, 1)")] - [InlineData(typeof(StringValueNode), "rgb(255, 0, 153, 100%)")] - [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 1)")] - [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 100%)")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<RgbType>(value, type); + ExpectValueToLiteralToMatchType<RgbType>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] [InlineData("")] [InlineData("1")] [InlineData("rgb(255, 0, 153.6, 1)")] - [InlineData("rgb(1e2, .5e1, .5e0, +.25e2%)")] - [InlineData("rgb(٢٥٥,٠,٠)")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<RgbType>(value); + ExpectValueToLiteralToThrowSerializationException<RgbType>(value); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs index e759111628f..6a3afa1d1c5 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs @@ -35,7 +35,7 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 0.4) ", true)] [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 40%)", true)] [InlineData(typeof(NullValueNode), null, true)] - public void IsInstanceOfType_GivenValueNode_MatchExpected( + public void IsValueCompatible_GivenValueNode_MatchExpected( Type type, object? value, bool expected) @@ -48,34 +48,6 @@ public void IsInstanceOfType_GivenValueNode_MatchExpected( ExpectIsInstanceOfTypeToMatch<RgbaType>(valueNode, expected); } - [Theory] - [InlineData(TestEnum.Foo, false)] - [InlineData(1d, false)] - [InlineData(1, false)] - [InlineData(true, false)] - [InlineData("", false)] - [InlineData("rgba(٥١, ١٧٠, ٥١, .١)", false)] - [InlineData("rgb(255,0,0)", true)] - [InlineData("rgb(100%, 0%, 0%)", true)] - [InlineData("rgb(300,0,0)", true)] - [InlineData("rgb(110%, 0%, 0%)", true)] - [InlineData("rgb(100%,0%,60%)", true)] - [InlineData("rgb(100%, 0%, 60%)", true)] - [InlineData("rgba(51, 170, 51, .1)", true)] - [InlineData("rgba(51, 170, 51, .4)", true)] - [InlineData("rgba(51, 170, 51, .7)", true)] - [InlineData("rgba(51, 170, 51, 1)", true)] - [InlineData("rgba(51 170 51 / 0.4)", true)] - [InlineData("rgba(51 170 51 / 40%)", true)] - [InlineData(null, true)] - public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expected) - { - // arrange - // act - // assert - ExpectIsInstanceOfTypeToMatch<RgbaType>(value, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "rgb(255,0,0)", "rgb(255,0,0)")] [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)", "rgb(100%, 0%, 0%)")] @@ -90,7 +62,7 @@ public void IsInstanceOfType_GivenObject_MatchExpected(object? value, bool expec [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 0.4)", "rgba(51 170 51 / 0.4)")] [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 40%)", "rgba(51 170 51 / 40%)")] [InlineData(typeof(NullValueNode), null, null)] - public void ParseLiteral_GivenValueNode_MatchExpected( + public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, object? expected) @@ -114,7 +86,7 @@ public void ParseLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "rgba(255, 0, 153.6, 1)")] [InlineData(typeof(StringValueNode), "rgba(1e2, .5e1, .5e0, +.25e2%)")] [InlineData(typeof(StringValueNode), "rgba(٥١, ١٧٠, ٥١, .١)")] - public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); @@ -125,114 +97,67 @@ public void ParseLiteral_GivenValueNode_ThrowSerializationException(Type type, o } [Theory] - [InlineData("rgb(255,0,0)", "rgb(255,0,0)")] - [InlineData("rgb(100%, 0%, 0%)", "rgb(100%, 0%, 0%)")] - [InlineData("rgb(300,0,0)", "rgb(300,0,0)")] - [InlineData("rgb(110%, 0%, 0%)", "rgb(110%, 0%, 0%)")] - [InlineData("rgb(100%,0%,60%)", "rgb(100%,0%,60%)")] - [InlineData("rgb(100%, 0%, 60%)", "rgb(100%, 0%, 60%)")] - [InlineData("rgba(51, 170, 51, .1)", "rgba(51, 170, 51, .1)")] - [InlineData("rgba(51, 170, 51, .4)", "rgba(51, 170, 51, .4)")] - [InlineData("rgba(51, 170, 51, .7)", "rgba(51, 170, 51, .7)")] - [InlineData("rgba(51, 170, 51, 1)", "rgba(51, 170, 51, 1)")] - [InlineData("rgba(51 170 51 / 0.4)", "rgba(51 170 51 / 0.4)")] - [InlineData("rgba(51 170 51 / 40%)", "rgba(51 170 51 / 40%)")] - [InlineData(null, null)] - public void Deserialize_GivenValue_MatchExpected( - object? resultValue, + [InlineData("\"rgb(255,0,0)\"", "rgb(255,0,0)")] + [InlineData("\"rgb(100%, 0%, 0%)\"", "rgb(100%, 0%, 0%)")] + [InlineData("\"rgb(300,0,0)\"", "rgb(300,0,0)")] + [InlineData("\"rgb(110%, 0%, 0%)\"", "rgb(110%, 0%, 0%)")] + [InlineData("\"rgb(100%,0%,60%)\"", "rgb(100%,0%,60%)")] + [InlineData("\"rgb(100%, 0%, 60%)\"", "rgb(100%, 0%, 60%)")] + [InlineData("\"rgba(51, 170, 51, .1)\"", "rgba(51, 170, 51, .1)")] + [InlineData("\"rgba(51, 170, 51, .4)\"", "rgba(51, 170, 51, .4)")] + [InlineData("\"rgba(51, 170, 51, .7)\"", "rgba(51, 170, 51, .7)")] + [InlineData("\"rgba(51, 170, 51, 1)\"", "rgba(51, 170, 51, 1)")] + [InlineData("\"rgba(51 170 51 / 0.4)\"", "rgba(51 170 51 / 0.4)")] + [InlineData("\"rgba(51 170 51 / 40%)\"", "rgba(51 170 51 / 40%)")] + public void CoerceInputValue_GivenValue_MatchExpected( + string jsonValue, object? runtimeValue) { // arrange // act // assert - ExpectDeserializeToMatch<RgbaType>(resultValue, runtimeValue); - } - - [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] - [InlineData("rgb(1e2, .5e1, .5e0, +.25e2%)")] - [InlineData("rgba(255, 0, 153.6, 1)")] - [InlineData("rgba(1e2, .5e1, .5e0, +.25e2%)")] - [InlineData("rgba(٥١, ١٧٠, ٥١, .١)")] - public void Deserialize_GivenValue_ThrowSerializationException(object value) - { - // arrange - // act - // assert - ExpectDeserializeToThrowSerializationException<RgbaType>(value); - } - - [Theory] - [InlineData("rgb(255,0,0)", "rgb(255,0,0)")] - [InlineData("rgb(100%, 0%, 0%)", "rgb(100%, 0%, 0%)")] - [InlineData("rgb(300,0,0)", "rgb(300,0,0)")] - [InlineData("rgb(110%, 0%, 0%)", "rgb(110%, 0%, 0%)")] - [InlineData("rgb(100%,0%,60%)", "rgb(100%,0%,60%)")] - [InlineData("rgb(100%, 0%, 60%)", "rgb(100%, 0%, 60%)")] - [InlineData("rgba(51, 170, 51, .1)", "rgba(51, 170, 51, .1)")] - [InlineData("rgba(51, 170, 51, .4)", "rgba(51, 170, 51, .4)")] - [InlineData("rgba(51, 170, 51, .7)", "rgba(51, 170, 51, .7)")] - [InlineData("rgba(51, 170, 51, 1)", "rgba(51, 170, 51, 1)")] - [InlineData("rgba(51 170 51 / 0.4)", "rgba(51 170 51 / 0.4)")] - [InlineData("rgba(51 170 51 / 40%)", "rgba(51 170 51 / 40%)")] - [InlineData(null, null)] - public void Serialize_GivenObject_MatchExpectedType( - object? runtimeValue, - object? resultValue) - { - // arrange - // act - // assert - ExpectSerializeToMatch<RgbaType>(runtimeValue, resultValue); + ExpectCoerceInputValueToMatch<RgbaType>(jsonValue, runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] - [InlineData(1d)] - [InlineData(1)] - [InlineData(12345)] - [InlineData("")] + [InlineData("1.0")] [InlineData("1")] - [InlineData("rgb(1e2, .5e1, .5e0, +.25e2%)")] - [InlineData("rgba(255, 0, 153.6, 1)")] - [InlineData("rgba(1e2, .5e1, .5e0, +.25e2%)")] - [InlineData("rgba(٥١, ١٧٠, ٥١, .١)")] - public void Serialize_GivenObject_ThrowSerializationException(object value) + [InlineData("12345")] + [InlineData("\"\"")] + [InlineData("\"rgb(1e2, .5e1, .5e0, +.25e2%)\"")] + [InlineData("\"rgba(255, 0, 153.6, 1)\"")] + [InlineData("\"rgba(1e2, .5e1, .5e0, +.25e2%)\"")] + [InlineData("\"rgba(٥١, ١٧٠, ٥١, .١)\"")] + public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) { // arrange // act // assert - ExpectSerializeToThrowSerializationException<RgbaType>(value); + ExpectCoerceInputValueToThrowSerializationException<RgbaType>(jsonValue); } [Theory] - [InlineData(typeof(StringValueNode), "rgb(255,0,0)")] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)")] - [InlineData(typeof(StringValueNode), "rgb(300,0,0)")] - [InlineData(typeof(StringValueNode), "rgb(110%, 0%, 0%)")] - [InlineData(typeof(StringValueNode), "rgb(100%,0%,60%)")] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 60%)")] - [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .1)")] - [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .4)")] - [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .7)")] - [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, 1)")] - [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 0.4)")] - [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 40%)")] - [InlineData(typeof(NullValueNode), null)] - public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) + [InlineData("rgb(255,0,0)")] + [InlineData("rgb(100%, 0%, 0%)")] + [InlineData("rgb(300,0,0)")] + [InlineData("rgb(110%, 0%, 0%)")] + [InlineData("rgb(100%,0%,60%)")] + [InlineData("rgb(100%, 0%, 60%)")] + [InlineData("rgba(51, 170, 51, .1)")] + [InlineData("rgba(51, 170, 51, .4)")] + [InlineData("rgba(51, 170, 51, .7)")] + [InlineData("rgba(51, 170, 51, 1)")] + [InlineData("rgba(51 170 51 / 0.4)")] + [InlineData("rgba(51 170 51 / 40%)")] + public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) { // arrange // act // assert - ExpectParseValueToMatchType<RgbaType>(value, type); + ExpectCoerceOutputValueToMatch<RgbaType>(runtimeValue); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] @@ -242,12 +167,12 @@ public void ParseValue_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("rgba(255, 0, 153.6, 1)")] [InlineData("rgba(1e2, .5e1, .5e0, +.25e2%)")] [InlineData("rgba(٥١, ١٧٠, ٥١, .١)")] - public void ParseValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseValueToThrowSerializationException<RgbaType>(value); + ExpectCoerceOutputValueToThrowSerializationException<RgbaType>(value); } [Theory] @@ -264,16 +189,15 @@ public void ParseValue_GivenObject_ThrowSerializationException(object value) [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 0.4)")] [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 40%)")] [InlineData(typeof(NullValueNode), null)] - public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) + public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange // act // assert - ExpectParseResultToMatchType<RgbaType>(value, type); + ExpectValueToLiteralToMatchType<RgbaType>(value, type); } [Theory] - [InlineData(TestEnum.Foo)] [InlineData(1d)] [InlineData(1)] [InlineData(12345)] @@ -283,11 +207,11 @@ public void ParseResult_GivenObject_MatchExpectedType(Type type, object? value) [InlineData("rgba(255, 0, 153.6, 1)")] [InlineData("rgba(1e2, .5e1, .5e0, +.25e2%)")] [InlineData("rgba(٥١, ١٧٠, ٥١, .١)")] - public void ParseResult_GivenObject_ThrowSerializationException(object value) + public void ValueToLiteral_GivenObject_ThrowSerializationException(object value) { // arrange // act // assert - ExpectParseResultToThrowSerializationException<RgbaType>(value); + ExpectValueToLiteralToThrowSerializationException<RgbaType>(value); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs index d384d7bdae7..c2a8e3a800b 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs @@ -1,6 +1,10 @@ +using System.Text.Json; using HotChocolate.Execution; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using Microsoft.Extensions.DependencyInjection; +using Moq; namespace HotChocolate.Types; @@ -68,21 +72,6 @@ protected void ExpectIsInstanceOfTypeToMatch<TType>( Assert.Equal(expectedResult, result); } - protected void ExpectIsInstanceOfTypeToMatch<TType>( - object? runtimeValue, - bool expectedResult) - where TType : ScalarType - { - // arrange - var scalar = CreateType<TType>(); - - // act - var result = scalar.IsInstanceOfType(runtimeValue); - - // assert - Assert.Equal(expectedResult, result); - } - protected void ExpectParseLiteralToMatch<TType>( IValueNode valueSyntax, object? expectedResult) @@ -112,8 +101,8 @@ protected void ExpectParseLiteralToThrowSerializationException<TType>( Assert.IsType<LeafCoercionException>(result); } - protected void ExpectParseValueToMatchType<TType>( - object? valueSyntax, + protected void ExpectValueToLiteralToMatchType<TType>( + object? runtimeValue, Type type) where TType : ScalarType { @@ -121,104 +110,89 @@ protected void ExpectParseValueToMatchType<TType>( var scalar = CreateType<TType>(); // act - var result = scalar.CoerceInputValue(valueSyntax); + var result = scalar.ValueToLiteral(runtimeValue!); // assert Assert.Equal(type, result.GetType()); } - protected void ExpectParseValueToThrowSerializationException<TType>(object? runtimeValue) + protected void ExpectValueToLiteralToThrowSerializationException<TType>(object? runtimeValue) where TType : ScalarType { // arrange var scalar = CreateType<TType>(); // act - var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); + var result = Record.Exception(() => scalar.ValueToLiteral(runtimeValue!)); // assert Assert.IsType<LeafCoercionException>(result); } - protected void ExpectSerializeToMatch<TType>( - object? runtimeValue, - object? resultValue) + protected void ExpectCoerceOutputValueToMatch<TType>( + object? runtimeValue) where TType : ScalarType { // arrange var scalar = CreateType<TType>(); // act - var result = scalar.Serialize(runtimeValue); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + scalar.CoerceOutputValue(runtimeValue!, resultElement); // assert - Assert.Equal(resultValue, result); + resultElement.MatchSnapshot(); } - protected void ExpectDeserializeToMatch<TType>( - object? resultValue, + protected void ExpectCoerceInputValueToMatch<TType>( + string jsonValue, object? runtimeValue) where TType : ScalarType { // arrange var scalar = CreateType<TType>(); + var inputValue = JsonDocument.Parse(jsonValue).RootElement; - // act - var result = scalar.Deserialize(resultValue); - - // assert - Assert.Equal(result, runtimeValue); - } - - protected void ExpectSerializeToThrowSerializationException<TType>(object runtimeValue) - where TType : ScalarType - { - // arrange - var scalar = CreateType<TType>(); + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act - var result = Record.Exception(() => scalar.Serialize(runtimeValue)); + var result = scalar.CoerceInputValue(inputValue, context.Object); // assert - Assert.IsType<LeafCoercionException>(result); + Assert.Equal(result, runtimeValue); } - protected void ExpectDeserializeToThrowSerializationException<TType>(object runtimeValue) + protected void ExpectCoerceOutputValueToThrowSerializationException<TType>(object runtimeValue) where TType : ScalarType { // arrange var scalar = CreateType<TType>(); // act - var result = Record.Exception(() => scalar.Deserialize(runtimeValue)); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultElement = resultDocument.Data.GetProperty("first"); + var result = Record.Exception(() => scalar.CoerceOutputValue(runtimeValue, resultElement)); // assert Assert.IsType<LeafCoercionException>(result); } - protected void ExpectParseResultToMatchType<TType>( - object? valueSyntax, - Type type) + protected void ExpectCoerceInputValueToThrowSerializationException<TType>(string jsonValue) where TType : ScalarType { // arrange var scalar = CreateType<TType>(); + var inputValue = JsonDocument.Parse(jsonValue).RootElement; - // act - var result = scalar.ParseResult(valueSyntax); - - // assert - Assert.Equal(type, result.GetType()); - } - - protected void ExpectParseResultToThrowSerializationException<TType>(object? runtimeValue) - where TType : ScalarType - { - // arrange - var scalar = CreateType<TType>(); + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act - var result = Record.Exception(() => scalar.ParseResult(runtimeValue)); + var result = Record.Exception(() => scalar.CoerceInputValue(inputValue, context.Object)); // assert Assert.IsType<LeafCoercionException>(result); diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs index eb701dd8cbf..a47004b8400 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs @@ -1,6 +1,7 @@ -using HotChocolate.Execution; +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; -using Microsoft.Extensions.DependencyInjection; +using Moq; namespace HotChocolate.Types; @@ -71,21 +72,7 @@ protected void UtcOffset_ExpectPositiveIsStringValueToMatch() } [Fact] - protected void UtcOffset_ExpectIsUtcOffsetToMatch() - { - // arrange - var scalar = CreateType<UtcOffsetType>(); - var valueSyntax = TimeSpan.FromHours(12); - - // act - var result = scalar.IsInstanceOfType(valueSyntax); - - // assert - Assert.True(result); - } - - [Fact] - protected void UtcOffset_ExpectParseLiteralToMatch() + protected void UtcOffset_ExpectCoerceInputLiteralToMatch() { // arrange var scalar = CreateType<UtcOffsetType>(); @@ -100,7 +87,7 @@ protected void UtcOffset_ExpectParseLiteralToMatch() } [Fact] - protected void UtcOffset_ExpectParseLiteralToThrowSerializationException() + protected void UtcOffset_ExpectCoerceInputLiteralToThrowSerializationException() { // arrange var scalar = CreateType<UtcOffsetType>(); @@ -114,229 +101,97 @@ protected void UtcOffset_ExpectParseLiteralToThrowSerializationException() } [Fact] - protected void UtcOffset_ExpectParseValueToMatchTimeSpan() + protected void UtcOffset_ExpectValueToLiteralToMatchTimeSpan() { // arrange var scalar = CreateType<UtcOffsetType>(); var valueSyntax = new TimeSpan(0, 0, 0); // act - var result = scalar.CoerceInputValue(valueSyntax); + var result = scalar.ValueToLiteral(valueSyntax); // assert Assert.Equal(typeof(StringValueNode), result.GetType()); } [Fact] - protected void UtcOffset_ExpectParseValueToThrowSerializationException() + protected void UtcOffset_ExpectValueToLiteralToThrowSerializationException() { // arrange var scalar = CreateType<UtcOffsetType>(); var runtimeValue = new StringValueNode("foo"); // act - var result = Record.Exception(() => scalar.CoerceInputValue(runtimeValue)); + var result = Record.Exception(() => scalar.ValueToLiteral(runtimeValue)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - protected void UtcOffset_ExpectSerializeToMatch() + protected void UtcOffset_ExpectCoerceOutputValueToMatch() { // arrange - ScalarType scalar = new UtcOffsetType(); - var dateTime = new TimeSpan(10, 0, 0); - - const string expectedValue = "+10:00"; - // act - var serializedValue = (string)scalar.Serialize(dateTime)!; - - // assert - Assert.Equal(expectedValue, serializedValue); - } - - [Fact] - protected void UtcOffset_ExpectDeserializeNullToMatch() - { - // arrange - ScalarType scalar = new UtcOffsetType(); - - // act - var success = scalar.TryDeserialize(null, out var deserialized); - // assert - Assert.True(success); - Assert.Null(deserialized); + ExpectCoerceOutputValueToMatch<UtcOffsetType>(new TimeSpan(10, 0, 0)); } [Fact] - public void UtcOffset_ExpectDeserializeNullableTimeSpanToTimeSpan() + protected void UtcOffset_ExpectCoerceInputValueNullToMatch() { // arrange - ScalarType scalar = new UtcOffsetType(); - TimeSpan? time = null; + var scalar = CreateType<UtcOffsetType>(); + using var doc = JsonDocument.Parse("null"); + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act - var success = scalar.TryDeserialize(time, out var deserialized); + var result = scalar.CoerceInputValue(doc.RootElement, context.Object); // assert - Assert.True(success); - Assert.Null(deserialized); + Assert.Null(result); } [Fact] - protected void UtcOffset_ExpectDeserializeStringToMatch() + protected void UtcOffset_ExpectCoerceInputValueStringToMatch() { // arrange var scalar = CreateType<UtcOffsetType>(); var runtimeValue = new TimeSpan(4, 0, 0); + using var doc = JsonDocument.Parse("\"+04:00\""); + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act - var deserializedValue = (TimeSpan)scalar - .Deserialize("+04:00")!; + var deserializedValue = (TimeSpan)scalar.CoerceInputValue(doc.RootElement, context.Object)!; // assert Assert.Equal(runtimeValue, deserializedValue); } [Fact] - protected void UtcOffset_ExpectDeserializeTimeSpanToMatch() - { - // arrange - var scalar = CreateType<UtcOffsetType>(); - object resultValue = new TimeSpan(4, 0, 0); - object runtimeValue = new TimeSpan(4, 0, 0); - - // act - var result = scalar.Deserialize(resultValue); - - // assert - Assert.Equal(result, runtimeValue); - } - - [Fact] - public void UtcOffset_ExpectDeserializeInvalidStringToTimeSpan() - { - // arrange - ScalarType scalar = new UtcOffsetType(); - - // act - var success = scalar.TryDeserialize("abc", out var _); - - // assert - Assert.False(success); - } - - [Fact] - public void UtcOffset_ExpectDeserializeNullToNull() - { - // arrange - ScalarType scalar = new UtcOffsetType(); - - // act - var success = scalar.TryDeserialize(null, out var deserialized); - - // assert - Assert.True(success); - Assert.Null(deserialized); - } - - [Fact] - protected void UtcOffset_ExpectSerializeToThrowSerializationException() - { - // arrange - var scalar = CreateType<UtcOffsetType>(); - - // act - var result = Record.Exception(() => scalar.Serialize("foo")); - - // assert - Assert.IsType<LeafCoercionException>(result); - } - - [Fact] - protected void UtcOffset_ExpectDeserializeToThrowSerializationException() + public void UtcOffset_ExpectCoerceInputValueInvalidStringToThrow() { // arrange var scalar = CreateType<UtcOffsetType>(); - object runtimeValue = new IntValueNode(1); - - // act - var result = Record.Exception(() => scalar.Deserialize(runtimeValue)); - - // assert - Assert.IsType<LeafCoercionException>(result); - } - - [Fact] - protected void UtcOffset_ExpectParseResultToMatchNull() - { - // arrange - ScalarType scalar = new UtcOffsetType(); - - // act - var result = scalar.ParseResult(null); - - // assert - Assert.Equal(typeof(NullValueNode), result.GetType()); - } - - [Fact] - protected void UtcOffset_ExpectParseResultToMatchStringValue() - { - // arrange - ScalarType scalar = new UtcOffsetType(); - const string valueSyntax = "-02:00"; + using var doc = JsonDocument.Parse("\"abc\""); + var context = new Mock<IFeatureProvider>(); + context.Setup(t => t.Features).Returns(FeatureCollection.Empty); // act - var result = scalar.ParseResult(valueSyntax); - - // assert - Assert.Equal(typeof(StringValueNode), result.GetType()); - } - - [Fact] - protected void UtcOffset_ExpectParseResultToThrowSerializationException() - { - // arrange - ScalarType scalar = new UtcOffsetType(); - IValueNode runtimeValue = new IntValueNode(1); - - // act - var result = Record.Exception(() => scalar.ParseResult(runtimeValue)); + var result = Record.Exception(() => scalar.CoerceInputValue(doc.RootElement, context.Object)); // assert Assert.IsType<LeafCoercionException>(result); } [Fact] - public async Task Integration_DefaultUtcOffset() + protected void UtcOffset_ExpectCoerceOutputValueToThrowSerializationException() { // arrange - var executor = await new ServiceCollection() - .AddGraphQL() - .AddQueryType<DefaultUtcOffsetType>() - .BuildRequestExecutorAsync(); - // act - var res = await executor.ExecuteAsync("{ test }"); - // assert - res.ToJson().MatchSnapshot(); - } - - public class DefaultUtcOffset - { - public TimeSpan Test => TimeSpan.Zero; - } - - public class DefaultUtcOffsetType : ObjectType<DefaultUtcOffset> - { - protected override void Configure(IObjectTypeDescriptor<DefaultUtcOffset> descriptor) - { - descriptor.Field(x => x.Test).Type<UtcOffsetType>(); - } + ExpectCoerceOutputValueToThrowSerializationException<UtcOffsetType>("foo"); } } diff --git a/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs b/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs index 649b4ec7346..8cc4f9a8f49 100644 --- a/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs +++ b/src/HotChocolate/Core/test/Validation.Tests/Types/InvalidScalar.cs @@ -1,4 +1,7 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types; namespace HotChocolate.Validation.Types; @@ -10,23 +13,17 @@ public InvalidScalar() { } - public override bool IsValueCompatible(IValueNode valueLiteral) - { - return false; - } + public override ScalarSerializationType SerializationType => ScalarSerializationType.Undefined; - public override object? CoerceInputLiteral(IValueNode valueSyntax) - { - throw new InvalidOperationException(); - } + public override object CoerceInputLiteral(IValueNode valueLiteral) + => throw new InvalidOperationException(); - public override IValueNode CoerceInputValue(object? value) - { - throw new InvalidOperationException(); - } + public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => throw new InvalidOperationException(); - public override IValueNode ParseResult(object? resultValue) - { - throw new InvalidOperationException(); - } + public override void OnCoerceOutputValue(string runtimeValue, ResultElement resultValue) + => throw new InvalidOperationException(); + + public override IValueNode OnValueToLiteral(string runtimeValue) + => throw new InvalidOperationException(); } diff --git a/src/HotChocolate/MongoDb/test/Types.MongoDb/BsonTypeTests.cs b/src/HotChocolate/MongoDb/test/Types.MongoDb/BsonTypeTests.cs index e9b34419c7b..7eca508df24 100644 --- a/src/HotChocolate/MongoDb/test/Types.MongoDb/BsonTypeTests.cs +++ b/src/HotChocolate/MongoDb/test/Types.MongoDb/BsonTypeTests.cs @@ -272,7 +272,7 @@ await executor.ExecuteAsync( } [Fact] - public async Task TrySerialize_Should_ReturnNull_When_CalledWithNull() + public async Task ValueToLiteral_Should_ReturnNullValueNode_When_CalledWithNull() { // arrange var type = (await new ServiceCollection() @@ -282,15 +282,14 @@ public async Task TrySerialize_Should_ReturnNull_When_CalledWithNull() .BuildSchemaAsync()).Types.GetType<BsonType>("Bson"); // act - var serialize = type.TrySerialize(null, out var value); + var value = type.ValueToLiteral(null); // assert - Assert.True(serialize); - Assert.Null(value); + Assert.IsType<NullValueNode>(value); } [Fact] - public async Task TrySerialize_Should_ReturnFalse_When_CalledWithNonBsonValue() + public async Task ValueToLiteral_Should_ThrowException_When_CalledWithNonBsonValue() { // arrange var type = (await new ServiceCollection() @@ -300,10 +299,10 @@ public async Task TrySerialize_Should_ReturnFalse_When_CalledWithNonBsonValue() .BuildSchemaAsync()).Types.GetType<BsonType>("Bson"); // act - var result = type.TrySerialize("Failes", out _); + var result = Record.Exception(() => type.ValueToLiteral("Fails")); // assert - Assert.False(result); + Assert.IsType<LeafCoercionException>(result); } [Fact] @@ -988,7 +987,7 @@ public void IsInstanceOfType_Null_ArgumentNullException() [InlineData(true, typeof(BooleanValueNode))] [InlineData(false, typeof(BooleanValueNode))] [Theory] - public void ParseValue_ScalarValues(object value, Type expectedType) + public void ValueToLiteral_ScalarValues(object value, Type expectedType) { // arrange var schema = SchemaBuilder.New() @@ -1004,14 +1003,14 @@ public void ParseValue_ScalarValues(object value, Type expectedType) var type = schema.Types.GetType<BsonType>("Bson"); // act - var literal = type.CoerceInputValue(value); + var literal = type.ValueToLiteral(value); // assert Assert.IsType(expectedType, literal); } [Fact] - public void ParseValue_Decimal() + public void ValueToLiteral_Decimal() { // arrange var schema = SchemaBuilder.New() @@ -1027,14 +1026,14 @@ public void ParseValue_Decimal() var type = schema.Types.GetType<BsonType>("Bson"); // act - var literal = type.CoerceInputValue((decimal)1); + var literal = type.ValueToLiteral((decimal)1); // assert Assert.IsType<StringValueNode>(literal); } [Fact] - public void ParseValue_List_Of_Object() + public void ValueToLiteral_List_Of_Object() { // arrange var schema = SchemaBuilder.New() @@ -1050,14 +1049,14 @@ public void ParseValue_List_Of_Object() var type = schema.Types.GetType<BsonType>("Bson"); // act - var literal = type.CoerceInputValue(new List<object>()); + var literal = type.ValueToLiteral(new List<object>()); // assert Assert.IsType<ListValueNode>(literal); } [Fact] - public void ParseValue_List_Of_String() + public void ValueToLiteral_List_Of_String() { // arrange var schema = SchemaBuilder.New() @@ -1073,14 +1072,14 @@ public void ParseValue_List_Of_String() var type = schema.Types.GetType<BsonType>("Bson"); // act - var literal = type.CoerceInputValue(new List<string>()); + var literal = type.ValueToLiteral(new List<string>()); // assert Assert.IsType<ListValueNode>(literal); } [Fact] - public void ParseValue_List_Of_Foo() + public void ValueToLiteral_List_Of_Foo() { // arrange var schema = SchemaBuilder.New() @@ -1096,14 +1095,14 @@ public void ParseValue_List_Of_Foo() var type = schema.Types.GetType<BsonType>("Bson"); // act - var literal = type.CoerceInputValue(new List<Foo>()); + var literal = type.ValueToLiteral(new List<Foo>()); // assert Assert.IsType<ListValueNode>(literal); } [Fact] - public void ParseValue_Dictionary() + public void ValueToLiteral_Dictionary() { // arrange var schema = SchemaBuilder.New() @@ -1119,7 +1118,7 @@ public void ParseValue_Dictionary() var type = schema.Types.GetType<BsonType>("Bson"); // act - var literal = type.CoerceInputValue( + var literal = type.ValueToLiteral( new Dictionary<string, object>()); // assert @@ -1127,7 +1126,7 @@ public void ParseValue_Dictionary() } [Fact] - public void Deserialize_ValueNode() + public void CoerceInputLiteral_ValueNode() { // arrange var schema = SchemaBuilder.New() @@ -1143,14 +1142,14 @@ public void Deserialize_ValueNode() var type = schema.Types.GetType<BsonType>("Bson"); // act - var value = type.Deserialize(new StringValueNode("Foo")); + var value = type.CoerceInputLiteral(new StringValueNode("Foo")); // assert Assert.Equal("Foo", Assert.IsType<BsonString>(value).Value); } [Fact] - public void Deserialize_Dictionary() + public void CoerceInputLiteral_ObjectValueNode() { // arrange var schema = SchemaBuilder.New() @@ -1165,20 +1164,18 @@ public void Deserialize_Dictionary() var type = schema.Types.GetType<BsonType>("Bson"); - var toDeserialize = new Dictionary<string, object> - { - { "Foo", new StringValueNode("Bar") } - }; + var toDeserialize = new ObjectValueNode( + new ObjectFieldNode("Foo", new StringValueNode("Bar"))); // act - var value = type.Deserialize(toDeserialize); + var value = type.CoerceInputLiteral(toDeserialize); // assert Assert.Equal("Bar", Assert.IsType<BsonDocument>(value)["Foo"]); } [Fact] - public void Deserialize_NestedDictionary() + public void CoerceInputLiteral_NestedObjectValueNode() { // arrange var schema = SchemaBuilder.New() @@ -1193,13 +1190,13 @@ public void Deserialize_NestedDictionary() var type = schema.Types.GetType<BsonType>("Bson"); - var toDeserialize = new Dictionary<string, object> - { - { "Foo", new Dictionary<string, object> { { "Bar", new StringValueNode("Baz") } } } - }; + var toDeserialize = new ObjectValueNode( + new ObjectFieldNode("Foo", + new ObjectValueNode( + new ObjectFieldNode("Bar", new StringValueNode("Baz"))))); // act - var value = type.Deserialize(toDeserialize); + var value = type.CoerceInputLiteral(toDeserialize); // assert var innerDictionary = Assert.IsType<BsonDocument>(value)["Foo"]; @@ -1207,7 +1204,7 @@ public void Deserialize_NestedDictionary() } [Fact] - public void Deserialize_List() + public void CoerceInputLiteral_ListValueNode() { // arrange var schema = SchemaBuilder.New() @@ -1221,11 +1218,12 @@ public void Deserialize_List() .Create(); var type = schema.Types.GetType<BsonType>("Bson"); - var toDeserialize = - new List<object> { new StringValueNode("Foo"), new StringValueNode("Bar") }; + var toDeserialize = new ListValueNode( + new StringValueNode("Foo"), + new StringValueNode("Bar")); // act - var value = type.Deserialize(toDeserialize); + var value = type.CoerceInputLiteral(toDeserialize); // assert Assert.Collection( diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs index 3e3054ce0e4..fbd7f66e394 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs @@ -104,11 +104,11 @@ public async Task ExecuteAutomaticPersistedOperation() // act var result = await executor.ExecuteAsync( - OperationRequest - .FromId(documentHash) - .WithDocument(new OperationDocument(Utf8GraphQLParser.Parse("{ __typename }"))) - .WithDocumentHash(new OperationDocumentHash(documentHash, "MD5", HashFormat.Base64)) - .WithExtensions(new Dictionary<string, object?> + OperationRequestBuilder.New() + .SetDocumentId(documentHash) + .SetDocument(Utf8GraphQLParser.Parse("{ __typename }")) + .SetDocumentHash(new OperationDocumentHash(documentHash, "MD5", HashFormat.Base64)) + .SetExtensions(new Dictionary<string, object?> { { "persistedQuery", @@ -118,7 +118,8 @@ public async Task ExecuteAutomaticPersistedOperation() { "md5Hash", documentHash } } } - })); + }) + .Build()); File.Delete(IO.Path.Combine(cacheDirectory, documentHash + ".graphql")); diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionRunCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionRunCommand.cs index 7058ab469d1..8474e7c4e1e 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionRunCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionRunCommand.cs @@ -52,6 +52,8 @@ private static async Task ExecuteAsync( port ??= GetRandomUnusedPort(); + // Type or member is obsolete +#pragma warning disable ASPDEPR008 var host = new WebHostBuilder() .UseKestrel() .UseUrls(new UriBuilder("http", "localhost", port.Value).ToString()) @@ -86,6 +88,7 @@ private static async Task ExecuteAsync( })); }) .Build(); +#pragma warning restore ASPDEPR008 var lifetime = host.Services.GetRequiredService<IHostApplicationLifetime>(); From 960f5f0910f08b7d58acfbca1833cac2061add19 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 8 Jan 2026 10:26:46 +0100 Subject: [PATCH 073/144] Improved example --- .../src/docs/hotchocolate/v16/defining-a-schema/scalars.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/src/docs/hotchocolate/v16/defining-a-schema/scalars.md b/website/src/docs/hotchocolate/v16/defining-a-schema/scalars.md index 0008770cf50..c596dd01256 100644 --- a/website/src/docs/hotchocolate/v16/defining-a-schema/scalars.md +++ b/website/src/docs/hotchocolate/v16/defining-a-schema/scalars.md @@ -80,13 +80,13 @@ It is **not** automatically inferred and the `IdType` needs to be [explicitly sp ```csharp public class Product { - [GraphQLType(typeof(IdType))] + [GraphQLType<IdType>] public int Id { get; set; } } public class Query { - public Product GetProduct([GraphQLType(typeof(IdType))] int id) + public Product GetProduct([GraphQLType<IdType>] int id) { // Omitted code for brevity } From 17393e4c69a671d2c3b6accc67f3f9927f7a27c0 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 8 Jan 2026 12:29:35 +0100 Subject: [PATCH 074/144] refactor: Remove obsolete scalar types and related error handling from resources and throw helper --- .../Types.Scalars/ScalarResources.Designer.cs | 192 ------------ .../src/Types.Scalars/ScalarResources.resx | 96 ------ .../Core/src/Types.Scalars/ThrowHelper.cs | 79 +---- .../v16/defining-a-schema/scalars.md | 273 ++++++++---------- 4 files changed, 118 insertions(+), 522 deletions(-) diff --git a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs index af32d672920..d20d1b68ad5 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.Designer.cs @@ -153,18 +153,6 @@ internal static string LatitudeType_InvalidFormat { } } - internal static string LocalCurrencyType_Description { - get { - return ResourceManager.GetString("LocalCurrencyType_Description", resourceCulture); - } - } - - internal static string LocalCurrencyType_InvalidFormat { - get { - return ResourceManager.GetString("LocalCurrencyType_InvalidFormat", resourceCulture); - } - } - internal static string LongitudeType_Description { get { return ResourceManager.GetString("LongitudeType_Description", resourceCulture); @@ -177,132 +165,6 @@ internal static string LongitudeType_InvalidFormat { } } - internal static string NegativeFloatType_Description { - get { - return ResourceManager.GetString("NegativeFloatType_Description", resourceCulture); - } - } - - internal static string NegativeFloatType_IsNotNegative_ParseLiteral { - get { - return ResourceManager.GetString("NegativeFloatType_IsNotNegative_ParseLiteral", resourceCulture); - } - } - - internal static string NegativeFloatType_IsNotNegative_ParseValue { - get { - return ResourceManager.GetString("NegativeFloatType_IsNotNegative_ParseValue", resourceCulture); - } - } - - internal static string NegativeIntType_Description { - get { - return ResourceManager.GetString("NegativeIntType_Description", resourceCulture); - } - } - - internal static string NegativeIntType_IsNotNegative_ParseLiteral { - get { - return ResourceManager.GetString("NegativeIntType_IsNotNegative_ParseLiteral", resourceCulture); - } - } - - internal static string NegativeIntType_IsNotNegative_ParseValue { - get { - return ResourceManager.GetString("NegativeIntType_IsNotNegative_ParseValue", resourceCulture); - } - } - - internal static string NonEmptyStringType_Description { - get { - return ResourceManager.GetString("NonEmptyStringType_Description", resourceCulture); - } - } - - internal static string NonEmptyStringType_IsEmpty_ParseLiteral { - get { - return ResourceManager.GetString("NonEmptyStringType_IsEmpty_ParseLiteral", resourceCulture); - } - } - - internal static string NonEmptyStringType_IsEmpty_ParseValue { - get { - return ResourceManager.GetString("NonEmptyStringType_IsEmpty_ParseValue", resourceCulture); - } - } - - internal static string NonNegativeIntType_Description { - get { - return ResourceManager.GetString("NonNegativeIntType_Description", resourceCulture); - } - } - - internal static string NonNegativeIntType_IsNotNonNegative_ParseLiteral { - get { - return ResourceManager.GetString("NonNegativeIntType_IsNotNonNegative_ParseLiteral", resourceCulture); - } - } - - internal static string NonNegativeIntType_IsNotNonNegative_ParseValue { - get { - return ResourceManager.GetString("NonNegativeIntType_IsNotNonNegative_ParseValue", resourceCulture); - } - } - - internal static string NonPositiveFloatType_Description { - get { - return ResourceManager.GetString("NonPositiveFloatType_Description", resourceCulture); - } - } - - internal static string NonPositiveFloatType_IsNotNonPositive_ParseLiteral { - get { - return ResourceManager.GetString("NonPositiveFloatType_IsNotNonPositive_ParseLiteral", resourceCulture); - } - } - - internal static string NonPositiveFloatType_IsNotNonPositive_ParseValue { - get { - return ResourceManager.GetString("NonPositiveFloatType_IsNotNonPositive_ParseValue", resourceCulture); - } - } - - internal static string NonPositiveIntType_Description { - get { - return ResourceManager.GetString("NonPositiveIntType_Description", resourceCulture); - } - } - - internal static string NonPositiveIntType_IsNotNonPositive_ParseLiteral { - get { - return ResourceManager.GetString("NonPositiveIntType_IsNotNonPositive_ParseLiteral", resourceCulture); - } - } - - internal static string NonPositiveIntType_IsNotNonPositive_ParseValue { - get { - return ResourceManager.GetString("NonPositiveIntType_IsNotNonPositive_ParseValue", resourceCulture); - } - } - - internal static string NonNegativeFloatType_Description { - get { - return ResourceManager.GetString("NonNegativeFloatType_Description", resourceCulture); - } - } - - internal static string NonNegativeFloatType_IsNotNonNegative_ParseLiteral { - get { - return ResourceManager.GetString("NonNegativeFloatType_IsNotNonNegative_ParseLiteral", resourceCulture); - } - } - - internal static string NonNegativeFloatType_IsNotNonNegative_ParseValue { - get { - return ResourceManager.GetString("NonNegativeFloatType_IsNotNonNegative_ParseValue", resourceCulture); - } - } - internal static string PhoneNumberType_Description { get { return ResourceManager.GetString("PhoneNumberType_Description", resourceCulture); @@ -315,60 +177,6 @@ internal static string PhoneNumberType_InvalidFormat { } } - internal static string PortType_Description { - get { - return ResourceManager.GetString("PortType_Description", resourceCulture); - } - } - - internal static string PortType_OutOfRange_ParseLiteral { - get { - return ResourceManager.GetString("PortType_OutOfRange_ParseLiteral", resourceCulture); - } - } - - internal static string PortType_OutOfRange_ParseValue { - get { - return ResourceManager.GetString("PortType_OutOfRange_ParseValue", resourceCulture); - } - } - - internal static string PositiveIntType_Description { - get { - return ResourceManager.GetString("PositiveIntType_Description", resourceCulture); - } - } - - internal static string PositiveIntType_ZeroOrLess_ParseLiteral { - get { - return ResourceManager.GetString("PositiveIntType_ZeroOrLess_ParseLiteral", resourceCulture); - } - } - - internal static string PositiveIntType_ZeroOrLess_ParseValue { - get { - return ResourceManager.GetString("PositiveIntType_ZeroOrLess_ParseValue", resourceCulture); - } - } - - internal static string PostalCodeType_Description { - get { - return ResourceManager.GetString("PostalCodeType_Description", resourceCulture); - } - } - - internal static string PostalCodeType_IsInvalid_ParseLiteral { - get { - return ResourceManager.GetString("PostalCodeType_IsInvalid_ParseLiteral", resourceCulture); - } - } - - internal static string PostalCodeType_IsInvalid_ParseValue { - get { - return ResourceManager.GetString("PostalCodeType_IsInvalid_ParseValue", resourceCulture); - } - } - internal static string RgbType_Description { get { return ResourceManager.GetString("RgbType_Description", resourceCulture); diff --git a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx index 2aeaf02fb5f..38ffb536871 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx +++ b/src/HotChocolate/Core/src/Types.Scalars/ScalarResources.resx @@ -171,114 +171,18 @@ <data name="LatitudeType_InvalidFormat" xml:space="preserve"> <value>LatitudeType cannot parse the provided value. The provided value was not a valid decimal degrees latitude number.</value> </data> - <data name="LocalCurrencyType_Description" xml:space="preserve"> - <value>The LocalCurrency scalar type is a currency string.</value> - </data> - <data name="LocalCurrencyType_InvalidFormat" xml:space="preserve"> - <value>LocalCurrencyType cannot parse the provided value. The provided value is not a valid local currency.</value> - </data> <data name="LongitudeType_Description" xml:space="preserve"> <value>The Longitude scalar type is a valid decimal degrees longitude number.</value> </data> <data name="LongitudeType_InvalidFormat" xml:space="preserve"> <value>LongitudeType cannot parse the provided value. The provided value is not a valid longitude number.</value> </data> - <data name="NegativeFloatType_Description" xml:space="preserve"> - <value>The NegativeFloat scalar type represents a double‐precision fractional value less than 0.</value> - </data> - <data name="NegativeFloatType_IsNotNegative_ParseLiteral" xml:space="preserve"> - <value>NegativeFloatType cannot parse the provided literal. The provided value was not negative.</value> - </data> - <data name="NegativeFloatType_IsNotNegative_ParseValue" xml:space="preserve"> - <value>NegativeFloatType cannot parse the provided value. The provided value was not negative.</value> - </data> - <data name="NegativeIntType_Description" xml:space="preserve"> - <value>The NegativeInt scalar type represents a signed 32-bit numeric non-fractional with a maximum of -1.</value> - </data> - <data name="NegativeIntType_IsNotNegative_ParseLiteral" xml:space="preserve"> - <value>NegativeIntType cannot parse the provided literal. The provided value was not negative.</value> - </data> - <data name="NegativeIntType_IsNotNegative_ParseValue" xml:space="preserve"> - <value>NegativeIntType cannot parse the provided value. The provided value was not negative.</value> - </data> - <data name="NonEmptyStringType_Description" xml:space="preserve"> - <value>The NonEmptyString scalar type represents non empty textual data, represented as UTF‐8 character sequences with at least one character</value> - </data> - <data name="NonEmptyStringType_IsEmpty_ParseLiteral" xml:space="preserve"> - <value>NonEmptyStringType cannot parse the provided literal. The provided string was empty.</value> - </data> - <data name="NonEmptyStringType_IsEmpty_ParseValue" xml:space="preserve"> - <value>NonEmptyStringType cannot parse the provided value. The provided string was empty.</value> - </data> - <data name="NonNegativeIntType_Description" xml:space="preserve"> - <value>The NonNegativeInt scalar type represents a unsigned 32-bit numeric non-fractional value equal to or greater than 0.</value> - </data> - <data name="NonNegativeIntType_IsNotNonNegative_ParseLiteral" xml:space="preserve"> - <value>NonNegativeIntType cannot parse the provided literal. The provided value was not greater than or equal to 0.</value> - </data> - <data name="NonNegativeIntType_IsNotNonNegative_ParseValue" xml:space="preserve"> - <value>NonNegativeIntType cannot parse the provided value. The provided value was not greater than or equal to 0.</value> - </data> - <data name="NonPositiveFloatType_Description" xml:space="preserve"> - <value>The NonPositiveFloat scalar type represents a double‐precision fractional value less than or equal to 0.</value> - </data> - <data name="NonPositiveFloatType_IsNotNonPositive_ParseLiteral" xml:space="preserve"> - <value>NonPositiveFloatType cannot parse the provided literal. The provided value was not less than or equal to 0.</value> - </data> - <data name="NonPositiveFloatType_IsNotNonPositive_ParseValue" xml:space="preserve"> - <value>NonPositiveFloatType cannot parse the provided value. The provided value was not less than or equal to 0.</value> - </data> - <data name="NonPositiveIntType_Description" xml:space="preserve"> - <value>The NonPositiveInt scalar type represents a signed 32-bit numeric non-fractional value less than or equal to 0.</value> - </data> - <data name="NonPositiveIntType_IsNotNonPositive_ParseLiteral" xml:space="preserve"> - <value>NonPositiveIntType cannot parse the provided literal. The provided value was not less than or equal to 0.</value> - </data> - <data name="NonPositiveIntType_IsNotNonPositive_ParseValue" xml:space="preserve"> - <value>NonPositiveIntType cannot parse the provided value. The provided value was not less than or equal to 0.</value> - </data> - <data name="NonNegativeFloatType_Description" xml:space="preserve"> - <value>The NonNegativeFloat scalar type represents a double‐precision fractional value greater than or equal to 0.</value> - </data> - <data name="NonNegativeFloatType_IsNotNonNegative_ParseLiteral" xml:space="preserve"> - <value>NonNegativeFloatType cannot parse the provided literal. The provided value was not greater than or equal to 0.</value> - </data> - <data name="NonNegativeFloatType_IsNotNonNegative_ParseValue" xml:space="preserve"> - <value>NonNegativeFloatType cannot parse the provided value. The provided value was not greater than or equal to 0.</value> - </data> <data name="PhoneNumberType_Description" xml:space="preserve"> <value>The PhoneNumber scalar type represents a value that conforms to the standard E.164 format.</value> </data> <data name="PhoneNumberType_InvalidFormat" xml:space="preserve"> <value>PhoneNumberType cannot parse the provided value. The provided value does not meet the standard E.164 format.</value> </data> - <data name="PortType_Description" xml:space="preserve"> - <value>The Port scalar type represents a field whose value is a valid TCP port within the range of 0 to 65535: https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_ports.</value> - </data> - <data name="PortType_OutOfRange_ParseLiteral" xml:space="preserve"> - <value>Port cannot parse the provided literal. The provided value was not within the valid range.</value> - </data> - <data name="PortType_OutOfRange_ParseValue" xml:space="preserve"> - <value>Port cannot parse the provided value. The provided value was not within the valid range.</value> - </data> - <data name="PositiveIntType_Description" xml:space="preserve"> - <value>The PositiveInt scalar type represents a signed 32-bit numeric non-fractional value of at least the value 1.</value> - </data> - <data name="PositiveIntType_ZeroOrLess_ParseLiteral" xml:space="preserve"> - <value>PositiveIntType cannot parse the provided literal. The provided value is 0 or less.</value> - </data> - <data name="PositiveIntType_ZeroOrLess_ParseValue" xml:space="preserve"> - <value>PositiveIntType cannot parse the provided value. The provided value is 0 or less.</value> - </data> - <data name="PostalCodeType_Description" xml:space="preserve"> - <value>The PostalCode scalar type represents a valid postal code.</value> - </data> - <data name="PostalCodeType_IsInvalid_ParseLiteral" xml:space="preserve"> - <value>PostalCodeType cannot parse the provided literal. The provided value is an invalid postal code.</value> - </data> - <data name="PostalCodeType_IsInvalid_ParseValue" xml:space="preserve"> - <value>PostalCodeType cannot parse the provided value. The provided value is an invalid postal code.</value> - </data> <data name="RgbType_Description" xml:space="preserve"> <value>The Rgb scalar type represents a valid CSS RGB color as defined in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb()_and_rgba().</value> </data> diff --git a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs index e61d4bb252f..75f4ec84806 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs @@ -90,17 +90,6 @@ public static LeafCoercionException LatitudeType_InvalidFormat(IType type) type); } - public static LeafCoercionException LocalCurrencyType_InvalidFormat(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.LocalCurrencyType_InvalidFormat) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.LocalCurrency) - .Build(), - type); - } - public static LeafCoercionException LongitudeType_InvalidFormat(IType type) { return new LeafCoercionException( @@ -133,73 +122,7 @@ public static LeafCoercionException PhoneNumberType_InvalidFormat(IType type) .Build(), type); } - - public static LeafCoercionException PortType_ParseLiteral_OutOfRange(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.PortType_OutOfRange_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.Port) - .Build(), - type); - } - - public static LeafCoercionException PortType_ParseValue_OutOfRange(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.PortType_OutOfRange_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.Port) - .Build(), - type); - } - - public static LeafCoercionException PositiveIntType_ParseLiteral_ZeroOrLess(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.PositiveIntType_ZeroOrLess_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.PositiveInt) - .Build(), - type); - } - - public static LeafCoercionException PositiveIntType_ParseValue_ZeroOrLess(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.PositiveIntType_ZeroOrLess_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.PositiveInt) - .Build(), - type); - } - - public static LeafCoercionException PostalCodeType_ParseLiteral_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.PostalCodeType_IsInvalid_ParseLiteral) - .SetCode(ErrorCodes.Scalars.InvalidSyntaxFormat) - .SetExtension("actualType", WellKnownScalarTypes.PostalCode) - .Build(), - type); - } - - public static LeafCoercionException PostalCodeType_ParseValue_IsInvalid(IType type) - { - return new LeafCoercionException( - ErrorBuilder.New() - .SetMessage(ScalarResources.PostalCodeType_IsInvalid_ParseValue) - .SetCode(ErrorCodes.Scalars.InvalidRuntimeType) - .SetExtension("actualType", WellKnownScalarTypes.PostalCode) - .Build(), - type); - } - + public static LeafCoercionException RgbType_InvalidFormat(IType type) { return new LeafCoercionException( diff --git a/website/src/docs/hotchocolate/v16/defining-a-schema/scalars.md b/website/src/docs/hotchocolate/v16/defining-a-schema/scalars.md index c596dd01256..4450c300221 100644 --- a/website/src/docs/hotchocolate/v16/defining-a-schema/scalars.md +++ b/website/src/docs/hotchocolate/v16/defining-a-schema/scalars.md @@ -2,13 +2,13 @@ title: "Scalars" --- -Scalar types are the primitives of our schema and can hold a specific type of data. They are leaf types, meaning we cannot use e.g. `{ fieldName }` to further drill down into the type. The main purpose of a scalar is to define how a value is serialized and deserialized. +Scalars are the leaf types of a GraphQL schema — they represent concrete values like strings, numbers, and dates. Unlike object types, scalars cannot be decomposed further; they are where the query ends and actual data is returned. -Besides basic scalars like `String` and `Int`, we can also create custom scalars like `CreditCardNumber` or `SocialSecurityNumber`. These custom scalars can greatly enhance the expressiveness of our schema and help new developers to get a grasp of our API. +Every scalar defines how values are converted between their GraphQL wire format (JSON) and .NET runtime representation. GraphQL includes five built-in scalars (`String`, `Int`, `Float`, `Boolean`, and `ID`), but you can also define custom scalars like `DateTime`, `Uuid`, or `EmailAddress` to add domain-specific validation and improve the clarity of your API. Hot Chocolate already comes with lots of additional scalars. -# GraphQL scalars +# Built-in Scalars -The GraphQL specification defines the following scalars. +The GraphQL specification defines five scalar types that every implementation must support. ## String @@ -204,20 +204,24 @@ scalar LocalDate @specifiedBy(url: "https://scalars.graphql.org/andimarek/local- In addition to the scalars defined by the specification, Hot Chocolate also supports the following set of scalar types: -| Type | Description | -| --------------- | ------------------------------------------------------------------------------------------------ | -| `Byte` | Byte | -| `ByteArray` | Base64 encoded array of bytes | -| `Short` | Signed 16-bit numeric non-fractional value | -| `Long` | Signed 64-bit numeric non-fractional value | -| `Decimal` | .NET Floating Point Type | -| `Url` | Url | -| `Date` | ISO-8601 date | -| `LocalDateTime` | Local date/time string (i.e., with no associated timezone) with the format `YYYY-MM-DDThh:mm:ss` | -| `LocalTime` | Local time string (i.e., with no associated timezone) in 24-hr `HH:mm:ss` | -| `TimeSpan` | ISO-8601 duration | -| `Uuid` | GUID | -| `Any` | This type can be anything, string, int, list or object, etc. | +| Type | Description | +| --------------- | --------------------------------------------------------------------------------------------------------- | +| `Byte` | Byte | +| `ByteArray` | Base64 encoded array of bytes | +| `Short` | Signed 16-bit numeric non-fractional value | +| `Long` | Signed 64-bit numeric non-fractional value | +| `Decimal` | .NET Floating Point Type | +| `Url` | Url | +| `Date` | ISO-8601 date | +| `LocalDateTime` | Local date/time string (i.e., with no associated timezone) with the format `YYYY-MM-DDThh:mm:ss` | +| `LocalTime` | Local time string (i.e., with no associated timezone) in 24-hr `HH:mm:ss` | +| `TimeSpan` | ISO-8601 duration | +| `Uuid` | GUID | +| `Json` | This type can be anything, string, int, list or object, etc. | +| `SignedByte` | Signed 8-bit numeric non‐fractional value greater than or equal to -127 and smaller than or equal to 128. | +| `UnsignedInt` | Unsigned 32‐bit numeric non‐fractional value greater than or equal to 0 | +| `UnsignedLong` | Unsigned 64‐bit numeric non‐fractional value greater than or equal to 0 | +| `UnsignedShort` | Unsigned 16‐bit numeric non‐fractional value greater than or equal to 0 and smaller or equal to 65535. | ## Uuid Type @@ -324,25 +328,10 @@ To use these scalars we have to add the `HotChocolate.Types.Scalars` package. | Isbn | ISBN-10 or ISBN-13 number as defined [here](https://en.wikipedia.org/wiki/International_Standard_Book_Number) | | Latitude | Decimal degrees latitude number | | Longitude | Decimal degrees longitude number | -| LocalCurrency | Currency string | | MacAddress | IEEE 802 48-bit (MAC-48/EUI-48) and 64-bit (EUI-64) Mac addresses, represented as UTF-8 character sequences, as defined in [RFC7042][3] and [RFC7043][4] | -| NegativeFloat | Double‐precision fractional value less than 0 | -| NegativeInt | Signed 32-bit numeric non-fractional with a maximum of -1 | -| NonEmptyString | Non empty textual data, represented as UTF‐8 character sequences with at least one character | -| NonNegativeFloat | Double‐precision fractional value greater than or equal to 0 | -| NonNegativeInt | Unsigned 32-bit numeric non-fractional value greater than or equal to 0 | -| NonPositiveFloat | Double‐precision fractional value less than or equal to 0 | -| NonPositiveInt | Signed 32-bit numeric non-fractional value less than or equal to 0 | | PhoneNumber | A value that conforms to the standard E.164 format as defined [here](https://en.wikipedia.org/wiki/E.164) | -| PositiveInt | Signed 32‐bit numeric non‐fractional value of at least the value 1 | -| PostalCode | Postal code | -| Port | TCP port within the range of 0 to 65535 | | Rgb | CSS RGB color as defined [here](https://developer.mozilla.org/docs/Web/CSS/color_value#rgb_colors) | | Rgba | CSS RGBA color as defined [here](https://developer.mozilla.org/docs/Web/CSS/color_value#rgb_colors) | -| SignedByte | Signed 8-bit numeric non‐fractional value greater than or equal to -127 and smaller than or equal to 128. | -| UnsignedInt | Unsigned 32‐bit numeric non‐fractional value greater than or equal to 0 | -| UnsignedLong | Unsigned 64‐bit numeric non‐fractional value greater than or equal to 0 | -| UnsignedShort | Unsigned 16‐bit numeric non‐fractional value greater than or equal to 0 and smaller or equal to 65535. | | UtcOffset | A value of format `±hh:mm` | [2]: https://developer.mozilla.org/docs/Web/CSS/color_value#hsl_colors @@ -466,9 +455,16 @@ builder.Services # Custom Scalars -All scalars in Hot Chocolate are defined through a `ScalarType`. -The easiest way to create a custom scalar is to extend `ScalarType<TRuntimeType, TLiteral>`. -This base class already includes basic serialization and parsing logic. +A scalar type converts values between their GraphQL wire format and their .NET runtime representation. Each custom scalar must handle four conversion scenarios: + +| Method | Direction | Purpose | +| ------------------------ | ---------------------- | -------------------------------------------------------------------------- | +| **OnCoerceInputLiteral** | GraphQL literal → .NET | Parses values embedded directly in a query, e.g. `{ field(arg: "value") }` | +| **OnCoerceInputValue** | JSON → .NET | Parses values provided as variables in the request | +| **OnCoerceOutputValue** | .NET → JSON | Writes resolver results to the response | +| **OnValueToLiteral** | .NET → GraphQL literal | Converts default values for schema introspection | + +The easiest way to create a custom scalar is to extend `ScalarType<TRuntimeType, TLiteral>`, which provides the basic scaffolding. ```csharp public sealed class CreditCardNumberType : ScalarType<string, StringValueNode> @@ -485,157 +481,122 @@ public sealed class CreditCardNumberType : ScalarType<string, StringValueNode> Description = "Represents a credit card number"; } - // is another StringValueNode an instance of this scalar - protected override bool IsInstanceOfType(StringValueNode valueSyntax) - => IsInstanceOfType(valueSyntax.Value); - - // is another string .NET type an instance of this scalar - protected override bool IsInstanceOfType(string runtimeValue) - => _validator.ValidateCreditCard(runtimeValue); - - public override IValueNode ParseResult(object? resultValue) - => ParseValue(resultValue); - - // define how a value node is parsed to the string .NET type - protected override string ParseLiteral(StringValueNode valueSyntax) - => valueSyntax.Value; - - // define how the string .NET type is parsed to a value node - protected override StringValueNode ParseValue(string runtimeValue) - => new StringValueNode(runtimeValue); - - public override bool TryDeserialize(object? resultValue, - out object? runtimeValue) + protected override string OnCoerceInputLiteral(StringValueNode valueLiteral) { - runtimeValue = null; + AssertCreditCardNumberFormat(valueLiteral.Value); + return valueLiteral.Value; + } - if (resultValue is string s && _validator.ValidateCreditCard(s)) - { - runtimeValue = s; - return true; - } + protected override string OnCoerceInputValue( + JsonElement inputValue, + IFeatureProvider context) + { + var value = inputValue.GetString()!; + AssertCreditCardNumberFormat(value); + return value; + } - return false; + protected override void OnCoerceOutputValue( + string runtimeValue, + ResultElement resultValue) + { + AssertCreditCardNumberFormat(runtimeValue); + resultValue.SetStringValue(runtimeValue); } - public override bool TrySerialize(object? runtimeValue, - out object? resultValue) + protected override StringValueNode OnValueToLiteral(string runtimeValue) { - resultValue = null; + AssertCreditCardNumberFormat(runtimeValue); + return new StringValueNode(runtimeValue); + } - if (runtimeValue is string s && _validator.ValidateCreditCard(s)) + private void AssertCreditCardNumberFormat(string number) + { + if (!_validator.ValidateCreditCard(value)) { - resultValue = s; - return true; + throw new LeafCoercionException( + "The specified value is not a valid credit card number.", + this); } - - return false; } } ``` -By extending `ScalarType` we have full control over serialization and parsing. +## Specialized Base Classes -```csharp -public class CreditCardNumberType : ScalarType -{ - private readonly ICreditCardValidator _validator; - - public CreditCardNumberType(ICreditCardValidator validator) - : base("CreditCardNumber") - { - _validator = validator; +Hot Chocolate provides specialized base classes for common scalar patterns that handle much of the boilerplate for you. - Description = "Represents a credit card number"; - } +### Integer Scalars - // define which .NET type represents your type - public override Type RuntimeType { get; } = typeof(string); +Use `IntegerTypeBase<T>` for scalars that represent numeric values with min/max constraints. The base class handles parsing, validation, and range checking automatically. - // define which value nodes this type can be parsed from - public override bool IsInstanceOfType(IValueNode valueSyntax) +```csharp +public class TcpPortType : IntegerTypeBase<int> +{ + public TcpPortType() + : base("TcpPort", min: 1, max: 65535) { - ArgumentNullException.ThrowIfNull(valueSyntax); - - return valueSyntax is StringValueNode stringValueNode && - _validator.ValidateCreditCard(stringValueNode.Value); + Description = "A valid TCP port number (1-65535)"; } - // define how a value node is parsed to the native .NET type - public override object ParseLiteral(IValueNode valueSyntax, - bool withDefaults = true) - { - if (valueSyntax is StringValueNode stringLiteral && - _validator.ValidateCreditCard(stringLiteral.Value)) - { - return stringLiteral.Value; - } + protected override int OnCoerceInputLiteral(IntValueNode valueLiteral) + => valueLiteral.ToInt32(); - throw new SerializationException( - "The specified value has to be a credit card number in the format " - + "XXXX XXXX XXXX XXXX", - this); - } + protected override int OnCoerceInputValue(JsonElement inputValue) + => inputValue.GetInt32(); - // define how the .NET type is parsed to a value node - public override IValueNode ParseValue(object? runtimeValue) - { - if (runtimeValue is string s && - _validator.ValidateCreditCard(s)) - { - return new StringValueNode(null, s, false); - } + public override void OnCoerceOutputValue(int runtimeValue, ResultElement resultValue) + => resultValue.SetNumberValue(runtimeValue); - throw new SerializationException( - "The specified value has to be a credit card number in the format " - + "XXXX XXXX XXXX XXXX", - this); - } + public override IValueNode OnValueToLiteral(int runtimeValue) + => new IntValueNode(runtimeValue); +} +``` - public override IValueNode ParseResult(object? resultValue) - { - if (resultValue is string s && - _validator.ValidateCreditCard(s)) - { - return new StringValueNode(null, s, false); - } +The `IntegerTypeBase` automatically validates that values fall within the specified range and throws a `LeafCoercionException` if they don't. To customize the error message, override the `FormatError` method: - throw new SerializationException( - "The specified value has to be a credit card number in the format " - + "XXXX XXXX XXXX XXXX", - this); - } +```csharp +protected override LeafCoercionException FormatError(int runtimeValue) + => new LeafCoercionException( + $"The value {runtimeValue} is not a valid TCP port. Must be between 1 and 65535.", + this); +``` - public override bool TrySerialize(object? runtimeValue, - out object? resultValue) - { - resultValue = null; +Hot Chocolate also provides a `FloatTypeBase<T>` for floating-point scalars (`float`, `double`, `decimal`) that need min/max range validation. - if (runtimeValue is string s && - _validator.ValidateCreditCard(s)) - { - resultValue = s; - return true; - } +### Regex-Based Scalars - return false; - } +Use `RegexType` for string scalars that must match a specific pattern. This is ideal for formats like phone numbers, postal codes, or identifiers. - public override bool TryDeserialize(object? resultValue, - out object? runtimeValue) +```csharp +public class HexColorType : RegexType +{ + public HexColorType() + : base( + "HexColor", + @"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$", + "A hex color code, e.g. #FF5733 or #F53") { - runtimeValue = null; - - if (resultValue is string s && - _validator.ValidateCreditCard(s)) - { - runtimeValue = s; - return true; - } - - return false; } } ``` -The implementation of [Hot Chocolate's own scalars](https://github.com/ChilliCream/graphql-platform/tree/main/src/HotChocolate/Core/src/Types.Scalars) can be used as a reference for writing custom scalars. +You can also instantiate `RegexType` directly when registering scalars: + +```csharp +builder.Services + .AddGraphQLServer() + .AddType(new RegexType( + "PostalCode", + @"^\d{5}(-\d{4})?$", + "US postal code in format 12345 or 12345-6789")); +``` + +Like `IntegerTypeBase` and `FloatTypeBase`, `RegexType` automatically validates values and throws a `LeafCoercionException` if they don't match the pattern. To customize the error message, override the `FormatException` method: + +```csharp +protected override LeafCoercionException FormatException(string runtimeValue) + => new LeafCoercionException( + $"'{runtimeValue}' is not a valid hex color. Expected format: #RGB or #RRGGBB.", + this); +``` From 9d4fab991d2877772f586516d7a78f396a9d81df Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 8 Jan 2026 12:45:07 +0100 Subject: [PATCH 075/144] refactor: Update snapshot assertions in scalar type tests for consistency --- .../Types/Scalars/BooleanTypeTests.cs | 2 +- .../Types/Scalars/ByteArrayTypeTests.cs | 2 +- .../Types/Scalars/ByteTypeTests.cs | 2 +- .../Types/Scalars/DateTimeTypeTests.cs | 4 +-- .../Types/Scalars/DateTypeTests.cs | 6 ++-- .../Types/Scalars/DecimalTypeTests.cs | 2 +- .../Types/Scalars/FloatTypeTests.cs | 2 +- .../Types.Tests/Types/Scalars/IdTypeTests.cs | 2 +- .../Types.Tests/Types/Scalars/IntTypeTests.cs | 2 +- .../Types/Scalars/LocalDateTimeTypeTests.cs | 2 +- .../Types/Scalars/LocalDateTypeTests.cs | 2 +- .../Types/Scalars/LocalTimeTypeTests.cs | 2 +- .../Types/Scalars/LongTypeTests.cs | 2 +- .../Types/Scalars/ShortTypeTests.cs | 2 +- .../Types/Scalars/SignedByteTypeTests.cs | 2 +- .../Types/Scalars/StringTypeTests.cs | 2 +- .../Types/Scalars/TimeSpanTypeTests.cs | 29 ++++++++++++++----- .../Types/Scalars/UnsignedIntTypeTests.cs | 2 +- .../Types/Scalars/UnsignedLongTypeTests.cs | 2 +- .../Types/Scalars/UnsignedShortTypeTests.cs | 2 +- .../Types.Tests/Types/Scalars/UrlTypeTests.cs | 4 +-- .../Types/Scalars/UuidTypeTests.cs | 4 +-- 22 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs index c66c6514ae2..23be4e34534 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs @@ -102,7 +102,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("true"); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs index ac63430e2fe..4878284e5d9 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs @@ -171,7 +171,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(value, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"dmFsdWU=\""); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs index 4053e03a3cc..0bb40db4c33 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs @@ -167,7 +167,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("123"); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs index b6f7739bf8e..ed535a83a30 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs @@ -172,7 +172,7 @@ public void CoerceOutputValue_Utc_DateTimeOffset() type.CoerceOutputValue(dateTime, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"2018-06-11T08:46:14.000Z\""); } [Fact] @@ -191,7 +191,7 @@ public void CoerceOutputValue_DateTimeOffset() type.CoerceOutputValue(dateTime, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"2018-06-11T08:46:14.000+04:00\""); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs index 6579acea83b..5a4b100e9f5 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs @@ -144,7 +144,7 @@ public void CoerceOutputValue_DateOnly() type.CoerceOutputValue(dateOnly, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"2018-06-11\""); } [Fact] @@ -161,7 +161,7 @@ public void CoerceOutputValue_DateTime() type.CoerceOutputValue(dateTime, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"2018-06-11\""); } [Fact] @@ -180,7 +180,7 @@ public void CoerceOutputValue_DateTimeOffset() type.CoerceOutputValue(dateTime, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"2018-06-11\""); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs index 1e168c3126b..d81f93ed854 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs @@ -210,7 +210,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("123.456"); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs index 8f207bee2c8..d75903a9976 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs @@ -144,7 +144,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("42.5"); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs index 0791dcf8199..06d331adfe5 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs @@ -271,7 +271,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"123456\""); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs index 948cd808b07..e749ad52337 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs @@ -157,7 +157,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("42"); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs index 6bd7ecd17a5..880dade6321 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs @@ -130,7 +130,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(dateTime, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"2018-06-11T08:46:14\""); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs index 22aa6079864..62751293819 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs @@ -148,7 +148,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(dateOnly, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"2018-06-11\""); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs index 1a1ba66ed9a..2b3e129d0b0 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs @@ -130,7 +130,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(timeOnly, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"08:46:14\""); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs index 85ddf294332..f5ab7e3b864 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs @@ -157,7 +157,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("42"); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs index 5638088b197..02d4c2b601e 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs @@ -157,7 +157,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("42"); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs index 7cb16640f10..5bb8eac7692 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs @@ -157,7 +157,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("42"); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs index e230117a488..aac4e3d007a 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs @@ -101,7 +101,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"hello world\""); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs index 456faae9ca8..1e02d531bd0 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs @@ -201,16 +201,31 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"PT5M\""); } - [Theory] - [InlineData(TimeSpanFormat.Iso8601)] - [InlineData(TimeSpanFormat.DotNet)] - public void CoerceOutputValue_WithFormat(TimeSpanFormat format) + [Fact] + public void CoerceOutputValue_WithFormat_Iso8601() { // arrange - var type = new TimeSpanType(format); + var type = new TimeSpanType(TimeSpanFormat.Iso8601); + var runtimeValue = TimeSpan.FromMinutes(5); + + // act + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(runtimeValue, resultValue); + + // assert + resultValue.MatchInlineSnapshot("\"PT5M\""); + } + + [Fact] + public void CoerceOutputValue_WithFormat_DotNet() + { + // arrange + var type = new TimeSpanType(TimeSpanFormat.DotNet); var runtimeValue = TimeSpan.FromMinutes(5); // act @@ -220,7 +235,7 @@ public void CoerceOutputValue_WithFormat(TimeSpanFormat format) type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(postFix: format.ToString()); + resultValue.MatchInlineSnapshot("\"00:05:00\""); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs index 5da8f8b5344..c6a27c232bd 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs @@ -157,7 +157,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("42"); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs index 9da391ef96e..9c217f29ef6 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs @@ -157,7 +157,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("42"); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs index 0128fa4d725..21c4e06a4a8 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs @@ -157,7 +157,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(runtimeValue, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("42"); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs index 858f0d36eb8..57b46d89081 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs @@ -144,7 +144,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(uri, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"http://domain.test/url\""); } [Fact] @@ -161,7 +161,7 @@ public void CoerceOutputValue_RelativeUrl() type.CoerceOutputValue(uri, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"/relative/path\""); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs index 61d7a69a9cb..e9795f666b4 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs @@ -215,7 +215,7 @@ public void CoerceOutputValue() { // arrange var type = new UuidType(); - var guid = Guid.NewGuid(); + var guid = Guid.Parse("c8c483be-4319-4903-a064-8a6ba66da99e"); // act var operation = CommonTestExtensions.CreateOperation(); @@ -224,7 +224,7 @@ public void CoerceOutputValue() type.CoerceOutputValue(guid, resultValue); // assert - resultValue.MatchSnapshot(); + resultValue.MatchInlineSnapshot("\"c8c483be-4319-4903-a064-8a6ba66da99e\""); } [Fact] From 28004d0f77b330b3a9762026f967f95eeb0f137e Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 8 Jan 2026 13:01:23 +0100 Subject: [PATCH 076/144] refactor: Update OperationResult and ResolverTaskFactory for improved error handling and task scheduling --- .../Execution/OperationResult.cs | 2 +- .../Pipeline/OperationExecutionMiddleware.cs | 4 +-- .../Processing/Tasks/ResolverTaskFactory.cs | 31 ++++++++----------- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs index c6231291388..6307eda072f 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs @@ -30,7 +30,7 @@ public OperationResult( ImmutableList<IError>? errors = null, ImmutableOrderedDictionary<string, object?>? extensions = null) { - if (data.Value is not null && data.Formatter is not null) + if (data.Value is not null && data.Formatter is null) { throw new ArgumentException("The result data structure is not supported."); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs index 8124581c387..da39cc93d89 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Pipeline/OperationExecutionMiddleware.cs @@ -130,7 +130,7 @@ private async Task ExecuteVariableBatchRequestAsync( } var results = await Task.WhenAll(tasks).ConfigureAwait(false); - context.Result = new OperationResultBatch([..results]); + context.Result = new OperationResultBatch([.. results]); } private async Task ExecuteVariableBatchRequestOptimizedAsync( @@ -162,7 +162,7 @@ await _queryExecutor.ExecuteBatchAsync( operationContextBuffer.AsMemory(0, variableSets.Length), resultBuffer.AsMemory(0, variableSets.Length)); - context.Result = new OperationResultBatch([..resultBuffer.AsSpan(0, variableSets.Length)]); + context.Result = new OperationResultBatch([.. resultBuffer.AsSpan(0, variableSets.Length)]); } catch (OperationCanceledException) { diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs index e20aa151edf..53f51ffa8d7 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs @@ -16,17 +16,14 @@ static ResolverTaskFactory() { } public static void EnqueueResolverTasks( OperationContext operationContext, object? parent, - ResultElement parentResult, + ResultElement resultValue, IImmutableDictionary<string, object?> scopedContext, Path path) { - var selectionSet = parentResult.AssertSelectionSet(); + var selectionSet = resultValue.AssertSelectionSet(); var selections = selectionSet.Selections; var scheduler = operationContext.Scheduler; - var includeFlags = operationContext.IncludeFlags; - var final = !selectionSet.IsConditional; - var bufferedTasks = Interlocked.Exchange(ref s_pooled, null) ?? []; Debug.Assert(bufferedTasks.Count == 0, "The buffer must be clean."); @@ -38,19 +35,17 @@ public static void EnqueueResolverTasks( // the scheduler tries to schedule new work first. // coincidentally we can use that to schedule a mutation so that we honor the spec // guarantees while executing efficient. - for (var i = selections.Length - 1; i >= 0; i--) + var fieldValues = selections.Length == 1 + ? resultValue.EnumerateObject() + : resultValue.EnumerateObject().Reverse(); + foreach (var field in fieldValues) { - var selection = selections[i]; - - if (final || selection.IsIncluded(includeFlags)) - { - bufferedTasks.Add( - operationContext.CreateResolverTask( - parent, - selection, - parentResult, - scopedContext)); - } + bufferedTasks.Add( + operationContext.CreateResolverTask( + parent, + field.AssertSelection(), + field.Value, + scopedContext)); } if (bufferedTasks.Count == 0) @@ -71,7 +66,7 @@ public static void EnqueueResolverTasks( } } - // TODO : remove ? + // TODO : remove ? defer? /* public static ResolverTask EnqueueElementTasks( OperationContext operationContext, From 3acbe450d77b862019f34b8cfc43e5a8c88ccd44 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 8 Jan 2026 13:42:20 +0100 Subject: [PATCH 077/144] refactor: Update error handling in ResolverTaskFactory and ResultDocument for improved clarity and consistency --- .../Execution/Processing/Tasks/ResolverTaskFactory.cs | 2 +- .../Core/src/Types/Text/Json/ResultDocument.WriteTo.cs | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs index 53f51ffa8d7..345b07d2320 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs @@ -126,7 +126,7 @@ public static void EnqueueOrInlineResolverTasks( object parent) { Debug.Assert(selectionSet.Type == selectionSetType); - Debug.Assert(resultValue.Type == selectionSetType); + Debug.Assert(resultValue.Type?.NamedType() == selectionSetType); var operationContext = context.OperationContext; diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index ea50b4df715..52e3de01fc0 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -31,7 +31,7 @@ public void Write(OperationResult result) _indentation++; } - if (result.Errors?.Count > 0) + if (!result.Errors.IsEmpty) { if (indented) { @@ -66,6 +66,11 @@ public void Write(OperationResult result) if (indented) { + if (!result.Errors.IsEmpty) + { + WriteNewLine(); + } + WriteIndent(); } @@ -95,6 +100,7 @@ public void Write(OperationResult result) if (indented) { + WriteNewLine(); WriteIndent(); } From 2f7cd4923fc0546502f33d73e81a3b61387f89ad Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 9 Jan 2026 09:02:28 +0100 Subject: [PATCH 078/144] Refactor scalar type tests by removing null coercion and value to literal tests - Removed tests for coercing null input literals and converting null values to literals across various scalar type tests (Float, Id, Int, LocalDateTime, LocalDate, LocalTime, Long, Short, SignedByte, String, TimeSpan, UnsignedInt, UnsignedLong, UnsignedShort, Url, Uuid). - Updated the `CompositeResultDocument` and `SourceResultDocument` to utilize `Utf8JsonWriter` instead of `IBufferWriter<byte>` for JSON writing, improving performance and simplifying the code. - Introduced a new `JsonWriter` class in the Utilities.Buffers namespace for future JSON writing utilities. --- .../JsonResultFormatter.cs | 2 +- .../Execution/IRawJsonFormatter.cs | 12 +- .../Core/src/Types.Scalars/ThrowHelper.cs | 2 +- .../Processing/Tasks/ResolverTaskFactory.cs | 4 +- .../Properties/TextJsonResources.Designer.cs | 32 +-- .../Types/Properties/TextJsonResources.resx | 2 +- .../Types/Text/Json/ResultDocument.WriteTo.cs | 204 +++--------------- .../src/Types/Text/Json/ResultDocument.cs | 15 +- .../Core/src/Types/Text/Json/ResultElement.cs | 14 +- .../Types/Scalars/BooleanTypeTests.cs | 54 ----- .../Types/Scalars/ByteArrayTypeTests.cs | 54 ----- .../Types/Scalars/ByteTypeTests.cs | 52 ----- .../Types/Scalars/DateTimeTypeTests.cs | 40 ---- .../Types/Scalars/DateTypeTests.cs | 40 ---- .../Types/Scalars/DecimalTypeTests.cs | 53 ----- .../Types/Scalars/FloatTypeTests.cs | 40 ---- .../Types.Tests/Types/Scalars/IdTypeTests.cs | 55 ----- .../Types.Tests/Types/Scalars/IntTypeTests.cs | 40 ---- .../Types/Scalars/LocalDateTimeTypeTests.cs | 40 ---- .../Types/Scalars/LocalDateTypeTests.cs | 40 ---- .../Types/Scalars/LocalTimeTypeTests.cs | 40 ---- .../Types/Scalars/LongTypeTests.cs | 40 ---- .../Types/Scalars/ShortTypeTests.cs | 40 ---- .../Types/Scalars/SignedByteTypeTests.cs | 40 ---- .../Types/Scalars/StringTypeTests.cs | 40 ---- .../Types/Scalars/TimeSpanTypeTests.cs | 40 ---- .../Types/Scalars/UnsignedIntTypeTests.cs | 40 ---- .../Types/Scalars/UnsignedLongTypeTests.cs | 40 ---- .../Types/Scalars/UnsignedShortTypeTests.cs | 40 ---- .../Types.Tests/Types/Scalars/UrlTypeTests.cs | 41 ---- .../Types/Scalars/UuidTypeTests.cs | 41 ---- .../Json/CompositeResultDocument.WriteTo.cs | 195 +++-------------- .../Text/Json/CompositeResultDocument.cs | 6 +- .../Text/Json/SourceResultDocument.WriteTo.cs | 109 +--------- .../Text/Json/SourceResultDocument.cs | 11 +- .../src/Utilities.Buffers/JsonWriter.cs | 6 + 36 files changed, 121 insertions(+), 1443 deletions(-) create mode 100644 src/HotChocolate/Utilities/src/Utilities.Buffers/JsonWriter.cs diff --git a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs index 788b2877a89..6c063efb5bf 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs @@ -159,7 +159,7 @@ private void FormatInternal(OperationResult result, IBufferWriter<byte> writer) { if (result.JsonFormatter is { } formatter) { - formatter.WriteTo(result, writer, _options.Indented); + formatter.WriteTo(result, writer, _options); return; } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs index d6ea127ba1e..6f7861e73d2 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs @@ -1,4 +1,5 @@ using System.Buffers; +using System.Text.Json; namespace HotChocolate.Execution; @@ -16,10 +17,13 @@ public interface IRawJsonFormatter /// The result that shall be serialized. /// </param> /// <param name="writer"> - /// The pipe writer of the transport layer. + /// The buffer writer of the transport layer. /// </param> - /// <param name="indented"> - /// Specifies if the JSON shall be indented. + /// <param name="options"> + /// The JSON writer options. /// </param> - void WriteTo(OperationResult result, IBufferWriter<byte> writer, bool indented = false); + void WriteTo( + OperationResult result, + IBufferWriter<byte> writer, + JsonWriterOptions options); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs index 75f4ec84806..0e555d911bb 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/ThrowHelper.cs @@ -122,7 +122,7 @@ public static LeafCoercionException PhoneNumberType_InvalidFormat(IType type) .Build(), type); } - + public static LeafCoercionException RgbType_InvalidFormat(IType type) { return new LeafCoercionException( diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs index 345b07d2320..8c056fc6e17 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTaskFactory.cs @@ -126,7 +126,7 @@ public static void EnqueueOrInlineResolverTasks( object parent) { Debug.Assert(selectionSet.Type == selectionSetType); - Debug.Assert(resultValue.Type?.NamedType() == selectionSetType); + Debug.Assert(resultValue.Type?.NamedType()?.IsAssignableFrom(selectionSetType) ?? false); var operationContext = context.OperationContext; @@ -151,7 +151,7 @@ public static void EnqueueOrInlineResolverTasks( operationContext.CreateResolverTask( parent, selection, - resultValue, + field.Value, context.ResolverContext.ScopedContextData)); } } diff --git a/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs index 872b64ad013..a825f42f9e3 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs +++ b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.Designer.cs @@ -9,21 +9,21 @@ namespace HotChocolate.Properties { using System; - - + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class TextJsonResources { - + private static System.Resources.ResourceManager resourceMan; - + private static System.Globalization.CultureInfo resourceCulture; - + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal TextJsonResources() { } - + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] internal static System.Resources.ResourceManager ResourceManager { get { @@ -34,7 +34,7 @@ internal static System.Resources.ResourceManager ResourceManager { return resourceMan; } } - + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] internal static System.Globalization.CultureInfo Culture { get { @@ -44,43 +44,43 @@ internal static System.Globalization.CultureInfo Culture { resourceCulture = value; } } - + internal static string ResultElement_GetBoolean_JsonElementHasWrongType { get { return ResourceManager.GetString("ResultElement_GetBoolean_JsonElementHasWrongType", resourceCulture); } } - + internal static string Rethrowable { get { return ResourceManager.GetString("Rethrowable", resourceCulture); } } - - internal static string ResultElement_SetObjectValue_NotObjectType { + + internal static string ResultElement_SetObjectValue_NotCompositeType { get { - return ResourceManager.GetString("ResultElement_SetObjectValue_NotObjectType", resourceCulture); + return ResourceManager.GetString("ResultElement_SetObjectValue_NotCompositeType", resourceCulture); } } - + internal static string JsonReaderHelper_TranscodeHelper_CannotTranscodeInvalidUtf8 { get { return ResourceManager.GetString("JsonReaderHelper_TranscodeHelper_CannotTranscodeInvalidUtf8", resourceCulture); } } - + internal static string ThrowHelper_ReadInvalidUTF16 { get { return ResourceManager.GetString("ThrowHelper_ReadInvalidUTF16", resourceCulture); } } - + internal static string ThrowHelper_ReadIncompleteUTF16 { get { return ResourceManager.GetString("ThrowHelper_ReadIncompleteUTF16", resourceCulture); } } - + internal static string ResultElement_SetArrayValue_NotListType { get { return ResourceManager.GetString("ResultElement_SetArrayValue_NotListType", resourceCulture); diff --git a/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx index e98294406cd..595a79b0e75 100644 --- a/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx +++ b/src/HotChocolate/Core/src/Types/Properties/TextJsonResources.resx @@ -24,7 +24,7 @@ <data name="Rethrowable" xml:space="preserve"> <value>HotChocolate.Text.Json.Rethrowable</value> </data> - <data name="ResultElement_SetObjectValue_NotObjectType" xml:space="preserve"> + <data name="ResultElement_SetObjectValue_NotCompositeType" xml:space="preserve"> <value>The element is not a composite type.</value> </data> <data name="JsonReaderHelper_TranscodeHelper_CannotTranscodeInvalidUtf8" xml:space="preserve"> diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index 52e3de01fc0..9f369c41e73 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -1,6 +1,5 @@ using System.Buffers; using System.Diagnostics; -using System.Runtime.CompilerServices; using System.Text.Json; using HotChocolate.Execution; @@ -8,86 +7,40 @@ namespace HotChocolate.Text.Json; public sealed partial class ResultDocument : IRawJsonFormatter { - public void WriteTo(OperationResult result, IBufferWriter<byte> writer, bool indented = false) + public void WriteTo(OperationResult result, IBufferWriter<byte> writer, JsonWriterOptions options) { - var formatter = new RawJsonFormatter(this, writer, indented); + options = options with { SkipValidation = true }; + using var jsonWriter = new Utf8JsonWriter(writer, options); + var formatter = new RawJsonFormatter(this, jsonWriter); formatter.Write(result); + jsonWriter.Flush(); } - internal ref struct RawJsonFormatter( - ResultDocument document, - IBufferWriter<byte> writer, - bool indented) + internal ref struct RawJsonFormatter(ResultDocument document, Utf8JsonWriter writer) { - private int _indentation = 0; - public void Write(OperationResult result) { - WriteByte(JsonConstants.OpenBrace); - - if (indented) - { - WriteNewLine(); - _indentation++; - } + writer.WriteStartObject(); if (!result.Errors.IsEmpty) { - if (indented) - { - WriteIndent(); - } - - WriteByte(JsonConstants.Quote); - writer.Write(JsonConstants.Errors); - WriteByte(JsonConstants.Quote); - WriteByte(JsonConstants.Colon); - - if (indented) - { - WriteByte(JsonConstants.Space); - } - - var options = new JsonWriterOptions { Indented = indented }; - using var jsonWriter = new Utf8JsonWriter(writer, options); + writer.WritePropertyName(JsonConstants.Errors); JsonValueFormatter.WriteErrors( - jsonWriter, + writer, result.Errors, new JsonSerializerOptions(JsonSerializerDefaults.Web), default); - jsonWriter.Flush(); - - WriteByte(JsonConstants.Comma); } - // Write "data": var root = Cursor.Zero; var row = document._metaDb.Get(root); - if (indented) - { - if (!result.Errors.IsEmpty) - { - WriteNewLine(); - } - - WriteIndent(); - } - - WriteByte(JsonConstants.Quote); - writer.Write(JsonConstants.Data); - WriteByte(JsonConstants.Quote); - WriteByte(JsonConstants.Colon); - - if (indented) - { - WriteByte(JsonConstants.Space); - } + writer.WritePropertyName(JsonConstants.Data); if (row.TokenType is ElementTokenType.Null || (ElementFlags.IsInvalidated & row.Flags) == ElementFlags.IsInvalidated) { - writer.Write(JsonConstants.NullValue); + writer.WriteNullValue(); } else { @@ -96,42 +49,15 @@ public void Write(OperationResult result) if (result.Extensions?.Count > 0) { - WriteByte(JsonConstants.Comma); - - if (indented) - { - WriteNewLine(); - WriteIndent(); - } - - WriteByte(JsonConstants.Quote); - writer.Write(JsonConstants.Extensions); - WriteByte(JsonConstants.Quote); - WriteByte(JsonConstants.Colon); - - if (indented) - { - WriteByte(JsonConstants.Space); - } - - var options = new JsonWriterOptions { Indented = indented }; - using var jsonWriter = new Utf8JsonWriter(writer, options); + writer.WritePropertyName(JsonConstants.Extensions); JsonValueFormatter.WriteDictionary( - jsonWriter, + writer, result.Extensions, new JsonSerializerOptions(JsonSerializerDefaults.Web), default); - jsonWriter.Flush(); - } - - if (indented) - { - _indentation--; - WriteNewLine(); - WriteIndent(); } - WriteByte(JsonConstants.CloseBrace); + writer.WriteEndObject(); } public void WriteValue(Cursor cursor, DbRow row) @@ -164,19 +90,19 @@ public void WriteValue(Cursor cursor, DbRow row) case ElementTokenType.None: case ElementTokenType.Null: - writer.Write(JsonConstants.NullValue); + writer.WriteNullValue(); break; case ElementTokenType.True: - writer.Write(JsonConstants.TrueValue); + writer.WriteBooleanValue(true); break; case ElementTokenType.False: - writer.Write(JsonConstants.FalseValue); + writer.WriteBooleanValue(false); break; default: - document.WriteRawValueTo(writer, row, _indentation, indented); + document.WriteRawValueTo(writer, row); break; } } @@ -188,14 +114,8 @@ private void WriteObject(Cursor start, DbRow startRow) var current = start + 1; var end = start + startRow.NumberOfRows; - WriteByte(JsonConstants.OpenBrace); - - if (indented && current < end) - { - _indentation++; - } + writer.WriteStartObject(); - var first = true; while (current < end) { var row = document._metaDb.Get(current); @@ -209,28 +129,8 @@ private void WriteObject(Cursor start, DbRow startRow) continue; } - if (!first) - { - WriteByte(JsonConstants.Comma); - } - first = false; - - if (indented) - { - WriteNewLine(); - WriteIndent(); - } - - // property name (quoted) - WriteByte(JsonConstants.Quote); - writer.Write(document.ReadRawValue(row)); - WriteByte(JsonConstants.Quote); - WriteByte(JsonConstants.Colon); - - if (indented) - { - WriteByte(JsonConstants.Space); - } + // property name + writer.WritePropertyName(document.ReadRawValue(row)); // property value current++; @@ -241,14 +141,7 @@ private void WriteObject(Cursor start, DbRow startRow) current++; } - if (indented && !first) - { - _indentation--; - WriteNewLine(); - WriteIndent(); - } - - WriteByte(JsonConstants.CloseBrace); + writer.WriteEndObject(); } private void WriteArray(Cursor start, DbRow startRow) @@ -258,65 +151,16 @@ private void WriteArray(Cursor start, DbRow startRow) var current = start + 1; var end = start + startRow.NumberOfRows; - WriteByte(JsonConstants.OpenBracket); - - if (indented && current < end) - { - _indentation++; - } + writer.WriteStartArray(); - var first = true; while (current < end) { - if (!first) - { - WriteByte(JsonConstants.Comma); - } - first = false; - - if (indented) - { - WriteNewLine(); - WriteIndent(); - } - var row = document._metaDb.Get(current); WriteValue(current, row); - current++; } - if (indented && end > start + 1) - { - _indentation--; - WriteNewLine(); - WriteIndent(); - } - - WriteByte(JsonConstants.CloseBracket); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private readonly void WriteNewLine() => WriteByte(JsonConstants.NewLineLineFeed); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private readonly void WriteIndent() - { - var indentSize = _indentation * 2; - if (indentSize > 0) - { - var span = writer.GetSpan(indentSize); - span[..indentSize].Fill(JsonConstants.Space); - writer.Advance(indentSize); - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private readonly void WriteByte(byte value) - { - var span = writer.GetSpan(1); - span[0] = value; - writer.Advance(1); + writer.WriteEndArray(); } } } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index ba11bf77427..950dc928075 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Runtime.CompilerServices; using System.Text; +using System.Text.Json; using HotChocolate.Buffers; using HotChocolate.Execution; using HotChocolate.Execution.Processing; @@ -331,29 +332,25 @@ internal void Invalidate(Cursor current) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void WriteRawValueTo(IBufferWriter<byte> writer, DbRow row, int indentation, bool indented) + private void WriteRawValueTo(Utf8JsonWriter writer, DbRow row) { switch (row.TokenType) { case ElementTokenType.Null: - WriteToBuffer(writer, JsonConstants.NullValue); + writer.WriteNullValue(); return; case ElementTokenType.True: - WriteToBuffer(writer, JsonConstants.TrueValue); + writer.WriteBooleanValue(true); return; case ElementTokenType.False: - WriteToBuffer(writer, JsonConstants.FalseValue); - return; - - case ElementTokenType.PropertyName: - WriteToBuffer(writer, _operation.GetSelectionById(row.OperationReferenceId).Utf8ResponseName); + writer.WriteBooleanValue(false); return; case ElementTokenType.String: case ElementTokenType.Number: - WriteLocalDataTo(writer, row.Location, row.SizeOrLength); + writer.WriteRawValue(ReadRawValue(row), skipInputValidation: true); return; // TODO : We need to handle any types. diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index 9f6d6f12291..0cad446791f 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -2,6 +2,7 @@ using System.Buffers.Text; using System.Diagnostics; using System.Text; +using System.Text.Encodings.Web; using System.Text.Json; using HotChocolate.Execution; using HotChocolate.Execution.Processing; @@ -905,10 +906,10 @@ internal void SetObjectValue(SelectionSet selectionSet) ArgumentNullException.ThrowIfNull(selectionSet); - if (Type is { } type && !type.IsObjectType()) + if (Type is { } type && !type.NamedType().IsCompositeType()) { throw new InvalidOperationException( - string.Format(ResultElement_SetObjectValue_NotObjectType, type)); + string.Format(ResultElement_SetObjectValue_NotCompositeType, type)); } var obj = _parent.CreateObject(_cursor, selectionSet: selectionSet); @@ -1149,9 +1150,16 @@ public void SetNumberValue(decimal value) /// </param> public void WriteTo(IBufferWriter<byte> writer, bool indented = false) { - var formatter = new ResultDocument.RawJsonFormatter(_parent, writer, indented); + var options = new JsonWriterOptions + { + Indented = indented, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; + using var jsonWriter = new Utf8JsonWriter(writer, options); + var formatter = new ResultDocument.RawJsonFormatter(_parent, jsonWriter); var row = _parent._metaDb.Get(_cursor); formatter.WriteValue(_cursor, row); + jsonWriter.Flush(); } /// <inheritdoc /> diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs index 23be4e34534..e6ccbad77e6 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/BooleanTypeTests.cs @@ -32,20 +32,6 @@ public void CoerceInputLiteral() Assert.True((bool)result!); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new BooleanType(); - var literal = NullValueNode.Default; - - // act - var result = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(result); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -135,32 +121,6 @@ public void ValueToLiteral() Assert.True(Assert.IsType<BooleanValueNode>(literal).Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new BooleanType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new BooleanType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void IsValueCompatible_BooleanLiteral_True() { @@ -189,20 +149,6 @@ public void IsValueCompatible_StringLiteral_False() Assert.False(result); } - [Fact] - public void IsValueCompatible_NullLiteral_True() - { - // arrange - var type = new BooleanType(); - var literal = NullValueNode.Default; - - // act - var result = type.IsValueCompatible(literal); - - // assert - Assert.True(result); - } - [Fact] public void Ensure_TypeKind_Is_Scalar() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs index 4878284e5d9..ea0e8463e94 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs @@ -31,20 +31,6 @@ public void IsValueCompatible_StringLiteral_True() Assert.True(isOfType); } - [Fact] - public void IsValueCompatible_NullLiteral_True() - { - // arrange - var type = new ByteArrayType(); - var literal = NullValueNode.Default; - - // act - var isOfType = type.IsValueCompatible(literal); - - // assert - Assert.True(isOfType); - } - [Fact] public void IsValueCompatible_IntLiteral_False() { @@ -87,20 +73,6 @@ public void CoerceInputLiteral() Assert.Equal(expected, actual); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new ByteArrayType(); - var literal = NullValueNode.Default; - - // act - var value = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(value); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -205,32 +177,6 @@ public void ValueToLiteral() Assert.Equal(expectedLiteralValue, stringLiteral.Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new ByteArrayType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new ByteArrayType(); - - // act - void Action() => type.ValueToLiteral(123); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs index 0bb40db4c33..f46c1d695b0 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs @@ -31,19 +31,6 @@ public void IsValueCompatible_IntLiteral_True() Assert.True(result); } - [Fact] - public void IsValueCompatible_NullLiteral_True() - { - // arrange - var type = new ByteType(); - - // act - var result = type.IsValueCompatible(NullValueNode.Default); - - // assert - Assert.True(result); - } - [Fact] public void IsValueCompatible_FloatLiteral_False() { @@ -85,19 +72,6 @@ public void CoerceInputLiteral() Assert.Equal(literal.ToByte(), value); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new ByteType(); - - // act - var output = type.CoerceInputLiteral(NullValueNode.Default); - - // assert - Assert.Null(output); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -273,32 +247,6 @@ public void ValueToLiteral_MinValue_Violation() Assert.Throws<LeafCoercionException>(Action); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new ByteType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new ByteType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs index ed535a83a30..fceef1d3402 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs @@ -95,20 +95,6 @@ public void CoerceInputLiteral_DifferentCulture(string cultureName) Assert.Equal(expectedDateTime, dateTime); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new DateTimeType(); - var literal = NullValueNode.Default; - - // act - var value = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(value); - } - [Fact] public void CoerceInputValue_IsoString() { @@ -243,32 +229,6 @@ public void ValueToLiteral_Utc_DateTimeOffset() Assert.Equal(expectedLiteralValue, stringLiteral.Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new DateTimeType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new DateTimeType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs index 5a4b100e9f5..68f922fd9f0 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs @@ -59,20 +59,6 @@ public void CoerceInputLiteral_DifferentCulture(string cultureName) Assert.Equal(expectedDate, date); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new DateType(); - var literal = NullValueNode.Default; - - // act - var value = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(value); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -214,32 +200,6 @@ public void ValueToLiteral() Assert.Equal(expectedLiteralValue, stringLiteral.Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new DateType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new DateType(); - - // act - void Action() => type.ValueToLiteral(123); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs index d81f93ed854..8b7869cc79b 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs @@ -31,19 +31,6 @@ public void IsValueCompatible_FloatLiteral_True() Assert.True(result); } - [Fact] - public void IsValueCompatible_NullLiteral_True() - { - // arrange - var type = new DecimalType(); - - // act - var result = type.IsValueCompatible(NullValueNode.Default); - - // assert - Assert.True(result); - } - [Fact] public void IsValueCompatible_IntLiteral_True() { @@ -128,19 +115,6 @@ public void CoerceInputLiteral_IntLiteral() Assert.Equal(literal.ToDecimal(), value); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new DecimalType(); - - // act - var output = type.CoerceInputLiteral(NullValueNode.Default); - - // assert - Assert.Null(output); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -318,33 +292,6 @@ public void ValueToLiteral_MinValue_Violation() Assert.Throws<LeafCoercionException>(Action); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new DecimalType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new DecimalType(); - const string value = "123"; - - // act - void Action() => type.ValueToLiteral(value); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs index d75903a9976..8dd1b678229 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/FloatTypeTests.cs @@ -74,20 +74,6 @@ public void CoerceInputLiteral_IntLiteral() Assert.Equal(42.0, runtimeValue); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new FloatType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -177,32 +163,6 @@ public void ValueToLiteral() Assert.Equal(42.5, Assert.IsType<FloatValueNode>(literal).ToDouble()); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new FloatType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new FloatType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs index 06d331adfe5..4f6a926788b 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs @@ -81,20 +81,6 @@ public void IsValueCompatible_IntValueNode_True() Assert.True(result); } - [Fact] - public void IsValueCompatible_NullValueNode_True() - { - // arrange - var type = new IdType(); - var input = NullValueNode.Default; - - // act - var result = type.IsValueCompatible(input); - - // assert - Assert.True(result); - } - [Fact] public void IsValueCompatible_FloatValueNode_False() { @@ -152,20 +138,6 @@ public void CoerceInputLiteral_IntValueNode() Assert.Equal("123456", output); } - [Fact] - public void CoerceInputLiteral_NullValueNode() - { - // arrange - var type = new IdType(); - var input = NullValueNode.Default; - - // act - var output = type.CoerceInputLiteral(input); - - // assert - Assert.Null(output); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -305,33 +277,6 @@ public void ValueToLiteral() Assert.Equal("hello", Assert.IsType<StringValueNode>(literal).Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new IdType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new IdType(); - const double input = 123.456; - - // act - void Action() => type.ValueToLiteral(input); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs index e749ad52337..cb44c96a5ac 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IntTypeTests.cs @@ -59,20 +59,6 @@ public void CoerceInputLiteral_MinValue() Assert.Equal(int.MinValue, runtimeValue); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new IntType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -190,32 +176,6 @@ public void ValueToLiteral() Assert.Equal(42, Assert.IsType<IntValueNode>(literal).ToInt32()); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new IntType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new IntType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs index 880dade6321..43f9ed268e2 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTimeTypeTests.cs @@ -59,20 +59,6 @@ public void CoerceInputLiteral_DifferentCulture(string cultureName) Assert.Equal(expectedDateTime, dateTime); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new LocalDateTimeType(); - var literal = NullValueNode.Default; - - // act - var value = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(value); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -164,32 +150,6 @@ public void ValueToLiteral() Assert.Equal(expectedLiteralValue, Assert.IsType<StringValueNode>(stringLiteral).Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new LocalDateTimeType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new LocalDateTimeType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs index 62751293819..57cb183f743 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs @@ -74,20 +74,6 @@ public void CoerceInputLiteral_DifferentCulture(string cultureName) Assert.Equal(expectedDateOnly, dateOnly); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new LocalDateType(); - var literal = NullValueNode.Default; - - // act - var value = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(value); - } - [Theory] [MemberData(nameof(InvalidLocalDateScalarStrings))] public void CoerceInputLiteral_Invalid_Format(string dateTime) @@ -182,32 +168,6 @@ public void ValueToLiteral() Assert.Equal(expectedLiteralValue, Assert.IsType<StringValueNode>(stringLiteral).Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new LocalDateType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new LocalDateType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs index 2b3e129d0b0..e248cc59d5c 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalTimeTypeTests.cs @@ -59,20 +59,6 @@ public void CoerceInputLiteral_DifferentCulture(string cultureName) Assert.Equal(expectedTimeOnly, timeOnly); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new LocalTimeType(); - var literal = NullValueNode.Default; - - // act - var value = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(value); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -164,32 +150,6 @@ public void ValueToLiteral() Assert.Equal(expectedLiteralValue, Assert.IsType<StringValueNode>(stringLiteral).Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new LocalTimeType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new LocalTimeType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs index f5ab7e3b864..076000deba4 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LongTypeTests.cs @@ -59,20 +59,6 @@ public void CoerceInputLiteral_MinValue() Assert.Equal(long.MinValue, runtimeValue); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new LongType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -190,32 +176,6 @@ public void ValueToLiteral() Assert.Equal(42L, Assert.IsType<IntValueNode>(literal).ToInt64()); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new LongType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new LongType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs index 02d4c2b601e..0bf85bb943c 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ShortTypeTests.cs @@ -59,20 +59,6 @@ public void CoerceInputLiteral_MinValue() Assert.Equal(short.MinValue, runtimeValue); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new ShortType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -190,32 +176,6 @@ public void ValueToLiteral() Assert.Equal(42, Assert.IsType<IntValueNode>(literal).ToInt32()); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new ShortType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new ShortType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs index 5bb8eac7692..a73d74e2a22 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/SignedByteTypeTests.cs @@ -59,20 +59,6 @@ public void CoerceInputLiteral_MinValue() Assert.Equal(sbyte.MinValue, runtimeValue); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new SignedByteType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -190,32 +176,6 @@ public void ValueToLiteral() Assert.Equal(42, Assert.IsType<IntValueNode>(literal).ToInt32()); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new SignedByteType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new SignedByteType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs index aac4e3d007a..7955df9de16 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/StringTypeTests.cs @@ -31,20 +31,6 @@ public void CoerceInputLiteral() Assert.Equal("hello world", runtimeValue); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new StringType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -134,32 +120,6 @@ public void ValueToLiteral() Assert.Equal("hello world", Assert.IsType<StringValueNode>(literal).Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new StringType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new StringType(); - - // act - void Action() => type.ValueToLiteral(123); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs index 1e02d531bd0..e5514209295 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/TimeSpanTypeTests.cs @@ -99,20 +99,6 @@ public void CoerceInputLiteral_Weeks() Assert.Equal(expectedTimeSpan, runtimeValue); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new TimeSpanType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -316,32 +302,6 @@ public void ValueToLiteral_MinValue(TimeSpanFormat format, string expectedValue) Assert.Equal(expectedValue, Assert.IsType<StringValueNode>(literal).Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new TimeSpanType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new TimeSpanType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs index c6a27c232bd..1299bdb1d1d 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedIntTypeTests.cs @@ -59,20 +59,6 @@ public void CoerceInputLiteral_MinValue() Assert.Equal(uint.MinValue, runtimeValue); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new UnsignedIntType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -190,32 +176,6 @@ public void ValueToLiteral() Assert.Equal(42, Assert.IsType<IntValueNode>(literal).ToInt32()); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new UnsignedIntType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new UnsignedIntType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs index 9c217f29ef6..1d119bd1047 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedLongTypeTests.cs @@ -59,20 +59,6 @@ public void CoerceInputLiteral_MinValue() Assert.Equal(ulong.MinValue, runtimeValue); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new UnsignedLongType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -190,32 +176,6 @@ public void ValueToLiteral() Assert.Equal(42UL, Assert.IsType<IntValueNode>(literal).ToUInt64()); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new UnsignedLongType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new UnsignedLongType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs index 21c4e06a4a8..4da6e97477c 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UnsignedShortTypeTests.cs @@ -59,20 +59,6 @@ public void CoerceInputLiteral_MinValue() Assert.Equal(ushort.MinValue, runtimeValue); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new UnsignedShortType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -190,32 +176,6 @@ public void ValueToLiteral() Assert.Equal(42, Assert.IsType<IntValueNode>(literal).ToInt32()); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new UnsignedShortType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new UnsignedShortType(); - - // act - void Action() => type.ValueToLiteral("foo"); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs index 57b46d89081..665a82bdf48 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs @@ -58,20 +58,6 @@ public void CoerceInputLiteral_RelativeUrl() Assert.Equal(expected, runtimeValue); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new UrlType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -225,33 +211,6 @@ public void ValueToLiteral_RelativeUrl() Assert.Equal(uri.ToString(), Assert.IsType<StringValueNode>(literal).Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new UrlType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new UrlType(); - const int value = 123; - - // act - void Action() => type.ValueToLiteral(value); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs index e9795f666b4..eaf5eeff1cc 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs @@ -121,20 +121,6 @@ public void CoerceInputLiteral_EnforceFormat() Assert.Throws<LeafCoercionException>(Action); } - [Fact] - public void CoerceInputLiteral_Null() - { - // arrange - var type = new UuidType(); - var literal = NullValueNode.Default; - - // act - var runtimeValue = type.CoerceInputLiteral(literal); - - // assert - Assert.Null(runtimeValue); - } - [Fact] public void CoerceInputLiteral_Invalid_Format() { @@ -277,33 +263,6 @@ public void ValueToLiteral_WithFormat(char format) Assert.Equal(guid.ToString(format.ToString()), Assert.IsType<StringValueNode>(literal).Value); } - [Fact] - public void ValueToLiteral_Null() - { - // arrange - var type = new UuidType(); - - // act - var literal = type.ValueToLiteral(null!); - - // assert - Assert.IsType<NullValueNode>(literal); - } - - [Fact] - public void ValueToLiteral_Invalid_Format() - { - // arrange - var type = new UuidType(); - const int value = 123; - - // act - void Action() => type.ValueToLiteral(value); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ParseLiteral() { diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs index cd60ae23faa..9a38551b9a8 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs @@ -1,6 +1,5 @@ using System.Buffers; using System.Diagnostics; -using System.Runtime.CompilerServices; using System.Text.Json; using HotChocolate.Execution; @@ -8,78 +7,40 @@ namespace HotChocolate.Fusion.Text.Json; public sealed partial class CompositeResultDocument : IRawJsonFormatter { - public void WriteTo(OperationResult result, IBufferWriter<byte> writer, bool indented = false) + public void WriteTo(OperationResult result, IBufferWriter<byte> writer, JsonWriterOptions options) { - var formatter = new RawJsonFormatter(this, writer, indented); + options = options with { SkipValidation = true }; + using var jsonWriter = new Utf8JsonWriter(writer, options); + var formatter = new RawJsonFormatter(this, jsonWriter); formatter.Write(); + jsonWriter.Flush(); } - internal ref struct RawJsonFormatter(CompositeResultDocument document, IBufferWriter<byte> writer, bool indented) + internal ref struct RawJsonFormatter(CompositeResultDocument document, Utf8JsonWriter writer) { - private int _indentLevel = 0; - public void Write() { - WriteByte(JsonConstants.OpenBrace); - - if (indented) - { - WriteNewLine(); - _indentLevel++; - } + writer.WriteStartObject(); if (document._errors?.Count > 0) { - if (indented) - { - WriteIndent(); - } - - WriteByte(JsonConstants.Quote); - writer.Write(JsonConstants.Errors); - WriteByte(JsonConstants.Quote); - WriteByte(JsonConstants.Colon); - - if (indented) - { - WriteByte(JsonConstants.Space); - } - - var options = new JsonWriterOptions { Indented = indented }; - using var jsonWriter = new Utf8JsonWriter(writer, options); + writer.WritePropertyName(JsonConstants.Errors); JsonValueFormatter.WriteErrors( - jsonWriter, + writer, document._errors, new JsonSerializerOptions(JsonSerializerDefaults.Web), default); - jsonWriter.Flush(); - - WriteByte(JsonConstants.Comma); } - // Write "data": var root = Cursor.Zero; var row = document._metaDb.Get(root); - if (indented) - { - WriteIndent(); - } - - WriteByte(JsonConstants.Quote); - writer.Write(JsonConstants.Data); - WriteByte(JsonConstants.Quote); - WriteByte(JsonConstants.Colon); - - if (indented) - { - WriteByte(JsonConstants.Space); - } + writer.WritePropertyName(JsonConstants.Data); if (row.TokenType is ElementTokenType.Null || (ElementFlags.Invalidated & row.Flags) == ElementFlags.Invalidated) { - writer.Write(JsonConstants.NullValue); + writer.WriteNullValue(); } else { @@ -88,41 +49,15 @@ public void Write() if (document._extensions?.Count > 0) { - WriteByte(JsonConstants.Comma); - - if (indented) - { - WriteIndent(); - } - - WriteByte(JsonConstants.Quote); - writer.Write(JsonConstants.Extensions); - WriteByte(JsonConstants.Quote); - WriteByte(JsonConstants.Colon); - - if (indented) - { - WriteByte(JsonConstants.Space); - } - - var options = new JsonWriterOptions { Indented = indented }; - using var jsonWriter = new Utf8JsonWriter(writer, options); + writer.WritePropertyName(JsonConstants.Extensions); JsonValueFormatter.WriteDictionary( - jsonWriter, + writer, document._extensions, new JsonSerializerOptions(JsonSerializerDefaults.Web), default); - jsonWriter.Flush(); - } - - if (indented) - { - _indentLevel--; - WriteNewLine(); - WriteIndent(); } - WriteByte(JsonConstants.CloseBrace); + writer.WriteEndObject(); } public void WriteValue(Cursor cursor, DbRow row) @@ -155,19 +90,19 @@ public void WriteValue(Cursor cursor, DbRow row) case ElementTokenType.None: case ElementTokenType.Null: - writer.Write(JsonConstants.NullValue); + writer.WriteNullValue(); break; case ElementTokenType.True: - writer.Write(JsonConstants.TrueValue); + writer.WriteBooleanValue(true); break; case ElementTokenType.False: - writer.Write(JsonConstants.FalseValue); + writer.WriteBooleanValue(false); break; default: - document.WriteRawValueTo(writer, row, _indentLevel, indented); + document.WriteRawValueTo(writer, row); break; } } @@ -179,14 +114,8 @@ private void WriteObject(Cursor start, DbRow startRow) var current = start + 1; var end = start + startRow.NumberOfRows; - WriteByte(JsonConstants.OpenBrace); + writer.WriteStartObject(); - if (indented && current < end) - { - _indentLevel++; - } - - var first = true; while (current < end) { var row = document._metaDb.Get(current); @@ -200,28 +129,8 @@ private void WriteObject(Cursor start, DbRow startRow) continue; } - if (!first) - { - WriteByte(JsonConstants.Comma); - } - first = false; - - if (indented) - { - WriteNewLine(); - WriteIndent(); - } - - // property name (quoted) - WriteByte(JsonConstants.Quote); - writer.Write(document.ReadRawValue(row)); - WriteByte(JsonConstants.Quote); - WriteByte(JsonConstants.Colon); - - if (indented) - { - WriteByte(JsonConstants.Space); - } + // property name + writer.WritePropertyName(document.ReadRawValue(row)); // property value current++; @@ -232,14 +141,7 @@ private void WriteObject(Cursor start, DbRow startRow) current++; } - if (indented && !first) - { - _indentLevel--; - WriteNewLine(); - WriteIndent(); - } - - WriteByte(JsonConstants.CloseBrace); + writer.WriteEndObject(); } private void WriteArray(Cursor start, DbRow startRow) @@ -249,65 +151,16 @@ private void WriteArray(Cursor start, DbRow startRow) var current = start + 1; var end = start + startRow.NumberOfRows; - WriteByte(JsonConstants.OpenBracket); - - if (indented && current < end) - { - _indentLevel++; - } + writer.WriteStartArray(); - var first = true; while (current < end) { - if (!first) - { - WriteByte(JsonConstants.Comma); - } - first = false; - - if (indented) - { - WriteNewLine(); - WriteIndent(); - } - var row = document._metaDb.Get(current); WriteValue(current, row); - current++; } - if (indented && end > start + 1) - { - _indentLevel--; - WriteNewLine(); - WriteIndent(); - } - - WriteByte(JsonConstants.CloseBracket); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private readonly void WriteNewLine() => WriteByte(JsonConstants.NewLineLineFeed); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private readonly void WriteIndent() - { - var indentSize = _indentLevel * 2; - if (indentSize > 0) - { - var span = writer.GetSpan(indentSize); - span[..indentSize].Fill(JsonConstants.Space); - writer.Advance(indentSize); - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private readonly void WriteByte(byte value) - { - var span = writer.GetSpan(1); - span[0] = value; - writer.Advance(1); + writer.WriteEndArray(); } } } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs index 8cfccd0c18e..54cbb6e6362 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs @@ -1,7 +1,7 @@ -using System.Buffers; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Text; +using System.Text.Json; using HotChocolate.Fusion.Execution.Nodes; using HotChocolate.Types; @@ -340,7 +340,7 @@ internal void Invalidate(Cursor current) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void WriteRawValueTo(IBufferWriter<byte> writer, DbRow row, int indentLevel, bool indented) + private void WriteRawValueTo(Utf8JsonWriter writer, DbRow row) { if ((row.Flags & ElementFlags.SourceResult) == ElementFlags.SourceResult) { @@ -350,7 +350,7 @@ private void WriteRawValueTo(IBufferWriter<byte> writer, DbRow row, int indentLe { // Reconstruct the source cursor from stored Location (Chunk) and SizeOrLength (Row) var sourceCursor = SourceResultDocument.Cursor.From(row.Location, row.SizeOrLength); - var formatter = new SourceResultDocument.RawJsonFormatter(document, writer, indentLevel, indented); + var formatter = new SourceResultDocument.RawJsonFormatter(document, writer); formatter.WriteValue(sourceCursor); return; } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.WriteTo.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.WriteTo.cs index 7ea4473a966..21b6a6bab10 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.WriteTo.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.WriteTo.cs @@ -1,20 +1,12 @@ -using System.Buffers; using System.Diagnostics; -using System.Runtime.CompilerServices; using System.Text.Json; namespace HotChocolate.Fusion.Text.Json; public sealed partial class SourceResultDocument { - internal ref struct RawJsonFormatter( - SourceResultDocument document, - IBufferWriter<byte> writer, - int indentLevel, - bool indented) + internal ref struct RawJsonFormatter(SourceResultDocument document, Utf8JsonWriter writer) { - private int _indentLevel = indentLevel; - public void WriteValue(Cursor cursor) { var row = document._parsedData.Get(cursor); @@ -40,15 +32,15 @@ private void WriteValue(Cursor cursor, DbRow row) case JsonTokenType.None: case JsonTokenType.Null: - writer.Write(JsonConstants.NullValue); + writer.WriteNullValue(); break; case JsonTokenType.True: - writer.Write(JsonConstants.TrueValue); + writer.WriteBooleanValue(true); break; case JsonTokenType.False: - writer.Write(JsonConstants.FalseValue); + writer.WriteBooleanValue(false); break; default: @@ -64,41 +56,15 @@ private void WriteObject(Cursor start, DbRow startRow) var current = start + 1; var end = start + startRow.NumberOfRows - 1; - WriteByte(JsonConstants.OpenBrace); + writer.WriteStartObject(); - if (indented && current < end) - { - _indentLevel++; - } - - var first = true; while (current < end) { var row = document._parsedData.Get(current); Debug.Assert(row.TokenType is JsonTokenType.PropertyName); - if (!first) - { - WriteByte(JsonConstants.Comma); - } - first = false; - - if (indented) - { - WriteNewLine(); - WriteIndent(); - } - - // property name (quoted) - WriteByte(JsonConstants.Quote); - writer.Write(document.ReadRawValue(row)); - WriteByte(JsonConstants.Quote); - WriteByte(JsonConstants.Colon); - - if (indented) - { - WriteByte(JsonConstants.Space); - } + // property name + writer.WritePropertyName(document.ReadRawValue(row)); // property value current++; @@ -116,14 +82,7 @@ private void WriteObject(Cursor start, DbRow startRow) } } - if (indented && !first) - { - _indentLevel--; - WriteNewLine(); - WriteIndent(); - } - - WriteByte(JsonConstants.CloseBrace); + writer.WriteEndObject(); } private void WriteArray(Cursor start, DbRow startRow) @@ -133,28 +92,10 @@ private void WriteArray(Cursor start, DbRow startRow) var current = start + 1; var end = start + startRow.NumberOfRows - 1; - WriteByte(JsonConstants.OpenBracket); - - if (indented && current < end) - { - _indentLevel++; - } + writer.WriteStartArray(); - var first = true; while (current < end) { - if (!first) - { - WriteByte(JsonConstants.Comma); - } - first = false; - - if (indented) - { - WriteNewLine(); - WriteIndent(); - } - var row = document._parsedData.Get(current); WriteValue(current, row); @@ -168,37 +109,7 @@ private void WriteArray(Cursor start, DbRow startRow) } } - if (indented && end > start + 1) - { - _indentLevel--; - WriteNewLine(); - WriteIndent(); - } - - WriteByte(JsonConstants.CloseBracket); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private readonly void WriteNewLine() => WriteByte(JsonConstants.NewLineLineFeed); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private readonly void WriteIndent() - { - var indentSize = _indentLevel * 2; - if (indentSize > 0) - { - var span = writer.GetSpan(indentSize); - span[..indentSize].Fill(JsonConstants.Space); - writer.Advance(indentSize); - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private readonly void WriteByte(byte value) - { - var span = writer.GetSpan(1); - span[0] = value; - writer.Advance(1); + writer.WriteEndArray(); } } } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs index b51dc541331..09a616212d2 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs @@ -104,15 +104,20 @@ internal SourceResultElement GetArrayIndexElement(Cursor startCursor, int arrayI } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void WriteRawValueTo(IBufferWriter<byte> writer, DbRow row) + private void WriteRawValueTo(Utf8JsonWriter writer, DbRow row) { if (row.TokenType is JsonTokenType.String) { - WriteRawValueTo(writer, row.Location - 1, row.SizeOrLength + 2); + writer.WriteRawValue(ReadRawValue(row.Location - 1, row.SizeOrLength + 2), skipInputValidation: true); return; } - WriteRawValueTo(writer, row.Location, row.SizeOrLength); + writer.WriteRawValue(ReadRawValue(row.Location, row.SizeOrLength), skipInputValidation: true); + } + + internal void WriteRawValueTo(Utf8JsonWriter writer, int location, int size) + { + writer.WriteRawValue(ReadRawValue(location, size), skipInputValidation: true); } internal void WriteRawValueTo(IBufferWriter<byte> writer, int location, int size) diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonWriter.cs b/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonWriter.cs new file mode 100644 index 00000000000..0aa349cbbc9 --- /dev/null +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonWriter.cs @@ -0,0 +1,6 @@ +namespace HotChocolate.Buffers; + +public class JsonWriter +{ + +} From 845350db54d4f966e79606e209c06218cf38cb5b Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 9 Jan 2026 15:54:14 +0100 Subject: [PATCH 079/144] feat(json): implement a new JsonWriter for efficient JSON serialization - Added a new JsonWriter class in the HotChocolate.Text.Json namespace to handle JSON writing with support for both minimized and indented formats. - Implemented methods for writing JSON objects, arrays, and various value types (strings, numbers, booleans, null). - Introduced options for customizing the writer's behavior, including indentation and validation settings. - Added comprehensive unit tests for the JsonWriter to ensure correctness across various scenarios. - Removed the old JsonWriter class from HotChocolate.Buffers as it is now deprecated. --- .../JsonResultFormatter.cs | 83 +- .../JsonValueFormatter.JsonWriter.cs | 366 ++++++++ ...s => JsonValueFormatter.Utf8JsonWriter.cs} | 28 +- ...HotChocolate.Execution.Abstractions.csproj | 1 + .../Core/src/Execution.Abstractions/Path.cs | 19 + .../Core/src/Types/HotChocolate.Types.csproj | 5 +- .../Types/Text/Json/ResultDocument.WriteTo.cs | 12 +- .../Core/src/Types/Text/Json/ResultElement.cs | 2 +- .../JsonOperationPlanFormatter.cs | 1 - .../HotChocolate.Fusion.Execution.csproj | 1 + .../Json/CompositeResultDocument.WriteTo.cs | 3 +- .../Text/Json/CompositeResultDocument.cs | 1 + .../Text/Json/CompositeResultElement.cs | 5 +- .../Text/Json/JsonReaderHelper.cs | 5 +- .../src/Json/HotChocolate.Text.Json.csproj | 16 + .../Text => Json/src}/Json/JsonConstants.cs | 11 +- .../Json/src/Json/JsonWriter.EscapeString.cs | 342 +++++++ .../Json/JsonWriter.WriteValues.Literal.cs | 109 +++ .../src/Json/JsonWriter.WriteValues.Number.cs | 160 ++++ .../JsonWriter.WriteValues.PropertyName.cs | 380 ++++++++ .../src/Json/JsonWriter.WriteValues.String.cs | 402 ++++++++ src/HotChocolate/Json/src/Json/JsonWriter.cs | 337 +++++++ .../Json/test/Json.Tests/JsonWriterTests.cs | 883 ++++++++++++++++++ .../src/Utilities.Buffers/JsonWriter.cs | 6 - 24 files changed, 3092 insertions(+), 86 deletions(-) create mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.JsonWriter.cs rename src/HotChocolate/Core/src/Execution.Abstractions/Execution/{JsonValueFormatter.cs => JsonValueFormatter.Utf8JsonWriter.cs} (93%) rename src/HotChocolate/{Fusion-vnext/src/Fusion.Execution/Text => Json/src}/Json/JsonConstants.cs (82%) create mode 100644 src/HotChocolate/Json/src/Json/JsonWriter.EscapeString.cs create mode 100644 src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Literal.cs create mode 100644 src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Number.cs create mode 100644 src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.PropertyName.cs create mode 100644 src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.String.cs create mode 100644 src/HotChocolate/Json/src/Json/JsonWriter.cs create mode 100644 src/HotChocolate/Json/test/Json.Tests/JsonWriterTests.cs delete mode 100644 src/HotChocolate/Utilities/src/Utilities.Buffers/JsonWriter.cs diff --git a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs index 6c063efb5bf..7d03081e878 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs @@ -2,6 +2,7 @@ using System.IO.Pipelines; using System.Text.Json; using HotChocolate.Execution; +using HotChocolate.Text.Json; using static HotChocolate.Execution.JsonValueFormatter; using static HotChocolate.Execution.ResultFieldNames; @@ -15,7 +16,6 @@ public sealed class JsonResultFormatter : IOperationResultFormatter, IExecutionR private readonly JsonWriterOptions _options; private readonly JsonSerializerOptions _serializerOptions; private readonly JsonNullIgnoreCondition _nullIgnoreCondition; - private readonly ThreadLocal<Utf8JsonWriter?> _writer = new(valueFactory: () => null, trackAllValues: false); /// <summary> /// Initializes a new instance of <see cref="JsonResultFormatter"/> with default options. @@ -69,6 +69,27 @@ public ValueTask FormatAsync( }; } + /// <summary> + /// Formats a query result as JSON string. + /// </summary> + /// <param name="result"> + /// The query result. + /// </param> + /// <param name="writer"> + /// The JSON writer. + /// </param> + /// <exception cref="ArgumentNullException"> + /// <paramref name="result"/> is <c>null</c>. + /// <paramref name="writer"/> is <c>null</c>. + /// </exception> + public void Format(OperationResult result, IBufferWriter<byte> writer) + { + ArgumentNullException.ThrowIfNull(result); + ArgumentNullException.ThrowIfNull(writer); + + FormatInternal(result, writer); + } + /// <summary> /// Formats a query result as JSON string. /// </summary> @@ -147,36 +168,27 @@ public void FormatDictionary(IReadOnlyDictionary<string, object?> dictionary, Ut WriteDictionary(writer, dictionary, _serializerOptions, _nullIgnoreCondition); } - public void Format(OperationResult result, IBufferWriter<byte> writer) + public ValueTask FormatAsync( + OperationResult result, + PipeWriter writer, + CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(result); ArgumentNullException.ThrowIfNull(writer); - FormatInternal(result, writer); + return FormatInternalAsync(result, writer, cancellationToken); } - private void FormatInternal(OperationResult result, IBufferWriter<byte> writer) + private void FormatInternal(OperationResult result, IBufferWriter<byte> bufferWriter) { if (result.JsonFormatter is { } formatter) { - formatter.WriteTo(result, writer, _options); + formatter.WriteTo(result, bufferWriter, _options); return; } - var jsonWriter = CreateWriter(writer); - WriteResult(jsonWriter, result); - jsonWriter.Flush(); - } - - public ValueTask FormatAsync( - OperationResult result, - PipeWriter writer, - CancellationToken cancellationToken = default) - { - ArgumentNullException.ThrowIfNull(result); - ArgumentNullException.ThrowIfNull(writer); - - return FormatInternalAsync(result, writer, cancellationToken); + var writer = new JsonWriter(bufferWriter, _options); + WriteResult(writer, result); } private async ValueTask FormatInternalAsync( @@ -244,18 +256,20 @@ private async ValueTask FormatInternalAsync( } } - private void WriteResult(Utf8JsonWriter writer, OperationResult result) + private void WriteResult(JsonWriter writer, OperationResult result) { writer.WriteStartObject(); if (result.RequestIndex.HasValue) { - writer.WriteNumber(RequestIndex, result.RequestIndex.Value); + writer.WritePropertyName(RequestIndex); + writer.WriteNumberValue(result.RequestIndex.Value); } if (result.VariableIndex.HasValue) { - writer.WriteNumber(VariableIndex, result.VariableIndex.Value); + writer.WritePropertyName(VariableIndex); + writer.WriteNumberValue(result.VariableIndex.Value); } WriteErrors(writer, result.Errors); @@ -267,17 +281,18 @@ private void WriteResult(Utf8JsonWriter writer, OperationResult result) } private static void WriteHasNext( - Utf8JsonWriter writer, + JsonWriter writer, OperationResult result) { if (result.HasNext.HasValue) { - writer.WriteBoolean("hasNext", result.HasNext.Value); + writer.WritePropertyName("hasNext"u8); + writer.WriteBooleanValue(result.HasNext.Value); } } private void WriteData( - Utf8JsonWriter writer, + JsonWriter writer, OperationResult result) { if (!result.IsDataSet) @@ -287,7 +302,8 @@ private void WriteData( if (result.Data is null) { - writer.WriteNull(Data); + writer.WritePropertyName(Data); + writer.WriteNullValue(); return; } @@ -296,7 +312,7 @@ private void WriteData( WriteValue(writer, result.Data, _serializerOptions, _nullIgnoreCondition); } - private void WriteErrors(Utf8JsonWriter writer, IReadOnlyList<IError>? errors) + private void WriteErrors(JsonWriter writer, IReadOnlyList<IError>? errors) { if (errors is { Count: > 0 }) { @@ -312,17 +328,4 @@ private void WriteErrors(Utf8JsonWriter writer, IReadOnlyList<IError>? errors) writer.WriteEndArray(); } } - - private Utf8JsonWriter CreateWriter(IBufferWriter<byte> buffer) - { - if (_writer.Value is not { } writer) - { - writer = new Utf8JsonWriter(buffer, _options); - _writer.Value = writer; - return writer; - } - - writer.Reset(buffer); - return writer; - } } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.JsonWriter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.JsonWriter.cs new file mode 100644 index 00000000000..fac56d164ca --- /dev/null +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.JsonWriter.cs @@ -0,0 +1,366 @@ +using System.Buffers.Text; +using System.Collections; +using System.Runtime.InteropServices; +using System.Text.Json; +using HotChocolate.Text.Json; +using static HotChocolate.Execution.ResultFieldNames; + +namespace HotChocolate.Execution; + +public static partial class JsonValueFormatter +{ + public static void WriteValue( + JsonWriter writer, + object? value, + JsonSerializerOptions options, + JsonNullIgnoreCondition nullIgnoreCondition) + { + if (value is null) + { + writer.WriteNullValue(); + return; + } + + switch (value) + { + case JsonDocument doc: + WriteJsonElement(doc.RootElement, writer, options, nullIgnoreCondition); + break; + + case JsonElement element: + WriteJsonElement(element, writer, options, nullIgnoreCondition); + break; + + case RawJsonValue rawJsonValue: + writer.WriteRawValue(rawJsonValue.Value.Span); + break; + + case Dictionary<string, object?> dict: + WriteDictionary(writer, dict, options, nullIgnoreCondition); + break; + + case IReadOnlyDictionary<string, object?> dict: + WriteDictionary(writer, dict, options, nullIgnoreCondition); + break; + + case IList list: + WriteList(writer, list, options, nullIgnoreCondition); + break; + + case IError error: + WriteError(writer, error, options, nullIgnoreCondition); + break; + + case string s: + writer.WriteStringValue(s); + break; + + case byte b: + writer.WriteNumberValue(b); + break; + + case short s: + writer.WriteNumberValue(s); + break; + + case ushort s: + writer.WriteNumberValue(s); + break; + + case int i: + writer.WriteNumberValue(i); + break; + + case uint i: + writer.WriteNumberValue(i); + break; + + case long l: + writer.WriteNumberValue(l); + break; + + case ulong l: + writer.WriteNumberValue(l); + break; + + case float f: + writer.WriteNumberValue(f); + break; + + case double d: + writer.WriteNumberValue(d); + break; + + case decimal d: + writer.WriteNumberValue(d); + break; + + case bool b: + writer.WriteBooleanValue(b); + break; + + case Uri u: + writer.WriteStringValue(u.ToString()); + break; + + case Path p: + WritePathValue(writer, p); + break; + + default: + writer.WriteStringValue(value.ToString()); + break; + } + } + + private static void WriteJsonElement( + JsonElement element, + JsonWriter writer, + JsonSerializerOptions options, + JsonNullIgnoreCondition nullIgnoreCondition) + { + switch (element.ValueKind) + { + case JsonValueKind.Object: + writer.WriteStartObject(); + foreach (var property in element.EnumerateObject()) + { + if (property.Value.ValueKind is JsonValueKind.Null + && (nullIgnoreCondition & JsonNullIgnoreCondition.Fields) == JsonNullIgnoreCondition.Fields) + { + continue; + } + + writer.WritePropertyName(property.Name); + WriteValue(writer, property.Value, options, nullIgnoreCondition); + } + writer.WriteEndObject(); + break; + + case JsonValueKind.Array: + writer.WriteStartArray(); + foreach (var item in element.EnumerateArray()) + { + if (item.ValueKind is JsonValueKind.Null + && (nullIgnoreCondition & JsonNullIgnoreCondition.Lists) == JsonNullIgnoreCondition.Lists) + { + continue; + } + + WriteValue(writer, item, options, nullIgnoreCondition); + } + writer.WriteEndArray(); + break; + + case JsonValueKind.String: + { + var value = JsonMarshal.GetRawUtf8Value(element); + writer.WriteStringValue(value, skipEscaping: true); + break; + } + + case JsonValueKind.Number: + { + var value = JsonMarshal.GetRawUtf8Value(element); + writer.WriteNumberValue(value); + break; + } + + case JsonValueKind.True: + writer.WriteBooleanValue(true); + break; + + case JsonValueKind.False: + writer.WriteBooleanValue(false); + break; + + case JsonValueKind.Null: + writer.WriteNullValue(); + break; + + default: + throw new NotSupportedException(); + } + } + + public static void WriteDictionary( + JsonWriter writer, + IReadOnlyDictionary<string, object?> dict, + JsonSerializerOptions options, + JsonNullIgnoreCondition nullIgnoreCondition) + { + writer.WriteStartObject(); + + foreach (var item in dict) + { + if (item.Value is null + && (nullIgnoreCondition & JsonNullIgnoreCondition.Fields) == JsonNullIgnoreCondition.Fields) + { + continue; + } + + writer.WritePropertyName(item.Key); + WriteValue(writer, item.Value, options, nullIgnoreCondition); + } + + writer.WriteEndObject(); + } + + private static void WriteList( + JsonWriter writer, + IList list, + JsonSerializerOptions options, + JsonNullIgnoreCondition nullIgnoreCondition) + { + writer.WriteStartArray(); + + for (var i = 0; i < list.Count; i++) + { + var element = list[i]; + + if (element is null + && (nullIgnoreCondition & JsonNullIgnoreCondition.Lists) == JsonNullIgnoreCondition.Lists) + { + continue; + } + + WriteValue(writer, element, options, nullIgnoreCondition); + } + + writer.WriteEndArray(); + } + + private static void WriteDictionary( + JsonWriter writer, + Dictionary<string, object?> dict, + JsonSerializerOptions options, + JsonNullIgnoreCondition nullIgnoreCondition) + { + writer.WriteStartObject(); + + foreach (var item in dict) + { + if (item.Value is null + && (nullIgnoreCondition & JsonNullIgnoreCondition.Fields) == JsonNullIgnoreCondition.Fields) + { + continue; + } + + writer.WritePropertyName(item.Key); + WriteValue(writer, item.Value, options, nullIgnoreCondition); + } + + writer.WriteEndObject(); + } + + private static void WriteLocations(JsonWriter writer, IReadOnlyList<Location>? locations) + { + if (locations is { Count: > 0 }) + { + writer.WritePropertyName(Locations); + + writer.WriteStartArray(); + + for (var i = 0; i < locations.Count; i++) + { + WriteLocation(writer, locations[i]); + } + + writer.WriteEndArray(); + } + } + + public static void WriteErrors( + JsonWriter writer, + IReadOnlyList<IError> error, + JsonSerializerOptions options, + JsonNullIgnoreCondition nullIgnoreCondition) + { + writer.WriteStartArray(); + + for (var i = 0; i < error.Count; i++) + { + WriteError(writer, error[i], options, nullIgnoreCondition); + } + + writer.WriteEndArray(); + } + + public static void WriteError( + JsonWriter writer, + IError error, + JsonSerializerOptions options, + JsonNullIgnoreCondition nullIgnoreCondition) + { + writer.WriteStartObject(); + + writer.WritePropertyName(Message); + writer.WriteStringValue(error.Message); + + WriteLocations(writer, error.Locations); + WritePath(writer, error.Path); + WriteExtensions(writer, error.Extensions, options, nullIgnoreCondition); + + writer.WriteEndObject(); + } + + private static void WriteLocation(JsonWriter writer, Location location) + { + writer.WriteStartObject(); + writer.WritePropertyName(Line); + writer.WriteNumberValue(location.Line); + writer.WritePropertyName(Column); + writer.WriteNumberValue(location.Column); + writer.WriteEndObject(); + } + + public static void WritePath(JsonWriter writer, Path? path) + { + if (path is not null) + { + writer.WritePropertyName(ResultFieldNames.Path); + WritePathValue(writer, path); + } + } + + private static void WritePathValue(JsonWriter writer, Path path) + { + if (path.IsRoot) + { + writer.WriteStartArray(); + writer.WriteEndArray(); + return; + } + + writer.WriteStartArray(); + + foreach (var segment in path.EnumerateSegments()) + { + switch (segment) + { + case NamePathSegment n: + writer.WriteStringValue(n.Name); + break; + + case IndexerPathSegment n: + writer.WriteNumberValue(n.Index); + break; + } + } + + writer.WriteEndArray(); + } + + public static void WriteExtensions( + JsonWriter writer, + IReadOnlyDictionary<string, object?>? dict, + JsonSerializerOptions options, + JsonNullIgnoreCondition nullIgnoreCondition) + { + if (dict is { Count: > 0 }) + { + writer.WritePropertyName(Extensions); + WriteDictionary(writer, dict, options, nullIgnoreCondition); + } + } +} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.Utf8JsonWriter.cs similarity index 93% rename from src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs rename to src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.Utf8JsonWriter.cs index f460e5791ae..d7dfbe290e4 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.Utf8JsonWriter.cs @@ -4,7 +4,7 @@ namespace HotChocolate.Execution; -public static class JsonValueFormatter +public static partial class JsonValueFormatter { public static void WriteValue( Utf8JsonWriter writer, @@ -307,30 +307,16 @@ private static void WritePathValue(Utf8JsonWriter writer, Path path) writer.WriteStartArray(); - var list = path.ToList(); - - for (var i = 0; i < list.Count; i++) + foreach (var segment in path.EnumerateSegments()) { - switch (list[i]) + switch (segment) { - case string s: - writer.WriteStringValue(s); - break; - - case int n: - writer.WriteNumberValue(n); - break; - - case short n: - writer.WriteNumberValue(n); - break; - - case long n: - writer.WriteNumberValue(n); + case NamePathSegment n: + writer.WriteStringValue(n.Name); break; - default: - writer.WriteStringValue(list[i].ToString()); + case IndexerPathSegment n: + writer.WriteNumberValue(n.Index); break; } } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/HotChocolate.Execution.Abstractions.csproj b/src/HotChocolate/Core/src/Execution.Abstractions/HotChocolate.Execution.Abstractions.csproj index 90b52d518ac..d82548193d1 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/HotChocolate.Execution.Abstractions.csproj +++ b/src/HotChocolate/Core/src/Execution.Abstractions/HotChocolate.Execution.Abstractions.csproj @@ -24,6 +24,7 @@ </ItemGroup> <ItemGroup> + <ProjectReference Include="..\..\..\Json\src\Json\HotChocolate.Text.Json.csproj" /> <ProjectReference Include="..\..\..\Language\src\Language.SyntaxTree\HotChocolate.Language.SyntaxTree.csproj" /> <ProjectReference Include="..\..\..\Language\src\Language.Web\HotChocolate.Language.Web.csproj" /> <ProjectReference Include="..\..\..\Primitives\src\Primitives\HotChocolate.Primitives.csproj" /> diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Path.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Path.cs index e96a84d2e0d..2cdb1bca0b1 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Path.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Path.cs @@ -246,6 +246,25 @@ public void ToList(Span<object> path) } } + public IEnumerable<Path> EnumerateSegments() + => EnumerateSegmentsBackwards().Reverse(); + + private IEnumerable<Path> EnumerateSegmentsBackwards() + { + if (IsRoot) + { + yield break; + } + + var current = this; + + while (!current.IsRoot) + { + yield return current; + current = current.Parent; + } + } + /// <summary>Returns a string that represents the current <see cref="Path"/>.</summary> /// <returns>A string that represents the current <see cref="Path"/>.</returns> public override string ToString() => Print(); diff --git a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj index b974b656938..33ab8f4d448 100644 --- a/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +++ b/src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj @@ -62,6 +62,7 @@ <ItemGroup> <ProjectReference Include="..\..\..\AspNetCore\src\Transport.Formatters\HotChocolate.Transport.Formatters.csproj" /> <ProjectReference Include="..\..\..\Fusion-vnext\src\Fusion.Utilities\HotChocolate.Fusion.Utilities.csproj" /> + <ProjectReference Include="..\..\..\Json\src\Json\HotChocolate.Text.Json.csproj" /> <ProjectReference Include="..\..\..\PersistedOperations\src\PersistedOperations.Abstractions\HotChocolate.PersistedOperations.Abstractions.csproj" /> <ProjectReference Include="..\..\..\PersistedOperations\src\PersistedOperations.Pipeline\HotChocolate.PersistedOperations.Pipeline.csproj" /> <ProjectReference Include="..\Execution.Pipeline\HotChocolate.Execution.Pipeline.csproj" /> @@ -80,10 +81,6 @@ </ItemGroup> <ItemGroup> - <Compile Include="..\..\..\Fusion-vnext\src\Fusion.Execution\Text\Json\JsonConstants.cs"> - <Link>Text\Json\JsonConstants.cs</Link> - </Compile> - <Compile Include="..\..\..\Fusion-vnext\src\Fusion.Execution\Text\Json\JsonHelpers.cs"> <Link>Text\Json\JsonHelpers.cs</Link> </Compile> diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index 9f369c41e73..140ec7749ce 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -78,13 +78,11 @@ public void WriteValue(Cursor cursor, DbRow row) switch (tokenType) { - case ElementTokenType.StartObject - when (ElementFlags.IsObject & row.Flags) != ElementFlags.IsObject: + case ElementTokenType.StartObject: WriteObject(cursor, row); break; - case ElementTokenType.StartArray - when (ElementFlags.IsList & row.Flags) != ElementFlags.IsList: + case ElementTokenType.StartArray: WriteArray(cursor, row); break; @@ -102,7 +100,8 @@ public void WriteValue(Cursor cursor, DbRow row) break; default: - document.WriteRawValueTo(writer, row); + var rawValue = document.ReadRawValue(row); + writer.WriteRawValue(rawValue, skipInputValidation: true); break; } } @@ -130,7 +129,8 @@ private void WriteObject(Cursor start, DbRow startRow) } // property name - writer.WritePropertyName(document.ReadRawValue(row)); + var propertyName = document.ReadRawValue(row); + writer.WritePropertyName(propertyName); // property value current++; diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index 0cad446791f..b958966bc07 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -973,7 +973,7 @@ public void SetArrayValue(int length) ArgumentOutOfRangeException.ThrowIfNegative(length); - if (Type is { } type && !type.IsListType()) + if (Type is { } type && !type.IsListType() && !type.IsScalarType()) { throw new InvalidOperationException( string.Format(ResultElement_SetArrayValue_NotListType, type)); diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Serialization/JsonOperationPlanFormatter.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Serialization/JsonOperationPlanFormatter.cs index 8e97fb28163..9093ad416e0 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Serialization/JsonOperationPlanFormatter.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Nodes/Serialization/JsonOperationPlanFormatter.cs @@ -6,7 +6,6 @@ using HotChocolate.Buffers; using HotChocolate.Language; using HotChocolate.Transport.Http; -using HotChocolate.Types; namespace HotChocolate.Fusion.Execution.Nodes.Serialization; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/HotChocolate.Fusion.Execution.csproj b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/HotChocolate.Fusion.Execution.csproj index 784fba4a269..ae098cb2da2 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/HotChocolate.Fusion.Execution.csproj +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/HotChocolate.Fusion.Execution.csproj @@ -29,6 +29,7 @@ <ProjectReference Include="..\..\..\Core\src\Execution.Operation.Abstractions\HotChocolate.Execution.Operation.Abstractions.csproj" /> <ProjectReference Include="..\..\..\Core\src\Execution.Pipeline\HotChocolate.Execution.Pipeline.csproj" /> <ProjectReference Include="..\..\..\Core\src\Types.Abstractions\HotChocolate.Types.Abstractions.csproj" /> + <ProjectReference Include="..\..\..\Json\src\Json\HotChocolate.Text.Json.csproj" /> <ProjectReference Include="..\..\..\Language\src\Language.SyntaxTree\HotChocolate.Language.SyntaxTree.csproj" /> <ProjectReference Include="..\..\..\PersistedOperations\src\PersistedOperations.Pipeline\HotChocolate.PersistedOperations.Pipeline.csproj" /> <ProjectReference Include="..\..\..\Primitives\src\Primitives\HotChocolate.Primitives.csproj" /> diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs index 9a38551b9a8..45834422a0d 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Text.Json; using HotChocolate.Execution; +using HotChocolate.Text.Json; namespace HotChocolate.Fusion.Text.Json; @@ -16,7 +17,7 @@ public void WriteTo(OperationResult result, IBufferWriter<byte> writer, JsonWrit jsonWriter.Flush(); } - internal ref struct RawJsonFormatter(CompositeResultDocument document, Utf8JsonWriter writer) + internal ref struct RawJsonFormatter(CompositeResultDocument document, JsonWriter writer) { public void Write() { diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs index 54cbb6e6362..8de791dd16c 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs @@ -3,6 +3,7 @@ using System.Text; using System.Text.Json; using HotChocolate.Fusion.Execution.Nodes; +using HotChocolate.Text.Json; using HotChocolate.Types; namespace HotChocolate.Fusion.Text.Json; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs index 7aef388f1c2..8e65dfe3b7c 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs @@ -33,7 +33,10 @@ internal CompositeResultElement(CompositeResultDocument parent, CompositeResultD /// </param> public void WriteTo(IBufferWriter<byte> writer, bool indented = false) { - var formatter = new CompositeResultDocument.RawJsonFormatter(_parent, writer, indented); + var formatter = new CompositeResultDocument.RawJsonFormatter( + _parent, + writer, + new JsonWriterOptions { Indented = indented }); var row = _parent._metaDb.Get(_cursor); formatter.WriteValue(_cursor, row); diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs index edbbcac3f24..c3b2ae2810c 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonReaderHelper.cs @@ -4,6 +4,7 @@ using System.Runtime.CompilerServices; using System.Text; using System.Text.Json; +using HotChocolate.Text.Json; #if FUSION using static HotChocolate.Fusion.Properties.FusionExecutionResources; @@ -105,7 +106,9 @@ public static JsonValueKind ToValueKind(this JsonTokenType tokenType) public static bool UnescapeAndCompare(ReadOnlySpan<byte> utf8Source, ReadOnlySpan<byte> other) { - Debug.Assert(utf8Source.Length >= other.Length && utf8Source.Length / JsonConstants.MaxExpansionFactorWhileEscaping <= other.Length); + Debug.Assert( + utf8Source.Length >= other.Length + && utf8Source.Length / JsonConstants.MaxExpansionFactorWhileEscaping <= other.Length); byte[]? unescapedArray = null; diff --git a/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj b/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj index 3366abcbd96..f9d6402fdde 100644 --- a/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj +++ b/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj @@ -3,7 +3,23 @@ <PropertyGroup> <AssemblyName>HotChocolate.Text.Json</AssemblyName> <RootNamespace>HotChocolate.Text.Json</RootNamespace> + <Description>This package provides helpers for JSON parsing and formatting in HotChocolate.</Description> + </PropertyGroup> + + <PropertyGroup> <LangVersion>preview</LangVersion> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> </PropertyGroup> + <ItemGroup> + <InternalsVisibleTo Include="HotChocolate.Fusion.Execution" /> + <InternalsVisibleTo Include="HotChocolate.Types" /> + </ItemGroup> + + <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'"> + <PackageReference Include="Microsoft.Bcl.HashCode" /> + <PackageReference Include="System.Memory" /> + <PackageReference Include="System.Text.Json" /> + </ItemGroup> + </Project> diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs b/src/HotChocolate/Json/src/Json/JsonConstants.cs similarity index 82% rename from src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs rename to src/HotChocolate/Json/src/Json/JsonConstants.cs index 9201cc9fc5d..d494ea0e26a 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/JsonConstants.cs +++ b/src/HotChocolate/Json/src/Json/JsonConstants.cs @@ -1,12 +1,13 @@ -#if FUSION -namespace HotChocolate.Fusion.Text.Json; -#else namespace HotChocolate.Text.Json; -#endif internal static class JsonConstants { public const int StackallocByteThreshold = 256; + public const int StackallocCharThreshold = StackallocByteThreshold / 2; + + public const int MaxEscapedTokenSize = 1_000_000_000; // Max size for already escaped value. + public const int MaxUnescapedTokenSize = MaxEscapedTokenSize / MaxExpansionFactorWhileEscaping; // 166_666_666 bytes + public const int MaxCharacterTokenSize = MaxEscapedTokenSize / MaxExpansionFactorWhileTranscoding; // 333_333_333 chars public const byte OpenBrace = (byte)'{'; public const byte CloseBrace = (byte)'}'; @@ -50,4 +51,6 @@ internal static class JsonConstants public const int LowSurrogateStartValue = 0xDC00; public const int LowSurrogateEndValue = 0xDFFF; public const int BitShiftBy10 = 0x400; + + public const int RemoveFlagsBitMask = 0x7FFFFFFF; } diff --git a/src/HotChocolate/Json/src/Json/JsonWriter.EscapeString.cs b/src/HotChocolate/Json/src/Json/JsonWriter.EscapeString.cs new file mode 100644 index 00000000000..fd409a188fe --- /dev/null +++ b/src/HotChocolate/Json/src/Json/JsonWriter.EscapeString.cs @@ -0,0 +1,342 @@ +using System.Buffers; +using System.Buffers.Text; +using System.Diagnostics; +using System.Text; +using System.Text.Encodings.Web; + +namespace HotChocolate.Text.Json; + +public sealed partial class JsonWriter +{ + // Only allow ASCII characters between ' ' (0x20) and '~' (0x7E), inclusively, + // but exclude characters that need to be escaped as hex: '"', '\'', '&', '+', '<', '>', '`' + // and exclude characters that need to be escaped by adding a backslash: '\n', '\r', '\t', '\\', '\b', '\f' + // + // non-zero = allowed, 0 = disallowed + private const int LastAsciiCharacter = 0x7F; + + private static ReadOnlySpan<byte> AllowList => // byte.MaxValue + 1 + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // U+0000..U+000F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // U+0010..U+001F + 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, // U+0020..U+002F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, // U+0030..U+003F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // U+0040..U+004F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // U+0050..U+005F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // U+0060..U+006F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // U+0070..U+007F + + // Also include the ranges from U+0080 to U+00FF for performance to avoid UTF8 code from checking boundary. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // U+00F0..U+00FF + ]; + + private const string HexFormatString = "X4"; + private static readonly StandardFormat s_hexStandardFormat = new('X', 4); + + private static bool NeedsEscaping(byte value) => AllowList[value] == 0; + + private static bool NeedsEscapingNoBoundsCheck(char value) => AllowList[value] == 0; + + private static int NeedsEscaping(ReadOnlySpan<byte> value, JavaScriptEncoder? encoder) + => (encoder ?? JavaScriptEncoder.Default).FindFirstCharacterToEncodeUtf8(value); + + private static int NeedsEscaping(ReadOnlySpan<char> value, JavaScriptEncoder? encoder) + { + // Some implementations of JavaScriptEncoder.FindFirstCharacterToEncode may not accept + // null pointers and guard against that. Hence, check up-front to return -1. + if (value.IsEmpty) + { + return -1; + } + + // Unfortunately, there is no public API for FindFirstCharacterToEncode(Span<char>) yet, + // so we have to use the unsafe FindFirstCharacterToEncode(char*, int) instead. + unsafe + { + fixed (char* ptr = value) + { + return (encoder ?? JavaScriptEncoder.Default).FindFirstCharacterToEncode(ptr, value.Length); + } + } + } + + private static int GetMaxEscapedLength(int textLength, int firstIndexToEscape) + { + Debug.Assert(textLength > 0); + Debug.Assert(firstIndexToEscape >= 0 && firstIndexToEscape < textLength); + return firstIndexToEscape + (JsonConstants.MaxExpansionFactorWhileEscaping * (textLength - firstIndexToEscape)); + } + + private static void EscapeString(ReadOnlySpan<byte> value, Span<byte> destination, JavaScriptEncoder encoder, ref int consumed, ref int written, bool isFinalBlock) + { + Debug.Assert(encoder != null); + + var result = encoder.EncodeUtf8(value, destination, out var encoderBytesConsumed, out var encoderBytesWritten, isFinalBlock); + + Debug.Assert(result != OperationStatus.DestinationTooSmall); + Debug.Assert(result != OperationStatus.NeedMoreData || !isFinalBlock); + + if (!(result == OperationStatus.Done || (result == OperationStatus.NeedMoreData && !isFinalBlock))) + { + throw CreateArgumentException_InvalidUTF8(value[encoderBytesWritten..]); + } + + Debug.Assert(encoderBytesConsumed == value.Length || (result == OperationStatus.NeedMoreData && !isFinalBlock)); + + written += encoderBytesWritten; + consumed += encoderBytesConsumed; + } + + private static void EscapeString(ReadOnlySpan<byte> value, Span<byte> destination, int indexOfFirstByteToEscape, JavaScriptEncoder? encoder, out int written) + => EscapeString(value, destination, indexOfFirstByteToEscape, encoder, out _, out written, isFinalBlock: true); + + private static void EscapeString(ReadOnlySpan<byte> value, Span<byte> destination, int indexOfFirstByteToEscape, JavaScriptEncoder? encoder, out int consumed, out int written, bool isFinalBlock = true) + { + Debug.Assert(indexOfFirstByteToEscape >= 0 && indexOfFirstByteToEscape < value.Length); + + value[..indexOfFirstByteToEscape].CopyTo(destination); + written = indexOfFirstByteToEscape; + consumed = indexOfFirstByteToEscape; + + if (encoder != null) + { + destination = destination[indexOfFirstByteToEscape..]; + value = value[indexOfFirstByteToEscape..]; + EscapeString(value, destination, encoder, ref consumed, ref written, isFinalBlock); + } + else + { + // For performance when no encoder is specified, perform escaping here for Ascii and on the + // first occurrence of a non-Ascii character, then call into the default encoder. + while (indexOfFirstByteToEscape < value.Length) + { + var val = value[indexOfFirstByteToEscape]; + if (IsAsciiValue(val)) + { + if (NeedsEscaping(val)) + { + EscapeNextBytes(val, destination, ref written); + indexOfFirstByteToEscape++; + consumed++; + } + else + { + destination[written] = val; + written++; + indexOfFirstByteToEscape++; + consumed++; + } + } + else + { + // Fall back to default encoder. + destination = destination[written..]; + value = value[indexOfFirstByteToEscape..]; + EscapeString(value, destination, JavaScriptEncoder.Default, ref consumed, ref written, isFinalBlock); + break; + } + } + } + } + + private static void EscapeNextBytes(byte value, Span<byte> destination, ref int written) + { + destination[written++] = (byte)'\\'; + switch (value) + { + case JsonConstants.Quote: + // Optimize for the common quote case. + destination[written++] = (byte)'u'; + destination[written++] = (byte)'0'; + destination[written++] = (byte)'0'; + destination[written++] = (byte)'2'; + destination[written++] = (byte)'2'; + break; + case JsonConstants.LineFeed: + destination[written++] = (byte)'n'; + break; + case JsonConstants.CarriageReturn: + destination[written++] = (byte)'r'; + break; + case JsonConstants.Tab: + destination[written++] = (byte)'t'; + break; + case JsonConstants.BackSlash: + destination[written++] = (byte)'\\'; + break; + case JsonConstants.BackSpace: + destination[written++] = (byte)'b'; + break; + case JsonConstants.FormFeed: + destination[written++] = (byte)'f'; + break; + default: + destination[written++] = (byte)'u'; + var result = Utf8Formatter.TryFormat(value, destination[written..], out var bytesWritten, format: s_hexStandardFormat); + Debug.Assert(result); + Debug.Assert(bytesWritten == 4); + written += bytesWritten; + break; + } + } + + private static bool IsAsciiValue(byte value) => value <= LastAsciiCharacter; + + private static bool IsAsciiValue(char value) => value <= LastAsciiCharacter; + + private static void EscapeString(ReadOnlySpan<char> value, Span<char> destination, JavaScriptEncoder encoder, ref int consumed, ref int written, bool isFinalBlock) + { + Debug.Assert(encoder != null); + + var result = encoder.Encode(value, destination, out var encoderBytesConsumed, out var encoderCharsWritten, isFinalBlock); + + Debug.Assert(result != OperationStatus.DestinationTooSmall); + Debug.Assert(result != OperationStatus.NeedMoreData || !isFinalBlock); + + if (!(result == OperationStatus.Done || (result == OperationStatus.NeedMoreData && !isFinalBlock))) + { + throw new ArgumentException(string.Format( + "Cannot encode invalid UTF-16 text as JSON. Invalid surrogate value: '{0}'.", + value[encoderCharsWritten])); + } + + Debug.Assert(encoderBytesConsumed == value.Length || (result == OperationStatus.NeedMoreData && !isFinalBlock)); + + written += encoderCharsWritten; + consumed += encoderBytesConsumed; + } + + private static void EscapeString(ReadOnlySpan<char> value, Span<char> destination, int indexOfFirstByteToEscape, JavaScriptEncoder? encoder, out int written) + => EscapeString(value, destination, indexOfFirstByteToEscape, encoder, out _, out written, isFinalBlock: true); + + private static void EscapeString(ReadOnlySpan<char> value, Span<char> destination, int indexOfFirstByteToEscape, JavaScriptEncoder? encoder, out int consumed, out int written, bool isFinalBlock = true) + { + Debug.Assert(indexOfFirstByteToEscape >= 0 && indexOfFirstByteToEscape < value.Length); + + value[..indexOfFirstByteToEscape].CopyTo(destination); + written = indexOfFirstByteToEscape; + consumed = indexOfFirstByteToEscape; + + if (encoder != null) + { + destination = destination[indexOfFirstByteToEscape..]; + value = value[indexOfFirstByteToEscape..]; + EscapeString(value, destination, encoder, ref consumed, ref written, isFinalBlock); + } + else + { + // For performance when no encoder is specified, perform escaping here for Ascii and on the + // first occurrence of a non-Ascii character, then call into the default encoder. + while (indexOfFirstByteToEscape < value.Length) + { + var val = value[indexOfFirstByteToEscape]; + if (IsAsciiValue(val)) + { + if (NeedsEscapingNoBoundsCheck(val)) + { + EscapeNextChars(val, destination, ref written); + indexOfFirstByteToEscape++; + consumed++; + } + else + { + destination[written] = val; + written++; + indexOfFirstByteToEscape++; + consumed++; + } + } + else + { + // Fall back to default encoder. + destination = destination[written..]; + value = value[indexOfFirstByteToEscape..]; + EscapeString(value, destination, JavaScriptEncoder.Default, ref consumed, ref written, isFinalBlock); + break; + } + } + } + } + + private static void EscapeNextChars(char value, Span<char> destination, ref int written) + { + Debug.Assert(IsAsciiValue(value)); + + destination[written++] = '\\'; + switch ((byte)value) + { + case JsonConstants.Quote: + // Optimize for the common quote case. + destination[written++] = 'u'; + destination[written++] = '0'; + destination[written++] = '0'; + destination[written++] = '2'; + destination[written++] = '2'; + break; + case JsonConstants.LineFeed: + destination[written++] = 'n'; + break; + case JsonConstants.CarriageReturn: + destination[written++] = 'r'; + break; + case JsonConstants.Tab: + destination[written++] = 't'; + break; + case JsonConstants.BackSlash: + destination[written++] = '\\'; + break; + case JsonConstants.BackSpace: + destination[written++] = 'b'; + break; + case JsonConstants.FormFeed: + destination[written++] = 'f'; + break; + default: + destination[written++] = 'u'; + int intChar = value; + intChar.TryFormat(destination[written..], out var charsWritten, HexFormatString); + Debug.Assert(charsWritten == 4); + written += charsWritten; + break; + } + } + + public static ArgumentException CreateArgumentException_InvalidUTF8(ReadOnlySpan<byte> value) + { + var builder = new StringBuilder(); + builder.Append("Cannot encode invalid UTF-8 text as JSON. Invalid input: '"); + + var printFirst10 = Math.Min(value.Length, 10); + + for (var i = 0; i < printFirst10; i++) + { + var nextByte = value[i]; + if (IsPrintable(nextByte)) + { + builder.Append((char)nextByte); + } + else + { + builder.Append($"0x{nextByte:X2}"); + } + } + + if (printFirst10 < value.Length) + { + builder.Append("..."); + } + + builder.Append("'."); + + return new ArgumentException(builder.ToString()); + } + + private static bool IsPrintable(byte value) => value >= 0x20 && value < 0x7F; +} diff --git a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Literal.cs b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Literal.cs new file mode 100644 index 00000000000..5a3254f2c80 --- /dev/null +++ b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Literal.cs @@ -0,0 +1,109 @@ +using System.Diagnostics; +using System.Text.Json; + +namespace HotChocolate.Text.Json; + +public sealed partial class JsonWriter +{ + /// <summary> + /// Writes the JSON literal "null" as an element of a JSON array. + /// </summary> + /// <exception cref="InvalidOperationException"> + /// Thrown if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + public void WriteNullValue() + { + WriteLiteralByOptions(JsonConstants.NullValue); + + SetFlagToAddListSeparatorBeforeNextItem(); + _tokenType = JsonTokenType.Null; + } + + /// <summary> + /// Writes the <see cref="bool"/> value (as a JSON literal "true" or "false") as an element of a JSON array. + /// </summary> + /// <param name="value">The value write.</param> + /// <exception cref="InvalidOperationException"> + /// Thrown if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + public void WriteBooleanValue(bool value) + { + if (value) + { + WriteLiteralByOptions(JsonConstants.TrueValue); + _tokenType = JsonTokenType.True; + } + else + { + WriteLiteralByOptions(JsonConstants.FalseValue); + _tokenType = JsonTokenType.False; + } + + SetFlagToAddListSeparatorBeforeNextItem(); + } + + private void WriteLiteralByOptions(ReadOnlySpan<byte> utf8Value) + { + if (_options.Indented) + { + WriteLiteralIndented(utf8Value); + } + else + { + WriteLiteralMinimized(utf8Value); + } + } + + private void WriteLiteralMinimized(ReadOnlySpan<byte> utf8Value) + { + Debug.Assert(utf8Value.Length <= 5); + + var maxRequired = utf8Value.Length + 1; // Optionally, 1 list separator + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + utf8Value.CopyTo(output[bytesWritten..]); + bytesWritten += utf8Value.Length; + + _writer.Advance(bytesWritten); + } + + private void WriteLiteralIndented(ReadOnlySpan<byte> utf8Value) + { + var indent = Indentation; + Debug.Assert(indent <= _indentLength * _maxDepth); + Debug.Assert(utf8Value.Length <= 5); + + var maxRequired = indent + utf8Value.Length + 1 + _newLineLength; // Optionally, 1 list separator and 1-2 bytes for new line + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + if (_tokenType != JsonTokenType.PropertyName) + { + if (_tokenType != JsonTokenType.None) + { + WriteNewLine(output, ref bytesWritten); + } + + WriteIndentation(output[bytesWritten..], indent); + bytesWritten += indent; + } + + utf8Value.CopyTo(output[bytesWritten..]); + bytesWritten += utf8Value.Length; + + _writer.Advance(bytesWritten); + } +} diff --git a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Number.cs b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Number.cs new file mode 100644 index 00000000000..2836ea1a283 --- /dev/null +++ b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Number.cs @@ -0,0 +1,160 @@ +using System.Buffers; +using System.Buffers.Text; +using System.Diagnostics; +using System.Text.Json; + +namespace HotChocolate.Text.Json; + +public sealed partial class JsonWriter +{ + /// <summary> + /// Writes the value (as a JSON number) as an element of a JSON array. + /// </summary> + /// <param name="utf8FormattedNumber">The value to write.</param> + /// <exception cref="ArgumentException"> + /// Thrown when <paramref name="utf8FormattedNumber"/> does not represent a valid JSON number. + /// </exception> + /// <exception cref="InvalidOperationException"> + /// Thrown if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + /// <remarks> + /// Writes the <see cref="int"/> using the default <see cref="StandardFormat"/> (that is, 'G'), for example: 32767. + /// </remarks> + public void WriteNumberValue(ReadOnlySpan<byte> utf8FormattedNumber) + { + ValidateValue(utf8FormattedNumber); + + if (_options.Indented) + { + WriteNumberValueIndented(utf8FormattedNumber); + } + else + { + WriteNumberValueMinimized(utf8FormattedNumber); + } + + SetFlagToAddListSeparatorBeforeNextItem(); + _tokenType = JsonTokenType.Number; + } + + public void WriteNumberValue(int value) + { + Span<byte> buffer = stackalloc byte[11]; // -2147483648 + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + WriteNumberValue(buffer[..bytesWritten]); + } + + public void WriteNumberValue(uint value) + { + Span<byte> buffer = stackalloc byte[10]; // 4294967295 + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + WriteNumberValue(buffer[..bytesWritten]); + } + + public void WriteNumberValue(long value) + { + Span<byte> buffer = stackalloc byte[20]; // -9223372036854775808 + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + WriteNumberValue(buffer[..bytesWritten]); + } + + public void WriteNumberValue(ulong value) + { + Span<byte> buffer = stackalloc byte[20]; // 18446744073709551615 + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + WriteNumberValue(buffer[..bytesWritten]); + } + + public void WriteNumberValue(short value) + { + Span<byte> buffer = stackalloc byte[6]; // -32768 + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + WriteNumberValue(buffer[..bytesWritten]); + } + + public void WriteNumberValue(ushort value) + { + Span<byte> buffer = stackalloc byte[5]; // 65535 + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + WriteNumberValue(buffer[..bytesWritten]); + } + + public void WriteNumberValue(byte value) + { + Span<byte> buffer = stackalloc byte[3]; // 255 + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + WriteNumberValue(buffer[..bytesWritten]); + } + + public void WriteNumberValue(float value) + { + Span<byte> buffer = stackalloc byte[32]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + WriteNumberValue(buffer[..bytesWritten]); + } + + public void WriteNumberValue(double value) + { + Span<byte> buffer = stackalloc byte[32]; + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + WriteNumberValue(buffer[..bytesWritten]); + } + + public void WriteNumberValue(decimal value) + { + Span<byte> buffer = stackalloc byte[31]; // max decimal length + Utf8Formatter.TryFormat(value, buffer, out var bytesWritten); + WriteNumberValue(buffer[..bytesWritten]); + } + + private void WriteNumberValueMinimized(ReadOnlySpan<byte> utf8Value) + { + var maxRequired = utf8Value.Length + 1; // Optionally, 1 list separator + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + utf8Value.CopyTo(output[bytesWritten..]); + bytesWritten += utf8Value.Length; + + _writer.Advance(bytesWritten); + } + + private void WriteNumberValueIndented(ReadOnlySpan<byte> utf8Value) + { + var indent = Indentation; + Debug.Assert(indent <= _indentLength * _maxDepth); + Debug.Assert(utf8Value.Length < int.MaxValue - indent - 1 - _newLineLength); + + var maxRequired = indent + utf8Value.Length + 1 + _newLineLength; // Optionally, 1 list separator and 1-2 bytes for new line + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + if (_tokenType != JsonTokenType.PropertyName) + { + if (_tokenType != JsonTokenType.None) + { + WriteNewLine(output, ref bytesWritten); + } + + WriteIndentation(output[bytesWritten..], indent); + bytesWritten += indent; + } + + utf8Value.CopyTo(output[bytesWritten..]); + bytesWritten += utf8Value.Length; + + _writer.Advance(bytesWritten); + } +} diff --git a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.PropertyName.cs b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.PropertyName.cs new file mode 100644 index 00000000000..f2ea2c73408 --- /dev/null +++ b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.PropertyName.cs @@ -0,0 +1,380 @@ +using System.Buffers; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Text.Json; + +namespace HotChocolate.Text.Json; + +public sealed partial class JsonWriter +{ + /// <summary> + /// Writes the property name (as a JSON string) as the first part of a name/value pair of a JSON object. + /// </summary> + /// <param name="propertyName">The name of the property to write.</param> + /// <exception cref="ArgumentException"> + /// Thrown when the specified property name is too large. + /// </exception> + /// <exception cref="ArgumentNullException"> + /// The <paramref name="propertyName"/> parameter is <see langword="null"/>. + /// </exception> + /// <exception cref="InvalidOperationException"> + /// Thrown if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + /// <remarks> + /// The property name is escaped before writing. + /// </remarks> + public void WritePropertyName(string propertyName) + { + ArgumentNullException.ThrowIfNull(propertyName); + WritePropertyName(propertyName.AsSpan()); + } + + /// <summary> + /// Writes the property name (as a JSON string) as the first part of a name/value pair of a JSON object. + /// </summary> + /// <param name="propertyName">The name of the property to write.</param> + /// <exception cref="ArgumentException"> + /// Thrown when the specified property name is too large. + /// </exception> + /// <exception cref="InvalidOperationException"> + /// Thrown if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + /// <remarks> + /// The property name is escaped before writing. + /// </remarks> + public void WritePropertyName(ReadOnlySpan<char> propertyName) + { + ValidateProperty(propertyName); + + var propertyIdx = NeedsEscaping(propertyName, _options.Encoder); + + Debug.Assert(propertyIdx >= -1 && propertyIdx < propertyName.Length && propertyIdx < int.MaxValue / 2); + + if (propertyIdx != -1) + { + WriteStringEscapeProperty(propertyName, propertyIdx); + } + else + { + WriteStringByOptionsPropertyName(propertyName); + } + + _currentDepth &= JsonConstants.RemoveFlagsBitMask; + _tokenType = JsonTokenType.PropertyName; + } + + private void WriteStringEscapeProperty(scoped ReadOnlySpan<char> propertyName, int firstEscapeIndexProp) + { + Debug.Assert(int.MaxValue / JsonConstants.MaxExpansionFactorWhileEscaping >= propertyName.Length); + + char[]? propertyArray = null; + scoped Span<char> escapedPropertyName; + + if (firstEscapeIndexProp != -1) + { + var length = GetMaxEscapedLength(propertyName.Length, firstEscapeIndexProp); + + if (length > JsonConstants.StackallocCharThreshold) + { + propertyArray = ArrayPool<char>.Shared.Rent(length); + escapedPropertyName = propertyArray; + } + else + { + escapedPropertyName = stackalloc char[JsonConstants.StackallocCharThreshold]; + } + + EscapeString(propertyName, escapedPropertyName, firstEscapeIndexProp, _options.Encoder, out var written); + propertyName = escapedPropertyName[..written]; + } + + WriteStringByOptionsPropertyName(propertyName); + + if (propertyArray != null) + { + ArrayPool<char>.Shared.Return(propertyArray); + } + } + + private void WriteStringByOptionsPropertyName(ReadOnlySpan<char> propertyName) + { + if (_options.Indented) + { + WriteStringIndentedPropertyName(propertyName); + } + else + { + WriteStringMinimizedPropertyName(propertyName); + } + } + + private void WriteStringMinimizedPropertyName(ReadOnlySpan<char> escapedPropertyName) + { + Debug.Assert(escapedPropertyName.Length <= JsonConstants.MaxEscapedTokenSize); + Debug.Assert(escapedPropertyName.Length < (int.MaxValue - 4) / JsonConstants.MaxExpansionFactorWhileTranscoding); + + // All ASCII, 2 quotes for property name, and 1 colon => escapedPropertyName.Length + 3 + // Optionally, 1 list separator, and up to 3x growth when transcoding + var maxRequired = (escapedPropertyName.Length * JsonConstants.MaxExpansionFactorWhileTranscoding) + 4; + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + output[bytesWritten++] = JsonConstants.Quote; + + TranscodeAndWrite(escapedPropertyName, output, ref bytesWritten); + + output[bytesWritten++] = JsonConstants.Quote; + output[bytesWritten++] = JsonConstants.Colon; + + _writer.Advance(bytesWritten); + } + + private void WriteStringIndentedPropertyName(ReadOnlySpan<char> escapedPropertyName) + { + var indent = Indentation; + Debug.Assert(indent <= _indentLength * (_maxDepth)); + + Debug.Assert(escapedPropertyName.Length <= JsonConstants.MaxEscapedTokenSize); + Debug.Assert(escapedPropertyName.Length < (int.MaxValue - 5 - indent - _newLineLength) / JsonConstants.MaxExpansionFactorWhileTranscoding); + + // All ASCII, 2 quotes for property name, 1 colon, and 1 space => escapedPropertyName.Length + 4 + // Optionally, 1 list separator, 1-2 bytes for new line, and up to 3x growth when transcoding + var maxRequired = indent + (escapedPropertyName.Length * JsonConstants.MaxExpansionFactorWhileTranscoding) + 5 + _newLineLength; + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + if (_tokenType != JsonTokenType.None) + { + WriteNewLine(output, ref bytesWritten); + } + + WriteIndentation(output[bytesWritten..], indent); + bytesWritten += indent; + + output[bytesWritten++] = JsonConstants.Quote; + + TranscodeAndWrite(escapedPropertyName, output, ref bytesWritten); + + output[bytesWritten++] = JsonConstants.Quote; + output[bytesWritten++] = JsonConstants.Colon; + output[bytesWritten++] = JsonConstants.Space; + + _writer.Advance(bytesWritten); + } + + /// <summary> + /// Writes the UTF-8 property name (as a JSON string) as the first part of a name/value pair of a JSON object. + /// </summary> + /// <param name="utf8PropertyName">The UTF-8 encoded name of the property to write.</param> + /// <exception cref="ArgumentException"> + /// Thrown when the specified property name is too large. + /// </exception> + /// <exception cref="InvalidOperationException"> + /// Thrown if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + /// <remarks> + /// The property name is escaped before writing. + /// </remarks> + public void WritePropertyName(ReadOnlySpan<byte> utf8PropertyName) + { + ValidateProperty(utf8PropertyName); + + var propertyIdx = NeedsEscaping(utf8PropertyName, _options.Encoder); + + Debug.Assert(propertyIdx >= -1 && propertyIdx < utf8PropertyName.Length && propertyIdx < int.MaxValue / 2); + + if (propertyIdx != -1) + { + WriteStringEscapeProperty(utf8PropertyName, propertyIdx); + } + else + { + WriteStringByOptionsPropertyName(utf8PropertyName); + } + + _currentDepth &= JsonConstants.RemoveFlagsBitMask; + _tokenType = JsonTokenType.PropertyName; + } + + private void WritePropertyNameUnescaped(ReadOnlySpan<byte> utf8PropertyName) + { + ValidateProperty(utf8PropertyName); + WriteStringByOptionsPropertyName(utf8PropertyName); + + _currentDepth &= JsonConstants.RemoveFlagsBitMask; + _tokenType = JsonTokenType.PropertyName; + } + + private void WriteStringEscapeProperty(scoped ReadOnlySpan<byte> utf8PropertyName, int firstEscapeIndexProp) + { + Debug.Assert(int.MaxValue / JsonConstants.MaxExpansionFactorWhileEscaping >= utf8PropertyName.Length); + + byte[]? propertyArray = null; + scoped Span<byte> escapedPropertyName; + + if (firstEscapeIndexProp != -1) + { + var length = GetMaxEscapedLength(utf8PropertyName.Length, firstEscapeIndexProp); + + if (length > JsonConstants.StackallocByteThreshold) + { + propertyArray = ArrayPool<byte>.Shared.Rent(length); + escapedPropertyName = propertyArray; + } + else + { + escapedPropertyName = stackalloc byte[JsonConstants.StackallocByteThreshold]; + } + + EscapeString(utf8PropertyName, escapedPropertyName, firstEscapeIndexProp, _options.Encoder, out var written); + utf8PropertyName = escapedPropertyName[..written]; + } + + WriteStringByOptionsPropertyName(utf8PropertyName); + + if (propertyArray != null) + { + ArrayPool<byte>.Shared.Return(propertyArray); + } + } + + private void WriteStringByOptionsPropertyName(ReadOnlySpan<byte> utf8PropertyName) + { + if (_options.Indented) + { + WriteStringIndentedPropertyName(utf8PropertyName); + } + else + { + WriteStringMinimizedPropertyName(utf8PropertyName); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteStringMinimizedPropertyName(ReadOnlySpan<byte> escapedPropertyName) + { + Debug.Assert(escapedPropertyName.Length <= JsonConstants.MaxEscapedTokenSize); + Debug.Assert(escapedPropertyName.Length < int.MaxValue - 4); + + var maxRequired = escapedPropertyName.Length + 4; // 2 quotes, 1 colon, optionally 1 list separator + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + output[bytesWritten++] = JsonConstants.Quote; + + escapedPropertyName.CopyTo(output[bytesWritten..]); + bytesWritten += escapedPropertyName.Length; + + output[bytesWritten++] = JsonConstants.Quote; + output[bytesWritten++] = JsonConstants.Colon; + + _writer.Advance(bytesWritten); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteStringPropertyNameSection(ReadOnlySpan<byte> escapedPropertyNameSection) + { + Debug.Assert(escapedPropertyNameSection.Length <= JsonConstants.MaxEscapedTokenSize - 3); + Debug.Assert(escapedPropertyNameSection.Length < int.MaxValue - 4); + + var maxRequired = escapedPropertyNameSection.Length + 1; // Optionally, 1 list separator + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + escapedPropertyNameSection.CopyTo(output[bytesWritten..]); + bytesWritten += escapedPropertyNameSection.Length; + + _writer.Advance(bytesWritten); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteStringIndentedPropertyName(ReadOnlySpan<byte> escapedPropertyName) + { + var indent = Indentation; + Debug.Assert(indent <= _indentLength * _maxDepth); + + Debug.Assert(escapedPropertyName.Length <= JsonConstants.MaxEscapedTokenSize); + Debug.Assert(escapedPropertyName.Length < int.MaxValue - indent - 5 - _newLineLength); + + var maxRequired = indent + escapedPropertyName.Length + 5 + _newLineLength; // 2 quotes, 1 colon, 1 space, optionally 1 list separator and 1-2 bytes for new line + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + Debug.Assert(_options.SkipValidation || _tokenType != JsonTokenType.PropertyName); + + if (_tokenType != JsonTokenType.None) + { + WriteNewLine(output, ref bytesWritten); + } + + WriteIndentation(output[bytesWritten..], indent); + bytesWritten += indent; + + output[bytesWritten++] = JsonConstants.Quote; + + escapedPropertyName.CopyTo(output[bytesWritten..]); + bytesWritten += escapedPropertyName.Length; + + output[bytesWritten++] = JsonConstants.Quote; + output[bytesWritten++] = JsonConstants.Colon; + output[bytesWritten++] = JsonConstants.Space; + + _writer.Advance(bytesWritten); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void ValidateProperty(ReadOnlySpan<byte> propertyName) + { + if (propertyName.Length > JsonConstants.MaxUnescapedTokenSize) + { + throw new ArgumentException( + string.Format( + "The JSON property name of length {0} is too large and not supported.", + propertyName.Length), + nameof(propertyName)); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void ValidateProperty(ReadOnlySpan<char> propertyName) + { + if (propertyName.Length > JsonConstants.MaxCharacterTokenSize) + { + throw new ArgumentException( + string.Format( + "The JSON property name of length {0} is too large and not supported.", + propertyName.Length), + nameof(propertyName)); + } + } +} diff --git a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.String.cs b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.String.cs new file mode 100644 index 00000000000..8865d947871 --- /dev/null +++ b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.String.cs @@ -0,0 +1,402 @@ +using System.Buffers; +using System.Diagnostics; +using System.Text.Json; + +namespace HotChocolate.Text.Json; + +public sealed partial class JsonWriter +{ + /// <summary> + /// Writes the string text value (as a JSON string) as an element of a JSON array. + /// </summary> + /// <param name="value">The value to write.</param> + /// <exception cref="ArgumentException"> + /// Thrown when the specified value is too large. + /// </exception> + /// <exception cref="InvalidOperationException"> + /// Thrown if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + /// <remarks> + /// <para> + /// The value is escaped before writing.</para> + /// <para> + /// If <paramref name="value"/> is <see langword="null"/> the JSON null value is written, + /// as if <see cref="WriteNullValue"/> was called. + /// </para> + /// </remarks> + public void WriteStringValue(string? value) + { + if (value == null) + { + WriteNullValue(); + } + else + { + WriteStringValue(value.AsSpan()); + } + } + + /// <summary> + /// Writes the text value (as a JSON string) as an element of a JSON array. + /// </summary> + /// <param name="value">The value to write.</param> + /// <exception cref="ArgumentException"> + /// Thrown when the specified value is too large. + /// </exception> + /// <exception cref="InvalidOperationException"> + /// Thrown if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + /// <remarks> + /// The value is escaped before writing. + /// </remarks> + public void WriteStringValue(ReadOnlySpan<char> value) + { + WriteStringEscape(value); + + SetFlagToAddListSeparatorBeforeNextItem(); + _tokenType = JsonTokenType.String; + } + + private void WriteStringEscape(ReadOnlySpan<char> value) + { + var valueIdx = NeedsEscaping(value, _options.Encoder); + + Debug.Assert(valueIdx >= -1 && valueIdx < value.Length); + + if (valueIdx != -1) + { + WriteStringEscapeValue(value, valueIdx); + } + else + { + WriteStringByOptions(value); + } + } + + private void WriteStringByOptions(ReadOnlySpan<char> value) + { + if (_options.Indented) + { + WriteStringIndented(value); + } + else + { + WriteStringMinimized(value); + } + } + + private void WriteStringMinimized(ReadOnlySpan<char> escapedValue) + { + Debug.Assert(escapedValue.Length < (int.MaxValue / JsonConstants.MaxExpansionFactorWhileTranscoding) - 3); + + // All ASCII, 2 quotes => escapedValue.Length + 2 + // Optionally, 1 list separator, and up to 3x growth when transcoding + var maxRequired = (escapedValue.Length * JsonConstants.MaxExpansionFactorWhileTranscoding) + 3; + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + output[bytesWritten++] = JsonConstants.Quote; + + TranscodeAndWrite(escapedValue, output, ref bytesWritten); + + output[bytesWritten++] = JsonConstants.Quote; + + _writer.Advance(bytesWritten); + } + + // TODO: https://github.com/dotnet/runtime/issues/29293 + private void WriteStringIndented(ReadOnlySpan<char> escapedValue) + { + var indent = Indentation; + Debug.Assert(indent <= _indentLength * _maxDepth); + Debug.Assert(escapedValue.Length + < (int.MaxValue / JsonConstants.MaxExpansionFactorWhileTranscoding) - indent - 3 - _newLineLength); + + // All ASCII, 2 quotes => indent + escapedValue.Length + 2 + // Optionally, 1 list separator, 1-2 bytes for new line, and up to 3x growth when transcoding + var maxRequired = indent + + (escapedValue.Length * JsonConstants.MaxExpansionFactorWhileTranscoding) + + 3 + + _newLineLength; + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + if (_tokenType != JsonTokenType.PropertyName) + { + if (_tokenType != JsonTokenType.None) + { + WriteNewLine(output, ref bytesWritten); + } + + WriteIndentation(output[bytesWritten..], indent); + bytesWritten += indent; + } + + output[bytesWritten++] = JsonConstants.Quote; + + TranscodeAndWrite(escapedValue, output, ref bytesWritten); + + output[bytesWritten++] = JsonConstants.Quote; + + _writer.Advance(bytesWritten); + } + + private void WriteStringEscapeValue(ReadOnlySpan<char> value, int firstEscapeIndexVal) + { + Debug.Assert(int.MaxValue / JsonConstants.MaxExpansionFactorWhileEscaping >= value.Length); + Debug.Assert(firstEscapeIndexVal >= 0 && firstEscapeIndexVal < value.Length); + + char[]? valueArray = null; + + var length = GetMaxEscapedLength(value.Length, firstEscapeIndexVal); + + var escapedValue = length <= JsonConstants.StackallocCharThreshold + ? stackalloc char[JsonConstants.StackallocCharThreshold] + : (valueArray = ArrayPool<char>.Shared.Rent(length)); + + EscapeString(value, escapedValue, firstEscapeIndexVal, _options.Encoder, out var written); + + WriteStringByOptions(escapedValue[..written]); + + if (valueArray != null) + { + ArrayPool<char>.Shared.Return(valueArray); + } + } + + /// <summary> + /// Writes the UTF-8 text value (as a JSON string) as an element of a JSON array. + /// </summary> + /// <param name="utf8Value">The UTF-8 encoded value to be written as a JSON string element of a JSON array.</param> + /// <param name="skipEscaping">If true, the value is assumed to be already escaped and will be written directly.</param> + /// <exception cref="ArgumentException"> + /// Thrown when the specified value is too large. + /// </exception> + /// <exception cref="InvalidOperationException"> + /// Thrown if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + /// <remarks> + /// The value is escaped before writing unless skipEscaping is true. + /// </remarks> + public void WriteStringValue(ReadOnlySpan<byte> utf8Value, bool skipEscaping = false) + { + ValidateValue(utf8Value); + + if (skipEscaping) + { + // Value is already escaped and includes quotes, write directly without adding quotes + WriteStringValueRaw(utf8Value); + } + else + { + WriteStringEscape(utf8Value); + } + + SetFlagToAddListSeparatorBeforeNextItem(); + _tokenType = JsonTokenType.String; + } + + private void WriteStringValueRaw(ReadOnlySpan<byte> utf8Value) + { + if (_options.Indented) + { + WriteStringValueRawIndented(utf8Value); + } + else + { + WriteStringValueRawMinimized(utf8Value); + } + } + + private void WriteStringValueRawMinimized(ReadOnlySpan<byte> utf8Value) + { + var maxRequired = utf8Value.Length + 1; // Optionally, 1 list separator + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + utf8Value.CopyTo(output[bytesWritten..]); + bytesWritten += utf8Value.Length; + + _writer.Advance(bytesWritten); + } + + private void WriteStringValueRawIndented(ReadOnlySpan<byte> utf8Value) + { + var indent = Indentation; + Debug.Assert(indent <= _indentLength * _maxDepth); + + var maxRequired = indent + utf8Value.Length + 1 + _newLineLength; // Optionally, 1 list separator and 1-2 bytes for new line + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + if (_tokenType != JsonTokenType.PropertyName) + { + if (_tokenType != JsonTokenType.None) + { + WriteNewLine(output, ref bytesWritten); + } + + WriteIndentation(output[bytesWritten..], indent); + bytesWritten += indent; + } + + utf8Value.CopyTo(output[bytesWritten..]); + bytesWritten += utf8Value.Length; + + _writer.Advance(bytesWritten); + } + + private void WriteStringEscape(ReadOnlySpan<byte> utf8Value) + { + var valueIdx = NeedsEscaping(utf8Value, _options.Encoder); + + Debug.Assert(valueIdx >= -1 && valueIdx < utf8Value.Length); + + if (valueIdx != -1) + { + WriteStringEscapeValue(utf8Value, valueIdx); + } + else + { + WriteStringByOptions(utf8Value); + } + } + + private void WriteStringByOptions(ReadOnlySpan<byte> utf8Value) + { + if (_options.Indented) + { + WriteStringIndented(utf8Value); + } + else + { + WriteStringMinimized(utf8Value); + } + } + + // TODO: https://github.com/dotnet/runtime/issues/29293 + private void WriteStringMinimized(ReadOnlySpan<byte> escapedValue) + { + Debug.Assert(escapedValue.Length < int.MaxValue - 3); + + var minRequired = escapedValue.Length + 2; // 2 quotes + var maxRequired = minRequired + 1; // Optionally, 1 list separator + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + output[bytesWritten++] = JsonConstants.Quote; + + escapedValue.CopyTo(output[bytesWritten..]); + bytesWritten += escapedValue.Length; + + output[bytesWritten++] = JsonConstants.Quote; + + _writer.Advance(bytesWritten); + } + + // TODO: https://github.com/dotnet/runtime/issues/29293 + private void WriteStringIndented(ReadOnlySpan<byte> escapedValue) + { + var indent = Indentation; + Debug.Assert(indent <= _indentLength * _maxDepth); + Debug.Assert(escapedValue.Length < int.MaxValue - indent - 3 - _newLineLength); + + var minRequired = indent + escapedValue.Length + 2; // 2 quotes + var maxRequired = minRequired + 1 + _newLineLength; // Optionally, 1 list separator and 1-2 bytes for new line + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + if (_tokenType != JsonTokenType.PropertyName) + { + if (_tokenType != JsonTokenType.None) + { + WriteNewLine(output, ref bytesWritten); + } + + WriteIndentation(output[bytesWritten..], indent); + bytesWritten += indent; + } + + output[bytesWritten++] = JsonConstants.Quote; + + escapedValue.CopyTo(output[bytesWritten..]); + bytesWritten += escapedValue.Length; + + output[bytesWritten++] = JsonConstants.Quote; + + _writer.Advance(bytesWritten); + } + + private void WriteStringEscapeValue(ReadOnlySpan<byte> utf8Value, int firstEscapeIndexVal) + { + Debug.Assert(int.MaxValue / JsonConstants.MaxExpansionFactorWhileEscaping >= utf8Value.Length); + Debug.Assert(firstEscapeIndexVal >= 0 && firstEscapeIndexVal < utf8Value.Length); + + byte[]? valueArray = null; + + var length = GetMaxEscapedLength(utf8Value.Length, firstEscapeIndexVal); + + var escapedValue = length <= JsonConstants.StackallocByteThreshold + ? stackalloc byte[JsonConstants.StackallocByteThreshold] + : (valueArray = ArrayPool<byte>.Shared.Rent(length)); + + EscapeString(utf8Value, escapedValue, firstEscapeIndexVal, _options.Encoder, out var written); + + WriteStringByOptions(escapedValue[..written]); + + if (valueArray != null) + { + ArrayPool<byte>.Shared.Return(valueArray); + } + } + + /// <summary> + /// Writes a number as a JSON string. The string value is not escaped. + /// </summary> + /// <param name="utf8Value"></param> + internal void WriteNumberValueAsStringUnescaped(ReadOnlySpan<byte> utf8Value) + { + // The value has been validated prior to calling this method. + + WriteStringByOptions(utf8Value); + + SetFlagToAddListSeparatorBeforeNextItem(); + _tokenType = JsonTokenType.String; + } +} diff --git a/src/HotChocolate/Json/src/Json/JsonWriter.cs b/src/HotChocolate/Json/src/Json/JsonWriter.cs new file mode 100644 index 00000000000..5120fb50733 --- /dev/null +++ b/src/HotChocolate/Json/src/Json/JsonWriter.cs @@ -0,0 +1,337 @@ +using System.Buffers; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Text.Json; +using System.Text.Unicode; + +namespace HotChocolate.Text.Json; + +public sealed partial class JsonWriter +{ + private readonly JsonWriterOptions _options; + private readonly IBufferWriter<byte> _writer; + + // The highest order bit of _currentDepth is used to discern whether we are writing the first item in a list or not. + // if (_currentDepth >> 31) == 1, add a list separator before writing the item + // else, no list separator is needed since we are writing the first item. + private int _currentDepth; + private JsonTokenType _tokenType; + + // Cache indentation settings from JsonWriterOptions to avoid recomputing them in the hot path. + private readonly byte _indentByte; + private readonly int _indentLength; + + // A length of 1 will emit LF for indented writes, a length of 2 will emit CRLF. Other values are invalid. + private readonly int _newLineLength; + private readonly bool _indentedOrNotSkipValidation; + private readonly int _maxDepth; + + public JsonWriter(IBufferWriter<byte> writer, JsonWriterOptions options) + { + _writer = writer; + _options = options; + +#if NET9_0_OR_GREATER + Debug.Assert(options.NewLine is "\n" or "\r\n", "Invalid NewLine string."); + _newLineLength = options.NewLine.Length; + _indentByte = (byte)_options.IndentCharacter; + _indentLength = options.IndentSize; +#else + _newLineLength = 1; + _indentByte = (byte)' '; + _indentLength = 2; +#endif + _indentedOrNotSkipValidation = options.Indented || !options.SkipValidation; + _maxDepth = options.MaxDepth == 0 ? 64 : options.MaxDepth; + } + + /// <summary> + /// Gets the custom behavior when writing JSON using + /// the <see cref="Utf8JsonWriter"/> which indicates whether to format the output + /// while writing and whether to skip structural JSON validation or not. + /// </summary> + public JsonWriterOptions Options => _options; + + private int Indentation => CurrentDepth * _indentLength; + + internal JsonTokenType TokenType => _tokenType; + + /// <summary> + /// Tracks the recursive depth of the nested objects / arrays within the JSON text + /// written so far. This provides the depth of the current token. + /// </summary> + public int CurrentDepth => _currentDepth & JsonConstants.RemoveFlagsBitMask; + + /// <summary> + /// Writes the beginning of a JSON array. + /// </summary> + /// <exception cref="InvalidOperationException"> + /// Thrown when the depth of the JSON has exceeded the maximum depth of 1000 + /// OR if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + public void WriteStartArray() + { + WriteStart(JsonConstants.OpenBracket); + _tokenType = JsonTokenType.StartArray; + } + + /// <summary> + /// Writes the beginning of a JSON object. + /// </summary> + /// <exception cref="InvalidOperationException"> + /// Thrown when the depth of the JSON has exceeded the maximum depth of 1000 + /// OR if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + public void WriteStartObject() + { + WriteStart(JsonConstants.OpenBrace); + _tokenType = JsonTokenType.StartObject; + } + + private void WriteStart(byte token) + { + if (CurrentDepth >= _maxDepth) + { + throw new InvalidOperationException("The JSON depth is exceeds the max allowed depth."); + } + + if (_indentedOrNotSkipValidation) + { + WriteStartSlow(token); + } + else + { + WriteStartMinimized(token); + } + + _currentDepth &= JsonConstants.RemoveFlagsBitMask; + _currentDepth++; + } + + private void WriteStartMinimized(byte token) + { + const int maxRequired = 2; // 1 start token, and optionally, 1 list separator + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + output[bytesWritten++] = token; + + _writer.Advance(bytesWritten); + } + + private void WriteStartSlow(byte token) + { + Debug.Assert(_indentedOrNotSkipValidation); + WriteStartIndented(token); + } + + private void WriteStartIndented(byte token) + { + var indent = Indentation; + Debug.Assert(indent <= _indentLength * _maxDepth); + + var maxRequired = indent + 1 + 1 + _newLineLength; // 1 start token, optionally 1 list separator and 1-2 bytes for new line + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + if (_tokenType is not JsonTokenType.PropertyName and not JsonTokenType.None) + { + WriteNewLine(output, ref bytesWritten); + WriteIndentation(output[bytesWritten..], indent); + bytesWritten += indent; + } + + output[bytesWritten++] = token; + + _writer.Advance(bytesWritten); + } + + /// <summary> + /// Writes the end of a JSON array. + /// </summary> + /// <exception cref="InvalidOperationException"> + /// Thrown if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + public void WriteEndArray() + { + WriteEnd(JsonConstants.CloseBracket); + _tokenType = JsonTokenType.EndArray; + } + + /// <summary> + /// Writes the end of a JSON object. + /// </summary> + /// <exception cref="InvalidOperationException"> + /// Thrown if this would result in invalid JSON being written (while validation is enabled). + /// </exception> + public void WriteEndObject() + { + WriteEnd(JsonConstants.CloseBrace); + _tokenType = JsonTokenType.EndObject; + } + + private void WriteEnd(byte token) + { + if (_indentedOrNotSkipValidation) + { + WriteEndSlow(token); + } + else + { + WriteEndMinimized(token); + } + + SetFlagToAddListSeparatorBeforeNextItem(); + // Necessary if WriteEndX is called without a corresponding WriteStartX first. + if (CurrentDepth != 0) + { + _currentDepth--; + } + } + + private void WriteEndMinimized(byte token) + { + var output = _writer.GetSpan(1); + output[0] = token; + _writer.Advance(1); + } + + private void WriteEndSlow(byte token) + { + Debug.Assert(_indentedOrNotSkipValidation); + WriteEndIndented(token); + } + + private void WriteEndIndented(byte token) + { + // Optionally, write new line and indent. + // Decrease depth before computing indentation since the end token should be at the previous level. + var indent = (CurrentDepth > 0 ? CurrentDepth - 1 : 0) * _indentLength; + Debug.Assert(indent <= _indentLength * _maxDepth); + + var maxRequired = indent + 1 + _newLineLength; // 1 end token, optionally 1-2 bytes for new line + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_tokenType is not JsonTokenType.StartObject and not JsonTokenType.StartArray) + { + WriteNewLine(output, ref bytesWritten); + WriteIndentation(output[bytesWritten..], indent); + bytesWritten += indent; + } + + output[bytesWritten++] = token; + + _writer.Advance(bytesWritten); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void WriteNewLine(Span<byte> output, ref int bytesWritten) + { + // Write '\r\n' OR '\n', depending on the configured new line string + Debug.Assert(_newLineLength is 1 or 2, "Invalid new line length."); + if (_newLineLength == 2) + { + output[bytesWritten++] = JsonConstants.CarriageReturn; + } + output[bytesWritten++] = JsonConstants.LineFeed; + } + + private void WriteIndentation(Span<byte> buffer, int indent) + { + Debug.Assert(buffer.Length >= indent); + var indentByte = _indentByte; + + // Based on perf tests, the break-even point where vectorized Fill is faster + // than explicitly writing the space in a loop is 8. + if (indent < 8) + { + var i = 0; + while (i + 1 < indent) + { + buffer[i++] = indentByte; + buffer[i++] = indentByte; + } + + if (i < indent) + { + buffer[i] = indentByte; + } + } + else + { + buffer[..indent].Fill(indentByte); + } + } + + private void SetFlagToAddListSeparatorBeforeNextItem() + { + _currentDepth |= 1 << 31; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void TranscodeAndWrite(ReadOnlySpan<char> escapedPropertyName, Span<byte> output, ref int bytesWritten) + { + var status = ToUtf8(escapedPropertyName, output[bytesWritten..], out var written); + Debug.Assert(status == OperationStatus.Done); + bytesWritten += written; + } + + private static OperationStatus ToUtf8(ReadOnlySpan<char> source, Span<byte> destination, out int written) + { + var status = Utf8.FromUtf16(source, destination, out var charsRead, out written, replaceInvalidSequences: false, isFinalBlock: true); + Debug.Assert(status is OperationStatus.Done or OperationStatus.DestinationTooSmall or OperationStatus.InvalidData); + Debug.Assert(charsRead == source.Length || status is not OperationStatus.Done); + return status; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void ValidateValue(ReadOnlySpan<byte> value) + { + if (value.Length > JsonConstants.MaxUnescapedTokenSize) + { + throw new ArgumentException( + string.Format( + "The JSON value of length {0} is too large and not supported.", + value.Length), + nameof(value)); + } + } + + /// <summary> + /// Writes raw UTF-8 JSON bytes directly to the output without any validation or escaping. + /// </summary> + /// <param name="utf8Json">The raw UTF-8 encoded JSON to write.</param> + public void WriteRawValue(ReadOnlySpan<byte> utf8Json) + { + var maxRequired = utf8Json.Length + 1; // Optionally, 1 list separator + var bytesWritten = 0; + + var output = _writer.GetSpan(maxRequired); + + if (_currentDepth < 0) + { + output[bytesWritten++] = JsonConstants.Comma; + } + + utf8Json.CopyTo(output[bytesWritten..]); + bytesWritten += utf8Json.Length; + + _writer.Advance(bytesWritten); + + SetFlagToAddListSeparatorBeforeNextItem(); + } +} diff --git a/src/HotChocolate/Json/test/Json.Tests/JsonWriterTests.cs b/src/HotChocolate/Json/test/Json.Tests/JsonWriterTests.cs new file mode 100644 index 00000000000..60731bce8f5 --- /dev/null +++ b/src/HotChocolate/Json/test/Json.Tests/JsonWriterTests.cs @@ -0,0 +1,883 @@ +using System.Buffers; +using System.Text; +using System.Text.Json; + +namespace HotChocolate.Text.Json; + +public class JsonWriterTests +{ + [Fact] + public void WriteEmptyObject_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("{}", result); + } + + [Fact] + public void WriteEmptyObject_Indented() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("{}", result); + } + + [Fact] + public void WriteEmptyArray_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[]", result); + } + + [Fact] + public void WriteEmptyArray_Indented() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[]", result); + } + + [Fact] + public void WriteNullValue_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteNullValue(); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[null]", result); + } + + [Fact] + public void WriteBooleanTrue_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteBooleanValue(true); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[true]", result); + } + + [Fact] + public void WriteBooleanFalse_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteBooleanValue(false); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[false]", result); + } + + [Fact] + public void WriteStringValue_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStringValue("hello"); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[\"hello\"]", result); + } + + [Fact] + public void WriteStringValue_WithEscaping_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStringValue("hello\nworld"); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[\"hello\\nworld\"]", result); + } + + [Fact] + public void WriteStringValue_Utf8_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStringValue("hello"u8); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[\"hello\"]", result); + } + + [Fact] + public void WriteNumberValue_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteNumberValue("42"u8); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[42]", result); + } + + [Fact] + public void WritePropertyName_String_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WritePropertyName("name"); + writer.WriteStringValue("value"); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("{\"name\":\"value\"}", result); + } + + [Fact] + public void WritePropertyName_Utf8_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WritePropertyName("name"u8); + writer.WriteStringValue("value"); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("{\"name\":\"value\"}", result); + } + + [Fact] + public void WriteMultipleProperties_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WritePropertyName("name"); + writer.WriteStringValue("John"); + writer.WritePropertyName("age"); + writer.WriteNumberValue("30"u8); + writer.WritePropertyName("active"); + writer.WriteBooleanValue(true); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("{\"name\":\"John\",\"age\":30,\"active\":true}", result); + } + + [Fact] + public void WriteMultipleProperties_Indented() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WritePropertyName("name"); + writer.WriteStringValue("John"); + writer.WritePropertyName("age"); + writer.WriteNumberValue("30"u8); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + const string expected = """ + { + "name": "John", + "age": 30 + } + """; + Assert.Equal(expected, result); + } + + [Fact] + public void WriteArrayWithMultipleValues_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStringValue("a"); + writer.WriteStringValue("b"); + writer.WriteStringValue("c"); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[\"a\",\"b\",\"c\"]", result); + } + + [Fact] + public void WriteArrayWithMultipleValues_Indented() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStringValue("a"); + writer.WriteStringValue("b"); + writer.WriteStringValue("c"); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + const string expected = """ + [ + "a", + "b", + "c" + ] + """; + Assert.Equal(expected, result); + } + + [Fact] + public void WriteNestedObject_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WritePropertyName("person"); + writer.WriteStartObject(); + writer.WritePropertyName("name"); + writer.WriteStringValue("John"); + writer.WriteEndObject(); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("{\"person\":{\"name\":\"John\"}}", result); + } + + [Fact] + public void WriteNestedObject_Indented() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WritePropertyName("person"); + writer.WriteStartObject(); + writer.WritePropertyName("name"); + writer.WriteStringValue("John"); + writer.WriteEndObject(); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + const string expected = """ + { + "person": { + "name": "John" + } + } + """; + Assert.Equal(expected, result); + } + + [Fact] + public void WriteNestedArray_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStartArray(); + writer.WriteNumberValue("1"u8); + writer.WriteNumberValue("2"u8); + writer.WriteEndArray(); + writer.WriteStartArray(); + writer.WriteNumberValue("3"u8); + writer.WriteNumberValue("4"u8); + writer.WriteEndArray(); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[[1,2],[3,4]]", result); + } + + [Fact] + public void WriteNestedArray_Indented() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStartArray(); + writer.WriteNumberValue("1"u8); + writer.WriteNumberValue("2"u8); + writer.WriteEndArray(); + writer.WriteStartArray(); + writer.WriteNumberValue("3"u8); + writer.WriteNumberValue("4"u8); + writer.WriteEndArray(); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + const string expected = """ + [ + [ + 1, + 2 + ], + [ + 3, + 4 + ] + ] + """; + Assert.Equal(expected, result); + } + + [Fact] + public void WriteArrayInObject_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WritePropertyName("items"); + writer.WriteStartArray(); + writer.WriteNumberValue("1"u8); + writer.WriteNumberValue("2"u8); + writer.WriteEndArray(); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("{\"items\":[1,2]}", result); + } + + [Fact] + public void WriteArrayInObject_Indented() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WritePropertyName("items"); + writer.WriteStartArray(); + writer.WriteNumberValue("1"u8); + writer.WriteNumberValue("2"u8); + writer.WriteEndArray(); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + const string expected = """ + { + "items": [ + 1, + 2 + ] + } + """; + Assert.Equal(expected, result); + } + + [Fact] + public void WriteObjectInArray_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStartObject(); + writer.WritePropertyName("id"); + writer.WriteNumberValue("1"u8); + writer.WriteEndObject(); + writer.WriteStartObject(); + writer.WritePropertyName("id"); + writer.WriteNumberValue("2"u8); + writer.WriteEndObject(); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[{\"id\":1},{\"id\":2}]", result); + } + + [Fact] + public void WriteObjectInArray_Indented() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStartObject(); + writer.WritePropertyName("id"); + writer.WriteNumberValue("1"u8); + writer.WriteEndObject(); + writer.WriteStartObject(); + writer.WritePropertyName("id"); + writer.WriteNumberValue("2"u8); + writer.WriteEndObject(); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + const string expected = """ + [ + { + "id": 1 + }, + { + "id": 2 + } + ] + """; + Assert.Equal(expected, result); + } + + [Fact] + public void CurrentDepth_TracksCorrectly() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act & assert + Assert.Equal(0, writer.CurrentDepth); + + writer.WriteStartObject(); + Assert.Equal(1, writer.CurrentDepth); + + writer.WritePropertyName("nested"); + writer.WriteStartObject(); + Assert.Equal(2, writer.CurrentDepth); + + writer.WritePropertyName("array"); + writer.WriteStartArray(); + Assert.Equal(3, writer.CurrentDepth); + + writer.WriteEndArray(); + Assert.Equal(2, writer.CurrentDepth); + + writer.WriteEndObject(); + Assert.Equal(1, writer.CurrentDepth); + + writer.WriteEndObject(); + Assert.Equal(0, writer.CurrentDepth); + } + + [Fact] + public void WriteStringValue_Null_WritesNullLiteral() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStringValue(null); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[null]", result); + } + + [Fact] + public void WriteStringValue_WithSpecialCharacters() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStringValue("tab\there"); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[\"tab\\there\"]", result); + } + + [Fact] + public void WriteStringValue_WithCarriageReturn() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStringValue("line1\r\nline2"); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[\"line1\\r\\nline2\"]", result); + } + + [Fact] + public void WriteStringValue_WithBackslash() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStringValue("path\\to\\file"); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[\"path\\\\to\\\\file\"]", result); + } + + [Fact] + public void WriteMixedArray_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStringValue("text"); + writer.WriteNumberValue("42"u8); + writer.WriteBooleanValue(true); + writer.WriteNullValue(); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[\"text\",42,true,null]", result); + } + + [Fact] + public void WriteMixedArray_Indented() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartArray(); + writer.WriteStringValue("text"); + writer.WriteNumberValue("42"u8); + writer.WriteBooleanValue(true); + writer.WriteNullValue(); + writer.WriteEndArray(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + const string expected = """ + [ + "text", + 42, + true, + null + ] + """; + Assert.Equal(expected, result); + } + + [Fact] + public void WriteComplexDocument_Minimized() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WritePropertyName("data"); + writer.WriteStartObject(); + writer.WritePropertyName("users"); + writer.WriteStartArray(); + writer.WriteStartObject(); + writer.WritePropertyName("id"); + writer.WriteNumberValue("1"u8); + writer.WritePropertyName("name"); + writer.WriteStringValue("Alice"); + writer.WriteEndObject(); + writer.WriteStartObject(); + writer.WritePropertyName("id"); + writer.WriteNumberValue("2"u8); + writer.WritePropertyName("name"); + writer.WriteStringValue("Bob"); + writer.WriteEndObject(); + writer.WriteEndArray(); + writer.WriteEndObject(); + writer.WritePropertyName("errors"); + writer.WriteNullValue(); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("{\"data\":{\"users\":[{\"id\":1,\"name\":\"Alice\"},{\"id\":2,\"name\":\"Bob\"}]},\"errors\":null}", result); + } + + [Fact] + public void WriteComplexDocument_Indented() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WritePropertyName("data"); + writer.WriteStartObject(); + writer.WritePropertyName("users"); + writer.WriteStartArray(); + writer.WriteStartObject(); + writer.WritePropertyName("id"); + writer.WriteNumberValue("1"u8); + writer.WritePropertyName("name"); + writer.WriteStringValue("Alice"); + writer.WriteEndObject(); + writer.WriteEndArray(); + writer.WriteEndObject(); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + const string expected = """ + { + "data": { + "users": [ + { + "id": 1, + "name": "Alice" + } + ] + } + } + """; + Assert.Equal(expected, result); + } + + [Fact] + public void WritePropertyName_WithEscaping() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act + writer.WriteStartObject(); + writer.WritePropertyName("special\nname"); + writer.WriteStringValue("value"); + writer.WriteEndObject(); + + // assert + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("{\"special\\nname\":\"value\"}", result); + } + + [Fact] + public void Options_ReturnsConfiguredOptions() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = true, MaxDepth = 100 }; + var writer = new JsonWriter(buffer, options); + + // act + var returnedOptions = writer.Options; + + // assert + Assert.True(returnedOptions.Indented); + Assert.Equal(100, returnedOptions.MaxDepth); + } + + [Fact] + public void WriteStringValue_Utf8_SkipEscaping_WritesPreEscapedContent() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act - write a pre-escaped value with quotes already included (like from JsonMarshal.GetRawUtf8Value) + writer.WriteStartArray(); + writer.WriteStringValue("\"already\\nescaped\""u8, skipEscaping: true); + writer.WriteEndArray(); + + // assert - should not double-quote the value + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[\"already\\nescaped\"]", result); + } + + [Fact] + public void WriteStringValue_Utf8_WithoutSkipEscaping_EscapesContent() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act - write a value that contains a literal newline character (0x0A) + writer.WriteStartArray(); + writer.WriteStringValue("line1\nline2"u8, skipEscaping: false); + writer.WriteEndArray(); + + // assert - the newline should be escaped to \n + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[\"line1\\nline2\"]", result); + } + + [Fact] + public void WriteStringValue_Utf8_SkipEscaping_Default_IsFalse() + { + // arrange + var buffer = new ArrayBufferWriter<byte>(); + var options = new JsonWriterOptions { Indented = false, SkipValidation = true }; + var writer = new JsonWriter(buffer, options); + + // act - call without skipEscaping parameter (should default to false and escape) + writer.WriteStartArray(); + writer.WriteStringValue("line1\nline2"u8); + writer.WriteEndArray(); + + // assert - the newline should be escaped (proving default is false) + var result = Encoding.UTF8.GetString(buffer.WrittenSpan); + Assert.Equal("[\"line1\\nline2\"]", result); + } +} diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonWriter.cs b/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonWriter.cs deleted file mode 100644 index 0aa349cbbc9..00000000000 --- a/src/HotChocolate/Utilities/src/Utilities.Buffers/JsonWriter.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace HotChocolate.Buffers; - -public class JsonWriter -{ - -} From e34296c5cf255f6e1b2138c99fd0f4c0e441c165 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 9 Jan 2026 23:14:14 +0100 Subject: [PATCH 080/144] Refactor scalar type coercion error handling and update tests - Updated `CreateCoerceInputLiteralError` method to accept nullable `IValueNode`. - Modified `Scalar_Cannot_CoerceInputLiteral` to handle null values gracefully. - Removed obsolete tests related to setting result extension data with delegates. - Updated tests for scalar types to assert `LeafCoercionException` instead of `ArgumentNullException`. - Adjusted error messages in tests for better clarity. - Refactored `CompositeResultDocument` and related classes to use new JSON writer. - Added dynamic code analysis attributes for JSON serialization in commands for compatibility with .NET 9.0 or greater. --- .../DefaultWebSocketPayloadFormatter.cs | 28 +- .../Formatters/IWebSocketPayloadFormatter.cs | 26 +- .../ApolloSubscriptionProtocolHandler.cs | 34 +- .../GraphQLOverWebSocketProtocolHandler.cs | 23 +- .../Protocols/MessageUtilities.cs | 14 +- .../Subscriptions/WebSocketConnection.cs | 2 +- .../JsonResultFormatter.cs | 101 +----- .../JsonResultFormatterOptions.cs | 4 +- .../Execution/IRawJsonFormatter.cs | 2 +- .../Execution/IResultDataJsonFormatter.cs | 3 +- .../JsonValueFormatter.Utf8JsonWriter.cs | 339 ------------------ ...er.JsonWriter.cs => JsonValueFormatter.cs} | 7 +- .../src/Types/Execution/NeedsFormatting.cs | 28 +- .../Processing/MiddlewareContext.Global.cs | 16 +- .../Processing/ValueCompletion.List.cs | 8 + .../Resolvers/IOperationResultBuilder.cs | 43 --- .../Types/Text/Json/ResultDocument.WriteTo.cs | 23 +- .../Core/src/Types/Text/Json/ResultElement.cs | 3 +- .../src/Types/Types/Scalars/ByteArrayType.cs | 21 +- .../src/Types/Types/Scalars/FloatTypeBase.cs | 2 +- .../Types/Types/Scalars/IntegerTypeBase.cs | 4 +- .../src/Types/Types/Scalars/ScalarType.cs | 14 +- .../src/Types/Types/Scalars/ScalarType~2.cs | 2 +- .../Core/src/Types/Utilities/ThrowHelper.cs | 4 +- .../Execution.Tests/MiddlewareContextTests.cs | 113 ------ .../Types/Scalars/ByteArrayTypeTests.cs | 2 +- .../Types/Scalars/ByteTypeTests.cs | 8 +- .../Types/Scalars/DateTimeTypeTests.cs | 2 +- .../Types/Scalars/DateTypeTests.cs | 52 --- .../Types/Scalars/DecimalTypeTests.cs | 15 +- .../Types.Tests/Types/Scalars/UrlTypeTests.cs | 21 +- .../Text/Json/CompositeResultDocument.Text.cs | 1 + .../CompositeResultDocument.TryGetProperty.cs | 1 + .../Json/CompositeResultDocument.WriteTo.cs | 22 +- .../Text/Json/CompositeResultElement.cs | 8 +- .../Text/Json/SourceResultDocument.Parse.cs | 1 + .../Text/Json/SourceResultDocument.Text.cs | 1 + .../SourceResultDocument.TryGetProperty.cs | 1 + .../Text/Json/CompositeResultDocumentTests.cs | 4 +- .../Commands/Api/ApiCommand.cs | 8 + .../Commands/ApiKeys/ApiKeyCommand.cs | 8 + .../Commands/Client/ClientCommand.cs | 7 + .../Environments/EnvironmentCommand.cs | 8 + .../Commands/Fusion/FusionCommand.cs | 8 + .../Commands/Fusion/FusionDownloadCommand.cs | 7 + .../Commands/Fusion/FusionPublishCommand.cs | 7 + .../Commands/Fusion/FusionRunCommand.cs | 9 +- .../Commands/Fusion/FusionSettingsCommand.cs | 8 + .../Fusion/FusionSettingsSetCommand.cs | 7 + .../Commands/Fusion/FusionValidateCommand.cs | 7 + .../Commands/Launch/LaunchCommand.cs | 7 + .../Commands/Mock/MockCommand.cs | 8 + .../PersonalAccessTokenCommand.cs | 8 + .../Commands/Schema/SchemaCommand.cs | 8 + .../Commands/Stages/StageCommand.cs | 8 + .../Commands/Workspace/WorkspaceCommand.cs | 8 + .../Extensions/NitroCloudCommandExtensions.cs | 7 + .../CommandLine/src/CommandLine/Program.cs | 34 +- .../InMemoryClientTests.cs | 7 +- 59 files changed, 343 insertions(+), 839 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.Utf8JsonWriter.cs rename src/HotChocolate/Core/src/Execution.Abstractions/Execution/{JsonValueFormatter.JsonWriter.cs => JsonValueFormatter.cs} (98%) diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs index 0516575b22c..f50729bf853 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs @@ -1,5 +1,7 @@ +using System.Buffers; using System.Text.Json; -using HotChocolate.Transport.Formatters; +using HotChocolate.Text.Json; +using static HotChocolate.Execution.JsonValueFormatter; namespace HotChocolate.AspNetCore.Formatters; @@ -9,29 +11,35 @@ namespace HotChocolate.AspNetCore.Formatters; public class DefaultWebSocketPayloadFormatter(WebSocketPayloadFormatterOptions options = default) : IWebSocketPayloadFormatter { - private readonly JsonResultFormatter _jsonFormatter = new(options.Json); + private readonly JsonWriterOptions _writerOptions = options.Json.CreateWriterOptions(); + private readonly JsonSerializerOptions _serializerOptions = options.Json.CreateSerializerOptions(); + private readonly JsonNullIgnoreCondition _nullIgnoreCondition = options.Json.NullIgnoreCondition; /// <inheritdoc /> - public void Format(OperationResult result, Utf8JsonWriter jsonWriter) + public void Format(OperationResult result, IBufferWriter<byte> bufferWriter) { - _jsonFormatter.Format(result, jsonWriter); + var writer = new JsonWriter(bufferWriter, _writerOptions); + WriteValue(writer, result, _serializerOptions, _nullIgnoreCondition); } /// <inheritdoc /> - public void Format(IError error, Utf8JsonWriter jsonWriter) + public void Format(IError error, IBufferWriter<byte> bufferWriter) { - _jsonFormatter.FormatError(error, jsonWriter); + var writer = new JsonWriter(bufferWriter, _writerOptions); + WriteError(writer, error, _serializerOptions, _nullIgnoreCondition); } /// <inheritdoc /> - public void Format(IReadOnlyList<IError> errors, Utf8JsonWriter jsonWriter) + public void Format(IReadOnlyList<IError> errors, IBufferWriter<byte> bufferWriter) { - _jsonFormatter.FormatErrors(errors, jsonWriter); + var writer = new JsonWriter(bufferWriter, _writerOptions); + WriteErrors(writer, errors, _serializerOptions, _nullIgnoreCondition); } /// <inheritdoc /> - public void Format(IReadOnlyDictionary<string, object?> extensions, Utf8JsonWriter jsonWriter) + public void Format(IReadOnlyDictionary<string, object?> extensions, IBufferWriter<byte> bufferWriter) { - _jsonFormatter.FormatDictionary(extensions, jsonWriter); + var writer = new JsonWriter(bufferWriter, _writerOptions); + WriteDictionary(writer, extensions, _serializerOptions, _nullIgnoreCondition); } } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/IWebSocketPayloadFormatter.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/IWebSocketPayloadFormatter.cs index 367939e0f69..6f3bb56abf0 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/IWebSocketPayloadFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/IWebSocketPayloadFormatter.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Buffers; namespace HotChocolate.AspNetCore.Formatters; @@ -13,10 +13,10 @@ public interface IWebSocketPayloadFormatter /// <param name="result"> /// The GraphQL operation result. /// </param> - /// <param name="jsonWriter"> - /// The JSON writer that is used to write the payload. + /// <param name="writer"> + /// The buffer writer that is used to write the payload. /// </param> - void Format(OperationResult result, Utf8JsonWriter jsonWriter); + void Format(OperationResult result, IBufferWriter<byte> writer); /// <summary> /// Formats the <paramref name="error"/> into a WebSocket payload. @@ -24,10 +24,10 @@ public interface IWebSocketPayloadFormatter /// <param name="error"> /// The GraphQL execution error. /// </param> - /// <param name="jsonWriter"> - /// The JSON writer that is used to write the error. + /// <param name="writer"> + /// The buffer writer that is used to write the error. /// </param> - void Format(IError error, Utf8JsonWriter jsonWriter); + void Format(IError error, IBufferWriter<byte> writer); /// <summary> /// Formats the <paramref name="errors"/> into a WebSocket payload. @@ -35,10 +35,10 @@ public interface IWebSocketPayloadFormatter /// <param name="errors"> /// The GraphQL execution errors. /// </param> - /// <param name="jsonWriter"> - /// The JSON writer that is used to write the errors. + /// <param name="writer"> + /// The buffer writer that is used to write the errors. /// </param> - void Format(IReadOnlyList<IError> errors, Utf8JsonWriter jsonWriter); + void Format(IReadOnlyList<IError> errors, IBufferWriter<byte> writer); /// <summary> /// Formats the <paramref name="extensions"/> into a WebSocket payload. @@ -46,8 +46,8 @@ public interface IWebSocketPayloadFormatter /// <param name="extensions"> /// The GraphQL extensions. /// </param> - /// <param name="jsonWriter"> - /// The JSON writer that is used to write the extensions. + /// <param name="writer"> + /// The buffer writer that is used to write the extensions. /// </param> - void Format(IReadOnlyDictionary<string, object?> extensions, Utf8JsonWriter jsonWriter); + void Format(IReadOnlyDictionary<string, object?> extensions, IBufferWriter<byte> writer); } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs index 0b507642457..b2e3ac60836 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/Apollo/ApolloSubscriptionProtocolHandler.cs @@ -5,6 +5,7 @@ using HotChocolate.AspNetCore.Formatters; using HotChocolate.Buffers; using HotChocolate.Language; +using HotChocolate.Text.Json; using static HotChocolate.AspNetCore.Properties.AspNetCorePipelineResources; using static HotChocolate.AspNetCore.Subscriptions.Protocols.Apollo.MessageProperties; using static HotChocolate.AspNetCore.Subscriptions.Protocols.MessageUtilities; @@ -241,14 +242,15 @@ public async ValueTask SendResultMessageAsync( CancellationToken cancellationToken) { using var arrayWriter = new PooledArrayWriter(); - await using var jsonWriter = new Utf8JsonWriter(arrayWriter, WriterOptions); + var jsonWriter = new JsonWriter(arrayWriter, WriterOptions); jsonWriter.WriteStartObject(); - jsonWriter.WriteString(Id, operationSessionId); - jsonWriter.WriteString(MessageProperties.Type, Utf8Messages.Data); + jsonWriter.WritePropertyName(Id); + jsonWriter.WriteStringValue(operationSessionId); + jsonWriter.WritePropertyName(MessageProperties.Type); + jsonWriter.WriteStringValue(Utf8Messages.Data); jsonWriter.WritePropertyName(Payload); - _formatter.Format(result, jsonWriter); + _formatter.Format(result, arrayWriter); jsonWriter.WriteEndObject(); - await jsonWriter.FlushAsync(cancellationToken); await session.Connection.SendAsync(arrayWriter.WrittenMemory, cancellationToken); } @@ -259,14 +261,15 @@ public async ValueTask SendErrorMessageAsync( CancellationToken cancellationToken) { using var arrayWriter = new PooledArrayWriter(); - await using var jsonWriter = new Utf8JsonWriter(arrayWriter, WriterOptions); + var jsonWriter = new JsonWriter(arrayWriter, WriterOptions); jsonWriter.WriteStartObject(); - jsonWriter.WriteString(Id, operationSessionId); - jsonWriter.WriteString(MessageProperties.Type, Utf8Messages.Error); + jsonWriter.WritePropertyName(Id); + jsonWriter.WriteStringValue(operationSessionId); + jsonWriter.WritePropertyName(MessageProperties.Type); + jsonWriter.WriteStringValue(Utf8Messages.Error); jsonWriter.WritePropertyName(Payload); - _formatter.Format(errors[0], jsonWriter); + _formatter.Format(errors[0], arrayWriter); jsonWriter.WriteEndObject(); - await jsonWriter.FlushAsync(cancellationToken); await session.Connection.SendAsync(arrayWriter.WrittenMemory, cancellationToken); } @@ -297,13 +300,15 @@ private async ValueTask SendConnectionRejectMessage( CancellationToken cancellationToken) { using var arrayWriter = new PooledArrayWriter(); - await using var jsonWriter = new Utf8JsonWriter(arrayWriter, WriterOptions); + var jsonWriter = new JsonWriter(arrayWriter, WriterOptions); jsonWriter.WriteStartObject(); - jsonWriter.WriteString(MessageProperties.Type, Utf8Messages.ConnectionError); + jsonWriter.WritePropertyName(MessageProperties.Type); + jsonWriter.WriteStringValue(Utf8Messages.ConnectionError); jsonWriter.WritePropertyName(Payload); jsonWriter.WriteStartObject(); - jsonWriter.WriteString(Message, message); + jsonWriter.WritePropertyName(Message); + jsonWriter.WriteStringValue(message); jsonWriter.WritePropertyName(MessageProperties.Extensions); if (extensions is null) @@ -312,12 +317,11 @@ private async ValueTask SendConnectionRejectMessage( } else { - _formatter.Format(extensions, jsonWriter); + _formatter.Format(extensions, arrayWriter); } jsonWriter.WriteEndObject(); jsonWriter.WriteEndObject(); - await jsonWriter.FlushAsync(cancellationToken); await session.Connection.SendAsync(arrayWriter.WrittenMemory, cancellationToken); } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs index daee7f50eaf..679599aa778 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/GraphQLOverWebSocket/GraphQLOverWebSocketProtocolHandler.cs @@ -5,6 +5,7 @@ using HotChocolate.AspNetCore.Formatters; using HotChocolate.Buffers; using HotChocolate.Language; +using HotChocolate.Text.Json; using static HotChocolate.AspNetCore.Subscriptions.Protocols.GraphQLOverWebSocket.MessageProperties; using static HotChocolate.AspNetCore.Subscriptions.Protocols.MessageUtilities; using static HotChocolate.Language.Utf8GraphQLRequestParser; @@ -213,14 +214,15 @@ public async ValueTask SendResultMessageAsync( CancellationToken cancellationToken) { using var arrayWriter = new PooledArrayWriter(); - await using var jsonWriter = new Utf8JsonWriter(arrayWriter, WriterOptions); + var jsonWriter = new JsonWriter(arrayWriter, WriterOptions); jsonWriter.WriteStartObject(); - jsonWriter.WriteString(Id, operationSessionId); - jsonWriter.WriteString(MessageProperties.Type, Utf8Messages.Next); + jsonWriter.WritePropertyName(Id); + jsonWriter.WriteStringValue(operationSessionId); + jsonWriter.WritePropertyName(MessageProperties.Type); + jsonWriter.WriteStringValue(Utf8Messages.Next); jsonWriter.WritePropertyName(Payload); - _formatter.Format(result, jsonWriter); + _formatter.Format(result, arrayWriter); jsonWriter.WriteEndObject(); - await jsonWriter.FlushAsync(cancellationToken); await session.Connection.SendAsync(arrayWriter.WrittenMemory, cancellationToken); } @@ -231,14 +233,15 @@ public async ValueTask SendErrorMessageAsync( CancellationToken cancellationToken) { using var arrayWriter = new PooledArrayWriter(); - await using var jsonWriter = new Utf8JsonWriter(arrayWriter, WriterOptions); + var jsonWriter = new JsonWriter(arrayWriter, WriterOptions); jsonWriter.WriteStartObject(); - jsonWriter.WriteString(Id, operationSessionId); - jsonWriter.WriteString(MessageProperties.Type, Utf8Messages.Error); + jsonWriter.WritePropertyName(Id); + jsonWriter.WriteStringValue(operationSessionId); + jsonWriter.WritePropertyName(MessageProperties.Type); + jsonWriter.WriteStringValue(Utf8Messages.Error); jsonWriter.WritePropertyName(Payload); - _formatter.Format(errors, jsonWriter); + _formatter.Format(errors, arrayWriter); jsonWriter.WriteEndObject(); - await jsonWriter.FlushAsync(cancellationToken); await session.Connection.SendAsync(arrayWriter.WrittenMemory, cancellationToken); } diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/MessageUtilities.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/MessageUtilities.cs index 02957633f05..505751c899c 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/MessageUtilities.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/MessageUtilities.cs @@ -2,6 +2,7 @@ using HotChocolate.AspNetCore.Formatters; using HotChocolate.AspNetCore.Subscriptions.Protocols.GraphQLOverWebSocket; using HotChocolate.Buffers; +using HotChocolate.Text.Json; namespace HotChocolate.AspNetCore.Subscriptions.Protocols; @@ -20,24 +21,25 @@ public static void SerializeMessage( IReadOnlyDictionary<string, object?>? payload = null, string? id = null) { - using var jsonWriter = new Utf8JsonWriter(pooledArrayWriter, WriterOptions); + var jsonWriter = new JsonWriter(pooledArrayWriter, WriterOptions); jsonWriter.WriteStartObject(); if (id is not null) { - jsonWriter.WriteString("id", id); + jsonWriter.WritePropertyName("id"u8); + jsonWriter.WriteStringValue(id); } - jsonWriter.WriteString("type", type); + jsonWriter.WritePropertyName("type"u8); + jsonWriter.WriteStringValue(type); if (payload is not null) { - jsonWriter.WritePropertyName("payload"); - formatter.Format(payload, jsonWriter); + jsonWriter.WritePropertyName("payload"u8); + formatter.Format(payload, pooledArrayWriter); } jsonWriter.WriteEndObject(); - jsonWriter.Flush(); } public static bool TryGetPayload(JsonElement root, out JsonElement payload) diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/WebSocketConnection.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/WebSocketConnection.cs index fc4252ffe9e..f6d0dedd12e 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/WebSocketConnection.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/WebSocketConnection.cs @@ -80,7 +80,7 @@ public ValueTask SendAsync( return default; } - return webSocket.SendAsync(message, Text, true, cancellationToken); + return webSocket.SendAsync(message, WebSocketMessageType.Text, true, cancellationToken); } public async Task<bool> ReadMessageAsync( diff --git a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs index 7d03081e878..ee51b909de8 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs @@ -69,19 +69,6 @@ public ValueTask FormatAsync( }; } - /// <summary> - /// Formats a query result as JSON string. - /// </summary> - /// <param name="result"> - /// The query result. - /// </param> - /// <param name="writer"> - /// The JSON writer. - /// </param> - /// <exception cref="ArgumentNullException"> - /// <paramref name="result"/> is <c>null</c>. - /// <paramref name="writer"/> is <c>null</c>. - /// </exception> public void Format(OperationResult result, IBufferWriter<byte> writer) { ArgumentNullException.ThrowIfNull(result); @@ -90,84 +77,6 @@ public void Format(OperationResult result, IBufferWriter<byte> writer) FormatInternal(result, writer); } - /// <summary> - /// Formats a query result as JSON string. - /// </summary> - /// <param name="result"> - /// The query result. - /// </param> - /// <param name="writer"> - /// The JSON writer. - /// </param> - /// <exception cref="ArgumentNullException"> - /// <paramref name="result"/> is <c>null</c>. - /// <paramref name="writer"/> is <c>null</c>. - /// </exception> - public void Format(OperationResult result, Utf8JsonWriter writer) - { - ArgumentNullException.ThrowIfNull(result); - ArgumentNullException.ThrowIfNull(writer); - - WriteResult(writer, result); - } - - /// <summary> - /// Formats a <see cref="IError"/> as JSON string. - /// </summary> - /// <param name="error"> - /// The error object. - /// </param> - /// <param name="writer"> - /// The JSON writer. - /// </param> - /// <exception cref="ArgumentNullException"> - /// <paramref name="error"/> is <c>null</c>. - /// <paramref name="writer"/> is <c>null</c>. - /// </exception> - public void FormatError(IError error, Utf8JsonWriter writer) - { - ArgumentNullException.ThrowIfNull(error); - ArgumentNullException.ThrowIfNull(writer); - - WriteError(writer, error, _serializerOptions, _nullIgnoreCondition); - } - - /// <summary> - /// Formats a list of <see cref="IError"/>s as JSON array string. - /// </summary> - /// <param name="errors"> - /// The list of error objects. - /// </param> - /// <param name="writer"> - /// The JSON writer. - /// </param> - /// <exception cref="ArgumentNullException"> - /// <paramref name="errors"/> is <c>null</c>. - /// <paramref name="writer"/> is <c>null</c>. - /// </exception> - public void FormatErrors(IReadOnlyList<IError> errors, Utf8JsonWriter writer) - { - ArgumentNullException.ThrowIfNull(errors); - ArgumentNullException.ThrowIfNull(writer); - - writer.WriteStartArray(); - - for (var i = 0; i < errors.Count; i++) - { - WriteError(writer, errors[i], _serializerOptions, _nullIgnoreCondition); - } - - writer.WriteEndArray(); - } - - public void FormatDictionary(IReadOnlyDictionary<string, object?> dictionary, Utf8JsonWriter writer) - { - ArgumentNullException.ThrowIfNull(dictionary); - ArgumentNullException.ThrowIfNull(writer); - - WriteDictionary(writer, dictionary, _serializerOptions, _nullIgnoreCondition); - } - public ValueTask FormatAsync( OperationResult result, PipeWriter writer, @@ -280,9 +189,7 @@ private void WriteResult(JsonWriter writer, OperationResult result) writer.WriteEndObject(); } - private static void WriteHasNext( - JsonWriter writer, - OperationResult result) + private static void WriteHasNext(JsonWriter writer, OperationResult result) { if (result.HasNext.HasValue) { @@ -291,9 +198,7 @@ private static void WriteHasNext( } } - private void WriteData( - JsonWriter writer, - OperationResult result) + private void WriteData(JsonWriter writer, OperationResult result) { if (!result.IsDataSet) { @@ -308,7 +213,6 @@ private void WriteData( } writer.WritePropertyName(Data); - WriteValue(writer, result.Data, _serializerOptions, _nullIgnoreCondition); } @@ -317,7 +221,6 @@ private void WriteErrors(JsonWriter writer, IReadOnlyList<IError>? errors) if (errors is { Count: > 0 }) { writer.WritePropertyName(Errors); - writer.WriteStartArray(); for (var i = 0; i < errors.Count; i++) diff --git a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatterOptions.cs b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatterOptions.cs index 7a7e0e3772d..f417ecd3e74 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatterOptions.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatterOptions.cs @@ -30,14 +30,14 @@ public struct JsonResultFormatterOptions /// </summary> public JavaScriptEncoder? Encoder { get; set; } - internal JsonWriterOptions CreateWriterOptions() + public JsonWriterOptions CreateWriterOptions() => new() { Indented = Indented, Encoder = Encoder ?? JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; - internal readonly JsonSerializerOptions CreateSerializerOptions() + public readonly JsonSerializerOptions CreateSerializerOptions() => new(Web) { WriteIndented = Indented, diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs index 6f7861e73d2..bb1c3e413f1 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs @@ -25,5 +25,5 @@ public interface IRawJsonFormatter void WriteTo( OperationResult result, IBufferWriter<byte> writer, - JsonWriterOptions options); + JsonWriterOptions options = default); } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IResultDataJsonFormatter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IResultDataJsonFormatter.cs index fad9ffe251d..bc15e8ac0bf 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IResultDataJsonFormatter.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IResultDataJsonFormatter.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Text.Json; namespace HotChocolate.Execution; @@ -21,7 +22,7 @@ public interface IResultDataJsonFormatter /// The null ignore condition. /// </param> void WriteTo( - Utf8JsonWriter writer, + JsonWriter writer, JsonSerializerOptions? options = null, JsonNullIgnoreCondition nullIgnoreCondition = JsonNullIgnoreCondition.None); } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.Utf8JsonWriter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.Utf8JsonWriter.cs deleted file mode 100644 index d7dfbe290e4..00000000000 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.Utf8JsonWriter.cs +++ /dev/null @@ -1,339 +0,0 @@ -using System.Collections; -using System.Text.Json; -using static HotChocolate.Execution.ResultFieldNames; - -namespace HotChocolate.Execution; - -public static partial class JsonValueFormatter -{ - public static void WriteValue( - Utf8JsonWriter writer, - object? value, - JsonSerializerOptions options, - JsonNullIgnoreCondition nullIgnoreCondition) - { - if (value is null) - { - writer.WriteNullValue(); - return; - } - - switch (value) - { - case JsonDocument doc: - WriteJsonElement(doc.RootElement, writer, options, nullIgnoreCondition); - break; - - case JsonElement element: - WriteJsonElement(element, writer, options, nullIgnoreCondition); - break; - - case RawJsonValue rawJsonValue: - writer.WriteRawValue(rawJsonValue.Value.Span, true); - break; - - case IResultDataJsonFormatter formatter: - formatter.WriteTo(writer, options, nullIgnoreCondition); - break; - - case Dictionary<string, object?> dict: - WriteDictionary(writer, dict, options, nullIgnoreCondition); - break; - - case IReadOnlyDictionary<string, object?> dict: - WriteDictionary(writer, dict, options, nullIgnoreCondition); - break; - - case IList list: - WriteList(writer, list, options, nullIgnoreCondition); - break; - - case IError error: - WriteError(writer, error, options, nullIgnoreCondition); - break; - - case string s: - writer.WriteStringValue(s); - break; - - case byte b: - writer.WriteNumberValue(b); - break; - - case short s: - writer.WriteNumberValue(s); - break; - - case ushort s: - writer.WriteNumberValue(s); - break; - - case int i: - writer.WriteNumberValue(i); - break; - - case uint i: - writer.WriteNumberValue(i); - break; - - case long l: - writer.WriteNumberValue(l); - break; - - case ulong l: - writer.WriteNumberValue(l); - break; - - case float f: - writer.WriteNumberValue(f); - break; - - case double d: - writer.WriteNumberValue(d); - break; - - case decimal d: - writer.WriteNumberValue(d); - break; - - case bool b: - writer.WriteBooleanValue(b); - break; - - case Uri u: - writer.WriteStringValue(u.ToString()); - break; - - case Path p: - WritePathValue(writer, p); - break; - - default: - writer.WriteStringValue(value.ToString()); - break; - } - } - - private static void WriteJsonElement( - JsonElement element, - Utf8JsonWriter writer, - JsonSerializerOptions options, - JsonNullIgnoreCondition nullIgnoreCondition) - { - switch (element.ValueKind) - { - case JsonValueKind.Object: - writer.WriteStartObject(); - foreach (var property in element.EnumerateObject()) - { - if (property.Value.ValueKind is JsonValueKind.Null - && (nullIgnoreCondition & JsonNullIgnoreCondition.Fields) == JsonNullIgnoreCondition.Fields) - { - continue; - } - - writer.WritePropertyName(property.Name); - WriteValue(writer, property.Value, options, nullIgnoreCondition); - } - writer.WriteEndObject(); - break; - - case JsonValueKind.Array: - writer.WriteStartArray(); - foreach (var item in element.EnumerateArray()) - { - if (item.ValueKind is JsonValueKind.Null - && (nullIgnoreCondition & JsonNullIgnoreCondition.Lists) == JsonNullIgnoreCondition.Lists) - { - continue; - } - - WriteValue(writer, item, options, nullIgnoreCondition); - } - writer.WriteEndArray(); - break; - - default: - element.WriteTo(writer); - break; - } - } - - public static void WriteDictionary( - Utf8JsonWriter writer, - IReadOnlyDictionary<string, object?> dict, - JsonSerializerOptions options, - JsonNullIgnoreCondition nullIgnoreCondition) - { - writer.WriteStartObject(); - - foreach (var item in dict) - { - if (item.Value is null - && (nullIgnoreCondition & JsonNullIgnoreCondition.Fields) == JsonNullIgnoreCondition.Fields) - { - continue; - } - - writer.WritePropertyName(item.Key); - WriteValue(writer, item.Value, options, nullIgnoreCondition); - } - - writer.WriteEndObject(); - } - - private static void WriteList( - Utf8JsonWriter writer, - IList list, - JsonSerializerOptions options, - JsonNullIgnoreCondition nullIgnoreCondition) - { - writer.WriteStartArray(); - - for (var i = 0; i < list.Count; i++) - { - var element = list[i]; - - if (element is null - && (nullIgnoreCondition & JsonNullIgnoreCondition.Lists) == JsonNullIgnoreCondition.Lists) - { - continue; - } - - WriteValue(writer, element, options, nullIgnoreCondition); - } - - writer.WriteEndArray(); - } - - private static void WriteDictionary( - Utf8JsonWriter writer, - Dictionary<string, object?> dict, - JsonSerializerOptions options, - JsonNullIgnoreCondition nullIgnoreCondition) - { - writer.WriteStartObject(); - - foreach (var item in dict) - { - if (item.Value is null - && (nullIgnoreCondition & JsonNullIgnoreCondition.Fields) == JsonNullIgnoreCondition.Fields) - { - continue; - } - - writer.WritePropertyName(item.Key); - WriteValue(writer, item.Value, options, nullIgnoreCondition); - } - - writer.WriteEndObject(); - } - - private static void WriteLocations(Utf8JsonWriter writer, IReadOnlyList<Location>? locations) - { - if (locations is { Count: > 0 }) - { - writer.WritePropertyName(Locations); - - writer.WriteStartArray(); - - for (var i = 0; i < locations.Count; i++) - { - WriteLocation(writer, locations[i]); - } - - writer.WriteEndArray(); - } - } - - public static void WriteErrors( - Utf8JsonWriter writer, - IReadOnlyList<IError> error, - JsonSerializerOptions options, - JsonNullIgnoreCondition nullIgnoreCondition) - { - writer.WriteStartArray(); - - for (var i = 0; i < error.Count; i++) - { - WriteError(writer, error[i], options, nullIgnoreCondition); - } - - writer.WriteEndArray(); - } - - public static void WriteError( - Utf8JsonWriter writer, - IError error, - JsonSerializerOptions options, - JsonNullIgnoreCondition nullIgnoreCondition) - { - writer.WriteStartObject(); - - writer.WriteString(Message, error.Message); - - WriteLocations(writer, error.Locations); - WritePath(writer, error.Path); - WriteExtensions(writer, error.Extensions, options, nullIgnoreCondition); - - writer.WriteEndObject(); - } - - private static void WriteLocation(Utf8JsonWriter writer, Location location) - { - writer.WriteStartObject(); - writer.WriteNumber(Line, location.Line); - writer.WriteNumber(Column, location.Column); - writer.WriteEndObject(); - } - - public static void WritePath(Utf8JsonWriter writer, Path? path) - { - if (path is not null) - { - writer.WritePropertyName(ResultFieldNames.Path); - WritePathValue(writer, path); - } - } - - private static void WritePathValue(Utf8JsonWriter writer, Path path) - { - if (path.IsRoot) - { - writer.WriteStartArray(); - writer.WriteEndArray(); - return; - } - - writer.WriteStartArray(); - - foreach (var segment in path.EnumerateSegments()) - { - switch (segment) - { - case NamePathSegment n: - writer.WriteStringValue(n.Name); - break; - - case IndexerPathSegment n: - writer.WriteNumberValue(n.Index); - break; - } - } - - writer.WriteEndArray(); - } - - public static void WriteExtensions( - Utf8JsonWriter writer, - IReadOnlyDictionary<string, object?>? dict, - JsonSerializerOptions options, - JsonNullIgnoreCondition nullIgnoreCondition) - { - if (dict is { Count: > 0 }) - { - writer.WritePropertyName(Extensions); - WriteDictionary(writer, dict, options, nullIgnoreCondition); - } - } -} diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.JsonWriter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs similarity index 98% rename from src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.JsonWriter.cs rename to src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs index fac56d164ca..833ffc6302e 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.JsonWriter.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs @@ -1,4 +1,3 @@ -using System.Buffers.Text; using System.Collections; using System.Runtime.InteropServices; using System.Text.Json; @@ -7,7 +6,7 @@ namespace HotChocolate.Execution; -public static partial class JsonValueFormatter +public static class JsonValueFormatter { public static void WriteValue( JsonWriter writer, @@ -107,6 +106,10 @@ public static void WriteValue( WritePathValue(writer, p); break; + case IResultDataJsonFormatter formatter: + formatter.WriteTo(writer, options, nullIgnoreCondition); + break; + default: writer.WriteStringValue(value.ToString()); break; diff --git a/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs b/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs index 057c777ae01..ec16d98356c 100644 --- a/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs +++ b/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using HotChocolate.Text.Json; namespace HotChocolate.Execution; @@ -28,12 +29,12 @@ internal abstract class NeedsFormatting : IResultDataJsonFormatter /// The null ignore condition. /// </param> public abstract void FormatValue( - Utf8JsonWriter writer, + JsonWriter writer, JsonSerializerOptions options, JsonNullIgnoreCondition nullIgnoreCondition); void IResultDataJsonFormatter.WriteTo( - Utf8JsonWriter writer, + JsonWriter writer, JsonSerializerOptions? options, JsonNullIgnoreCondition nullIgnoreCondition) #if NET9_0_OR_GREATER @@ -42,8 +43,12 @@ void IResultDataJsonFormatter.WriteTo( => FormatValue(writer, options ?? JsonSerializerOptions.Default, nullIgnoreCondition); #endif - public static NeedsFormatting<TValue> Create<TValue>(TValue value) - => new(value); + public static JsonNeedsFormatting Create<TValue>(TValue value) + { + var options = new JsonSerializerOptions(JsonSerializerDefaults.Web); + var documents = JsonSerializer.SerializeToDocument(value, options); + return new JsonNeedsFormatting(documents); + } } /// <summary> @@ -60,20 +65,15 @@ public static NeedsFormatting<TValue> Create<TValue>(TValue value) /// This is also the reason for keeping this internal. /// </para> /// </remarks> -/// <remarks> -/// Initializes a new instance of <see cref="NeedsFormatting{TValue}"/>. -/// </remarks> /// <param name="value"> /// The value that needs formatting. /// </param> -internal sealed class NeedsFormatting<TValue>(TValue value) : NeedsFormatting +internal sealed class JsonNeedsFormatting(JsonDocument value) : NeedsFormatting { - private readonly TValue _value = value; - /// <summary> /// The inner value. /// </summary> - public TValue Value => _value; + public JsonDocument Value { get; } = value; /// <summary> /// Formats the value as JSON @@ -88,10 +88,10 @@ internal sealed class NeedsFormatting<TValue>(TValue value) : NeedsFormatting /// The null ignore condition. /// </param> public override void FormatValue( - Utf8JsonWriter writer, + JsonWriter writer, JsonSerializerOptions options, JsonNullIgnoreCondition nullIgnoreCondition) - => JsonSerializer.Serialize(writer, _value, options); + => JsonValueFormatter.WriteValue(writer, Value, options, nullIgnoreCondition); /// <summary> /// Returns the string representation of the inner value. @@ -99,5 +99,5 @@ public override void FormatValue( /// <returns> /// The string representation of the inner value. /// </returns> - public override string? ToString() => _value?.ToString(); + public override string? ToString() => Value.ToString(); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs index 85151fa4dad..4cf9057205f 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/MiddlewareContext.Global.cs @@ -260,20 +260,6 @@ public void SetResultState<TState>( => Context.Result.SetResultState(key, state, value); public void SetExtension<TValue>(string key, TValue value) - => Context.Result.SetExtension(key, new NeedsFormatting<TValue>(value)); - - public void SetExtension<TValue>(string key, UpdateState<TValue> value) - => Context.Result.SetExtension<NeedsFormatting<TValue>?>( - key, - (k, c) => NeedsFormatting.Create(value(k, c is null ? default! : c.Value))); - - public void SetExtension<TValue, TState>( - string key, - TState state, - UpdateState<TValue, TState> value) - => Context.Result.SetExtension<NeedsFormatting<TValue>?, TState>( - key, - state, - (k, c, s) => NeedsFormatting.Create(value(k, c is null ? default! : c.Value, s))); + => Context.Result.SetExtension(key, NeedsFormatting.Create(value)); } } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs index 3665f80bb3e..8d75201ead2 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs @@ -38,6 +38,8 @@ private static void CompleteListValue( return; } } + + return; } if (runtimeValue is IList list) @@ -61,6 +63,8 @@ private static void CompleteListValue( return; } } + + return; } if (runtimeValue is JsonElement { ValueKind: JsonValueKind.Array } node) @@ -86,6 +90,8 @@ private static void CompleteListValue( return; } } + + return; } if (runtimeValue is IEnumerable enumerable) @@ -115,6 +121,8 @@ private static void CompleteListValue( return; } } + + return; } var operationContext = context.OperationContext; diff --git a/src/HotChocolate/Core/src/Types/Resolvers/IOperationResultBuilder.cs b/src/HotChocolate/Core/src/Types/Resolvers/IOperationResultBuilder.cs index 16a52309289..8a14ea8f0bc 100644 --- a/src/HotChocolate/Core/src/Types/Resolvers/IOperationResultBuilder.cs +++ b/src/HotChocolate/Core/src/Types/Resolvers/IOperationResultBuilder.cs @@ -53,49 +53,6 @@ public interface IOperationResultBuilder /// <param name="key">The key.</param> /// <param name="value">The value.</param> void SetExtension<TValue>(string key, TValue value); - - /// <summary> - /// Sets a property on the result extension data which will - /// be serialized and send to the consumer. - /// - /// <code> - /// { - /// ... - /// "extensions": { - /// "yourKey": "yourValue" - /// } - /// } - /// </code> - /// - /// </summary> - /// <param name="key">The key.</param> - /// <param name="value"> - /// A delegate to create the value for the extensions or - /// to mutate the current value stored on the extensions. - /// </param> - void SetExtension<TValue>(string key, UpdateState<TValue> value); - - /// <summary> - /// Sets a property on the result extension data which will - /// be serialized and send to the consumer. - /// - /// <code> - /// { - /// ... - /// "extensions": { - /// "yourKey": "yourValue" - /// } - /// } - /// </code> - /// - /// </summary> - /// <param name="key">The key.</param> - /// <param name="state">A state value that can be passed into the delegate.</param> - /// <param name="value"> - /// A delegate to create the value for the extensions or - /// to mutate the current value stored on the extensions. - /// </param> - void SetExtension<TValue, TState>(string key, TState state, UpdateState<TValue, TState> value); } /// <summary> diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index 140ec7749ce..502fe7276f6 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -10,13 +10,12 @@ public sealed partial class ResultDocument : IRawJsonFormatter public void WriteTo(OperationResult result, IBufferWriter<byte> writer, JsonWriterOptions options) { options = options with { SkipValidation = true }; - using var jsonWriter = new Utf8JsonWriter(writer, options); + var jsonWriter = new JsonWriter(writer, options); var formatter = new RawJsonFormatter(this, jsonWriter); formatter.Write(result); - jsonWriter.Flush(); } - internal ref struct RawJsonFormatter(ResultDocument document, Utf8JsonWriter writer) + internal ref struct RawJsonFormatter(ResultDocument document, JsonWriter writer) { public void Write(OperationResult result) { @@ -99,10 +98,22 @@ public void WriteValue(Cursor cursor, DbRow row) writer.WriteBooleanValue(false); break; - default: - var rawValue = document.ReadRawValue(row); - writer.WriteRawValue(rawValue, skipInputValidation: true); + case ElementTokenType.String: + { + var value = document.ReadRawValue(row); + writer.WriteStringValue(value, skipEscaping: true); break; + } + + case ElementTokenType.Number: + { + var value = document.ReadRawValue(row); + writer.WriteNumberValue(value); + break; + } + + default: + throw new NotSupportedException(); } } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index b958966bc07..f3d7068c56e 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -1155,11 +1155,10 @@ public void WriteTo(IBufferWriter<byte> writer, bool indented = false) Indented = indented, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; - using var jsonWriter = new Utf8JsonWriter(writer, options); + var jsonWriter = new JsonWriter(writer, options); var formatter = new ResultDocument.RawJsonFormatter(_parent, jsonWriter); var row = _parent._metaDb.Get(_cursor); formatter.WriteValue(_cursor, row); - jsonWriter.Flush(); } /// <inheritdoc /> diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs index e8c2e252fa2..9e5093073ea 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs @@ -1,6 +1,7 @@ using System.Buffers; using System.Buffers.Text; using System.Runtime.InteropServices; +using System.Text.Encodings.Web; using System.Text.Json; using HotChocolate.Buffers; using HotChocolate.Features; @@ -59,25 +60,7 @@ protected override byte[] OnCoerceInputLiteral(StringValueNode valueLiteral) } protected override byte[] OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) - { - byte[]? rented = null; - var valueSpan = JsonMarshal.GetRawUtf8Value(inputValue); - var length = Base64.GetMaxDecodedFromUtf8Length(valueSpan.Length); - var buffer = length <= 256 ? stackalloc byte[length] : rented = ArrayPool<byte>.Shared.Rent(length); - - try - { - Base64.DecodeFromUtf8(valueSpan, buffer, out _, out var bytesWritten); - return buffer[..bytesWritten].ToArray(); - } - finally - { - if (rented is not null) - { - ArrayPool<byte>.Shared.Return(rented); - } - } - } + => inputValue.GetBytesFromBase64(); protected override void OnCoerceOutputValue(byte[] runtimeValue, ResultElement resultValue) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs index 91bc2d7bb12..f03b7a03af4 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs @@ -58,7 +58,7 @@ protected FloatTypeBase( /// <inheritdoc /> public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral.Kind is SyntaxKind.FloatValue or SyntaxKind.IntValue; + => valueLiteral is { Kind: SyntaxKind.FloatValue or SyntaxKind.IntValue }; /// <inheritdoc /> public override bool IsValueCompatible(JsonElement inputValue) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs index 81720427019..52896b9d6fb 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs @@ -57,7 +57,7 @@ protected IntegerTypeBase( /// <inheritdoc /> public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral.Kind is SyntaxKind.IntValue; + => valueLiteral is { Kind: SyntaxKind.IntValue }; /// <inheritdoc /> public override bool IsValueCompatible(JsonElement inputValue) @@ -186,7 +186,7 @@ protected virtual LeafCoercionException FormatError(TRuntimeType runtimeValue) /// </exception> private void AssertFormat(TRuntimeType runtimeValue) { - if (runtimeValue.CompareTo(MinValue) == -1 || runtimeValue.CompareTo(MaxValue) == 1) + if (runtimeValue.CompareTo(MinValue) < 0 || runtimeValue.CompareTo(MaxValue) > 0) { throw FormatError(runtimeValue); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs index 3b51999512c..1eb6745a549 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs @@ -116,40 +116,38 @@ public bool IsAssignableFrom(ITypeDefinition type) /// <inheritdoc cref="IScalarTypeDefinition.IsValueCompatible" /> public virtual bool IsValueCompatible(IValueNode valueLiteral) { - ArgumentNullException.ThrowIfNull(valueLiteral); - if ((SerializationType & ScalarSerializationType.String) == ScalarSerializationType.String - && valueLiteral.Kind == SyntaxKind.StringValue) + && valueLiteral is { Kind: SyntaxKind.StringValue }) { return true; } if ((SerializationType & ScalarSerializationType.Int) == ScalarSerializationType.Int - && valueLiteral.Kind == SyntaxKind.IntValue) + && valueLiteral is { Kind: SyntaxKind.IntValue }) { return true; } if ((SerializationType & ScalarSerializationType.Float) == ScalarSerializationType.Float - && valueLiteral.Kind == SyntaxKind.FloatValue) + && valueLiteral is { Kind: SyntaxKind.FloatValue }) { return true; } if ((SerializationType & ScalarSerializationType.Boolean) == ScalarSerializationType.Boolean - && valueLiteral.Kind == SyntaxKind.BooleanValue) + && valueLiteral is { Kind: SyntaxKind.BooleanValue }) { return true; } if ((SerializationType & ScalarSerializationType.List) == ScalarSerializationType.List - && valueLiteral.Kind == SyntaxKind.ListValue) + && valueLiteral is { Kind: SyntaxKind.ListValue }) { return true; } if ((SerializationType & ScalarSerializationType.Object) == ScalarSerializationType.Object - && valueLiteral.Kind == SyntaxKind.ObjectValue) + && valueLiteral is { Kind: SyntaxKind.ObjectValue }) { return true; } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs index f2e79a7ac6b..cb2252e1096 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs @@ -177,7 +177,7 @@ public sealed override IValueNode ValueToLiteral(object runtimeValue) /// <returns> /// Returns the exception to throw. /// </returns> - protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueLiteral) + protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode? valueLiteral) => Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); /// <summary> diff --git a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs index e0e7dedca0e..100909f4e2e 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs @@ -600,8 +600,10 @@ public static LeafCoercionException InvalidTypeConversion( public static LeafCoercionException Scalar_Cannot_CoerceInputLiteral( ITypeDefinition scalarType, - IValueNode valueLiteral) + IValueNode? valueLiteral) { + valueLiteral ??= NullValueNode.Default; + return new LeafCoercionException( ErrorBuilder.New() .SetMessage( diff --git a/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs b/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs index 8dfeebff4b2..c772c25028d 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs @@ -412,119 +412,6 @@ public async Task SetResultExtensionData_With_IntValue() """); } - [Fact] - public async Task SetResultExtensionData_With_Delegate_IntValue() - { - var result = await new ServiceCollection() - .AddGraphQL() - .AddQueryType( - d => - { - d.Field("abc") - .Argument("a", t => t.Type<StringType>()) - .Resolve(ctx => ctx.ArgumentValue<string>("a")) - .Use( - next => async context => - { - context.OperationResult.SetExtension("abc", 1); - context.OperationResult.SetExtension<int>("abc", (_, v) => 1 + v); - await next(context); - }); - }) - .ExecuteRequestAsync("{ abc(a: \"abc\") }"); - - Snapshot - .Create() - .Add(result) - .MatchInline( - """ - { - "data": { - "abc": "abc" - }, - "extensions": { - "abc": 2 - } - } - """); - } - - [Fact] - public async Task SetResultExtensionData_With_Delegate_IntValue_With_State() - { - var result = await new ServiceCollection() - .AddGraphQL() - .AddQueryType( - d => - { - d.Field("abc") - .Argument("a", t => t.Type<StringType>()) - .Resolve(ctx => ctx.ArgumentValue<string>("a")) - .Use( - next => async context => - { - context.OperationResult.SetExtension("abc", 1); - context.OperationResult.SetExtension<int, int>( - key: "abc", - state: 5, - (_, v, s) => s + v); - await next(context); - }); - }) - .ExecuteRequestAsync("{ abc(a: \"abc\") }"); - - Snapshot - .Create() - .Add(result) - .MatchInline( - """ - { - "data": { - "abc": "abc" - }, - "extensions": { - "abc": 6 - } - } - """); - } - - [Fact] - public async Task SetResultExtensionData_With_Delegate_NoDefaultValue_IntValue() - { - var result = await new ServiceCollection() - .AddGraphQL() - .AddQueryType( - d => - { - d.Field("abc") - .Argument("a", t => t.Type<StringType>()) - .Resolve(ctx => ctx.ArgumentValue<string>("a")) - .Use( - next => async context => - { - context.OperationResult.SetExtension<int>("abc", (_, v) => 1 + v); - await next(context); - }); - }) - .ExecuteRequestAsync("{ abc(a: \"abc\") }"); - - Snapshot - .Create() - .Add(result) - .MatchInline( - """ - { - "data": { - "abc": "abc" - }, - "extensions": { - "abc": 1 - } - } - """); - } - [Fact] public async Task SetResultExtensionData_With_ObjectValue() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs index ea0e8463e94..2d55cb4cfbf 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs @@ -97,7 +97,7 @@ public void CoerceInputLiteral_Null_Throws() void Action() => type.CoerceInputLiteral(null!); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs index f46c1d695b0..60b7e3cd315 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteTypeTests.cs @@ -45,16 +45,16 @@ public void IsValueCompatible_FloatLiteral_False() } [Fact] - public void IsValueCompatible_Null_Throws() + public void IsValueCompatible_Null_False() { // arrange var type = new ByteType(); // act - void Action() => type.IsValueCompatible(null!); + var result = type.IsValueCompatible(null!); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.False(result); } [Fact] @@ -96,7 +96,7 @@ public void CoerceInputLiteral_Null_Throws() void Action() => type.CoerceInputLiteral(null!); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs index fceef1d3402..aa2a4f1c625 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs @@ -66,7 +66,7 @@ public void CoerceInputLiteral_Invalid(string dateTime) // assert Assert.Equal( - "DateTime cannot parse the given literal of type `StringValueNode`.", + "DateTime cannot coerce the given literal of type `StringValue` to a runtime value.", Assert.Throws<LeafCoercionException>(Action).Message); } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs index 68f922fd9f0..fdee18cd392 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTypeTests.cs @@ -133,58 +133,6 @@ public void CoerceOutputValue_DateOnly() resultValue.MatchInlineSnapshot("\"2018-06-11\""); } - [Fact] - public void CoerceOutputValue_DateTime() - { - // arrange - var type = new DateType(); - var dateTime = new DateTime(2018, 6, 11, 8, 46, 14, DateTimeKind.Utc); - - // act - var operation = CommonTestExtensions.CreateOperation(); - var resultDocument = new ResultDocument(operation, 0); - var resultValue = resultDocument.Data.GetProperty("first"); - type.CoerceOutputValue(dateTime, resultValue); - - // assert - resultValue.MatchInlineSnapshot("\"2018-06-11\""); - } - - [Fact] - public void CoerceOutputValue_DateTimeOffset() - { - // arrange - var type = new DateType(); - var dateTime = new DateTimeOffset( - new DateTime(2018, 6, 11, 2, 46, 14), - new TimeSpan(4, 0, 0)); - - // act - var operation = CommonTestExtensions.CreateOperation(); - var resultDocument = new ResultDocument(operation, 0); - var resultValue = resultDocument.Data.GetProperty("first"); - type.CoerceOutputValue(dateTime, resultValue); - - // assert - resultValue.MatchInlineSnapshot("\"2018-06-11\""); - } - - [Fact] - public void CoerceOutputValue_Invalid_Format() - { - // arrange - var type = new DateType(); - - // act - var operation = CommonTestExtensions.CreateOperation(); - var resultDocument = new ResultDocument(operation, 0); - var resultValue = resultDocument.Data.GetProperty("first"); - void Action() => type.CoerceOutputValue("foo", resultValue); - - // assert - Assert.Throws<LeafCoercionException>(Action); - } - [Fact] public void ValueToLiteral() { diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs index 8b7869cc79b..33913486a34 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DecimalTypeTests.cs @@ -57,19 +57,6 @@ public void IsValueCompatible_StringLiteral_False() Assert.False(result); } - [Fact] - public void IsValueCompatible_Null_Throws() - { - // arrange - var type = new DecimalType(); - - // act - void Action() => type.IsValueCompatible(null!); - - // assert - Assert.Throws<ArgumentNullException>(Action); - } - [Fact] public void CoerceInputLiteral() { @@ -139,7 +126,7 @@ public void CoerceInputLiteral_Null_Throws() void Action() => type.CoerceInputLiteral(null!); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs index 665a82bdf48..378b703fe03 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs @@ -260,36 +260,23 @@ public void IsValueCompatible_NullValueNode_ReturnsTrue() var type = new UrlType(); // act - var isCompatible = type.IsValueCompatible(new NullValueNode(null)); - - // assert - Assert.True(isCompatible); - } - - [Fact] - public void IsValueCompatible_InvalidUri_ReturnsFalse() - { - // arrange - var type = new UrlType(); - - // act - var isCompatible = type.IsValueCompatible(new StringValueNode("$*^domain.test")); + var isCompatible = type.IsValueCompatible(NullValueNode.Default); // assert Assert.False(isCompatible); } [Fact] - public void IsValueCompatible_Null_ThrowsArgumentException() + public void IsValueCompatible_Null_ReturnsFalse() { // arrange var type = new UrlType(); // act - void Action() => type.IsValueCompatible(null!); + var compatible = type.IsValueCompatible(null!); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.True(compatible); } [Fact] diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.Text.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.Text.cs index f8d51be0d97..40c5f02bae5 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.Text.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.Text.cs @@ -1,6 +1,7 @@ using System.Buffers; using System.Diagnostics; using System.Text.Unicode; +using HotChocolate.Text.Json; namespace HotChocolate.Fusion.Text.Json; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.TryGetProperty.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.TryGetProperty.cs index d4237cffa71..a900b0c3379 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.TryGetProperty.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.TryGetProperty.cs @@ -1,5 +1,6 @@ using System.Buffers; using System.Diagnostics; +using HotChocolate.Text.Json; namespace HotChocolate.Fusion.Text.Json; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs index 45834422a0d..408438822c2 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs @@ -8,13 +8,12 @@ namespace HotChocolate.Fusion.Text.Json; public sealed partial class CompositeResultDocument : IRawJsonFormatter { - public void WriteTo(OperationResult result, IBufferWriter<byte> writer, JsonWriterOptions options) + public void WriteTo(OperationResult result, IBufferWriter<byte> writer, JsonWriterOptions options = default) { options = options with { SkipValidation = true }; - using var jsonWriter = new Utf8JsonWriter(writer, options); + var jsonWriter = new JsonWriter(writer, options); var formatter = new RawJsonFormatter(this, jsonWriter); formatter.Write(); - jsonWriter.Flush(); } internal ref struct RawJsonFormatter(CompositeResultDocument document, JsonWriter writer) @@ -102,9 +101,22 @@ public void WriteValue(Cursor cursor, DbRow row) writer.WriteBooleanValue(false); break; - default: - document.WriteRawValueTo(writer, row); + case ElementTokenType.String: + { + var value = document.ReadRawValue(row); + writer.WriteStringValue(value, skipEscaping: true); break; + } + + case ElementTokenType.Number: + { + var value = document.ReadRawValue(row); + writer.WriteNumberValue(value); + break; + } + + default: + throw new NotSupportedException(); } } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs index 8e65dfe3b7c..271cd4a11de 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultElement.cs @@ -1,8 +1,8 @@ using System.Buffers; using System.Diagnostics; using System.Text.Json; -using HotChocolate.Execution; using HotChocolate.Fusion.Execution.Nodes; +using HotChocolate.Text.Json; using HotChocolate.Types; using static HotChocolate.Fusion.Properties.FusionExecutionResources; @@ -33,11 +33,11 @@ internal CompositeResultElement(CompositeResultDocument parent, CompositeResultD /// </param> public void WriteTo(IBufferWriter<byte> writer, bool indented = false) { + var options = new JsonWriterOptions { Indented = indented }; + var jsonWriter = new JsonWriter(writer, options); var formatter = new CompositeResultDocument.RawJsonFormatter( _parent, - writer, - new JsonWriterOptions { Indented = indented }); - + jsonWriter); var row = _parent._metaDb.Get(_cursor); formatter.WriteValue(_cursor, row); } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Parse.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Parse.cs index 6c3fbf84af7..7d75de8d7da 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Parse.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Parse.cs @@ -3,6 +3,7 @@ using System.Runtime.CompilerServices; using System.Text.Json; using HotChocolate.Buffers; +using HotChocolate.Text.Json; namespace HotChocolate.Fusion.Text.Json; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Text.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Text.cs index c4162320f05..c556a79a2e9 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Text.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Text.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Text.Json; using System.Text.Unicode; +using HotChocolate.Text.Json; namespace HotChocolate.Fusion.Text.Json; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetProperty.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetProperty.cs index 352c0ca3f63..5caf05773c2 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetProperty.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetProperty.cs @@ -1,6 +1,7 @@ using System.Buffers; using System.Diagnostics; using System.Text.Json; +using HotChocolate.Text.Json; namespace HotChocolate.Fusion.Text.Json; diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs index 191fa13e4bf..b1dc2970837 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs @@ -475,7 +475,7 @@ public void Write_Document_To_BufferWriter() compositeResult); var operationResult = new OperationResult( operationResultData); - compositeResult.WriteTo(operationResult, buffer, indented: true); + compositeResult.WriteTo(operationResult, buffer); // assert var json = Encoding.UTF8.GetString(buffer.WrittenSpan); @@ -542,7 +542,7 @@ public async Task Write_Document_To_PipeWriter() compositeResult); var operationResult = new OperationResult( operationResultData); - compositeResult.WriteTo(operationResult, writer, indented: true); + compositeResult.WriteTo(operationResult, writer, new JsonWriterOptions { Indented = true}); await writer.FlushAsync(); await writer.CompleteAsync(); diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Api/ApiCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Api/ApiCommand.cs index 6c0523daee5..bd8761b20ea 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Api/ApiCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Api/ApiCommand.cs @@ -1,5 +1,13 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif + namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.Api; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class ApiCommand : Command { public ApiCommand() : base("api") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/ApiKeys/ApiKeyCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/ApiKeys/ApiKeyCommand.cs index 47f653ac245..46609cad0cd 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/ApiKeys/ApiKeyCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/ApiKeys/ApiKeyCommand.cs @@ -1,5 +1,13 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif + namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.ApiKey; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class ApiKeyCommand : Command { public ApiKeyCommand() : base("api-key") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Client/ClientCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Client/ClientCommand.cs index 4026a9c2b6a..564a30dde6f 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Client/ClientCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Client/ClientCommand.cs @@ -1,7 +1,14 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using ChilliCream.Nitro.CommandLine.Cloud.Commands.Client; namespace ChilliCream.Nitro.CommandLine.Cloud; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class ClientCommand : Command { public ClientCommand() : base("client") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Environments/EnvironmentCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Environments/EnvironmentCommand.cs index aff5a4985a8..dd8db9f6188 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Environments/EnvironmentCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Environments/EnvironmentCommand.cs @@ -1,5 +1,13 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif + namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.Environment; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class EnvironmentCommand : Command { public EnvironmentCommand() : base("environment") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionCommand.cs index aa1b07aafbe..0014713cbf2 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionCommand.cs @@ -1,5 +1,13 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif + namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.Fusion; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class FusionCommand : Command { public FusionCommand() : base("fusion") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionDownloadCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionDownloadCommand.cs index 0c12f09b1a5..08f6642ab59 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionDownloadCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionDownloadCommand.cs @@ -1,10 +1,17 @@ using System.CommandLine.Invocation; +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using ChilliCream.Nitro.CommandLine.Cloud.Client; using ChilliCream.Nitro.CommandLine.Cloud.Option; using ChilliCream.Nitro.CommandLine.Cloud.Option.Binders; namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.Fusion; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class FusionDownloadCommand : Command { public FusionDownloadCommand() : base("download") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionPublishCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionPublishCommand.cs index 55d411dc905..3257366b023 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionPublishCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionPublishCommand.cs @@ -1,4 +1,7 @@ using System.CommandLine.IO; +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using ChilliCream.Nitro.CommandLine.Cloud.Client; using ChilliCream.Nitro.CommandLine.Cloud.Option; using ChilliCream.Nitro.CommandLine.Fusion.Commands; @@ -8,6 +11,10 @@ namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.Fusion; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class FusionPublishCommand : Command { public FusionPublishCommand() : base("publish") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionRunCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionRunCommand.cs index 8474e7c4e1e..fc7d15ef7cf 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionRunCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionRunCommand.cs @@ -1,4 +1,7 @@ using System.Diagnostics; +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; @@ -8,6 +11,10 @@ namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.Fusion; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public class FusionRunCommand : Command { public FusionRunCommand() : base("run") @@ -29,7 +36,7 @@ public FusionRunCommand() : base("run") this.SetHandler(async context => { - var archiveFile = context.ParseResult.GetValueForArgument(archiveArgument)!; + var archiveFile = context.ParseResult.GetValueForArgument(archiveArgument); var console = context.BindingContext.GetRequiredService<IAnsiConsole>(); diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionSettingsCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionSettingsCommand.cs index bee932dd7f6..2e4d3d85628 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionSettingsCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionSettingsCommand.cs @@ -1,5 +1,13 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif + namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.Fusion; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class FusionSettingsCommand : Command { public FusionSettingsCommand() : base("settings") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionSettingsSetCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionSettingsSetCommand.cs index 1e9ef63ca17..bcb8c1abcc8 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionSettingsSetCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionSettingsSetCommand.cs @@ -1,8 +1,15 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using ChilliCream.Nitro.CommandLine.Cloud.Client; using ChilliCream.Nitro.CommandLine.Cloud.Option; namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.Fusion; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class FusionSettingsSetCommand : Command { public FusionSettingsSetCommand() : base("set") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionValidateCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionValidateCommand.cs index c5f7ba2d2fc..f8dd93731be 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionValidateCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Fusion/FusionValidateCommand.cs @@ -1,3 +1,6 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using System.IO.Compression; using System.Reactive; using System.Reactive.Linq; @@ -13,6 +16,10 @@ namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.Fusion; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class FusionValidateCommand : Command { public FusionValidateCommand() : base("validate") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Launch/LaunchCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Launch/LaunchCommand.cs index e25804a10ed..9fe488741a3 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Launch/LaunchCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Launch/LaunchCommand.cs @@ -1,8 +1,15 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using ChilliCream.Nitro.CommandLine.Cloud.Helpers; using ChilliCream.Nitro.CommandLine.Cloud.Option.Binders; namespace ChilliCream.Nitro.CommandLine.Cloud; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class LaunchCommand : Command { public LaunchCommand() : base("launch") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Mock/MockCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Mock/MockCommand.cs index ee5dbdaa122..a7506152235 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Mock/MockCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Mock/MockCommand.cs @@ -1,5 +1,13 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif + namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.Mock; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class MockCommand : Command { public MockCommand() : base("mock") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/PersonalAccessTokens/PersonalAccessTokenCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/PersonalAccessTokens/PersonalAccessTokenCommand.cs index 4aac89a507f..f55a86a4b21 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/PersonalAccessTokens/PersonalAccessTokenCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/PersonalAccessTokens/PersonalAccessTokenCommand.cs @@ -1,5 +1,13 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif + namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.PersonalAccessToken; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class PersonalAccessTokenCommand : Command { public PersonalAccessTokenCommand() : base("pat") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Schema/SchemaCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Schema/SchemaCommand.cs index 2118d65ee5e..efff581a46d 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Schema/SchemaCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Schema/SchemaCommand.cs @@ -1,5 +1,13 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif + namespace ChilliCream.Nitro.CommandLine.Cloud; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class SchemaCommand : Command { public SchemaCommand() : base("schema") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Stages/StageCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Stages/StageCommand.cs index feef3b3ed81..6bcab917ff2 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Stages/StageCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Stages/StageCommand.cs @@ -1,5 +1,13 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif + namespace ChilliCream.Nitro.CommandLine.Cloud.Commands.Stages; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class StageCommand : Command { public StageCommand() : base("stage") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Workspace/WorkspaceCommand.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Workspace/WorkspaceCommand.cs index 2c60c275c53..15aa533138a 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Workspace/WorkspaceCommand.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Commands/Workspace/WorkspaceCommand.cs @@ -1,5 +1,13 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif + namespace ChilliCream.Nitro.CommandLine.Cloud; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class WorkspaceCommand : Command { public WorkspaceCommand() : base("workspace") diff --git a/src/Nitro/CommandLine/src/CommandLine.Cloud/Extensions/NitroCloudCommandExtensions.cs b/src/Nitro/CommandLine/src/CommandLine.Cloud/Extensions/NitroCloudCommandExtensions.cs index e7474fffff4..0f85d4f9a95 100644 --- a/src/Nitro/CommandLine/src/CommandLine.Cloud/Extensions/NitroCloudCommandExtensions.cs +++ b/src/Nitro/CommandLine/src/CommandLine.Cloud/Extensions/NitroCloudCommandExtensions.cs @@ -1,4 +1,7 @@ using System.CommandLine.Builder; +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using ChilliCream.Nitro.CommandLine.Cloud.Commands.Api; using ChilliCream.Nitro.CommandLine.Cloud.Commands.ApiKey; using ChilliCream.Nitro.CommandLine.Cloud.Commands.Environment; @@ -12,6 +15,10 @@ namespace ChilliCream.Nitro.CommandLine.Cloud; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif public static class NitroCloudCommandExtensions { public static CommandLineBuilder AddNitroCloudConfiguration(this CommandLineBuilder builder) diff --git a/src/Nitro/CommandLine/src/CommandLine/Program.cs b/src/Nitro/CommandLine/src/CommandLine/Program.cs index 0859d1b2bab..10036e73479 100644 --- a/src/Nitro/CommandLine/src/CommandLine/Program.cs +++ b/src/Nitro/CommandLine/src/CommandLine/Program.cs @@ -1,16 +1,30 @@ using System.CommandLine.Builder; using System.CommandLine.Parsing; -using ChilliCream.Nitro.CommandLine; +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using ChilliCream.Nitro.CommandLine.Cloud; using ChilliCream.Nitro.CommandLine.Fusion; -var builder = new CommandLineBuilder(new NitroRootCommand()) - .AddNitroCloudConfiguration() - .UseDefaults() - .UseExceptionMiddleware() - .UseExtendedConsole(); +namespace ChilliCream.Nitro.CommandLine +{ +#if !NET9_0_OR_GREATER + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif + public static class Program + { + public static async Task Main(string[] args) + { + var builder = new CommandLineBuilder(new NitroRootCommand()) + .AddNitroCloudConfiguration() + .UseDefaults() + .UseExceptionMiddleware() + .UseExtendedConsole(); -var (_, fusionCommand) = builder.Command.AddNitroCloudCommands(); -fusionCommand.AddFusionComposeCommand(); - -return await builder.Build().InvokeAsync(args); + var (_, fusionCommand) = builder.Command.AddNitroCloudCommands(); + fusionCommand.AddFusionComposeCommand(); + await builder.Build().InvokeAsync(args); + } + } +} diff --git a/src/StrawberryShake/Client/test/Transport.InMemory.Tests/InMemoryClientTests.cs b/src/StrawberryShake/Client/test/Transport.InMemory.Tests/InMemoryClientTests.cs index a330a40076e..c19ec30fef4 100644 --- a/src/StrawberryShake/Client/test/Transport.InMemory.Tests/InMemoryClientTests.cs +++ b/src/StrawberryShake/Client/test/Transport.InMemory.Tests/InMemoryClientTests.cs @@ -73,9 +73,8 @@ await Record.ExceptionAsync(async () => public async Task ExecuteAsync_Default_ExecuteQuery() { // arrange - var client = new InMemoryClient("Foo"); - var variables = new Dictionary<string, object?>(); - var operationRequest = new OperationRequest("foo", new StubDocument(), variables); + var client = new InMemoryClient("Foo"); ; + var operationRequest = new OperationRequest("foo", new StubDocument(), new Dictionary<string, object?>()); var executor = new StubExecutor(); client.Executor = executor; @@ -85,8 +84,8 @@ public async Task ExecuteAsync_Default_ExecuteQuery() // assert var request = Assert.IsType<HotChocolate.Execution.OperationRequest>(executor.Request); Assert.Equal(operationRequest.Name, request.OperationName); - Assert.Equal(variables, request.VariableValues); Assert.Equal("{ foo }", Encoding.UTF8.GetString(request.Document!.AsSpan())); + request.VariableValues?.Document.MatchInlineSnapshot("{ }"); } [Fact] From 3036496a20925aeb00152ad611677b3d3b8a4ff3 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 9 Jan 2026 23:14:21 +0100 Subject: [PATCH 081/144] refactor: Update null handling in IsValueCompatible methods to return false instead of throwing exceptions --- .../src/Types/Text/Json/ResultDocument.cs | 2 +- .../Core/src/Types/Text/Json/ResultElement.cs | 5 ++- .../Core/src/Types/Types/Scalars/JsonType.cs | 11 ++++- .../Types.Tests/Types/Scalars/AnyTypeTests.cs | 6 +-- .../Types/Scalars/ByteArrayTypeTests.cs | 6 +-- .../Types.Tests/Types/Scalars/IdTypeTests.cs | 12 +++--- .../Types/Scalars/LocalDateTypeTests.cs | 2 +- .../Types.Tests/Types/Scalars/UrlTypeTests.cs | 4 +- .../Types/Scalars/UuidTypeTests.cs | 40 ++----------------- 9 files changed, 32 insertions(+), 56 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index 950dc928075..da0c5d9bb13 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -529,7 +529,7 @@ internal void AssignPropertyName(ResultElement target, ReadOnlySpan<byte> proper Debug.Assert(row.TokenType is ElementTokenType.PropertyName); Debug.Assert(row.OperationReferenceType is OperationReferenceType.None); - var totalSize = propertyName.Length + 2; + var totalSize = propertyName.Length; var position = ClaimDataSpace(totalSize); WriteData(position, propertyName, withQuotes: false); diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index f3d7068c56e..6c38fae1278 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -935,7 +935,8 @@ public void SetPropertyName(ReadOnlySpan<char> propertyName) throw new ArgumentNullException(nameof(propertyName)); } - var requiredBytes = Encoding.UTF8.GetByteCount(propertyName); + var encoding = Encoding.UTF8; + var requiredBytes = encoding.GetByteCount(propertyName); byte[]? rented = null; var buffer = JsonConstants.StackallocByteThreshold <= requiredBytes ? stackalloc byte[propertyName.Length] @@ -943,7 +944,7 @@ public void SetPropertyName(ReadOnlySpan<char> propertyName) try { - var usedBytes = Encoding.UTF8.GetBytes(propertyName, buffer); + var usedBytes = encoding.GetBytes(propertyName, buffer); _parent.AssignPropertyName(this, buffer[..usedBytes]); } finally diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs index 353e5f95829..1ce8f4af304 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs @@ -73,12 +73,18 @@ public override void OnCoerceOutputValue(JsonElement runtimeValue, ResultElement switch (runtimeValue.ValueKind) { case JsonValueKind.String: - resultValue.SetStringValue(JsonMarshal.GetRawUtf8Value(runtimeValue)); + { + var value = JsonMarshal.GetRawUtf8Value(runtimeValue); + resultValue.SetStringValue(value[1..^1]); break; + } case JsonValueKind.Number: - resultValue.SetNumberValue(JsonMarshal.GetRawUtf8Value(runtimeValue)); + { + var value = JsonMarshal.GetRawUtf8Value(runtimeValue); + resultValue.SetNumberValue(value); break; + } case JsonValueKind.True: resultValue.SetBooleanValue(true); @@ -121,6 +127,7 @@ public override void OnCoerceOutputValue(JsonElement runtimeValue, ResultElement foreach (var property in resultValue.EnumerateObject()) { enumerator.MoveNext(); + property.Value.SetPropertyName(enumerator.Current.Name); OnCoerceOutputValue(enumerator.Current.Value, property.Value); } break; diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs index d9ab78bb804..30a1d216c7b 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs @@ -944,7 +944,7 @@ public void IsValueCompatible_NullValue_True() } [Fact] - public void IsValueCompatible_Null_ArgumentNullException() + public void IsValueCompatible_Null_ReturnsFalse() { // arrange var schema = SchemaBuilder.New() @@ -960,10 +960,10 @@ public void IsValueCompatible_Null_ArgumentNullException() var type = schema.Types.GetType<AnyType>("Any"); // act - void Action() => type.IsValueCompatible(null!); + var result = type.IsValueCompatible(null!); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.False(result); } [InlineData("abc", typeof(StringValueNode))] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs index 2d55cb4cfbf..9907a2a237b 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/ByteArrayTypeTests.cs @@ -46,16 +46,16 @@ public void IsValueCompatible_IntLiteral_False() } [Fact] - public void IsValueCompatible_Null_Throws() + public void IsValueCompatible_Null_ReturnsFalse() { // arrange var type = new ByteArrayType(); // act - void Action() => type.IsValueCompatible(null!); + var result = type.IsValueCompatible(null!); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.False(result); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs index 4f6a926788b..fa44d9de1a5 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/IdTypeTests.cs @@ -96,16 +96,16 @@ public void IsValueCompatible_FloatValueNode_False() } [Fact] - public void IsValueCompatible_Null_Throws() + public void IsValueCompatible_Null_ReturnsFalse() { // arrange var type = new IdType(); // act - void Action() => type.IsValueCompatible(null!); + var result = type.IsValueCompatible(null!); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.False(result); } [Fact] @@ -162,7 +162,7 @@ public void CoerceInputLiteral_Null_Throws() void Action() => type.CoerceInputLiteral(null!); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] @@ -209,10 +209,10 @@ public void CoerceInputValue_Null() var inputValue = JsonDocument.Parse("null").RootElement; // act - var runtimeValue = type.CoerceInputValue(inputValue, null!); + void Action() => type.CoerceInputValue(inputValue, null!); // assert - Assert.Null(runtimeValue); + Assert.Throws<LeafCoercionException>(Action); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs index 57cb183f743..1b7bdb3b4c2 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/LocalDateTypeTests.cs @@ -87,7 +87,7 @@ public void CoerceInputLiteral_Invalid_Format(string dateTime) // assert Assert.Equal( - "LocalDate cannot parse the given literal of type `StringValueNode`.", + "LocalDate cannot coerce the given literal of type `StringValue` to a runtime value.", Assert.Throws<LeafCoercionException>(Action).Message); } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs index 378b703fe03..12c386e9b65 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UrlTypeTests.cs @@ -254,7 +254,7 @@ public void IsValueCompatible_Uri_ReturnsTrue() } [Fact] - public void IsValueCompatible_NullValueNode_ReturnsTrue() + public void IsValueCompatible_NullValueNode_ReturnsFalse() { // arrange var type = new UrlType(); @@ -276,7 +276,7 @@ public void IsValueCompatible_Null_ReturnsFalse() var compatible = type.IsValueCompatible(null!); // assert - Assert.True(compatible); + Assert.False(compatible); } [Fact] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs index eaf5eeff1cc..0e572e35536 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/UuidTypeTests.cs @@ -43,7 +43,7 @@ public void IsValueCompatible_NullLiteral() var isCompatible = type.IsValueCompatible(literal); // assert - Assert.True(isCompatible); + Assert.False(isCompatible); } [Fact] @@ -67,10 +67,10 @@ public void IsValueCompatible_Null() var type = new UuidType(); // act - void Action() => type.IsValueCompatible(null!); + var isCompatible = type.IsValueCompatible(null!); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.False(isCompatible); } [Fact] @@ -145,7 +145,7 @@ public void CoerceInputLiteral_Invalid_Null() void Action() => type.CoerceInputLiteral(null!); // assert - Assert.Throws<ArgumentNullException>(Action); + Assert.Throws<LeafCoercionException>(Action); } [Fact] @@ -376,36 +376,4 @@ public void CoerceInputValue_Guid_Valid_Format(bool enforceFormat) // assert Assert.Equal(input, guid.ToString("D")); } - - [InlineData(false)] - [InlineData(true)] - [Theory] - public void IsValueCompatible_Guid_String_With_Appended_String(bool enforceFormat) - { - // arrange - var input = new StringValueNode("fbdef721-93c5-4267-8f92-ca27b60aa51f-foobar"); - var type = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); - - // act - var result = type.IsValueCompatible(input); - - // assert - Assert.False(result); - } - - [InlineData(false)] - [InlineData(true)] - [Theory] - public void IsValueCompatible_Guid_Valid_Format(bool enforceFormat) - { - // arrange - var input = new StringValueNode("fbdef721-93c5-4267-8f92-ca27b60aa51f"); - var type = new UuidType(defaultFormat: 'D', enforceFormat: enforceFormat); - - // act - var result = type.IsValueCompatible(input); - - // assert - Assert.True(result); - } } From 305aa21335a94f99134ea3fc6cd080568d0fe336 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Sun, 11 Jan 2026 15:52:31 +0100 Subject: [PATCH 082/144] Merged AnyType and JsonType --- ...xecutorBuilderExtensions.TypeConversion.cs | 233 ++- .../Core/src/Types/Types/Scalars/AnyType.cs | 365 ---- .../src/Types/Types/Scalars/ByteArrayType.cs | 2 - .../Core/src/Types/Types/Scalars/JsonType.cs | 29 +- .../src/Types/Types/Scalars/ScalarNames.cs | 1 - .../Core/src/Types/Types/Scalars/Scalars.cs | 5 +- .../Utilities/DefaultTypeConverter.Setup.cs | 13 + .../DictionaryToJsonDocumentConverter.cs | 112 ++ .../JsonElementTypeChangeProvider.cs | 66 + .../Core/test/StarWars/Types/CharacterType.cs | 2 +- .../test/Types.Tests/Types/JsonTypeTests.cs | 367 ---- .../Types.Tests/Types/Scalars/AnyTypeTests.cs | 1648 +++++++++++------ ...ts.Input_Value_ObjectDict_As_Variable.snap | 7 +- ...eTests.Input_Value_Object_As_Variable.snap | 7 +- .../Core/test/Utilities/TestHelper.cs | 6 +- .../CodeGeneration/Utilities/SchemaHelper.cs | 2 +- 16 files changed, 1513 insertions(+), 1352 deletions(-) delete mode 100644 src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs create mode 100644 src/HotChocolate/Core/src/Types/Utilities/DictionaryToJsonDocumentConverter.cs create mode 100644 src/HotChocolate/Core/src/Types/Utilities/JsonElementTypeChangeProvider.cs delete mode 100644 src/HotChocolate/Core/test/Types.Tests/Types/JsonTypeTests.cs diff --git a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeConversion.cs b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeConversion.cs index 6682a7a82f2..b1c3343209e 100644 --- a/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeConversion.cs +++ b/src/HotChocolate/Core/src/Types/Execution/DependencyInjection/RequestExecutorBuilderExtensions.TypeConversion.cs @@ -7,90 +7,279 @@ namespace Microsoft.Extensions.DependencyInjection; public static partial class RequestExecutorBuilderExtensions { + /// <summary> + /// Registers the JSON type converter that automatically converts any type to <see cref="System.Text.Json.JsonElement"/> + /// by serializing it using <see cref="System.Text.Json.JsonSerializer"/>. + /// This is useful when working with the <c>AnyType</c> scalar or when you need to serialize + /// custom types to JSON for GraphQL output. + /// </summary> + /// <param name="builder"> + /// The <see cref="IRequestExecutorBuilder"/> to register the JSON type converter with. + /// </param> + /// <returns> + /// The <see cref="IRequestExecutorBuilder"/> for chaining. + /// </returns> + /// <remarks> + /// This converter uses expression compilation and reflection, which is not compatible with Native AOT. + /// </remarks> + [RequiresDynamicCode("The JSON type converter uses Expression.Compile which requires dynamic code generation.")] + [RequiresUnreferencedCode("The JSON type converter uses reflection to access generic serialization methods.")] + public static IRequestExecutorBuilder AddJsonTypeConverter( + this IRequestExecutorBuilder builder) + { + builder.Services.AddSingleton<IChangeTypeProvider, JsonElementTypeChangeProvider>(); + return builder; + } + + /// <summary> + /// Registers a custom type converter provider that can convert between types at runtime. + /// Type converters are used when GraphQL needs to convert values between runtime types, + /// such as converting input values to resolver parameter types or converting output values + /// to the expected GraphQL field type. + /// </summary> + /// <typeparam name="T"> + /// The type converter provider implementation that implements <see cref="IChangeTypeProvider"/>. + /// </typeparam> + /// <param name="builder"> + /// The <see cref="IRequestExecutorBuilder"/> to register the type converter with. + /// </param> + /// <returns> + /// The <see cref="IRequestExecutorBuilder"/> for chaining. + /// </returns> + /// <exception cref="ArgumentNullException"> + /// Thrown if <paramref name="builder"/> is <c>null</c>. + /// </exception> public static IRequestExecutorBuilder AddTypeConverter<T>( this IRequestExecutorBuilder builder) where T : class, IChangeTypeProvider { - ArgumentNullException.ThrowIfNull(builder); - builder.Services.AddSingleton<IChangeTypeProvider, T>(); return builder; } + /// <summary> + /// Registers a custom type converter provider using a factory function. + /// This overload allows the type converter to access services from the dependency injection container. + /// </summary> + /// <typeparam name="T"> + /// The type converter provider implementation that implements <see cref="IChangeTypeProvider"/>. + /// </typeparam> + /// <param name="builder"> + /// The <see cref="IRequestExecutorBuilder"/> to register the type converter with. + /// </param> + /// <param name="factory"> + /// A factory function that creates the type converter instance using the service provider. + /// </param> + /// <returns> + /// The <see cref="IRequestExecutorBuilder"/> for chaining. + /// </returns> + /// <exception cref="ArgumentNullException"> + /// Thrown if <paramref name="builder"/> or <paramref name="factory"/> is <c>null</c>. + /// </exception> public static IRequestExecutorBuilder AddTypeConverter<T>( this IRequestExecutorBuilder builder, Func<IServiceProvider, T> factory) where T : class, IChangeTypeProvider { - ArgumentNullException.ThrowIfNull(builder); - ArgumentNullException.ThrowIfNull(factory); - builder.Services.AddSingleton<IChangeTypeProvider>(factory); return builder; } + /// <summary> + /// Registers a type converter that converts from <typeparamref name="TSource"/> to <typeparamref name="TTarget"/> + /// using the provided delegate function. + /// </summary> + /// <typeparam name="TSource"> + /// The source type to convert from. + /// </typeparam> + /// <typeparam name="TTarget"> + /// The target type to convert to. + /// </typeparam> + /// <param name="builder"> + /// The <see cref="IRequestExecutorBuilder"/> to register the type converter with. + /// </param> + /// <param name="changeType"> + /// A function that performs the conversion from <typeparamref name="TSource"/> to <typeparamref name="TTarget"/>. + /// </param> + /// <returns> + /// The <see cref="IRequestExecutorBuilder"/> for chaining. + /// </returns> + /// <exception cref="ArgumentNullException"> + /// Thrown if <paramref name="builder"/> or <paramref name="changeType"/> is <c>null</c>. + /// </exception> + /// <example> + /// <code> + /// builder.AddTypeConverter<Foo, JsonElement>( + /// from => JsonSerializer.SerializeToElement(from)); + /// </code> + /// </example> public static IRequestExecutorBuilder AddTypeConverter<TSource, TTarget>( this IRequestExecutorBuilder builder, ChangeType<TSource, TTarget> changeType) { - ArgumentNullException.ThrowIfNull(builder); - ArgumentNullException.ThrowIfNull(changeType); - builder.Services.AddSingleton<IChangeTypeProvider>( new DelegateChangeTypeProvider<TSource, TTarget>(changeType)); return builder; } + /// <summary> + /// Registers a type converter provider using a delegate that can handle multiple type conversions. + /// The delegate receives the source and target types and returns a converter function if it can + /// handle the conversion. + /// </summary> + /// <param name="builder"> + /// The <see cref="IRequestExecutorBuilder"/> to register the type converter with. + /// </param> + /// <param name="changeType"> + /// A delegate that examines the source and target types and returns a converter function if applicable. + /// </param> + /// <returns> + /// The <see cref="IRequestExecutorBuilder"/> for chaining. + /// </returns> + /// <exception cref="ArgumentNullException"> + /// Thrown if <paramref name="builder"/> or <paramref name="changeType"/> is <c>null</c>. + /// </exception> public static IRequestExecutorBuilder AddTypeConverter( this IRequestExecutorBuilder builder, ChangeTypeProvider changeType) { - ArgumentNullException.ThrowIfNull(builder); - ArgumentNullException.ThrowIfNull(changeType); - builder.Services.AddSingleton<IChangeTypeProvider>( new DelegateChangeTypeProvider(changeType)); return builder; } + /// <summary> + /// Registers the JSON type converter that automatically converts any type to <see cref="System.Text.Json.JsonElement"/> + /// by serializing it using <see cref="System.Text.Json.JsonSerializer"/>. + /// This is useful when working with the <c>AnyType</c> scalar or when you need to serialize + /// custom types to JSON for GraphQL output. + /// </summary> + /// <param name="services"> + /// The <see cref="IServiceCollection"/> to register the JSON type converter with. + /// </param> + /// <returns> + /// The <see cref="IServiceCollection"/> for chaining. + /// </returns> + /// <remarks> + /// This converter uses expression compilation and reflection, which is not compatible with Native AOT. + /// </remarks> + [RequiresDynamicCode("The JSON type converter uses Expression.Compile which requires dynamic code generation.")] + [RequiresUnreferencedCode("The JSON type converter uses reflection to access generic serialization methods.")] + public static IServiceCollection AddJsonTypeConverter( + this IServiceCollection services) + { + return services.AddSingleton<IChangeTypeProvider, JsonElementTypeChangeProvider>(); + } + + /// <summary> + /// Registers a custom type converter provider that can convert between types at runtime. + /// Type converters are used when GraphQL needs to convert values between runtime types, + /// such as converting input values to resolver parameter types or converting output values + /// to the expected GraphQL field type. + /// </summary> + /// <typeparam name="T"> + /// The type converter provider implementation that implements <see cref="IChangeTypeProvider"/>. + /// </typeparam> + /// <param name="services"> + /// The <see cref="IServiceCollection"/> to register the type converter with. + /// </param> + /// <returns> + /// The <see cref="IServiceCollection"/> for chaining. + /// </returns> + /// <exception cref="ArgumentNullException"> + /// Thrown if <paramref name="services"/> is <c>null</c>. + /// </exception> public static IServiceCollection AddTypeConverter<T>( this IServiceCollection services) where T : class, IChangeTypeProvider { - ArgumentNullException.ThrowIfNull(services); - return services.AddSingleton<IChangeTypeProvider, T>(); } + /// <summary> + /// Registers a custom type converter provider using a factory function. + /// This overload allows the type converter to access services from the dependency injection container. + /// </summary> + /// <typeparam name="T"> + /// The type converter provider implementation that implements <see cref="IChangeTypeProvider"/>. + /// </typeparam> + /// <param name="services"> + /// The <see cref="IServiceCollection"/> to register the type converter with. + /// </param> + /// <param name="factory"> + /// A factory function that creates the type converter instance using the service provider. + /// </param> + /// <returns> + /// The <see cref="IServiceCollection"/> for chaining. + /// </returns> + /// <exception cref="ArgumentNullException"> + /// Thrown if <paramref name="services"/> or <paramref name="factory"/> is <c>null</c>. + /// </exception> public static IServiceCollection AddTypeConverter<T>( this IServiceCollection services, Func<IServiceProvider, T> factory) where T : class, IChangeTypeProvider { - ArgumentNullException.ThrowIfNull(services); - ArgumentNullException.ThrowIfNull(factory); - return services.AddSingleton<IChangeTypeProvider>(factory); } + /// <summary> + /// Registers a type converter that converts from <typeparamref name="TSource"/> to <typeparamref name="TTarget"/> + /// using the provided delegate function. + /// </summary> + /// <typeparam name="TSource"> + /// The source type to convert from. + /// </typeparam> + /// <typeparam name="TTarget"> + /// The target type to convert to. + /// </typeparam> + /// <param name="services"> + /// The <see cref="IServiceCollection"/> to register the type converter with. + /// </param> + /// <param name="changeType"> + /// A function that performs the conversion from <typeparamref name="TSource"/> to <typeparamref name="TTarget"/>. + /// </param> + /// <returns> + /// The <see cref="IServiceCollection"/> for chaining. + /// </returns> + /// <exception cref="ArgumentNullException"> + /// Thrown if <paramref name="services"/> or <paramref name="changeType"/> is <c>null</c>. + /// </exception> + /// <example> + /// <code> + /// services.AddTypeConverter<Foo, JsonElement>( + /// from => JsonSerializer.SerializeToElement(from)); + /// </code> + /// </example> public static IServiceCollection AddTypeConverter<TSource, TTarget>( this IServiceCollection services, ChangeType<TSource, TTarget> changeType) { - ArgumentNullException.ThrowIfNull(services); - ArgumentNullException.ThrowIfNull(changeType); - return services.AddSingleton<IChangeTypeProvider>( new DelegateChangeTypeProvider<TSource, TTarget>(changeType)); } + /// <summary> + /// Registers a type converter provider using a delegate that can handle multiple type conversions. + /// The delegate receives the source and target types and returns a converter function if it can + /// handle the conversion. + /// </summary> + /// <param name="services"> + /// The <see cref="IServiceCollection"/> to register the type converter with. + /// </param> + /// <param name="changeType"> + /// A delegate that examines the source and target types and returns a converter function if applicable. + /// </param> + /// <returns> + /// The <see cref="IServiceCollection"/> for chaining. + /// </returns> + /// <exception cref="ArgumentNullException"> + /// Thrown if <paramref name="services"/> or <paramref name="changeType"/> is <c>null</c>. + /// </exception> public static IServiceCollection AddTypeConverter( this IServiceCollection services, ChangeTypeProvider changeType) { - ArgumentNullException.ThrowIfNull(services); - ArgumentNullException.ThrowIfNull(changeType); - return services.AddSingleton<IChangeTypeProvider>( new DelegateChangeTypeProvider(changeType)); } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs deleted file mode 100644 index 51e81291427..00000000000 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs +++ /dev/null @@ -1,365 +0,0 @@ -using System.Globalization; -using System.Runtime.InteropServices; -using System.Text.Json; -using HotChocolate.Features; -using HotChocolate.Language; -using HotChocolate.Text.Json; -using static HotChocolate.Utilities.ThrowHelper; - -namespace HotChocolate.Types; - -public class AnyType : ScalarType -{ - /// <summary> - /// Initializes a new instance of the <see cref="AnyType"/> class. - /// </summary> - public AnyType( - string name, - string? description = null, - BindingBehavior bind = BindingBehavior.Explicit) - : base(name, bind) - { - Description = description; - } - - /// <summary> - /// Initializes a new instance of the <see cref="AnyType"/> class. - /// </summary> - [ActivatorUtilitiesConstructor] - public AnyType() : this(ScalarNames.Any) - { - } - - public override Type RuntimeType => typeof(object); - - public override ScalarSerializationType SerializationType => ScalarSerializationType.Any; - - public override bool IsValueCompatible(IValueNode valueLiteral) - { - switch (valueLiteral) - { - case StringValueNode: - case IntValueNode: - case FloatValueNode: - case BooleanValueNode: - case ListValueNode: - case ObjectValueNode: - return true; - - default: - return false; - } - } - - public override object CoerceInputLiteral(IValueNode literal) - { - switch (literal) - { - case StringValueNode svn: - return svn.Value; - - case IntValueNode ivn: - return long.Parse(ivn.Value, CultureInfo.InvariantCulture); - - case FloatValueNode fvn: - return decimal.Parse(fvn.Value, CultureInfo.InvariantCulture); - - case BooleanValueNode bvn: - return bvn.Value; - - case ListValueNode lvn: - var list = new List<object?>(); - foreach (var item in lvn.Items) - { - list.Add(CoerceInputLiteral(item)); - } - return list; - - case ObjectValueNode ovn: - var obj = new Dictionary<string, object?>(); - foreach (var field in ovn.Fields) - { - obj[field.Name.Value] = CoerceInputLiteral(field.Value); - } - return obj; - - case NullValueNode: - return null!; - - default: - throw Scalar_Cannot_CoerceInputLiteral(this, literal); - } - } - - public override object CoerceInputValue(JsonElement inputValue, IFeatureProvider context) - { - switch (inputValue.ValueKind) - { - case JsonValueKind.String: - return inputValue.GetString()!; - - case JsonValueKind.Number: - var rawBytes = JsonMarshal.GetRawUtf8Value(inputValue); - - // Check for decimal point (0x2E) or exponent (0x65 'e', 0x45 'E') - if (rawBytes.IndexOfAny((byte)'.', (byte)'e', (byte)'E') >= 0) - { - return inputValue.GetDecimal(); - } - - if (inputValue.TryGetInt64(out var longValue)) - { - return longValue; - } - - // Fallback for numbers outside int64 range - return inputValue.GetDecimal(); - - case JsonValueKind.True: - return true; - - case JsonValueKind.False: - return false; - - case JsonValueKind.Null: - return null!; - - case JsonValueKind.Array: - var list = new List<object?>(); - foreach (var item in inputValue.EnumerateArray()) - { - list.Add(CoerceInputValue(item, context)); - } - return list; - - case JsonValueKind.Object: - var obj = new Dictionary<string, object?>(); - foreach (var property in inputValue.EnumerateObject()) - { - obj[property.Name] = CoerceInputValue(property.Value, context); - } - return obj; - - default: - throw Scalar_Cannot_CoerceInputValue(this, inputValue); - } - } - - public override void CoerceOutputValue(object runtimeValue, ResultElement resultValue) - { - HashSet<object>? processed = null; - TryCoerceOutputValue(runtimeValue, resultValue, ref processed); - } - - private static bool TryCoerceOutputValue(object? runtimeValue, ResultElement resultValue, ref HashSet<object>? set) - { - if (runtimeValue is null) - { - resultValue.SetNullValue(); - return true; - } - - switch (runtimeValue) - { - case string castedString: - resultValue.SetStringValue(castedString); - return true; - - case short castedShort: - resultValue.SetNumberValue(castedShort); - return true; - - case int castedInt: - resultValue.SetNumberValue(castedInt); - return true; - - case long castedLong: - resultValue.SetNumberValue(castedLong); - return true; - - case float castedFloat: - resultValue.SetNumberValue(castedFloat); - return true; - - case double castedDouble: - resultValue.SetNumberValue(castedDouble); - return true; - - case decimal castedDecimal: - resultValue.SetNumberValue(castedDecimal); - return true; - - case bool castedBool: - resultValue.SetBooleanValue(castedBool); - return true; - - case sbyte castedSByte: - resultValue.SetNumberValue(castedSByte); - return true; - - case byte castedByte: - resultValue.SetNumberValue(castedByte); - return true; - - case ushort castedUShort: - resultValue.SetNumberValue(castedUShort); - return true; - - case uint castedUInt: - resultValue.SetNumberValue(castedUInt); - return true; - - case ulong castedULong: - resultValue.SetNumberValue(castedULong); - return true; - - case List<object?> castedList: - { - set ??= new HashSet<object>(ReferenceEqualityComparer.Instance); - - try - { - if (!set.Add(castedList)) - { - return false; - } - - using var enumerator = castedList.GetEnumerator(); - - resultValue.SetArrayValue(castedList.Count); - foreach (var element in resultValue.EnumerateArray()) - { - enumerator.MoveNext(); - if (!TryCoerceOutputValue(enumerator.Current, element, ref set)) - { - element.Invalidate(); - } - } - return true; - } - finally - { - set?.Remove(castedList); - } - } - - case Dictionary<string, object?> castedObject: - { - set ??= new HashSet<object>(ReferenceEqualityComparer.Instance); - - try - { - if (!set.Add(castedObject)) - { - return false; - } - - using var enumerator = castedObject.GetEnumerator(); - - resultValue.SetObjectValue(castedObject.Count); - foreach (var property in resultValue.EnumerateObject()) - { - enumerator.MoveNext(); - property.Value.SetPropertyName(enumerator.Current.Key); - if (!TryCoerceOutputValue(enumerator.Current.Value, property.Value, ref set)) - { - property.Value.Invalidate(); - } - } - return true; - } - finally - { - set?.Remove(castedObject); - } - } - - default: - return false; - } - } - - public override IValueNode ValueToLiteral(object runtimeValue) - { - HashSet<object>? processed = null; - return ValueToLiteral(runtimeValue, ref processed, this); - } - - private static IValueNode ValueToLiteral(object? value, ref HashSet<object>? set, AnyType type) - { - if (value is null) - { - return NullValueNode.Default; - } - - switch (value) - { - case string s: - return new StringValueNode(s); - - case short s: - return new IntValueNode(s); - case int i: - return new IntValueNode(i); - case long l: - return new IntValueNode(l); - case byte b: - return new IntValueNode(b); - case sbyte s: - return new IntValueNode(s); - case ushort u: - return new IntValueNode(u); - case uint u: - return new IntValueNode(u); - case ulong u: - return new IntValueNode(u); - - case float f: - return new FloatValueNode(f); - case double d: - return new FloatValueNode(d); - case decimal d: - return new FloatValueNode(d); - - case bool b: - return new BooleanValueNode(b); - } - - // Handle collections with cycle detection - set ??= new HashSet<object>(ReferenceEqualityComparer.Instance); - - if (!set.Add(value)) - { - throw Scalar_Cannot_ConvertValueToLiteral(type, value); - } - - try - { - switch (value) - { - case IReadOnlyList<object?> list: - var items = new List<IValueNode>(list.Count); - foreach (var item in list) - { - items.Add(ValueToLiteral(item, ref set, type)); - } - return new ListValueNode(items); - - case IReadOnlyDictionary<string, object?> obj: - var fields = new List<ObjectFieldNode>(obj.Count); - foreach (var kvp in obj) - { - fields.Add(new ObjectFieldNode(kvp.Key, ValueToLiteral(kvp.Value, ref set, type))); - } - return new ObjectValueNode(fields); - - default: - throw Scalar_Cannot_ConvertValueToLiteral(type, value); - } - } - finally - { - set?.Remove(value); - } - } -} diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs index 9e5093073ea..43d37144c85 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs @@ -1,7 +1,5 @@ using System.Buffers; using System.Buffers.Text; -using System.Runtime.InteropServices; -using System.Text.Encodings.Web; using System.Text.Json; using HotChocolate.Buffers; using HotChocolate.Features; diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs index 1ce8f4af304..09be8490f7a 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs @@ -5,6 +5,7 @@ using HotChocolate.Language; using HotChocolate.Language.Visitors; using HotChocolate.Text.Json; +using HotChocolate.Types.Composite; using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; @@ -16,22 +17,22 @@ namespace HotChocolate.Types; /// </para> /// <para>The runtime representation of the JSON scalar is an <see cref="JsonElement"/>.</para> /// </summary> -public sealed class JsonType : ScalarType<JsonElement> +public sealed class AnyType : ScalarType<JsonElement> { /// <summary> - /// Initializes a new instance of <see cref="JsonType"/>. + /// Initializes a new instance of <see cref="AnyType"/>. /// </summary> - public JsonType(string name, BindingBehavior bind = BindingBehavior.Explicit) + public AnyType(string name, BindingBehavior bind = BindingBehavior.Explicit) : base(name, bind) { } /// <summary> - /// Initializes a new instance of <see cref="JsonType"/>. + /// Initializes a new instance of <see cref="AnyType"/>. /// </summary> [ActivatorUtilitiesConstructor] - public JsonType() - : this(ScalarNames.JSON, BindingBehavior.Implicit) + public AnyType() + : this(ScalarNames.Any, BindingBehavior.Implicit) { } @@ -41,13 +42,15 @@ public override ScalarSerializationType SerializationType /// <inheritdoc /> public override bool IsValueCompatible(IValueNode valueLiteral) - => valueLiteral.Kind is - SyntaxKind.ObjectValue or - SyntaxKind.ListValue or - SyntaxKind.StringValue or - SyntaxKind.IntValue or - SyntaxKind.FloatValue or - SyntaxKind.BooleanValue; + => valueLiteral is + { + Kind: SyntaxKind.ObjectValue or + SyntaxKind.ListValue or + SyntaxKind.StringValue or + SyntaxKind.IntValue or + SyntaxKind.FloatValue or + SyntaxKind.BooleanValue + }; /// <inheritdoc /> public override bool IsValueCompatible(JsonElement inputValue) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarNames.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarNames.cs index 9355353e64a..9e3469992aa 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarNames.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarNames.cs @@ -18,7 +18,6 @@ public static class ScalarNames public const string DateTime = nameof(DateTime); public const string Date = nameof(Date); public const string TimeSpan = nameof(TimeSpan); - public const string JSON = nameof(JSON); public const string LocalDate = nameof(LocalDate); public const string LocalDateTime = nameof(LocalDateTime); public const string LocalTime = nameof(LocalTime); diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/Scalars.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/Scalars.cs index fc1db614bf8..8d68bbfa04c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/Scalars.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/Scalars.cs @@ -31,7 +31,7 @@ public static class Scalars { typeof(DateOnly), typeof(LocalDateType) }, { typeof(TimeOnly), typeof(LocalTimeType) }, - { typeof(JsonElement), typeof(JsonType) } + { typeof(JsonElement), typeof(AnyType) } }; private static readonly Dictionary<string, Type> s_nameLookup = new() @@ -57,8 +57,7 @@ public static class Scalars { ScalarNames.LocalDateTime, typeof(LocalDateTimeType) }, { ScalarNames.LocalTime, typeof(LocalTimeType) }, - { ScalarNames.ByteArray, typeof(ByteArrayType) }, - { ScalarNames.JSON, typeof(JsonType) } + { ScalarNames.ByteArray, typeof(ByteArrayType) } }; private static readonly Dictionary<Type, ValueKind> s_scalarKinds = new() diff --git a/src/HotChocolate/Core/src/Types/Utilities/DefaultTypeConverter.Setup.cs b/src/HotChocolate/Core/src/Types/Utilities/DefaultTypeConverter.Setup.cs index c0f32681c44..a1c55663333 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/DefaultTypeConverter.Setup.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/DefaultTypeConverter.Setup.cs @@ -365,4 +365,17 @@ private static void RegisterStringListConversions( registry.Register<List<string>, ImmutableArray<string>>( from => from.ToImmutableArray()); } + + private static void RegisterJsonElementConversions( + DefaultTypeConverter registry) + { + registry.Register<IReadOnlyDictionary<string, object?>, JsonElement>( + DictionaryToJsonDocumentConverter.FromDictionary); + registry.Register<JsonElement, IReadOnlyDictionary<string, object?>>( + DictionaryToJsonDocumentConverter.ToDictionary); + registry.Register<IReadOnlyList<object?>, JsonElement>( + DictionaryToJsonDocumentConverter.FromList); + registry.Register<JsonElement, IReadOnlyList<object?>>( + DictionaryToJsonDocumentConverter.ToList); + } } diff --git a/src/HotChocolate/Core/src/Types/Utilities/DictionaryToJsonDocumentConverter.cs b/src/HotChocolate/Core/src/Types/Utilities/DictionaryToJsonDocumentConverter.cs new file mode 100644 index 00000000000..6b65ebf9b57 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Utilities/DictionaryToJsonDocumentConverter.cs @@ -0,0 +1,112 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq.Expressions; +using System.Reflection; +using System.Text.Encodings.Web; +using System.Text.Json; +using HotChocolate.Buffers; +using HotChocolate.Execution; +using HotChocolate.Text.Json; + +namespace HotChocolate.Utilities; + +internal static class DictionaryToJsonDocumentConverter +{ + private static readonly JsonWriterOptions s_options = new JsonWriterOptions + { + Indented = false, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; + + private static readonly JsonSerializerOptions s_jsonSerializerOptions = new(JsonSerializerDefaults.Web); + + public static JsonElement FromDictionary(IReadOnlyDictionary<string, object?> dictionary) + { + using var buffer = new PooledArrayWriter(); + var writer = new JsonWriter(buffer, s_options); + JsonValueFormatter.WriteDictionary(writer, dictionary, s_jsonSerializerOptions, JsonNullIgnoreCondition.None); + + var jsonReader = new Utf8JsonReader(buffer.WrittenSpan); + return JsonElement.ParseValue(ref jsonReader); + } + + public static Dictionary<string, object?> ToDictionary(JsonElement element) + { + if (element.ValueKind != JsonValueKind.Object) + { + throw new ArgumentException("JsonElement must be an object.", nameof(element)); + } + + var dictionary = new Dictionary<string, object?>(); + + foreach (var property in element.EnumerateObject()) + { + dictionary[property.Name] = ConvertValue(property.Value); + } + + return dictionary; + } + + public static JsonElement FromList(IReadOnlyList<object?> list) + { + using var buffer = new PooledArrayWriter(); + var writer = new JsonWriter(buffer, s_options); + JsonValueFormatter.WriteValue(writer, list, s_jsonSerializerOptions, JsonNullIgnoreCondition.None); + + var jsonReader = new Utf8JsonReader(buffer.WrittenSpan); + return JsonElement.ParseValue(ref jsonReader); + } + + public static List<object?> ToList(JsonElement element) + { + if (element.ValueKind != JsonValueKind.Array) + { + throw new ArgumentException("JsonElement must be an array.", nameof(element)); + } + + var list = new List<object?>(); + + foreach (var item in element.EnumerateArray()) + { + list.Add(ConvertValue(item)); + } + + return list; + } + + private static object? ConvertValue(JsonElement element) + { + return element.ValueKind switch + { + JsonValueKind.String => element.GetString(), + JsonValueKind.Number => ConvertNumber(element), + JsonValueKind.True => true, + JsonValueKind.False => false, + JsonValueKind.Null => null, + JsonValueKind.Object => ToDictionary(element), + JsonValueKind.Array => ToList(element), + _ => throw new ArgumentException($"Unsupported JsonValueKind: {element.ValueKind}") + }; + } + + private static object ConvertNumber(JsonElement element) + { + // Try to parse as specific numeric types in order of precision + if (element.TryGetInt32(out var intValue)) + { + return intValue; + } + + if (element.TryGetInt64(out var longValue)) + { + return longValue; + } + + if (element.TryGetDecimal(out var decimalValue)) + { + return decimalValue; + } + + // Fallback to double for any other numeric values + return element.GetDouble(); + } +} diff --git a/src/HotChocolate/Core/src/Types/Utilities/JsonElementTypeChangeProvider.cs b/src/HotChocolate/Core/src/Types/Utilities/JsonElementTypeChangeProvider.cs new file mode 100644 index 00000000000..2cded58ea36 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Utilities/JsonElementTypeChangeProvider.cs @@ -0,0 +1,66 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq.Expressions; +using System.Reflection; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace HotChocolate.Utilities; + +[RequiresDynamicCode("Uses Expression.Compile which requires dynamic code generation.")] +[RequiresUnreferencedCode("Uses reflection to access the Serialize method.")] +internal sealed class JsonElementTypeChangeProvider : IChangeTypeProvider +{ + private static readonly JsonSerializerOptions s_options = + new JsonSerializerOptions(JsonSerializerDefaults.Web) + { + Converters = { new JsonStringEnumConverter() } + }; + + public bool TryCreateConverter( + Type source, + Type target, + ChangeTypeProvider root, + [NotNullWhen(true)] out ChangeType? converter) + { + if (target == typeof(JsonElement)) + { + var serializeMethod = typeof(JsonElementTypeChangeProvider) + .GetMethod(nameof(Serialize), BindingFlags.NonPublic | BindingFlags.Static)! + .MakeGenericMethod(source); + + var parameter = Expression.Parameter(typeof(object), "obj"); + var castParameter = Expression.Convert(parameter, source); + var methodCall = Expression.Call(serializeMethod, castParameter); + var convertResult = Expression.Convert(methodCall, typeof(object)); + var lambda = Expression.Lambda<ChangeType>(convertResult, parameter); + converter = lambda.Compile(); + + return true; + } + + if (source == typeof(JsonElement)) + { + var serializeMethod = typeof(JsonElementTypeChangeProvider) + .GetMethod(nameof(Deserialize), BindingFlags.NonPublic | BindingFlags.Static)! + .MakeGenericMethod(target); + + var parameter = Expression.Parameter(typeof(object), "obj"); + var castParameter = Expression.Convert(parameter, source); + var methodCall = Expression.Call(serializeMethod, castParameter); + var convertResult = Expression.Convert(methodCall, typeof(object)); + var lambda = Expression.Lambda<ChangeType>(convertResult, parameter); + converter = lambda.Compile(); + + return true; + } + + converter = null; + return false; + } + + private static JsonElement Serialize<T>(T obj) + => JsonSerializer.SerializeToElement(obj, s_options); + + private static T Deserialize<T>(JsonElement obj) + => obj.Deserialize<T>(s_options)!; +} diff --git a/src/HotChocolate/Core/test/StarWars/Types/CharacterType.cs b/src/HotChocolate/Core/test/StarWars/Types/CharacterType.cs index a782aae5730..cecfe575c55 100644 --- a/src/HotChocolate/Core/test/StarWars/Types/CharacterType.cs +++ b/src/HotChocolate/Core/test/StarWars/Types/CharacterType.cs @@ -22,7 +22,7 @@ protected override void Configure(IInterfaceTypeDescriptor<ICharacter> descripto .Type<ListType<EpisodeType>>(); descriptor.Field(f => f.Traits) - .Type<JsonType>(); + .Type<AnyType>(); descriptor.Field(f => f.Height) .Type<FloatType>() diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/JsonTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/JsonTypeTests.cs deleted file mode 100644 index f08d4fc87ea..00000000000 --- a/src/HotChocolate/Core/test/Types.Tests/Types/JsonTypeTests.cs +++ /dev/null @@ -1,367 +0,0 @@ -using System.Numerics; -using System.Text.Json; -using CookieCrumble.Xunit.Attributes; -using HotChocolate.Execution; -using Microsoft.Extensions.DependencyInjection; - -namespace HotChocolate.Types; - -public class JsonTypeTests -{ - [Fact] - public async Task Json_Schema() - { - var schema = - await new ServiceCollection() - .AddGraphQLServer() - .AddQueryType<Query>() - .BuildSchemaAsync(); - - schema.MatchInlineSnapshot( - """ - schema { - query: Query - } - - type Query { - someJson: JSON! - manyJson: [JSON!]! - inputJson(input: JSON!): JSON! - jsonFromString: JSON! - } - - scalar JSON - """); - } - - [Fact] - public async Task Output_Json_Object() - { - var result = - await new ServiceCollection() - .AddGraphQLServer() - .AddQueryType<Query>() - .ExecuteRequestAsync( - """ - { - someJson - } - """); - - result.MatchInlineSnapshot( - """ - { - "data": { - "someJson": { - "a": { - "b": 123.456 - } - } - } - } - """); - } - - [Fact] - public async Task Output_Json_Object_List() - { - var result = - await new ServiceCollection() - .AddGraphQLServer() - .AddQueryType<Query>() - .ExecuteRequestAsync( - """ - { - manyJson - } - """); - - result.MatchInlineSnapshot( - """ - { - "data": { - "manyJson": [ - { - "a": { - "b": 123.456 - } - }, - { - "x": { - "y": "y" - } - } - ] - } - } - """); - } - - [Fact] - public async Task Input_Json_Object_Literal() - { - var result = - await new ServiceCollection() - .AddGraphQLServer() - .AddQueryType<Query>() - .ExecuteRequestAsync( - """ - { - inputJson(input: { a: "abc" }) - } - """); - - result.MatchInlineSnapshot( - """ - { - "data": { - "inputJson": { - "a": "abc" - } - } - } - """); - } - - [Theory] - [UseCulture("en-US")] - [InlineData(0)] - [InlineData(-15)] - [InlineData(-10.5)] - [InlineData(1.5)] - [InlineData(1e15)] - public async Task Input_Json_Number_Literal(decimal value) - { - var result = - await new ServiceCollection() - .AddGraphQLServer() - .AddQueryType<Query>() - .ExecuteRequestAsync( - $$""" - { - inputJson(input: {{value}}) - } - """); - - result.MatchInlineSnapshot( - $$""" - { - "data": { - "inputJson": {{value}} - } - } - """); - } - - [Fact] - public async Task Input_Json_BigInt_Literal() - { - var value = BigInteger.Parse("100000000000000000000000050"); - - var result = - await new ServiceCollection() - .AddGraphQLServer() - .AddQueryType<Query>() - .ExecuteRequestAsync( - $$""" - { - inputJson(input: {{value}}) - } - """); - - result.MatchInlineSnapshot( - $$""" - { - "data": { - "inputJson": {{value}} - } - } - """); - } - - [Fact] - public async Task Input_Json_Exponent_Literal() - { - var result = - await new ServiceCollection() - .AddGraphQLServer() - .AddQueryType<Query>() - .ExecuteRequestAsync( - """ - { - inputJson(input: 1e1345) - } - """); - - result.MatchInlineSnapshot( - """ - { - "data": { - "inputJson": 1e1345 - } - } - """); - } - - [Theory] - [InlineData("true")] - [InlineData("false")] - public async Task Input_Json_Bool_Literal(string value) - { - var result = - await new ServiceCollection() - .AddGraphQLServer() - .AddQueryType<Query>() - .ExecuteRequestAsync( - $$""" - { - inputJson(input: {{value}}) - } - """); - - result.MatchInlineSnapshot( - $$""" - { - "data": { - "inputJson": {{value}} - } - } - """); - } - - [Fact] - public async Task Input_Json_Object_List() - { - var result = - await new ServiceCollection() - .AddGraphQLServer() - .AddQueryType<Query>() - .ExecuteRequestAsync( - """ - { - inputJson(input: { a: ["abc"] }) - } - """); - - result.MatchInlineSnapshot( - """ - { - "data": { - "inputJson": { - "a": [ - "abc" - ] - } - } - } - """); - } - - [Fact] - public async Task Input_Json_Object_Variables() - { - var input = JsonDocument.Parse( - """ - { - "a": { - "b": 123.456 - } - } - """).RootElement; - - var result = - await new ServiceCollection() - .AddGraphQLServer() - .AddQueryType<Query>() - .ExecuteRequestAsync( - OperationRequestBuilder.New() - .SetDocument( - """ - query($input: JSON!) { - inputJson(input: $input) - } - """) - .SetVariableValues(new Dictionary<string, object?> { { "input", input } }) - .Build()); - - result.MatchInlineSnapshot( - """ - { - "data": { - "inputJson": { - "a": { - "b": 123.456 - } - } - } - } - """); - } - - [Fact] - public async Task Output_Json_From_String() - { - var result = - await new ServiceCollection() - .AddGraphQLServer() - .AddQueryType<Query>() - .ExecuteRequestAsync( - """ - { - jsonFromString - } - """); - - result.MatchInlineSnapshot( - """ - { - "data": { - "jsonFromString": { - "a": "b" - } - } - } - """); - } - - public class Query - { - public JsonElement GetSomeJson() - => JsonDocument.Parse( - """ - { - "a": { - "b": 123.456 - } - } - """).RootElement; - - public IEnumerable<JsonElement> GetManyJson() - { - yield return JsonDocument.Parse( - """ - { - "a": { - "b": 123.456 - } - } - """).RootElement; - - yield return JsonDocument.Parse( - """ - { - "x": { - "y": "y" - } - } - """).RootElement; - } - - public JsonElement InputJson(JsonElement input) - => input; - - [GraphQLType<NonNullType<JsonType>>] - public string JsonFromString() - => "{ \"a\": \"b\" }"; - } -} diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs index 30a1d216c7b..7bff3ac0d76 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/AnyTypeTests.cs @@ -1,5 +1,8 @@ using System.Collections.Immutable; using System.Dynamic; +using System.Numerics; +using System.Text.Json; +using CookieCrumble.Xunit.Attributes; using HotChocolate.Execution; using HotChocolate.Language; using HotChocolate.Tests; @@ -19,22 +22,23 @@ public async Task Output_Return_Object() foo.Bar1 = bar; foo.Bar2 = bar; - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Resolve(_ => foo)) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Resolve(_ => foo)) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync("{ foo }"); // assert - result.ToJson().MatchSnapshot(); + result.MatchSnapshot(); } [Fact] @@ -46,22 +50,26 @@ public async Task Output_Return_ObjectCyclic() fooCyclic.BarCyclic = barCyclic; barCyclic.FooCyclic = fooCyclic; - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("fooCyclic") - .Type<AnyType>() - .Resolve(_ => fooCyclic)) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("fooCyclic") + .Type<AnyType>() + .Resolve(_ => fooCyclic)) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = (await executor.ExecuteAsync("{ fooCyclic }")).ExpectOperationResult(); // assert - Assert.Equal("Cycle in object graph detected.", result.Errors?.Single().Exception?.Message); + Assert.Equal( + "Any cannot coerce the runtime value of type `HotChocolate.Types.AnyTypeTests+FooCyclic` " + + "into the result value format.", + result.Errors?.Single()?.Message); } [Fact] @@ -73,16 +81,17 @@ public async Task Output_Return_List() foo.Bar1 = bar; foo.Bar2 = bar; - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Resolve(_ => new List<Foo> { foo, foo })) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Resolve(_ => new List<Foo> { foo, foo })) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync("{ foo }"); @@ -100,38 +109,44 @@ public async Task Output_Return_ListCyclic() fooCyclic.BarCyclic = barCyclic; barCyclic.FooCyclic = fooCyclic; - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("fooCyclic") - .Type<AnyType>() - .Resolve(_ => new List<FooCyclic> { fooCyclic, fooCyclic })) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("fooCyclic") + .Type<AnyType>() + .Resolve(_ => new List<FooCyclic> { fooCyclic, fooCyclic })) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = (await executor.ExecuteAsync("{ fooCyclic }")).ExpectOperationResult(); // assert - Assert.Equal("Cycle in object graph detected.", result.Errors?.Single().Exception?.Message); + Assert.Equal( + "Any cannot coerce the runtime value of type `System.Collections.Generic.List`1" + + "[[HotChocolate.Types.AnyTypeTests+FooCyclic, HotChocolate.Types.Tests, Version=0.0.0.0, " + + "Culture=neutral, PublicKeyToken=null]]` into the result value format.", + result.Errors?.Single()?.Message); } [Fact] public async Task Output_Return_RecordList() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Resolve(_ => new List<FooRecord> { new(), new() })) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Resolve(_ => new List<FooRecord> { new(), new() })) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync("{ foo }"); @@ -144,41 +159,50 @@ public async Task Output_Return_RecordList() public async Task Output_Return_DateTime() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Resolve( - _ => new DateTimeOffset( - new DateTime(2016, 01, 01), - TimeSpan.Zero))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Resolve( + _ => new DateTimeOffset( + new DateTime(2016, 01, 01), + TimeSpan.Zero))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync("{ foo }"); // assert - result.ToJson().MatchSnapshot(); + result.MatchInlineSnapshot( + """ + { + "data": { + "foo": "2016-01-01T00:00:00+00:00" + } + } + """); } [Fact] public async Task Output_Return_String() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Resolve(_ => "abc")) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Resolve(_ => "abc")) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync("{ foo }"); @@ -191,16 +215,17 @@ public async Task Output_Return_String() public async Task Output_Return_Int() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Resolve(_ => 123)) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Resolve(_ => 123)) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync("{ foo }"); @@ -213,16 +238,17 @@ public async Task Output_Return_Int() public async Task Output_Return_Float() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Resolve(_ => 1.2)) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Resolve(_ => 1.2)) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync("{ foo }"); @@ -235,16 +261,17 @@ public async Task Output_Return_Float() public async Task Output_Return_Boolean() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Resolve(_ => true)) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Resolve(_ => true)) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync("{ foo }"); @@ -257,17 +284,18 @@ public async Task Output_Return_Boolean() public async Task Input_Object() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -281,17 +309,18 @@ public async Task Input_Object() public async Task Input_Value_List() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -305,17 +334,18 @@ public async Task Input_Value_List() public async Task Input_Object_List() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -329,17 +359,18 @@ public async Task Input_Object_List() public async Task Input_Value_Object_To_Foo() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<Foo>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<Foo>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -353,17 +384,18 @@ public async Task Input_Value_Object_To_Foo() public async Task Input_Value_String() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -377,17 +409,18 @@ public async Task Input_Value_String() public async Task Input_Value_Int() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -401,17 +434,18 @@ public async Task Input_Value_Int() public async Task Input_Value_Float() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -425,17 +459,18 @@ public async Task Input_Value_Float() public async Task Input_Value_Boolean() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -449,17 +484,18 @@ public async Task Input_Value_Boolean() public async Task Input_Value_Null() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -473,17 +509,18 @@ public async Task Input_Value_Null() public async Task Input_Value_List_As_Variable() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -500,17 +537,18 @@ public async Task Input_Value_List_As_Variable() public async Task Input_Object_List_As_Variable() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -539,17 +577,18 @@ public async Task Input_Object_List_As_Variable() public async Task Input_Value_String_As_Variable() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -566,17 +605,18 @@ public async Task Input_Value_String_As_Variable() public async Task Input_Value_Int_As_Variable() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -593,17 +633,18 @@ public async Task Input_Value_Int_As_Variable() public async Task Input_Value_Float_As_Variable() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -620,17 +661,18 @@ public async Task Input_Value_Float_As_Variable() public async Task Input_Value_Object_As_Variable() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentLiteral<ObjectValueNode>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentLiteral<ObjectValueNode>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -647,17 +689,18 @@ public async Task Input_Value_Object_As_Variable() public async Task Input_Value_ObjectDict_As_Variable() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentLiteral<ObjectValueNode>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentLiteral<ObjectValueNode>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -678,17 +721,18 @@ public async Task Input_Value_ObjectDict_As_Variable() public async Task Input_Value_ArgumentKind() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentKind("input").ToString())) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentKind("input").ToString())) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -709,17 +753,18 @@ public async Task Input_Value_ArgumentKind() public async Task Input_Value_Boolean_As_Variable() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -736,17 +781,18 @@ public async Task Input_Value_Boolean_As_Variable() public async Task Input_Value_Null_As_Variable() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); - - var executor = schema.MakeExecutable(); + var executor = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // act var result = await executor.ExecuteAsync( @@ -760,18 +806,21 @@ public async Task Input_Value_Null_As_Variable() } [Fact] - public void IsValueCompatible_EnumValue_False() + public async Task IsValueCompatible_EnumValue_False() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); @@ -783,18 +832,21 @@ public void IsValueCompatible_EnumValue_False() } [Fact] - public void IsValueCompatible_ObjectValue_True() + public async Task IsValueCompatible_ObjectValue_True() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); @@ -806,18 +858,21 @@ public void IsValueCompatible_ObjectValue_True() } [Fact] - public void IsValueCompatible_ListValue_True() + public async Task IsValueCompatible_ListValue_True() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); @@ -829,18 +884,21 @@ public void IsValueCompatible_ListValue_True() } [Fact] - public void IsValueCompatible_StringValue_True() + public async Task IsValueCompatible_StringValue_True() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); @@ -852,18 +910,21 @@ public void IsValueCompatible_StringValue_True() } [Fact] - public void IsValueCompatible_IntValue_True() + public async Task IsValueCompatible_IntValue_True() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); @@ -875,18 +936,21 @@ public void IsValueCompatible_IntValue_True() } [Fact] - public void IsValueCompatible_FloatValue_True() + public async Task IsValueCompatible_FloatValue_True() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); @@ -898,18 +962,21 @@ public void IsValueCompatible_FloatValue_True() } [Fact] - public void IsValueCompatible_BooleanValue_True() + public async Task IsValueCompatible_BooleanValue_True() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); @@ -921,18 +988,21 @@ public void IsValueCompatible_BooleanValue_True() } [Fact] - public void IsValueCompatible_NullValue_True() + public async Task IsValueCompatible_NullValue_False() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); @@ -940,22 +1010,25 @@ public void IsValueCompatible_NullValue_True() var result = type.IsValueCompatible(NullValueNode.Default); // assert - Assert.True(result); + Assert.False(result); } [Fact] - public void IsValueCompatible_Null_ReturnsFalse() + public async Task IsValueCompatible_Null_ReturnsFalse() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); @@ -966,274 +1039,350 @@ public void IsValueCompatible_Null_ReturnsFalse() Assert.False(result); } - [InlineData("abc", typeof(StringValueNode))] - [InlineData((short)1, typeof(IntValueNode))] - [InlineData(1, typeof(IntValueNode))] - [InlineData((long)1, typeof(IntValueNode))] - [InlineData((float)1, typeof(FloatValueNode))] - [InlineData((double)1, typeof(FloatValueNode))] - [InlineData(true, typeof(BooleanValueNode))] - [InlineData(false, typeof(BooleanValueNode))] - [Theory] - public void ValueToLiteral_ScalarValues(object value, Type expectedType) + [Fact] + public async Task ValueToLiteral_String() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); + var value = JsonSerializer.SerializeToElement("abc"); // act var literal = type.ValueToLiteral(value); // assert - Assert.IsType(expectedType, literal); + Assert.IsType<StringValueNode>(literal); } [Fact] - public void ValueToLiteral_Decimal() + public async Task ValueToLiteral_Int() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); + var value = JsonSerializer.SerializeToElement(123); // act - var literal = type.ValueToLiteral((decimal)1); + var literal = type.ValueToLiteral(value); + + // assert + Assert.IsType<IntValueNode>(literal); + } + + [Fact] + public async Task ValueToLiteral_Float() + { + // arrange + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); + + var type = schema.Types.GetType<AnyType>("Any"); + var value = JsonSerializer.SerializeToElement(1.5); + + // act + var literal = type.ValueToLiteral(value); // assert Assert.IsType<FloatValueNode>(literal); } [Fact] - public void ValueToLiteral_List_Of_Object() + public async Task ValueToLiteral_True() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); + var value = JsonSerializer.SerializeToElement(true); // act - var literal = type.ValueToLiteral(new List<object>()); + var literal = type.ValueToLiteral(value); // assert - Assert.IsType<ListValueNode>(literal); + Assert.IsType<BooleanValueNode>(literal); } [Fact] - public void ValueToLiteral_List_Of_String() + public async Task ValueToLiteral_False() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); + var value = JsonSerializer.SerializeToElement(false); // act - var literal = type.ValueToLiteral(new List<string>()); + var literal = type.ValueToLiteral(value); // assert - Assert.IsType<ListValueNode>(literal); + Assert.IsType<BooleanValueNode>(literal); } [Fact] - public void ValueToLiteral_List_Of_Foo() + public async Task ValueToLiteral_Decimal() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); - var foo = new Foo(); - var bar = new Bar(); - foo.Bar1 = bar; - foo.Bar2 = bar; + var value = JsonSerializer.SerializeToElement(1.0m); // act - var literal = type.ValueToLiteral(new List<Foo> { foo, foo }); + var literal = type.ValueToLiteral(value); + + // assert + Assert.IsType<FloatValueNode>(literal); + } + + [Fact] + public async Task ValueToLiteral_List_Of_Object() + { + // arrange + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); + + var type = schema.Types.GetType<AnyType>("Any"); + var value = JsonSerializer.SerializeToElement(new List<object>()); + + // act + var literal = type.ValueToLiteral(value); // assert Assert.IsType<ListValueNode>(literal); } [Fact] - public void ValueToLiteral_List_Of_FooCyclic() + public async Task ValueToLiteral_List_Of_String() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); - var fooCyclic = new FooCyclic(); - var barCyclic = new BarCyclic(); - fooCyclic.BarCyclic = barCyclic; - barCyclic.FooCyclic = fooCyclic; + var value = JsonSerializer.SerializeToElement(new List<string>()); // act - void Act() => type.ValueToLiteral(new List<FooCyclic> { fooCyclic, fooCyclic }); + var literal = type.ValueToLiteral(value); // assert - Assert.Equal( - "Cycle in object graph detected.", - Assert.Throws<GraphQLException>(Act).Message); + Assert.IsType<ListValueNode>(literal); } [Fact] - public void ValueToLiteral_List_Of_FooRecord() + public async Task ValueToLiteral_List_Of_Foo() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); + var foo = new Foo(); + var bar = new Bar(); + foo.Bar1 = bar; + foo.Bar2 = bar; + var value = JsonSerializer.SerializeToElement(new List<Foo> { foo, foo }); // act - var literal = type.ValueToLiteral(new List<FooRecord> { new(), new() }); + var literal = type.ValueToLiteral(value); // assert Assert.IsType<ListValueNode>(literal); } [Fact] - public void ValueToLiteral_Foo() + public async Task ValueToLiteral_List_Of_FooRecord() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); + var value = JsonSerializer.SerializeToElement(new List<FooRecord> { new(), new() }); // act - var literal = type.ValueToLiteral(new Foo()); + var literal = type.ValueToLiteral(value); // assert - Assert.IsType<ObjectValueNode>(literal); + Assert.IsType<ListValueNode>(literal); } [Fact] - public void ValueToLiteral_FooCyclic() + public async Task ValueToLiteral_Foo() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); - var fooCyclic = new FooCyclic(); - var barCyclic = new BarCyclic(); - fooCyclic.BarCyclic = barCyclic; - barCyclic.FooCyclic = fooCyclic; + var value = JsonSerializer.SerializeToElement(new Foo()); // act - void Act() => type.ValueToLiteral(fooCyclic); + var literal = type.ValueToLiteral(value); // assert - Assert.Equal( - "Cycle in object graph detected.", - Assert.Throws<GraphQLException>(Act).Message); + Assert.IsType<ObjectValueNode>(literal); } [Fact] - public void ValueToLiteral_Dictionary() + public async Task ValueToLiteral_Dictionary() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); + var value = JsonSerializer.SerializeToElement(new Dictionary<string, object>()); // act - var literal = type.ValueToLiteral( - new Dictionary<string, object>()); + var literal = type.ValueToLiteral(value); // assert Assert.IsType<ObjectValueNode>(literal); } [Fact] - public void CoerceInputLiteral_StringValueNode() + public async Task CoerceInputLiteral_StringValueNode() { // arrange - var schema = SchemaBuilder.New() - .AddQueryType( - d => d - .Name("Query") - .Field("foo") - .Type<AnyType>() - .Argument("input", a => a.Type<AnyType>()) - .Resolve(ctx => ctx.ArgumentValue<object>("input"))) - .Create(); + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType( + d => d + .Name("Query") + .Field("foo") + .Type<AnyType>() + .Argument("input", a => a.Type<AnyType>()) + .Resolve(ctx => ctx.ArgumentValue<object>("input"))) + .AddJsonTypeConverter() + .BuildSchemaAsync(); var type = schema.Types.GetType<AnyType>("Any"); @@ -1241,15 +1390,21 @@ public void CoerceInputLiteral_StringValueNode() var value = type.CoerceInputLiteral(new StringValueNode("Foo")); // assert - Assert.Equal("Foo", value); + Assert.Equal("Foo", Assert.IsType<JsonElement>(value).GetString()); } [Fact] public async Task Dictionary_Is_Handled_As_Object() { await ExpectValid( - "{ someObject }", - configure: c => c.AddQueryType<QueryWithDictionary>()) + """ + { + someObject + } + """, + configure: c => c + .AddQueryType<QueryWithDictionary>() + .AddJsonTypeConverter()) .MatchSnapshotAsync(); } @@ -1258,7 +1413,9 @@ public async Task UseExpandoObjectWithAny() { await ExpectValid( "{ something }", - configure: c => c.AddQueryType<SomeQuery>()) + configure: c => c + .AddQueryType<SomeQuery>() + .AddJsonTypeConverter()) .MatchSnapshotAsync(); } @@ -1267,10 +1424,328 @@ public async Task UseImmutableDictWithAny() { await ExpectValid( "{ somethingImmutable }", - configure: c => c.AddQueryType<SomeQuery>()) + configure: c => c + .AddQueryType<SomeQuery>() + .AddJsonTypeConverter()) .MatchSnapshotAsync(); } + [Fact] + public async Task JsonElement_Schema() + { + var schema = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType<QueryJsonElement>() + .BuildSchemaAsync(); + + schema.MatchInlineSnapshot( + """ + schema { + query: QueryJsonElement + } + + type QueryJsonElement { + someJson: Any! + manyJson: [Any!]! + inputJson(input: Any!): Any! + jsonFromString: Any! + } + + scalar Any + """); + } + + [Fact] + public async Task JsonElement_Output_Json_Object() + { + var result = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType<QueryJsonElement>() + .ExecuteRequestAsync( + """ + { + someJson + } + """); + + result.MatchInlineSnapshot( + """ + { + "data": { + "someJson": { + "a": { + "b": 123.456 + } + } + } + } + """); + } + + [Fact] + public async Task JsonElement_Output_Json_Object_List() + { + var result = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType<QueryJsonElement>() + .ExecuteRequestAsync( + """ + { + manyJson + } + """); + + result.MatchInlineSnapshot( + """ + { + "data": { + "manyJson": [ + { + "a": { + "b": 123.456 + } + }, + { + "x": { + "y": "y" + } + } + ] + } + } + """); + } + + [Fact] + public async Task JsonElement_Input_Json_Object_Literal() + { + var result = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType<QueryJsonElement>() + .ExecuteRequestAsync( + """ + { + inputJson(input: { a: "abc" }) + } + """); + + result.MatchInlineSnapshot( + """ + { + "data": { + "inputJson": { + "a": "abc" + } + } + } + """); + } + + [Theory] + [UseCulture("en-US")] + [InlineData(0)] + [InlineData(-15)] + [InlineData(-10.5)] + [InlineData(1.5)] + [InlineData(1e15)] + public async Task JsonElement_Input_Json_Number_Literal(decimal value) + { + var result = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType<QueryJsonElement>() + .ExecuteRequestAsync( + $$""" + { + inputJson(input: {{value}}) + } + """); + + result.MatchInlineSnapshot( + $$""" + { + "data": { + "inputJson": {{value}} + } + } + """); + } + + [Fact] + public async Task JsonElement_Input_Json_BigInt_Literal() + { + var value = BigInteger.Parse("100000000000000000000000050"); + + var result = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType<QueryJsonElement>() + .ExecuteRequestAsync( + $$""" + { + inputJson(input: {{value}}) + } + """); + + result.MatchInlineSnapshot( + $$""" + { + "data": { + "inputJson": {{value}} + } + } + """); + } + + [Fact] + public async Task JsonElement_Input_Json_Exponent_Literal() + { + var result = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType<QueryJsonElement>() + .ExecuteRequestAsync( + """ + { + inputJson(input: 1e1345) + } + """); + + result.MatchInlineSnapshot( + """ + { + "data": { + "inputJson": 1e1345 + } + } + """); + } + + [Theory] + [InlineData("true")] + [InlineData("false")] + public async Task JsonElement_Input_Json_Bool_Literal(string value) + { + var result = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType<QueryJsonElement>() + .ExecuteRequestAsync( + $$""" + { + inputJson(input: {{value}}) + } + """); + + result.MatchInlineSnapshot( + $$""" + { + "data": { + "inputJson": {{value}} + } + } + """); + } + + [Fact] + public async Task JsonElement_Input_Json_Object_List() + { + var result = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType<QueryJsonElement>() + .ExecuteRequestAsync( + """ + { + inputJson(input: { a: ["abc"] }) + } + """); + + result.MatchInlineSnapshot( + """ + { + "data": { + "inputJson": { + "a": [ + "abc" + ] + } + } + } + """); + } + + [Fact] + public async Task JsonElement_Input_Json_Object_Variables() + { + var input = JsonDocument.Parse( + """ + { + "a": { + "b": 123.456 + } + } + """).RootElement; + + var result = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType<QueryJsonElement>() + .ExecuteRequestAsync( + OperationRequestBuilder.New() + .SetDocument( + """ + query($input: Any!) { + inputJson(input: $input) + } + """) + .SetVariableValues(new Dictionary<string, object?> { { "input", input } }) + .Build()); + + result.MatchInlineSnapshot( + """ + { + "data": { + "inputJson": { + "a": { + "b": 123.456 + } + } + } + } + """); + } + + [Fact] + public async Task JsonElement_Output_Json_From_String() + { + var result = + await new ServiceCollection() + .AddGraphQLServer() + .AddQueryType<QueryJsonElement>() + .ExecuteRequestAsync( + """ + { + jsonFromString + } + """); + + result.MatchInlineSnapshot( + """ + { + "data": { + "jsonFromString": { + "a": "b" + } + } + } + """); + } + public class SomeQuery { [GraphQLType<AnyType>] @@ -1322,8 +1797,49 @@ public record BarRecord public class QueryWithDictionary { - [GraphQLType(typeof(AnyType))] - public IDictionary<string, object> SomeObject => - new Dictionary<string, object> { { "a", "b" } }; + [GraphQLType<AnyType>] + public Dictionary<string, object> SomeObject + => new Dictionary<string, object> { { "a", "b" } }; + } + + public class QueryJsonElement + { + public JsonElement GetSomeJson() + => JsonDocument.Parse( + """ + { + "a": { + "b": 123.456 + } + } + """).RootElement; + + public IEnumerable<JsonElement> GetManyJson() + { + yield return JsonDocument.Parse( + """ + { + "a": { + "b": 123.456 + } + } + """).RootElement; + + yield return JsonDocument.Parse( + """ + { + "x": { + "y": "y" + } + } + """).RootElement; + } + + public JsonElement InputJson(JsonElement input) + => input; + + [GraphQLType<NonNullType<AnyType>>] + public string JsonFromString() + => "{ \"a\": \"b\" }"; } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/__snapshots__/AnyTypeTests.Input_Value_ObjectDict_As_Variable.snap b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/__snapshots__/AnyTypeTests.Input_Value_ObjectDict_As_Variable.snap index e0e8e88a786..5d2f5e9fd5f 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/__snapshots__/AnyTypeTests.Input_Value_ObjectDict_As_Variable.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/__snapshots__/AnyTypeTests.Input_Value_ObjectDict_As_Variable.snap @@ -1,4 +1,4 @@ -{ +{ "data": { "foo": { "kind": "ObjectValue", @@ -13,10 +13,9 @@ "value": "a" }, "value": { - "kind": "StringValue", - "location": null, "value": "b", - "block": false + "kind": "StringValue", + "location": null } } ] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/__snapshots__/AnyTypeTests.Input_Value_Object_As_Variable.snap b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/__snapshots__/AnyTypeTests.Input_Value_Object_As_Variable.snap index e0e8e88a786..5d2f5e9fd5f 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/__snapshots__/AnyTypeTests.Input_Value_Object_As_Variable.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Scalars/__snapshots__/AnyTypeTests.Input_Value_Object_As_Variable.snap @@ -1,4 +1,4 @@ -{ +{ "data": { "foo": { "kind": "ObjectValue", @@ -13,10 +13,9 @@ "value": "a" }, "value": { - "kind": "StringValue", - "location": null, "value": "b", - "block": false + "kind": "StringValue", + "location": null } } ] diff --git a/src/HotChocolate/Core/test/Utilities/TestHelper.cs b/src/HotChocolate/Core/test/Utilities/TestHelper.cs index ad00599406c..12a6eb2c01f 100644 --- a/src/HotChocolate/Core/test/Utilities/TestHelper.cs +++ b/src/HotChocolate/Core/test/Utilities/TestHelper.cs @@ -51,7 +51,7 @@ public static async Task<IExecutionResult> ExpectValid( var result = await executor.ExecuteAsync(request, cancellationToken); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); return result; } @@ -105,11 +105,11 @@ public static async Task ExpectError( // assert var operationResult = Assert.IsType<OperationResult>(result); - Assert.NotNull(operationResult.Errors); + Assert.NotEmpty(operationResult.Errors); if (elementInspectors.Length > 0) { - Assert.Collection(operationResult.Errors!, elementInspectors); + Assert.Collection(operationResult.Errors, elementInspectors); } operationResult.MatchSnapshot(); diff --git a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Utilities/SchemaHelper.cs b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Utilities/SchemaHelper.cs index fc7721f6b2a..d17791d4b4a 100644 --- a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Utilities/SchemaHelper.cs +++ b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Utilities/SchemaHelper.cs @@ -73,7 +73,7 @@ public static Schema Load( } else if (scalar.Name.Value == ScalarNames.JSON) { - builder.AddType(new JsonType()); + builder.AddType(new AnyType()); } } From 046177b6b6952aeec110d5cde9da707da11fe355 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Sun, 11 Jan 2026 23:07:56 +0100 Subject: [PATCH 083/144] updated snapshot --- .../DirectiveTypeTests.Directive_ValidateArgs_InvalidArg.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/DirectiveTypeTests.Directive_ValidateArgs_InvalidArg.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/DirectiveTypeTests.Directive_ValidateArgs_InvalidArg.snap index 8d1d84fabd3..f0be062aa3e 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/DirectiveTypeTests.Directive_ValidateArgs_InvalidArg.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/DirectiveTypeTests.Directive_ValidateArgs_InvalidArg.snap @@ -1,2 +1,2 @@ -The directive arguments have invalid values: 'Int cannot parse the given literal of type `BooleanValueNode`.' at /e. +The directive arguments have invalid values: 'Int cannot coerce the given literal of type `BooleanValue` to a runtime value.' at /e. @a(d: 1, e: true) From 8345a1135d6f0e1ec87600704b28bbf883dc82ef Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Sun, 11 Jan 2026 23:08:05 +0100 Subject: [PATCH 084/144] Fixed encoding issue --- .../src/Types/Text/Json/ResultDocument.DbRow.cs | 3 ++- .../src/Types/Text/Json/ResultDocument.WriteTo.cs | 13 ++++++++++++- .../Core/src/Types/Text/Json/ResultDocument.cs | 5 +++-- .../Core/src/Types/Text/Json/ResultElement.cs | 15 ++++++++------- .../Core/test/Types.Tests/SchemaFirstTests.cs | 7 ++++--- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs index 8228e23195a..87eaa13f8c9 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.DbRow.cs @@ -152,6 +152,7 @@ internal enum ElementFlags : byte IsInternal = 8, IsExcluded = 16, IsNullable = 32, - IsInvalidated = 64 + IsInvalidated = 64, + IsEncoded = 128 } } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index 502fe7276f6..14ae129f330 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -100,8 +100,19 @@ public void WriteValue(Cursor cursor, DbRow row) case ElementTokenType.String: { + var isEncoded = false; var value = document.ReadRawValue(row); - writer.WriteStringValue(value, skipEscaping: true); + + if ((ElementFlags.IsEncoded & row.Flags) == ElementFlags.IsEncoded) + { + isEncoded = true; + } + else + { + value = value[1..^1]; + } + + writer.WriteStringValue(value, skipEscaping: isEncoded); break; } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index da0c5d9bb13..283795a66f9 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -507,7 +507,7 @@ internal void AssignObjectOrArray(ResultElement target, ResultElement value) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal void AssignStringValue(ResultElement target, ReadOnlySpan<byte> value) + internal void AssignStringValue(ResultElement target, ReadOnlySpan<byte> value, bool isEncoded) { var totalSize = value.Length + 2; var position = ClaimDataSpace(totalSize); @@ -518,7 +518,8 @@ internal void AssignStringValue(ResultElement target, ReadOnlySpan<byte> value) tokenType: ElementTokenType.String, location: position, sizeOrLength: totalSize, - parentRow: _metaDb.GetParent(target.Cursor)); + parentRow: _metaDb.GetParent(target.Cursor), + flags: isEncoded ? ElementFlags.IsEncoded : ElementFlags.None); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index 6c38fae1278..eff92f7166c 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -15,6 +15,7 @@ namespace HotChocolate.Text.Json; public readonly partial struct ResultElement { + private static readonly Encoding s_utf8Encoding = Encoding.UTF8; private readonly ResultDocument _parent; private readonly ResultDocument.Cursor _cursor; @@ -998,25 +999,25 @@ public void SetBooleanValue(bool value) _parent.AssignBooleanValue(this, value); } - public void SetStringValue(ReadOnlySpan<byte> value) + public void SetStringValue(ReadOnlySpan<byte> value, bool isEncoded = false) { CheckValidInstance(); - _parent.AssignStringValue(this, value); + _parent.AssignStringValue(this, value, isEncoded); } - public void SetStringValue(ReadOnlySpan<char> value) + public void SetStringValue(ReadOnlySpan<char> value, bool isEncoded = false) { CheckValidInstance(); // If we have an empty string, we can directly assign it. if (value.Length == 0) { - _parent.AssignStringValue(this, []); + _parent.AssignStringValue(this, [], isEncoded: isEncoded); return; } - var requiredBytes = Encoding.UTF8.GetByteCount(value); + var requiredBytes = s_utf8Encoding.GetByteCount(value); byte[]? rented = null; var buffer = JsonConstants.StackallocByteThreshold <= requiredBytes ? stackalloc byte[value.Length] @@ -1024,8 +1025,8 @@ public void SetStringValue(ReadOnlySpan<char> value) try { - var usedBytes = Encoding.UTF8.GetBytes(value, buffer); - _parent.AssignStringValue(this, buffer[..usedBytes]); + var usedBytes = s_utf8Encoding.GetBytes(value, buffer); + _parent.AssignStringValue(this, buffer[..usedBytes], isEncoded); } finally { diff --git a/src/HotChocolate/Core/test/Types.Tests/SchemaFirstTests.cs b/src/HotChocolate/Core/test/Types.Tests/SchemaFirstTests.cs index 7cb69618d70..d76e275ab64 100644 --- a/src/HotChocolate/Core/test/Types.Tests/SchemaFirstTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/SchemaFirstTests.cs @@ -278,13 +278,14 @@ public async Task SchemaBuilder_AnyType() const string sourceText = "type Query { hello: Any }"; // act - var schema = SchemaBuilder.New() + var executor = await new ServiceCollection() + .AddGraphQL() .AddDocumentFromString(sourceText) .AddResolver<Query>() - .Create(); + .AddJsonTypeConverter() + .BuildRequestExecutorAsync(); // assert - var executor = schema.MakeExecutable(); var result = await executor.ExecuteAsync("{ hello }"); result.ToJson().MatchSnapshot(); } From e645a8b1122ccef5f75cc21315181fb45f11ab8e Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Sun, 11 Jan 2026 23:36:08 +0100 Subject: [PATCH 085/144] Improved error behavior on input coercion. --- .../src/Types/Types/Scalars/FloatTypeBase.cs | 54 ++++++++++++++++--- .../Types/Types/Scalars/IntegerTypeBase.cs | 42 ++++++++++++--- .../src/Types/Types/Scalars/ScalarType~2.cs | 44 ++++++++++++--- .../Core/src/Types/Utilities/ThrowHelper.cs | 32 ++++++++--- ...Tests.Directive_ValidateArgs_Overflow.snap | 2 +- 5 files changed, 146 insertions(+), 28 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs index f03b7a03af4..3975fd4d7d0 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/FloatTypeBase.cs @@ -69,7 +69,17 @@ public sealed override object CoerceInputLiteral(IValueNode valueLiteral) { if (valueLiteral is FloatValueNode floatLiteral) { - var runtimeValue = OnCoerceInputLiteral(floatLiteral); + TRuntimeType runtimeValue; + + try + { + runtimeValue = OnCoerceInputLiteral(floatLiteral); + } + catch (Exception ex) + { + throw CreateCoerceInputLiteralError(valueLiteral, ex); + } + AssertFormat(runtimeValue); return runtimeValue; } @@ -79,7 +89,17 @@ public sealed override object CoerceInputLiteral(IValueNode valueLiteral) // http://facebook.github.io/graphql/June2018/#sec-Float if (valueLiteral is IntValueNode intLiteral) { - var runtimeValue = OnCoerceInputLiteral(intLiteral); + TRuntimeType runtimeValue; + + try + { + runtimeValue = OnCoerceInputLiteral(intLiteral); + } + catch (Exception ex) + { + throw CreateCoerceInputLiteralError(valueLiteral, ex); + } + AssertFormat(runtimeValue); return runtimeValue; } @@ -103,7 +123,17 @@ public sealed override object CoerceInputValue(JsonElement inputValue, IFeatureP { if (inputValue.ValueKind is JsonValueKind.Number) { - var runtimeValue = OnCoerceInputValue(inputValue); + TRuntimeType runtimeValue; + + try + { + runtimeValue = OnCoerceInputValue(inputValue); + } + catch (Exception ex) + { + throw CreateCoerceInputValueError(inputValue, ex); + } + AssertFormat(runtimeValue); return runtimeValue; } @@ -154,11 +184,16 @@ public override IValueNode ValueToLiteral(object runtimeValue) /// <param name="valueLiteral"> /// The value syntax that could not be coerced. /// </param> + /// <param name="error"> + /// An optional exception that was thrown during coercion. + /// </param> /// <returns> /// Returns the exception to throw. /// </returns> - protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueLiteral) - => Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); + protected virtual LeafCoercionException CreateCoerceInputLiteralError( + IValueNode valueLiteral, + Exception? error = null) + => Scalar_Cannot_CoerceInputLiteral(this, valueLiteral, error); /// <summary> /// Creates the exception to throw when <see cref="CoerceInputValue(JsonElement, IFeatureProvider)"/> @@ -167,11 +202,16 @@ protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode /// <param name="inputValue"> /// The JSON value that could not be coerced. /// </param> + /// <param name="error"> + /// An optional exception that was thrown during coercion. + /// </param> /// <returns> /// Returns the exception to throw. /// </returns> - protected virtual LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => Scalar_Cannot_CoerceInputValue(this, inputValue); + protected virtual LeafCoercionException CreateCoerceInputValueError( + JsonElement inputValue, + Exception? error = null) + => Scalar_Cannot_CoerceInputValue(this, inputValue, error); /// <summary> /// Creates the exception to throw when a runtime value is outside diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs index 52896b9d6fb..9dd7a24561d 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/IntegerTypeBase.cs @@ -68,7 +68,17 @@ public sealed override object CoerceInputLiteral(IValueNode valueLiteral) { if (valueLiteral is IntValueNode intLiteral) { - var runtimeValue = OnCoerceInputLiteral(intLiteral); + TRuntimeType runtimeValue; + + try + { + runtimeValue = OnCoerceInputLiteral(intLiteral); + } + catch (Exception ex) + { + throw CreateCoerceInputLiteralError(valueLiteral, ex); + } + AssertFormat(runtimeValue); return runtimeValue; } @@ -92,7 +102,17 @@ public sealed override object CoerceInputValue(JsonElement inputValue, IFeatureP { if (inputValue.ValueKind is JsonValueKind.Number) { - var runtimeValue = OnCoerceInputValue(inputValue); + TRuntimeType runtimeValue; + + try + { + runtimeValue = OnCoerceInputValue(inputValue); + } + catch (Exception ex) + { + throw CreateCoerceInputValueError(inputValue, ex); + } + AssertFormat(runtimeValue); return runtimeValue; } @@ -143,11 +163,16 @@ public override IValueNode ValueToLiteral(object runtimeValue) /// <param name="valueLiteral"> /// The value syntax that could not be coerced. /// </param> + /// <param name="error"> + /// An optional exception that was thrown during coercion. + /// </param> /// <returns> /// Returns the exception to throw. /// </returns> - protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode valueLiteral) - => Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); + protected virtual LeafCoercionException CreateCoerceInputLiteralError( + IValueNode valueLiteral, + Exception? error = null) + => Scalar_Cannot_CoerceInputLiteral(this, valueLiteral, error); /// <summary> /// Creates the exception to throw when <see cref="CoerceInputValue(JsonElement, IFeatureProvider)"/> @@ -156,11 +181,16 @@ protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode /// <param name="inputValue"> /// The JSON value that could not be coerced. /// </param> + /// <param name="error"> + /// An optional exception that was thrown during coercion. + /// </param> /// <returns> /// Returns the exception to throw. /// </returns> - protected virtual LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => Scalar_Cannot_CoerceInputValue(this, inputValue); + protected virtual LeafCoercionException CreateCoerceInputValueError( + JsonElement inputValue, + Exception? error = null) + => Scalar_Cannot_CoerceInputValue(this, inputValue, error); /// <summary> /// Creates the exception to throw when a runtime value is outside diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs index cb2252e1096..3ee8ec67b38 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs @@ -42,7 +42,18 @@ public sealed override object CoerceInputLiteral(IValueNode valueLiteral) { if (valueLiteral is TLiteral literal) { - return OnCoerceInputLiteral(literal); + TRuntimeType runtimeValue; + + try + { + runtimeValue = OnCoerceInputLiteral(literal); + } + catch (Exception ex) + { + throw CreateCoerceInputLiteralError(valueLiteral, ex); + } + + return runtimeValue; } throw CreateCoerceInputLiteralError(valueLiteral); @@ -82,7 +93,18 @@ when inputValue.ValueKind is not (JsonValueKind.True or JsonValueKind.False): throw CreateCoerceInputValueError(inputValue); default: - return OnCoerceInputValue(inputValue, context); + TRuntimeType runtimeValue; + + try + { + runtimeValue = OnCoerceInputValue(inputValue, context); + } + catch (Exception ex) + { + throw CreateCoerceInputValueError(inputValue, ex); + } + + return runtimeValue; } } @@ -174,11 +196,16 @@ public sealed override IValueNode ValueToLiteral(object runtimeValue) /// <param name="valueLiteral"> /// The value syntax that could not be coerced. /// </param> + /// <param name="error"> + /// An optional exception that was thrown during coercion. + /// </param> /// <returns> /// Returns the exception to throw. /// </returns> - protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode? valueLiteral) - => Scalar_Cannot_CoerceInputLiteral(this, valueLiteral); + protected virtual LeafCoercionException CreateCoerceInputLiteralError( + IValueNode? valueLiteral, + Exception? error = null) + => Scalar_Cannot_CoerceInputLiteral(this, valueLiteral, error); /// <summary> /// Creates the exception to throw when <see cref="CoerceInputValue(JsonElement, IFeatureProvider)"/> @@ -187,11 +214,16 @@ protected virtual LeafCoercionException CreateCoerceInputLiteralError(IValueNode /// <param name="inputValue"> /// The JSON value that could not be coerced. /// </param> + /// <param name="error"> + /// An optional exception that was thrown during coercion. + /// </param> /// <returns> /// Returns the exception to throw. /// </returns> - protected virtual LeafCoercionException CreateCoerceInputValueError(JsonElement inputValue) - => Scalar_Cannot_CoerceInputValue(this, inputValue); + protected virtual LeafCoercionException CreateCoerceInputValueError( + JsonElement inputValue, + Exception? error = null) + => Scalar_Cannot_CoerceInputValue(this, inputValue, error); /// <summary> /// Creates the exception to throw when <see cref="CoerceOutputValue(object, ResultElement)"/> diff --git a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs index 100909f4e2e..b40583af136 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs @@ -600,31 +600,47 @@ public static LeafCoercionException InvalidTypeConversion( public static LeafCoercionException Scalar_Cannot_CoerceInputLiteral( ITypeDefinition scalarType, - IValueNode? valueLiteral) + IValueNode? valueLiteral, + Exception? error = null) { valueLiteral ??= NullValueNode.Default; - return new LeafCoercionException( + var errorBuilder = ErrorBuilder.New() .SetMessage( TypeResources.Scalar_Cannot_CoerceInputLiteral, scalarType.Name, - valueLiteral.Kind) - .Build(), + valueLiteral.Kind); + + if (error is not null) + { + errorBuilder.SetException(error); + } + + return new LeafCoercionException( + errorBuilder.Build(), scalarType); } public static LeafCoercionException Scalar_Cannot_CoerceInputValue( ITypeDefinition scalarType, - JsonElement inputValue) + JsonElement inputValue, + Exception? error = null) { - return new LeafCoercionException( + var errorBuilder = ErrorBuilder.New() .SetMessage( TypeResources.Scalar_Cannot_CoerceInputValue, scalarType.Name, - inputValue.ValueKind) - .Build(), + inputValue.ValueKind); + + if (error is not null) + { + errorBuilder.SetException(error); + } + + return new LeafCoercionException( + errorBuilder.Build(), scalarType); } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/DirectiveTypeTests.Directive_ValidateArgs_Overflow.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/DirectiveTypeTests.Directive_ValidateArgs_Overflow.snap index d4de64cbc59..47d5dd351d8 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/DirectiveTypeTests.Directive_ValidateArgs_Overflow.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/DirectiveTypeTests.Directive_ValidateArgs_Overflow.snap @@ -1,2 +1,2 @@ -The directive arguments have invalid values: 'Int cannot parse the given literal of type `IntValueNode`.' at /d. +The directive arguments have invalid values: 'Int cannot coerce the given literal of type `IntValue` to a runtime value.' at /d. @a(d: 9223372036854775807) From fea86bdbd4b508e900426d6910f2e27fe4a64406 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Sun, 11 Jan 2026 23:36:47 +0100 Subject: [PATCH 086/144] Fixed enum tests when using custom name- or value-comparers. --- .../Core/src/Types/Types/EnumType.cs | 22 ++++--------------- .../test/Types.Tests/Types/EnumTypeTests.cs | 4 ++-- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Types/EnumType.cs b/src/HotChocolate/Core/src/Types/Types/EnumType.cs index 6091953ba79..2e3cf08004d 100644 --- a/src/HotChocolate/Core/src/Types/Types/EnumType.cs +++ b/src/HotChocolate/Core/src/Types/Types/EnumType.cs @@ -47,7 +47,7 @@ public partial class EnumType /// <summary> /// Gets a dictionary that allows to look up the enum value by its runtime value. /// </summary> - protected IReadOnlyDictionary<object, EnumValue> ValueLookup => _valueLookup; + protected internal IReadOnlyDictionary<object, EnumValue> ValueLookup => _valueLookup; /// <summary> /// Tries to get an enum value by its name. @@ -95,26 +95,12 @@ public bool TryGetRuntimeValue(string name, [NotNullWhen(true)] out object? runt } /// <inheritdoc /> - public bool IsValueCompatible(IValueNode valueSyntax) - { - if (valueSyntax is EnumValueNode ev) - { - return Values.ContainsName(ev.Value); - } - - return false; - } + public bool IsValueCompatible(IValueNode valueLiteral) + => valueLiteral is { Kind: SyntaxKind.EnumValue }; /// <inheritdoc /> public bool IsValueCompatible(JsonElement inputValue) - { - if (inputValue.ValueKind is JsonValueKind.String) - { - return Values.ContainsName(inputValue.GetString()!); - } - - return false; - } + => inputValue.ValueKind is JsonValueKind.String; /// <inheritdoc /> public object CoerceInputLiteral(IValueNode valueLiteral) diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs index a4e39658df1..4f4c725e114 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/EnumTypeTests.cs @@ -646,7 +646,7 @@ public void EnumName_Set_Name_Comparer() // assert var type = schema.Types.GetType<EnumType>("Foo"); - Assert.True(type.IsValueCompatible(new EnumValueNode("baz"))); + Assert.True(type.TryGetValue("baz", out _)); } [Fact] @@ -668,7 +668,7 @@ public void EnumName_Set_Value_Comparer() // assert var type = schema.Types.GetType<EnumType>("Foo"); - Assert.True(type.IsValueCompatible(new EnumValueNode("ANYTHING_WILL_DO"))); + Assert.True(type.ValueLookup.ContainsKey("ANYTHING_WILL_DO")); } [Fact] From 12476e1f63e39ed69bcf2d1adbfc72fd0ace062b Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Mon, 12 Jan 2026 09:30:05 +0100 Subject: [PATCH 087/144] Fixed more test issues --- .../Execution/OperationRequestBuilder.cs | 4 +- .../Core/src/Types/Execution/ErrorHelper.cs | 8 +- .../Extensions/OperationContextExtensions.cs | 24 ++ .../Processing/OperationResultBuilder.cs | 35 -- .../Types/Execution/Processing/Selection.cs | 2 +- .../Processing/ValueCompletion.List.cs | 2 +- .../src/Types/Text/Json/ResultDocument.cs | 2 +- .../Regressions/NestedOptionalInt_2114.cs | 4 +- .../Resolvers/ResolverCompilerTests.cs | 49 --- ...erCompilerTests.SchemaIntegrationTest.snap | 3 +- .../Types/OneOfIntegrationTests.cs | 301 +++++++++++++----- .../Types/Relay/NodeResolverTests.cs | 2 +- ...OneOfIntegrationTests.A_is_null_Error.snap | 4 +- ...onTests.A_is_null_and_B_is_null_Error.snap | 4 +- ...ionTests.A_is_null_and_B_is_set_Error.snap | 4 +- ...ionTests.A_is_set_and_B_is_null_Error.snap | 4 +- ...tionTests.A_is_set_and_B_is_set_Error.snap | 4 +- ...A_is_set_and_B_is_set_to_string_Error.snap | 8 +- ..._is_unset_variable_and_B_is_set_Error.snap | 4 +- ...ests.A_is_variable_and_B_is_set_Error.snap | 4 +- ...ariable_and_B_is_unset_variable_Error.snap | 4 +- ....B_is_set_and_C_is_invalid_prop_Error.snap | 8 +- ...grationTests.B_is_set_to_string_Error.snap | 4 +- ...s.B_is_variable_and_var_is_null_Error.snap | 8 +- ...tionTests.Input_is_empty_object_Error.snap | 4 +- ...s.Input_is_set_to_string_abc123_Error.snap | 4 +- ...Var_is_object_with_B_set_to_abc_Error.snap | 2 +- ...ring_abc123_and_passed_to_input_Error.snap | 4 +- 28 files changed, 298 insertions(+), 212 deletions(-) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs index 545b334f960..81dddda74ce 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs @@ -157,9 +157,7 @@ public OperationRequestBuilder SetVariableValues( [StringSyntax("json")] string variableValues) { ArgumentException.ThrowIfNullOrEmpty(variableValues); - - using var document = JsonDocument.Parse(variableValues); - return SetVariableValues(document); + return SetVariableValues(JsonDocument.Parse(variableValues)); } /// <summary> diff --git a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs index 03ffb49c778..8f742be98be 100644 --- a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs @@ -181,12 +181,8 @@ public static OperationResult RequestTimeout(TimeSpan timeout) Extensions = ImmutableDictionary<string, object?>.Empty.Add("code", ErrorCodes.Execution.Timeout) }); - // TODO : Remove? - public static IError NonNullOutputFieldViolation(Path? path, FieldNode selection) + public static ErrorBuilder NonNullOutputFieldViolation() => ErrorBuilder.New() .SetMessage("Cannot return null for non-nullable field.") - .SetCode(ErrorCodes.Execution.NonNullViolation) - .SetPath(path) - .AddLocation(selection) - .Build(); + .SetCode(ErrorCodes.Execution.NonNullViolation); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs index cd5a5a66ac6..4c30d36a0f4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs @@ -1,4 +1,5 @@ using HotChocolate.Execution.Processing; +using HotChocolate.Properties; // ReSharper disable once CheckNamespace namespace HotChocolate.Execution; @@ -64,6 +65,29 @@ public OperationResult BuildResult() { var resultBuilder = context.Result; + if (!resultBuilder.NonNullViolations.IsEmpty) + { + var errorPaths = new HashSet<Path>(); + + foreach (var error in resultBuilder.Errors) + { + if (error.Path is not null) + { + errorPaths.Add(error.Path); + } + } + + if (!errorPaths.IsProperSupersetOf(resultBuilder.NonNullViolations)) + { + var errorBuilder = ErrorHelper.NonNullOutputFieldViolation(); + + foreach (var path in resultBuilder.NonNullViolations.Except(errorPaths)) + { + resultBuilder.AddError(errorBuilder.SetPath(path).Build()); + } + } + } + var result = new OperationResult( new OperationResultData( resultBuilder.Data, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs index e93b073b0d8..fe204764cf1 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs @@ -31,7 +31,6 @@ internal sealed class OperationResultBuilder : IOperationResultBuilder public ImmutableList<Func<ValueTask>> CleanupTasks { get; set; } = []; - // TODO : Is this still needed? public ImmutableHashSet<Path> NonNullViolations { get; set; } = []; public bool? HasNext { get; set; } @@ -68,40 +67,6 @@ public void SetExtension<TValue>(string key, TValue value) } } - public void SetExtension<TValue>(string key, UpdateState<TValue> value) - { - lock (_sync) - { - if (Extensions.TryGetValue(key, out var currentValue)) - { - var newValue = value(key, (TValue)currentValue!); - Extensions = Extensions.SetItem(key, newValue); - } - else - { - var initialValue = value(key, default!); - Extensions = Extensions.Add(key, initialValue); - } - } - } - - public void SetExtension<TValue, TState>(string key, TState state, UpdateState<TValue, TState> value) - { - lock (_sync) - { - if (Extensions.TryGetValue(key, out var currentValue)) - { - var newValue = value(key, (TValue)currentValue!, state); - Extensions = Extensions.SetItem(key, newValue); - } - else - { - var initialValue = value(key, default!, state); - Extensions = Extensions.Add(key, initialValue); - } - } - } - public void SetResultState(string key, object? value) { lock (_sync) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index 194fa17715d..4ee89c97294 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -220,7 +220,7 @@ public SelectionSet GetSelectionSet(ObjectType typeContext) /// <c>true</c> if this selection should be included; otherwise, <c>false</c>. /// </returns> public bool IsSkipped(ulong includeFlags) - => IsIncluded(includeFlags); + => !IsIncluded(includeFlags); /// <inheritdoc /> public bool IsIncluded(ulong includeFlags) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs index 8d75201ead2..530fa2e00a8 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs @@ -133,7 +133,7 @@ private static void CompleteListValue( internal static void PropagateNullValues(ResultElement result) { - result.Invalidate(); + result.SetNullValue(); do { diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs index 283795a66f9..b54c9ae4178 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.cs @@ -255,7 +255,7 @@ internal bool IsNullOrInvalidated(Cursor current) var tokenType = _metaDb.GetElementTokenType(current); - if (tokenType is ElementTokenType.Null) + if (tokenType is ElementTokenType.Null or ElementTokenType.None) { return true; } diff --git a/src/HotChocolate/Core/test/Types.Tests/Regressions/NestedOptionalInt_2114.cs b/src/HotChocolate/Core/test/Types.Tests/Regressions/NestedOptionalInt_2114.cs index b4fbce5572d..b53edb59916 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Regressions/NestedOptionalInt_2114.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Regressions/NestedOptionalInt_2114.cs @@ -30,7 +30,7 @@ public async Task ShouldNotFailWithExplicitValues() var result = await executor.ExecuteAsync(query); // assert - Assert.Null(result.ExpectOperationResult().Errors); + Assert.Empty(result.ExpectOperationResult().Errors); Verify(input); } @@ -84,7 +84,7 @@ mutation a($input: ButterPickleInput!) }); // assert - Assert.Null(result.ExpectOperationResult().Errors); + Assert.Empty(result.ExpectOperationResult().Errors); Verify(input); } diff --git a/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs b/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs index 329c2ae5357..e1ed155a5ba 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Resolvers/ResolverCompilerTests.cs @@ -540,51 +540,6 @@ [new FieldSelectionNode(fieldSyntax, 1)], Assert.True(result, "Pure Resolver"); } - [Fact] - public async Task Compile_Arguments_FieldSyntax() - { - // arrange - var typeInspector = new DefaultTypeInspector(); - var type = typeof(Resolvers); - MemberInfo member = type.GetMethod(nameof(Resolvers.ResolverWithFieldSyntax))!; - - // act - var compiler = new DefaultResolverCompiler(typeInspector, EmptyServiceProvider.Instance, _empty); - var resolver = compiler.CompileResolve(member, type).Resolver!; - var pure = compiler.CompileResolve(member, type).PureResolver!; - - // assert - var fieldSyntax = new FieldNode( - null, - new NameNode("foo"), - null, - Array.Empty<DirectiveNode>(), - Array.Empty<ArgumentNode>(), - null); - - var schema = - SchemaBuilder.New() - .AddQueryType(c => c.Name("Query").Field("abc").Resolve("def")) - .Create(); - - var selection = new Selection( - id: 1, - "abc", - schema.Types.GetType<ObjectType>("Query").Fields["abc"], - [new FieldSelectionNode(fieldSyntax, 1)], - []); - - var context = new Mock<IResolverContext>(); - context.Setup(t => t.Parent<Resolvers>()).Returns(new Resolvers()); - context.SetupGet(t => t.Selection).Returns(selection); - - var result = (bool)(await resolver(context.Object))!; - Assert.True(result, "Standard Resolver"); - - result = (bool)pure(context.Object)!; - Assert.True(result, "Pure Resolver"); - } - [Fact] public async Task Compile_Arguments_ObjectType() { @@ -1501,10 +1456,6 @@ public bool ResolverWithResolverContext( IResolverContext context) => context != null!; - public bool ResolverWithFieldSyntax( - FieldNode fieldSyntax) => - fieldSyntax != null!; - public bool ResolverWithFieldSelection( ISelection fieldSelection) => fieldSelection != null!; diff --git a/src/HotChocolate/Core/test/Types.Tests/Resolvers/__snapshots__/ResolverCompilerTests.SchemaIntegrationTest.snap b/src/HotChocolate/Core/test/Types.Tests/Resolvers/__snapshots__/ResolverCompilerTests.SchemaIntegrationTest.snap index d7516ca2abc..d0bfdaedf39 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Resolvers/__snapshots__/ResolverCompilerTests.SchemaIntegrationTest.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Resolvers/__snapshots__/ResolverCompilerTests.SchemaIntegrationTest.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Resolvers } @@ -19,7 +19,6 @@ type Resolvers { resolverWithCancellationToken: String! resolverWithDocument: Boolean! resolverWithFieldSelection: Boolean! - resolverWithFieldSyntax: Boolean! resolverWithObjectField: Boolean! resolverWithObjectType: Boolean! resolverWithOperationDefinition: Boolean! diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/OneOfIntegrationTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/OneOfIntegrationTests.cs index 337551b0654..58d26a5cbab 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/OneOfIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/OneOfIntegrationTests.cs @@ -1,6 +1,5 @@ using HotChocolate.Configuration.Validation; using HotChocolate.Execution; -using HotChocolate.Language; using HotChocolate.Tests; using Microsoft.Extensions.DependencyInjection; @@ -16,7 +15,12 @@ public async Task A_is_set_and_B_is_set_Error() .AddGraphQL() .AddQueryType<Query>() .ModifyOptions(o => o.EnableOneOf = true) - .ExecuteRequestAsync("{ example(input: { a: \"abc\", b: 123 }) }") + .ExecuteRequestAsync( + """ + { + example(input: { a: "abc", b: 123 }) + } + """) .MatchSnapshotAsync(); } @@ -28,7 +32,12 @@ public async Task A_is_null_and_B_is_set_Error() .AddGraphQL() .AddQueryType<Query>() .ModifyOptions(o => o.EnableOneOf = true) - .ExecuteRequestAsync("{ example(input: { a: null, b: 123 }) }") + .ExecuteRequestAsync( + """ + { + example(input: { a: null, b: 123 }) + } + """) .MatchSnapshotAsync(); } @@ -40,7 +49,12 @@ public async Task A_is_null_and_B_is_null_Error() .AddGraphQL() .AddQueryType<Query>() .ModifyOptions(o => o.EnableOneOf = true) - .ExecuteRequestAsync("{ example(input: { a: null, b: null }) }") + .ExecuteRequestAsync( + """ + { + example(input: { a: null, b: null }) + } + """) .MatchSnapshotAsync(); } @@ -52,7 +66,12 @@ public async Task A_is_null_Error() .AddGraphQL() .AddQueryType<Query>() .ModifyOptions(o => o.EnableOneOf = true) - .ExecuteRequestAsync("{ example(input: { a: null }) }") + .ExecuteRequestAsync( + """ + { + example(input: { a: null }) + } + """) .MatchSnapshotAsync(); } @@ -63,7 +82,12 @@ public async Task B_is_set_Valid() .AddGraphQL() .AddQueryType<Query>() .ModifyOptions(o => o.EnableOneOf = true) - .ExecuteRequestAsync("{ example(input: { b: 123 }) }") + .ExecuteRequestAsync( + """ + { + example(input: { b: 123 }) + } + """) .MatchSnapshotAsync(); } @@ -75,7 +99,12 @@ public async Task Input_is_empty_object_Error() .AddGraphQL() .AddQueryType<Query>() .ModifyOptions(o => o.EnableOneOf = true) - .ExecuteRequestAsync("{ example(input: { }) }") + .ExecuteRequestAsync( + """ + { + example(input: { }) + } + """) .MatchSnapshotAsync(); } @@ -89,8 +118,18 @@ public async Task A_is_variable_and_B_is_set_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($a: String!) { example(input: { a: $a, b: 123 }) }") - .SetVariableValues(new Dictionary<string, object?> { { "a", null } }) + .SetDocument( + """ + query($a: String!) { + example(input: { a: $a, b: 123 }) + } + """) + .SetVariableValues( + """ + { + "a": null + } + """) .Build()) .MatchSnapshotAsync(); } @@ -105,7 +144,12 @@ public async Task A_is_unset_variable_and_B_is_set_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($a: String!) { example(input: { a: $a, b: 123 }) }") + .SetDocument( + """ + query($a: String!) { + example(input: { a: $a, b: 123 }) + } + """) .Build()) .MatchSnapshotAsync(); } @@ -121,8 +165,17 @@ public async Task A_is_variable_and_B_is_unset_variable_Error() .ExecuteRequestAsync( OperationRequestBuilder.New() .SetDocument( - "query($a: String!, $b: Int!) { example(input: { a: $a, b: $b }) }") - .SetVariableValues(new Dictionary<string, object?> { { "a", "abc" } }) + """ + query($a: String!, $b: Int!) { + example(input: { a: $a, b: $b }) + } + """) + .SetVariableValues( + """ + { + "a": "abc" + } + """) .Build()) .MatchSnapshotAsync(); } @@ -136,8 +189,18 @@ public async Task B_is_variable_and_var_is_123_Valid() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($b: Int!) { example(input: { b: $b }) }") - .SetVariableValues(new Dictionary<string, object?> { { "b", 123 } }) + .SetDocument( + """ + query($b: Int!) { + example(input: { b: $b }) + } + """) + .SetVariableValues( + """ + { + "b": 123 + } + """) .Build()) .MatchSnapshotAsync(); } @@ -151,10 +214,18 @@ public async Task Var_is_object_with_field_B_set_to_123_Valid() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($var: ExampleInput!) { example(input: $var) }") + .SetDocument( + """ + query($var: ExampleInput!) { + example(input: $var) + } + """) .SetVariableValues( - new Dictionary<string, object?> - { { "var", new ObjectValueNode(new ObjectFieldNode("b", 123)) } }) + """ + { + "var": { "b": 123 } + } + """) .Build()) .MatchSnapshotAsync(); } @@ -169,17 +240,18 @@ public async Task Var_is_object_with_A_set_to_abc_and_B_set_to_123_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($var: ExampleInput!) { example(input: $var) }") + .SetDocument( + """ + query($var: ExampleInput!) { + example(input: $var) + } + """) .SetVariableValues( - new Dictionary<string, object?> + """ { - { - "var", - new ObjectValueNode( - new ObjectFieldNode("a", "abc"), - new ObjectFieldNode("b", 123)) - } - }) + "var": { "a": "abc", "b": 123 } + } + """) .Build()) .MatchSnapshotAsync(); } @@ -194,17 +266,18 @@ public async Task Var_is_object_with_A_set_to_abc_and_B_set_to_null_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($var: ExampleInput!) { example(input: $var) }") + .SetDocument( + """ + query($var: ExampleInput!) { + example(input: $var) + } + """) .SetVariableValues( - new Dictionary<string, object?> + """ { - { - "var", - new ObjectValueNode( - new ObjectFieldNode("a", "abc"), - new ObjectFieldNode("b", NullValueNode.Default)) - } - }) + "var": { "a": "abc", "b": null } + } + """) .Build()) .MatchSnapshotAsync(); } @@ -219,15 +292,19 @@ public async Task Var_is_object_with_A_set_to_null_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($var: ExampleInput!) { example(input: $var) }") + .SetDocument( + """ + query($var: ExampleInput!) { + example(input: $var) + } + """ + ) .SetVariableValues( - new Dictionary<string, object?> + """ { - { - "var", - new ObjectValueNode(new ObjectFieldNode("a", NullValueNode.Default)) - } - }) + "var": { "a": null } + } + """) .Build()) .MatchSnapshotAsync(); } @@ -242,9 +319,18 @@ public async Task Var_is_empty_object_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($var: ExampleInput!) { example(input: $var) }") + .SetDocument( + """ + query($var: ExampleInput!) { + example(input: $var) + } + """) .SetVariableValues( - new Dictionary<string, object?> { { "var", new ObjectValueNode() } }) + """ + { + "var": { } + } + """) .Build()) .MatchSnapshotAsync(); } @@ -259,7 +345,12 @@ public async Task Input_is_set_to_string_abc123_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("{ example(input: \"abc123\") }") + .SetDocument( + """ + { + example(input: "abc123") + } + """) .Build()) .MatchSnapshotAsync(); } @@ -274,8 +365,18 @@ public async Task Var_is_string_abc123_and_passed_to_input_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($var: String!) { example(input: $var) }") - .SetVariableValues(new Dictionary<string, object?> { { "var", "abc123" } }) + .SetDocument( + """ + query($var: String!) { + example(input: $var) + } + """) + .SetVariableValues( + """ + { + "var": "abc123" + } + """) .Build()) .MatchSnapshotAsync(); } @@ -288,7 +389,12 @@ public async Task A_is_set_and_B_is_set_to_string_Error() .AddGraphQL() .AddQueryType<Query>() .ModifyOptions(o => o.EnableOneOf = true) - .ExecuteRequestAsync("{ example(input: { a: \"abc\", b: \"123\" }) }") + .ExecuteRequestAsync( + """ + { + example(input: { a: "abc", b: "123" }) + } + """) .MatchSnapshotAsync(); } @@ -300,7 +406,12 @@ public async Task B_is_set_to_string_Error() .AddGraphQL() .AddQueryType<Query>() .ModifyOptions(o => o.EnableOneOf = true) - .ExecuteRequestAsync("{ example(input: { b: \"123\" }) }") + .ExecuteRequestAsync( + """ + { + example(input: { b: "123" }) + } + """) .MatchSnapshotAsync(); } @@ -314,15 +425,18 @@ public async Task Var_is_object_with_B_set_to_abc_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($var: ExampleInput!) { example(input: $var) }") + .SetDocument( + """ + query($var: ExampleInput!) { + example(input: $var) + } + """) .SetVariableValues( - new Dictionary<string, object?> + """ { - { - "var", - new ObjectValueNode(new ObjectFieldNode("b", "abc")) - } - }) + "var": { "b": "abc" } + } + """) .Build()) .MatchSnapshotAsync(); } @@ -334,7 +448,12 @@ public async Task A_is_set_to_string_Valid() .AddGraphQL() .AddQueryType<Query>() .ModifyOptions(o => o.EnableOneOf = true) - .ExecuteRequestAsync("{ example(input: { a: \"abc\" }) }") + .ExecuteRequestAsync( + """ + { + example(input: { a: "abc" }) + } + """) .MatchSnapshotAsync(); } @@ -348,7 +467,12 @@ public async Task B_is_variable_and_var_not_set_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($b: Int!) { example(input: { b: $b }) }") + .SetDocument( + """ + query($b: Int!) { + example(input: { b: $b }) + } + """) .Build()) .MatchSnapshotAsync(); } @@ -362,10 +486,18 @@ public async Task Var_is_object_with_field_A_set_to_abc_Valid() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($var: ExampleInput!) { example(input: $var) }") + .SetDocument( + """ + query($var: ExampleInput!) { + example(input: $var) + } + """) .SetVariableValues( - new Dictionary<string, object?> - { { "var", new ObjectValueNode(new ObjectFieldNode("a", "abc")) } }) + """ + { + "var": { "a": "abc" } + } + """) .Build()) .MatchSnapshotAsync(); } @@ -378,7 +510,12 @@ public async Task A_is_set_and_B_is_null_Error() .AddGraphQL() .AddQueryType<Query>() .ModifyOptions(o => o.EnableOneOf = true) - .ExecuteRequestAsync("{ example(input: { a: \"abc\", b: null }) }") + .ExecuteRequestAsync( + """ + { + example(input: { a: "abc", b: null }) + } + """) .MatchSnapshotAsync(); } @@ -392,8 +529,18 @@ public async Task B_is_variable_and_var_is_null_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($b: Int) { example(input: { b: $b }) }") - .SetVariableValues(new Dictionary<string, object?> { { "b", null } }) + .SetDocument( + """ + query($b: Int) { + example(input: { b: $b }) + } + """) + .SetVariableValues( + """ + { + "b": null + } + """) .Build()) .MatchSnapshotAsync(); } @@ -406,7 +553,12 @@ public async Task B_is_set_and_C_is_invalid_prop_Error() .AddGraphQL() .AddQueryType<Query>() .ModifyOptions(o => o.EnableOneOf = true) - .ExecuteRequestAsync("{ example(input: { b: 123, c: \"xyz\" }) }") + .ExecuteRequestAsync( + """ + { + example(input: { b: 123, c: "xyz" }) + } + """) .MatchSnapshotAsync(); } @@ -420,17 +572,18 @@ public async Task Var_is_object_with_fields_B_and_C_set_Error() .ModifyOptions(o => o.EnableOneOf = true) .ExecuteRequestAsync( OperationRequestBuilder.New() - .SetDocument("query($var: ExampleInput!) { example(input: $var) }") + .SetDocument( + """ + query($var: ExampleInput!) { + example(input: $var) + } + """) .SetVariableValues( - new Dictionary<string, object?> + """ { - { - "var", - new ObjectValueNode( - new ObjectFieldNode("b", 123), - new ObjectFieldNode("c", "xyz")) - } - }) + "var": { "b": 123, "c": "xyz" } + } + """) .Build()) .MatchSnapshotAsync(); } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/NodeResolverTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/NodeResolverTests.cs index 21db6317094..7fe1295807e 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/Relay/NodeResolverTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/Relay/NodeResolverTests.cs @@ -296,7 +296,7 @@ public async Task NodeResolver_And_AsSelector() """); // assert - Assert.Null(result.ExpectOperationResult().Errors); + Assert.Empty(result.ExpectOperationResult().Errors); } public class Query diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_Error.snap index f763315800b..b7889293d10 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_Error.snap @@ -4,8 +4,8 @@ "message": "The OneOf Input Object `ExampleInput` requires that exactly one field must be supplied and that field must not be `null`.", "locations": [ { - "line": 1, - "column": 18 + "line": 2, + "column": 20 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_and_B_is_null_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_and_B_is_null_Error.snap index f763315800b..b7889293d10 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_and_B_is_null_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_and_B_is_null_Error.snap @@ -4,8 +4,8 @@ "message": "The OneOf Input Object `ExampleInput` requires that exactly one field must be supplied and that field must not be `null`.", "locations": [ { - "line": 1, - "column": 18 + "line": 2, + "column": 20 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_and_B_is_set_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_and_B_is_set_Error.snap index f763315800b..b7889293d10 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_and_B_is_set_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_null_and_B_is_set_Error.snap @@ -4,8 +4,8 @@ "message": "The OneOf Input Object `ExampleInput` requires that exactly one field must be supplied and that field must not be `null`.", "locations": [ { - "line": 1, - "column": 18 + "line": 2, + "column": 20 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_null_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_null_Error.snap index f763315800b..b7889293d10 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_null_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_null_Error.snap @@ -4,8 +4,8 @@ "message": "The OneOf Input Object `ExampleInput` requires that exactly one field must be supplied and that field must not be `null`.", "locations": [ { - "line": 1, - "column": 18 + "line": 2, + "column": 20 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_set_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_set_Error.snap index f763315800b..b7889293d10 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_set_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_set_Error.snap @@ -4,8 +4,8 @@ "message": "The OneOf Input Object `ExampleInput` requires that exactly one field must be supplied and that field must not be `null`.", "locations": [ { - "line": 1, - "column": 18 + "line": 2, + "column": 20 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_set_to_string_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_set_to_string_Error.snap index bbc357ad3bf..422125140f8 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_set_to_string_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_set_and_B_is_set_to_string_Error.snap @@ -4,8 +4,8 @@ "message": "The OneOf Input Object `ExampleInput` requires that exactly one field must be supplied and that field must not be `null`.", "locations": [ { - "line": 1, - "column": 18 + "line": 2, + "column": 20 } ], "path": [ @@ -21,8 +21,8 @@ "message": "The specified value type of field `b` does not match the field type.", "locations": [ { - "line": 1, - "column": 33 + "line": 2, + "column": 35 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_unset_variable_and_B_is_set_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_unset_variable_and_B_is_set_Error.snap index fa99e3e0703..b7889293d10 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_unset_variable_and_B_is_set_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_unset_variable_and_B_is_set_Error.snap @@ -4,8 +4,8 @@ "message": "The OneOf Input Object `ExampleInput` requires that exactly one field must be supplied and that field must not be `null`.", "locations": [ { - "line": 1, - "column": 37 + "line": 2, + "column": 20 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_variable_and_B_is_set_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_variable_and_B_is_set_Error.snap index fa99e3e0703..b7889293d10 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_variable_and_B_is_set_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_variable_and_B_is_set_Error.snap @@ -4,8 +4,8 @@ "message": "The OneOf Input Object `ExampleInput` requires that exactly one field must be supplied and that field must not be `null`.", "locations": [ { - "line": 1, - "column": 37 + "line": 2, + "column": 20 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_variable_and_B_is_unset_variable_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_variable_and_B_is_unset_variable_Error.snap index 1ed474db0b7..b7889293d10 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_variable_and_B_is_unset_variable_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.A_is_variable_and_B_is_unset_variable_Error.snap @@ -4,8 +4,8 @@ "message": "The OneOf Input Object `ExampleInput` requires that exactly one field must be supplied and that field must not be `null`.", "locations": [ { - "line": 1, - "column": 47 + "line": 2, + "column": 20 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_set_and_C_is_invalid_prop_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_set_and_C_is_invalid_prop_Error.snap index 58cc3202201..a98e2dd839d 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_set_and_C_is_invalid_prop_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_set_and_C_is_invalid_prop_Error.snap @@ -4,8 +4,8 @@ "message": "The OneOf Input Object `ExampleInput` requires that exactly one field must be supplied and that field must not be `null`.", "locations": [ { - "line": 1, - "column": 18 + "line": 2, + "column": 20 } ], "path": [ @@ -21,8 +21,8 @@ "message": "The specified input object field `c` does not exist.", "locations": [ { - "line": 1, - "column": 28 + "line": 2, + "column": 30 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_set_to_string_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_set_to_string_Error.snap index bf74e7e2de5..141b40c695b 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_set_to_string_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_set_to_string_Error.snap @@ -4,8 +4,8 @@ "message": "The specified value type of field `b` does not match the field type.", "locations": [ { - "line": 1, - "column": 23 + "line": 2, + "column": 25 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_variable_and_var_is_null_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_variable_and_var_is_null_Error.snap index 56550d56c9c..f8f5dd50bfc 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_variable_and_var_is_null_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.B_is_variable_and_var_is_null_Error.snap @@ -4,8 +4,8 @@ "message": "The variable `$b` assigned to the field `b` of the OneOf Input Object `ExampleInput` must be non-null.", "locations": [ { - "line": 1, - "column": 33 + "line": 2, + "column": 20 } ], "path": [ @@ -21,8 +21,8 @@ "message": "The variable `b` is not compatible with the type of the current one-of location.", "locations": [ { - "line": 1, - "column": 38 + "line": 2, + "column": 25 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Input_is_empty_object_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Input_is_empty_object_Error.snap index f763315800b..b7889293d10 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Input_is_empty_object_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Input_is_empty_object_Error.snap @@ -4,8 +4,8 @@ "message": "The OneOf Input Object `ExampleInput` requires that exactly one field must be supplied and that field must not be `null`.", "locations": [ { - "line": 1, - "column": 18 + "line": 2, + "column": 20 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Input_is_set_to_string_abc123_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Input_is_set_to_string_abc123_Error.snap index a3212085871..a9e9b905373 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Input_is_set_to_string_abc123_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Input_is_set_to_string_abc123_Error.snap @@ -4,8 +4,8 @@ "message": "The specified argument value does not match the argument type.", "locations": [ { - "line": 1, - "column": 18 + "line": 2, + "column": 20 } ], "path": [ diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_B_set_to_abc_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_B_set_to_abc_Error.snap index ced70629eed..1af77a3efa7 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_B_set_to_abc_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_B_set_to_abc_Error.snap @@ -1,7 +1,7 @@ { "errors": [ { - "message": "Int cannot parse the given literal of type `StringValueNode`.", + "message": "Int cannot coerce the given value JSON element of type `String` to a runtime value.", "path": [ "var", "b" diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_string_abc123_and_passed_to_input_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_string_abc123_and_passed_to_input_Error.snap index a5d078b9578..481d42ec4b6 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_string_abc123_and_passed_to_input_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_string_abc123_and_passed_to_input_Error.snap @@ -4,8 +4,8 @@ "message": "The variable `var` is not compatible with the type of the current location.", "locations": [ { - "line": 1, - "column": 39 + "line": 2, + "column": 20 } ], "path": [ From e6988768ce7e5aa356c2cbc77cc6a352c7cba131 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Mon, 12 Jan 2026 09:43:19 +0100 Subject: [PATCH 088/144] Test fixes --- .../Instrumentation/DiagnosticListenerTests.cs | 4 ++-- .../Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs | 2 +- ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...itudeTypeTests.Latitude_ExpectCoerceOutputValueDouble.snap | 1 + ...tudeTypeTests.Longitude_ExpectCoerceOutputValueDouble.snap | 1 + ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...Tests.CoerceOutputValue_GivenObject_MatchExpectedType.snap | 1 + ...setTypeTests.UtcOffset_ExpectCoerceOutputValueToMatch.snap | 1 + 17 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_ExpectCoerceOutputValueDouble.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Longitude_ExpectCoerceOutputValueDouble.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.UtcOffset_ExpectCoerceOutputValueToMatch.snap diff --git a/src/HotChocolate/Core/test/Execution.Tests/Instrumentation/DiagnosticListenerTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Instrumentation/DiagnosticListenerTests.cs index 125c083cd81..f5ec24ec372 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Instrumentation/DiagnosticListenerTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Instrumentation/DiagnosticListenerTests.cs @@ -23,7 +23,7 @@ public async Task Intercept_Resolver_Result_With_Listener() var result = await executor.ExecuteAsync("{ hero { name } }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); Assert.Collection(listener.Results, r => Assert.IsType<Droid>(r)); } @@ -64,7 +64,7 @@ public async Task Intercept_Resolver_Result_With_Multiple_Listener() var result = await executor.ExecuteAsync("{ hero { name } }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); Assert.Collection(listenerA.Results, r => Assert.IsType<Droid>(r)); Assert.Collection(listenerB.Results, r => Assert.IsType<Droid>(r)); } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs index e82f4ca6c08..7591861187d 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs @@ -1039,7 +1039,7 @@ ... on Droid { var resultB = await executor.ExecuteAsync(requestB); // assert - Assert.Null(Assert.IsType<OperationResult>(resultA).Errors); + Assert.Empty(Assert.IsType<OperationResult>(resultA).Errors); Assert.NotNull(Assert.IsType<OperationResult>(resultB).Errors); } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..69a50e2994b --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"CapitalizeTest@chillicream.com" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..b10c748217a --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"#FFFFFF" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..cd13b7befa8 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"hsl(270, 60%, 70%)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..2e5f019c2a3 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"hsla(240, 100%, 50%, .4)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..fecd56ab7a9 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"192.168.0.1" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..68462bcd697 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"2001:db8::7" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..8d605ecd99a --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"ISBN-13: 9780765335999" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_ExpectCoerceOutputValueDouble.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_ExpectCoerceOutputValueDouble.snap new file mode 100644 index 00000000000..acd116d99e8 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_ExpectCoerceOutputValueDouble.snap @@ -0,0 +1 @@ +"89° 0' 0\" N" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Longitude_ExpectCoerceOutputValueDouble.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Longitude_ExpectCoerceOutputValueDouble.snap new file mode 100644 index 00000000000..1854f9e4891 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Longitude_ExpectCoerceOutputValueDouble.snap @@ -0,0 +1 @@ +"179° 0' 0\" E" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..f56b947e871 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"fa:7e:9e:ff:fe:9f:13:78" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..872349e2bdc --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"+76543678901234" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..f143ca7e44a --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"+16873271234" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..c9e07968e7f --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"rgb(100%, 0%, 0%)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap new file mode 100644 index 00000000000..f54fa8f6ea4 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap @@ -0,0 +1 @@ +"rgba(51 170 51 / 40%)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.UtcOffset_ExpectCoerceOutputValueToMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.UtcOffset_ExpectCoerceOutputValueToMatch.snap new file mode 100644 index 00000000000..b128cefece5 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.UtcOffset_ExpectCoerceOutputValueToMatch.snap @@ -0,0 +1 @@ +"+10:00" From ff645eb1683ebceac629769fe6400d8b3ea8188b Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Mon, 12 Jan 2026 21:53:51 +0100 Subject: [PATCH 089/144] Fixed File Name --- .../Core/src/Types/Types/Scalars/{JsonType.cs => AnyType.cs} | 1 - 1 file changed, 1 deletion(-) rename src/HotChocolate/Core/src/Types/Types/Scalars/{JsonType.cs => AnyType.cs} (99%) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs similarity index 99% rename from src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs rename to src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs index 09be8490f7a..d5fb18e584e 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/JsonType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs @@ -5,7 +5,6 @@ using HotChocolate.Language; using HotChocolate.Language.Visitors; using HotChocolate.Text.Json; -using HotChocolate.Types.Composite; using static HotChocolate.Utilities.ThrowHelper; namespace HotChocolate.Types; From adb8b759f7805702c5a809ee338fd956074dc825 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Mon, 12 Jan 2026 22:38:30 +0100 Subject: [PATCH 090/144] Fixed more tests --- .../Execution/DynamicEndpointMiddleware.cs | 4 + .../Execution/OperationRequestBuilder.cs | 5 + .../Execution/VariableBatchRequest.cs | 2 +- .../Execution/OperationRequestBuilderTests.cs | 187 ++++++++++++++++-- .../Execution/ResponseStreamTests.cs | 2 +- ...OnlyQueryDocIsSet_RequestHasOnlyQuery.snap | 82 +------- ...st_OnlyQueryIsSet_RequestHasOnlyQuery.snap | 22 +-- ...ueryAndAddProperties_RequestIsCreated.snap | 25 +-- ...QueryAndInitialValue_RequestIsCreated.snap | 29 +-- ...st_QueryAndOperation_RequestIsCreated.snap | 23 +-- ...eryAndResetOperation_RequestIsCreated.snap | 22 +-- ...ryAndResetProperties_RequestIsCreated.snap | 25 +-- ...eryAndResetVariables_RequestIsCreated.snap | 22 +-- ...est_QueryAndServices_RequestIsCreated.snap | 23 +-- ...eryAndSetNewProperty_RequestIsCreated.snap | 25 +-- ...eryAndSetNewVariable_RequestIsCreated.snap | 26 +-- ...ueryAndSetProperties_RequestIsCreated.snap | 28 +-- ..._QueryAndSetProperty_RequestIsCreated.snap | 25 +-- ...yAndTryAddProperties_PropertyIsNotSet.snap | 25 +-- ...ueryAndTryAddProperties_PropertyIsSet.snap | 25 +-- ....BuildRequest_SetAll_RequestIsCreated.snap | 29 +-- ...sts.BuildRequest_SetErrorHandlingMode.snap | 23 +-- ...rrorHandlingMode_VariableBatchRequest.snap | 30 +-- .../HotChocolate.Utilities.Buffers.csproj | 1 + 24 files changed, 235 insertions(+), 475 deletions(-) diff --git a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs index 57a59486280..fa9e8f0e327 100644 --- a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs +++ b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs @@ -12,6 +12,10 @@ namespace HotChocolate.Adapters.OpenApi; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class DynamicEndpointMiddleware( string schemaName, OpenApiEndpointDescriptor endpointDescriptor) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs index 81dddda74ce..fd5862309d7 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs @@ -545,6 +545,11 @@ public OperationRequestBuilder Reset() /// </returns> public IOperationRequest Build() { + if (_document is null && OperationDocumentId.IsNullOrEmpty(_documentId)) + { + throw new InvalidOperationException(OperationRequest_DocumentOrIdMustBeSet); + } + IOperationRequest? request; var features = _features; diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs index 2dc18021785..ecf0d976fd4 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/VariableBatchRequest.cs @@ -67,7 +67,7 @@ public VariableBatchRequest( { if (document is null && OperationDocumentId.IsNullOrEmpty(documentId)) { - throw new InvalidOperationException(OperationRequest_DocumentOrIdMustBeSet); + throw new ArgumentException(OperationRequest_DocumentOrIdMustBeSet); } if (variableValues.Document.RootElement.ValueKind is not JsonValueKind.Array) diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs index f409a297c4f..9f551619d2d 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs @@ -1,4 +1,7 @@ +using System.Buffers; +using System.Text.Encodings.Web; using System.Text.Json; +using CookieCrumble.Formatters; using HotChocolate.Language; using Microsoft.Extensions.DependencyInjection; @@ -17,7 +20,7 @@ public void BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -33,7 +36,7 @@ public void BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -80,7 +83,7 @@ public void BuildRequest_QueryAndSetNewVariable_RequestIsCreated() // assert // one should be bar - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -97,7 +100,7 @@ public void BuildRequest_QueryAndResetVariables_RequestIsCreated() // assert // no variable should be in the request - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -113,7 +116,7 @@ public void BuildRequest_QueryAndAddProperties_RequestIsCreated() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -135,7 +138,7 @@ public void BuildRequest_QueryAndSetProperties_RequestIsCreated() // assert // only three should exist - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -152,7 +155,7 @@ public void BuildRequest_QueryAndSetProperty_RequestIsCreated() // assert // one should be bar - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -168,7 +171,7 @@ public void BuildRequest_QueryAndSetNewProperty_RequestIsCreated() // assert // one should be bar - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -186,7 +189,7 @@ public void BuildRequest_QueryAndResetProperties_RequestIsCreated() // assert // no property should be in the request - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -201,7 +204,7 @@ public void BuildRequest_QueryAndInitialValue_RequestIsCreated() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -216,7 +219,7 @@ public void BuildRequest_QueryAndOperation_RequestIsCreated() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -233,7 +236,7 @@ public void BuildRequest_QueryAndResetOperation_RequestIsCreated() // assert // the operation should be null - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -253,7 +256,7 @@ public void BuildRequest_QueryAndServices_RequestIsCreated() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -273,7 +276,7 @@ public void BuildRequest_SetAll_RequestIsCreated() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -288,7 +291,7 @@ public void BuildRequest_QueryAndTryAddProperties_PropertyIsSet() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -304,7 +307,7 @@ public void BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -319,7 +322,7 @@ public void BuildRequest_SetErrorHandlingMode() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -335,6 +338,154 @@ public void BuildRequest_SetErrorHandlingMode_VariableBatchRequest() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); + } +} + +public class OperationRequestSnapshotFormatter : SnapshotValueFormatter<IOperationRequest> +{ + public static OperationRequestSnapshotFormatter Instance { get; } = new OperationRequestSnapshotFormatter(); + + protected override void Format(IBufferWriter<byte> snapshot, IOperationRequest value) + { + var jsonOptions = new JsonWriterOptions + { + Indented = true, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; + + using var jsonWriter = new Utf8JsonWriter(snapshot, jsonOptions); + + switch (value) + { + case VariableBatchRequest vr: + WriteVariableBatchRequest(jsonWriter, vr); + break; + + case OperationRequest or: + WriteOperationRequest(jsonWriter, or); + break; + + default: + throw new NotSupportedException(); + } + + jsonWriter.Flush(); + } + + private static void WriteOperationRequest(Utf8JsonWriter writer, OperationRequest request) + { + writer.WriteStartObject(); + + WriteCommonProperties(writer, request); + + if (request.VariableValues is not null) + { + writer.WritePropertyName("variableValues"); + request.VariableValues.Document.RootElement.WriteTo(writer); + } + + writer.WriteEndObject(); + } + + private static void WriteVariableBatchRequest(Utf8JsonWriter writer, VariableBatchRequest request) + { + writer.WriteStartObject(); + + WriteCommonProperties(writer, request); + + writer.WritePropertyName("variableValues"); + request.VariableValues.Document.RootElement.WriteTo(writer); + + writer.WriteEndObject(); + } + + private static void WriteCommonProperties(Utf8JsonWriter writer, IOperationRequest request) + { + if (request.Document is not null) + { + writer.WriteString("document", request.Document.ToString()); + } + + if (request.DocumentId.HasValue) + { + writer.WriteString("documentId", request.DocumentId.Value); + } + + if (!request.DocumentHash.IsEmpty) + { + writer.WriteStartObject("documentHash"); + writer.WriteString("algorithm", request.DocumentHash.AlgorithmName); + writer.WriteString("value", request.DocumentHash.Value); + writer.WriteEndObject(); + } + + if (request.OperationName is not null) + { + writer.WriteString("operationName", request.OperationName); + } + + if (request.ErrorHandlingMode is not null) + { + writer.WriteString("errorHandlingMode", request.ErrorHandlingMode.Value.ToString()); + } + + if (request.Extensions is not null) + { + writer.WritePropertyName("extensions"); + request.Extensions.Document.RootElement.WriteTo(writer); + } + + if (request.ContextData?.Count > 0) + { + writer.WriteStartObject("contextData"); + foreach (var kvp in request.ContextData) + { + writer.WritePropertyName(kvp.Key); + WriteValue(writer, kvp.Value); + } + writer.WriteEndObject(); + } + + if (request.Services is not null) + { + writer.WriteBoolean("hasServices", true); + } + + if (request.Flags != RequestFlags.AllowAll) + { + writer.WriteString("flags", request.Flags.ToString()); + } + } + + private static void WriteValue(Utf8JsonWriter writer, object? value) + { + switch (value) + { + case null: + writer.WriteNullValue(); + break; + case string s: + writer.WriteStringValue(s); + break; + case bool b: + writer.WriteBooleanValue(b); + break; + case int i: + writer.WriteNumberValue(i); + break; + case long l: + writer.WriteNumberValue(l); + break; + case double d: + writer.WriteNumberValue(d); + break; + case decimal dec: + writer.WriteNumberValue(dec); + break; + default: + writer.WriteStringValue($"[{value.GetType().Name}]"); + break; + } } } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/ResponseStreamTests.cs b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/ResponseStreamTests.cs index d1aea2cd7ae..db461d00f17 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/ResponseStreamTests.cs +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/ResponseStreamTests.cs @@ -27,7 +27,7 @@ public void Register_Disposable_Result_Is_null() void Fail() => default(ResponseStream)!.RegisterForCleanup(disposable); // assert - Assert.Throws<ArgumentNullException>(Fail); + Assert.Throws<NullReferenceException>(Fail); } [Fact] diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap index 2e8cf977e6f..3c6c661b710 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap @@ -1,83 +1,3 @@ { - "Document": { - "Document": { - "Kind": "Document", - "Location": { - "Start": 0, - "End": 7, - "Line": 1, - "Column": 1 - }, - "Definitions": [ - { - "Kind": "OperationDefinition", - "Location": { - "Start": 0, - "End": 7, - "Line": 1, - "Column": 1 - }, - "Name": null, - "Description": null, - "Operation": "Query", - "VariableDefinitions": [], - "Directives": [], - "SelectionSet": { - "Kind": "SelectionSet", - "Location": { - "Start": 0, - "End": 7, - "Line": 1, - "Column": 1 - }, - "Selections": [ - { - "Kind": "Field", - "Alias": null, - "Arguments": [], - "SelectionSet": null, - "Location": { - "Start": 2, - "End": 7, - "Line": 1, - "Column": 3 - }, - "Name": { - "Kind": "Name", - "Location": { - "Start": 2, - "End": 7, - "Line": 1, - "Column": 3 - }, - "Value": "foo" - }, - "Directives": [] - } - ] - } - } - ], - "Count": 5, - "FieldsCount": 1 - } - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{\n foo\n}" } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap index 3a6b30514e4..936eca25c9a 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap @@ -1,23 +1,3 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }" } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap index 7b80aa328ac..a64aa13a9a5 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap @@ -1,26 +1,7 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { + "document": "{ foo }", + "contextData": { "one": "foo", "two": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + } } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap index aedc70c0fbf..9a1057a7a93 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap @@ -1,27 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { - "HotChocolate.Execution.InitialValue": { - "a": "123" - } - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }", + "contextData": { + "HotChocolate.Execution.InitialValue": "[<>f__AnonymousType0`1]" + } } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap index e7dd60c6f05..8d6ef222c16 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap @@ -1,23 +1,4 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": "bar", - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }", + "operationName": "bar" } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap index 3a6b30514e4..936eca25c9a 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap @@ -1,23 +1,3 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }" } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap index 7b80aa328ac..936eca25c9a 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap @@ -1,26 +1,3 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { - "one": "foo", - "two": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }" } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap index 3a6b30514e4..936eca25c9a 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap @@ -1,23 +1,3 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }" } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap index c4b2ad3ad95..8a29f56ba50 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap @@ -1,23 +1,4 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": {}, - "Flags": "AllowAll" + "document": "{ foo }", + "hasServices": true } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap index 9969d5b9c47..8440024f277 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap @@ -1,25 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { + "document": "{ foo }", + "contextData": { "one": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + } } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap index 3a787581bbe..89173ee120c 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap @@ -1,25 +1,9 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": { + "document": "{ foo }", + "extensions": { "one": "bar" }, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "variableValues": { + "one": "bar" + } } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap index 7b80aa328ac..d07bcfdbaea 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap @@ -1,26 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { - "one": "foo", - "two": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }", + "contextData": { + "three": "baz" + } } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap index 9969d5b9c47..8440024f277 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap @@ -1,25 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { + "document": "{ foo }", + "contextData": { "one": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + } } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap index ab46aa9cd27..2280371e81d 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap @@ -1,25 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { + "document": "{ foo }", + "contextData": { "one": "foo" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + } } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap index 9969d5b9c47..8440024f277 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap @@ -1,25 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { + "document": "{ foo }", + "contextData": { "one": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + } } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap index b94f786765e..f9474877f42 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap @@ -1,27 +1,14 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": "bar", - "ErrorHandlingMode": null, - "VariableValues": { + "document": "{ foo }", + "operationName": "bar", + "extensions": { "two": "bar" }, - "Extensions": null, - "ContextData": { + "contextData": { "one": "foo" }, - "Features": [], - "Services": {}, - "Flags": "AllowAll" + "hasServices": true, + "variableValues": { + "two": "bar" + } } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode.snap index f1fc83123f5..6af0dd1b5d2 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode.snap @@ -1,23 +1,4 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": "Halt", - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }", + "errorHandlingMode": "Halt" } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode_VariableBatchRequest.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode_VariableBatchRequest.snap index 72bbb21f3e2..0276b4f5889 100644 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode_VariableBatchRequest.snap +++ b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode_VariableBatchRequest.snap @@ -1,25 +1,9 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": "Halt", - "VariableValues": { - "one": "foo" - }, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }", + "errorHandlingMode": "Halt", + "variableValues": [ + { + "one": "foo" + } + ] } diff --git a/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj b/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj index 29f951382bb..c5675ba4db8 100644 --- a/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj +++ b/src/HotChocolate/Utilities/src/Utilities.Buffers/HotChocolate.Utilities.Buffers.csproj @@ -20,6 +20,7 @@ <InternalsVisibleTo Include="HotChocolate.Language.Web" /> <InternalsVisibleTo Include="HotChocolate.Types" /> <InternalsVisibleTo Include="HotChocolate.Fusion.Execution" /> + <InternalsVisibleTo Include="HotChocolate.Execution.Abstractions" /> <InternalsVisibleTo Include="HotChocolate.Fusion.Execution.Benchmarks" /> </ItemGroup> From 7c2c1a8b85049b208fcedc26b9004aad373cec37 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Mon, 12 Jan 2026 22:49:11 +0100 Subject: [PATCH 091/144] Refactored more tests --- .../Execution/OperationRequestBuilderTests.cs | 491 ------------------ .../Execution/ResponseStreamTests.cs | 184 ------- ...mpty_OperationRequestBuilderException.snap | 1 - ...OnlyQueryDocIsSet_RequestHasOnlyQuery.snap | 3 - ...st_OnlyQueryIsSet_RequestHasOnlyQuery.snap | 3 - ...ueryAndAddProperties_RequestIsCreated.snap | 7 - ...QueryAndInitialValue_RequestIsCreated.snap | 6 - ...st_QueryAndOperation_RequestIsCreated.snap | 4 - ...eryAndResetOperation_RequestIsCreated.snap | 3 - ...ryAndResetProperties_RequestIsCreated.snap | 3 - ...eryAndResetVariables_RequestIsCreated.snap | 3 - ...est_QueryAndServices_RequestIsCreated.snap | 4 - ...eryAndSetNewProperty_RequestIsCreated.snap | 6 - ...eryAndSetNewVariable_RequestIsCreated.snap | 9 - ...ueryAndSetProperties_RequestIsCreated.snap | 6 - ..._QueryAndSetProperty_RequestIsCreated.snap | 6 - ...yAndTryAddProperties_PropertyIsNotSet.snap | 6 - ...ueryAndTryAddProperties_PropertyIsSet.snap | 6 - ....BuildRequest_SetAll_RequestIsCreated.snap | 14 - ...ltBuilderTests.Create_Result_Set_Data.snap | 5 - ...tBuilderTests.Create_Result_Set_Items.snap | 5 - .../AnnotationBasedAuthorizationTests.cs | 54 -- .../CodeFirstAuthorizationTests.cs | 18 - .../Execution/OperationRequestBuilderTests.cs | 185 ++++--- .../OperationRequestSnapshotFormatter.cs | 154 ++++++ .../Execution/ResponseStreamTests.cs | 2 +- ...OnlyQueryDocIsSet_RequestHasOnlyQuery.snap | 82 +-- ...st_OnlyQueryIsSet_RequestHasOnlyQuery.snap | 22 +- ...ueryAndAddProperties_RequestIsCreated.snap | 25 +- ...QueryAndInitialValue_RequestIsCreated.snap | 29 +- ...st_QueryAndOperation_RequestIsCreated.snap | 23 +- ...eryAndResetOperation_RequestIsCreated.snap | 22 +- ...ryAndResetProperties_RequestIsCreated.snap | 25 +- ...eryAndResetVariables_RequestIsCreated.snap | 22 +- ...est_QueryAndServices_RequestIsCreated.snap | 23 +- ...eryAndSetNewProperty_RequestIsCreated.snap | 25 +- ...ndSetNewVariableJson_RequestIsCreated.snap | 33 +- ...etNewVariableSetJson_RequestIsCreated.snap | 39 +- ...eryAndSetNewVariable_RequestIsCreated.snap | 26 +- ...ueryAndSetProperties_RequestIsCreated.snap | 28 +- ..._QueryAndSetProperty_RequestIsCreated.snap | 25 +- ...yAndTryAddProperties_PropertyIsNotSet.snap | 25 +- ...ueryAndTryAddProperties_PropertyIsSet.snap | 25 +- ....BuildRequest_SetAll_RequestIsCreated.snap | 29 +- ...sts.BuildRequest_SetErrorHandlingMode.snap | 0 ...rrorHandlingMode_VariableBatchRequest.snap | 0 46 files changed, 322 insertions(+), 1394 deletions(-) delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/ResponseStreamTests.cs delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_Empty_OperationRequestBuilderException.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationResultBuilderTests.Create_Result_Set_Data.snap delete mode 100644 src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationResultBuilderTests.Create_Result_Set_Items.snap create mode 100644 src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestSnapshotFormatter.cs rename src/HotChocolate/Core/test/{Abstractions.Tests => Execution.Abstractions.Tests}/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode.snap (100%) rename src/HotChocolate/Core/test/{Abstractions.Tests => Execution.Abstractions.Tests}/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode_VariableBatchRequest.snap (100%) diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs deleted file mode 100644 index 9f551619d2d..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/OperationRequestBuilderTests.cs +++ /dev/null @@ -1,491 +0,0 @@ -using System.Buffers; -using System.Text.Encodings.Web; -using System.Text.Json; -using CookieCrumble.Formatters; -using HotChocolate.Language; -using Microsoft.Extensions.DependencyInjection; - -namespace HotChocolate.Execution; - -public class OperationRequestBuilderTests -{ - [Fact] - public void BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .Build(); - - // assert - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery() - { - // arrange - var query = Utf8GraphQLParser.Parse("{ foo }"); - - // act - var request = - OperationRequestBuilder.New() - .SetDocument(query) - .Build(); - - // assert - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_Empty_OperationRequestBuilderException() - { - // arrange - // act - Action action = () => - OperationRequestBuilder.New() - .Build(); - - // assert - Assert.Throws<InvalidOperationException>(action).Message.MatchSnapshot(); - } - - [InlineData("")] - [InlineData(null)] - [Theory] - public void SetQuery_NullOrEmpty_ArgumentException(string? query) - { - // arrange - // act - void Action() => - OperationRequestBuilder.New() - .SetDocument(query!) - .Build(); - - // assert - Assert.Equal( - "sourceText", - Assert.ThrowsAny<ArgumentException>(Action).ParamName); - } - - [Fact] - public void BuildRequest_QueryAndSetNewVariable_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .SetVariableValues(new Dictionary<string, object?> { ["one"] = "bar" }) - .Build(); - - // assert - // one should be bar - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndResetVariables_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .SetVariableValues(new Dictionary<string, object?> { ["one"] = "bar" }) - .SetVariableValues(default(JsonDocument)) - .Build(); - - // assert - // no variable should be in the request - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndAddProperties_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .AddGlobalState("one", "foo") - .AddGlobalState("two", "bar") - .Build(); - - // assert - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndSetProperties_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .AddGlobalState("one", "foo") - .AddGlobalState("two", "bar") - .SetGlobalState( - new Dictionary<string, object?> - { - { "three", "baz" } - }) - .Build(); - - // assert - // only three should exist - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndSetProperty_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .AddGlobalState("one", "foo") - .SetGlobalState("one", "bar") - .Build(); - - // assert - // one should be bar - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndSetNewProperty_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .SetGlobalState("one", "bar") - .Build(); - - // assert - // one should be bar - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndResetProperties_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .AddGlobalState("one", "foo") - .AddGlobalState("two", "bar") - .SetGlobalState(null) - .Build(); - - // assert - // no property should be in the request - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndInitialValue_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .SetGlobalState(WellKnownContextData.InitialValue, new { a = "123" }) - .Build(); - - // assert - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndOperation_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .SetOperationName("bar") - .Build(); - - // assert - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndResetOperation_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .SetOperationName("bar") - .SetOperationName(null) - .Build(); - - // assert - // the operation should be null - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndServices_RequestIsCreated() - { - // arrange - var service = new { a = "123" }; - - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .SetServices( - new ServiceCollection() - .AddSingleton(service.GetType(), service) - .BuildServiceProvider()) - .Build(); - - // assert - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_SetAll_RequestIsCreated() - { - // arrange - var service = new { a = "123" }; - - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .SetOperationName("bar") - .AddGlobalState("one", "foo") - .SetVariableValues(new Dictionary<string, object?> { { "two", "bar" } }) - .SetServices(new ServiceCollection().AddSingleton(service.GetType(), service).BuildServiceProvider()) - .Build(); - - // assert - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndTryAddProperties_PropertyIsSet() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .TryAddGlobalState("one", "bar") - .Build(); - - // assert - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .AddGlobalState("one", "foo") - .TryAddGlobalState("one", "bar") - .Build(); - - // assert - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_SetErrorHandlingMode() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .SetErrorHandlingMode(ErrorHandlingMode.Halt) - .Build(); - - // assert - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } - - [Fact] - public void BuildRequest_SetErrorHandlingMode_VariableBatchRequest() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument("{ foo }") - .SetErrorHandlingMode(ErrorHandlingMode.Halt) - .SetVariableValues([new Dictionary<string, object?> { ["one"] = "foo" }]) - .Build(); - - // assert - request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); - } -} - -public class OperationRequestSnapshotFormatter : SnapshotValueFormatter<IOperationRequest> -{ - public static OperationRequestSnapshotFormatter Instance { get; } = new OperationRequestSnapshotFormatter(); - - protected override void Format(IBufferWriter<byte> snapshot, IOperationRequest value) - { - var jsonOptions = new JsonWriterOptions - { - Indented = true, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }; - - using var jsonWriter = new Utf8JsonWriter(snapshot, jsonOptions); - - switch (value) - { - case VariableBatchRequest vr: - WriteVariableBatchRequest(jsonWriter, vr); - break; - - case OperationRequest or: - WriteOperationRequest(jsonWriter, or); - break; - - default: - throw new NotSupportedException(); - } - - jsonWriter.Flush(); - } - - private static void WriteOperationRequest(Utf8JsonWriter writer, OperationRequest request) - { - writer.WriteStartObject(); - - WriteCommonProperties(writer, request); - - if (request.VariableValues is not null) - { - writer.WritePropertyName("variableValues"); - request.VariableValues.Document.RootElement.WriteTo(writer); - } - - writer.WriteEndObject(); - } - - private static void WriteVariableBatchRequest(Utf8JsonWriter writer, VariableBatchRequest request) - { - writer.WriteStartObject(); - - WriteCommonProperties(writer, request); - - writer.WritePropertyName("variableValues"); - request.VariableValues.Document.RootElement.WriteTo(writer); - - writer.WriteEndObject(); - } - - private static void WriteCommonProperties(Utf8JsonWriter writer, IOperationRequest request) - { - if (request.Document is not null) - { - writer.WriteString("document", request.Document.ToString()); - } - - if (request.DocumentId.HasValue) - { - writer.WriteString("documentId", request.DocumentId.Value); - } - - if (!request.DocumentHash.IsEmpty) - { - writer.WriteStartObject("documentHash"); - writer.WriteString("algorithm", request.DocumentHash.AlgorithmName); - writer.WriteString("value", request.DocumentHash.Value); - writer.WriteEndObject(); - } - - if (request.OperationName is not null) - { - writer.WriteString("operationName", request.OperationName); - } - - if (request.ErrorHandlingMode is not null) - { - writer.WriteString("errorHandlingMode", request.ErrorHandlingMode.Value.ToString()); - } - - if (request.Extensions is not null) - { - writer.WritePropertyName("extensions"); - request.Extensions.Document.RootElement.WriteTo(writer); - } - - if (request.ContextData?.Count > 0) - { - writer.WriteStartObject("contextData"); - foreach (var kvp in request.ContextData) - { - writer.WritePropertyName(kvp.Key); - WriteValue(writer, kvp.Value); - } - writer.WriteEndObject(); - } - - if (request.Services is not null) - { - writer.WriteBoolean("hasServices", true); - } - - if (request.Flags != RequestFlags.AllowAll) - { - writer.WriteString("flags", request.Flags.ToString()); - } - } - - private static void WriteValue(Utf8JsonWriter writer, object? value) - { - switch (value) - { - case null: - writer.WriteNullValue(); - break; - case string s: - writer.WriteStringValue(s); - break; - case bool b: - writer.WriteBooleanValue(b); - break; - case int i: - writer.WriteNumberValue(i); - break; - case long l: - writer.WriteNumberValue(l); - break; - case double d: - writer.WriteNumberValue(d); - break; - case decimal dec: - writer.WriteNumberValue(dec); - break; - default: - writer.WriteStringValue($"[{value.GetType().Name}]"); - break; - } - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/ResponseStreamTests.cs b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/ResponseStreamTests.cs deleted file mode 100644 index db461d00f17..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/ResponseStreamTests.cs +++ /dev/null @@ -1,184 +0,0 @@ -namespace HotChocolate.Execution; - -public class ResponseStreamTests -{ - [Fact] - public async Task Register_One_Disposables() - { - // arrange - var result = new ResponseStream(() => null!); - var disposable = new TestDisposable(); - - // act - result.RegisterForCleanup(disposable); - - // assert - await result.DisposeAsync(); - Assert.True(disposable.IsDisposed); - } - - [Fact] - public void Register_Disposable_Result_Is_null() - { - // arrange - var disposable = new TestDisposable(); - - // act - void Fail() => default(ResponseStream)!.RegisterForCleanup(disposable); - - // assert - Assert.Throws<NullReferenceException>(Fail); - } - - [Fact] - public void Register_Disposable_Disposable_Is_Null() - { - // arrange - var result = new ResponseStream(() => null!); - - // act - void Fail() => result.RegisterForCleanup(default(IDisposable)!); - - // assert - Assert.Throws<ArgumentNullException>(Fail); - } - - [Fact] - public async Task Register_One_Async_Cleanup_Func() - { - // arrange - var result = new ResponseStream(() => null!); - var disposed = false; - - // act - result.RegisterForCleanup( - () => - { - disposed = true; - return default; - }); - - // assert - await result.DisposeAsync(); - Assert.True(disposed); - } - - [Fact] - public void Register_One_Async_Cleanup_Func_Func_is_Null() - { - // arrange - var result = new ResponseStream(() => null!); - - // act - void Fail() => result.RegisterForCleanup(null!); - - // assert - Assert.Throws<ArgumentNullException>(Fail); - } - - [Fact] - public async Task Register_One_Cleanup_Func() - { - // arrange - var result = new ResponseStream(() => null!); - var disposed = false; - - // act - result.RegisterForCleanup(() => disposed = true); - - // assert - await result.DisposeAsync(); - Assert.True(disposed); - } - - [Fact] - public void Register_One_Cleanup_Func_Func_is_Null() - { - // arrange - var result = new ResponseStream(() => null!); - - // act - void Fail() => result.RegisterForCleanup(default(Action)!); - - // assert - Assert.Throws<ArgumentNullException>(Fail); - } - - [Fact] - public async Task Register_Two_Disposables() - { - // arrange - var result = new ResponseStream(() => null!); - var asyncDisposable = new TestAsyncDisposable(); - var disposable = new TestDisposable(); - - // act - result.RegisterForCleanup(asyncDisposable); - result.RegisterForCleanup(disposable); - - // assert - await result.DisposeAsync(); - Assert.True(asyncDisposable.IsDisposed); - Assert.True(disposable.IsDisposed); - } - - [Fact] - public void Register_One_Async_Disposable_Disposable_Is_Null() - { - // arrange - var result = new ResponseStream(() => null!); - - // act - void Fail() => result.RegisterForCleanup(default(IAsyncDisposable)!); - - // assert - Assert.Throws<ArgumentNullException>(Fail); - } - - [Fact] - public void ExpectOperationResult() - { - // arrange - IExecutionResult result = new ResponseStream(() => null!); - - // act - var responseStream = result.ExpectResponseStream(); - - // assert - Assert.NotNull(responseStream); - } - - [Fact] - public void ExpectResponseStream() - { - // arrange - IExecutionResult result = new ResponseStream(() => null!); - - // act - void Fail() => result.ExpectOperationResult(); - - // assert - Assert.Throws<ArgumentException>(Fail); - } - - public class TestDisposable : IDisposable - { - public bool IsDisposed { get; private set; } - - public void Dispose() - { - IsDisposed = true; - } - } - - public class TestAsyncDisposable : IAsyncDisposable - { - public bool IsDisposed { get; private set; } - - public ValueTask DisposeAsync() - { - IsDisposed = true; - return default; - } - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_Empty_OperationRequestBuilderException.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_Empty_OperationRequestBuilderException.snap deleted file mode 100644 index 861c09c37a7..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_Empty_OperationRequestBuilderException.snap +++ /dev/null @@ -1 +0,0 @@ -A GraphQL operation document or a document id is required to create a query request. diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap deleted file mode 100644 index 3c6c661b710..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap +++ /dev/null @@ -1,3 +0,0 @@ -{ - "document": "{\n foo\n}" -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap deleted file mode 100644 index 936eca25c9a..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap +++ /dev/null @@ -1,3 +0,0 @@ -{ - "document": "{ foo }" -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap deleted file mode 100644 index a64aa13a9a5..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap +++ /dev/null @@ -1,7 +0,0 @@ -{ - "document": "{ foo }", - "contextData": { - "one": "foo", - "two": "bar" - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap deleted file mode 100644 index 9a1057a7a93..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap +++ /dev/null @@ -1,6 +0,0 @@ -{ - "document": "{ foo }", - "contextData": { - "HotChocolate.Execution.InitialValue": "[<>f__AnonymousType0`1]" - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap deleted file mode 100644 index 8d6ef222c16..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap +++ /dev/null @@ -1,4 +0,0 @@ -{ - "document": "{ foo }", - "operationName": "bar" -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap deleted file mode 100644 index 936eca25c9a..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap +++ /dev/null @@ -1,3 +0,0 @@ -{ - "document": "{ foo }" -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap deleted file mode 100644 index 936eca25c9a..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap +++ /dev/null @@ -1,3 +0,0 @@ -{ - "document": "{ foo }" -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap deleted file mode 100644 index 936eca25c9a..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap +++ /dev/null @@ -1,3 +0,0 @@ -{ - "document": "{ foo }" -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap deleted file mode 100644 index 8a29f56ba50..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap +++ /dev/null @@ -1,4 +0,0 @@ -{ - "document": "{ foo }", - "hasServices": true -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap deleted file mode 100644 index 8440024f277..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap +++ /dev/null @@ -1,6 +0,0 @@ -{ - "document": "{ foo }", - "contextData": { - "one": "bar" - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap deleted file mode 100644 index 89173ee120c..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap +++ /dev/null @@ -1,9 +0,0 @@ -{ - "document": "{ foo }", - "extensions": { - "one": "bar" - }, - "variableValues": { - "one": "bar" - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap deleted file mode 100644 index d07bcfdbaea..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap +++ /dev/null @@ -1,6 +0,0 @@ -{ - "document": "{ foo }", - "contextData": { - "three": "baz" - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap deleted file mode 100644 index 8440024f277..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap +++ /dev/null @@ -1,6 +0,0 @@ -{ - "document": "{ foo }", - "contextData": { - "one": "bar" - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap deleted file mode 100644 index 2280371e81d..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap +++ /dev/null @@ -1,6 +0,0 @@ -{ - "document": "{ foo }", - "contextData": { - "one": "foo" - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap deleted file mode 100644 index 8440024f277..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap +++ /dev/null @@ -1,6 +0,0 @@ -{ - "document": "{ foo }", - "contextData": { - "one": "bar" - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap deleted file mode 100644 index f9474877f42..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap +++ /dev/null @@ -1,14 +0,0 @@ -{ - "document": "{ foo }", - "operationName": "bar", - "extensions": { - "two": "bar" - }, - "contextData": { - "one": "foo" - }, - "hasServices": true, - "variableValues": { - "two": "bar" - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationResultBuilderTests.Create_Result_Set_Data.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationResultBuilderTests.Create_Result_Set_Data.snap deleted file mode 100644 index 14f978e2730..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationResultBuilderTests.Create_Result_Set_Data.snap +++ /dev/null @@ -1,5 +0,0 @@ -{ - "data": { - "a": "b" - } -} diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationResultBuilderTests.Create_Result_Set_Items.snap b/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationResultBuilderTests.Create_Result_Set_Items.snap deleted file mode 100644 index 1556e54ffed..00000000000 --- a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationResultBuilderTests.Create_Result_Set_Items.snap +++ /dev/null @@ -1,5 +0,0 @@ -{ - "items": [ - 1 - ] -} diff --git a/src/HotChocolate/Core/test/Authorization.Tests/AnnotationBasedAuthorizationTests.cs b/src/HotChocolate/Core/test/Authorization.Tests/AnnotationBasedAuthorizationTests.cs index 03bf74861eb..dde463590e6 100644 --- a/src/HotChocolate/Core/test/Authorization.Tests/AnnotationBasedAuthorizationTests.cs +++ b/src/HotChocolate/Core/test/Authorization.Tests/AnnotationBasedAuthorizationTests.cs @@ -42,12 +42,6 @@ public async Task Authorize_Person_NoAccess() "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "person" ], @@ -189,12 +183,6 @@ public async Task Authorize_Person_AllowAnonymous() "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "person" ], @@ -284,12 +272,6 @@ public async Task Authorize_CityOrStreet_Enforce_Auth_When_City() "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "cityOrStreet" ], @@ -333,12 +315,6 @@ public async Task Authorize_Field_Auth_Not_Allowed() "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "thisIsAuthorized" ], @@ -606,12 +582,6 @@ public async Task Authorize_Node_Field_Inferred() "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "node" ], @@ -664,12 +634,6 @@ public async Task Authorize_Node_Field_Inferred_Explicit_NodeResolver() "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "node" ], @@ -723,12 +687,6 @@ public async Task Authorize_Node_Field_Inferred_Explicit_NodeResolver_TypePolicy "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "node" ], @@ -838,12 +796,6 @@ public async Task Authorize_Nodes_Field_Different_Ids_BeforeResolver() "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "nodes", 1 @@ -966,12 +918,6 @@ public async Task Assert_UserState_Exists() "errors": [ { "message": "The node ID string has an invalid format.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "nodes" ], diff --git a/src/HotChocolate/Core/test/Authorization.Tests/CodeFirstAuthorizationTests.cs b/src/HotChocolate/Core/test/Authorization.Tests/CodeFirstAuthorizationTests.cs index ab40d99725e..bc330f47a1c 100644 --- a/src/HotChocolate/Core/test/Authorization.Tests/CodeFirstAuthorizationTests.cs +++ b/src/HotChocolate/Core/test/Authorization.Tests/CodeFirstAuthorizationTests.cs @@ -31,12 +31,6 @@ public async Task Authorize_Person_NoAccess() "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "person" ], @@ -158,12 +152,6 @@ public async Task Authorize_CityOrStreet_Enforce_Auth_When_City() "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "cityOrStreet" ], @@ -207,12 +195,6 @@ public async Task Authorize_Field_Auth_Not_Allowed() "errors": [ { "message": "The current user is not authorized to access this resource.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "thisIsAuthorized" ], diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs index 26a27afe183..663539b509c 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs @@ -1,4 +1,7 @@ +using System.Buffers; +using System.Text.Encodings.Web; using System.Text.Json; +using CookieCrumble.Formatters; using HotChocolate.Language; using Microsoft.Extensions.DependencyInjection; @@ -17,7 +20,7 @@ public void BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -33,7 +36,7 @@ public void BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -80,64 +83,7 @@ public void BuildRequest_QueryAndSetNewVariable_RequestIsCreated() // assert // one should be bar - request.MatchSnapshot(); - } - - [Fact] - public void BuildRequest_QueryAndSetNewVariableJson_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument( - """ - { - foo - } - """) - .SetVariableValues( - """ - { - "one": "bar" - } - """) - .Build(); - - // assert - // one should be bar - request.MatchSnapshot(); - } - - [Fact] - public void BuildRequest_QueryAndSetNewVariableSetJson_RequestIsCreated() - { - // arrange - // act - var request = - OperationRequestBuilder.New() - .SetDocument( - """ - { - foo - } - """) - .SetVariableValues( - """ - [ - { - "one": "bar" - }, - { - "one": "baz" - } - ] - """) - .Build(); - - // assert - // one should be bar - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -154,7 +100,7 @@ public void BuildRequest_QueryAndResetVariables_RequestIsCreated() // assert // no variable should be in the request - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -170,7 +116,7 @@ public void BuildRequest_QueryAndAddProperties_RequestIsCreated() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -192,7 +138,7 @@ public void BuildRequest_QueryAndSetProperties_RequestIsCreated() // assert // only three should exist - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -209,7 +155,7 @@ public void BuildRequest_QueryAndSetProperty_RequestIsCreated() // assert // one should be bar - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -225,7 +171,7 @@ public void BuildRequest_QueryAndSetNewProperty_RequestIsCreated() // assert // one should be bar - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -243,7 +189,7 @@ public void BuildRequest_QueryAndResetProperties_RequestIsCreated() // assert // no property should be in the request - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -258,7 +204,7 @@ public void BuildRequest_QueryAndInitialValue_RequestIsCreated() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -273,7 +219,7 @@ public void BuildRequest_QueryAndOperation_RequestIsCreated() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -290,7 +236,7 @@ public void BuildRequest_QueryAndResetOperation_RequestIsCreated() // assert // the operation should be null - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -303,11 +249,14 @@ public void BuildRequest_QueryAndServices_RequestIsCreated() var request = OperationRequestBuilder.New() .SetDocument("{ foo }") - .SetServices(new ServiceCollection().AddSingleton(service.GetType(), service).BuildServiceProvider()) + .SetServices( + new ServiceCollection() + .AddSingleton(service.GetType(), service) + .BuildServiceProvider()) .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -327,7 +276,7 @@ public void BuildRequest_SetAll_RequestIsCreated() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -342,7 +291,7 @@ public void BuildRequest_QueryAndTryAddProperties_PropertyIsSet() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } [Fact] @@ -358,6 +307,94 @@ public void BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet() .Build(); // assert - request.MatchSnapshot(); + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); + } + + [Fact] + public void BuildRequest_SetErrorHandlingMode() + { + // arrange + // act + var request = + OperationRequestBuilder.New() + .SetDocument("{ foo }") + .SetErrorHandlingMode(ErrorHandlingMode.Halt) + .Build(); + + // assert + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); + } + + [Fact] + public void BuildRequest_SetErrorHandlingMode_VariableBatchRequest() + { + // arrange + // act + var request = + OperationRequestBuilder.New() + .SetDocument("{ foo }") + .SetErrorHandlingMode(ErrorHandlingMode.Halt) + .SetVariableValues([new Dictionary<string, object?> { ["one"] = "foo" }]) + .Build(); + + // assert + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); + } + + [Fact] + public void BuildRequest_QueryAndSetNewVariableJson_RequestIsCreated() + { + // arrange + // act + var request = + OperationRequestBuilder.New() + .SetDocument( + """ + { + foo + } + """) + .SetVariableValues( + """ + { + "one": "bar" + } + """) + .Build(); + + // assert + // one should be bar + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); + } + + [Fact] + public void BuildRequest_QueryAndSetNewVariableSetJson_RequestIsCreated() + { + // arrange + // act + var request = + OperationRequestBuilder.New() + .SetDocument( + """ + { + foo + } + """) + .SetVariableValues( + """ + [ + { + "one": "bar" + }, + { + "one": "baz" + } + ] + """) + .Build(); + + // assert + // one should be bar + request.MatchSnapshot(formatter: OperationRequestSnapshotFormatter.Instance); } } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestSnapshotFormatter.cs b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestSnapshotFormatter.cs new file mode 100644 index 00000000000..cd32aa14091 --- /dev/null +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestSnapshotFormatter.cs @@ -0,0 +1,154 @@ +using System.Buffers; +using System.Text.Encodings.Web; +using System.Text.Json; +using CookieCrumble.Formatters; + +namespace HotChocolate.Execution; + +internal sealed class OperationRequestSnapshotFormatter : SnapshotValueFormatter<IOperationRequest> +{ + public static OperationRequestSnapshotFormatter Instance { get; } = new OperationRequestSnapshotFormatter(); + + protected override void Format(IBufferWriter<byte> snapshot, IOperationRequest value) + { + var jsonOptions = new JsonWriterOptions + { + Indented = true, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; + + using var jsonWriter = new Utf8JsonWriter(snapshot, jsonOptions); + + switch (value) + { + case VariableBatchRequest vr: + WriteVariableBatchRequest(jsonWriter, vr); + break; + + case OperationRequest or: + WriteOperationRequest(jsonWriter, or); + break; + + default: + throw new NotSupportedException(); + } + + jsonWriter.Flush(); + } + + private static void WriteOperationRequest(Utf8JsonWriter writer, OperationRequest request) + { + writer.WriteStartObject(); + + WriteCommonProperties(writer, request); + + if (request.VariableValues is not null) + { + writer.WritePropertyName("variableValues"); + request.VariableValues.Document.RootElement.WriteTo(writer); + } + + writer.WriteEndObject(); + } + + private static void WriteVariableBatchRequest(Utf8JsonWriter writer, VariableBatchRequest request) + { + writer.WriteStartObject(); + + WriteCommonProperties(writer, request); + + writer.WritePropertyName("variableValues"); + request.VariableValues.Document.RootElement.WriteTo(writer); + + writer.WriteEndObject(); + } + + private static void WriteCommonProperties(Utf8JsonWriter writer, IOperationRequest request) + { + if (request.Document is not null) + { + writer.WriteString("document", request.Document.ToString()); + } + + if (request.DocumentId.HasValue) + { + writer.WriteString("documentId", request.DocumentId.Value); + } + + if (!request.DocumentHash.IsEmpty) + { + writer.WriteStartObject("documentHash"); + writer.WriteString("algorithm", request.DocumentHash.AlgorithmName); + writer.WriteString("value", request.DocumentHash.Value); + writer.WriteEndObject(); + } + + if (request.OperationName is not null) + { + writer.WriteString("operationName", request.OperationName); + } + + if (request.ErrorHandlingMode is not null) + { + writer.WriteString("errorHandlingMode", request.ErrorHandlingMode.Value.ToString()); + } + + if (request.Extensions is not null) + { + writer.WritePropertyName("extensions"); + request.Extensions.Document.RootElement.WriteTo(writer); + } + + if (request.ContextData?.Count > 0) + { + writer.WriteStartObject("contextData"); + foreach (var kvp in request.ContextData) + { + writer.WritePropertyName(kvp.Key); + WriteValue(writer, kvp.Value); + } + writer.WriteEndObject(); + } + + if (request.Services is not null) + { + writer.WriteBoolean("hasServices", true); + } + + if (request.Flags != RequestFlags.AllowAll) + { + writer.WriteString("flags", request.Flags.ToString()); + } + } + + private static void WriteValue(Utf8JsonWriter writer, object? value) + { + switch (value) + { + case null: + writer.WriteNullValue(); + break; + case string s: + writer.WriteStringValue(s); + break; + case bool b: + writer.WriteBooleanValue(b); + break; + case int i: + writer.WriteNumberValue(i); + break; + case long l: + writer.WriteNumberValue(l); + break; + case double d: + writer.WriteNumberValue(d); + break; + case decimal dec: + writer.WriteNumberValue(dec); + break; + default: + writer.WriteStringValue($"[{value.GetType().Name}]"); + break; + } + } +} diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/ResponseStreamTests.cs b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/ResponseStreamTests.cs index d1aea2cd7ae..db461d00f17 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/ResponseStreamTests.cs +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/ResponseStreamTests.cs @@ -27,7 +27,7 @@ public void Register_Disposable_Result_Is_null() void Fail() => default(ResponseStream)!.RegisterForCleanup(disposable); // assert - Assert.Throws<ArgumentNullException>(Fail); + Assert.Throws<NullReferenceException>(Fail); } [Fact] diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap index 2e8cf977e6f..3c6c661b710 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryDocIsSet_RequestHasOnlyQuery.snap @@ -1,83 +1,3 @@ { - "Document": { - "Document": { - "Kind": "Document", - "Location": { - "Start": 0, - "End": 7, - "Line": 1, - "Column": 1 - }, - "Definitions": [ - { - "Kind": "OperationDefinition", - "Location": { - "Start": 0, - "End": 7, - "Line": 1, - "Column": 1 - }, - "Name": null, - "Description": null, - "Operation": "Query", - "VariableDefinitions": [], - "Directives": [], - "SelectionSet": { - "Kind": "SelectionSet", - "Location": { - "Start": 0, - "End": 7, - "Line": 1, - "Column": 1 - }, - "Selections": [ - { - "Kind": "Field", - "Alias": null, - "Arguments": [], - "SelectionSet": null, - "Location": { - "Start": 2, - "End": 7, - "Line": 1, - "Column": 3 - }, - "Name": { - "Kind": "Name", - "Location": { - "Start": 2, - "End": 7, - "Line": 1, - "Column": 3 - }, - "Value": "foo" - }, - "Directives": [] - } - ] - } - } - ], - "Count": 5, - "FieldsCount": 1 - } - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{\n foo\n}" } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap index 3a6b30514e4..936eca25c9a 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_OnlyQueryIsSet_RequestHasOnlyQuery.snap @@ -1,23 +1,3 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }" } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap index 7b80aa328ac..a64aa13a9a5 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndAddProperties_RequestIsCreated.snap @@ -1,26 +1,7 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { + "document": "{ foo }", + "contextData": { "one": "foo", "two": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + } } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap index aedc70c0fbf..9a1057a7a93 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndInitialValue_RequestIsCreated.snap @@ -1,27 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { - "HotChocolate.Execution.InitialValue": { - "a": "123" - } - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }", + "contextData": { + "HotChocolate.Execution.InitialValue": "[<>f__AnonymousType0`1]" + } } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap index e7dd60c6f05..8d6ef222c16 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndOperation_RequestIsCreated.snap @@ -1,23 +1,4 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": "bar", - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }", + "operationName": "bar" } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap index 3a6b30514e4..936eca25c9a 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetOperation_RequestIsCreated.snap @@ -1,23 +1,3 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }" } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap index 7b80aa328ac..936eca25c9a 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetProperties_RequestIsCreated.snap @@ -1,26 +1,3 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { - "one": "foo", - "two": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }" } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap index 3a6b30514e4..936eca25c9a 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndResetVariables_RequestIsCreated.snap @@ -1,23 +1,3 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }" } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap index c4b2ad3ad95..8a29f56ba50 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndServices_RequestIsCreated.snap @@ -1,23 +1,4 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": {}, - "Flags": "AllowAll" + "document": "{ foo }", + "hasServices": true } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap index 9969d5b9c47..8440024f277 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewProperty_RequestIsCreated.snap @@ -1,25 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { + "document": "{ foo }", + "contextData": { "one": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + } } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableJson_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableJson_RequestIsCreated.snap index b3d2d3b5d83..bbb6341c0cb 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableJson_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableJson_RequestIsCreated.snap @@ -1,30 +1,9 @@ { - "Document": { - "SourceText": "{\n foo\n}" + "document": "{\n foo\n}", + "extensions": { + "one": "bar" }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": { - "one": { - "Kind": "StringValue", - "Location": null, - "Value": "bar", - "Block": false - } - }, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "variableValues": { + "one": "bar" + } } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableSetJson_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableSetJson_RequestIsCreated.snap index 5e7921688b8..88b7a653016 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableSetJson_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableSetJson_RequestIsCreated.snap @@ -1,40 +1,11 @@ { - "Document": { - "SourceText": "{\n foo\n}" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": [ + "document": "{\n foo\n}", + "variableValues": [ { - "one": { - "Kind": "StringValue", - "Location": null, - "Value": "bar", - "Block": false - } + "one": "bar" }, { - "one": { - "Kind": "StringValue", - "Location": null, - "Value": "baz", - "Block": false - } + "one": "baz" } - ], - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + ] } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap index 3a787581bbe..89173ee120c 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap @@ -1,25 +1,9 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": { + "document": "{ foo }", + "extensions": { "one": "bar" }, - "Extensions": null, - "ContextData": null, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "variableValues": { + "one": "bar" + } } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap index 7b80aa328ac..d07bcfdbaea 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperties_RequestIsCreated.snap @@ -1,26 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { - "one": "foo", - "two": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + "document": "{ foo }", + "contextData": { + "three": "baz" + } } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap index 9969d5b9c47..8440024f277 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetProperty_RequestIsCreated.snap @@ -1,25 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { + "document": "{ foo }", + "contextData": { "one": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + } } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap index ab46aa9cd27..2280371e81d 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsNotSet.snap @@ -1,25 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { + "document": "{ foo }", + "contextData": { "one": "foo" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + } } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap index 9969d5b9c47..8440024f277 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndTryAddProperties_PropertyIsSet.snap @@ -1,25 +1,6 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": null, - "ErrorHandlingMode": null, - "VariableValues": null, - "Extensions": null, - "ContextData": { + "document": "{ foo }", + "contextData": { "one": "bar" - }, - "Features": [], - "Services": null, - "Flags": "AllowAll" + } } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap index b94f786765e..f9474877f42 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap @@ -1,27 +1,14 @@ { - "Document": { - "SourceText": "{ foo }" - }, - "DocumentId": { - "IsEmpty": true, - "Value": null - }, - "DocumentHash": { - "Value": null, - "AlgorithmName": null, - "Format": "Base64", - "IsEmpty": true - }, - "OperationName": "bar", - "ErrorHandlingMode": null, - "VariableValues": { + "document": "{ foo }", + "operationName": "bar", + "extensions": { "two": "bar" }, - "Extensions": null, - "ContextData": { + "contextData": { "one": "foo" }, - "Features": [], - "Services": {}, - "Flags": "AllowAll" + "hasServices": true, + "variableValues": { + "two": "bar" + } } diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode.snap similarity index 100% rename from src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode.snap rename to src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode.snap diff --git a/src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode_VariableBatchRequest.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode_VariableBatchRequest.snap similarity index 100% rename from src/HotChocolate/Core/test/Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode_VariableBatchRequest.snap rename to src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetErrorHandlingMode_VariableBatchRequest.snap From 935be5ec05cd10603289c73c0fd37c57eb997385 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 13 Jan 2026 13:26:40 +0100 Subject: [PATCH 092/144] Fixed more tests --- .../Execution/OpenApiEndpointFactory.cs | 7 ++ .../InternalServiceCollectionExtensions.cs | 7 ++ .../OpenApiDefinitionRegistry.cs | 7 ++ .../ExecutionRequestExecutorExtensions.cs | 6 + .../Processing/VariableCoercionHelper.cs | 119 +++++++++++++++++- .../Core/src/Types/Types/Scalars/AnyType.cs | 7 +- .../Types/SubscriptionTypeTests.cs | 10 +- .../src/Language.Web/JsonValueParser.cs | 4 +- .../src/CodeGeneration/BuiltInScalarNames.cs | 1 - .../CodeGeneration/Utilities/SchemaHelper.cs | 4 +- 10 files changed, 159 insertions(+), 13 deletions(-) diff --git a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/OpenApiEndpointFactory.cs b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/OpenApiEndpointFactory.cs index 0b03a7db5be..3f3785c0826 100644 --- a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/OpenApiEndpointFactory.cs +++ b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/OpenApiEndpointFactory.cs @@ -1,3 +1,6 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using HotChocolate.Language; using HotChocolate.Types; using HotChocolate.Validation; @@ -9,6 +12,10 @@ namespace HotChocolate.Adapters.OpenApi; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal static class OpenApiEndpointFactory { public static Endpoint Create( diff --git a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Extensions/InternalServiceCollectionExtensions.cs b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Extensions/InternalServiceCollectionExtensions.cs index 675af6888e3..43880eb4e9d 100644 --- a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Extensions/InternalServiceCollectionExtensions.cs +++ b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Extensions/InternalServiceCollectionExtensions.cs @@ -1,3 +1,6 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using HotChocolate.AspNetCore; using HotChocolate.Execution; using Microsoft.Extensions.DependencyInjection; @@ -5,6 +8,10 @@ namespace HotChocolate.Adapters.OpenApi; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal static class InternalServiceCollectionExtensions { public static IServiceCollection AddOpenApiServices( diff --git a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/OpenApiDefinitionRegistry.cs b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/OpenApiDefinitionRegistry.cs index 1452717c4ec..a085a228331 100644 --- a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/OpenApiDefinitionRegistry.cs +++ b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/OpenApiDefinitionRegistry.cs @@ -1,9 +1,16 @@ +#if !NET9_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif using HotChocolate.Utilities; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; namespace HotChocolate.Adapters.OpenApi; +#if !NET9_0_OR_GREATER +[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] +[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] +#endif internal sealed class OpenApiDefinitionRegistry : IAsyncDisposable { private static readonly OpenApiDefinitionValidator s_validator = new(); diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionRequestExecutorExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionRequestExecutorExtensions.cs index 26e4514ea9b..413aa52ab71 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionRequestExecutorExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionRequestExecutorExtensions.cs @@ -42,6 +42,8 @@ public static Task<IExecutionResult> ExecuteAsync( cancellationToken); } + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] public static Task<IExecutionResult> ExecuteAsync( this IRequestExecutor executor, [StringSyntax("graphql")] string query, @@ -59,6 +61,8 @@ public static Task<IExecutionResult> ExecuteAsync( CancellationToken.None); } + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] public static Task<IExecutionResult> ExecuteAsync( this IRequestExecutor executor, [StringSyntax("graphql")] string query, @@ -104,6 +108,8 @@ public static IExecutionResult Execute( .Build()); } + [RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] + [RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] public static IExecutionResult Execute( this IRequestExecutor executor, [StringSyntax("graphql")] string query, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs index 7e815ae3c39..6af3155eddb 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs @@ -2,6 +2,7 @@ using HotChocolate.Features; using HotChocolate.Language; using HotChocolate.Types; +using HotChocolate.Utilities; using static HotChocolate.Properties.Resources; namespace HotChocolate.Execution.Processing; @@ -96,11 +97,12 @@ private VariableValue CoerceVariableValue( IFeatureProvider context) { var root = Path.Root.Append(variableDefinition.Variable.Name.Value); + var valueParser = new JsonValueParser(); try { var runtimeValue = _inputParser.ParseInputValue(inputValue, variableType, context, path: root); - var valueLiteral = _inputFormatter.FormatValue(runtimeValue, variableType, root); + var valueLiteral = CoerceInputLiteral(inputValue, variableType, ref valueParser, depth: 0); return new VariableValue( variableDefinition.Variable.Name.Value, @@ -110,12 +112,19 @@ private VariableValue CoerceVariableValue( } catch (GraphQLException) { + valueParser._memory?.Abandon(); throw; } catch (Exception ex) { + valueParser._memory?.Abandon(); throw ThrowHelper.VariableValueInvalidType(variableDefinition, ex); } + finally + { + valueParser._memory?.Seal(); + valueParser._memory = null; + } } private static IInputType AssertInputType( @@ -129,4 +138,112 @@ private static IInputType AssertInputType( throw ThrowHelper.VariableIsNotAnInputType(variableDefinition); } + + private IValueNode CoerceInputLiteral( + JsonElement inputValue, + IInputType type, + ref JsonValueParser valueParser, + int depth) + { + if (depth > 64) + { + throw new InvalidOperationException("The input value is to deep."); + } + + if (inputValue.ValueKind is JsonValueKind.Null or JsonValueKind.Undefined) + { + return NullValueNode.Default; + } + + switch (type.Kind) + { + case TypeKind.Scalar: + return valueParser.Parse(inputValue, depth); + + case TypeKind.Enum: + if (inputValue.ValueKind is not JsonValueKind.String) + { + throw new InvalidOperationException(); + } + + return new EnumValueNode(inputValue.GetString()!); + + case TypeKind.InputObject: + if (inputValue.ValueKind is not JsonValueKind.Object) + { + throw new InvalidOperationException(); + } + + var inputObjectType = (InputObjectType)type; + var fields = new List<ObjectFieldNode>(); + var processedFields = StringSetPool.Shared.Rent(); + + try + { + foreach (var property in inputValue.EnumerateObject()) + { + if (!inputObjectType.Fields.TryGetField(property.Name, out var field)) + { + continue; + } + + processedFields.Add(property.Name); + + if (property.Value.ValueKind is JsonValueKind.Null) + { + if (field.DefaultValue is not (null or NullValueNode)) + { + fields.Add(new ObjectFieldNode(field.Name, field.DefaultValue)); + } + else + { + fields.Add(new ObjectFieldNode(field.Name, NullValueNode.Default)); + } + } + else + { + var value = CoerceInputLiteral(property.Value, field.Type, ref valueParser, depth + 1); + fields.Add(new ObjectFieldNode(field.Name, value)); + } + } + + foreach (var field in inputObjectType.Fields) + { + if (field.DefaultValue is not (null or NullValueNode) && !processedFields.Contains(field.Name)) + { + fields.Add(new ObjectFieldNode(field.Name, field.DefaultValue)); + } + } + + return new ObjectValueNode(fields); + } + finally + { + StringSetPool.Shared.Return(processedFields); + } + + case TypeKind.List: + if (inputValue.ValueKind is not JsonValueKind.Array) + { + throw new InvalidOperationException(); + } + + var items = new List<IValueNode>(); + var elementType = type.ElementType().EnsureInputType(); + var elementDepth = depth + 1; + + foreach (var item in inputValue.EnumerateArray()) + { + items.Add(CoerceInputLiteral(item, elementType, ref valueParser, elementDepth)); + } + + return new ListValueNode(items); + + case TypeKind.NonNull: + return CoerceInputLiteral(inputValue, type.InnerType().EnsureInputType(), ref valueParser, depth); + + default: + throw new NotSupportedException(); + } + } } diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs index d5fb18e584e..98882c1c754 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs @@ -21,7 +21,10 @@ public sealed class AnyType : ScalarType<JsonElement> /// <summary> /// Initializes a new instance of <see cref="AnyType"/>. /// </summary> - public AnyType(string name, BindingBehavior bind = BindingBehavior.Explicit) + public AnyType( + string name, + string? description = null, + BindingBehavior bind = BindingBehavior.Explicit) : base(name, bind) { } @@ -31,7 +34,7 @@ public AnyType(string name, BindingBehavior bind = BindingBehavior.Explicit) /// </summary> [ActivatorUtilitiesConstructor] public AnyType() - : this(ScalarNames.Any, BindingBehavior.Implicit) + : this(ScalarNames.Any, bind: BindingBehavior.Implicit) { } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/SubscriptionTypeTests.cs b/src/HotChocolate/Core/test/Types.Tests/Types/SubscriptionTypeTests.cs index 064b2bd008a..a69dd74ca4d 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/SubscriptionTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Tests/Types/SubscriptionTypeTests.cs @@ -252,7 +252,7 @@ public async Task Subscribe_Attribute_With_Argument_Topic() var mutationResult = await executor.ExecuteAsync( "mutation { writeMessage(userId: \"abc\" message: \"def\") }", ct); - Assert.Null(mutationResult.ExpectOperationResult().Errors); + Assert.Empty(mutationResult.ExpectOperationResult().Errors); await foreach (var queryResult in results.WithCancellation(ct).ConfigureAwait(false)) @@ -286,7 +286,7 @@ public async Task Subscribe_Attribute_With_Static_Topic_Defined_On_Attribute() var mutationResult = await executor.ExecuteAsync( "mutation { writeFixedMessage(message: \"def\") }", ct); - Assert.Null(mutationResult.ExpectOperationResult().Errors); + Assert.Empty(mutationResult.ExpectOperationResult().Errors); await foreach (var queryResult in results.WithCancellation(ct).ConfigureAwait(false)) @@ -320,7 +320,7 @@ public async Task Subscribe_Attribute_With_Static_Topic() var mutationResult = await executor.ExecuteAsync( "mutation { writeSysMessage(message: \"def\") }", ct); - Assert.Null(mutationResult.ExpectOperationResult().Errors); + Assert.Empty(mutationResult.ExpectOperationResult().Errors); await foreach (var queryResult in results.WithCancellation(ct).ConfigureAwait(false)) @@ -354,7 +354,7 @@ public async Task Subscribe_Attribute_With_Static_Topic_Infer_Topic() var mutationResult = await executor.ExecuteAsync( "mutation { writeOnInferTopic(message: \"def\") }", ct); - Assert.Null(mutationResult.ExpectOperationResult().Errors); + Assert.Empty(mutationResult.ExpectOperationResult().Errors); await foreach (var queryResult in results.WithCancellation(ct).ConfigureAwait(false)) @@ -388,7 +388,7 @@ public async Task Subscribe_Attribute_With_Explicitly_Defined_Subscribe() var mutationResult = await executor.ExecuteAsync( "mutation { writeOnExplicit(message: \"def\") }", ct); - Assert.Null(mutationResult.ExpectOperationResult().Errors); + Assert.Empty(mutationResult.ExpectOperationResult().Errors); await foreach (var queryResult in results.WithCancellation(ct).ConfigureAwait(false)) diff --git a/src/HotChocolate/Language/src/Language.Web/JsonValueParser.cs b/src/HotChocolate/Language/src/Language.Web/JsonValueParser.cs index 623162871e8..7e1ab3b545a 100644 --- a/src/HotChocolate/Language/src/Language.Web/JsonValueParser.cs +++ b/src/HotChocolate/Language/src/Language.Web/JsonValueParser.cs @@ -12,7 +12,7 @@ public ref struct JsonValueParser { private const int DefaultMaxAllowedDepth = 64; private readonly int _maxAllowedDepth; - private Utf8MemoryBuilder? _memory; + internal Utf8MemoryBuilder? _memory; private readonly PooledArrayWriter? _externalBuffer; public JsonValueParser() @@ -61,7 +61,7 @@ public IValueNode Parse(JsonElement element) } } - private IValueNode Parse(JsonElement element, int depth) + internal IValueNode Parse(JsonElement element, int depth) { if (depth > _maxAllowedDepth) { diff --git a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/BuiltInScalarNames.cs b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/BuiltInScalarNames.cs index 4c7dacd6d65..a27aaf93ad6 100644 --- a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/BuiltInScalarNames.cs +++ b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/BuiltInScalarNames.cs @@ -29,7 +29,6 @@ public static class BuiltInScalarNames ScalarNames.LocalTime, ScalarNames.ByteArray, ScalarNames.Any, - ScalarNames.JSON, ScalarNames.TimeSpan ]; diff --git a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Utilities/SchemaHelper.cs b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Utilities/SchemaHelper.cs index d17791d4b4a..eff70e25f49 100644 --- a/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Utilities/SchemaHelper.cs +++ b/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Utilities/SchemaHelper.cs @@ -71,7 +71,7 @@ public static Schema Load( { builder.AddType(new AnyType()); } - else if (scalar.Name.Value == ScalarNames.JSON) + else if (scalar.Name.Value == "JSON") { builder.AddType(new AnyType()); } @@ -255,7 +255,7 @@ private static void AddDefaultScalarInfos( serializationType: TypeNames.JsonElement); TryAddLeafType( leafTypes, - typeName: ScalarNames.JSON, + typeName: "JSON", runtimeType: TypeNames.JsonElement, serializationType: TypeNames.JsonElement); TryAddLeafType( From d6674f35b28c00c243ae5be5fed7e11fe96dcdbe Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 13 Jan 2026 15:15:49 +0100 Subject: [PATCH 093/144] Fixed snapshots --- .../Types/IScalarTypeDefinition.cs | 8 +- .../Core/src/Types.Scalars/HslType.cs | 1 - .../src/Types/Types/Scalars/ScalarType.cs | 1 + .../src/Types/Types/Scalars/ScalarType~2.cs | 8 ++ .../Core/src/Validation/Rules/ValueVisitor.cs | 4 +- .../Execution/OperationRequestBuilderTests.cs | 3 - .../EmailAddressTypeTests.cs | 58 +++--------- .../Types.Scalars.Tests/HexColorTypeTests.cs | 45 ++-------- .../test/Types.Scalars.Tests/HslTypeTests.cs | 48 ++-------- .../test/Types.Scalars.Tests/HslaTypeTests.cs | 45 ++-------- .../test/Types.Scalars.Tests/IPv4TypeTests.cs | 60 ++----------- .../test/Types.Scalars.Tests/IPv6TypeTests.cs | 88 ++----------------- .../test/Types.Scalars.Tests/IsbnTypeTests.cs | 63 ++----------- .../Types.Scalars.Tests/LatitudeTypeTests.cs | 40 ++------- .../Types.Scalars.Tests/LongitudeTypeTests.cs | 38 ++------ .../MacAddressTypeTests.cs | 57 ++---------- .../PhoneNumberTypeTests.cs | 44 ++-------- .../Types.Scalars.Tests/RegexTypeTests.cs | 35 ++------ .../test/Types.Scalars.Tests/RgbTypeTests.cs | 50 ++--------- .../test/Types.Scalars.Tests/RgbaTypeTests.cs | 51 ++--------- .../Types.Scalars.Tests/ScalarTypeTestBase.cs | 45 +++------- .../Types.Scalars.Tests/UtcOffsetTypeTests.cs | 2 +- ...ype_964088212926846371f67b9dbbae71fa.snap} | 0 ...Type_d719552af12494261e81f23cd0397836.snap | 1 + ...ssTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...Type_0b458790848e6b0815c4a68564809093.snap | 1 + ...Type_12441ef563fb1790d6bc03101ec8a21c.snap | 1 + ...ype_262da8014d7d6e3c30cd4b6a9bb7a338.snap} | 0 ...Type_38c099ce24bf9fe6999fdababaee3f42.snap | 1 + ...Type_76a24952b1d6a4cd27c305c8f21b3f99.snap | 1 + ...Type_e3121067d571a23b9672b2c2e3b55b07.snap | 1 + ...Type_f872c166827395ccf8d5518f7d3513bc.snap | 1 + ...orTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...Type_1b3c56971e4f9450a96c03c3b3bae08a.snap | 1 + ...Type_352105b8b66543a9fd2c9b7d4f5c7fca.snap | 1 + ...Type_97631aad881420d7b8a1f5b8b6a6fef5.snap | 1 + ...ype_9feaab4c2dd205e63359cc22865ff1ac.snap} | 0 ...Type_fd0f55c5c7826c904fcd63395ec83629.snap | 1 + ...slTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...Type_1dbe557deffc4c8ecbec94cd56b5b089.snap | 1 + ...Type_7ea6a33b6750fae695313f9e82b770ad.snap | 1 + ...Type_8ef966d431bd361b811460577539eba6.snap | 1 + ...ype_9018ed6231a7cdad357f9a977a6cd825.snap} | 0 ...Type_a1936072f8265ffe96846b97d58af2f2.snap | 1 + ...Type_e6b79f45b8230e257d060e089062bdf3.snap | 1 + ...laTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...Type_18f89358047376fe91a2ee17b186ec95.snap | 1 + ...Type_350e45e99b5b317b78c688f0efb511d9.snap | 1 + ...Type_6465ec74397c9126916786bbcd6d7601.snap | 1 + ...Type_67201f40ae13df9e156c4e44c945ca7d.snap | 1 + ...Type_69b9bcaf71e9e578a23d1ce7f52a2c1d.snap | 1 + ...Type_6d02dcf58a2cbba006375dd764aab35c.snap | 1 + ...Type_7566b5607904270e641cad65080bafd0.snap | 1 + ...Type_79320e642d9d2d5d533185e4e1102726.snap | 1 + ...Type_b241e9c700dd5bd5784b2f421f9fcbe1.snap | 1 + ...Type_be319164137345def2314a9663166227.snap | 1 + ...Type_eea88cd0d9a7ba26282fc786713bbbb6.snap | 1 + ...ype_f0fdb4c3f58e3e3f8e77162d893d3055.snap} | 0 ...Type_f528764d624db129b32c21fbca0cb8d6.snap | 1 + ...v4TypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...Type_07a3ab28d6921a0b904c48feae8f421e.snap | 1 + ...Type_2ef5eaf9cc284ae073940c0584d40950.snap | 1 + ...ype_350319c791ed8ec9318f2b85b17238ec.snap} | 0 ...Type_4501c091b0366d76ea3218b6cfdd8097.snap | 1 + ...Type_837ec5754f503cfaaee0929fd48974e7.snap | 1 + ...Type_9f01961b6f4e0afa0cd080cff75fcb12.snap | 1 + ...Type_a6089b200e480fff15bd3e996d5e35d3.snap | 1 + ...Type_b319496796efbc3758aaeaffaad50c38.snap | 1 + ...Type_bf58cb1caee07c11cd7ff627fba6ea6f.snap | 1 + ...Type_efee79a016771a12edc93c6c5f9f6aa2.snap | 1 + ...v6TypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...Type_0a65bdd4164698b4a11f03e4e2dbe2be.snap | 1 + ...ype_288a1acace8b8459633e9ef7a6ab60af.snap} | 0 ...Type_33232b136a4843fc8f53211b63ca5897.snap | 1 + ...Type_3dc4f838b65cab9fbcc1dfb7cbf0173e.snap | 1 + ...Type_6bafcaa6fa05d648504e9db22c4183fc.snap | 1 + ...Type_7b506cffbaee6c21722a21503c8425be.snap | 1 + ...Type_7dc0b8c13ba0b6dcfa91a686ffde61a1.snap | 1 + ...Type_9aa2d1cfba8c054cd3d5ec019d72da14.snap | 1 + ...Type_a34dbfec19f516077bc47e4aa5fb6bc4.snap | 1 + ...Type_a5dcae58b1ff3d253e0744745525de56.snap | 1 + ...Type_c526c0aaf1072e0f7cc87525e91755a0.snap | 1 + ...Type_c54bb8726c5cbae3737dfbb34af4c971.snap | 1 + ...Type_c9d6e9d7c3f69a47a221444b7c619fca.snap | 1 + ...Type_e99ab48105c2b955e39e9ca3c93b7d30.snap | 1 + ...Type_eb1b8cf6cb6e15d373c4176d9e4cc0e5.snap | 1 + ...Type_f78a6cabc3abb006a50d2c6731e91072.snap | 1 + ...Type_f91dfc86645ea521b24007fee689e0db.snap | 1 + ...Type_fce449c78ccb4fba8d6767da10eba91d.snap | 1 + ...bnTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...s.Latitude_ExpectCoerceOutputValueInt.snap | 1 + ...atitudeTypeTests.Latitude_Integration.snap | 2 +- ...deTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...ests.Integration_DefaultLocalCurrency.snap | 5 -- ...cyTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ....Longitude_ExpectCoerceOutputValueInt.snap | 1 + ...deTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...Type_0279295d6802d16aaa0e5f5e3da6c565.snap | 1 + ...Type_08111488cc185b178d7e1a740251f959.snap | 1 + ...ype_1ced0115e4e1771742e1a0bd270834f1.snap} | 0 ...Type_3ca01893ccdadcb14b9ceef238a739ae.snap | 1 + ...Type_43c01c6033471128fd3dc0f6e96c2e2b.snap | 1 + ...Type_528c8e6cd4a3c6598999a0e9df15ad32.snap | 1 + ...Type_bc6492229264a2605ee4d4d80f84ff12.snap | 1 + ...Type_c7e5a044b1077232ac3d126eb5351af7.snap | 1 + ...ssTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...atTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...ntTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...ngTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...atTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...ntTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...atTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...ntTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...ype_b13b36be789b4c7c6c9d0c8eb0213f23.snap} | 0 ...ype_fbffc6216c80443070d2e229102a73b1.snap} | 0 ...erTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...rtTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...ntTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...deTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...Type_fbffc6216c80443070d2e229102a73b1.snap | 1 + ...exTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...Type_1d71336c166b6a3eb6e6c0af8227c6e0.snap | 1 + ...Type_300b52e983e6fdac48c63dd558b4ee56.snap | 1 + ...Type_d50b6582425a945a55b1b4b9c738894a.snap | 1 + ...ype_e03c1db0e534457a4c740a6677b3ec48.snap} | 0 ...gbTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...Type_0fb5113599e35f50a51ebe87c8e25ea7.snap | 1 + ...Type_3682ab2a806b8bd332246fd96845650f.snap | 1 + ...Type_6e8013aa22ff3b319a3fdb72e1a9d73d.snap | 1 + ...ype_ca0d359e4fe997b4aee38de6c2ac21a8.snap} | 0 ...Type_d685a949db70bf68bd43a5f6f74155a4.snap | 1 + ...Type_e76ffa4dd28a52c91f6bf19a386dbf62.snap | 1 + ...baTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...teTypeTests.Schema_WithScalar_IsMatch.snap | 7 -- ...uld_BeBoundImplicitly_When_Registered.snap | 10 --- ...ntTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...uld_BeBoundImplicitly_When_Registered.snap | 10 --- ...ngTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...uld_BeBoundImplicitly_When_Registered.snap | 10 --- ...rtTypeTests.Schema_WithScalar_IsMatch.snap | 10 --- ...uld_BeBoundImplicitly_When_Registered.snap | 10 --- ...ypeTests.Integration_DefaultUtcOffset.snap | 5 -- ...etTypeTests.Schema_WithScalar_IsMatch.snap | 2 +- ...tch_cefb07be0bd04a57e3fb4923966f4d6c.snap} | 0 144 files changed, 230 insertions(+), 865 deletions(-) rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_964088212926846371f67b9dbbae71fa.snap} (100%) create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d719552af12494261e81f23cd0397836.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0b458790848e6b0815c4a68564809093.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_12441ef563fb1790d6bc03101ec8a21c.snap rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_262da8014d7d6e3c30cd4b6a9bb7a338.snap} (100%) create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_38c099ce24bf9fe6999fdababaee3f42.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_76a24952b1d6a4cd27c305c8f21b3f99.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e3121067d571a23b9672b2c2e3b55b07.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f872c166827395ccf8d5518f7d3513bc.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1b3c56971e4f9450a96c03c3b3bae08a.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_352105b8b66543a9fd2c9b7d4f5c7fca.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_97631aad881420d7b8a1f5b8b6a6fef5.snap rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9feaab4c2dd205e63359cc22865ff1ac.snap} (100%) create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fd0f55c5c7826c904fcd63395ec83629.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1dbe557deffc4c8ecbec94cd56b5b089.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7ea6a33b6750fae695313f9e82b770ad.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_8ef966d431bd361b811460577539eba6.snap rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9018ed6231a7cdad357f9a977a6cd825.snap} (100%) create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a1936072f8265ffe96846b97d58af2f2.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e6b79f45b8230e257d060e089062bdf3.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_18f89358047376fe91a2ee17b186ec95.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_350e45e99b5b317b78c688f0efb511d9.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6465ec74397c9126916786bbcd6d7601.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_67201f40ae13df9e156c4e44c945ca7d.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_69b9bcaf71e9e578a23d1ce7f52a2c1d.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6d02dcf58a2cbba006375dd764aab35c.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7566b5607904270e641cad65080bafd0.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_79320e642d9d2d5d533185e4e1102726.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_b241e9c700dd5bd5784b2f421f9fcbe1.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_be319164137345def2314a9663166227.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_eea88cd0d9a7ba26282fc786713bbbb6.snap rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f0fdb4c3f58e3e3f8e77162d893d3055.snap} (100%) create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f528764d624db129b32c21fbca0cb8d6.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_07a3ab28d6921a0b904c48feae8f421e.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_2ef5eaf9cc284ae073940c0584d40950.snap rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_350319c791ed8ec9318f2b85b17238ec.snap} (100%) create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_4501c091b0366d76ea3218b6cfdd8097.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_837ec5754f503cfaaee0929fd48974e7.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9f01961b6f4e0afa0cd080cff75fcb12.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a6089b200e480fff15bd3e996d5e35d3.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_b319496796efbc3758aaeaffaad50c38.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_bf58cb1caee07c11cd7ff627fba6ea6f.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_efee79a016771a12edc93c6c5f9f6aa2.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0a65bdd4164698b4a11f03e4e2dbe2be.snap rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_288a1acace8b8459633e9ef7a6ab60af.snap} (100%) create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_33232b136a4843fc8f53211b63ca5897.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3dc4f838b65cab9fbcc1dfb7cbf0173e.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6bafcaa6fa05d648504e9db22c4183fc.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7b506cffbaee6c21722a21503c8425be.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7dc0b8c13ba0b6dcfa91a686ffde61a1.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9aa2d1cfba8c054cd3d5ec019d72da14.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a34dbfec19f516077bc47e4aa5fb6bc4.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a5dcae58b1ff3d253e0744745525de56.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c526c0aaf1072e0f7cc87525e91755a0.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c54bb8726c5cbae3737dfbb34af4c971.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c9d6e9d7c3f69a47a221444b7c619fca.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e99ab48105c2b955e39e9ca3c93b7d30.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_eb1b8cf6cb6e15d373c4176d9e4cc0e5.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f78a6cabc3abb006a50d2c6731e91072.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f91dfc86645ea521b24007fee689e0db.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fce449c78ccb4fba8d6767da10eba91d.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_ExpectCoerceOutputValueInt.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LocalCurrencyTypeTests.Integration_DefaultLocalCurrency.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LocalCurrencyTypeTests.Schema_WithScalar_IsMatch.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Longitude_ExpectCoerceOutputValueInt.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0279295d6802d16aaa0e5f5e3da6c565.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_08111488cc185b178d7e1a740251f959.snap rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1ced0115e4e1771742e1a0bd270834f1.snap} (100%) create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3ca01893ccdadcb14b9ceef238a739ae.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_43c01c6033471128fd3dc0f6e96c2e2b.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_528c8e6cd4a3c6598999a0e9df15ad32.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_bc6492229264a2605ee4d4d80f84ff12.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c7e5a044b1077232ac3d126eb5351af7.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NegativeFloatTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NegativeIntTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonEmptyStringTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonNegativeFloatTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonNegativeIntTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonPositiveFloatTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonPositiveIntTypeTests.Schema_WithScalar_IsMatch.snap rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_b13b36be789b4c7c6c9d0c8eb0213f23.snap} (100%) rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{RegexTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fbffc6216c80443070d2e229102a73b1.snap} (100%) delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PortTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PositiveIntTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PostalCodeTypeTests.Schema_WithScalar_IsMatch.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fbffc6216c80443070d2e229102a73b1.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1d71336c166b6a3eb6e6c0af8227c6e0.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_300b52e983e6fdac48c63dd558b4ee56.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d50b6582425a945a55b1b4b9c738894a.snap rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e03c1db0e534457a4c740a6677b3ec48.snap} (100%) create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0fb5113599e35f50a51ebe87c8e25ea7.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3682ab2a806b8bd332246fd96845650f.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6e8013aa22ff3b319a3fdb72e1a9d73d.snap rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap => RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_ca0d359e4fe997b4aee38de6c2ac21a8.snap} (100%) create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d685a949db70bf68bd43a5f6f74155a4.snap create mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e76ffa4dd28a52c91f6bf19a386dbf62.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/SignedByteTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/SignedByteTypeTests.SignedByteType_Should_BeBoundImplicitly_When_Registered.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedIntTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedIntTypeTests.UnsignedIntType_Should_BeBoundImplicitly_When_Registered.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedLongTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedLongTypeTests.UnsignedLongType_Should_BeBoundImplicitly_When_Registered.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedShortTypeTests.Schema_WithScalar_IsMatch.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedShortTypeTests.UnsignedShortType_Should_BeBoundImplicitly_When_Registered.snap delete mode 100644 src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.Integration_DefaultUtcOffset.snap rename src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/{UtcOffsetTypeTests.UtcOffset_ExpectCoerceOutputValueToMatch.snap => UtcOffsetTypeTests.UtcOffset_ExpectCoerceOutputValueToMatch_cefb07be0bd04a57e3fb4923966f4d6c.snap} (100%) diff --git a/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs b/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs index 157995f4b62..2d6ed9e71d9 100644 --- a/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs +++ b/src/HotChocolate/Core/src/Types.Abstractions/Types/IScalarTypeDefinition.cs @@ -3,7 +3,7 @@ namespace HotChocolate.Types; /// <summary> -/// Represents a scalar type definition in the GraphQL schema. +/// Represents a GraphQL scalar type definition in the GraphQL schema. /// </summary> public interface IScalarTypeDefinition : IOutputTypeDefinition @@ -27,11 +27,11 @@ public interface IScalarTypeDefinition string? Pattern { get; } /// <summary> - /// Checks if the value is an instance of this type. + /// Checks if the value literal is compatible with this scalar type. /// </summary> - /// <param name="valueLiteral">The value to check.</param> + /// <param name="valueLiteral">The value literal to check.</param> /// <returns> - /// <c>true</c> if the value is an instance of this type; otherwise, <c>false</c>. + /// <c>true</c> if the value literal is compatible with this type; otherwise, <c>false</c>. /// </returns> bool IsValueCompatible(IValueNode valueLiteral); } diff --git a/src/HotChocolate/Core/src/Types.Scalars/HslType.cs b/src/HotChocolate/Core/src/Types.Scalars/HslType.cs index 30caf589006..2444fd8abc8 100644 --- a/src/HotChocolate/Core/src/Types.Scalars/HslType.cs +++ b/src/HotChocolate/Core/src/Types.Scalars/HslType.cs @@ -1,5 +1,4 @@ using System.Text.RegularExpressions; -using HotChocolate.Language; namespace HotChocolate.Types; diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs index 1eb6745a549..dfef2f11623 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using HotChocolate.Features; using HotChocolate.Language; diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs index 3ee8ec67b38..9c1fa2e697c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType~2.cs @@ -48,6 +48,10 @@ public sealed override object CoerceInputLiteral(IValueNode valueLiteral) { runtimeValue = OnCoerceInputLiteral(literal); } + catch (LeafCoercionException) + { + throw; + } catch (Exception ex) { throw CreateCoerceInputLiteralError(valueLiteral, ex); @@ -99,6 +103,10 @@ when inputValue.ValueKind is not (JsonValueKind.True or JsonValueKind.False): { runtimeValue = OnCoerceInputValue(inputValue, context); } + catch (LeafCoercionException) + { + throw; + } catch (Exception ex) { throw CreateCoerceInputValueError(inputValue, ex); diff --git a/src/HotChocolate/Core/src/Validation/Rules/ValueVisitor.cs b/src/HotChocolate/Core/src/Validation/Rules/ValueVisitor.cs index de91cb3aead..4f15fd23391 100644 --- a/src/HotChocolate/Core/src/Validation/Rules/ValueVisitor.cs +++ b/src/HotChocolate/Core/src/Validation/Rules/ValueVisitor.cs @@ -472,9 +472,9 @@ private static bool IsInstanceOfType( return false; } - if (inputType.IsScalarType()) + if (inputType is IScalarTypeDefinition scalarType) { - return ((IScalarTypeDefinition)inputType).IsValueCompatible(value); + return scalarType.IsValueCompatible(value); } return value.Kind is SyntaxKind.ObjectValue; diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs index 663539b509c..a80f53a55ca 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/OperationRequestBuilderTests.cs @@ -1,7 +1,4 @@ -using System.Buffers; -using System.Text.Encodings.Web; using System.Text.Json; -using CookieCrumble.Formatters; using HotChocolate.Language; using Microsoft.Extensions.DependencyInjection; diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/EmailAddressTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/EmailAddressTypeTests.cs index 884cfc067eb..72a546f675d 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/EmailAddressTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/EmailAddressTypeTests.cs @@ -15,46 +15,17 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "K@chillicream.com", false)] // K = Kelvin Sign (U+212A) - [InlineData(typeof(StringValueNode), "test@chillicream.com", true)] - [InlineData(typeof(StringValueNode), "CapitalizeTest@chillicream.com", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<EmailAddressType>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "test@chillicream.com", "test@chillicream.com")] - [InlineData(typeof(StringValueNode), - "CapitalizeTest@chillicream.com", - "CapitalizeTest@chillicream.com")] - [InlineData(typeof(NullValueNode), null, null)] - public void CoerceInputLiteral_GivenValueNode_MatchExpected( - Type type, - object? value, - object? expected) + [InlineData(typeof(StringValueNode), "CapitalizeTest@chillicream.com", "CapitalizeTest@chillicream.com")] + public void CoerceInputLiteral_GivenValueNode_MatchExpected(Type type, object? value, object? expected) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToMatch<EmailAddressType>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<EmailAddressType>(valueNode, expected); } [Theory] @@ -66,28 +37,26 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "invalid.email.com")] [InlineData(typeof(StringValueNode), "email@-example.com")] [InlineData(typeof(StringValueNode), "email@example..com")] - [InlineData(typeof(StringValueNode), "K@chillicream.com")] // K = Kelvin Sign (U+212A) - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + [InlineData(typeof(StringValueNode), "\u212A@chillicream.com")] // U+212A = Kelvin Sign + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<EmailAddressType>(valueNode); + ExpectCoerceInputLiteralToThrow<EmailAddressType>(valueNode); } [Theory] [InlineData("\"test@chillicream.com\"", "test@chillicream.com")] [InlineData("\"CapitalizeTest@chillicream.com\"", "CapitalizeTest@chillicream.com")] - public void CoerceInputValue_GivenValue_MatchExpected( - string jsonValue, - object? runtimeValue) + public void CoerceInputValue_GivenValue_MatchExpected(string inputValue, object? runtimeValue) { // arrange // act // assert - ExpectCoerceInputValueToMatch<EmailAddressType>(jsonValue, runtimeValue); + ExpectCoerceInputValueToMatch<EmailAddressType>(inputValue, runtimeValue); } [Theory] @@ -97,18 +66,18 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("\"invalid.email.com\"")] [InlineData("\"email@-example.com\"")] [InlineData("\"email@example..com\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string inputValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<EmailAddressType>(jsonValue); + ExpectCoerceInputValueToThrow<EmailAddressType>(inputValue); } [Theory] [InlineData("test@chillicream.com")] [InlineData("CapitalizeTest@chillicream.com")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -123,18 +92,17 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData("invalid.email.com")] [InlineData("email@-example.com")] [InlineData("email@example..com")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<EmailAddressType>(value); + ExpectCoerceOutputValueToThrow<EmailAddressType>(value); } [Theory] [InlineData(typeof(StringValueNode), "test@chillicream.com")] [InlineData(typeof(StringValueNode), "CapitalizeTest@chillicream.com")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/HexColorTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/HexColorTypeTests.cs index 4297b26a978..b9d380565af 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/HexColorTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/HexColorTypeTests.cs @@ -15,33 +15,6 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "#000", true)] - [InlineData(typeof(StringValueNode), "#FFFFFF", true)] - [InlineData(typeof(StringValueNode), "#A52A2A", true)] - [InlineData(typeof(StringValueNode), "#800080", true)] - [InlineData(typeof(StringValueNode), "#09C", true)] - [InlineData(typeof(StringValueNode), "#0099CC", true)] - [InlineData(typeof(StringValueNode), "#FFA500", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<HexColorType>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "#000", "#000")] [InlineData(typeof(StringValueNode), "#FFFFFF", "#FFFFFF")] @@ -51,7 +24,6 @@ public void IsValueCompatible_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "#0099CC", "#0099CC")] [InlineData(typeof(StringValueNode), "#FFA500", "#FFA500")] [InlineData(typeof(StringValueNode), "#CcC", "#CcC")] - [InlineData(typeof(NullValueNode), null, null)] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -62,7 +34,7 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( // act // assert - ExpectParseLiteralToMatch<HexColorType>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<HexColorType>(valueNode, expected); } [Theory] @@ -77,14 +49,14 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "#009CC")] [InlineData(typeof(StringValueNode), "#80 00 80")] [InlineData(typeof(StringValueNode), "#0000")] - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<HexColorType>(valueNode); + ExpectCoerceInputLiteralToThrow<HexColorType>(valueNode); } [Theory] @@ -115,12 +87,12 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("\"#009CC\"")] [InlineData("\"80 00 80\"")] [InlineData("\"0000\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string jsonValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<HexColorType>(jsonValue); + ExpectCoerceInputValueToThrow<HexColorType>(jsonValue); } [Theory] @@ -131,7 +103,7 @@ public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonV [InlineData("#09C")] [InlineData("#0099CC")] [InlineData("#FFA500")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -149,12 +121,12 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData("#009CC")] [InlineData("80 00 80")] [InlineData("0000")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<HexColorType>(value); + ExpectCoerceOutputValueToThrow<HexColorType>(value); } [Theory] @@ -166,7 +138,6 @@ public void CoerceOutputValue_GivenObject_ThrowSerializationException(object val [InlineData(typeof(StringValueNode), "#0099CC")] [InlineData(typeof(StringValueNode), "#FFA500")] [InlineData(typeof(StringValueNode), "#CcC")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs index 16fd900bf4d..87d5ba5d618 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs @@ -15,36 +15,6 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "hsl(٢٧٠,٦٠%,٧٠%)", false)] - [InlineData(typeof(StringValueNode), "hsl(270,60%,70%)", true)] - [InlineData(typeof(StringValueNode), "hsl(270, 60%, 70%)", true)] - [InlineData(typeof(StringValueNode), "hsl(270 60% 70%)", true)] - [InlineData(typeof(StringValueNode), "hsl(270deg, 60%, 70%)", true)] - [InlineData(typeof(StringValueNode), "hsl(270, 60%, 50%, .15)", true)] - [InlineData(typeof(StringValueNode), "hsl(270, 60%, 50%, 15%)", true)] - [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / .15)", true)] - [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / 15%)", true)] - [InlineData(typeof(StringValueNode), "hsl(270, 100%, 50%)", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<HslType>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "hsl(270,60%,70%)", "hsl(270,60%,70%)")] [InlineData(typeof(StringValueNode), "hsl(270, 60%, 70%)", "hsl(270, 60%, 70%)")] @@ -55,7 +25,6 @@ public void IsValueCompatible_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / .15)", "hsl(270 60% 50% / .15)")] [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / 15%)", "hsl(270 60% 50% / 15%)")] [InlineData(typeof(StringValueNode), "hsl(270, 100%, 50%)", "hsl(270, 100%, 50%)")] - [InlineData(typeof(NullValueNode), null, null)] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -66,7 +35,7 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( // act // assert - ExpectParseLiteralToMatch<HslType>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<HslType>(valueNode, expected); } [Theory] @@ -81,14 +50,14 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "hsl(270, FF, 50)")] [InlineData(typeof(StringValueNode), "hsl(270%, A0, 5F)")] [InlineData(typeof(StringValueNode), "hsl(٢٧٠, ٦٠%, ٧٠%)")] - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<HslType>(valueNode); + ExpectCoerceInputLiteralToThrow<HslType>(valueNode); } [Theory] @@ -115,12 +84,12 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("\"hsl(#FFFFFF)\"")] [InlineData("\"hsl(FF, A5, 00)\"")] [InlineData("\"hsl(270, FF, 50)\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string jsonValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<HslType>(jsonValue); + ExpectCoerceInputValueToThrow<HslType>(jsonValue); } [Theory] @@ -129,7 +98,7 @@ public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonV [InlineData("hsl(270 60% 70%)")] [InlineData("hsl(270deg, 60%, 70%)")] [InlineData("hsl(270, 100%, 50%)")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -145,12 +114,12 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData("hsl(#FFFFFF)")] [InlineData("hsl(FF, A5, 00)")] [InlineData("hsl(270, FF, 50)")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<HslType>(value); + ExpectCoerceOutputValueToThrow<HslType>(value); } [Theory] @@ -159,7 +128,6 @@ public void CoerceOutputValue_GivenObject_ThrowSerializationException(object val [InlineData(typeof(StringValueNode), "hsl(270 60% 70%)")] [InlineData(typeof(StringValueNode), "hsl(270deg, 60%, 70%)")] [InlineData(typeof(StringValueNode), "hsl(270, 100%, 50%)")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/HslaTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/HslaTypeTests.cs index d3c7c9df90b..0c7afc64c07 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/HslaTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/HslaTypeTests.cs @@ -15,33 +15,6 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "hsla(٢٤٠, ١٠٠%, ٥٠%, .٠٥)", false)] - [InlineData(typeof(StringValueNode), "hsla(240, 100%, 50%, .05)", true)] - [InlineData(typeof(StringValueNode), "hsla(240, 100%, 50%, .4)", true)] - [InlineData(typeof(StringValueNode), "hsla(240, 100%, 50%, .7)", true)] - [InlineData(typeof(StringValueNode), "hsla(240, 100%, 50%, 1)", true)] - [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / .05)", true)] - [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / 5%)", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<HslaType>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "hsla(240, 100%, 50%, .05)", @@ -57,7 +30,6 @@ public void IsValueCompatible_GivenValueNode_MatchExpected( "hsla(240 100% 50% / .05)", "hsla(240 100% 50% / .05)")] [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / 5%)", "hsla(240 100% 50% / 5%)")] - [InlineData(typeof(NullValueNode), null, null)] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -68,7 +40,7 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( // act // assert - ExpectParseLiteralToMatch<HslaType>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<HslaType>(valueNode, expected); } [Theory] @@ -84,14 +56,14 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "hsla(270%, A0, 5F, 1.0)")] [InlineData(typeof(StringValueNode), "hsla(240, 75, .3, 25%)")] [InlineData(typeof(StringValueNode), "hsla(٢٤٠, ١٠٠%, ٥٠%, .٠٥)")] - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<HslaType>(valueNode); + ExpectCoerceInputLiteralToThrow<HslaType>(valueNode); } [Theory] @@ -122,12 +94,12 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("\"hsla(270%, A0, 5F, 1.0)\"")] [InlineData("\"hsla(240, 75, .3, 25%)\"")] [InlineData("\"hsla(٢٤٠, ١٠٠%, ٥٠%, .٠٥)\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string jsonValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<HslaType>(jsonValue); + ExpectCoerceInputValueToThrow<HslaType>(jsonValue); } [Theory] @@ -137,7 +109,7 @@ public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonV [InlineData("hsla(240, 100%, 50%, 1)")] [InlineData("hsla(240 100% 50% / .05)")] [InlineData("hsla(240 100% 50% / 5%)")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -156,12 +128,12 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData("hsla(270%, A0, 5F, 1.0)")] [InlineData("hsla(240, 75, .3, 25%)")] [InlineData("hsla(٢٤٠, ١٠٠%, ٥٠%, .٠٥)")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<HslaType>(value); + ExpectCoerceOutputValueToThrow<HslaType>(value); } [Theory] @@ -171,7 +143,6 @@ public void CoerceOutputValue_GivenObject_ThrowSerializationException(object val [InlineData(typeof(StringValueNode), "hsla(240, 100%, 50%, 1)")] [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / .05)")] [InlineData(typeof(StringValueNode), "hsla(240 100% 50% / 5%)")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv4TypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv4TypeTests.cs index 201c82e6c9e..1cd052cf1ef 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv4TypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv4TypeTests.cs @@ -15,48 +15,6 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "1", false)] - [InlineData(typeof(StringValueNode), "1.2", false)] - [InlineData(typeof(StringValueNode), "1.2.3", false)] - [InlineData(typeof(StringValueNode), "1.2.3.4", true)] - [InlineData(typeof(StringValueNode), "255.255.255.255", true)] - [InlineData(typeof(StringValueNode), "255.256.256.256", false)] - [InlineData(typeof(StringValueNode), "300.256.256.256", false)] - [InlineData(typeof(StringValueNode), "255.300.256.256", false)] - [InlineData(typeof(StringValueNode), "255.256.300.256", false)] - [InlineData(typeof(StringValueNode), "255.256.256.300", false)] - [InlineData(typeof(StringValueNode), "127.0.0.1", true)] - [InlineData(typeof(StringValueNode), "192.168.0.1", true)] - [InlineData(typeof(StringValueNode), "000.000.000.000", true)] - [InlineData(typeof(StringValueNode), "00.00.00.00", true)] - [InlineData(typeof(StringValueNode), "0.0.0.0/32", true)] - [InlineData(typeof(StringValueNode), "000.000.000.000/32", true)] - [InlineData(typeof(StringValueNode), "255.255.255.255/0", true)] - [InlineData(typeof(StringValueNode), "255.255.255.255/33", false)] - [InlineData(typeof(StringValueNode), "127.0.0.1/0", true)] - [InlineData(typeof(StringValueNode), "192.168.2.1/0", true)] - [InlineData(typeof(StringValueNode), "0.0.0.3/2", true)] - [InlineData(typeof(StringValueNode), "0.0.0.127/7", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<IPv4Type>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "1.2.3.4", "1.2.3.4")] [InlineData(typeof(StringValueNode), "255.255.255.255", "255.255.255.255")] @@ -71,7 +29,6 @@ public void IsValueCompatible_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "192.168.2.1/0", "192.168.2.1/0")] [InlineData(typeof(StringValueNode), "0.0.0.3/2", "0.0.0.3/2")] [InlineData(typeof(StringValueNode), "0.0.0.127/7", "0.0.0.127/7")] - [InlineData(typeof(NullValueNode), null, null)] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -82,7 +39,7 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( // act // assert - ExpectParseLiteralToMatch<IPv4Type>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<IPv4Type>(valueNode, expected); } [Theory] @@ -99,14 +56,14 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "255.256.300.256")] [InlineData(typeof(StringValueNode), "255.256.256.300")] [InlineData(typeof(StringValueNode), "255.255.255.255/33")] - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<IPv4Type>(valueNode); + ExpectCoerceInputLiteralToThrow<IPv4Type>(valueNode); } [Theory] @@ -146,12 +103,12 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("\"255.256.300.256\"")] [InlineData("\"255.256.256.300\"")] [InlineData("\"255.255.255.255/33\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string jsonValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<IPv4Type>(jsonValue); + ExpectCoerceInputValueToThrow<IPv4Type>(jsonValue); } [Theory] @@ -168,7 +125,7 @@ public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonV [InlineData("192.168.2.1/0")] [InlineData("0.0.0.3/2")] [InlineData("0.0.0.127/7")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -189,12 +146,12 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData("255.256.300.256")] [InlineData("255.256.256.300")] [InlineData("255.255.255.255/33")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<IPv4Type>(value); + ExpectCoerceOutputValueToThrow<IPv4Type>(value); } [Theory] @@ -211,7 +168,6 @@ public void CoerceOutputValue_GivenObject_ThrowSerializationException(object val [InlineData(typeof(StringValueNode), "192.168.2.1/0")] [InlineData(typeof(StringValueNode), "0.0.0.3/2")] [InlineData(typeof(StringValueNode), "0.0.0.127/7")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv6TypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv6TypeTests.cs index 7f991f6d88c..a7242fea0f1 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv6TypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/IPv6TypeTests.cs @@ -15,76 +15,6 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "1", false)] - [InlineData(typeof(StringValueNode), "1.2", false)] - [InlineData(typeof(StringValueNode), "1.2.3", false)] - [InlineData(typeof(StringValueNode), "2001:db8::7/32", true)] - [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.4/13", true)] - [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.4/64", true)] - [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/0", true)] - [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/32", true)] - [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/128", true)] - [InlineData(typeof(StringValueNode), "1080:0:0:0:8:800:200C:417A/27", true)] - [InlineData(typeof(StringValueNode), "2001:db8::7", true)] - [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.4", true)] - [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", true)] - [InlineData(typeof(StringValueNode), "1080:0:0:0:8:800:200C:417A", true)] - [InlineData(typeof(StringValueNode), "::1:2:3:4:5:6:7", true)] - [InlineData(typeof(StringValueNode), "::1:2:3:4:5:6", true)] - [InlineData(typeof(StringValueNode), "1::1:2:3:4:5:6", true)] - [InlineData(typeof(StringValueNode), "::1:2:3:4:5", true)] - [InlineData(typeof(StringValueNode), "1::1:2:3:4:5", true)] - [InlineData(typeof(StringValueNode), "2:1::1:2:3:4:5", true)] - [InlineData(typeof(StringValueNode), "::1:2:3:4", true)] - [InlineData(typeof(StringValueNode), "1::1:2:3:4", true)] - [InlineData(typeof(StringValueNode), "2:1::1:2:3:4", true)] - [InlineData(typeof(StringValueNode), "3:2:1::1:2:3:4", true)] - [InlineData(typeof(StringValueNode), "::1:2:3", true)] - [InlineData(typeof(StringValueNode), "1::1:2:3", true)] - [InlineData(typeof(StringValueNode), "2:1::1:2:3", true)] - [InlineData(typeof(StringValueNode), "2:1::", true)] - [InlineData(typeof(StringValueNode), "3:2:1::1:2:3", true)] - [InlineData(typeof(StringValueNode), "4:3:2:1::1:2:3", true)] - [InlineData(typeof(StringValueNode), "::1:2", true)] - [InlineData(typeof(StringValueNode), "1::1:2", true)] - [InlineData(typeof(StringValueNode), "2:1::1:2", true)] - [InlineData(typeof(StringValueNode), "3:2:1::1:2", true)] - [InlineData(typeof(StringValueNode), "4:3:2:1::1:2", true)] - [InlineData(typeof(StringValueNode), "5:4:3:2:1::1:2", true)] - [InlineData(typeof(StringValueNode), "::1", true)] - [InlineData(typeof(StringValueNode), "1::1", true)] - [InlineData(typeof(StringValueNode), "2:1::1", true)] - [InlineData(typeof(StringValueNode), "3:2:1::1", true)] - [InlineData(typeof(StringValueNode), "4:3:2:1::1", true)] - [InlineData(typeof(StringValueNode), "5:4:3:2:1::1", true)] - [InlineData(typeof(StringValueNode), "6:5:4:3:2:1::1", true)] - [InlineData(typeof(StringValueNode), "::", true)] - [InlineData(typeof(StringValueNode), "1::", true)] - [InlineData(typeof(StringValueNode), "3:2:1::", true)] - [InlineData(typeof(StringValueNode), "4:3:2:1::", true)] - [InlineData(typeof(StringValueNode), "5:4:3:2:1::", true)] - [InlineData(typeof(StringValueNode), "6:5:4:3:2:1::", true)] - [InlineData(typeof(StringValueNode), "7:6:5:4:3:2:1::", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<IPv6Type>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "2001:db8::7/32", "2001:db8::7/32")] [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.4/13", "a:b:c:d:e::1.2.3.4/13")] @@ -145,7 +75,6 @@ public void IsValueCompatible_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "5:4:3:2:1::", "5:4:3:2:1::")] [InlineData(typeof(StringValueNode), "6:5:4:3:2:1::", "6:5:4:3:2:1::")] [InlineData(typeof(StringValueNode), "7:6:5:4:3:2:1::", "7:6:5:4:3:2:1::")] - [InlineData(typeof(NullValueNode), null, null)] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -156,7 +85,7 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( // act // assert - ExpectParseLiteralToMatch<IPv6Type>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<IPv6Type>(valueNode, expected); } [Theory] @@ -177,14 +106,14 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.22:100")] [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3..4/13")] [InlineData(typeof(StringValueNode), "FEDC:BA98:7654:3210FEDC:BA98:7654:3210")] - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<IPv6Type>(valueNode); + ExpectCoerceInputLiteralToThrow<IPv6Type>(valueNode); } [Theory] @@ -225,12 +154,12 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("\"a:b:c:d:e::1.2.3.22:100\"")] [InlineData("\"a:b:c:d:e::1.2.3..4/13\"")] [InlineData("\"FEDC:BA98:7654:3210FEDC:BA98:7654:3210\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string jsonValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<IPv6Type>(jsonValue); + ExpectCoerceInputValueToThrow<IPv6Type>(jsonValue); } [Theory] @@ -244,7 +173,7 @@ public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonV [InlineData("a:b:c:d:e::1.2.3.4")] [InlineData("::1")] [InlineData("::")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -265,12 +194,12 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData("a:b:c:d:e::1.2.3.22:100")] [InlineData("a:b:c:d:e::1.2.3..4/13")] [InlineData("FEDC:BA98:7654:3210FEDC:BA98:7654:3210")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<IPv6Type>(value); + ExpectCoerceOutputValueToThrow<IPv6Type>(value); } [Theory] @@ -283,7 +212,6 @@ public void CoerceOutputValue_GivenObject_ThrowSerializationException(object val [InlineData(typeof(StringValueNode), "a:b:c:d:e::1.2.3.4")] [InlineData(typeof(StringValueNode), "::1")] [InlineData(typeof(StringValueNode), "::")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/IsbnTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/IsbnTypeTests.cs index 8d46d78b12d..64cefcc23b5 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/IsbnTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/IsbnTypeTests.cs @@ -15,51 +15,6 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "978 787 7878", false)] - [InlineData(typeof(StringValueNode), "978-0615-856", false)] - [InlineData(typeof(StringValueNode), "978-0615856735", false)] - [InlineData(typeof(StringValueNode), "ISBN 978 787 78 78788", false)] - [InlineData(typeof(StringValueNode), "ISBN 97907653359990", false)] - [InlineData(typeof(StringValueNode), "ISBN-13: 978-0615856735", false)] - [InlineData(typeof(StringValueNode), "ISBN: 978-0615-856", false)] - [InlineData(typeof(StringValueNode), "ISBN 978-0-596-52068-7", true)] - [InlineData(typeof(StringValueNode), "ISBN-13: 978-0-596-52068-7", true)] - [InlineData(typeof(StringValueNode), "978 0 596 52068 7", true)] - [InlineData(typeof(StringValueNode), "9780596520687", true)] - [InlineData(typeof(StringValueNode), "ISBN-10 0-596-52068-9", true)] - [InlineData(typeof(StringValueNode), "0-596-52068-9", true)] - [InlineData(typeof(StringValueNode), "ISBN: 9780615856", true)] - [InlineData(typeof(StringValueNode), "1577677171", true)] - [InlineData(typeof(StringValueNode), "978 787 78 78", true)] - [InlineData(typeof(StringValueNode), "9790765335", true)] - [InlineData(typeof(StringValueNode), "979076533X", true)] - [InlineData(typeof(StringValueNode), "9780615856", true)] - [InlineData(typeof(StringValueNode), "ISBN 978-0615-856-73-5", true)] - [InlineData(typeof(StringValueNode), "ISBN-13: 978-0615-856-73-5", true)] - [InlineData(typeof(StringValueNode), "ISBN-13: 9780765335999", true)] - [InlineData(typeof(StringValueNode), "ISBN: 9780615856735", true)] - [InlineData(typeof(StringValueNode), "978-0615-856-73-5", true)] - [InlineData(typeof(StringValueNode), "9780765335999", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<IsbnType>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "ISBN 978-0-596-52068-7", "ISBN 978-0-596-52068-7")] [InlineData(typeof(StringValueNode), "ISBN-13: 978-0-596-52068-7", "ISBN-13: 978-0-596-52068-7")] @@ -79,7 +34,6 @@ public void IsValueCompatible_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "ISBN: 9780615856735", "ISBN: 9780615856735")] [InlineData(typeof(StringValueNode), "978-0615-856-73-5", "978-0615-856-73-5")] [InlineData(typeof(StringValueNode), "9780765335999", "9780765335999")] - [InlineData(typeof(NullValueNode), null, null)] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -90,7 +44,7 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( // act // assert - ExpectParseLiteralToMatch<IsbnType>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<IsbnType>(valueNode, expected); } [Theory] @@ -114,14 +68,14 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "ISBN: X9780615856735")] [InlineData(typeof(StringValueNode), "ISBN-13: 978-0615-56-73-5")] [InlineData(typeof(StringValueNode), "ISBN-13: 9780X765335999")] - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<IsbnType>(valueNode); + ExpectCoerceInputLiteralToThrow<IsbnType>(valueNode); } [Theory] @@ -173,12 +127,12 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("\"ISBN: X9780615856735\"")] [InlineData("\"ISBN-13: 978-0615-56-73-5\"")] [InlineData("\"ISBN-13: 9780X765335999\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string jsonValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<IsbnType>(jsonValue); + ExpectCoerceInputValueToThrow<IsbnType>(jsonValue); } [Theory] @@ -200,7 +154,7 @@ public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonV [InlineData("ISBN: 9780615856735")] [InlineData("978-0615-856-73-5")] [InlineData("9780765335999")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -228,12 +182,12 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData("ISBN: X9780615856735")] [InlineData("ISBN-13: 978-0615-56-73-5")] [InlineData("ISBN-13: 9780X765335999")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<IsbnType>(value); + ExpectCoerceOutputValueToThrow<IsbnType>(value); } [Theory] @@ -254,7 +208,6 @@ public void CoerceOutputValue_GivenObject_ThrowSerializationException(object val [InlineData(typeof(StringValueNode), "ISBN: 9780615856735")] [InlineData(typeof(StringValueNode), "978-0615-856-73-5")] [InlineData(typeof(StringValueNode), "9780765335999")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs index 25339c269ed..e42f024c582 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/LatitudeTypeTests.cs @@ -47,20 +47,6 @@ protected void Latitude_ExpectIsStringInstanceToMatch() Assert.True(result); } - [Fact] - protected void Latitude_ExpectValueToLiteralToMatchNull() - { - // arrange - ScalarType scalar = new LatitudeType(); - object valueSyntax = null!; - - // act - var result = scalar.ValueToLiteral(valueSyntax); - - // assert - Assert.Equal(typeof(NullValueNode), result.GetType()); - } - [Fact] protected void Latitude_ExpectValueToLiteralToThrowOnInvalidString() { @@ -80,7 +66,7 @@ protected void Latitude_ExpectValueToLiteralToMatchInt() { // arrange ScalarType scalar = new LatitudeType(); - const int valueSyntax = 89; + const double valueSyntax = 89; // act var result = scalar.ValueToLiteral(valueSyntax); @@ -94,7 +80,7 @@ protected void Latitude_ExpectValueToLiteralToThrowOnInvalidInt() { // arrange ScalarType scalar = new LatitudeType(); - const int valueSyntax = 92; + const double valueSyntax = 92; // act var result = Record.Exception(() => scalar.ValueToLiteral(valueSyntax)); @@ -173,7 +159,7 @@ protected void Latitude_ExpectParseLiteralToMatch( StringValueNode valueSyntax = new(literal); // act - object result = ToPrecision(scalar, valueSyntax, precision); + var result = ToPrecision(scalar, valueSyntax, precision); // assert Assert.Equal(runtime, result); @@ -193,20 +179,6 @@ protected void Latitude_ExpectParseLiteralToThrowSerializationException() Assert.IsType<LeafCoercionException>(result); } - [Fact] - public void Latitude_ParseLiteral_NullValueNode() - { - // arrange - var scalar = CreateType<LatitudeType>(); - var literal = NullValueNode.Default; - - // act - var value = scalar.CoerceInputLiteral(literal)!; - - // assert - Assert.Null(value); - } - [Fact] protected void Latitude_ExpectValueToLiteralToMatchType() { @@ -336,7 +308,7 @@ public void Latitude_ExpectCoerceOutputValueInt() { // arrange ScalarType scalar = new LatitudeType(); - const int runtimeValue = 89; + const double runtimeValue = 89; // act var operation = CommonTestExtensions.CreateOperation(); @@ -353,7 +325,7 @@ protected void Latitude_ExpectCoerceOutputValueIntToThrowSerializationException_ { // arrange ScalarType scalar = new LatitudeType(); - const int runtimeValue = -91; + const double runtimeValue = -91; // act var operation = CommonTestExtensions.CreateOperation(); @@ -370,7 +342,7 @@ protected void Latitude_ExpectCoerceOutputValueIntToThrowSerializationException_ { // arrange ScalarType scalar = new LatitudeType(); - const int runtimeValue = 91; + const double runtimeValue = 91; // act var operation = CommonTestExtensions.CreateOperation(); diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs index abbbb14d856..0bca759adee 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/LongitudeTypeTests.cs @@ -48,20 +48,6 @@ protected void Longitude_ExpectIsStringInstanceToMatch() Assert.True(result); } - [Fact] - protected void Longitude_ExpectValueToLiteralToMatchNull() - { - // arrange - ScalarType scalar = new LongitudeType(); - object valueSyntax = null!; - - // act - var result = scalar.ValueToLiteral(valueSyntax); - - // assert - Assert.Equal(typeof(NullValueNode), result.GetType()); - } - [Fact] protected void Longitude_ExpectValueToLiteralToThrowOnInvalidString() { @@ -81,7 +67,7 @@ protected void Longitude_ExpectValueToLiteralToMatchInt() { // arrange ScalarType scalar = new LongitudeType(); - const int valueSyntax = 179; + const double valueSyntax = 179; // act var result = scalar.ValueToLiteral(valueSyntax); @@ -95,7 +81,7 @@ protected void Longitude_ExpectValueToLiteralToThrowOnInvalidInt() { // arrange ScalarType scalar = new LongitudeType(); - const int valueSyntax = 181; + const double valueSyntax = 181; // act var result = Record.Exception(() => scalar.ValueToLiteral(valueSyntax)); @@ -194,20 +180,6 @@ protected void Longitude_ExpectParseLiteralToThrowSerializationException() Assert.IsType<LeafCoercionException>(result); } - [Fact] - public void Longitude_ParseLiteral_NullValueNode() - { - // arrange - var scalar = CreateType<LongitudeType>(); - var literal = NullValueNode.Default; - - // act - var value = scalar.CoerceInputLiteral(literal); - - // assert - Assert.Null(value); - } - [Fact] protected void Longitude_ExpectValueToLiteralToMatchType() { @@ -340,7 +312,7 @@ public void Longitude_ExpectCoerceOutputValueInt() { // arrange ScalarType scalar = new LongitudeType(); - const int runtimeValue = 179; + const double runtimeValue = 179; // act var operation = CommonTestExtensions.CreateOperation(); @@ -357,7 +329,7 @@ protected void Longitude_ExpectCoerceOutputValueIntToThrowSerializationException { // arrange ScalarType scalar = new LongitudeType(); - const int runtimeValue = -181; + const double runtimeValue = -181; // act var operation = CommonTestExtensions.CreateOperation(); @@ -374,7 +346,7 @@ protected void Longitude_ExpectCoerceOutputValueIntToThrowSerializationException { // arrange ScalarType scalar = new LongitudeType(); - const int runtimeValue = 181; + const double runtimeValue = 181; // act var operation = CommonTestExtensions.CreateOperation(); diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/MacAddressTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/MacAddressTypeTests.cs index cb7867ff600..6e8f2e7977a 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/MacAddressTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/MacAddressTypeTests.cs @@ -15,45 +15,6 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "f", false)] - [InlineData(typeof(StringValueNode), "ff", false)] - [InlineData(typeof(StringValueNode), "ff:ff:ff", false)] - [InlineData(typeof(StringValueNode), "ff:ff:ff:ff:ff", false)] - [InlineData(typeof(StringValueNode), "ff:ff:ff:ff:ff:ff", true)] - [InlineData(typeof(StringValueNode), "ff-ff-ff-ff-ff-ff", true)] - [InlineData(typeof(StringValueNode), "ff:ff:ff:ff:ff:ff:", false)] - [InlineData(typeof(StringValueNode), "gf:ff:ff:ff:ff:ff", false)] - [InlineData(typeof(StringValueNode), "fff:ff:ff:ff:ff:ff", false)] - [InlineData(typeof(StringValueNode), "11:11:11:11:11:11", true)] - [InlineData(typeof(StringValueNode), "00:00:00:00:00:00", true)] - [InlineData(typeof(StringValueNode), "a0:93:db:60:3b:72", true)] - [InlineData(typeof(StringValueNode), "9d:f7:56:d1:73:a4", true)] - [InlineData(typeof(StringValueNode), "9d-f7-56-d1-73-a4", true)] - [InlineData(typeof(StringValueNode), "fa:7e:9e:9f:13:78", true)] - [InlineData(typeof(StringValueNode), "fa-7e-9e-9f-13-78", true)] - [InlineData(typeof(StringValueNode), "fa-7e-9e-ff-fe-9f-13-78", true)] - [InlineData(typeof(StringValueNode), "fa:7e:9e:ff:fe:9f:13:78", true)] - [InlineData(typeof(StringValueNode), "fa7e.9eff.fe9f.1378", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<MacAddressType>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "fa-7e-9e-9f-13-78", "fa-7e-9e-9f-13-78")] [InlineData(typeof(StringValueNode), "fa:7e:9e:9f:13:78", "fa:7e:9e:9f:13:78")] @@ -63,7 +24,6 @@ public void IsValueCompatible_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "fa-7e-9e-ff-fe-9f-13-78", "fa-7e-9e-ff-fe-9f-13-78")] [InlineData(typeof(StringValueNode), "fa:7e:9e:ff:fe:9f:13:78", "fa:7e:9e:ff:fe:9f:13:78")] [InlineData(typeof(StringValueNode), "fa7e.9eff.fe9f.1378", "fa7e.9eff.fe9f.1378")] - [InlineData(typeof(NullValueNode), null, null)] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -74,7 +34,7 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( // act // assert - ExpectParseLiteralToMatch<MacAddressType>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<MacAddressType>(valueNode, expected); } [Theory] @@ -89,14 +49,14 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "ff:ff:ff:ff:ff")] [InlineData(typeof(StringValueNode), "ff:ff:ff:ff:ff:ff:")] [InlineData(typeof(StringValueNode), "gf:ff:ff:ff:ff:ff")] - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<MacAddressType>(valueNode); + ExpectCoerceInputLiteralToThrow<MacAddressType>(valueNode); } [Theory] @@ -129,12 +89,12 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("\"ff:ff:ff:ff:ff\"")] [InlineData("\"ff:ff:ff:ff:ff:ff:\"")] [InlineData("\"gf:ff:ff:ff:ff:ff\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string jsonValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<MacAddressType>(jsonValue); + ExpectCoerceInputValueToThrow<MacAddressType>(jsonValue); } [Theory] @@ -146,7 +106,7 @@ public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonV [InlineData("fa-7e-9e-ff-fe-9f-13-78")] [InlineData("fa:7e:9e:ff:fe:9f:13:78")] [InlineData("fa7e.9eff.fe9f.1378")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -165,12 +125,12 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData("ff:ff:ff:ff:ff")] [InlineData("ff:ff:ff:ff:ff:ff:")] [InlineData("gf:ff:ff:ff:ff:ff")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<MacAddressType>(value); + ExpectCoerceOutputValueToThrow<MacAddressType>(value); } [Theory] @@ -182,7 +142,6 @@ public void CoerceOutputValue_GivenObject_ThrowSerializationException(object val [InlineData(typeof(StringValueNode), "fa-7e-9e-ff-fe-9f-13-78")] [InlineData(typeof(StringValueNode), "fa:7e:9e:ff:fe:9f:13:78")] [InlineData(typeof(StringValueNode), "fa7e.9eff.fe9f.1378")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/PhoneNumberTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/PhoneNumberTypeTests.cs index 05b0a6190bd..082265e46ac 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/PhoneNumberTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/PhoneNumberTypeTests.cs @@ -15,32 +15,6 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(NullValueNode), null, true)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "+1٧٨٩٥٥٥١٢٣٤", false)] - [InlineData(typeof(StringValueNode), "+17895551234", true)] - [InlineData(typeof(StringValueNode), "+178955512343", true)] - [InlineData(typeof(StringValueNode), "+1789555123435", true)] - [InlineData(typeof(StringValueNode), "+178955512343598", true)] - [InlineData(typeof(StringValueNode), "+765436789012345678901234", false)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<PhoneNumberType>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "+16873271234", "+16873271234")] [InlineData(typeof(StringValueNode), @@ -49,7 +23,6 @@ public void IsValueCompatible_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "+178955512343598", "+178955512343598")] - [InlineData(typeof(NullValueNode), null, null)] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -60,7 +33,7 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( // act // assert - ExpectParseLiteralToMatch<PhoneNumberType>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<PhoneNumberType>(valueNode, expected); } [Theory] @@ -74,14 +47,14 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "(123)-456-7890")] [InlineData(typeof(StringValueNode), "123-456-7890")] [InlineData(typeof(StringValueNode), "+1٧٨٩٥٥٥١٢٣٤")] - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<PhoneNumberType>(valueNode); + ExpectCoerceInputLiteralToThrow<PhoneNumberType>(valueNode); } [Theory] @@ -105,18 +78,18 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("\"765436789012345678901234\"")] [InlineData("\"(123)-456-7890\"")] [InlineData("\"123-456-7890\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string jsonValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<PhoneNumberType>(jsonValue); + ExpectCoerceInputValueToThrow<PhoneNumberType>(jsonValue); } [Theory] [InlineData("+16873271234")] [InlineData("+76543678901234")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -132,19 +105,18 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData("765436789012345678901234")] [InlineData("(123)-456-7890")] [InlineData("123-456-7890")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<PhoneNumberType>(value); + ExpectCoerceOutputValueToThrow<PhoneNumberType>(value); } [Theory] [InlineData(typeof(StringValueNode), "+16873271234")] [InlineData(typeof(StringValueNode), "+76543678901234")] [InlineData(typeof(StringValueNode), "+178955512343598")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/RegexTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/RegexTypeTests.cs index 88ce95f806a..e91cee94636 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/RegexTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/RegexTypeTests.cs @@ -15,26 +15,8 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(NullValueNode), null, true)] - [InlineData(typeof(StringValueNode), "+178955512343598", true)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<StubType>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "+16873271234", "+16873271234")] - [InlineData(typeof(NullValueNode), null, null)] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -45,7 +27,7 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( // act // assert - ExpectParseLiteralToMatch<StubType>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<StubType>(valueNode, expected); } [Theory] @@ -55,14 +37,14 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(BooleanValueNode), true)] [InlineData(typeof(StringValueNode), "")] [InlineData(typeof(StringValueNode), "123-456-7890")] - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<StubType>(valueNode); + ExpectCoerceInputLiteralToThrow<StubType>(valueNode); } [Theory] @@ -82,17 +64,17 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("1")] [InlineData("true")] [InlineData("\"123-456-7890\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string jsonValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<StubType>(jsonValue); + ExpectCoerceInputValueToThrow<StubType>(jsonValue); } [Theory] [InlineData("+16873271234")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -105,17 +87,16 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData(1)] [InlineData(true)] [InlineData("123-456-7890")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<StubType>(value); + ExpectCoerceOutputValueToThrow<StubType>(value); } [Theory] [InlineData(typeof(StringValueNode), "+16873271234")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs index 1c85719dfa9..64e0e9677ba 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs @@ -15,38 +15,6 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "rgb(٢٥٥,٠,٠)", false)] - [InlineData(typeof(StringValueNode), "rgb(255,0,0)", true)] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)", true)] - [InlineData(typeof(StringValueNode), "rgb(300,0,0)", true)] - [InlineData(typeof(StringValueNode), "rgb(110%, 0%, 0%)", true)] - [InlineData(typeof(StringValueNode), "rgb(100%,0%,60%)", true)] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 60%)", true)] - [InlineData(typeof(StringValueNode), "rgb(255 0 153)", true)] - [InlineData(typeof(StringValueNode), "rgb(255, 0, 153, 1)", true)] - [InlineData(typeof(StringValueNode), "rgb(255, 0, 153, 100%)", true)] - [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 1)", true)] - [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 100%)", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<RgbType>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "rgb(255,0,0)", "rgb(255,0,0)")] [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)", "rgb(100%, 0%, 0%)")] @@ -59,7 +27,6 @@ public void IsValueCompatible_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "rgb(255, 0, 153, 100%)", "rgb(255, 0, 153, 100%)")] [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 1)", "rgb(255 0 153 / 1)")] [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 100%)", "rgb(255 0 153 / 100%)")] - [InlineData(typeof(NullValueNode), null, null)] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -70,7 +37,7 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( // act // assert - ExpectParseLiteralToMatch<RgbType>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<RgbType>(valueNode, expected); } [Theory] @@ -83,14 +50,14 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "rgb(255, 0, 153.6, 1)")] [InlineData(typeof(StringValueNode), "rgb(1e2, .5e1, .5e0, +.25e2%)")] [InlineData(typeof(StringValueNode), "rgb(٢٥٥,٠,٠)")] - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<RgbType>(valueNode); + ExpectCoerceInputLiteralToThrow<RgbType>(valueNode); } [Theory] @@ -116,12 +83,12 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("\"\"")] [InlineData("\"1\"")] [InlineData("\"rgb(255, 0, 153.6, 1)\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string jsonValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<RgbType>(jsonValue); + ExpectCoerceInputValueToThrow<RgbType>(jsonValue); } [Theory] @@ -130,7 +97,7 @@ public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonV [InlineData("rgb(300,0,0)")] [InlineData("rgb(255 0 153)")] [InlineData("rgb(255, 0, 153, 1)")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -145,12 +112,12 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData("")] [InlineData("1")] [InlineData("rgb(255, 0, 153.6, 1)")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<RgbType>(value); + ExpectCoerceOutputValueToThrow<RgbType>(value); } [Theory] @@ -159,7 +126,6 @@ public void CoerceOutputValue_GivenObject_ThrowSerializationException(object val [InlineData(typeof(StringValueNode), "rgb(300,0,0)")] [InlineData(typeof(StringValueNode), "rgb(255 0 153)")] [InlineData(typeof(StringValueNode), "rgb(255, 0, 153, 1)")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs index 6a3afa1d1c5..a55a3e632c4 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs @@ -15,39 +15,6 @@ public void Schema_WithScalar_IsMatch() schema.ToString().MatchSnapshot(); } - [Theory] - [InlineData(typeof(EnumValueNode), TestEnum.Foo, false)] - [InlineData(typeof(FloatValueNode), 1d, false)] - [InlineData(typeof(IntValueNode), 1, false)] - [InlineData(typeof(BooleanValueNode), true, false)] - [InlineData(typeof(StringValueNode), "", false)] - [InlineData(typeof(StringValueNode), "rgba(٥١, ١٧٠, ٥١, .١)", false)] - [InlineData(typeof(StringValueNode), "rgb(255,0,0)", true)] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)", true)] - [InlineData(typeof(StringValueNode), "rgb(300,0,0)", true)] - [InlineData(typeof(StringValueNode), "rgb(110%, 0%, 0%)", true)] - [InlineData(typeof(StringValueNode), "rgb(100%,0%,60%)", true)] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 60%)", true)] - [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .1)", true)] - [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .4)", true)] - [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .7)", true)] - [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, 1) ", true)] - [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 0.4) ", true)] - [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 40%)", true)] - [InlineData(typeof(NullValueNode), null, true)] - public void IsValueCompatible_GivenValueNode_MatchExpected( - Type type, - object? value, - bool expected) - { - // arrange - var valueNode = CreateValueNode(type, value); - - // act - // assert - ExpectIsInstanceOfTypeToMatch<RgbaType>(valueNode, expected); - } - [Theory] [InlineData(typeof(StringValueNode), "rgb(255,0,0)", "rgb(255,0,0)")] [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)", "rgb(100%, 0%, 0%)")] @@ -61,7 +28,6 @@ public void IsValueCompatible_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, 1)", "rgba(51, 170, 51, 1)")] [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 0.4)", "rgba(51 170 51 / 0.4)")] [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 40%)", "rgba(51 170 51 / 40%)")] - [InlineData(typeof(NullValueNode), null, null)] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -72,7 +38,7 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( // act // assert - ExpectParseLiteralToMatch<RgbaType>(valueNode, expected); + ExpectCoerceInputLiteralToMatch<RgbaType>(valueNode, expected); } [Theory] @@ -86,14 +52,14 @@ public void CoerceInputLiteral_GivenValueNode_MatchExpected( [InlineData(typeof(StringValueNode), "rgba(255, 0, 153.6, 1)")] [InlineData(typeof(StringValueNode), "rgba(1e2, .5e1, .5e0, +.25e2%)")] [InlineData(typeof(StringValueNode), "rgba(٥١, ١٧٠, ٥١, .١)")] - public void CoerceInputLiteral_GivenValueNode_ThrowSerializationException(Type type, object value) + public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) { // arrange var valueNode = CreateValueNode(type, value); // act // assert - ExpectParseLiteralToThrowSerializationException<RgbaType>(valueNode); + ExpectCoerceInputLiteralToThrow<RgbaType>(valueNode); } [Theory] @@ -128,12 +94,12 @@ public void CoerceInputValue_GivenValue_MatchExpected( [InlineData("\"rgba(255, 0, 153.6, 1)\"")] [InlineData("\"rgba(1e2, .5e1, .5e0, +.25e2%)\"")] [InlineData("\"rgba(٥١, ١٧٠, ٥١, .١)\"")] - public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonValue) + public void CoerceInputValue_GivenValue_Throw(string jsonValue) { // arrange // act // assert - ExpectCoerceInputValueToThrowSerializationException<RgbaType>(jsonValue); + ExpectCoerceInputValueToThrow<RgbaType>(jsonValue); } [Theory] @@ -149,7 +115,7 @@ public void CoerceInputValue_GivenValue_ThrowSerializationException(string jsonV [InlineData("rgba(51, 170, 51, 1)")] [InlineData("rgba(51 170 51 / 0.4)")] [InlineData("rgba(51 170 51 / 40%)")] - public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue) + public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange // act @@ -167,12 +133,12 @@ public void CoerceOutputValue_GivenObject_MatchExpectedType(object? runtimeValue [InlineData("rgba(255, 0, 153.6, 1)")] [InlineData("rgba(1e2, .5e1, .5e0, +.25e2%)")] [InlineData("rgba(٥١, ١٧٠, ٥١, .١)")] - public void CoerceOutputValue_GivenObject_ThrowSerializationException(object value) + public void CoerceOutputValue_GivenObject_Throw(object value) { // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<RgbaType>(value); + ExpectCoerceOutputValueToThrow<RgbaType>(value); } [Theory] @@ -188,7 +154,6 @@ public void CoerceOutputValue_GivenObject_ThrowSerializationException(object val [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, 1)")] [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 0.4)")] [InlineData(typeof(StringValueNode), "rgba(51 170 51 / 40%)")] - [InlineData(typeof(NullValueNode), null)] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs index c2a8e3a800b..2fad07f2aa9 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/ScalarTypeTestBase.cs @@ -1,3 +1,5 @@ +using System.Security.Cryptography; +using System.Text; using System.Text.Json; using HotChocolate.Execution; using HotChocolate.Features; @@ -57,53 +59,33 @@ protected IValueNode CreateValueNode(Type type, object? value) } } - protected void ExpectIsInstanceOfTypeToMatch<TType>( - IValueNode valueSyntax, - bool expectedResult) + protected void ExpectCoerceInputLiteralToMatch<TType>(IValueNode valueLiteral, object? expectedResult) where TType : ScalarType { // arrange var scalar = CreateType<TType>(); // act - var result = scalar.IsValueCompatible(valueSyntax); + var result = scalar.CoerceInputLiteral(valueLiteral); // assert Assert.Equal(expectedResult, result); } - protected void ExpectParseLiteralToMatch<TType>( - IValueNode valueSyntax, - object? expectedResult) + protected void ExpectCoerceInputLiteralToThrow<TType>(IValueNode valueLiteral) where TType : ScalarType { // arrange var scalar = CreateType<TType>(); // act - var result = scalar.CoerceInputLiteral(valueSyntax); - - // assert - Assert.Equal(expectedResult, result); - } - - protected void ExpectParseLiteralToThrowSerializationException<TType>( - IValueNode valueSyntax) - where TType : ScalarType - { - // arrange - var scalar = CreateType<TType>(); - - // act - var result = Record.Exception(() => scalar.CoerceInputLiteral(valueSyntax)); + var result = Record.Exception(() => scalar.CoerceInputLiteral(valueLiteral)); // assert Assert.IsType<LeafCoercionException>(result); } - protected void ExpectValueToLiteralToMatchType<TType>( - object? runtimeValue, - Type type) + protected void ExpectValueToLiteralToMatchType<TType>(object? runtimeValue, Type type) where TType : ScalarType { // arrange @@ -129,8 +111,7 @@ protected void ExpectValueToLiteralToThrowSerializationException<TType>(object? Assert.IsType<LeafCoercionException>(result); } - protected void ExpectCoerceOutputValueToMatch<TType>( - object? runtimeValue) + protected void ExpectCoerceOutputValueToMatch<TType>(object runtimeValue, object? label = null) where TType : ScalarType { // arrange @@ -140,10 +121,12 @@ protected void ExpectCoerceOutputValueToMatch<TType>( var operation = CommonTestExtensions.CreateOperation(); var resultDocument = new ResultDocument(operation, 0); var resultElement = resultDocument.Data.GetProperty("first"); - scalar.CoerceOutputValue(runtimeValue!, resultElement); + scalar.CoerceOutputValue(runtimeValue, resultElement); // assert - resultElement.MatchSnapshot(); + var labelBuffer = Encoding.UTF8.GetBytes((label ?? runtimeValue).ToString()!); + var hash = Convert.ToHexString(MD5.HashData(labelBuffer)).ToLowerInvariant(); + resultElement.MatchSnapshot(postFix: hash); } protected void ExpectCoerceInputValueToMatch<TType>( @@ -165,7 +148,7 @@ protected void ExpectCoerceInputValueToMatch<TType>( Assert.Equal(result, runtimeValue); } - protected void ExpectCoerceOutputValueToThrowSerializationException<TType>(object runtimeValue) + protected void ExpectCoerceOutputValueToThrow<TType>(object runtimeValue) where TType : ScalarType { // arrange @@ -181,7 +164,7 @@ protected void ExpectCoerceOutputValueToThrowSerializationException<TType>(objec Assert.IsType<LeafCoercionException>(result); } - protected void ExpectCoerceInputValueToThrowSerializationException<TType>(string jsonValue) + protected void ExpectCoerceInputValueToThrow<TType>(string jsonValue) where TType : ScalarType { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs index a47004b8400..8a5826b7c51 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs @@ -192,6 +192,6 @@ protected void UtcOffset_ExpectCoerceOutputValueToThrowSerializationException() // arrange // act // assert - ExpectCoerceOutputValueToThrowSerializationException<UtcOffsetType>("foo"); + ExpectCoerceOutputValueToThrow<UtcOffsetType>("foo"); } } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_964088212926846371f67b9dbbae71fa.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_964088212926846371f67b9dbbae71fa.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d719552af12494261e81f23cd0397836.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d719552af12494261e81f23cd0397836.snap new file mode 100644 index 00000000000..3c93a94c3a6 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d719552af12494261e81f23cd0397836.snap @@ -0,0 +1 @@ +"test@chillicream.com" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.Schema_WithScalar_IsMatch.snap index 957aac8fe71..b8311bb1bdc 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/EmailAddressTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0b458790848e6b0815c4a68564809093.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0b458790848e6b0815c4a68564809093.snap new file mode 100644 index 00000000000..bb5066c9eba --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0b458790848e6b0815c4a68564809093.snap @@ -0,0 +1 @@ +"#800080" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_12441ef563fb1790d6bc03101ec8a21c.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_12441ef563fb1790d6bc03101ec8a21c.snap new file mode 100644 index 00000000000..3643428b236 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_12441ef563fb1790d6bc03101ec8a21c.snap @@ -0,0 +1 @@ +"#09C" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_262da8014d7d6e3c30cd4b6a9bb7a338.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_262da8014d7d6e3c30cd4b6a9bb7a338.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_38c099ce24bf9fe6999fdababaee3f42.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_38c099ce24bf9fe6999fdababaee3f42.snap new file mode 100644 index 00000000000..214a4faed44 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_38c099ce24bf9fe6999fdababaee3f42.snap @@ -0,0 +1 @@ +"#A52A2A" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_76a24952b1d6a4cd27c305c8f21b3f99.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_76a24952b1d6a4cd27c305c8f21b3f99.snap new file mode 100644 index 00000000000..484afd631b3 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_76a24952b1d6a4cd27c305c8f21b3f99.snap @@ -0,0 +1 @@ +"#000" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e3121067d571a23b9672b2c2e3b55b07.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e3121067d571a23b9672b2c2e3b55b07.snap new file mode 100644 index 00000000000..f6fdc740084 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e3121067d571a23b9672b2c2e3b55b07.snap @@ -0,0 +1 @@ +"#FFA500" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f872c166827395ccf8d5518f7d3513bc.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f872c166827395ccf8d5518f7d3513bc.snap new file mode 100644 index 00000000000..dfd6274f7c2 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f872c166827395ccf8d5518f7d3513bc.snap @@ -0,0 +1 @@ +"#0099CC" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.Schema_WithScalar_IsMatch.snap index 6aff6007eb6..2e4fc947461 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HexColorTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1b3c56971e4f9450a96c03c3b3bae08a.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1b3c56971e4f9450a96c03c3b3bae08a.snap new file mode 100644 index 00000000000..8b4b758c49a --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1b3c56971e4f9450a96c03c3b3bae08a.snap @@ -0,0 +1 @@ +"hsl(270, 100%, 50%)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_352105b8b66543a9fd2c9b7d4f5c7fca.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_352105b8b66543a9fd2c9b7d4f5c7fca.snap new file mode 100644 index 00000000000..d4dd447cb1d --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_352105b8b66543a9fd2c9b7d4f5c7fca.snap @@ -0,0 +1 @@ +"hsl(270 60% 70%)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_97631aad881420d7b8a1f5b8b6a6fef5.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_97631aad881420d7b8a1f5b8b6a6fef5.snap new file mode 100644 index 00000000000..f048dc98de1 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_97631aad881420d7b8a1f5b8b6a6fef5.snap @@ -0,0 +1 @@ +"hsl(270deg, 60%, 70%)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9feaab4c2dd205e63359cc22865ff1ac.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9feaab4c2dd205e63359cc22865ff1ac.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fd0f55c5c7826c904fcd63395ec83629.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fd0f55c5c7826c904fcd63395ec83629.snap new file mode 100644 index 00000000000..4878e412330 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fd0f55c5c7826c904fcd63395ec83629.snap @@ -0,0 +1 @@ +"hsl(270,60%,70%)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.Schema_WithScalar_IsMatch.snap index 0d0af53804c..5cdde7651ae 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1dbe557deffc4c8ecbec94cd56b5b089.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1dbe557deffc4c8ecbec94cd56b5b089.snap new file mode 100644 index 00000000000..4874f84b63a --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1dbe557deffc4c8ecbec94cd56b5b089.snap @@ -0,0 +1 @@ +"hsla(240 100% 50% / .05)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7ea6a33b6750fae695313f9e82b770ad.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7ea6a33b6750fae695313f9e82b770ad.snap new file mode 100644 index 00000000000..a575ed55e57 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7ea6a33b6750fae695313f9e82b770ad.snap @@ -0,0 +1 @@ +"hsla(240, 100%, 50%, .05)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_8ef966d431bd361b811460577539eba6.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_8ef966d431bd361b811460577539eba6.snap new file mode 100644 index 00000000000..3fd83180635 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_8ef966d431bd361b811460577539eba6.snap @@ -0,0 +1 @@ +"hsla(240 100% 50% / 5%)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9018ed6231a7cdad357f9a977a6cd825.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9018ed6231a7cdad357f9a977a6cd825.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a1936072f8265ffe96846b97d58af2f2.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a1936072f8265ffe96846b97d58af2f2.snap new file mode 100644 index 00000000000..77f8757bd2f --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a1936072f8265ffe96846b97d58af2f2.snap @@ -0,0 +1 @@ +"hsla(240, 100%, 50%, .7)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e6b79f45b8230e257d060e089062bdf3.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e6b79f45b8230e257d060e089062bdf3.snap new file mode 100644 index 00000000000..43a5509c8e9 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e6b79f45b8230e257d060e089062bdf3.snap @@ -0,0 +1 @@ +"hsla(240, 100%, 50%, 1)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.Schema_WithScalar_IsMatch.snap index 717ad822d37..6683c371f89 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/HslaTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_18f89358047376fe91a2ee17b186ec95.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_18f89358047376fe91a2ee17b186ec95.snap new file mode 100644 index 00000000000..f3549b1fb1a --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_18f89358047376fe91a2ee17b186ec95.snap @@ -0,0 +1 @@ +"127.0.0.1/0" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_350e45e99b5b317b78c688f0efb511d9.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_350e45e99b5b317b78c688f0efb511d9.snap new file mode 100644 index 00000000000..efd4ff72ee9 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_350e45e99b5b317b78c688f0efb511d9.snap @@ -0,0 +1 @@ +"255.255.255.255/0" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6465ec74397c9126916786bbcd6d7601.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6465ec74397c9126916786bbcd6d7601.snap new file mode 100644 index 00000000000..ac45c126850 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6465ec74397c9126916786bbcd6d7601.snap @@ -0,0 +1 @@ +"1.2.3.4" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_67201f40ae13df9e156c4e44c945ca7d.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_67201f40ae13df9e156c4e44c945ca7d.snap new file mode 100644 index 00000000000..916681c25b3 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_67201f40ae13df9e156c4e44c945ca7d.snap @@ -0,0 +1 @@ +"0.0.0.0/32" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_69b9bcaf71e9e578a23d1ce7f52a2c1d.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_69b9bcaf71e9e578a23d1ce7f52a2c1d.snap new file mode 100644 index 00000000000..1a346aed64e --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_69b9bcaf71e9e578a23d1ce7f52a2c1d.snap @@ -0,0 +1 @@ +"00.00.00.00" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6d02dcf58a2cbba006375dd764aab35c.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6d02dcf58a2cbba006375dd764aab35c.snap new file mode 100644 index 00000000000..c241aac07f7 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6d02dcf58a2cbba006375dd764aab35c.snap @@ -0,0 +1 @@ +"000.000.000.000/32" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7566b5607904270e641cad65080bafd0.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7566b5607904270e641cad65080bafd0.snap new file mode 100644 index 00000000000..65fecc7501d --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7566b5607904270e641cad65080bafd0.snap @@ -0,0 +1 @@ +"0.0.0.3/2" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_79320e642d9d2d5d533185e4e1102726.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_79320e642d9d2d5d533185e4e1102726.snap new file mode 100644 index 00000000000..7431b5b53b6 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_79320e642d9d2d5d533185e4e1102726.snap @@ -0,0 +1 @@ +"192.168.2.1/0" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_b241e9c700dd5bd5784b2f421f9fcbe1.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_b241e9c700dd5bd5784b2f421f9fcbe1.snap new file mode 100644 index 00000000000..23afcfa9484 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_b241e9c700dd5bd5784b2f421f9fcbe1.snap @@ -0,0 +1 @@ +"000.000.000.000" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_be319164137345def2314a9663166227.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_be319164137345def2314a9663166227.snap new file mode 100644 index 00000000000..d70b724de8b --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_be319164137345def2314a9663166227.snap @@ -0,0 +1 @@ +"0.0.0.127/7" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_eea88cd0d9a7ba26282fc786713bbbb6.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_eea88cd0d9a7ba26282fc786713bbbb6.snap new file mode 100644 index 00000000000..9350e950db6 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_eea88cd0d9a7ba26282fc786713bbbb6.snap @@ -0,0 +1 @@ +"255.255.255.255" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f0fdb4c3f58e3e3f8e77162d893d3055.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f0fdb4c3f58e3e3f8e77162d893d3055.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f528764d624db129b32c21fbca0cb8d6.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f528764d624db129b32c21fbca0cb8d6.snap new file mode 100644 index 00000000000..4e962ca55b8 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f528764d624db129b32c21fbca0cb8d6.snap @@ -0,0 +1 @@ +"127.0.0.1" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.Schema_WithScalar_IsMatch.snap index bc248a3b69e..495ed69281a 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv4TypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_07a3ab28d6921a0b904c48feae8f421e.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_07a3ab28d6921a0b904c48feae8f421e.snap new file mode 100644 index 00000000000..10ca8a22131 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_07a3ab28d6921a0b904c48feae8f421e.snap @@ -0,0 +1 @@ +"FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/32" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_2ef5eaf9cc284ae073940c0584d40950.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_2ef5eaf9cc284ae073940c0584d40950.snap new file mode 100644 index 00000000000..4d94d2c604d --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_2ef5eaf9cc284ae073940c0584d40950.snap @@ -0,0 +1 @@ +"1080:0:0:0:8:800:200C:417A/27" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_350319c791ed8ec9318f2b85b17238ec.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_350319c791ed8ec9318f2b85b17238ec.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_4501c091b0366d76ea3218b6cfdd8097.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_4501c091b0366d76ea3218b6cfdd8097.snap new file mode 100644 index 00000000000..61d996b9e9d --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_4501c091b0366d76ea3218b6cfdd8097.snap @@ -0,0 +1 @@ +"::" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_837ec5754f503cfaaee0929fd48974e7.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_837ec5754f503cfaaee0929fd48974e7.snap new file mode 100644 index 00000000000..0a605f76b81 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_837ec5754f503cfaaee0929fd48974e7.snap @@ -0,0 +1 @@ +"::1" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9f01961b6f4e0afa0cd080cff75fcb12.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9f01961b6f4e0afa0cd080cff75fcb12.snap new file mode 100644 index 00000000000..bf560314146 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9f01961b6f4e0afa0cd080cff75fcb12.snap @@ -0,0 +1 @@ +"a:b:c:d:e::1.2.3.4" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a6089b200e480fff15bd3e996d5e35d3.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a6089b200e480fff15bd3e996d5e35d3.snap new file mode 100644 index 00000000000..187aef39594 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a6089b200e480fff15bd3e996d5e35d3.snap @@ -0,0 +1 @@ +"a:b:c:d:e::1.2.3.4/13" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_b319496796efbc3758aaeaffaad50c38.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_b319496796efbc3758aaeaffaad50c38.snap new file mode 100644 index 00000000000..dbb9c593fdd --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_b319496796efbc3758aaeaffaad50c38.snap @@ -0,0 +1 @@ +"2001:db8::7/32" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_bf58cb1caee07c11cd7ff627fba6ea6f.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_bf58cb1caee07c11cd7ff627fba6ea6f.snap new file mode 100644 index 00000000000..ddcea5be02c --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_bf58cb1caee07c11cd7ff627fba6ea6f.snap @@ -0,0 +1 @@ +"a:b:c:d:e::1.2.3.4/64" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_efee79a016771a12edc93c6c5f9f6aa2.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_efee79a016771a12edc93c6c5f9f6aa2.snap new file mode 100644 index 00000000000..e640b4de38d --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_efee79a016771a12edc93c6c5f9f6aa2.snap @@ -0,0 +1 @@ +"FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/0" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.Schema_WithScalar_IsMatch.snap index 4b3d97f8eae..2f12d53750d 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IPv6TypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0a65bdd4164698b4a11f03e4e2dbe2be.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0a65bdd4164698b4a11f03e4e2dbe2be.snap new file mode 100644 index 00000000000..83017dbf7b0 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0a65bdd4164698b4a11f03e4e2dbe2be.snap @@ -0,0 +1 @@ +"ISBN-13: 978-0-596-52068-7" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_288a1acace8b8459633e9ef7a6ab60af.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_288a1acace8b8459633e9ef7a6ab60af.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_33232b136a4843fc8f53211b63ca5897.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_33232b136a4843fc8f53211b63ca5897.snap new file mode 100644 index 00000000000..01450cfedf5 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_33232b136a4843fc8f53211b63ca5897.snap @@ -0,0 +1 @@ +"9780615856" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3dc4f838b65cab9fbcc1dfb7cbf0173e.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3dc4f838b65cab9fbcc1dfb7cbf0173e.snap new file mode 100644 index 00000000000..4a1aaad8153 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3dc4f838b65cab9fbcc1dfb7cbf0173e.snap @@ -0,0 +1 @@ +"979076533X" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6bafcaa6fa05d648504e9db22c4183fc.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6bafcaa6fa05d648504e9db22c4183fc.snap new file mode 100644 index 00000000000..c6ed89af14b --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6bafcaa6fa05d648504e9db22c4183fc.snap @@ -0,0 +1 @@ +"978 787 78 78" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7b506cffbaee6c21722a21503c8425be.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7b506cffbaee6c21722a21503c8425be.snap new file mode 100644 index 00000000000..3a7f8441338 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7b506cffbaee6c21722a21503c8425be.snap @@ -0,0 +1 @@ +"9790765335" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7dc0b8c13ba0b6dcfa91a686ffde61a1.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7dc0b8c13ba0b6dcfa91a686ffde61a1.snap new file mode 100644 index 00000000000..1abef1fa2a9 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_7dc0b8c13ba0b6dcfa91a686ffde61a1.snap @@ -0,0 +1 @@ +"9780765335999" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9aa2d1cfba8c054cd3d5ec019d72da14.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9aa2d1cfba8c054cd3d5ec019d72da14.snap new file mode 100644 index 00000000000..87b07e18cd4 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_9aa2d1cfba8c054cd3d5ec019d72da14.snap @@ -0,0 +1 @@ +"ISBN 978-0-596-52068-7" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a34dbfec19f516077bc47e4aa5fb6bc4.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a34dbfec19f516077bc47e4aa5fb6bc4.snap new file mode 100644 index 00000000000..920353ef3c9 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a34dbfec19f516077bc47e4aa5fb6bc4.snap @@ -0,0 +1 @@ +"ISBN: 9780615856735" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a5dcae58b1ff3d253e0744745525de56.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a5dcae58b1ff3d253e0744745525de56.snap new file mode 100644 index 00000000000..2263bc394fe --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_a5dcae58b1ff3d253e0744745525de56.snap @@ -0,0 +1 @@ +"ISBN-13: 978-0615-856-73-5" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c526c0aaf1072e0f7cc87525e91755a0.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c526c0aaf1072e0f7cc87525e91755a0.snap new file mode 100644 index 00000000000..6152f164022 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c526c0aaf1072e0f7cc87525e91755a0.snap @@ -0,0 +1 @@ +"ISBN-10 0-596-52068-9" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c54bb8726c5cbae3737dfbb34af4c971.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c54bb8726c5cbae3737dfbb34af4c971.snap new file mode 100644 index 00000000000..e4d601b7d73 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c54bb8726c5cbae3737dfbb34af4c971.snap @@ -0,0 +1 @@ +"1577677171" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c9d6e9d7c3f69a47a221444b7c619fca.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c9d6e9d7c3f69a47a221444b7c619fca.snap new file mode 100644 index 00000000000..5ad3efbe4ae --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c9d6e9d7c3f69a47a221444b7c619fca.snap @@ -0,0 +1 @@ +"ISBN: 9780615856" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e99ab48105c2b955e39e9ca3c93b7d30.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e99ab48105c2b955e39e9ca3c93b7d30.snap new file mode 100644 index 00000000000..b60e937d881 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e99ab48105c2b955e39e9ca3c93b7d30.snap @@ -0,0 +1 @@ +"978 0 596 52068 7" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_eb1b8cf6cb6e15d373c4176d9e4cc0e5.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_eb1b8cf6cb6e15d373c4176d9e4cc0e5.snap new file mode 100644 index 00000000000..30dbec78d90 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_eb1b8cf6cb6e15d373c4176d9e4cc0e5.snap @@ -0,0 +1 @@ +"978-0615-856-73-5" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f78a6cabc3abb006a50d2c6731e91072.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f78a6cabc3abb006a50d2c6731e91072.snap new file mode 100644 index 00000000000..9e3e972307c --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f78a6cabc3abb006a50d2c6731e91072.snap @@ -0,0 +1 @@ +"9780596520687" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f91dfc86645ea521b24007fee689e0db.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f91dfc86645ea521b24007fee689e0db.snap new file mode 100644 index 00000000000..7914d3a33ec --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_f91dfc86645ea521b24007fee689e0db.snap @@ -0,0 +1 @@ +"0-596-52068-9" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fce449c78ccb4fba8d6767da10eba91d.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fce449c78ccb4fba8d6767da10eba91d.snap new file mode 100644 index 00000000000..d820649527c --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fce449c78ccb4fba8d6767da10eba91d.snap @@ -0,0 +1 @@ +"ISBN 978-0615-856-73-5" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.Schema_WithScalar_IsMatch.snap index 10cf4a4db0e..b83335a583c 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/IsbnTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_ExpectCoerceOutputValueInt.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_ExpectCoerceOutputValueInt.snap new file mode 100644 index 00000000000..acd116d99e8 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_ExpectCoerceOutputValueInt.snap @@ -0,0 +1 @@ +"89° 0' 0\" N" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_Integration.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_Integration.snap index 549e1d31eeb..99d6ff444f4 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_Integration.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Latitude_Integration.snap @@ -1,4 +1,4 @@ -{ +{ "data": { "test": "0° 0' 0\" N" } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Schema_WithScalar_IsMatch.snap index ca032ac2a29..25dd747d0fd 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LatitudeTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LocalCurrencyTypeTests.Integration_DefaultLocalCurrency.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LocalCurrencyTypeTests.Integration_DefaultLocalCurrency.snap deleted file mode 100644 index b5dd926be92..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LocalCurrencyTypeTests.Integration_DefaultLocalCurrency.snap +++ /dev/null @@ -1,5 +0,0 @@ -{ - "data": { - "test": "$0.00" - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LocalCurrencyTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LocalCurrencyTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index 6222638ab07..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LocalCurrencyTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: LocalCurrency -} - -"The LocalCurrency scalar type is a currency string." -scalar LocalCurrency diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Longitude_ExpectCoerceOutputValueInt.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Longitude_ExpectCoerceOutputValueInt.snap new file mode 100644 index 00000000000..1854f9e4891 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Longitude_ExpectCoerceOutputValueInt.snap @@ -0,0 +1 @@ +"179° 0' 0\" E" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Schema_WithScalar_IsMatch.snap index 4522d5d2cb1..14fe3a92ace 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/LongitudeTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0279295d6802d16aaa0e5f5e3da6c565.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0279295d6802d16aaa0e5f5e3da6c565.snap new file mode 100644 index 00000000000..648ed8410b9 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0279295d6802d16aaa0e5f5e3da6c565.snap @@ -0,0 +1 @@ +"fa:7e:9e:9f:13:78" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_08111488cc185b178d7e1a740251f959.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_08111488cc185b178d7e1a740251f959.snap new file mode 100644 index 00000000000..5e9ff2a3c49 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_08111488cc185b178d7e1a740251f959.snap @@ -0,0 +1 @@ +"9d-f7-56-d1-73-a4" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1ced0115e4e1771742e1a0bd270834f1.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1ced0115e4e1771742e1a0bd270834f1.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3ca01893ccdadcb14b9ceef238a739ae.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3ca01893ccdadcb14b9ceef238a739ae.snap new file mode 100644 index 00000000000..e1af312fd9f --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3ca01893ccdadcb14b9ceef238a739ae.snap @@ -0,0 +1 @@ +"fa-7e-9e-ff-fe-9f-13-78" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_43c01c6033471128fd3dc0f6e96c2e2b.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_43c01c6033471128fd3dc0f6e96c2e2b.snap new file mode 100644 index 00000000000..2c7f3e88ab1 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_43c01c6033471128fd3dc0f6e96c2e2b.snap @@ -0,0 +1 @@ +"ff-ff-ff-ff-ff-ff" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_528c8e6cd4a3c6598999a0e9df15ad32.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_528c8e6cd4a3c6598999a0e9df15ad32.snap new file mode 100644 index 00000000000..9db56943d08 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_528c8e6cd4a3c6598999a0e9df15ad32.snap @@ -0,0 +1 @@ +"00:00:00:00:00:00" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_bc6492229264a2605ee4d4d80f84ff12.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_bc6492229264a2605ee4d4d80f84ff12.snap new file mode 100644 index 00000000000..12282ac6c50 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_bc6492229264a2605ee4d4d80f84ff12.snap @@ -0,0 +1 @@ +"fa-7e-9e-9f-13-78" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c7e5a044b1077232ac3d126eb5351af7.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c7e5a044b1077232ac3d126eb5351af7.snap new file mode 100644 index 00000000000..fe1fea371c6 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_c7e5a044b1077232ac3d126eb5351af7.snap @@ -0,0 +1 @@ +"fa7e.9eff.fe9f.1378" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.Schema_WithScalar_IsMatch.snap index 6399ff72b9b..935ceb9e3a4 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/MacAddressTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NegativeFloatTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NegativeFloatTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index ba3c93dc126..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NegativeFloatTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: NegativeFloat -} - -"The NegativeFloat scalar type represents a double‐precision fractional value less than 0." -scalar NegativeFloat diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NegativeIntTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NegativeIntTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index 7bc76e52ac4..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NegativeIntTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: NegativeInt -} - -"The NegativeInt scalar type represents a signed 32-bit numeric non-fractional with a maximum of -1." -scalar NegativeInt diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonEmptyStringTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonEmptyStringTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index ff3306ef2fe..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonEmptyStringTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: NonEmptyString -} - -"The NonEmptyString scalar type represents non empty textual data, represented as UTF‐8 character sequences with at least one character" -scalar NonEmptyString diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonNegativeFloatTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonNegativeFloatTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index 429469d9b27..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonNegativeFloatTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: NonNegativeFloat -} - -"The NonNegativeFloat scalar type represents a double‐precision fractional value greater than or equal to 0." -scalar NonNegativeFloat diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonNegativeIntTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonNegativeIntTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index 1d1cb548c56..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonNegativeIntTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: NonNegativeInt -} - -"The NonNegativeInt scalar type represents a unsigned 32-bit numeric non-fractional value equal to or greater than 0." -scalar NonNegativeInt diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonPositiveFloatTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonPositiveFloatTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index 1fd0a585e8f..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonPositiveFloatTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: NonPositiveFloat -} - -"The NonPositiveFloat scalar type represents a double‐precision fractional value less than or equal to 0." -scalar NonPositiveFloat diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonPositiveIntTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonPositiveIntTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index 7dcdbe665ec..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/NonPositiveIntTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: NonPositiveInt -} - -"The NonPositiveInt scalar type represents a signed 32-bit numeric non-fractional value less than or equal to 0." -scalar NonPositiveInt diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_b13b36be789b4c7c6c9d0c8eb0213f23.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_b13b36be789b4c7c6c9d0c8eb0213f23.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fbffc6216c80443070d2e229102a73b1.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fbffc6216c80443070d2e229102a73b1.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.Schema_WithScalar_IsMatch.snap index 04ecce615a1..ec407734be2 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PhoneNumberTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PortTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PortTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index 544b3095103..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PortTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: Port -} - -"The Port scalar type represents a field whose value is a valid TCP port within the range of 0 to 65535: https:\/\/en.wikipedia.org\/wiki\/Transmission_Control_Protocol#TCP_ports." -scalar Port diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PositiveIntTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PositiveIntTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index 05d303c0abe..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PositiveIntTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: PositiveInt -} - -"The PositiveInt scalar type represents a signed 32-bit numeric non-fractional value of at least the value 1." -scalar PositiveInt diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PostalCodeTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PostalCodeTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index b479eb34797..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/PostalCodeTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: PostalCode -} - -"The PostalCode scalar type represents a valid postal code." -scalar PostalCode diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fbffc6216c80443070d2e229102a73b1.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fbffc6216c80443070d2e229102a73b1.snap new file mode 100644 index 00000000000..f143ca7e44a --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_fbffc6216c80443070d2e229102a73b1.snap @@ -0,0 +1 @@ +"+16873271234" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.Schema_WithScalar_IsMatch.snap index b79d4c7130a..ad4215d6710 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RegexTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1d71336c166b6a3eb6e6c0af8227c6e0.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1d71336c166b6a3eb6e6c0af8227c6e0.snap new file mode 100644 index 00000000000..af5fa55431d --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_1d71336c166b6a3eb6e6c0af8227c6e0.snap @@ -0,0 +1 @@ +"rgb(255,0,0)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_300b52e983e6fdac48c63dd558b4ee56.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_300b52e983e6fdac48c63dd558b4ee56.snap new file mode 100644 index 00000000000..d5d00556d3c --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_300b52e983e6fdac48c63dd558b4ee56.snap @@ -0,0 +1 @@ +"rgb(300,0,0)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d50b6582425a945a55b1b4b9c738894a.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d50b6582425a945a55b1b4b9c738894a.snap new file mode 100644 index 00000000000..d992891429d --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d50b6582425a945a55b1b4b9c738894a.snap @@ -0,0 +1 @@ +"rgb(255 0 153)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e03c1db0e534457a4c740a6677b3ec48.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e03c1db0e534457a4c740a6677b3ec48.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.Schema_WithScalar_IsMatch.snap index a7027a30d83..b1c7749582a 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0fb5113599e35f50a51ebe87c8e25ea7.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0fb5113599e35f50a51ebe87c8e25ea7.snap new file mode 100644 index 00000000000..54442b28bc5 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_0fb5113599e35f50a51ebe87c8e25ea7.snap @@ -0,0 +1 @@ +"rgba(51, 170, 51, .7)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3682ab2a806b8bd332246fd96845650f.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3682ab2a806b8bd332246fd96845650f.snap new file mode 100644 index 00000000000..1bcdbce1e8d --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_3682ab2a806b8bd332246fd96845650f.snap @@ -0,0 +1 @@ +"rgba(51, 170, 51, .4)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6e8013aa22ff3b319a3fdb72e1a9d73d.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6e8013aa22ff3b319a3fdb72e1a9d73d.snap new file mode 100644 index 00000000000..ff667c8a1f0 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_6e8013aa22ff3b319a3fdb72e1a9d73d.snap @@ -0,0 +1 @@ +"rgba(51 170 51 / 0.4)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_ca0d359e4fe997b4aee38de6c2ac21a8.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_ca0d359e4fe997b4aee38de6c2ac21a8.snap diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d685a949db70bf68bd43a5f6f74155a4.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d685a949db70bf68bd43a5f6f74155a4.snap new file mode 100644 index 00000000000..7c81c56be81 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_d685a949db70bf68bd43a5f6f74155a4.snap @@ -0,0 +1 @@ +"rgba(51, 170, 51, .1)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e76ffa4dd28a52c91f6bf19a386dbf62.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e76ffa4dd28a52c91f6bf19a386dbf62.snap new file mode 100644 index 00000000000..742e9223932 --- /dev/null +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.CoerceOutputValue_GivenObject_MatchExpectedType_e76ffa4dd28a52c91f6bf19a386dbf62.snap @@ -0,0 +1 @@ +"rgba(51, 170, 51, 1)" diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.Schema_WithScalar_IsMatch.snap index 2e627cc0465..6c7ed19f886 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/RgbaTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/SignedByteTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/SignedByteTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index 5b810348ed3..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/SignedByteTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,7 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: Int -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/SignedByteTypeTests.SignedByteType_Should_BeBoundImplicitly_When_Registered.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/SignedByteTypeTests.SignedByteType_Should_BeBoundImplicitly_When_Registered.snap deleted file mode 100644 index d9af3fa9f66..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/SignedByteTypeTests.SignedByteType_Should_BeBoundImplicitly_When_Registered.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: DefaultSignedByte -} - -type DefaultSignedByte { - byte: SignedByte! -} - -"The SignedByte scalar type represents a numeric non-fractional value greater than or equal to -127." -scalar SignedByte diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedIntTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedIntTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index c0aed4d61f2..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedIntTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: UnsignedInt -} - -"The UnsignedInt scalar type represents a unsigned 32-bit numeric non-fractional value greater than or equal to 0." -scalar UnsignedInt diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedIntTypeTests.UnsignedIntType_Should_BeBoundImplicitly_When_Registered.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedIntTypeTests.UnsignedIntType_Should_BeBoundImplicitly_When_Registered.snap deleted file mode 100644 index f3e9a02c359..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedIntTypeTests.UnsignedIntType_Should_BeBoundImplicitly_When_Registered.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: DefaultUnsignedInt -} - -type DefaultUnsignedInt { - int: UnsignedInt! -} - -"The UnsignedInt scalar type represents a unsigned 32-bit numeric non-fractional value greater than or equal to 0." -scalar UnsignedInt diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedLongTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedLongTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index cfa8d44bf5e..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedLongTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: UnsignedLong -} - -"The UnsignedLong scalar type represents a unsigned 64-bit numeric non-fractional value greater than or equal to 0." -scalar UnsignedLong diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedLongTypeTests.UnsignedLongType_Should_BeBoundImplicitly_When_Registered.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedLongTypeTests.UnsignedLongType_Should_BeBoundImplicitly_When_Registered.snap deleted file mode 100644 index 9b6aaf9e642..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedLongTypeTests.UnsignedLongType_Should_BeBoundImplicitly_When_Registered.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: DefaultUnsignedLongType -} - -type DefaultUnsignedLongType { - long: UnsignedLong! -} - -"The UnsignedLong scalar type represents a unsigned 64-bit numeric non-fractional value greater than or equal to 0." -scalar UnsignedLong diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedShortTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedShortTypeTests.Schema_WithScalar_IsMatch.snap deleted file mode 100644 index 883e6132aee..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedShortTypeTests.Schema_WithScalar_IsMatch.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: Query -} - -type Query { - scalar: UnsignedShort -} - -"The UnsignedShort scalar type represents a unsigned 16-bit numeric non-fractional value greater than or equal to 0." -scalar UnsignedShort diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedShortTypeTests.UnsignedShortType_Should_BeBoundImplicitly_When_Registered.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedShortTypeTests.UnsignedShortType_Should_BeBoundImplicitly_When_Registered.snap deleted file mode 100644 index 404efa717e6..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UnsignedShortTypeTests.UnsignedShortType_Should_BeBoundImplicitly_When_Registered.snap +++ /dev/null @@ -1,10 +0,0 @@ -schema { - query: DefaultUnsignedShort -} - -type DefaultUnsignedShort { - short: UnsignedShort! -} - -"The UnsignedShort scalar type represents a unsigned 16-bit numeric non-fractional value greater than or equal to 0." -scalar UnsignedShort diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.Integration_DefaultUtcOffset.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.Integration_DefaultUtcOffset.snap deleted file mode 100644 index 52e179a5b0f..00000000000 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.Integration_DefaultUtcOffset.snap +++ /dev/null @@ -1,5 +0,0 @@ -{ - "data": { - "test": "+00:00" - } -} diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.Schema_WithScalar_IsMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.Schema_WithScalar_IsMatch.snap index 9c82dcdf776..b386d2f0ff9 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.Schema_WithScalar_IsMatch.snap +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.Schema_WithScalar_IsMatch.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query } diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.UtcOffset_ExpectCoerceOutputValueToMatch.snap b/src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.UtcOffset_ExpectCoerceOutputValueToMatch_cefb07be0bd04a57e3fb4923966f4d6c.snap similarity index 100% rename from src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.UtcOffset_ExpectCoerceOutputValueToMatch.snap rename to src/HotChocolate/Core/test/Types.Scalars.Tests/__snapshots__/UtcOffsetTypeTests.UtcOffset_ExpectCoerceOutputValueToMatch_cefb07be0bd04a57e3fb4923966f4d6c.snap From e254f212a8d3b2c1727bac09411b1f95a4fde428 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 13 Jan 2026 15:35:18 +0100 Subject: [PATCH 094/144] fix tests --- .../test/Types.Scalars.Tests/HslTypeTests.cs | 4 ---- .../test/Types.Scalars.Tests/RgbTypeTests.cs | 7 ------ .../test/Types.Scalars.Tests/RgbaTypeTests.cs | 24 ------------------- .../Types.Scalars.Tests/UtcOffsetTypeTests.cs | 16 ------------- 4 files changed, 51 deletions(-) diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs index 87d5ba5d618..9349cf116fe 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/HslTypeTests.cs @@ -20,10 +20,6 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "hsl(270, 60%, 70%)", "hsl(270, 60%, 70%)")] [InlineData(typeof(StringValueNode), "hsl(270 60% 70%)", "hsl(270 60% 70%)")] [InlineData(typeof(StringValueNode), "hsl(270deg, 60%, 70%)", "hsl(270deg, 60%, 70%)")] - [InlineData(typeof(StringValueNode), "hsl(270, 60%, 50%, .15)", "hsl(270, 60%, 50%, .15)")] - [InlineData(typeof(StringValueNode), "hsl(270, 60%, 50%, 15%)", "hsl(270, 60%, 50%, 15%)")] - [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / .15)", "hsl(270 60% 50% / .15)")] - [InlineData(typeof(StringValueNode), "hsl(270 60% 50% / 15%)", "hsl(270 60% 50% / 15%)")] [InlineData(typeof(StringValueNode), "hsl(270, 100%, 50%)", "hsl(270, 100%, 50%)")] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs index 64e0e9677ba..f5857c29fd1 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbTypeTests.cs @@ -23,10 +23,6 @@ public void Schema_WithScalar_IsMatch() [InlineData(typeof(StringValueNode), "rgb(100%,0%,60%)", "rgb(100%,0%,60%)")] [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 60%)", "rgb(100%, 0%, 60%)")] [InlineData(typeof(StringValueNode), "rgb(255 0 153)", "rgb(255 0 153)")] - [InlineData(typeof(StringValueNode), "rgb(255, 0, 153, 1)", "rgb(255, 0, 153, 1)")] - [InlineData(typeof(StringValueNode), "rgb(255, 0, 153, 100%)", "rgb(255, 0, 153, 100%)")] - [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 1)", "rgb(255 0 153 / 1)")] - [InlineData(typeof(StringValueNode), "rgb(255 0 153 / 100%)", "rgb(255 0 153 / 100%)")] public void CoerceInputLiteral_GivenValueNode_MatchExpected( Type type, object? value, @@ -65,7 +61,6 @@ public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) [InlineData("\"rgb(100%, 0%, 0%)\"", "rgb(100%, 0%, 0%)")] [InlineData("\"rgb(300,0,0)\"", "rgb(300,0,0)")] [InlineData("\"rgb(255 0 153)\"", "rgb(255 0 153)")] - [InlineData("\"rgb(255, 0, 153, 1)\"", "rgb(255, 0, 153, 1)")] public void CoerceInputValue_GivenValue_MatchExpected( string jsonValue, object? runtimeValue) @@ -96,7 +91,6 @@ public void CoerceInputValue_GivenValue_Throw(string jsonValue) [InlineData("rgb(100%, 0%, 0%)")] [InlineData("rgb(300,0,0)")] [InlineData("rgb(255 0 153)")] - [InlineData("rgb(255, 0, 153, 1)")] public void CoerceOutputValue_GivenObject_MatchExpectedType(object runtimeValue) { // arrange @@ -125,7 +119,6 @@ public void CoerceOutputValue_GivenObject_Throw(object value) [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)")] [InlineData(typeof(StringValueNode), "rgb(300,0,0)")] [InlineData(typeof(StringValueNode), "rgb(255 0 153)")] - [InlineData(typeof(StringValueNode), "rgb(255, 0, 153, 1)")] public void ValueToLiteral_GivenObject_MatchExpectedType(Type type, object? value) { // arrange diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs index a55a3e632c4..b0510d757c4 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/RgbaTypeTests.cs @@ -16,12 +16,6 @@ public void Schema_WithScalar_IsMatch() } [Theory] - [InlineData(typeof(StringValueNode), "rgb(255,0,0)", "rgb(255,0,0)")] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)", "rgb(100%, 0%, 0%)")] - [InlineData(typeof(StringValueNode), "rgb(300,0,0)", "rgb(300,0,0)")] - [InlineData(typeof(StringValueNode), "rgb(110%, 0%, 0%)", "rgb(110%, 0%, 0%)")] - [InlineData(typeof(StringValueNode), "rgb(100%,0%,60%)", "rgb(100%,0%,60%)")] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 60%)", "rgb(100%, 0%, 60%)")] [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .1)", "rgba(51, 170, 51, .1)")] [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .4)", "rgba(51, 170, 51, .4)")] [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .7)", "rgba(51, 170, 51, .7)")] @@ -63,12 +57,6 @@ public void CoerceInputLiteral_GivenValueNode_Throw(Type type, object value) } [Theory] - [InlineData("\"rgb(255,0,0)\"", "rgb(255,0,0)")] - [InlineData("\"rgb(100%, 0%, 0%)\"", "rgb(100%, 0%, 0%)")] - [InlineData("\"rgb(300,0,0)\"", "rgb(300,0,0)")] - [InlineData("\"rgb(110%, 0%, 0%)\"", "rgb(110%, 0%, 0%)")] - [InlineData("\"rgb(100%,0%,60%)\"", "rgb(100%,0%,60%)")] - [InlineData("\"rgb(100%, 0%, 60%)\"", "rgb(100%, 0%, 60%)")] [InlineData("\"rgba(51, 170, 51, .1)\"", "rgba(51, 170, 51, .1)")] [InlineData("\"rgba(51, 170, 51, .4)\"", "rgba(51, 170, 51, .4)")] [InlineData("\"rgba(51, 170, 51, .7)\"", "rgba(51, 170, 51, .7)")] @@ -103,12 +91,6 @@ public void CoerceInputValue_GivenValue_Throw(string jsonValue) } [Theory] - [InlineData("rgb(255,0,0)")] - [InlineData("rgb(100%, 0%, 0%)")] - [InlineData("rgb(300,0,0)")] - [InlineData("rgb(110%, 0%, 0%)")] - [InlineData("rgb(100%,0%,60%)")] - [InlineData("rgb(100%, 0%, 60%)")] [InlineData("rgba(51, 170, 51, .1)")] [InlineData("rgba(51, 170, 51, .4)")] [InlineData("rgba(51, 170, 51, .7)")] @@ -142,12 +124,6 @@ public void CoerceOutputValue_GivenObject_Throw(object value) } [Theory] - [InlineData(typeof(StringValueNode), "rgb(255,0,0)")] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 0%)")] - [InlineData(typeof(StringValueNode), "rgb(300,0,0)")] - [InlineData(typeof(StringValueNode), "rgb(110%, 0%, 0%)")] - [InlineData(typeof(StringValueNode), "rgb(100%,0%,60%)")] - [InlineData(typeof(StringValueNode), "rgb(100%, 0%, 60%)")] [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .1)")] [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .4)")] [InlineData(typeof(StringValueNode), "rgba(51, 170, 51, .7)")] diff --git a/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs b/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs index 8a5826b7c51..6ad5d1f9ea8 100644 --- a/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.Scalars.Tests/UtcOffsetTypeTests.cs @@ -137,22 +137,6 @@ protected void UtcOffset_ExpectCoerceOutputValueToMatch() ExpectCoerceOutputValueToMatch<UtcOffsetType>(new TimeSpan(10, 0, 0)); } - [Fact] - protected void UtcOffset_ExpectCoerceInputValueNullToMatch() - { - // arrange - var scalar = CreateType<UtcOffsetType>(); - using var doc = JsonDocument.Parse("null"); - var context = new Mock<IFeatureProvider>(); - context.Setup(t => t.Features).Returns(FeatureCollection.Empty); - - // act - var result = scalar.CoerceInputValue(doc.RootElement, context.Object); - - // assert - Assert.Null(result); - } - [Fact] protected void UtcOffset_ExpectCoerceInputValueStringToMatch() { From 2e0258973764231a3ad0cb12edc21ba05fa5a8d0 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 13 Jan 2026 22:10:09 +0100 Subject: [PATCH 095/144] Reworked NodaTime Type tests --- .../Tasks/ResolverTask.CompleteValue.cs | 1 - .../Processing/ValueCompletion.List.cs | 2 +- .../test/Execution.Tests/CodeFirstTests.cs | 22 +- .../DateTimeZoneTypeTests.cs | 101 -------- ...rationTypeJsonRoundtripIntegrationTests.cs | 195 --------------- .../Types.NodaTime.Tests/DurationTypeTests.cs | 235 +++++------------- ...stantTypeDateTimeOffsetIntegrationTests.cs | 105 -------- .../InstantTypeGeneralIntegrationTests.cs | 76 ------ .../Types.NodaTime.Tests/InstantTypeTests.cs | 127 +++++----- .../IsoDayOfWeekTypeTests.cs | 173 ++++++------- ...teTimeTypeFullRoundtripIntegrationTests.cs | 82 ------ ...lDateTimeTypeGeneralIsoIntegrationTests.cs | 76 ------ .../LocalDateTimeTypeTests.cs | 133 +++++----- ...alDateTypeFullRoundtripIntegrationTests.cs | 81 ------ .../LocalDateTypeTests.cs | 121 +++++---- ...LocalTimeTypeGeneralIsoIntegrationTests.cs | 76 ------ .../LocalTimeTypeIntegrationTests.cs | 159 +++++------- ...setDateTimeTypeExtendedIntegrationTests.cs | 113 --------- ...fsetDateTimeTypeGeneralIntegrationTests.cs | 99 -------- ...fsetDateTimeTypeRfc3339IntegrationTests.cs | 115 --------- .../OffsetDateTimeTypeTests.cs | 170 +++++-------- ...etDateTypeFullRoundtripIntegrationTests.cs | 107 -------- .../OffsetDateTypeTests.cs | 137 +++++----- .../OffsetTimeTypeExtendedIntegrationTests.cs | 107 -------- .../OffsetTimeTypeRfc3339IntegrationTests.cs | 99 -------- .../OffsetTimeTypeTests.cs | 142 +++++------ ...eneralInvariantWithoutZIntegrationTests.cs | 133 ---------- .../Types.NodaTime.Tests/OffsetTypeTests.cs | 148 +++++------ ...eriodTypeNormalizingIsoIntegrationTests.cs | 70 ------ .../Types.NodaTime.Tests/PeriodTypeTests.cs | 117 +++++---- .../test/Types.NodaTime.Tests/TestSchema.cs | 27 ++ ...ZonedDateTimeTypeCustomIntegrationTests.cs | 125 ---------- .../ZonedDateTimeTypeTests.cs | 189 ++++++-------- 33 files changed, 810 insertions(+), 2853 deletions(-) delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/DateTimeZoneTypeTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeJsonRoundtripIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeDateTimeOffsetIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeGeneralIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeFullRoundtripIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeGeneralIsoIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeFullRoundtripIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeGeneralIsoIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeExtendedIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeGeneralIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeRfc3339IntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeFullRoundtripIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeExtendedIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeRfc3339IntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeGeneralInvariantWithoutZIntegrationTests.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeNormalizingIsoIntegrationTests.cs create mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/TestSchema.cs delete mode 100644 src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeCustomIntegrationTests.cs diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs index 22e050998a8..7e3bb2192ae 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Tasks/ResolverTask.CompleteValue.cs @@ -1,4 +1,3 @@ -using HotChocolate.Types; using static HotChocolate.Execution.Processing.ValueCompletion; namespace HotChocolate.Execution.Processing.Tasks; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs index 530fa2e00a8..69935791071 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/ValueCompletion.List.cs @@ -146,6 +146,6 @@ internal static void PropagateNullValues(ResultElement result) } result.Invalidate(); - } while (result is { IsInvalidated: false }); + } while (result.Parent is { IsInvalidated: false }); } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/CodeFirstTests.cs b/src/HotChocolate/Core/test/Execution.Tests/CodeFirstTests.cs index 78ed9cccceb..c903f32807e 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/CodeFirstTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/CodeFirstTests.cs @@ -23,7 +23,7 @@ public async Task ExecuteOneFieldQueryWithProperty() var result = await schema.MakeExecutable().ExecuteAsync("{ test }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -42,7 +42,7 @@ public async Task AllowFiveToken_Success() var result = await executor.ExecuteAsync("{ a: test }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); } [Fact] @@ -80,7 +80,7 @@ public async Task AllowSixNode_Success() var result = await executor.ExecuteAsync("{ a: test }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); } [Fact] @@ -116,7 +116,7 @@ public async Task ExecuteOneFieldQueryWithMethod() await schema.MakeExecutable().ExecuteAsync("{ test }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -133,7 +133,7 @@ public async Task ExecuteOneFieldQueryWithQuery() await schema.MakeExecutable().ExecuteAsync("{ query }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -157,7 +157,7 @@ ... on Foo { nameFoo } "); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -247,7 +247,7 @@ await schema.MakeExecutable().ExecuteAsync( "{ drink { ... on Tea { kind } } }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -281,7 +281,7 @@ await schema.MakeExecutable().ExecuteAsync( "{ dog { name } }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -297,7 +297,7 @@ await schema.MakeExecutable().ExecuteAsync( "{ dog { desc } }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -313,7 +313,7 @@ await schema.MakeExecutable().ExecuteAsync( "{ dog { name2 } }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -329,7 +329,7 @@ await schema.MakeExecutable().ExecuteAsync( "{ dog { names } }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DateTimeZoneTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/DateTimeZoneTypeTests.cs deleted file mode 100644 index 63ca2190d94..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DateTimeZoneTypeTests.cs +++ /dev/null @@ -1,101 +0,0 @@ -using HotChocolate.Execution; -using NodaTime; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class DateTimeZoneTypeIntegrationTests -{ - public static class Schema - { - public class Query - { - public DateTimeZone Utc => DateTimeZone.Utc; - public DateTimeZone Rome => DateTimeZoneProviders.Tzdb["Europe/Rome"]; - public DateTimeZone Chihuahua => DateTimeZoneProviders.Tzdb["America/Chihuahua"]; - } - - public class Mutation - { - public string Test(DateTimeZone arg) - { - return arg.Id; - } - } - } - - private readonly IRequestExecutor _testExecutor = SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturnsUtc() - { - var result = _testExecutor.Execute("query { test: utc }"); - Assert.Equal("UTC", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsRome() - { - var result = _testExecutor.Execute("query { test: rome }"); - Assert.Equal("Europe/Rome", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsChihuahua() - { - var result = _testExecutor.Execute("query { test: chihuahua }"); - Assert.Equal("America/Chihuahua", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: DateTimeZone!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "Europe/Amsterdam" } }) - .Build()); - Assert.Equal("Europe/Amsterdam", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesNotParseIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: DateTimeZone!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "Europe/Hamster" } }) - .Build()); - Assert.True(result.ExpectOperationResult().IsDataNull); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"Europe/Amsterdam\") }") - .Build()); - Assert.Equal("Europe/Amsterdam", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesNotParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"Europe/Hamster\") }") - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to DateTimeZone", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeJsonRoundtripIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeJsonRoundtripIntegrationTests.cs deleted file mode 100644 index 93f1e5b7123..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeJsonRoundtripIntegrationTests.cs +++ /dev/null @@ -1,195 +0,0 @@ -using HotChocolate.Execution; -using NodaTime; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class DurationTypeJsonRoundtripIntegrationTests -{ - public static class Schema - { - public class Query - { - public Duration PositiveWithDecimals => - Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 10, 19)); - - public Duration NegativeWithDecimals => - -Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 10, 19)); - - public Duration PositiveWithoutDecimals => - Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 10)); - - public Duration PositiveWithoutSeconds => - Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 0)); - - public Duration PositiveWithoutMinutes => - Duration.FromTimeSpan(new TimeSpan(123, 7, 0, 0)); - - public Duration PositiveWithRoundtrip => - Duration.FromTimeSpan(new TimeSpan(123, 26, 0, 70)); - } - - public class Mutation - { - public Duration Test(Duration arg) - => arg + Duration.FromMinutes(10); - } - } - - private readonly IRequestExecutor _testExecutor = SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime(excludeTypes: typeof(DurationType)) - .AddType(new DurationType(DurationPattern.JsonRoundtrip)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturnsSerializedDataWithDecimals() - { - var result = _testExecutor.Execute("query { test: positiveWithDecimals }"); - Assert.Equal("2959:53:10.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsSerializedDataWithNegativeValue() - { - var result = _testExecutor.Execute("query { test: negativeWithDecimals }"); - Assert.Equal("-2959:53:10.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsSerializedDataWithoutDecimals() - { - var result = _testExecutor.Execute("query { test: positiveWithoutDecimals }"); - Assert.Equal("2959:53:10", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsSerializedDataWithoutSeconds() - { - var result = _testExecutor.Execute("query { test: positiveWithoutSeconds }"); - Assert.Equal("2959:53:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsSerializedDataWithoutMinutes() - { - var result = _testExecutor.Execute("query { test: positiveWithoutMinutes }"); - Assert.Equal("2959:00:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsSerializedDataWithRoundtrip() - { - var result = _testExecutor.Execute("query { test: positiveWithRoundtrip }"); - Assert.Equal("2978:01:10", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationParsesInputWithDecimals() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "238:01:00.019" } }) - .Build()); - Assert.Equal("238:11:00.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationParsesInputWithoutDecimals() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "238:01:00" } }) - .Build()); - Assert.Equal("238:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationParsesInputWithoutLeadingZero() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "238:01:00" } }) - .Build()); - Assert.Equal("238:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationParsesInputWithNegativeValue() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "-238:01:00" } }) - .Build()); - Assert.Equal("-237:51:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationDoesntParseInputWithPlusSign() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "+09:22:01:00" } }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void MutationParsesLiteralWithDecimals() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"238:01:00.019\") }") - .Build()); - Assert.Equal("238:11:00.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationParsesLiteralWithoutDecimals() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"238:01:00\") }") - .Build()); - Assert.Equal("238:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationParsesLiteralWithoutLeadingZero() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"238:01:00\") }") - .Build()); - Assert.Equal("238:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationParsesLiteralWithNegativeValue() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"-238:01:00\") }") - .Build()); - Assert.Equal("-237:51:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationDoesntParseLiteralWithPlusSign() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"+238:01:00\") }") - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeTests.cs index da5e4049842..135840a99fe 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/DurationTypeTests.cs @@ -1,5 +1,8 @@ using System.Globalization; -using HotChocolate.Execution; +using System.Text; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime; using NodaTime.Text; @@ -7,214 +10,82 @@ namespace HotChocolate.Types.NodaTime.Tests; public class DurationTypeIntegrationTests { - public static class Schema - { - public class Query - { - public Duration PositiveWithDecimals - => Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 10, 19)); - public Duration NegativeWithDecimals - => -Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 10, 19)); - public Duration PositiveWithoutDecimals - => Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 10)); - public Duration PositiveWithoutSeconds - => Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 0)); - public Duration PositiveWithoutMinutes - => Duration.FromTimeSpan(new TimeSpan(123, 7, 0, 0)); - public Duration PositiveWithRoundtrip - => Duration.FromTimeSpan(new TimeSpan(123, 26, 0, 70)); - } - - public class Mutation - { - public Duration Test(Duration arg) - => arg + Duration.FromMinutes(10); - } - } - - private readonly IRequestExecutor _testExecutor = SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturnsSerializedDataWithDecimals() - { - var result = _testExecutor.Execute("query { test: positiveWithDecimals }"); - Assert.Equal("123:07:53:10.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsSerializedDataWithNegativeValue() - { - var result = _testExecutor.Execute("query{test: negativeWithDecimals}"); - Assert.Equal("-123:07:53:10.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsSerializedDataWithoutDecimals() - { - var result = _testExecutor.Execute("query{test: positiveWithoutDecimals}"); - Assert.Equal("123:07:53:10", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsSerializedDataWithoutSeconds() - { - var result = _testExecutor.Execute("query{test:positiveWithoutSeconds}"); - Assert.Equal("123:07:53:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsSerializedDataWithoutMinutes() - { - var result = _testExecutor.Execute("query{test:positiveWithoutMinutes}"); - Assert.Equal("123:07:00:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsSerializedDataWithRoundtrip() - { - var result = _testExecutor.Execute("query{test:positiveWithRoundtrip}"); - Assert.Equal("124:02:01:10", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationParsesInputWithDecimals() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "09:22:01:00.019" } }) - .Build()); - Assert.Equal("9:22:11:00.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationParsesInputWithoutDecimals() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "09:22:01:00" } }) - .Build()); - Assert.Equal("9:22:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - [Fact] - public void MutationParsesInputWithoutLeadingZero() + public void CoerceInputLiteral() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "9:22:01:00" } }) - .Build()); - Assert.Equal("9:22:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new DurationType(); + var inputValue = new StringValueNode("123:07:53:10.019"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal( + Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 10, 19)), + Assert.IsType<Duration>(runtimeValue)); } [Fact] - public void MutationParsesInputWithNegativeValue() + public void CoerceInputLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "-9:22:01:00" } }) - .Build()); - Assert.Equal("-9:21:51:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new DurationType(); + var valueLiteral = new StringValueNode("+09:22:01:00"); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void MutationDoesntParseInputWithPlusSign() + public void CoerceInputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "+09:22:01:00" } }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new DurationType(); + var inputValue = ParseInputValue("\"123:07:53:10.019\""); + var runtimeValue = type.CoerceInputValue(inputValue, null!); + Assert.Equal( + Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 10, 19)), + Assert.IsType<Duration>(runtimeValue)); } [Fact] - public void MutationDoesntParseInputWithOverflownHours() + public void CoerceInputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Duration!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "9:26:01:00" } }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new DurationType(); + var inputValue = ParseInputValue("\"+09:22:01:00\""); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void MutationParsesLiteralWithDecimals() + public void CoerceOutputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"09:22:01:00.019\") }") - .Build()); - - Assert.Equal("9:22:11:00.019", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new DurationType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 10, 19)), resultValue); + Assert.Equal("123:07:53:10.019", resultValue.GetString()); } [Fact] - public void MutationParsesLiteralWithoutDecimals() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"09:22:01:00\") }") - .Build()); - - Assert.Equal("9:22:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new DurationType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue("123:07:53:10.019", resultValue); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void MutationParsesLiteralWithoutLeadingZero() + public void ValueToLiteral() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"09:22:01:00\") }") - .Build()); - - Assert.Equal("9:22:11:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new DurationType(); + var valueLiteral = type.ValueToLiteral(Duration.FromTimeSpan(new TimeSpan(123, 7, 53, 10, 19))); + Assert.Equal("\"123:07:53:10.019\"", valueLiteral.ToString()); } [Fact] - public void MutationParsesLiteralWithNegativeValue() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"-9:22:01:00\") }") - .Build()); - - Assert.Equal("-9:21:51:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void MutationDoesntParseLiteralWithPlusSign() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"+09:22:01:00\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void MutationDoesntParseLiteralWithOverflownHours() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"9:26:01:00\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new DurationType(); + Action error = () => type.ValueToLiteral("123:07:53:10.019"); + Assert.Throws<LeafCoercionException>(error); } [Fact] @@ -254,4 +125,10 @@ public void DurationType_DescriptionUnknownPatterns_MatchesSnapshot() durationType.Description.MatchInlineSnapshot( "Represents a fixed (and calendar-independent) length of time."); } + + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); + } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeDateTimeOffsetIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeDateTimeOffsetIntegrationTests.cs deleted file mode 100644 index dc31f468026..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeDateTimeOffsetIntegrationTests.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System.Globalization; -using System.Text; -using HotChocolate.Execution; -using NodaTime; -using NodaTime.Extensions; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class InstantTypeDateTimeOffsetIntegrationTests -{ - private class InstantDateTimeOffsetPattern : IPattern<Instant> - { - public ParseResult<Instant> Parse(string text) - { - return DateTimeOffset.TryParse( - text, - DateTimeFormatInfo.InvariantInfo, - DateTimeStyles.AssumeUniversal, - out var value) - ? ParseResult<Instant>.ForValue(value.ToInstant()) - : ParseResult<Instant> - .ForException(() => new FormatException("Could not parse DateTimeOffset")); - } - - public string Format(Instant value) - { - return InstantPattern.General.Format(value); - } - - public StringBuilder AppendFormat(Instant value, StringBuilder builder) - { - return InstantPattern.General.AppendFormat(value, builder); - } - } - - private readonly IRequestExecutor _testExecutor = SchemaBuilder.New() - .AddQueryType<InstantTypeIntegrationTests.Schema.Query>() - .AddMutationType<InstantTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(InstantType)) - .AddType( - new InstantType(InstantPattern.ExtendedIso, new InstantDateTimeOffsetPattern())) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturnsUtc() - { - var result = _testExecutor.Execute("query { test: one }"); - - Assert.Equal( - "2020-02-20T17:42:59.000001234Z", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Instant!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-21T17:42:59.000001234Z" } }) - .Build()); - - Assert.Equal( - "2020-02-21T17:52:59.000001234Z", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesParseAnIncorrectExtendedVariableAsDateTimeOffset() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Instant!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-20T17:42:59" } }) - .Build()); - - Assert.Equal("2020-02-20T17:52:59Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59.000001234Z\") }") - .Build()); - - Assert.Equal( - "2020-02-20T17:52:59.000001234Z", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesParseIncorrectExtendedLiteralAsDateTimeOffset() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59\") }") - .Build()); - - Assert.Equal("2020-02-20T17:52:59Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeGeneralIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeGeneralIntegrationTests.cs deleted file mode 100644 index 1d042285f01..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeGeneralIntegrationTests.cs +++ /dev/null @@ -1,76 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class InstantTypeGeneralIntegrationTests -{ - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<InstantTypeIntegrationTests.Schema.Query>() - .AddMutationType<InstantTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(InstantType)) - .AddType(new InstantType(InstantPattern.General)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturnsUtc() - { - var result = _testExecutor.Execute("query { test: one }"); - - Assert.Equal("2020-02-20T17:42:59Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Instant!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-21T17:42:59Z" } }) - .Build()); - - Assert.Equal("2020-02-21T17:52:59Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Instant!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-20T17:42:59" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59Z\") }") - .Build()); - - Assert.Equal("2020-02-20T17:52:59Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors!.First().Code); - Assert.Equal( - "Unable to deserialize string to Instant", - result.ExpectOperationResult().Errors!.First().Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeTests.cs index 30b4cde9a5f..90591291edd 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/InstantTypeTests.cs @@ -1,5 +1,8 @@ using System.Globalization; -using HotChocolate.Execution; +using System.Text; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime; using NodaTime.Text; @@ -7,94 +10,82 @@ namespace HotChocolate.Types.NodaTime.Tests; public class InstantTypeIntegrationTests { - public static class Schema + [Fact] + public void CoerceInputLiteral() { - public class Query - { - public Instant One - => Instant.FromUtc(2020, 02, 20, 17, 42, 59).PlusNanoseconds(1234); - } - - public class Mutation - { - public Instant Test(Instant arg) - { - return arg + Duration.FromMinutes(10); - } - } + var type = new InstantType(); + var inputValue = new StringValueNode("2020-02-20T17:42:59.000001234Z"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal( + Instant.FromUtc(2020, 02, 20, 17, 42, 59).PlusNanoseconds(1234), + Assert.IsType<Instant>(runtimeValue)); } - private readonly IRequestExecutor _testExecutor = SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - [Fact] - public void QueryReturnsUtc() + public void CoerceInputLiteral_Invalid_Value_Throws() { - var result = _testExecutor.Execute("query { test: one }"); + var type = new InstantType(); + var valueLiteral = new StringValueNode("2020-02-20T17:42:59"); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); + } + [Fact] + public void CoerceInputValue() + { + var type = new InstantType(); + var inputValue = ParseInputValue("\"2020-02-20T17:42:59.000001234Z\""); + var runtimeValue = type.CoerceInputValue(inputValue, null!); Assert.Equal( - "2020-02-20T17:42:59.000001234Z", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + Instant.FromUtc(2020, 02, 20, 17, 42, 59).PlusNanoseconds(1234), + Assert.IsType<Instant>(runtimeValue)); } [Fact] - public void ParsesVariable() + public void CoerceInputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Instant!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-21T17:42:59.000001234Z" } }) - .Build()); - - Assert.Equal( - "2020-02-21T17:52:59.000001234Z", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new InstantType(); + var inputValue = ParseInputValue("\"2020-02-20T17:42:59\""); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void DoesntParseAnIncorrectVariable() + public void CoerceOutputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Instant!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-20T17:42:59" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new InstantType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(Instant.FromUtc(2020, 02, 20, 17, 42, 59).PlusNanoseconds(1234), resultValue); + Assert.Equal("2020-02-20T17:42:59.000001234Z", resultValue.GetString()); } [Fact] - public void ParsesLiteral() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59.000001234Z\") }") - .Build()); + var type = new InstantType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue("2020-02-20T17:42:59.000001234Z", resultValue); + Assert.Throws<LeafCoercionException>(error); + } - Assert.Equal( - "2020-02-20T17:52:59.000001234Z", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + [Fact] + public void ValueToLiteral() + { + var type = new InstantType(); + var valueLiteral = type.ValueToLiteral(Instant.FromUtc(2020, 02, 20, 17, 42, 59).PlusNanoseconds(1234)); + Assert.Equal("\"2020-02-20T17:42:59.000001234Z\"", valueLiteral.ToString()); } [Fact] - public void DoesntParseIncorrectLiteral() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to Instant", - result.ExpectOperationResult().Errors![0].Message); + var type = new InstantType(); + Action error = () => type.ValueToLiteral("2020-02-20T17:42:59.000001234Z"); + Assert.Throws<LeafCoercionException>(error); } [Fact] @@ -132,4 +123,10 @@ public void InstantType_DescriptionUnknownPatterns_MatchesSnapshot() instantType.Description.MatchInlineSnapshot( "Represents an instant on the global timeline, with nanosecond resolution."); } + + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); + } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/IsoDayOfWeekTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/IsoDayOfWeekTypeTests.cs index 0fc3454402f..a3d39a67b3b 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/IsoDayOfWeekTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/IsoDayOfWeekTypeTests.cs @@ -1,132 +1,139 @@ -using HotChocolate.Execution; +using System.Text; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime; namespace HotChocolate.Types.NodaTime.Tests; public class IsoDayOfWeekTypeIntegrationTests { - public static class Schema + [Fact] + public void CoerceInputLiteral() { - public class Query - { - public IsoDayOfWeek Monday => IsoDayOfWeek.Monday; - public IsoDayOfWeek Sunday => IsoDayOfWeek.Sunday; - public IsoDayOfWeek Friday => IsoDayOfWeek.Friday; - public IsoDayOfWeek None => IsoDayOfWeek.None; - } - - public class Mutation - { - public IsoDayOfWeek Test(IsoDayOfWeek arg) - { - var intRepr = (int)arg; - var nextIntRepr = Math.Max(1, (intRepr + 1) % 8); - return (IsoDayOfWeek)nextIntRepr; - } - } + var type = new IsoDayOfWeekType(); + var inputValue = new IntValueNode(1); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal(IsoDayOfWeek.Monday, Assert.IsType<IsoDayOfWeek>(runtimeValue)); } - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - [Fact] - public void QueryReturnsMonday() + public void CoerceInputLiteral_Sunday() { - var result = _testExecutor.Execute("query { test: monday }"); - - Assert.Equal(1, result.ExpectOperationResult().UnwrapData().GetProperty("test").GetInt32()); + var type = new IsoDayOfWeekType(); + var inputValue = new IntValueNode(7); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal(IsoDayOfWeek.Sunday, Assert.IsType<IsoDayOfWeek>(runtimeValue)); } [Fact] - public void QueryReturnsSunday() + public void CoerceInputLiteral_Invalid_Zero_Throws() { - var result = _testExecutor.Execute("query { test: sunday }"); - - Assert.Equal(7, result.ExpectOperationResult().UnwrapData().GetProperty("test").GetInt32()); + var type = new IsoDayOfWeekType(); + var valueLiteral = new IntValueNode(0); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void QueryReturnsFriday() + public void CoerceInputLiteral_Invalid_Eight_Throws() { - var result = _testExecutor.Execute("query { test: friday }"); - - Assert.Equal(5, result.ExpectOperationResult().UnwrapData().GetProperty("test").GetInt32()); + var type = new IsoDayOfWeekType(); + var valueLiteral = new IntValueNode(8); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void QueryDoesntReturnNone() + public void CoerceInputLiteral_Invalid_Negative_Throws() { - var result = _testExecutor.Execute("query { test: none }"); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.NotEmpty(result.ExpectOperationResult().Errors!); + var type = new IsoDayOfWeekType(); + var valueLiteral = new IntValueNode(-2); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void MutationParsesMonday() + public void CoerceInputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: IsoDayOfWeek!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", 1 } }) - .Build()); - - Assert.Equal(2, result.ExpectOperationResult().UnwrapData().GetProperty("test").GetInt32()); + var type = new IsoDayOfWeekType(); + var inputValue = ParseInputValue("1"); + var runtimeValue = type.CoerceInputValue(inputValue, null!); + Assert.Equal(IsoDayOfWeek.Monday, Assert.IsType<IsoDayOfWeek>(runtimeValue)); } [Fact] - public void MutationParsesSunday() + public void CoerceInputValue_Invalid_Zero_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: IsoDayOfWeek!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", 7 } }) - .Build()); + var type = new IsoDayOfWeekType(); + var inputValue = ParseInputValue("0"); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); + } - Assert.Equal(1, result.ExpectOperationResult().UnwrapData().GetProperty("test").GetInt32()); + [Fact] + public void CoerceOutputValue() + { + var type = new IsoDayOfWeekType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(IsoDayOfWeek.Monday, resultValue); + Assert.Equal(1, resultValue.GetInt32()); } [Fact] - public void MutationDoesntParseZero() + public void CoerceOutputValue_Sunday() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: IsoDayOfWeek!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", 0 } }) - .Build()); + var type = new IsoDayOfWeekType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(IsoDayOfWeek.Sunday, resultValue); + Assert.Equal(7, resultValue.GetInt32()); + } - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + [Fact] + public void CoerceOutputValue_Invalid_None_Throws() + { + var type = new IsoDayOfWeekType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue(IsoDayOfWeek.None, resultValue); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void MutationDoesntParseEight() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: IsoDayOfWeek!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", 8 } }) - .Build()); + var type = new IsoDayOfWeekType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue(1, resultValue); + Assert.Throws<LeafCoercionException>(error); + } - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + [Fact] + public void ValueToLiteral() + { + var type = new IsoDayOfWeekType(); + var valueLiteral = type.ValueToLiteral(IsoDayOfWeek.Monday); + Assert.Equal("1", valueLiteral.ToString()); } [Fact] - public void MutationDoesntParseNegativeNumbers() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: IsoDayOfWeek!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", -2 } }) - .Build()); + var type = new IsoDayOfWeekType(); + Action error = () => type.ValueToLiteral(1); + Assert.Throws<LeafCoercionException>(error); + } - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeFullRoundtripIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeFullRoundtripIntegrationTests.cs deleted file mode 100644 index f0df5838368..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeFullRoundtripIntegrationTests.cs +++ /dev/null @@ -1,82 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class LocalDateTimeTypeFullRoundtripIntegrationTests -{ - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<LocalDateTimeTypeIntegrationTests.Schema.Query>() - .AddMutationType<LocalDateTimeTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(LocalDateTimeType)) - .AddType(new LocalDateTimeType(LocalDateTimePattern.FullRoundtrip)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: one }"); - - Assert.Equal( - "2020-02-07T17:42:59.000001234 (Julian)", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-21T17:42:59.000001234 (Julian)" } }) - .Build()); - - Assert.Equal( - "2020-02-21T17:52:59.000001234 (Julian)", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-20T17:42:59Z" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59.000001234 (Julian)\") }") - .Build()); - - Assert.Equal( - "2020-02-20T17:52:59.000001234 (Julian)", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59Z\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to LocalDateTime", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeGeneralIsoIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeGeneralIsoIntegrationTests.cs deleted file mode 100644 index 3e3b84dd1ef..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeGeneralIsoIntegrationTests.cs +++ /dev/null @@ -1,76 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class LocalDateTimeTypeGeneralIsoIntegrationTests -{ - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<LocalDateTimeTypeIntegrationTests.Schema.Query>() - .AddMutationType<LocalDateTimeTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(LocalDateTimeType)) - .AddType(new LocalDateTimeType(LocalDateTimePattern.GeneralIso)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: one }"); - - Assert.Equal("2020-02-07T17:42:59", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-21T17:42:59" } }) - .Build()); - - Assert.Equal("2020-02-21T17:52:59", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-20T17:42:59Z" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59\") }") - .Build()); - - Assert.Equal("2020-02-20T17:52:59", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59Z\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to LocalDateTime", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeTests.cs index e1850cce4a4..ebab8b93cc1 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTimeTypeTests.cs @@ -1,5 +1,8 @@ using System.Globalization; -using HotChocolate.Execution; +using System.Text; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime; using NodaTime.Text; @@ -7,98 +10,82 @@ namespace HotChocolate.Types.NodaTime.Tests; public class LocalDateTimeTypeIntegrationTests { - public static class Schema + [Fact] + public void CoerceInputLiteral() { - public class Query - { - public LocalDateTime One => - LocalDateTime.FromDateTime( - new DateTime(2020, 02, 20, 17, 42, 59)) - .PlusNanoseconds(1234) - .WithCalendar(CalendarSystem.Julian); - } - - public class Mutation - { - public LocalDateTime Test(LocalDateTime arg) - { - return arg + Period.FromMinutes(10); - } - } + var type = new LocalDateTimeType(); + var inputValue = new StringValueNode("2020-02-20T17:42:59.000001234"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal( + LocalDateTime.FromDateTime(new DateTime(2020, 02, 20, 17, 42, 59)).PlusNanoseconds(1234), + Assert.IsType<LocalDateTime>(runtimeValue)); } - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - [Fact] - public void QueryReturns() + public void CoerceInputLiteral_Invalid_Value_Throws() { - var result = _testExecutor.Execute("query { test: one }"); + var type = new LocalDateTimeType(); + var valueLiteral = new StringValueNode("2020-02-20T17:42:59.000001234Z"); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); + } - Assert.Equal("2020-02-07T17:42:59.000001234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + [Fact] + public void CoerceInputValue() + { + var type = new LocalDateTimeType(); + var inputValue = ParseInputValue("\"2020-02-20T17:42:59.000001234\""); + var runtimeValue = type.CoerceInputValue(inputValue, null!); + Assert.Equal( + LocalDateTime.FromDateTime(new DateTime(2020, 02, 20, 17, 42, 59)).PlusNanoseconds(1234), + Assert.IsType<LocalDateTime>(runtimeValue)); } [Fact] - public void ParsesVariable() + public void CoerceInputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalDateTime!) { test(arg: $arg) }") - .SetVariableValues( - new Dictionary<string, object?> { { "arg", "2020-02-21T17:42:59.000001234" } }) - .Build()); - - Assert.Equal("2020-02-21T17:52:59.000001234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new LocalDateTimeType(); + var inputValue = ParseInputValue("\"2020-02-20T17:42:59.000001234Z\""); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void DoesntParseAnIncorrectVariable() + public void CoerceOutputValue() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalDateTime!) { test(arg: $arg) }") - .SetVariableValues( - new Dictionary<string, object?> { { "arg", "2020-02-20T17:42:59.000001234Z" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new LocalDateTimeType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(LocalDateTime.FromDateTime(new DateTime(2020, 02, 20, 17, 42, 59)).PlusNanoseconds(1234), resultValue); + Assert.Equal("2020-02-20T17:42:59.000001234", resultValue.GetString()); } [Fact] - public void ParsesLiteral() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59.000001234\") }") - .Build()); + var type = new LocalDateTimeType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue("2020-02-20T17:42:59.000001234", resultValue); + Assert.Throws<LeafCoercionException>(error); + } - Assert.Equal("2020-02-20T17:52:59.000001234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + [Fact] + public void ValueToLiteral() + { + var type = new LocalDateTimeType(); + var valueLiteral = type.ValueToLiteral(LocalDateTime.FromDateTime(new DateTime(2020, 02, 20, 17, 42, 59)).PlusNanoseconds(1234)); + Assert.Equal("\"2020-02-20T17:42:59.000001234\"", valueLiteral.ToString()); } [Fact] - public void DoesntParseIncorrectLiteral() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59.000001234Z\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to LocalDateTime", - result.ExpectOperationResult().Errors![0].Message); + var type = new LocalDateTimeType(); + Action error = () => type.ValueToLiteral("2020-02-20T17:42:59.000001234"); + Assert.Throws<LeafCoercionException>(error); } [Fact] @@ -138,4 +125,10 @@ public void LocalDateTimeType_DescriptionUnknownPatterns_MatchesSnapshot() localDateTimeType.Description.MatchInlineSnapshot( "A date and time in a particular calendar system."); } + + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); + } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeFullRoundtripIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeFullRoundtripIntegrationTests.cs deleted file mode 100644 index 754c7ff4adb..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeFullRoundtripIntegrationTests.cs +++ /dev/null @@ -1,81 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class LocalDateTypeFullRoundtripIntegrationTests -{ - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<LocalDateTypeIntegrationTests.Schema.Query>() - .AddMutationType<LocalDateTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(LocalDateType)) - .AddType(new LocalDateType(LocalDatePattern.FullRoundtrip)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: one }"); - - Assert.Equal("5780-05-25 (Hebrew Civil)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalDate!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-21 (Hebrew Civil)" } }) - .Build()); - - Assert.Equal("2020-02-24 (Hebrew Civil)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalDate!) { test(arg: $arg) }") - .SetVariableValues( - new Dictionary<string, object?> { { "arg", "2020-02-20T17:42:59 (Hebrew Civil)" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20 (Hebrew Civil)\") }") - .Build()); - - Assert.Equal("2020-02-23 (Hebrew Civil)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59 (Hebrew Civil)\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to LocalDate", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeTests.cs index 1872c9c08c6..65b2d595287 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalDateTypeTests.cs @@ -1,5 +1,8 @@ using System.Globalization; -using HotChocolate.Execution; +using System.Text; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime; using NodaTime.Text; @@ -7,90 +10,78 @@ namespace HotChocolate.Types.NodaTime.Tests; public class LocalDateTypeIntegrationTests { - public static class Schema + [Fact] + public void CoerceInputLiteral() { - public class Query - { - public LocalDate One => LocalDate.FromDateTime( - new DateTime(2020, 02, 20, 17, 42, 59)) - .WithCalendar(CalendarSystem.HebrewCivil); - } - - public class Mutation - { - public LocalDate Test(LocalDate arg) - { - return arg + Period.FromDays(3); - } - } + var type = new LocalDateType(); + var inputValue = new StringValueNode("2020-02-20"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal(new LocalDate(2020, 2, 20), Assert.IsType<LocalDate>(runtimeValue)); } - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - [Fact] - public void QueryReturns() + public void CoerceInputLiteral_Invalid_Value_Throws() { - var result = _testExecutor.Execute("query { test: one }"); - - Assert.Equal("5780-05-25", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new LocalDateType(); + var valueLiteral = new StringValueNode("2020-02-20T17:42:59"); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesVariable() + public void CoerceInputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalDate!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-21" } }) - .Build()); + var type = new LocalDateType(); + var inputValue = ParseInputValue("\"2020-02-20\""); + var runtimeValue = type.CoerceInputValue(inputValue, null!); + Assert.Equal(new LocalDate(2020, 2, 20), Assert.IsType<LocalDate>(runtimeValue)); + } - Assert.Equal("2020-02-24", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + [Fact] + public void CoerceInputValue_Invalid_Value_Throws() + { + var type = new LocalDateType(); + var inputValue = ParseInputValue("\"2020-02-20T17:42:59\""); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void DoesntParseAnIncorrectVariable() + public void CoerceOutputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalDate!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-02-20T17:42:59" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new LocalDateType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(new LocalDate(2020, 2, 20), resultValue); + Assert.Equal("2020-02-20", resultValue.GetString()); } [Fact] - public void ParsesLiteral() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20\") }") - .Build()); + var type = new LocalDateType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue("2020-02-20", resultValue); + Assert.Throws<LeafCoercionException>(error); + } - Assert.Equal("2020-02-23", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + [Fact] + public void ValueToLiteral() + { + var type = new LocalDateType(); + var valueLiteral = type.ValueToLiteral(new LocalDate(2020, 2, 20)); + Assert.Equal("\"2020-02-20\"", valueLiteral.ToString()); } [Fact] - public void DoesntParseIncorrectLiteral() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-02-20T17:42:59\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to LocalDate", - result.ExpectOperationResult().Errors![0].Message); + var type = new LocalDateType(); + Action error = () => type.ValueToLiteral("2020-02-20"); + Assert.Throws<LeafCoercionException>(error); } [Fact] @@ -128,4 +119,10 @@ public void LocalDateType_DescriptionUnknownPatterns_MatchesSnapshot() localDateType.Description.MatchInlineSnapshot( "LocalDate represents a date within the calendar, with no reference to a particular time zone or time of day."); } + + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); + } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeGeneralIsoIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeGeneralIsoIntegrationTests.cs deleted file mode 100644 index e8258154470..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeGeneralIsoIntegrationTests.cs +++ /dev/null @@ -1,76 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class LocalTimeTypeGeneralIsoIntegrationTests -{ - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<LocalTimeTypeIntegrationTests.Schema.Query>() - .AddMutationType<LocalTimeTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(LocalTimeType)) - .AddType(new LocalTimeType(LocalTimePattern.GeneralIso)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: one }"); - - Assert.Equal("12:42:13", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "12:42:13" } }) - .Build()); - - Assert.Equal("12:52:13", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "12:42" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"12:42:13\") }") - .Build()); - - Assert.Equal("12:52:13", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"12:42\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to LocalTime", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeIntegrationTests.cs index 7a4c395966a..198067ecb5d 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/LocalTimeTypeIntegrationTests.cs @@ -1,5 +1,9 @@ using System.Globalization; +using System.Text; +using System.Text.Json; using HotChocolate.Execution; +using HotChocolate.Language; +using HotChocolate.Text.Json; using Microsoft.Extensions.DependencyInjection; using NodaTime; using NodaTime.Text; @@ -8,119 +12,82 @@ namespace HotChocolate.Types.NodaTime.Tests; public class LocalTimeTypeIntegrationTests { - public static class Schema + [Fact] + public void CoerceInputLiteral() { - public class Query - { - public LocalTime One => LocalTime - .FromHourMinuteSecondMillisecondTick(12, 42, 13, 31, 100) - .PlusNanoseconds(1234); - } - - public class Mutation - { - public LocalTime Test(LocalTime arg) - { - return arg + Period.FromMinutes(10); - } - } + var type = new LocalTimeType(); + var inputValue = new StringValueNode("12:42:13.031011234"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal( + LocalTime.FromHourMinuteSecondMillisecondTick(12, 42, 13, 31, 100).PlusNanoseconds(1234), + Assert.IsType<LocalTime>(runtimeValue)); } - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - [Fact] - public void QueryReturns() + public void CoerceInputLiteral_Invalid_Value_Throws() { - var result = _testExecutor.Execute("query { test: one }"); - - Assert.Equal("12:42:13.031011234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new LocalTimeType(); + var valueLiteral = new StringValueNode("12:42"); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesVariable() + public void CoerceInputValue() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "12:42:13.031011234" } }) - .Build()); - - Assert.Equal("12:52:13.031011234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new LocalTimeType(); + var inputValue = ParseInputValue("\"12:42:13.031011234\""); + var runtimeValue = type.CoerceInputValue(inputValue, null!); + Assert.Equal( + LocalTime.FromHourMinuteSecondMillisecondTick(12, 42, 13, 31, 100).PlusNanoseconds(1234), + Assert.IsType<LocalTime>(runtimeValue)); } [Fact] - public void ParsesVariableWithoutTicks() + public void CoerceInputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "12:42:13" } }) - .Build()); - - Assert.Equal("12:52:13", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new LocalTimeType(); + var inputValue = ParseInputValue("\"12:42\""); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void DoesntParseAnIncorrectVariable() + public void CoerceOutputValue() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: LocalTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "12:42" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new LocalTimeType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(LocalTime.FromHourMinuteSecondMillisecondTick(12, 42, 13, 31, 100).PlusNanoseconds(1234), resultValue); + Assert.Equal("12:42:13.031011234", resultValue.GetString()); } [Fact] - public void ParsesLiteral() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"12:42:13.031011234\") }") - .Build()); - - Assert.Equal("12:52:13.031011234", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new LocalTimeType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue("12:42:13.031011234", resultValue); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesLiteralWithoutTick() + public void ValueToLiteral() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"12:42:13\") }") - .Build()); - - Assert.Equal("12:52:13", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new LocalTimeType(); + var valueLiteral = type.ValueToLiteral(LocalTime.FromHourMinuteSecondMillisecondTick(12, 42, 13, 31, 100).PlusNanoseconds(1234)); + Assert.Equal("\"12:42:13.031011234\"", valueLiteral.ToString()); } [Fact] - public void DoesntParseIncorrectLiteral() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"12:42\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to LocalTime", - result.ExpectOperationResult().Errors![0].Message); + var type = new LocalTimeType(); + Action error = () => type.ValueToLiteral("12:42:13.031011234"); + Assert.Throws<LeafCoercionException>(error); } [Fact] @@ -164,7 +131,7 @@ public void LocalTimeType_DescriptionUnknownPatterns_MatchesSnapshot() [Fact] public async Task Ensure_Schema_First_Can_Override_Type() { - var schema = await new ServiceCollection() + var executor = await new ServiceCollection() .AddGraphQL() .AddDocumentFromString( """ @@ -176,15 +143,15 @@ scalar LocalTime """) .AddType<LocalTimeType>() .UseField(next => next) - .BuildSchemaAsync(); + .BuildRequestExecutorAsync(); - schema.MatchSnapshot(); + executor.Schema.MatchSnapshot(); } [Fact] public async Task Ensure_Schema_First_Can_Override_Type_2() { - var schema = await new ServiceCollection() + var executor = await new ServiceCollection() .AddGraphQL() .AddDocumentFromString( """ @@ -196,15 +163,15 @@ scalar LocalTime """) .BindScalarType<LocalTimeType>("LocalTime") .UseField(next => next) - .BuildSchemaAsync(); + .BuildRequestExecutorAsync(); - schema.MatchSnapshot(); + executor.Schema.MatchSnapshot(); } [Fact] public async Task Ensure_Schema_First_Override_Is_Lazy() { - var schema = await new ServiceCollection() + var executor = await new ServiceCollection() .AddGraphQL() .AddDocumentFromString( """ @@ -214,8 +181,14 @@ type Query { """) .BindScalarType<LocalTimeType>("LocalTime") .UseField(next => next) - .BuildSchemaAsync(); + .BuildRequestExecutorAsync(); - schema.MatchSnapshot(); + executor.Schema.MatchSnapshot(); + } + + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeExtendedIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeExtendedIntegrationTests.cs deleted file mode 100644 index ac2d1323f9c..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeExtendedIntegrationTests.cs +++ /dev/null @@ -1,113 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class OffsetDateTimeTypeExtendedIntegrationTests -{ - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<OffsetDateTimeTypeIntegrationTests.Schema.Query>() - .AddMutationType<OffsetDateTimeTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(OffsetDateTimeType)) - .AddType(new OffsetDateTimeType(OffsetDateTimePattern.ExtendedIso)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: hours }"); - - Assert.Equal("2020-12-31T18:30:13.000001234+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsWithMinutes() - { - var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - - Assert.Equal("2020-12-31T18:30:13.000001234+02:30", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13+02" } }) - .Build()); - - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariableWithMinutes() - { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13+02:35" } }) - .Build()); - - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02\") }") - .Build()); - - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesLiteralWithMinutes() - { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02:35\") }") - .Build()); - - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to OffsetDateTime", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeGeneralIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeGeneralIntegrationTests.cs deleted file mode 100644 index a8b768beaf1..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeGeneralIntegrationTests.cs +++ /dev/null @@ -1,99 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class OffsetDateTimeTypeGeneralIntegrationTests -{ - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<OffsetDateTimeTypeIntegrationTests.Schema.Query>() - .AddMutationType<OffsetDateTimeTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(OffsetDateTimeType)) - .AddType(new OffsetDateTimeType(OffsetDateTimePattern.GeneralIso)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("2020-12-31T18:30:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsWithMinutes() - { - var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("2020-12-31T18:30:13+02:30", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13+02" } }) - .Build()); - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariableWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13+02:35" } }) - .Build()); - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13" } }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02\") }") - .Build()); - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesLiteralWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02:35\") }") - .Build()); - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13\") }") - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to OffsetDateTime", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeRfc3339IntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeRfc3339IntegrationTests.cs deleted file mode 100644 index 5a8308d216c..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeRfc3339IntegrationTests.cs +++ /dev/null @@ -1,115 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class OffsetDateTimeTypeRfc3339IntegrationTests -{ - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<OffsetDateTimeTypeIntegrationTests.Schema.Query>() - .AddMutationType<OffsetDateTimeTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(OffsetDateTimeType)) - .AddType(new OffsetDateTimeType(OffsetDateTimePattern.Rfc3339)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: hours }"); - - Assert.Equal( - "2020-12-31T18:30:13.000001234+02:00", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsWithMinutes() - { - var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - - Assert.Equal( - "2020-12-31T18:30:13.000001234+02:30", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13.000001234+02:00" } }) - .Build()); - - Assert.Equal( - "2020-12-31T18:40:13.000001234+02:00", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariableWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13+02:35" } }) - .Build()); - - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13.000001234+02:00\") }") - .Build()); - - Assert.Equal( - "2020-12-31T18:40:13.000001234+02:00", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesLiteralWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02:35\") }") - .Build()); - - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to OffsetDateTime", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeTests.cs index d0eb97f3ecb..3a478a69d3f 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTimeTypeTests.cs @@ -1,5 +1,8 @@ using System.Globalization; -using HotChocolate.Execution; +using System.Text; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime; using NodaTime.Text; @@ -7,149 +10,82 @@ namespace HotChocolate.Types.NodaTime.Tests; public class OffsetDateTimeTypeIntegrationTests { - public static class Schema - { - public class Query - { - public OffsetDateTime Hours - => OffsetDateTime - .FromDateTimeOffset( - new DateTimeOffset( - 2020, - 12, - 31, - 18, - 30, - 13, - TimeSpan.FromHours(2))) - .PlusNanoseconds(1234); - - public OffsetDateTime HoursAndMinutes - => OffsetDateTime - .FromDateTimeOffset( - new DateTimeOffset( - 2020, - 12, - 31, - 18, - 30, - 13, - TimeSpan.FromHours(2) + TimeSpan.FromMinutes(30))) - .PlusNanoseconds(1234); - } - - public class Mutation - { - public OffsetDateTime Test(OffsetDateTime arg) - { - return arg + Duration.FromMinutes(10); - } - } - } - - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - [Fact] - public void QueryReturns() + public void CoerceInputLiteral() { - var result = _testExecutor.Execute("query { test: hours }"); - - Assert.Equal("2020-12-31T18:30:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateTimeType(); + var inputValue = new StringValueNode("2020-12-31T18:30:13+02"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal( + new LocalDateTime(2020, 12, 31, 18, 30, 13).WithOffset(Offset.FromHours(2)), + Assert.IsType<OffsetDateTime>(runtimeValue)); } [Fact] - public void QueryReturnsWithMinutes() + public void CoerceInputLiteral_Invalid_Value_Throws() { - var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - - Assert.Equal("2020-12-31T18:30:13+02:30", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateTimeType(); + var valueLiteral = new StringValueNode("2020-12-31T18:30:13"); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesVariable() + public void CoerceInputValue() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13+02" } }) - .Build()); - - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateTimeType(); + var inputValue = ParseInputValue("\"2020-12-31T18:30:13+02\""); + var runtimeValue = type.CoerceInputValue(inputValue, null!); + Assert.Equal( + new LocalDateTime(2020, 12, 31, 18, 30, 13).WithOffset(Offset.FromHours(2)), + Assert.IsType<OffsetDateTime>(runtimeValue)); } [Fact] - public void ParsesVariableWithMinutes() + public void CoerceInputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13+02:35" } }) - .Build()); - - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateTimeType(); + var inputValue = ParseInputValue("\"2020-12-31T18:30:13\""); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void DoesntParseAnIncorrectVariable() + public void CoerceOutputValue() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T18:30:13" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new OffsetDateTimeType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(new LocalDateTime(2020, 12, 31, 18, 30, 13).WithOffset(Offset.FromHours(2)), resultValue); + Assert.Equal("2020-12-31T18:30:13+02", resultValue.GetString()); } [Fact] - public void ParsesLiteral() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02\") }") - .Build()); - - Assert.Equal("2020-12-31T18:40:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateTimeType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue("2020-12-31T18:30:13+02", resultValue); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesLiteralWithMinutes() + public void ValueToLiteral() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13+02:35\") }") - .Build()); - - Assert.Equal("2020-12-31T18:40:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateTimeType(); + var valueLiteral = type.ValueToLiteral(new LocalDateTime(2020, 12, 31, 18, 30, 13).WithOffset(Offset.FromHours(2))); + Assert.Equal("\"2020-12-31T18:30:13+02\"", valueLiteral.ToString()); } [Fact] - public void DoesntParseIncorrectLiteral() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T18:30:13\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to OffsetDateTime", - result.ExpectOperationResult().Errors![0].Message); + var type = new OffsetDateTimeType(); + Action error = () => type.ValueToLiteral("2020-12-31T18:30:13+02"); + Assert.Throws<LeafCoercionException>(error); } [Fact] @@ -189,4 +125,10 @@ public void OffsetDateTimeType_DescriptionUnknownPatterns_MatchesSnapshot() offsetDateTimeType.Description.MatchInlineSnapshot( "A local date and time in a particular calendar system, combined with an offset from UTC."); } + + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); + } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeFullRoundtripIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeFullRoundtripIntegrationTests.cs deleted file mode 100644 index bec9334efa4..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeFullRoundtripIntegrationTests.cs +++ /dev/null @@ -1,107 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class OffsetDateTypeFullRoundtripIntegrationTests -{ - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<OffsetDateTypeIntegrationTests.Schema.Query>() - .AddMutationType<OffsetDateTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(OffsetDateType)) - .AddType(new OffsetDateType(OffsetDatePattern.FullRoundtrip)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: hours }"); - - Assert.Equal("2020-12-31+02 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsWithMinutes() - { - var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - - Assert.Equal("2020-12-31+02:35 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDate!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31+02 (Gregorian)" } }) - .Build()); - - Assert.Equal("2020-12-31+02 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariableWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDate!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31+02:35 (Gregorian)" } }) - .Build()); - - Assert.Equal("2020-12-31+02:35 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDate!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31 (Gregorian)" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31+02 (Gregorian)\") }") - .Build()); - - Assert.Equal("2020-12-31+02 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesLiteralWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31+02:35 (Gregorian)\") }") - .Build()); - - Assert.Equal("2020-12-31+02:35 (Gregorian)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31 (Gregorian)\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to OffsetDate", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeTests.cs index 79232fa3ca6..ae90c87db5f 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetDateTypeTests.cs @@ -1,5 +1,8 @@ using System.Globalization; -using HotChocolate.Execution; +using System.Text; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime; using NodaTime.Text; @@ -7,116 +10,82 @@ namespace HotChocolate.Types.NodaTime.Tests; public class OffsetDateTypeIntegrationTests { - public static class Schema - { - public class Query - { - public OffsetDate Hours - => new OffsetDate( - LocalDate.FromDateTime(new DateTime(2020, 12, 31, 18, 30, 13)), - Offset.FromHours(2)).WithCalendar(CalendarSystem.Gregorian); - - public OffsetDate HoursAndMinutes - => new OffsetDate( - LocalDate.FromDateTime(new DateTime(2020, 12, 31, 18, 30, 13)), - Offset.FromHoursAndMinutes(2, 35)).WithCalendar(CalendarSystem.Gregorian); - } - - public class Mutation - { - public OffsetDate Test(OffsetDate arg) => arg; - } - } - - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - [Fact] - public void QueryReturns() + public void CoerceInputLiteral() { - var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("2020-12-31+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateType(); + var inputValue = new StringValueNode("2020-12-31+02"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal( + new OffsetDate(new LocalDate(2020, 12, 31), Offset.FromHours(2)), + Assert.IsType<OffsetDate>(runtimeValue)); } [Fact] - public void QueryReturnsWithMinutes() + public void CoerceInputLiteral_Invalid_Value_Throws() { - var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("2020-12-31+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateType(); + var valueLiteral = new StringValueNode("2020-12-31"); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesVariable() + public void CoerceInputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDate!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31+02" } }) - .Build()); - Assert.Equal("2020-12-31+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateType(); + var inputValue = ParseInputValue("\"2020-12-31+02\""); + var runtimeValue = type.CoerceInputValue(inputValue, null!); + Assert.Equal( + new OffsetDate(new LocalDate(2020, 12, 31), Offset.FromHours(2)), + Assert.IsType<OffsetDate>(runtimeValue)); } [Fact] - public void ParsesVariableWithMinutes() + public void CoerceInputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDate!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31+02:35" } }) - .Build()); - Assert.Equal("2020-12-31+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateType(); + var inputValue = ParseInputValue("\"2020-12-31\""); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void DoesntParseAnIncorrectVariable() + public void CoerceOutputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetDate!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31" } }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new OffsetDateType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(new OffsetDate(new LocalDate(2020, 12, 31), Offset.FromHours(2)), resultValue); + Assert.Equal("2020-12-31+02", resultValue.GetString()); } [Fact] - public void ParsesLiteral() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31+02\") }") - .Build()); - Assert.Equal("2020-12-31+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue("2020-12-31+02", resultValue); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesLiteralWithMinutes() + public void ValueToLiteral() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31+02:35\") }") - .Build()); - Assert.Equal("2020-12-31+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetDateType(); + var valueLiteral = type.ValueToLiteral(new OffsetDate(new LocalDate(2020, 12, 31), Offset.FromHours(2))); + Assert.Equal("\"2020-12-31+02\"", valueLiteral.ToString()); } [Fact] - public void DoesntParseIncorrectLiteral() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31\") }") - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to OffsetDate", - result.ExpectOperationResult().Errors![0].Message); + var type = new OffsetDateType(); + Action error = () => type.ValueToLiteral("2020-12-31+02"); + Assert.Throws<LeafCoercionException>(error); } [Fact] @@ -156,4 +125,10 @@ public void OffsetDateType_DescriptionUnknownPatterns_MatchesSnapshot() offsetDateType.Description.MatchInlineSnapshot( "A combination of a LocalDate and an Offset, to represent a date at a specific offset from UTC but without any time-of-day information."); } + + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); + } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeExtendedIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeExtendedIntegrationTests.cs deleted file mode 100644 index 18bc3d6beb4..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeExtendedIntegrationTests.cs +++ /dev/null @@ -1,107 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class OffsetTimeTypeExtendedIntegrationTests -{ - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<OffsetTimeTypeIntegrationTests.Schema.Query>() - .AddMutationType<OffsetTimeTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(OffsetTimeType)) - .AddType(new OffsetTimeType(OffsetTimePattern.ExtendedIso)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: hours }"); - - Assert.Equal("18:30:13.010011234+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsWithMinutes() - { - var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "18:30:13.010011234+02" } }) - .Build()); - - Assert.Equal("18:30:13.010011234+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariableWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "18:30:13.010011234+02:35" } }) - .Build()); - - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "18:30:13.010011234" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"18:30:13.010011234+02\") }") - .Build()); - - Assert.Equal("18:30:13.010011234+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesLiteralWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"18:30:13.010011234+02:35\") }") - .Build()); - - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"18:30:13.010011234\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to OffsetTime", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeRfc3339IntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeRfc3339IntegrationTests.cs deleted file mode 100644 index 66f6d28bcff..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeRfc3339IntegrationTests.cs +++ /dev/null @@ -1,99 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class OffsetTimeTypeRfc3339IntegrationTests -{ - private readonly IRequestExecutor _testExecutor = SchemaBuilder.New() - .AddQueryType<OffsetTimeTypeIntegrationTests.Schema.Query>() - .AddMutationType<OffsetTimeTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(OffsetTimeType)) - .AddType(new OffsetTimeType(OffsetTimePattern.Rfc3339)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("18:30:13.010011234+02:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsWithMinutes() - { - var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "18:30:13.010011234+02:00" } }) - .Build()); - - Assert.Equal("18:30:13.010011234+02:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariableWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "18:30:13.010011234+02:35" } }) - .Build()); - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "18:30:13.010011234+02" } }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"18:30:13.010011234+02:00\") }") - .Build()); - Assert.Equal("18:30:13.010011234+02:00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesLiteralWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"18:30:13.010011234+02:35\") }") - .Build()); - Assert.Equal("18:30:13.010011234+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"18:30:13.010011234+02\") }") - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to OffsetTime", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeTests.cs index 0ce34098950..b194a19a4d8 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTimeTypeTests.cs @@ -1,5 +1,8 @@ using System.Globalization; -using HotChocolate.Execution; +using System.Text; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime; using NodaTime.Text; @@ -7,121 +10,82 @@ namespace HotChocolate.Types.NodaTime.Tests; public class OffsetTimeTypeIntegrationTests { - public static class Schema - { - public class Query - { - public OffsetTime Hours => - new OffsetTime( - LocalTime - .FromHourMinuteSecondMillisecondTick(18, 30, 13, 10, 100) - .PlusNanoseconds(1234), - Offset.FromHours(2)); - - public OffsetTime HoursAndMinutes => - new OffsetTime( - LocalTime - .FromHourMinuteSecondMillisecondTick(18, 30, 13, 10, 100) - .PlusNanoseconds(1234), - Offset.FromHoursAndMinutes(2, 35)); - } - - public class Mutation - { - public OffsetTime Test(OffsetTime arg) => arg; - } - } - - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - [Fact] - public void QueryReturns() + public void CoerceInputLiteral() { - var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("18:30:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetTimeType(); + var inputValue = new StringValueNode("18:30:13+02"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal( + new OffsetTime(new LocalTime(18, 30, 13), Offset.FromHours(2)), + Assert.IsType<OffsetTime>(runtimeValue)); } [Fact] - public void QueryReturnsWithMinutes() + public void CoerceInputLiteral_Invalid_Value_Throws() { - var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("18:30:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetTimeType(); + var valueLiteral = new StringValueNode("18:30:13"); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesVariable() + public void CoerceInputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "18:30:13+02" } }) - .Build()); - Assert.Equal("18:30:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetTimeType(); + var inputValue = ParseInputValue("\"18:30:13+02\""); + var runtimeValue = type.CoerceInputValue(inputValue, null!); + Assert.Equal( + new OffsetTime(new LocalTime(18, 30, 13), Offset.FromHours(2)), + Assert.IsType<OffsetTime>(runtimeValue)); } [Fact] - public void ParsesVariableWithMinutes() + public void CoerceInputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "18:30:13+02:35" } }) - .Build()); - Assert.Equal("18:30:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetTimeType(); + var inputValue = ParseInputValue("\"18:30:13\""); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void DoesntParseAnIncorrectVariable() + public void CoerceOutputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: OffsetTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "18:30:13" } }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new OffsetTimeType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(new OffsetTime(new LocalTime(18, 30, 13), Offset.FromHours(2)), resultValue); + Assert.Equal("18:30:13+02", resultValue.GetString()); } [Fact] - public void ParsesLiteral() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"18:30:13+02\") }") - .Build()); - Assert.Equal("18:30:13+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetTimeType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue("18:30:13+02", resultValue); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesLiteralWithMinutes() + public void ValueToLiteral() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"18:30:13+02:35\") }") - .Build()); - Assert.Equal("18:30:13+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetTimeType(); + var valueLiteral = type.ValueToLiteral(new OffsetTime(new LocalTime(18, 30, 13), Offset.FromHours(2))); + Assert.Equal("\"18:30:13+02\"", valueLiteral.ToString()); } [Fact] - public void DoesntParseIncorrectLiteral() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"18:30:13\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to OffsetTime", - result.ExpectOperationResult().Errors![0].Message); + var type = new OffsetTimeType(); + Action error = () => type.ValueToLiteral("18:30:13+02"); + Assert.Throws<LeafCoercionException>(error); } [Fact] @@ -161,4 +125,10 @@ public void OffsetTimeType_DescriptionUnknownPatterns_MatchesSnapshot() offsetTimeType.Description.MatchInlineSnapshot( "A combination of a LocalTime and an Offset, to represent a time-of-day at a specific offset from UTC but without any date information."); } + + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); + } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeGeneralInvariantWithoutZIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeGeneralInvariantWithoutZIntegrationTests.cs deleted file mode 100644 index 1474c1efa91..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeGeneralInvariantWithoutZIntegrationTests.cs +++ /dev/null @@ -1,133 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class OffsetTypeGeneralInvariantWithoutZIntegrationTests -{ - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<OffsetTypeIntegrationTests.Schema.Query>() - .AddMutationType<OffsetTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(OffsetType)) - .AddType(new OffsetType(OffsetPattern.GeneralInvariant)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsWithMinutes() - { - var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsWithZ() - { - var result = _testExecutor.Execute("query { test: zOffset }"); - Assert.Equal("+00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Offset!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "+02" } }) - .Build()); - Assert.Equal("+03:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariableWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Offset!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "+02:35" } }) - .Build()); - Assert.Equal("+03:40", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Offset!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "18:30:13+02" } }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"+02\") }") - .Build()); - - Assert.Equal("+03:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesLiteralWithMinutes() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"+02:35\") }") - .Build()); - Assert.Equal("+03:40", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesLiteralWithZero() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"+00\") }") - .Build()); - Assert.Equal("+01:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseLiteralWithZ() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"Z\") }") - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to Offset", - result.ExpectOperationResult().Errors![0].Message); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"18:30:13+02\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to Offset", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeTests.cs index 7b717fdbf47..b45e51ccd06 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/OffsetTypeTests.cs @@ -1,5 +1,8 @@ using System.Globalization; -using HotChocolate.Execution; +using System.Text; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime; using NodaTime.Text; @@ -7,127 +10,98 @@ namespace HotChocolate.Types.NodaTime.Tests; public class OffsetTypeIntegrationTests { - public static class Schema - { - public class Query - { - public Offset Hours => Offset.FromHours(2); - public Offset HoursAndMinutes => Offset.FromHoursAndMinutes(2, 35); - public Offset ZOffset => Offset.Zero; - } - - public class Mutation - { - public Offset Test(Offset arg) - => arg + Offset.FromHoursAndMinutes(1, 5); - } - } - - private readonly IRequestExecutor _testExecutor = SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - [Fact] - public void QueryReturns() + public void CoerceInputLiteral() { - var result = _testExecutor.Execute("query { test: hours }"); - Assert.Equal("+02", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetType(); + var inputValue = new StringValueNode("+02"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal(Offset.FromHours(2), Assert.IsType<Offset>(runtimeValue)); } [Fact] - public void QueryReturnsWithMinutes() + public void CoerceInputLiteral_With_Z() { - var result = _testExecutor.Execute("query { test: hoursAndMinutes }"); - Assert.Equal("+02:35", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetType(); + var inputValue = new StringValueNode("Z"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal(Offset.Zero, Assert.IsType<Offset>(runtimeValue)); } [Fact] - public void QueryReturnsWithZ() + public void CoerceInputLiteral_Invalid_Value_Throws() { - var result = _testExecutor.Execute("query { test: zOffset }"); - Assert.Equal("Z", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetType(); + var valueLiteral = new StringValueNode("18:30:13+02"); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesVariable() + public void CoerceInputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Offset!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "+02" } }) - .Build()); - Assert.Equal("+03:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetType(); + var inputValue = ParseInputValue("\"+02\""); + var runtimeValue = type.CoerceInputValue(inputValue, null!); + Assert.Equal(Offset.FromHours(2), Assert.IsType<Offset>(runtimeValue)); } [Fact] - public void ParsesVariableWithMinutes() + public void CoerceInputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Offset!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "+02:35" } }) - .Build()); - Assert.Equal("+03:40", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetType(); + var inputValue = ParseInputValue("\"18:30:13+02\""); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void DoesntParseAnIncorrectVariable() + public void CoerceOutputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Offset!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "18:30:13+02" } }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new OffsetType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(Offset.FromHours(2), resultValue); + Assert.Equal("+02", resultValue.GetString()); } [Fact] - public void ParsesLiteral() + public void CoerceOutputValue_Zero() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"+02\") }") - .Build()); - Assert.Equal("+03:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(Offset.Zero, resultValue); + Assert.Equal("Z", resultValue.GetString()); } [Fact] - public void ParsesLiteralWithMinutes() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"+02:35\") }") - .Build()); - Assert.Equal("+03:40", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue("+02", resultValue); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesLiteralWithZ() + public void ValueToLiteral() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"Z\") }") - .Build()); - Assert.Equal("+01:05", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new OffsetType(); + var valueLiteral = type.ValueToLiteral(Offset.FromHours(2)); + Assert.Equal("\"+02\"", valueLiteral.ToString()); } [Fact] - public void DoesntParseIncorrectLiteral() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"18:30:13+02\") }") - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to Offset", - result.ExpectOperationResult().Errors![0].Message); + var type = new OffsetType(); + Action error = () => type.ValueToLiteral("+02"); + Assert.Throws<LeafCoercionException>(error); } [Fact] @@ -171,4 +145,10 @@ An offset from UTC in seconds. A positive value means that the local time is ahead of UTC (e.g. for Europe); a negative value means that the local time is behind UTC (e.g. for America). """); } + + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); + } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeNormalizingIsoIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeNormalizingIsoIntegrationTests.cs deleted file mode 100644 index 7b8111df88b..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeNormalizingIsoIntegrationTests.cs +++ /dev/null @@ -1,70 +0,0 @@ -using HotChocolate.Execution; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class PeriodTypeNormalizingIsoIntegrationTests -{ - private readonly IRequestExecutor _testExecutor = SchemaBuilder.New() - .AddQueryType<PeriodTypeIntegrationTests.Schema.Query>() - .AddMutationType<PeriodTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(PeriodType)) - .AddType(new PeriodType(PeriodPattern.NormalizingIso)) - .Create() - .MakeExecutable(); - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: one }"); - Assert.Equal("P-17DT-23H-59M-59.9999861S", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Period!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "P-17DT-23H-59M-59.9999861S" } }) - .Build()); - Assert.Equal("P-18DT-9M-59.9999861S", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Period!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "-P-17DT-23H-59M-59.9999861S" } }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"P-17DT-23H-59M-59.9999861S\") }") - .Build()); - Assert.Equal("P-18DT-9M-59.9999861S", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"-P-17DT-23H-59M-59.9999861S\") }") - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to Period", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeTests.cs index 47ce66fd346..6fa1dadc50f 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/PeriodTypeTests.cs @@ -1,86 +1,89 @@ -using HotChocolate.Execution; +using System.Text; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime; namespace HotChocolate.Types.NodaTime.Tests; public class PeriodTypeIntegrationTests { - public static class Schema + [Fact] + public void CoerceInputLiteral() { - public class Query - { - public Period One => - Period.FromWeeks(-3) + Period.FromDays(3) + Period.FromTicks(139); - } + var type = new PeriodType(); + var inputValue = new StringValueNode("P-3W15DT139t"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal( + Period.FromWeeks(-3) + Period.FromDays(15) + Period.FromTicks(139), + Assert.IsType<Period>(runtimeValue)); + } - public class Mutation - { - public Period Test(Period arg) - => arg + Period.FromMinutes(-10); - } + [Fact] + public void CoerceInputLiteral_Invalid_Value_Throws() + { + var type = new PeriodType(); + var valueLiteral = new StringValueNode("-3W3DT-10M139t"); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); + [Fact] + public void CoerceInputValue() + { + var type = new PeriodType(); + var inputValue = ParseInputValue("\"P-3W15DT139t\""); + var runtimeValue = type.CoerceInputValue(inputValue, null!); + Assert.Equal( + Period.FromWeeks(-3) + Period.FromDays(15) + Period.FromTicks(139), + Assert.IsType<Period>(runtimeValue)); + } [Fact] - public void QueryReturns() + public void CoerceInputValue_Invalid_Value_Throws() { - var result = _testExecutor.Execute("query { test: one }"); - Assert.Equal("P-3W3DT139t", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new PeriodType(); + var inputValue = ParseInputValue("\"-3W3DT-10M139t\""); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesVariable() + public void CoerceOutputValue() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Period!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "P-3W15DT139t" } }) - .Build()); - Assert.Equal("P-3W15DT-10M139t", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new PeriodType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue(Period.FromWeeks(-3) + Period.FromDays(3) + Period.FromTicks(139), resultValue); + Assert.Equal("P-3W3DT139t", resultValue.GetString()); } [Fact] - public void DoesntParseAnIncorrectVariable() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: Period!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "-3W3DT-10M139t" } }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new PeriodType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue("P-3W3DT139t", resultValue); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesLiteral() + public void ValueToLiteral() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"P-3W15DT139t\") }") - .Build()); - Assert.Equal("P-3W15DT-10M139t", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new PeriodType(); + var valueLiteral = type.ValueToLiteral(Period.FromWeeks(-3) + Period.FromDays(3) + Period.FromTicks(139)); + Assert.Equal("\"P-3W3DT139t\"", valueLiteral.ToString()); } [Fact] - public void DoesntParseIncorrectLiteral() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"-3W3DT-10M139t\") }") - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to Period", - result.ExpectOperationResult().Errors![0].Message); + var type = new PeriodType(); + Action error = () => type.ValueToLiteral("P-3W3DT139t"); + Assert.Throws<LeafCoercionException>(error); } [Fact] @@ -89,4 +92,10 @@ public void PatternEmptyThrowSchemaException() static object Call() => new PeriodType([]); Assert.Throws<SchemaException>(Call); } + + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); + } } diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/TestSchema.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/TestSchema.cs new file mode 100644 index 00000000000..313dabfd57b --- /dev/null +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/TestSchema.cs @@ -0,0 +1,27 @@ +using NodaTime; + +namespace HotChocolate.Types.NodaTime.Tests; + +public static class TestSchema +{ + public class Query + { + public ZonedDateTime Rome + => new ZonedDateTime( + LocalDateTime.FromDateTime(new DateTime(2020, 12, 31, 18, 30, 13)), + DateTimeZoneProviders.Tzdb["Asia/Kathmandu"], + Offset.FromHoursAndMinutes(5, 45)); + + public ZonedDateTime Utc + => new ZonedDateTime( + LocalDateTime.FromDateTime(new DateTime(2020, 12, 31, 18, 30, 13)), + DateTimeZoneProviders.Tzdb["UTC"], + Offset.FromHours(0)); + } + + public class Mutation + { + public ZonedDateTime Test(ZonedDateTime arg) + => arg + Duration.FromMinutes(10); + } +} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeCustomIntegrationTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeCustomIntegrationTests.cs deleted file mode 100644 index 7486c6ee2a7..00000000000 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeCustomIntegrationTests.cs +++ /dev/null @@ -1,125 +0,0 @@ -using HotChocolate.Execution; -using NodaTime; -using NodaTime.Text; - -namespace HotChocolate.Types.NodaTime.Tests; - -public class ZonedDateTimeTypeCustomIntegrationTests -{ - private readonly IRequestExecutor _testExecutor; - - public ZonedDateTimeTypeCustomIntegrationTests() - { - var pattern = ZonedDateTimePattern.CreateWithInvariantCulture( - "uuuu'-'MM'-'dd'T'HH':'mm':'ss' 'z' '(o<g>)", - DateTimeZoneProviders.Tzdb); - - _testExecutor = SchemaBuilder.New() - .AddQueryType<ZonedDateTimeTypeIntegrationTests.Schema.Query>() - .AddMutationType<ZonedDateTimeTypeIntegrationTests.Schema.Mutation>() - .AddNodaTime(typeof(ZonedDateTimeType)) - .AddType(new ZonedDateTimeType(pattern)) - .Create() - .MakeExecutable(); - } - - [Fact] - public void QueryReturns() - { - var result = _testExecutor.Execute("query { test: rome }"); - Assert.Equal( - "2020-12-31T18:30:13 Asia/Kathmandu (+05:45)", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void QueryReturnsUtc() - { - var result = _testExecutor.Execute("query { test: utc }"); - Assert.Equal("2020-12-31T18:30:13 UTC (+00)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: ZonedDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T19:30:13 Asia/Kathmandu (+05:45)" } }) - .Build()); - - Assert.Equal( - "2020-12-31T19:40:13 Asia/Kathmandu (+05:45)", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesVariableWithUTC() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: ZonedDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T19:30:13 UTC (+00)" } }) - .Build()); - - Assert.Equal("2020-12-31T19:40:13 UTC (+00)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseAnIncorrectVariable() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation($arg: ZonedDateTime!) { test(arg: $arg) }") - .SetVariableValues(new Dictionary<string, object?> { { "arg", "2020-12-31T19:30:13 (UTC)" } }) - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - } - - [Fact] - public void ParsesLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument( - """ - mutation { - test(arg: "2020-12-31T19:30:13 Asia/Kathmandu (+05:45)") - } - """) - .Build()); - - Assert.Equal( - "2020-12-31T19:40:13 Asia/Kathmandu (+05:45)", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void ParsesLiteralWithUtc() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T19:30:13 UTC (+00)\") }") - .Build()); - - Assert.Equal("2020-12-31T19:40:13 UTC (+00)", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); - } - - [Fact] - public void DoesntParseIncorrectLiteral() - { - var result = _testExecutor - .Execute(OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T19:30:13 (UTC)\") }") - .Build()); - - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to ZonedDateTime", - result.ExpectOperationResult().Errors![0].Message); - } -} diff --git a/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeTests.cs b/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeTests.cs index 0782923e2bd..575f879dee0 100644 --- a/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeTests.cs +++ b/src/HotChocolate/Core/test/Types.NodaTime.Tests/ZonedDateTimeTypeTests.cs @@ -1,5 +1,8 @@ using System.Globalization; -using HotChocolate.Execution; +using System.Text; +using System.Text.Json; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NodaTime; using NodaTime.Text; @@ -7,149 +10,111 @@ namespace HotChocolate.Types.NodaTime.Tests; public class ZonedDateTimeTypeIntegrationTests { - public static class Schema + [Fact] + public void CoerceInputLiteral() { - public class Query - { - public ZonedDateTime Rome => - new ZonedDateTime( - LocalDateTime.FromDateTime(new DateTime(2020, 12, 31, 18, 30, 13)), - DateTimeZoneProviders.Tzdb["Asia/Kathmandu"], - Offset.FromHoursAndMinutes(5, 45)); - - public ZonedDateTime Utc => - new ZonedDateTime( - LocalDateTime.FromDateTime(new DateTime(2020, 12, 31, 18, 30, 13)), - DateTimeZoneProviders.Tzdb["UTC"], - Offset.FromHours(0)); - } - - public class Mutation - { - public ZonedDateTime Test(ZonedDateTime arg) - { - return arg + Duration.FromMinutes(10); - } - } + var type = new ZonedDateTimeType(); + var inputValue = new StringValueNode("2020-12-31T18:30:13 Asia/Kathmandu +05:45"); + var runtimeValue = type.CoerceInputLiteral(inputValue); + Assert.Equal( + new ZonedDateTime( + LocalDateTime.FromDateTime(new DateTime(2020, 12, 31, 18, 30, 13)), + DateTimeZoneProviders.Tzdb["Asia/Kathmandu"], + Offset.FromHoursAndMinutes(5, 45)), + Assert.IsType<ZonedDateTime>(runtimeValue)); } - private readonly IRequestExecutor _testExecutor = - SchemaBuilder.New() - .AddQueryType<Schema.Query>() - .AddMutationType<Schema.Mutation>() - .AddNodaTime() - .Create() - .MakeExecutable(); - [Fact] - public void QueryReturns() + public void CoerceInputLiteral_Utc() { - var result = _testExecutor.Execute("query { test: rome }"); + var type = new ZonedDateTimeType(); + var inputValue = new StringValueNode("2020-12-31T18:30:13 UTC +00"); + var runtimeValue = type.CoerceInputLiteral(inputValue); Assert.Equal( - "2020-12-31T18:30:13 Asia/Kathmandu +05:45", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + new ZonedDateTime( + LocalDateTime.FromDateTime(new DateTime(2020, 12, 31, 18, 30, 13)), + DateTimeZoneProviders.Tzdb["UTC"], + Offset.FromHours(0)), + Assert.IsType<ZonedDateTime>(runtimeValue)); } [Fact] - public void QueryReturnsUtc() + public void CoerceInputLiteral_Invalid_Value_Throws() { - var result = _testExecutor.Execute("query { test: utc }"); - Assert.Equal( - "2020-12-31T18:30:13 UTC +00", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new ZonedDateTimeType(); + var valueLiteral = new StringValueNode("2020-12-31T19:30:13 UTC"); + Action error = () => type.CoerceInputLiteral(valueLiteral); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesVariable() + public void CoerceInputValue() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: ZonedDateTime!) { test(arg: $arg) }") - .SetVariableValues( - new Dictionary<string, object?> - { - { "arg", "2020-12-31T19:30:13 Asia/Kathmandu +05:45" } - }) - .Build()); + var type = new ZonedDateTimeType(); + var inputValue = ParseInputValue("\"2020-12-31T18:30:13 Asia/Kathmandu +05:45\""); + var runtimeValue = type.CoerceInputValue(inputValue, null!); Assert.Equal( - "2020-12-31T19:40:13 Asia/Kathmandu +05:45", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + new ZonedDateTime( + LocalDateTime.FromDateTime(new DateTime(2020, 12, 31, 18, 30, 13)), + DateTimeZoneProviders.Tzdb["Asia/Kathmandu"], + Offset.FromHoursAndMinutes(5, 45)), + Assert.IsType<ZonedDateTime>(runtimeValue)); } [Fact] - public void ParsesVariableWithUtc() + public void CoerceInputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: ZonedDateTime!) { test(arg: $arg) }") - .SetVariableValues( - new Dictionary<string, object?> - { - { "arg", "2020-12-31T19:30:13 UTC +00" } - }) - .Build()); - Assert.Equal( - "2020-12-31T19:40:13 UTC +00", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new ZonedDateTimeType(); + var inputValue = ParseInputValue("\"2020-12-31T19:30:13 UTC\""); + Action error = () => type.CoerceInputValue(inputValue, null!); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void DoesntParseAnIncorrectVariable() + public void CoerceOutputValue() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation($arg: ZonedDateTime!) { test(arg: $arg) }") - .SetVariableValues( - new Dictionary<string, object?> - { - { "arg", "2020-12-31T19:30:13 UTC" } - }) - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); + var type = new ZonedDateTimeType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + type.CoerceOutputValue( + new ZonedDateTime( + LocalDateTime.FromDateTime(new DateTime(2020, 12, 31, 18, 30, 13)), + DateTimeZoneProviders.Tzdb["UTC"], + Offset.FromHours(0)), + resultValue); + Assert.Equal("2020-12-31T18:30:13 UTC +00", resultValue.GetString()); } [Fact] - public void ParsesLiteral() + public void CoerceOutputValue_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation{test(arg:\"2020-12-31T19:30:13 Asia/Kathmandu +05:45\")}") - .Build()); - Assert.Equal( - "2020-12-31T19:40:13 Asia/Kathmandu +05:45", - result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new ZonedDateTimeType(); + var operation = CommonTestExtensions.CreateOperation(); + var resultDocument = new ResultDocument(operation, 0); + var resultValue = resultDocument.Data.GetProperty("first"); + Action error = () => type.CoerceOutputValue("2020-12-31T18:30:13 UTC +00", resultValue); + Assert.Throws<LeafCoercionException>(error); } [Fact] - public void ParsesLiteralWithUtc() + public void ValueToLiteral() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T19:30:13 UTC +00\") }") - .Build()); - Assert.Equal("2020-12-31T19:40:13 UTC +00", result.ExpectOperationResult().UnwrapData().GetProperty("test").GetString()); + var type = new ZonedDateTimeType(); + var valueLiteral = type.ValueToLiteral( + new ZonedDateTime( + LocalDateTime.FromDateTime(new DateTime(2020, 12, 31, 18, 30, 13)), + DateTimeZoneProviders.Tzdb["UTC"], + Offset.FromHours(0))); + Assert.Equal("\"2020-12-31T18:30:13 UTC +00\"", valueLiteral.ToString()); } [Fact] - public void DoesntParseIncorrectLiteral() + public void ValueToLiteral_Invalid_Value_Throws() { - var result = _testExecutor - .Execute( - OperationRequestBuilder.New() - .SetDocument("mutation { test(arg: \"2020-12-31T19:30:13 UTC\") }") - .Build()); - Assert.Null(result.ExpectOperationResult().Data); - Assert.Single(result.ExpectOperationResult().Errors!); - Assert.Null(result.ExpectOperationResult().Errors![0].Code); - Assert.Equal( - "Unable to deserialize string to ZonedDateTime", - result.ExpectOperationResult().Errors![0].Message); + var type = new ZonedDateTimeType(); + Action error = () => type.ValueToLiteral("2020-12-31T18:30:13 UTC +00"); + Assert.Throws<LeafCoercionException>(error); } [Fact] @@ -198,4 +163,10 @@ A LocalDateTime in a specific time zone and with a particular offset to distingu A ZonedDateTime is global, in that it maps to a single Instant. """); } + + private static JsonElement ParseInputValue(string sourceText) + { + var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(sourceText)); + return JsonElement.ParseValue(ref reader); + } } From d15a885e920c1373fe69b5fa54688bf2e8aa410d Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 13 Jan 2026 22:34:01 +0100 Subject: [PATCH 096/144] Fixed more tests --- .../Core/src/Types/Execution/ErrorHelper.cs | 11 +--------- .../OperationCompiler.CoerceArgumentValues.cs | 4 +--- .../Core/src/Types/Types/InputParser.cs | 4 ++-- .../ScalarExecutionErrorTests.cs | 9 +++++++- ...ests.InputType_Literal_CannotBeParsed.snap | 22 +++++++++---------- ...putType_Variable_CannotBeDeserialized.snap | 4 ++-- ...OutputType_ClrValue_CannotBeConverted.snap | 2 +- ...ts.OutputType_ClrValue_CannotBeParsed.snap | 6 ++--- 8 files changed, 27 insertions(+), 35 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs index 8f742be98be..6c505b6762c 100644 --- a/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/ErrorHelper.cs @@ -17,16 +17,7 @@ public static IError ArgumentNonNullError( ErrorHelper_ArgumentNonNullError_Message, argument.Name.Value) .AddLocation(argument) - .SetExtension("errorPath", validationResult.Path) - .Build(); - } - - public static IError ArgumentValueIsInvalid( - ArgumentNode? argument, - GraphQLException exception) - { - return ErrorBuilder.FromError(exception.Errors[0]) - .TryAddLocation(argument) + .SetInputPath(validationResult.Path) .Build(); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs index f520c494b78..f10ae9343a6 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.CoerceArgumentValues.cs @@ -76,9 +76,7 @@ private ArgumentValue CreateArgumentValue( } catch (LeafCoercionException ex) { - return new ArgumentValue( - argument, - ErrorHelper.ArgumentValueIsInvalid(argumentValue, ex)); + return new ArgumentValue(argument, ex.Errors[0]); } } diff --git a/src/HotChocolate/Core/src/Types/Types/InputParser.cs b/src/HotChocolate/Core/src/Types/Types/InputParser.cs index d069aa1050d..8facaebdbd3 100644 --- a/src/HotChocolate/Core/src/Types/Types/InputParser.cs +++ b/src/HotChocolate/Core/src/Types/Types/InputParser.cs @@ -308,7 +308,7 @@ private static object ParseLeaf( } var error = ErrorBuilder.FromError(ex.Errors[0]) - .SetPath(path) + .SetInputPath(path) .SetCoordinate(field.Coordinate) .SetExtension("fieldType", type.Name) .Build(); @@ -600,7 +600,7 @@ private static object DeserializeLeaf( } var error = ErrorBuilder.FromError(ex.Errors[0]) - .SetPath(path) + .SetInputPath(path) .SetCoordinate(field.Coordinate) .SetExtension("fieldType", type.Name) .Build(); diff --git a/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs b/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs index 1af774f40ab..4c880dfce92 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/ScalarExecutionErrorTests.cs @@ -203,7 +203,14 @@ protected override string OnCoerceInputValue(JsonElement inputValue, IFeaturePro } protected override void OnCoerceOutputValue(string runtimeValue, ResultElement resultValue) - => resultValue.SetStringValue(runtimeValue); + { + if (string.IsNullOrWhiteSpace(runtimeValue)) + { + throw new LeafCoercionException("Not a valid name.", this); + } + + resultValue.SetStringValue(runtimeValue); + } protected override StringValueNode OnValueToLiteral(string runtimeValue) => new(runtimeValue); diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.InputType_Literal_CannotBeParsed.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.InputType_Literal_CannotBeParsed.snap index a1f1c833638..52a3d1fd03a 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.InputType_Literal_CannotBeParsed.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.InputType_Literal_CannotBeParsed.snap @@ -1,22 +1,20 @@ { "errors": [ { - "message": "The specified argument value does not match the argument type.", - "locations": [ - { - "line": 1, - "column": 22 - } - ], + "message": "Not a valid name.", "path": [ "nameToString" ], "extensions": { - "argument": "name", - "argumentValue": "\" \"", - "locationType": "Name", - "specifiedBy": "https://spec.graphql.org/October2021/#sec-Values-of-Correct-Type" + "inputPath": [ + "name" + ], + "coordinate": "Query.nameToString(name:)", + "fieldType": "Name" } } - ] + ], + "data": { + "nameToString": null + } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.InputType_Variable_CannotBeDeserialized.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.InputType_Variable_CannotBeDeserialized.snap index 9b0803c748a..2a1e241d870 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.InputType_Variable_CannotBeDeserialized.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.InputType_Variable_CannotBeDeserialized.snap @@ -1,7 +1,7 @@ -{ +{ "errors": [ { - "message": "Foo cannot deserialize the given value.", + "message": "StringValue is not a.", "path": [ "a" ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeConverted.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeConverted.snap index f4c607274eb..c34c581f0fa 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeConverted.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeConverted.snap @@ -1,7 +1,7 @@ { "errors": [ { - "message": "Name cannot serialize the given value.", + "message": "Not a valid name.", "path": [ "stringToName" ], diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeParsed.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeParsed.snap index 0f73e3da82c..2d49b3ac36c 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeParsed.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/ScalarExecutionErrorTests.OutputType_ClrValue_CannotBeParsed.snap @@ -1,14 +1,12 @@ { "errors": [ { - "message": "Foo cannot serialize the given value.", + "message": "StringValue is not a.", "path": [ "stringToFoo" ], "extensions": { - "code": "EXEC_INVALID_LEAF_VALUE", - "actualValue": " ", - "actualType": "System.String" + "code": "EXEC_INVALID_LEAF_VALUE" } } ], From e060c72f5cc6f093baa28e6edaf3e526631a60b4 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 13 Jan 2026 23:10:21 +0100 Subject: [PATCH 097/144] fixed tests --- .../ErrorBuilderExtensions.cs | 13 +- .../Processing/VariableCoercionHelper.cs | 6 +- .../Core/src/Types/Utilities/ThrowHelper.cs | 76 +++---- .../VariableCoercionIntegrationTests.cs | 193 +++++++++++++----- ...tionTests.Invalid_Enum_Value_Provided.snap | 10 +- ...oercionIntegrationTests.Variable_Null.snap | 12 +- .../Integration/Spec/ArgumentCoercionTests.cs | 85 ++++++-- ..._To_NonNullArgument_With_DefaultValue.snap | 4 +- .../Processing/VariableCoercionHelperTests.cs | 41 ++-- 9 files changed, 290 insertions(+), 150 deletions(-) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs b/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs index c269b159a40..a8875943d15 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/ErrorBuilderExtensions.cs @@ -28,11 +28,16 @@ public ErrorBuilder SetCoordinate(SchemaCoordinate coordinate) /// </summary> /// <param name="inputPath">The input path.</param> /// <returns>The error builder.</returns> - public ErrorBuilder SetInputPath(Path inputPath) + public ErrorBuilder SetInputPath(Path? inputPath) { - ArgumentNullException.ThrowIfNull(builder); - - return builder.SetExtension(nameof(inputPath), inputPath); + if (inputPath is null) + { + return builder.RemoveExtension(nameof(inputPath)); + } + else + { + return builder.SetExtension(nameof(inputPath), inputPath); + } } /// <summary> diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs index 6af3155eddb..6698e4a9331 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs @@ -10,15 +10,11 @@ namespace HotChocolate.Execution.Processing; internal sealed class VariableCoercionHelper { private readonly InputParser _inputParser; - private readonly InputFormatter _inputFormatter; - public VariableCoercionHelper(InputParser inputParser, InputFormatter inputFormatter) + public VariableCoercionHelper(InputParser inputParser) { ArgumentNullException.ThrowIfNull(inputParser); - ArgumentNullException.ThrowIfNull(inputFormatter); - _inputParser = inputParser; - _inputFormatter = inputFormatter; } public void CoerceVariableValues( diff --git a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs index b40583af136..3590225cadc 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/ThrowHelper.cs @@ -15,8 +15,8 @@ internal static class ThrowHelper { public static GraphQLException EventMessage_InvalidCast( Type expectedType, - Type messageType) => - new GraphQLException( + Type messageType) + => new GraphQLException( ErrorBuilder.New() .SetMessage( ThrowHelper_EventMessage_InvalidCast, @@ -24,14 +24,14 @@ public static GraphQLException EventMessage_InvalidCast( expectedType.FullName) .Build()); - public static GraphQLException EventMessage_NotFound() => - new GraphQLException( + public static GraphQLException EventMessage_NotFound() + => new GraphQLException( ErrorBuilder.New() .SetMessage(ThrowHelper_EventMessage_NotFound) .Build()); - public static SchemaException SubscribeAttribute_MessageTypeUnspecified(MemberInfo member) => - new SchemaException( + public static SchemaException SubscribeAttribute_MessageTypeUnspecified(MemberInfo member) + => new SchemaException( SchemaErrorBuilder.New() .SetMessage( ThrowHelper_SubscribeAttribute_MessageTypeUnspecified, @@ -40,8 +40,8 @@ public static SchemaException SubscribeAttribute_MessageTypeUnspecified(MemberIn .SetExtension("member", member) .Build()); - public static SchemaException SubscribeAttribute_TopicTypeUnspecified(MemberInfo member) => - new SchemaException( + public static SchemaException SubscribeAttribute_TopicTypeUnspecified(MemberInfo member) + => new SchemaException( SchemaErrorBuilder.New() .SetMessage( ThrowHelper_SubscribeAttribute_TopicTypeUnspecified, @@ -52,8 +52,8 @@ public static SchemaException SubscribeAttribute_TopicTypeUnspecified(MemberInfo public static SchemaException SubscribeAttribute_SubscribeResolverNotFound( MemberInfo member, - string subscribeResolverName) => - new SchemaException( + string subscribeResolverName) + => new SchemaException( SchemaErrorBuilder.New() .SetMessage( ThrowHelper_SubscribeAttribute_SubscribeResolverNotFound, @@ -63,16 +63,16 @@ public static SchemaException SubscribeAttribute_SubscribeResolverNotFound( .SetExtension("member", member) .Build()); - public static SchemaException Convention_UnableToCreateConvention(Type convention) => - new SchemaException( + public static SchemaException Convention_UnableToCreateConvention(Type convention) + => new SchemaException( SchemaErrorBuilder.New() .SetMessage( ThrowHelper_Convention_UnableToCreateConvention, convention.FullName ?? convention.Name) .Build()); - public static SchemaException UsePagingAttribute_NodeTypeUnknown(MemberInfo member) => - new SchemaException( + public static SchemaException UsePagingAttribute_NodeTypeUnknown(MemberInfo member) + => new SchemaException( SchemaErrorBuilder.New() .SetMessage(ThrowHelper_UsePagingAttribute_NodeTypeUnknown) .SetCode(ErrorCodes.Paging.NodeTypeUnknown) @@ -139,8 +139,8 @@ public static SchemaException TypeInitializer_MutationDuplicateErrorName( public static SchemaException NodeAttribute_IdFieldNotFound( Type type, - string idField) => - new SchemaException( + string idField) + => new SchemaException( SchemaErrorBuilder.New() .SetMessage( ThrowHelper_NodeAttribute_IdFieldNotFound, @@ -153,8 +153,8 @@ public static SchemaException Convention_TwoConventionsRegisteredForScope( Type conventionType, IConvention first, IConvention other, - string? scope) => - new SchemaException( + string? scope) + => new SchemaException( SchemaErrorBuilder.New() .SetMessage( ThrowHelper_Convention_TwoConventionsRegisteredForScope, @@ -166,8 +166,8 @@ public static SchemaException Convention_TwoConventionsRegisteredForScope( public static SchemaException Convention_ConventionCouldNotBeCreated( Type conventionType, - string? scope) => - new SchemaException( + string? scope) + => new SchemaException( SchemaErrorBuilder.New() .SetMessage( ThrowHelper_Convention_ConventionCouldNotBeCreated, @@ -175,16 +175,16 @@ public static SchemaException Convention_ConventionCouldNotBeCreated( scope ?? "default") .Build()); - public static SchemaException DataLoader_InvalidType(Type dataLoaderType) => - new SchemaException( + public static SchemaException DataLoader_InvalidType(Type dataLoaderType) + => new SchemaException( SchemaErrorBuilder.New() .SetMessage( ThrowHelper_DataLoader_InvalidType, dataLoaderType.FullName ?? dataLoaderType.Name) .Build()); - public static SchemaException NonGenericExecutableNotAllowed() => - new SchemaException( + public static SchemaException NonGenericExecutableNotAllowed() + => new SchemaException( SchemaErrorBuilder .New() .SetMessage(ExtendedTypeReferenceHandler_NonGenericExecutableNotAllowed) @@ -198,7 +198,7 @@ public static LeafCoercionException RequiredInputFieldIsMissing( .SetMessage( ThrowHelper_RequiredInputFieldIsMissing, field.Name) - .SetPath(fieldPath) + .SetInputPath(fieldPath) .SetExtension("field", field.Coordinate.ToString()) .Build(), field.Type, @@ -218,7 +218,7 @@ public static LeafCoercionException InvalidInputFieldNames<T>( ThrowHelper_InvalidInputFieldNames_Single, invalidFieldNames[0], type.Name) - .SetPath(path) + .SetInputPath(path) .SetExtension("type", type.Name) .Build(), type, @@ -231,7 +231,7 @@ public static LeafCoercionException InvalidInputFieldNames<T>( ThrowHelper_InvalidInputFieldNames, string.Join(", ", invalidFieldNames.Select(t => $"`{t}`")), type.Name) - .SetPath(path) + .SetInputPath(path) .SetExtension("type", type.Name) .Build(), type, @@ -245,7 +245,7 @@ public static LeafCoercionException OneOfNoFieldSet( var builder = ErrorBuilder.New() .SetMessage(ThrowHelper_OneOfNoFieldSet, type.Name) .SetCode(ErrorCodes.Execution.OneOfNoFieldSet) - .SetPath(path); + .SetInputPath(path); return new(builder.Build(), type, path); } @@ -257,7 +257,7 @@ public static LeafCoercionException OneOfMoreThanOneFieldSet( var builder = ErrorBuilder.New() .SetMessage(ThrowHelper_OneOfMoreThanOneFieldSet, type.Name) .SetCode(ErrorCodes.Execution.OneOfMoreThanOneFieldSet) - .SetPath(path); + .SetInputPath(path); return new(builder.Build(), type, path); } @@ -270,7 +270,7 @@ public static LeafCoercionException OneOfFieldIsNull( var builder = ErrorBuilder.New() .SetMessage(ThrowHelper_OneOfFieldIsNull, field.Name, type.Name) .SetCode(ErrorCodes.Execution.OneOfFieldIsNull) - .SetPath(path) + .SetInputPath(path) .SetCoordinate(field.Coordinate); return new(builder.Build(), type, path); @@ -284,7 +284,7 @@ public static LeafCoercionException NonNullInputViolation( var builder = ErrorBuilder.New() .SetMessage(ThrowHelper_NonNullInputViolation) .SetCode(ErrorCodes.Execution.NonNullViolation) - .SetPath(path); + .SetInputPath(path); if (field is not null) { @@ -304,7 +304,7 @@ public static LeafCoercionException ParseInputObject_InvalidSyntaxKind( ThrowHelper_ParseInputObject_InvalidSyntaxKind, kind, type.Name) - .SetPath(path) + .SetInputPath(path) .SetExtension(nameof(type), type.Name) .Build(), type, @@ -316,7 +316,7 @@ public static LeafCoercionException ParseInputObject_InvalidValueKind( => new LeafCoercionException( ErrorBuilder.New() .SetMessage(ThrowHelper_ParseInputObject_InvalidValueKind) - .SetPath(path) + .SetInputPath(path) .SetExtension(nameof(type), type.Name) .Build(), type, @@ -331,7 +331,7 @@ public static LeafCoercionException ParseNestedList_InvalidSyntaxKind( .SetMessage( ThrowHelper_ParseNestedList_InvalidSyntaxKind, kind) - .SetPath(path) + .SetInputPath(path) .SetExtension( "specifiedBy", "https://spec.graphql.org/June2018/#sec-Type-System.List") @@ -361,7 +361,7 @@ public static LeafCoercionException FormatValueList_InvalidObjectKind( ThrowHelper_FormatValueList_InvalidObjectKind, type.Print(), listType.FullName ?? listType.Name) - .SetPath(path) + .SetInputPath(path) .Build(), type, path); @@ -377,7 +377,7 @@ public static LeafCoercionException FormatResultObject_InvalidObjectKind( objectType.FullName ?? objectType.Name, type.Name, type.RuntimeType.FullName ?? type.RuntimeType.Name) - .SetPath(path) + .SetInputPath(path) .SetExtension(nameof(type), type.Name) .Build(), type, @@ -393,7 +393,7 @@ public static LeafCoercionException FormatResultList_InvalidObjectKind( ThrowHelper_FormatResultList_InvalidObjectKind, type.Print(), listType.FullName ?? listType.Name) - .SetPath(path) + .SetInputPath(path) .Build(), type, path); @@ -408,7 +408,7 @@ public static LeafCoercionException FormatResultLeaf_InvalidSyntaxKind( ThrowHelper_FormatResultLeaf_InvalidSyntaxKind, type.Print(), kind) - .SetPath(path) + .SetInputPath(path) .Build(), type, path); diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/VariableCoercionIntegrationTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/VariableCoercionIntegrationTests.cs index e0382eeac3d..90e64e95358 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/VariableCoercionIntegrationTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/VariableCoercionIntegrationTests.cs @@ -1,4 +1,3 @@ -using HotChocolate.Language; using HotChocolate.Tests; using HotChocolate.Types; using Microsoft.Extensions.DependencyInjection; @@ -12,16 +11,25 @@ public async Task Nullables_And_NonNullables_Are_Set() { var executor = await CreateSchemaAsync(); - var user = new ObjectValueNode( - new ObjectFieldNode("name", "Oliver"), - new ObjectFieldNode("surname", "Smith"), - new ObjectFieldNode("gender", "MALE")); - var request = OperationRequestBuilder .New() - .SetDocument("mutation($user: UserInput!) { addUser(user: $user) }") - .SetVariableValues(new Dictionary<string, object?> { { "user", user } }) + .SetDocument( + """ + mutation($user: UserInput!) { + addUser(user: $user) + } + """) + .SetVariableValues( + """ + { + "user": { + "name": "Oliver", + "surname": "Smith", + "gender": "MALE" + } + } + """) .Build(); await executor.ExecuteAsync(request).MatchSnapshotAsync(); @@ -32,14 +40,23 @@ public async Task Nullables_Are_Not_Set_NonNullables_Are_Set() { var executor = await CreateSchemaAsync(); - var user = new ObjectValueNode( - new ObjectFieldNode("name", "Oliver")); - var request = OperationRequestBuilder .New() - .SetDocument("mutation($user: UserInput!) { addUser(user: $user) }") - .SetVariableValues(new Dictionary<string, object?> { { "user", user } }) + .SetDocument( + """ + mutation($user: UserInput!) { + addUser(user: $user) + } + """) + .SetVariableValues( + """ + { + "user": { + "name": "Oliver" + } + } + """) .Build(); await executor.ExecuteAsync(request).MatchSnapshotAsync(); @@ -50,16 +67,25 @@ public async Task Nullables_Are_Set_And_NonNullables_Are_Set_To_Null() { var executor = await CreateSchemaAsync(); - var user = new ObjectValueNode( - new ObjectFieldNode("name", NullValueNode.Default), - new ObjectFieldNode("surname", "Smith"), - new ObjectFieldNode("gender", "MALE")); - var request = OperationRequestBuilder .New() - .SetDocument("mutation($user: UserInput!) { addUser(user: $user) }") - .SetVariableValues(new Dictionary<string, object?> { { "user", user } }) + .SetDocument( + """ + mutation($user: UserInput!) { + addUser(user: $user) + } + """) + .SetVariableValues( + """ + { + "user": { + "name": null, + "surname": "Smith", + "gender": "MALE" + } + } + """) .Build(); await executor.ExecuteAsync(request).MatchSnapshotAsync(); @@ -70,15 +96,24 @@ public async Task Nullables_Are_Set_And_NonNullables_Not_Are_Set() { var executor = await CreateSchemaAsync(); - var user = new ObjectValueNode( - new ObjectFieldNode("surname", "Smith"), - new ObjectFieldNode("gender", "MALE")); - var request = OperationRequestBuilder .New() - .SetDocument("mutation($user: UserInput!) { addUser(user: $user) }") - .SetVariableValues(new Dictionary<string, object?> { { "user", user } }) + .SetDocument( + """ + mutation($user: UserInput!) { + addUser(user: $user) + } + """) + .SetVariableValues( + """ + { + "user": { + "surname": "Smith", + "gender": "MALE" + } + } + """) .Build(); await executor.ExecuteAsync(request).MatchSnapshotAsync(); @@ -89,13 +124,21 @@ public async Task Empty_Object() { var executor = await CreateSchemaAsync(); - var user = new ObjectValueNode(); - var request = OperationRequestBuilder .New() - .SetDocument("mutation($user: UserInput!) { addUser(user: $user) }") - .SetVariableValues(new Dictionary<string, object?> { { "user", user } }) + .SetDocument( + """ + mutation($user: UserInput!) { + addUser(user: $user) + } + """) + .SetVariableValues( + """ + { + "user": {} + } + """) .Build(); await executor.ExecuteAsync(request).MatchSnapshotAsync(); @@ -109,8 +152,18 @@ public async Task Variable_Null() var request = OperationRequestBuilder .New() - .SetDocument("mutation($user: UserInput!) { addUser(user: $user) }") - .SetVariableValues(new Dictionary<string, object?> { { "user", null } }) + .SetDocument( + """ + mutation($user: UserInput!) { + addUser(user: $user) + } + """) + .SetVariableValues( + """ + { + "user": null + } + """) .Build(); await executor.ExecuteAsync(request).MatchSnapshotAsync(); @@ -124,7 +177,12 @@ public async Task Variable_Not_Provided() var request = OperationRequestBuilder .New() - .SetDocument("mutation($user: UserInput!) { addUser(user: $user) }") + .SetDocument( + """ + mutation($user: UserInput!) { + addUser(user: $user) + } + """) .Build(); await executor.ExecuteAsync(request).MatchSnapshotAsync(); @@ -135,16 +193,25 @@ public async Task Invalid_Field_Provided() { var executor = await CreateSchemaAsync(); - var user = new ObjectValueNode( - new ObjectFieldNode("name", "Oliver"), - new ObjectFieldNode("surname", "Smith"), - new ObjectFieldNode("foo", "bar")); - var request = OperationRequestBuilder .New() - .SetDocument("mutation($user: UserInput!) { addUser(user: $user) }") - .SetVariableValues(new Dictionary<string, object?> { { "user", user } }) + .SetDocument( + """ + mutation($user: UserInput!) { + addUser(user: $user) + } + """) + .SetVariableValues( + """ + { + "user": { + "name": "Oliver", + "surname": "Smith", + "foo": "bar" + } + } + """) .Build(); await executor.ExecuteAsync(request).MatchSnapshotAsync(); @@ -155,17 +222,26 @@ public async Task Invalid_Field_Provided_When_Enum_Is_Present() { var executor = await CreateSchemaAsync(); - var user = new ObjectValueNode( - new ObjectFieldNode("name", "Oliver"), - new ObjectFieldNode("surname", "Smith"), - new ObjectFieldNode("gender", "MALE"), - new ObjectFieldNode("foo", "bar")); - var request = OperationRequestBuilder .New() - .SetDocument("mutation($user: UserInput!) { addUser(user: $user) }") - .SetVariableValues(new Dictionary<string, object?> { { "user", user } }) + .SetDocument( + """ + mutation($user: UserInput!) { + addUser(user: $user) + } + """) + .SetVariableValues( + """ + { + "user": { + "name": "Oliver", + "surname": "Smith", + "gender": "MALE", + "foo": "bar" + } + } + """) .Build(); await executor.ExecuteAsync(request).MatchSnapshotAsync(); @@ -176,15 +252,24 @@ public async Task Invalid_Enum_Value_Provided() { var executor = await CreateSchemaAsync(); - var user = new ObjectValueNode( - new ObjectFieldNode("name", "Oliver"), - new ObjectFieldNode("gender", "FOO")); - var request = OperationRequestBuilder .New() - .SetDocument("mutation($user: UserInput!) { addUser(user: $user) }") - .SetVariableValues(new Dictionary<string, object?> { { "user", user } }) + .SetDocument( + """ + mutation($user: UserInput!) { + addUser(user: $user) + } + """) + .SetVariableValues( + """ + { + "user": { + "name": "Oliver", + "gender": "FOO" + } + } + """) .Build(); await executor.ExecuteAsync(request).MatchSnapshotAsync(); diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Enum_Value_Provided.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Enum_Value_Provided.snap index 6338ede25a8..6cc3e0535e7 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Enum_Value_Provided.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Enum_Value_Provided.snap @@ -1,12 +1,12 @@ { "errors": [ { - "message": "GenderEnum cannot parse the given literal of type `EnumValueNode`.", - "path": [ - "user", - "gender" - ], + "message": "GenderEnum cannot coerce the given value JSON element of type `String` to a runtime value.", "extensions": { + "inputPath": [ + "user", + "gender" + ], "coordinate": "UserInput.gender", "fieldType": "GenderEnum" } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Variable_Null.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Variable_Null.snap index 943c73802cf..1181874ca33 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Variable_Null.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Variable_Null.snap @@ -1,16 +1,12 @@ { "errors": [ { - "message": "Variable `user` is required.", - "locations": [ - { - "line": 1, - "column": 10 - } + "message": "Cannot accept null for non-nullable input.", + "path": [ + "user" ], "extensions": { - "code": "HC0018", - "variable": "user" + "code": "HC0018" } } ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/ArgumentCoercionTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/ArgumentCoercionTests.cs index 8491cacb4b8..1e8811b7417 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/ArgumentCoercionTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/ArgumentCoercionTests.cs @@ -14,8 +14,19 @@ public async Task Pass_In_Null_To_NonNullArgument_With_DefaultValue() .AddQueryType<Query>() .BuildRequestExecutorAsync(); + var request = + OperationRequestBuilder + .New() + .SetDocument( + """ + { + sayHello(name: null) + } + """) + .Build(); + // act - var result = await executor.ExecuteAsync("{ sayHello(name: null) }"); + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -31,8 +42,19 @@ public async Task Pass_In_Nothing_To_NonNullArgument_With_DefaultValue() .AddQueryType<Query>() .BuildRequestExecutorAsync(); + var request = + OperationRequestBuilder + .New() + .SetDocument( + """ + { + sayHello + } + """) + .Build(); + // act - var result = await executor.ExecuteAsync("{ sayHello }"); + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -48,9 +70,19 @@ public async Task Pass_In_Nothing_To_NonNullArgument_With_DefaultValue_By_Variab .AddQueryType<Query>() .BuildRequestExecutorAsync(); + var request = + OperationRequestBuilder + .New() + .SetDocument( + """ + query ($a: String!) { + sayHello(name: $a) + } + """) + .Build(); + // act - var result = await executor.ExecuteAsync( - "query ($a: String!) { sayHello(name: $a) }"); + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -66,12 +98,25 @@ public async Task Pass_In_Null_To_NonNullArgument_With_DefaultValue_By_Variable( .AddQueryType<Query>() .BuildRequestExecutorAsync(); - var variables = new Dictionary<string, object?> { { "a", null } }; + var request = + OperationRequestBuilder + .New() + .SetDocument( + """ + query ($a: String!) { + sayHello(name: $a) + } + """) + .SetVariableValues( + """ + { + "a": null + } + """) + .Build(); // act - var result = await executor.ExecuteAsync( - "query ($a: String!) { sayHello(name: $a) }", - variables); + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -87,12 +132,25 @@ public async Task Pass_In_Sydney_To_NonNullArgument_With_DefaultValue_By_Variabl .AddQueryType<Query>() .BuildRequestExecutorAsync(); - var variables = new Dictionary<string, object?> { { "a", "Sydney" } }; + var request = + OperationRequestBuilder + .New() + .SetDocument( + """ + query ($a: String!) { + sayHello(name: $a) + } + """) + .SetVariableValues( + """ + { + "a": "Sydney" + } + """) + .Build(); // act - var result = await executor.ExecuteAsync( - "query ($a: String!) { sayHello(name: $a) }", - variables); + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -100,6 +158,7 @@ public async Task Pass_In_Sydney_To_NonNullArgument_With_DefaultValue_By_Variabl public class Query { - public string SayHello(string name = "Michael") => $"Hello {name}."; + public string SayHello(string name = "Michael") + => $"Hello {name}."; } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap index 5644d15eb0b..97363f490c3 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue.snap @@ -4,7 +4,7 @@ "message": "Detected a non-null violation in argument `name`.", "locations": [ { - "line": 1, + "line": 2, "column": 12 } ], @@ -12,7 +12,7 @@ "sayHello" ], "extensions": { - "errorPath": [ + "inputPath": [ "name" ] } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs index ed8a9f78566..f6bc46247b0 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/VariableCoercionHelperTests.cs @@ -5,7 +5,6 @@ using HotChocolate.StarWars.Models; using HotChocolate.StarWars.Types; using HotChocolate.Types; -using HotChocolate.Utilities; using Moq; namespace HotChocolate.Execution.Processing; @@ -28,7 +27,7 @@ public void VariableCoercionHelper_Schema_Is_Null() var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act void Action() => helper.CoerceVariableValues( @@ -45,7 +44,7 @@ public void VariableCoercionHelper_VariableDefinitions_Is_Null() var schema = SchemaBuilder.New().AddStarWarsTypes().Create(); var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act void Action() @@ -73,7 +72,7 @@ public void VariableCoercionHelper_CoercedValues_Is_Null() }; var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act void Action() => helper.CoerceVariableValues( @@ -102,7 +101,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Value_Is_Not_Prov var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -138,7 +137,7 @@ public void Coerce_Nullable_String_Variable_Where_Value_Is_Not_Provided() var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -168,7 +167,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Value_Is_Provided var variableValues = JsonDocument.Parse("""{"abc": "xyz"}"""); var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -205,7 +204,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Plain_Value_Is_Pr var variableValues = JsonDocument.Parse("""{"abc": "xyz"}"""); var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -242,7 +241,7 @@ public void Coerce_Nullable_String_Variable_With_Default_Where_Null_Is_Provided( var variableValues = JsonDocument.Parse("""{"abc": null}"""); var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -279,7 +278,7 @@ public void Coerce_Nullable_ReviewInput_Variable_With_Object() var variableValues = JsonDocument.Parse("""{"abc": {"stars": 5}}"""); var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -316,7 +315,7 @@ public void Error_When_Value_Is_Null_On_Non_Null_Variable() var variableValues = JsonDocument.Parse("""{"abc": null}"""); var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act void Action() => helper.CoerceVariableValues( @@ -360,7 +359,7 @@ public void Error_When_Value_Type_Does_Not_Match_Variable_Type() var variableValues = JsonDocument.Parse("""{"abc": 1}"""); var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act void Action() => helper.CoerceVariableValues( @@ -405,7 +404,7 @@ public void Variable_Type_Is_Not_An_Input_Type() var variableValues = JsonDocument.Parse("""{"abc": 1}"""); var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act void Action() => helper.CoerceVariableValues( @@ -445,7 +444,7 @@ public void Error_When_Input_Field_Has_Different_Properties_Than_Defined() var variableValues = JsonDocument.Parse("""{"abc": {"abc": "def"}}"""); var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act void Action() => helper.CoerceVariableValues( @@ -517,7 +516,7 @@ enum TestEnum { var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -583,7 +582,7 @@ enum TestEnum { var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -647,7 +646,7 @@ enum TestEnum { var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -707,7 +706,7 @@ enum TestEnum { var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -767,7 +766,7 @@ enum TestEnum { var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -835,7 +834,7 @@ enum TestEnum { var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( @@ -880,7 +879,7 @@ public void Variable_Is_Nullable_And_Not_Set() var coercedValues = new Dictionary<string, VariableValue>(); var featureProvider = new Mock<IFeatureProvider>(); - var helper = new VariableCoercionHelper(new(), new(new DefaultTypeConverter())); + var helper = new VariableCoercionHelper(new()); // act helper.CoerceVariableValues( From 367a8119b688f969f4fe2bf7dcf20bdace271065 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 13 Jan 2026 23:28:24 +0100 Subject: [PATCH 098/144] update snapshots --- ...CoercionIntegrationTests.Empty_Object.snap | 8 +- ...tegrationTests.Invalid_Field_Provided.snap | 6 +- ...d_Field_Provided_When_Enum_Is_Present.snap | 6 +- ..._Set_And_NonNullables_Are_Set_To_Null.snap | 8 +- ..._Are_Set_And_NonNullables_Not_Are_Set.snap | 8 +- ...oercionIntegrationTests.Variable_Null.snap | 8 +- ...rgument_With_DefaultValue_By_Variable.snap | 12 +- .../StarWarsCodeFirstTests.cs | 1398 +++++++++-------- ...sts.Ensure_Benchmark_Query_LargeQuery.snap | 10 +- .../StarWarsCodeFirstTests.Schema.snap | 12 +- ..._InputObject_AllIsSet_MissingRequired.snap | 6 +- ..._InputObject_AllIsSet_OneInvalidField.snap | 6 +- ...InputObject_AllIsSet_TwoInvalidFields.snap | 6 +- ...nputParserTests.OneOf_A_and_B_Are_Set.snap | 25 +- ...Tests.OneOf_A_is_Null_and_B_has_Value.snap | 25 +- ..._InputObject_AllIsSet_MissingRequired.snap | 6 +- ..._InputObject_AllIsSet_OneInvalidField.snap | 6 +- ...InputObject_AllIsSet_TwoInvalidFields.snap | 6 +- ...ts.Parse_InputObject_NonNullViolation.snap | 10 +- ...rationTests.Var_is_empty_object_Error.snap | 8 +- ...h_A_set_to_abc_and_B_set_to_123_Error.snap | 8 +- ..._A_set_to_abc_and_B_set_to_null_Error.snap | 8 +- ...ar_is_object_with_A_set_to_null_Error.snap | 8 +- ...Var_is_object_with_B_set_to_abc_Error.snap | 8 +- ..._object_with_fields_B_and_C_set_Error.snap | 8 +- 25 files changed, 833 insertions(+), 787 deletions(-) diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Empty_Object.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Empty_Object.snap index c54c3bb2f50..39c95ad949c 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Empty_Object.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Empty_Object.snap @@ -2,11 +2,11 @@ "errors": [ { "message": "The required input field `name` is missing.", - "path": [ - "user", - "name" - ], "extensions": { + "inputPath": [ + "user", + "name" + ], "field": "UserInput.name" } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Field_Provided.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Field_Provided.snap index eca0a8399db..0512a70bdee 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Field_Provided.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Field_Provided.snap @@ -2,10 +2,10 @@ "errors": [ { "message": "The field `foo` does not exist on the type `UserInput`.", - "path": [ - "user" - ], "extensions": { + "inputPath": [ + "user" + ], "type": "UserInput" } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Field_Provided_When_Enum_Is_Present.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Field_Provided_When_Enum_Is_Present.snap index eca0a8399db..0512a70bdee 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Field_Provided_When_Enum_Is_Present.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Invalid_Field_Provided_When_Enum_Is_Present.snap @@ -2,10 +2,10 @@ "errors": [ { "message": "The field `foo` does not exist on the type `UserInput`.", - "path": [ - "user" - ], "extensions": { + "inputPath": [ + "user" + ], "type": "UserInput" } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Nullables_Are_Set_And_NonNullables_Are_Set_To_Null.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Nullables_Are_Set_And_NonNullables_Are_Set_To_Null.snap index eec90292761..9f8858e7b1e 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Nullables_Are_Set_And_NonNullables_Are_Set_To_Null.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Nullables_Are_Set_And_NonNullables_Are_Set_To_Null.snap @@ -2,12 +2,12 @@ "errors": [ { "message": "Cannot accept null for non-nullable input.", - "path": [ - "user", - "name" - ], "extensions": { "code": "HC0018", + "inputPath": [ + "user", + "name" + ], "coordinate": "UserInput.name" } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Nullables_Are_Set_And_NonNullables_Not_Are_Set.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Nullables_Are_Set_And_NonNullables_Not_Are_Set.snap index c54c3bb2f50..39c95ad949c 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Nullables_Are_Set_And_NonNullables_Not_Are_Set.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Nullables_Are_Set_And_NonNullables_Not_Are_Set.snap @@ -2,11 +2,11 @@ "errors": [ { "message": "The required input field `name` is missing.", - "path": [ - "user", - "name" - ], "extensions": { + "inputPath": [ + "user", + "name" + ], "field": "UserInput.name" } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Variable_Null.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Variable_Null.snap index 1181874ca33..c2f139218f5 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Variable_Null.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Components/__snapshots__/VariableCoercionIntegrationTests.Variable_Null.snap @@ -2,11 +2,11 @@ "errors": [ { "message": "Cannot accept null for non-nullable input.", - "path": [ - "user" - ], "extensions": { - "code": "HC0018" + "code": "HC0018", + "inputPath": [ + "user" + ] } } ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue_By_Variable.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue_By_Variable.snap index 7081b1222d3..c0d9428ca02 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue_By_Variable.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/Spec/__snapshots__/ArgumentCoercionTests.Pass_In_Null_To_NonNullArgument_With_DefaultValue_By_Variable.snap @@ -1,16 +1,12 @@ { "errors": [ { - "message": "Variable `a` is required.", - "locations": [ - { - "line": 1, - "column": 8 - } - ], + "message": "Cannot accept null for non-nullable input.", "extensions": { "code": "HC0018", - "variable": "a" + "inputPath": [ + "a" + ] } } ] diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs index 7591861187d..a31263101d3 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/StarWarsCodeFirstTests.cs @@ -1,20 +1,12 @@ using Microsoft.Extensions.DependencyInjection; -using HotChocolate.Language; using HotChocolate.Tests; using Xunit.Abstractions; using static HotChocolate.Tests.TestHelper; namespace HotChocolate.Execution.Integration.StarWarsCodeFirst; -public class StarWarsCodeFirstTests +public class StarWarsCodeFirstTests(ITestOutputHelper output) { - private readonly ITestOutputHelper _output; - - public StarWarsCodeFirstTests(ITestOutputHelper output) - { - _output = output; - } - [Fact] public async Task Schema() { @@ -32,12 +24,13 @@ public async Task Schema() public async Task GetHeroName() { await ExpectValid( - @" - { - hero { - name - } - }") + """ + { + hero { + name + } + } + """) .MatchSnapshotAsync(); } @@ -45,18 +38,19 @@ await ExpectValid( public async Task GraphQLOrgFieldExample() { await ExpectValid( - @" - { - hero { - name - # Queries can have comments! - friends { - nodes { - name - } - } - } - }") + """ + { + hero { + name + # Queries can have comments! + friends { + nodes { + name + } + } + } + } + """) .MatchSnapshotAsync(); } @@ -66,10 +60,10 @@ public async Task GraphQLOrgFieldArgumentExample1() await ExpectValid( """ { - human(id: "1000") { - name - height - } + human(id: "1000") { + name + height + } } """) .MatchSnapshotAsync(); @@ -81,10 +75,10 @@ public async Task GraphQLOrgFieldArgumentExample2() await ExpectValid( """ { - human(id: "1000") { - name - height(unit: FOOT) - } + human(id: "1000") { + name + height(unit: FOOT) + } } """) .MatchSnapshotAsync(); @@ -94,15 +88,16 @@ await ExpectValid( public async Task GraphQLOrgAliasExample() { await ExpectValid( - @" - { - empireHero: hero(episode: EMPIRE) { - name - } - jediHero: hero(episode: JEDI) { - name - } - }") + """ + { + empireHero: hero(episode: EMPIRE) { + name + } + jediHero: hero(episode: JEDI) { + name + } + } + """) .MatchSnapshotAsync(); } @@ -110,26 +105,26 @@ await ExpectValid( public async Task GraphQLOrgFragmentExample() { await ExpectValid( - """ - { - leftComparison: hero(episode: EMPIRE) { - ...comparisonFields - } - rightComparison: hero(episode: JEDI) { - ...comparisonFields - } - } + """ + { + leftComparison: hero(episode: EMPIRE) { + ...comparisonFields + } + rightComparison: hero(episode: JEDI) { + ...comparisonFields + } + } - fragment comparisonFields on Character { - name - appearsIn - friends { - nodes { - name - } - } + fragment comparisonFields on Character { + name + appearsIn + friends { + nodes { + name } - """) + } + } + """) .MatchSnapshotAsync(); } @@ -137,17 +132,18 @@ fragment comparisonFields on Character { public async Task GraphQLOrgOperationNameExample() { await ExpectValid( - @" - query HeroNameAndFriends { - hero { - name - friends { - nodes { - name - } - } - } - }") + """ + query HeroNameAndFriends { + hero { + name + friends { + nodes { + name + } + } + } + } + """) .MatchSnapshotAsync(); } @@ -155,19 +151,24 @@ query HeroNameAndFriends { public async Task GraphQLOrgVariableExample() { await ExpectValid( - @" - query HeroNameAndFriends($episode: Episode) { - hero(episode: $episode) { - name - friends { - nodes { - name - } - } - } - }", - request: c => c.SetVariableValues( - new Dictionary<string, object?> { { "episode", new EnumValueNode("JEDI") } })) + """ + query HeroNameAndFriends($episode: Episode) { + hero(episode: $episode) { + name + friends { + nodes { + name + } + } + } + } + """, + request: c => c.SetVariableValues( + """ + { + "episode": "JEDI" + } + """)) .MatchSnapshotAsync(); } @@ -175,17 +176,18 @@ query HeroNameAndFriends($episode: Episode) { public async Task GraphQLOrgVariableWithDefaultValueExample() { await ExpectValid( - @" - query HeroNameAndFriends($episode: Episode = JEDI) { - hero(episode: $episode) { - name - friends { - nodes { - name - } - } - } - }") + """ + query HeroNameAndFriends($episode: Episode = JEDI) { + hero(episode: $episode) { + name + friends { + nodes { + name + } + } + } + } + """) .MatchSnapshotAsync(); } @@ -195,22 +197,23 @@ public async Task GraphQLOrgDirectiveIncludeExample1() await ExpectValid( """ query Hero($episode: Episode, $withFriends: Boolean!) { - hero(episode: $episode) { + hero(episode: $episode) { + name + friends @include(if: $withFriends) { + nodes { name - friends @include(if: $withFriends) { - nodes { - name - } - } + } } + } } """, request: c => c.SetVariableValues( - new Dictionary<string, object?> + """ { - { "episode", new EnumValueNode("JEDI") }, - { "withFriends", new BooleanValueNode(false) } - })) + "episode": "JEDI", + "withFriends": false + } + """)) .MatchSnapshotAsync(); } @@ -218,23 +221,25 @@ friends @include(if: $withFriends) { public async Task GraphQLOrgDirectiveIncludeExample2() { await ExpectValid( - @" - query Hero($episode: Episode, $withFriends: Boolean!) { - hero(episode: $episode) { - name - friends @include(if: $withFriends) { - nodes { - name - } - } - } - }", - request: r => r.SetVariableValues( - new Dictionary<string, object?> - { - { "episode", new EnumValueNode("JEDI") }, - { "withFriends", new BooleanValueNode(true) } - })) + """ + query Hero($episode: Episode, $withFriends: Boolean!) { + hero(episode: $episode) { + name + friends @include(if: $withFriends) { + nodes { + name + } + } + } + } + """, + request: r => r.SetVariableValues( + """ + { + "episode": "JEDI", + "withFriends": true + } + """)) .MatchSnapshotAsync(); } @@ -242,23 +247,25 @@ friends @include(if: $withFriends) { public async Task GraphQLOrgDirectiveSkipExample1() { await ExpectValid( - @" - query Hero($episode: Episode, $withFriends: Boolean!) { - hero(episode: $episode) { - name - friends @skip(if: $withFriends) { - nodes { - name - } - } - } - }", - request: r => r.SetVariableValues( - new Dictionary<string, object?> - { - { "episode", new EnumValueNode("JEDI") }, - { "withFriends", new BooleanValueNode(false) } - })) + """ + query Hero($episode: Episode, $withFriends: Boolean!) { + hero(episode: $episode) { + name + friends @skip(if: $withFriends) { + nodes { + name + } + } + } + } + """, + request: r => r.SetVariableValues( + """ + { + "episode": "JEDI", + "withFriends": false + } + """)) .MatchSnapshotAsync(); } @@ -266,24 +273,25 @@ friends @skip(if: $withFriends) { public async Task GraphQLOrgDirectiveSkipExample2() { await ExpectValid( + """ + query Hero($episode: Episode, $withFriends: Boolean!) { + hero(episode: $episode) { + name + friends @skip(if: $withFriends) { + nodes { + name + } + } + } + } + """, + request: r => r.SetVariableValues( """ - query Hero($episode: Episode, $withFriends: Boolean!) { - hero(episode: $episode) { - name - friends @skip(if: $withFriends) { - nodes { - name - } - } - } + { + "episode": "JEDI", + "withFriends": true } - """, - request: r => r.SetVariableValues( - new Dictionary<string, object?> - { - { "episode", new EnumValueNode("JEDI") }, - { "withFriends", new BooleanValueNode(true) } - })) + """)) .MatchSnapshotAsync(); } @@ -291,23 +299,25 @@ friends @skip(if: $withFriends) { public async Task GraphQLOrgDirectiveSkipExample1WithPlainClrVarTypes() { await ExpectValid( - @" - query Hero($episode: Episode, $withFriends: Boolean!) { - hero(episode: $episode) { - name - friends @skip(if: $withFriends) { - nodes { - name - } - } - } - }", - request: r => r.SetVariableValues( - new Dictionary<string, object?> - { - { "episode", new EnumValueNode("JEDI") }, - { "withFriends", new BooleanValueNode(false) } - })) + """ + query Hero($episode: Episode, $withFriends: Boolean!) { + hero(episode: $episode) { + name + friends @skip(if: $withFriends) { + nodes { + name + } + } + } + } + """, + request: r => r.SetVariableValues( + """ + { + "episode": "JEDI", + "withFriends": false + } + """)) .MatchSnapshotAsync(); } @@ -315,28 +325,24 @@ friends @skip(if: $withFriends) { public async Task GraphQLOrgMutationExample() { await ExpectValid( - @" - mutation CreateReviewForEpisode( - $ep: Episode!, $review: ReviewInput!) { - createReview(episode: $ep, review: $review) { - stars - commentary - } - }", - request: r => r - .SetVariableValues( - new Dictionary<string, object?> - { - { "ep", new EnumValueNode("JEDI") }, - { - "review", - new ObjectValueNode( - new ObjectFieldNode("stars", new IntValueNode(5)), - new ObjectFieldNode( - "commentary", - new StringValueNode("This is a great movie!"))) - } - })) + """ + mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) { + createReview(episode: $ep, review: $review) { + stars + commentary + } + } + """, + request: r => r.SetVariableValues( + """ + { + "ep": "JEDI", + "review": { + "stars": 5, + "commentary": "This is a great movie!" + } + } + """)) .MatchSnapshotAsync(); } @@ -344,37 +350,31 @@ mutation CreateReviewForEpisode( public async Task GraphQLOrgMutationIgnoreAdditionalInputFieldsExample() { await ExpectValid( - @" - mutation CreateReviewForEpisode( - $ep: Episode!, $review: ReviewInput!) { - createReview(episode: $ep, review: $review) { - stars - commentary - } - }", - configure: c => + """ + mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) { + createReview(episode: $ep, review: $review) { + stars + commentary + } + } + """, + configure: c => + { + c.AddInputParser(options => options.IgnoreAdditionalInputFields = true); + AddDefaultConfiguration(c); + }, + request: r => r.SetVariableValues( + """ { - c.AddInputParser(options => options.IgnoreAdditionalInputFields = true); - AddDefaultConfiguration(c); - }, - request: r => r - .SetVariableValues( - new Dictionary<string, object?> - { - { "ep", new EnumValueNode("JEDI") }, - { - "review", - new ObjectValueNode( - // Invalid fields - new ObjectFieldNode("foo", new IntValueNode(1)), - new ObjectFieldNode("ignoreMe", new StringValueNode("ignored")), - // Valid fields - new ObjectFieldNode("stars", new IntValueNode(5)), - new ObjectFieldNode( - "commentary", - new StringValueNode("This is a great movie!"))) - } - })) + "ep": "JEDI", + "review": { + "foo": 1, + "ignoreMe": "ignored", + "stars": 5, + "commentary": "This is a great movie!" + } + } + """)) .MatchSnapshotAsync(); } @@ -382,33 +382,29 @@ mutation CreateReviewForEpisode( public async Task GraphQLOrgTwoMutationsExample() { await ExpectValid( - @" - mutation CreateReviewForEpisode( - $ep: Episode!, $ep2: Episode!, $review: ReviewInput!) { - createReview(episode: $ep, review: $review) { - stars - commentary - } - b: createReview(episode: $ep2, review: $review) { - stars - commentary - } - }", - request: r => r - .SetVariableValues( - new Dictionary<string, object?> - { - { "ep", new EnumValueNode("JEDI") }, - { "ep2", new EnumValueNode("JEDI") }, - { - "review", - new ObjectValueNode( - new ObjectFieldNode("stars", new IntValueNode(5)), - new ObjectFieldNode( - "commentary", - new StringValueNode("This is a great movie!"))) - } - })) + """ + mutation CreateReviewForEpisode($ep: Episode!, $ep2: Episode!, $review: ReviewInput!) { + createReview(episode: $ep, review: $review) { + stars + commentary + } + b: createReview(episode: $ep2, review: $review) { + stars + commentary + } + } + """, + request: r => r.SetVariableValues( + """ + { + "ep": "JEDI", + "ep2": "JEDI", + "review": { + "stars": 5, + "commentary": "This is a great movie!" + } + } + """)) .MatchSnapshotAsync(); } @@ -416,27 +412,27 @@ mutation CreateReviewForEpisode( public async Task GraphQLOrgMutationExample_With_ValueVariables() { await ExpectValid( + """ + mutation CreateReviewForEpisode( + $ep: Episode! + $stars: Int! + $commentary: String!) { + createReview( + episode: $ep + review: { stars: $stars commentary: $commentary }) { + stars + commentary + } + } + """, + request: r => r.SetVariableValues( """ - mutation CreateReviewForEpisode( - $ep: Episode! - $stars: Int! - $commentary: String!) { - createReview( - episode: $ep - review: { stars: $stars commentary: $commentary }) { - stars - commentary - } + { + "ep": "JEDI", + "stars": 5, + "commentary": "This is a great movie!" } - """, - request: r => r - .SetVariableValues( - new Dictionary<string, object?> - { - { "ep", new EnumValueNode("JEDI") }, - { "stars", new IntValueNode(5) }, - { "commentary", new StringValueNode("This is a great movie!") } - })) + """)) .MatchSnapshotAsync(); } @@ -444,21 +440,25 @@ mutation CreateReviewForEpisode( public async Task GraphQLOrgInlineFragmentExample1() { await ExpectValid( + """ + query HeroForEpisode($ep: Episode!) { + hero(episode: $ep) { + name + ... on Droid { + primaryFunction + } + ... on Human { + height + } + } + } + """, + request: r => r.SetVariableValues( """ - query HeroForEpisode($ep: Episode!) { - hero(episode: $ep) { - name - ... on Droid { - primaryFunction - } - ... on Human { - height - } - } + { + "ep": "JEDI" } - """, - request: r => r.SetVariableValues( - new Dictionary<string, object?> { { "ep", new EnumValueNode("JEDI") } })) + """)) .MatchSnapshotAsync(); } @@ -466,21 +466,25 @@ ... on Human { public async Task GraphQLOrgInlineFragmentExample2() { await ExpectValid( + """ + query HeroForEpisode($ep: Episode!) { + hero(episode: $ep) { + name + ... on Droid { + primaryFunction + } + ... on Human { + height + } + } + } + """, + request: r => r.SetVariableValues( """ - query HeroForEpisode($ep: Episode!) { - hero(episode: $ep) { - name - ... on Droid { - primaryFunction - } - ... on Human { - height - } - } + { + "ep": "EMPIRE" } - """, - request: r => r.SetVariableValues( - new Dictionary<string, object?> { { "ep", new EnumValueNode("EMPIRE") } })) + """)) .MatchSnapshotAsync(); } @@ -488,25 +492,25 @@ ... on Human { public async Task GraphQLOrgMetaFieldAndUnionExample() { await ExpectValid( - """ - { - search(text: "an") { - __typename - ... on Human { - name - height - } - ... on Droid { - name - primaryFunction - } - ... on Starship { - name - length - } - } + """ + { + search(text: "an") { + __typename + ... on Human { + name + height + } + ... on Droid { + name + primaryFunction + } + ... on Starship { + name + length } - """) + } + } + """) .MatchSnapshotAsync(); } @@ -514,19 +518,19 @@ ... on Starship { public async Task NonNullListVariableValues() { await ExpectValid( + """ + query op($ep: [Episode!]!) { + heroes(episodes: $ep) { + name + } + } + """, + request: r => r.SetVariableValues( """ - query op($ep: [Episode!]!) { - heroes(episodes: $ep) { - name - } + "ep": ["EMPIRE"] } - """, - request: r => r.SetVariableValues( - new Dictionary<string, object?> - { - { "ep", new ListValueNode(new EnumValueNode("EMPIRE")) } - })) + """)) .MatchSnapshotAsync(); } @@ -534,16 +538,16 @@ query op($ep: [Episode!]!) public async Task ConditionalInlineFragment() { await ExpectValid( - """ - { - heroes(episodes: [EMPIRE]) { - name - ... @include(if: true) { - height - } - } + """ + { + heroes(episodes: [EMPIRE]) { + name + ... @include(if: true) { + height } - """) + } + } + """) .MatchSnapshotAsync(); } @@ -551,14 +555,19 @@ ... @include(if: true) { public async Task NonNullEnumsSerializeCorrectlyFromVariables() { await ExpectValid( + """ + query getHero($episode: Episode!) { + hero(episode: $episode) { + name + } + } + """, + request: r => r.SetVariableValues( """ - query getHero($episode: Episode!) { - hero(episode: $episode) { - name - } + { + "episode": "NEW_HOPE" } - """, - request: r => r.SetVariableValues(new Dictionary<string, object?> { { "episode", "NEW_HOPE" } })) + """)) .MatchSnapshotAsync(); } @@ -566,13 +575,13 @@ query getHero($episode: Episode!) { public async Task EnumValueIsCoercedToListValue() { await ExpectValid( - """ - { - heroes(episodes: EMPIRE) { - name - } - } - """) + """ + { + heroes(episodes: EMPIRE) { + name + } + } + """) .MatchSnapshotAsync(); } @@ -580,36 +589,36 @@ await ExpectValid( public async Task TypeNameFieldIsCorrectlyExecutedOnInterfaces() { await ExpectValid( - """ - query foo { - hero(episode: NEW_HOPE) { - __typename - id - name - ... on Human { - __typename - homePlanet - } - ... on Droid { - __typename - primaryFunction - } - friends { - nodes { - __typename - ... on Human { - __typename - homePlanet - } - ... on Droid { - __typename - primaryFunction - } - } - } + """ + query foo { + hero(episode: NEW_HOPE) { + __typename + id + name + ... on Human { + __typename + homePlanet + } + ... on Droid { + __typename + primaryFunction + } + friends { + nodes { + __typename + ... on Human { + __typename + homePlanet + } + ... on Droid { + __typename + primaryFunction } + } } - """) + } + } + """) .MatchSnapshotAsync(); } @@ -617,17 +626,17 @@ ... on Droid { public async Task Execute_ListWithNullValues_ResultContainsNullElement() { await ExpectValid( - """ - query { - human(id: "1001") { - id - name - otherHuman { - name - } - } + """ + query { + human(id: "1001") { + id + name + otherHuman { + name } - """) + } + } + """) .MatchSnapshotAsync(); } @@ -635,7 +644,7 @@ await ExpectValid( public async Task SubscribeToReview() { // arrange - var executor = await CreateExecutorAsync(output: _output); + var executor = await CreateExecutorAsync(output: output); // act var subscriptionResult = @@ -654,11 +663,10 @@ public async Task SubscribeToReview() await executor.ExecuteAsync( """ mutation { - createReview(episode: NEW_HOPE, - review: { stars: 5 commentary: "foo" }) { - stars - commentary - } + createReview(episode: NEW_HOPE, review: { stars: 5 commentary: "foo" }) { + stars + commentary + } } """); @@ -681,18 +689,18 @@ await executor.ExecuteAsync( public async Task SubscribeToReview_WithInlineFragment() { // arrange - var executor = await CreateExecutorAsync(output: _output); + var executor = await CreateExecutorAsync(output: output); // act var subscriptionResult = (IResponseStream)await executor.ExecuteAsync( """ subscription { - onReview(episode: NEW_HOPE) { - ... on Review { - stars - } + onReview(episode: NEW_HOPE) { + ... on Review { + stars } + } } """); @@ -700,11 +708,10 @@ ... on Review { await executor.ExecuteAsync( """ mutation { - createReview(episode: NEW_HOPE, - review: { stars: 5 commentary: "foo" }) { - stars - commentary - } + createReview(episode: NEW_HOPE, review: { stars: 5 commentary: "foo" }) { + stars + commentary + } } """); @@ -727,20 +734,20 @@ await executor.ExecuteAsync( public async Task SubscribeToReview_FragmentDefinition() { // arrange - var executor = await CreateExecutorAsync(output: _output); + var executor = await CreateExecutorAsync(output: output); // act var subscriptionResult = (IResponseStream)await executor.ExecuteAsync( """ subscription { - onReview(episode: NEW_HOPE) { - ... SomeFrag - } + onReview(episode: NEW_HOPE) { + ... SomeFrag + } } fragment SomeFrag on Review { - stars + stars } """); @@ -748,11 +755,10 @@ fragment SomeFrag on Review { await executor.ExecuteAsync( """ mutation { - createReview(episode: NEW_HOPE, - review: { stars: 5 commentary: "foo" }) { - stars - commentary - } + createReview(episode: NEW_HOPE, review: { stars: 5 commentary: "foo" }) { + stars + commentary + } } """); @@ -780,25 +786,32 @@ public async Task SubscribeToReview_With_Variables() // act var subscriptionResult = (IResponseStream)await executor.ExecuteAsync( - """ - subscription ($ep: Episode!) { - onReview(episode: $ep) { - stars - } - } - """, - new Dictionary<string, object?> { { "ep", "NEW_HOPE" } }, - CancellationToken.None); + OperationRequestBuilder + .New() + .SetDocument( + """ + subscription ($ep: Episode!) { + onReview(episode: $ep) { + stars + } + } + """) + .SetVariableValues( + """ + { + "ep": "NEW_HOPE" + } + """) + .Build()); // assert await executor.ExecuteAsync( """ mutation { - createReview(episode: NEW_HOPE, - review: { stars: 5 commentary: "foo" }) { - stars - commentary - } + createReview(episode: NEW_HOPE, review: { stars: 5 commentary: "foo" }) { + stars + commentary + } } """); @@ -827,44 +840,46 @@ await executor.ExecuteAsync( public async Task ExecutionDepthShouldNotLeadToEmptyObjects() { await ExpectError( - @"query ExecutionDepthShouldNotLeadToEmptyObjects { - hero(episode: NEW_HOPE) { + """ + query ExecutionDepthShouldNotLeadToEmptyObjects { + hero(episode: NEW_HOPE) { + __typename + id + name + ... on Human { + __typename + homePlanet + } + ... on Droid { + __typename + primaryFunction + } + friends { + nodes { __typename - id - name ... on Human { - __typename - homePlanet + __typename + homePlanet + friends { + nodes { + __typename + } + } } ... on Droid { - __typename - primaryFunction - } - friends { + __typename + primaryFunction + friends { nodes { - __typename - ... on Human { - __typename - homePlanet - friends { - nodes { - __typename - } - } - } - ... on Droid { - __typename - primaryFunction - friends { - nodes { - __typename - } - } - } + __typename } + } } + } } - }", + } + } + """, configure: c => { AddDefaultConfiguration(c); @@ -876,44 +891,46 @@ ... on Droid { public async Task OverrideExecutionDepth() { await ExpectValid( - @"query ExecutionDepthShouldNotLeadToEmptyObjects { - hero(episode: NEW_HOPE) { + """ + query ExecutionDepthShouldNotLeadToEmptyObjects { + hero(episode: NEW_HOPE) { + __typename + id + name + ... on Human { + __typename + homePlanet + } + ... on Droid { + __typename + primaryFunction + } + friends { + nodes { __typename - id - name ... on Human { - __typename - homePlanet + __typename + homePlanet + friends { + nodes { + __typename + } + } } ... on Droid { - __typename - primaryFunction - } - friends { + __typename + primaryFunction + friends { nodes { - __typename - ... on Human { - __typename - homePlanet - friends { - nodes { - __typename - } - } - } - ... on Droid { - __typename - primaryFunction - friends { - nodes { - __typename - } - } - } + __typename } + } } + } } - }", + } + } + """, configure: c => { AddDefaultConfiguration(c); @@ -926,44 +943,46 @@ ... on Droid { public async Task SkipExecutionDepth() { await ExpectValid( - @"query ExecutionDepthShouldNotLeadToEmptyObjects { - hero(episode: NEW_HOPE) { + """ + query ExecutionDepthShouldNotLeadToEmptyObjects { + hero(episode: NEW_HOPE) { + __typename + id + name + ... on Human { + __typename + homePlanet + } + ... on Droid { + __typename + primaryFunction + } + friends { + nodes { __typename - id - name ... on Human { - __typename - homePlanet + __typename + homePlanet + friends { + nodes { + __typename + } + } } ... on Droid { - __typename - primaryFunction - } - friends { + __typename + primaryFunction + friends { nodes { - __typename - ... on Human { - __typename - homePlanet - friends { - nodes { - __typename - } - } - } - ... on Droid { - __typename - primaryFunction - friends { - nodes { - __typename - } - } - } + __typename } + } } + } } - }", + } + } + """, configure: c => { AddDefaultConfiguration(c); @@ -978,44 +997,46 @@ public async Task Depth_Analysis_Overrides_Are_Not_Cached() { // arrange const string queryText = - @"query ExecutionDepthShouldNotLeadToEmptyObjects { - hero(episode: NEW_HOPE) { + """ + query ExecutionDepthShouldNotLeadToEmptyObjects { + hero(episode: NEW_HOPE) { + __typename + id + name + ... on Human { + __typename + homePlanet + } + ... on Droid { + __typename + primaryFunction + } + friends { + nodes { __typename - id - name ... on Human { - __typename - homePlanet + __typename + homePlanet + friends { + nodes { + __typename + } + } } ... on Droid { - __typename - primaryFunction - } - friends { + __typename + primaryFunction + friends { nodes { - __typename - ... on Human { - __typename - homePlanet - friends { - nodes { - __typename - } - } - } - ... on Droid { - __typename - primaryFunction - friends { - nodes { - __typename - } - } - } + __typename } + } } + } } - }"; + } + } + """; var configurationA = new TestConfiguration { @@ -1047,30 +1068,32 @@ ... on Droid { public async Task Execution_Depth_Is_Skipped_For_Introspection() { await ExpectValid( - @"query { - __schema { - types { - fields { - type { - kind - name - ofType { - kind - name - ofType { - kind - name - ofType { - kind - name - } - } - } - } + """ + query { + __schema { + types { + fields { + type { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + } } + } } + } } - }", + } + } + """, configure: c => { AddDefaultConfiguration(c); @@ -1084,14 +1107,14 @@ await ExpectValid( public async Task Include_With_Literal(string ifValue) { await ExpectValid( - $$""" - { - human(id: "1000") { - name @include(if: {{ifValue}}) - height - } - } - """) + $$""" + { + human(id: "1000") { + name @include(if: {{ifValue}}) + height + } + } + """) .MatchSnapshotAsync(postFix: ifValue); } @@ -1103,13 +1126,18 @@ public async Task Include_With_Variable(bool ifValue) await ExpectValid( """ query ($if: Boolean!) { - human(id: "1000") { - name @include(if: $if) - height - } + human(id: "1000") { + name @include(if: $if) + height + } } """, - request: r => r.SetVariableValues(new Dictionary<string, object?> { { "if", ifValue } })) + request: r => r.SetVariableValues( + $$""" + { + "if": {{ifValue.ToString().ToLowerInvariant()}} + } + """)) .MatchSnapshotAsync(postFix: ifValue); } @@ -1119,14 +1147,14 @@ name @include(if: $if) public async Task Skip_With_Literal(string ifValue) { await ExpectValid( - $$""" - { - human(id: "1000") { - name @skip(if: {{ifValue}}) - height - } - } - """) + $$""" + { + human(id: "1000") { + name @skip(if: {{ifValue}}) + height + } + } + """) .MatchSnapshotAsync(postFix: ifValue); } @@ -1136,15 +1164,20 @@ name @skip(if: {{ifValue}}) public async Task Skip_With_Variable(bool ifValue) { await ExpectValid( - """ - query ($if: Boolean!) { - human(id: "1000") { - name @skip(if: $if) - height - } + """ + query ($if: Boolean!) { + human(id: "1000") { + name @skip(if: $if) + height + } + } + """, + request: r => r.SetVariableValues( + $$""" + { + "if": {{ifValue.ToString().ToLowerInvariant()}} } - """, - request: r => r.SetVariableValues(new Dictionary<string, object?> { { "if", ifValue } })) + """)) .MatchSnapshotAsync(postFix: ifValue); } @@ -1152,15 +1185,20 @@ name @skip(if: $if) public async Task SkipAll() { await ExpectValid( + """ + query ($if: Boolean!) { + human(id: "1000") @skip(if: $if) { + name + height + } + } + """, + request: r => r.SetVariableValues( """ - query ($if: Boolean!) { - human(id: "1000") @skip(if: $if) { - name - height - } + { + "if": true } - """, - request: r => r.SetVariableValues(new Dictionary<string, object?> { { "if", true } })) + """)) .MatchSnapshotAsync(); } @@ -1168,14 +1206,14 @@ await ExpectValid( public async Task SkipAll_Default_False() { await ExpectValid( - """ - query ($if: Boolean! = false) { - human(id: "1000") @skip(if: $if) { - name - height - } - } - """) + """ + query ($if: Boolean! = false) { + human(id: "1000") @skip(if: $if) { + name + height + } + } + """) .MatchSnapshotAsync(); } @@ -1183,14 +1221,14 @@ await ExpectValid( public async Task SkipAll_Default_True() { await ExpectValid( - """ - query ($if: Boolean! = true) { - human(id: "1000") @skip(if: $if) { - name - height - } - } - """) + """ + query ($if: Boolean! = true) { + human(id: "1000") @skip(if: $if) { + name + height + } + } + """) .MatchSnapshotAsync(); } @@ -1198,14 +1236,19 @@ await ExpectValid( public async Task SkipAllSecondLevelFields() { await ExpectValid( + """ + query ($if: Boolean!) { + human(id: "1000") { + name @skip(if: $if) + } + } + """, + request: r => r.SetVariableValues( """ - query ($if: Boolean!) { - human(id: "1000") { - name @skip(if: $if) - } + { + "if": true } - """, - request: r => r.SetVariableValues(new Dictionary<string, object?> { { "if", true } })) + """)) .MatchSnapshotAsync(); } @@ -1213,16 +1256,16 @@ name @skip(if: $if) public async Task Ensure_Type_Introspection_Returns_Null_If_Type_Not_Found() { await ExpectValid( - """ - query { - a: __type(name: "Foo") { - name - } - b: __type(name: "Query") { - name - } - } - """) + """ + query { + a: __type(name: "Foo") { + name + } + b: __type(name: "Query") { + name + } + } + """) .MatchSnapshotAsync(); } @@ -1258,50 +1301,55 @@ public async Task Ensure_Benchmark_Query_LargeQuery() public async Task NestedFragmentsWithNestedObjectFieldsAndSkip() { await ExpectValid( - """ - query ($if: Boolean!) { - human(id: "1000") { - ... Human1 @include(if: $if) - ... Human2 @skip(if: $if) - } - } - fragment Human1 on Human { - friends { - edges { - ... FriendEdge1 - } - } + """ + query ($if: Boolean!) { + human(id: "1000") { + ... Human1 @include(if: $if) + ... Human2 @skip(if: $if) + } + } + fragment Human1 on Human { + friends { + edges { + ... FriendEdge1 } - fragment FriendEdge1 on FriendsEdge { - node { - __typename - friends { - nodes { - __typename - ... Human3 - } - } - } + } + } + fragment FriendEdge1 on FriendsEdge { + node { + __typename + friends { + nodes { + __typename + ... Human3 + } } - fragment Human2 on Human { - friends { - edges { - node { - __typename - ... Human3 - } - } - } + } + } + fragment Human2 on Human { + friends { + edges { + node { + __typename + ... Human3 + } } - fragment Human3 on Human { - name - otherHuman { - __typename - name - } + } + } + fragment Human3 on Human { + name + otherHuman { + __typename + name + } + } + """, + request: r => r.SetVariableValues( + """ + { + "if": true } - """, - request: r => r.SetVariableValues(new Dictionary<string, object?> { { "if", true } })) + """)) .MatchSnapshotAsync(); } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/__snapshots__/StarWarsCodeFirstTests.Ensure_Benchmark_Query_LargeQuery.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/__snapshots__/StarWarsCodeFirstTests.Ensure_Benchmark_Query_LargeQuery.snap index f610988143f..9c298108c8d 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/__snapshots__/StarWarsCodeFirstTests.Ensure_Benchmark_Query_LargeQuery.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/__snapshots__/StarWarsCodeFirstTests.Ensure_Benchmark_Query_LargeQuery.snap @@ -5938,7 +5938,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "JSON", + "name": "Any", "ofType": null } }, @@ -6419,7 +6419,7 @@ "args": [], "type": { "kind": "SCALAR", - "name": "JSON", + "name": "Any", "ofType": null }, "isDeprecated": false, @@ -6584,7 +6584,7 @@ "args": [], "type": { "kind": "SCALAR", - "name": "JSON", + "name": "Any", "ofType": null }, "isDeprecated": false, @@ -6763,7 +6763,7 @@ "args": [], "type": { "kind": "SCALAR", - "name": "JSON", + "name": "Any", "ofType": null }, "isDeprecated": false, @@ -7027,7 +7027,7 @@ }, { "kind": "SCALAR", - "name": "JSON", + "name": "Any", "description": null, "fields": null, "inputFields": null, diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/__snapshots__/StarWarsCodeFirstTests.Schema.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/__snapshots__/StarWarsCodeFirstTests.Schema.snap index 59f8485c8e6..a85f6c5755b 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/__snapshots__/StarWarsCodeFirstTests.Schema.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/StarWarsCodeFirst/__snapshots__/StarWarsCodeFirstTests.Schema.snap @@ -1,4 +1,4 @@ -schema { +schema { query: Query mutation: Mutation subscription: Subscription @@ -9,7 +9,7 @@ interface Character { name: String! friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection appearsIn: [Episode] - traits: JSON + traits: Any height(unit: Unit): Float } @@ -20,7 +20,7 @@ type Droid implements Character { friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection height(unit: Unit): Float primaryFunction: String - traits: JSON + traits: Any } "A connection to a list of items." @@ -49,7 +49,7 @@ type Human implements Character { otherHuman: Human height(unit: Unit): Float homePlanet: String - traits: JSON + traits: Any } type Mutation { @@ -71,7 +71,7 @@ type PageInfo { type Query { hero(episode: Episode! = NEW_HOPE): Character - heroByTraits(traits: JSON!): Character + heroByTraits(traits: Any!): Character heroes(episodes: [Episode!]!): [Character!] character(characterIds: [String!]!): [Character!]! search(text: String!): [SearchResult] @@ -112,4 +112,4 @@ enum Unit { METERS } -scalar JSON +scalar Any diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_MissingRequired.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_MissingRequired.snap index 98b82963702..48ad3894c19 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_MissingRequired.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_MissingRequired.snap @@ -2,10 +2,10 @@ "errors": [ { "message": "The required input field `field1` is missing.", - "path": [ - "field1" - ], "extensions": { + "inputPath": [ + "field1" + ], "field": "Test2Input.field1" } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_OneInvalidField.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_OneInvalidField.snap index 46a6f0f6b41..f11b539587e 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_OneInvalidField.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_OneInvalidField.snap @@ -2,10 +2,10 @@ "errors": [ { "message": "The field `field3` does not exist on the type `TestInput`.", - "path": [ - "root" - ], "extensions": { + "inputPath": [ + "root" + ], "type": "TestInput" } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_TwoInvalidFields.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_TwoInvalidFields.snap index dd0a7b110a8..1a11b1e6622 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_TwoInvalidFields.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Deserialize_InputObject_AllIsSet_TwoInvalidFields.snap @@ -2,10 +2,10 @@ "errors": [ { "message": "The fields ``field3`, `field4`` do not exist on the type `TestInput`.", - "path": [ - "root" - ], "extensions": { + "inputPath": [ + "root" + ], "type": "TestInput" } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.OneOf_A_and_B_Are_Set.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.OneOf_A_and_B_Are_Set.snap index 12aba87d2ff..11ad4beb419 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.OneOf_A_and_B_Are_Set.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.OneOf_A_and_B_Are_Set.snap @@ -1,20 +1,21 @@ -[ +[ { "Message": "More than one field of the OneOf Input Object `OneOfInput` is set. OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null.", "Code": "HC0055", - "Path": { - "Name": "root", - "Parent": { - "Parent": null, - "Length": 0, - "IsRoot": true - }, - "Length": 1, - "IsRoot": false - }, + "Path": null, "Locations": null, "Extensions": { - "code": "HC0055" + "code": "HC0055", + "inputPath": { + "Name": "root", + "Parent": { + "Parent": null, + "Length": 0, + "IsRoot": true + }, + "Length": 1, + "IsRoot": false + } }, "Exception": null } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.OneOf_A_is_Null_and_B_has_Value.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.OneOf_A_is_Null_and_B_has_Value.snap index 12aba87d2ff..11ad4beb419 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.OneOf_A_is_Null_and_B_has_Value.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.OneOf_A_is_Null_and_B_has_Value.snap @@ -1,20 +1,21 @@ -[ +[ { "Message": "More than one field of the OneOf Input Object `OneOfInput` is set. OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null.", "Code": "HC0055", - "Path": { - "Name": "root", - "Parent": { - "Parent": null, - "Length": 0, - "IsRoot": true - }, - "Length": 1, - "IsRoot": false - }, + "Path": null, "Locations": null, "Extensions": { - "code": "HC0055" + "code": "HC0055", + "inputPath": { + "Name": "root", + "Parent": { + "Parent": null, + "Length": 0, + "IsRoot": true + }, + "Length": 1, + "IsRoot": false + } }, "Exception": null } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_MissingRequired.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_MissingRequired.snap index 98b82963702..48ad3894c19 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_MissingRequired.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_MissingRequired.snap @@ -2,10 +2,10 @@ "errors": [ { "message": "The required input field `field1` is missing.", - "path": [ - "field1" - ], "extensions": { + "inputPath": [ + "field1" + ], "field": "Test2Input.field1" } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_OneInvalidField.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_OneInvalidField.snap index 46a6f0f6b41..f11b539587e 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_OneInvalidField.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_OneInvalidField.snap @@ -2,10 +2,10 @@ "errors": [ { "message": "The field `field3` does not exist on the type `TestInput`.", - "path": [ - "root" - ], "extensions": { + "inputPath": [ + "root" + ], "type": "TestInput" } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_TwoInvalidFields.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_TwoInvalidFields.snap index dd0a7b110a8..1a11b1e6622 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_TwoInvalidFields.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_AllIsSet_TwoInvalidFields.snap @@ -2,10 +2,10 @@ "errors": [ { "message": "The fields ``field3`, `field4`` do not exist on the type `TestInput`.", - "path": [ - "root" - ], "extensions": { + "inputPath": [ + "root" + ], "type": "TestInput" } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_NonNullViolation.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_NonNullViolation.snap index 7ae20215023..184d68991eb 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_NonNullViolation.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/InputParserTests.Parse_InputObject_NonNullViolation.snap @@ -1,12 +1,12 @@ -{ +{ "errors": [ { "message": "Cannot accept null for non-nullable input.", - "path": [ - "root" - ], "extensions": { - "code": "HC0018" + "code": "HC0018", + "inputPath": [ + "root" + ] } } ] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_empty_object_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_empty_object_Error.snap index 98e79e75e6d..47769aedb77 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_empty_object_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_empty_object_Error.snap @@ -2,11 +2,11 @@ "errors": [ { "message": "The OneOf Input Objects `ExampleInput` require that exactly one field must be supplied and that field must not be `null`. OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null.", - "path": [ - "var" - ], "extensions": { - "code": "HC0054" + "code": "HC0054", + "inputPath": [ + "var" + ] } } ] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_abc_and_B_set_to_123_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_abc_and_B_set_to_123_Error.snap index 1bc241ec8b4..bd8f0fac897 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_abc_and_B_set_to_123_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_abc_and_B_set_to_123_Error.snap @@ -2,11 +2,11 @@ "errors": [ { "message": "More than one field of the OneOf Input Object `ExampleInput` is set. OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null.", - "path": [ - "var" - ], "extensions": { - "code": "HC0055" + "code": "HC0055", + "inputPath": [ + "var" + ] } } ] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_abc_and_B_set_to_null_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_abc_and_B_set_to_null_Error.snap index 1bc241ec8b4..bd8f0fac897 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_abc_and_B_set_to_null_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_abc_and_B_set_to_null_Error.snap @@ -2,11 +2,11 @@ "errors": [ { "message": "More than one field of the OneOf Input Object `ExampleInput` is set. OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null.", - "path": [ - "var" - ], "extensions": { - "code": "HC0055" + "code": "HC0055", + "inputPath": [ + "var" + ] } } ] diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_null_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_null_Error.snap index 31e0cf7e53e..1094bb404a8 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_null_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_A_set_to_null_Error.snap @@ -2,12 +2,12 @@ "errors": [ { "message": "`null` was set to the field `a`of the OneOf Input Object `ExampleInput`. OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null.", - "path": [ - "var", - "a" - ], "extensions": { "code": "HC0056", + "inputPath": [ + "var", + "a" + ], "coordinate": "ExampleInput.a" } } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_B_set_to_abc_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_B_set_to_abc_Error.snap index 1af77a3efa7..6b20d16d4c8 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_B_set_to_abc_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_B_set_to_abc_Error.snap @@ -2,11 +2,11 @@ "errors": [ { "message": "Int cannot coerce the given value JSON element of type `String` to a runtime value.", - "path": [ - "var", - "b" - ], "extensions": { + "inputPath": [ + "var", + "b" + ], "coordinate": "ExampleInput.b", "fieldType": "Int" } diff --git a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_fields_B_and_C_set_Error.snap b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_fields_B_and_C_set_Error.snap index 1bc241ec8b4..bd8f0fac897 100644 --- a/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_fields_B_and_C_set_Error.snap +++ b/src/HotChocolate/Core/test/Types.Tests/Types/__snapshots__/OneOfIntegrationTests.Var_is_object_with_fields_B_and_C_set_Error.snap @@ -2,11 +2,11 @@ "errors": [ { "message": "More than one field of the OneOf Input Object `ExampleInput` is set. OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null.", - "path": [ - "var" - ], "extensions": { - "code": "HC0055" + "code": "HC0055", + "inputPath": [ + "var" + ] } } ] From 290b70d8b83637cb36bd53a3e8f0985629c44dd1 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 13 Jan 2026 23:37:05 +0100 Subject: [PATCH 099/144] fixed more tests --- ...TypeConverterTests.ExceptionPropagation.cs | 82 ++++++++--- .../TypeConverter/TypeConverterTests.cs | 132 ++++++++++-------- ...AvailableInErrorFilter_DirectiveInput.snap | 5 +- ...InErrorFilter_Mutation_DirectiveInput.snap | 3 - ...ithMutationConventions_DirectiveInput.snap | 3 - ...r_WithQueryConventions_DirectiveInput.snap | 3 - 6 files changed, 134 insertions(+), 94 deletions(-) diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/TypeConverterTests.ExceptionPropagation.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/TypeConverterTests.ExceptionPropagation.cs index 471170e6d8d..19a9252ca15 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/TypeConverterTests.ExceptionPropagation.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/TypeConverterTests.ExceptionPropagation.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using HotChocolate.Types; using Microsoft.Extensions.DependencyInjection; @@ -87,11 +87,21 @@ public async Task Exception_IsAvailableInErrorFilter(TestCase testCase) .BuildRequestExecutorAsync(); // act - var variableValues = - testCase.DisplayName.Contains("VariableInput") - ? new Dictionary<string, object?> { ["v"] = "foo" } - : []; - var result = await executor.ExecuteAsync(testCase.QueryString, variableValues: variableValues); + var requestBuilder = OperationRequestBuilder + .New() + .SetDocument(testCase.QueryString); + + if (testCase.DisplayName.Contains("VariableInput")) + { + requestBuilder.SetVariableValues( + """ + { + "v": "foo" + } + """); + } + + var result = await executor.ExecuteAsync(requestBuilder.Build()); // assert Assert.IsType<CustomIdSerializationException>(caughtException); @@ -120,13 +130,23 @@ public async Task Exception_IsAvailableInErrorFilter_Mutation(TestCase testCase) .BuildRequestExecutorAsync(); // act - var variableValues = - testCase.DisplayName.Contains("VariableInput") - ? new Dictionary<string, object?> { ["v"] = "foo" } - : []; - var mutation = $"mutation{testCase.QueryString.TrimStart("query")}"; - var result = await executor.ExecuteAsync(mutation, variableValues: variableValues); + + var requestBuilder = OperationRequestBuilder + .New() + .SetDocument(mutation); + + if (testCase.DisplayName.Contains("VariableInput")) + { + requestBuilder.SetVariableValues( + """ + { + "v": "foo" + } + """); + } + + var result = await executor.ExecuteAsync(requestBuilder.Build()); // assert Assert.IsType<CustomIdSerializationException>(caughtException); @@ -156,12 +176,21 @@ public async Task Exception_IsAvailableInErrorFilter_Mutation_WithMutationConven .BuildRequestExecutorAsync(); // act - var variableValues = - testCase.DisplayName.Contains("VariableInput") - ? new Dictionary<string, object?> { ["v"] = "foo" } - : []; + var requestBuilder = OperationRequestBuilder + .New() + .SetDocument(testCase.QueryString); + + if (testCase.DisplayName.Contains("VariableInput")) + { + requestBuilder.SetVariableValues( + """ + { + "v": "foo" + } + """); + } - var result = await executor.ExecuteAsync(testCase.QueryString, variableValues: variableValues); + var result = await executor.ExecuteAsync(requestBuilder.Build()); // assert Assert.IsType<CustomIdSerializationException>(caughtException); @@ -191,12 +220,21 @@ public async Task Exception_IsAvailableInErrorFilter_WithQueryConventions(TestCa .BuildRequestExecutorAsync(); // act - var variableValues = - testCase.DisplayName.Contains("VariableInput") - ? new Dictionary<string, object?> { ["v"] = "foo" } - : []; + var requestBuilder = OperationRequestBuilder + .New() + .SetDocument(testCase.QueryString); + + if (testCase.DisplayName.Contains("VariableInput")) + { + requestBuilder.SetVariableValues( + """ + { + "v": "foo" + } + """); + } - var result = await executor.ExecuteAsync(testCase.QueryString, variableValues: variableValues); + var result = await executor.ExecuteAsync(requestBuilder.Build()); // assert Assert.IsType<CustomIdSerializationException>(caughtException); diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/TypeConverterTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/TypeConverterTests.cs index 2d6ed74fd47..9a0da7dfc81 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/TypeConverterTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/TypeConverterTests.cs @@ -13,28 +13,26 @@ public partial class TypeConverterTests public async Task VariablesAreCoercedToTypesOtherThanTheDefinedClrTypes() { await ExpectValid( - @" - query foo($a: FooInput!) { - foo(foo: $a) { - id - time - number - } - }", - configure: c => c.AddQueryType<Query>(), - request: r => r.SetVariableValues( - new Dictionary<string, object?> - { - { - "a", - new Dictionary<string, object> - { - { "id", "934b987bc0d842bbabfd8a3b3f8b476e" }, - { "time", "2018-05-29T01:00:00Z" }, - { "number", (byte)123 } - } - } - })) + """ + query foo($a: FooInput!) { + foo(foo: $a) { + id + time + number + } + } + """, + configure: c => c.AddQueryType<Query>(), + request: r => r.SetVariableValues( + """ + { + "a": { + "id": "934b987bc0d842bbabfd8a3b3f8b476e", + "time": "2018-05-29T01:00:00Z", + "number": 123 + } + } + """)) .MatchSnapshotAsync(); } @@ -42,27 +40,35 @@ query foo($a: FooInput!) { public async Task VariableIsCoercedToTypesOtherThanTheDefinedClrTypes() { await ExpectValid( - @" - query foo($time: DateTime) { - time(time: $time) - }", - configure: c => c.AddQueryType<QueryType>(), - request: r => r.SetVariableValues( - new Dictionary<string, object?> { { "time", "2018-05-29T01:00:00Z" } })) + """ + query foo($time: DateTime) { + time(time: $time) + } + """, + configure: c => c.AddQueryType<QueryType>(), + request: r => r.SetVariableValues( + """ + { + "time": "2018-05-29T01:00:00Z" + } + """)) .MatchSnapshotAsync(); } [Fact] public async Task VariableIsNotSerializedAndMustBeConvertedToClrType() { + // This test uses a Dictionary with an actual DateTime object (not a string) + // to verify that non-serialized CLR types are properly converted. var time = new DateTime(2018, 01, 01, 12, 10, 10, DateTimeKind.Utc); await ExpectValid( - @" - query foo($time: DateTime) { - time(time: $time) - }", - configure: c => c.AddQueryType<QueryType>(), - request: r => r.SetVariableValues(new Dictionary<string, object?> { { "time", time } })) + """ + query foo($time: DateTime) { + time(time: $time) + } + """, + configure: c => c.AddQueryType<QueryType>(), + request: r => r.SetVariableValues(new Dictionary<string, object?> { { "time", time } })) .MatchSnapshotAsync(); } @@ -70,28 +76,26 @@ query foo($time: DateTime) { public async Task VariableIsPartlyNotSerializedAndMustBeConvertedToClrType() { await ExpectValid( - @" - query foo($a: FooInput!) { - foo(foo: $a) { - id - time - number - } - }", - configure: c => c.AddQueryType<QueryType>(), - request: r => r.SetVariableValues( - new Dictionary<string, object?> - { - { - "a", - new Dictionary<string, object> - { - { "id", "934b987bc0d842bbabfd8a3b3f8b476e" }, - { "time", "2018-05-29T01:00:00Z" }, - { "number", (byte)123 } - } - } - })) + """ + query foo($a: FooInput!) { + foo(foo: $a) { + id + time + number + } + } + """, + configure: c => c.AddQueryType<QueryType>(), + request: r => r.SetVariableValues( + """ + { + "a": { + "id": "934b987bc0d842bbabfd8a3b3f8b476e", + "time": "2018-05-29T01:00:00Z", + "number": 123 + } + } + """)) .MatchSnapshotAsync(); } @@ -162,7 +166,12 @@ public async Task UseSet_As_InputType() await new ServiceCollection() .AddGraphQLServer() .AddQueryType<QuerySet>() - .ExecuteRequestAsync("{ set(set: [\"abc\", \"abc\"]) }"); + .ExecuteRequestAsync( + """ + { + set(set: ["abc", "abc"]) + } + """); result.MatchInlineSnapshot( """ @@ -183,7 +192,12 @@ public async Task UseHashSet_As_InputType() await new ServiceCollection() .AddGraphQLServer() .AddQueryType<QuerySet>() - .ExecuteRequestAsync("{ set2(set: [\"abc\", \"abc\"]) }"); + .ExecuteRequestAsync( + """ + { + set2(set: ["abc", "abc"]) + } + """); result.MatchInlineSnapshot( """ diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_DirectiveInput.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_DirectiveInput.snap index 17aa6c82d95..1a455183e28 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_DirectiveInput.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_DirectiveInput.snap @@ -1,4 +1,4 @@ -{ +{ "errors": [ { "message": "The value provided for `arg` is not in a valid format.", @@ -8,9 +8,6 @@ "column": 31 } ], - "path": [ - "echo" - ], "extensions": { "code": "HC0001", "coordinate": "boom.arg", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_Mutation_DirectiveInput.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_Mutation_DirectiveInput.snap index 18b303febaf..f6705818aff 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_Mutation_DirectiveInput.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_Mutation_DirectiveInput.snap @@ -8,9 +8,6 @@ "column": 39 } ], - "path": [ - "echo" - ], "extensions": { "code": "HC0001", "coordinate": "boom.arg", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_Mutation_WithMutationConventions_DirectiveInput.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_Mutation_WithMutationConventions_DirectiveInput.snap index e1fce97a8c2..773882b80a8 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_Mutation_WithMutationConventions_DirectiveInput.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_Mutation_WithMutationConventions_DirectiveInput.snap @@ -8,9 +8,6 @@ "column": 49 } ], - "path": [ - "echo" - ], "extensions": { "code": "HC0001", "coordinate": "boom.arg", diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_WithQueryConventions_DirectiveInput.snap b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_WithQueryConventions_DirectiveInput.snap index 442d56301e5..1a455183e28 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_WithQueryConventions_DirectiveInput.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/TypeConverter/__snapshots__/TypeConverterTests.Exception_IsAvailableInErrorFilter_WithQueryConventions_DirectiveInput.snap @@ -8,9 +8,6 @@ "column": 31 } ], - "path": [ - "echo" - ], "extensions": { "code": "HC0001", "coordinate": "boom.arg", From fc559f1be0d15a1ccf89cb58c14474ef1805d2fa Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 13 Jan 2026 23:47:36 +0100 Subject: [PATCH 100/144] formatting --- .../SelectionIncludeConditionTests.cs | 69 ++++++++++++++++--- 1 file changed, 59 insertions(+), 10 deletions(-) diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/SelectionIncludeConditionTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/SelectionIncludeConditionTests.cs index 3ac03bc0704..0153c571adf 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/SelectionIncludeConditionTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/SelectionIncludeConditionTests.cs @@ -291,7 +291,13 @@ person @skip(if: true) @include(if: true) { } } """) - .SetVariableValues(new Dictionary<string, object?> { { "skip", true }, { "include", true } }) + .SetVariableValues( + """ + { + "skip": true, + "include": true + } + """) .Build()); result.MatchInlineSnapshot( @@ -325,7 +331,12 @@ person @skip(if: $shouldSkip) { } } """) - .SetVariableValues(new Dictionary<string, object?> { { "shouldSkip", true } }) + .SetVariableValues( + """ + { + "shouldSkip": true + } + """) .Build()); result.MatchInlineSnapshot( @@ -359,7 +370,12 @@ person @skip(if: $shouldSkip) { } } """) - .SetVariableValues(new Dictionary<string, object?> { { "shouldSkip", false } }) + .SetVariableValues( + """ + { + "shouldSkip": false + } + """) .Build()); result.MatchInlineSnapshot( @@ -393,7 +409,13 @@ person @skip(if: $skip) @include(if: $include) { } } """) - .SetVariableValues(new Dictionary<string, object?> { { "skip", true }, { "include", true } }) + .SetVariableValues( + """ + { + "skip": true, + "include": true + } + """) .Build()); result.MatchInlineSnapshot( @@ -421,7 +443,6 @@ person @skip(if: true) @include(if: false) { } } """) - .SetVariableValues(new Dictionary<string, object?> { { "skip", true }, { "include", true } }) .Build()); result.MatchInlineSnapshot( @@ -449,7 +470,13 @@ person @skip(if: $skip) @include(if: $include) { } } """) - .SetVariableValues(new Dictionary<string, object?> { { "skip", true }, { "include", false } }) + .SetVariableValues( + """ + { + "skip": true, + "include": false + } + """) .Build()); result.MatchInlineSnapshot( @@ -504,7 +531,13 @@ person @skip(if: $skip) @include(if: $include) { } } """) - .SetVariableValues(new Dictionary<string, object?> { { "skip", false }, { "include", false } }) + .SetVariableValues( + """ + { + "skip": false, + "include": false + } + """) .Build()); result.MatchInlineSnapshot( @@ -563,7 +596,13 @@ person @skip(if: $skip) @include(if: $include) { } } """) - .SetVariableValues(new Dictionary<string, object?> { { "skip", false }, { "include", true } }) + .SetVariableValues( + """ + { + "skip": false, + "include": true + } + """) .Build()); result.MatchInlineSnapshot( @@ -622,7 +661,12 @@ person @skip(if: $skip){ } } """) - .SetVariableValues(new Dictionary<string, object?> { { "skip", true } }) + .SetVariableValues( + """ + { + "skip": true + } + """) .Build()); result.MatchInlineSnapshot( @@ -693,7 +737,12 @@ fragment B on Person { __typename } """) - .SetVariableValues(new Dictionary<string, object?> { { "permission", false } }) + .SetVariableValues( + """ + { + "permission": false + } + """) .Build()); result.MatchInlineSnapshot( From 68707c877eee503d24a177000054f99db0eeed99 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Wed, 14 Jan 2026 22:13:21 +0100 Subject: [PATCH 101/144] Fixed more stuff --- .../Execution/Processing/OperationCompiler.cs | 27 ++++++++++++++----- .../Execution/Processing/SelectionSet.cs | 5 ---- .../Integration/DataLoader/Query.cs | 4 --- .../Execution.Tests/WarmupRequestTests.cs | 2 +- .../test/Types.Analyzers.Tests/TestHelper.cs | 4 +-- .../InlineFragmentOperationRewriter.cs | 5 ++-- 6 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 7459f8d6abe..822d9f1daaa 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -31,7 +31,10 @@ internal OperationCompiler( _schema = schema; _inputValueParser = inputValueParser; _fieldsPool = fieldsPool; - _documentRewriter = new InlineFragmentOperationRewriter(schema, removeStaticallyExcludedSelections: true); + _documentRewriter = new InlineFragmentOperationRewriter( + schema, + removeStaticallyExcludedSelections: true, + includeTypeNameToEmptySelectionSets: false); _optimizers = optimizers; } @@ -225,8 +228,7 @@ private void CollectFields( nodes.Add(new FieldSelectionNode(fieldNode, pathIncludeFlags)); } - - if (selection is InlineFragmentNode inlineFragmentNode + else if (selection is InlineFragmentNode inlineFragmentNode && DoesTypeApply(inlineFragmentNode.TypeCondition, typeContext)) { var pathIncludeFlags = parentIncludeFlags; @@ -260,6 +262,7 @@ private SelectionSet BuildSelectionSet( var isConditional = false; var includeFlags = new List<ulong>(); var selectionSetId = ++lastId; + var alwaysIncluded = false; foreach (var (responseName, nodes) in fieldMap) { @@ -268,7 +271,11 @@ private SelectionSet BuildSelectionSet( var first = nodes[0]; var isInternal = IsInternal(first.Node); - if (first.PathIncludeFlags > 0) + if (first.PathIncludeFlags == 0) + { + alwaysIncluded = true; + } + else { includeFlags.Add(first.PathIncludeFlags); } @@ -285,7 +292,15 @@ private SelectionSet BuildSelectionSet( $"The syntax nodes for the response name {responseName} are not all the same."); } - if (next.PathIncludeFlags > 0) + if (next.PathIncludeFlags == 0) + { + alwaysIncluded = true; + if (includeFlags.Count > 0) + { + includeFlags.Clear(); + } + } + else if (!alwaysIncluded) { includeFlags.Add(next.PathIncludeFlags); } @@ -317,7 +332,7 @@ private SelectionSet BuildSelectionSet( responseName, field, nodes.ToArray(), - includeFlags.ToArray(), + includeFlags.Count > 0 ? includeFlags.ToArray() : [], isInternal, arguments, fieldDelegate, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs index b27ea77f5b5..d545b1b4805 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSet.cs @@ -27,11 +27,6 @@ internal SelectionSet( { ArgumentNullException.ThrowIfNull(selections); - if (selections.Length == 0) - { - throw new ArgumentException("Selections cannot be empty.", nameof(selections)); - } - Id = id; Path = path; Type = type; diff --git a/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/Query.cs b/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/Query.cs index c7514f49669..1d886d10930 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/Query.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Integration/DataLoader/Query.cs @@ -7,7 +7,6 @@ public class Query { public Task<string?> GetWithDataLoader( string key, - FieldNode fieldSelection, TestDataLoader testDataLoader, CancellationToken cancellationToken) { @@ -18,7 +17,6 @@ public class Query public async Task<string?> GetWithDataLoader2( string key, - FieldNode fieldSelection, TestDataLoader testDataLoader, CancellationToken cancellationToken) { @@ -27,7 +25,6 @@ public class Query public Task<string?> GetDataLoaderWithInterface( string key, - FieldNode fieldSelection, ITestDataLoader testDataLoader, CancellationToken cancellationToken) { @@ -57,7 +54,6 @@ public class Bar { public Task<string?> GetWithDataLoader( string key, - FieldNode fieldSelection, TestDataLoader testDataLoader, CancellationToken cancellationToken) { diff --git a/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs b/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs index 56dfcd88f37..2444972cb98 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs @@ -46,7 +46,7 @@ public async Task Warmup_Request_Warms_Up_Caches() var regularOperationResult = regularResult.ExpectOperationResult(); // assert 2 - Assert.Null(regularOperationResult.Errors); + Assert.Empty(regularOperationResult.Errors); Assert.False(regularOperationResult.IsDataNull); Assert.True(regularOperationResult.UnwrapData().EnumerateObject().Any()); diff --git a/src/HotChocolate/Core/test/Types.Analyzers.Tests/TestHelper.cs b/src/HotChocolate/Core/test/Types.Analyzers.Tests/TestHelper.cs index c37a7671d79..72d4621bea0 100644 --- a/src/HotChocolate/Core/test/Types.Analyzers.Tests/TestHelper.cs +++ b/src/HotChocolate/Core/test/Types.Analyzers.Tests/TestHelper.cs @@ -62,8 +62,8 @@ public static Snapshot GetGeneratedSourceSnapshot( // HotChocolate.Execution.Abstractions MetadataReference.CreateFromFile(typeof(IRequestExecutorBuilder).Assembly.Location), - // HotChocolate.Execution.DependencyInjection - MetadataReference.CreateFromFile(typeof(RequestExecutorBuilderExtensions).Assembly.Location), + // HotChocolate.Execution.Operation.Abstractions + MetadataReference.CreateFromFile(typeof(ISelection).Assembly.Location), // HotChocolate.Types MetadataReference.CreateFromFile(typeof(ObjectTypeAttribute).Assembly.Location), diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/InlineFragmentOperationRewriter.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/InlineFragmentOperationRewriter.cs index 47a1105c0f9..65633c5f48f 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/InlineFragmentOperationRewriter.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Utilities/Rewriters/InlineFragmentOperationRewriter.cs @@ -9,7 +9,8 @@ namespace HotChocolate.Fusion.Rewriters; public sealed class InlineFragmentOperationRewriter( ISchemaDefinition schema, bool removeStaticallyExcludedSelections = false, - bool ignoreMissingTypeSystemMembers = false) + bool ignoreMissingTypeSystemMembers = false, + bool includeTypeNameToEmptySelectionSets = true) { private List<ISelectionNode>? _selections; @@ -80,7 +81,7 @@ internal void CollectSelections(SelectionSetNode selectionSet, Context context) internal void RewriteSelections(Context context) { - if (context.Selections.Count == 0) + if (includeTypeNameToEmptySelectionSets && context.Selections.Count == 0) { context.Selections.Add(s_typeNameField); context.Fields.Add(IntrospectionFieldNames.TypeName, [s_typeNameField]); From a9145e852b6f7e2e2bb43820be96d833d74c04e5 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 15 Jan 2026 12:54:24 +0100 Subject: [PATCH 102/144] fix --- .../Processing/OperationResultBuilder.cs | 12 +- .../Execution.Tests/MiddlewareContextTests.cs | 2 +- .../Processing/VisibilityTests.cs | 171 +++---------- ...tarWarsGetFriendsDeferInListTest.Client.cs | 232 ++---------------- .../StarWarsGetFriendsDeferredTest.Client.cs | 232 +++--------------- 5 files changed, 95 insertions(+), 554 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs index fe204764cf1..36f9ccc1f11 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationResultBuilder.cs @@ -79,15 +79,15 @@ public void SetResultState(string key, UpdateState<object?> value) { lock (_sync) { - if (Extensions.TryGetValue(key, out var currentValue)) + if (ContextData.TryGetValue(key, out var currentValue)) { var newValue = value(key, currentValue); - Extensions = Extensions.SetItem(key, newValue); + ContextData = ContextData.SetItem(key, newValue); } else { var initialValue = value(key, null); - Extensions = Extensions.Add(key, initialValue); + ContextData = ContextData.Add(key, initialValue); } } } @@ -96,15 +96,15 @@ public void SetResultState<TState>(string key, TState state, UpdateState<object? { lock (_sync) { - if (Extensions.TryGetValue(key, out var currentValue)) + if (ContextData.TryGetValue(key, out var currentValue)) { var newValue = value(key, currentValue, state); - Extensions = Extensions.SetItem(key, newValue); + ContextData = ContextData.SetItem(key, newValue); } else { var initialValue = value(key, null, state); - Extensions = Extensions.Add(key, initialValue); + ContextData = ContextData.Add(key, initialValue); } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs b/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs index c772c25028d..79fe1136c93 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/MiddlewareContextTests.cs @@ -1,6 +1,6 @@ +using Microsoft.Extensions.DependencyInjection; using HotChocolate.Execution.Processing; using HotChocolate.Language; -using Microsoft.Extensions.DependencyInjection; using HotChocolate.Resolvers; using HotChocolate.Types; diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/VisibilityTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/VisibilityTests.cs index 13a0bee45dd..65fe8bb49c8 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/VisibilityTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/VisibilityTests.cs @@ -1,3 +1,6 @@ +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; using HotChocolate.Language; using Moq; @@ -5,38 +8,6 @@ namespace HotChocolate.Execution.Processing; public class VisibilityTests { - [Fact] - public void TryExtract_Skip_With_Literal() - { - // arrange - var variables = new Mock<IVariableValueCollection>(); - var field = Utf8GraphQLParser.Syntax.ParseField("field @skip(if: true)"); - - // act - var hasIncludeCondition = IncludeCondition.TryCreate(field, out var includeCondition); - - // assert - Assert.True(hasIncludeCondition); - Assert.False(includeCondition.IsIncluded(variables.Object)); - } - - [Fact] - public void Equals_Skip_With_Literal_True() - { - // arrange - var fieldA = Utf8GraphQLParser.Syntax.ParseField("fieldA @skip(if: true)"); - var fieldB = Utf8GraphQLParser.Syntax.ParseField("fieldB @skip(if: true)"); - - // act - var hasIncludeConditionA = IncludeCondition.TryCreate(fieldA, out var includeConditionA); - var hasIncludeConditionB = IncludeCondition.TryCreate(fieldB, out var includeConditionB); - - // assert - Assert.True(hasIncludeConditionA); - Assert.True(hasIncludeConditionB); - Assert.True(includeConditionA.Equals(includeConditionB)); - } - [Fact] public void Equals_Skip_With_Variable_True() { @@ -54,40 +25,6 @@ public void Equals_Skip_With_Variable_True() Assert.True(includeConditionA.Equals(includeConditionB)); } - [Fact] - public void Equals_Skip_With_Literal_False() - { - // arrange - var fieldA = Utf8GraphQLParser.Syntax.ParseField("fieldA @skip(if: true)"); - var fieldB = Utf8GraphQLParser.Syntax.ParseField("fieldB @skip(if: false)"); - - // act - var hasIncludeConditionA = IncludeCondition.TryCreate(fieldA, out var includeConditionA); - var hasIncludeConditionB = IncludeCondition.TryCreate(fieldB, out var includeConditionB); - - // assert - Assert.True(hasIncludeConditionA); - Assert.True(hasIncludeConditionB); - Assert.False(includeConditionA.Equals(includeConditionB)); - } - - [Fact] - public void Equals_Skip_With_Variable_False() - { - // arrange - var fieldA = Utf8GraphQLParser.Syntax.ParseField("fieldA @skip(if: true)"); - var fieldB = Utf8GraphQLParser.Syntax.ParseField("fieldB @skip(if: $a)"); - - // act - var hasIncludeConditionA = IncludeCondition.TryCreate(fieldA, out var includeConditionA); - var hasIncludeConditionB = IncludeCondition.TryCreate(fieldB, out var includeConditionB); - - // assert - Assert.True(hasIncludeConditionA); - Assert.True(hasIncludeConditionB); - Assert.False(includeConditionA.Equals(includeConditionB)); - } - [Fact] public void TryExtract_False() { @@ -116,67 +53,11 @@ public void TryExtract_False_2() Assert.False(hasIncludeCondition); } - [Fact] - public void TryExtract_True() - { - // arrange - var variables = new Mock<IVariableValueCollection>(); - var field = Utf8GraphQLParser.Syntax.ParseField("field @skip(if: true)"); - - // act - var hasIncludeCondition = IncludeCondition.TryCreate(field, out var includeCondition); - - // assert - Assert.True(hasIncludeCondition); - Assert.False(includeCondition.IsIncluded(variables.Object)); - } - - [Fact] - public void GetHashCode_Skip_With_Literal_Equal() - { - // arrange - var fieldA = Utf8GraphQLParser.Syntax.ParseField("fieldA @skip(if: true)"); - var fieldB = Utf8GraphQLParser.Syntax.ParseField("fieldB @skip(if: true)"); - - var hasIncludeConditionA = IncludeCondition.TryCreate(fieldA, out var includeConditionA); - var hasIncludeConditionB = IncludeCondition.TryCreate(fieldB, out var includeConditionB); - - // act - var hashCodeA = includeConditionA.GetHashCode(); - var hashCodeB = includeConditionB.GetHashCode(); - - // assert - Assert.True(hasIncludeConditionA); - Assert.True(hasIncludeConditionB); - Assert.Equal(hashCodeA, hashCodeB); - } - - [Fact] - public void GetHashCode_Skip_With_Literal_NotEqual() - { - // arrange - var fieldA = Utf8GraphQLParser.Syntax.ParseField("fieldA @skip(if: true)"); - var fieldB = Utf8GraphQLParser.Syntax.ParseField("fieldB @skip(if: false)"); - - var hasIncludeConditionA = IncludeCondition.TryCreate(fieldA, out var includeConditionA); - var hasIncludeConditionB = IncludeCondition.TryCreate(fieldB, out var includeConditionB); - - // act - var hashCodeA = includeConditionA.GetHashCode(); - var hashCodeB = includeConditionB.GetHashCode(); - - // assert - Assert.True(hasIncludeConditionA); - Assert.True(hasIncludeConditionB); - Assert.NotEqual(hashCodeA, hashCodeB); - } - [Fact] public void IsVisible_Skip_Variables_True() { // arrange - var variables = new Mock<IVariableValueCollection>(); - variables.Setup(t => t.GetValue<BooleanValueNode>(It.IsAny<string>())).Returns(BooleanValueNode.False); + var variables = new MockVariables(BooleanValueNode.False); var field = Utf8GraphQLParser.Syntax.ParseField("field @skip(if: $a)"); // act @@ -184,15 +65,14 @@ public void IsVisible_Skip_Variables_True() // assert Assert.True(hasIncludeCondition); - Assert.True(includeCondition.IsIncluded(variables.Object)); + Assert.True(includeCondition.IsIncluded(variables)); } [Fact] public void IsVisible_Include_Variables_True() { // arrange - var variables = new Mock<IVariableValueCollection>(); - variables.Setup(t => t.GetValue<BooleanValueNode>(It.IsAny<string>())).Returns(BooleanValueNode.True); + var variables = new MockVariables(BooleanValueNode.True); var field = Utf8GraphQLParser.Syntax.ParseField("field @include(if: $a)"); // act @@ -200,21 +80,34 @@ public void IsVisible_Include_Variables_True() // assert Assert.True(hasIncludeCondition); - Assert.True(includeCondition.IsIncluded(variables.Object)); + Assert.True(includeCondition.IsIncluded(variables)); } - [Fact] - public void IsVisible_Include_Literal_True() + private class MockVariables(BooleanValueNode value) : IVariableValueCollection { - // arrange - var variables = new Mock<IVariableValueCollection>(); - var field = Utf8GraphQLParser.Syntax.ParseField("field @include(if: true)"); - - // act - var hasIncludeCondition = IncludeCondition.TryCreate(field, out var includeCondition); - - // assert - Assert.True(hasIncludeCondition); - Assert.True(includeCondition.IsIncluded(variables.Object)); + public BooleanValueNode Value { get; } = value; + + public bool IsEmpty { get; } + + public T GetValue<T>(string name) where T : IValueNode + { + throw new NotImplementedException(); + } + + public bool TryGetValue<T>(string name, [NotNullWhen(true)] out T? value) where T : IValueNode + { + value = (T)(object)Value; + return true; + } + + public IEnumerator<Execution.VariableValue> GetEnumerator() + { + throw new NotImplementedException(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } } } diff --git a/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/StarWarsGetFriendsDeferInListTest.Client.cs b/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/StarWarsGetFriendsDeferInListTest.Client.cs index 511b258599f..d6e6d05215e 100644 --- a/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/StarWarsGetFriendsDeferInListTest.Client.cs +++ b/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/StarWarsGetFriendsDeferInListTest.Client.cs @@ -51,9 +51,7 @@ public static partial class StarWarsGetFriendsDeferInListClientServiceCollection global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.GetHero_Hero_Droid>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.GetHero_Hero_DroidFromDroidEntityMapper>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.GetHero_Hero_Human>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.GetHero_Hero_HumanFromHumanEntityMapper>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.GetHero_Hero_Friends_Nodes_Droid>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.GetHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper>(services); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.CharacterName>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.CharacterNameFromDroidEntityMapper>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.GetHero_Hero_Friends_Nodes_Human>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.GetHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper>(services); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.CharacterName>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.CharacterNameFromHumanEntityMapper>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.Serialization.ISerializer, global::StrawberryShake.Serialization.StringSerializer>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.Serialization.ISerializer, global::StrawberryShake.Serialization.BooleanSerializer>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.Serialization.ISerializer, global::StrawberryShake.Serialization.ByteSerializer>(services); @@ -392,78 +390,15 @@ public GetHero_Hero_Friends_FriendsConnection(global::System.Collections.Generic // StrawberryShake.CodeGeneration.CSharp.Generators.ResultTypeGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] - public partial class CharacterName : global::System.IEquatable<CharacterName>, ICharacterName + public partial class GetHero_Hero_Friends_Nodes_Droid : global::System.IEquatable<GetHero_Hero_Friends_Nodes_Droid>, IGetHero_Hero_Friends_Nodes_Droid { - public CharacterName(global::System.String name) + public GetHero_Hero_Friends_Nodes_Droid(global::System.String name) { Name = name; } public global::System.String Name { get; } - public virtual global::System.Boolean Equals(CharacterName? other) - { - if (ReferenceEquals(null, other)) - { - return false; - } - - if (ReferenceEquals(this, other)) - { - return true; - } - - if (other.GetType() != GetType()) - { - return false; - } - - return (Name.Equals(other.Name)); - } - - public override global::System.Boolean Equals(global::System.Object? obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - if (obj.GetType() != GetType()) - { - return false; - } - - return Equals((CharacterName)obj); - } - - public override global::System.Int32 GetHashCode() - { - unchecked - { - int hash = 5; - hash ^= 397 * Name.GetHashCode(); - return hash; - } - } - } - - // StrawberryShake.CodeGeneration.CSharp.Generators.ResultTypeGenerator - [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] - public partial class GetHero_Hero_Friends_Nodes_Droid : global::System.IEquatable<GetHero_Hero_Friends_Nodes_Droid>, IGetHero_Hero_Friends_Nodes_Droid - { - private readonly ICharacterName? _characterName; - public GetHero_Hero_Friends_Nodes_Droid(ICharacterName? characterName) - { - this._characterName = characterName; - } - - public ICharacterName? CharacterName => _characterName; - public virtual global::System.Boolean Equals(GetHero_Hero_Friends_Nodes_Droid? other) { if (ReferenceEquals(null, other)) @@ -481,7 +416,7 @@ public GetHero_Hero_Friends_Nodes_Droid(ICharacterName? characterName) return false; } - return (((CharacterName is null && other.CharacterName is null) || CharacterName != null && CharacterName.Equals(other.CharacterName))); + return (Name.Equals(other.Name)); } public override global::System.Boolean Equals(global::System.Object? obj) @@ -509,33 +444,22 @@ public GetHero_Hero_Friends_Nodes_Droid(ICharacterName? characterName) unchecked { int hash = 5; - if (CharacterName != null) - { - hash ^= 397 * CharacterName.GetHashCode(); - } - + hash ^= 397 * Name.GetHashCode(); return hash; } } - - public global::System.Boolean TryGetData(out ICharacterName? data) - { - data = _characterName; - return data != null; - } } // StrawberryShake.CodeGeneration.CSharp.Generators.ResultTypeGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] public partial class GetHero_Hero_Friends_Nodes_Human : global::System.IEquatable<GetHero_Hero_Friends_Nodes_Human>, IGetHero_Hero_Friends_Nodes_Human { - private readonly ICharacterName? _characterName; - public GetHero_Hero_Friends_Nodes_Human(ICharacterName? characterName) + public GetHero_Hero_Friends_Nodes_Human(global::System.String name) { - this._characterName = characterName; + Name = name; } - public ICharacterName? CharacterName => _characterName; + public global::System.String Name { get; } public virtual global::System.Boolean Equals(GetHero_Hero_Friends_Nodes_Human? other) { @@ -554,7 +478,7 @@ public GetHero_Hero_Friends_Nodes_Human(ICharacterName? characterName) return false; } - return (((CharacterName is null && other.CharacterName is null) || CharacterName != null && CharacterName.Equals(other.CharacterName))); + return (Name.Equals(other.Name)); } public override global::System.Boolean Equals(global::System.Object? obj) @@ -582,20 +506,10 @@ public GetHero_Hero_Friends_Nodes_Human(ICharacterName? characterName) unchecked { int hash = 5; - if (CharacterName != null) - { - hash ^= 397 * CharacterName.GetHashCode(); - } - + hash ^= 397 * Name.GetHashCode(); return hash; } } - - public global::System.Boolean TryGetData(out ICharacterName? data) - { - data = _characterName; - return data != null; - } } // StrawberryShake.CodeGeneration.CSharp.Generators.ResultInterfaceGenerator @@ -655,23 +569,20 @@ public partial interface ICharacterName // StrawberryShake.CodeGeneration.CSharp.Generators.ResultInterfaceGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] - public partial interface IGetHero_Hero_Friends_Nodes + public partial interface IGetHero_Hero_Friends_Nodes : ICharacterName { - public ICharacterName? CharacterName { get; } } // StrawberryShake.CodeGeneration.CSharp.Generators.ResultInterfaceGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] public partial interface IGetHero_Hero_Friends_Nodes_Droid : IGetHero_Hero_Friends_Nodes { - public ICharacterName? CharacterName { get; } } // StrawberryShake.CodeGeneration.CSharp.Generators.ResultInterfaceGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] public partial interface IGetHero_Hero_Friends_Nodes_Human : IGetHero_Hero_Friends_Nodes { - public ICharacterName? CharacterName { get; } } // StrawberryShake.CodeGeneration.CSharp.Generators.OperationDocumentGenerator @@ -911,15 +822,13 @@ namespace StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDe [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "0.0.0.0")] public partial class DroidEntity { - public DroidEntity(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.FriendsConnectionData? friends = default !, global::System.Boolean isCharacterNameFulfilled = default !, global::System.String name = default !) + public DroidEntity(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.FriendsConnectionData? friends = default !, global::System.String name = default !) { Friends = friends; - IsCharacterNameFulfilled = isCharacterNameFulfilled; Name = name; } public global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.FriendsConnectionData? Friends { get; } - public global::System.Boolean IsCharacterNameFulfilled { get; } public global::System.String Name { get; } } @@ -927,15 +836,13 @@ public partial class DroidEntity [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "0.0.0.0")] public partial class HumanEntity { - public HumanEntity(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.FriendsConnectionData? friends = default !, global::System.Boolean isCharacterNameFulfilled = default !, global::System.String name = default !) + public HumanEntity(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.FriendsConnectionData? friends = default !, global::System.String name = default !) { Friends = friends; - IsCharacterNameFulfilled = isCharacterNameFulfilled; Name = name; } public global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.FriendsConnectionData? Friends { get; } - public global::System.Boolean IsCharacterNameFulfilled { get; } public global::System.String Name { get; } } @@ -1067,11 +974,11 @@ public GetHeroBuilder(global::StrawberryShake.IEntityStore entityStore, global:: { if (session.CurrentSnapshot.TryGetEntity(entityId, out global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity? entity)) { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity(Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds), entity.IsCharacterNameFulfilled, entity.Name)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity(Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds), entity.Name)); } else { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity(Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds), default !, default !)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity(Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds), default !)); } return entityId; @@ -1081,11 +988,11 @@ public GetHeroBuilder(global::StrawberryShake.IEntityStore entityStore, global:: { if (session.CurrentSnapshot.TryGetEntity(entityId, out global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity? entity)) { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity(Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds), entity.IsCharacterNameFulfilled, entity.Name)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity(Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds), entity.Name)); } else { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity(Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds), default !, default !)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity(Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds), default !)); } return entityId; @@ -1154,11 +1061,11 @@ public GetHeroBuilder(global::StrawberryShake.IEntityStore entityStore, global:: { if (session.CurrentSnapshot.TryGetEntity(entityId, out global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity? entity)) { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity(entity.Friends, global::StrawberryShake.Json.JsonElementExtensions.ContainsFragment(obj, "_isCharacterNameFulfilled"), Deserialize_String(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name"))!)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity(entity.Friends, Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")))); } else { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity(default !, global::StrawberryShake.Json.JsonElementExtensions.ContainsFragment(obj, "_isCharacterNameFulfilled"), Deserialize_String(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name"))!)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity(default !, Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")))); } return entityId; @@ -1168,11 +1075,11 @@ public GetHeroBuilder(global::StrawberryShake.IEntityStore entityStore, global:: { if (session.CurrentSnapshot.TryGetEntity(entityId, out global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity? entity)) { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity(entity.Friends, global::StrawberryShake.Json.JsonElementExtensions.ContainsFragment(obj, "_isCharacterNameFulfilled"), Deserialize_String(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name"))!)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity(entity.Friends, Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")))); } else { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity(default !, global::StrawberryShake.Json.JsonElementExtensions.ContainsFragment(obj, "_isCharacterNameFulfilled"), Deserialize_String(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name"))!)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity(default !, Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")))); } return entityId; @@ -1181,16 +1088,16 @@ public GetHeroBuilder(global::StrawberryShake.IEntityStore entityStore, global:: throw new global::System.NotSupportedException(); } - private global::System.String? Deserialize_String(global::System.Text.Json.JsonElement? obj) + private global::System.String Deserialize_NonNullableString(global::System.Text.Json.JsonElement? obj) { if (!obj.HasValue) { - return null; + throw new global::System.ArgumentNullException(); } if (obj.Value.ValueKind == global::System.Text.Json.JsonValueKind.Null) { - return null; + throw new global::System.ArgumentNullException(); } return _stringParser.Parse(obj.Value.GetString()!); @@ -1380,11 +1287,9 @@ public GetHero_Hero_Human Map(global::StrawberryShake.CodeGeneration.CSharp.Inte public partial class GetHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper : global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity, GetHero_Hero_Friends_Nodes_Droid> { private readonly global::StrawberryShake.IEntityStore _entityStore; - private readonly global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.CharacterName> _characterNameMapper; - public GetHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper(global::StrawberryShake.IEntityStore entityStore, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.CharacterName> characterNameMapper) + public GetHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper(global::StrawberryShake.IEntityStore entityStore) { _entityStore = entityStore ?? throw new global::System.ArgumentNullException(nameof(entityStore)); - _characterNameMapper = characterNameMapper ?? throw new global::System.ArgumentNullException(nameof(characterNameMapper)); } public GetHero_Hero_Friends_Nodes_Droid Map(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity entity, global::StrawberryShake.IEntityStoreSnapshot? snapshot = null) @@ -1394,38 +1299,7 @@ public GetHero_Hero_Friends_Nodes_Droid Map(global::StrawberryShake.CodeGenerati snapshot = _entityStore.CurrentSnapshot; } - return new GetHero_Hero_Friends_Nodes_Droid(MapCharacterName(entity, snapshot)); - } - - private ICharacterName? MapCharacterName(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity entity, global::StrawberryShake.IEntityStoreSnapshot snapshot) - { - if (!entity.IsCharacterNameFulfilled) - { - return null; - } - - return _characterNameMapper.Map(entity, snapshot); - } - } - - // StrawberryShake.CodeGeneration.CSharp.Generators.ResultFromEntityTypeMapperGenerator - [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] - public partial class CharacterNameFromDroidEntityMapper : global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity, CharacterName> - { - private readonly global::StrawberryShake.IEntityStore _entityStore; - public CharacterNameFromDroidEntityMapper(global::StrawberryShake.IEntityStore entityStore) - { - _entityStore = entityStore ?? throw new global::System.ArgumentNullException(nameof(entityStore)); - } - - public CharacterName Map(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.DroidEntity entity, global::StrawberryShake.IEntityStoreSnapshot? snapshot = null) - { - if (snapshot is null) - { - snapshot = _entityStore.CurrentSnapshot; - } - - return new CharacterName(entity.Name); + return new GetHero_Hero_Friends_Nodes_Droid(entity.Name); } } @@ -1434,11 +1308,9 @@ public CharacterName Map(global::StrawberryShake.CodeGeneration.CSharp.Integrati public partial class GetHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper : global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity, GetHero_Hero_Friends_Nodes_Human> { private readonly global::StrawberryShake.IEntityStore _entityStore; - private readonly global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.CharacterName> _characterNameMapper; - public GetHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper(global::StrawberryShake.IEntityStore entityStore, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.CharacterName> characterNameMapper) + public GetHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper(global::StrawberryShake.IEntityStore entityStore) { _entityStore = entityStore ?? throw new global::System.ArgumentNullException(nameof(entityStore)); - _characterNameMapper = characterNameMapper ?? throw new global::System.ArgumentNullException(nameof(characterNameMapper)); } public GetHero_Hero_Friends_Nodes_Human Map(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity entity, global::StrawberryShake.IEntityStoreSnapshot? snapshot = null) @@ -1448,38 +1320,7 @@ public GetHero_Hero_Friends_Nodes_Human Map(global::StrawberryShake.CodeGenerati snapshot = _entityStore.CurrentSnapshot; } - return new GetHero_Hero_Friends_Nodes_Human(MapCharacterName(entity, snapshot)); - } - - private ICharacterName? MapCharacterName(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity entity, global::StrawberryShake.IEntityStoreSnapshot snapshot) - { - if (!entity.IsCharacterNameFulfilled) - { - return null; - } - - return _characterNameMapper.Map(entity, snapshot); - } - } - - // StrawberryShake.CodeGeneration.CSharp.Generators.ResultFromEntityTypeMapperGenerator - [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] - public partial class CharacterNameFromHumanEntityMapper : global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity, CharacterName> - { - private readonly global::StrawberryShake.IEntityStore _entityStore; - public CharacterNameFromHumanEntityMapper(global::StrawberryShake.IEntityStore entityStore) - { - _entityStore = entityStore ?? throw new global::System.ArgumentNullException(nameof(entityStore)); - } - - public CharacterName Map(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferInList.State.HumanEntity entity, global::StrawberryShake.IEntityStoreSnapshot? snapshot = null) - { - if (snapshot is null) - { - snapshot = _entityStore.CurrentSnapshot; - } - - return new CharacterName(entity.Name); + return new GetHero_Hero_Friends_Nodes_Human(entity.Name); } } @@ -1498,7 +1339,6 @@ public partial class StarWarsGetFriendsDeferInListClientEntityIdFactory : global { "Droid" => ParseDroidEntityId(obj, __typename), "Human" => ParseHumanEntityId(obj, __typename), - "Character" => ParseCharacterEntityId(obj, __typename), _ => throw new global::System.NotSupportedException()}; } @@ -1508,7 +1348,6 @@ public partial class StarWarsGetFriendsDeferInListClientEntityIdFactory : global { "Droid" => FormatDroidEntityId(entityId), "Human" => FormatHumanEntityId(entityId), - "Character" => FormatCharacterEntityId(entityId), _ => throw new global::System.NotSupportedException()}; } @@ -1545,23 +1384,6 @@ public partial class StarWarsGetFriendsDeferInListClientEntityIdFactory : global jsonWriter.Flush(); return global::System.Text.Encoding.UTF8.GetString(writer.GetInternalBuffer(), 0, writer.Length); } - - private global::StrawberryShake.EntityId ParseCharacterEntityId(global::System.Text.Json.JsonElement obj, global::System.String type) - { - return new global::StrawberryShake.EntityId(type, obj.GetProperty("id").GetString()!); - } - - private global::System.String FormatCharacterEntityId(global::StrawberryShake.EntityId entityId) - { - using var writer = new global::StrawberryShake.Internal.ArrayWriter(); - using var jsonWriter = new global::System.Text.Json.Utf8JsonWriter(writer, _options); - jsonWriter.WriteStartObject(); - jsonWriter.WriteString("__typename", entityId.Name); - jsonWriter.WriteString("id", (global::System.String)entityId.Value); - jsonWriter.WriteEndObject(); - jsonWriter.Flush(); - return global::System.Text.Encoding.UTF8.GetString(writer.GetInternalBuffer(), 0, writer.Length); - } } // StrawberryShake.CodeGeneration.CSharp.Generators.StoreAccessorGenerator diff --git a/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/StarWarsGetFriendsDeferredTest.Client.cs b/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/StarWarsGetFriendsDeferredTest.Client.cs index 97d56a5658d..db82c5361a7 100644 --- a/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/StarWarsGetFriendsDeferredTest.Client.cs +++ b/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/StarWarsGetFriendsDeferredTest.Client.cs @@ -49,9 +49,7 @@ public static partial class StarWarsGetFriendsDeferredClientServiceCollectionExt return new global::StrawberryShake.Transport.Http.HttpConnection(() => clientFactory.CreateClient("StarWarsGetFriendsDeferredClient")); }); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.GetHero_Hero_Droid>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.GetHero_Hero_DroidFromDroidEntityMapper>(services); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.FriendsList>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.FriendsListFromDroidEntityMapper>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.GetHero_Hero_Human>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.GetHero_Hero_HumanFromHumanEntityMapper>(services); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.FriendsList>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.FriendsListFromHumanEntityMapper>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.GetHero_Hero_Friends_Nodes_Droid>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.GetHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.GetHero_Hero_Friends_Nodes_Human>, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.GetHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::StrawberryShake.Serialization.ISerializer, global::StrawberryShake.Serialization.StringSerializer>(services); @@ -180,85 +178,18 @@ public GetHeroResult(global::StrawberryShake.CodeGeneration.CSharp.Integration.S } } - // StrawberryShake.CodeGeneration.CSharp.Generators.ResultTypeGenerator - [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] - public partial class FriendsList : global::System.IEquatable<FriendsList>, IFriendsList - { - public FriendsList(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.IGetHero_Hero_Friends? friends) - { - Friends = friends; - } - - public global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.IGetHero_Hero_Friends? Friends { get; } - - public virtual global::System.Boolean Equals(FriendsList? other) - { - if (ReferenceEquals(null, other)) - { - return false; - } - - if (ReferenceEquals(this, other)) - { - return true; - } - - if (other.GetType() != GetType()) - { - return false; - } - - return (((Friends is null && other.Friends is null) || Friends != null && Friends.Equals(other.Friends))); - } - - public override global::System.Boolean Equals(global::System.Object? obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - if (obj.GetType() != GetType()) - { - return false; - } - - return Equals((FriendsList)obj); - } - - public override global::System.Int32 GetHashCode() - { - unchecked - { - int hash = 5; - if (Friends != null) - { - hash ^= 397 * Friends.GetHashCode(); - } - - return hash; - } - } - } - // StrawberryShake.CodeGeneration.CSharp.Generators.ResultTypeGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] public partial class GetHero_Hero_Droid : global::System.IEquatable<GetHero_Hero_Droid>, IGetHero_Hero_Droid { - private readonly IFriendsList? _friendsListLabel; - public GetHero_Hero_Droid(global::System.String name, IFriendsList? friendsListLabel) + public GetHero_Hero_Droid(global::System.String name, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.IGetHero_Hero_Friends? friends) { Name = name; - this._friendsListLabel = friendsListLabel; + Friends = friends; } public global::System.String Name { get; } - public IFriendsList? FriendsListLabel => _friendsListLabel; + public global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.IGetHero_Hero_Friends? Friends { get; } public virtual global::System.Boolean Equals(GetHero_Hero_Droid? other) { @@ -277,7 +208,7 @@ public GetHero_Hero_Droid(global::System.String name, IFriendsList? friendsListL return false; } - return (Name.Equals(other.Name)) && ((FriendsListLabel is null && other.FriendsListLabel is null) || FriendsListLabel != null && FriendsListLabel.Equals(other.FriendsListLabel)); + return (Name.Equals(other.Name)) && ((Friends is null && other.Friends is null) || Friends != null && Friends.Equals(other.Friends)); } public override global::System.Boolean Equals(global::System.Object? obj) @@ -306,35 +237,28 @@ public GetHero_Hero_Droid(global::System.String name, IFriendsList? friendsListL { int hash = 5; hash ^= 397 * Name.GetHashCode(); - if (FriendsListLabel != null) + if (Friends != null) { - hash ^= 397 * FriendsListLabel.GetHashCode(); + hash ^= 397 * Friends.GetHashCode(); } return hash; } } - - public global::System.Boolean TryGetData(out IFriendsList? data) - { - data = _friendsListLabel; - return data != null; - } } // StrawberryShake.CodeGeneration.CSharp.Generators.ResultTypeGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] public partial class GetHero_Hero_Human : global::System.IEquatable<GetHero_Hero_Human>, IGetHero_Hero_Human { - private readonly IFriendsList? _friendsListLabel; - public GetHero_Hero_Human(global::System.String name, IFriendsList? friendsListLabel) + public GetHero_Hero_Human(global::System.String name, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.IGetHero_Hero_Friends? friends) { Name = name; - this._friendsListLabel = friendsListLabel; + Friends = friends; } public global::System.String Name { get; } - public IFriendsList? FriendsListLabel => _friendsListLabel; + public global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.IGetHero_Hero_Friends? Friends { get; } public virtual global::System.Boolean Equals(GetHero_Hero_Human? other) { @@ -353,7 +277,7 @@ public GetHero_Hero_Human(global::System.String name, IFriendsList? friendsListL return false; } - return (Name.Equals(other.Name)) && ((FriendsListLabel is null && other.FriendsListLabel is null) || FriendsListLabel != null && FriendsListLabel.Equals(other.FriendsListLabel)); + return (Name.Equals(other.Name)) && ((Friends is null && other.Friends is null) || Friends != null && Friends.Equals(other.Friends)); } public override global::System.Boolean Equals(global::System.Object? obj) @@ -382,20 +306,14 @@ public GetHero_Hero_Human(global::System.String name, IFriendsList? friendsListL { int hash = 5; hash ^= 397 * Name.GetHashCode(); - if (FriendsListLabel != null) + if (Friends != null) { - hash ^= 397 * FriendsListLabel.GetHashCode(); + hash ^= 397 * Friends.GetHashCode(); } return hash; } } - - public global::System.Boolean TryGetData(out IFriendsList? data) - { - data = _friendsListLabel; - return data != null; - } } // StrawberryShake.CodeGeneration.CSharp.Generators.ResultTypeGenerator @@ -616,24 +534,21 @@ public partial interface IFriendsList // StrawberryShake.CodeGeneration.CSharp.Generators.ResultInterfaceGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] - public partial interface IGetHero_Hero + public partial interface IGetHero_Hero : IFriendsList { public global::System.String Name { get; } - public IFriendsList? FriendsListLabel { get; } } // StrawberryShake.CodeGeneration.CSharp.Generators.ResultInterfaceGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] public partial interface IGetHero_Hero_Droid : IGetHero_Hero { - public IFriendsList? FriendsListLabel { get; } } // StrawberryShake.CodeGeneration.CSharp.Generators.ResultInterfaceGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] public partial interface IGetHero_Hero_Human : IGetHero_Hero { - public IFriendsList? FriendsListLabel { get; } } // StrawberryShake.CodeGeneration.CSharp.Generators.ResultInterfaceGenerator @@ -917,15 +832,13 @@ namespace StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDe [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "0.0.0.0")] public partial class DroidEntity { - public DroidEntity(global::System.String name = default !, global::System.Boolean isFriendsListFulfilled = default !, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.FriendsConnectionData? friends = default !) + public DroidEntity(global::System.String name = default !, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.FriendsConnectionData? friends = default !) { Name = name; - IsFriendsListFulfilled = isFriendsListFulfilled; Friends = friends; } public global::System.String Name { get; } - public global::System.Boolean IsFriendsListFulfilled { get; } public global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.FriendsConnectionData? Friends { get; } } @@ -933,15 +846,13 @@ public partial class DroidEntity [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "0.0.0.0")] public partial class HumanEntity { - public HumanEntity(global::System.String name = default !, global::System.Boolean isFriendsListFulfilled = default !, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.FriendsConnectionData? friends = default !) + public HumanEntity(global::System.String name = default !, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.FriendsConnectionData? friends = default !) { Name = name; - IsFriendsListFulfilled = isFriendsListFulfilled; Friends = friends; } public global::System.String Name { get; } - public global::System.Boolean IsFriendsListFulfilled { get; } public global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.FriendsConnectionData? Friends { get; } } @@ -1073,11 +984,11 @@ public GetHeroBuilder(global::StrawberryShake.IEntityStore entityStore, global:: { if (session.CurrentSnapshot.TryGetEntity(entityId, out global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity? entity)) { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), global::StrawberryShake.Json.JsonElementExtensions.ContainsFragment(obj, "_isFriendsListFulfilled"), Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds))); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds))); } else { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), global::StrawberryShake.Json.JsonElementExtensions.ContainsFragment(obj, "_isFriendsListFulfilled"), Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds))); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds))); } return entityId; @@ -1087,11 +998,11 @@ public GetHeroBuilder(global::StrawberryShake.IEntityStore entityStore, global:: { if (session.CurrentSnapshot.TryGetEntity(entityId, out global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity? entity)) { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), global::StrawberryShake.Json.JsonElementExtensions.ContainsFragment(obj, "_isFriendsListFulfilled"), Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds))); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds))); } else { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), global::StrawberryShake.Json.JsonElementExtensions.ContainsFragment(obj, "_isFriendsListFulfilled"), Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds))); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), Deserialize_IGetHero_Hero_Friends(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "friends"), entityIds))); } return entityId; @@ -1175,11 +1086,11 @@ public GetHeroBuilder(global::StrawberryShake.IEntityStore entityStore, global:: { if (session.CurrentSnapshot.TryGetEntity(entityId, out global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity? entity)) { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), entity.IsFriendsListFulfilled, entity.Friends)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), entity.Friends)); } else { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), default !, default !)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), default !)); } return entityId; @@ -1189,11 +1100,11 @@ public GetHeroBuilder(global::StrawberryShake.IEntityStore entityStore, global:: { if (session.CurrentSnapshot.TryGetEntity(entityId, out global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity? entity)) { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), entity.IsFriendsListFulfilled, entity.Friends)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), entity.Friends)); } else { - session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), default !, default !)); + session.SetEntity(entityId, new global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity(Deserialize_NonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), default !)); } return entityId; @@ -1222,58 +1133,25 @@ public partial class FriendsConnectionData // StrawberryShake.CodeGeneration.CSharp.Generators.ResultFromEntityTypeMapperGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] public partial class GetHero_Hero_DroidFromDroidEntityMapper : global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, GetHero_Hero_Droid> - { - private readonly global::StrawberryShake.IEntityStore _entityStore; - private readonly global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.FriendsList> _friendsListMapper; - public GetHero_Hero_DroidFromDroidEntityMapper(global::StrawberryShake.IEntityStore entityStore, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.FriendsList> friendsListMapper) - { - _entityStore = entityStore ?? throw new global::System.ArgumentNullException(nameof(entityStore)); - _friendsListMapper = friendsListMapper ?? throw new global::System.ArgumentNullException(nameof(friendsListMapper)); - } - - public GetHero_Hero_Droid Map(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity entity, global::StrawberryShake.IEntityStoreSnapshot? snapshot = null) - { - if (snapshot is null) - { - snapshot = _entityStore.CurrentSnapshot; - } - - return new GetHero_Hero_Droid(entity.Name, MapFriendsList(entity, snapshot)); - } - - private IFriendsList? MapFriendsList(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity entity, global::StrawberryShake.IEntityStoreSnapshot snapshot) - { - if (!entity.IsFriendsListFulfilled) - { - return null; - } - - return _friendsListMapper.Map(entity, snapshot); - } - } - - // StrawberryShake.CodeGeneration.CSharp.Generators.ResultFromEntityTypeMapperGenerator - [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] - public partial class FriendsListFromDroidEntityMapper : global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, FriendsList> { private readonly global::StrawberryShake.IEntityStore _entityStore; private readonly global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, GetHero_Hero_Friends_Nodes_Droid> _getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper; private readonly global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, GetHero_Hero_Friends_Nodes_Human> _getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper; - public FriendsListFromDroidEntityMapper(global::StrawberryShake.IEntityStore entityStore, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, GetHero_Hero_Friends_Nodes_Droid> getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, GetHero_Hero_Friends_Nodes_Human> getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper) + public GetHero_Hero_DroidFromDroidEntityMapper(global::StrawberryShake.IEntityStore entityStore, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, GetHero_Hero_Friends_Nodes_Droid> getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, GetHero_Hero_Friends_Nodes_Human> getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper) { _entityStore = entityStore ?? throw new global::System.ArgumentNullException(nameof(entityStore)); _getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper = getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper ?? throw new global::System.ArgumentNullException(nameof(getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper)); _getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper = getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper ?? throw new global::System.ArgumentNullException(nameof(getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper)); } - public FriendsList Map(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity entity, global::StrawberryShake.IEntityStoreSnapshot? snapshot = null) + public GetHero_Hero_Droid Map(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity entity, global::StrawberryShake.IEntityStoreSnapshot? snapshot = null) { if (snapshot is null) { snapshot = _entityStore.CurrentSnapshot; } - return new FriendsList(MapIGetHero_Hero_Friends(entity.Friends, snapshot)); + return new GetHero_Hero_Droid(entity.Name, MapIGetHero_Hero_Friends(entity.Friends, snapshot)); } private global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.IGetHero_Hero_Friends? MapIGetHero_Hero_Friends(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.FriendsConnectionData? data, global::StrawberryShake.IEntityStoreSnapshot snapshot) @@ -1336,58 +1214,25 @@ public FriendsList Map(global::StrawberryShake.CodeGeneration.CSharp.Integration // StrawberryShake.CodeGeneration.CSharp.Generators.ResultFromEntityTypeMapperGenerator [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] public partial class GetHero_Hero_HumanFromHumanEntityMapper : global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, GetHero_Hero_Human> - { - private readonly global::StrawberryShake.IEntityStore _entityStore; - private readonly global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.FriendsList> _friendsListMapper; - public GetHero_Hero_HumanFromHumanEntityMapper(global::StrawberryShake.IEntityStore entityStore, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.FriendsList> friendsListMapper) - { - _entityStore = entityStore ?? throw new global::System.ArgumentNullException(nameof(entityStore)); - _friendsListMapper = friendsListMapper ?? throw new global::System.ArgumentNullException(nameof(friendsListMapper)); - } - - public GetHero_Hero_Human Map(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity entity, global::StrawberryShake.IEntityStoreSnapshot? snapshot = null) - { - if (snapshot is null) - { - snapshot = _entityStore.CurrentSnapshot; - } - - return new GetHero_Hero_Human(entity.Name, MapFriendsList(entity, snapshot)); - } - - private IFriendsList? MapFriendsList(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity entity, global::StrawberryShake.IEntityStoreSnapshot snapshot) - { - if (!entity.IsFriendsListFulfilled) - { - return null; - } - - return _friendsListMapper.Map(entity, snapshot); - } - } - - // StrawberryShake.CodeGeneration.CSharp.Generators.ResultFromEntityTypeMapperGenerator - [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.0.0")] - public partial class FriendsListFromHumanEntityMapper : global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, FriendsList> { private readonly global::StrawberryShake.IEntityStore _entityStore; private readonly global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, GetHero_Hero_Friends_Nodes_Droid> _getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper; private readonly global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, GetHero_Hero_Friends_Nodes_Human> _getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper; - public FriendsListFromHumanEntityMapper(global::StrawberryShake.IEntityStore entityStore, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, GetHero_Hero_Friends_Nodes_Droid> getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, GetHero_Hero_Friends_Nodes_Human> getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper) + public GetHero_Hero_HumanFromHumanEntityMapper(global::StrawberryShake.IEntityStore entityStore, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.DroidEntity, GetHero_Hero_Friends_Nodes_Droid> getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper, global::StrawberryShake.IEntityMapper<global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity, GetHero_Hero_Friends_Nodes_Human> getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper) { _entityStore = entityStore ?? throw new global::System.ArgumentNullException(nameof(entityStore)); _getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper = getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper ?? throw new global::System.ArgumentNullException(nameof(getHero_Hero_Friends_Nodes_DroidFromDroidEntityMapper)); _getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper = getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper ?? throw new global::System.ArgumentNullException(nameof(getHero_Hero_Friends_Nodes_HumanFromHumanEntityMapper)); } - public FriendsList Map(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity entity, global::StrawberryShake.IEntityStoreSnapshot? snapshot = null) + public GetHero_Hero_Human Map(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.HumanEntity entity, global::StrawberryShake.IEntityStoreSnapshot? snapshot = null) { if (snapshot is null) { snapshot = _entityStore.CurrentSnapshot; } - return new FriendsList(MapIGetHero_Hero_Friends(entity.Friends, snapshot)); + return new GetHero_Hero_Human(entity.Name, MapIGetHero_Hero_Friends(entity.Friends, snapshot)); } private global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.IGetHero_Hero_Friends? MapIGetHero_Hero_Friends(global::StrawberryShake.CodeGeneration.CSharp.Integration.StarWarsGetFriendsDeferred.State.FriendsConnectionData? data, global::StrawberryShake.IEntityStoreSnapshot snapshot) @@ -1502,7 +1347,6 @@ public partial class StarWarsGetFriendsDeferredClientEntityIdFactory : global::S global::System.String __typename = obj.GetProperty("__typename").GetString()!; return __typename switch { - "Character" => ParseCharacterEntityId(obj, __typename), "Droid" => ParseDroidEntityId(obj, __typename), "Human" => ParseHumanEntityId(obj, __typename), _ => throw new global::System.NotSupportedException()}; @@ -1512,29 +1356,11 @@ public partial class StarWarsGetFriendsDeferredClientEntityIdFactory : global::S { return entityId.Name switch { - "Character" => FormatCharacterEntityId(entityId), "Droid" => FormatDroidEntityId(entityId), "Human" => FormatHumanEntityId(entityId), _ => throw new global::System.NotSupportedException()}; } - private global::StrawberryShake.EntityId ParseCharacterEntityId(global::System.Text.Json.JsonElement obj, global::System.String type) - { - return new global::StrawberryShake.EntityId(type, obj.GetProperty("id").GetString()!); - } - - private global::System.String FormatCharacterEntityId(global::StrawberryShake.EntityId entityId) - { - using var writer = new global::StrawberryShake.Internal.ArrayWriter(); - using var jsonWriter = new global::System.Text.Json.Utf8JsonWriter(writer, _options); - jsonWriter.WriteStartObject(); - jsonWriter.WriteString("__typename", entityId.Name); - jsonWriter.WriteString("id", (global::System.String)entityId.Value); - jsonWriter.WriteEndObject(); - jsonWriter.Flush(); - return global::System.Text.Encoding.UTF8.GetString(writer.GetInternalBuffer(), 0, writer.Length); - } - private global::StrawberryShake.EntityId ParseDroidEntityId(global::System.Text.Json.JsonElement obj, global::System.String type) { return new global::StrawberryShake.EntityId(type, obj.GetProperty("id").GetString()!); From c2abad5dd24c7899040fcffdda9454cff765db45 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 15 Jan 2026 15:29:24 +0100 Subject: [PATCH 103/144] Spatial Types --- .../Types/Text/Json/ResultDocument.WriteTo.cs | 15 +- .../Core/src/Types/Text/Json/ResultElement.cs | 2 +- .../src/Types/GeoJsonCoordinatesType.cs | 28 +- .../Spatial/src/Types/GeoJsonPositionType.cs | 27 +- .../Spatial/src/Types/GeometryType.cs | 30 +- .../GeoJsonCoordinatesSerializer.cs | 278 +++++-------- .../GeoJsonGeometrySerializer.cs | 220 ++++------ .../GeoJsonInputObjectSerializer.cs | 221 +++------- .../GeoJsonLineStringSerializer.cs | 42 ++ .../GeoJsonMultiLineStringSerializer.cs | 79 ++-- .../GeoJsonMultiPointSerializer.cs | 42 ++ .../GeoJsonMultiPolygonSerializer.cs | 96 +++-- .../Serialization/GeoJsonPointSerializer.cs | 16 +- .../Serialization/GeoJsonPolygonSerializer.cs | 169 ++++---- .../GeoJsonPositionSerializer.cs | 263 +++++------- .../Serialization/GeoJsonSerializerBase.cs | 309 ++++---------- .../Serialization/GeoJsonTypeSerializer.cs | 175 ++++---- .../Types/Serialization/IGeoJsonSerializer.cs | 176 +++----- .../Spatial/src/Types/WellKnownFields.cs | 4 + .../GeoJsonLineStringSerializerTests.cs | 334 +-------------- .../GeoJsonMultiLineStringInputTests.cs | 2 +- .../GeoJsonMultiLineStringSerializerTests.cs | 379 +---------------- .../GeoJsonMultiPointSerializerTests.cs | 341 +-------------- .../GeoJsonMultiPolygonSerializerTests.cs | 382 +---------------- .../GeoJsonPointSerializerTests.cs | 370 +---------------- .../GeoJsonPolygonSerializerTests.cs | 393 +----------------- .../Types.Tests/GeoJsonPositionScalarTest.cs | 347 +--------------- .../Types.Tests/GeoJsonTypeSerializerTests.cs | 300 ++----------- ...FormatValue_Should_Pass_When_Value.graphql | 1 + ...FormatValue_Should_Pass_When_Value.graphql | 1 + ...FormatValue_Should_Pass_When_Value.graphql | 1 + ...FormatValue_Should_Pass_When_Value.graphql | 1 + ...FormatValue_Should_Pass_When_Value.graphql | 1 + ...peTests.Point_Execution_Output_Scalar.snap | 2 +- ...ts.FormatValue_Should_Pass_When_Value.snap | 1 + ...ts.Execute_CoordinateM_RaiseException.snap | 6 - ...s.Execute_CoordinateZM_RaiseException.snap | 6 - ...xecute_InputUnknownCRS_RaiseException.snap | 6 - ...ecute_OutputUnknownCRS_RaiseException.snap | 6 - 39 files changed, 1007 insertions(+), 4065 deletions(-) create mode 100644 src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonLineStringSerializerTests.FormatValue_Should_Pass_When_Value.graphql create mode 100644 src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiLineStringSerializerTests.FormatValue_Should_Pass_When_Value.graphql create mode 100644 src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiPointSerializerTests.FormatValue_Should_Pass_When_Value.graphql create mode 100644 src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiPolygonSerializerTests.FormatValue_Should_Pass_When_Value.graphql create mode 100644 src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPointSerializerTests.FormatValue_Should_Pass_When_Value.graphql create mode 100644 src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPolygonSerializerTests.FormatValue_Should_Pass_When_Value.snap diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index 14ae129f330..176e242ff2b 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -11,11 +11,11 @@ public void WriteTo(OperationResult result, IBufferWriter<byte> writer, JsonWrit { options = options with { SkipValidation = true }; var jsonWriter = new JsonWriter(writer, options); - var formatter = new RawJsonFormatter(this, jsonWriter); + var formatter = new RawJsonFormatter(this, jsonWriter, options); formatter.Write(result); } - internal ref struct RawJsonFormatter(ResultDocument document, JsonWriter writer) + internal readonly ref struct RawJsonFormatter(ResultDocument document, JsonWriter writer, JsonWriterOptions options) { public void Write(OperationResult result) { @@ -27,7 +27,7 @@ public void Write(OperationResult result) JsonValueFormatter.WriteErrors( writer, result.Errors, - new JsonSerializerOptions(JsonSerializerDefaults.Web), + CreateSerializerOptions(), default); } @@ -52,7 +52,7 @@ public void Write(OperationResult result) JsonValueFormatter.WriteDictionary( writer, result.Extensions, - new JsonSerializerOptions(JsonSerializerDefaults.Web), + CreateSerializerOptions(), default); } @@ -184,5 +184,12 @@ private void WriteArray(Cursor start, DbRow startRow) writer.WriteEndArray(); } + + private JsonSerializerOptions CreateSerializerOptions() + => new(JsonSerializerDefaults.Web) + { + Encoder = options.Encoder, + WriteIndented = options.Indented + }; } } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index eff92f7166c..91c6d1504c4 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -1158,7 +1158,7 @@ public void WriteTo(IBufferWriter<byte> writer, bool indented = false) Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; var jsonWriter = new JsonWriter(writer, options); - var formatter = new ResultDocument.RawJsonFormatter(_parent, jsonWriter); + var formatter = new ResultDocument.RawJsonFormatter(_parent, jsonWriter, options); var row = _parent._metaDb.Get(_cursor); formatter.WriteValue(_cursor, row); } diff --git a/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs b/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs index 0ea1256d672..d1e3739a0e7 100644 --- a/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs +++ b/src/HotChocolate/Spatial/src/Types/GeoJsonCoordinatesType.cs @@ -1,5 +1,9 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types.Spatial.Properties; +using HotChocolate.Types.Spatial.Serialization; namespace HotChocolate.Types.Spatial; @@ -9,28 +13,22 @@ namespace HotChocolate.Types.Spatial; /// </para> /// <para>https://tools.ietf.org/html/rfc7946#section-3.1.1</para> /// </summary> -public sealed class GeoJsonCoordinatesType : ScalarType<object[]> +public sealed class GeoJsonCoordinatesType : ScalarType<object[], ListValueNode> { public GeoJsonCoordinatesType() : base(WellKnownTypeNames.CoordinatesTypeName) { Description = Resources.GeoJsonCoordinatesScalar_Description; } - public override bool IsValueCompatible(IValueNode valueLiteral) - => GeoJsonCoordinatesSerializer.Default.IsInstanceOfType(this, valueLiteral); + protected override object[] OnCoerceInputLiteral(ListValueNode valueLiteral) + => (object[])GeoJsonCoordinatesSerializer.Default.CoerceInputLiteral(this, valueLiteral)!; - public override object? CoerceInputLiteral(IValueNode valueSyntax) - => GeoJsonCoordinatesSerializer.Default.ParseLiteral(this, valueSyntax); + protected override object[] OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => (object[])GeoJsonCoordinatesSerializer.Default.CoerceInputValue(this, inputValue, context)!; - public override IValueNode CoerceInputValue(object? value) - => GeoJsonCoordinatesSerializer.Default.ParseValue(this, value); + protected override void OnCoerceOutputValue(object[] runtimeValue, ResultElement resultValue) + => GeoJsonCoordinatesSerializer.Default.CoerceOutputCoordinates(this, runtimeValue, resultValue); - public override IValueNode ParseResult(object? resultValue) - => GeoJsonCoordinatesSerializer.Default.ParseResult(this, resultValue); - - public override bool TryDeserialize(object? serialized, out object? value) - => GeoJsonCoordinatesSerializer.Default.TryDeserialize(this, serialized, out value); - - public override bool TryCoerceOutputValue(object? value, out object? serialized) - => GeoJsonCoordinatesSerializer.Default.TrySerialize(this, value, out serialized); + protected override ListValueNode OnValueToLiteral(object[] runtimeValue) + => (ListValueNode)GeoJsonCoordinatesSerializer.Default.ValueToLiteral(this, runtimeValue); } diff --git a/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs b/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs index 11a60c7d415..3bada82e3fc 100644 --- a/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs +++ b/src/HotChocolate/Spatial/src/Types/GeoJsonPositionType.cs @@ -1,4 +1,7 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types.Spatial.Properties; using HotChocolate.Types.Spatial.Serialization; using NetTopologySuite.Geometries; @@ -14,28 +17,22 @@ namespace HotChocolate.Types.Spatial; /// </para> /// <para>https://tools.ietf.org/html/rfc7946#section-3.1.1</para> /// </summary> -public sealed class GeoJsonPositionType : ScalarType<Coordinate> +public sealed class GeoJsonPositionType : ScalarType<Coordinate, ListValueNode> { public GeoJsonPositionType() : base(PositionTypeName) { Description = Resources.GeoJsonPositionScalar_Description; } - public override bool IsValueCompatible(IValueNode valueLiteral) - => GeoJsonPositionSerializer.Default.IsInstanceOfType(this, valueLiteral); + protected override Coordinate OnCoerceInputLiteral(ListValueNode valueLiteral) + => (Coordinate)GeoJsonPositionSerializer.Default.CoerceInputLiteral(this, valueLiteral)!; - public override object? CoerceInputLiteral(IValueNode valueSyntax) - => GeoJsonPositionSerializer.Default.ParseLiteral(this, valueSyntax); + protected override Coordinate OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => (Coordinate)GeoJsonPositionSerializer.Default.CoerceInputValue(this, inputValue, context)!; - public override IValueNode CoerceInputValue(object? value) - => GeoJsonPositionSerializer.Default.ParseValue(this, value); + protected override void OnCoerceOutputValue(Coordinate runtimeValue, ResultElement resultValue) + => GeoJsonPositionSerializer.Default.CoerceOutputCoordinates(this, runtimeValue, resultValue); - public override IValueNode ParseResult(object? resultValue) - => GeoJsonPositionSerializer.Default.ParseResult(this, resultValue); - - public override bool TryDeserialize(object? serialized, out object? value) - => GeoJsonPositionSerializer.Default.TryDeserialize(this, serialized, out value); - - public override bool TryCoerceOutputValue(object? value, out object? serialized) - => GeoJsonPositionSerializer.Default.TrySerialize(this, value, out serialized); + protected override ListValueNode OnValueToLiteral(Coordinate runtimeValue) + => (ListValueNode)GeoJsonPositionSerializer.Default.ValueToLiteral(this, runtimeValue); } diff --git a/src/HotChocolate/Spatial/src/Types/GeometryType.cs b/src/HotChocolate/Spatial/src/Types/GeometryType.cs index 8868ce34041..7fd3140f9ff 100644 --- a/src/HotChocolate/Spatial/src/Types/GeometryType.cs +++ b/src/HotChocolate/Spatial/src/Types/GeometryType.cs @@ -1,4 +1,7 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Types.Spatial.Serialization; using Microsoft.Extensions.DependencyInjection; using NetTopologySuite.Geometries; @@ -7,7 +10,7 @@ namespace HotChocolate.Types.Spatial; public sealed class GeometryType - : ScalarType<Geometry> + : ScalarType<Geometry, ObjectValueNode> , IGeoJsonObjectType , IGeoJsonInputType { @@ -23,24 +26,15 @@ public GeometryType() : base(GeometryTypeName) { } - public override object? Deserialize(object? resultValue) - => GeoJsonGeometrySerializer.Default.Deserialize(this, resultValue); + protected override Geometry OnCoerceInputLiteral(ObjectValueNode valueLiteral) + => (Geometry)GeoJsonGeometrySerializer.Default.CoerceInputLiteral(this, valueLiteral)!; - public override object? CoerceOutputValue(object? runtimeValue) - => GeoJsonGeometrySerializer.Default.Serialize(this, runtimeValue); + protected override Geometry OnCoerceInputValue(JsonElement inputValue, IFeatureProvider context) + => (Geometry)GeoJsonGeometrySerializer.Default.CoerceInputValue(this, inputValue, context)!; - public override bool IsValueCompatible(IValueNode valueLiteral) - => GeoJsonGeometrySerializer.Default.IsInstanceOfType(this, valueLiteral); + protected override void OnCoerceOutputValue(Geometry runtimeValue, ResultElement resultValue) + => GeoJsonGeometrySerializer.Default.CoerceOutputValue(this, runtimeValue, resultValue); - public override bool IsInstanceOfType(object? runtimeValue) - => GeoJsonGeometrySerializer.Default.IsInstanceOfType(this, runtimeValue); - - public override object? CoerceInputLiteral(IValueNode valueSyntax) - => GeoJsonGeometrySerializer.Default.ParseLiteral(this, valueSyntax); - - public override IValueNode CoerceInputValue(object? runtimeValue) - => GeoJsonGeometrySerializer.Default.ParseValue(this, runtimeValue); - - public override IValueNode ParseResult(object? resultValue) - => GeoJsonGeometrySerializer.Default.ParseResult(this, resultValue); + protected override ObjectValueNode OnValueToLiteral(Geometry runtimeValue) + => (ObjectValueNode)GeoJsonGeometrySerializer.Default.ValueToLiteral(this, runtimeValue); } diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonCoordinatesSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonCoordinatesSerializer.cs index 60bdef8b2e9..486a50f506f 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonCoordinatesSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonCoordinatesSerializer.cs @@ -1,22 +1,24 @@ using System.Collections; +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; -using HotChocolate.Types.Spatial.Serialization; +using HotChocolate.Text.Json; using NetTopologySuite.Geometries; -namespace HotChocolate.Types.Spatial; +namespace HotChocolate.Types.Spatial.Serialization; internal class GeoJsonCoordinatesSerializer : GeoJsonSerializerBase { - public override bool IsInstanceOfType(IType type, IValueNode valueSyntax) + public override bool IsValueCompatible(IType type, IValueNode valueLiteral) { ArgumentNullException.ThrowIfNull(type); - if (valueSyntax is NullValueNode) + if (valueLiteral is NullValueNode) { return true; } - if (valueSyntax is ListValueNode) + if (valueLiteral is ListValueNode) { return true; } @@ -24,143 +26,120 @@ public override bool IsInstanceOfType(IType type, IValueNode valueSyntax) return false; } - public override object? ParseLiteral(IType type, IValueNode valueSyntax) + public override bool IsValueCompatible(IType type, JsonElement inputValue) { ArgumentNullException.ThrowIfNull(type); - if (valueSyntax is null) + if (inputValue.ValueKind == JsonValueKind.Null) { - throw ThrowHelper.CoordinatesScalar_CoordinatesCannotBeNull(null!); - } - - if (valueSyntax is NullValueNode) - { - return null; + return true; } - if (valueSyntax is ListValueNode list) + if (inputValue.ValueKind == JsonValueKind.Array) { - return ParseCoordinateLiteral(type, list); + return true; } - throw ThrowHelper.CoordinatesScalar_InvalidCoordinatesObject(null!); + return false; } - public override IValueNode ParseValue(IType type, object? value) + public override object? CoerceInputLiteral(IType type, IValueNode valueLiteral) { ArgumentNullException.ThrowIfNull(type); - if (value is null) + if (valueLiteral is null) { - return NullValueNode.Default; + throw ThrowHelper.CoordinatesScalar_CoordinatesCannotBeNull(null!); } - if (value is Coordinate) + if (valueLiteral is NullValueNode) { - return GeoJsonPositionSerializer.Default.ParseValue(type, value); + return null; } - if (value is double[]) + if (valueLiteral is ListValueNode list) { - return GeoJsonPositionSerializer.Default.ParseResult(type, value); + return ParseCoordinateLiteral(type, list); } - if (value is IList list) + throw ThrowHelper.CoordinatesScalar_InvalidCoordinatesObject(null!); + } + + public override object? CoerceInputValue(IType type, JsonElement inputValue, IFeatureProvider context) + { + ArgumentNullException.ThrowIfNull(type); + + if (inputValue.ValueKind == JsonValueKind.Null) { - var results = new IValueNode[list.Count]; - for (var i = 0; i < list.Count; i++) - { - results[i] = ParseValue(type, list[i]); - } + return null; + } - return new ListValueNode(results); + if (inputValue.ValueKind != JsonValueKind.Array) + { + throw ThrowHelper.CoordinatesScalar_InvalidCoordinatesObject(null!); } - throw ThrowHelper.CoordinatesScalar_InvalidCoordinatesObject(type); + return ParseCoordinateFromJson(type, inputValue); } - public override object CreateInstance(IType type, object?[] fieldValues) + public override void CoerceOutputValue(IType type, object runtimeValue, ResultElement resultValue) { - throw ThrowHelper.Serializer_OperationIsNotSupported(type, - this, - nameof(CreateInstance)); - } + ArgumentNullException.ThrowIfNull(type); - public override void GetFieldData(IType type, object runtimeValue, object?[] fieldValues) - { - throw ThrowHelper.Serializer_OperationIsNotSupported(type, - this, - nameof(GetFieldData)); + CoerceOutputCoordinates(type, runtimeValue, resultValue); } - public override bool TrySerializeCoordinates( - IType type, - object runtimeValue, - out object? serialized) + public override void CoerceOutputCoordinates(IType type, object runtimeValue, ResultElement resultElement) { - throw ThrowHelper.Serializer_OperationIsNotSupported(type, - this, - nameof(TrySerializeCoordinates)); - } + ArgumentNullException.ThrowIfNull(type); - public override IValueNode ParseCoordinateValue(IType type, object? runtimeValue) - { - if (runtimeValue is IList list) + if (runtimeValue is Coordinate coord) { - var results = new IValueNode[list.Count]; - for (var i = 0; i < list.Count; i++) - { - results[i] = ParseCoordinateValue(type, list[i]); - } - - return new ListValueNode(results); + GeoJsonPositionSerializer.Default.CoerceOutputCoordinates(type, coord, resultElement); + return; } - if (runtimeValue is Coordinate) + if (runtimeValue is IList list) { - return GeoJsonPositionSerializer.Default.ParseResult(type, runtimeValue); - } + resultElement.SetArrayValue(list.Count); - if (runtimeValue is double[]) - { - return GeoJsonPositionSerializer.Default.ParseResult(type, runtimeValue); - } + var index = 0; + foreach (var element in resultElement.EnumerateArray()) + { + CoerceOutputCoordinates(type, list[index++]!, element); + } - if (runtimeValue is Geometry g - && GeoJsonSerializers.SerializersByTypeName - .TryGetValue(g.GeometryType, out var serializer)) - { - return serializer.ParseCoordinateValue(type, runtimeValue); + return; } - throw ThrowHelper.Serializer_CouldNotParseValue(type); + throw ThrowHelper.CoordinatesScalar_InvalidCoordinatesObject(type); } - public override IValueNode ParseResult(IType type, object? resultValue) + public override IValueNode ValueToLiteral(IType type, object? runtimeValue) { ArgumentNullException.ThrowIfNull(type); - if (resultValue is null) + if (runtimeValue is null) { return NullValueNode.Default; } - if (resultValue is Coordinate) + if (runtimeValue is Coordinate) { - return GeoJsonPositionSerializer.Default.ParseResult(type, resultValue); + return GeoJsonPositionSerializer.Default.ValueToLiteral(type, runtimeValue); } - if (resultValue is double[]) + if (runtimeValue is double[]) { - return GeoJsonPositionSerializer.Default.ParseResult(type, resultValue); + return GeoJsonPositionSerializer.Default.ValueToLiteral(type, runtimeValue); } - if (resultValue is IList list) + if (runtimeValue is IList list) { var results = new IValueNode[list.Count]; for (var i = 0; i < list.Count; i++) { - results[i] = ParseValue(type, list[i]); + results[i] = ValueToLiteral(type, list[i]); } return new ListValueNode(results); @@ -169,89 +148,54 @@ public override IValueNode ParseResult(IType type, object? resultValue) throw ThrowHelper.CoordinatesScalar_InvalidCoordinatesObject(type); } - public override bool TryDeserialize(IType type, object? serialized, out object? value) + public override IValueNode CoordinateToLiteral(IType type, object? runtimeValue) { - ArgumentNullException.ThrowIfNull(type); - - if (serialized is null) + if (runtimeValue is IList list) { - value = null; - return true; + var results = new IValueNode[list.Count]; + for (var i = 0; i < list.Count; i++) + { + results[i] = CoordinateToLiteral(type, list[i]); + } + + return new ListValueNode(results); } - if (serialized is not IList list) + if (runtimeValue is Coordinate) { - value = null; - return false; + return GeoJsonPositionSerializer.Default.ValueToLiteral(type, runtimeValue); } - if (list.Count >= 2 && list.Count <= 3 && list[0] is not IList) + if (runtimeValue is double[]) { - return GeoJsonPositionSerializer.Default.TryDeserialize(type, - serialized, - out value); + return GeoJsonPositionSerializer.Default.ValueToLiteral(type, runtimeValue); } - var results = new object?[list.Count]; - for (var i = 0; i < list.Count; i++) + if (runtimeValue is Geometry g + && GeoJsonSerializers.SerializersByTypeName + .TryGetValue(g.GeometryType, out var serializer)) { - if (TryDeserialize(type, list[i], out var innerValue)) - { - results[i] = innerValue; - } - else - { - value = null; - return false; - } + return serializer.CoordinateToLiteral(type, runtimeValue); } - value = results; - return true; + throw ThrowHelper.Serializer_CouldNotParseValue(type); } - public override bool TrySerialize(IType type, object? value, out object? serialized) + public override object CreateInstance(IType type, object?[] fieldValues) { - ArgumentNullException.ThrowIfNull(type); - - if (value is null) - { - serialized = null; - return true; - } - - if (value is Coordinate) - { - return GeoJsonPositionSerializer.Default.TrySerialize(type, - value, - out serialized); - } - - if (value is not IList list) - { - serialized = null; - return false; - } - - var results = new object?[list.Count]; - for (var i = 0; i < list.Count; i++) - { - if (TrySerialize(type, list[i], out var innerSerializer)) - { - results[i] = innerSerializer; - } - else - { - serialized = null; - return false; - } - } + throw ThrowHelper.Serializer_OperationIsNotSupported(type, + this, + nameof(CreateInstance)); + } - serialized = results; - return true; + public override void GetFieldData(IType type, object runtimeValue, object?[] fieldValues) + { + throw ThrowHelper.Serializer_OperationIsNotSupported(type, + this, + nameof(GetFieldData)); } - public object ParseCoordinateLiteral(IType type, IValueNode syntaxNode) + public new object ParseCoordinateLiteral(IType type, IValueNode syntaxNode) { if (syntaxNode is ListValueNode top && top.Items.Count > 0) { @@ -273,7 +217,7 @@ public object ParseCoordinateLiteral(IType type, IValueNode syntaxNode) return result; } - if (GeoJsonPositionSerializer.Default.ParseLiteral(type, top) is Coordinate coord) + if (GeoJsonPositionSerializer.Default.CoerceInputLiteral(type, top) is Coordinate coord) { return coord; } @@ -282,38 +226,28 @@ public object ParseCoordinateLiteral(IType type, IValueNode syntaxNode) throw ThrowHelper.Serializer_Parse_CoordinatesIsInvalid(type); } - public object DeserializeCoordinate(IType type, object? runtimeValue) + public object ParseCoordinateFromJson(IType type, JsonElement element) { - if (runtimeValue is IList { Count: > 0 } top) + if (element.ValueKind != JsonValueKind.Array || element.GetArrayLength() == 0) { - if (top[0] is IList { Count: > 0 }) - { - var result = new object[top.Count]; - for (var y = 0; y < result.Length; y++) - { - if (DeserializeCoordinate(type, top[y]) is { } multi) - { - result[y] = multi; - } - else - { - throw ThrowHelper.Serializer_Parse_CoordinatesIsInvalid(type); - } - } + throw ThrowHelper.Serializer_Parse_CoordinatesIsInvalid(type); + } - return result; - } - else if (GeoJsonPositionSerializer.Default.TryDeserialize( - type, - runtimeValue, - out var result) - && result is not null) - { - return result; - } + // Check if this is a coordinate (array of numbers) or nested array + if (element[0].ValueKind == JsonValueKind.Number) + { + // This is a position [x, y] or [x, y, z] + return GeoJsonPositionSerializer.Default.CoerceInputValue(type, element, null!)!; } - throw ThrowHelper.Serializer_Parse_CoordinatesIsInvalid(type); + // This is a nested array - recurse + var result = new object[element.GetArrayLength()]; + for (var i = 0; i < result.Length; i++) + { + result[i] = ParseCoordinateFromJson(type, element[i]); + } + + return result; } public static readonly GeoJsonCoordinatesSerializer Default = new(); diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonGeometrySerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonGeometrySerializer.cs index 35483a36d0f..a09bc4e64a7 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonGeometrySerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonGeometrySerializer.cs @@ -1,4 +1,7 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using NetTopologySuite.Geometries; using static HotChocolate.Types.Spatial.Serialization.GeoJsonSerializers; using static HotChocolate.Types.Spatial.ThrowHelper; @@ -8,151 +11,101 @@ namespace HotChocolate.Types.Spatial.Serialization; internal sealed class GeoJsonGeometrySerializer : IGeoJsonSerializer { - public bool TrySerialize(IType type, object? runtimeValue, out object? resultValue) + public bool IsValueCompatible(IType type, IValueNode valueLiteral) { ArgumentNullException.ThrowIfNull(type); + ArgumentNullException.ThrowIfNull(valueLiteral); - try + if (valueLiteral is NullValueNode) { - resultValue = Serialize(type, runtimeValue); return true; } - catch + + if (valueLiteral.Kind != SyntaxKind.ObjectValue) { - resultValue = null; return false; } + + return GetGeometrySerializer(type, (ObjectValueNode)valueLiteral) + .IsValueCompatible(type, valueLiteral); } - public bool IsInstanceOfType(IType type, IValueNode valueSyntax) + public bool IsValueCompatible(IType type, JsonElement inputValue) { ArgumentNullException.ThrowIfNull(type); - ArgumentNullException.ThrowIfNull(valueSyntax); - if (valueSyntax is NullValueNode) + if (inputValue.ValueKind == JsonValueKind.Null) { return true; } - if (valueSyntax.Kind != SyntaxKind.ObjectValue) + if (inputValue.ValueKind != JsonValueKind.Object) { return false; } - return GetGeometrySerializer(type, (ObjectValueNode)valueSyntax) - .IsInstanceOfType(type, valueSyntax); - } - - public bool IsInstanceOfType(IType type, object? runtimeValue) - { - ArgumentNullException.ThrowIfNull(type); - - return runtimeValue is Geometry - && SerializersByType.TryGetValue(runtimeValue.GetType(), out var serializer) - && serializer.IsInstanceOfType(type, runtimeValue); - } - - public object? ParseLiteral(IType type, IValueNode valueSyntax) - { - ArgumentNullException.ThrowIfNull(type); - - if (valueSyntax.Kind is SyntaxKind.NullValue) + if (!TryGetGeometryKindFromJson(type, inputValue, out var geometryType)) { - return null; + return false; } - if (valueSyntax.Kind is not SyntaxKind.ObjectValue) + if (!Serializers.TryGetValue(geometryType, out var serializer)) { - throw Serializer_Parse_ValueKindInvalid(type, valueSyntax.Kind); + return false; } - return GetGeometrySerializer(type, (ObjectValueNode)valueSyntax) - .ParseLiteral(type, valueSyntax); + return serializer.IsValueCompatible(type, inputValue); } - public IValueNode ParseResult(IType type, object? resultValue) + public object? CoerceInputLiteral(IType type, IValueNode valueLiteral) { ArgumentNullException.ThrowIfNull(type); - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is Geometry) + if (valueLiteral.Kind is SyntaxKind.NullValue) { - return ParseValue(type, resultValue); + return null; } - if (resultValue is IReadOnlyDictionary<string, object> dict) + if (valueLiteral.Kind is not SyntaxKind.ObjectValue) { - if (!dict.TryGetValue(TypeFieldName, out var typeObject) - || typeObject is not string typeName) - { - throw Serializer_TypeIsMissing(type); - } - - if (GeoJsonTypeSerializer.Default.TryParseString( - typeName, - out var kind)) - { - return Serializers[kind].ParseResult(type, resultValue); - } - - throw Geometry_Parse_InvalidGeometryKind(type, typeName); + throw Serializer_Parse_ValueKindInvalid(type, valueLiteral.Kind); } - throw Serializer_CouldNotParseValue(type); + return GetGeometrySerializer(type, (ObjectValueNode)valueLiteral) + .CoerceInputLiteral(type, valueLiteral); } - public IValueNode ParseValue(IType type, object? runtimeValue) + public object? CoerceInputValue(IType type, JsonElement inputValue, IFeatureProvider context) { ArgumentNullException.ThrowIfNull(type); - if (runtimeValue is null) + if (inputValue.ValueKind == JsonValueKind.Null) { - return NullValueNode.Default; + return null; } - if (runtimeValue is IReadOnlyDictionary<string, object> - || runtimeValue is IDictionary<string, object>) + if (inputValue.ValueKind != JsonValueKind.Object) { - return ParseResult(type, runtimeValue); + throw Serializer_Parse_ValueKindInvalid(type, SyntaxKind.ObjectValue); } - if (runtimeValue is not Geometry geometry) + if (!TryGetGeometryKindFromJson(type, inputValue, out var geometryType)) { - throw Geometry_Parse_InvalidGeometryType(type, runtimeValue.GetType()); - } - - if (!TryGetGeometryKind(geometry, out var kind)) - { - throw Geometry_Parse_TypeIsUnknown(type, geometry.GeometryType); + throw Geometry_Parse_InvalidType(type); } - if (!Serializers.TryGetValue(kind, out var geometryType)) + if (!Serializers.TryGetValue(geometryType, out var serializer)) { - throw Geometry_Serializer_NotFound(type, kind); + throw Geometry_Serializer_NotFound(type, geometryType); } - return geometryType.ParseValue(type, runtimeValue); + return serializer.CoerceInputValue(type, inputValue, context); } - public object? Serialize(IType type, object? runtimeValue) + public void CoerceOutputValue(IType type, object runtimeValue, ResultElement resultValue) { ArgumentNullException.ThrowIfNull(type); - if (runtimeValue is null) - { - return null; - } - - if (runtimeValue is IReadOnlyDictionary<string, object> - || runtimeValue is IDictionary<string, object>) - { - return runtimeValue; - } - if (runtimeValue is not Geometry geometry) { throw Geometry_Serialize_InvalidGeometryType(type, runtimeValue.GetType()); @@ -163,92 +116,55 @@ public IValueNode ParseValue(IType type, object? runtimeValue) throw Geometry_Serialize_TypeIsUnknown(type, geometry.GeometryType); } - return Serializers[kind].Serialize(type, runtimeValue); + Serializers[kind].CoerceOutputValue(type, runtimeValue, resultValue); } - public object? Deserialize(IType type, object? resultValue) + public IValueNode ValueToLiteral(IType type, object? runtimeValue) { ArgumentNullException.ThrowIfNull(type); - if (resultValue is null) + if (runtimeValue is null) { - return null; + return NullValueNode.Default; } - if (resultValue is Geometry geometry) + if (runtimeValue is not Geometry geometry) { - if (!TryGetGeometryKind(geometry, out var kind)) - { - throw Geometry_Deserialize_TypeIsUnknown(type, geometry.GeometryType); - } - - return Serializers[kind].Deserialize(type, resultValue); + throw Geometry_Parse_InvalidGeometryType(type, runtimeValue.GetType()); } - if (resultValue is IReadOnlyDictionary<string, object> dict) + if (!TryGetGeometryKind(geometry, out var kind)) { - if (!dict.TryGetValue(TypeFieldName, out var typeObject) - || typeObject is not string typeName) - { - throw Geometry_Deserialize_TypeIsMissing(type); - } - - if (GeoJsonTypeSerializer.Default.TryParseString( - typeName, - out var kind)) - { - return Serializers[kind].Deserialize(type, resultValue); - } - - throw Geometry_Deserialize_TypeIsUnknown(type, typeName); + throw Geometry_Parse_TypeIsUnknown(type, geometry.GeometryType); } - throw Serializer_CouldNotDeserialize(type); - } - - public bool TryDeserialize(IType type, object? resultValue, out object? runtimeValue) - { - ArgumentNullException.ThrowIfNull(type); - - try - { - runtimeValue = Deserialize(type, resultValue); - return false; - } - catch + if (!Serializers.TryGetValue(kind, out var geometryType)) { - runtimeValue = null; - return false; + throw Geometry_Serializer_NotFound(type, kind); } - } - public object CreateInstance(IType type, object?[] fieldValues) - => throw Serializer_OperationIsNotSupported(type, - this, - nameof(CreateInstance)); + return geometryType.ValueToLiteral(type, runtimeValue); + } - public void GetFieldData(IType type, object runtimeValue, object?[] fieldValues) + public IValueNode CoordinateToLiteral(IType type, object? runtimeValue) => throw Serializer_OperationIsNotSupported(type, this, - nameof(GetFieldData)); + nameof(CoordinateToLiteral)); - public bool TrySerializeCoordinates( - IType type, - object runtimeValue, - out object? serialized) + public void CoerceOutputCoordinates(IType type, object runtimeValue, ResultElement resultElement) => throw Serializer_OperationIsNotSupported(type, this, - nameof(TrySerializeCoordinates)); + nameof(CoerceOutputCoordinates)); - public IValueNode ParseCoordinateValue(IType type, object? runtimeValue) + public object CreateInstance(IType type, object?[] fieldValues) => throw Serializer_OperationIsNotSupported(type, this, - nameof(ParseCoordinateValue)); + nameof(CreateInstance)); - public IValueNode ParseCoordinateResult(IType type, object? runtimeValue) + public void GetFieldData(IType type, object runtimeValue, object?[] fieldValues) => throw Serializer_OperationIsNotSupported(type, this, - nameof(ParseCoordinateResult)); + nameof(GetFieldData)); private IGeoJsonSerializer GetGeometrySerializer( IType type, @@ -282,7 +198,7 @@ private bool TryGetGeometryKind( for (var i = 0; i < fields.Count; i++) { if (fields[i].Name.Value == TypeFieldName - && GeoJsonTypeSerializer.Default.ParseLiteral(type, fields[i].Value) is + && GeoJsonTypeSerializer.Default.CoerceInputLiteral(type, fields[i].Value) is GeoJsonGeometryType gt) { geometryType = gt; @@ -294,5 +210,25 @@ private bool TryGetGeometryKind( return false; } + private bool TryGetGeometryKindFromJson( + IType type, + JsonElement inputValue, + out GeoJsonGeometryType geometryType) + { + if (inputValue.TryGetProperty(TypeFieldName, out var typeElement) + && typeElement.ValueKind == JsonValueKind.String) + { + var typeName = typeElement.GetString(); + if (typeName is not null + && GeoJsonTypeSerializer.Default.TryParseString(typeName, out geometryType)) + { + return true; + } + } + + geometryType = default; + return false; + } + public static readonly GeoJsonGeometrySerializer Default = new(); } diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonInputObjectSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonInputObjectSerializer.cs index bad949dadb2..06a3888983b 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonInputObjectSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonInputObjectSerializer.cs @@ -1,5 +1,7 @@ -using System.Collections; +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using NetTopologySuite.Geometries; using static HotChocolate.Types.Spatial.ThrowHelper; using static HotChocolate.Types.Spatial.WellKnownFields; @@ -19,89 +21,33 @@ protected GeoJsonInputObjectSerializer(GeoJsonGeometryType geometryType) public abstract T CreateGeometry(IType type, object? coordinates, int? crs); - public override bool TrySerialize( - IType type, - object? runtimeValue, - out object? resultValue) + public override bool IsValueCompatible(IType type, IValueNode valueLiteral) { ArgumentNullException.ThrowIfNull(type); + ArgumentNullException.ThrowIfNull(valueLiteral); - try - { - if (runtimeValue is null) - { - resultValue = null; - return true; - } - - if (runtimeValue is IReadOnlyDictionary<string, object> - || runtimeValue is IDictionary<string, object>) - { - resultValue = runtimeValue; - return true; - } - - if (runtimeValue is Geometry g - && TrySerializeCoordinates(type, g, out var coordinate) - && coordinate is { }) - { - resultValue = new Dictionary<string, object> - { - { CoordinatesFieldName, coordinate }, - { - TypeFieldName, - GeoJsonTypeSerializer.Default.Serialize(type, _geometryType) ?? - throw Serializer_CouldNotSerialize(type) - }, - { CrsFieldName, g.SRID } - }; - - return true; - } - - resultValue = null; - return false; - } - catch - { - resultValue = null; - return false; - } + return valueLiteral is ObjectValueNode or NullValueNode; } - public override bool IsInstanceOfType(IType type, IValueNode literal) + public override bool IsValueCompatible(IType type, JsonElement inputValue) { ArgumentNullException.ThrowIfNull(type); - ArgumentNullException.ThrowIfNull(literal); - return literal is ObjectValueNode - || literal is NullValueNode; + return inputValue.ValueKind is JsonValueKind.Object or JsonValueKind.Null; } - public override bool IsInstanceOfType(IType type, object? runtimeValue) + public override object? CoerceInputLiteral(IType type, IValueNode valueLiteral) { ArgumentNullException.ThrowIfNull(type); - return runtimeValue is T t - && GeoJsonTypeSerializer.Default.TryParseString( - t.GeometryType, - out var g) - && g == _geometryType; - } - - public override object? ParseLiteral(IType type, IValueNode valueSyntax) - { - ArgumentNullException.ThrowIfNull(type); - - if (valueSyntax is NullValueNode) + if (valueLiteral is NullValueNode) { return null; } - if (valueSyntax is ObjectValueNode obj) + if (valueLiteral is ObjectValueNode obj) { - (var geometryType, var coordinates, var crs) = - ParseFields(type, obj); + var (geometryType, coordinates, crs) = ParseFields(type, obj); if (geometryType != _geometryType) { @@ -111,56 +57,66 @@ public override bool IsInstanceOfType(IType type, object? runtimeValue) return CreateGeometry(type, coordinates, crs); } - throw Serializer_Parse_ValueKindInvalid(type, valueSyntax.Kind); + throw Serializer_Parse_ValueKindInvalid(type, valueLiteral.Kind); } - public override IValueNode ParseResult(IType type, object? resultValue) + public override object? CoerceInputValue(IType type, JsonElement inputValue, IFeatureProvider context) { ArgumentNullException.ThrowIfNull(type); - if (resultValue is null) + if (inputValue.ValueKind == JsonValueKind.Null) { - return NullValueNode.Default; + return null; } - if (resultValue is IReadOnlyDictionary<string, object> dict) + if (inputValue.ValueKind == JsonValueKind.Object) { - var list = new List<ObjectFieldNode> - { - new ObjectFieldNode( - TypeFieldName, - GeoJsonTypeSerializer.Default.ParseResult(type, _geometryType)) - }; - - if (dict.TryGetValue(CoordinatesFieldName, out var value) - && value is IList coordinates) - { - list.Add( - new ObjectFieldNode( - CoordinatesFieldName, - ParseCoordinateResult(type, coordinates))); - } + var (geometryType, coordinates, crs) = ParseFieldsFromJson(type, inputValue); - if (dict.TryGetValue(CrsFieldName, out value) && value is int crs) + if (geometryType != _geometryType) { - list.Add( - new ObjectFieldNode( - CrsFieldName, - new IntValueNode(crs))); + throw Serializer_Parse_TypeIsInvalid(type); } - return new ObjectValueNode(list); + return CreateGeometry(type, coordinates, crs); } - if (resultValue is T) + throw Serializer_Parse_ValueKindInvalid(type, SyntaxKind.ObjectValue); + } + + public override void CoerceOutputValue(IType type, object runtimeValue, ResultElement resultValue) + { + ArgumentNullException.ThrowIfNull(type); + + if (runtimeValue is not T geometry) { - return ParseValue(type, resultValue); + throw Serializer_CouldNotParseValue(type); } - throw Serializer_CouldNotParseValue(type); + resultValue.SetObjectValue(3); + + var propertyIndex = 0; + foreach (var property in resultValue.EnumerateObject()) + { + switch (propertyIndex++) + { + case 0: + property.Value.SetPropertyName(TypeFieldNameBytes); + GeoJsonTypeSerializer.Default.CoerceOutputValue(type, _geometryType, property.Value); + break; + case 1: + property.Value.SetPropertyName(CoordinatesFieldNameBytes); + CoerceOutputCoordinates(type, geometry, property.Value); + break; + case 2: + property.Value.SetPropertyName(CrsFieldNameBytes); + property.Value.SetNumberValue(geometry.SRID); + break; + } + } } - public override IValueNode ParseValue(IType type, object? runtimeValue) + public override IValueNode ValueToLiteral(IType type, object? runtimeValue) { ArgumentNullException.ThrowIfNull(type); @@ -169,25 +125,20 @@ public override IValueNode ParseValue(IType type, object? runtimeValue) return NullValueNode.Default; } - if (runtimeValue is IReadOnlyDictionary<string, object> dict) - { - return ParseResult(type, dict); - } - if (runtimeValue is T geometry) { var list = new List<ObjectFieldNode> - { - new ObjectFieldNode( - TypeFieldName, - GeoJsonTypeSerializer.Default.ParseResult(type, _geometryType)), - new ObjectFieldNode( - CoordinatesFieldName, - ParseCoordinateValue(type, geometry)), - new ObjectFieldNode( - CrsFieldName, - new IntValueNode(geometry.SRID)) - }; + { + new ObjectFieldNode( + TypeFieldName, + GeoJsonTypeSerializer.Default.ValueToLiteral(type, _geometryType)), + new ObjectFieldNode( + CoordinatesFieldName, + CoordinateToLiteral(type, geometry)), + new ObjectFieldNode( + CrsFieldName, + new IntValueNode(geometry.SRID)) + }; return new ObjectValueNode(list); } @@ -195,47 +146,13 @@ public override IValueNode ParseValue(IType type, object? runtimeValue) throw Serializer_CouldNotParseValue(type); } - public override bool TryDeserialize( - IType type, - object? resultValue, - out object? runtimeValue) + public override object CreateInstance(IType type, object?[] fieldValues) { - ArgumentNullException.ThrowIfNull(type); + throw Serializer_OperationIsNotSupported(type, this, nameof(CreateInstance)); + } - try - { - switch (resultValue) - { - case null: - runtimeValue = null; - return true; - - case IReadOnlyDictionary<string, object> dict: - (var geometryType, var coordinates, var crs) = - ParseFields(type, dict); - - if (geometryType != _geometryType) - { - runtimeValue = null; - return false; - } - - runtimeValue = CreateGeometry(type, coordinates, crs); - return true; - - case T: - runtimeValue = resultValue; - return true; - - default: - runtimeValue = null; - return false; - } - } - catch - { - runtimeValue = null; - return false; - } + public override void GetFieldData(IType type, object runtimeValue, object?[] fieldValues) + { + throw Serializer_OperationIsNotSupported(type, this, nameof(GetFieldData)); } } diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonLineStringSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonLineStringSerializer.cs index 46e1c93ed50..a8dde9f94e9 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonLineStringSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonLineStringSerializer.cs @@ -1,4 +1,6 @@ using System.Collections; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NetTopologySuite; using NetTopologySuite.Geometries; using static HotChocolate.Types.Spatial.ThrowHelper; @@ -12,6 +14,46 @@ private GeoJsonLineStringSerializer() { } + public override void CoerceOutputCoordinates( + IType type, + object runtimeValue, + ResultElement resultElement) + { + if (runtimeValue is LineString lineString) + { + var coords = lineString.Coordinates; + resultElement.SetArrayValue(coords.Length); + + var index = 0; + foreach (var element in resultElement.EnumerateArray()) + { + GeoJsonPositionSerializer.Default.CoerceOutputCoordinates(type, coords[index++], element); + } + + return; + } + + throw Serializer_CouldNotParseValue(type); + } + + public override IValueNode CoordinateToLiteral(IType type, object? runtimeValue) + { + if (runtimeValue is LineString lineString) + { + var coords = lineString.Coordinates; + var result = new IValueNode[coords.Length]; + + for (var i = 0; i < coords.Length; i++) + { + result[i] = GeoJsonPositionSerializer.Default.ValueToLiteral(type, coords[i]); + } + + return new ListValueNode(result); + } + + throw Serializer_CouldNotParseValue(type); + } + public override LineString CreateGeometry( IType type, object? coordinates, diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiLineStringSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiLineStringSerializer.cs index 9573f76f537..b593a112ecb 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiLineStringSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiLineStringSerializer.cs @@ -1,9 +1,9 @@ using System.Collections; using HotChocolate.Language; +using HotChocolate.Text.Json; using NetTopologySuite; using NetTopologySuite.Geometries; using static HotChocolate.Types.Spatial.ThrowHelper; -using static HotChocolate.Types.Spatial.WellKnownFields; namespace HotChocolate.Types.Spatial.Serialization; @@ -15,6 +15,46 @@ private GeoJsonMultiLineStringSerializer() { } + public override void CoerceOutputCoordinates( + IType type, + object runtimeValue, + ResultElement resultElement) + { + if (runtimeValue is MultiLineString multiLineString) + { + resultElement.SetArrayValue(multiLineString.NumGeometries); + + var lineIndex = 0; + foreach (var lineElement in resultElement.EnumerateArray()) + { + var lineString = (LineString)multiLineString.GetGeometryN(lineIndex++); + GeoJsonLineStringSerializer.Default.CoerceOutputCoordinates(type, lineString, lineElement); + } + + return; + } + + throw Serializer_CouldNotParseValue(type); + } + + public override IValueNode CoordinateToLiteral(IType type, object? runtimeValue) + { + if (runtimeValue is MultiLineString multiLineString) + { + var result = new IValueNode[multiLineString.NumGeometries]; + + for (var i = 0; i < multiLineString.NumGeometries; i++) + { + var lineString = (LineString)multiLineString.GetGeometryN(i); + result[i] = GeoJsonLineStringSerializer.Default.CoordinateToLiteral(type, lineString); + } + + return new ListValueNode(result); + } + + throw Serializer_CouldNotParseValue(type); + } + public override MultiLineString CreateGeometry( IType type, object? coordinates, @@ -96,42 +136,5 @@ public override void GetFieldData(IType type, object runtimeValue, object?[] fie fieldValues[2] = geometry.SRID; } - public override IValueNode ParseValue(IType type, object? runtimeValue) - { - ArgumentNullException.ThrowIfNull(type); - - if (runtimeValue is null) - { - return NullValueNode.Default; - } - - if (runtimeValue is IReadOnlyDictionary<string, object> dict) - { - return ParseResult(type, dict); - } - - if (runtimeValue is MultiLineString geometry) - { - var list = new List<ObjectFieldNode> - { - new ObjectFieldNode( - TypeFieldName, - GeoJsonTypeSerializer.Default.ParseResult( - type, - GeoJsonGeometryType.MultiLineString)), - new ObjectFieldNode( - CoordinatesFieldName, - ParseCoordinateValue(type, geometry)), - new ObjectFieldNode( - CrsFieldName, - new IntValueNode(geometry.SRID)) - }; - - return new ObjectValueNode(list); - } - - throw Serializer_CouldNotParseValue(type); - } - public static readonly GeoJsonMultiLineStringSerializer Default = new(); } diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiPointSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiPointSerializer.cs index 01d66c35c67..e83f6a965da 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiPointSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiPointSerializer.cs @@ -1,4 +1,6 @@ using System.Collections; +using HotChocolate.Language; +using HotChocolate.Text.Json; using NetTopologySuite; using NetTopologySuite.Geometries; using static HotChocolate.Types.Spatial.ThrowHelper; @@ -13,6 +15,46 @@ private GeoJsonMultiPointSerializer() { } + public override void CoerceOutputCoordinates( + IType type, + object runtimeValue, + ResultElement resultElement) + { + if (runtimeValue is MultiPoint multiPoint) + { + var coords = multiPoint.Coordinates; + resultElement.SetArrayValue(coords.Length); + + var index = 0; + foreach (var element in resultElement.EnumerateArray()) + { + GeoJsonPositionSerializer.Default.CoerceOutputCoordinates(type, coords[index++], element); + } + + return; + } + + throw Serializer_CouldNotParseValue(type); + } + + public override IValueNode CoordinateToLiteral(IType type, object? runtimeValue) + { + if (runtimeValue is MultiPoint multiPoint) + { + var coords = multiPoint.Coordinates; + var result = new IValueNode[coords.Length]; + + for (var i = 0; i < coords.Length; i++) + { + result[i] = GeoJsonPositionSerializer.Default.ValueToLiteral(type, coords[i]); + } + + return new ListValueNode(result); + } + + throw Serializer_CouldNotParseValue(type); + } + public override MultiPoint CreateGeometry( IType type, object? coordinates, diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiPolygonSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiPolygonSerializer.cs index 357ddeccab1..ea9e70121e5 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiPolygonSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonMultiPolygonSerializer.cs @@ -1,9 +1,9 @@ using System.Collections; using HotChocolate.Language; +using HotChocolate.Text.Json; using NetTopologySuite; using NetTopologySuite.Geometries; using static HotChocolate.Types.Spatial.ThrowHelper; -using static HotChocolate.Types.Spatial.WellKnownFields; namespace HotChocolate.Types.Spatial.Serialization; @@ -15,6 +15,46 @@ private GeoJsonMultiPolygonSerializer() { } + public override void CoerceOutputCoordinates( + IType type, + object runtimeValue, + ResultElement resultElement) + { + if (runtimeValue is MultiPolygon multiPolygon) + { + resultElement.SetArrayValue(multiPolygon.NumGeometries); + + var polygonIndex = 0; + foreach (var polygonElement in resultElement.EnumerateArray()) + { + var polygon = (Polygon)multiPolygon.GetGeometryN(polygonIndex++); + GeoJsonPolygonSerializer.Default.CoerceOutputCoordinates(type, polygon, polygonElement); + } + + return; + } + + throw Serializer_CouldNotParseValue(type); + } + + public override IValueNode CoordinateToLiteral(IType type, object? runtimeValue) + { + if (runtimeValue is MultiPolygon multiPolygon) + { + var result = new IValueNode[multiPolygon.NumGeometries]; + + for (var i = 0; i < multiPolygon.NumGeometries; i++) + { + var polygon = (Polygon)multiPolygon.GetGeometryN(i); + result[i] = GeoJsonPolygonSerializer.Default.CoordinateToLiteral(type, polygon); + } + + return new ListValueNode(result); + } + + throw Serializer_CouldNotParseValue(type); + } + public override MultiPolygon CreateGeometry( IType type, object? coordinates, @@ -77,52 +117,28 @@ public override void GetFieldData(IType type, object runtimeValue, object?[] fie { ArgumentNullException.ThrowIfNull(type); - if (runtimeValue is not MultiPolygon geometry - || !TrySerializeCoordinates(type, runtimeValue, out var serialized)) + if (runtimeValue is not MultiPolygon geometry) { throw Geometry_Parse_InvalidGeometryType(type, runtimeValue.GetType()); } - fieldValues[0] = GeoJsonGeometryType.MultiPolygon; - fieldValues[1] = serialized; - fieldValues[2] = geometry.SRID; - } - - public override IValueNode ParseValue(IType type, object? runtimeValue) - { - ArgumentNullException.ThrowIfNull(type); - - if (runtimeValue is null) + // Build coordinate arrays for each polygon + var polygonCoords = new object[geometry.NumGeometries]; + for (var i = 0; i < geometry.NumGeometries; i++) { - return NullValueNode.Default; - } - - if (runtimeValue is IReadOnlyDictionary<string, object> dict) - { - return ParseResult(type, dict); - } - - if (runtimeValue is MultiPolygon geometry) - { - var list = new List<ObjectFieldNode> - { - new ObjectFieldNode( - TypeFieldName, - GeoJsonTypeSerializer.Default.ParseResult( - type, - GeoJsonGeometryType.MultiPolygon)), - new ObjectFieldNode( - CoordinatesFieldName, - ParseCoordinateValue(type, geometry)), - new ObjectFieldNode( - CrsFieldName, - new IntValueNode(geometry.SRID)) - }; - - return new ObjectValueNode(list); + var polygon = (Polygon)geometry.GetGeometryN(i); + var rings = new Coordinate[polygon.NumInteriorRings + 1][]; + rings[0] = polygon.ExteriorRing.Coordinates; + for (var j = 0; j < polygon.InteriorRings.Length; j++) + { + rings[j + 1] = polygon.InteriorRings[j].Coordinates; + } + polygonCoords[i] = rings; } - throw Serializer_CouldNotParseValue(type); + fieldValues[0] = GeoJsonGeometryType.MultiPolygon; + fieldValues[1] = polygonCoords; + fieldValues[2] = geometry.SRID; } public static readonly GeoJsonMultiPolygonSerializer Default = new(); diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPointSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPointSerializer.cs index 89c1cad1e2a..4fc0783f720 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPointSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPointSerializer.cs @@ -1,4 +1,5 @@ using HotChocolate.Language; +using HotChocolate.Text.Json; using NetTopologySuite; using NetTopologySuite.Geometries; using static HotChocolate.Types.Spatial.ThrowHelper; @@ -13,26 +14,25 @@ private GeoJsonPointSerializer() { } - public override bool TrySerializeCoordinates( + public override void CoerceOutputCoordinates( IType type, object runtimeValue, - out object? serialized) + ResultElement resultElement) { - serialized = null; if (runtimeValue is Point point) { - serialized = GeoJsonPositionSerializer.Default.Serialize(type, point.Coordinate); - return true; + GeoJsonPositionSerializer.Default.CoerceOutputCoordinates(type, point.Coordinate, resultElement); + return; } - return false; + throw Serializer_CouldNotParseValue(type); } - public override IValueNode ParseCoordinateValue(IType type, object? runtimeValue) + public override IValueNode CoordinateToLiteral(IType type, object? runtimeValue) { if (runtimeValue is Point point) { - return GeoJsonPositionSerializer.Default.ParseValue(type, point.Coordinate); + return GeoJsonPositionSerializer.Default.ValueToLiteral(type, point.Coordinate); } throw Serializer_CouldNotParseValue(type); diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPolygonSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPolygonSerializer.cs index ac135db7f31..99ccfa5c1ed 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPolygonSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPolygonSerializer.cs @@ -1,9 +1,9 @@ using System.Collections; using HotChocolate.Language; +using HotChocolate.Text.Json; using NetTopologySuite; using NetTopologySuite.Geometries; using static HotChocolate.Types.Spatial.ThrowHelper; -using static HotChocolate.Types.Spatial.WellKnownFields; namespace HotChocolate.Types.Spatial.Serialization; @@ -15,6 +15,69 @@ private GeoJsonPolygonSerializer() { } + public override void CoerceOutputCoordinates( + IType type, + object runtimeValue, + ResultElement resultElement) + { + if (runtimeValue is Polygon polygon) + { + var ringCount = polygon.NumInteriorRings + 1; + resultElement.SetArrayValue(ringCount); + + var ringIndex = 0; + foreach (var ringElement in resultElement.EnumerateArray()) + { + var ring = ringIndex == 0 ? polygon.ExteriorRing : polygon.InteriorRings[ringIndex - 1]; + var coords = ring.Coordinates; + ringElement.SetArrayValue(coords.Length); + + var coordIndex = 0; + foreach (var coordElement in ringElement.EnumerateArray()) + { + GeoJsonPositionSerializer.Default.CoerceOutputCoordinates(type, coords[coordIndex++], coordElement); + } + + ringIndex++; + } + + return; + } + + throw Serializer_CouldNotParseValue(type); + } + + public override IValueNode CoordinateToLiteral(IType type, object? runtimeValue) + { + if (runtimeValue is Polygon p) + { + var geometryCoords = new IValueNode[p.NumInteriorRings + 1]; + geometryCoords[0] = RingToLiteral(type, p.ExteriorRing); + + for (var i = 0; i < p.InteriorRings.Length; i++) + { + geometryCoords[i + 1] = RingToLiteral(type, p.InteriorRings[i]); + } + + return new ListValueNode(geometryCoords); + } + + throw Serializer_CouldNotParseValue(type); + } + + private static IValueNode RingToLiteral(IType type, LineString ring) + { + var coords = ring.Coordinates; + var result = new IValueNode[coords.Length]; + + for (var i = 0; i < coords.Length; i++) + { + result[i] = GeoJsonPositionSerializer.Default.ValueToLiteral(type, coords[i]); + } + + return new ListValueNode(result); + } + public override Polygon CreateGeometry( IType type, object? coordinates, @@ -79,108 +142,22 @@ public override void GetFieldData(IType type, object runtimeValue, object?[] fie { ArgumentNullException.ThrowIfNull(type); - if (runtimeValue is not Polygon geometry - || !TrySerializeCoordinates(type, geometry, out var serialized)) + if (runtimeValue is not Polygon geometry) { throw Geometry_Parse_InvalidGeometryType(type, runtimeValue.GetType()); } - fieldValues[0] = GeoJsonGeometryType.Polygon; - fieldValues[1] = serialized; - fieldValues[2] = geometry.SRID; - } - - public override IValueNode ParseValue(IType type, object? runtimeValue) - { - ArgumentNullException.ThrowIfNull(type); - - if (runtimeValue is null) - { - return NullValueNode.Default; - } - - if (runtimeValue is IReadOnlyDictionary<string, object> dict) - { - return ParseResult(type, dict); - } - - if (runtimeValue is Polygon geometry) - { - var list = new List<ObjectFieldNode> - { - new(TypeFieldName, - GeoJsonTypeSerializer.Default.ParseResult( - type, - GeoJsonGeometryType.Polygon)), - new(CoordinatesFieldName, ParseCoordinateValue(type, geometry)), - new(CrsFieldName, new IntValueNode(geometry.SRID)) - }; - - return new ObjectValueNode(list); - } - - throw Serializer_CouldNotParseValue(type); - } - - public override IValueNode ParseCoordinateValue(IType type, object? runtimeValue) - { - if (runtimeValue is Polygon p) + // Build the coordinate arrays for polygon (rings) + var rings = new Coordinate[geometry.NumInteriorRings + 1][]; + rings[0] = geometry.ExteriorRing.Coordinates; + for (var i = 0; i < geometry.InteriorRings.Length; i++) { - var geometryCoords = new IValueNode[p.NumInteriorRings + 1]; - geometryCoords[0] = base.ParseCoordinateValue(type, p.ExteriorRing); - for (var i = 0; i < p.InteriorRings.Length; i++) - { - geometryCoords[i + 1] = - base.ParseCoordinateValue(type, p.InteriorRings[i]); - } - - return new ListValueNode(geometryCoords); + rings[i + 1] = geometry.InteriorRings[i].Coordinates; } - throw Serializer_CouldNotParseValue(type); - } - - public override bool TrySerializeCoordinates( - IType type, - object runtimeValue, - out object? serialized) - { - if (runtimeValue is Polygon polygon) - { - var geometryCoords = new object?[polygon.NumInteriorRings + 1]; - - if (base.TrySerializeCoordinates(type, - polygon.ExteriorRing, - out var serializedPolygonCoords)) - { - geometryCoords[0] = serializedPolygonCoords; - } - else - { - throw Serializer_CouldNotSerialize(type); - } - - for (var i = 0; i < polygon.InteriorRings.Length; i++) - { - if (base.TrySerializeCoordinates( - type, - polygon.InteriorRings[i], - out var coords)) - { - geometryCoords[i + 1] = coords; - } - else - { - throw Serializer_CouldNotSerialize(type); - } - } - - serialized = geometryCoords; - return true; - } - - serialized = null; - return false; + fieldValues[0] = GeoJsonGeometryType.Polygon; + fieldValues[1] = rings; + fieldValues[2] = geometry.SRID; } public static readonly GeoJsonPolygonSerializer Default = new(); diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPositionSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPositionSerializer.cs index bc50feb949e..b2adcb1e582 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPositionSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonPositionSerializer.cs @@ -1,21 +1,23 @@ -using System.Collections; +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using NetTopologySuite.Geometries; namespace HotChocolate.Types.Spatial.Serialization; internal class GeoJsonPositionSerializer : GeoJsonSerializerBase<Coordinate> { - public override bool IsInstanceOfType(IType type, IValueNode valueSyntax) + public override bool IsValueCompatible(IType type, IValueNode valueLiteral) { ArgumentNullException.ThrowIfNull(type); - if (valueSyntax is NullValueNode) + if (valueLiteral is NullValueNode) { return true; } - if (valueSyntax is ListValueNode listValueNode) + if (valueLiteral is ListValueNode listValueNode) { var numberOfItems = listValueNode.Items.Count; @@ -39,21 +41,39 @@ public override bool IsInstanceOfType(IType type, IValueNode valueSyntax) return false; } - public override object? ParseLiteral(IType type, IValueNode valueSyntax) + public override bool IsValueCompatible(IType type, JsonElement inputValue) { ArgumentNullException.ThrowIfNull(type); - if (valueSyntax is null) + if (inputValue.ValueKind == JsonValueKind.Null) + { + return true; + } + + if (inputValue.ValueKind == JsonValueKind.Array) + { + var length = inputValue.GetArrayLength(); + return length is 2 or 3; + } + + return false; + } + + public override object? CoerceInputLiteral(IType type, IValueNode valueLiteral) + { + ArgumentNullException.ThrowIfNull(type); + + if (valueLiteral is null) { throw ThrowHelper.PositionScalar_CoordinatesCannotBeNull(null!); } - if (valueSyntax is NullValueNode) + if (valueLiteral is NullValueNode) { return null; } - if (valueSyntax is ListValueNode list) + if (valueLiteral is ListValueNode list) { if (list.Items.Count != 2 && list.Items.Count != 3) { @@ -81,207 +101,140 @@ public override bool IsInstanceOfType(IType type, IValueNode valueSyntax) throw ThrowHelper.PositionScalar_InvalidPositionObject(null!); } - public override IValueNode ParseValue(IType type, object? value) + public override object? CoerceInputValue(IType type, JsonElement inputValue, IFeatureProvider context) { ArgumentNullException.ThrowIfNull(type); - if (value is null) + if (inputValue.ValueKind == JsonValueKind.Null) { - return NullValueNode.Default; + return null; } - double x; - double y; - double z; - switch (value) + if (inputValue.ValueKind != JsonValueKind.Array) { - case Coordinate coordinate: - x = coordinate.X; - y = coordinate.Y; - z = coordinate.Z; - break; - - case double[] { Length: > 1 and < 4 } coordinateArray: - x = coordinateArray[0]; - y = coordinateArray[1]; - z = coordinateArray.Length == 3 ? coordinateArray[2] : double.NaN; - break; - - default: - throw ThrowHelper.PositionScalar_InvalidPositionObject(null!); + throw ThrowHelper.PositionScalar_InvalidPositionObject(null!); } - var xNode = new FloatValueNode(x); - var yNode = new FloatValueNode(y); - - if (!double.IsNaN(z)) + var length = inputValue.GetArrayLength(); + if (length < 2 || length > 3) { - var zNode = new FloatValueNode(z); - return new ListValueNode(xNode, yNode, zNode); + throw ThrowHelper.PositionScalar_InvalidPositionObject(null!); } - return new ListValueNode(xNode, yNode); - } + var x = inputValue[0].GetDouble(); + var y = inputValue[1].GetDouble(); - public override object CreateInstance(IType type, object?[] fieldValues) - { - throw new NotImplementedException(); - } - - public override void GetFieldData(IType type, object runtimeValue, object?[] fieldValues) - { - throw new NotImplementedException(); - } - - public override IValueNode ParseResult(IType type, object? resultValue) - { - ArgumentNullException.ThrowIfNull(type); - - if (resultValue is null) - { - return NullValueNode.Default; - } - - if (resultValue is Coordinate coords) + if (double.IsInfinity(x) || double.IsInfinity(y)) { - if (coords.Z is double.NaN) - { - return new ListValueNode( - new FloatValueNode(coords.X), - new FloatValueNode(coords.Y)); - } - - return new ListValueNode( - new FloatValueNode(coords.X), - new FloatValueNode(coords.Y), - new FloatValueNode(coords.Z)); + throw ThrowHelper.PositionScalar_InvalidPositionObject(null!); } - if (resultValue is not double[] coordinate) + if (length == 2) { - throw ThrowHelper.PositionScalar_CoordinatesCannotBeNull(null!); + return new Coordinate(x, y); } - if (coordinate.Length != 2 && coordinate.Length != 3) + var z = inputValue[2].GetDouble(); + if (double.IsInfinity(z)) { throw ThrowHelper.PositionScalar_InvalidPositionObject(null!); } - var xNode = new FloatValueNode(coordinate[0]); - var yNode = new FloatValueNode(coordinate[1]); + return new CoordinateZ(x, y, z); + } - if (coordinate.Length > 2) - { - var zNode = new FloatValueNode(coordinate[2]); - return new ListValueNode(xNode, yNode, zNode); - } + public override void CoerceOutputValue(IType type, object runtimeValue, ResultElement resultValue) + { + ArgumentNullException.ThrowIfNull(type); - return new ListValueNode(xNode, yNode); + CoerceOutputCoordinates(type, runtimeValue, resultValue); } - public override bool TryDeserialize(IType type, object? serialized, out object? value) + public override void CoerceOutputCoordinates(IType type, object runtimeValue, ResultElement resultElement) { ArgumentNullException.ThrowIfNull(type); - if (serialized is null) + if (runtimeValue is not Coordinate coordinate) { - value = null; - return true; + throw ThrowHelper.PositionScalar_InvalidPositionObject(null!); } - if (serialized is not IList list) + var hasZ = !double.IsNaN(coordinate.Z); + resultElement.SetArrayValue(hasZ ? 3 : 2); + + var index = 0; + foreach (var element in resultElement.EnumerateArray()) { - value = null; - return false; + switch (index++) + { + case 0: + element.SetNumberValue(coordinate.X); + break; + case 1: + element.SetNumberValue(coordinate.Y); + break; + case 2: + element.SetNumberValue(coordinate.Z); + break; + } } + } - if (list.Count < 2 || list.Count > 3) + public override IValueNode ValueToLiteral(IType type, object? runtimeValue) + { + ArgumentNullException.ThrowIfNull(type); + + if (runtimeValue is null) { - value = null; - return false; + return NullValueNode.Default; } double x; double y; - try - { - x = Convert.ToDouble(list[0]); - y = Convert.ToDouble(list[1]); - } - catch (Exception ex) when (ex is FormatException - || ex is InvalidCastException - || ex is OverflowException) + double z; + switch (runtimeValue) { - value = null; - return false; - } + case Coordinate coordinate: + x = coordinate.X; + y = coordinate.Y; + z = coordinate.Z; + break; - if (double.IsInfinity(x) || double.IsInfinity(y)) - { - value = null; - return false; - } + case double[] { Length: > 1 and < 4 } coordinateArray: + x = coordinateArray[0]; + y = coordinateArray[1]; + z = coordinateArray.Length == 3 ? coordinateArray[2] : double.NaN; + break; - if (list.Count == 2) - { - value = new Coordinate(x, y); - return true; + default: + throw ThrowHelper.PositionScalar_InvalidPositionObject(null!); } - try - { - var z = Convert.ToDouble(list[2]); - if (double.IsInfinity(z)) - { - value = null; - return false; - } + var xNode = new FloatValueNode(x); + var yNode = new FloatValueNode(y); - value = new CoordinateZ(x, y, z); - return true; - } - catch (Exception ex) when (ex is FormatException - || ex is InvalidCastException - || ex is OverflowException) + if (!double.IsNaN(z)) { - value = null; - return false; + var zNode = new FloatValueNode(z); + return new ListValueNode(xNode, yNode, zNode); } + + return new ListValueNode(xNode, yNode); } - public override bool TrySerialize(IType type, object? value, out object? serialized) + public override IValueNode CoordinateToLiteral(IType type, object? runtimeValue) { - ArgumentNullException.ThrowIfNull(type); - - if (value is null) - { - serialized = null; - return true; - } - - if (value is not Coordinate coordinate) - { - serialized = null; - return false; - } + return ValueToLiteral(type, runtimeValue); + } - if (!double.IsNaN(coordinate.Z)) - { - serialized = new[] - { - coordinate.X, - coordinate.Y, - coordinate.Z - }; - return true; - } + public override object CreateInstance(IType type, object?[] fieldValues) + { + throw new NotSupportedException("Position scalars don't support CreateInstance"); + } - serialized = new[] - { - coordinate.X, - coordinate.Y - }; - return true; + public override void GetFieldData(IType type, object runtimeValue, object?[] fieldValues) + { + throw new NotSupportedException("Position scalars don't support GetFieldData"); } public static readonly GeoJsonPositionSerializer Default = new(); diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonSerializerBase.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonSerializerBase.cs index dbdc75f7aa1..7d8924a1f63 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonSerializerBase.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonSerializerBase.cs @@ -1,5 +1,7 @@ -using System.Collections; +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using HotChocolate.Utilities; using NetTopologySuite.Geometries; using static HotChocolate.Types.Spatial.ThrowHelper; @@ -9,129 +11,102 @@ namespace HotChocolate.Types.Spatial.Serialization; internal abstract class GeoJsonSerializerBase : IGeoJsonSerializer { - public abstract bool IsInstanceOfType(IType type, IValueNode valueSyntax); + public abstract bool IsValueCompatible(IType type, IValueNode valueLiteral); - public virtual bool IsInstanceOfType(IType type, object? runtimeValue) - { - ArgumentNullException.ThrowIfNull(type); - - if (runtimeValue is null) - { - return true; - } - - return false; - } - - public virtual object? Deserialize(IType type, object? resultValue) - { - ArgumentNullException.ThrowIfNull(type); - - if (TryDeserialize(type, resultValue, out var deserialized)) - { - return deserialized; - } - - throw Serializer_CouldNotSerialize(type); - } - - public virtual object? Serialize(IType type, object? runtimeValue) - { - ArgumentNullException.ThrowIfNull(type); - - if (TrySerialize(type, runtimeValue, out var serialized)) - { - return serialized; - } - - throw Serializer_CouldNotDeserialize(type); - } + public abstract bool IsValueCompatible(IType type, JsonElement inputValue); - public abstract bool TryDeserialize( - IType type, - object? resultValue, - out object? runtimeValue); - - public abstract bool TrySerialize( - IType type, - object? runtimeValue, - out object? resultValue); + public abstract object? CoerceInputLiteral(IType type, IValueNode valueLiteral); - public abstract object? ParseLiteral(IType type, IValueNode valueSyntax); + public abstract object? CoerceInputValue(IType type, JsonElement inputValue, IFeatureProvider context); - public abstract IValueNode ParseValue(IType type, object? runtimeValue); + public abstract void CoerceOutputValue(IType type, object runtimeValue, ResultElement resultValue); - public abstract IValueNode ParseResult(IType type, object? resultValue); + public abstract IValueNode ValueToLiteral(IType type, object? runtimeValue); public abstract object CreateInstance(IType type, object?[] fieldValues); public abstract void GetFieldData(IType type, object runtimeValue, object?[] fieldValues); - public virtual IValueNode ParseCoordinateResult(IType type, object? runtimeValue) + public virtual IValueNode CoordinateToLiteral(IType type, object? runtimeValue) { - if (runtimeValue is IList { Count: > 0 } list && list[0] is IList) + if (runtimeValue is GeometryCollection collection) { - var results = new IValueNode[list.Count]; - for (var i = 0; i < list.Count; i++) + var geometryCoords = new IValueNode[collection.Geometries.Length]; + for (var i = 0; i < collection.Geometries.Length; i++) { - results[i] = ParseCoordinateResult(type, list[i]); + if (GeoJsonSerializers.SerializersByTypeName.TryGetValue( + collection.Geometries[i].GeometryType, + out var serializer)) + { + geometryCoords[i] = + serializer.CoordinateToLiteral(type, collection.Geometries[i]); + } + else + { + geometryCoords[i] = CoordinateToLiteral(type, collection.Geometries[i]); + } } - return new ListValueNode(results); + return new ListValueNode(geometryCoords); } - if (runtimeValue is Coordinate) + if (runtimeValue is Geometry g) { - return GeoJsonPositionSerializer.Default.ParseResult(type, runtimeValue); - } + var result = new IValueNode[g.Coordinates.Length]; - if (runtimeValue is double[]) - { - return GeoJsonPositionSerializer.Default.ParseResult(type, runtimeValue); + for (var i = 0; i < result.Length; i++) + { + result[i] = GeoJsonPositionSerializer.Default.ValueToLiteral(type, g.Coordinates[i]); + } + + return new ListValueNode(result); } - throw Serializer_CouldNotParseValue(type); + throw Serializer_Parse_CoordinatesIsInvalid(type); } - protected (GeoJsonGeometryType type, object coordinates, int? crs) ParseFields( - IType type, - IReadOnlyDictionary<string, object> obj) + public virtual void CoerceOutputCoordinates(IType type, object runtimeValue, ResultElement resultElement) { - GeoJsonGeometryType? geometryType = null; - object? coordinates = null; - int? crs = null; - - if (obj.TryGetValue(TypeFieldName, out var typeObject)) + if (runtimeValue is GeometryCollection collection) { - geometryType = GeoJsonTypeSerializer.Default.Deserialize(type, typeObject) - as GeoJsonGeometryType?; - } + resultElement.SetArrayValue(collection.Geometries.Length); - if (obj.TryGetValue(CoordinatesFieldName, out var coordinateObject)) - { - coordinates = DeserializeCoordinate(type, coordinateObject); - } + var geomIndex = 0; + foreach (var element in resultElement.EnumerateArray()) + { + var geom = collection.Geometries[geomIndex++]; + if (GeoJsonSerializers.SerializersByTypeName.TryGetValue( + geom.GeometryType, + out var serializer)) + { + serializer.CoerceOutputCoordinates(type, geom, element); + } + else + { + CoerceOutputCoordinates(type, geom, element); + } + } - if (obj.TryGetValue(CrsFieldName, out var crsObject) - && crsObject is int crsInt) - { - crs = crsInt; + return; } - if (geometryType is null) + if (runtimeValue is Geometry g) { - throw Serializer_CoordinatesIsMissing(type); - } + resultElement.SetArrayValue(g.Coordinates.Length); - if (coordinates is null) - { - throw Serializer_CoordinatesIsMissing(type); + var coordIndex = 0; + foreach (var element in resultElement.EnumerateArray()) + { + GeoJsonPositionSerializer.Default.CoerceOutputCoordinates(type, g.Coordinates[coordIndex++], element); + } + + return; } - return (geometryType.Value, coordinates, crs); + throw Serializer_CouldNotSerialize(type); } - protected (GeoJsonGeometryType type, object coordinates, int? crs) ParseFields( + protected static (GeoJsonGeometryType type, object coordinates, int? crs) ParseFields( IType type, ObjectValueNode obj) { @@ -147,7 +122,7 @@ public virtual IValueNode ParseCoordinateResult(IType type, object? runtimeValue if (TypeFieldName.EqualsInvariantIgnoreCase(fieldName)) { geometryType = - GeoJsonTypeSerializer.Default.ParseLiteral(type, syntaxNode) + GeoJsonTypeSerializer.Default.CoerceInputLiteral(type, syntaxNode) as GeoJsonGeometryType?; } else if (CoordinatesFieldName.EqualsInvariantIgnoreCase(fieldName)) @@ -175,151 +150,51 @@ public virtual IValueNode ParseCoordinateResult(IType type, object? runtimeValue return (geometryType.Value, coordinates, crs); } - private object DeserializeCoordinate(IType type, object? runtimeValue) - { - return GeoJsonCoordinatesSerializer.Default.DeserializeCoordinate(type, runtimeValue); - } - - private object ParseCoordinateLiteral(IType type, IValueNode syntaxNode) - { - return GeoJsonCoordinatesSerializer.Default.ParseCoordinateLiteral(type, syntaxNode); - } - - public virtual bool TrySerializeCoordinates( + protected static (GeoJsonGeometryType type, object coordinates, int? crs) ParseFieldsFromJson( IType type, - object runtimeValue, - out object? serialized) + JsonElement obj) { - serialized = null; - if (runtimeValue is GeometryCollection collection) - { - var geometryCoords = new object?[collection.Geometries.Length]; - for (var i = 0; i < collection.Geometries.Length; i++) - { - if (GeoJsonSerializers.SerializersByTypeName.TryGetValue( - collection.Geometries[i].GeometryType, - out var serializer)) - { - if (serializer.TrySerializeCoordinates(type, - collection.Geometries[i], - out var elementCoords)) - { - geometryCoords[i] = elementCoords; - } - else - { - return false; - } - } - else - { - if (TrySerializeCoordinates(type, - collection.Geometries[i], - out var elementCoords)) - { - geometryCoords[i] = elementCoords; - } - else - { - return false; - } - } - } + GeoJsonGeometryType? geometryType = null; + object? coordinates = null; + int? crs = null; - serialized = geometryCoords; - return true; + if (obj.TryGetProperty(TypeFieldName, out var typeElement)) + { + geometryType = GeoJsonTypeSerializer.Default.CoerceInputValueFromJson(type, typeElement) + as GeoJsonGeometryType?; } - if (runtimeValue is Geometry g) + if (obj.TryGetProperty(CoordinatesFieldName, out var coordsElement)) { - var result = new double[g.Coordinates.Length][]; - for (var i = 0; i < result.Length; i++) - { - if (GeoJsonPositionSerializer.Default.TrySerialize(type, - g.Coordinates[i], - out var serializedPoints) - && serializedPoints is double[] points) - { - result[i] = points; - } - else - { - serialized = null; - return false; - } - } - - serialized = result; - return true; + coordinates = GeoJsonCoordinatesSerializer.Default.ParseCoordinateFromJson(type, coordsElement); } - serialized = null; - return false; - } - - public virtual IValueNode ParseCoordinateValue(IType type, object? runtimeValue) - { - if (runtimeValue is GeometryCollection collection) + if (obj.TryGetProperty(CrsFieldName, out var crsElement) + && crsElement.ValueKind == JsonValueKind.Number) { - var geometryCoords = new IValueNode[collection.Geometries.Length]; - for (var i = 0; i < collection.Geometries.Length; i++) - { - if (GeoJsonSerializers.SerializersByTypeName.TryGetValue( - collection.Geometries[i].GeometryType, - out var serializer)) - { - geometryCoords[i] = - serializer.ParseCoordinateValue(type, collection.Geometries[i]); - } - else - { - geometryCoords[i] = ParseCoordinateValue(type, collection.Geometries[i]); - } - } - - return new ListValueNode(geometryCoords); + crs = crsElement.GetInt32(); } - if (runtimeValue is Geometry g) + if (geometryType is null) { - var result = new IValueNode[g.Coordinates.Length]; - - for (var i = 0; i < result.Length; i++) - { - if (GeoJsonPositionSerializer.Default - .ParseResult(type, g.Coordinates[i]) is { } parsed) - { - result[i] = parsed; - } - else - { - throw Serializer_Parse_CoordinatesIsInvalid(type); - } - } + throw Serializer_TypeIsMissing(type); + } - return new ListValueNode(result); + if (coordinates is null) + { + throw Serializer_CoordinatesIsMissing(type); } - throw Serializer_Parse_CoordinatesIsInvalid(type); + return (geometryType.Value, coordinates, crs); + } + + protected static object ParseCoordinateLiteral(IType type, IValueNode syntaxNode) + { + return GeoJsonCoordinatesSerializer.Default.ParseCoordinateLiteral(type, syntaxNode); } } internal abstract class GeoJsonSerializerBase<T> : GeoJsonSerializerBase { - public override bool IsInstanceOfType(IType type, object? runtimeValue) - { - ArgumentNullException.ThrowIfNull(type); - - if (runtimeValue is null) - { - return true; - } - - if (runtimeValue is T) - { - return true; - } - - return false; - } + // No runtime type checking - the new scalar API handles this at the type level } diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonTypeSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonTypeSerializer.cs index 1d7141bc9c7..d93e48e6e8c 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonTypeSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/GeoJsonTypeSerializer.cs @@ -1,4 +1,7 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using static HotChocolate.Types.Spatial.GeoJsonGeometryType; using static HotChocolate.Types.Spatial.ThrowHelper; @@ -9,92 +12,86 @@ internal class GeoJsonTypeSerializer : GeoJsonSerializerBase<GeoJsonGeometryType private static readonly IDictionary<string, GeoJsonGeometryType> s_nameLookup = new Dictionary<string, GeoJsonGeometryType> { - { nameof(Point), Point }, - { nameof(MultiPoint), MultiPoint }, - { nameof(LineString), LineString }, - { nameof(MultiLineString), MultiLineString }, - { nameof(Polygon), Polygon }, - { nameof(MultiPolygon), MultiPolygon }, - { nameof(GeometryCollection), GeometryCollection } + { nameof(Point), Point }, + { nameof(MultiPoint), MultiPoint }, + { nameof(LineString), LineString }, + { nameof(MultiLineString), MultiLineString }, + { nameof(Polygon), Polygon }, + { nameof(MultiPolygon), MultiPolygon }, + { nameof(GeometryCollection), GeometryCollection } }; private static readonly IDictionary<GeoJsonGeometryType, string> s_valueLookup = new Dictionary<GeoJsonGeometryType, string> { - { Point, nameof(Point) }, - { MultiPoint, nameof(MultiPoint) }, - { LineString, nameof(LineString) }, - { MultiLineString, nameof(MultiLineString) }, - { Polygon, nameof(Polygon) }, - { MultiPolygon, nameof(MultiPolygon) }, - { GeometryCollection, nameof(GeometryCollection) } + { Point, nameof(Point) }, + { MultiPoint, nameof(MultiPoint) }, + { LineString, nameof(LineString) }, + { MultiLineString, nameof(MultiLineString) }, + { Polygon, nameof(Polygon) }, + { MultiPolygon, nameof(MultiPolygon) }, + { GeometryCollection, nameof(GeometryCollection) } }; - public override bool TrySerialize( - IType type, - object? runtimeValue, - out object? resultValue) + public override bool IsValueCompatible(IType type, IValueNode valueLiteral) { ArgumentNullException.ThrowIfNull(type); + ArgumentNullException.ThrowIfNull(valueLiteral); - if (runtimeValue is null) + if (valueLiteral is NullValueNode) { - resultValue = null; return true; } - if (runtimeValue is GeoJsonGeometryType geometryType - && s_valueLookup.TryGetValue(geometryType, out var enumValue)) + if (valueLiteral is EnumValueNode ev) { - resultValue = enumValue; - return true; + return s_nameLookup.ContainsKey(ev.Value); + } + + if (valueLiteral is StringValueNode sv) + { + return s_nameLookup.ContainsKey(sv.Value); } - resultValue = null; return false; } - public override bool IsInstanceOfType(IType type, IValueNode valueSyntax) + public override bool IsValueCompatible(IType type, JsonElement inputValue) { ArgumentNullException.ThrowIfNull(type); - ArgumentNullException.ThrowIfNull(valueSyntax); - if (valueSyntax is NullValueNode) + if (inputValue.ValueKind == JsonValueKind.Null) { return true; } - if (valueSyntax is EnumValueNode ev) + if (inputValue.ValueKind == JsonValueKind.String) { - return s_nameLookup.ContainsKey(ev.Value); - } - - if (valueSyntax is StringValueNode sv) - { - return s_nameLookup.ContainsKey(sv.Value); + var value = inputValue.GetString(); + return value is not null && s_nameLookup.ContainsKey(value); } return false; } - public override object? ParseLiteral(IType type, IValueNode valueSyntax) + public override object? CoerceInputLiteral(IType type, IValueNode valueLiteral) { ArgumentNullException.ThrowIfNull(type); - ArgumentNullException.ThrowIfNull(valueSyntax); + ArgumentNullException.ThrowIfNull(valueLiteral); - if (valueSyntax is EnumValueNode evn + if (valueLiteral is EnumValueNode evn && s_nameLookup.TryGetValue(evn.Value, out var ev)) { return ev; } - if (valueSyntax is StringValueNode svn + if (valueLiteral is StringValueNode svn && s_nameLookup.TryGetValue(svn.Value, out ev)) { return ev; } - if (valueSyntax is NullValueNode) + if (valueLiteral is NullValueNode) { return null; } @@ -102,98 +99,86 @@ public override bool IsInstanceOfType(IType type, IValueNode valueSyntax) throw Serializer_CouldNotParseLiteral(type); } - public override IValueNode ParseValue(IType type, object? runtimeValue) + public override object? CoerceInputValue(IType type, JsonElement inputValue, IFeatureProvider context) { ArgumentNullException.ThrowIfNull(type); - if (runtimeValue is null) + if (inputValue.ValueKind == JsonValueKind.Null) { - return NullValueNode.Default; + return null; } - if (runtimeValue is GeoJsonGeometryType value - && s_valueLookup.TryGetValue(value, out var enumValue)) + if (inputValue.ValueKind == JsonValueKind.String) { - return new EnumValueNode(enumValue); + var value = inputValue.GetString(); + if (value is not null && s_nameLookup.TryGetValue(value, out var geometryType)) + { + return geometryType; + } } - throw Serializer_CouldNotParseValue(type); + throw Serializer_CouldNotParseLiteral(type); } - public override object CreateInstance(IType type, object?[] fieldValues) + public object? CoerceInputValueFromJson(IType type, JsonElement inputValue) { - throw new NotImplementedException(); + return CoerceInputValue(type, inputValue, null!); } - public override void GetFieldData(IType type, object runtimeValue, object?[] fieldValues) + public override void CoerceOutputValue(IType type, object runtimeValue, ResultElement resultValue) { - throw new NotImplementedException(); + ArgumentNullException.ThrowIfNull(type); + + if (runtimeValue is GeoJsonGeometryType geometryType + && s_valueLookup.TryGetValue(geometryType, out var enumValue)) + { + resultValue.SetStringValue(enumValue); + return; + } + + throw Serializer_CouldNotParseValue(type); } - public override IValueNode ParseResult(IType type, object? resultValue) + public override IValueNode ValueToLiteral(IType type, object? runtimeValue) { ArgumentNullException.ThrowIfNull(type); - if (resultValue is null) + if (runtimeValue is null) { return NullValueNode.Default; } - if (resultValue is string s - && s_nameLookup.ContainsKey(s)) - { - return new EnumValueNode(s); - } - - if (resultValue is GeoJsonGeometryType value - && s_valueLookup.TryGetValue(value, out var name)) + if (runtimeValue is GeoJsonGeometryType value + && s_valueLookup.TryGetValue(value, out var enumValue)) { - return new EnumValueNode(name); + return new EnumValueNode(enumValue); } throw Serializer_CouldNotParseValue(type); } - public override bool IsInstanceOfType(IType type, object? runtimeValue) + public override IValueNode CoordinateToLiteral(IType type, object? runtimeValue) { - ArgumentNullException.ThrowIfNull(type); - - return runtimeValue is null or GeoJsonGeometryType; + return ValueToLiteral(type, runtimeValue); } - public bool TryParseString(string type, out GeoJsonGeometryType geometryType) => - s_nameLookup.TryGetValue(type, out geometryType); - - public override bool TryDeserialize( - IType type, - object? resultValue, - out object? runtimeValue) + public override void CoerceOutputCoordinates(IType type, object runtimeValue, ResultElement resultElement) { - ArgumentNullException.ThrowIfNull(type); - - if (resultValue is null) - { - runtimeValue = null; - return true; - } - - if (resultValue is string s - && s_nameLookup.TryGetValue(s, out var enumValue)) - { - runtimeValue = enumValue; - return true; - } + throw new NotSupportedException("GeoJsonTypeSerializer does not support coordinate serialization"); + } - if (resultValue is GeoJsonGeometryType geometryType - && s_valueLookup.ContainsKey(geometryType)) - { - runtimeValue = geometryType; - return true; - } + public override object CreateInstance(IType type, object?[] fieldValues) + { + throw new NotSupportedException("GeoJsonTypeSerializer does not support CreateInstance"); + } - runtimeValue = null; - return false; + public override void GetFieldData(IType type, object runtimeValue, object?[] fieldValues) + { + throw new NotSupportedException("GeoJsonTypeSerializer does not support GetFieldData"); } + public bool TryParseString(string type, out GeoJsonGeometryType geometryType) => + s_nameLookup.TryGetValue(type, out geometryType); + public static readonly GeoJsonTypeSerializer Default = new(); } diff --git a/src/HotChocolate/Spatial/src/Types/Serialization/IGeoJsonSerializer.cs b/src/HotChocolate/Spatial/src/Types/Serialization/IGeoJsonSerializer.cs index d681532bd2b..96bd96964f1 100644 --- a/src/HotChocolate/Spatial/src/Types/Serialization/IGeoJsonSerializer.cs +++ b/src/HotChocolate/Spatial/src/Types/Serialization/IGeoJsonSerializer.cs @@ -1,154 +1,115 @@ +using System.Text.Json; +using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; namespace HotChocolate.Types.Spatial.Serialization; /// <summary> -/// A serializable type can serialize its runtime value to the result value -/// format and deserialize the result value format back to its runtime value. +/// A serializer for GeoJSON types that handles coercion between GraphQL literals, +/// JSON elements, runtime values, and result values. /// </summary> internal interface IGeoJsonSerializer { /// <summary> - /// Defines if the given <paramref name="valueSyntax"/> is possibly of this type. + /// Determines if the given <paramref name="valueLiteral"/> is compatible with this type. /// </summary> /// <param name="type"> /// The type for which we serialize. /// </param> - /// <param name="valueSyntax"> - /// The GraphQL value syntax which shall be validated. + /// <param name="valueLiteral"> + /// The GraphQL value literal which shall be validated. /// </param> /// <returns> - /// <c>true</c> if the given <paramref name="valueSyntax"/> is possibly of this type. + /// <c>true</c> if the given <paramref name="valueLiteral"/> is compatible with this type. /// </returns> - bool IsInstanceOfType(IType type, IValueNode valueSyntax); + bool IsValueCompatible(IType type, IValueNode valueLiteral); /// <summary> - /// Defines if the given <paramref name="runtimeValue"/> is possibly of this type. + /// Determines if the given <paramref name="inputValue"/> is compatible with this type. /// </summary> /// <param name="type"> /// The type for which we serialize. /// </param> - /// <param name="runtimeValue"> - /// The runtime value which shall be validated. + /// <param name="inputValue"> + /// The JSON element which shall be validated. /// </param> /// <returns> - /// <c>true</c> if the given <paramref name="runtimeValue"/> is possibly of this type. + /// <c>true</c> if the given <paramref name="inputValue"/> is compatible with this type. /// </returns> - bool IsInstanceOfType(IType type, object? runtimeValue); + bool IsValueCompatible(IType type, JsonElement inputValue); /// <summary> - /// Serializes a runtime value of this type to the result value format. + /// Coerces a GraphQL value literal into a runtime value. /// </summary> /// <param name="type"> /// The type for which we serialize. /// </param> - /// <param name="runtimeValue"> - /// A runtime value representation of this type. + /// <param name="valueLiteral"> + /// A GraphQL value literal representation of this type. /// </param> /// <returns> - /// Returns a result value representation of this type. + /// Returns a runtime value representation of this type. /// </returns> /// <exception cref="LeafCoercionException"> - /// Unable to serialize the given <paramref name="runtimeValue"/>. + /// Unable to coerce the given <paramref name="valueLiteral"/>. /// </exception> - object? Serialize(IType type, object? runtimeValue); + object? CoerceInputLiteral(IType type, IValueNode valueLiteral); /// <summary> - /// Deserializes a result value of this type to the runtime value format. + /// Coerces a JSON input value into a runtime value. /// </summary> /// <param name="type"> /// The type for which we serialize. /// </param> - /// <param name="resultValue"> - /// A result value representation of this type. + /// <param name="inputValue"> + /// A JSON element representing the input value. + /// </param> + /// <param name="context"> + /// The feature provider context for accessing additional services. /// </param> /// <returns> /// Returns a runtime value representation of this type. /// </returns> - object? Deserialize(IType type, object? resultValue); - - /// <summary> - /// Try to deserialize a result value of this type to the runtime value format. - /// </summary> - /// <param name="type"> - /// The type for which we serialize. - /// </param> - /// <param name="resultValue"> - /// A result value representation of this type. - /// </param> - /// <param name="runtimeValue"> - /// Returns a runtime value representation of this type. - /// </param> - /// <returns>True if deserializing was successful</returns> - bool TryDeserialize(IType type, object? resultValue, out object? runtimeValue); + /// <exception cref="LeafCoercionException"> + /// Unable to coerce the given <paramref name="inputValue"/>. + /// </exception> + object? CoerceInputValue(IType type, JsonElement inputValue, IFeatureProvider context); /// <summary> - /// Serializes a runtime value of this type to the result value format. + /// Coerces a runtime value into a result value and writes it to the result element. /// </summary> /// <param name="type"> /// The type for which we serialize. /// </param> /// <param name="runtimeValue"> - /// Returns a result value representation of this type. - /// </param> - /// <param name="resultValue"> /// A runtime value representation of this type. /// </param> - /// <returns>True if serializing was successful</returns> - bool TrySerialize( - IType type, - object? runtimeValue, - out object? resultValue); - - /// <summary> - /// Parses the GraphQL value syntax of this type into a runtime value representation. - /// </summary> - /// <param name="type"> - /// The type for which we serialize. - /// </param> - /// <param name="valueSyntax"> - /// A GraphQL value syntax representation of this type. - /// </param> - /// <returns> - /// Returns a runtime value representation of this type. - /// </returns> - object? ParseLiteral(IType type, IValueNode valueSyntax); - - /// <summary> - /// Parses a runtime value of this type into a GraphQL value syntax representation. - /// </summary> - /// <param name="type"> - /// The type for which we serialize. - /// </param> - /// <param name="runtimeValue"> - /// A result value representation of this type. + /// <param name="resultValue"> + /// The result element to write the output value to. /// </param> - /// <returns> - /// Returns a GraphQL value syntax representation of the <paramref name="runtimeValue"/>. - /// </returns> /// <exception cref="LeafCoercionException"> - /// Unable to parse the given <paramref name="runtimeValue"/> - /// into a GraphQL value syntax representation of this type. + /// Unable to coerce the given <paramref name="runtimeValue"/>. /// </exception> - IValueNode ParseValue(IType type, object? runtimeValue); + void CoerceOutputValue(IType type, object runtimeValue, ResultElement resultValue); /// <summary> - /// Parses a result value of this into a GraphQL value syntax representation. + /// Converts a runtime value into a GraphQL value literal. /// </summary> /// <param name="type"> /// The type for which we serialize. /// </param> - /// <param name="resultValue"> - /// A result value representation of this type. + /// <param name="runtimeValue"> + /// A runtime value representation of this type. /// </param> /// <returns> - /// Returns a GraphQL value syntax representation of the <paramref name="resultValue"/>. + /// Returns a GraphQL value literal representation of the <paramref name="runtimeValue"/>. /// </returns> /// <exception cref="LeafCoercionException"> - /// Unable to parse the given <paramref name="resultValue"/> - /// into a GraphQL value syntax representation of this type. + /// Unable to convert the given <paramref name="runtimeValue"/> + /// into a GraphQL value literal representation of this type. /// </exception> - IValueNode ParseResult(IType type, object? resultValue); + IValueNode ValueToLiteral(IType type, object? runtimeValue); /// <summary> /// Creates a new runtime value from already parsed field values. @@ -173,39 +134,36 @@ bool TrySerialize( void GetFieldData(IType type, object runtimeValue, object?[] fieldValues); /// <summary> - /// Tries to serialize the `coordinates` field of the geometry - /// </summary> - /// <remarks> - /// This is used for serializing complex geometries that consist of other geometries - /// </remarks> - /// <param name="type"></param> - /// <param name="runtimeValue"></param> - /// <param name="serialized"></param> - /// <returns></returns> - bool TrySerializeCoordinates( - IType type, - object runtimeValue, - out object? serialized); - - /// <summary> - /// Tries to parse the `coordinates` field of the geometry + /// Converts the coordinates of a geometry into a GraphQL value literal. /// </summary> /// <remarks> - /// This is used for serializing complex geometries that consist of other geometries + /// This is used for serializing complex geometries that consist of other geometries. /// </remarks> - /// <param name="type"></param> - /// <param name="runtimeValue"></param> - /// <returns></returns> - IValueNode ParseCoordinateValue(IType type, object? runtimeValue); + /// <param name="type"> + /// The type for which we serialize. + /// </param> + /// <param name="runtimeValue"> + /// A runtime value representation of this type. + /// </param> + /// <returns> + /// Returns a GraphQL value literal representing the coordinates. + /// </returns> + IValueNode CoordinateToLiteral(IType type, object? runtimeValue); /// <summary> - /// Tries to parse the `coordinates` field of the geometry + /// Coerces the coordinates of a geometry and writes them to the result element. /// </summary> /// <remarks> - /// This is used for serializing complex geometries that consist of other geometries + /// This is used for serializing complex geometries that consist of other geometries. /// </remarks> - /// <param name="type"></param> - /// <param name="runtimeValue"></param> - /// <returns></returns> - IValueNode ParseCoordinateResult(IType type, object? runtimeValue); + /// <param name="type"> + /// The type for which we serialize. + /// </param> + /// <param name="runtimeValue"> + /// A runtime value representation of this type. + /// </param> + /// <param name="resultElement"> + /// The result element to write the coordinates to. + /// </param> + void CoerceOutputCoordinates(IType type, object runtimeValue, ResultElement resultElement); } diff --git a/src/HotChocolate/Spatial/src/Types/WellKnownFields.cs b/src/HotChocolate/Spatial/src/Types/WellKnownFields.cs index c17ec02706b..69af02a2134 100644 --- a/src/HotChocolate/Spatial/src/Types/WellKnownFields.cs +++ b/src/HotChocolate/Spatial/src/Types/WellKnownFields.cs @@ -3,10 +3,14 @@ namespace HotChocolate.Types.Spatial; internal static class WellKnownFields { public const string TypeFieldName = "type"; + public static ReadOnlySpan<byte> TypeFieldNameBytes => "type"u8; public const string CoordinatesFieldName = "coordinates"; + public static ReadOnlySpan<byte> CoordinatesFieldNameBytes => "coordinates"u8; public const string CrsFieldName = "crs"; + public static ReadOnlySpan<byte> CrsFieldNameBytes => "crs"u8; public const string BboxFieldName = "bbox"; + public static ReadOnlySpan<byte> BboxFieldNameBytes => "bbox"u8; } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs index 74280fb69a9..53acf6b6890 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonLineStringSerializerTests.cs @@ -27,124 +27,6 @@ public class GeoJsonLineStringSerializerTests private readonly string _geometryType = "LineString"; - private readonly object _geometryParsed = new[] - { - [30.0, 10.0], - [10.0, 30.0], - new[] { 40.0, 40.0 } - }; - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeNullValue(string typeName) - { - var type = CreateLeafType(typeName); - Assert.Null(type.Serialize(null)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - var result = type.Serialize(_geometry); - - // assert - result.MatchSnapshot(); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => type.Serialize("")); - } - - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Throw_When_Null(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<ArgumentNullException>(() => type.IsInstanceOfType(null!)); - } - - [Theory] - [InlineData(LineStringInputName)] - public void IsInstanceOfType_Should_Pass_When_ObjectValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(new ObjectValueNode())); - } - - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_NullValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(NullValueNode.Default)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_DifferentGeoJsonObject(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False( - type.IsInstanceOfType( - GeometryFactory.Default.CreateGeometryCollection( - [new Point(1, 2)]))); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_GeometryOfType(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(_geometry)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_NoGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False(type.IsInstanceOfType("foo")); - } - [Theory] [InlineData(LineStringInputName)] [InlineData(GeometryTypeName)] @@ -182,7 +64,7 @@ public void ParseLiteral_Should_Pass_When_CorrectGeometry(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -223,7 +105,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var crsField = new ObjectFieldNode(WellKnownFields.CrsFieldName, 0); var valueNode = new ObjectValueNode(typeField, crsField); @@ -240,7 +122,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -256,7 +138,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) [Theory] [InlineData(LineStringInputName)] [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_NullValue(string typeName) + public void FormatValue_Should_Pass_When_NullValue(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -267,69 +149,10 @@ public void ParseResult_Should_Pass_When_NullValue(string typeName) Assert.Equal(NullValueNode.Default, inputFormatter.FormatValue(null, type)); } - [Theory] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Serialized(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var literal = type.ParseResult(serialized); - - // assert - literal.MatchSnapshot(); - } - [Theory] [InlineData(LineStringInputName)] [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Value(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - var literal = inputFormatter.FormatResult(_geometry, type); - - // assert - literal.MatchSnapshot(); - } - - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatResult("", type)); - } - - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_NullValue(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Equal(NullValueNode.Default, inputFormatter.FormatValue(null, type)); - } - - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_Value(string typeName) + public void FormatValue_Should_Pass_When_Value(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -345,7 +168,7 @@ public void ParseValue_Should_Pass_When_Value(string typeName) [Theory] [InlineData(LineStringInputName)] // [InlineData(GeometryTypeName)] - public void ParseValue_Should_Throw_When_InvalidType(string typeName) + public void FormatValue_Should_Throw_When_InvalidType(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -356,144 +179,6 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatValue("", type)); } - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) - { - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - Assert.Null(inputParser.ParseInputValue(null, type)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_PassedSerializedResult(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var result = type.Deserialize(serialized); - - // assert - Assert.True(Assert.IsAssignableFrom<Geometry>(result).Equals(_geometry)); - } - - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - var result = inputParser.ParseInputValue(_geometry, type); - - // assert - Assert.Equal(result, _geometry); - } - - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue("", type)); - } - - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, 26912 } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result, 26912); - } - - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result); - } - - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Fail_When_TypeNameIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>( - () => inputParser.ParseInputValue(serialized, type)); - } - - [Theory] - [InlineData(LineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>( - () => inputParser.ParseInputValue(serialized, type)); - } - [Theory] [InlineData(LineStringInputName)] [InlineData(GeometryTypeName)] @@ -506,7 +191,7 @@ public void LineString_IsCoordinateValid_Should_Fail_When_LessThanTwoPoint(strin new ListValueNode( new IntValueNode(30), new IntValueNode(10))); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode(WellKnownFields.CoordinatesFieldName, coords); var valueNode = new ObjectValueNode(typeField, coordField); @@ -545,9 +230,4 @@ private IInputTypeDefinition CreateInputType(string typeName) { return CreateSchema().Types.GetType<IInputTypeDefinition>(typeName); } - - private ILeafType CreateLeafType(string typeName) - { - return CreateSchema().Types.GetType<ILeafType>(typeName); - } } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs index e69c0e9f0be..e06b80769ee 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringInputTests.cs @@ -41,7 +41,7 @@ public void ParseLiteral_MultiLineString_With_Valid_Coordinates() var type = CreateInputType(); // act - var result = inputParser.ParseInputValue( + var result = inputParser.ParseLiteral( new ObjectValueNode( new ObjectFieldNode( "type", diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs index 52f50963d98..7014be605f0 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiLineStringSerializerTests.cs @@ -51,152 +51,6 @@ public class GeoJsonMultiLineStringSerializerTests private readonly string _geometryType = "MultiLineString"; - private readonly object _geometryParsed = new[] - { - [ - [10.0, 10.0], - [20.0, 20.0], - [10.0, 40.0] - ], - new[] - { - [40.0, 40.0], - [30.0, 30.0], - [40.0, 20.0], - new[] { 30.0, 10.0 } - } - }; - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeNullValue(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.Null(type.Serialize(null)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_Dictionary(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var dictionary = new Dictionary<string, object>(); - - // act - var result = type.Serialize(dictionary); - - // assert - Assert.Equal(dictionary, result); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - var result = type.Serialize(_geometry); - - // assert - result.MatchSnapshot(); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => type.Serialize("")); - } - - [Theory] - [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Throw_When_Null(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<ArgumentNullException>(() => type.IsInstanceOfType(null!)); - } - - [Theory] - [InlineData(MultiLineStringInputName)] - public void IsInstanceOfType_Should_Pass_When_ObjectValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(new ObjectValueNode())); - } - - [Theory] - [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_NullValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(NullValueNode.Default)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_DifferentGeoJsonObject(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False( - type.IsInstanceOfType( - GeometryFactory.Default.CreateGeometryCollection( - [new Point(1, 2)]))); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_GeometryOfType(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(_geometry)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_NoGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False(type.IsInstanceOfType("foo")); - } - [Theory] [InlineData(MultiLineStringInputName)] [InlineData(GeometryTypeName)] @@ -234,7 +88,7 @@ public void ParseLiteral_Should_Pass_When_CorrectGeometry(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -275,7 +129,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var crsField = new ObjectFieldNode(WellKnownFields.CrsFieldName, 0); var valueNode = new ObjectValueNode(typeField, crsField); @@ -292,7 +146,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -308,7 +162,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) [Theory] [InlineData(MultiLineStringInputName)] [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_NullValue(string typeName) + public void FormatValue_Should_Pass_When_NullValue(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -319,84 +173,10 @@ public void ParseResult_Should_Pass_When_NullValue(string typeName) Assert.Equal(NullValueNode.Default, inputFormatter.FormatValue(null, type)); } - [Theory] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Serialized(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var literal = type.ParseResult(serialized); - - // assert - literal.MatchSnapshot(); - } - - [Theory] - // [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Value(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - var literal = inputFormatter.FormatResult(_geometry, type); - - // assert - literal.MatchSnapshot(); - } - [Theory] [InlineData(MultiLineStringInputName)] [InlineData(GeometryTypeName)] - public void ParseResult_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatResult("", type)); - } - - [Theory] - [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_NullValue(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Equal(NullValueNode.Default, inputFormatter.FormatResult(null, type)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_Serialized(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var literal = type.ParseValue(serialized); - - // assert - literal.MatchSnapshot(); - } - - [Theory] - [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_Value(string typeName) + public void FormatValue_Should_Pass_When_Value(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -412,7 +192,7 @@ public void ParseValue_Should_Pass_When_Value(string typeName) [Theory] [InlineData(MultiLineStringInputName)] [InlineData(GeometryTypeName)] - public void ParseValue_Should_Throw_When_InvalidType(string typeName) + public void FormatValue_Should_Throw_When_InvalidType(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -423,146 +203,6 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatValue("", type)); } - [Theory] - [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) - { - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - Assert.Null(inputParser.ParseInputValue(null, type)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_PassedSerializedResult(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var result = type.Deserialize(serialized); - - // assert - Assert.True(Assert.IsAssignableFrom<Geometry>(result).Equals(_geometry)); - } - - [Theory] - [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - var result = inputParser.ParseInputValue(_geometry, type); - - // assert - Assert.Equal(result, _geometry); - } - - [Theory] - [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue("", type)); - } - - [Theory] - [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, 26912 } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result, 26912); - } - - [Theory] - [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result); - } - - [Theory] - [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Fail_WhenTypeNameIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - var serialized = new Dictionary<string, object> - { - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue(serialized, type)); - } - - [Theory] - [InlineData(MultiLineStringInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue(serialized, type)); - } - [Theory] [InlineData(MultiLineStringInputName)] [InlineData(GeometryTypeName)] @@ -575,7 +215,7 @@ public void MultiLine_IsCoordinateValid_Should_Fail_When_Point(string typeName) var coords = new ListValueNode( new IntValueNode(30), new IntValueNode(10)); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode(WellKnownFields.CoordinatesFieldName, coords); var valueNode = new ObjectValueNode(typeField, coordField); @@ -617,9 +257,4 @@ private IInputTypeDefinition CreateInputType(string typeName) { return CreateSchema().Types.GetType<IInputTypeDefinition>(typeName); } - - private ILeafType CreateLeafType(string typeName) - { - return CreateSchema().Types.GetType<ILeafType>(typeName); - } } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs index 6c7cea16ad6..c813700236c 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPointSerializerTests.cs @@ -31,129 +31,6 @@ public class GeoJsonMultiPointSerializerTests private const string GeometryType = "MultiPoint"; - private readonly object _geometryParsed = new[] - { - [10.0, 40.0], - [40.0, 30.0], - [20.0, 20.0], - new[] { 30.0, 10.0 } - }; - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeNullValue(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.Null(type.Serialize(null)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - var result = type.Serialize(_geometry); - - // assert - result.MatchSnapshot(); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => type.Serialize("")); - } - - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Throw_When_Null(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<ArgumentNullException>(() => type.IsInstanceOfType(null!)); - } - - [Theory] - [InlineData(MultiPointInputName)] - public void IsInstanceOfType_Should_Pass_When_ObjectValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(new ObjectValueNode())); - } - - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_NullValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(NullValueNode.Default)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_DifferentGeoJsonObject(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False( - type.IsInstanceOfType( - GeometryFactory.Default.CreateGeometryCollection( - [new Point(1, 2)]))); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_GeometryOfType(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(_geometry)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_NoGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False(type.IsInstanceOfType("foo")); - } - [Theory] [InlineData(MultiPointInputName)] [InlineData(GeometryTypeName)] @@ -191,7 +68,7 @@ public void ParseLiteral_Should_Pass_When_CorrectGeometry(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, GeometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(GeometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -232,7 +109,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, GeometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(GeometryType)); var crsField = new ObjectFieldNode(WellKnownFields.CrsFieldName, 0); var valueNode = new ObjectValueNode(typeField, crsField); @@ -249,7 +126,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, GeometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(GeometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -265,7 +142,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) [Theory] [InlineData(MultiPointInputName)] [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_NullValue(string typeName) + public void FormatValue_Should_Pass_When_NullValue(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -276,69 +153,10 @@ public void ParseResult_Should_Pass_When_NullValue(string typeName) Assert.Equal(NullValueNode.Default, inputFormatter.FormatValue(null, type)); } - [Theory] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Serialized(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var literal = type.ParseResult(serialized); - - // assert - literal.MatchSnapshot(); - } - - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Value(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - var literal = inputFormatter.FormatResult(_geometry, type); - - // assert - literal.MatchSnapshot(); - } - [Theory] [InlineData(MultiPointInputName)] [InlineData(GeometryTypeName)] - public void ParseResult_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatResult("", type)); - } - - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_NullValue(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Equal(NullValueNode.Default, inputFormatter.FormatValue(null, type)); - } - - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_Value(string typeName) + public void FormatValue_Should_Pass_When_Value(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -354,7 +172,7 @@ public void ParseValue_Should_Pass_When_Value(string typeName) [Theory] [InlineData(MultiPointInputName)] [InlineData(GeometryTypeName)] - public void ParseValue_Should_Throw_When_InvalidType(string typeName) + public void FormatValue_Should_Throw_When_InvalidType(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -365,146 +183,6 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatValue("", type)); } - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Null(inputParser.ParseInputValue(null, type)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_PassedSerializedResult(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var result = type.Deserialize(serialized); - - // assert - Assert.True(Assert.IsAssignableFrom<Geometry>(result).Equals(_geometry)); - } - - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - var result = inputParser.ParseInputValue(_geometry, type); - - // assert - Assert.Equal(result, _geometry); - } - - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue("", type)); - } - - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, GeometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, 26912 } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result, 26912); - } - - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, GeometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result); - } - - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Fail_WhentypeNameIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue(serialized, type)); - } - - [Theory] - [InlineData(MultiPointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, GeometryType }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue(serialized, type)); - } - [Theory] [InlineData(MultiPointInputName)] [InlineData(GeometryTypeName)] @@ -516,7 +194,7 @@ public void MultiPoint_IsCoordinateValid_Should_Fail_When_Point(string typeName) var coords = new ListValueNode( new IntValueNode(30), new IntValueNode(10)); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, GeometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(GeometryType)); var coordField = new ObjectFieldNode(WellKnownFields.CoordinatesFieldName, coords); var valueNode = new ObjectValueNode(typeField, coordField); @@ -556,9 +234,4 @@ private IInputTypeDefinition CreateInputType(string typeName) { return CreateSchema().Types.GetType<IInputTypeDefinition>(typeName); } - - private ILeafType CreateLeafType(string typeName) - { - return CreateSchema().Types.GetType<ILeafType>(typeName); - } } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs index 2f6867a9650..5c04af8c7ba 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonMultiPolygonSerializerTests.cs @@ -63,159 +63,6 @@ public class GeoJsonMultiPolygonSerializerTests private readonly string _geometryType = "MultiPolygon"; - private readonly object _geometryParsed = new[] - { - [ - [ - [30.0, 20.0], - [45.0, 40.0], - [10.0, 40.0], - [30.0, 20.0] - ] - ], - new[] - { - new[] - { - [15.0, 5.0], - [40.0, 10.0], - [10.0, 20.0], - [5.0, 15.0], - new[] { 15.0, 5.0 } - } - } - }; - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeNullValue(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.Null(type.Serialize(null)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_Dictionary(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var dictionary = new Dictionary<string, object>(); - - // act - var result = type.Serialize(dictionary); - - // assert - Assert.Equal(dictionary, result); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - var result = type.Serialize(_geometry); - - // assert - result.MatchSnapshot(); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => type.Serialize("")); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Throw_When_Null(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<ArgumentNullException>(() => type.IsInstanceOfType(null!)); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - public void IsInstanceOfType_Should_Pass_When_ObjectValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(new ObjectValueNode())); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_NullValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(NullValueNode.Default)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_DifferentGeoJsonObject(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False( - type.IsInstanceOfType( - GeometryFactory.Default.CreateGeometryCollection( - [new Point(1, 2)]))); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_GeometryOfType(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(_geometry)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_NoGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False(type.IsInstanceOfType("foo")); - } - [Theory] [InlineData(MultiPolygonInputName)] [InlineData(GeometryTypeName)] @@ -253,7 +100,7 @@ public void ParseLiteral_Should_Pass_When_CorrectGeometry(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -294,7 +141,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var crsField = new ObjectFieldNode(WellKnownFields.CrsFieldName, 0); var valueNode = new ObjectValueNode(typeField, crsField); @@ -311,7 +158,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -327,66 +174,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) [Theory] [InlineData(MultiPolygonInputName)] [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_NullValue(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Equal(NullValueNode.Default, inputFormatter.FormatValue(null, type)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Serialized(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var literal = type.ParseResult(serialized); - - // assert - literal.MatchSnapshot(); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Value(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - var literal = inputFormatter.FormatResult(_geometry, type); - - // assert - literal.MatchSnapshot(); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatResult("", type)); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_NullValue(string typeName) + public void FormatValue_Should_Pass_When_NullValue(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -397,25 +185,10 @@ public void ParseValue_Should_Pass_When_NullValue(string typeName) Assert.Equal(NullValueNode.Default, inputFormatter.FormatValue(null, type)); } - [Theory] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_Serialized(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var literal = type.ParseValue(serialized); - - // assert - literal.MatchSnapshot(); - } - [Theory] [InlineData(MultiPolygonInputName)] [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_Value(string typeName) + public void FormatValue_Should_Pass_When_Value(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -431,7 +204,7 @@ public void ParseValue_Should_Pass_When_Value(string typeName) [Theory] [InlineData(MultiPolygonInputName)] [InlineData(GeometryTypeName)] - public void ParseValue_Should_Throw_When_InvalidType(string typeName) + public void FormatValue_Should_Throw_When_InvalidType(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -442,142 +215,6 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatValue("", type)); } - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) - { - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - Assert.Null(inputParser.ParseInputValue(null, type)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_PassedSerializedResult(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var result = type.Deserialize(serialized); - - // assert - Assert.True(Assert.IsAssignableFrom<Geometry>(result).Equals(_geometry)); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - var result = inputParser.ParseInputValue(_geometry, type); - - // assert - Assert.Equal(result, _geometry); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue("", type)); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, 26912 } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result, 26912); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Fail_WhenTypeNameIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue(serialized, type)); - } - - [Theory] - [InlineData(MultiPolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue(serialized, type)); - } - [Theory] [InlineData(MultiPolygonInputName)] [InlineData(GeometryTypeName)] @@ -587,7 +224,7 @@ public void MultiPolygon_IsCoordinateValid_Should_Fail_When_Point(string typeNam var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); var coords = new ListValueNode(new IntValueNode(30), new IntValueNode(10)); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode(WellKnownFields.CoordinatesFieldName, coords); var valueNode = new ObjectValueNode(typeField, coordField); @@ -630,9 +267,4 @@ private IInputTypeDefinition CreateInputType(string typeName) { return CreateSchema().Types.GetType<IInputTypeDefinition>(typeName); } - - private ILeafType CreateLeafType(string typeName) - { - return CreateSchema().Types.GetType<ILeafType>(typeName); - } } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs index b758ce1f029..5c6ee72955d 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPointSerializerTests.cs @@ -15,148 +15,17 @@ public class GeoJsonPointSerializerTests private readonly string _geometryType = "Point"; - private readonly object _geometryParsed = new[] { 30.0, 10.0 }; - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeNullValue(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.Null(type.Serialize(null)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_Dictionary(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var dictionary = new Dictionary<string, object>(); - - // act - var result = type.Serialize(dictionary); - - // assert - Assert.Equal(dictionary, result); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - var result = type.Serialize(_geometry); - - // assert - result.MatchSnapshot(); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => type.Serialize("")); - } - - [Theory] - [InlineData(PointInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Throw_When_Null(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<ArgumentNullException>(() => type.IsInstanceOfType(null!)); - } - - [Theory] - [InlineData(PointInputName)] - public void IsInstanceOfType_Should_Pass_When_ObjectValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(new ObjectValueNode())); - } - - [Theory] - [InlineData(PointInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_NullValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(NullValueNode.Default)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_DifferentGeoJsonObject(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False( - type.IsInstanceOfType( - GeometryFactory.Default.CreateGeometryCollection( - [new Point(1, 2)]))); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_GeometryOfType(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(_geometry)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_NoGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False(type.IsInstanceOfType("foo")); - } - [Theory] [InlineData(GeometryTypeName)] public void ParseLiteral_Should_Pass_When_NullValueNode(string typeName) { // arrange - var type = CreateLeafType(typeName); + var inputParser = new InputParser(new DefaultTypeConverter()); + var type = CreateInputType(typeName); // act // assert - Assert.Null(type.CoerceInputLiteral(NullValueNode.Default)); + Assert.Null(inputParser.ParseLiteral(NullValueNode.Default, type)); } [Theory] @@ -182,7 +51,7 @@ public void ParseLiteral_Should_Pass_When_CorrectGeometry(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -223,7 +92,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var crsField = new ObjectFieldNode(WellKnownFields.CrsFieldName, 0); var valueNode = new ObjectValueNode(typeField, crsField); @@ -240,7 +109,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -256,7 +125,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) [Theory] [InlineData(PointInputName)] [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_NullValue(string typeName) + public void FormatValue_Should_Pass_When_NullValue(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -267,84 +136,10 @@ public void ParseResult_Should_Pass_When_NullValue(string typeName) Assert.Equal(NullValueNode.Default, inputFormatter.FormatValue(null, type)); } - [Theory] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Serialized(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var literal = type.ParseResult(serialized); - - // assert - literal.MatchSnapshot(); - } - - [Theory] - [InlineData(PointInputName)] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Value(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - var literal = inputFormatter.FormatResult(_geometry, type); - - // assert - literal.MatchSnapshot(); - } - [Theory] [InlineData(PointInputName)] [InlineData(GeometryTypeName)] - public void ParseResult_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatResult("", type)); - } - - [Theory] - [InlineData(PointInputName)] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_NullValue(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Equal(NullValueNode.Default, inputFormatter.FormatValue(null, type)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_Serialized(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var literal = type.ParseValue(serialized); - - // assert - literal.MatchSnapshot(); - } - - [Theory] - [InlineData(PointInputName)] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_Value(string typeName) + public void FormatValue_Should_Pass_When_Value(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -360,7 +155,7 @@ public void ParseValue_Should_Pass_When_Value(string typeName) [Theory] [InlineData(PointInputName)] [InlineData(GeometryTypeName)] - public void ParseValue_Should_Throw_When_InvalidType(string typeName) + public void FormatValue_Should_Throw_When_InvalidType(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -371,146 +166,6 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatValue("", type)); } - [Theory] - [InlineData(PointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Null(inputParser.ParseInputValue(null, type)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_PassedSerializedResult(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var result = type.Deserialize(serialized); - - // assert - Assert.True(Assert.IsAssignableFrom<Geometry>(result).Equals(_geometry)); - } - - [Theory] - [InlineData(PointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - var result = inputParser.ParseInputValue(_geometry, type); - - // assert - Assert.Equal(result, _geometry); - } - - [Theory] - [InlineData(PointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue("", type)); - } - - [Theory] - [InlineData(PointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, 26912 } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result, 26912); - } - - [Theory] - [InlineData(PointInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result); - } - - [Theory] - [InlineData(PointInputName, Skip = "TODO: Pascal needs to review this one")] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Fail_WhenTypeNameIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue(serialized, type)); - } - - [Theory] - [InlineData(PointInputName, Skip = "TODO: Pascal needs to review this one")] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue(serialized, type)); - } - [Theory] [InlineData(PointInputName)] [InlineData(GeometryTypeName)] @@ -523,7 +178,7 @@ public void Point_IsCoordinateValid_Should_Fail_When_MultiArray(string typeName) new ListValueNode( new IntValueNode(30), new IntValueNode(10))); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode(WellKnownFields.CoordinatesFieldName, coords); var valueNode = new ObjectValueNode(typeField, coordField); @@ -556,9 +211,4 @@ private IInputTypeDefinition CreateInputType(string typeName) { return CreateSchema().Types.GetType<IInputTypeDefinition>(typeName); } - - private ILeafType CreateLeafType(string typeName) - { - return CreateSchema().Types.GetType<ILeafType>(typeName); - } } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs index 41dc1c01664..acb6798b196 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPolygonSerializerTests.cs @@ -37,166 +37,6 @@ public class GeoJsonPolygonSerializerTests private readonly string _geometryType = "Polygon"; - private readonly object _geometryParsed = new[] - { - new[] - { - [ - 30.0, - 10.0 - ], - [ - 40.0, - 40.0 - ], - [ - 20.0, - 40.0 - ], - [ - 10.0, - 20.0 - ], - new[] - { - 30.0, - 10.0 - } - } - }; - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeNullValue(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.Null(type.Serialize(null)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_Dictionary(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var dictionary = new Dictionary<string, object>(); - - // act - var result = type.Serialize(dictionary); - - // assert - Assert.Equal(dictionary, result); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - var result = type.Serialize(_geometry); - - // assert - result.MatchSnapshot(); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Serialize_Should_Throw_When_InvalidObjectShouldThrow(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => type.Serialize("")); - } - - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Throw_When_Null(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<ArgumentNullException>(() => type.IsInstanceOfType(null!)); - } - - [Theory] - [InlineData(PolygonInputName)] - public void IsInstanceOfType_Should_Pass_When_ObjectValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(new ObjectValueNode())); - } - - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_NullValueNode(string typeName) - { - // arrange - var type = CreateInputType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(NullValueNode.Default)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_DifferentGeoJsonObject(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False( - type.IsInstanceOfType( - GeometryFactory.Default.CreateGeometryCollection( - [ - new Point(1, 2) - ]))); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Pass_When_GeometryOfType(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.True(type.IsInstanceOfType(_geometry)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void IsInstanceOfType_Should_Fail_When_NoGeometry(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - - // act - // assert - Assert.False(type.IsInstanceOfType("foo")); - } - [Theory] [InlineData(PolygonInputName)] [InlineData(GeometryTypeName)] @@ -234,7 +74,7 @@ public void ParseLiteral_Should_Pass_When_CorrectGeometry(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -275,7 +115,7 @@ public void ParseLiteral_Should_Throw_When_NoCoordinates(string typeName) // arrange var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var crsField = new ObjectFieldNode(WellKnownFields.CrsFieldName, 0); var valueNode = new ObjectValueNode(typeField, crsField); @@ -293,7 +133,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) var inputParser = new InputParser(new DefaultTypeConverter()); var type = CreateInputType(typeName); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode( WellKnownFields.CoordinatesFieldName, _coordinatesSyntaxNode); @@ -309,66 +149,7 @@ public void ParseLiteral_Should_Pass_When_NoCrs(string typeName) [Theory] [InlineData(PolygonInputName)] [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_NullValue(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Equal(NullValueNode.Default, inputFormatter.FormatValue(null, type)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Serialized(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var literal = type.ParseResult(serialized); - - // assert - literal.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Pass_When_Value(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - var literal = inputFormatter.FormatResult(_geometry, type); - - // assert - literal.ToString().MatchSnapshot(); - } - - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void ParseResult_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputFormatter = new InputFormatter(); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatResult("", type)); - } - - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_NullValue(string typeName) + public void FormatValue_Should_Pass_When_NullValue(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -379,25 +160,10 @@ public void ParseValue_Should_Pass_When_NullValue(string typeName) Assert.Equal(NullValueNode.Default, inputFormatter.FormatValue(null, type)); } - [Theory] - [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_Serialized(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var literal = type.ParseValue(serialized); - - // assert - literal.ToString().MatchSnapshot(); - } - [Theory] [InlineData(PolygonInputName)] [InlineData(GeometryTypeName)] - public void ParseValue_Should_Pass_When_Value(string typeName) + public void FormatValue_Should_Pass_When_Value(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -413,7 +179,7 @@ public void ParseValue_Should_Pass_When_Value(string typeName) [Theory] [InlineData(PolygonInputName)] [InlineData(GeometryTypeName)] - public void ParseValue_Should_Throw_When_InvalidType(string typeName) + public void FormatValue_Should_Throw_When_InvalidType(string typeName) { // arrange var inputFormatter = new InputFormatter(); @@ -424,146 +190,6 @@ public void ParseValue_Should_Throw_When_InvalidType(string typeName) Assert.Throws<LeafCoercionException>(() => inputFormatter.FormatValue("", type)); } - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeNullValue(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Null(inputParser.ParseInputValue(null, type)); - } - - [Theory] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_PassedSerializedResult(string typeName) - { - // arrange - var type = CreateLeafType(typeName); - var serialized = type.Serialize(_geometry); - - // act - var result = type.Deserialize(serialized); - - // assert - Assert.True(Assert.IsAssignableFrom<Geometry>(result).Equals(_geometry)); - } - - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_SerializeGeometry(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - var result = inputParser.ParseInputValue(_geometry, type); - - // assert - Assert.Equal(result, _geometry); - } - - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Throw_When_InvalidType(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue("", type)); - } - - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_AllFieldsInDictionary(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, 26912 } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result, 26912); - } - - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Pass_When_CrsIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CoordinatesFieldName, _geometryParsed } - }; - - // act - var result = inputParser.ParseInputValue(serialized, type); - - // assert - AssertGeometry(result); - } - - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_Fail_WhentypeNameIsMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.CoordinatesFieldName, _geometryParsed }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue(serialized, type)); - } - - [Theory] - [InlineData(PolygonInputName)] - [InlineData(GeometryTypeName)] - public void Deserialize_Should_When_CoordinatesAreMissing(string typeName) - { - // arrange - var inputParser = new InputParser(new DefaultTypeConverter()); - var type = CreateInputType(typeName); - var serialized = new Dictionary<string, object> - { - { WellKnownFields.TypeFieldName, _geometryType }, - { WellKnownFields.CrsFieldName, new IntValueNode(0) } - }; - - // act - // assert - Assert.Throws<LeafCoercionException>(() => inputParser.ParseInputValue(serialized, type)); - } - [Theory] [InlineData(PolygonInputName)] [InlineData(GeometryTypeName)] @@ -575,7 +201,7 @@ public void Polygon_IsCoordinateValid_Should_Fail_When_Point(string typeName) var coords = new ListValueNode( new IntValueNode(30), new IntValueNode(10)); - var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, _geometryType); + var typeField = new ObjectFieldNode(WellKnownFields.TypeFieldName, new EnumValueNode(_geometryType)); var coordField = new ObjectFieldNode(WellKnownFields.CoordinatesFieldName, coords); var valueNode = new ObjectValueNode(typeField, coordField); @@ -616,9 +242,4 @@ private IInputTypeDefinition CreateInputType(string typeName) { return CreateSchema().Types.GetType<IInputTypeDefinition>(typeName); } - - private ILeafType CreateLeafType(string typeName) - { - return CreateSchema().Types.GetType<ILeafType>(typeName); - } } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPositionScalarTest.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPositionScalarTest.cs index 1ebd3055694..dea04e758e5 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPositionScalarTest.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonPositionScalarTest.cs @@ -6,7 +6,7 @@ namespace HotChocolate.Types.Spatial; public class GeoJsonPositionScalarTest { [Fact] - public void IsInstanceOfType_Valid2ElementCoordinate_True() + public void IsValueCompatible_Valid2ElementCoordinate_True() { // arrange var type = new GeoJsonPositionType(); @@ -22,7 +22,7 @@ public void IsInstanceOfType_Valid2ElementCoordinate_True() } [Fact] - public void IsInstanceOfType_Valid3ElementCoordinate_True() + public void IsValueCompatible_Valid3ElementCoordinate_True() { // arrange var type = new GeoJsonPositionType(); @@ -39,106 +39,7 @@ public void IsInstanceOfType_Valid3ElementCoordinate_True() } [Fact] - public void IsInstanceOfType_NullType_True() - { - // arrange - var type = new GeoJsonPositionType(); - var coordinate = NullValueNode.Default; - - // act - bool? result = type.IsValueCompatible(coordinate); - - // assert - Assert.True(result); - } - - [Fact] - public void IsInstanceOfType_Invalid2ElementCoordinate_False() - { - // arrange - var type = new GeoJsonPositionType(); - var coordinate = new ListValueNode( - new StringValueNode("1"), - new FloatValueNode(1.2)); - - // act - bool? result = type.IsValueCompatible(coordinate); - - // assert - Assert.False(result); - } - - [Fact] - public void IsInstanceOfType_Invalid3ElementCoordinate_False() - { - // arrange - var type = new GeoJsonPositionType(); - var coordinate = new ListValueNode( - new IntValueNode(1), - new FloatValueNode(1.2), - new StringValueNode("2")); - - // act - bool? result = type.IsValueCompatible(coordinate); - - // assert - Assert.False(result); - } - - [Fact] - public void IsInstanceOfType_List2ElementCoordinate_False() - { - // arrange - var type = new GeoJsonPositionType(); - var coordinate = new ListValueNode( - new ListValueNode( - new FloatValueNode(1.1), - new FloatValueNode(1.2))); - - // act - var result = type.IsValueCompatible(coordinate); - - // assert - Assert.False(result); - } - - [Fact] - public void IsInstanceOfType_2ListElementCoordinate_False() - { - // arrange - var type = new GeoJsonPositionType(); - var coordinate = new ListValueNode( - new ListValueNode( - new FloatValueNode(1.1), - new FloatValueNode(1.2)), - new ListValueNode( - new FloatValueNode(1.1), - new FloatValueNode(1.2))); - - // act - var result = type.IsValueCompatible(coordinate); - - // assert - Assert.False(result); - } - - [Fact] - public void IsInstanceOfType_Invalid4ElementCoordinate_False() - { - var type = new GeoJsonPositionType(); - var coordinate = new ListValueNode( - new IntValueNode(1), - new IntValueNode(2), - new IntValueNode(3), - new IntValueNode(4)); - - bool? result = type.IsValueCompatible(coordinate); - - Assert.False(result); - } - - [Fact] - public void ParseLiteral_Null_Throws() + public void CoerceInputLiteral_Null_Throws() { var type = new GeoJsonPositionType(); IValueNode? coordinate = null; @@ -147,18 +48,7 @@ public void ParseLiteral_Null_Throws() } [Fact] - public void ParseLiteral_NullType_Null() - { - var type = new GeoJsonPositionType(); - var coordinate = NullValueNode.Default; - - var result = type.CoerceInputLiteral(coordinate); - - Assert.Null(result); - } - - [Fact] - public void ParseLiteral_With_2Valid_Coordinates() + public void CoerceInputLiteral_With_2Valid_Coordinates() { var type = new GeoJsonPositionType(); var coordinate = new ListValueNode( @@ -173,7 +63,7 @@ public void ParseLiteral_With_2Valid_Coordinates() } [Fact] - public void ParseLiteral_With_3Valid_Coordinates() + public void CoerceInputLiteral_With_3Valid_Coordinates() { var type = new GeoJsonPositionType(); var coordinate = new ListValueNode( @@ -190,7 +80,7 @@ public void ParseLiteral_With_3Valid_Coordinates() } [Fact] - public void ParseLiteral_With_2Invalid_Coordinates_Throws() + public void CoerceInputLiteral_With_2Invalid_Coordinates_Throws() { var type = new GeoJsonPositionType(); var coordinate = new ListValueNode( @@ -202,7 +92,7 @@ public void ParseLiteral_With_2Invalid_Coordinates_Throws() } [Fact] - public void ParseLiteral_With_3Invalid_Coordinates_Throws() + public void CoerceInputLiteral_With_3Invalid_Coordinates_Throws() { var type = new GeoJsonPositionType(); var coordinate = new ListValueNode( @@ -215,7 +105,7 @@ public void ParseLiteral_With_3Invalid_Coordinates_Throws() } [Fact] - public void ParseLiteral_With_Invalid_Coordinates_Throws() + public void CoerceInputLiteral_With_Invalid_Coordinates_Throws() { var type = new GeoJsonPositionType(); var coordinate = new StringValueNode("2.2"); @@ -224,42 +114,24 @@ public void ParseLiteral_With_Invalid_Coordinates_Throws() } [Fact] - public void ParseValue_With_Noncoordinate_Throws() - { - var type = new GeoJsonPositionType(); - const string item = "this is not a coordinate"; - - Assert.Throws<LeafCoercionException>(() => type.CoerceInputValue(item)); - } - - [Fact] - public void ParseValue_With_Null() - { - var type = new GeoJsonPositionType(); - var result = type.ParseValue(null); - - Assert.Null(Assert.IsType<NullValueNode>(result).Value); - } - - [Fact] - public void ParseValue_With_2Valid_Coordinates() + public void ValueToLiteral_With_2Valid_Coordinates() { var type = new GeoJsonPositionType(); var coordinate = new Coordinate(1.1, 2.2); - var result = type.ParseValue(coordinate); + var result = type.ValueToLiteral(coordinate); Assert.Equal("1.1", Assert.IsType<ListValueNode>(result).Items[0].Value); Assert.Equal("2.2", Assert.IsType<ListValueNode>(result).Items[1].Value); } [Fact] - public void ParseValue_With_3Valid_Coordinates() + public void ValueToLiteral_With_3Valid_Coordinates() { var type = new GeoJsonPositionType(); var coordinate = new CoordinateZ(1.1, 2.2, 3.3); - var result = type.ParseValue(coordinate); + var result = type.ValueToLiteral(coordinate); Assert.Equal("1.1", Assert.IsType<ListValueNode>(result).Items[0].Value); Assert.Equal("2.2", Assert.IsType<ListValueNode>(result).Items[1].Value); @@ -267,200 +139,11 @@ public void ParseValue_With_3Valid_Coordinates() } [Fact] - public void TryDeserialize_With_Null() - { - var type = new GeoJsonPositionType(); - object? input = null; - - var result = type.TryDeserialize(input, out var value); - - Assert.True(result); - Assert.Null(value); - } - - [Fact] - public void TryDeserialize_With_Non_List() + public void ValueToLiteral_With_Noncoordinate_Throws() { var type = new GeoJsonPositionType(); - const string input = "not null and not a list"; - - var result = type.TryDeserialize(input, out var value); - - Assert.False(result); - Assert.Null(value); - } - - [Fact] - public void TryDeserialize_With_Too_Many_Elements() - { - var type = new GeoJsonPositionType(); - var input = new List<object> { "1", "2", "3", "4" }; - - var result = type.TryDeserialize(input, out var value); - - Assert.False(result); - Assert.Null(value); - } - - [Fact] - public void TryDeserialize_With_Too_Few_Elements() - { - var type = new GeoJsonPositionType(); - var input = new List<object> { 1 }; - - var result = type.TryDeserialize(input, out var value); - - Assert.False(result); - Assert.Null(value); - } - - [Fact] - public void TryDeserialize_With_Invalid_Element_Type() - { - var type = new GeoJsonPositionType(); - var input = new List<object> { 1, "a" }; - - var result = type.TryDeserialize(input, out var value); - - Assert.False(result); - Assert.Null(value); - } - - [Fact] - public void TryDeserialize_With_Invalid_Element_Type2() - { - var type = new GeoJsonPositionType(); - var input = new List<object> { 1, DateTime.Now }; - - var result = type.TryDeserialize(input, out var value); - - Assert.False(result); - Assert.Null(value); - } - - [Fact] - public void TryDeserialize_With_Invalid_Element_Type3() - { - var type = new GeoJsonPositionType(); - var input = new List<object> { 1, double.PositiveInfinity }; - - var result = type.TryDeserialize(input, out var value); - - Assert.False(result); - Assert.Null(value); - } - - [Fact] - public void TryDeserialize_With_Invalid_3rdElement_Type() - { - var type = new GeoJsonPositionType(); - var input = new List<object> { 1, 2, "a" }; - - var result = type.TryDeserialize(input, out var value); - - Assert.False(result); - Assert.Null(value); - } - - [Fact] - public void TryDeserialize_With_Invalid_3rdElement_Type2() - { - var type = new GeoJsonPositionType(); - var input = new List<object> { 1, 2, 'a' }; - - var result = type.TryDeserialize(input, out var value); - - Assert.False(result); - Assert.Null(value); - } - - [Fact] - public void TryDeserialize_With_Invalid_3rdElement_Type3() - { - var type = new GeoJsonPositionType(); - var input = new List<object> { 1, 2, double.NegativeInfinity }; - - var result = type.TryDeserialize(input, out var value); - - Assert.False(result); - Assert.Null(value); - } - - [Fact] - public void TryDeserialize_With_Valid_2Elements() - { - var type = new GeoJsonPositionType(); - var input = new List<object> { 1, 2 }; - - var result = type.TryDeserialize(input, out var value); - - Assert.True(result); - Assert.Equal(1, Assert.IsType<Coordinate>(value).X); - Assert.Equal(2, Assert.IsType<Coordinate>(value).Y); - } - - [Fact] - public void TryDeserialize_With_Valid_3Elements() - { - var type = new GeoJsonPositionType(); - var input = new List<object> { 1, 2, 0 }; - - var result = type.TryDeserialize(input, out var value); - - Assert.True(result); - Assert.Equal(1, Assert.IsType<CoordinateZ>(value).X); - Assert.Equal(2, Assert.IsType<CoordinateZ>(value).Y); - Assert.Equal(0, Assert.IsType<CoordinateZ>(value).Z); - } - - [Fact] - public void TrySerialize_With_Invalid_Object() - { - var type = new GeoJsonPositionType(); - const string input = "not a coordinate"; - - var result = type.TryCoerceOutputValue(input, out var value); - - Assert.False(result); - Assert.Null(value); - } - - [Fact] - public void TrySerialize_With_Valid_2dCoordinate() - { - var type = new GeoJsonPositionType(); - var input = new Coordinate(1, 2); - - var result = type.TryCoerceOutputValue(input, out var value); - - Assert.True(result); - Assert.Equal(2, Assert.IsType<double[]>(value).Length); - Assert.Equal([1D, 2D], Assert.IsType<double[]>(value)); - } - - [Fact] - public void TrySerialize_With_Valid_3dCoordinate() - { - var type = new GeoJsonPositionType(); - var input = new CoordinateZ(1, 2, 100); - - var result = type.TryCoerceOutputValue(input, out var value); - - Assert.True(result); - Assert.Equal(3, Assert.IsType<double[]>(value).Length); - Assert.Equal([1D, 2D, 100D], Assert.IsType<double[]>(value)); - } - - [Fact] - public void TrySerialize_With_Nan_3dCoordinate() - { - var type = new GeoJsonPositionType(); - var input = new CoordinateZ(1, 2, double.NaN); - - var result = type.TryCoerceOutputValue(input, out var value); + const string item = "this is not a coordinate"; - Assert.True(result); - Assert.Equal(2, Assert.IsType<double[]>(value).Length); - Assert.Equal([1D, 2D], Assert.IsType<double[]>(value)); + Assert.Throws<LeafCoercionException>(() => type.ValueToLiteral(item)); } } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonTypeSerializerTests.cs b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonTypeSerializerTests.cs index 6ef69a02e33..06ead27f229 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonTypeSerializerTests.cs +++ b/src/HotChocolate/Spatial/test/Types.Tests/GeoJsonTypeSerializerTests.cs @@ -7,54 +7,7 @@ namespace HotChocolate.Types.Spatial; public class GeoJsonTypeSerializerTests { [Fact] - public void TrySerializer_Null() - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - // assert - Assert.True(serializer.TrySerialize(type.Object, null, out var resultValue)); - Assert.Null(resultValue); - } - - [Fact] - public void TrySerializer_DifferentObject() - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - // assert - Assert.False(serializer.TrySerialize(type.Object, "", out var resultValue)); - Assert.Null(resultValue); - } - - [Theory] - [InlineData(GeoJsonGeometryType.Point, "Point")] - [InlineData(GeoJsonGeometryType.MultiPoint, "MultiPoint")] - [InlineData(GeoJsonGeometryType.LineString, "LineString")] - [InlineData(GeoJsonGeometryType.MultiLineString, "MultiLineString")] - [InlineData(GeoJsonGeometryType.Polygon, "Polygon")] - [InlineData(GeoJsonGeometryType.MultiPolygon, "MultiPolygon")] - public void TrySerializer_Should_Serialize_Enum( - GeoJsonGeometryType value, - string stringValue) - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - // assert - Assert.True(serializer.TrySerialize(type.Object, value, out var resultValue)); - Assert.Equal(stringValue, resultValue); - } - - [Fact] - public void IsInstanceOfType_Should_Throw_When_Null() + public void IsValueCompatible_Should_Throw_When_Null() { // arrange var type = new Mock<IType>(); @@ -63,11 +16,11 @@ public void IsInstanceOfType_Should_Throw_When_Null() // act // assert Assert.Throws<ArgumentNullException>( - () => serializer.IsInstanceOfType(type.Object, null!)); + () => serializer.IsValueCompatible(type.Object, null!)); } [Fact] - public void IsInstanceOfType_Should_Pass_When_NullValueNode() + public void IsValueCompatible_Should_Pass_When_NullValueNode() { // arrange var type = new Mock<IType>(); @@ -75,7 +28,7 @@ public void IsInstanceOfType_Should_Pass_When_NullValueNode() // act // assert - Assert.True(serializer.IsInstanceOfType(type.Object, NullValueNode.Default)); + Assert.True(serializer.IsValueCompatible(type.Object, NullValueNode.Default)); } [Theory] @@ -85,7 +38,7 @@ public void IsInstanceOfType_Should_Pass_When_NullValueNode() [InlineData("MultiLineString")] [InlineData("Polygon")] [InlineData("MultiPolygon")] - public void IsInstanceOfType_Should_Pass_When_EnumValueNode(string value) + public void IsValueCompatible_Should_Pass_When_EnumValueNode(string value) { // arrange var type = new Mock<IType>(); @@ -93,7 +46,7 @@ public void IsInstanceOfType_Should_Pass_When_EnumValueNode(string value) // act // assert - Assert.True(serializer.IsInstanceOfType(type.Object, new EnumValueNode(value))); + Assert.True(serializer.IsValueCompatible(type.Object, new EnumValueNode(value))); } [Theory] @@ -103,7 +56,7 @@ public void IsInstanceOfType_Should_Pass_When_EnumValueNode(string value) [InlineData("MultiLineString")] [InlineData("Polygon")] [InlineData("MultiPolygon")] - public void IsInstanceOfType_Should_Pass_When_StringValueNode(string value) + public void IsValueCompatible_Should_Pass_When_StringValueNode(string value) { // arrange var type = new Mock<IType>(); @@ -111,11 +64,11 @@ public void IsInstanceOfType_Should_Pass_When_StringValueNode(string value) // act // assert - Assert.True(serializer.IsInstanceOfType(type.Object, new StringValueNode(value))); + Assert.True(serializer.IsValueCompatible(type.Object, new StringValueNode(value))); } [Fact] - public void ParseLiteral_Should_Throw_When_Null() + public void CoerceInputLiteral_Should_Throw_When_Null() { // arrange var type = new Mock<IType>(); @@ -123,7 +76,7 @@ public void ParseLiteral_Should_Throw_When_Null() // act // assert - Assert.Throws<ArgumentNullException>(() => serializer.ParseLiteral(type.Object, null!)); + Assert.Throws<ArgumentNullException>(() => serializer.CoerceInputLiteral(type.Object, null!)); } [Theory] @@ -133,7 +86,7 @@ public void ParseLiteral_Should_Throw_When_Null() [InlineData(GeoJsonGeometryType.MultiLineString, "MultiLineString")] [InlineData(GeoJsonGeometryType.Polygon, "Polygon")] [InlineData(GeoJsonGeometryType.MultiPolygon, "MultiPolygon")] - public void ParseLiteral_Should_Parse_EnumValueNode( + public void CoerceInputLiteral_Should_Parse_EnumValueNode( GeoJsonGeometryType value, string stringValue) { @@ -142,7 +95,7 @@ public void ParseLiteral_Should_Parse_EnumValueNode( var serializer = GeoJsonTypeSerializer.Default; // act - var resultValue = serializer.ParseLiteral(type.Object, new EnumValueNode(stringValue)); + var resultValue = serializer.CoerceInputLiteral(type.Object, new EnumValueNode(stringValue)); // assert Assert.Equal(value, resultValue); @@ -155,7 +108,7 @@ public void ParseLiteral_Should_Parse_EnumValueNode( [InlineData(GeoJsonGeometryType.MultiLineString, "MultiLineString")] [InlineData(GeoJsonGeometryType.Polygon, "Polygon")] [InlineData(GeoJsonGeometryType.MultiPolygon, "MultiPolygon")] - public void ParseLiteral_Should_Parse_StringValueNode( + public void CoerceInputLiteral_Should_Parse_StringValueNode( GeoJsonGeometryType value, string stringValue) { @@ -164,7 +117,7 @@ public void ParseLiteral_Should_Parse_StringValueNode( var serializer = GeoJsonTypeSerializer.Default; // act - var resultValue = serializer.ParseLiteral( + var resultValue = serializer.CoerceInputLiteral( type.Object, new StringValueNode(stringValue)); @@ -173,28 +126,28 @@ public void ParseLiteral_Should_Parse_StringValueNode( } [Fact] - public void ParseLiteral_Should_Parse_NullValueNode() + public void CoerceInputLiteral_Should_Parse_NullValueNode() { // arrange var type = new Mock<IType>(); var serializer = GeoJsonTypeSerializer.Default; // act - var resultValue = serializer.ParseLiteral(type.Object, NullValueNode.Default); + var resultValue = serializer.CoerceInputLiteral(type.Object, NullValueNode.Default); // assert Assert.Null(resultValue); } [Fact] - public void ParseValue_Should_Parse_Null() + public void ValueToLiteral_Should_Parse_Null() { // arrange var type = new Mock<IType>(); var serializer = GeoJsonTypeSerializer.Default; // act - var resultValue = serializer.ParseValue(type.Object, null); + var resultValue = serializer.ValueToLiteral(type.Object, null); // assert Assert.Equal(NullValueNode.Default, resultValue); @@ -207,7 +160,7 @@ public void ParseValue_Should_Parse_Null() [InlineData(GeoJsonGeometryType.MultiLineString, "MultiLineString")] [InlineData(GeoJsonGeometryType.Polygon, "Polygon")] [InlineData(GeoJsonGeometryType.MultiPolygon, "MultiPolygon")] - public void ParseValue_Should_Parse_EnumValue( + public void ValueToLiteral_Should_Parse_EnumValue( GeoJsonGeometryType value, string stringValue) { @@ -216,7 +169,7 @@ public void ParseValue_Should_Parse_EnumValue( var serializer = GeoJsonTypeSerializer.Default; // act - var resultValue = serializer.ParseValue(type.Object, value); + var resultValue = serializer.ValueToLiteral(type.Object, value); // assert var enumValue = Assert.IsType<EnumValueNode>(resultValue); @@ -224,7 +177,7 @@ public void ParseValue_Should_Parse_EnumValue( } [Fact] - public void ParseValue_Should_Throw_OnInvalidValue() + public void ValueToLiteral_Should_Throw_OnInvalidValue() { // arrange var type = new Mock<IType>(); @@ -233,65 +186,7 @@ public void ParseValue_Should_Throw_OnInvalidValue() // act // assert Assert.Throws<LeafCoercionException>( - () => serializer.ParseValue(type.Object, "")); - } - - [Fact] - public void ParseResult_Should_Parse_Null() - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - var resultValue = serializer.ParseResult(type.Object, null); - - // assert - Assert.Equal(NullValueNode.Default, resultValue); - } - - [Theory] - [InlineData(GeoJsonGeometryType.Point, "Point")] - [InlineData(GeoJsonGeometryType.MultiPoint, "MultiPoint")] - [InlineData(GeoJsonGeometryType.LineString, "LineString")] - [InlineData(GeoJsonGeometryType.MultiLineString, "MultiLineString")] - [InlineData(GeoJsonGeometryType.Polygon, "Polygon")] - [InlineData(GeoJsonGeometryType.MultiPolygon, "MultiPolygon")] - public void ParseResult_Should_Parse_EnumValue( - GeoJsonGeometryType value, - string stringValue) - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - var resultValue = serializer.ParseResult(type.Object, value); - - // assert - var enumValue = Assert.IsType<EnumValueNode>(resultValue); - Assert.Equal(stringValue, enumValue.Value); - } - - [Theory] - [InlineData("Point")] - [InlineData("MultiPoint")] - [InlineData("LineString")] - [InlineData("MultiLineString")] - [InlineData("Polygon")] - [InlineData("MultiPolygon")] - public void ParseResult_Should_Parse_NameString(string stringValue) - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - var resultValue = serializer.ParseResult(type.Object, stringValue); - - // assert - var enumValue = Assert.IsType<EnumValueNode>(resultValue); - Assert.Equal(stringValue, enumValue.Value); + () => serializer.ValueToLiteral(type.Object, "")); } [Theory] @@ -301,162 +196,15 @@ public void ParseResult_Should_Parse_NameString(string stringValue) [InlineData("MultiLineString")] [InlineData("Polygon")] [InlineData("MultiPolygon")] - public void ParseResult_Should_Parse_String(string stringValue) + public void TryParseString_Should_Parse_GeometryTypeName(string typeName) { // arrange - var type = new Mock<IType>(); var serializer = GeoJsonTypeSerializer.Default; // act - var resultValue = serializer.ParseResult(type.Object, stringValue); - - // assert - var enumValue = Assert.IsType<EnumValueNode>(resultValue); - Assert.Equal(stringValue, enumValue.Value); - } - - [Fact] - public void ParseResult_Should_Throw_OnInvalidValue() - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - // assert - Assert.Throws<LeafCoercionException>( - () => serializer.ParseResult(type.Object, "")); - } - - [Fact] - public void IsInstanceOfType_Null() - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - // assert - Assert.True(serializer.IsInstanceOfType(type.Object, (object?)null)); - } - - [Theory] - [InlineData(GeoJsonGeometryType.Point)] - [InlineData(GeoJsonGeometryType.MultiPoint)] - [InlineData(GeoJsonGeometryType.LineString)] - [InlineData(GeoJsonGeometryType.MultiLineString)] - [InlineData(GeoJsonGeometryType.Polygon)] - [InlineData(GeoJsonGeometryType.MultiPolygon)] - public void IsInstanceOfType_GeometryType(GeoJsonGeometryType geometryType) - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - // assert - Assert.True(serializer.IsInstanceOfType(type.Object, geometryType)); - } - - [Fact] - public void IsInstanceOfType_Should_BeFalse_When_Other_Object() - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - // assert - Assert.False(serializer.IsInstanceOfType(type.Object, "")); - } - - [Fact] - public void TryDeserialize_Null() - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - // assert - Assert.True(serializer.TryDeserialize(type.Object, null, out var resultValue)); - Assert.Null(resultValue); - } - - [Fact] - public void TryDeserialize_DifferentObject() - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - // assert - Assert.False(serializer.TryDeserialize(type.Object, "", out var resultValue)); - Assert.Null(resultValue); - } - - [Theory] - [InlineData(GeoJsonGeometryType.Point)] - [InlineData(GeoJsonGeometryType.MultiPoint)] - [InlineData(GeoJsonGeometryType.LineString)] - [InlineData(GeoJsonGeometryType.MultiLineString)] - [InlineData(GeoJsonGeometryType.Polygon)] - [InlineData(GeoJsonGeometryType.MultiPolygon)] - public void TryDeserialize_Should_Serialize_Enum( - GeoJsonGeometryType value) - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - // assert - Assert.True(serializer.TryDeserialize(type.Object, value, out var resultValue)); - Assert.Equal(value, resultValue); - } - - [Theory] - [InlineData(GeoJsonGeometryType.Point, "Point")] - [InlineData(GeoJsonGeometryType.MultiPoint, "MultiPoint")] - [InlineData(GeoJsonGeometryType.LineString, "LineString")] - [InlineData(GeoJsonGeometryType.MultiLineString, "MultiLineString")] - [InlineData(GeoJsonGeometryType.Polygon, "Polygon")] - [InlineData(GeoJsonGeometryType.MultiPolygon, "MultiPolygon")] - public void TryDeserialize_Should_Serialize_String( - GeoJsonGeometryType value, - string stringValue) - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - // assert - Assert.True(serializer.TryDeserialize(type.Object, stringValue, out var resultValue)); - Assert.Equal(value, resultValue); - } - - [Theory] - [InlineData(GeoJsonGeometryType.Point, "Point")] - [InlineData(GeoJsonGeometryType.MultiPoint, "MultiPoint")] - [InlineData(GeoJsonGeometryType.LineString, "LineString")] - [InlineData(GeoJsonGeometryType.MultiLineString, "MultiLineString")] - [InlineData(GeoJsonGeometryType.Polygon, "Polygon")] - [InlineData(GeoJsonGeometryType.MultiPolygon, "MultiPolygon")] - public void TryDeserialize_Should_Serialize_NameString( - GeoJsonGeometryType value, - string typeName) - { - // arrange - var type = new Mock<IType>(); - var serializer = GeoJsonTypeSerializer.Default; - - // act - var success = serializer.TryDeserialize(type.Object, typeName, out var resultValue); + var success = serializer.TryParseString(typeName, out var resultValue); // assert Assert.True(success); - Assert.Equal(value, resultValue); } } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonLineStringSerializerTests.FormatValue_Should_Pass_When_Value.graphql b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonLineStringSerializerTests.FormatValue_Should_Pass_When_Value.graphql new file mode 100644 index 00000000000..679f756d4f3 --- /dev/null +++ b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonLineStringSerializerTests.FormatValue_Should_Pass_When_Value.graphql @@ -0,0 +1 @@ +{ type: LineString, coordinates: [ [ 30, 10 ], [ 10, 30 ], [ 40, 40 ] ], crs: 0 } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiLineStringSerializerTests.FormatValue_Should_Pass_When_Value.graphql b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiLineStringSerializerTests.FormatValue_Should_Pass_When_Value.graphql new file mode 100644 index 00000000000..2258e40575d --- /dev/null +++ b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiLineStringSerializerTests.FormatValue_Should_Pass_When_Value.graphql @@ -0,0 +1 @@ +{ type: MultiLineString, coordinates: [ [ [ 10, 10 ], [ 20, 20 ], [ 10, 40 ] ], [ [ 40, 40 ], [ 30, 30 ], [ 40, 20 ], [ 30, 10 ] ] ], crs: 0 } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiPointSerializerTests.FormatValue_Should_Pass_When_Value.graphql b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiPointSerializerTests.FormatValue_Should_Pass_When_Value.graphql new file mode 100644 index 00000000000..85265655cc3 --- /dev/null +++ b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiPointSerializerTests.FormatValue_Should_Pass_When_Value.graphql @@ -0,0 +1 @@ +{ type: MultiPoint, coordinates: [ [ 10, 40 ], [ 40, 30 ], [ 20, 20 ], [ 30, 10 ] ], crs: 0 } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiPolygonSerializerTests.FormatValue_Should_Pass_When_Value.graphql b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiPolygonSerializerTests.FormatValue_Should_Pass_When_Value.graphql new file mode 100644 index 00000000000..11b657e16bb --- /dev/null +++ b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonMultiPolygonSerializerTests.FormatValue_Should_Pass_When_Value.graphql @@ -0,0 +1 @@ +{ type: MultiPolygon, coordinates: [ [ [ [ 30, 20 ], [ 45, 40 ], [ 10, 40 ], [ 30, 20 ] ] ], [ [ [ 15, 5 ], [ 40, 10 ], [ 10, 20 ], [ 5, 15 ], [ 15, 5 ] ] ] ], crs: 0 } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPointSerializerTests.FormatValue_Should_Pass_When_Value.graphql b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPointSerializerTests.FormatValue_Should_Pass_When_Value.graphql new file mode 100644 index 00000000000..27a6e14a82f --- /dev/null +++ b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPointSerializerTests.FormatValue_Should_Pass_When_Value.graphql @@ -0,0 +1 @@ +{ type: Point, coordinates: [ 30, 10 ], crs: 0 } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPointTypeTests.Point_Execution_Output_Scalar.snap b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPointTypeTests.Point_Execution_Output_Scalar.snap index 3346f803949..72e0790641f 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPointTypeTests.Point_Execution_Output_Scalar.snap +++ b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPointTypeTests.Point_Execution_Output_Scalar.snap @@ -1,11 +1,11 @@ { "data": { "test": { + "type": "Point", "coordinates": [ 30, 10 ], - "type": "Point", "crs": 0 } } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPolygonSerializerTests.FormatValue_Should_Pass_When_Value.snap b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPolygonSerializerTests.FormatValue_Should_Pass_When_Value.snap new file mode 100644 index 00000000000..b2669fa7c84 --- /dev/null +++ b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/GeoJsonPolygonSerializerTests.FormatValue_Should_Pass_When_Value.snap @@ -0,0 +1 @@ +{ type: Polygon, coordinates: [ [ [ 30, 10 ], [ 40, 40 ], [ 20, 40 ], [ 10, 20 ], [ 30, 10 ] ] ], crs: 0 } diff --git a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_CoordinateM_RaiseException.snap b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_CoordinateM_RaiseException.snap index 6da0c953dd6..210367ddd07 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_CoordinateM_RaiseException.snap +++ b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_CoordinateM_RaiseException.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Coordinates with M values cannot be transformed", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "test" ], diff --git a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_CoordinateZM_RaiseException.snap b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_CoordinateZM_RaiseException.snap index 6da0c953dd6..210367ddd07 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_CoordinateZM_RaiseException.snap +++ b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_CoordinateZM_RaiseException.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Coordinates with M values cannot be transformed", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "test" ], diff --git a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_InputUnknownCRS_RaiseException.snap b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_InputUnknownCRS_RaiseException.snap index bd90da8cd06..8e9413eacee 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_InputUnknownCRS_RaiseException.snap +++ b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_InputUnknownCRS_RaiseException.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The default coordinate reference system `26918` was not found.\n Register it on the schema with `.AddSpatialTypes(x => x.DefaultSRID(26918).AddAddCoordinateSystemFromString(26918, \"...\"))`", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "test" ], diff --git a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_OutputUnknownCRS_RaiseException.snap b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_OutputUnknownCRS_RaiseException.snap index d7824e50f0f..601fb33eca3 100644 --- a/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_OutputUnknownCRS_RaiseException.snap +++ b/src/HotChocolate/Spatial/test/Types.Tests/__snapshots__/TransformationIntegrationTests.Execute_OutputUnknownCRS_RaiseException.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "The default coordinate reference system `4326` was not found.\n Register it on the schema with `.AddSpatialTypes(x => x.DefaultSRID(4326).AddAddCoordinateSystemFromString(4326, \"...\"))`", - "locations": [ - { - "line": 3, - "column": 21 - } - ], "path": [ "test" ], From 81d7304c13bc52ce1da068fc7eba8f5a441e501b Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 15 Jan 2026 15:39:13 +0100 Subject: [PATCH 104/144] docs --- src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs | 1 + .../docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs index 98882c1c754..1a959e3839d 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/AnyType.cs @@ -27,6 +27,7 @@ public AnyType( BindingBehavior bind = BindingBehavior.Explicit) : base(name, bind) { + Description = description; } /// <summary> diff --git a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md index d00d59a4e9a..1b1d6ec9bed 100644 --- a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md +++ b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md @@ -303,6 +303,10 @@ NonNegativeInt TODO +## AnyType + +TODO + # Deprecations Things that will continue to function this release, but we encourage you to move away from. From c4535ba86942b27e6df730224830d6e5cf36bd6a Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 15 Jan 2026 16:51:55 +0100 Subject: [PATCH 105/144] fix --- .build/Helpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.build/Helpers.cs b/.build/Helpers.cs index fb08e4b0ad7..eb1e6bdce38 100644 --- a/.build/Helpers.cs +++ b/.build/Helpers.cs @@ -78,7 +78,7 @@ public static IReadOnlyCollection<Output> DotNetBuildSonarSolution( var workingDirectory = Path.GetDirectoryName(solutionFile); var list = new List<Output>(); - list.AddRange(DotNetTasks.DotNet($"new sln -n {Path.GetFileNameWithoutExtension(solutionFile)}", workingDirectory)); + list.AddRange(DotNetTasks.DotNet($"new sln -n {Path.GetFileNameWithoutExtension(solutionFile)} --format sln", workingDirectory)); var projectsArg = string.Join(" ", projects.Select(t => $"\"{t}\"")); From efcb6e85dc0a3dc42276e795e50c7c57311eba9b Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 15 Jan 2026 16:52:24 +0100 Subject: [PATCH 106/144] minor changes --- .../Execution/OperationResult.cs | 51 +++++-------------- .../src/Types/Execution/NeedsFormatting.cs | 5 +- .../TestHelper/TestServerHelper.cs | 4 +- 3 files changed, 17 insertions(+), 43 deletions(-) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs index 6307eda072f..0ae0dbb5885 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs @@ -148,23 +148,6 @@ public OperationResult(ImmutableOrderedDictionary<string, object?> extensions) Extensions = extensions; } - private OperationResult( - object? data, - DataFlags dataFlags, - IRawJsonFormatter? dataFormatter, - ImmutableList<IError>? errors, - ImmutableOrderedDictionary<string, object?>? extensions, - IAsyncDisposable resourceOwner) - { - _dataFlags = dataFlags; - Data = data; - Errors = errors ?? []; - Extensions = extensions ?? []; - Features.Set(dataFormatter); - - RegisterForCleanup(resourceOwner.DisposeAsync); - } - /// <summary> /// Gets the kind of execution result. /// </summary> @@ -217,7 +200,18 @@ public Path? Path /// <summary> /// Gets the GraphQL errors that occurred during execution. /// </summary> - public ImmutableList<IError> Errors { get; } + public ImmutableList<IError> Errors { + get; + set + { + if (IsDataNull && Errors is null or { Count: 0 } && Extensions is null or { Count: 0 }) + { + throw new ArgumentException("Either data, errors or extensions must be provided."); + } + + field = value; + } + } /// <summary> /// Gets or sets additional information passed along with the result. @@ -306,27 +300,6 @@ public bool? HasNext /// </summary> public IRawJsonFormatter? JsonFormatter => Features.Get<IRawJsonFormatter>(); - /// <summary> - /// Creates a new operation result with the specified error added. - /// </summary> - /// <param name="errors">The errors to add to the result.</param> - /// <returns>A new operation result with the added errors.</returns> - public OperationResult WithErrors(ImmutableList<IError> errors) - { - ArgumentNullException.ThrowIfNull(errors); - - return new OperationResult(Data, _dataFlags, JsonFormatter, errors, Extensions, this) - { - RequestIndex = RequestIndex, - VariableIndex = VariableIndex, - Path = Path, - Pending = Pending, - Incremental = Incremental, - Completed = Completed, - HasNext = HasNext - }; - } - /// <summary> /// Creates an operation result containing a single error. /// </summary> diff --git a/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs b/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs index ec16d98356c..cece15226e4 100644 --- a/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs +++ b/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs @@ -8,11 +8,12 @@ namespace HotChocolate.Execution; /// has a custom formatter. /// </summary> /// <remarks> +/// <para> /// The downside of this helper is that we bind it explicitly to JSON. /// If there were alternative query formatter that use different formats we would get /// into trouble with this. -/// -/// This is also the reason for keeping this internal. +/// </para> +/// <para>This is also the reason for keeping this internal.</para> /// </remarks> internal abstract class NeedsFormatting : IResultDataJsonFormatter { diff --git a/src/StrawberryShake/Client/test/Transport.WebSocket.Tests/TestHelper/TestServerHelper.cs b/src/StrawberryShake/Client/test/Transport.WebSocket.Tests/TestHelper/TestServerHelper.cs index be35f7b7c5e..9b83a19bbb4 100644 --- a/src/StrawberryShake/Client/test/Transport.WebSocket.Tests/TestHelper/TestServerHelper.cs +++ b/src/StrawberryShake/Client/test/Transport.WebSocket.Tests/TestHelper/TestServerHelper.cs @@ -64,8 +64,8 @@ public static IWebHost CreateServer(Action<IRequestExecutorBuilder> configure, o if (headers.ContainsKey("sendError")) { - var errors = result.Errors.Add(new Error { Message = "Some error!" }); - context.Result = result.WithErrors(errors); + result.Errors = result.Errors.Add( + new Error { Message = "Some error!" }); } } From 8c0698867d9b83de698b89edc1df725c2d0fd243 Mon Sep 17 00:00:00 2001 From: tobias-tengler <45513122+tobias-tengler@users.noreply.github.com> Date: Thu, 15 Jan 2026 17:07:00 +0100 Subject: [PATCH 107/144] Fix minor snapshot in OpenAPI tests --- ...intIntegrationTests.Http_Post_Body_Field_Has_Wrong_Type.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/__snapshots__/HttpEndpointIntegrationTests.Http_Post_Body_Field_Has_Wrong_Type.snap b/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/__snapshots__/HttpEndpointIntegrationTests.Http_Post_Body_Field_Has_Wrong_Type.snap index b0a5984f0a1..24a1603d55f 100644 --- a/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/__snapshots__/HttpEndpointIntegrationTests.Http_Post_Body_Field_Has_Wrong_Type.snap +++ b/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/__snapshots__/HttpEndpointIntegrationTests.Http_Post_Body_Field_Has_Wrong_Type.snap @@ -3,4 +3,4 @@ Content-Type: application/problem+json --------------------------> Status Code: BadRequest --------------------------> -{"type":"https://tools.ietf.org/html/rfc9110#section-15.5.1","title":"Bad Request","status":400,"detail":"String cannot parse the given literal of type `IntValueNode`."} +{"type":"https://tools.ietf.org/html/rfc9110#section-15.5.1","title":"Bad Request","status":400,"detail":"String cannot coerce the given value JSON element of type `Number` to a runtime value."} From 96b3964ea7382f8e13ce3f8621bf47074ba4debf Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 15 Jan 2026 23:22:37 +0100 Subject: [PATCH 108/144] Fixed the json writer and the value handling of the source result document. --- .../Execution/OperationResult.cs | 29 ++++++++++--------- .../Json/CompositeResultDocument.WriteTo.cs | 20 +++++++++++++ .../Text/Json/CompositeResultDocument.cs | 24 --------------- .../Text/Json/SourceResultDocument.Text.cs | 8 ++--- .../SourceResultDocument.TryGetProperty.cs | 2 +- .../Json/SourceResultDocument.TryGetValue.cs | 22 +++++++------- .../Text/Json/SourceResultDocument.WriteTo.cs | 22 +++++++++++--- .../Text/Json/SourceResultDocument.cs | 21 +++++++++----- .../Json/JsonWriter.WriteValues.Literal.cs | 2 +- .../src/Json/JsonWriter.WriteValues.Number.cs | 2 +- .../JsonWriter.WriteValues.PropertyName.cs | 4 +-- .../src/Json/JsonWriter.WriteValues.String.cs | 6 ++-- src/HotChocolate/Json/src/Json/JsonWriter.cs | 12 ++++---- 13 files changed, 96 insertions(+), 78 deletions(-) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs index 0ae0dbb5885..ae4c72ca709 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs @@ -9,6 +9,8 @@ namespace HotChocolate.Execution; public sealed class OperationResult : ExecutionResult { private readonly DataFlags _dataFlags; + private ImmutableList<IError> _errors; + private ImmutableOrderedDictionary<string, object?> _extensions; /// <summary> /// Initializes a new instance of <see cref="OperationResult"/> with structured data and an optional formatter. @@ -44,8 +46,8 @@ public OperationResult( ? DataFlags.DataIsSet | DataFlags.DataIsNull : DataFlags.DataIsSet; Data = data.Value; - Errors = errors ?? []; - Extensions = extensions ?? []; + _errors = errors ?? []; + _extensions = extensions ?? []; Features.Set(data.Formatter); @@ -89,8 +91,8 @@ public OperationResult( : DataFlags.DataIsSet; Data = data; - Errors = errors ?? []; - Extensions = extensions ?? []; + _errors = errors ?? []; + _extensions = extensions ?? []; } /// <summary> @@ -118,8 +120,8 @@ public OperationResult(ImmutableList<IError> errors, ImmutableOrderedDictionary< } _dataFlags = DataFlags.DataIsNull; - Errors = errors; - Extensions = extensions ?? []; + _errors = errors; + _extensions = extensions ?? []; } /// <summary> @@ -144,8 +146,8 @@ public OperationResult(ImmutableOrderedDictionary<string, object?> extensions) } _dataFlags = DataFlags.DataIsNull; - Errors = []; - Extensions = extensions; + _errors = []; + _extensions = extensions; } /// <summary> @@ -200,8 +202,9 @@ public Path? Path /// <summary> /// Gets the GraphQL errors that occurred during execution. /// </summary> - public ImmutableList<IError> Errors { - get; + public ImmutableList<IError> Errors + { + get => _errors; set { if (IsDataNull && Errors is null or { Count: 0 } && Extensions is null or { Count: 0 }) @@ -209,7 +212,7 @@ public ImmutableList<IError> Errors { throw new ArgumentException("Either data, errors or extensions must be provided."); } - field = value; + _errors = value; } } @@ -221,7 +224,7 @@ public ImmutableList<IError> Errors { /// </exception> public ImmutableOrderedDictionary<string, object?> Extensions { - get; + get => _extensions; set { if (IsDataNull && Errors is null or { Count: 0 } && Extensions is null or { Count: 0 }) @@ -229,7 +232,7 @@ public ImmutableList<IError> Errors { throw new ArgumentException("Either data, errors or extensions must be provided."); } - field = value; + _extensions = value; } } diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs index 408438822c2..eeeb914dba7 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs @@ -83,11 +83,31 @@ public void WriteValue(Cursor cursor, DbRow row) WriteObject(cursor, row); break; + case ElementTokenType.StartObject: + { + var sourceDocument = document._sources[row.SourceDocumentId]; + // Reconstruct the source cursor from stored Location (Chunk) and SizeOrLength (Row) + var sourceCursor = SourceResultDocument.Cursor.From(row.Location, row.SizeOrLength); + var formatter = new SourceResultDocument.RawJsonFormatter(sourceDocument, writer); + formatter.WriteValue(sourceCursor); + break; + } + case ElementTokenType.StartArray when (ElementFlags.SourceResult & row.Flags) != ElementFlags.SourceResult: WriteArray(cursor, row); break; + case ElementTokenType.StartArray: + { + var sourceDocument = document._sources[row.SourceDocumentId]; + // Reconstruct the source cursor from stored Location (Chunk) and SizeOrLength (Row) + var sourceCursor = SourceResultDocument.Cursor.From(row.Location, row.SizeOrLength); + var formatter = new SourceResultDocument.RawJsonFormatter(sourceDocument, writer); + formatter.WriteValue(sourceCursor); + break; + } + case ElementTokenType.None: case ElementTokenType.Null: writer.WriteNullValue(); diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs index 8de791dd16c..0b140af8af7 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs @@ -340,30 +340,6 @@ internal void Invalidate(Cursor current) Debug.Fail("Only objects can be invalidated."); } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void WriteRawValueTo(Utf8JsonWriter writer, DbRow row) - { - if ((row.Flags & ElementFlags.SourceResult) == ElementFlags.SourceResult) - { - var document = _sources[row.SourceDocumentId]; - - if (row.TokenType is ElementTokenType.StartObject or ElementTokenType.StartArray) - { - // Reconstruct the source cursor from stored Location (Chunk) and SizeOrLength (Row) - var sourceCursor = SourceResultDocument.Cursor.From(row.Location, row.SizeOrLength); - var formatter = new SourceResultDocument.RawJsonFormatter(document, writer); - formatter.WriteValue(sourceCursor); - return; - } - - // For simple values, write directly using location and size - document.WriteRawValueTo(writer, row.Location, row.SizeOrLength); - return; - } - - throw new NotSupportedException(); - } - private ReadOnlySpan<byte> ReadRawValue(DbRow row) { if (row.TokenType == ElementTokenType.Null) diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Text.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Text.cs index c556a79a2e9..f912afa58af 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Text.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.Text.cs @@ -22,7 +22,7 @@ public sealed partial class SourceResultDocument CheckExpectedType(expectedType, rowTokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); return row.HasComplexChildren ? JsonReaderHelper.GetUnescapedString(segment) @@ -82,7 +82,7 @@ internal bool TextEquals(Cursor cursor, ReadOnlySpan<byte> otherUtf8Text, bool i CheckExpectedType(isPropertyName ? JsonTokenType.PropertyName : JsonTokenType.String, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (otherUtf8Text.Length > segment.Length || (!shouldUnescape && otherUtf8Text.Length != segment.Length)) { @@ -121,7 +121,7 @@ internal ReadOnlySpan<byte> GetPropertyNameRaw(Cursor valueCursor) var row = _parsedData.Get(valueCursor - 1); Debug.Assert(row.TokenType is JsonTokenType.PropertyName); - return ReadRawValue(row); + return ReadRawValue(row, includeQuotes: false); } internal string GetRawValueAsString(Cursor cursor) @@ -151,7 +151,7 @@ internal ReadOnlySpan<byte> GetRawValue(Cursor cursor, bool includeQuotes) return ReadRawValue(row.Location - 1, row.SizeOrLength + 2); } - return ReadRawValue(row); + return ReadRawValue(row, includeQuotes: false); } var start = row.Location; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetProperty.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetProperty.cs index 5caf05773c2..6dd076590c1 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetProperty.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetProperty.cs @@ -146,7 +146,7 @@ private bool TryGetNamedPropertyValueCore( row = _parsedData.Get(cursor); Debug.Assert(row.TokenType == JsonTokenType.PropertyName); - var currentPropertyName = ReadRawValue(row); + var currentPropertyName = ReadRawValue(row, includeQuotes: false); if (row.HasComplexChildren) { diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetValue.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetValue.cs index b892f603075..0763b28be56 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetValue.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.TryGetValue.cs @@ -13,7 +13,7 @@ internal bool TryGetValue(Cursor cursor, out sbyte value) CheckExpectedType(JsonTokenType.Number, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (Utf8Parser.TryParse(segment, out sbyte tmp, out var consumed) && consumed == segment.Length) @@ -34,7 +34,7 @@ internal bool TryGetValue(Cursor cursor, out byte value) CheckExpectedType(JsonTokenType.Number, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (Utf8Parser.TryParse(segment, out byte tmp, out var consumed) && consumed == segment.Length) @@ -55,7 +55,7 @@ internal bool TryGetValue(Cursor cursor, out short value) CheckExpectedType(JsonTokenType.Number, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (Utf8Parser.TryParse(segment, out short tmp, out var consumed) && consumed == segment.Length) @@ -76,7 +76,7 @@ internal bool TryGetValue(Cursor cursor, out ushort value) CheckExpectedType(JsonTokenType.Number, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (Utf8Parser.TryParse(segment, out ushort tmp, out var consumed) && consumed == segment.Length) @@ -97,7 +97,7 @@ internal bool TryGetValue(Cursor cursor, out int value) CheckExpectedType(JsonTokenType.Number, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (Utf8Parser.TryParse(segment, out int tmp, out var consumed) && consumed == segment.Length) @@ -118,7 +118,7 @@ internal bool TryGetValue(Cursor cursor, out uint value) CheckExpectedType(JsonTokenType.Number, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (Utf8Parser.TryParse(segment, out uint tmp, out var consumed) && consumed == segment.Length) @@ -139,7 +139,7 @@ internal bool TryGetValue(Cursor cursor, out long value) CheckExpectedType(JsonTokenType.Number, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (Utf8Parser.TryParse(segment, out long tmp, out var consumed) && consumed == segment.Length) @@ -160,7 +160,7 @@ internal bool TryGetValue(Cursor cursor, out ulong value) CheckExpectedType(JsonTokenType.Number, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (Utf8Parser.TryParse(segment, out ulong tmp, out var consumed) && consumed == segment.Length) @@ -181,7 +181,7 @@ internal bool TryGetValue(Cursor cursor, out double value) CheckExpectedType(JsonTokenType.Number, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (Utf8Parser.TryParse(segment, out double tmp, out var bytesConsumed) && segment.Length == bytesConsumed) @@ -202,7 +202,7 @@ internal bool TryGetValue(Cursor cursor, out float value) CheckExpectedType(JsonTokenType.Number, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (Utf8Parser.TryParse(segment, out float tmp, out var bytesConsumed) && segment.Length == bytesConsumed) @@ -223,7 +223,7 @@ internal bool TryGetValue(Cursor cursor, out decimal value) CheckExpectedType(JsonTokenType.Number, row.TokenType); - var segment = ReadRawValue(row); + var segment = ReadRawValue(row, includeQuotes: false); if (Utf8Parser.TryParse(segment, out decimal tmp, out var bytesConsumed) && segment.Length == bytesConsumed) diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.WriteTo.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.WriteTo.cs index 21b6a6bab10..52882b4fc07 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.WriteTo.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.WriteTo.cs @@ -1,11 +1,12 @@ using System.Diagnostics; using System.Text.Json; +using HotChocolate.Text.Json; namespace HotChocolate.Fusion.Text.Json; public sealed partial class SourceResultDocument { - internal ref struct RawJsonFormatter(SourceResultDocument document, Utf8JsonWriter writer) + internal ref struct RawJsonFormatter(SourceResultDocument document, JsonWriter writer) { public void WriteValue(Cursor cursor) { @@ -43,9 +44,22 @@ private void WriteValue(Cursor cursor, DbRow row) writer.WriteBooleanValue(false); break; - default: - document.WriteRawValueTo(writer, row); + case JsonTokenType.String: + { + var value = document.ReadRawValue(row, includeQuotes: true); + writer.WriteStringValue(value, skipEscaping: true); break; + } + + case JsonTokenType.Number: + { + var value = document.ReadRawValue(row, includeQuotes: false); + writer.WriteNumberValue(value); + break; + } + + default: + throw new NotSupportedException(); } } @@ -64,7 +78,7 @@ private void WriteObject(Cursor start, DbRow startRow) Debug.Assert(row.TokenType is JsonTokenType.PropertyName); // property name - writer.WritePropertyName(document.ReadRawValue(row)); + writer.WritePropertyName(document.ReadRawValue(row, includeQuotes: false)); // property value current++; diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs index 09a616212d2..cea12bdb41b 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/SourceResultDocument.cs @@ -3,6 +3,7 @@ using System.Text; using System.Text.Json; using HotChocolate.Buffers; +using HotChocolate.Text.Json; namespace HotChocolate.Fusion.Text.Json; @@ -115,11 +116,6 @@ private void WriteRawValueTo(Utf8JsonWriter writer, DbRow row) writer.WriteRawValue(ReadRawValue(row.Location, row.SizeOrLength), skipInputValidation: true); } - internal void WriteRawValueTo(Utf8JsonWriter writer, int location, int size) - { - writer.WriteRawValue(ReadRawValue(location, size), skipInputValidation: true); - } - internal void WriteRawValueTo(IBufferWriter<byte> writer, int location, int size) { var startChunkIndex = location / JsonMemory.BufferSize; @@ -154,8 +150,17 @@ internal void WriteRawValueTo(IBufferWriter<byte> writer, int location, int size } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private ReadOnlySpan<byte> ReadRawValue(DbRow row) - => ReadRawValue(row.Location, row.SizeOrLength); + private ReadOnlySpan<byte> ReadRawValue(DbRow row, bool includeQuotes) + { + if (row.IsSimpleValue && includeQuotes && row.TokenType == JsonTokenType.String) + { + // Start one character earlier than the value (the open quote) + // End one character after the value (the close quote) + return ReadRawValue(row.Location - 1, row.SizeOrLength + 2); + } + + return ReadRawValue(row.Location, row.SizeOrLength); + } internal ReadOnlySpan<byte> ReadRawValue(int location, int size) { @@ -211,7 +216,7 @@ internal ReadOnlyMemory<byte> ReadRawValueAsMemory(int location, int size) var bytesToCopyFromThisChunk = Math.Min(size - bytesRead, JsonMemory.BufferSize - offsetInChunk); chunk.AsSpan(offsetInChunk, bytesToCopyFromThisChunk) - .CopyTo(tempArray.AsSpan(bytesRead)); + .CopyTo(tempArray.AsSpan(bytesRead)); bytesRead += bytesToCopyFromThisChunk; currentLocation += bytesToCopyFromThisChunk; diff --git a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Literal.cs b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Literal.cs index 5a3254f2c80..5289cf48350 100644 --- a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Literal.cs +++ b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Literal.cs @@ -44,7 +44,7 @@ public void WriteBooleanValue(bool value) private void WriteLiteralByOptions(ReadOnlySpan<byte> utf8Value) { - if (_options.Indented) + if (_indented) { WriteLiteralIndented(utf8Value); } diff --git a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Number.cs b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Number.cs index 2836ea1a283..b5a6fb66ca2 100644 --- a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Number.cs +++ b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.Number.cs @@ -24,7 +24,7 @@ public void WriteNumberValue(ReadOnlySpan<byte> utf8FormattedNumber) { ValidateValue(utf8FormattedNumber); - if (_options.Indented) + if (_indented) { WriteNumberValueIndented(utf8FormattedNumber); } diff --git a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.PropertyName.cs b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.PropertyName.cs index f2ea2c73408..bcaa3068f1e 100644 --- a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.PropertyName.cs +++ b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.PropertyName.cs @@ -98,7 +98,7 @@ private void WriteStringEscapeProperty(scoped ReadOnlySpan<char> propertyName, i private void WriteStringByOptionsPropertyName(ReadOnlySpan<char> propertyName) { - if (_options.Indented) + if (_indented) { WriteStringIndentedPropertyName(propertyName); } @@ -252,7 +252,7 @@ private void WriteStringEscapeProperty(scoped ReadOnlySpan<byte> utf8PropertyNam private void WriteStringByOptionsPropertyName(ReadOnlySpan<byte> utf8PropertyName) { - if (_options.Indented) + if (_indented) { WriteStringIndentedPropertyName(utf8PropertyName); } diff --git a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.String.cs b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.String.cs index 8865d947871..47822a393f8 100644 --- a/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.String.cs +++ b/src/HotChocolate/Json/src/Json/JsonWriter.WriteValues.String.cs @@ -75,7 +75,7 @@ private void WriteStringEscape(ReadOnlySpan<char> value) private void WriteStringByOptions(ReadOnlySpan<char> value) { - if (_options.Indented) + if (_indented) { WriteStringIndented(value); } @@ -210,7 +210,7 @@ public void WriteStringValue(ReadOnlySpan<byte> utf8Value, bool skipEscaping = f private void WriteStringValueRaw(ReadOnlySpan<byte> utf8Value) { - if (_options.Indented) + if (_indented) { WriteStringValueRawIndented(utf8Value); } @@ -288,7 +288,7 @@ private void WriteStringEscape(ReadOnlySpan<byte> utf8Value) private void WriteStringByOptions(ReadOnlySpan<byte> utf8Value) { - if (_options.Indented) + if (_indented) { WriteStringIndented(utf8Value); } diff --git a/src/HotChocolate/Json/src/Json/JsonWriter.cs b/src/HotChocolate/Json/src/Json/JsonWriter.cs index 5120fb50733..b22be865812 100644 --- a/src/HotChocolate/Json/src/Json/JsonWriter.cs +++ b/src/HotChocolate/Json/src/Json/JsonWriter.cs @@ -23,7 +23,7 @@ public sealed partial class JsonWriter // A length of 1 will emit LF for indented writes, a length of 2 will emit CRLF. Other values are invalid. private readonly int _newLineLength; - private readonly bool _indentedOrNotSkipValidation; + private readonly bool _indented; private readonly int _maxDepth; public JsonWriter(IBufferWriter<byte> writer, JsonWriterOptions options) @@ -41,7 +41,7 @@ public JsonWriter(IBufferWriter<byte> writer, JsonWriterOptions options) _indentByte = (byte)' '; _indentLength = 2; #endif - _indentedOrNotSkipValidation = options.Indented || !options.SkipValidation; + _indented = options.Indented; _maxDepth = options.MaxDepth == 0 ? 64 : options.MaxDepth; } @@ -95,7 +95,7 @@ private void WriteStart(byte token) throw new InvalidOperationException("The JSON depth is exceeds the max allowed depth."); } - if (_indentedOrNotSkipValidation) + if (_indented) { WriteStartSlow(token); } @@ -127,7 +127,7 @@ private void WriteStartMinimized(byte token) private void WriteStartSlow(byte token) { - Debug.Assert(_indentedOrNotSkipValidation); + Debug.Assert(_indented); WriteStartIndented(token); } @@ -184,7 +184,7 @@ public void WriteEndObject() private void WriteEnd(byte token) { - if (_indentedOrNotSkipValidation) + if (_indented) { WriteEndSlow(token); } @@ -210,7 +210,7 @@ private void WriteEndMinimized(byte token) private void WriteEndSlow(byte token) { - Debug.Assert(_indentedOrNotSkipValidation); + Debug.Assert(_indented); WriteEndIndented(token); } From 00951f908b4f7912ea7f4fa18b164d6f664ab707 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 15 Jan 2026 23:25:56 +0100 Subject: [PATCH 109/144] fixed json default options --- .../JsonElementSnapshotValueFormatter.cs | 11 +++--- .../Protocols/MessageUtilities.cs | 3 -- .../Execution/OperationRequestBuilder.cs | 34 +++---------------- .../DefaultJsonMessageSerializer.cs | 13 +++---- .../src/Types/Execution/NeedsFormatting.cs | 9 ++--- .../DictionaryToJsonDocumentConverter.cs | 5 +-- ....Create_ShortEqual_Expression_NET10_0.snap | 2 +- .../Json/CompositeResultDocument.WriteTo.cs | 4 +-- .../src/Json/HotChocolate.Text.Json.csproj | 2 ++ .../src/Json/JsonSerializerOptionDefaults.cs | 21 ++++++++++++ 10 files changed, 43 insertions(+), 61 deletions(-) create mode 100644 src/HotChocolate/Json/src/Json/JsonSerializerOptionDefaults.cs diff --git a/src/CookieCrumble/src/CookieCrumble/Formatters/JsonElementSnapshotValueFormatter.cs b/src/CookieCrumble/src/CookieCrumble/Formatters/JsonElementSnapshotValueFormatter.cs index 584ec8a3265..b492b0db024 100644 --- a/src/CookieCrumble/src/CookieCrumble/Formatters/JsonElementSnapshotValueFormatter.cs +++ b/src/CookieCrumble/src/CookieCrumble/Formatters/JsonElementSnapshotValueFormatter.cs @@ -6,12 +6,11 @@ namespace CookieCrumble.Formatters; internal sealed class JsonElementSnapshotValueFormatter() : SnapshotValueFormatter<JsonElement>("json") { - private readonly JsonSerializerOptions _options = - new(JsonSerializerDefaults.Web) - { - WriteIndented = true, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }; + private readonly JsonSerializerOptions _options = new JsonSerializerOptions(JsonSerializerDefaults.Web) + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + WriteIndented = true + }; protected override void Format(IBufferWriter<byte> snapshot, JsonElement value) { diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/MessageUtilities.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/MessageUtilities.cs index 505751c899c..f2c19a3b6f9 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/MessageUtilities.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Subscriptions/Protocols/MessageUtilities.cs @@ -11,9 +11,6 @@ internal static class MessageUtilities public static JsonWriterOptions WriterOptions { get; } = new() { Indented = false }; - public static JsonSerializerOptions SerializerOptions { get; } = - new(JsonSerializerDefaults.Web); - public static void SerializeMessage( PooledArrayWriter pooledArrayWriter, IWebSocketPayloadFormatter formatter, diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs index fd5862309d7..ceb634ad6db 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs @@ -1,11 +1,9 @@ using System.Diagnostics.CodeAnalysis; using System.Text.Json; -#if !NET9_0_OR_GREATER -using System.Text.Json.Serialization.Metadata; -#endif using HotChocolate.Buffers; using HotChocolate.Features; using HotChocolate.Language; +using HotChocolate.Text.Json; using static HotChocolate.ExecutionAbstractionsResources; namespace HotChocolate.Execution; @@ -13,20 +11,8 @@ namespace HotChocolate.Execution; /// <summary> /// Represents a builder for creating GraphQL operation requests. /// </summary> -#if !NET9_0_OR_GREATER -[RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] -[RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] -#endif public sealed class OperationRequestBuilder : IFeatureProvider { -#if !NET9_0_OR_GREATER - private static readonly JsonSerializerOptions s_serializerOptions = - new(JsonSerializerDefaults.Web) - { - TypeInfoResolver = new DefaultJsonTypeInfoResolver() - }; -#endif - private IOperationDocument? _document; private OperationDocumentId? _documentId; private OperationDocumentHash? _documentHash; @@ -258,11 +244,7 @@ public OperationRequestBuilder SetVariableValues(IReadOnlyDictionary<string, obj return this; } -#if NET9_0_OR_GREATER - _variableValues = new(JsonSerializer.SerializeToDocument(variableValues, JsonSerializerOptions.Web)); -#else - _variableValues = new(JsonSerializer.SerializeToDocument(variableValues, s_serializerOptions)); -#endif + _variableValues = new(JsonSerializer.SerializeToDocument(variableValues, JsonSerializerOptionDefaults.GraphQL)); return this; } @@ -290,11 +272,7 @@ public OperationRequestBuilder SetVariableValues( return this; } -#if NET9_0_OR_GREATER - _variableValues = new(JsonSerializer.SerializeToDocument(variableValueSets, JsonSerializerOptions.Web)); -#else - _variableValues = new(JsonSerializer.SerializeToDocument(variableValueSets, s_serializerOptions)); -#endif + _variableValues = new(JsonSerializer.SerializeToDocument(variableValueSets, JsonSerializerOptionDefaults.GraphQL)); return this; } @@ -343,11 +321,7 @@ public OperationRequestBuilder SetExtensions(IReadOnlyDictionary<string, object? return this; } -#if NET9_0_OR_GREATER - _extensions = new(JsonSerializer.SerializeToDocument(extensions, JsonSerializerOptions.Web)); -#else - _extensions = new(JsonSerializer.SerializeToDocument(extensions, s_serializerOptions)); -#endif + _extensions = new(JsonSerializer.SerializeToDocument(extensions, JsonSerializerOptionDefaults.GraphQL)); return this; } diff --git a/src/HotChocolate/Core/src/Subscriptions/DefaultJsonMessageSerializer.cs b/src/HotChocolate/Core/src/Subscriptions/DefaultJsonMessageSerializer.cs index 765f2ac23e2..e4be31946fb 100644 --- a/src/HotChocolate/Core/src/Subscriptions/DefaultJsonMessageSerializer.cs +++ b/src/HotChocolate/Core/src/Subscriptions/DefaultJsonMessageSerializer.cs @@ -1,6 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Text.Json; -using System.Text.Json.Serialization; +using HotChocolate.Text.Json; using static HotChocolate.Subscriptions.Properties.Resources; namespace HotChocolate.Subscriptions; @@ -13,11 +13,8 @@ public sealed class DefaultJsonMessageSerializer : IMessageSerializer { private const string Completed = "{\"kind\":1}"; - private readonly JsonSerializerOptions _options = - new(JsonSerializerDefaults.Web) - { - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull - }; + private static readonly JsonSerializerOptions s_options = + JsonSerializerOptionDefaults.GraphQL; /// <inheritdoc /> public string CompleteMessage => Completed; @@ -27,7 +24,7 @@ public sealed class DefaultJsonMessageSerializer : IMessageSerializer [RequiresDynamicCode("JSON message serialization might require types that cannot be statically analyzed and might need runtime code generation.")] public string Serialize<TMessage>(TMessage message) { - return JsonSerializer.Serialize(new MessageEnvelope<TMessage>(message), _options); + return JsonSerializer.Serialize(new MessageEnvelope<TMessage>(message), s_options); } /// <inheritdoc /> @@ -37,7 +34,7 @@ public MessageEnvelope<TMessage> Deserialize<TMessage>(string serializedMessage) { var result = JsonSerializer.Deserialize<InternalMessageEnvelope<TMessage>>( serializedMessage, - _options); + s_options); if (result.Kind is MessageKind.Default && result.Body is null) { diff --git a/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs b/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs index cece15226e4..59d5f97cd61 100644 --- a/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs +++ b/src/HotChocolate/Core/src/Types/Execution/NeedsFormatting.cs @@ -38,16 +38,11 @@ void IResultDataJsonFormatter.WriteTo( JsonWriter writer, JsonSerializerOptions? options, JsonNullIgnoreCondition nullIgnoreCondition) -#if NET9_0_OR_GREATER - => FormatValue(writer, options ?? JsonSerializerOptions.Web, nullIgnoreCondition); -#else - => FormatValue(writer, options ?? JsonSerializerOptions.Default, nullIgnoreCondition); -#endif + => FormatValue(writer, options ?? JsonSerializerOptionDefaults.GraphQL, nullIgnoreCondition); public static JsonNeedsFormatting Create<TValue>(TValue value) { - var options = new JsonSerializerOptions(JsonSerializerDefaults.Web); - var documents = JsonSerializer.SerializeToDocument(value, options); + var documents = JsonSerializer.SerializeToDocument(value, JsonSerializerOptionDefaults.GraphQL); return new JsonNeedsFormatting(documents); } } diff --git a/src/HotChocolate/Core/src/Types/Utilities/DictionaryToJsonDocumentConverter.cs b/src/HotChocolate/Core/src/Types/Utilities/DictionaryToJsonDocumentConverter.cs index 6b65ebf9b57..546d806ebbe 100644 --- a/src/HotChocolate/Core/src/Types/Utilities/DictionaryToJsonDocumentConverter.cs +++ b/src/HotChocolate/Core/src/Types/Utilities/DictionaryToJsonDocumentConverter.cs @@ -1,6 +1,3 @@ -using System.Diagnostics.CodeAnalysis; -using System.Linq.Expressions; -using System.Reflection; using System.Text.Encodings.Web; using System.Text.Json; using HotChocolate.Buffers; @@ -17,7 +14,7 @@ internal static class DictionaryToJsonDocumentConverter Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; - private static readonly JsonSerializerOptions s_jsonSerializerOptions = new(JsonSerializerDefaults.Web); + private static readonly JsonSerializerOptions s_jsonSerializerOptions = JsonSerializerOptionDefaults.GraphQL; public static JsonElement FromDictionary(IReadOnlyDictionary<string, object?> dictionary) { diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression_NET10_0.snap index db3bf4a24b4..0498c45e11a 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" = @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs index eeeb914dba7..df7efccac19 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs @@ -28,7 +28,7 @@ public void Write() JsonValueFormatter.WriteErrors( writer, document._errors, - new JsonSerializerOptions(JsonSerializerDefaults.Web), + JsonSerializerOptionDefaults.GraphQL, default); } @@ -53,7 +53,7 @@ public void Write() JsonValueFormatter.WriteDictionary( writer, document._extensions, - new JsonSerializerOptions(JsonSerializerDefaults.Web), + JsonSerializerOptionDefaults.GraphQL, default); } diff --git a/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj b/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj index f9d6402fdde..d801ea51031 100644 --- a/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj +++ b/src/HotChocolate/Json/src/Json/HotChocolate.Text.Json.csproj @@ -12,8 +12,10 @@ </PropertyGroup> <ItemGroup> + <InternalsVisibleTo Include="HotChocolate.Execution.Abstractions" /> <InternalsVisibleTo Include="HotChocolate.Fusion.Execution" /> <InternalsVisibleTo Include="HotChocolate.Types" /> + <InternalsVisibleTo Include="HotChocolate.Subscriptions" /> </ItemGroup> <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'"> diff --git a/src/HotChocolate/Json/src/Json/JsonSerializerOptionDefaults.cs b/src/HotChocolate/Json/src/Json/JsonSerializerOptionDefaults.cs new file mode 100644 index 00000000000..7fac882c56a --- /dev/null +++ b/src/HotChocolate/Json/src/Json/JsonSerializerOptionDefaults.cs @@ -0,0 +1,21 @@ +using System.Text.Encodings.Web; +using System.Text.Json; + +namespace HotChocolate.Text.Json; + +internal static class JsonSerializerOptionDefaults +{ + public static JsonSerializerOptions GraphQL { get; } + = new JsonSerializerOptions(JsonSerializerDefaults.Web) + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + WriteIndented = false + }; + + public static JsonSerializerOptions GraphQLIndented { get; } + = new JsonSerializerOptions(JsonSerializerDefaults.Web) + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + WriteIndented = true + }; +} From aa85db920ef3a9f208200e5a2d0b776611636cc6 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 15 Jan 2026 23:26:15 +0100 Subject: [PATCH 110/144] Snapshots --- ...VisitorComparableTests.Create_ShortEqual_Expression.snap | 2 +- ...bleTests.Create_ShortGreaterThanOrEquals_Expression.snap | 2 +- ....Create_ShortGreaterThanOrEquals_Expression_NET10_0.snap | 2 +- ...rComparableTests.Create_ShortGreaterThan_Expression.snap | 2 +- ...bleTests.Create_ShortGreaterThan_Expression_NET10_0.snap | 2 +- ...terVisitorComparableTests.Create_ShortIn_Expression.snap | 2 +- ...orComparableTests.Create_ShortIn_Expression_NET10_0.snap | 2 +- ...rableTests.Create_ShortLowerThanOrEquals_Expression.snap | 2 +- ...ts.Create_ShortLowerThanOrEquals_Expression_NET10_0.snap | 2 +- ...torComparableTests.Create_ShortLowerThan_Expression.snap | 2 +- ...rableTests.Create_ShortLowerThan_Expression_NET10_0.snap | 2 +- ...itorComparableTests.Create_ShortNotEqual_Expression.snap | 2 +- ...arableTests.Create_ShortNotEqual_Expression_NET10_0.snap | 2 +- ...Tests.Create_ShortNotGreaterThanOrEquals_Expression.snap | 2 +- ...eate_ShortNotGreaterThanOrEquals_Expression_NET10_0.snap | 2 +- ...mparableTests.Create_ShortNotGreaterThan_Expression.snap | 2 +- ...Tests.Create_ShortNotGreaterThan_Expression_NET10_0.snap | 2 +- ...VisitorComparableTests.Create_ShortNotIn_Expression.snap | 2 +- ...omparableTests.Create_ShortNotIn_Expression_NET10_0.snap | 2 +- ...leTests.Create_ShortNotLowerThanOrEquals_Expression.snap | 2 +- ...Create_ShortNotLowerThanOrEquals_Expression_NET10_0.snap | 2 +- ...ComparableTests.Create_ShortNotLowerThan_Expression.snap | 2 +- ...leTests.Create_ShortNotLowerThan_Expression_NET10_0.snap | 2 +- ....Create_ShortNullableGreaterThanOrEquals_Expression.snap | 2 +- ...ShortNullableGreaterThanOrEquals_Expression_NET10_0.snap | 2 +- ...bleTests.Create_ShortNullableGreaterThan_Expression.snap | 2 +- ....Create_ShortNullableGreaterThan_Expression_NET10_0.snap | 2 +- ...ts.Create_ShortNullableLowerThanOrEquals_Expression.snap | 2 +- ...e_ShortNullableLowerThanOrEquals_Expression_NET10_0.snap | 2 +- ...rableTests.Create_ShortNullableLowerThan_Expression.snap | 2 +- ...ts.Create_ShortNullableLowerThan_Expression_NET10_0.snap | 2 +- ...rtNullableNotGreaterThanOrEquals_Expression_NET10_0.snap | 2 +- ...ortNullableNotGreaterThanOrEquals_Expression_NET8_0.snap | 2 +- ...ortNullableNotGreaterThanOrEquals_Expression_NET9_0.snap | 2 +- ...eate_ShortNullableNotGreaterThan_Expression_NET10_0.snap | 2 +- ...reate_ShortNullableNotGreaterThan_Expression_NET8_0.snap | 2 +- ...reate_ShortNullableNotGreaterThan_Expression_NET9_0.snap | 2 +- ...hortNullableNotLowerThanOrEquals_Expression_NET10_0.snap | 2 +- ...ShortNullableNotLowerThanOrEquals_Expression_NET8_0.snap | 2 +- ...ShortNullableNotLowerThanOrEquals_Expression_NET9_0.snap | 2 +- ...Create_ShortNullableNotLowerThan_Expression_NET10_0.snap | 2 +- ....Create_ShortNullableNotLowerThan_Expression_NET8_0.snap | 2 +- ....Create_ShortNullableNotLowerThan_Expression_NET9_0.snap | 2 +- ...eFilterVisitorEnumTests.Create_EnumEqual_Expression.snap | 2 +- ...isitorEnumTests.Create_EnumEqual_Expression_NET10_0.snap | 2 +- ...lterVisitorEnumTests.Create_EnumNotEqual_Expression.snap | 2 +- ...torEnumTests.Create_EnumNotEqual_Expression_NET10_0.snap | 2 +- ...sitorExecutableTests.Create_BooleanEqual_Expression.snap | 4 ++-- ...orExecutableTests.Create_BooleanNotEqual_Expression.snap | 4 ++-- ...cutableTests.Create_NullableBooleanEqual_Expression.snap | 6 +++--- ...ableTests.Create_NullableBooleanNotEqual_Expression.snap | 6 +++--- ...orExpressionTests.Create_CollectionLengthExpression.snap | 2 +- ...sionTests.Create_CollectionLengthExpression_NET10_0.snap | 2 +- ...erfacesTests.Create_InterfaceStringEqual_Expression.snap | 2 +- ...ests.Create_InterfaceStringEqual_Expression_NET10_0.snap | 2 +- ...stTests.Create_ArrayAnyObjectStringEqual_Expression.snap | 2 +- ...ate_ArrayObjectNestedArrayAnyStringEqual_Expression.snap | 2 +- ...te_ArrayObjectNestedArraySomeStringEqual_Expression.snap | 2 +- ...ObjectNestedArraySomeStringEqual_Expression_NET10_0.snap | 2 +- ...isitorObjectTests.Create_ObjectEnumEqual_Expression.snap | 2 +- ...jectTests.Create_ObjectEnumEqual_Expression_NET10_0.snap | 2 +- ...sitorObjectTests.Create_ObjectShortEqual_Expression.snap | 2 +- ...ectTests.Create_ObjectShortEqual_Expression_NET10_0.snap | 2 +- ...rVisitorObjectTests.Create_ObjectShortIn_Expression.snap | 2 +- ...ObjectTests.Create_ObjectShortIn_Expression_NET10_0.snap | 2 +- ...itorObjectTests.Create_ObjectStringEqual_Expression.snap | 2 +- ...ctTests.Create_ObjectStringEqual_Expression_NET10_0.snap | 2 +- ...VisitorObjectTests.Create_ObjectStringIn_Expression.snap | 2 +- ...bjectTests.Create_ObjectStringIn_Expression_NET10_0.snap | 2 +- ...tringTests.Create_NullableStringContains_Expression.snap | 2 +- ...ts.Create_NullableStringContains_Expression_NET10_0.snap | 2 +- ...ts.Create_NullableStringEndsWith_Expression_NET10_0.snap | 2 +- ...sts.Create_NullableStringEndsWith_Expression_NET8_0.snap | 2 +- ...sts.Create_NullableStringEndsWith_Expression_NET9_0.snap | 2 +- ....Create_NullableStringNoContains_Expression_NET10_0.snap | 2 +- ...s.Create_NullableStringNoContains_Expression_NET8_0.snap | 2 +- ...s.Create_NullableStringNoContains_Expression_NET9_0.snap | 2 +- ...Create_NullableStringNotEndsWith_Expression_NET10_0.snap | 2 +- ....Create_NullableStringNotEndsWith_Expression_NET8_0.snap | 2 +- ....Create_NullableStringNotEndsWith_Expression_NET9_0.snap | 2 +- ...eate_NullableStringNotStartsWith_Expression_NET10_0.snap | 2 +- ...reate_NullableStringNotStartsWith_Expression_NET8_0.snap | 2 +- ...reate_NullableStringNotStartsWith_Expression_NET9_0.snap | 2 +- ....Create_NullableStringStartsWith_Expression_NET10_0.snap | 2 +- ...s.Create_NullableStringStartsWith_Expression_NET8_0.snap | 2 +- ...s.Create_NullableStringStartsWith_Expression_NET9_0.snap | 2 +- ...VisitorStringTests.Create_StringContains_Expression.snap | 2 +- ...tringTests.Create_StringContains_Expression_NET10_0.snap | 2 +- ...tringTests.Create_StringEndsWith_Expression_NET10_0.snap | 2 +- ...StringTests.Create_StringEndsWith_Expression_NET8_0.snap | 2 +- ...StringTests.Create_StringEndsWith_Expression_NET9_0.snap | 2 +- ...terVisitorStringTests.Create_StringEqual_Expression.snap | 2 +- ...orStringTests.Create_StringEqual_Expression_NET10_0.snap | 2 +- ...FilterVisitorStringTests.Create_StringIn_Expression.snap | 2 +- ...sitorStringTests.Create_StringIn_Expression_NET10_0.snap | 2 +- ...ingTests.Create_StringNoContains_Expression_NET10_0.snap | 2 +- ...ringTests.Create_StringNoContains_Expression_NET8_0.snap | 2 +- ...ringTests.Create_StringNoContains_Expression_NET9_0.snap | 2 +- ...ngTests.Create_StringNotEndsWith_Expression_NET10_0.snap | 2 +- ...ingTests.Create_StringNotEndsWith_Expression_NET8_0.snap | 2 +- ...ingTests.Create_StringNotEndsWith_Expression_NET9_0.snap | 2 +- ...VisitorStringTests.Create_StringNotEqual_Expression.snap | 2 +- ...tringTests.Create_StringNotEqual_Expression_NET10_0.snap | 2 +- ...orStringTests.Create_StringNotIn_Expression_NET10_0.snap | 2 +- ...torStringTests.Create_StringNotIn_Expression_NET8_0.snap | 2 +- ...torStringTests.Create_StringNotIn_Expression_NET9_0.snap | 2 +- ...Tests.Create_StringNotStartsWith_Expression_NET10_0.snap | 2 +- ...gTests.Create_StringNotStartsWith_Expression_NET8_0.snap | 2 +- ...gTests.Create_StringNotStartsWith_Expression_NET9_0.snap | 2 +- ...ingTests.Create_StringStartsWith_Expression_NET10_0.snap | 2 +- ...ringTests.Create_StringStartsWith_Expression_NET8_0.snap | 2 +- ...ringTests.Create_StringStartsWith_Expression_NET9_0.snap | 2 +- 112 files changed, 118 insertions(+), 118 deletions(-) diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap index a17939f55fa..0bf68393576 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" = @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap index 99ff8e2b063..80e210bd05e 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression_NET10_0.snap index 6a883fa3fa1..fc87ef7a64d 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap index 4e8fb7b75a3..9f160232d82 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression_NET10_0.snap index 59c6f1619da..c7ca6a392a6 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap index a22ffff9cca..67e8271eff4 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap @@ -54,7 +54,7 @@ WHERE "d"."BarShort" IN ( ) --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression_NET10_0.snap index 29169ac9085..fb661b4c16f 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression_NET10_0.snap @@ -50,7 +50,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" IN (@p1, @p2) --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap index 640e056d88f..0d5d724b0c1 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression_NET10_0.snap index 63a34989ec9..9dc6acd6c18 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap index c48d26fdcb3..f1348812c03 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression_NET10_0.snap index 6cc8d7f6821..12de76d0d81 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap index 8a60b5a2115..d0133d3a578 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <> @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression_NET10_0.snap index b4cdf6cf28e..50023977e64 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression_NET10_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <> @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap index 7c5543b5641..92e247793a1 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression_NET10_0.snap index 925ef96bc4e..b3e023807c1 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap index 667b53e2d47..85a240fb907 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression_NET10_0.snap index 407a872dd15..104744b59b8 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap index 6da4fd4e544..9bed1d50607 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap @@ -48,7 +48,7 @@ WHERE "d"."BarShort" NOT IN ( ) --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression_NET10_0.snap index fbd1d43ab08..23a72592bfb 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression_NET10_0.snap @@ -44,7 +44,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" NOT IN (@p1, @p2) --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap index 290cddb29de..bd334587a8b 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression_NET10_0.snap index 712a3b28bb5..f8476858a9d 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap index 3c7f19803ea..40afb676c30 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression_NET10_0.snap index 8d9e9239a07..f406c12d903 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap index 2f039cb53a5..01e3b8ae464 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression_NET10_0.snap index 50376b84291..bad89cc9195 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap index f1e76dbc41d..fa69550b200 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression_NET10_0.snap index c1bea0679f4..e99f5512f07 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap index 3cb54d1be73..2f5b9376779 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression_NET10_0.snap index 180a1a6ee28..93f3757bba3 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap index c65fb798240..5ffa8e63101 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression_NET10_0.snap index 54e49a5f24e..2c126bb7e10 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET10_0.snap index 6d5f2c7b459..4f12effac64 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET10_0.snap @@ -82,7 +82,7 @@ WHERE CASE END --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET8_0.snap index 37eb74945d2..691b6b45287 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET8_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE NOT ("d"."BarShort" >= @__p_0) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET9_0.snap index 2667e6aa075..abfd56106bb 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET9_0.snap @@ -82,7 +82,7 @@ WHERE CASE END --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET10_0.snap index 718eb6a6bd2..27f204ade78 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET10_0.snap @@ -91,7 +91,7 @@ WHERE CASE END --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET8_0.snap index 03b11dadb36..31f0c0bb5c3 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET8_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE NOT ("d"."BarShort" > @__p_0) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET9_0.snap index b989d260968..32d881cad57 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET9_0.snap @@ -91,7 +91,7 @@ WHERE CASE END --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET10_0.snap index 8494dd7ad32..3292fd16d39 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET10_0.snap @@ -82,7 +82,7 @@ WHERE CASE END --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET8_0.snap index e8103028e21..4fdb16007f1 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET8_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE NOT ("d"."BarShort" <= @__p_0) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET9_0.snap index 9c32284c141..b05dbdc7167 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET9_0.snap @@ -82,7 +82,7 @@ WHERE CASE END --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET10_0.snap index 9af33117708..decaa37149f 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET10_0.snap @@ -91,7 +91,7 @@ WHERE CASE END --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET8_0.snap index e717649b1f7..8fc2d5904ee 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET8_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE NOT ("d"."BarShort" < @__p_0) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET9_0.snap index 4be821c0160..86b93f10432 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET9_0.snap @@ -91,7 +91,7 @@ WHERE CASE END --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap index fee4eb3d4af..c6c692187b0 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."BarEnum" = @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression_NET10_0.snap index efdcd684f79..3039070747e 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."BarEnum" = @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap index 5432abc2324..2ea16de3e42 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap @@ -54,7 +54,7 @@ FROM "Data" AS "d" WHERE "d"."BarEnum" <> @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression_NET10_0.snap index 70e79e6972d..bcde01d4cb6 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression_NET10_0.snap @@ -54,7 +54,7 @@ FROM "Data" AS "d" WHERE "d"."BarEnum" <> @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap index 8b8cc61d61e..55163c748e4 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap @@ -1,4 +1,4 @@ -true +true Result: --------------- { "data": { @@ -11,7 +11,7 @@ true } --------------- -false +false Result: --------------- { "data": { diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap index 781a8171442..d4617d5800e 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap @@ -1,4 +1,4 @@ -true +true Result: --------------- { "data": { @@ -11,7 +11,7 @@ true } --------------- -false +false Result: --------------- { "data": { diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap index 526c3ab37d4..46a9da34a95 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap @@ -1,4 +1,4 @@ -true +true Result: --------------- { "data": { @@ -11,7 +11,7 @@ true } --------------- -false +false Result: --------------- { "data": { @@ -24,7 +24,7 @@ false } --------------- -null +null Result: --------------- { "data": { diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap index d0cf4bf3f13..20e61da3c59 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap @@ -1,4 +1,4 @@ -true +true Result: --------------- { "data": { @@ -14,7 +14,7 @@ true } --------------- -false +false Result: --------------- { "data": { @@ -30,7 +30,7 @@ false } --------------- -null +null Result: --------------- { "data": { diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression.snap index 68ee52add58..10df9c4639a 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression.snap @@ -50,7 +50,7 @@ WHERE ( WHERE "d"."Id" = "b"."FooId") = @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression_NET10_0.snap index ef7a8b954f0..38d8b04cba0 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression_NET10_0.snap @@ -50,7 +50,7 @@ WHERE ( WHERE "d"."Id" = "b"."FooId") = @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap index 30f200ccb38..3cb9b3297b2 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap @@ -48,7 +48,7 @@ INNER JOIN "Test" AS "t" ON "d"."TestId" = "t"."Id" WHERE "t"."Prop" = @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression_NET10_0.snap index 245c50adcc7..7b36a3f751e 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression_NET10_0.snap @@ -48,7 +48,7 @@ INNER JOIN "Test" AS "t" ON "d"."TestId" = "t"."Id" WHERE "t"."Prop" = @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap index 0a19b82f044..33f568be1f1 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap @@ -102,7 +102,7 @@ WHERE EXISTS ( WHERE "d"."Id" = "f"."FooId") --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap index 5b892d39517..0ac2339342d 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap @@ -114,7 +114,7 @@ WHERE EXISTS ( WHERE "f"."Id" = "d0"."FooId") --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap index 1474f5f43c0..c86bcb18f34 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap @@ -44,7 +44,7 @@ WHERE EXISTS ( WHERE "f"."Id" = "d0"."FooId" AND "f0"."BarString" = @__p_0) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression_NET10_0.snap index 67fa1c8b66d..094a24412c5 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression_NET10_0.snap @@ -44,7 +44,7 @@ WHERE EXISTS ( WHERE "f"."Id" = "d0"."FooId" AND "f0"."BarString" = @p) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap index 3369f483965..838a6158f34 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap @@ -53,7 +53,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarEnum" = @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression_NET10_0.snap index 5071856339a..2f46935e3eb 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression_NET10_0.snap @@ -53,7 +53,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarEnum" = @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap index bfa7f565a8d..1c671ce4596 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap @@ -53,7 +53,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarShort" = @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression_NET10_0.snap index c8b5e0e6aac..649de01eda5 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression_NET10_0.snap @@ -53,7 +53,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarShort" = @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap index 9e5609e3733..ad50ed79e7a 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap @@ -74,7 +74,7 @@ WHERE "f"."BarShort" IN ( ) --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression_NET10_0.snap index 19610fc49f5..37a11471533 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression_NET10_0.snap @@ -70,7 +70,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarShort" IN (@p1, @p2) --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap index e9902a99e08..9782bd3ac04 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap @@ -58,7 +58,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarString" = @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression_NET10_0.snap index 0b6a2b661c1..46757f4dd88 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression_NET10_0.snap @@ -58,7 +58,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarString" = @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap index 15c6c31d2b8..c60b96ed61f 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap @@ -41,7 +41,7 @@ WHERE "f"."BarString" IN ( ) --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression_NET10_0.snap index 444587d84f3..f51fc3e3091 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression_NET10_0.snap @@ -39,7 +39,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarString" IN (@p1, @p2) --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap index 65b8d3c118b..3c0a89781cd 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND instr("d"."Bar", @__p_0) > 0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression_NET10_0.snap index a0ace3f2075..3e264fcc997 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND instr("d"."Bar", @p) > 0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET10_0.snap index 0c6ddad2018..eec4707a73e 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @p_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET8_0.snap index 1b1d2c51906..dba0c90ea18 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @__p_0_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET9_0.snap index 1b1d2c51906..dba0c90ea18 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @__p_0_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET10_0.snap index 6a7609055ba..b4f4ec8ee5a 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET10_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR instr("d"."Bar", @p) <= 0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET8_0.snap index d9130fa78cf..46b0d34879f 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET8_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR NOT (instr("d"."Bar", @__p_0) > 0) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET9_0.snap index b1eccdc5016..eca2c48f9ba 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET9_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR instr("d"."Bar", @__p_0) <= 0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET10_0.snap index 40b5f71a248..c568198f3fb 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET10_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @p_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET8_0.snap index 96e427a0820..3203fa3144c 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET8_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @__p_0_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET9_0.snap index 96e427a0820..3203fa3144c 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET9_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @__p_0_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET10_0.snap index 46ef0aab7eb..001a6c83283 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET10_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @p_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET8_0.snap index 77a754414f2..4371f860d26 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET8_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @__p_0_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET9_0.snap index 77a754414f2..4371f860d26 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET9_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @__p_0_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET10_0.snap index 3455343eef2..1b2f047db0a 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @p_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET8_0.snap index ef3b1890a74..1001e5f0f1f 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @__p_0_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET9_0.snap index ef3b1890a74..1001e5f0f1f 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @__p_0_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap index 06a53f9909b..de83f458152 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE instr("d"."Bar", @__p_0) > 0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression_NET10_0.snap index bcacc6b82ed..f909b3eb7a5 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE instr("d"."Bar", @p) > 0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET10_0.snap index 9854e976e49..2fec3bc883f 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @p_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET8_0.snap index bdf5a199f37..ed71ad848de 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @__p_0_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET9_0.snap index bdf5a199f37..ed71ad848de 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @__p_0_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap index d7944d2311b..dbd85ee3b01 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" = @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression_NET10_0.snap index 30a4100fe0e..8cb67278a01 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" = @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap index ea83f18bfb9..07c7bc5e3be 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap @@ -26,7 +26,7 @@ WHERE "d"."Bar" IN ( ) --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression_NET10_0.snap index 82855f7cd00..b17a514898b 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression_NET10_0.snap @@ -24,7 +24,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IN (@p1, @p2) --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET10_0.snap index f27ccad99b5..d870660e48e 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE instr("d"."Bar", @p) <= 0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET8_0.snap index b620f7a446d..7c6e429c003 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE NOT (instr("d"."Bar", @__p_0) > 0) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET9_0.snap index 4ff2d04f65b..23f5c40d30f 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE instr("d"."Bar", @__p_0) <= 0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET10_0.snap index 1da2559cf8d..dc2496cecbd 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @p_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET8_0.snap index d9d444861dd..a5cf41a8261 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @__p_0_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET9_0.snap index d9d444861dd..a5cf41a8261 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @__p_0_endswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap index c7eb9403233..f788d4b3c60 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" <> @__p_0 --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression_NET10_0.snap index 546ed5e6b5f..9a7a1fd2f3c 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" <> @p --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET10_0.snap index 8d79b3d265b..8c325bd794b 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET10_0.snap @@ -17,7 +17,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT IN (@p1, @p2) --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET8_0.snap index 43523d406a8..c8518ed4b25 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET8_0.snap @@ -19,7 +19,7 @@ WHERE "d"."Bar" NOT IN ( ) --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET9_0.snap index 43523d406a8..c8518ed4b25 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET9_0.snap @@ -19,7 +19,7 @@ WHERE "d"."Bar" NOT IN ( ) --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET10_0.snap index 550e068d623..3c7645637e6 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @p_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET8_0.snap index 058fd6ff261..e6f83402087 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @__p_0_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET9_0.snap index 058fd6ff261..e6f83402087 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @__p_0_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET10_0.snap index f2b36f6c370..169092d75da 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @p_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET8_0.snap index 3a8dc9fdd38..091657d165c 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @__p_0_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET9_0.snap index 3a8dc9fdd38..091657d165c 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @__p_0_startswith ESCAPE '\' --------------- -null +null Result: --------------- { "errors": [ From 7ea881023f3262c7d0a5aa4158d35ee79fdc0f80 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 15 Jan 2026 23:26:32 +0100 Subject: [PATCH 111/144] Snapshots --- ...SortVisitorExecutableTests.Create_Boolean_OrderBy.snap | 4 ++-- ...orExecutableTests.Create_Boolean_OrderBy_Nullable.snap | 4 ++-- ...sitorComparableTests.Create_ShortEqual_Expression.snap | 2 +- ...eTests.Create_ShortGreaterThanOrEquals_Expression.snap | 2 +- ...omparableTests.Create_ShortGreaterThan_Expression.snap | 2 +- ...rVisitorComparableTests.Create_ShortIn_Expression.snap | 2 +- ...bleTests.Create_ShortLowerThanOrEquals_Expression.snap | 2 +- ...rComparableTests.Create_ShortLowerThan_Expression.snap | 2 +- ...orComparableTests.Create_ShortNotEqual_Expression.snap | 2 +- ...sts.Create_ShortNotGreaterThanOrEquals_Expression.snap | 2 +- ...arableTests.Create_ShortNotGreaterThan_Expression.snap | 2 +- ...sitorComparableTests.Create_ShortNotIn_Expression.snap | 2 +- ...Tests.Create_ShortNotLowerThanOrEquals_Expression.snap | 2 +- ...mparableTests.Create_ShortNotLowerThan_Expression.snap | 2 +- ...reate_ShortNullableGreaterThanOrEquals_Expression.snap | 2 +- ...eTests.Create_ShortNullableGreaterThan_Expression.snap | 2 +- ....Create_ShortNullableLowerThanOrEquals_Expression.snap | 2 +- ...bleTests.Create_ShortNullableLowerThan_Expression.snap | 2 +- ...te_ShortNullableNotGreaterThanOrEquals_Expression.snap | 2 +- ...sts.Create_ShortNullableNotGreaterThan_Expression.snap | 2 +- ...eate_ShortNullableNotLowerThanOrEquals_Expression.snap | 2 +- ...Tests.Create_ShortNullableNotLowerThan_Expression.snap | 2 +- ...ilterVisitorEnumTests.Create_EnumEqual_Expression.snap | 2 +- ...erVisitorEnumTests.Create_EnumNotEqual_Expression.snap | 2 +- ...torExecutableTests.Create_BooleanEqual_Expression.snap | 4 ++-- ...ExecutableTests.Create_BooleanNotEqual_Expression.snap | 4 ++-- ...tableTests.Create_NullableBooleanEqual_Expression.snap | 6 +++--- ...leTests.Create_NullableBooleanNotEqual_Expression.snap | 6 +++--- ...facesTests.Create_InterfaceStringEqual_Expression.snap | 2 +- ...e_ArrayObjectNestedArrayAnyStringEqual_Expression.snap | 2 +- ..._ArrayObjectNestedArraySomeStringEqual_Expression.snap | 2 +- ...itorObjectTests.Create_ObjectEnumEqual_Expression.snap | 2 +- ...torObjectTests.Create_ObjectShortEqual_Expression.snap | 2 +- ...isitorObjectTests.Create_ObjectShortIn_Expression.snap | 2 +- ...orObjectTests.Create_ObjectStringEqual_Expression.snap | 2 +- ...sitorObjectTests.Create_ObjectStringIn_Expression.snap | 2 +- ...ingTests.Create_NullableStringContains_Expression.snap | 2 +- ...ingTests.Create_NullableStringEndsWith_Expression.snap | 2 +- ...gTests.Create_NullableStringNoContains_Expression.snap | 2 +- ...Tests.Create_NullableStringNotEndsWith_Expression.snap | 2 +- ...sts.Create_NullableStringNotStartsWith_Expression.snap | 2 +- ...gTests.Create_NullableStringStartsWith_Expression.snap | 2 +- ...sitorStringTests.Create_StringContains_Expression.snap | 2 +- ...sitorStringTests.Create_StringEndsWith_Expression.snap | 2 +- ...rVisitorStringTests.Create_StringEqual_Expression.snap | 2 +- ...lterVisitorStringTests.Create_StringIn_Expression.snap | 2 +- ...torStringTests.Create_StringNoContains_Expression.snap | 2 +- ...orStringTests.Create_StringNotEndsWith_Expression.snap | 2 +- ...sitorStringTests.Create_StringNotEqual_Expression.snap | 2 +- ...rVisitorStringTests.Create_StringNotIn_Expression.snap | 2 +- ...StringTests.Create_StringNotStartsWith_Expression.snap | 2 +- ...torStringTests.Create_StringStartsWith_Expression.snap | 2 +- ...sitorComparableTests.Create_ShortEqual_Expression.snap | 2 +- ...arableTests.Create_ShortEqual_Expression_DateTime.snap | 2 +- ...eTests.Create_ShortGreaterThanOrEquals_Expression.snap | 2 +- ...omparableTests.Create_ShortGreaterThan_Expression.snap | 2 +- ...rVisitorComparableTests.Create_ShortIn_Expression.snap | 2 +- ...bleTests.Create_ShortLowerThanOrEquals_Expression.snap | 2 +- ...rComparableTests.Create_ShortLowerThan_Expression.snap | 2 +- ...orComparableTests.Create_ShortNotEqual_Expression.snap | 2 +- ...sts.Create_ShortNotGreaterThanOrEquals_Expression.snap | 2 +- ...arableTests.Create_ShortNotGreaterThan_Expression.snap | 2 +- ...sitorComparableTests.Create_ShortNotIn_Expression.snap | 2 +- ...Tests.Create_ShortNotLowerThanOrEquals_Expression.snap | 2 +- ...mparableTests.Create_ShortNotLowerThan_Expression.snap | 2 +- ...reate_ShortNullableGreaterThanOrEquals_Expression.snap | 2 +- ...eTests.Create_ShortNullableGreaterThan_Expression.snap | 2 +- ....Create_ShortNullableLowerThanOrEquals_Expression.snap | 2 +- ...bleTests.Create_ShortNullableLowerThan_Expression.snap | 2 +- ...te_ShortNullableNotGreaterThanOrEquals_Expression.snap | 2 +- ...sts.Create_ShortNullableNotGreaterThan_Expression.snap | 2 +- ...eate_ShortNullableNotLowerThanOrEquals_Expression.snap | 2 +- ...Tests.Create_ShortNullableNotLowerThan_Expression.snap | 2 +- ...ilterVisitorEnumTests.Create_EnumEqual_Expression.snap | 2 +- ...erVisitorEnumTests.Create_EnumNotEqual_Expression.snap | 2 +- ...Tests.Create_ArrayAnyObjectStringEqual_Expression.snap | 8 +------- ...orListTests.Create_ArrayAnyStringEqual_Expression.snap | 8 +------- ...itorObjectIdTests.Create_ObjectIdEqual_Expression.snap | 2 +- ...sts.Create_ObjectIdGreaterThanOrEquals_Expression.snap | 2 +- ...jectIdTests.Create_ObjectIdGreaterThan_Expression.snap | 2 +- ...VisitorObjectIdTests.Create_ObjectIdIn_Expression.snap | 4 ++-- ...Tests.Create_ObjectIdLowerThanOrEquals_Expression.snap | 2 +- ...ObjectIdTests.Create_ObjectIdLowerThan_Expression.snap | 2 +- ...rObjectIdTests.Create_ObjectIdNotEqual_Expression.snap | 2 +- ....Create_ObjectIdNotGreaterThanOrEquals_Expression.snap | 2 +- ...tIdTests.Create_ObjectIdNotGreaterThan_Expression.snap | 2 +- ...itorObjectIdTests.Create_ObjectIdNotIn_Expression.snap | 4 ++-- ...ts.Create_ObjectIdNotLowerThanOrEquals_Expression.snap | 2 +- ...ectIdTests.Create_ObjectIdNotLowerThan_Expression.snap | 2 +- ...te_ObjectIdNullableGreaterThanOrEquals_Expression.snap | 2 +- ...sts.Create_ObjectIdNullableGreaterThan_Expression.snap | 2 +- ...eate_ObjectIdNullableLowerThanOrEquals_Expression.snap | 2 +- ...Tests.Create_ObjectIdNullableLowerThan_Expression.snap | 2 +- ...ObjectIdNullableNotGreaterThanOrEquals_Expression.snap | 2 +- ....Create_ObjectIdNullableNotGreaterThan_Expression.snap | 2 +- ...e_ObjectIdNullableNotLowerThanOrEquals_Expression.snap | 2 +- ...ts.Create_ObjectIdNullableNotLowerThan_Expression.snap | 2 +- ...e_ArrayObjectNestedArrayAnyStringEqual_Expression.snap | 2 +- ..._ArrayObjectNestedArraySomeStringEqual_Expression.snap | 2 +- ...itorObjectTests.Create_ObjectEnumEqual_Expression.snap | 2 +- ...torObjectTests.Create_ObjectShortEqual_Expression.snap | 2 +- ...isitorObjectTests.Create_ObjectShortIn_Expression.snap | 2 +- ...orObjectTests.Create_ObjectStringEqual_Expression.snap | 2 +- ...sitorObjectTests.Create_ObjectStringIn_Expression.snap | 2 +- ...ingTests.Create_NullableStringContains_Expression.snap | 2 +- ...ingTests.Create_NullableStringEndsWith_Expression.snap | 2 +- ...gTests.Create_NullableStringNoContains_Expression.snap | 2 +- ...Tests.Create_NullableStringNotEndsWith_Expression.snap | 2 +- ...sts.Create_NullableStringNotStartsWith_Expression.snap | 2 +- ...gTests.Create_NullableStringStartsWith_Expression.snap | 2 +- ...sitorStringTests.Create_StringContains_Expression.snap | 2 +- ...sitorStringTests.Create_StringEndsWith_Expression.snap | 2 +- ...rVisitorStringTests.Create_StringEqual_Expression.snap | 2 +- ...lterVisitorStringTests.Create_StringIn_Expression.snap | 2 +- ...torStringTests.Create_StringNoContains_Expression.snap | 2 +- ...orStringTests.Create_StringNotEndsWith_Expression.snap | 2 +- ...sitorStringTests.Create_StringNotEqual_Expression.snap | 2 +- ...rVisitorStringTests.Create_StringNotIn_Expression.snap | 2 +- ...StringTests.Create_StringNotStartsWith_Expression.snap | 2 +- ...torStringTests.Create_StringStartsWith_Expression.snap | 2 +- 120 files changed, 130 insertions(+), 142 deletions(-) diff --git a/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy.snap b/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy.snap index 525da4a0f63..542eaa94c2b 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy.snap +++ b/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy.snap @@ -1,4 +1,4 @@ -ASC +ASC Result: --------------- { "data": { @@ -14,7 +14,7 @@ ASC } --------------- -DESC +DESC Result: --------------- { "data": { diff --git a/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy_Nullable.snap b/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy_Nullable.snap index 2467c103df3..69eeef13807 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy_Nullable.snap +++ b/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy_Nullable.snap @@ -1,4 +1,4 @@ -ASC +ASC Result: --------------- { "data": { @@ -17,7 +17,7 @@ ASC } --------------- -DESC +DESC Result: --------------- { "data": { diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap index 9d664651e49..ad63538c4b1 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap @@ -34,7 +34,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) = :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap index 6284670e2f8..b25819d55d1 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) >= :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap index 4964357a962..e8c0f6f30a5 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) > :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap index 196683052a5..6982c256765 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap @@ -40,7 +40,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) = ANY(:p0); --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap index 497d88db3f9..1ee73e08665 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) <= :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap index 274f5fbee94..40f51eb0847 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) < :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap index 902b6e15432..68e5a715b7d 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap @@ -40,7 +40,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) != :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap index 4d91013853e..d91b67ff3a1 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) < :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap index 0dc47d1743d..ed961e97c1d 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) <= :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap index 641be1f494e..bce62f3fcd8 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap @@ -34,7 +34,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where NOT(CAST(d.data ->> 'BarShort' as smallint) = ANY(:p0)); --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap index 25299d98706..7cbc694e5ef 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) > :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap index a3c329c35c9..ffb12daa1fd 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) >= :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap index e35ae1cf93a..6031a33ee99 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) >= :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap index ecef54ecd80..4f7815e7e88 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) > :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap index 6f65edf4cb3..2986668bef1 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) <= :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap index e38dac84f61..ce5e6ffe92a 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) < :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap index bd6ffe01c74..aad4a8145b1 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) < :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap index 8da1294e362..c38640c9ab9 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) <= :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap index 1be2c298ae5..bb2d252ab5f 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) > :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap index 2742e0aa134..4b9e9629ef9 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) >= :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap index 3a4893aecd9..7beb1da1bb5 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap @@ -34,7 +34,7 @@ FOO SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorenumtests_foo as d where CAST(d.data ->> 'BarEnum' as integer) = :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap index 9324d482e0d..aa09e8a6b35 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap @@ -46,7 +46,7 @@ FOO SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorenumtests_foo as d where CAST(d.data ->> 'BarEnum' as integer) != :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap index 8b8cc61d61e..55163c748e4 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap @@ -1,4 +1,4 @@ -true +true Result: --------------- { "data": { @@ -11,7 +11,7 @@ true } --------------- -false +false Result: --------------- { "data": { diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap index 781a8171442..d4617d5800e 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap @@ -1,4 +1,4 @@ -true +true Result: --------------- { "data": { @@ -11,7 +11,7 @@ true } --------------- -false +false Result: --------------- { "data": { diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap index 526c3ab37d4..46a9da34a95 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap @@ -1,4 +1,4 @@ -true +true Result: --------------- { "data": { @@ -11,7 +11,7 @@ true } --------------- -false +false Result: --------------- { "data": { @@ -24,7 +24,7 @@ false } --------------- -null +null Result: --------------- { "data": { diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap index 65cba4cbaaf..f0f1e7dce44 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap @@ -1,4 +1,4 @@ -true +true Result: --------------- { "data": { @@ -11,7 +11,7 @@ true } --------------- -false +false Result: --------------- { "data": { @@ -24,7 +24,7 @@ false } --------------- -null +null Result: --------------- { "data": { diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap index 7fb65257812..194266d6141 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap @@ -38,7 +38,7 @@ ba SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorinterfacestests_barinterface as d where d.data -> 'Test' ->> 'Prop' = :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap index 110d08d14de..fa959b41c34 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap @@ -55,7 +55,7 @@ true SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where d.data @? '$ ? (@.Foo.ObjectArray[*] != null && @.Foo.ObjectArray[*].size() > 0)'; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap index 2d3d682d038..8ea019dcad4 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap @@ -50,7 +50,7 @@ b SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where d.data -> 'Foo' -> 'ObjectArray' @> :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap index 6402c699804..287a208d587 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap @@ -38,7 +38,7 @@ FOO SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where CAST(d.data -> 'Foo' ->> 'BarEnum' as integer) = :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap index 34748cb32a2..d48ddcc6b56 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap @@ -38,7 +38,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where CAST(d.data -> 'Foo' ->> 'BarShort' as smallint) = :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap index d47281ab8e8..f078aa87ab8 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap @@ -48,7 +48,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where CAST(d.data -> 'Foo' ->> 'BarShort' as smallint) = ANY(:p0); --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap index 2667f832c49..77aab7f82f2 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap @@ -38,7 +38,7 @@ testbtest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where d.data -> 'Foo' ->> 'BarString' = :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap index ad98869e30c..843a95e9d96 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap @@ -23,7 +23,7 @@ testatestAndtestb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where d.data -> 'Foo' ->> 'BarString' = ANY(:p0); --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap index 34307dd2dbf..61deb4142c8 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap @@ -34,7 +34,7 @@ b SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap index f60a934b19b..1e5d131af03 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap index b801ee30046..273d9b4f0af 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap @@ -40,7 +40,7 @@ b SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where (d.data ->> 'Bar' is null or NOT(d.data ->> 'Bar' LIKE :p0)); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap index 4c72526e216..5923753c58c 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap @@ -40,7 +40,7 @@ btest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where NOT((d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0)); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap index 3e42e037d9b..75a63afd21c 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap @@ -40,7 +40,7 @@ testb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where NOT((d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0)); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap index 4fff482f4a4..6bc7387373c 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap index 5098d6c46b7..f813c451b35 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap @@ -34,7 +34,7 @@ b SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression.snap index 4807594d7ee..a37ae0809f8 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap index 0dc11d7c231..ad1670d4bf2 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap @@ -34,7 +34,7 @@ testbtest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where d.data ->> 'Bar' = :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap index 61d0456ea5c..97b980ac3c1 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap @@ -19,7 +19,7 @@ testatestAndtestb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where d.data ->> 'Bar' = ANY(:p0); --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression.snap index 3ef43e331e2..57567417611 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression.snap @@ -34,7 +34,7 @@ b SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where (d.data ->> 'Bar' is null or NOT(d.data ->> 'Bar' LIKE :p0)); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap index f24a9529bdd..a94fa902164 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where NOT((d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0)); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap index 3fc25b3d25e..15da25eee93 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap @@ -34,7 +34,7 @@ testbtest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where d.data ->> 'Bar' != :p0; --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression.snap index 4001c08d908..4bfa330c898 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression.snap @@ -12,7 +12,7 @@ testatestAndtestb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where NOT(d.data ->> 'Bar' = ANY(:p0)); --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap index 5b101e8cf81..541e50edcf7 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where NOT((d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0)); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression.snap index a51eb2744d0..e4beff15da8 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression.snap index 5dfbc6aeee4..ee7b50465d0 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression.snap @@ -34,7 +34,7 @@ find({ "BarShort" : { "$eq" : 12 } }) find({ "BarShort" : { "$eq" : 13 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression_DateTime.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression_DateTime.snap index 03648b1060b..2118a0e414a 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression_DateTime.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression_DateTime.snap @@ -34,7 +34,7 @@ find({ "BarDateTime" : { "$eq" : { "$date" : "2000-01-12T00:00:00Z" } } }) find({ "BarDateTime" : { "$eq" : { "$date" : "2000-01-12T00:00:00Z" } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap index a24b8c83e89..85dc64cf6ef 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$gte" : 13 } }) find({ "BarShort" : { "$gte" : 14 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap index 247232deff8..ffb74bf8c4f 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$gt" : 13 } }) find({ "BarShort" : { "$gt" : 14 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortIn_Expression.snap index 2b493d44f3a..79efb1e3843 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortIn_Expression.snap @@ -40,7 +40,7 @@ find({ "BarShort" : { "$in" : [12, 13] } }) find({ "BarShort" : { "$in" : [13, 14] } }) --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap index 4a626a05f34..bc058a527fc 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$lte" : 13 } }) find({ "BarShort" : { "$lte" : 14 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap index ee8746b1d7c..37607a2b865 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$lt" : 13 } }) find({ "BarShort" : { "$lt" : 14 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap index eeb20301bac..04cd41f0a0e 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap @@ -40,7 +40,7 @@ find({ "BarShort" : { "$ne" : 12 } }) find({ "BarShort" : { "$ne" : 13 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap index 08b0ef424f8..74d9f38336f 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$not" : { "$gte" : 13 } } }) find({ "BarShort" : { "$not" : { "$gte" : 14 } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap index d289dd3e976..49392002b89 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$not" : { "$gt" : 13 } } }) find({ "BarShort" : { "$not" : { "$gt" : 14 } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap index 8fe2d020666..51dcd37a43c 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap @@ -34,7 +34,7 @@ find({ "BarShort" : { "$nin" : [12, 13] } }) find({ "BarShort" : { "$nin" : [13, 14] } }) --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap index 077132d6bc6..1cd4ac6d8ee 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$not" : { "$lte" : 13 } } }) find({ "BarShort" : { "$not" : { "$lte" : 14 } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap index 4ee1529d33f..8cd1e54abf8 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$not" : { "$lt" : 13 } } }) find({ "BarShort" : { "$not" : { "$lt" : 14 } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap index a24b8c83e89..85dc64cf6ef 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$gte" : 13 } }) find({ "BarShort" : { "$gte" : 14 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap index 247232deff8..ffb74bf8c4f 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$gt" : 13 } }) find({ "BarShort" : { "$gt" : 14 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap index 4a626a05f34..bc058a527fc 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$lte" : 13 } }) find({ "BarShort" : { "$lte" : 14 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap index ee8746b1d7c..37607a2b865 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$lt" : 13 } }) find({ "BarShort" : { "$lt" : 14 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap index 9518e642a46..9672f644eea 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$not" : { "$gte" : 13 } } }) find({ "BarShort" : { "$not" : { "$gte" : 14 } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap index 4adeeeba433..1c335159f24 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap @@ -70,7 +70,7 @@ find({ "BarShort" : { "$not" : { "$gt" : 13 } } }) find({ "BarShort" : { "$not" : { "$gt" : 14 } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap index 424364f93ae..e0ce8bb0c62 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$not" : { "$lte" : 13 } } }) find({ "BarShort" : { "$not" : { "$lte" : 14 } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap index 042082fa371..e71a7e932c9 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap @@ -70,7 +70,7 @@ find({ "BarShort" : { "$not" : { "$lt" : 13 } } }) find({ "BarShort" : { "$not" : { "$lt" : 14 } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumEqual_Expression.snap index 4f913bed417..bf83af3e4b5 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumEqual_Expression.snap @@ -34,7 +34,7 @@ FOO Query: find({ "BarEnum" : { "$eq" : 0 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap index e2a27d53d4e..25b90b42c19 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap @@ -46,7 +46,7 @@ FOO Query: find({ "BarEnum" : { "$ne" : 0 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap index 3b95b4983e5..a624b484abd 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap @@ -99,18 +99,12 @@ true Query: find({ "FooNested" : { "$exists" : true, "$nin" : [[], null] } }) --------------- -null +null Result: --------------- { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "root" ] diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyStringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyStringEqual_Expression.snap index dde78a986be..80371808451 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyStringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyStringEqual_Expression.snap @@ -69,18 +69,12 @@ true Query: find({ "Bar" : { "$exists" : true, "$nin" : [[], null] } }) --------------- -null +null Result: --------------- { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "root" ] diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdEqual_Expression.snap index fda2c155676..dcf7e70b887 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdEqual_Expression.snap @@ -34,7 +34,7 @@ find({ "ObjectId" : { "$eq" : { "$oid" : "6124e80f3f5fc839830c1f69" } } }) find({ "ObjectId" : { "$eq" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThanOrEquals_Expression.snap index ac7fa43e507..e31f957cecd 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThan_Expression.snap index c5c9347fbdf..468f2b60cb6 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThan_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdIn_Expression.snap index 91f72e7ffb6..ebd861fa248 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdIn_Expression.snap @@ -19,7 +19,7 @@ find({ "ObjectId" : { "$in" : [{ "$oid" : "6124e80f3f5fc839830c1f69" }, { "$oid" : "6124e80f3f5fc839830c1f6a" }] } }) --------------- -band6124e80f3f5fc839830c1f6b +band6124e80f3f5fc839830c1f6b Result: --------------- { "errors": [ @@ -47,7 +47,7 @@ band6124e80f3f5fc839830c1f6b } --------------- -nullAnd6124e80f3f5fc839830c1f6b +nullAnd6124e80f3f5fc839830c1f6b Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThanOrEquals_Expression.snap index 77fe3ab8e0c..3cc3d5d703c 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThan_Expression.snap index c42247eaaeb..eee4e5f0e35 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThan_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotEqual_Expression.snap index 97056f91d1e..d39971e366f 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotEqual_Expression.snap @@ -40,7 +40,7 @@ find({ "ObjectId" : { "$ne" : { "$oid" : "6124e80f3f5fc839830c1f69" } } }) find({ "ObjectId" : { "$ne" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThanOrEquals_Expression.snap index 23fc2d5722c..64133e0e580 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$not" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6a" find({ "ObjectId" : { "$not" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThan_Expression.snap index c6f0601c816..7b860e2c84e 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThan_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$not" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } find({ "ObjectId" : { "$not" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotIn_Expression.snap index 1400647e922..4616438fd2b 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotIn_Expression.snap @@ -16,7 +16,7 @@ find({ "ObjectId" : { "$nin" : [{ "$oid" : "6124e80f3f5fc839830c1f69" }, { "$oid" : "6124e80f3f5fc839830c1f6a" }] } }) --------------- -band6124e80f3f5fc839830c1f6b +band6124e80f3f5fc839830c1f6b Result: --------------- { "errors": [ @@ -44,7 +44,7 @@ band6124e80f3f5fc839830c1f6b } --------------- -nullAnd6124e80f3f5fc839830c1f6b +nullAnd6124e80f3f5fc839830c1f6b Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThanOrEquals_Expression.snap index eca158a25ac..5a1bebae615 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$not" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6a" find({ "ObjectId" : { "$not" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThan_Expression.snap index eb8901a3e62..6993fea8ef8 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThan_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$not" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } find({ "ObjectId" : { "$not" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThanOrEquals_Expression.snap index f8b7ccb0cae..f4f34187b8d 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThan_Expression.snap index 4680a3a0295..8cc197078a4 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThan_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThanOrEquals_Expression.snap index f83ee701c0b..ab75c753054 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThan_Expression.snap index 63462078484..4be85056135 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThan_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThanOrEquals_Expression.snap index 9ef0540b561..1d718939668 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$not" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6a" find({ "ObjectId" : { "$not" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThan_Expression.snap index 1e86c80379e..0c0f3b98697 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThan_Expression.snap @@ -70,7 +70,7 @@ find({ "ObjectId" : { "$not" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } find({ "ObjectId" : { "$not" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThanOrEquals_Expression.snap index e2baf77f7ef..8a50a2ad1d1 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$not" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6a" find({ "ObjectId" : { "$not" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThan_Expression.snap index 8d0eb73f8b9..9464074be5a 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThan_Expression.snap @@ -70,7 +70,7 @@ find({ "ObjectId" : { "$not" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } find({ "ObjectId" : { "$not" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap index 9c00351babe..1b82f183ef5 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap @@ -55,7 +55,7 @@ true Query: find({ "Foo.ObjectArray" : { "$exists" : true, "$nin" : [[], null] } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap index 53c272cc366..b599d8521c1 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap @@ -50,7 +50,7 @@ d Query: find({ "Foo.ObjectArray" : { "$elemMatch" : { "Foo.BarString" : { "$eq" : "d" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap index e3ab6294bda..e5dba09a610 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap @@ -38,7 +38,7 @@ FOO Query: find({ "Foo.BarEnum" : { "$eq" : 0 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap index 8ad817cda91..3c61372eed9 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap @@ -38,7 +38,7 @@ find({ "Foo.BarShort" : { "$eq" : 12 } }) find({ "Foo.BarShort" : { "$eq" : 13 } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap index eff21d0ce65..3e12ce2f5ff 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap @@ -48,7 +48,7 @@ find({ "Foo.BarShort" : { "$in" : [12, 13] } }) find({ "Foo.BarShort" : { "$in" : [13, 14] } }) --------------- -nullAnd14 +nullAnd14 Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap index 03d8d6ea751..230677ec1e3 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap @@ -38,7 +38,7 @@ testbtest Query: find({ "Foo.BarString" : { "$eq" : "testbtest" } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap index da34dcb0d3e..94f985902ce 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap @@ -23,7 +23,7 @@ testatestAndtestb Query: find({ "Foo.BarString" : { "$in" : ["testatest", "testbtest"] } }) --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringContains_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringContains_Expression.snap index b970c289968..91f8d400ff4 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringContains_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringContains_Expression.snap @@ -34,7 +34,7 @@ b Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "b", "options" : "" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap index 50a8970cefc..d430372a865 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "btest$", "options" : "" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap index fbe322c91e6..131a37c6ee0 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap @@ -40,7 +40,7 @@ b Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "b", "options" : "" } } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap index 8530ebf4732..e6fd2a5cef0 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap @@ -40,7 +40,7 @@ btest Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "btest$", "options" : "" } } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap index d94dc0d63ee..0df314b4166 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap @@ -40,7 +40,7 @@ testb Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "^testb", "options" : "" } } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap index e3065608b4e..96ad5acfd18 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "^testb", "options" : "" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringContains_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringContains_Expression.snap index b970c289968..91f8d400ff4 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringContains_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringContains_Expression.snap @@ -34,7 +34,7 @@ b Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "b", "options" : "" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEndsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEndsWith_Expression.snap index 50a8970cefc..d430372a865 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEndsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "btest$", "options" : "" } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEqual_Expression.snap index 9204c6f7cfa..cb5aa9bf816 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEqual_Expression.snap @@ -34,7 +34,7 @@ testbtest Query: find({ "Bar" : { "$eq" : "testbtest" } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringIn_Expression.snap index d64528453df..3bcda61b9f0 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringIn_Expression.snap @@ -19,7 +19,7 @@ testatestAndtestb Query: find({ "Bar" : { "$in" : ["testatest", "testbtest"] } }) --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNoContains_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNoContains_Expression.snap index 0fe3a7a01fe..811c11bfc12 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNoContains_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNoContains_Expression.snap @@ -34,7 +34,7 @@ b Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "b", "options" : "" } } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap index c8a138b9a9b..2bca10e8147 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "btest$", "options" : "" } } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEqual_Expression.snap index 487d8c434ac..7cb65a85f76 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEqual_Expression.snap @@ -34,7 +34,7 @@ testbtest Query: find({ "Bar" : { "$ne" : "testbtest" } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotIn_Expression.snap index 9081fca6c04..181f0862d38 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotIn_Expression.snap @@ -12,7 +12,7 @@ testatestAndtestb Query: find({ "Bar" : { "$nin" : ["testatest", "testbtest"] } }) --------------- -testbtestAndNull +testbtestAndNull Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap index b0350061361..cff806ba4a4 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "^testb", "options" : "" } } } } }) --------------- -null +null Result: --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringStartsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringStartsWith_Expression.snap index e3065608b4e..96ad5acfd18 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringStartsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "^testb", "options" : "" } } } }) --------------- -null +null Result: --------------- { "errors": [ From d1a0151d2b93c66ce7a4064b12697fdf71fc4b13 Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Fri, 16 Jan 2026 09:51:33 +0200 Subject: [PATCH 112/144] Removed usage of the JSON type from the MCP adapter tests --- .../test/Adapters.Mcp.Tests/TestSchema.cs | 21 ++++++------------- .../GetWithDefaultedVariables.graphql | 4 ---- .../GetWithNonNullableVariables.graphql | 3 --- .../GetWithNullableVariables.graphql | 3 --- ...aultedVariables_ReturnsExpectedResult.json | 3 --- ...llableVariables_ReturnsExpectedResult.json | 3 --- ...llableVariables_ReturnsExpectedResult.json | 1 - ...dVariables_CreatesCorrectSchema_Input.json | 14 ------------- ...Variables_CreatesCorrectSchema_Output.json | 11 ---------- ...eVariables_CreatesCorrectSchema_Input.json | 12 ----------- ...Variables_CreatesCorrectSchema_Output.json | 11 ---------- ...eVariables_CreatesCorrectSchema_Input.json | 12 ----------- ...Variables_CreatesCorrectSchema_Output.json | 12 ----------- 13 files changed, 6 insertions(+), 104 deletions(-) diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/TestSchema.cs b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/TestSchema.cs index b3374801dae..b86afbad358 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/TestSchema.cs +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/TestSchema.cs @@ -19,7 +19,7 @@ public sealed class Query public Book[] GetBooks() => [new("Title")]; public ResultNullable GetWithNullableVariables( - [GraphQLType<AnyType>] object? any, + JsonElement? any, bool? boolean, byte? @byte, [GraphQLType<ByteArrayType>] byte[]? byteArray, @@ -30,7 +30,6 @@ public ResultNullable GetWithNullableVariables( float? @float, [GraphQLType<IdType>] string? id, int? @int, - JsonElement? json, string?[]? list, DateOnly? localDate, [GraphQLType<LocalDateTimeType>] DateTime? localDateTime, @@ -56,7 +55,6 @@ public ResultNullable GetWithNullableVariables( @float, id, @int, - json, list, localDate, localDateTime, @@ -71,7 +69,7 @@ public ResultNullable GetWithNullableVariables( uuid); public ResultNonNullable GetWithNonNullableVariables( - [GraphQLType<NonNullType<AnyType>>] object any, + JsonElement any, bool boolean, byte @byte, [GraphQLType<NonNullType<ByteArrayType>>] byte[] byteArray, @@ -82,7 +80,6 @@ public ResultNonNullable GetWithNonNullableVariables( float @float, [GraphQLType<NonNullType<IdType>>] string id, int @int, - JsonElement json, string[] list, DateOnly localDate, [GraphQLType<NonNullType<LocalDateTimeType>>] DateTime localDateTime, @@ -108,7 +105,6 @@ public ResultNonNullable GetWithNonNullableVariables( @float, id, @int, - json, list, localDate, localDateTime, @@ -123,7 +119,7 @@ public ResultNonNullable GetWithNonNullableVariables( uuid); public ResultDefaulted GetWithDefaultedVariables( - [GraphQLType<NonNullType<AnyType>>] object any, + JsonElement any, bool boolean, byte @byte, [GraphQLType<NonNullType<ByteArrayType>>] byte[] byteArray, @@ -134,7 +130,6 @@ public ResultDefaulted GetWithDefaultedVariables( float @float, [GraphQLType<NonNullType<IdType>>] string id, int @int, - JsonElement json, string[] list, DateOnly localDate, [GraphQLType<NonNullType<LocalDateTimeType>>] DateTime localDateTime, @@ -160,7 +155,6 @@ public ResultDefaulted GetWithDefaultedVariables( @float, id, @int, - json, list, localDate, localDateTime, @@ -328,7 +322,7 @@ public sealed record ObjectWithOneOfField( OneOf Field); public sealed record ResultNullable( - [property: GraphQLType<AnyType>] object? Any, + JsonElement? Any, bool? Boolean, byte? Byte, [property: GraphQLType<ByteArrayType>] byte[]? ByteArray, @@ -339,7 +333,6 @@ public sealed record ResultNullable( float? Float, [property: GraphQLType<IdType>] string? Id, int? Int, - JsonElement? Json, string?[]? List, DateOnly? LocalDate, [property: GraphQLType<LocalDateTimeType>] DateTime? LocalDateTime, @@ -354,7 +347,7 @@ public sealed record ResultNullable( Guid? Uuid); public sealed record ResultNonNullable( - [property: GraphQLType<NonNullType<AnyType>>] object Any, + JsonElement Any, bool Boolean, byte Byte, [property: GraphQLType<NonNullType<ByteArrayType>>] byte[] ByteArray, @@ -365,7 +358,6 @@ public sealed record ResultNonNullable( float Float, [property: GraphQLType<NonNullType<IdType>>] string Id, int Int, - JsonElement Json, string[] List, DateOnly LocalDate, [property: GraphQLType<NonNullType<LocalDateTimeType>>] DateTime LocalDateTime, @@ -380,7 +372,7 @@ public sealed record ResultNonNullable( Guid Uuid); public sealed record ResultDefaulted( - [property: GraphQLType<NonNullType<AnyType>>] object Any, + JsonElement Any, bool Boolean, byte Byte, [property: GraphQLType<NonNullType<ByteArrayType>>] byte[] ByteArray, @@ -391,7 +383,6 @@ public sealed record ResultDefaulted( float Float, [property: GraphQLType<NonNullType<IdType>>] string Id, int Int, - JsonElement Json, string[] List, DateOnly LocalDate, [property: GraphQLType<NonNullType<LocalDateTimeType>>] DateTime LocalDateTime, diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithDefaultedVariables.graphql b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithDefaultedVariables.graphql index fea12117b67..b972087aeb5 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithDefaultedVariables.graphql +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithDefaultedVariables.graphql @@ -22,8 +22,6 @@ query GetWithDefaultedVariables( $id: ID! = "default" "Int description" $int: Int! = 1 - "JSON description" - $json: JSON! = { key: "value" } "List description" $list: [String!]! = ["default"] "LocalDate description" @@ -61,7 +59,6 @@ query GetWithDefaultedVariables( float: $float id: $id int: $int - json: $json list: $list localDate: $localDate localDateTime: $localDateTime @@ -86,7 +83,6 @@ query GetWithDefaultedVariables( float id int - json list localDate localDateTime diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithNonNullableVariables.graphql b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithNonNullableVariables.graphql index 3288de3c94d..e468a95fa50 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithNonNullableVariables.graphql +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithNonNullableVariables.graphql @@ -11,7 +11,6 @@ query GetWithNonNullableVariables( "Float description" $float: Float! "ID description" $id: ID! "Int description" $int: Int! - "JSON description" $json: JSON! "List description" $list: [String!]! "LocalDate description" $localDate: LocalDate! "LocalDateTime description" $localDateTime: LocalDateTime! @@ -37,7 +36,6 @@ query GetWithNonNullableVariables( float: $float id: $id int: $int - json: $json list: $list localDate: $localDate localDateTime: $localDateTime @@ -62,7 +60,6 @@ query GetWithNonNullableVariables( float id int - json list localDate localDateTime diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithNullableVariables.graphql b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithNullableVariables.graphql index 4fcd98e4d0e..144a6817be5 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithNullableVariables.graphql +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__resources__/GetWithNullableVariables.graphql @@ -11,7 +11,6 @@ query GetWithNullableVariables( "Float description" $float: Float "ID description" $id: ID "Int description" $int: Int - "JSON description" $json: JSON "List description" $list: [String] "LocalDate description" $localDate: LocalDate "LocalDateTime description" $localDateTime: LocalDateTime @@ -37,7 +36,6 @@ query GetWithNullableVariables( float: $float id: $id int: $int - json: $json list: $list localDate: $localDate localDateTime: $localDateTime @@ -62,7 +60,6 @@ query GetWithNullableVariables( float id int - json list localDate localDateTime diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithDefaultedVariables_ReturnsExpectedResult.json b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithDefaultedVariables_ReturnsExpectedResult.json index 5cea0549974..16dfae86f31 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithDefaultedVariables_ReturnsExpectedResult.json +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithDefaultedVariables_ReturnsExpectedResult.json @@ -14,9 +14,6 @@ "float": 1.5, "id": "default", "int": 1, - "json": { - "key": "value" - }, "list": [ "default" ], diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithNonNullableVariables_ReturnsExpectedResult.json b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithNonNullableVariables_ReturnsExpectedResult.json index a8a85ba6340..5a17ceb46e2 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithNonNullableVariables_ReturnsExpectedResult.json +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithNonNullableVariables_ReturnsExpectedResult.json @@ -14,9 +14,6 @@ "float": 1.5, "id": "test", "int": 1, - "json": { - "key": "value" - }, "list": [ "test" ], diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithNullableVariables_ReturnsExpectedResult.json b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithNullableVariables_ReturnsExpectedResult.json index a91766e774b..a4b42cf16c3 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithNullableVariables_ReturnsExpectedResult.json +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/IntegrationTestBase.CallTool_GetWithNullableVariables_ReturnsExpectedResult.json @@ -12,7 +12,6 @@ "float": null, "id": null, "int": null, - "json": null, "list": null, "localDate": null, "localDateTime": null, diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Input.json b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Input.json index 2029763859c..f013d99d636 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Input.json +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Input.json @@ -76,20 +76,6 @@ "description": "Int description", "default": 1 }, - "json": { - "type": [ - "object", - "array", - "boolean", - "string", - "number", - "integer" - ], - "description": "JSON description", - "default": { - "key": "value" - } - }, "list": { "type": "array", "items": { diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Output.json b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Output.json index ff0282274db..7f9d51b690a 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Output.json +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Output.json @@ -61,16 +61,6 @@ "int": { "type": "integer" }, - "json": { - "type": [ - "object", - "array", - "boolean", - "string", - "number", - "integer" - ] - }, "list": { "type": "array", "items": { @@ -160,7 +150,6 @@ "float", "id", "int", - "json", "list", "localDate", "localDateTime", diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Input.json b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Input.json index 18247b997a7..5dc68e2734d 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Input.json +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Input.json @@ -63,17 +63,6 @@ "type": "integer", "description": "Int description" }, - "json": { - "type": [ - "object", - "array", - "boolean", - "string", - "number", - "integer" - ], - "description": "JSON description" - }, "list": { "type": "array", "items": { @@ -172,7 +161,6 @@ "float", "id", "int", - "json", "list", "localDate", "localDateTime", diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Output.json b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Output.json index 2e4f87c9340..f338d6c27d0 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Output.json +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Output.json @@ -61,16 +61,6 @@ "int": { "type": "integer" }, - "json": { - "type": [ - "object", - "array", - "boolean", - "string", - "number", - "integer" - ] - }, "list": { "type": "array", "items": { @@ -160,7 +150,6 @@ "float", "id", "int", - "json", "list", "localDate", "localDateTime", diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Input.json b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Input.json index e9323bd1351..eefceec75f9 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Input.json +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Input.json @@ -93,18 +93,6 @@ ], "description": "Int description" }, - "json": { - "type": [ - "object", - "array", - "boolean", - "string", - "number", - "integer", - "null" - ], - "description": "JSON description" - }, "list": { "type": [ "array", diff --git a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Output.json b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Output.json index 2a50653c621..951a4254b74 100644 --- a/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Output.json +++ b/src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Output.json @@ -91,17 +91,6 @@ "null" ] }, - "json": { - "type": [ - "object", - "array", - "boolean", - "string", - "number", - "integer", - "null" - ] - }, "list": { "type": [ "array", @@ -239,7 +228,6 @@ "float", "id", "int", - "json", "list", "localDate", "localDateTime", From 5ff833e15204f0d5beb37643d7e02c6dad9b55ad Mon Sep 17 00:00:00 2001 From: tobias-tengler <45513122+tobias-tengler@users.noreply.github.com> Date: Fri, 16 Jan 2026 08:57:56 +0100 Subject: [PATCH 113/144] Fix last failing OpenAPI test --- .../Endpoints/HttpEndpointIntegrationTestBase.cs | 2 +- .../docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/HttpEndpointIntegrationTestBase.cs b/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/HttpEndpointIntegrationTestBase.cs index d8af7bc46cf..47207e84030 100644 --- a/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/HttpEndpointIntegrationTestBase.cs +++ b/src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/HttpEndpointIntegrationTestBase.cs @@ -377,7 +377,7 @@ public async Task Http_Post_Empty_Object() // arrange var storage = new TestOpenApiDefinitionStorage( """ - query TestQuery($input: JSON! @body) @http(method: POST, route: "/example") { + query TestQuery($input: Any! @body) @http(method: POST, route: "/example") { json(input: $input) } """); diff --git a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md index 1b1d6ec9bed..1a0e1fc61a1 100644 --- a/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md +++ b/website/src/docs/hotchocolate/v16/migrating/migrate-from-15-to-16.md @@ -306,6 +306,7 @@ TODO ## AnyType TODO +`JsonElement` is now inferred as `Any` instead of `Json`. # Deprecations From 30a7304b2779c7b42f751f885b9d568213ec7e58 Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Fri, 16 Jan 2026 09:59:11 +0200 Subject: [PATCH 114/144] Added "RRGGBB" to dictionary --- dictionary.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/dictionary.txt b/dictionary.txt index cac59267011..2a4110b3b19 100644 --- a/dictionary.txt +++ b/dictionary.txt @@ -150,6 +150,7 @@ Rewriters Rgba Rhai Roslynator +RRGGBB runbooks Satisfiability Senn From ba2c6aff50a362a6c27b7f8594648ab39da6d404 Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Fri, 16 Jan 2026 10:28:26 +0200 Subject: [PATCH 115/144] Used Assert.Empty for errors --- .../Core/test/Execution.Tests/SchemaFirstTests.cs | 10 +++++----- .../QueryableFilterVisitorObjectTests.cs | 12 ++++++------ .../Data.Projections.Tests/SelectionContextTests.cs | 10 +++++----- .../IntegrationTests.cs | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/HotChocolate/Core/test/Execution.Tests/SchemaFirstTests.cs b/src/HotChocolate/Core/test/Execution.Tests/SchemaFirstTests.cs index 9fab0344ec7..2b4c581ec39 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/SchemaFirstTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/SchemaFirstTests.cs @@ -23,7 +23,7 @@ await schema.MakeExecutable().ExecuteAsync( "{ test testProp }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -55,7 +55,7 @@ await schema.MakeExecutable().ExecuteAsync( "{ foo(bar: { baz: \"hello\"}) }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -82,7 +82,7 @@ await schema.MakeExecutable().ExecuteAsync( "{ enumValue }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -109,7 +109,7 @@ await schema.MakeExecutable().ExecuteAsync( "{ setEnumValue(value:BAZ_BAR) }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } @@ -143,7 +143,7 @@ await schema.MakeExecutable().ExecuteAsync( "{ enumInInputObject(payload: { value:BAZ } ) }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); result.MatchSnapshot(); } diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/QueryableFilterVisitorObjectTests.cs b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/QueryableFilterVisitorObjectTests.cs index 947f3b61e8e..e3703118265 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/QueryableFilterVisitorObjectTests.cs +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/QueryableFilterVisitorObjectTests.cs @@ -669,9 +669,9 @@ public async Task Create_ObjectStringEqual_Flattened() .Build()); // assert - Assert.Null(Assert.IsType<OperationResult>(res1).Errors); - Assert.Null(Assert.IsType<OperationResult>(res2).Errors); - Assert.Null(Assert.IsType<OperationResult>(res3).Errors); + Assert.Empty(Assert.IsType<OperationResult>(res1).Errors); + Assert.Empty(Assert.IsType<OperationResult>(res2).Errors); + Assert.Empty(Assert.IsType<OperationResult>(res3).Errors); await Snapshot .Create( postFix: TestEnvironment.TargetFramework == "NET10_0" @@ -712,9 +712,9 @@ public async Task Create_ObjectStringEquals_Related_Flattened() .Build()); // assert - Assert.Null(Assert.IsType<OperationResult>(res1).Errors); - Assert.Null(Assert.IsType<OperationResult>(res2).Errors); - Assert.Null(Assert.IsType<OperationResult>(res3).Errors); + Assert.Empty(Assert.IsType<OperationResult>(res1).Errors); + Assert.Empty(Assert.IsType<OperationResult>(res2).Errors); + Assert.Empty(Assert.IsType<OperationResult>(res3).Errors); await Snapshot .Create( postFix: TestEnvironment.TargetFramework == "NET10_0" diff --git a/src/HotChocolate/Data/test/Data.Projections.Tests/SelectionContextTests.cs b/src/HotChocolate/Data/test/Data.Projections.Tests/SelectionContextTests.cs index 09c82840f63..4ef5d808183 100644 --- a/src/HotChocolate/Data/test/Data.Projections.Tests/SelectionContextTests.cs +++ b/src/HotChocolate/Data/test/Data.Projections.Tests/SelectionContextTests.cs @@ -65,7 +65,7 @@ void VisitFields(ISelectedField field) }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); string.Join("\n", list).MatchSnapshot(); } @@ -129,7 +129,7 @@ void VisitFields(ISelectedField field) }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); string.Join("\n", list).MatchSnapshot(); } @@ -215,7 +215,7 @@ ... on Bar { // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); string.Join("\n", list).MatchSnapshot(); } @@ -286,7 +286,7 @@ ... on Bar { }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); Assert.IsType<InvalidOperationException>(ex).Message.MatchSnapshot(); } @@ -356,7 +356,7 @@ void VisitFields(ISelectedField field) }"); // assert - Assert.Null(Assert.IsType<OperationResult>(result).Errors); + Assert.Empty(Assert.IsType<OperationResult>(result).Errors); string.Join("\n", list).MatchSnapshot(selectedField); } } diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs index 4aed775bc78..9d851752d07 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs @@ -134,7 +134,7 @@ public async Task ExecutePersistedOperation_Before_Expiration() var result = await executor.ExecuteAsync(OperationRequest.FromId(documentId)); // assert - Assert.Null(result.ExpectOperationResult().Errors); + Assert.Empty(result.ExpectOperationResult().Errors); result.MatchSnapshot(); } From b2b09c200a02b6f1bbe72b69d78569507923c91a Mon Sep 17 00:00:00 2001 From: tobias-tengler <45513122+tobias-tengler@users.noreply.github.com> Date: Fri, 16 Jan 2026 09:41:49 +0100 Subject: [PATCH 116/144] Fix variables being set as extensions --- .../Execution/OperationRequestBuilder.cs | 2 +- ...ildRequest_QueryAndSetNewVariableJson_RequestIsCreated.snap | 3 --- ...s.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap | 3 --- ...questBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap | 3 --- 4 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs index ceb634ad6db..3aa51005e04 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationRequestBuilder.cs @@ -558,7 +558,7 @@ public IOperationRequest Build() operationName: _operationName, errorHandlingMode: _errorHandlingMode, variableValues: _variableValues, - extensions: _variableValues, + extensions: _extensions, contextData: _readOnlyContextData ?? _contextData, features: features, services: _services, diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableJson_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableJson_RequestIsCreated.snap index bbb6341c0cb..4b33192a503 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableJson_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariableJson_RequestIsCreated.snap @@ -1,8 +1,5 @@ { "document": "{\n foo\n}", - "extensions": { - "one": "bar" - }, "variableValues": { "one": "bar" } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap index 89173ee120c..91f3b2e45a8 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_QueryAndSetNewVariable_RequestIsCreated.snap @@ -1,8 +1,5 @@ { "document": "{ foo }", - "extensions": { - "one": "bar" - }, "variableValues": { "one": "bar" } diff --git a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap index f9474877f42..7a27dfce3ed 100644 --- a/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap +++ b/src/HotChocolate/Core/test/Execution.Abstractions.Tests/Execution/__snapshots__/OperationRequestBuilderTests.BuildRequest_SetAll_RequestIsCreated.snap @@ -1,9 +1,6 @@ { "document": "{ foo }", "operationName": "bar", - "extensions": { - "two": "bar" - }, "contextData": { "one": "foo" }, From 2836df98376ee27dadf2b78e37d241efa9d1d6e3 Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Fri, 16 Jan 2026 10:56:34 +0200 Subject: [PATCH 117/144] JSON -> Any --- .../IntrospectionClientTests.IntrospectServer.snap | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/HotChocolate/Utilities/test/Utilities.Introspection.Tests/__snapshots__/IntrospectionClientTests.IntrospectServer.snap b/src/HotChocolate/Utilities/test/Utilities.Introspection.Tests/__snapshots__/IntrospectionClientTests.IntrospectServer.snap index 7c097b583a6..ef938b8b7c3 100644 --- a/src/HotChocolate/Utilities/test/Utilities.Introspection.Tests/__snapshots__/IntrospectionClientTests.IntrospectServer.snap +++ b/src/HotChocolate/Utilities/test/Utilities.Introspection.Tests/__snapshots__/IntrospectionClientTests.IntrospectServer.snap @@ -6,7 +6,7 @@ schema { type Query { hero(episode: Episode! = NEW_HOPE): Character - heroByTraits(traits: JSON!): Character + heroByTraits(traits: Any!): Character heroes(episodes: [Episode!]!): [Character!] character(characterIds: [String!]!): [Character!]! search(text: String!): [SearchResult] @@ -36,7 +36,7 @@ type Human implements Character { otherHuman: Human height(unit: Unit): Float homePlanet: String - traits: JSON + traits: Any } type Droid implements Character { @@ -46,7 +46,7 @@ type Droid implements Character { friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection height(unit: Unit): Float primaryFunction: String - traits: JSON + traits: Any } enum Episode { @@ -60,7 +60,7 @@ interface Character { name: String! friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection appearsIn: [Episode] - traits: JSON + traits: Any height(unit: Unit): Float } @@ -91,7 +91,7 @@ enum Unit { METERS } -scalar JSON +scalar Any type Starship { id: ID! From a02bd7e03ea05f116644851c4b215ff325218339 Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Fri, 16 Jan 2026 11:15:48 +0200 Subject: [PATCH 118/144] Used `IsEmpty` on ContextData in SnapshotExtensions --- .../CookieCrumble.HotChocolate/Extensions/SnapshotExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/SnapshotExtensions.cs b/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/SnapshotExtensions.cs index 89282a0a210..a993dfe6dc1 100644 --- a/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/SnapshotExtensions.cs +++ b/src/CookieCrumble/src/CookieCrumble.HotChocolate/Extensions/SnapshotExtensions.cs @@ -39,7 +39,7 @@ public static Snapshot AddResult( IExecutionResult result, string? name = null) { - if (result.ContextData is null) + if (result.ContextData.IsEmpty) { snapshot.Add(result.ToJson(), name); return snapshot; From 355a9a7303686b3244e7d9c2533fa8e5aa5a2a33 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 16 Jan 2026 10:44:31 +0100 Subject: [PATCH 119/144] Fixed variable coercion --- .../Types/Execution/Processing/VariableCoercionHelper.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs index 6698e4a9331..bc1920bd6ce 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/VariableCoercionHelper.cs @@ -187,14 +187,7 @@ private IValueNode CoerceInputLiteral( if (property.Value.ValueKind is JsonValueKind.Null) { - if (field.DefaultValue is not (null or NullValueNode)) - { - fields.Add(new ObjectFieldNode(field.Name, field.DefaultValue)); - } - else - { - fields.Add(new ObjectFieldNode(field.Name, NullValueNode.Default)); - } + fields.Add(new ObjectFieldNode(field.Name, NullValueNode.Default)); } else { From fe99bb6aa1ea15f5a23064f6bcddca0d61525ab3 Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Fri, 16 Jan 2026 12:16:03 +0200 Subject: [PATCH 120/144] Reverted incorrect snapshot changes --- ...omparableTests.Create_ShortEqual_Expression_NET10_0.snap | 2 +- ....Create_ShortGreaterThanOrEquals_Expression_NET10_0.snap | 2 +- ...bleTests.Create_ShortGreaterThan_Expression_NET10_0.snap | 2 +- ...orComparableTests.Create_ShortIn_Expression_NET10_0.snap | 2 +- ...ts.Create_ShortLowerThanOrEquals_Expression_NET10_0.snap | 2 +- ...rableTests.Create_ShortLowerThan_Expression_NET10_0.snap | 2 +- ...arableTests.Create_ShortNotEqual_Expression_NET10_0.snap | 2 +- ...eate_ShortNotGreaterThanOrEquals_Expression_NET10_0.snap | 2 +- ...Tests.Create_ShortNotGreaterThan_Expression_NET10_0.snap | 2 +- ...omparableTests.Create_ShortNotIn_Expression_NET10_0.snap | 2 +- ...Create_ShortNotLowerThanOrEquals_Expression_NET10_0.snap | 2 +- ...leTests.Create_ShortNotLowerThan_Expression_NET10_0.snap | 2 +- ...ShortNullableGreaterThanOrEquals_Expression_NET10_0.snap | 2 +- ....Create_ShortNullableGreaterThan_Expression_NET10_0.snap | 2 +- ...e_ShortNullableLowerThanOrEquals_Expression_NET10_0.snap | 2 +- ...ts.Create_ShortNullableLowerThan_Expression_NET10_0.snap | 2 +- ...rtNullableNotGreaterThanOrEquals_Expression_NET10_0.snap | 2 +- ...eate_ShortNullableNotGreaterThan_Expression_NET10_0.snap | 2 +- ...hortNullableNotLowerThanOrEquals_Expression_NET10_0.snap | 2 +- ...Create_ShortNullableNotLowerThan_Expression_NET10_0.snap | 2 +- ...isitorEnumTests.Create_EnumEqual_Expression_NET10_0.snap | 2 +- ...torEnumTests.Create_EnumNotEqual_Expression_NET10_0.snap | 2 +- ...sitorExecutableTests.Create_BooleanEqual_Expression.snap | 4 ++-- ...orExecutableTests.Create_BooleanNotEqual_Expression.snap | 4 ++-- ...cutableTests.Create_NullableBooleanEqual_Expression.snap | 6 +++--- ...ableTests.Create_NullableBooleanNotEqual_Expression.snap | 6 +++--- ...sionTests.Create_CollectionLengthExpression_NET10_0.snap | 2 +- ...ests.Create_InterfaceStringEqual_Expression_NET10_0.snap | 2 +- ...stTests.Create_ArrayAnyObjectStringEqual_Expression.snap | 2 +- ...ate_ArrayObjectNestedArrayAnyStringEqual_Expression.snap | 2 +- ...ObjectNestedArraySomeStringEqual_Expression_NET10_0.snap | 2 +- ...jectTests.Create_ObjectEnumEqual_Expression_NET10_0.snap | 2 +- ...ectTests.Create_ObjectShortEqual_Expression_NET10_0.snap | 2 +- ...ObjectTests.Create_ObjectShortIn_Expression_NET10_0.snap | 2 +- ...ctTests.Create_ObjectStringEqual_Expression_NET10_0.snap | 2 +- ...bjectTests.Create_ObjectStringIn_Expression_NET10_0.snap | 2 +- ...ts.Create_NullableStringContains_Expression_NET10_0.snap | 2 +- ...ts.Create_NullableStringEndsWith_Expression_NET10_0.snap | 2 +- ....Create_NullableStringNoContains_Expression_NET10_0.snap | 2 +- ...Create_NullableStringNotEndsWith_Expression_NET10_0.snap | 2 +- ...eate_NullableStringNotStartsWith_Expression_NET10_0.snap | 2 +- ....Create_NullableStringStartsWith_Expression_NET10_0.snap | 2 +- ...tringTests.Create_StringContains_Expression_NET10_0.snap | 2 +- ...tringTests.Create_StringEndsWith_Expression_NET10_0.snap | 2 +- ...orStringTests.Create_StringEqual_Expression_NET10_0.snap | 2 +- ...sitorStringTests.Create_StringIn_Expression_NET10_0.snap | 2 +- ...ingTests.Create_StringNoContains_Expression_NET10_0.snap | 2 +- ...ngTests.Create_StringNotEndsWith_Expression_NET10_0.snap | 2 +- ...tringTests.Create_StringNotEqual_Expression_NET10_0.snap | 2 +- ...orStringTests.Create_StringNotIn_Expression_NET10_0.snap | 2 +- ...Tests.Create_StringNotStartsWith_Expression_NET10_0.snap | 2 +- ...ingTests.Create_StringStartsWith_Expression_NET10_0.snap | 2 +- ...VisitorComparableTests.Create_ShortEqual_Expression.snap | 2 +- ...bleTests.Create_ShortGreaterThanOrEquals_Expression.snap | 2 +- ...rComparableTests.Create_ShortGreaterThan_Expression.snap | 2 +- ...terVisitorComparableTests.Create_ShortIn_Expression.snap | 2 +- ...rableTests.Create_ShortLowerThanOrEquals_Expression.snap | 2 +- ...torComparableTests.Create_ShortLowerThan_Expression.snap | 2 +- ...itorComparableTests.Create_ShortNotEqual_Expression.snap | 2 +- ...Tests.Create_ShortNotGreaterThanOrEquals_Expression.snap | 2 +- ...mparableTests.Create_ShortNotGreaterThan_Expression.snap | 2 +- ...VisitorComparableTests.Create_ShortNotIn_Expression.snap | 2 +- ...leTests.Create_ShortNotLowerThanOrEquals_Expression.snap | 2 +- ...ComparableTests.Create_ShortNotLowerThan_Expression.snap | 2 +- ....Create_ShortNullableGreaterThanOrEquals_Expression.snap | 2 +- ...bleTests.Create_ShortNullableGreaterThan_Expression.snap | 2 +- ...ts.Create_ShortNullableLowerThanOrEquals_Expression.snap | 2 +- ...rableTests.Create_ShortNullableLowerThan_Expression.snap | 2 +- ...eate_ShortNullableNotGreaterThanOrEquals_Expression.snap | 2 +- ...Tests.Create_ShortNullableNotGreaterThan_Expression.snap | 2 +- ...Create_ShortNullableNotLowerThanOrEquals_Expression.snap | 2 +- ...leTests.Create_ShortNullableNotLowerThan_Expression.snap | 2 +- ...eFilterVisitorEnumTests.Create_EnumEqual_Expression.snap | 2 +- ...lterVisitorEnumTests.Create_EnumNotEqual_Expression.snap | 2 +- ...sitorExecutableTests.Create_BooleanEqual_Expression.snap | 4 ++-- ...orExecutableTests.Create_BooleanNotEqual_Expression.snap | 4 ++-- ...cutableTests.Create_NullableBooleanEqual_Expression.snap | 6 +++--- ...ableTests.Create_NullableBooleanNotEqual_Expression.snap | 6 +++--- ...erfacesTests.Create_InterfaceStringEqual_Expression.snap | 2 +- ...ate_ArrayObjectNestedArrayAnyStringEqual_Expression.snap | 2 +- ...te_ArrayObjectNestedArraySomeStringEqual_Expression.snap | 2 +- ...isitorObjectTests.Create_ObjectEnumEqual_Expression.snap | 2 +- ...sitorObjectTests.Create_ObjectShortEqual_Expression.snap | 2 +- ...rVisitorObjectTests.Create_ObjectShortIn_Expression.snap | 2 +- ...itorObjectTests.Create_ObjectStringEqual_Expression.snap | 2 +- ...VisitorObjectTests.Create_ObjectStringIn_Expression.snap | 2 +- ...tringTests.Create_NullableStringContains_Expression.snap | 2 +- ...tringTests.Create_NullableStringEndsWith_Expression.snap | 2 +- ...ingTests.Create_NullableStringNoContains_Expression.snap | 2 +- ...ngTests.Create_NullableStringNotEndsWith_Expression.snap | 2 +- ...Tests.Create_NullableStringNotStartsWith_Expression.snap | 2 +- ...ingTests.Create_NullableStringStartsWith_Expression.snap | 2 +- ...VisitorStringTests.Create_StringContains_Expression.snap | 2 +- ...VisitorStringTests.Create_StringEndsWith_Expression.snap | 2 +- ...terVisitorStringTests.Create_StringEqual_Expression.snap | 2 +- ...FilterVisitorStringTests.Create_StringIn_Expression.snap | 2 +- ...sitorStringTests.Create_StringNoContains_Expression.snap | 2 +- ...itorStringTests.Create_StringNotEndsWith_Expression.snap | 2 +- ...VisitorStringTests.Create_StringNotEqual_Expression.snap | 2 +- ...terVisitorStringTests.Create_StringNotIn_Expression.snap | 2 +- ...orStringTests.Create_StringNotStartsWith_Expression.snap | 2 +- ...sitorStringTests.Create_StringStartsWith_Expression.snap | 2 +- ...VisitorComparableTests.Create_ShortEqual_Expression.snap | 2 +- ...mparableTests.Create_ShortEqual_Expression_DateTime.snap | 2 +- ...bleTests.Create_ShortGreaterThanOrEquals_Expression.snap | 2 +- ...rComparableTests.Create_ShortGreaterThan_Expression.snap | 2 +- ...terVisitorComparableTests.Create_ShortIn_Expression.snap | 2 +- ...rableTests.Create_ShortLowerThanOrEquals_Expression.snap | 2 +- ...torComparableTests.Create_ShortLowerThan_Expression.snap | 2 +- ...itorComparableTests.Create_ShortNotEqual_Expression.snap | 2 +- ...Tests.Create_ShortNotGreaterThanOrEquals_Expression.snap | 2 +- ...mparableTests.Create_ShortNotGreaterThan_Expression.snap | 2 +- ...VisitorComparableTests.Create_ShortNotIn_Expression.snap | 2 +- ...leTests.Create_ShortNotLowerThanOrEquals_Expression.snap | 2 +- ...ComparableTests.Create_ShortNotLowerThan_Expression.snap | 2 +- ....Create_ShortNullableGreaterThanOrEquals_Expression.snap | 2 +- ...bleTests.Create_ShortNullableGreaterThan_Expression.snap | 2 +- ...ts.Create_ShortNullableLowerThanOrEquals_Expression.snap | 2 +- ...rableTests.Create_ShortNullableLowerThan_Expression.snap | 2 +- ...eate_ShortNullableNotGreaterThanOrEquals_Expression.snap | 2 +- ...Tests.Create_ShortNullableNotGreaterThan_Expression.snap | 2 +- ...Create_ShortNullableNotLowerThanOrEquals_Expression.snap | 2 +- ...leTests.Create_ShortNullableNotLowerThan_Expression.snap | 2 +- ...bFilterVisitorEnumTests.Create_EnumEqual_Expression.snap | 2 +- ...lterVisitorEnumTests.Create_EnumNotEqual_Expression.snap | 2 +- ...stTests.Create_ArrayAnyObjectStringEqual_Expression.snap | 2 +- ...itorListTests.Create_ArrayAnyStringEqual_Expression.snap | 2 +- ...isitorObjectIdTests.Create_ObjectIdEqual_Expression.snap | 2 +- ...Tests.Create_ObjectIdGreaterThanOrEquals_Expression.snap | 2 +- ...ObjectIdTests.Create_ObjectIdGreaterThan_Expression.snap | 2 +- ...erVisitorObjectIdTests.Create_ObjectIdIn_Expression.snap | 4 ++-- ...IdTests.Create_ObjectIdLowerThanOrEquals_Expression.snap | 2 +- ...orObjectIdTests.Create_ObjectIdLowerThan_Expression.snap | 2 +- ...torObjectIdTests.Create_ObjectIdNotEqual_Expression.snap | 2 +- ...ts.Create_ObjectIdNotGreaterThanOrEquals_Expression.snap | 2 +- ...ectIdTests.Create_ObjectIdNotGreaterThan_Expression.snap | 2 +- ...isitorObjectIdTests.Create_ObjectIdNotIn_Expression.snap | 4 ++-- ...ests.Create_ObjectIdNotLowerThanOrEquals_Expression.snap | 2 +- ...bjectIdTests.Create_ObjectIdNotLowerThan_Expression.snap | 2 +- ...eate_ObjectIdNullableGreaterThanOrEquals_Expression.snap | 2 +- ...Tests.Create_ObjectIdNullableGreaterThan_Expression.snap | 2 +- ...Create_ObjectIdNullableLowerThanOrEquals_Expression.snap | 2 +- ...IdTests.Create_ObjectIdNullableLowerThan_Expression.snap | 2 +- ...e_ObjectIdNullableNotGreaterThanOrEquals_Expression.snap | 2 +- ...ts.Create_ObjectIdNullableNotGreaterThan_Expression.snap | 2 +- ...ate_ObjectIdNullableNotLowerThanOrEquals_Expression.snap | 2 +- ...ests.Create_ObjectIdNullableNotLowerThan_Expression.snap | 2 +- ...ate_ArrayObjectNestedArrayAnyStringEqual_Expression.snap | 2 +- ...te_ArrayObjectNestedArraySomeStringEqual_Expression.snap | 2 +- ...isitorObjectTests.Create_ObjectEnumEqual_Expression.snap | 2 +- ...sitorObjectTests.Create_ObjectShortEqual_Expression.snap | 2 +- ...rVisitorObjectTests.Create_ObjectShortIn_Expression.snap | 2 +- ...itorObjectTests.Create_ObjectStringEqual_Expression.snap | 2 +- ...VisitorObjectTests.Create_ObjectStringIn_Expression.snap | 2 +- ...tringTests.Create_NullableStringContains_Expression.snap | 2 +- ...tringTests.Create_NullableStringEndsWith_Expression.snap | 2 +- ...ingTests.Create_NullableStringNoContains_Expression.snap | 2 +- ...ngTests.Create_NullableStringNotEndsWith_Expression.snap | 2 +- ...Tests.Create_NullableStringNotStartsWith_Expression.snap | 2 +- ...ingTests.Create_NullableStringStartsWith_Expression.snap | 2 +- ...VisitorStringTests.Create_StringContains_Expression.snap | 2 +- ...VisitorStringTests.Create_StringEndsWith_Expression.snap | 2 +- ...terVisitorStringTests.Create_StringEqual_Expression.snap | 2 +- ...FilterVisitorStringTests.Create_StringIn_Expression.snap | 2 +- ...sitorStringTests.Create_StringNoContains_Expression.snap | 2 +- ...itorStringTests.Create_StringNotEndsWith_Expression.snap | 2 +- ...VisitorStringTests.Create_StringNotEqual_Expression.snap | 2 +- ...terVisitorStringTests.Create_StringNotIn_Expression.snap | 2 +- ...orStringTests.Create_StringNotStartsWith_Expression.snap | 2 +- ...sitorStringTests.Create_StringStartsWith_Expression.snap | 2 +- 170 files changed, 184 insertions(+), 184 deletions(-) diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression_NET10_0.snap index 0498c45e11a..db3bf4a24b4 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" = @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression_NET10_0.snap index fc87ef7a64d..6a883fa3fa1 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression_NET10_0.snap index c7ca6a392a6..59c6f1619da 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression_NET10_0.snap index fb661b4c16f..29169ac9085 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression_NET10_0.snap @@ -50,7 +50,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" IN (@p1, @p2) --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression_NET10_0.snap index 9dc6acd6c18..63a34989ec9 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression_NET10_0.snap index 12de76d0d81..6cc8d7f6821 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression_NET10_0.snap index 50023977e64..b4cdf6cf28e 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression_NET10_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <> @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression_NET10_0.snap index b3e023807c1..925ef96bc4e 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression_NET10_0.snap index 104744b59b8..407a872dd15 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression_NET10_0.snap index 23a72592bfb..fbd1d43ab08 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression_NET10_0.snap @@ -44,7 +44,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" NOT IN (@p1, @p2) --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression_NET10_0.snap index f8476858a9d..712a3b28bb5 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression_NET10_0.snap index f406c12d903..8d9e9239a07 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression_NET10_0.snap index bad89cc9195..50376b84291 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression_NET10_0.snap index e99f5512f07..c1bea0679f4 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression_NET10_0.snap index 93f3757bba3..180a1a6ee28 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression_NET10_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression_NET10_0.snap index 2c126bb7e10..54e49a5f24e 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression_NET10_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET10_0.snap index 4f12effac64..6d5f2c7b459 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET10_0.snap @@ -82,7 +82,7 @@ WHERE CASE END --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET10_0.snap index 27f204ade78..718eb6a6bd2 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET10_0.snap @@ -91,7 +91,7 @@ WHERE CASE END --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET10_0.snap index 3292fd16d39..8494dd7ad32 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET10_0.snap @@ -82,7 +82,7 @@ WHERE CASE END --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET10_0.snap index decaa37149f..9af33117708 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET10_0.snap @@ -91,7 +91,7 @@ WHERE CASE END --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression_NET10_0.snap index 3039070747e..efdcd684f79 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."BarEnum" = @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression_NET10_0.snap index bcde01d4cb6..70e79e6972d 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression_NET10_0.snap @@ -54,7 +54,7 @@ FROM "Data" AS "d" WHERE "d"."BarEnum" <> @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap index 55163c748e4..8b8cc61d61e 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap @@ -1,4 +1,4 @@ -true Result: +true --------------- { "data": { @@ -11,7 +11,7 @@ true Result: } --------------- -false Result: +false --------------- { "data": { diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap index d4617d5800e..781a8171442 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap @@ -1,4 +1,4 @@ -true Result: +true --------------- { "data": { @@ -11,7 +11,7 @@ true Result: } --------------- -false Result: +false --------------- { "data": { diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap index 46a9da34a95..526c3ab37d4 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap @@ -1,4 +1,4 @@ -true Result: +true --------------- { "data": { @@ -11,7 +11,7 @@ true Result: } --------------- -false Result: +false --------------- { "data": { @@ -24,7 +24,7 @@ false Result: } --------------- -null Result: +null --------------- { "data": { diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap index 20e61da3c59..d0cf4bf3f13 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap @@ -1,4 +1,4 @@ -true Result: +true --------------- { "data": { @@ -14,7 +14,7 @@ true Result: } --------------- -false Result: +false --------------- { "data": { @@ -30,7 +30,7 @@ false Result: } --------------- -null Result: +null --------------- { "data": { diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression_NET10_0.snap index 38d8b04cba0..ef7a8b954f0 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression_NET10_0.snap @@ -50,7 +50,7 @@ WHERE ( WHERE "d"."Id" = "b"."FooId") = @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression_NET10_0.snap index 7b36a3f751e..245c50adcc7 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression_NET10_0.snap @@ -48,7 +48,7 @@ INNER JOIN "Test" AS "t" ON "d"."TestId" = "t"."Id" WHERE "t"."Prop" = @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap index 33f568be1f1..0a19b82f044 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap @@ -102,7 +102,7 @@ WHERE EXISTS ( WHERE "d"."Id" = "f"."FooId") --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap index 0ac2339342d..5b892d39517 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap @@ -114,7 +114,7 @@ WHERE EXISTS ( WHERE "f"."Id" = "d0"."FooId") --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression_NET10_0.snap index 094a24412c5..67fa1c8b66d 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression_NET10_0.snap @@ -44,7 +44,7 @@ WHERE EXISTS ( WHERE "f"."Id" = "d0"."FooId" AND "f0"."BarString" = @p) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression_NET10_0.snap index 2f46935e3eb..5071856339a 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression_NET10_0.snap @@ -53,7 +53,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarEnum" = @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression_NET10_0.snap index 649de01eda5..c8b5e0e6aac 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression_NET10_0.snap @@ -53,7 +53,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarShort" = @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression_NET10_0.snap index 37a11471533..19610fc49f5 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression_NET10_0.snap @@ -70,7 +70,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarShort" IN (@p1, @p2) --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression_NET10_0.snap index 46757f4dd88..0b6a2b661c1 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression_NET10_0.snap @@ -58,7 +58,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarString" = @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression_NET10_0.snap index f51fc3e3091..444587d84f3 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression_NET10_0.snap @@ -39,7 +39,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarString" IN (@p1, @p2) --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression_NET10_0.snap index 3e264fcc997..a0ace3f2075 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND instr("d"."Bar", @p) > 0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET10_0.snap index eec4707a73e..0c6ddad2018 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @p_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET10_0.snap index b4f4ec8ee5a..6a7609055ba 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET10_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR instr("d"."Bar", @p) <= 0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET10_0.snap index c568198f3fb..40b5f71a248 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET10_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @p_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET10_0.snap index 001a6c83283..46ef0aab7eb 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET10_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @p_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET10_0.snap index 1b2f047db0a..3455343eef2 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @p_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression_NET10_0.snap index f909b3eb7a5..bcacc6b82ed 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE instr("d"."Bar", @p) > 0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET10_0.snap index 2fec3bc883f..9854e976e49 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @p_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression_NET10_0.snap index 8cb67278a01..30a4100fe0e 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" = @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression_NET10_0.snap index b17a514898b..82855f7cd00 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression_NET10_0.snap @@ -24,7 +24,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IN (@p1, @p2) --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET10_0.snap index d870660e48e..f27ccad99b5 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE instr("d"."Bar", @p) <= 0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET10_0.snap index dc2496cecbd..1da2559cf8d 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @p_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression_NET10_0.snap index 9a7a1fd2f3c..546ed5e6b5f 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" <> @p --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET10_0.snap index 8c325bd794b..8d79b3d265b 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET10_0.snap @@ -17,7 +17,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT IN (@p1, @p2) --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET10_0.snap index 3c7645637e6..550e068d623 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @p_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET10_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET10_0.snap index 169092d75da..f2b36f6c370 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET10_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET10_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @p_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap index ad63538c4b1..9d664651e49 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap @@ -34,7 +34,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) = :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap index b25819d55d1..6284670e2f8 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) >= :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap index e8c0f6f30a5..4964357a962 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) > :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap index 6982c256765..196683052a5 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap @@ -40,7 +40,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) = ANY(:p0); --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap index 1ee73e08665..497d88db3f9 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) <= :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap index 40f51eb0847..274f5fbee94 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) < :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap index 68e5a715b7d..902b6e15432 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap @@ -40,7 +40,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) != :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap index d91b67ff3a1..4d91013853e 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) < :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap index ed961e97c1d..0dc47d1743d 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) <= :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap index bce62f3fcd8..641be1f494e 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap @@ -34,7 +34,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where NOT(CAST(d.data ->> 'BarShort' as smallint) = ANY(:p0)); --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap index 7cbc694e5ef..25299d98706 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) > :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap index ffb12daa1fd..a3c329c35c9 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo as d where CAST(d.data ->> 'BarShort' as smallint) >= :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap index 6031a33ee99..e35ae1cf93a 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) >= :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap index 4f7815e7e88..ecef54ecd80 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) > :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap index 2986668bef1..6f65edf4cb3 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) <= :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap index ce5e6ffe92a..e38dac84f61 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) < :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap index aad4a8145b1..bd6ffe01c74 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) < :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap index c38640c9ab9..8da1294e362 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) <= :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap index bb2d252ab5f..1be2c298ae5 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) > :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap index 4b9e9629ef9..2742e0aa134 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap @@ -61,7 +61,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foo select d.id, d.data from public.mt_doc_queryablefiltervisitorcomparabletests_foonullable as d where CAST(d.data ->> 'BarShort' as smallint) >= :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap index 7beb1da1bb5..3a4893aecd9 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap @@ -34,7 +34,7 @@ FOO SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorenumtests_foo as d where CAST(d.data ->> 'BarEnum' as integer) = :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap index aa09e8a6b35..9324d482e0d 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap @@ -46,7 +46,7 @@ FOO SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorenumtests_foo as d where CAST(d.data ->> 'BarEnum' as integer) != :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap index 55163c748e4..8b8cc61d61e 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanEqual_Expression.snap @@ -1,4 +1,4 @@ -true Result: +true --------------- { "data": { @@ -11,7 +11,7 @@ true Result: } --------------- -false Result: +false --------------- { "data": { diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap index d4617d5800e..781a8171442 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_BooleanNotEqual_Expression.snap @@ -1,4 +1,4 @@ -true Result: +true --------------- { "data": { @@ -11,7 +11,7 @@ true Result: } --------------- -false Result: +false --------------- { "data": { diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap index 46a9da34a95..526c3ab37d4 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanEqual_Expression.snap @@ -1,4 +1,4 @@ -true Result: +true --------------- { "data": { @@ -11,7 +11,7 @@ true Result: } --------------- -false Result: +false --------------- { "data": { @@ -24,7 +24,7 @@ false Result: } --------------- -null Result: +null --------------- { "data": { diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap index f0f1e7dce44..65cba4cbaaf 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorExecutableTests.Create_NullableBooleanNotEqual_Expression.snap @@ -1,4 +1,4 @@ -true Result: +true --------------- { "data": { @@ -11,7 +11,7 @@ true Result: } --------------- -false Result: +false --------------- { "data": { @@ -24,7 +24,7 @@ false Result: } --------------- -null Result: +null --------------- { "data": { diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap index 194266d6141..7fb65257812 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap @@ -38,7 +38,7 @@ ba SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorinterfacestests_barinterface as d where d.data -> 'Test' ->> 'Prop' = :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap index fa959b41c34..110d08d14de 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap @@ -55,7 +55,7 @@ true SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where d.data @? '$ ? (@.Foo.ObjectArray[*] != null && @.Foo.ObjectArray[*].size() > 0)'; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap index 8ea019dcad4..2d3d682d038 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap @@ -50,7 +50,7 @@ b SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where d.data -> 'Foo' -> 'ObjectArray' @> :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap index 287a208d587..6402c699804 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap @@ -38,7 +38,7 @@ FOO SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where CAST(d.data -> 'Foo' ->> 'BarEnum' as integer) = :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap index d48ddcc6b56..34748cb32a2 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap @@ -38,7 +38,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where CAST(d.data -> 'Foo' ->> 'BarShort' as smallint) = :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap index f078aa87ab8..d47281ab8e8 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap @@ -48,7 +48,7 @@ select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where CAST(d.data -> 'Foo' ->> 'BarShort' as smallint) = ANY(:p0); --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap index 77aab7f82f2..2667f832c49 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap @@ -38,7 +38,7 @@ testbtest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where d.data -> 'Foo' ->> 'BarString' = :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap index 843a95e9d96..ad98869e30c 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap @@ -23,7 +23,7 @@ testatestAndtestb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorobjecttests_bar as d where d.data -> 'Foo' ->> 'BarString' = ANY(:p0); --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap index 61deb4142c8..34307dd2dbf 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap @@ -34,7 +34,7 @@ b SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap index 1e5d131af03..f60a934b19b 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap index 273d9b4f0af..b801ee30046 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap @@ -40,7 +40,7 @@ b SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where (d.data ->> 'Bar' is null or NOT(d.data ->> 'Bar' LIKE :p0)); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap index 5923753c58c..4c72526e216 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap @@ -40,7 +40,7 @@ btest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where NOT((d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0)); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap index 75a63afd21c..3e42e037d9b 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap @@ -40,7 +40,7 @@ testb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where NOT((d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0)); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap index 6bc7387373c..4fff482f4a4 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foonullable as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap index f813c451b35..5098d6c46b7 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap @@ -34,7 +34,7 @@ b SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression.snap index a37ae0809f8..4807594d7ee 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap index ad1670d4bf2..0dc11d7c231 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap @@ -34,7 +34,7 @@ testbtest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where d.data ->> 'Bar' = :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap index 97b980ac3c1..61d0456ea5c 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap @@ -19,7 +19,7 @@ testatestAndtestb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where d.data ->> 'Bar' = ANY(:p0); --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression.snap index 57567417611..3ef43e331e2 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression.snap @@ -34,7 +34,7 @@ b SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where (d.data ->> 'Bar' is null or NOT(d.data ->> 'Bar' LIKE :p0)); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap index a94fa902164..f24a9529bdd 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where NOT((d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0)); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap index 15da25eee93..3fc25b3d25e 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap @@ -34,7 +34,7 @@ testbtest SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where d.data ->> 'Bar' != :p0; --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression.snap index 4bfa330c898..4001c08d908 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression.snap @@ -12,7 +12,7 @@ testatestAndtestb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where NOT(d.data ->> 'Bar' = ANY(:p0)); --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap index 541e50edcf7..5b101e8cf81 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where NOT((d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0)); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression.snap b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression.snap index e4beff15da8..a51eb2744d0 100644 --- a/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression.snap +++ b/src/HotChocolate/Marten/test/Data.Marten.Filters.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb SQL: select d.id, d.data from public.mt_doc_queryablefiltervisitorstringtests_foo as d where (d.data ->> 'Bar' is not null and d.data ->> 'Bar' LIKE :p0); --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression.snap index ee7b50465d0..5dfbc6aeee4 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression.snap @@ -34,7 +34,7 @@ find({ "BarShort" : { "$eq" : 12 } }) find({ "BarShort" : { "$eq" : 13 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression_DateTime.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression_DateTime.snap index 2118a0e414a..03648b1060b 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression_DateTime.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortEqual_Expression_DateTime.snap @@ -34,7 +34,7 @@ find({ "BarDateTime" : { "$eq" : { "$date" : "2000-01-12T00:00:00Z" } } }) find({ "BarDateTime" : { "$eq" : { "$date" : "2000-01-12T00:00:00Z" } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap index 85dc64cf6ef..a24b8c83e89 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$gte" : 13 } }) find({ "BarShort" : { "$gte" : 14 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap index ffb74bf8c4f..247232deff8 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$gt" : 13 } }) find({ "BarShort" : { "$gt" : 14 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortIn_Expression.snap index 79efb1e3843..2b493d44f3a 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortIn_Expression.snap @@ -40,7 +40,7 @@ find({ "BarShort" : { "$in" : [12, 13] } }) find({ "BarShort" : { "$in" : [13, 14] } }) --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap index bc058a527fc..4a626a05f34 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$lte" : 13 } }) find({ "BarShort" : { "$lte" : 14 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap index 37607a2b865..ee8746b1d7c 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$lt" : 13 } }) find({ "BarShort" : { "$lt" : 14 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap index 04cd41f0a0e..eeb20301bac 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap @@ -40,7 +40,7 @@ find({ "BarShort" : { "$ne" : 12 } }) find({ "BarShort" : { "$ne" : 13 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap index 74d9f38336f..08b0ef424f8 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$not" : { "$gte" : 13 } } }) find({ "BarShort" : { "$not" : { "$gte" : 14 } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap index 49392002b89..d289dd3e976 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$not" : { "$gt" : 13 } } }) find({ "BarShort" : { "$not" : { "$gt" : 14 } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap index 51dcd37a43c..8fe2d020666 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap @@ -34,7 +34,7 @@ find({ "BarShort" : { "$nin" : [12, 13] } }) find({ "BarShort" : { "$nin" : [13, 14] } }) --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap index 1cd4ac6d8ee..077132d6bc6 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$not" : { "$lte" : 13 } } }) find({ "BarShort" : { "$not" : { "$lte" : 14 } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap index 8cd1e54abf8..4ee1529d33f 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$not" : { "$lt" : 13 } } }) find({ "BarShort" : { "$not" : { "$lt" : 14 } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap index 85dc64cf6ef..a24b8c83e89 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$gte" : 13 } }) find({ "BarShort" : { "$gte" : 14 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap index ffb74bf8c4f..247232deff8 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$gt" : 13 } }) find({ "BarShort" : { "$gt" : 14 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap index bc058a527fc..4a626a05f34 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$lte" : 13 } }) find({ "BarShort" : { "$lte" : 14 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap index 37607a2b865..ee8746b1d7c 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap @@ -51,7 +51,7 @@ find({ "BarShort" : { "$lt" : 13 } }) find({ "BarShort" : { "$lt" : 14 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap index 9672f644eea..9518e642a46 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$not" : { "$gte" : 13 } } }) find({ "BarShort" : { "$not" : { "$gte" : 14 } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap index 1c335159f24..4adeeeba433 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression.snap @@ -70,7 +70,7 @@ find({ "BarShort" : { "$not" : { "$gt" : 13 } } }) find({ "BarShort" : { "$not" : { "$gt" : 14 } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap index e0ce8bb0c62..424364f93ae 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "BarShort" : { "$not" : { "$lte" : 13 } } }) find({ "BarShort" : { "$not" : { "$lte" : 14 } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap index e71a7e932c9..042082fa371 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression.snap @@ -70,7 +70,7 @@ find({ "BarShort" : { "$not" : { "$lt" : 13 } } }) find({ "BarShort" : { "$not" : { "$lt" : 14 } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumEqual_Expression.snap index bf83af3e4b5..4f913bed417 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumEqual_Expression.snap @@ -34,7 +34,7 @@ FOO Query: find({ "BarEnum" : { "$eq" : 0 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap index 25b90b42c19..e2a27d53d4e 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap @@ -46,7 +46,7 @@ FOO Query: find({ "BarEnum" : { "$ne" : 0 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap index a624b484abd..d3c4e3040c5 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyObjectStringEqual_Expression.snap @@ -99,7 +99,7 @@ true Query: find({ "FooNested" : { "$exists" : true, "$nin" : [[], null] } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyStringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyStringEqual_Expression.snap index 80371808451..e5e5a620813 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyStringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorListTests.Create_ArrayAnyStringEqual_Expression.snap @@ -69,7 +69,7 @@ true Query: find({ "Bar" : { "$exists" : true, "$nin" : [[], null] } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdEqual_Expression.snap index dcf7e70b887..fda2c155676 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdEqual_Expression.snap @@ -34,7 +34,7 @@ find({ "ObjectId" : { "$eq" : { "$oid" : "6124e80f3f5fc839830c1f69" } } }) find({ "ObjectId" : { "$eq" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThanOrEquals_Expression.snap index e31f957cecd..ac7fa43e507 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThan_Expression.snap index 468f2b60cb6..c5c9347fbdf 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdGreaterThan_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdIn_Expression.snap index ebd861fa248..91f72e7ffb6 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdIn_Expression.snap @@ -19,7 +19,7 @@ find({ "ObjectId" : { "$in" : [{ "$oid" : "6124e80f3f5fc839830c1f69" }, { "$oid" : "6124e80f3f5fc839830c1f6a" }] } }) --------------- -band6124e80f3f5fc839830c1f6b Result: +band6124e80f3f5fc839830c1f6b --------------- { "errors": [ @@ -47,7 +47,7 @@ band6124e80f3f5fc839830c1f6b Result: } --------------- -nullAnd6124e80f3f5fc839830c1f6b Result: +nullAnd6124e80f3f5fc839830c1f6b --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThanOrEquals_Expression.snap index 3cc3d5d703c..77fe3ab8e0c 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThan_Expression.snap index eee4e5f0e35..c42247eaaeb 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdLowerThan_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotEqual_Expression.snap index d39971e366f..97056f91d1e 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotEqual_Expression.snap @@ -40,7 +40,7 @@ find({ "ObjectId" : { "$ne" : { "$oid" : "6124e80f3f5fc839830c1f69" } } }) find({ "ObjectId" : { "$ne" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThanOrEquals_Expression.snap index 64133e0e580..23fc2d5722c 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$not" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6a" find({ "ObjectId" : { "$not" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThan_Expression.snap index 7b860e2c84e..c6f0601c816 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotGreaterThan_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$not" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } find({ "ObjectId" : { "$not" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotIn_Expression.snap index 4616438fd2b..1400647e922 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotIn_Expression.snap @@ -16,7 +16,7 @@ find({ "ObjectId" : { "$nin" : [{ "$oid" : "6124e80f3f5fc839830c1f69" }, { "$oid" : "6124e80f3f5fc839830c1f6a" }] } }) --------------- -band6124e80f3f5fc839830c1f6b Result: +band6124e80f3f5fc839830c1f6b --------------- { "errors": [ @@ -44,7 +44,7 @@ band6124e80f3f5fc839830c1f6b Result: } --------------- -nullAnd6124e80f3f5fc839830c1f6b Result: +nullAnd6124e80f3f5fc839830c1f6b --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThanOrEquals_Expression.snap index 5a1bebae615..eca158a25ac 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThanOrEquals_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$not" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6a" find({ "ObjectId" : { "$not" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThan_Expression.snap index 6993fea8ef8..eb8901a3e62 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNotLowerThan_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$not" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } find({ "ObjectId" : { "$not" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThanOrEquals_Expression.snap index f4f34187b8d..f8b7ccb0cae 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThan_Expression.snap index 8cc197078a4..4680a3a0295 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableGreaterThan_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThanOrEquals_Expression.snap index ab75c753054..f83ee701c0b 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThan_Expression.snap index 4be85056135..63462078484 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableLowerThan_Expression.snap @@ -51,7 +51,7 @@ find({ "ObjectId" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } } }) find({ "ObjectId" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThanOrEquals_Expression.snap index 1d718939668..9ef0540b561 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$not" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6a" find({ "ObjectId" : { "$not" : { "$gte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThan_Expression.snap index 0c0f3b98697..1e86c80379e 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotGreaterThan_Expression.snap @@ -70,7 +70,7 @@ find({ "ObjectId" : { "$not" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } find({ "ObjectId" : { "$not" : { "$gt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThanOrEquals_Expression.snap index 8a50a2ad1d1..e2baf77f7ef 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThanOrEquals_Expression.snap @@ -61,7 +61,7 @@ find({ "ObjectId" : { "$not" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6a" find({ "ObjectId" : { "$not" : { "$lte" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThan_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThan_Expression.snap index 9464074be5a..8d0eb73f8b9 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThan_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectIdTests.Create_ObjectIdNullableNotLowerThan_Expression.snap @@ -70,7 +70,7 @@ find({ "ObjectId" : { "$not" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6a" } find({ "ObjectId" : { "$not" : { "$lt" : { "$oid" : "6124e80f3f5fc839830c1f6b" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap index 1b82f183ef5..9c00351babe 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArrayAnyStringEqual_Expression.snap @@ -55,7 +55,7 @@ true Query: find({ "Foo.ObjectArray" : { "$exists" : true, "$nin" : [[], null] } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap index b599d8521c1..53c272cc366 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap @@ -50,7 +50,7 @@ d Query: find({ "Foo.ObjectArray" : { "$elemMatch" : { "Foo.BarString" : { "$eq" : "d" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap index e5dba09a610..e3ab6294bda 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap @@ -38,7 +38,7 @@ FOO Query: find({ "Foo.BarEnum" : { "$eq" : 0 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap index 3c61372eed9..8ad817cda91 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap @@ -38,7 +38,7 @@ find({ "Foo.BarShort" : { "$eq" : 12 } }) find({ "Foo.BarShort" : { "$eq" : 13 } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap index 3e12ce2f5ff..eff21d0ce65 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap @@ -48,7 +48,7 @@ find({ "Foo.BarShort" : { "$in" : [12, 13] } }) find({ "Foo.BarShort" : { "$in" : [13, 14] } }) --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap index 230677ec1e3..03d8d6ea751 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap @@ -38,7 +38,7 @@ testbtest Query: find({ "Foo.BarString" : { "$eq" : "testbtest" } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap index 94f985902ce..da34dcb0d3e 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap @@ -23,7 +23,7 @@ testatestAndtestb Query: find({ "Foo.BarString" : { "$in" : ["testatest", "testbtest"] } }) --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringContains_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringContains_Expression.snap index 91f8d400ff4..b970c289968 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringContains_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringContains_Expression.snap @@ -34,7 +34,7 @@ b Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "b", "options" : "" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap index d430372a865..50a8970cefc 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "btest$", "options" : "" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap index 131a37c6ee0..fbe322c91e6 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNoContains_Expression.snap @@ -40,7 +40,7 @@ b Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "b", "options" : "" } } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap index e6fd2a5cef0..8530ebf4732 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression.snap @@ -40,7 +40,7 @@ btest Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "btest$", "options" : "" } } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap index 0df314b4166..d94dc0d63ee 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression.snap @@ -40,7 +40,7 @@ testb Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "^testb", "options" : "" } } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap index 96ad5acfd18..e3065608b4e 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_NullableStringStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "^testb", "options" : "" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringContains_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringContains_Expression.snap index 91f8d400ff4..b970c289968 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringContains_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringContains_Expression.snap @@ -34,7 +34,7 @@ b Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "b", "options" : "" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEndsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEndsWith_Expression.snap index d430372a865..50a8970cefc 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEndsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "btest$", "options" : "" } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEqual_Expression.snap index cb5aa9bf816..9204c6f7cfa 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringEqual_Expression.snap @@ -34,7 +34,7 @@ testbtest Query: find({ "Bar" : { "$eq" : "testbtest" } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringIn_Expression.snap index 3bcda61b9f0..d64528453df 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringIn_Expression.snap @@ -19,7 +19,7 @@ testatestAndtestb Query: find({ "Bar" : { "$in" : ["testatest", "testbtest"] } }) --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNoContains_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNoContains_Expression.snap index 811c11bfc12..0fe3a7a01fe 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNoContains_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNoContains_Expression.snap @@ -34,7 +34,7 @@ b Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "b", "options" : "" } } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap index 2bca10e8147..c8a138b9a9b 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEndsWith_Expression.snap @@ -34,7 +34,7 @@ btest Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "btest$", "options" : "" } } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEqual_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEqual_Expression.snap index 7cb65a85f76..487d8c434ac 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEqual_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotEqual_Expression.snap @@ -34,7 +34,7 @@ testbtest Query: find({ "Bar" : { "$ne" : "testbtest" } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotIn_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotIn_Expression.snap index 181f0862d38..9081fca6c04 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotIn_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotIn_Expression.snap @@ -12,7 +12,7 @@ testatestAndtestb Query: find({ "Bar" : { "$nin" : ["testatest", "testbtest"] } }) --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap index cff806ba4a4..b0350061361 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringNotStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb Query: find({ "Bar" : { "$not" : { "$regex" : { "$regularExpression" : { "pattern" : "^testb", "options" : "" } } } } }) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringStartsWith_Expression.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringStartsWith_Expression.snap index 96ad5acfd18..e3065608b4e 100644 --- a/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringStartsWith_Expression.snap +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/__snapshots__/MongoDbFilterVisitorStringTests.Create_StringStartsWith_Expression.snap @@ -34,7 +34,7 @@ testb Query: find({ "Bar" : { "$regex" : { "$regularExpression" : { "pattern" : "^testb", "options" : "" } } } }) --------------- -null Result: +null --------------- { "errors": [ From fe3e84f0eac1fa75228615096e90c7a839e85752 Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Fri, 16 Jan 2026 12:29:07 +0200 Subject: [PATCH 121/144] Updated snapshot HotChocolate.Language --- ...raphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap index deb99e9c26c..d160de76ec4 100644 --- a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Apollo_Client_v4_Query.snap @@ -79,6 +79,8 @@ "OperationName": "OnEvent", "ErrorHandlingMode": null, "Variables": null, - "Extensions": null + "Extensions": null, + "VariablesMemoryOwner": null, + "ExtensionsMemoryOwner": null } ] From e299031cc290f8dfbfef8f89e6610f41a89b2150 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 16 Jan 2026 11:57:28 +0100 Subject: [PATCH 122/144] Fixed apollo federation --- .../{_AnyTypeTests.cs => AnyTypeTests.cs} | 22 +-- .../AnnotationBased/CertificationTests.cs | 177 +++++++++++------ .../CodeFirst/CertificationTests.cs | 185 +++++++++++------- .../Extensions/OperationContextExtensions.cs | 4 +- 4 files changed, 229 insertions(+), 159 deletions(-) rename src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/{_AnyTypeTests.cs => AnyTypeTests.cs} (91%) diff --git a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/AnyTypeTests.cs similarity index 91% rename from src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs rename to src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/AnyTypeTests.cs index 0fce966b47c..1d38ca61ed2 100644 --- a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/_AnyTypeTests.cs +++ b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/AnyTypeTests.cs @@ -6,7 +6,7 @@ namespace HotChocolate.ApolloFederation; -public class _AnyTypeTests +public class AnyTypeTests { [Fact] public void Ensure_Type_Name_Is_Correct() @@ -176,26 +176,10 @@ public void CoerceOutputValue() var operation = CommonTestExtensions.CreateOperation(); var resultDocument = new ResultDocument(operation, 0); var resultValue = resultDocument.Data.GetProperty("first"); - type.CoerceOutputValue(representation, resultValue); + void Error() => type.CoerceOutputValue(representation, resultValue); // assert - resultValue.MatchSnapshot(); - } - - [Fact] - public void CoerceOutputValue_Invalid_Format() - { - // arrange - var type = new AnyType(); - - // act - var operation = CommonTestExtensions.CreateOperation(); - var resultDocument = new ResultDocument(operation, 0); - var resultValue = resultDocument.Data.GetProperty("first"); - void Action() => type.CoerceOutputValue(1, resultValue); - - // assert - Assert.Throws<LeafCoercionException>(Action); + Assert.Throws<NotSupportedException>(Error); } [Fact] diff --git a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/AnnotationBased/CertificationTests.cs b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/AnnotationBased/CertificationTests.cs index 1c778cfceb2..3667700b899 100644 --- a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/AnnotationBased/CertificationTests.cs +++ b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/AnnotationBased/CertificationTests.cs @@ -1,5 +1,4 @@ using HotChocolate.Execution; -using HotChocolate.Language; namespace HotChocolate.ApolloFederation.CertificationSchema.AnnotationBased; @@ -19,14 +18,19 @@ public async Task Subgraph_SDL() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - """ - { - _service { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + { + _service { sdl + } } - } - """); + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result @@ -45,25 +49,32 @@ public async Task Product_By_Id() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - """ - query ($representations: [_Any!]!) { - _entities(representations: $representations) { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + query ($representations: [_Any!]!) { + _entities(representations: $representations) { ... on Product { - sku + sku } + } } - } - """, - new Dictionary<string, object?> - { - ["representations"] = new List<object?> + """) + .SetVariableValues( + """ { - new ObjectValueNode( - new ObjectFieldNode("__typename", "Product"), - new ObjectFieldNode("id", "apollo-federation")) + "representations": [ + { + "__typename": "Product", + "id": "apollo-federation" + } + ] } - }); + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -76,24 +87,33 @@ public async Task Product_By_Package() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - @"query ($representations: [_Any!]!) { - _entities(representations: $representations) { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + query ($representations: [_Any!]!) { + _entities(representations: $representations) { ... on Product { - sku + sku } + } } - }", - new Dictionary<string, object?> - { - ["representations"] = new List<object?> + """) + .SetVariableValues( + """ { - new ObjectValueNode( - new ObjectFieldNode("__typename", "Product"), - new ObjectFieldNode("sku", "federation"), - new ObjectFieldNode("package", "@apollo/federation")) + "representations": [ + { + "__typename": "Product", + "sku": "federation", + "package": "@apollo/federation" + } + ] } - }); + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -106,26 +126,35 @@ public async Task Product_By_Variation() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - @"query ($representations: [_Any!]!) { - _entities(representations: $representations) { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + query ($representations: [_Any!]!) { + _entities(representations: $representations) { ... on Product { - sku + sku } + } } - }", - new Dictionary<string, object?> - { - ["representations"] = new List<object?> + """) + .SetVariableValues( + """ { - new ObjectValueNode( - new ObjectFieldNode("__typename", "Product"), - new ObjectFieldNode("sku", "federation"), - new ObjectFieldNode("variation", - new ObjectValueNode( - new ObjectFieldNode("id", "OSS")))) + "representations": [ + { + "__typename": "Product", + "sku": "federation", + "variation": { + "id": "OSS" + } + } + ] } - }); + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -138,16 +167,25 @@ public async Task Provides() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - @"query ($id: ID!) { - product(id: $id) { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + query ($id: ID!) { + product(id: $id) { createdBy { email totalProductsCreated } + } + } + """) + .SetVariableValues( + """ + { + "id": "apollo-federation" } - }", - new Dictionary<string, object?> - { - ["id"] = "apollo-federation" - }); + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -160,16 +198,25 @@ public async Task Requires() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - @"query ($id: ID!) { - product(id: $id) { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + query ($id: ID!) { + product(id: $id) { dimensions { size weight } + } } - }", - new Dictionary<string, object?> - { - ["id"] = "apollo-federation" - }); + """) + .SetVariableValues( + """ + { + "id": "apollo-federation" + } + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); diff --git a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/CodeFirst/CertificationTests.cs b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/CodeFirst/CertificationTests.cs index 2ec9e488dc2..a22cb347c2d 100644 --- a/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/CodeFirst/CertificationTests.cs +++ b/src/HotChocolate/ApolloFederation/test/ApolloFederation.Tests/CertificationSchema/CodeFirst/CertificationTests.cs @@ -1,5 +1,4 @@ using HotChocolate.Execution; -using HotChocolate.Language; namespace HotChocolate.ApolloFederation.CertificationSchema.CodeFirst; @@ -19,14 +18,19 @@ public async Task Subgraph_SDL() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - """ - { - _service { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + { + _service { sdl + } } - } - """); + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result @@ -45,25 +49,32 @@ public async Task Product_By_Id() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - """ - query ($representations: [_Any!]!) { - _entities(representations: $representations) { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + query ($representations: [_Any!]!) { + _entities(representations: $representations) { ... on Product { - sku + sku } + } } - } - """, - new Dictionary<string, object?> - { - ["representations"] = new List<object?> + """) + .SetVariableValues( + """ { - new ObjectValueNode( - new ObjectFieldNode("__typename", "Product"), - new ObjectFieldNode("id", "apollo-federation")) + "representations": [ + { + "__typename": "Product", + "id": "apollo-federation" + } + ] } - }); + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -76,26 +87,33 @@ public async Task Product_By_Package() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - """ - query ($representations: [_Any!]!) { - _entities(representations: $representations) { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + query ($representations: [_Any!]!) { + _entities(representations: $representations) { ... on Product { - sku + sku } + } } - } - """, - new Dictionary<string, object?> - { - ["representations"] = new List<object?> + """) + .SetVariableValues( + """ { - new ObjectValueNode( - new ObjectFieldNode("__typename", "Product"), - new ObjectFieldNode("sku", "federation"), - new ObjectFieldNode("package", "@apollo/federation")) + "representations": [ + { + "__typename": "Product", + "sku": "federation", + "package": "@apollo/federation" + } + ] } - }); + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -108,28 +126,35 @@ public async Task Product_By_Variation() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - """ - query ($representations: [_Any!]!) { - _entities(representations: $representations) { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + query ($representations: [_Any!]!) { + _entities(representations: $representations) { ... on Product { - sku + sku } + } } - } - """, - new Dictionary<string, object?> - { - ["representations"] = new List<object?> + """) + .SetVariableValues( + """ { - new ObjectValueNode( - new ObjectFieldNode("__typename", "Product"), - new ObjectFieldNode("sku", "federation"), - new ObjectFieldNode("variation", - new ObjectValueNode( - new ObjectFieldNode("id", "OSS")))) + "representations": [ + { + "__typename": "Product", + "sku": "federation", + "variation": { + "id": "OSS" + } + } + ] } - }); + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -142,18 +167,25 @@ public async Task Provides() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - """ - query ($id: ID!) { - product(id: $id) { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + query ($id: ID!) { + product(id: $id) { createdBy { email totalProductsCreated } + } + } + """) + .SetVariableValues( + """ + { + "id": "apollo-federation" } - } - """, - new Dictionary<string, object?> - { - ["id"] = "apollo-federation" - }); + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); @@ -166,18 +198,25 @@ public async Task Requires() var executor = await SchemaSetup.CreateAsync(); // act - var result = await executor.ExecuteAsync( - """ - query ($id: ID!) { - product(id: $id) { + var request = OperationRequestBuilder + .New() + .SetDocument( + """ + query ($id: ID!) { + product(id: $id) { dimensions { size weight } + } } - } - """, - new Dictionary<string, object?> - { - ["id"] = "apollo-federation" - }); + """) + .SetVariableValues( + """ + { + "id": "apollo-federation" + } + """) + .Build(); + + var result = await executor.ExecuteAsync(request); // assert result.ToJson().MatchSnapshot(); diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs index 4c30d36a0f4..2803440b471 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs @@ -23,7 +23,7 @@ public OperationContext ReportError( { foreach (var error in ex.Errors) { - ReportError(context, error, resolverContext); + context.ReportError(error, resolverContext); } } else @@ -34,7 +34,7 @@ public OperationContext ReportError( .AddLocations(selection.GetSyntaxNodes()) .Build(); - ReportError(context, error, resolverContext); + context.ReportError(error, resolverContext); } return context; From 4226558ae80ed2bcd6dedbd663fd7d345dceae2e Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 16 Jan 2026 12:12:30 +0100 Subject: [PATCH 123/144] Fixed azure functions --- .../AzureHttpResponse.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/HotChocolate/AzureFunctions/src/HotChocolate.AzureFunctions.IsolatedProcess/AzureHttpResponse.cs b/src/HotChocolate/AzureFunctions/src/HotChocolate.AzureFunctions.IsolatedProcess/AzureHttpResponse.cs index 1cc0a2cbbae..7d8cbdfcb3c 100644 --- a/src/HotChocolate/AzureFunctions/src/HotChocolate.AzureFunctions.IsolatedProcess/AzureHttpResponse.cs +++ b/src/HotChocolate/AzureFunctions/src/HotChocolate.AzureFunctions.IsolatedProcess/AzureHttpResponse.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using System.IO.Pipelines; using System.Net; using Microsoft.AspNetCore.Http; @@ -9,6 +10,7 @@ namespace HotChocolate.AzureFunctions.IsolatedProcess; internal sealed class AzureHttpResponse : HttpResponse { private static readonly StreamPipeWriterOptions s_options = new(leaveOpen: true); + private ImmutableList<(Func<object, Task>, object)> _onCompletedCallbacks = []; private readonly HttpResponse _response; private readonly HttpRequestData _requestData; private readonly object _sync = new(); @@ -96,7 +98,12 @@ public override void OnStarting(Func<object, Task> callback, object state) => throw new NotSupportedException(); public override void OnCompleted(Func<object, Task> callback, object state) - => throw new NotSupportedException(); + { + lock (_sync) + { + _onCompletedCallbacks = _onCompletedCallbacks.Add((callback, state)); + } + } public override void Redirect(string location, bool permanent) => throw new NotSupportedException(); @@ -108,5 +115,13 @@ public override async Task CompleteAsync() await _writer.FlushAsync().ConfigureAwait(false); await _writer.CompleteAsync().ConfigureAwait(false); } + + if (!_onCompletedCallbacks.IsEmpty) + { + foreach (var (callback, state) in _onCompletedCallbacks) + { + await callback(state).ConfigureAwait(false); + } + } } } From 3411ad4f23c0377bb2284d58da8f04a4b0754506 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 16 Jan 2026 14:00:29 +0100 Subject: [PATCH 124/144] Fixed More --- .../src/Types/Execution/Processing/OperationCompiler.cs | 4 ++-- .../Execution/Processing/SelectionSetOptimizerContext.cs | 6 ++---- .../src/Data/Projections/Convention/ProjectionProvider.cs | 3 ++- .../Projections/Convention/ProjectionSelectionExtensions.cs | 1 - .../src/Data/Projections/Visitor/IProjectionFieldHandler.cs | 1 - 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 822d9f1daaa..7ae336b6f0b 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -340,7 +340,8 @@ private SelectionSet BuildSelectionSet( if (optimizers.Length > 0) { - selection.Features.SetSafe(optimizers); + var features = new SelectionFeatureCollection(compilationContext.Features, selection.Id); + features.SetSafe(optimizers); } // Register the selection in the elements array @@ -363,7 +364,6 @@ private SelectionSet BuildSelectionSet( var rewritten = current; var optimizerContext = new SelectionSetOptimizerContext( - selectionSetId, path, typeContext, ref rewritten, diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs index 17d94802be4..80d13247462 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SelectionSetOptimizerContext.cs @@ -13,7 +13,6 @@ namespace HotChocolate.Execution.Processing; /// </summary> public ref struct SelectionSetOptimizerContext { - private readonly int _selectionSetId; private readonly ref ImmutableArray<Selection> _selections; private readonly OperationFeatureCollection _features; private readonly ref int _lastSelectionId; @@ -23,7 +22,6 @@ public ref struct SelectionSetOptimizerContext /// Initializes a new instance of <see cref="SelectionSetOptimizerContext"/> /// </summary> internal SelectionSetOptimizerContext( - int selectionSetId, SelectionPath path, ObjectType typeContext, ref ImmutableArray<Selection> selections, @@ -32,7 +30,6 @@ internal SelectionSetOptimizerContext( Schema schema, Func<Schema, ObjectField, FieldNode, FieldDelegate> createFieldPipeline) { - _selectionSetId = selectionSetId; _selections = ref selections; _features = features; _lastSelectionId = ref lastSelectionId; @@ -80,7 +77,8 @@ public Selection GetSelection(string responseName) return _selectionMap[responseName]; } - public SelectionFeatureCollection Features => new(_features, _selectionSetId); + public SelectionFeatureCollection CreateSelectionFeatures(Selection selection) + => new SelectionFeatureCollection(_features, selection.Id); /// <summary> /// Gets the next operation unique selection id. diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs index 0ea678db3a1..255768663f6 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionProvider.cs @@ -154,7 +154,8 @@ public Selection RewriteSelection( } } - selection.Features.SetSafe(fieldHandler); + var features = context.CreateSelectionFeatures(selection); + features.SetSafe(fieldHandler); return selection; } } diff --git a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelectionExtensions.cs b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelectionExtensions.cs index fc66246730e..62ce7eecbee 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelectionExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Convention/ProjectionSelectionExtensions.cs @@ -1,5 +1,4 @@ using HotChocolate.Execution.Processing; -using HotChocolate.Features; namespace HotChocolate.Data.Projections; diff --git a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs index 0d939dee70e..992828da753 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Visitor/IProjectionFieldHandler.cs @@ -1,4 +1,3 @@ -using HotChocolate.Execution; using HotChocolate.Execution.Processing; namespace HotChocolate.Data.Projections; From 86a5651a7837e4ac1a5381c7cc735575faee19b0 Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Fri, 16 Jan 2026 15:07:05 +0200 Subject: [PATCH 125/144] Fixed caching tests --- .../Caching/src/Caching/QueryCacheMiddleware.cs | 7 ++----- .../HttpCachingTests.QueryError_Should_Not_Cache.snap | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs b/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs index 2953f9e26f1..3c9f0ecc49b 100644 --- a/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs +++ b/src/HotChocolate/Caching/src/Caching/QueryCacheMiddleware.cs @@ -36,16 +36,13 @@ public async ValueTask InvokeAsync(RequestContext context) return; } - // only single operation results can be cached. - var operationResult = context.Result?.ExpectOperationResult(); - - if (operationResult is { Errors: null, ContextData: { } contextData }) + if (context.Result is OperationResult { Errors.Count: 0, ContextData: { } contextData } operationResult) { contextData = contextData.Add(ExecutionContextData.CacheControlHeaderValue, headerValue); if (constraints.Vary.Length > 0) { - contextData =contextData.Add(ExecutionContextData.VaryHeaderValue, constraints.Vary); + contextData = contextData.Add(ExecutionContextData.VaryHeaderValue, constraints.VaryString); } operationResult.ContextData = contextData; diff --git a/src/HotChocolate/Caching/test/Caching.Tests/__snapshots__/HttpCachingTests.QueryError_Should_Not_Cache.snap b/src/HotChocolate/Caching/test/Caching.Tests/__snapshots__/HttpCachingTests.QueryError_Should_Not_Cache.snap index 790c345c117..802b210230f 100644 --- a/src/HotChocolate/Caching/test/Caching.Tests/__snapshots__/HttpCachingTests.QueryError_Should_Not_Cache.snap +++ b/src/HotChocolate/Caching/test/Caching.Tests/__snapshots__/HttpCachingTests.QueryError_Should_Not_Cache.snap @@ -8,5 +8,5 @@ ] } ], - "Body": "{\"errors\":[{\"message\":\"Unexpected Execution Error\",\"locations\":[{\"line\":1,\"column\":3}],\"path\":[\"field\"]}],\"data\":{\"field\":null}}" + "Body": "{\"errors\":[{\"message\":\"Unexpected Execution Error\",\"path\":[\"field\"]}],\"data\":{\"field\":null}}" } From 21840ad5a89ce6009aa1237d38de9a18d5dbada3 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 16 Jan 2026 14:13:12 +0100 Subject: [PATCH 126/144] Fixed issue with fusion scalars exposing serializeAs --- .../src/Types/Types/Composite/Types/FieldSelectionMapType.cs | 3 +++ .../src/Types/Types/Composite/Types/FieldSelectionSetType.cs | 3 +++ .../src/Types/Types/Scalars/ScalarType.Initialization.cs | 3 ++- src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs | 5 +++++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs index 7f04d4dbe82..b4d87db045c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionMapType.cs @@ -35,6 +35,9 @@ public FieldSelectionMapType(string name, BindingBehavior bind = BindingBehavior { } + /// <inheritdoc /> + protected override bool ApplySerializeAsToScalars => false; + /// <inheritdoc /> protected override IValueSelectionNode OnCoerceInputLiteral(StringValueNode valueLiteral) { diff --git a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs index 2f3a680ef6c..43f2f13270c 100644 --- a/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Composite/Types/FieldSelectionSetType.cs @@ -34,6 +34,9 @@ public FieldSelectionSetType(string name, BindingBehavior bind = BindingBehavior { } + /// <inheritdoc /> + protected override bool ApplySerializeAsToScalars => false; + /// <inheritdoc /> protected override SelectionSetNode OnCoerceInputLiteral(StringValueNode valueLiteral) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.Initialization.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.Initialization.cs index b120fe5dc8e..6f9e1843096 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.Initialization.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.Initialization.cs @@ -58,7 +58,8 @@ protected override void OnRegisterDependencies( context.Dependencies.Add(new TypeDependency(specifiedByTypeRef)); } - if (options.ApplySerializeAsToScalars + if (ApplySerializeAsToScalars + && options.ApplySerializeAsToScalars && SerializationType is not ScalarSerializationType.Undefined && !SpecScalarNames.IsSpecScalar(Name)) { diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs index dfef2f11623..3825c3c22ab 100644 --- a/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs +++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ScalarType.cs @@ -89,6 +89,11 @@ IReadOnlyDirectiveCollection IDirectivesProvider.Directives /// </summary> protected ITypeConverter Converter => _converter; + /// <summary> + /// Gets a value indicating whether the <c>@serializeAs</c> directive should be applied to this scalar type. + /// </summary> + protected virtual bool ApplySerializeAsToScalars => true; + /// <summary> /// Defines if the specified <paramref name="type"/> is assignable from the current <see cref="ScalarType"/>. /// </summary> From 5ce8d6cb3d76f0934092916acb6a63d996f48b7b Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 16 Jan 2026 14:27:39 +0100 Subject: [PATCH 127/144] Added todo --- .../src/Execution.Abstractions/Execution/JsonValueFormatter.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs index 833ffc6302e..68d5f3945e7 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs @@ -8,6 +8,7 @@ namespace HotChocolate.Execution; public static class JsonValueFormatter { + // TODO : are the options still needed? public static void WriteValue( JsonWriter writer, object? value, From cf7fa97356a69e2190ba71de3e4141a487efb100 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 16 Jan 2026 14:27:49 +0100 Subject: [PATCH 128/144] Fixed validation test --- .../test/Validation.Tests/ValuesOfCorrectTypeRuleTests.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/HotChocolate/Core/test/Validation.Tests/ValuesOfCorrectTypeRuleTests.cs b/src/HotChocolate/Core/test/Validation.Tests/ValuesOfCorrectTypeRuleTests.cs index 87101263d1a..d776268c7ea 100644 --- a/src/HotChocolate/Core/test/Validation.Tests/ValuesOfCorrectTypeRuleTests.cs +++ b/src/HotChocolate/Core/test/Validation.Tests/ValuesOfCorrectTypeRuleTests.cs @@ -289,9 +289,11 @@ public void GoodIntNegativeValue() } [Fact] - public void OverflowInt() + public void OverflowInt_Should_Be_Valid() { - ExpectErrors( + // The validation will only look if the literal used is correct. + // The overflow would fail on field execution when the input value is coerced from that literal. + ExpectValid( $$""" { arguments { From 6cc0f280449f56dc663176c5ba68d1cdcd1f89e6 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 16 Jan 2026 14:27:58 +0100 Subject: [PATCH 129/144] Fixed fusion tests --- .../Fusion.AspNetCore.Tests/AnyScalarTests.cs | 16 ++++++++-------- .../Fusion.AspNetCore.Tests/InaccessibleTests.cs | 2 ++ .../Text/Json/CompositeResultDocumentTests.cs | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/AnyScalarTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/AnyScalarTests.cs index a6ea2aa7937..cabe4ff2950 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/AnyScalarTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/AnyScalarTests.cs @@ -13,7 +13,7 @@ public async Task Handle_Any_Scalar_Object() // arrange using var server1 = CreateSourceSchema( "a", - b => b.AddQueryType<Query>()); + b => b.AddQueryType<Query>().AddJsonTypeConverter()); using var gateway = await CreateCompositeSchemaAsync( [ @@ -44,7 +44,7 @@ public async Task Handle_Any_Scalar_SimpleValues() // arrange using var server1 = CreateSourceSchema( "a", - b => b.AddQueryType<Query>()); + b => b.AddQueryType<Query>().AddJsonTypeConverter()); using var gateway = await CreateCompositeSchemaAsync( [ @@ -75,7 +75,7 @@ public async Task Handle_Any_Scalar_List() // arrange using var server1 = CreateSourceSchema( "a", - b => b.AddQueryType<Query>()); + b => b.AddQueryType<Query>().AddJsonTypeConverter()); using var gateway = await CreateCompositeSchemaAsync( [ @@ -106,7 +106,7 @@ public async Task Handle_Any_Scalar_NestedObject() // arrange using var server1 = CreateSourceSchema( "a", - b => b.AddQueryType<Query>()); + b => b.AddQueryType<Query>().AddJsonTypeConverter()); using var gateway = await CreateCompositeSchemaAsync( [ @@ -137,7 +137,7 @@ public async Task Handle_Any_Scalar_ListOfObjects() // arrange using var server1 = CreateSourceSchema( "a", - b => b.AddQueryType<Query>()); + b => b.AddQueryType<Query>().AddJsonTypeConverter()); using var gateway = await CreateCompositeSchemaAsync( [ @@ -168,7 +168,7 @@ public async Task Handle_Any_Scalar_ObjectWithLists() // arrange using var server1 = CreateSourceSchema( "a", - b => b.AddQueryType<Query>()); + b => b.AddQueryType<Query>().AddJsonTypeConverter()); using var gateway = await CreateCompositeSchemaAsync( [ @@ -199,7 +199,7 @@ public async Task Handle_Any_Scalar_ComplexNested() // arrange using var server1 = CreateSourceSchema( "a", - b => b.AddQueryType<Query>()); + b => b.AddQueryType<Query>().AddJsonTypeConverter()); using var gateway = await CreateCompositeSchemaAsync( [ @@ -230,7 +230,7 @@ public async Task Handle_Any_Scalar_NullValue() // arrange using var server1 = CreateSourceSchema( "a", - b => b.AddQueryType<Query>()); + b => b.AddQueryType<Query>().AddJsonTypeConverter()); using var gateway = await CreateCompositeSchemaAsync( [ diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs index 35aadaedad9..fbdfe991651 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/InaccessibleTests.cs @@ -1022,6 +1022,8 @@ public override Type RuntimeType public override ScalarSerializationType SerializationType => ScalarSerializationType.String; + protected override bool ApplySerializeAsToScalars => false; + public override bool IsValueCompatible(IValueNode valueLiteral) => valueLiteral is StringValueNode; diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs index b1dc2970837..c0f68883978 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs @@ -475,7 +475,7 @@ public void Write_Document_To_BufferWriter() compositeResult); var operationResult = new OperationResult( operationResultData); - compositeResult.WriteTo(operationResult, buffer); + compositeResult.WriteTo(operationResult, buffer, new JsonWriterOptions { Indented = true }); // assert var json = Encoding.UTF8.GetString(buffer.WrittenSpan); From a7fbbb80bc567aeda1d8f02cbe50b81a17845ac8 Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Fri, 16 Jan 2026 16:41:02 +0200 Subject: [PATCH 130/144] Fixed StrawberryShake.Transport.InMemory test --- .../JsonDocumentSnapshotValueFormatter.cs | 22 +++++++++++++++++++ .../src/CookieCrumble/Snapshot.cs | 1 + .../InMemoryClientTests.cs | 2 +- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/CookieCrumble/src/CookieCrumble/Formatters/JsonDocumentSnapshotValueFormatter.cs diff --git a/src/CookieCrumble/src/CookieCrumble/Formatters/JsonDocumentSnapshotValueFormatter.cs b/src/CookieCrumble/src/CookieCrumble/Formatters/JsonDocumentSnapshotValueFormatter.cs new file mode 100644 index 00000000000..4f97208c2ae --- /dev/null +++ b/src/CookieCrumble/src/CookieCrumble/Formatters/JsonDocumentSnapshotValueFormatter.cs @@ -0,0 +1,22 @@ +using System.Buffers; +using System.Text.Encodings.Web; +using System.Text.Json; + +namespace CookieCrumble.Formatters; + +internal sealed class JsonDocumentSnapshotValueFormatter() : SnapshotValueFormatter<JsonDocument>("json") +{ + private readonly JsonSerializerOptions _options = new JsonSerializerOptions(JsonSerializerDefaults.Web) + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + WriteIndented = true + }; + + protected override void Format(IBufferWriter<byte> snapshot, JsonDocument value) + { + var buffer = JsonSerializer.SerializeToUtf8Bytes(value, _options); + var span = snapshot.GetSpan(buffer.Length); + buffer.AsSpan().CopyTo(span); + snapshot.Advance(buffer.Length); + } +} diff --git a/src/CookieCrumble/src/CookieCrumble/Snapshot.cs b/src/CookieCrumble/src/CookieCrumble/Snapshot.cs index b23fa3d2082..0298280f0ee 100644 --- a/src/CookieCrumble/src/CookieCrumble/Snapshot.cs +++ b/src/CookieCrumble/src/CookieCrumble/Snapshot.cs @@ -27,6 +27,7 @@ public class Snapshot new PlainTextSnapshotValueFormatter(), new ExceptionSnapshotValueFormatter(), new HttpResponseSnapshotValueFormatter(), + new JsonDocumentSnapshotValueFormatter(), new JsonElementSnapshotValueFormatter() }); private static readonly JsonSnapshotValueFormatter s_defaultFormatter = new(); diff --git a/src/StrawberryShake/Client/test/Transport.InMemory.Tests/InMemoryClientTests.cs b/src/StrawberryShake/Client/test/Transport.InMemory.Tests/InMemoryClientTests.cs index c19ec30fef4..92b8e344c2c 100644 --- a/src/StrawberryShake/Client/test/Transport.InMemory.Tests/InMemoryClientTests.cs +++ b/src/StrawberryShake/Client/test/Transport.InMemory.Tests/InMemoryClientTests.cs @@ -85,7 +85,7 @@ public async Task ExecuteAsync_Default_ExecuteQuery() var request = Assert.IsType<HotChocolate.Execution.OperationRequest>(executor.Request); Assert.Equal(operationRequest.Name, request.OperationName); Assert.Equal("{ foo }", Encoding.UTF8.GetString(request.Document!.AsSpan())); - request.VariableValues?.Document.MatchInlineSnapshot("{ }"); + request.VariableValues?.Document.MatchInlineSnapshot("{}"); } [Fact] From 3f0b8e40c37d9f03f965b9988d2720edb76ce13c Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Fri, 16 Jan 2026 17:26:59 +0200 Subject: [PATCH 131/144] Fixed PersistedOperations tests --- .../IntegrationTests.cs | 5 +++-- .../IntegrationTests.cs | 15 +++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs index f5e3dd7b082..ff732a290aa 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs @@ -37,9 +37,10 @@ await storage.SaveAsync( { await n(c); - if (c.IsPersistedOperationDocument() && c.Result is OperationResult result) + if (c.IsPersistedOperationDocument()) { - result.ContextData = result.ContextData.SetItem("persistedDocument", true); + var result = c.Result.ExpectOperationResult(); + result.Extensions = result.Extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() diff --git a/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs b/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs index fbd7f66e394..9ebb18ca5c0 100644 --- a/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs +++ b/src/HotChocolate/PersistedOperations/test/PersistedOperations.FileSystem.Tests/IntegrationTests.cs @@ -27,9 +27,10 @@ public async Task ExecutePersistedOperation() { await n(c); - if (c.IsPersistedOperationDocument() && c.Result is OperationResult result) + if (c.IsPersistedOperationDocument()) { - result.ContextData = result.ContextData.SetItem("persistedDocument", true); + var result = c.Result.ExpectOperationResult(); + result.Extensions = result.Extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() @@ -62,9 +63,10 @@ public async Task ExecutePersistedOperation_NotFound() { await n(c); - if (c.IsPersistedOperationDocument() && c.Result is OperationResult result) + if (c.IsPersistedOperationDocument()) { - result.ContextData = result.ContextData.SetItem("persistedDocument", true); + var result = c.Result.ExpectOperationResult(); + result.Extensions = result.Extensions.SetItem("persistedDocument", true); } }) .UsePersistedOperationPipeline() @@ -94,9 +96,10 @@ public async Task ExecuteAutomaticPersistedOperation() { await n(c); - if (c.IsPersistedOperationDocument() && c.Result is OperationResult result) + if (c.IsPersistedOperationDocument()) { - result.ContextData = result.ContextData.SetItem("persistedDocument", true); + var result = c.Result.ExpectOperationResult(); + result.Extensions = result.Extensions.SetItem("persistedDocument", true); } }) .UseAutomaticPersistedOperationPipeline() From 1eda3c1494ce7238e2f31e45d0414e89fe3bcbb1 Mon Sep 17 00:00:00 2001 From: tobias-tengler <45513122+tobias-tengler@users.noreply.github.com> Date: Fri, 16 Jan 2026 18:46:54 +0100 Subject: [PATCH 132/144] WIP: FIx most AspNetCore and Fusion tests --- .../Execution/DynamicEndpointMiddleware.cs | 2 +- .../OpenApiResultFormatter.cs | 2 +- .../FusionOpenApiResultFormatter.cs | 2 +- .../DefaultHttpResponseFormatter.cs | 2 +- .../JsonResultFormatter.cs | 115 ++++------ .../AuthorizationTests.cs | 6 - .../GraphQLOverHttpSpecTests.cs | 11 +- ...aMiddlewareTests.Download_GraphQL_SDL.snap | 10 +- ...s.Download_GraphQL_SDL_Explicit_Route.snap | 10 +- ...L_SDL_Explicit_Route_Explicit_Pattern.snap | 10 +- ...MiddlewareTests.Download_GraphQL_Schema.md | 10 +- ...oad_GraphQL_Schema_Slicing_Args_Enabled.md | 10 +- ...ewareTests.Download_GraphQL_Types_SDL.snap | 2 +- ...GraphQL_Types_SDL_Character_and_Query.snap | 4 +- ...MiddlewareTests.SingleRequest_Empty_1.snap | 10 +- ...MiddlewareTests.SingleRequest_Empty_2.snap | 10 +- ...MiddlewareTests.SingleRequest_Empty_3.snap | 10 +- ...MiddlewareTests.SingleRequest_Empty_4.snap | 10 +- .../GraphQLHttpClientTests.cs | 2 +- .../Execution/IRawJsonFormatter.cs | 21 +- .../Execution/JsonValueFormatter.cs | 196 ++++++++++++++---- .../Execution/OperationResult.cs | 76 +------ .../Execution/OperationResultData.cs | 2 +- .../Execution/ResultFieldNames.cs | 25 +++ .../ExecutionOperationResultExtensions.cs | 2 +- .../Extensions/OperationContextExtensions.cs | 4 +- .../Execution/Processing/OperationCompiler.cs | 2 +- .../Processing/SubscriptionExecutor.cs | 2 +- .../Types/Text/Json/ResultDocument.WriteTo.cs | 47 +---- .../Core/src/Types/Text/Json/ResultElement.cs | 2 +- .../Execution.Tests/WarmupRequestTests.cs | 1 - .../Types/SomeRequestMiddleware.cs | 13 +- ...tegrationTests.Class_Request_Middleware.md | 4 +- .../Execution/OperationPlanContext.cs | 22 +- .../Execution/Results/FetchResultStore.cs | 18 +- .../Execution/Results/ValueCompletion.cs | 18 +- .../Json/CompositeResultDocument.WriteTo.cs | 34 +-- .../Text/Json/CompositeResultDocument.cs | 14 -- .../test/Fusion.AspNetCore.Tests/NullTests.cs | 13 +- .../FusionRequestExecutorManagerTests.cs | 13 +- .../Text/Json/CompositeResultDocumentTests.cs | 8 +- .../AutomaticMockingTests.cs | 138 ------------ .../Json/src/Json/JsonConstants.cs | 4 - 43 files changed, 347 insertions(+), 570 deletions(-) diff --git a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs index fa9e8f0e327..171a9dc5eae 100644 --- a/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs +++ b/src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs @@ -97,7 +97,7 @@ await Results.Problem( // If the request had validation errors or execution didn't start, we return HTTP 400. if (operationResult.ContextData.ContainsKey(ExecutionContextData.ValidationErrors) - || operationResult is { IsDataSet: false }) + || !operationResult.Data.HasValue) { var firstErrorMessage = operationResult.Errors.FirstOrDefault()?.Message; diff --git a/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs b/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs index bf6e56be174..845fc0d9c30 100644 --- a/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs +++ b/src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs @@ -20,7 +20,7 @@ public async Task FormatResultAsync( OpenApiEndpointDescriptor endpoint, CancellationToken cancellationToken) { - if (operationResult.Data is not ResultDocument resultDocument) + if (operationResult.Data?.Value is not ResultDocument resultDocument) { await Results.InternalServerError().ExecuteAsync(httpContext); return; diff --git a/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs b/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs index 362b3d01bba..ca3ab4dc520 100644 --- a/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs +++ b/src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs @@ -12,7 +12,7 @@ public async Task FormatResultAsync( OpenApiEndpointDescriptor endpoint, CancellationToken cancellationToken) { - if (operationResult.Data is not CompositeResultDocument resultDocument) + if (operationResult.Data?.Value is not CompositeResultDocument resultDocument) { await Results.InternalServerError().ExecuteAsync(httpContext); return; diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultHttpResponseFormatter.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultHttpResponseFormatter.cs index fbd0f33c145..8228ed16bd7 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultHttpResponseFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultHttpResponseFormatter.cs @@ -380,7 +380,7 @@ protected virtual HttpStatusCode OnDetermineStatusCode( // server is still able to produce a well-formed response. // Even null represents a valid response, in this case of a non-null propagation // that erased the result. - if (result.IsDataSet) + if (result.Data.HasValue) { return HttpStatusCode.OK; } diff --git a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs index ee51b909de8..49d6da30b07 100644 --- a/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/Transport.Formatters/JsonResultFormatter.cs @@ -36,7 +36,7 @@ public JsonResultFormatter(bool indented = false) /// </param> public JsonResultFormatter(JsonResultFormatterOptions options) { - _options = options.CreateWriterOptions(); + _options = options.CreateWriterOptions() with { SkipValidation = true }; _serializerOptions = options.CreateSerializerOptions(); _nullIgnoreCondition = options.NullIgnoreCondition; } @@ -90,14 +90,50 @@ public ValueTask FormatAsync( private void FormatInternal(OperationResult result, IBufferWriter<byte> bufferWriter) { - if (result.JsonFormatter is { } formatter) + var jsonWriter = new JsonWriter(bufferWriter, _options); + + jsonWriter.WriteStartObject(); + + if (result.RequestIndex.HasValue) + { + jsonWriter.WritePropertyName(RequestIndex); + jsonWriter.WriteNumberValue(result.RequestIndex.Value); + } + + if (result.VariableIndex.HasValue) + { + jsonWriter.WritePropertyName(VariableIndex); + jsonWriter.WriteNumberValue(result.VariableIndex.Value); + } + + WriteErrors( + jsonWriter, + result.Errors, + _serializerOptions, + default); + + if (result.Data.HasValue) + { + jsonWriter.WritePropertyName(Data); + result.Data.Value.Formatter.WriteDataTo(jsonWriter); + } + + WriteExtensions( + jsonWriter, + result.Extensions, + _serializerOptions, + default); + + if (result.IsIncremental) { - formatter.WriteTo(result, bufferWriter, _options); - return; + WriteIncremental( + jsonWriter, + result, + _serializerOptions, + default); } - var writer = new JsonWriter(bufferWriter, _options); - WriteResult(writer, result); + jsonWriter.WriteEndObject(); } private async ValueTask FormatInternalAsync( @@ -164,71 +200,4 @@ private async ValueTask FormatInternalAsync( } } } - - private void WriteResult(JsonWriter writer, OperationResult result) - { - writer.WriteStartObject(); - - if (result.RequestIndex.HasValue) - { - writer.WritePropertyName(RequestIndex); - writer.WriteNumberValue(result.RequestIndex.Value); - } - - if (result.VariableIndex.HasValue) - { - writer.WritePropertyName(VariableIndex); - writer.WriteNumberValue(result.VariableIndex.Value); - } - - WriteErrors(writer, result.Errors); - WriteData(writer, result); - WriteExtensions(writer, result.Extensions, _serializerOptions, _nullIgnoreCondition); - WriteHasNext(writer, result); - - writer.WriteEndObject(); - } - - private static void WriteHasNext(JsonWriter writer, OperationResult result) - { - if (result.HasNext.HasValue) - { - writer.WritePropertyName("hasNext"u8); - writer.WriteBooleanValue(result.HasNext.Value); - } - } - - private void WriteData(JsonWriter writer, OperationResult result) - { - if (!result.IsDataSet) - { - return; - } - - if (result.Data is null) - { - writer.WritePropertyName(Data); - writer.WriteNullValue(); - return; - } - - writer.WritePropertyName(Data); - WriteValue(writer, result.Data, _serializerOptions, _nullIgnoreCondition); - } - - private void WriteErrors(JsonWriter writer, IReadOnlyList<IError>? errors) - { - if (errors is { Count: > 0 }) - { - writer.WritePropertyName(Errors); - writer.WriteStartArray(); - - for (var i = 0; i < errors.Count; i++) - { - WriteError(writer, errors[i], _serializerOptions, _nullIgnoreCondition); - } - - writer.WriteEndArray(); - } - } } diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/AuthorizationTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/AuthorizationTests.cs index 8d4664e98d6..0ea1a2af4d9 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/AuthorizationTests.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Authorization.Tests/AuthorizationTests.cs @@ -141,12 +141,6 @@ public async Task AuthServiceIsAlwaysAdded(Action<IRequestExecutorBuilder> confi "Errors": [ { "message": "The `HasAgeDefined` authorization policy does not exist.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], "path": [ "age" ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs index 799e4afb4cc..cd8dd9f78f6 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs @@ -152,13 +152,14 @@ public async Task Query_No_Body(string? acceptHeader, HttpTransportVersion trans .Create() .Add(response) .MatchInline( - @$"Headers: - Content-Type: {expectedContentType} + $$$""" + Headers: + Content-Type: {{{expectedContentType}}} --------------------------> - Status Code: {expectedStatusCode} + Status Code: {{{expectedStatusCode}}} --------------------------> - " - + @"{""errors"":[{""message"":""The GraphQL request is empty."",""extensions"":{""code"":""HC0009""}}]}"); + {"errors":[{"message":"Invalid JSON document.","extensions":{"code":"HC0012"}}]} + """); } [Theory] diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL.snap index 659b2788a2a..9cd5feb1a18 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL.snap @@ -9,7 +9,7 @@ interface Character { name: String! friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection appearsIn: [Episode] - traits: JSON + traits: Any height(unit: Unit): Float } @@ -20,7 +20,7 @@ type Droid implements Character { friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection @listSize(assumedSize: 50, slicingArguments: [ "first", "last" ], slicingArgumentDefaultValue: 10, sizedFields: [ "edges", "nodes" ], requireOneSlicingArgument: false) height(unit: Unit): Float primaryFunction: String - traits: JSON + traits: Any } "A connection to a list of items." @@ -49,7 +49,7 @@ type Human implements Character { otherHuman: Human height(unit: Unit): Float homePlanet: String - traits: JSON + traits: Any } type Mutation { @@ -71,7 +71,7 @@ type PageInfo { type Query { hero(episode: Episode! = NEW_HOPE): Character - heroByTraits(traits: JSON!): Character + heroByTraits(traits: Any!): Character heroes(episodes: [Episode!]!): [Character!] character(characterIds: [String!]!): [Character!]! @cost(weight: "10") search(text: String!): [SearchResult] @@ -131,7 +131,7 @@ directive @listSize("The `assumedSize` argument can be used to statically define "The `@stream` directive may be provided for a field of `List` type so that the backend can leverage technology such as asynchronous iterators to provide a partial list in the initial response, and additional list items in subsequent responses. `@include` and `@skip` take precedence over `@stream`." directive @stream("If this argument label has a value other than null, it will be passed on to the result of this stream directive. This label is intended to give client applications a way to identify to which fragment a streamed result belongs to." label: String "The initial elements that shall be send down to the consumer." initialCount: Int! = 0 "Streamed when true." if: Boolean) on FIELD -scalar JSON +scalar Any "The `Long` scalar type represents non-fractional signed whole 64-bit numeric values. Long can represent values between -(2^63) and 2^63 - 1." scalar Long diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL_Explicit_Route.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL_Explicit_Route.snap index e381869cea0..6ee7c2556d2 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL_Explicit_Route.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL_Explicit_Route.snap @@ -9,7 +9,7 @@ interface Character { name: String! friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection appearsIn: [Episode] - traits: JSON + traits: Any height(unit: Unit): Float } @@ -20,7 +20,7 @@ type Droid implements Character { friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection @listSize(assumedSize: 50, slicingArguments: [ "first", "last" ], slicingArgumentDefaultValue: 10, sizedFields: [ "edges", "nodes" ], requireOneSlicingArgument: false) height(unit: Unit): Float primaryFunction: String - traits: JSON + traits: Any } "A connection to a list of items." @@ -49,7 +49,7 @@ type Human implements Character { otherHuman: Human height(unit: Unit): Float homePlanet: String - traits: JSON + traits: Any } type Mutation { @@ -71,7 +71,7 @@ type PageInfo { type Query { hero(episode: Episode! = NEW_HOPE): Character - heroByTraits(traits: JSON!): Character + heroByTraits(traits: Any!): Character heroes(episodes: [Episode!]!): [Character!] character(characterIds: [String!]!): [Character!]! @cost(weight: "10") search(text: String!): [SearchResult] @@ -129,7 +129,7 @@ directive @listSize("The `assumedSize` argument can be used to statically define "The `@stream` directive may be provided for a field of `List` type so that the backend can leverage technology such as asynchronous iterators to provide a partial list in the initial response, and additional list items in subsequent responses. `@include` and `@skip` take precedence over `@stream`." directive @stream("If this argument label has a value other than null, it will be passed on to the result of this stream directive. This label is intended to give client applications a way to identify to which fragment a streamed result belongs to." label: String "The initial elements that shall be send down to the consumer." initialCount: Int! = 0 "Streamed when true." if: Boolean) on FIELD -scalar JSON +scalar Any "The `Long` scalar type represents non-fractional signed whole 64-bit numeric values. Long can represent values between -(2^63) and 2^63 - 1." scalar Long diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL_Explicit_Route_Explicit_Pattern.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL_Explicit_Route_Explicit_Pattern.snap index e381869cea0..6ee7c2556d2 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL_Explicit_Route_Explicit_Pattern.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_SDL_Explicit_Route_Explicit_Pattern.snap @@ -9,7 +9,7 @@ interface Character { name: String! friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection appearsIn: [Episode] - traits: JSON + traits: Any height(unit: Unit): Float } @@ -20,7 +20,7 @@ type Droid implements Character { friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection @listSize(assumedSize: 50, slicingArguments: [ "first", "last" ], slicingArgumentDefaultValue: 10, sizedFields: [ "edges", "nodes" ], requireOneSlicingArgument: false) height(unit: Unit): Float primaryFunction: String - traits: JSON + traits: Any } "A connection to a list of items." @@ -49,7 +49,7 @@ type Human implements Character { otherHuman: Human height(unit: Unit): Float homePlanet: String - traits: JSON + traits: Any } type Mutation { @@ -71,7 +71,7 @@ type PageInfo { type Query { hero(episode: Episode! = NEW_HOPE): Character - heroByTraits(traits: JSON!): Character + heroByTraits(traits: Any!): Character heroes(episodes: [Episode!]!): [Character!] character(characterIds: [String!]!): [Character!]! @cost(weight: "10") search(text: String!): [SearchResult] @@ -129,7 +129,7 @@ directive @listSize("The `assumedSize` argument can be used to statically define "The `@stream` directive may be provided for a field of `List` type so that the backend can leverage technology such as asynchronous iterators to provide a partial list in the initial response, and additional list items in subsequent responses. `@include` and `@skip` take precedence over `@stream`." directive @stream("If this argument label has a value other than null, it will be passed on to the result of this stream directive. This label is intended to give client applications a way to identify to which fragment a streamed result belongs to." label: String "The initial elements that shall be send down to the consumer." initialCount: Int! = 0 "Streamed when true." if: Boolean) on FIELD -scalar JSON +scalar Any "The `Long` scalar type represents non-fractional signed whole 64-bit numeric values. Long can represent values between -(2^63) and 2^63 - 1." scalar Long diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Schema.md b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Schema.md index 692359a9866..a178ad384d5 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Schema.md +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Schema.md @@ -20,7 +20,7 @@ interface Character { name: String! friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection appearsIn: [Episode] - traits: JSON + traits: Any height(unit: Unit): Float } @@ -31,7 +31,7 @@ type Droid implements Character { friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection @listSize(assumedSize: 50, slicingArguments: [ "first", "last" ], slicingArgumentDefaultValue: 10, sizedFields: [ "edges", "nodes" ], requireOneSlicingArgument: false) height(unit: Unit): Float primaryFunction: String - traits: JSON + traits: Any } "A connection to a list of items." @@ -60,7 +60,7 @@ type Human implements Character { otherHuman: Human height(unit: Unit): Float homePlanet: String - traits: JSON + traits: Any } type Mutation { @@ -82,7 +82,7 @@ type PageInfo { type Query { hero(episode: Episode! = NEW_HOPE): Character - heroByTraits(traits: JSON!): Character + heroByTraits(traits: Any!): Character heroes(episodes: [Episode!]!): [Character!] character(characterIds: [String!]!): [Character!]! @cost(weight: "10") search(text: String!): [SearchResult] @@ -142,7 +142,7 @@ directive @listSize("The `assumedSize` argument can be used to statically define "The `@stream` directive may be provided for a field of `List` type so that the backend can leverage technology such as asynchronous iterators to provide a partial list in the initial response, and additional list items in subsequent responses. `@include` and `@skip` take precedence over `@stream`." directive @stream("If this argument label has a value other than null, it will be passed on to the result of this stream directive. This label is intended to give client applications a way to identify to which fragment a streamed result belongs to." label: String "The initial elements that shall be send down to the consumer." initialCount: Int! = 0 "Streamed when true." if: Boolean) on FIELD -scalar JSON +scalar Any "The `Long` scalar type represents non-fractional signed whole 64-bit numeric values. Long can represent values between -(2^63) and 2^63 - 1." scalar Long diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Schema_Slicing_Args_Enabled.md b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Schema_Slicing_Args_Enabled.md index d1555543ad5..09d0f7a3fcc 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Schema_Slicing_Args_Enabled.md +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Schema_Slicing_Args_Enabled.md @@ -20,7 +20,7 @@ interface Character { name: String! friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection appearsIn: [Episode] - traits: JSON + traits: Any height(unit: Unit): Float } @@ -31,7 +31,7 @@ type Droid implements Character { friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection @listSize(assumedSize: 50, slicingArguments: [ "first", "last" ], slicingArgumentDefaultValue: 10, sizedFields: [ "edges", "nodes" ]) height(unit: Unit): Float primaryFunction: String - traits: JSON + traits: Any } "A connection to a list of items." @@ -60,7 +60,7 @@ type Human implements Character { otherHuman: Human height(unit: Unit): Float homePlanet: String - traits: JSON + traits: Any } type Mutation { @@ -82,7 +82,7 @@ type PageInfo { type Query { hero(episode: Episode! = NEW_HOPE): Character - heroByTraits(traits: JSON!): Character + heroByTraits(traits: Any!): Character heroes(episodes: [Episode!]!): [Character!] character(characterIds: [String!]!): [Character!]! @cost(weight: "10") search(text: String!): [SearchResult] @@ -142,7 +142,7 @@ directive @listSize("The `assumedSize` argument can be used to statically define "The `@stream` directive may be provided for a field of `List` type so that the backend can leverage technology such as asynchronous iterators to provide a partial list in the initial response, and additional list items in subsequent responses. `@include` and `@skip` take precedence over `@stream`." directive @stream("If this argument label has a value other than null, it will be passed on to the result of this stream directive. This label is intended to give client applications a way to identify to which fragment a streamed result belongs to." label: String "The initial elements that shall be send down to the consumer." initialCount: Int! = 0 "Streamed when true." if: Boolean) on FIELD -scalar JSON +scalar Any "The `Long` scalar type represents non-fractional signed whole 64-bit numeric values. Long can represent values between -(2^63) and 2^63 - 1." scalar Long diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Types_SDL.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Types_SDL.snap index 4b10df05130..80aaa6d4593 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Types_SDL.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Types_SDL.snap @@ -1,6 +1,6 @@ type Query { hero(episode: Episode! = NEW_HOPE): Character - heroByTraits(traits: JSON!): Character + heroByTraits(traits: Any!): Character heroes(episodes: [Episode!]!): [Character!] character(characterIds: [String!]!): [Character!]! @cost(weight: "10") search(text: String!): [SearchResult] diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Types_SDL_Character_and_Query.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Types_SDL_Character_and_Query.snap index 712467805d5..e6db59147c8 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Types_SDL_Character_and_Query.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpGetSchemaMiddlewareTests.Download_GraphQL_Types_SDL_Character_and_Query.snap @@ -3,13 +3,13 @@ interface Character { name: String! friends("Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String): FriendsConnection appearsIn: [Episode] - traits: JSON + traits: Any height(unit: Unit): Float } type Query { hero(episode: Episode! = NEW_HOPE): Character - heroByTraits(traits: JSON!): Character + heroByTraits(traits: Any!): Character heroes(episodes: [Episode!]!): [Character!] character(characterIds: [String!]!): [Character!]! @cost(weight: "10") search(text: String!): [SearchResult] diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_1.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_1.snap index 3e2fb6f3bb8..07370229eb4 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_1.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_1.snap @@ -4,15 +4,9 @@ "Data": null, "Errors": [ { - "message": "The request is missing the `query` property and the `id` property.", - "locations": [ - { - "line": 1, - "column": 2 - } - ], + "message": "Request must contain either a query or a document id.", "extensions": { - "code": "HC0011" + "code": "HC0012" } } ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_2.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_2.snap index f0ea44e3542..07370229eb4 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_2.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_2.snap @@ -4,15 +4,9 @@ "Data": null, "Errors": [ { - "message": "The request is missing the `query` property and the `id` property.", - "locations": [ - { - "line": 1, - "column": 3 - } - ], + "message": "Request must contain either a query or a document id.", "extensions": { - "code": "HC0011" + "code": "HC0012" } } ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_3.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_3.snap index 35cb79be640..07370229eb4 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_3.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_3.snap @@ -4,15 +4,9 @@ "Data": null, "Errors": [ { - "message": "The request is missing the `query` property and the `id` property.", - "locations": [ - { - "line": 2, - "column": 1 - } - ], + "message": "Request must contain either a query or a document id.", "extensions": { - "code": "HC0011" + "code": "HC0012" } } ], diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_4.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_4.snap index 35cb79be640..07370229eb4 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_4.snap +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/HttpPostMiddlewareTests.SingleRequest_Empty_4.snap @@ -4,15 +4,9 @@ "Data": null, "Errors": [ { - "message": "The request is missing the `query` property and the `id` property.", - "locations": [ - { - "line": 2, - "column": 1 - } - ], + "message": "Request must contain either a query or a document id.", "extensions": { - "code": "HC0011" + "code": "HC0012" } } ], diff --git a/src/HotChocolate/AspNetCore/test/Transport.Http.Tests/GraphQLHttpClientTests.cs b/src/HotChocolate/AspNetCore/test/Transport.Http.Tests/GraphQLHttpClientTests.cs index 9aa5155d65d..2901bd7691a 100644 --- a/src/HotChocolate/AspNetCore/test/Transport.Http.Tests/GraphQLHttpClientTests.cs +++ b/src/HotChocolate/AspNetCore/test/Transport.Http.Tests/GraphQLHttpClientTests.cs @@ -294,7 +294,7 @@ public async Task Post_GraphQL_Query_With_JsonElement_Variable() const string query = """ - query($traits: JSON!) { + query($traits: Any!) { heroByTraits(traits: $traits) { name } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs index bb1c3e413f1..5120b17998d 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/IRawJsonFormatter.cs @@ -1,8 +1,8 @@ -using System.Buffers; -using System.Text.Json; +using HotChocolate.Text.Json; namespace HotChocolate.Execution; +// TODO: Think about this again /// <summary> /// Represents a low level abstraction that allows the implementor to opt out of the /// standard JSON serialization to emit the JSON directly into the pipe writer @@ -11,19 +11,10 @@ namespace HotChocolate.Execution; public interface IRawJsonFormatter { /// <summary> - /// Writes the JSON data into the <paramref name="writer"/>. + /// Writes the JSON data into the <paramref name="jsonWriter"/>. /// </summary> - /// <param name="result"> - /// The result that shall be serialized. + /// <param name="jsonWriter"> + /// The JSON writer. /// </param> - /// <param name="writer"> - /// The buffer writer of the transport layer. - /// </param> - /// <param name="options"> - /// The JSON writer options. - /// </param> - void WriteTo( - OperationResult result, - IBufferWriter<byte> writer, - JsonWriterOptions options = default); + void WriteDataTo(JsonWriter jsonWriter); } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs index 68d5f3945e7..b88efa7b486 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/JsonValueFormatter.cs @@ -234,80 +234,199 @@ private static void WriteList( writer.WriteEndArray(); } - private static void WriteDictionary( + public static void WriteErrors( JsonWriter writer, - Dictionary<string, object?> dict, + IReadOnlyList<IError> errors, JsonSerializerOptions options, JsonNullIgnoreCondition nullIgnoreCondition) { - writer.WriteStartObject(); - - foreach (var item in dict) + if (errors is { Count: > 0 }) { - if (item.Value is null - && (nullIgnoreCondition & JsonNullIgnoreCondition.Fields) == JsonNullIgnoreCondition.Fields) + writer.WritePropertyName(ResultFieldNames.Errors); + + writer.WriteStartArray(); + + for (var i = 0; i < errors.Count; i++) { - continue; + WriteError(writer, errors[i], options, nullIgnoreCondition); } - writer.WritePropertyName(item.Key); - WriteValue(writer, item.Value, options, nullIgnoreCondition); + writer.WriteEndArray(); } + } + + public static void WriteError( + JsonWriter writer, + IError error, + JsonSerializerOptions options, + JsonNullIgnoreCondition nullIgnoreCondition) + { + writer.WriteStartObject(); + + writer.WritePropertyName(Message); + writer.WriteStringValue(error.Message); + + WriteLocations(writer, error.Locations); + WritePath(writer, error.Path); + WriteExtensions(writer, error.Extensions, options, nullIgnoreCondition); writer.WriteEndObject(); } - private static void WriteLocations(JsonWriter writer, IReadOnlyList<Location>? locations) + public static void WriteExtensions( + JsonWriter writer, + IReadOnlyDictionary<string, object?>? dict, + JsonSerializerOptions options, + JsonNullIgnoreCondition nullIgnoreCondition) { - if (locations is { Count: > 0 }) + if (dict is { Count: > 0 }) { - writer.WritePropertyName(Locations); + writer.WritePropertyName(Extensions); + WriteDictionary(writer, dict, options, nullIgnoreCondition); + } + } + + public static void WriteIncremental( + JsonWriter writer, + OperationResult result, + JsonSerializerOptions options, + JsonNullIgnoreCondition nullIgnoreCondition) + { + if (result.Pending is { Count: > 0 } pending) + { + writer.WritePropertyName(Pending); writer.WriteStartArray(); - for (var i = 0; i < locations.Count; i++) + for (var i = 0; i < pending.Count; i++) { - WriteLocation(writer, locations[i]); + WriteIncrementalPendingItem(writer, pending[i]); + } + + writer.WriteEndArray(); + } + + if (result.Incremental is { Count: > 0 } incremental) + { + writer.WritePropertyName(Incremental); + + writer.WriteStartArray(); + + for (var i = 0; i < incremental.Count; i++) + { + WriteIncrementalItem(writer, incremental[i], options, nullIgnoreCondition); + } + + writer.WriteEndArray(); + } + + if (result.Completed is { Count: > 0 } completed) + { + writer.WritePropertyName(Completed); + + writer.WriteStartArray(); + + for (var i = 0; i < completed.Count; i++) + { + WriteIncrementalCompletedItem(writer, completed[i]); } writer.WriteEndArray(); } + + if (result.HasNext.HasValue) + { + writer.WritePropertyName(HasNext); + writer.WriteBooleanValue(result.HasNext.Value); + } } - public static void WriteErrors( - JsonWriter writer, - IReadOnlyList<IError> error, - JsonSerializerOptions options, - JsonNullIgnoreCondition nullIgnoreCondition) + private static void WriteIncrementalPendingItem(JsonWriter writer, PendingResult item) { - writer.WriteStartArray(); + writer.WriteStartObject(); - for (var i = 0; i < error.Count; i++) + writer.WritePropertyName(Id); + writer.WriteNumberValue(item.Id); + + writer.WritePropertyName(ResultFieldNames.Path); + WritePathValue(writer, item.Path); + + if (!string.IsNullOrEmpty(item.Label)) { - WriteError(writer, error[i], options, nullIgnoreCondition); + writer.WritePropertyName(Label); + writer.WriteStringValue(item.Label); } - writer.WriteEndArray(); + writer.WriteEndObject(); } - public static void WriteError( + private static void WriteIncrementalItem( JsonWriter writer, - IError error, + IIncrementalResult item, JsonSerializerOptions options, JsonNullIgnoreCondition nullIgnoreCondition) { writer.WriteStartObject(); - writer.WritePropertyName(Message); - writer.WriteStringValue(error.Message); + writer.WritePropertyName(Id); + writer.WriteNumberValue(item.Id); - WriteLocations(writer, error.Locations); - WritePath(writer, error.Path); - WriteExtensions(writer, error.Extensions, options, nullIgnoreCondition); + if (item.Errors is { Count: > 0 }) + { + WriteErrors(writer, item.Errors, options, nullIgnoreCondition); + } + + if (item is IIncrementalObjectResult objectResult) + { + writer.WritePropertyName(Data); + + // TODO: Write actual data + writer.WriteStartObject(); + writer.WriteEndObject(); + } + else if (item is IIncrementalListResult listResult) + { + writer.WritePropertyName(Items); + + // TODO: Write actual data + writer.WriteStartArray(); + writer.WriteEndArray(); + } + else + { + throw new NotSupportedException(); + } + + writer.WriteEndObject(); + } + + private static void WriteIncrementalCompletedItem(JsonWriter writer, CompletedResult item) + { + writer.WriteStartObject(); + + writer.WritePropertyName(Id); + writer.WriteNumberValue(item.Id); writer.WriteEndObject(); } + private static void WriteLocations(JsonWriter writer, IReadOnlyList<Location>? locations) + { + if (locations is { Count: > 0 }) + { + writer.WritePropertyName(Locations); + + writer.WriteStartArray(); + + for (var i = 0; i < locations.Count; i++) + { + WriteLocation(writer, locations[i]); + } + + writer.WriteEndArray(); + } + } + private static void WriteLocation(JsonWriter writer, Location location) { writer.WriteStartObject(); @@ -318,7 +437,7 @@ private static void WriteLocation(JsonWriter writer, Location location) writer.WriteEndObject(); } - public static void WritePath(JsonWriter writer, Path? path) + private static void WritePath(JsonWriter writer, Path? path) { if (path is not null) { @@ -354,17 +473,4 @@ private static void WritePathValue(JsonWriter writer, Path path) writer.WriteEndArray(); } - - public static void WriteExtensions( - JsonWriter writer, - IReadOnlyDictionary<string, object?>? dict, - JsonSerializerOptions options, - JsonNullIgnoreCondition nullIgnoreCondition) - { - if (dict is { Count: > 0 }) - { - writer.WritePropertyName(Extensions); - WriteDictionary(writer, dict, options, nullIgnoreCondition); - } - } } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs index ae4c72ca709..9b07a882801 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResult.cs @@ -8,7 +8,6 @@ namespace HotChocolate.Execution; /// </summary> public sealed class OperationResult : ExecutionResult { - private readonly DataFlags _dataFlags; private ImmutableList<IError> _errors; private ImmutableOrderedDictionary<string, object?> _extensions; @@ -42,15 +41,10 @@ public OperationResult( throw new ArgumentException("Either data or errors must be provided or extensions must be provided."); } - _dataFlags = data.IsValueNull - ? DataFlags.DataIsSet | DataFlags.DataIsNull - : DataFlags.DataIsSet; - Data = data.Value; + Data = data; _errors = errors ?? []; _extensions = extensions ?? []; - Features.Set(data.Formatter); - if (data.MemoryHolder is { } memoryHolder) { RegisterForCleanup(() => @@ -61,40 +55,6 @@ public OperationResult( } } - /// <summary> - /// Initializes a new instance of <see cref="OperationResult"/> with dictionary-based data. - /// </summary> - /// <param name="data"> - /// The data dictionary representing the GraphQL response data. - /// </param> - /// <param name="errors"> - /// The GraphQL errors that occurred during execution. - /// </param> - /// <param name="extensions"> - /// Additional information passed along with the result. - /// </param> - /// <exception cref="ArgumentException"> - /// Thrown when neither data, errors, nor extensions are provided. - /// </exception> - public OperationResult( - IReadOnlyDictionary<string, object?>? data, - ImmutableList<IError>? errors = null, - ImmutableOrderedDictionary<string, object?>? extensions = null) - { - if (data is null && errors is null or { Count: 0 } && extensions is null or { Count: 0 }) - { - throw new ArgumentException("Either data or errors must be provided or extensions must be provided."); - } - - _dataFlags = data is null - ? DataFlags.DataIsSet | DataFlags.DataIsNull - : DataFlags.DataIsSet; - - Data = data; - _errors = errors ?? []; - _extensions = extensions ?? []; - } - /// <summary> /// Initializes a new instance of <see cref="OperationResult"/> with only errors. /// </summary> @@ -119,7 +79,6 @@ public OperationResult(ImmutableList<IError> errors, ImmutableOrderedDictionary< throw new ArgumentException("At least one error must be provided."); } - _dataFlags = DataFlags.DataIsNull; _errors = errors; _extensions = extensions ?? []; } @@ -145,7 +104,6 @@ public OperationResult(ImmutableOrderedDictionary<string, object?> extensions) throw new ArgumentException("At least one extension must be provided."); } - _dataFlags = DataFlags.DataIsNull; _errors = []; _extensions = extensions; } @@ -185,19 +143,7 @@ public Path? Path /// <summary> /// Gets the data that is being delivered in this operation result. /// </summary> - public object? Data { get; } - - /// <summary> - /// Gets a value indicating whether data was explicitly set. - /// If <c>false</c>, the data was not set (including null). - /// </summary> - public bool IsDataSet => (_dataFlags & DataFlags.DataIsSet) == DataFlags.DataIsSet; - - /// <summary> - /// Gets a value indicating whether is null or not set. - /// If <c>true</c>, the data is null or not set. - /// </summary> - public bool IsDataNull => (_dataFlags & DataFlags.DataIsNull) == DataFlags.DataIsNull; + public OperationResultData? Data { get; } /// <summary> /// Gets the GraphQL errors that occurred during execution. @@ -207,7 +153,7 @@ public ImmutableList<IError> Errors get => _errors; set { - if (IsDataNull && Errors is null or { Count: 0 } && Extensions is null or { Count: 0 }) + if (!Data.HasValue && Errors is null or { Count: 0 } && Extensions is null or { Count: 0 }) { throw new ArgumentException("Either data, errors or extensions must be provided."); } @@ -227,7 +173,7 @@ public ImmutableList<IError> Errors get => _extensions; set { - if (IsDataNull && Errors is null or { Count: 0 } && Extensions is null or { Count: 0 }) + if (!Data.HasValue && Errors is null or { Count: 0 } && Extensions is null or { Count: 0 }) { throw new ArgumentException("Either data, errors or extensions must be provided."); } @@ -298,10 +244,9 @@ public bool? HasNext } /// <summary> - /// Gets the JSON formatter that can serialize this operation result. - /// Used for high-performance custom serialization. + /// Gets whether this result is incremental. /// </summary> - public IRawJsonFormatter? JsonFormatter => Features.Get<IRawJsonFormatter>(); + public bool IsIncremental => Features.Get<IncrementalDataFeature>() is not null; /// <summary> /// Creates an operation result containing a single error. @@ -318,13 +263,4 @@ public static OperationResult FromError(IError error) /// <returns>An operation result containing the specified errors.</returns> public static OperationResult FromError(params ImmutableList<IError> errors) => new(errors); - - [Flags] - private enum DataFlags - { - // ReSharper disable once UnusedMember.Local - None = 0, - DataIsNull = 1, - DataIsSet = 2 - } } diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultData.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultData.cs index b6a5555512e..56aa1bf92e4 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultData.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/OperationResultData.cs @@ -3,7 +3,7 @@ namespace HotChocolate.Execution; /// <summary> /// Represents the data portion of a GraphQL operation result with its associated formatter and memory management. /// </summary> -public readonly ref struct OperationResultData +public readonly struct OperationResultData { /// <summary> /// Initializes a new instance of <see cref="OperationResultData"/>. diff --git a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResultFieldNames.cs b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResultFieldNames.cs index d2ae8c02dfb..79dad9f0905 100644 --- a/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResultFieldNames.cs +++ b/src/HotChocolate/Core/src/Execution.Abstractions/Execution/ResultFieldNames.cs @@ -55,6 +55,31 @@ public static class ResultFieldNames /// </summary> public static ReadOnlySpan<byte> Incremental => "incremental"u8; + /// <summary> + /// Gets the completed field name. + /// </summary> + public static ReadOnlySpan<byte> Completed => "completed"u8; + + /// <summary> + /// Gets the pending field name. + /// </summary> + public static ReadOnlySpan<byte> Pending => "pending"u8; + + /// <summary> + /// Gets the id field name. + /// </summary> + public static ReadOnlySpan<byte> Id => "id"u8; + + /// <summary> + /// Gets the label field name. + /// </summary> + public static ReadOnlySpan<byte> Label => "label"u8; + + /// <summary> + /// Gets the hasNext field name + /// </summary> + public static ReadOnlySpan<byte> HasNext => "hasNext"u8; + /// <summary> /// Gets the request index field name. /// </summary> diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionOperationResultExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionOperationResultExtensions.cs index 54d3b2e774d..379777aff13 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionOperationResultExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/ExecutionOperationResultExtensions.cs @@ -20,7 +20,7 @@ public static class ExecutionOperationResultExtensions /// </exception> public ResultElement UnwrapData() { - if (result.Data is not ResultDocument resultDocument) + if (result.Data?.Value is not ResultDocument resultDocument) { throw new InvalidOperationException( "Unexpected data object type."); diff --git a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs index 2803440b471..45648bc5387 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Extensions/OperationContextExtensions.cs @@ -97,8 +97,8 @@ public OperationResult BuildResult() resultBuilder.Errors, resultBuilder.Extensions) { - RequestIndex = resultBuilder.RequestIndex > -1 ? resultBuilder.RequestIndex : 0, - VariableIndex = resultBuilder.VariableIndex > -1 ? resultBuilder.VariableIndex : 0, + RequestIndex = resultBuilder.RequestIndex > -1 ? resultBuilder.RequestIndex : null, + VariableIndex = resultBuilder.VariableIndex > -1 ? resultBuilder.VariableIndex : null, ContextData = resultBuilder.ContextData }; diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index 7ae336b6f0b..acc9427ce7c 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -79,7 +79,7 @@ public Operation Compile( ArgumentNullException.ThrowIfNull(document); // Before we can plan an operation, we must de-fragmentize it and remove static include conditions. - document = _documentRewriter.RewriteDocument(document); + document = _documentRewriter.RewriteDocument(document, operationName); var operationDefinition = document.GetOperation(operationName); var includeConditions = new IncludeConditionCollection(); diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs index ee00cb1b8aa..d7fa734c545 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/SubscriptionExecutor.cs @@ -84,7 +84,7 @@ public async Task<IExecutionResult> ExecuteAsync( await subscription.DisposeAsync().ConfigureAwait(false); } - return new OperationResult(null, Unwrap(error)); + return new OperationResult(Unwrap(error)); } static ImmutableList<IError> Unwrap(IError error) diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs index 176e242ff2b..6c97757b57e 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultDocument.WriteTo.cs @@ -1,41 +1,23 @@ -using System.Buffers; using System.Diagnostics; -using System.Text.Json; using HotChocolate.Execution; namespace HotChocolate.Text.Json; public sealed partial class ResultDocument : IRawJsonFormatter { - public void WriteTo(OperationResult result, IBufferWriter<byte> writer, JsonWriterOptions options) + public void WriteDataTo(JsonWriter jsonWriter) { - options = options with { SkipValidation = true }; - var jsonWriter = new JsonWriter(writer, options); - var formatter = new RawJsonFormatter(this, jsonWriter, options); - formatter.Write(result); + var formatter = new RawJsonFormatter(this, jsonWriter); + formatter.Write(); } - internal readonly ref struct RawJsonFormatter(ResultDocument document, JsonWriter writer, JsonWriterOptions options) + internal readonly ref struct RawJsonFormatter(ResultDocument document, JsonWriter writer) { - public void Write(OperationResult result) + public void Write() { - writer.WriteStartObject(); - - if (!result.Errors.IsEmpty) - { - writer.WritePropertyName(JsonConstants.Errors); - JsonValueFormatter.WriteErrors( - writer, - result.Errors, - CreateSerializerOptions(), - default); - } - var root = Cursor.Zero; var row = document._metaDb.Get(root); - writer.WritePropertyName(JsonConstants.Data); - if (row.TokenType is ElementTokenType.Null || (ElementFlags.IsInvalidated & row.Flags) == ElementFlags.IsInvalidated) { @@ -45,18 +27,6 @@ public void Write(OperationResult result) { WriteObject(root, row); } - - if (result.Extensions?.Count > 0) - { - writer.WritePropertyName(JsonConstants.Extensions); - JsonValueFormatter.WriteDictionary( - writer, - result.Extensions, - CreateSerializerOptions(), - default); - } - - writer.WriteEndObject(); } public void WriteValue(Cursor cursor, DbRow row) @@ -184,12 +154,5 @@ private void WriteArray(Cursor start, DbRow startRow) writer.WriteEndArray(); } - - private JsonSerializerOptions CreateSerializerOptions() - => new(JsonSerializerDefaults.Web) - { - Encoder = options.Encoder, - WriteIndented = options.Indented - }; } } diff --git a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs index 91c6d1504c4..eff92f7166c 100644 --- a/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs +++ b/src/HotChocolate/Core/src/Types/Text/Json/ResultElement.cs @@ -1158,7 +1158,7 @@ public void WriteTo(IBufferWriter<byte> writer, bool indented = false) Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; var jsonWriter = new JsonWriter(writer, options); - var formatter = new ResultDocument.RawJsonFormatter(_parent, jsonWriter, options); + var formatter = new ResultDocument.RawJsonFormatter(_parent, jsonWriter); var row = _parent._metaDb.Get(_cursor); formatter.WriteValue(_cursor, row); } diff --git a/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs b/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs index 2444972cb98..56e466e0511 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/WarmupRequestTests.cs @@ -47,7 +47,6 @@ public async Task Warmup_Request_Warms_Up_Caches() // assert 2 Assert.Empty(regularOperationResult.Errors); - Assert.False(regularOperationResult.IsDataNull); Assert.True(regularOperationResult.UnwrapData().EnumerateObject().Any()); Assert.True(documentCache.TryGetDocument(documentId, out _)); diff --git a/src/HotChocolate/Core/test/Types.Analyzers.Tests/Types/SomeRequestMiddleware.cs b/src/HotChocolate/Core/test/Types.Analyzers.Tests/Types/SomeRequestMiddleware.cs index 4b0466aa0fd..6400a32c34a 100644 --- a/src/HotChocolate/Core/test/Types.Analyzers.Tests/Types/SomeRequestMiddleware.cs +++ b/src/HotChocolate/Core/test/Types.Analyzers.Tests/Types/SomeRequestMiddleware.cs @@ -1,3 +1,4 @@ +using HotChocolate.Collections.Immutable; using HotChocolate.Execution; namespace HotChocolate.Types; @@ -8,14 +9,10 @@ public async ValueTask InvokeAsync(RequestContext context, Service3 service3) { await next(context); - context.Result = - new OperationResult( - new Dictionary<string, object?> - { - { - $"{service1.Say()} {service3.Hello()} {service2.World()}", true - } - }); + var builder = ImmutableOrderedDictionary.CreateBuilder<string, object?>(); + builder.Add("middleware", $"{service1.Say()} {service3.Hello()} {service2.World()}"); + + context.Result = new OperationResult(builder.ToImmutable()); } } diff --git a/src/HotChocolate/Core/test/Types.Analyzers.Tests/__snapshots__/IntegrationTests.Class_Request_Middleware.md b/src/HotChocolate/Core/test/Types.Analyzers.Tests/__snapshots__/IntegrationTests.Class_Request_Middleware.md index 789ef1759a2..31906bcd140 100644 --- a/src/HotChocolate/Core/test/Types.Analyzers.Tests/__snapshots__/IntegrationTests.Class_Request_Middleware.md +++ b/src/HotChocolate/Core/test/Types.Analyzers.Tests/__snapshots__/IntegrationTests.Class_Request_Middleware.md @@ -2,8 +2,8 @@ ```json { - "data": { - "Say Hello World": true + "extensions": { + "middleware": "Say Hello World" } } ``` diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs index bb1f55e0f45..c7e9e90a740 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/OperationPlanContext.cs @@ -277,15 +277,14 @@ internal OperationResult Complete(bool reusable = false) } : null; - var result = _resultStore.Result; + var resultDocument = _resultStore.Result; var operationResult = new OperationResult( new OperationResultData( - result, - result.Data.IsNullOrInvalidated, - result, - result), - result.Errors?.ToImmutableList(), - result.Extensions?.ToImmutableOrderedDictionary()); + resultDocument, + resultDocument.Data.IsNullOrInvalidated, + resultDocument, + resultDocument), + _resultStore.Errors?.ToImmutableList()); // we take over the memory owners from the result context // and store them on the response so that the server can @@ -302,8 +301,9 @@ internal OperationResult Complete(bool reusable = false) var writer = new PooledArrayWriter(); s_planFormatter.Format(writer, OperationPlan, trace); var value = new RawJsonValue(writer.WrittenMemory); - result.Extensions ??= []; - result.Extensions.Add("fusion", new Dictionary<string, object?> { { "operationPlan", value } }); + operationResult.Extensions = operationResult.Extensions.SetItem( + "fusion", + new Dictionary<string, object?> { { "operationPlan", value } }); operationResult.RegisterForCleanup(writer); } @@ -313,8 +313,8 @@ internal OperationResult Complete(bool reusable = false) } Debug.Assert( - !result.Data.IsInvalidated - || result.Errors?.Count > 0, + !resultDocument.Data.IsInvalidated + || operationResult.Errors.Count > 0, "Expected to either valid data or errors"); // resets the store and client scope for another execution. diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/FetchResultStore.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/FetchResultStore.cs index 0f95a7f9f6f..72e8df4eadd 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/FetchResultStore.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/FetchResultStore.cs @@ -27,6 +27,7 @@ internal sealed class FetchResultStore : IDisposable private readonly ConcurrentStack<IDisposable> _memory = []; private CompositeResultDocument _result; private ValueCompletion _valueCompletion; + private List<IError>? _errors; private bool _disposed; public FetchResultStore( @@ -48,8 +49,8 @@ public FetchResultStore( _result = new CompositeResultDocument(operation, includeFlags); _valueCompletion = new ValueCompletion( + this, _schema, - _result, _errorHandler, _errorHandlingMode, maxDepth: 32); @@ -62,10 +63,11 @@ public void Reset() ObjectDisposedException.ThrowIf(_disposed, this); _result = new CompositeResultDocument(_operation, _includeFlags); + _errors?.Clear(); _valueCompletion = new ValueCompletion( + this, _schema, - _result, _errorHandler, _errorHandlingMode, maxDepth: 32); @@ -75,6 +77,8 @@ public void Reset() public CompositeResultDocument Result => _result; + public IReadOnlyList<IError>? Errors => _errors; + public ConcurrentStack<IDisposable> MemoryOwners => _memory; public bool AddPartialResults( @@ -111,8 +115,8 @@ public bool AddPartialResults( if (result.Errors?.RootErrors is { Length: > 0 } rootErrors) { - _result.Errors ??= []; - _result.Errors.AddRange(rootErrors); + _errors ??= []; + _errors.AddRange(rootErrors); } dataElement = GetDataElement(sourcePath, result.Data); @@ -169,6 +173,12 @@ public bool AddPartialResults(SourceResultDocument document, ReadOnlySpan<string } } + public void AddError(IError error) + { + _errors ??= []; + _errors.Add(error); + } + public bool AddErrors(IError error, ReadOnlySpan<string> responseNames, params ReadOnlySpan<Path> paths) { _lock.EnterWriteLock(); diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/ValueCompletion.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/ValueCompletion.cs index bbf40cfb054..53fb06def00 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/ValueCompletion.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Execution/Results/ValueCompletion.cs @@ -12,23 +12,23 @@ namespace HotChocolate.Fusion.Execution.Results; internal sealed class ValueCompletion { + private readonly FetchResultStore _store; private readonly ISchemaDefinition _schema; - private readonly CompositeResultDocument _result; private readonly IErrorHandler _errorHandler; private readonly ErrorHandlingMode _errorHandlingMode; private readonly int _maxDepth; public ValueCompletion( + FetchResultStore store, ISchemaDefinition schema, - CompositeResultDocument result, IErrorHandler errorHandler, ErrorHandlingMode errorHandlingMode, int maxDepth) { ArgumentNullException.ThrowIfNull(schema); + _store = store; _schema = schema; - _result = result; _errorHandler = errorHandler; _errorHandlingMode = errorHandlingMode; _maxDepth = maxDepth; @@ -115,8 +115,7 @@ public bool BuildErrorResult( .Build(); errorWithPath = _errorHandler.Handle(errorWithPath); - _result.Errors ??= []; - _result.Errors.Add(errorWithPath); + _store.AddError(errorWithPath); switch (_errorHandlingMode) { @@ -193,8 +192,7 @@ private bool TryCompleteValue( error = _errorHandler.Handle(error); - _result.Errors ??= []; - _result.Errors.Add(error); + _store.AddError(error); if (_errorHandlingMode is ErrorHandlingMode.Propagate or ErrorHandlingMode.Halt) { @@ -221,8 +219,7 @@ private bool TryCompleteValue( .Build(); errorWithPath = _errorHandler.Handle(errorWithPath); - _result.Errors ??= []; - _result.Errors.Add(errorWithPath); + _store.AddError(errorWithPath); if (_errorHandlingMode is ErrorHandlingMode.Halt) { @@ -292,8 +289,7 @@ private bool TryCompleteList( .Build(); errorWithPath = _errorHandler.Handle(errorWithPath); - _result.Errors ??= []; - _result.Errors.Add(errorWithPath); + _store.AddError(errorWithPath); if (_errorHandlingMode is ErrorHandlingMode.Halt) { diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs index df7efccac19..a028a66c65c 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.WriteTo.cs @@ -1,6 +1,4 @@ -using System.Buffers; using System.Diagnostics; -using System.Text.Json; using HotChocolate.Execution; using HotChocolate.Text.Json; @@ -8,35 +6,19 @@ namespace HotChocolate.Fusion.Text.Json; public sealed partial class CompositeResultDocument : IRawJsonFormatter { - public void WriteTo(OperationResult result, IBufferWriter<byte> writer, JsonWriterOptions options = default) + public void WriteDataTo(JsonWriter jsonWriter) { - options = options with { SkipValidation = true }; - var jsonWriter = new JsonWriter(writer, options); var formatter = new RawJsonFormatter(this, jsonWriter); formatter.Write(); } - internal ref struct RawJsonFormatter(CompositeResultDocument document, JsonWriter writer) + internal readonly ref struct RawJsonFormatter(CompositeResultDocument document, JsonWriter writer) { public void Write() { - writer.WriteStartObject(); - - if (document._errors?.Count > 0) - { - writer.WritePropertyName(JsonConstants.Errors); - JsonValueFormatter.WriteErrors( - writer, - document._errors, - JsonSerializerOptionDefaults.GraphQL, - default); - } - var root = Cursor.Zero; var row = document._metaDb.Get(root); - writer.WritePropertyName(JsonConstants.Data); - if (row.TokenType is ElementTokenType.Null || (ElementFlags.Invalidated & row.Flags) == ElementFlags.Invalidated) { @@ -46,18 +28,6 @@ public void Write() { WriteObject(root, row); } - - if (document._extensions?.Count > 0) - { - writer.WritePropertyName(JsonConstants.Extensions); - JsonValueFormatter.WriteDictionary( - writer, - document._extensions, - JsonSerializerOptionDefaults.GraphQL, - default); - } - - writer.WriteEndObject(); } public void WriteValue(Cursor cursor, DbRow row) diff --git a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs index 0b140af8af7..a41a9359ef8 100644 --- a/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs +++ b/src/HotChocolate/Fusion-vnext/src/Fusion.Execution/Text/Json/CompositeResultDocument.cs @@ -14,8 +14,6 @@ public sealed partial class CompositeResultDocument : IDisposable private readonly List<SourceResultDocument> _sources = []; private readonly Operation _operation; private readonly ulong _includeFlags; - private List<IError>? _errors; - private OrderedDictionary<string, object?>? _extensions; internal MetaDb _metaDb; private bool _disposed; @@ -30,18 +28,6 @@ public CompositeResultDocument(Operation operation, ulong includeFlags) public CompositeResultElement Data { get; } - public List<IError>? Errors - { - get => _errors; - internal set => _errors = value; - } - - public OrderedDictionary<string, object?>? Extensions - { - get => _extensions; - internal set => _extensions = value; - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ElementTokenType GetElementTokenType(Cursor cursor) => _metaDb.GetElementTokenType(cursor); diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/NullTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/NullTests.cs index 6e831ae3e29..b0b39799d87 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/NullTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.AspNetCore.Tests/NullTests.cs @@ -6,7 +6,7 @@ namespace HotChocolate.Fusion; public class NullTests : FusionTestBase { - [Fact] + [Fact(Skip = "Fix result generation")] public async Task Raise_NonNullViolation_Error_For_NonNull_Field_Being_Null() { // arrange @@ -17,11 +17,12 @@ public async Task Raise_NonNullViolation_Error_For_NonNull_Field_Being_Null() WellKnownRequestMiddleware.OperationExecutionMiddleware, (_, _) => context => { - context.Result = new OperationResult( - new Dictionary<string, object?> - { - ["nonNullString"] = null - }); + // TODO: Re-add this + // context.Result = new OperationResult( + // new Dictionary<string, object?> + // { + // ["nonNullString"] = null + // }); return ValueTask.CompletedTask; }, key: "SetNull")); diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs index 3af54b3fafb..253bb0e92c1 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Execution/FusionRequestExecutorManagerTests.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using HotChocolate.Collections.Immutable; using HotChocolate.Execution; using HotChocolate.Fusion.Configuration; using HotChocolate.Fusion.Execution.Nodes; @@ -91,13 +92,7 @@ type Query { var plan = context.GetOperationPlan(); context.Result = new OperationResult( - new Dictionary<string, object?> - { - { "foo", null } - }) - { - ContextData = ImmutableDictionary<string, object?>.Empty.Add("operationPlan", plan) - }; + ImmutableOrderedDictionary<string, object?>.Empty.Add("operationPlan", plan)); return ValueTask.CompletedTask; }; }) @@ -119,8 +114,8 @@ query Test { .Build()); // assert - Assert.NotNull(result.ContextData); - Assert.True(result.ContextData.TryGetValue("operationPlan", out var operationPlan)); + var operationResult = result.ExpectOperationResult(); + Assert.True(operationResult.Extensions.TryGetValue("operationPlan", out var operationPlan)); Assert.NotNull(operationPlan); Assert.Equal("Test", Assert.IsType<OperationPlan>(operationPlan).OperationName); } diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs index c0f68883978..0e6bfaffd23 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.Execution.Tests/Text/Json/CompositeResultDocumentTests.cs @@ -3,6 +3,7 @@ using System.Text.Json; using HotChocolate.Buffers; using HotChocolate.Execution; +using HotChocolate.Transport.Formatters; namespace HotChocolate.Fusion.Text.Json; @@ -475,7 +476,8 @@ public void Write_Document_To_BufferWriter() compositeResult); var operationResult = new OperationResult( operationResultData); - compositeResult.WriteTo(operationResult, buffer, new JsonWriterOptions { Indented = true }); + + new JsonResultFormatter(indented: true).Format(operationResult, buffer); // assert var json = Encoding.UTF8.GetString(buffer.WrittenSpan); @@ -542,7 +544,9 @@ public async Task Write_Document_To_PipeWriter() compositeResult); var operationResult = new OperationResult( operationResultData); - compositeResult.WriteTo(operationResult, writer, new JsonWriterOptions { Indented = true}); + + new JsonResultFormatter(indented: true).Format(operationResult, writer); + await writer.FlushAsync(); await writer.CompleteAsync(); diff --git a/src/HotChocolate/Fusion-vnext/test/Fusion.Tests.Shared/AutomaticMockingTests.cs b/src/HotChocolate/Fusion-vnext/test/Fusion.Tests.Shared/AutomaticMockingTests.cs index 3e01661ad47..31140bb9767 100644 --- a/src/HotChocolate/Fusion-vnext/test/Fusion.Tests.Shared/AutomaticMockingTests.cs +++ b/src/HotChocolate/Fusion-vnext/test/Fusion.Tests.Shared/AutomaticMockingTests.cs @@ -123,12 +123,6 @@ type Object { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "obj" ] @@ -342,12 +336,6 @@ type Object { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "objs", 1 @@ -449,12 +437,6 @@ type Object { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 3, - "column": 5 - } - ], "path": [ "objs", 1, @@ -637,12 +619,6 @@ ... on Object { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "intrface" ] @@ -901,12 +877,6 @@ ... on Object { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "interfaces" ] @@ -1027,12 +997,6 @@ ... on Object { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "interfaces", 1 @@ -1173,12 +1137,6 @@ ... on Object { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 7, - "column": 7 - } - ], "path": [ "interfaces", 1, @@ -1407,12 +1365,6 @@ ... on Object { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "unon" ] @@ -1641,12 +1593,6 @@ ... on Object { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "unions" ] @@ -1755,12 +1701,6 @@ ... on Object { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "unions", 1 @@ -1886,12 +1826,6 @@ ... on Object { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 6, - "column": 7 - } - ], "path": [ "unions", 1, @@ -2015,12 +1949,6 @@ type Query { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "str" ] @@ -2126,12 +2054,6 @@ type Query { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "scalars" ] @@ -2206,12 +2128,6 @@ type Query { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "scalars", 1 @@ -2334,12 +2250,6 @@ enum MyEnum { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "enm" ] @@ -2461,12 +2371,6 @@ enum MyEnum { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "enums", 1 @@ -2597,12 +2501,6 @@ type Product { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "productById" ] @@ -2733,12 +2631,6 @@ type Product { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "productsById" ] @@ -2826,12 +2718,6 @@ type Product { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "productsById", 1 @@ -3044,12 +2930,6 @@ ... on Product { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "node" ] @@ -3235,12 +3115,6 @@ ... on Product { "errors": [ { "message": "Cannot return null for non-nullable field.", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "nodes" ], @@ -3295,12 +3169,6 @@ ... on Product { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "nodes" ] @@ -3403,12 +3271,6 @@ ... on Product { "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 3 - } - ], "path": [ "nodes", 1 diff --git a/src/HotChocolate/Json/src/Json/JsonConstants.cs b/src/HotChocolate/Json/src/Json/JsonConstants.cs index d494ea0e26a..9a308131720 100644 --- a/src/HotChocolate/Json/src/Json/JsonConstants.cs +++ b/src/HotChocolate/Json/src/Json/JsonConstants.cs @@ -26,10 +26,6 @@ internal static class JsonConstants public const byte Colon = (byte)':'; public const byte NewLineLineFeed = (byte)'\n'; - public static ReadOnlySpan<byte> Data => "data"u8; - public static ReadOnlySpan<byte> Errors => "errors"u8; - public static ReadOnlySpan<byte> Extensions => "extensions"u8; - public static ReadOnlySpan<byte> TrueValue => "true"u8; public static ReadOnlySpan<byte> FalseValue => "false"u8; public static ReadOnlySpan<byte> NullValue => "null"u8; From d44a1f9d1f76af05236c0dc8d410dfd5a9076e9b Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Fri, 16 Jan 2026 23:56:17 +0100 Subject: [PATCH 133/144] Updated snapshots --- ...lterVisitorComparableTests.Create_ShortEqual_Expression.snap | 2 +- ...parableTests.Create_ShortGreaterThanOrEquals_Expression.snap | 2 +- ...sitorComparableTests.Create_ShortGreaterThan_Expression.snap | 2 +- ...eFilterVisitorComparableTests.Create_ShortIn_Expression.snap | 2 +- ...omparableTests.Create_ShortLowerThanOrEquals_Expression.snap | 2 +- ...VisitorComparableTests.Create_ShortLowerThan_Expression.snap | 2 +- ...rVisitorComparableTests.Create_ShortNotEqual_Expression.snap | 2 +- ...ableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap | 2 +- ...orComparableTests.Create_ShortNotGreaterThan_Expression.snap | 2 +- ...lterVisitorComparableTests.Create_ShortNotIn_Expression.snap | 2 +- ...arableTests.Create_ShortNotLowerThanOrEquals_Expression.snap | 2 +- ...itorComparableTests.Create_ShortNotLowerThan_Expression.snap | 2 +- ...ests.Create_ShortNullableGreaterThanOrEquals_Expression.snap | 2 +- ...parableTests.Create_ShortNullableGreaterThan_Expression.snap | 2 +- ...eTests.Create_ShortNullableLowerThanOrEquals_Expression.snap | 2 +- ...omparableTests.Create_ShortNullableLowerThan_Expression.snap | 2 +- ...e_ShortNullableNotGreaterThanOrEquals_Expression_NET8_0.snap | 2 +- ...e_ShortNullableNotGreaterThanOrEquals_Expression_NET9_0.snap | 2 +- ...ts.Create_ShortNullableNotGreaterThan_Expression_NET8_0.snap | 2 +- ...ts.Create_ShortNullableNotGreaterThan_Expression_NET9_0.snap | 2 +- ...ate_ShortNullableNotLowerThanOrEquals_Expression_NET8_0.snap | 2 +- ...ate_ShortNullableNotLowerThanOrEquals_Expression_NET9_0.snap | 2 +- ...ests.Create_ShortNullableNotLowerThan_Expression_NET8_0.snap | 2 +- ...ests.Create_ShortNullableNotLowerThan_Expression_NET9_0.snap | 2 +- ...yableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap | 2 +- ...leFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap | 2 +- ...isitorExpressionTests.Create_CollectionLengthExpression.snap | 2 +- ...rInterfacesTests.Create_InterfaceStringEqual_Expression.snap | 2 +- ...Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap | 2 +- ...terVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap | 2 +- ...erVisitorObjectTests.Create_ObjectShortEqual_Expression.snap | 2 +- ...ilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap | 2 +- ...rVisitorObjectTests.Create_ObjectStringEqual_Expression.snap | 2 +- ...lterVisitorObjectTests.Create_ObjectStringIn_Expression.snap | 2 +- ...torStringTests.Create_NullableStringContains_Expression.snap | 2 +- ...ngTests.Create_NullableStringEndsWith_Expression_NET8_0.snap | 2 +- ...ngTests.Create_NullableStringEndsWith_Expression_NET9_0.snap | 2 +- ...Tests.Create_NullableStringNoContains_Expression_NET8_0.snap | 2 +- ...Tests.Create_NullableStringNoContains_Expression_NET9_0.snap | 2 +- ...ests.Create_NullableStringNotEndsWith_Expression_NET8_0.snap | 2 +- ...ests.Create_NullableStringNotEndsWith_Expression_NET9_0.snap | 2 +- ...ts.Create_NullableStringNotStartsWith_Expression_NET8_0.snap | 2 +- ...ts.Create_NullableStringNotStartsWith_Expression_NET9_0.snap | 2 +- ...Tests.Create_NullableStringStartsWith_Expression_NET8_0.snap | 2 +- ...Tests.Create_NullableStringStartsWith_Expression_NET9_0.snap | 2 +- ...lterVisitorStringTests.Create_StringContains_Expression.snap | 2 +- ...itorStringTests.Create_StringEndsWith_Expression_NET8_0.snap | 2 +- ...itorStringTests.Create_StringEndsWith_Expression_NET9_0.snap | 2 +- ...eFilterVisitorStringTests.Create_StringEqual_Expression.snap | 2 +- ...ableFilterVisitorStringTests.Create_StringIn_Expression.snap | 2 +- ...orStringTests.Create_StringNoContains_Expression_NET8_0.snap | 2 +- ...orStringTests.Create_StringNoContains_Expression_NET9_0.snap | 2 +- ...rStringTests.Create_StringNotEndsWith_Expression_NET8_0.snap | 2 +- ...rStringTests.Create_StringNotEndsWith_Expression_NET9_0.snap | 2 +- ...lterVisitorStringTests.Create_StringNotEqual_Expression.snap | 2 +- ...VisitorStringTests.Create_StringNotIn_Expression_NET8_0.snap | 2 +- ...VisitorStringTests.Create_StringNotIn_Expression_NET9_0.snap | 2 +- ...tringTests.Create_StringNotStartsWith_Expression_NET8_0.snap | 2 +- ...tringTests.Create_StringNotStartsWith_Expression_NET9_0.snap | 2 +- ...orStringTests.Create_StringStartsWith_Expression_NET8_0.snap | 2 +- ...orStringTests.Create_StringStartsWith_Expression_NET9_0.snap | 2 +- 61 files changed, 61 insertions(+), 61 deletions(-) diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap index 0bf68393576..a17939f55fa 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortEqual_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" = @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap index 80e210bd05e..99ff8e2b063 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThanOrEquals_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap index 9f160232d82..4e8fb7b75a3 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortGreaterThan_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap index 67e8271eff4..a22ffff9cca 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortIn_Expression.snap @@ -54,7 +54,7 @@ WHERE "d"."BarShort" IN ( ) --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap index 0d5d724b0c1..640e056d88f 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThanOrEquals_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap index f1348812c03..c48d26fdcb3 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortLowerThan_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap index d0133d3a578..8a60b5a2115 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotEqual_Expression.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <> @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap index 92e247793a1..7c5543b5641 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThanOrEquals_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap index 85a240fb907..667b53e2d47 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotGreaterThan_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap index 9bed1d50607..6da4fd4e544 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotIn_Expression.snap @@ -48,7 +48,7 @@ WHERE "d"."BarShort" NOT IN ( ) --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap index bd334587a8b..290cddb29de 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThanOrEquals_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap index 40afb676c30..3c7f19803ea 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNotLowerThan_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap index 01e3b8ae464..2f039cb53a5 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThanOrEquals_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" >= @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap index fa69550b200..f1e76dbc41d 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableGreaterThan_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" > @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap index 2f5b9376779..3cb54d1be73 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThanOrEquals_Expression.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" <= @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap index 5ffa8e63101..c65fb798240 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableLowerThan_Expression.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE "d"."BarShort" < @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET8_0.snap index 691b6b45287..37eb74945d2 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET8_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE NOT ("d"."BarShort" >= @__p_0) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET9_0.snap index abfd56106bb..2667e6aa075 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThanOrEquals_Expression_NET9_0.snap @@ -82,7 +82,7 @@ WHERE CASE END --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET8_0.snap index 31f0c0bb5c3..03b11dadb36 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET8_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE NOT ("d"."BarShort" > @__p_0) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET9_0.snap index 32d881cad57..b989d260968 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotGreaterThan_Expression_NET9_0.snap @@ -91,7 +91,7 @@ WHERE CASE END --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET8_0.snap index 4fdb16007f1..e8103028e21 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET8_0.snap @@ -63,7 +63,7 @@ FROM "Data" AS "d" WHERE NOT ("d"."BarShort" <= @__p_0) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET9_0.snap index b05dbdc7167..9c32284c141 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThanOrEquals_Expression_NET9_0.snap @@ -82,7 +82,7 @@ WHERE CASE END --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET8_0.snap index 8fc2d5904ee..e717649b1f7 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET8_0.snap @@ -73,7 +73,7 @@ FROM "Data" AS "d" WHERE NOT ("d"."BarShort" < @__p_0) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET9_0.snap index 86b93f10432..4be821c0160 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorComparableTests.Create_ShortNullableNotLowerThan_Expression_NET9_0.snap @@ -91,7 +91,7 @@ WHERE CASE END --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap index c6c692187b0..fee4eb3d4af 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumEqual_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."BarEnum" = @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap index 2ea16de3e42..5432abc2324 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorEnumTests.Create_EnumNotEqual_Expression.snap @@ -54,7 +54,7 @@ FROM "Data" AS "d" WHERE "d"."BarEnum" <> @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression.snap index 10df9c4639a..68ee52add58 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorExpressionTests.Create_CollectionLengthExpression.snap @@ -50,7 +50,7 @@ WHERE ( WHERE "d"."Id" = "b"."FooId") = @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap index 3cb9b3297b2..30f200ccb38 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorInterfacesTests.Create_InterfaceStringEqual_Expression.snap @@ -48,7 +48,7 @@ INNER JOIN "Test" AS "t" ON "d"."TestId" = "t"."Id" WHERE "t"."Prop" = @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap index c86bcb18f34..1474f5f43c0 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ArrayObjectNestedArraySomeStringEqual_Expression.snap @@ -44,7 +44,7 @@ WHERE EXISTS ( WHERE "f"."Id" = "d0"."FooId" AND "f0"."BarString" = @__p_0) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap index 838a6158f34..3369f483965 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectEnumEqual_Expression.snap @@ -53,7 +53,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarEnum" = @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap index 1c671ce4596..bfa7f565a8d 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortEqual_Expression.snap @@ -53,7 +53,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarShort" = @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap index ad50ed79e7a..9e5609e3733 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectShortIn_Expression.snap @@ -74,7 +74,7 @@ WHERE "f"."BarShort" IN ( ) --------------- -nullAnd14 Result: +nullAnd14 --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap index 9782bd3ac04..e9902a99e08 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringEqual_Expression.snap @@ -58,7 +58,7 @@ INNER JOIN "Foo" AS "f" ON "d"."FooId" = "f"."Id" WHERE "f"."BarString" = @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap index c60b96ed61f..15c6c31d2b8 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorObjectTests.Create_ObjectStringIn_Expression.snap @@ -41,7 +41,7 @@ WHERE "f"."BarString" IN ( ) --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap index 3c0a89781cd..65b8d3c118b 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringContains_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND instr("d"."Bar", @__p_0) > 0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET8_0.snap index dba0c90ea18..1b1d2c51906 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @__p_0_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET9_0.snap index dba0c90ea18..1b1d2c51906 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringEndsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @__p_0_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET8_0.snap index 46b0d34879f..d9130fa78cf 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET8_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR NOT (instr("d"."Bar", @__p_0) > 0) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET9_0.snap index eca2c48f9ba..b1eccdc5016 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNoContains_Expression_NET9_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR instr("d"."Bar", @__p_0) <= 0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET8_0.snap index 3203fa3144c..96e427a0820 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET8_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @__p_0_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET9_0.snap index 3203fa3144c..96e427a0820 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotEndsWith_Expression_NET9_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @__p_0_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET8_0.snap index 4371f860d26..77a754414f2 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET8_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @__p_0_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET9_0.snap index 4371f860d26..77a754414f2 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringNotStartsWith_Expression_NET9_0.snap @@ -48,7 +48,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NULL OR "d"."Bar" NOT LIKE @__p_0_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET8_0.snap index 1001e5f0f1f..ef3b1890a74 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @__p_0_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET9_0.snap index 1001e5f0f1f..ef3b1890a74 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_NullableStringStartsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" IS NOT NULL AND "d"."Bar" LIKE @__p_0_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap index de83f458152..06a53f9909b 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringContains_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE instr("d"."Bar", @__p_0) > 0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET8_0.snap index ed71ad848de..bdf5a199f37 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @__p_0_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET9_0.snap index ed71ad848de..bdf5a199f37 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEndsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @__p_0_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap index dbd85ee3b01..d7944d2311b 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringEqual_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" = @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap index 07c7bc5e3be..ea83f18bfb9 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringIn_Expression.snap @@ -26,7 +26,7 @@ WHERE "d"."Bar" IN ( ) --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET8_0.snap index 7c6e429c003..b620f7a446d 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE NOT (instr("d"."Bar", @__p_0) > 0) --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET9_0.snap index 23f5c40d30f..4ff2d04f65b 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNoContains_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE instr("d"."Bar", @__p_0) <= 0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET8_0.snap index a5cf41a8261..d9d444861dd 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @__p_0_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET9_0.snap index a5cf41a8261..d9d444861dd 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEndsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @__p_0_endswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap index f788d4b3c60..c7eb9403233 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotEqual_Expression.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" <> @__p_0 --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET8_0.snap index c8518ed4b25..43523d406a8 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET8_0.snap @@ -19,7 +19,7 @@ WHERE "d"."Bar" NOT IN ( ) --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET9_0.snap index c8518ed4b25..43523d406a8 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotIn_Expression_NET9_0.snap @@ -19,7 +19,7 @@ WHERE "d"."Bar" NOT IN ( ) --------------- -testbtestAndNull Result: +testbtestAndNull --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET8_0.snap index e6f83402087..058fd6ff261 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @__p_0_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET9_0.snap index e6f83402087..058fd6ff261 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringNotStartsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" NOT LIKE @__p_0_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET8_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET8_0.snap index 091657d165c..3a8dc9fdd38 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET8_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET8_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @__p_0_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ diff --git a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET9_0.snap b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET9_0.snap index 091657d165c..3a8dc9fdd38 100644 --- a/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET9_0.snap +++ b/src/HotChocolate/Data/test/Data.Filters.SqlServer.Tests/__snapshots__/QueryableFilterVisitorStringTests.Create_StringStartsWith_Expression_NET9_0.snap @@ -42,7 +42,7 @@ FROM "Data" AS "d" WHERE "d"."Bar" LIKE @__p_0_startswith ESCAPE '\' --------------- -null Result: +null --------------- { "errors": [ From b1164353a9b97164ccc26f8b9e4da5f647d3572f Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Sat, 17 Jan 2026 16:23:51 +0200 Subject: [PATCH 134/144] Updated HotChocolate.Language snapshot --- ..._Kitchen_Sink_Query_AllProps_No_Cache.snap | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_AllProps_No_Cache.snap b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_AllProps_No_Cache.snap index f82a438a62b..e9638d131bd 100644 --- a/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_AllProps_No_Cache.snap +++ b/src/HotChocolate/Language/test/Language.Web.Tests/__snapshots__/Utf8GraphQLRequestParserTests.Parse_Kitchen_Sink_Query_AllProps_No_Cache.snap @@ -1,18 +1,38 @@ Variables: --------------- { - "RootElement": { - "ValueKind": "Object" - } + "a": "b", + "b": { + "a": "b", + "b": true, + "c": 1, + "d": 1.1 + }, + "c": [ + { + "a": "b" + } + ] } --------------- Extensions: --------------- { - "RootElement": { - "ValueKind": "Object" - } + "aa": "bb", + "bb": { + "aa": "bb", + "bb": true, + "cc": 1, + "df": 1.1 + }, + "cc": [ + { + "aa": "bb", + "ab": null, + "ac": false + } + ] } --------------- From 5c410d916d0f7e72eabc3f7d1b0a23f2fb492813 Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Mon, 19 Jan 2026 09:50:17 +0200 Subject: [PATCH 135/144] Fixed some HotChocolate.Diagnostics tests --- .../Diagnostics/src/Diagnostics/ActivityEnricher.cs | 3 ++- ...se_a_resolver_error_that_deletes_the_whole_result.snap | 8 -------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs index 495add03c8e..6e4c839572a 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs @@ -362,11 +362,12 @@ public virtual void EnrichExecuteRequest(RequestContext context, Activity activi try { var rootSelectionSet = operation.RootSelectionSet; + var selectionCount = rootSelectionSet.Selections.Length; displayName.Append('{'); displayName.Append(' '); - foreach (var selection in rootSelectionSet.Selections[..3]) + foreach (var selection in rootSelectionSet.Selections[..Math.Min(3, selectionCount)]) { if (displayName.Length > 2) { diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/QueryInstrumentationTests.Cause_a_resolver_error_that_deletes_the_whole_result.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/QueryInstrumentationTests.Cause_a_resolver_error_that_deletes_the_whole_result.snap index e614bb8f91a..121d1b09cd0 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/QueryInstrumentationTests.Cause_a_resolver_error_that_deletes_the_whole_result.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/QueryInstrumentationTests.Cause_a_resolver_error_that_deletes_the_whole_result.snap @@ -141,14 +141,6 @@ { "Key": "graphql.error.path", "Value": "/causeFatalError" - }, - { - "Key": "graphql.error.location.column", - "Value": 27 - }, - { - "Key": "graphql.error.location.line", - "Value": 1 } ] } From e01f82a3ab85384272668cc3cc7b08ffa4e2a01f Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Mon, 19 Jan 2026 11:53:18 +0200 Subject: [PATCH 136/144] Updated snapshots --- ...teAsync_Should_Fail_When_SingleOrDefaultMoreThanOne.snap | 6 ------ ...ail_When_SingleOrDefaultMoreThanOne_AsyncEnumerable.snap | 6 ------ ...leSortVisitorExecutableTests.Create_Boolean_OrderBy.snap | 4 ++-- ...itorExecutableTests.Create_Boolean_OrderBy_Nullable.snap | 4 ++-- 4 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/HotChocolate/Data/test/Data.EntityFramework.Tests/__snapshots__/IntegrationTests.ExecuteAsync_Should_Fail_When_SingleOrDefaultMoreThanOne.snap b/src/HotChocolate/Data/test/Data.EntityFramework.Tests/__snapshots__/IntegrationTests.ExecuteAsync_Should_Fail_When_SingleOrDefaultMoreThanOne.snap index 8863d34f99a..143a6373df9 100644 --- a/src/HotChocolate/Data/test/Data.EntityFramework.Tests/__snapshots__/IntegrationTests.ExecuteAsync_Should_Fail_When_SingleOrDefaultMoreThanOne.snap +++ b/src/HotChocolate/Data/test/Data.EntityFramework.Tests/__snapshots__/IntegrationTests.ExecuteAsync_Should_Fail_When_SingleOrDefaultMoreThanOne.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 5 - } - ], "path": [ "executable" ] diff --git a/src/HotChocolate/Data/test/Data.EntityFramework.Tests/__snapshots__/IntegrationTests.ExecuteAsync_Should_Fail_When_SingleOrDefaultMoreThanOne_AsyncEnumerable.snap b/src/HotChocolate/Data/test/Data.EntityFramework.Tests/__snapshots__/IntegrationTests.ExecuteAsync_Should_Fail_When_SingleOrDefaultMoreThanOne_AsyncEnumerable.snap index 8863d34f99a..143a6373df9 100644 --- a/src/HotChocolate/Data/test/Data.EntityFramework.Tests/__snapshots__/IntegrationTests.ExecuteAsync_Should_Fail_When_SingleOrDefaultMoreThanOne_AsyncEnumerable.snap +++ b/src/HotChocolate/Data/test/Data.EntityFramework.Tests/__snapshots__/IntegrationTests.ExecuteAsync_Should_Fail_When_SingleOrDefaultMoreThanOne_AsyncEnumerable.snap @@ -2,12 +2,6 @@ "errors": [ { "message": "Unexpected Execution Error", - "locations": [ - { - "line": 2, - "column": 5 - } - ], "path": [ "executable" ] diff --git a/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy.snap b/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy.snap index 542eaa94c2b..525da4a0f63 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy.snap +++ b/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy.snap @@ -1,4 +1,4 @@ -ASC Result: +ASC --------------- { "data": { @@ -14,7 +14,7 @@ ASC Result: } --------------- -DESC Result: +DESC --------------- { "data": { diff --git a/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy_Nullable.snap b/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy_Nullable.snap index 69eeef13807..2467c103df3 100644 --- a/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy_Nullable.snap +++ b/src/HotChocolate/Data/test/Data.Sorting.SqlLite.Tests/__snapshots__/QueryableSortVisitorExecutableTests.Create_Boolean_OrderBy_Nullable.snap @@ -1,4 +1,4 @@ -ASC Result: +ASC --------------- { "data": { @@ -17,7 +17,7 @@ ASC Result: } --------------- -DESC Result: +DESC --------------- { "data": { From a52b893ce7786d82c68f293ad99feaef5830b10d Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 27 Jan 2026 10:27:53 +0000 Subject: [PATCH 137/144] Fixed projection issue. --- .../Core/src/Types/Execution/Processing/Selection.cs | 12 ++++++++++-- .../ProjectionObjectFieldDescriptorExtensions.cs | 2 +- .../Data/src/Data/Projections/SelectionVisitor`1.cs | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs index 4ee89c97294..7aacaaff091 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Selection.cs @@ -270,7 +270,7 @@ public Selection WithField(ObjectField field) { ArgumentNullException.ThrowIfNull(field); - return new Selection( + var selection = new Selection( Id, ResponseName, _utf8ResponseName, @@ -283,13 +283,17 @@ public Selection WithField(ObjectField field) Strategy, ResolverPipeline, PureResolver); + + selection._declaringSelectionSet = _declaringSelectionSet; + + return selection; } public Selection WithType(IType type) { ArgumentNullException.ThrowIfNull(type); - return new Selection( + var selection = new Selection( Id, ResponseName, _utf8ResponseName, @@ -302,6 +306,10 @@ public Selection WithType(IType type) Strategy, ResolverPipeline, PureResolver); + + selection._declaringSelectionSet = _declaringSelectionSet; + + return selection; } public override string ToString() diff --git a/src/HotChocolate/Data/src/Data/Projections/Extensions/ProjectionObjectFieldDescriptorExtensions.cs b/src/HotChocolate/Data/src/Data/Projections/Extensions/ProjectionObjectFieldDescriptorExtensions.cs index cfa8f2abc9e..82d783a6a44 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Extensions/ProjectionObjectFieldDescriptorExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Extensions/ProjectionObjectFieldDescriptorExtensions.cs @@ -304,7 +304,7 @@ public IServiceProvider Services public CancellationToken RequestAborted => _context.RequestAborted; - public IFeatureCollection Features => throw new NotImplementedException(); + public IFeatureCollection Features => _context.Features; public T Parent<T>() => _context.Parent<T>(); diff --git a/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor`1.cs b/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor`1.cs index 00f814fdb9c..3980bbd41f4 100644 --- a/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor`1.cs +++ b/src/HotChocolate/Data/src/Data/Projections/SelectionVisitor`1.cs @@ -146,7 +146,7 @@ protected virtual ISelectionVisitorAction VisitObjectType( continue; } - if (Visit(selection, context).Kind is SelectionVisitorActionKind.Break) + if (Visit(childSelection, context).Kind is SelectionVisitorActionKind.Break) { return Break; } From 7ca68c022e7934a81c8473a5621c4d75d303a072 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Tue, 27 Jan 2026 13:11:57 +0000 Subject: [PATCH 138/144] Added Agent Infos --- AGENTS.md | 238 ++++++++++++++++++++++++++++++++++++++++++++++++ CLAUDE.md | 169 ++++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 4 +- 3 files changed, 409 insertions(+), 2 deletions(-) create mode 100644 AGENTS.md create mode 100644 CLAUDE.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000000..d9331c4176c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,238 @@ +# AGENTS.md - OpenAI Codex Configuration + +This file provides guidance to OpenAI Codex and other AI coding agents when working with this repository. + +## Project Summary + +**ChilliCream GraphQL Platform** - A comprehensive GraphQL ecosystem for .NET + +| Product | Description | +| --------------- | ------------------------------------------------------ | +| Hot Chocolate | GraphQL server framework | +| Strawberry Shake| Type-safe GraphQL client | +| Green Donut | Data fetching primitives (DataLoader, pagination, etc.)| +| Nitro | GraphQL IDE | + +## Setup Instructions + +### Using Devcontainer (Recommended) + +This repository includes a devcontainer (`.devcontainer/`) with everything pre-installed: + +- .NET SDKs 6, 7, 8, 9, 10 +- Node.js LTS + Yarn +- GitHub CLI + Azure CLI +- Docker-in-docker support + +The devcontainer automatically runs `init.sh` on creation - no manual setup needed. + +### Manual Setup + +If not using devcontainer, initialize first: + +```bash +./init.sh +``` + +This restores website packages (yarn) and .NET packages. + +### Build + +```bash +./build.sh compile +``` + +### Test + +```bash +./build.sh test +``` + +### Single Project Build + +```bash +dotnet build src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj +``` + +## Repository Layout + +```text +src/All.slnx # Master solution (244 projects) + +src/HotChocolate/ # GraphQL Server + Core/ + Abstractions/ # Interfaces, contracts + Execution/ # Query execution + Types/ # Type system + Validation/ # Query validation + Subscriptions/ # Real-time updates + AspNetCore/ # HTTP integration + Language/ # Parser, syntax tree + Fusion-vnext/ # Distributed GraphQL + Data/ # Database integrations + +src/GreenDonut/ # Data fetching primitives +src/StrawberryShake/ # GraphQL client +src/CookieCrumble/ # Snapshot testing + +website/ # Documentation (Gatsby) +templates/ # Project templates +.build/ # Build scripts (Nuke) +``` + +## Tech Stack + +| Component | Technology | +| --------- | -------------- | +| Runtime | .NET 8/9/10 | +| SDK | 10.0.100 | +| Build | Nuke.Build | +| Tests | xUnit | +| Snapshots | CookieCrumble | +| Docs | Gatsby + React | + +## Coding Standards + +### C# Conventions + +- File-scoped namespaces: `namespace HotChocolate.Types;` +- 4-space indentation +- Use records for immutable types +- Expression-bodied members preferred +- No trailing whitespace + +### Naming Conventions + +- Projects: `HotChocolate.{Feature}` +- Tests: `HotChocolate.{Feature}.Tests` +- Interfaces: `I{Name}` prefix +- Async methods: `{Name}Async` suffix + +### File Organization + +- One type per file (generally) +- Test files mirror source structure +- Snapshots in `__snapshots__/` folders + +## Testing Guidelines + +### Running Tests + +```bash +# All tests +./build.sh test + +# Specific project +dotnet test src/HotChocolate/Core/test/Types.Tests/ + +# Specific test +dotnet test --filter "FullyQualifiedName~MyTestName" +``` + +### Snapshot Testing + +- Uses CookieCrumble library +- Snapshots stored in `__snapshots__/` +- Update snapshots by deleting old file and re-running test + +### Test Structure + +```csharp +[Fact] +public async Task MyFeature_Should_WorkCorrectly() +{ + // Arrange + var schema = await new ServiceCollection() + .AddGraphQL() + .AddQueryType<Query>() + .BuildSchemaAsync(); + + // Act + var result = await schema.ExecuteAsync("{ field }"); + + // Assert + result.MatchSnapshot(); +} +``` + +## Key Abstractions + +### GraphQL Types + +```csharp +public class BookType : ObjectType<Book> +{ + protected override void Configure(IObjectTypeDescriptor<Book> descriptor) + { + descriptor.Field(b => b.Title).Type<NonNullType<StringType>>(); + } +} +``` + +### DataLoader + +```csharp +public class BookByIdDataLoader : BatchDataLoader<int, Book> +{ + protected override async Task<IReadOnlyDictionary<int, Book>> LoadBatchAsync( + IReadOnlyList<int> keys, CancellationToken ct) + { + // Batch load implementation + } +} +``` + +### Resolvers + +```csharp +public class Query +{ + public Book GetBook([Service] IBookRepository repo, int id) + => repo.GetById(id); +} +``` + +## Important Paths + +| Path | Purpose | +| -------------------- | -------------------- | +| `src/All.slnx` | Open this in IDE | +| `global.json` | .NET SDK version | +| `.editorconfig` | Code style rules | +| `.build/Build.csproj`| Build configuration | +| `website/` | Documentation source | + +## Common Modifications + +### Add New Type Extension + +1. Create in `src/HotChocolate/Core/src/Types/Types/` +2. Add tests in `src/HotChocolate/Core/test/Types.Tests/` +3. Export from appropriate namespace + +### Add Database Integration + +1. Create project in `src/HotChocolate/Data/` +2. Reference `HotChocolate.Execution` +3. Implement `IQueryableExecutable` or similar + +### Modify Execution Pipeline + +1. Changes go in `src/HotChocolate/Core/src/Execution/` +2. Middleware in `Processing/` directory +3. Add tests covering the pipeline stage + +## Troubleshooting + +| Issue | Solution | +| ----------------- | ------------------------------------------ | +| Build fails | Run `./init.sh` first | +| Missing packages | Run `./build.sh restore` | +| Snapshot mismatch | Check `__snapshots__/` for expected output | +| SDK not found | Install .NET SDK 10.0.100 | + +## Links + +- Documentation: `website/src/docs/` +- Examples: `templates/` +- Build scripts: `.build/` diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000000..6e9b03c1e57 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,169 @@ +# CLAUDE.md - Claude Code Configuration + +This file provides guidance to Claude Code when working with this repository. + +## Project Overview + +This is the **ChilliCream GraphQL Platform** - an open-source GraphQL ecosystem for .NET containing: + +- **Hot Chocolate**: GraphQL server framework for .NET +- **Strawberry Shake**: Type-safe GraphQL client for .NET +- **Green Donut**: Data fetching primitives including DataLoader for batching/caching, pagination, and other data fetching tools +- **Nitro**: GraphQL IDE and API cockpit + +## Quick Start + +### Using Devcontainer (Recommended for Agents) + +This repository includes a devcontainer with all dependencies pre-installed: + +- .NET SDKs 6, 7, 8, 9, 10 +- Node.js LTS + Yarn +- GitHub CLI + Azure CLI +- Docker-in-docker support + +The devcontainer automatically runs `init.sh` on creation, so you're ready to go immediately. + +### Manual Setup + +If not using devcontainer, initialize the repository: + +```bash +./init.sh +``` + +This script: + +1. Installs website dependencies (`cd website && yarn`) +2. Restores .NET packages (`./build.sh restore`) + +### Build + +```bash +./build.sh compile +``` + +### Run Tests + +```bash +./build.sh test +``` + +## Directory Structure + +```text +src/ +├── All.slnx # Main solution (244 projects) +├── HotChocolate/ # Core GraphQL server +│ ├── Core/ # Execution engine, types, validation +│ │ ├── Abstractions/ # Core interfaces and contracts +│ │ ├── Execution/ # Query execution pipeline +│ │ ├── Types/ # GraphQL type system +│ │ ├── Validation/ # Query validation +│ │ └── Subscriptions/ # Real-time subscriptions +│ ├── AspNetCore/ # ASP.NET Core integration +│ ├── Language/ # GraphQL parsing & syntax +│ ├── Fusion-vnext/ # Distributed GraphQL (next gen) +│ ├── Data/ # EF Core, MongoDB, etc. +│ └── Utilities/ # Shared utilities +├── GreenDonut/ # Data fetching primitives (DataLoader, pagination, etc.) +├── CookieCrumble/ # Snapshot testing framework +└── StrawberryShake/ # GraphQL client + +website/ # Gatsby documentation site +templates/ # Project templates +.build/ # Nuke build automation +``` + +## Technology Stack + +- **.NET**: SDK 10.0.100 (supports .NET 8, 9, 10) +- **Build System**: Nuke.Build +- **Testing**: xUnit with CookieCrumble for snapshots +- **Documentation**: Gatsby + React + TypeScript + +## Code Conventions + +### C# Style + +- File-scoped namespaces (`namespace Foo;`) +- 4-space indentation +- Expression-bodied members where appropriate +- Records for immutable data types + +### Project Naming + +- `HotChocolate.{Feature}` - Server features +- `HotChocolate.{Feature}.Tests` - Test projects +- `GreenDonut.{Feature}` - Data fetching features + +### Testing + +- Tests live in parallel `*.Tests` projects +- Use `CookieCrumble` for snapshot testing +- Snapshot files go in `__snapshots__/` directories + +## Common Tasks + +### Adding a New Feature + +1. Create project in appropriate `src/HotChocolate/{Area}/` directory +2. Add corresponding test project with `.Tests` suffix +3. Add projects to `src/All.slnx` + +### Running Specific Tests + +```bash +dotnet test src/HotChocolate/Core/test/Types.Tests/HotChocolate.Types.Tests.csproj +``` + +### Building Documentation + +```bash +cd website +yarn start # Development server +yarn build # Production build +``` + +## Key Patterns + +### Type System + +GraphQL types are defined in `src/HotChocolate/Core/src/Types/`. The type system uses: + +- `ObjectType<T>` for object types +- `InputObjectType<T>` for input types +- `InterfaceType<T>` for interfaces +- Descriptors pattern for configuration + +### Execution Pipeline + +The execution pipeline in `src/HotChocolate/Core/src/Execution/` uses: + +- Middleware pattern for request processing +- `IQueryExecutor` as the main entry point +- `IResolverContext` for field resolution + +### DataLoader Pattern + +Green Donut implements data fetching primitives: + +- `DataLoaderBase<TKey, TValue>` for custom loaders +- Automatic batching and caching +- Pagination support +- Integration with Hot Chocolate via `[DataLoader]` attribute + +## Important Files + +- `global.json` - .NET SDK version +- `.editorconfig` - Code style rules +- `nuget.config` - Package sources +- `src/All.slnx` - Main solution file +- `.build/Build.csproj` - Build automation + +## Debugging Tips + +- Solution file: `src/All.slnx` +- Use `dotnet build` for quick compilation checks +- Snapshot mismatches show diffs in test output +- Check `__snapshots__/` for expected test output diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b5fda7471ff..dc48570e5c5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,9 +62,9 @@ Core contributors will review your pull request and provide feedback. We use [Nuke](https://nuke.build/) for build automation. -To work on Hot Chocolate, you will need .NET 7, Node 14, and Yarn 1.x. +To work on Hot Chocolate, you will need .NET 10 SDK (or use the devcontainer which has everything pre-installed). -After cloning the repository, run `init.sh` or `init.cmd`, which are located in the repository's root. The script files will create the `src/All.sln`, which can be used to develop in Visual Studio 2022 and higher or Rider 2021.3 EAP or higher. It will also restore the packages for the documentation. +After cloning the repository, run `init.sh` or `init.cmd`, which are located in the repository's root. The script files will create the `src/All.slnx`, which can be used to develop in Visual Studio 2022 and higher or Rider. It will also restore the packages for the documentation. Other more focused solution files exist if you want to narrow in on a particular part of the platform. The smaller solution files are great when working with VSCode. From 5052717ec964745485708a4136ceceb2ead31a74 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Wed, 28 Jan 2026 20:29:27 +0000 Subject: [PATCH 139/144] fixed more issues --- .../Extensions/ServiceCollectionExtensions.cs | 2 +- .../AspNetCore/test/AspNetCore.Tests/CostTests.cs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/ServiceCollectionExtensions.cs b/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/ServiceCollectionExtensions.cs index ef97baec7f6..0947fc10d80 100644 --- a/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/ServiceCollectionExtensions.cs +++ b/src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/ServiceCollectionExtensions.cs @@ -31,7 +31,7 @@ public static void AddMcpServices(this IServiceCollection services, string schem sp.GetRequiredService<IRequestExecutorProvider>(), sp.GetRequiredService<IRequestExecutorEvents>(), #if NET10_0_OR_GREATER - (string)name)) + (string)name!)) #else (string)name!)) #endif diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/CostTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/CostTests.cs index e8c28dbd64e..a613a1fe087 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/CostTests.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/CostTests.cs @@ -22,7 +22,7 @@ public async Task Request_No_Cost_Header() const string requestBody = """ { - "query" : "query Test($id: String!){human(id: $id){name}}" + "query" : "query Test($id: String!){human(id: $id){name}}", "variables" : { "id" : "1000" } } """; @@ -51,7 +51,7 @@ public async Task Request_Report_Cost_Header() const string requestBody = """ { - "query" : "query Test($id: String!){human(id: $id){name}}" + "query" : "query Test($id: String!){human(id: $id){name}}", "variables" : { "id" : "1000" } } """; @@ -81,7 +81,7 @@ public async Task Request_Validate_Cost_Header() const string requestBody = """ { - "query" : "query Test($id: String!){human(id: $id){name}}" + "query" : "query Test($id: String!){human(id: $id){name}}", "variables" : { "id" : "1000" } } """; @@ -114,7 +114,7 @@ public async Task Cost_Exceeded_With_Cost_Override() const string requestBody = """ { - "query" : "query Test($id: String!){human(id: $id){name}}" + "query" : "query Test($id: String!){human(id: $id){name}}", "variables" : { "id" : "1000" } } """; From 6405c5701d47ffed4be001a2dee10ce47393fa38 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Wed, 28 Jan 2026 20:45:33 +0000 Subject: [PATCH 140/144] Fixed more tests --- .../Formatters/DefaultWebSocketPayloadFormatter.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs index f50729bf853..adf7c5ab3ec 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Formatters/DefaultWebSocketPayloadFormatter.cs @@ -33,7 +33,14 @@ public void Format(IError error, IBufferWriter<byte> bufferWriter) public void Format(IReadOnlyList<IError> errors, IBufferWriter<byte> bufferWriter) { var writer = new JsonWriter(bufferWriter, _writerOptions); - WriteErrors(writer, errors, _serializerOptions, _nullIgnoreCondition); + writer.WriteStartArray(); + + for (var i = 0; i < errors.Count; i++) + { + WriteError(writer, errors[i], _serializerOptions, _nullIgnoreCondition); + } + + writer.WriteEndArray(); } /// <inheritdoc /> From 931dc63c75a08d8ffc41ec90bff117b6f207e36d Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Wed, 28 Jan 2026 23:54:35 +0000 Subject: [PATCH 141/144] Fixed operation compiler tests --- .../Types/Execution/Processing/Operation.cs | 2 +- .../Execution/Processing/OperationPrinter.cs | 155 ++ .../OperationCompilerTests.AbstractTypes.snap | 180 +- ...sts.CompositeType_SelectionsSet_Empty.snap | 6 +- ...itional_Fragment_Has_Additional_Field.snap | 11 +- ...tionCompilerTests.Crypto_Details_Test.snap | 58 +- ...t_Removes_Conditional_State_For_Price.snap | 10 +- ...OperationCompilerTests.Crypto_Include.snap | 10 +- ...erationCompilerTests.Crypto_List_Test.snap | 138 +- ...onCompilerTests.Defer_Fragment_Spread.snap | 18 +- ...onCompilerTests.Defer_Inline_Fragment.snap | 24 +- ...sible_When_One_Selection_Is_Visible_1.snap | 12 +- ...sible_When_One_Selection_Is_Visible_2.snap | 12 +- ...sible_When_One_Selection_Is_Visible_3.snap | 12 +- ...sible_When_One_Selection_Is_Visible_4.snap | 12 +- ...ts.FragmentSpread_SelectionsSet_Empty.snap | 12 +- ...ts.InlineFragment_SelectionsSet_Empty.snap | 12 +- ...erationCompilerTests.Large_Query_Test.snap | 1446 ++++++++--------- ...ests.Nested_Fragments_with_Conditions.snap | 72 +- ...eld_Visibility_Is_Correctly_Inherited.snap | 14 +- ...d_Visibility_Is_Correctly_Inherited_2.snap | 14 +- ...d_Visibility_Is_Correctly_Inherited_3.snap | 12 +- ...CompilerTests.Prepare_Duplicate_Field.snap | 4 +- ...sts.Prepare_Duplicate_Field_With_Skip.snap | 6 +- ...ilerTests.Prepare_Fragment_Definition.snap | 16 +- ...CompilerTests.Prepare_Inline_Fragment.snap | 16 +- ...rationCompilerTests.Prepare_One_Field.snap | 4 +- ...ts.Resolve_Concrete_Types_From_Unions.snap | 18 +- ...perationCompilerTests.Reuse_Selection.snap | 36 +- 29 files changed, 1236 insertions(+), 1106 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Execution/Processing/OperationPrinter.cs diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs index f62474155e8..75b017cfd62 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/Operation.cs @@ -260,5 +260,5 @@ internal Selection GetSelectionById(int id) internal SelectionSet GetSelectionSetById(int id) => Unsafe.As<SelectionSet>(Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_elementsById), id)); - public override string ToString() => Definition.ToString(indented: true); + public override string ToString() => OperationPrinter.Print(this); } diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationPrinter.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationPrinter.cs new file mode 100644 index 00000000000..427236654ff --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationPrinter.cs @@ -0,0 +1,155 @@ +using HotChocolate.Language; +using HotChocolate.Types; + +namespace HotChocolate.Execution.Processing; + +/// <summary> +/// This operation printer is made for testing purposes. +/// It prints the compiled operation with execution info directives. +/// </summary> +internal static class OperationPrinter +{ + public static string Print(Operation operation) + { + var definitions = new List<IDefinitionNode>(); + var context = new PrintContext(operation, definitions); + + // Create the root selection set wrapped in an inline fragment for the root type + var selectionSet = VisitRootSelectionSet(context, operation.RootSelectionSet); + + var operationDefinition = new OperationDefinitionNode( + operation.Definition.Location, + operation.Definition.Name, + operation.Definition.Description, + operation.Definition.Operation, + operation.Definition.VariableDefinitions, + operation.Definition.Directives, + selectionSet); + definitions.Insert(0, operationDefinition); + + return new DocumentNode(definitions).ToString(); + } + + private static SelectionSetNode VisitRootSelectionSet(PrintContext context, SelectionSet selectionSet) + { + // Wrap the root selections in an inline fragment for the root type + var selections = new List<ISelectionNode>(); + CreateSelectionsForSelectionSet(context, selectionSet, selections); + + var inlineFragment = new InlineFragmentNode( + null, + new NamedTypeNode(selectionSet.Type.Name), + [], + new SelectionSetNode(selections)); + + return new SelectionSetNode([inlineFragment]); + } + + private static void CreateSelectionsForSelectionSet( + PrintContext context, + SelectionSet selectionSet, + List<ISelectionNode> selections) + { + foreach (var selection in selectionSet.Selections) + { + SelectionSetNode? childSelectionSet = null; + + if (selection.HasSelections) + { + childSelectionSet = VisitSelectionWithChildren(context, selection); + } + + selections.Add(CreateFieldSelection(selection, childSelectionSet)); + } + } + + private static SelectionSetNode VisitSelectionWithChildren(PrintContext context, Selection selection) + { + var fragments = new List<InlineFragmentNode>(); + var possibleTypes = context.Operation.GetPossibleTypes(selection); + + foreach (var objectType in possibleTypes) + { + if (objectType is not ObjectType concreteType) + { + continue; + } + + var childSelectionSet = context.Operation.GetSelectionSet(selection, concreteType); + var childSelections = new List<ISelectionNode>(); + + CreateSelectionsForSelectionSet(context, childSelectionSet, childSelections); + + fragments.Add(new InlineFragmentNode( + null, + new NamedTypeNode(concreteType.Name), + [], + new SelectionSetNode(childSelections))); + } + + return new SelectionSetNode(fragments); + } + + private static FieldNode CreateFieldSelection( + Selection selection, + SelectionSetNode? selectionSet) + { + var directives = new List<DirectiveNode>(); + + if (selection.IsConditional) + { + directives.Add(new DirectiveNode("conditional")); + } + + directives.Add(CreateExecutionInfo(selection)); + + return new FieldNode( + null, + selection.SyntaxNodes[0].Node.Name, + selection.SyntaxNodes[0].Node.Alias, + directives, + selection.SyntaxNodes[0].Node.Arguments, + selectionSet); + } + + private static DirectiveNode CreateExecutionInfo(Selection selection) + { + var arguments = new ArgumentNode[selection.IsInternal ? 4 : 3]; + arguments[0] = new ArgumentNode("id", new IntValueNode(selection.Id)); + arguments[1] = new ArgumentNode("kind", new EnumValueNode(selection.Strategy.ToString().ToUpperInvariant())); + + if (selection.IsList) + { + if (selection.IsLeaf) + { + arguments[2] = new ArgumentNode("type", new EnumValueNode("LEAF_LIST")); + } + else + { + arguments[2] = new ArgumentNode("type", new EnumValueNode("COMPOSITE_LIST")); + } + } + else if (selection.Type.IsCompositeType()) + { + arguments[2] = new ArgumentNode("type", new EnumValueNode("COMPOSITE")); + } + else if (selection.IsLeaf) + { + arguments[2] = new ArgumentNode("type", new EnumValueNode("LEAF")); + } + + if (selection.IsInternal) + { + arguments[3] = new ArgumentNode("internal", BooleanValueNode.True); + } + + return new DirectiveNode("__execute", arguments); + } + + private sealed class PrintContext(Operation operation, List<IDefinitionNode> definitions) + { + public Operation Operation { get; } = operation; + + public List<IDefinitionNode> Definitions { get; } = definitions; + } +} diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.AbstractTypes.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.AbstractTypes.snap index ab4e5ca395e..1a381c40e35 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.AbstractTypes.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.AbstractTypes.snap @@ -1,4 +1,4 @@ -{ +{ organizationUnits { id name @@ -29,76 +29,76 @@ { ... on Query { - organizationUnits @__execute(id: 0, kind: DEFAULT, type: COMPOSITE_LIST) { - ... on OrganizationUnit2 { - id @__execute(id: 1, kind: DEFAULT, type: LEAF) - name @__execute(id: 2, kind: DEFAULT, type: LEAF) - someType @__execute(id: 3, kind: DEFAULT, type: COMPOSITE) { + organizationUnits @__execute(id: 2, kind: DEFAULT, type: COMPOSITE_LIST) { + ... on OrganizationUnit1 { + id @__execute(id: 4, kind: DEFAULT, type: LEAF) + name @__execute(id: 5, kind: DEFAULT, type: LEAF) + someType @__execute(id: 6, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { id @__execute(id: 9, kind: DEFAULT, type: LEAF) name @__execute(id: 10, kind: DEFAULT, type: LEAF) } } - children @__execute(id: 4, kind: DEFAULT, type: COMPOSITE_LIST) { - ... on OrganizationUnit2 { - id @__execute(id: 11, kind: DEFAULT, type: LEAF) - name @__execute(id: 12, kind: DEFAULT, type: LEAF) - someType @__execute(id: 13, kind: DEFAULT, type: COMPOSITE) { + children @__execute(id: 7, kind: DEFAULT, type: COMPOSITE_LIST) { + ... on OrganizationUnit1 { + id @__execute(id: 12, kind: DEFAULT, type: LEAF) + name @__execute(id: 13, kind: DEFAULT, type: LEAF) + someType @__execute(id: 14, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 19, kind: DEFAULT, type: LEAF) - name @__execute(id: 20, kind: DEFAULT, type: LEAF) + id @__execute(id: 17, kind: DEFAULT, type: LEAF) + name @__execute(id: 18, kind: DEFAULT, type: LEAF) } } - children @__execute(id: 14, kind: DEFAULT, type: COMPOSITE_LIST) { - ... on OrganizationUnit2 { - id @__execute(id: 21, kind: DEFAULT, type: LEAF) - name @__execute(id: 22, kind: DEFAULT, type: LEAF) - someType @__execute(id: 23, kind: DEFAULT, type: COMPOSITE) { + children @__execute(id: 15, kind: DEFAULT, type: COMPOSITE_LIST) { + ... on OrganizationUnit1 { + id @__execute(id: 20, kind: DEFAULT, type: LEAF) + name @__execute(id: 21, kind: DEFAULT, type: LEAF) + someType @__execute(id: 22, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 27, kind: DEFAULT, type: LEAF) - name @__execute(id: 28, kind: DEFAULT, type: LEAF) + id @__execute(id: 24, kind: DEFAULT, type: LEAF) + name @__execute(id: 25, kind: DEFAULT, type: LEAF) } } } - ... on OrganizationUnit1 { - id @__execute(id: 24, kind: DEFAULT, type: LEAF) - name @__execute(id: 25, kind: DEFAULT, type: LEAF) - someType @__execute(id: 26, kind: DEFAULT, type: COMPOSITE) { + ... on OrganizationUnit2 { + id @__execute(id: 27, kind: DEFAULT, type: LEAF) + name @__execute(id: 28, kind: DEFAULT, type: LEAF) + someType @__execute(id: 29, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 27, kind: DEFAULT, type: LEAF) - name @__execute(id: 28, kind: DEFAULT, type: LEAF) + id @__execute(id: 31, kind: DEFAULT, type: LEAF) + name @__execute(id: 32, kind: DEFAULT, type: LEAF) } } } } } - ... on OrganizationUnit1 { - id @__execute(id: 15, kind: DEFAULT, type: LEAF) - name @__execute(id: 16, kind: DEFAULT, type: LEAF) - someType @__execute(id: 17, kind: DEFAULT, type: COMPOSITE) { + ... on OrganizationUnit2 { + id @__execute(id: 34, kind: DEFAULT, type: LEAF) + name @__execute(id: 35, kind: DEFAULT, type: LEAF) + someType @__execute(id: 36, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 19, kind: DEFAULT, type: LEAF) - name @__execute(id: 20, kind: DEFAULT, type: LEAF) + id @__execute(id: 39, kind: DEFAULT, type: LEAF) + name @__execute(id: 40, kind: DEFAULT, type: LEAF) } } - children @__execute(id: 18, kind: DEFAULT, type: COMPOSITE_LIST) { - ... on OrganizationUnit2 { - id @__execute(id: 21, kind: DEFAULT, type: LEAF) - name @__execute(id: 22, kind: DEFAULT, type: LEAF) - someType @__execute(id: 23, kind: DEFAULT, type: COMPOSITE) { + children @__execute(id: 37, kind: DEFAULT, type: COMPOSITE_LIST) { + ... on OrganizationUnit1 { + id @__execute(id: 42, kind: DEFAULT, type: LEAF) + name @__execute(id: 43, kind: DEFAULT, type: LEAF) + someType @__execute(id: 44, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 27, kind: DEFAULT, type: LEAF) - name @__execute(id: 28, kind: DEFAULT, type: LEAF) + id @__execute(id: 46, kind: DEFAULT, type: LEAF) + name @__execute(id: 47, kind: DEFAULT, type: LEAF) } } } - ... on OrganizationUnit1 { - id @__execute(id: 24, kind: DEFAULT, type: LEAF) - name @__execute(id: 25, kind: DEFAULT, type: LEAF) - someType @__execute(id: 26, kind: DEFAULT, type: COMPOSITE) { + ... on OrganizationUnit2 { + id @__execute(id: 49, kind: DEFAULT, type: LEAF) + name @__execute(id: 50, kind: DEFAULT, type: LEAF) + someType @__execute(id: 51, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 27, kind: DEFAULT, type: LEAF) - name @__execute(id: 28, kind: DEFAULT, type: LEAF) + id @__execute(id: 53, kind: DEFAULT, type: LEAF) + name @__execute(id: 54, kind: DEFAULT, type: LEAF) } } } @@ -106,75 +106,75 @@ } } } - ... on OrganizationUnit1 { - id @__execute(id: 5, kind: DEFAULT, type: LEAF) - name @__execute(id: 6, kind: DEFAULT, type: LEAF) - someType @__execute(id: 7, kind: DEFAULT, type: COMPOSITE) { + ... on OrganizationUnit2 { + id @__execute(id: 56, kind: DEFAULT, type: LEAF) + name @__execute(id: 57, kind: DEFAULT, type: LEAF) + someType @__execute(id: 58, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 9, kind: DEFAULT, type: LEAF) - name @__execute(id: 10, kind: DEFAULT, type: LEAF) + id @__execute(id: 61, kind: DEFAULT, type: LEAF) + name @__execute(id: 62, kind: DEFAULT, type: LEAF) } } - children @__execute(id: 8, kind: DEFAULT, type: COMPOSITE_LIST) { - ... on OrganizationUnit2 { - id @__execute(id: 11, kind: DEFAULT, type: LEAF) - name @__execute(id: 12, kind: DEFAULT, type: LEAF) - someType @__execute(id: 13, kind: DEFAULT, type: COMPOSITE) { + children @__execute(id: 59, kind: DEFAULT, type: COMPOSITE_LIST) { + ... on OrganizationUnit1 { + id @__execute(id: 64, kind: DEFAULT, type: LEAF) + name @__execute(id: 65, kind: DEFAULT, type: LEAF) + someType @__execute(id: 66, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 19, kind: DEFAULT, type: LEAF) - name @__execute(id: 20, kind: DEFAULT, type: LEAF) + id @__execute(id: 69, kind: DEFAULT, type: LEAF) + name @__execute(id: 70, kind: DEFAULT, type: LEAF) } } - children @__execute(id: 14, kind: DEFAULT, type: COMPOSITE_LIST) { - ... on OrganizationUnit2 { - id @__execute(id: 21, kind: DEFAULT, type: LEAF) - name @__execute(id: 22, kind: DEFAULT, type: LEAF) - someType @__execute(id: 23, kind: DEFAULT, type: COMPOSITE) { + children @__execute(id: 67, kind: DEFAULT, type: COMPOSITE_LIST) { + ... on OrganizationUnit1 { + id @__execute(id: 72, kind: DEFAULT, type: LEAF) + name @__execute(id: 73, kind: DEFAULT, type: LEAF) + someType @__execute(id: 74, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 27, kind: DEFAULT, type: LEAF) - name @__execute(id: 28, kind: DEFAULT, type: LEAF) + id @__execute(id: 76, kind: DEFAULT, type: LEAF) + name @__execute(id: 77, kind: DEFAULT, type: LEAF) } } } - ... on OrganizationUnit1 { - id @__execute(id: 24, kind: DEFAULT, type: LEAF) - name @__execute(id: 25, kind: DEFAULT, type: LEAF) - someType @__execute(id: 26, kind: DEFAULT, type: COMPOSITE) { + ... on OrganizationUnit2 { + id @__execute(id: 79, kind: DEFAULT, type: LEAF) + name @__execute(id: 80, kind: DEFAULT, type: LEAF) + someType @__execute(id: 81, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 27, kind: DEFAULT, type: LEAF) - name @__execute(id: 28, kind: DEFAULT, type: LEAF) + id @__execute(id: 83, kind: DEFAULT, type: LEAF) + name @__execute(id: 84, kind: DEFAULT, type: LEAF) } } } } } - ... on OrganizationUnit1 { - id @__execute(id: 15, kind: DEFAULT, type: LEAF) - name @__execute(id: 16, kind: DEFAULT, type: LEAF) - someType @__execute(id: 17, kind: DEFAULT, type: COMPOSITE) { + ... on OrganizationUnit2 { + id @__execute(id: 86, kind: DEFAULT, type: LEAF) + name @__execute(id: 87, kind: DEFAULT, type: LEAF) + someType @__execute(id: 88, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 19, kind: DEFAULT, type: LEAF) - name @__execute(id: 20, kind: DEFAULT, type: LEAF) + id @__execute(id: 91, kind: DEFAULT, type: LEAF) + name @__execute(id: 92, kind: DEFAULT, type: LEAF) } } - children @__execute(id: 18, kind: DEFAULT, type: COMPOSITE_LIST) { - ... on OrganizationUnit2 { - id @__execute(id: 21, kind: DEFAULT, type: LEAF) - name @__execute(id: 22, kind: DEFAULT, type: LEAF) - someType @__execute(id: 23, kind: DEFAULT, type: COMPOSITE) { + children @__execute(id: 89, kind: DEFAULT, type: COMPOSITE_LIST) { + ... on OrganizationUnit1 { + id @__execute(id: 94, kind: DEFAULT, type: LEAF) + name @__execute(id: 95, kind: DEFAULT, type: LEAF) + someType @__execute(id: 96, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 27, kind: DEFAULT, type: LEAF) - name @__execute(id: 28, kind: DEFAULT, type: LEAF) + id @__execute(id: 98, kind: DEFAULT, type: LEAF) + name @__execute(id: 99, kind: DEFAULT, type: LEAF) } } } - ... on OrganizationUnit1 { - id @__execute(id: 24, kind: DEFAULT, type: LEAF) - name @__execute(id: 25, kind: DEFAULT, type: LEAF) - someType @__execute(id: 26, kind: DEFAULT, type: COMPOSITE) { + ... on OrganizationUnit2 { + id @__execute(id: 101, kind: DEFAULT, type: LEAF) + name @__execute(id: 102, kind: DEFAULT, type: LEAF) + someType @__execute(id: 103, kind: DEFAULT, type: COMPOSITE) { ... on SomeType { - id @__execute(id: 27, kind: DEFAULT, type: LEAF) - name @__execute(id: 28, kind: DEFAULT, type: LEAF) + id @__execute(id: 105, kind: DEFAULT, type: LEAF) + name @__execute(id: 106, kind: DEFAULT, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.CompositeType_SelectionsSet_Empty.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.CompositeType_SelectionsSet_Empty.snap index 80b353baae3..c3983f25921 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.CompositeType_SelectionsSet_Empty.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.CompositeType_SelectionsSet_Empty.snap @@ -12,11 +12,11 @@ query foo( $v: Boolean ) { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { + ... on Human { } - ... on Human { + ... on Droid { } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Conditional_Fragment_Has_Additional_Field.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Conditional_Fragment_Has_Additional_Field.snap index e2b31a31ebe..158a6cc20be 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Conditional_Fragment_Has_Additional_Field.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Conditional_Fragment_Has_Additional_Field.snap @@ -1,4 +1,4 @@ -query Crypto { +query Crypto { assetBySymbol(symbol: "BTC") { price { lastPrice @@ -16,14 +16,13 @@ fragment PriceInfo on Asset { --------------------------------------------------------- -query Crypto @includeCondition(flag: 2, include: false) { +query Crypto { ... on Query { - assetBySymbol(symbol: "BTC") @__execute(id: 0, kind: DEFAULT, type: COMPOSITE) { + assetBySymbol(symbol: "BTC") @__execute(id: 2, kind: DEFAULT, type: COMPOSITE) { ... on Asset { - price @__execute(id: 1, kind: DEFAULT, type: COMPOSITE) { + price @__execute(id: 4, kind: DEFAULT, type: COMPOSITE) { ... on AssetPrice { - lastPrice @__execute(id: 2, kind: DEFAULT, type: LEAF) - currency @conditional @__execute(id: 3, kind: DEFAULT, type: LEAF) + lastPrice @__execute(id: 6, kind: DEFAULT, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Details_Test.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Details_Test.snap index d23b58a948f..7ab686d7df3 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Details_Test.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Details_Test.snap @@ -74,48 +74,48 @@ query ViewerContainerQuery( $symbol: String! ) { ... on Query { - assetBySymbol(symbol: $symbol) @__execute(id: 0, kind: DEFAULT, type: COMPOSITE) { + assetBySymbol(symbol: $symbol) @__execute(id: 2, kind: DEFAULT, type: COMPOSITE) { ... on Asset { - id @__execute(id: 1, kind: DEFAULT, type: LEAF) - symbol @__execute(id: 2, kind: DEFAULT, type: LEAF) - name @__execute(id: 3, kind: DEFAULT, type: LEAF) - imageUrl @__execute(id: 4, kind: DEFAULT, type: LEAF) - isInWatchlist @__execute(id: 5, kind: DEFAULT, type: LEAF) - hasAlerts @__execute(id: 6, kind: DEFAULT, type: LEAF) - color @__execute(id: 7, kind: DEFAULT, type: LEAF) - price @__execute(id: 8, kind: DEFAULT, type: COMPOSITE) { + id @__execute(id: 4, kind: DEFAULT, type: LEAF) + symbol @__execute(id: 5, kind: DEFAULT, type: LEAF) + name @__execute(id: 6, kind: DEFAULT, type: LEAF) + imageUrl @__execute(id: 7, kind: DEFAULT, type: LEAF) + isInWatchlist @__execute(id: 8, kind: DEFAULT, type: LEAF) + hasAlerts @__execute(id: 9, kind: DEFAULT, type: LEAF) + color @__execute(id: 10, kind: DEFAULT, type: LEAF) + price @__execute(id: 11, kind: DEFAULT, type: COMPOSITE) { ... on AssetPrice { - currency @__execute(id: 12, kind: DEFAULT, type: LEAF) - lastPrice @__execute(id: 13, kind: DEFAULT, type: LEAF) - change(span: DAY) @__execute(id: 14, kind: DEFAULT, type: COMPOSITE) { + currency @__execute(id: 16, kind: DEFAULT, type: LEAF) + lastPrice @__execute(id: 17, kind: DEFAULT, type: LEAF) + change(span: DAY) @__execute(id: 18, kind: DEFAULT, type: COMPOSITE) { ... on AssetPriceChange { - percentageChange @__execute(id: 23, kind: DEFAULT, type: LEAF) - history @__execute(id: 24, kind: DEFAULT, type: COMPOSITE) { + percentageChange @__execute(id: 28, kind: DEFAULT, type: LEAF) + history @__execute(id: 29, kind: DEFAULT, type: COMPOSITE) { ... on HistoryConnection { - nodes @__execute(id: 26, kind: DEFAULT, type: COMPOSITE_LIST) { + nodes @__execute(id: 32, kind: DEFAULT, type: COMPOSITE_LIST) { ... on AssetPriceHistory { - epoch @__execute(id: 27, kind: DEFAULT, type: LEAF) - price @__execute(id: 28, kind: DEFAULT, type: LEAF) + epoch @__execute(id: 34, kind: DEFAULT, type: LEAF) + price @__execute(id: 35, kind: DEFAULT, type: LEAF) } } } } - id @__execute(id: 25, kind: DEFAULT, type: LEAF) + id @__execute(id: 30, kind: DEFAULT, type: LEAF) } } - id @__execute(id: 15, kind: DEFAULT, type: LEAF) - marketCap @__execute(id: 16, kind: DEFAULT, type: LEAF) - volume24Hour @__execute(id: 17, kind: DEFAULT, type: LEAF) - volumePercentChange24Hour @__execute(id: 18, kind: DEFAULT, type: LEAF) - maxSupply @__execute(id: 19, kind: DEFAULT, type: LEAF) - circulatingSupply @__execute(id: 20, kind: DEFAULT, type: LEAF) - tradingActivity @__execute(id: 21, kind: DEFAULT, type: LEAF) - tradableMarketCapRank @__execute(id: 22, kind: DEFAULT, type: LEAF) + id @__execute(id: 19, kind: DEFAULT, type: LEAF) + marketCap @__execute(id: 20, kind: DEFAULT, type: LEAF) + volume24Hour @__execute(id: 21, kind: DEFAULT, type: LEAF) + volumePercentChange24Hour @__execute(id: 22, kind: DEFAULT, type: LEAF) + maxSupply @__execute(id: 23, kind: DEFAULT, type: LEAF) + circulatingSupply @__execute(id: 24, kind: DEFAULT, type: LEAF) + tradingActivity @__execute(id: 25, kind: DEFAULT, type: LEAF) + tradableMarketCapRank @__execute(id: 26, kind: DEFAULT, type: LEAF) } } - description @__execute(id: 9, kind: DEFAULT, type: LEAF) - website @__execute(id: 10, kind: DEFAULT, type: LEAF) - whitePaper @__execute(id: 11, kind: DEFAULT, type: LEAF) + description @__execute(id: 12, kind: DEFAULT, type: LEAF) + website @__execute(id: 13, kind: DEFAULT, type: LEAF) + whitePaper @__execute(id: 14, kind: DEFAULT, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Fragment_Removes_Conditional_State_For_Price.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Fragment_Removes_Conditional_State_For_Price.snap index 284b3b40856..40cfa2ae8eb 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Fragment_Removes_Conditional_State_For_Price.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Fragment_Removes_Conditional_State_For_Price.snap @@ -1,4 +1,4 @@ -query Crypto { +query Crypto { assetBySymbol(symbol: "BTC") { price @include(if: false) { lastPrice @@ -15,13 +15,13 @@ fragment PriceInfo on Asset { --------------------------------------------------------- -query Crypto @includeCondition(flag: 2, include: false) { +query Crypto { ... on Query { - assetBySymbol(symbol: "BTC") @__execute(id: 0, kind: DEFAULT, type: COMPOSITE) { + assetBySymbol(symbol: "BTC") @__execute(id: 2, kind: DEFAULT, type: COMPOSITE) { ... on Asset { - price @__execute(id: 1, kind: DEFAULT, type: COMPOSITE) { + price @__execute(id: 4, kind: DEFAULT, type: COMPOSITE) { ... on AssetPrice { - lastPrice @__execute(id: 2, kind: DEFAULT, type: LEAF) + lastPrice @__execute(id: 6, kind: DEFAULT, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Include.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Include.snap index 4f5afabf0ce..da2b90d8031 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Include.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_Include.snap @@ -1,4 +1,4 @@ -query Crypto { +query Crypto { assetBySymbol(symbol: "BTC") { price { lastPrice @@ -15,13 +15,13 @@ fragment PriceInfo on Asset { --------------------------------------------------------- -query Crypto @includeCondition(flag: 2, include: false) { +query Crypto { ... on Query { - assetBySymbol(symbol: "BTC") @__execute(id: 0, kind: DEFAULT, type: COMPOSITE) { + assetBySymbol(symbol: "BTC") @__execute(id: 2, kind: DEFAULT, type: COMPOSITE) { ... on Asset { - price @__execute(id: 1, kind: DEFAULT, type: COMPOSITE) { + price @__execute(id: 4, kind: DEFAULT, type: COMPOSITE) { ... on AssetPrice { - lastPrice @__execute(id: 2, kind: DEFAULT, type: LEAF) + lastPrice @__execute(id: 6, kind: DEFAULT, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_List_Test.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_List_Test.snap index 22558114cd3..80ebb631801 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_List_Test.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Crypto_List_Test.snap @@ -1,4 +1,4 @@ -query DashboardContainerQuery { +query DashboardContainerQuery { ... DashboardTickerFragment_query ... DashboardFeaturedFragment_query ... DashboardSpotlightFragment_query @defer(label: "DashboardContainerQuery$defer$spotlight") @@ -96,110 +96,98 @@ fragment DashboardTickerItemFragment_asset on Asset { query DashboardContainerQuery { ... on Query { - ticker: assets(first: 10, order: { price: { tradableMarketCapRank: ASC } }) @__execute(id: 0, kind: DEFAULT, type: COMPOSITE) { + ticker: assets(first: 10, order: { price: { tradableMarketCapRank: ASC } }) @__execute(id: 2, kind: DEFAULT, type: COMPOSITE) { ... on AssetsConnection { - nodes @__execute(id: 6, kind: DEFAULT, type: COMPOSITE_LIST) { + nodes @__execute(id: 7, kind: DEFAULT, type: COMPOSITE_LIST) { ... on Asset { - symbol @__execute(id: 20, kind: DEFAULT, type: LEAF) - color @__execute(id: 21, kind: DEFAULT, type: LEAF) - price @__execute(id: 22, kind: DEFAULT, type: COMPOSITE) { + symbol @__execute(id: 9, kind: DEFAULT, type: LEAF) + color @__execute(id: 10, kind: DEFAULT, type: LEAF) + price @__execute(id: 11, kind: DEFAULT, type: COMPOSITE) { ... on AssetPrice { - currency @__execute(id: 36, kind: DEFAULT, type: LEAF) - lastPrice @__execute(id: 37, kind: DEFAULT, type: LEAF) - change24Hour @__execute(id: 38, kind: DEFAULT, type: LEAF) - id @__execute(id: 39, kind: DEFAULT, type: LEAF) + currency @__execute(id: 14, kind: DEFAULT, type: LEAF) + lastPrice @__execute(id: 15, kind: DEFAULT, type: LEAF) + change24Hour @__execute(id: 16, kind: DEFAULT, type: LEAF) + id @__execute(id: 17, kind: DEFAULT, type: LEAF) } } - id @__execute(id: 23, kind: DEFAULT, type: LEAF) + id @__execute(id: 12, kind: DEFAULT, type: LEAF) } } } } - featured: assets(where: { symbol: { in: [ "BTC", "ADA", "ALGO" ] } }) @__execute(id: 1, kind: DEFAULT, type: COMPOSITE) { + featured: assets(where: { symbol: { in: [ "BTC", "ADA", "ALGO" ] } }) @__execute(id: 3, kind: DEFAULT, type: COMPOSITE) { ... on AssetsConnection { - nodes @__execute(id: 7, kind: DEFAULT, type: COMPOSITE_LIST) { + nodes @__execute(id: 19, kind: DEFAULT, type: COMPOSITE_LIST) { ... on Asset { - id @__execute(id: 24, kind: DEFAULT, type: LEAF) - symbol @__execute(id: 25, kind: DEFAULT, type: LEAF) - color @__execute(id: 26, kind: DEFAULT, type: LEAF) - price @__execute(id: 27, kind: DEFAULT, type: COMPOSITE) { + id @__execute(id: 21, kind: DEFAULT, type: LEAF) + symbol @__execute(id: 22, kind: DEFAULT, type: LEAF) + color @__execute(id: 23, kind: DEFAULT, type: LEAF) + price @__execute(id: 24, kind: DEFAULT, type: COMPOSITE) { ... on AssetPrice { - currency @__execute(id: 40, kind: DEFAULT, type: LEAF) - lastPrice @__execute(id: 41, kind: DEFAULT, type: LEAF) - change24Hour @__execute(id: 42, kind: DEFAULT, type: LEAF) - change(span: DAY) @__execute(id: 43, kind: DEFAULT, type: COMPOSITE) { + currency @__execute(id: 26, kind: DEFAULT, type: LEAF) + lastPrice @__execute(id: 27, kind: DEFAULT, type: LEAF) + change24Hour @__execute(id: 28, kind: DEFAULT, type: LEAF) + change(span: DAY) @__execute(id: 29, kind: DEFAULT, type: COMPOSITE) { ... on AssetPriceChange { - history @__execute(id: 45, kind: DEFAULT, type: COMPOSITE) { + history @__execute(id: 32, kind: DEFAULT, type: COMPOSITE) { ... on HistoryConnection { - nodes @__execute(id: 47, kind: DEFAULT, type: COMPOSITE_LIST) { + nodes @__execute(id: 35, kind: DEFAULT, type: COMPOSITE_LIST) { ... on AssetPriceHistory { - epoch @__execute(id: 48, kind: DEFAULT, type: LEAF) - price @__execute(id: 49, kind: DEFAULT, type: LEAF) + epoch @__execute(id: 37, kind: DEFAULT, type: LEAF) + price @__execute(id: 38, kind: DEFAULT, type: LEAF) } } } } - id @__execute(id: 46, kind: DEFAULT, type: LEAF) + id @__execute(id: 33, kind: DEFAULT, type: LEAF) } } - id @__execute(id: 44, kind: DEFAULT, type: LEAF) + id @__execute(id: 30, kind: DEFAULT, type: LEAF) } } } } } } - ... Fragment_0 @defer - } -} - -fragment Fragment_0 on Query { - gainers: assets(first: 5, where: { price: { change24Hour: { gt: 0 } } }, order: { price: { change24Hour: DESC } }) @__execute(id: 2, kind: DEFAULT, type: COMPOSITE) { - ... on AssetsConnection { - ... Fragment_1 @defer - } - } - losers: assets(first: 5, where: { price: { change24Hour: { lt: 0 } } }, order: { price: { change24Hour: ASC } }) @__execute(id: 3, kind: DEFAULT, type: COMPOSITE) { - ... on AssetsConnection { - ... Fragment_2 @defer - } - } -} - -fragment Fragment_1 on AssetsConnection { - nodes @__execute(id: 4, kind: DEFAULT, type: COMPOSITE_LIST) { - ... on Asset { - id @__execute(id: 8, kind: DEFAULT, type: LEAF) - symbol @__execute(id: 9, kind: DEFAULT, type: LEAF) - name @__execute(id: 10, kind: DEFAULT, type: LEAF) - imageUrl @__execute(id: 11, kind: DEFAULT, type: LEAF) - isInWatchlist @__execute(id: 12, kind: DEFAULT, type: LEAF) - price @__execute(id: 13, kind: DEFAULT, type: COMPOSITE) { - ... on AssetPrice { - currency @__execute(id: 28, kind: DEFAULT, type: LEAF) - lastPrice @__execute(id: 29, kind: DEFAULT, type: LEAF) - change24Hour @__execute(id: 30, kind: DEFAULT, type: LEAF) - id @__execute(id: 31, kind: DEFAULT, type: LEAF) + gainers: assets(first: 5, where: { price: { change24Hour: { gt: 0 } } }, order: { price: { change24Hour: DESC } }) @__execute(id: 4, kind: DEFAULT, type: COMPOSITE) { + ... on AssetsConnection { + nodes @__execute(id: 40, kind: DEFAULT, type: COMPOSITE_LIST) { + ... on Asset { + id @__execute(id: 42, kind: DEFAULT, type: LEAF) + symbol @__execute(id: 43, kind: DEFAULT, type: LEAF) + name @__execute(id: 44, kind: DEFAULT, type: LEAF) + imageUrl @__execute(id: 45, kind: DEFAULT, type: LEAF) + isInWatchlist @__execute(id: 46, kind: DEFAULT, type: LEAF) + price @__execute(id: 47, kind: DEFAULT, type: COMPOSITE) { + ... on AssetPrice { + currency @__execute(id: 49, kind: DEFAULT, type: LEAF) + lastPrice @__execute(id: 50, kind: DEFAULT, type: LEAF) + change24Hour @__execute(id: 51, kind: DEFAULT, type: LEAF) + id @__execute(id: 52, kind: DEFAULT, type: LEAF) + } + } + } } } } - } -} - -fragment Fragment_2 on AssetsConnection { - nodes @__execute(id: 5, kind: DEFAULT, type: COMPOSITE_LIST) { - ... on Asset { - id @__execute(id: 14, kind: DEFAULT, type: LEAF) - symbol @__execute(id: 15, kind: DEFAULT, type: LEAF) - name @__execute(id: 16, kind: DEFAULT, type: LEAF) - imageUrl @__execute(id: 17, kind: DEFAULT, type: LEAF) - isInWatchlist @__execute(id: 18, kind: DEFAULT, type: LEAF) - price @__execute(id: 19, kind: DEFAULT, type: COMPOSITE) { - ... on AssetPrice { - currency @__execute(id: 32, kind: DEFAULT, type: LEAF) - lastPrice @__execute(id: 33, kind: DEFAULT, type: LEAF) - change24Hour @__execute(id: 34, kind: DEFAULT, type: LEAF) - id @__execute(id: 35, kind: DEFAULT, type: LEAF) + losers: assets(first: 5, where: { price: { change24Hour: { lt: 0 } } }, order: { price: { change24Hour: ASC } }) @__execute(id: 5, kind: DEFAULT, type: COMPOSITE) { + ... on AssetsConnection { + nodes @__execute(id: 54, kind: DEFAULT, type: COMPOSITE_LIST) { + ... on Asset { + id @__execute(id: 56, kind: DEFAULT, type: LEAF) + symbol @__execute(id: 57, kind: DEFAULT, type: LEAF) + name @__execute(id: 58, kind: DEFAULT, type: LEAF) + imageUrl @__execute(id: 59, kind: DEFAULT, type: LEAF) + isInWatchlist @__execute(id: 60, kind: DEFAULT, type: LEAF) + price @__execute(id: 61, kind: DEFAULT, type: COMPOSITE) { + ... on AssetPrice { + currency @__execute(id: 63, kind: DEFAULT, type: LEAF) + lastPrice @__execute(id: 64, kind: DEFAULT, type: LEAF) + change24Hour @__execute(id: 65, kind: DEFAULT, type: LEAF) + id @__execute(id: 66, kind: DEFAULT, type: LEAF) + } + } + } } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Defer_Fragment_Spread.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Defer_Fragment_Spread.snap index 1296bfd2681..266464b86b5 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Defer_Fragment_Spread.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Defer_Fragment_Spread.snap @@ -1,4 +1,4 @@ -{ +{ hero(episode: EMPIRE) { name ... Foo @defer @@ -13,18 +13,14 @@ fragment Foo on Droid { { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @__execute(id: 1, kind: PURE, type: LEAF) - ... Fragment_0 @defer - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - name @__execute(id: 3, kind: PURE, type: LEAF) + name @__execute(id: 4, kind: PURE, type: LEAF) + } + ... on Droid { + name @__execute(id: 6, kind: PURE, type: LEAF) + id @__execute(id: 7, kind: PURE, type: LEAF) } } } } - -fragment Fragment_0 on Droid { - id @__execute(id: 2, kind: PURE, type: LEAF) -} diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Defer_Inline_Fragment.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Defer_Inline_Fragment.snap index 0360382005e..5a04edfda5d 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Defer_Inline_Fragment.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Defer_Inline_Fragment.snap @@ -1,4 +1,4 @@ -{ +{ hero(episode: EMPIRE) { name ... @defer { @@ -11,23 +11,15 @@ { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @__execute(id: 1, kind: PURE, type: LEAF) - ... Fragment_0 @defer - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - name @__execute(id: 3, kind: PURE, type: LEAF) - ... Fragment_1 @defer + name @__execute(id: 4, kind: PURE, type: LEAF) + id @__execute(id: 5, kind: PURE, type: LEAF) + } + ... on Droid { + name @__execute(id: 7, kind: PURE, type: LEAF) + id @__execute(id: 8, kind: PURE, type: LEAF) } } } } - -fragment Fragment_0 on Droid { - id @__execute(id: 2, kind: PURE, type: LEAF) -} - -fragment Fragment_1 on Human { - id @__execute(id: 4, kind: PURE, type: LEAF) -} diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_1.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_1.snap index f3bfc347ec2..f8da36f8c86 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_1.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_1.snap @@ -15,14 +15,14 @@ fragment abc on Droid { query foo( $v: Boolean! -) @includeCondition(flag: 2) { +) { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @__execute(id: 1, kind: PURE, type: LEAF) - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - name @__execute(id: 2, kind: PURE, type: LEAF) + name @__execute(id: 4, kind: PURE, type: LEAF) + } + ... on Droid { + name @__execute(id: 6, kind: PURE, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_2.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_2.snap index 3bfb9f0dfc9..f0d62066035 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_2.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_2.snap @@ -15,14 +15,14 @@ fragment abc on Droid { query foo( $v: Boolean! -) @includeCondition(flag: 2) { +) { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @__execute(id: 1, kind: PURE, type: LEAF) - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - name @conditional @__execute(id: 2, kind: PURE, type: LEAF) + name @conditional @__execute(id: 4, kind: PURE, type: LEAF) + } + ... on Droid { + name @__execute(id: 6, kind: PURE, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_3.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_3.snap index 8dc47daf76e..be5b7e25238 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_3.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_3.snap @@ -17,14 +17,14 @@ fragment abc on Droid { query foo( $v: Boolean! $q: Boolean! -) @includeCondition(flag: 2) @includeCondition(flag: 3) { +) { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @conditional @__execute(id: 1, kind: PURE, type: LEAF) - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - name @conditional @__execute(id: 2, kind: PURE, type: LEAF) + name @conditional @__execute(id: 4, kind: PURE, type: LEAF) + } + ... on Droid { + name @conditional @__execute(id: 6, kind: PURE, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_4.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_4.snap index 2c915d7cbe1..0283526ecce 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_4.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Is_Visible_When_One_Selection_Is_Visible_4.snap @@ -18,14 +18,14 @@ fragment abc on Droid { query foo( $v: Boolean! -) @includeCondition(flag: 2) { +) { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @__execute(id: 1, kind: PURE, type: LEAF) - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - name @conditional @__execute(id: 2, kind: PURE, type: LEAF) + name @conditional @__execute(id: 4, kind: PURE, type: LEAF) + } + ... on Droid { + name @__execute(id: 6, kind: PURE, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.FragmentSpread_SelectionsSet_Empty.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.FragmentSpread_SelectionsSet_Empty.snap index 0af683a3d46..cca31eee926 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.FragmentSpread_SelectionsSet_Empty.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.FragmentSpread_SelectionsSet_Empty.snap @@ -15,14 +15,14 @@ fragment abc on Droid { query foo( $v: Boolean -) @includeCondition(flag: 2) { +) { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @conditional @__execute(id: 1, kind: PURE, type: LEAF) - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - name @conditional @__execute(id: 2, kind: PURE, type: LEAF) + name @conditional @__execute(id: 4, kind: PURE, type: LEAF) + } + ... on Droid { + name @conditional @__execute(id: 6, kind: PURE, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.InlineFragment_SelectionsSet_Empty.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.InlineFragment_SelectionsSet_Empty.snap index 39b41e2458f..5fd9b1f79af 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.InlineFragment_SelectionsSet_Empty.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.InlineFragment_SelectionsSet_Empty.snap @@ -13,14 +13,14 @@ query foo( query foo( $v: Boolean -) @includeCondition(flag: 2) { +) { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @conditional @__execute(id: 1, kind: PURE, type: LEAF) - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - name @conditional @__execute(id: 2, kind: PURE, type: LEAF) + name @conditional @__execute(id: 4, kind: PURE, type: LEAF) + } + ... on Droid { + name @conditional @__execute(id: 6, kind: PURE, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Large_Query_Test.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Large_Query_Test.snap index 5996273317f..9f4c3556bbd 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Large_Query_Test.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Large_Query_Test.snap @@ -1,4 +1,4 @@ -query getHero { +query getHero { a: hero(episode: NEW_HOPE) { ... Hero } @@ -160,57 +160,57 @@ fragment TypeRef on __Type { query getHero { ... on Query { - a: hero(episode: NEW_HOPE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - id @__execute(id: 5, kind: PURE, type: LEAF) - name @__execute(id: 6, kind: PURE, type: LEAF) - friends @__execute(id: 7, kind: DEFAULT, type: COMPOSITE) { + a: hero(episode: NEW_HOPE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { + ... on Human { + id @__execute(id: 8, kind: PURE, type: LEAF) + name @__execute(id: 9, kind: PURE, type: LEAF) + friends @__execute(id: 10, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 56, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - name @__execute(id: 77, kind: PURE, type: LEAF) - friends @__execute(id: 78, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 14, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + name @__execute(id: 16, kind: PURE, type: LEAF) + friends @__execute(id: 17, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 117, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 140, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 19, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 21, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 166, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 186, kind: PURE, type: LEAF) - name @__execute(id: 187, kind: PURE, type: LEAF) - appearsIn @__execute(id: 188, kind: PURE, type: LEAF_LIST) - height @__execute(id: 189, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 190, kind: PURE, type: LEAF) - } + nodes @__execute(id: 23, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 191, kind: PURE, type: LEAF) - name @__execute(id: 192, kind: PURE, type: LEAF) - appearsIn @__execute(id: 193, kind: PURE, type: LEAF_LIST) - height @__execute(id: 194, kind: PURE, type: LEAF) - homePlanet @__execute(id: 195, kind: PURE, type: LEAF) + id @__execute(id: 25, kind: PURE, type: LEAF) + name @__execute(id: 26, kind: PURE, type: LEAF) + appearsIn @__execute(id: 27, kind: PURE, type: LEAF_LIST) + height @__execute(id: 28, kind: PURE, type: LEAF) + homePlanet @__execute(id: 29, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 31, kind: PURE, type: LEAF) + name @__execute(id: 32, kind: PURE, type: LEAF) + appearsIn @__execute(id: 33, kind: PURE, type: LEAF_LIST) + height @__execute(id: 34, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 35, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 141, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 37, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 166, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 186, kind: PURE, type: LEAF) - name @__execute(id: 187, kind: PURE, type: LEAF) - appearsIn @__execute(id: 188, kind: PURE, type: LEAF_LIST) - height @__execute(id: 189, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 190, kind: PURE, type: LEAF) - } + nodes @__execute(id: 39, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 191, kind: PURE, type: LEAF) - name @__execute(id: 192, kind: PURE, type: LEAF) - appearsIn @__execute(id: 193, kind: PURE, type: LEAF_LIST) - height @__execute(id: 194, kind: PURE, type: LEAF) - homePlanet @__execute(id: 195, kind: PURE, type: LEAF) + id @__execute(id: 41, kind: PURE, type: LEAF) + name @__execute(id: 42, kind: PURE, type: LEAF) + appearsIn @__execute(id: 43, kind: PURE, type: LEAF_LIST) + height @__execute(id: 44, kind: PURE, type: LEAF) + homePlanet @__execute(id: 45, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 47, kind: PURE, type: LEAF) + name @__execute(id: 48, kind: PURE, type: LEAF) + appearsIn @__execute(id: 49, kind: PURE, type: LEAF_LIST) + height @__execute(id: 50, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 51, kind: PURE, type: LEAF) } } } @@ -220,50 +220,50 @@ query getHero { } } } - ... on Human { - name @__execute(id: 79, kind: PURE, type: LEAF) - friends @__execute(id: 80, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + name @__execute(id: 53, kind: PURE, type: LEAF) + friends @__execute(id: 54, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 117, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 140, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 56, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 58, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 166, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 186, kind: PURE, type: LEAF) - name @__execute(id: 187, kind: PURE, type: LEAF) - appearsIn @__execute(id: 188, kind: PURE, type: LEAF_LIST) - height @__execute(id: 189, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 190, kind: PURE, type: LEAF) - } + nodes @__execute(id: 60, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 191, kind: PURE, type: LEAF) - name @__execute(id: 192, kind: PURE, type: LEAF) - appearsIn @__execute(id: 193, kind: PURE, type: LEAF_LIST) - height @__execute(id: 194, kind: PURE, type: LEAF) - homePlanet @__execute(id: 195, kind: PURE, type: LEAF) + id @__execute(id: 62, kind: PURE, type: LEAF) + name @__execute(id: 63, kind: PURE, type: LEAF) + appearsIn @__execute(id: 64, kind: PURE, type: LEAF_LIST) + height @__execute(id: 65, kind: PURE, type: LEAF) + homePlanet @__execute(id: 66, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 68, kind: PURE, type: LEAF) + name @__execute(id: 69, kind: PURE, type: LEAF) + appearsIn @__execute(id: 70, kind: PURE, type: LEAF_LIST) + height @__execute(id: 71, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 72, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 141, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 74, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 166, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 186, kind: PURE, type: LEAF) - name @__execute(id: 187, kind: PURE, type: LEAF) - appearsIn @__execute(id: 188, kind: PURE, type: LEAF_LIST) - height @__execute(id: 189, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 190, kind: PURE, type: LEAF) - } + nodes @__execute(id: 76, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 191, kind: PURE, type: LEAF) - name @__execute(id: 192, kind: PURE, type: LEAF) - appearsIn @__execute(id: 193, kind: PURE, type: LEAF_LIST) - height @__execute(id: 194, kind: PURE, type: LEAF) - homePlanet @__execute(id: 195, kind: PURE, type: LEAF) + id @__execute(id: 78, kind: PURE, type: LEAF) + name @__execute(id: 79, kind: PURE, type: LEAF) + appearsIn @__execute(id: 80, kind: PURE, type: LEAF_LIST) + height @__execute(id: 81, kind: PURE, type: LEAF) + homePlanet @__execute(id: 82, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 84, kind: PURE, type: LEAF) + name @__execute(id: 85, kind: PURE, type: LEAF) + appearsIn @__execute(id: 86, kind: PURE, type: LEAF_LIST) + height @__execute(id: 87, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 88, kind: PURE, type: LEAF) } } } @@ -276,59 +276,59 @@ query getHero { } } } - height @__execute(id: 8, kind: PURE, type: LEAF) - appearsIn @__execute(id: 9, kind: PURE, type: LEAF_LIST) + height @__execute(id: 11, kind: PURE, type: LEAF) + appearsIn @__execute(id: 12, kind: PURE, type: LEAF_LIST) } - ... on Human { - id @__execute(id: 10, kind: PURE, type: LEAF) - name @__execute(id: 11, kind: PURE, type: LEAF) - friends @__execute(id: 12, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + id @__execute(id: 90, kind: PURE, type: LEAF) + name @__execute(id: 91, kind: PURE, type: LEAF) + friends @__execute(id: 92, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 56, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - name @__execute(id: 77, kind: PURE, type: LEAF) - friends @__execute(id: 78, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 96, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + name @__execute(id: 98, kind: PURE, type: LEAF) + friends @__execute(id: 99, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 117, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 140, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 101, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 103, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 166, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 186, kind: PURE, type: LEAF) - name @__execute(id: 187, kind: PURE, type: LEAF) - appearsIn @__execute(id: 188, kind: PURE, type: LEAF_LIST) - height @__execute(id: 189, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 190, kind: PURE, type: LEAF) - } + nodes @__execute(id: 105, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 191, kind: PURE, type: LEAF) - name @__execute(id: 192, kind: PURE, type: LEAF) - appearsIn @__execute(id: 193, kind: PURE, type: LEAF_LIST) - height @__execute(id: 194, kind: PURE, type: LEAF) - homePlanet @__execute(id: 195, kind: PURE, type: LEAF) + id @__execute(id: 107, kind: PURE, type: LEAF) + name @__execute(id: 108, kind: PURE, type: LEAF) + appearsIn @__execute(id: 109, kind: PURE, type: LEAF_LIST) + height @__execute(id: 110, kind: PURE, type: LEAF) + homePlanet @__execute(id: 111, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 113, kind: PURE, type: LEAF) + name @__execute(id: 114, kind: PURE, type: LEAF) + appearsIn @__execute(id: 115, kind: PURE, type: LEAF_LIST) + height @__execute(id: 116, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 117, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 141, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 119, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 166, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 186, kind: PURE, type: LEAF) - name @__execute(id: 187, kind: PURE, type: LEAF) - appearsIn @__execute(id: 188, kind: PURE, type: LEAF_LIST) - height @__execute(id: 189, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 190, kind: PURE, type: LEAF) - } + nodes @__execute(id: 121, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 191, kind: PURE, type: LEAF) - name @__execute(id: 192, kind: PURE, type: LEAF) - appearsIn @__execute(id: 193, kind: PURE, type: LEAF_LIST) - height @__execute(id: 194, kind: PURE, type: LEAF) - homePlanet @__execute(id: 195, kind: PURE, type: LEAF) + id @__execute(id: 123, kind: PURE, type: LEAF) + name @__execute(id: 124, kind: PURE, type: LEAF) + appearsIn @__execute(id: 125, kind: PURE, type: LEAF_LIST) + height @__execute(id: 126, kind: PURE, type: LEAF) + homePlanet @__execute(id: 127, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 129, kind: PURE, type: LEAF) + name @__execute(id: 130, kind: PURE, type: LEAF) + appearsIn @__execute(id: 131, kind: PURE, type: LEAF_LIST) + height @__execute(id: 132, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 133, kind: PURE, type: LEAF) } } } @@ -338,50 +338,50 @@ query getHero { } } } - ... on Human { - name @__execute(id: 79, kind: PURE, type: LEAF) - friends @__execute(id: 80, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + name @__execute(id: 135, kind: PURE, type: LEAF) + friends @__execute(id: 136, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 117, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { + nodes @__execute(id: 138, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { friends @__execute(id: 140, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 166, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 186, kind: PURE, type: LEAF) - name @__execute(id: 187, kind: PURE, type: LEAF) - appearsIn @__execute(id: 188, kind: PURE, type: LEAF_LIST) - height @__execute(id: 189, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 190, kind: PURE, type: LEAF) - } + nodes @__execute(id: 142, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 191, kind: PURE, type: LEAF) - name @__execute(id: 192, kind: PURE, type: LEAF) - appearsIn @__execute(id: 193, kind: PURE, type: LEAF_LIST) - height @__execute(id: 194, kind: PURE, type: LEAF) - homePlanet @__execute(id: 195, kind: PURE, type: LEAF) + id @__execute(id: 144, kind: PURE, type: LEAF) + name @__execute(id: 145, kind: PURE, type: LEAF) + appearsIn @__execute(id: 146, kind: PURE, type: LEAF_LIST) + height @__execute(id: 147, kind: PURE, type: LEAF) + homePlanet @__execute(id: 148, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 150, kind: PURE, type: LEAF) + name @__execute(id: 151, kind: PURE, type: LEAF) + appearsIn @__execute(id: 152, kind: PURE, type: LEAF_LIST) + height @__execute(id: 153, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 154, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 141, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 156, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 166, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 186, kind: PURE, type: LEAF) - name @__execute(id: 187, kind: PURE, type: LEAF) - appearsIn @__execute(id: 188, kind: PURE, type: LEAF_LIST) - height @__execute(id: 189, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 190, kind: PURE, type: LEAF) - } + nodes @__execute(id: 158, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 191, kind: PURE, type: LEAF) - name @__execute(id: 192, kind: PURE, type: LEAF) - appearsIn @__execute(id: 193, kind: PURE, type: LEAF_LIST) - height @__execute(id: 194, kind: PURE, type: LEAF) - homePlanet @__execute(id: 195, kind: PURE, type: LEAF) + id @__execute(id: 160, kind: PURE, type: LEAF) + name @__execute(id: 161, kind: PURE, type: LEAF) + appearsIn @__execute(id: 162, kind: PURE, type: LEAF_LIST) + height @__execute(id: 163, kind: PURE, type: LEAF) + homePlanet @__execute(id: 164, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 166, kind: PURE, type: LEAF) + name @__execute(id: 167, kind: PURE, type: LEAF) + appearsIn @__execute(id: 168, kind: PURE, type: LEAF_LIST) + height @__execute(id: 169, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 170, kind: PURE, type: LEAF) } } } @@ -394,61 +394,61 @@ query getHero { } } } - height @__execute(id: 13, kind: PURE, type: LEAF) - appearsIn @__execute(id: 14, kind: PURE, type: LEAF_LIST) + height @__execute(id: 93, kind: PURE, type: LEAF) + appearsIn @__execute(id: 94, kind: PURE, type: LEAF_LIST) } } - b: hero(episode: EMPIRE) @__execute(id: 1, kind: PURE, type: COMPOSITE) { - ... on Droid { - id @__execute(id: 15, kind: PURE, type: LEAF) - name @__execute(id: 16, kind: PURE, type: LEAF) - friends @__execute(id: 17, kind: DEFAULT, type: COMPOSITE) { + b: hero(episode: EMPIRE) @__execute(id: 3, kind: PURE, type: COMPOSITE) { + ... on Human { + id @__execute(id: 172, kind: PURE, type: LEAF) + name @__execute(id: 173, kind: PURE, type: LEAF) + friends @__execute(id: 174, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 57, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - name @__execute(id: 81, kind: PURE, type: LEAF) - friends @__execute(id: 82, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 178, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + name @__execute(id: 180, kind: PURE, type: LEAF) + friends @__execute(id: 181, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 118, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 142, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 183, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 185, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 167, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 196, kind: PURE, type: LEAF) - name @__execute(id: 197, kind: PURE, type: LEAF) - appearsIn @__execute(id: 198, kind: PURE, type: LEAF_LIST) - height @__execute(id: 199, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 200, kind: PURE, type: LEAF) - } + nodes @__execute(id: 187, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 201, kind: PURE, type: LEAF) - name @__execute(id: 202, kind: PURE, type: LEAF) - appearsIn @__execute(id: 203, kind: PURE, type: LEAF_LIST) - height @__execute(id: 204, kind: PURE, type: LEAF) - homePlanet @__execute(id: 205, kind: PURE, type: LEAF) + id @__execute(id: 189, kind: PURE, type: LEAF) + name @__execute(id: 190, kind: PURE, type: LEAF) + appearsIn @__execute(id: 191, kind: PURE, type: LEAF_LIST) + height @__execute(id: 192, kind: PURE, type: LEAF) + homePlanet @__execute(id: 193, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 195, kind: PURE, type: LEAF) + name @__execute(id: 196, kind: PURE, type: LEAF) + appearsIn @__execute(id: 197, kind: PURE, type: LEAF_LIST) + height @__execute(id: 198, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 199, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 143, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 201, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 167, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 196, kind: PURE, type: LEAF) - name @__execute(id: 197, kind: PURE, type: LEAF) - appearsIn @__execute(id: 198, kind: PURE, type: LEAF_LIST) - height @__execute(id: 199, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 200, kind: PURE, type: LEAF) - } + nodes @__execute(id: 203, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 201, kind: PURE, type: LEAF) - name @__execute(id: 202, kind: PURE, type: LEAF) - appearsIn @__execute(id: 203, kind: PURE, type: LEAF_LIST) - height @__execute(id: 204, kind: PURE, type: LEAF) - homePlanet @__execute(id: 205, kind: PURE, type: LEAF) + id @__execute(id: 205, kind: PURE, type: LEAF) + name @__execute(id: 206, kind: PURE, type: LEAF) + appearsIn @__execute(id: 207, kind: PURE, type: LEAF_LIST) + height @__execute(id: 208, kind: PURE, type: LEAF) + homePlanet @__execute(id: 209, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 211, kind: PURE, type: LEAF) + name @__execute(id: 212, kind: PURE, type: LEAF) + appearsIn @__execute(id: 213, kind: PURE, type: LEAF_LIST) + height @__execute(id: 214, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 215, kind: PURE, type: LEAF) } } } @@ -458,50 +458,50 @@ query getHero { } } } - ... on Human { - name @__execute(id: 83, kind: PURE, type: LEAF) - friends @__execute(id: 84, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + name @__execute(id: 217, kind: PURE, type: LEAF) + friends @__execute(id: 218, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 118, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 142, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 220, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 222, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 167, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 196, kind: PURE, type: LEAF) - name @__execute(id: 197, kind: PURE, type: LEAF) - appearsIn @__execute(id: 198, kind: PURE, type: LEAF_LIST) - height @__execute(id: 199, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 200, kind: PURE, type: LEAF) - } + nodes @__execute(id: 224, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 201, kind: PURE, type: LEAF) - name @__execute(id: 202, kind: PURE, type: LEAF) - appearsIn @__execute(id: 203, kind: PURE, type: LEAF_LIST) - height @__execute(id: 204, kind: PURE, type: LEAF) - homePlanet @__execute(id: 205, kind: PURE, type: LEAF) + id @__execute(id: 226, kind: PURE, type: LEAF) + name @__execute(id: 227, kind: PURE, type: LEAF) + appearsIn @__execute(id: 228, kind: PURE, type: LEAF_LIST) + height @__execute(id: 229, kind: PURE, type: LEAF) + homePlanet @__execute(id: 230, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 232, kind: PURE, type: LEAF) + name @__execute(id: 233, kind: PURE, type: LEAF) + appearsIn @__execute(id: 234, kind: PURE, type: LEAF_LIST) + height @__execute(id: 235, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 236, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 143, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 238, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 167, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 196, kind: PURE, type: LEAF) - name @__execute(id: 197, kind: PURE, type: LEAF) - appearsIn @__execute(id: 198, kind: PURE, type: LEAF_LIST) - height @__execute(id: 199, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 200, kind: PURE, type: LEAF) - } + nodes @__execute(id: 240, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 201, kind: PURE, type: LEAF) - name @__execute(id: 202, kind: PURE, type: LEAF) - appearsIn @__execute(id: 203, kind: PURE, type: LEAF_LIST) - height @__execute(id: 204, kind: PURE, type: LEAF) - homePlanet @__execute(id: 205, kind: PURE, type: LEAF) + id @__execute(id: 242, kind: PURE, type: LEAF) + name @__execute(id: 243, kind: PURE, type: LEAF) + appearsIn @__execute(id: 244, kind: PURE, type: LEAF_LIST) + height @__execute(id: 245, kind: PURE, type: LEAF) + homePlanet @__execute(id: 246, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 248, kind: PURE, type: LEAF) + name @__execute(id: 249, kind: PURE, type: LEAF) + appearsIn @__execute(id: 250, kind: PURE, type: LEAF_LIST) + height @__execute(id: 251, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 252, kind: PURE, type: LEAF) } } } @@ -514,59 +514,59 @@ query getHero { } } } - height @__execute(id: 18, kind: PURE, type: LEAF) - appearsIn @__execute(id: 19, kind: PURE, type: LEAF_LIST) + height @__execute(id: 175, kind: PURE, type: LEAF) + appearsIn @__execute(id: 176, kind: PURE, type: LEAF_LIST) } - ... on Human { - id @__execute(id: 20, kind: PURE, type: LEAF) - name @__execute(id: 21, kind: PURE, type: LEAF) - friends @__execute(id: 22, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + id @__execute(id: 254, kind: PURE, type: LEAF) + name @__execute(id: 255, kind: PURE, type: LEAF) + friends @__execute(id: 256, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 57, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - name @__execute(id: 81, kind: PURE, type: LEAF) - friends @__execute(id: 82, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 260, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + name @__execute(id: 262, kind: PURE, type: LEAF) + friends @__execute(id: 263, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 118, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 142, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 265, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 267, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 167, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 196, kind: PURE, type: LEAF) - name @__execute(id: 197, kind: PURE, type: LEAF) - appearsIn @__execute(id: 198, kind: PURE, type: LEAF_LIST) - height @__execute(id: 199, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 200, kind: PURE, type: LEAF) - } + nodes @__execute(id: 269, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 201, kind: PURE, type: LEAF) - name @__execute(id: 202, kind: PURE, type: LEAF) - appearsIn @__execute(id: 203, kind: PURE, type: LEAF_LIST) - height @__execute(id: 204, kind: PURE, type: LEAF) - homePlanet @__execute(id: 205, kind: PURE, type: LEAF) + id @__execute(id: 271, kind: PURE, type: LEAF) + name @__execute(id: 272, kind: PURE, type: LEAF) + appearsIn @__execute(id: 273, kind: PURE, type: LEAF_LIST) + height @__execute(id: 274, kind: PURE, type: LEAF) + homePlanet @__execute(id: 275, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 277, kind: PURE, type: LEAF) + name @__execute(id: 278, kind: PURE, type: LEAF) + appearsIn @__execute(id: 279, kind: PURE, type: LEAF_LIST) + height @__execute(id: 280, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 281, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 143, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 283, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 167, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 196, kind: PURE, type: LEAF) - name @__execute(id: 197, kind: PURE, type: LEAF) - appearsIn @__execute(id: 198, kind: PURE, type: LEAF_LIST) - height @__execute(id: 199, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 200, kind: PURE, type: LEAF) - } + nodes @__execute(id: 285, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 201, kind: PURE, type: LEAF) - name @__execute(id: 202, kind: PURE, type: LEAF) - appearsIn @__execute(id: 203, kind: PURE, type: LEAF_LIST) - height @__execute(id: 204, kind: PURE, type: LEAF) - homePlanet @__execute(id: 205, kind: PURE, type: LEAF) + id @__execute(id: 287, kind: PURE, type: LEAF) + name @__execute(id: 288, kind: PURE, type: LEAF) + appearsIn @__execute(id: 289, kind: PURE, type: LEAF_LIST) + height @__execute(id: 290, kind: PURE, type: LEAF) + homePlanet @__execute(id: 291, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 293, kind: PURE, type: LEAF) + name @__execute(id: 294, kind: PURE, type: LEAF) + appearsIn @__execute(id: 295, kind: PURE, type: LEAF_LIST) + height @__execute(id: 296, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 297, kind: PURE, type: LEAF) } } } @@ -576,50 +576,50 @@ query getHero { } } } - ... on Human { - name @__execute(id: 83, kind: PURE, type: LEAF) - friends @__execute(id: 84, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + name @__execute(id: 299, kind: PURE, type: LEAF) + friends @__execute(id: 300, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 118, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 142, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 302, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 304, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 167, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 196, kind: PURE, type: LEAF) - name @__execute(id: 197, kind: PURE, type: LEAF) - appearsIn @__execute(id: 198, kind: PURE, type: LEAF_LIST) - height @__execute(id: 199, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 200, kind: PURE, type: LEAF) - } + nodes @__execute(id: 306, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 201, kind: PURE, type: LEAF) - name @__execute(id: 202, kind: PURE, type: LEAF) - appearsIn @__execute(id: 203, kind: PURE, type: LEAF_LIST) - height @__execute(id: 204, kind: PURE, type: LEAF) - homePlanet @__execute(id: 205, kind: PURE, type: LEAF) + id @__execute(id: 308, kind: PURE, type: LEAF) + name @__execute(id: 309, kind: PURE, type: LEAF) + appearsIn @__execute(id: 310, kind: PURE, type: LEAF_LIST) + height @__execute(id: 311, kind: PURE, type: LEAF) + homePlanet @__execute(id: 312, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 314, kind: PURE, type: LEAF) + name @__execute(id: 315, kind: PURE, type: LEAF) + appearsIn @__execute(id: 316, kind: PURE, type: LEAF_LIST) + height @__execute(id: 317, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 318, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 143, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 320, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 167, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 196, kind: PURE, type: LEAF) - name @__execute(id: 197, kind: PURE, type: LEAF) - appearsIn @__execute(id: 198, kind: PURE, type: LEAF_LIST) - height @__execute(id: 199, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 200, kind: PURE, type: LEAF) - } + nodes @__execute(id: 322, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 201, kind: PURE, type: LEAF) - name @__execute(id: 202, kind: PURE, type: LEAF) - appearsIn @__execute(id: 203, kind: PURE, type: LEAF_LIST) - height @__execute(id: 204, kind: PURE, type: LEAF) - homePlanet @__execute(id: 205, kind: PURE, type: LEAF) + id @__execute(id: 324, kind: PURE, type: LEAF) + name @__execute(id: 325, kind: PURE, type: LEAF) + appearsIn @__execute(id: 326, kind: PURE, type: LEAF_LIST) + height @__execute(id: 327, kind: PURE, type: LEAF) + homePlanet @__execute(id: 328, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 330, kind: PURE, type: LEAF) + name @__execute(id: 331, kind: PURE, type: LEAF) + appearsIn @__execute(id: 332, kind: PURE, type: LEAF_LIST) + height @__execute(id: 333, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 334, kind: PURE, type: LEAF) } } } @@ -632,61 +632,61 @@ query getHero { } } } - height @__execute(id: 23, kind: PURE, type: LEAF) - appearsIn @__execute(id: 24, kind: PURE, type: LEAF_LIST) + height @__execute(id: 257, kind: PURE, type: LEAF) + appearsIn @__execute(id: 258, kind: PURE, type: LEAF_LIST) } } - c: hero(episode: JEDI) @__execute(id: 2, kind: PURE, type: COMPOSITE) { - ... on Droid { - id @__execute(id: 25, kind: PURE, type: LEAF) - name @__execute(id: 26, kind: PURE, type: LEAF) - friends @__execute(id: 27, kind: DEFAULT, type: COMPOSITE) { + c: hero(episode: JEDI) @__execute(id: 4, kind: PURE, type: COMPOSITE) { + ... on Human { + id @__execute(id: 336, kind: PURE, type: LEAF) + name @__execute(id: 337, kind: PURE, type: LEAF) + friends @__execute(id: 338, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 58, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - name @__execute(id: 85, kind: PURE, type: LEAF) - friends @__execute(id: 86, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 342, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + name @__execute(id: 344, kind: PURE, type: LEAF) + friends @__execute(id: 345, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 119, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 144, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 347, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 349, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 168, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 206, kind: PURE, type: LEAF) - name @__execute(id: 207, kind: PURE, type: LEAF) - appearsIn @__execute(id: 208, kind: PURE, type: LEAF_LIST) - height @__execute(id: 209, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 210, kind: PURE, type: LEAF) - } + nodes @__execute(id: 351, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 211, kind: PURE, type: LEAF) - name @__execute(id: 212, kind: PURE, type: LEAF) - appearsIn @__execute(id: 213, kind: PURE, type: LEAF_LIST) - height @__execute(id: 214, kind: PURE, type: LEAF) - homePlanet @__execute(id: 215, kind: PURE, type: LEAF) + id @__execute(id: 353, kind: PURE, type: LEAF) + name @__execute(id: 354, kind: PURE, type: LEAF) + appearsIn @__execute(id: 355, kind: PURE, type: LEAF_LIST) + height @__execute(id: 356, kind: PURE, type: LEAF) + homePlanet @__execute(id: 357, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 359, kind: PURE, type: LEAF) + name @__execute(id: 360, kind: PURE, type: LEAF) + appearsIn @__execute(id: 361, kind: PURE, type: LEAF_LIST) + height @__execute(id: 362, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 363, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 145, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 365, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 168, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 206, kind: PURE, type: LEAF) - name @__execute(id: 207, kind: PURE, type: LEAF) - appearsIn @__execute(id: 208, kind: PURE, type: LEAF_LIST) - height @__execute(id: 209, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 210, kind: PURE, type: LEAF) - } + nodes @__execute(id: 367, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 211, kind: PURE, type: LEAF) - name @__execute(id: 212, kind: PURE, type: LEAF) - appearsIn @__execute(id: 213, kind: PURE, type: LEAF_LIST) - height @__execute(id: 214, kind: PURE, type: LEAF) - homePlanet @__execute(id: 215, kind: PURE, type: LEAF) + id @__execute(id: 369, kind: PURE, type: LEAF) + name @__execute(id: 370, kind: PURE, type: LEAF) + appearsIn @__execute(id: 371, kind: PURE, type: LEAF_LIST) + height @__execute(id: 372, kind: PURE, type: LEAF) + homePlanet @__execute(id: 373, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 375, kind: PURE, type: LEAF) + name @__execute(id: 376, kind: PURE, type: LEAF) + appearsIn @__execute(id: 377, kind: PURE, type: LEAF_LIST) + height @__execute(id: 378, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 379, kind: PURE, type: LEAF) } } } @@ -696,50 +696,50 @@ query getHero { } } } - ... on Human { - name @__execute(id: 87, kind: PURE, type: LEAF) - friends @__execute(id: 88, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + name @__execute(id: 381, kind: PURE, type: LEAF) + friends @__execute(id: 382, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 119, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 144, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 384, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 386, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 168, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 206, kind: PURE, type: LEAF) - name @__execute(id: 207, kind: PURE, type: LEAF) - appearsIn @__execute(id: 208, kind: PURE, type: LEAF_LIST) - height @__execute(id: 209, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 210, kind: PURE, type: LEAF) - } + nodes @__execute(id: 388, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 211, kind: PURE, type: LEAF) - name @__execute(id: 212, kind: PURE, type: LEAF) - appearsIn @__execute(id: 213, kind: PURE, type: LEAF_LIST) - height @__execute(id: 214, kind: PURE, type: LEAF) - homePlanet @__execute(id: 215, kind: PURE, type: LEAF) + id @__execute(id: 390, kind: PURE, type: LEAF) + name @__execute(id: 391, kind: PURE, type: LEAF) + appearsIn @__execute(id: 392, kind: PURE, type: LEAF_LIST) + height @__execute(id: 393, kind: PURE, type: LEAF) + homePlanet @__execute(id: 394, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 396, kind: PURE, type: LEAF) + name @__execute(id: 397, kind: PURE, type: LEAF) + appearsIn @__execute(id: 398, kind: PURE, type: LEAF_LIST) + height @__execute(id: 399, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 400, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 145, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 402, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 168, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 206, kind: PURE, type: LEAF) - name @__execute(id: 207, kind: PURE, type: LEAF) - appearsIn @__execute(id: 208, kind: PURE, type: LEAF_LIST) - height @__execute(id: 209, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 210, kind: PURE, type: LEAF) - } + nodes @__execute(id: 404, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 211, kind: PURE, type: LEAF) - name @__execute(id: 212, kind: PURE, type: LEAF) - appearsIn @__execute(id: 213, kind: PURE, type: LEAF_LIST) - height @__execute(id: 214, kind: PURE, type: LEAF) - homePlanet @__execute(id: 215, kind: PURE, type: LEAF) + id @__execute(id: 406, kind: PURE, type: LEAF) + name @__execute(id: 407, kind: PURE, type: LEAF) + appearsIn @__execute(id: 408, kind: PURE, type: LEAF_LIST) + height @__execute(id: 409, kind: PURE, type: LEAF) + homePlanet @__execute(id: 410, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 412, kind: PURE, type: LEAF) + name @__execute(id: 413, kind: PURE, type: LEAF) + appearsIn @__execute(id: 414, kind: PURE, type: LEAF_LIST) + height @__execute(id: 415, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 416, kind: PURE, type: LEAF) } } } @@ -752,59 +752,59 @@ query getHero { } } } - height @__execute(id: 28, kind: PURE, type: LEAF) - appearsIn @__execute(id: 29, kind: PURE, type: LEAF_LIST) + height @__execute(id: 339, kind: PURE, type: LEAF) + appearsIn @__execute(id: 340, kind: PURE, type: LEAF_LIST) } - ... on Human { - id @__execute(id: 30, kind: PURE, type: LEAF) - name @__execute(id: 31, kind: PURE, type: LEAF) - friends @__execute(id: 32, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + id @__execute(id: 418, kind: PURE, type: LEAF) + name @__execute(id: 419, kind: PURE, type: LEAF) + friends @__execute(id: 420, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 58, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - name @__execute(id: 85, kind: PURE, type: LEAF) - friends @__execute(id: 86, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 424, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + name @__execute(id: 426, kind: PURE, type: LEAF) + friends @__execute(id: 427, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 119, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 144, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 429, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 431, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 168, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 206, kind: PURE, type: LEAF) - name @__execute(id: 207, kind: PURE, type: LEAF) - appearsIn @__execute(id: 208, kind: PURE, type: LEAF_LIST) - height @__execute(id: 209, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 210, kind: PURE, type: LEAF) - } + nodes @__execute(id: 433, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 211, kind: PURE, type: LEAF) - name @__execute(id: 212, kind: PURE, type: LEAF) - appearsIn @__execute(id: 213, kind: PURE, type: LEAF_LIST) - height @__execute(id: 214, kind: PURE, type: LEAF) - homePlanet @__execute(id: 215, kind: PURE, type: LEAF) + id @__execute(id: 435, kind: PURE, type: LEAF) + name @__execute(id: 436, kind: PURE, type: LEAF) + appearsIn @__execute(id: 437, kind: PURE, type: LEAF_LIST) + height @__execute(id: 438, kind: PURE, type: LEAF) + homePlanet @__execute(id: 439, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 441, kind: PURE, type: LEAF) + name @__execute(id: 442, kind: PURE, type: LEAF) + appearsIn @__execute(id: 443, kind: PURE, type: LEAF_LIST) + height @__execute(id: 444, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 445, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 145, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 447, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 168, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 206, kind: PURE, type: LEAF) - name @__execute(id: 207, kind: PURE, type: LEAF) - appearsIn @__execute(id: 208, kind: PURE, type: LEAF_LIST) - height @__execute(id: 209, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 210, kind: PURE, type: LEAF) - } + nodes @__execute(id: 449, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 211, kind: PURE, type: LEAF) - name @__execute(id: 212, kind: PURE, type: LEAF) - appearsIn @__execute(id: 213, kind: PURE, type: LEAF_LIST) - height @__execute(id: 214, kind: PURE, type: LEAF) - homePlanet @__execute(id: 215, kind: PURE, type: LEAF) + id @__execute(id: 451, kind: PURE, type: LEAF) + name @__execute(id: 452, kind: PURE, type: LEAF) + appearsIn @__execute(id: 453, kind: PURE, type: LEAF_LIST) + height @__execute(id: 454, kind: PURE, type: LEAF) + homePlanet @__execute(id: 455, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 457, kind: PURE, type: LEAF) + name @__execute(id: 458, kind: PURE, type: LEAF) + appearsIn @__execute(id: 459, kind: PURE, type: LEAF_LIST) + height @__execute(id: 460, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 461, kind: PURE, type: LEAF) } } } @@ -814,50 +814,50 @@ query getHero { } } } - ... on Human { - name @__execute(id: 87, kind: PURE, type: LEAF) - friends @__execute(id: 88, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + name @__execute(id: 463, kind: PURE, type: LEAF) + friends @__execute(id: 464, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 119, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 144, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 466, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 468, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 168, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 206, kind: PURE, type: LEAF) - name @__execute(id: 207, kind: PURE, type: LEAF) - appearsIn @__execute(id: 208, kind: PURE, type: LEAF_LIST) - height @__execute(id: 209, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 210, kind: PURE, type: LEAF) - } + nodes @__execute(id: 470, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 211, kind: PURE, type: LEAF) - name @__execute(id: 212, kind: PURE, type: LEAF) - appearsIn @__execute(id: 213, kind: PURE, type: LEAF_LIST) - height @__execute(id: 214, kind: PURE, type: LEAF) - homePlanet @__execute(id: 215, kind: PURE, type: LEAF) + id @__execute(id: 472, kind: PURE, type: LEAF) + name @__execute(id: 473, kind: PURE, type: LEAF) + appearsIn @__execute(id: 474, kind: PURE, type: LEAF_LIST) + height @__execute(id: 475, kind: PURE, type: LEAF) + homePlanet @__execute(id: 476, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 478, kind: PURE, type: LEAF) + name @__execute(id: 479, kind: PURE, type: LEAF) + appearsIn @__execute(id: 480, kind: PURE, type: LEAF_LIST) + height @__execute(id: 481, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 482, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 145, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 484, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 168, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 206, kind: PURE, type: LEAF) - name @__execute(id: 207, kind: PURE, type: LEAF) - appearsIn @__execute(id: 208, kind: PURE, type: LEAF_LIST) - height @__execute(id: 209, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 210, kind: PURE, type: LEAF) - } + nodes @__execute(id: 486, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 211, kind: PURE, type: LEAF) - name @__execute(id: 212, kind: PURE, type: LEAF) - appearsIn @__execute(id: 213, kind: PURE, type: LEAF_LIST) - height @__execute(id: 214, kind: PURE, type: LEAF) - homePlanet @__execute(id: 215, kind: PURE, type: LEAF) + id @__execute(id: 488, kind: PURE, type: LEAF) + name @__execute(id: 489, kind: PURE, type: LEAF) + appearsIn @__execute(id: 490, kind: PURE, type: LEAF_LIST) + height @__execute(id: 491, kind: PURE, type: LEAF) + homePlanet @__execute(id: 492, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 494, kind: PURE, type: LEAF) + name @__execute(id: 495, kind: PURE, type: LEAF) + appearsIn @__execute(id: 496, kind: PURE, type: LEAF_LIST) + height @__execute(id: 497, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 498, kind: PURE, type: LEAF) } } } @@ -870,62 +870,68 @@ query getHero { } } } - height @__execute(id: 33, kind: PURE, type: LEAF) - appearsIn @__execute(id: 34, kind: PURE, type: LEAF_LIST) + height @__execute(id: 421, kind: PURE, type: LEAF) + appearsIn @__execute(id: 422, kind: PURE, type: LEAF_LIST) } } - search(text: "") @__execute(id: 3, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - __typename @__execute(id: 35, kind: PURE, type: LEAF) - id @__execute(id: 36, kind: PURE, type: LEAF) - name @__execute(id: 37, kind: PURE, type: LEAF) - friends @__execute(id: 38, kind: DEFAULT, type: COMPOSITE) { + search(text: "") @__execute(id: 5, kind: PURE, type: COMPOSITE_LIST) { + ... on Starship { + __typename @__execute(id: 500, kind: PURE, type: LEAF) + shipId: id @__execute(id: 501, kind: PURE, type: LEAF) + length @__execute(id: 502, kind: PURE, type: LEAF) + name @__execute(id: 503, kind: PURE, type: LEAF) + } + ... on Human { + __typename @__execute(id: 505, kind: PURE, type: LEAF) + id @__execute(id: 506, kind: PURE, type: LEAF) + name @__execute(id: 507, kind: PURE, type: LEAF) + friends @__execute(id: 508, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 59, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - name @__execute(id: 89, kind: PURE, type: LEAF) - friends @__execute(id: 90, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 512, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + name @__execute(id: 514, kind: PURE, type: LEAF) + friends @__execute(id: 515, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 120, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 146, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 517, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 519, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 169, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 216, kind: PURE, type: LEAF) - name @__execute(id: 217, kind: PURE, type: LEAF) - appearsIn @__execute(id: 218, kind: PURE, type: LEAF_LIST) - height @__execute(id: 219, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 220, kind: PURE, type: LEAF) - } + nodes @__execute(id: 521, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 221, kind: PURE, type: LEAF) - name @__execute(id: 222, kind: PURE, type: LEAF) - appearsIn @__execute(id: 223, kind: PURE, type: LEAF_LIST) - height @__execute(id: 224, kind: PURE, type: LEAF) - homePlanet @__execute(id: 225, kind: PURE, type: LEAF) + id @__execute(id: 523, kind: PURE, type: LEAF) + name @__execute(id: 524, kind: PURE, type: LEAF) + appearsIn @__execute(id: 525, kind: PURE, type: LEAF_LIST) + height @__execute(id: 526, kind: PURE, type: LEAF) + homePlanet @__execute(id: 527, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 529, kind: PURE, type: LEAF) + name @__execute(id: 530, kind: PURE, type: LEAF) + appearsIn @__execute(id: 531, kind: PURE, type: LEAF_LIST) + height @__execute(id: 532, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 533, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 147, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 535, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 169, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 216, kind: PURE, type: LEAF) - name @__execute(id: 217, kind: PURE, type: LEAF) - appearsIn @__execute(id: 218, kind: PURE, type: LEAF_LIST) - height @__execute(id: 219, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 220, kind: PURE, type: LEAF) - } + nodes @__execute(id: 537, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 221, kind: PURE, type: LEAF) - name @__execute(id: 222, kind: PURE, type: LEAF) - appearsIn @__execute(id: 223, kind: PURE, type: LEAF_LIST) - height @__execute(id: 224, kind: PURE, type: LEAF) - homePlanet @__execute(id: 225, kind: PURE, type: LEAF) + id @__execute(id: 539, kind: PURE, type: LEAF) + name @__execute(id: 540, kind: PURE, type: LEAF) + appearsIn @__execute(id: 541, kind: PURE, type: LEAF_LIST) + height @__execute(id: 542, kind: PURE, type: LEAF) + homePlanet @__execute(id: 543, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 545, kind: PURE, type: LEAF) + name @__execute(id: 546, kind: PURE, type: LEAF) + appearsIn @__execute(id: 547, kind: PURE, type: LEAF_LIST) + height @__execute(id: 548, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 549, kind: PURE, type: LEAF) } } } @@ -935,50 +941,50 @@ query getHero { } } } - ... on Human { - name @__execute(id: 91, kind: PURE, type: LEAF) - friends @__execute(id: 92, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + name @__execute(id: 551, kind: PURE, type: LEAF) + friends @__execute(id: 552, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 120, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 146, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 554, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 556, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 169, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 216, kind: PURE, type: LEAF) - name @__execute(id: 217, kind: PURE, type: LEAF) - appearsIn @__execute(id: 218, kind: PURE, type: LEAF_LIST) - height @__execute(id: 219, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 220, kind: PURE, type: LEAF) - } + nodes @__execute(id: 558, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 221, kind: PURE, type: LEAF) - name @__execute(id: 222, kind: PURE, type: LEAF) - appearsIn @__execute(id: 223, kind: PURE, type: LEAF_LIST) - height @__execute(id: 224, kind: PURE, type: LEAF) - homePlanet @__execute(id: 225, kind: PURE, type: LEAF) + id @__execute(id: 560, kind: PURE, type: LEAF) + name @__execute(id: 561, kind: PURE, type: LEAF) + appearsIn @__execute(id: 562, kind: PURE, type: LEAF_LIST) + height @__execute(id: 563, kind: PURE, type: LEAF) + homePlanet @__execute(id: 564, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 566, kind: PURE, type: LEAF) + name @__execute(id: 567, kind: PURE, type: LEAF) + appearsIn @__execute(id: 568, kind: PURE, type: LEAF_LIST) + height @__execute(id: 569, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 570, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 147, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 572, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 169, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 216, kind: PURE, type: LEAF) - name @__execute(id: 217, kind: PURE, type: LEAF) - appearsIn @__execute(id: 218, kind: PURE, type: LEAF_LIST) - height @__execute(id: 219, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 220, kind: PURE, type: LEAF) - } + nodes @__execute(id: 574, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 221, kind: PURE, type: LEAF) - name @__execute(id: 222, kind: PURE, type: LEAF) - appearsIn @__execute(id: 223, kind: PURE, type: LEAF_LIST) - height @__execute(id: 224, kind: PURE, type: LEAF) - homePlanet @__execute(id: 225, kind: PURE, type: LEAF) + id @__execute(id: 576, kind: PURE, type: LEAF) + name @__execute(id: 577, kind: PURE, type: LEAF) + appearsIn @__execute(id: 578, kind: PURE, type: LEAF_LIST) + height @__execute(id: 579, kind: PURE, type: LEAF) + homePlanet @__execute(id: 580, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 582, kind: PURE, type: LEAF) + name @__execute(id: 583, kind: PURE, type: LEAF) + appearsIn @__execute(id: 584, kind: PURE, type: LEAF_LIST) + height @__execute(id: 585, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 586, kind: PURE, type: LEAF) } } } @@ -991,60 +997,60 @@ query getHero { } } } - height @__execute(id: 39, kind: PURE, type: LEAF) - appearsIn @__execute(id: 40, kind: PURE, type: LEAF_LIST) + height @__execute(id: 509, kind: PURE, type: LEAF) + appearsIn @__execute(id: 510, kind: PURE, type: LEAF_LIST) } - ... on Human { - __typename @__execute(id: 41, kind: PURE, type: LEAF) - id @__execute(id: 42, kind: PURE, type: LEAF) - name @__execute(id: 43, kind: PURE, type: LEAF) - friends @__execute(id: 44, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + __typename @__execute(id: 588, kind: PURE, type: LEAF) + id @__execute(id: 589, kind: PURE, type: LEAF) + name @__execute(id: 590, kind: PURE, type: LEAF) + friends @__execute(id: 591, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 59, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - name @__execute(id: 89, kind: PURE, type: LEAF) - friends @__execute(id: 90, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 595, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + name @__execute(id: 597, kind: PURE, type: LEAF) + friends @__execute(id: 598, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 120, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 146, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 600, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 602, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 169, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 216, kind: PURE, type: LEAF) - name @__execute(id: 217, kind: PURE, type: LEAF) - appearsIn @__execute(id: 218, kind: PURE, type: LEAF_LIST) - height @__execute(id: 219, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 220, kind: PURE, type: LEAF) - } + nodes @__execute(id: 604, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 221, kind: PURE, type: LEAF) - name @__execute(id: 222, kind: PURE, type: LEAF) - appearsIn @__execute(id: 223, kind: PURE, type: LEAF_LIST) - height @__execute(id: 224, kind: PURE, type: LEAF) - homePlanet @__execute(id: 225, kind: PURE, type: LEAF) + id @__execute(id: 606, kind: PURE, type: LEAF) + name @__execute(id: 607, kind: PURE, type: LEAF) + appearsIn @__execute(id: 608, kind: PURE, type: LEAF_LIST) + height @__execute(id: 609, kind: PURE, type: LEAF) + homePlanet @__execute(id: 610, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 612, kind: PURE, type: LEAF) + name @__execute(id: 613, kind: PURE, type: LEAF) + appearsIn @__execute(id: 614, kind: PURE, type: LEAF_LIST) + height @__execute(id: 615, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 616, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 147, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 618, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 169, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 216, kind: PURE, type: LEAF) - name @__execute(id: 217, kind: PURE, type: LEAF) - appearsIn @__execute(id: 218, kind: PURE, type: LEAF_LIST) - height @__execute(id: 219, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 220, kind: PURE, type: LEAF) - } + nodes @__execute(id: 620, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 221, kind: PURE, type: LEAF) - name @__execute(id: 222, kind: PURE, type: LEAF) - appearsIn @__execute(id: 223, kind: PURE, type: LEAF_LIST) - height @__execute(id: 224, kind: PURE, type: LEAF) - homePlanet @__execute(id: 225, kind: PURE, type: LEAF) + id @__execute(id: 622, kind: PURE, type: LEAF) + name @__execute(id: 623, kind: PURE, type: LEAF) + appearsIn @__execute(id: 624, kind: PURE, type: LEAF_LIST) + height @__execute(id: 625, kind: PURE, type: LEAF) + homePlanet @__execute(id: 626, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 628, kind: PURE, type: LEAF) + name @__execute(id: 629, kind: PURE, type: LEAF) + appearsIn @__execute(id: 630, kind: PURE, type: LEAF_LIST) + height @__execute(id: 631, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 632, kind: PURE, type: LEAF) } } } @@ -1054,50 +1060,50 @@ query getHero { } } } - ... on Human { - name @__execute(id: 91, kind: PURE, type: LEAF) - friends @__execute(id: 92, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + name @__execute(id: 634, kind: PURE, type: LEAF) + friends @__execute(id: 635, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 120, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - friends @__execute(id: 146, kind: DEFAULT, type: COMPOSITE) { + nodes @__execute(id: 637, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + friends @__execute(id: 639, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 169, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 216, kind: PURE, type: LEAF) - name @__execute(id: 217, kind: PURE, type: LEAF) - appearsIn @__execute(id: 218, kind: PURE, type: LEAF_LIST) - height @__execute(id: 219, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 220, kind: PURE, type: LEAF) - } + nodes @__execute(id: 641, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 221, kind: PURE, type: LEAF) - name @__execute(id: 222, kind: PURE, type: LEAF) - appearsIn @__execute(id: 223, kind: PURE, type: LEAF_LIST) - height @__execute(id: 224, kind: PURE, type: LEAF) - homePlanet @__execute(id: 225, kind: PURE, type: LEAF) + id @__execute(id: 643, kind: PURE, type: LEAF) + name @__execute(id: 644, kind: PURE, type: LEAF) + appearsIn @__execute(id: 645, kind: PURE, type: LEAF_LIST) + height @__execute(id: 646, kind: PURE, type: LEAF) + homePlanet @__execute(id: 647, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 649, kind: PURE, type: LEAF) + name @__execute(id: 650, kind: PURE, type: LEAF) + appearsIn @__execute(id: 651, kind: PURE, type: LEAF_LIST) + height @__execute(id: 652, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 653, kind: PURE, type: LEAF) } } } } } - ... on Human { - friends @__execute(id: 147, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + friends @__execute(id: 655, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @__execute(id: 169, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @__execute(id: 216, kind: PURE, type: LEAF) - name @__execute(id: 217, kind: PURE, type: LEAF) - appearsIn @__execute(id: 218, kind: PURE, type: LEAF_LIST) - height @__execute(id: 219, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 220, kind: PURE, type: LEAF) - } + nodes @__execute(id: 657, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @__execute(id: 221, kind: PURE, type: LEAF) - name @__execute(id: 222, kind: PURE, type: LEAF) - appearsIn @__execute(id: 223, kind: PURE, type: LEAF_LIST) - height @__execute(id: 224, kind: PURE, type: LEAF) - homePlanet @__execute(id: 225, kind: PURE, type: LEAF) + id @__execute(id: 659, kind: PURE, type: LEAF) + name @__execute(id: 660, kind: PURE, type: LEAF) + appearsIn @__execute(id: 661, kind: PURE, type: LEAF_LIST) + height @__execute(id: 662, kind: PURE, type: LEAF) + homePlanet @__execute(id: 663, kind: PURE, type: LEAF) + } + ... on Droid { + id @__execute(id: 665, kind: PURE, type: LEAF) + name @__execute(id: 666, kind: PURE, type: LEAF) + appearsIn @__execute(id: 667, kind: PURE, type: LEAF_LIST) + height @__execute(id: 668, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 669, kind: PURE, type: LEAF) } } } @@ -1110,62 +1116,56 @@ query getHero { } } } - height @__execute(id: 45, kind: PURE, type: LEAF) - appearsIn @__execute(id: 46, kind: PURE, type: LEAF_LIST) - } - ... on Starship { - __typename @__execute(id: 47, kind: PURE, type: LEAF) - shipId: id @__execute(id: 48, kind: PURE, type: LEAF) - length @__execute(id: 49, kind: PURE, type: LEAF) - name @__execute(id: 50, kind: PURE, type: LEAF) + height @__execute(id: 592, kind: PURE, type: LEAF) + appearsIn @__execute(id: 593, kind: PURE, type: LEAF_LIST) } } - __schema @__execute(id: 4, kind: PURE, type: COMPOSITE) { + __schema @__execute(id: 6, kind: PURE, type: COMPOSITE) { ... on __Schema { - queryType @__execute(id: 51, kind: PURE, type: COMPOSITE) { + queryType @__execute(id: 671, kind: PURE, type: COMPOSITE) { ... on __Type { - name @__execute(id: 60, kind: PURE, type: LEAF) + name @__execute(id: 677, kind: PURE, type: LEAF) } } - mutationType @__execute(id: 52, kind: PURE, type: COMPOSITE) { + mutationType @__execute(id: 672, kind: PURE, type: COMPOSITE) { ... on __Type { - name @__execute(id: 61, kind: PURE, type: LEAF) + name @__execute(id: 679, kind: PURE, type: LEAF) } } - subscriptionType @__execute(id: 53, kind: PURE, type: COMPOSITE) { + subscriptionType @__execute(id: 673, kind: PURE, type: COMPOSITE) { ... on __Type { - name @__execute(id: 62, kind: PURE, type: LEAF) + name @__execute(id: 681, kind: PURE, type: LEAF) } } - types @__execute(id: 54, kind: PURE, type: COMPOSITE_LIST) { + types @__execute(id: 674, kind: PURE, type: COMPOSITE_LIST) { ... on __Type { - kind @__execute(id: 63, kind: PURE, type: LEAF) - name @__execute(id: 64, kind: PURE, type: LEAF) - description @__execute(id: 65, kind: PURE, type: LEAF) - fields(includeDeprecated: true) @__execute(id: 66, kind: PURE, type: COMPOSITE_LIST) { + kind @__execute(id: 683, kind: PURE, type: LEAF) + name @__execute(id: 684, kind: PURE, type: LEAF) + description @__execute(id: 685, kind: PURE, type: LEAF) + fields(includeDeprecated: true) @__execute(id: 686, kind: PURE, type: COMPOSITE_LIST) { ... on __Field { - name @__execute(id: 93, kind: PURE, type: LEAF) - description @__execute(id: 94, kind: PURE, type: LEAF) - args @__execute(id: 95, kind: PURE, type: COMPOSITE_LIST) { + name @__execute(id: 692, kind: PURE, type: LEAF) + description @__execute(id: 693, kind: PURE, type: LEAF) + args @__execute(id: 694, kind: PURE, type: COMPOSITE_LIST) { ... on __InputValue { - name @__execute(id: 121, kind: PURE, type: LEAF) - description @__execute(id: 122, kind: PURE, type: LEAF) - type @__execute(id: 123, kind: PURE, type: COMPOSITE) { + name @__execute(id: 699, kind: PURE, type: LEAF) + description @__execute(id: 700, kind: PURE, type: LEAF) + type @__execute(id: 701, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 148, kind: PURE, type: LEAF) - name @__execute(id: 149, kind: PURE, type: LEAF) - ofType @__execute(id: 150, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 704, kind: PURE, type: LEAF) + name @__execute(id: 705, kind: PURE, type: LEAF) + ofType @__execute(id: 706, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 170, kind: PURE, type: LEAF) - name @__execute(id: 171, kind: PURE, type: LEAF) - ofType @__execute(id: 172, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 708, kind: PURE, type: LEAF) + name @__execute(id: 709, kind: PURE, type: LEAF) + ofType @__execute(id: 710, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 226, kind: PURE, type: LEAF) - name @__execute(id: 227, kind: PURE, type: LEAF) - ofType @__execute(id: 228, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 712, kind: PURE, type: LEAF) + name @__execute(id: 713, kind: PURE, type: LEAF) + ofType @__execute(id: 714, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 235, kind: PURE, type: LEAF) - name @__execute(id: 236, kind: PURE, type: LEAF) + kind @__execute(id: 716, kind: PURE, type: LEAF) + name @__execute(id: 717, kind: PURE, type: LEAF) } } } @@ -1174,25 +1174,25 @@ query getHero { } } } - defaultValue @__execute(id: 124, kind: PURE, type: LEAF) + defaultValue @__execute(id: 702, kind: PURE, type: LEAF) } } - type @__execute(id: 96, kind: PURE, type: COMPOSITE) { + type @__execute(id: 695, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 125, kind: PURE, type: LEAF) - name @__execute(id: 126, kind: PURE, type: LEAF) - ofType @__execute(id: 127, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 719, kind: PURE, type: LEAF) + name @__execute(id: 720, kind: PURE, type: LEAF) + ofType @__execute(id: 721, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 151, kind: PURE, type: LEAF) - name @__execute(id: 152, kind: PURE, type: LEAF) - ofType @__execute(id: 153, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 723, kind: PURE, type: LEAF) + name @__execute(id: 724, kind: PURE, type: LEAF) + ofType @__execute(id: 725, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 173, kind: PURE, type: LEAF) - name @__execute(id: 174, kind: PURE, type: LEAF) - ofType @__execute(id: 175, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 727, kind: PURE, type: LEAF) + name @__execute(id: 728, kind: PURE, type: LEAF) + ofType @__execute(id: 729, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 229, kind: PURE, type: LEAF) - name @__execute(id: 230, kind: PURE, type: LEAF) + kind @__execute(id: 731, kind: PURE, type: LEAF) + name @__execute(id: 732, kind: PURE, type: LEAF) } } } @@ -1201,30 +1201,30 @@ query getHero { } } } - isDeprecated @__execute(id: 97, kind: PURE, type: LEAF) - deprecationReason @__execute(id: 98, kind: PURE, type: LEAF) + isDeprecated @__execute(id: 696, kind: PURE, type: LEAF) + deprecationReason @__execute(id: 697, kind: PURE, type: LEAF) } } - inputFields @__execute(id: 67, kind: PURE, type: COMPOSITE_LIST) { + inputFields @__execute(id: 687, kind: PURE, type: COMPOSITE_LIST) { ... on __InputValue { - name @__execute(id: 99, kind: PURE, type: LEAF) - description @__execute(id: 100, kind: PURE, type: LEAF) - type @__execute(id: 101, kind: PURE, type: COMPOSITE) { + name @__execute(id: 734, kind: PURE, type: LEAF) + description @__execute(id: 735, kind: PURE, type: LEAF) + type @__execute(id: 736, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 128, kind: PURE, type: LEAF) - name @__execute(id: 129, kind: PURE, type: LEAF) - ofType @__execute(id: 130, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 739, kind: PURE, type: LEAF) + name @__execute(id: 740, kind: PURE, type: LEAF) + ofType @__execute(id: 741, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 154, kind: PURE, type: LEAF) - name @__execute(id: 155, kind: PURE, type: LEAF) - ofType @__execute(id: 156, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 743, kind: PURE, type: LEAF) + name @__execute(id: 744, kind: PURE, type: LEAF) + ofType @__execute(id: 745, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 176, kind: PURE, type: LEAF) - name @__execute(id: 177, kind: PURE, type: LEAF) - ofType @__execute(id: 178, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 747, kind: PURE, type: LEAF) + name @__execute(id: 748, kind: PURE, type: LEAF) + ofType @__execute(id: 749, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 231, kind: PURE, type: LEAF) - name @__execute(id: 232, kind: PURE, type: LEAF) + kind @__execute(id: 751, kind: PURE, type: LEAF) + name @__execute(id: 752, kind: PURE, type: LEAF) } } } @@ -1233,25 +1233,25 @@ query getHero { } } } - defaultValue @__execute(id: 102, kind: PURE, type: LEAF) + defaultValue @__execute(id: 737, kind: PURE, type: LEAF) } } - interfaces @__execute(id: 68, kind: PURE, type: COMPOSITE_LIST) { + interfaces @__execute(id: 688, kind: PURE, type: COMPOSITE_LIST) { ... on __Type { - kind @__execute(id: 103, kind: PURE, type: LEAF) - name @__execute(id: 104, kind: PURE, type: LEAF) - ofType @__execute(id: 105, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 754, kind: PURE, type: LEAF) + name @__execute(id: 755, kind: PURE, type: LEAF) + ofType @__execute(id: 756, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 131, kind: PURE, type: LEAF) - name @__execute(id: 132, kind: PURE, type: LEAF) - ofType @__execute(id: 133, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 758, kind: PURE, type: LEAF) + name @__execute(id: 759, kind: PURE, type: LEAF) + ofType @__execute(id: 760, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 157, kind: PURE, type: LEAF) - name @__execute(id: 158, kind: PURE, type: LEAF) - ofType @__execute(id: 159, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 762, kind: PURE, type: LEAF) + name @__execute(id: 763, kind: PURE, type: LEAF) + ofType @__execute(id: 764, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 179, kind: PURE, type: LEAF) - name @__execute(id: 180, kind: PURE, type: LEAF) + kind @__execute(id: 766, kind: PURE, type: LEAF) + name @__execute(id: 767, kind: PURE, type: LEAF) } } } @@ -1260,30 +1260,30 @@ query getHero { } } } - enumValues(includeDeprecated: true) @__execute(id: 69, kind: PURE, type: COMPOSITE_LIST) { + enumValues(includeDeprecated: true) @__execute(id: 689, kind: PURE, type: COMPOSITE_LIST) { ... on __EnumValue { - name @__execute(id: 106, kind: PURE, type: LEAF) - description @__execute(id: 107, kind: PURE, type: LEAF) - isDeprecated @__execute(id: 108, kind: PURE, type: LEAF) - deprecationReason @__execute(id: 109, kind: PURE, type: LEAF) + name @__execute(id: 769, kind: PURE, type: LEAF) + description @__execute(id: 770, kind: PURE, type: LEAF) + isDeprecated @__execute(id: 771, kind: PURE, type: LEAF) + deprecationReason @__execute(id: 772, kind: PURE, type: LEAF) } } - possibleTypes @__execute(id: 70, kind: PURE, type: COMPOSITE_LIST) { + possibleTypes @__execute(id: 690, kind: PURE, type: COMPOSITE_LIST) { ... on __Type { - kind @__execute(id: 110, kind: PURE, type: LEAF) - name @__execute(id: 111, kind: PURE, type: LEAF) - ofType @__execute(id: 112, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 774, kind: PURE, type: LEAF) + name @__execute(id: 775, kind: PURE, type: LEAF) + ofType @__execute(id: 776, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 134, kind: PURE, type: LEAF) - name @__execute(id: 135, kind: PURE, type: LEAF) - ofType @__execute(id: 136, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 778, kind: PURE, type: LEAF) + name @__execute(id: 779, kind: PURE, type: LEAF) + ofType @__execute(id: 780, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 160, kind: PURE, type: LEAF) - name @__execute(id: 161, kind: PURE, type: LEAF) - ofType @__execute(id: 162, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 782, kind: PURE, type: LEAF) + name @__execute(id: 783, kind: PURE, type: LEAF) + ofType @__execute(id: 784, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 181, kind: PURE, type: LEAF) - name @__execute(id: 182, kind: PURE, type: LEAF) + kind @__execute(id: 786, kind: PURE, type: LEAF) + name @__execute(id: 787, kind: PURE, type: LEAF) } } } @@ -1294,30 +1294,30 @@ query getHero { } } } - directives @__execute(id: 55, kind: PURE, type: COMPOSITE_LIST) { + directives @__execute(id: 675, kind: PURE, type: COMPOSITE_LIST) { ... on __Directive { - name @__execute(id: 71, kind: PURE, type: LEAF) - description @__execute(id: 72, kind: PURE, type: LEAF) - args @__execute(id: 73, kind: PURE, type: COMPOSITE_LIST) { + name @__execute(id: 789, kind: PURE, type: LEAF) + description @__execute(id: 790, kind: PURE, type: LEAF) + args @__execute(id: 791, kind: PURE, type: COMPOSITE_LIST) { ... on __InputValue { - name @__execute(id: 113, kind: PURE, type: LEAF) - description @__execute(id: 114, kind: PURE, type: LEAF) - type @__execute(id: 115, kind: PURE, type: COMPOSITE) { + name @__execute(id: 796, kind: PURE, type: LEAF) + description @__execute(id: 797, kind: PURE, type: LEAF) + type @__execute(id: 798, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 137, kind: PURE, type: LEAF) - name @__execute(id: 138, kind: PURE, type: LEAF) - ofType @__execute(id: 139, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 801, kind: PURE, type: LEAF) + name @__execute(id: 802, kind: PURE, type: LEAF) + ofType @__execute(id: 803, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 163, kind: PURE, type: LEAF) - name @__execute(id: 164, kind: PURE, type: LEAF) - ofType @__execute(id: 165, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 805, kind: PURE, type: LEAF) + name @__execute(id: 806, kind: PURE, type: LEAF) + ofType @__execute(id: 807, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 183, kind: PURE, type: LEAF) - name @__execute(id: 184, kind: PURE, type: LEAF) - ofType @__execute(id: 185, kind: PURE, type: COMPOSITE) { + kind @__execute(id: 809, kind: PURE, type: LEAF) + name @__execute(id: 810, kind: PURE, type: LEAF) + ofType @__execute(id: 811, kind: PURE, type: COMPOSITE) { ... on __Type { - kind @__execute(id: 233, kind: PURE, type: LEAF) - name @__execute(id: 234, kind: PURE, type: LEAF) + kind @__execute(id: 813, kind: PURE, type: LEAF) + name @__execute(id: 814, kind: PURE, type: LEAF) } } } @@ -1326,12 +1326,12 @@ query getHero { } } } - defaultValue @__execute(id: 116, kind: PURE, type: LEAF) + defaultValue @__execute(id: 799, kind: PURE, type: LEAF) } } - onOperation @__execute(id: 74, kind: PURE, type: LEAF) - onFragment @__execute(id: 75, kind: PURE, type: LEAF) - onField @__execute(id: 76, kind: PURE, type: LEAF) + onOperation @__execute(id: 792, kind: PURE, type: LEAF) + onFragment @__execute(id: 793, kind: PURE, type: LEAF) + onField @__execute(id: 794, kind: PURE, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Nested_Fragments_with_Conditions.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Nested_Fragments_with_Conditions.snap index 0c9da51a1a9..1a390ab5dbc 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Nested_Fragments_with_Conditions.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Nested_Fragments_with_Conditions.snap @@ -50,65 +50,65 @@ fragment Human3 on Human { query( $if: Boolean! -) @includeCondition(flag: 2) @includeCondition(flag: 3) { +) { ... on Query { - human(id: "1000") @__execute(id: 0, kind: PURE, type: COMPOSITE) { + human(id: "1000") @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - friends @conditional @__execute(id: 1, kind: DEFAULT, type: COMPOSITE) { + friends @conditional @__execute(id: 4, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - edges @conditional @__execute(id: 2, kind: PURE, type: COMPOSITE_LIST) { + edges @conditional @__execute(id: 6, kind: PURE, type: COMPOSITE_LIST) { ... on FriendsEdge { - node @conditional @__execute(id: 3, kind: PURE, type: COMPOSITE) { - ... on Droid { - __typename @conditional @__execute(id: 4, kind: PURE, type: LEAF) - friends @conditional @__execute(id: 5, kind: DEFAULT, type: COMPOSITE) { + node @conditional @__execute(id: 8, kind: PURE, type: COMPOSITE) { + ... on Human { + __typename @conditional @__execute(id: 10, kind: PURE, type: LEAF) + friends @conditional @__execute(id: 11, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @conditional @__execute(id: 10, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - __typename @conditional @__execute(id: 13, kind: PURE, type: LEAF) - } + nodes @conditional @__execute(id: 15, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - __typename @conditional @__execute(id: 14, kind: PURE, type: LEAF) - name @conditional @__execute(id: 15, kind: PURE, type: LEAF) - otherHuman @conditional @__execute(id: 16, kind: PURE, type: COMPOSITE) { + __typename @conditional @__execute(id: 17, kind: PURE, type: LEAF) + name @conditional @__execute(id: 18, kind: PURE, type: LEAF) + otherHuman @conditional @__execute(id: 19, kind: PURE, type: COMPOSITE) { ... on Human { - __typename @conditional @__execute(id: 17, kind: PURE, type: LEAF) - name @conditional @__execute(id: 18, kind: PURE, type: LEAF) + __typename @conditional @__execute(id: 21, kind: PURE, type: LEAF) + name @conditional @__execute(id: 22, kind: PURE, type: LEAF) } } } + ... on Droid { + __typename @conditional @__execute(id: 24, kind: PURE, type: LEAF) + } } } } + name @conditional @__execute(id: 12, kind: PURE, type: LEAF) + otherHuman @conditional @__execute(id: 13, kind: PURE, type: COMPOSITE) { + ... on Human { + __typename @conditional @__execute(id: 26, kind: PURE, type: LEAF) + name @conditional @__execute(id: 27, kind: PURE, type: LEAF) + } + } } - ... on Human { - __typename @conditional @__execute(id: 6, kind: PURE, type: LEAF) - friends @conditional @__execute(id: 7, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + __typename @conditional @__execute(id: 29, kind: PURE, type: LEAF) + friends @conditional @__execute(id: 30, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @conditional @__execute(id: 10, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - __typename @conditional @__execute(id: 13, kind: PURE, type: LEAF) - } + nodes @conditional @__execute(id: 32, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - __typename @conditional @__execute(id: 14, kind: PURE, type: LEAF) - name @conditional @__execute(id: 15, kind: PURE, type: LEAF) - otherHuman @conditional @__execute(id: 16, kind: PURE, type: COMPOSITE) { + __typename @conditional @__execute(id: 34, kind: PURE, type: LEAF) + name @conditional @__execute(id: 35, kind: PURE, type: LEAF) + otherHuman @conditional @__execute(id: 36, kind: PURE, type: COMPOSITE) { ... on Human { - __typename @conditional @__execute(id: 17, kind: PURE, type: LEAF) - name @conditional @__execute(id: 18, kind: PURE, type: LEAF) + __typename @conditional @__execute(id: 38, kind: PURE, type: LEAF) + name @conditional @__execute(id: 39, kind: PURE, type: LEAF) } } } + ... on Droid { + __typename @conditional @__execute(id: 41, kind: PURE, type: LEAF) + } } } } - name @conditional @__execute(id: 8, kind: PURE, type: LEAF) - otherHuman @conditional @__execute(id: 9, kind: PURE, type: COMPOSITE) { - ... on Human { - __typename @conditional @__execute(id: 11, kind: PURE, type: LEAF) - name @conditional @__execute(id: 12, kind: PURE, type: LEAF) - } - } } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited.snap index 0b36d91030e..113d4c54312 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited.snap @@ -20,19 +20,19 @@ query foo( query foo( $v: Boolean! -) @includeCondition(flag: 2) { +) { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @conditional @__execute(id: 1, kind: PURE, type: LEAF) - id @__execute(id: 2, kind: PURE, type: LEAF) - height @conditional @__execute(id: 3, kind: PURE, type: LEAF) - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { name @conditional @__execute(id: 4, kind: PURE, type: LEAF) id @__execute(id: 5, kind: PURE, type: LEAF) height @conditional @__execute(id: 6, kind: PURE, type: LEAF) } + ... on Droid { + name @conditional @__execute(id: 8, kind: PURE, type: LEAF) + id @__execute(id: 9, kind: PURE, type: LEAF) + height @conditional @__execute(id: 10, kind: PURE, type: LEAF) + } } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited_2.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited_2.snap index 0aeac239962..2c9b67917cf 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited_2.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited_2.snap @@ -22,19 +22,19 @@ query foo( query foo( $v: Boolean! $q: Boolean! -) @includeCondition(flag: 2) @includeCondition(flag: 3) { +) { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @conditional @__execute(id: 1, kind: PURE, type: LEAF) - id @__execute(id: 2, kind: PURE, type: LEAF) - height @conditional @__execute(id: 3, kind: PURE, type: LEAF) - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { name @conditional @__execute(id: 4, kind: PURE, type: LEAF) id @__execute(id: 5, kind: PURE, type: LEAF) height @conditional @__execute(id: 6, kind: PURE, type: LEAF) } + ... on Droid { + name @conditional @__execute(id: 8, kind: PURE, type: LEAF) + id @__execute(id: 9, kind: PURE, type: LEAF) + height @conditional @__execute(id: 10, kind: PURE, type: LEAF) + } } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited_3.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited_3.snap index ef8967642b1..fb43aab341c 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited_3.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Object_Field_Visibility_Is_Correctly_Inherited_3.snap @@ -12,14 +12,14 @@ query foo( query foo( $v: Boolean! $q: Boolean! -) @includeCondition(flag: 2) @includeCondition(flag: 3) { +) { ... on Query { - hero(episode: EMPIRE) @conditional @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @conditional @__execute(id: 1, kind: PURE, type: LEAF) - } + hero(episode: EMPIRE) @conditional @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - name @conditional @__execute(id: 2, kind: PURE, type: LEAF) + name @conditional @__execute(id: 4, kind: PURE, type: LEAF) + } + ... on Droid { + name @conditional @__execute(id: 6, kind: PURE, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Duplicate_Field.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Duplicate_Field.snap index 7e291c6722c..86e2b3ccd25 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Duplicate_Field.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Duplicate_Field.snap @@ -1,4 +1,4 @@ -{ +{ foo foo } @@ -7,6 +7,6 @@ { ... on Query { - foo @__execute(id: 0, kind: DEFAULT, type: LEAF) + foo @__execute(id: 2, kind: DEFAULT, type: LEAF) } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Duplicate_Field_With_Skip.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Duplicate_Field_With_Skip.snap index 5989587248c..b2ff0198af1 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Duplicate_Field_With_Skip.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Duplicate_Field_With_Skip.snap @@ -1,12 +1,12 @@ -{ +{ foo @skip(if: true) foo @skip(if: false) } --------------------------------------------------------- -query @includeCondition(flag: 2, skip: true) @includeCondition(flag: 3, skip: false) { +{ ... on Query { - foo @conditional @__execute(id: 0, kind: DEFAULT, type: LEAF) + foo @__execute(id: 2, kind: DEFAULT, type: LEAF) } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Fragment_Definition.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Fragment_Definition.snap index bf1b4405551..3c4d66ffbf7 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Fragment_Definition.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Fragment_Definition.snap @@ -1,4 +1,4 @@ -{ +{ hero(episode: EMPIRE) { name ... abc @@ -18,14 +18,14 @@ fragment def on Human { { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @__execute(id: 1, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 2, kind: PURE, type: LEAF) - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - name @__execute(id: 3, kind: PURE, type: LEAF) - homePlanet @__execute(id: 4, kind: PURE, type: LEAF) + name @__execute(id: 4, kind: PURE, type: LEAF) + homePlanet @__execute(id: 5, kind: PURE, type: LEAF) + } + ... on Droid { + name @__execute(id: 7, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 8, kind: PURE, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Inline_Fragment.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Inline_Fragment.snap index 62528b84f42..5242d290fc8 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Inline_Fragment.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_Inline_Fragment.snap @@ -1,4 +1,4 @@ -{ +{ hero(episode: EMPIRE) { name ... on Droid { @@ -14,14 +14,14 @@ { ... on Query { - hero(episode: EMPIRE) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @__execute(id: 1, kind: PURE, type: LEAF) - primaryFunction @__execute(id: 2, kind: PURE, type: LEAF) - } + hero(episode: EMPIRE) @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - name @__execute(id: 3, kind: PURE, type: LEAF) - homePlanet @__execute(id: 4, kind: PURE, type: LEAF) + name @__execute(id: 4, kind: PURE, type: LEAF) + homePlanet @__execute(id: 5, kind: PURE, type: LEAF) + } + ... on Droid { + name @__execute(id: 7, kind: PURE, type: LEAF) + primaryFunction @__execute(id: 8, kind: PURE, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_One_Field.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_One_Field.snap index 5f1ef565fd9..7565d2183c9 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_One_Field.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Prepare_One_Field.snap @@ -1,4 +1,4 @@ -{ +{ foo } @@ -6,6 +6,6 @@ { ... on Query { - foo @__execute(id: 0, kind: DEFAULT, type: LEAF) + foo @__execute(id: 2, kind: DEFAULT, type: LEAF) } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Resolve_Concrete_Types_From_Unions.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Resolve_Concrete_Types_From_Unions.snap index 734b2b2f628..f7936f1155c 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Resolve_Concrete_Types_From_Unions.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Resolve_Concrete_Types_From_Unions.snap @@ -21,18 +21,18 @@ fragment TypeTwoParts on TypeTwo { query QueryName { ... on UnionQuery { - oneOrTwo @__execute(id: 0, kind: DEFAULT, type: COMPOSITE) { - ... on TypeTwo { - field1 @__execute(id: 1, kind: DEFAULT, type: COMPOSITE) { - ... on FieldTwo1 { - name @__execute(id: 3, kind: DEFAULT, type: LEAF) + oneOrTwo @__execute(id: 2, kind: DEFAULT, type: COMPOSITE) { + ... on TypeOne { + field1 @__execute(id: 4, kind: DEFAULT, type: COMPOSITE) { + ... on FieldOne1 { + name @__execute(id: 6, kind: DEFAULT, type: LEAF) } } } - ... on TypeOne { - field1 @__execute(id: 2, kind: DEFAULT, type: COMPOSITE) { - ... on FieldOne1 { - name @__execute(id: 4, kind: DEFAULT, type: LEAF) + ... on TypeTwo { + field1 @__execute(id: 8, kind: DEFAULT, type: COMPOSITE) { + ... on FieldTwo1 { + name @__execute(id: 10, kind: DEFAULT, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Reuse_Selection.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Reuse_Selection.snap index 4759a4f1492..c8c1d288fb5 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Reuse_Selection.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Reuse_Selection.snap @@ -17,34 +17,34 @@ query Hero( query Hero( $episode: Episode $withFriends: Boolean! -) @includeCondition(flag: 2) { +) { ... on Query { - hero(episode: $episode) @__execute(id: 0, kind: PURE, type: COMPOSITE) { - ... on Droid { - name @__execute(id: 1, kind: PURE, type: LEAF) - friends @conditional @__execute(id: 2, kind: DEFAULT, type: COMPOSITE) { + hero(episode: $episode) @__execute(id: 2, kind: PURE, type: COMPOSITE) { + ... on Human { + name @__execute(id: 4, kind: PURE, type: LEAF) + friends @conditional @__execute(id: 5, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @conditional @__execute(id: 5, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @conditional @__execute(id: 6, kind: PURE, type: LEAF) - } + nodes @conditional @__execute(id: 7, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @conditional @__execute(id: 7, kind: PURE, type: LEAF) + id @conditional @__execute(id: 9, kind: PURE, type: LEAF) + } + ... on Droid { + id @conditional @__execute(id: 11, kind: PURE, type: LEAF) } } } } } - ... on Human { - name @__execute(id: 3, kind: PURE, type: LEAF) - friends @conditional @__execute(id: 4, kind: DEFAULT, type: COMPOSITE) { + ... on Droid { + name @__execute(id: 13, kind: PURE, type: LEAF) + friends @conditional @__execute(id: 14, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - nodes @conditional @__execute(id: 5, kind: PURE, type: COMPOSITE_LIST) { - ... on Droid { - id @conditional @__execute(id: 6, kind: PURE, type: LEAF) - } + nodes @conditional @__execute(id: 16, kind: PURE, type: COMPOSITE_LIST) { ... on Human { - id @conditional @__execute(id: 7, kind: PURE, type: LEAF) + id @conditional @__execute(id: 18, kind: PURE, type: LEAF) + } + ... on Droid { + id @conditional @__execute(id: 20, kind: PURE, type: LEAF) } } } From b3b1359acd087e5cbc9e154f5f7c3c7e755b1e90 Mon Sep 17 00:00:00 2001 From: Glen <glen.84@gmail.com> Date: Thu, 29 Jan 2026 09:28:41 +0200 Subject: [PATCH 142/144] Fixed spelling error --- .../docs/hotchocolate/v11/defining-a-schema/subscriptions.md | 2 +- .../src/docs/strawberryshake/v12/networking/authentication.md | 2 +- .../src/docs/strawberryshake/v13/networking/authentication.md | 2 +- .../src/docs/strawberryshake/v14/networking/authentication.md | 2 +- .../src/docs/strawberryshake/v15/networking/authentication.md | 2 +- .../src/docs/strawberryshake/v16/networking/authentication.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/website/src/docs/hotchocolate/v11/defining-a-schema/subscriptions.md b/website/src/docs/hotchocolate/v11/defining-a-schema/subscriptions.md index 733960034ad..ab27129b05a 100644 --- a/website/src/docs/hotchocolate/v11/defining-a-schema/subscriptions.md +++ b/website/src/docs/hotchocolate/v11/defining-a-schema/subscriptions.md @@ -177,7 +177,7 @@ Our Redis subscription provider uses the [StackExchange.Redis](https://github.co To publish events and trigger subscriptions, we can use the `ITopicEventSender`. The `ITopicEventSender` is an abstraction for the registered event publishing provider. Using this abstraction allows us to seamlessly switch between subscription providers, when necessary. -Most of the time we will be publishing events for successful mutations. Therefor we can simply inject the `ITopicEventSender` into our mutations like we would with every other `Service`. Of course we can not only publish events from mutations, but everywhere we have access to the `ITopicEventSender` through the DI Container. +Most of the time we will be publishing events for successful mutations. Therefore we can simply inject the `ITopicEventSender` into our mutations like we would with every other `Service`. Of course we can not only publish events from mutations, but everywhere we have access to the `ITopicEventSender` through the DI Container. ```csharp public class Mutation diff --git a/website/src/docs/strawberryshake/v12/networking/authentication.md b/website/src/docs/strawberryshake/v12/networking/authentication.md index ffb833ad003..8e78b582f5f 100644 --- a/website/src/docs/strawberryshake/v12/networking/authentication.md +++ b/website/src/docs/strawberryshake/v12/networking/authentication.md @@ -134,7 +134,7 @@ client.ConnectionInterceptor = new CustomConnectionInterceptor(); ## Initial payload -In JavaScript it is not possible to add headers to a web socket. Therefor many GraphQL server do not use HTTP headers for the authentication of web sockets. Instead, they send the authentication token with the first payload to the server. +In JavaScript it is not possible to add headers to a web socket. Therefore many GraphQL server do not use HTTP headers for the authentication of web sockets. Instead, they send the authentication token with the first payload to the server. You can specify create this payload with a `ISocketConnectionInterceptor` diff --git a/website/src/docs/strawberryshake/v13/networking/authentication.md b/website/src/docs/strawberryshake/v13/networking/authentication.md index ffb833ad003..8e78b582f5f 100644 --- a/website/src/docs/strawberryshake/v13/networking/authentication.md +++ b/website/src/docs/strawberryshake/v13/networking/authentication.md @@ -134,7 +134,7 @@ client.ConnectionInterceptor = new CustomConnectionInterceptor(); ## Initial payload -In JavaScript it is not possible to add headers to a web socket. Therefor many GraphQL server do not use HTTP headers for the authentication of web sockets. Instead, they send the authentication token with the first payload to the server. +In JavaScript it is not possible to add headers to a web socket. Therefore many GraphQL server do not use HTTP headers for the authentication of web sockets. Instead, they send the authentication token with the first payload to the server. You can specify create this payload with a `ISocketConnectionInterceptor` diff --git a/website/src/docs/strawberryshake/v14/networking/authentication.md b/website/src/docs/strawberryshake/v14/networking/authentication.md index ffb833ad003..8e78b582f5f 100644 --- a/website/src/docs/strawberryshake/v14/networking/authentication.md +++ b/website/src/docs/strawberryshake/v14/networking/authentication.md @@ -134,7 +134,7 @@ client.ConnectionInterceptor = new CustomConnectionInterceptor(); ## Initial payload -In JavaScript it is not possible to add headers to a web socket. Therefor many GraphQL server do not use HTTP headers for the authentication of web sockets. Instead, they send the authentication token with the first payload to the server. +In JavaScript it is not possible to add headers to a web socket. Therefore many GraphQL server do not use HTTP headers for the authentication of web sockets. Instead, they send the authentication token with the first payload to the server. You can specify create this payload with a `ISocketConnectionInterceptor` diff --git a/website/src/docs/strawberryshake/v15/networking/authentication.md b/website/src/docs/strawberryshake/v15/networking/authentication.md index ffb833ad003..8e78b582f5f 100644 --- a/website/src/docs/strawberryshake/v15/networking/authentication.md +++ b/website/src/docs/strawberryshake/v15/networking/authentication.md @@ -134,7 +134,7 @@ client.ConnectionInterceptor = new CustomConnectionInterceptor(); ## Initial payload -In JavaScript it is not possible to add headers to a web socket. Therefor many GraphQL server do not use HTTP headers for the authentication of web sockets. Instead, they send the authentication token with the first payload to the server. +In JavaScript it is not possible to add headers to a web socket. Therefore many GraphQL server do not use HTTP headers for the authentication of web sockets. Instead, they send the authentication token with the first payload to the server. You can specify create this payload with a `ISocketConnectionInterceptor` diff --git a/website/src/docs/strawberryshake/v16/networking/authentication.md b/website/src/docs/strawberryshake/v16/networking/authentication.md index ffb833ad003..8e78b582f5f 100644 --- a/website/src/docs/strawberryshake/v16/networking/authentication.md +++ b/website/src/docs/strawberryshake/v16/networking/authentication.md @@ -134,7 +134,7 @@ client.ConnectionInterceptor = new CustomConnectionInterceptor(); ## Initial payload -In JavaScript it is not possible to add headers to a web socket. Therefor many GraphQL server do not use HTTP headers for the authentication of web sockets. Instead, they send the authentication token with the first payload to the server. +In JavaScript it is not possible to add headers to a web socket. Therefore many GraphQL server do not use HTTP headers for the authentication of web sockets. Instead, they send the authentication token with the first payload to the server. You can specify create this payload with a `ISocketConnectionInterceptor` From 984b12ae3ac98730041bd49080eb4468141905c4 Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Thu, 29 Jan 2026 08:59:20 +0000 Subject: [PATCH 143/144] Fixed operation compiler ... --- .../Execution/Processing/OperationCompiler.cs | 8 ++- .../Processing/OperationCompilerTests.cs | 2 +- ...nCompilerTests.Field_Based_Optimizers.snap | 10 +-- ...erationCompilerTests.Nested_Fragments.snap | 66 +++++++++++++++---- 4 files changed, 64 insertions(+), 22 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs index acc9427ce7c..1209e28d5c0 100644 --- a/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs +++ b/src/HotChocolate/Core/src/Types/Execution/Processing/OperationCompiler.cs @@ -317,7 +317,10 @@ private SelectionSet BuildSelectionSet( CollapseIncludeFlags(includeFlags); } - var field = typeContext.Fields[first.Node.Name.Value]; + if (!typeContext.Fields.TryGetField(first.Node.Name.Value, out var field)) + { + throw ThrowHelper.FieldDoesNotExistOnType(first.Node, typeContext.Name); + } var fieldDelegate = CreateFieldPipeline(_schema, field, first.Node); var pureFieldDelegate = TryCreatePureField(_schema, field, first.Node); var arguments = ArgumentMap.Empty; @@ -393,7 +396,8 @@ private SelectionSet BuildSelectionSet( if (optimizers.Length > 0) { - selection.Features.SetSafe(optimizers); + var features = new SelectionFeatureCollection(compilationContext.Features, selection.Id); + features.SetSafe(optimizers); } compilationContext.Register(selection, selection.Id); diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs b/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs index a5d11e907b5..67dda972039 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/OperationCompilerTests.cs @@ -457,7 +457,7 @@ ... FriendEdge1 } } } - fragment FriendEdge1 on CharacterEdge { + fragment FriendEdge1 on FriendsEdge { node { __typename friends { diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Based_Optimizers.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Based_Optimizers.snap index d522466fb6c..ed0a32a8f14 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Based_Optimizers.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Field_Based_Optimizers.snap @@ -10,14 +10,14 @@ { ... on Query { - root @__execute(id: 0, kind: DEFAULT, type: COMPOSITE) { + root @__execute(id: 2, kind: DEFAULT, type: COMPOSITE) { ... on Foo { - bar @__execute(id: 1, kind: PURE, type: COMPOSITE) { + bar @__execute(id: 4, kind: PURE, type: COMPOSITE) { ... on Bar { - text @__execute(id: 2, kind: PURE, type: LEAF) - baz @conditional @__execute(id: 3, kind: DEFAULT, type: COMPOSITE, internal: true) { + text @__execute(id: 6, kind: PURE, type: LEAF) + baz @__execute(id: 7, kind: DEFAULT, type: COMPOSITE, internal: true) { ... on Baz { - text @__execute(id: 4, kind: PURE, type: LEAF) + text @__execute(id: 9, kind: PURE, type: LEAF) } } } diff --git a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Nested_Fragments.snap b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Nested_Fragments.snap index dba5d0ae65e..1a390ab5dbc 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Nested_Fragments.snap +++ b/src/HotChocolate/Core/test/Execution.Tests/Processing/__snapshots__/OperationCompilerTests.Nested_Fragments.snap @@ -15,7 +15,7 @@ fragment Human1 on Human { } } -fragment FriendEdge1 on CharacterEdge { +fragment FriendEdge1 on FriendsEdge { node { __typename friends { @@ -50,25 +50,63 @@ fragment Human3 on Human { query( $if: Boolean! -) @includeCondition(flag: 2) @includeCondition(flag: 3) { +) { ... on Query { - human(id: "1000") @__execute(id: 0, kind: PURE, type: COMPOSITE) { + human(id: "1000") @__execute(id: 2, kind: PURE, type: COMPOSITE) { ... on Human { - friends @conditional @__execute(id: 1, kind: DEFAULT, type: COMPOSITE) { + friends @conditional @__execute(id: 4, kind: DEFAULT, type: COMPOSITE) { ... on FriendsConnection { - edges @conditional @__execute(id: 2, kind: PURE, type: COMPOSITE_LIST) { + edges @conditional @__execute(id: 6, kind: PURE, type: COMPOSITE_LIST) { ... on FriendsEdge { - node @conditional @__execute(id: 3, kind: PURE, type: COMPOSITE) { - ... on Droid { - __typename @conditional @__execute(id: 4, kind: PURE, type: LEAF) - } + node @conditional @__execute(id: 8, kind: PURE, type: COMPOSITE) { ... on Human { - __typename @conditional @__execute(id: 5, kind: PURE, type: LEAF) - name @conditional @__execute(id: 6, kind: PURE, type: LEAF) - otherHuman @conditional @__execute(id: 7, kind: PURE, type: COMPOSITE) { + __typename @conditional @__execute(id: 10, kind: PURE, type: LEAF) + friends @conditional @__execute(id: 11, kind: DEFAULT, type: COMPOSITE) { + ... on FriendsConnection { + nodes @conditional @__execute(id: 15, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + __typename @conditional @__execute(id: 17, kind: PURE, type: LEAF) + name @conditional @__execute(id: 18, kind: PURE, type: LEAF) + otherHuman @conditional @__execute(id: 19, kind: PURE, type: COMPOSITE) { + ... on Human { + __typename @conditional @__execute(id: 21, kind: PURE, type: LEAF) + name @conditional @__execute(id: 22, kind: PURE, type: LEAF) + } + } + } + ... on Droid { + __typename @conditional @__execute(id: 24, kind: PURE, type: LEAF) + } + } + } + } + name @conditional @__execute(id: 12, kind: PURE, type: LEAF) + otherHuman @conditional @__execute(id: 13, kind: PURE, type: COMPOSITE) { ... on Human { - __typename @conditional @__execute(id: 8, kind: PURE, type: LEAF) - name @conditional @__execute(id: 9, kind: PURE, type: LEAF) + __typename @conditional @__execute(id: 26, kind: PURE, type: LEAF) + name @conditional @__execute(id: 27, kind: PURE, type: LEAF) + } + } + } + ... on Droid { + __typename @conditional @__execute(id: 29, kind: PURE, type: LEAF) + friends @conditional @__execute(id: 30, kind: DEFAULT, type: COMPOSITE) { + ... on FriendsConnection { + nodes @conditional @__execute(id: 32, kind: PURE, type: COMPOSITE_LIST) { + ... on Human { + __typename @conditional @__execute(id: 34, kind: PURE, type: LEAF) + name @conditional @__execute(id: 35, kind: PURE, type: LEAF) + otherHuman @conditional @__execute(id: 36, kind: PURE, type: COMPOSITE) { + ... on Human { + __typename @conditional @__execute(id: 38, kind: PURE, type: LEAF) + name @conditional @__execute(id: 39, kind: PURE, type: LEAF) + } + } + } + ... on Droid { + __typename @conditional @__execute(id: 41, kind: PURE, type: LEAF) + } + } } } } From eec4c888cf8b4c942b96dcc25d979e15c97d6a9a Mon Sep 17 00:00:00 2001 From: Michael Staib <michael@chillicream.com> Date: Mon, 2 Feb 2026 10:21:24 +0000 Subject: [PATCH 144/144] updated devcontainer configuration --- .devcontainer/devcontainer.json | 35 +++++++++++++++++++++++++-------- .gitignore | 1 + 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 2f1437910ed..6615779bc18 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,15 +1,34 @@ { "name": "ChilliCream Dev Container", "build": { - "dockerfile": "dockerfile", - "context": "." + "dockerfile": "dockerfile", + "context": "." }, "features": { - "ghcr.io/devcontainers/features/docker-in-docker:2": { - "version": "latest", - "enableNonRootDocker": "true", - "moby": "true" - } + "ghcr.io/devcontainers/features/docker-in-docker:2": { + "version": "latest", + "enableNonRootDocker": "true", + "moby": "true" + } }, - "postCreateCommand": "./init.sh" + "postCreateCommand": "./init.sh", + "customizations": { + "vscode": { + "extensions": [ + "davidanson.vscode-markdownlint", + "ms-dotnettools.csdevkit", + "EditorConfig.EditorConfig", + "dbaeumer.vscode-eslint", + "streetsidesoftware.code-spell-checker", + "graphql.vscode-graphql", + "ms-dotnettools.csharp", + "esbenp.prettier-vscode", + "anthropic.claude-code", + "openai.chatgpt" + ], + "settings": { + "dotnet.defaultSolution": "src/All.slnx" + } + } + } } diff --git a/.gitignore b/.gitignore index f12a95b6506..a8a357f328b 100644 --- a/.gitignore +++ b/.gitignore @@ -327,3 +327,4 @@ packages.lock.json Directory.Build.user.props .generated/ +.claude/